OmniAICreator/Qiita-1.07M huggingface dataset:
【しくじり】date-fnsのバージョンを安易に1から2系に上げたらシステムが壊れた

......ので、1から2に上げる際の既存機能への破壊的変更をまとめました。

## ISO 8601形式の日付文字列の扱いの変更

### バージョン1での挙動

**バージョン1のコード例**:
```javascript
// バージョン1では、ISO 8601形式の文字列を直接関数に渡すことができました。
const date = '2019-03-30T10:00:00Z';
console.log(addDays(date, 1)); // ISO 8601形式の文字列を直接加算
```

### バージョン2での挙動

**バージョン2のコード例**:
```javascript
// バージョン2では、ISO 8601形式の文字列を扱うには`parseISO`関数を使用する必要があります。
import { parseISO, addDays } from 'date-fns';

const date = '2019-03-30T10:00:00Z';
const parsedDate = parseISO(date);
console.log(addDays(parsedDate, 1)); // `parseISO`を使用して日付オブジェクトに変換
```

**対応策**: ISO 8601形式の文字列を使用する場合は、`parseISO`関数を使用して日付オブジェクトに変換し、その後で`date-fns`の他の関数に渡すようにします。

### 注意点

- バージョン2では、日付文字列を直接操作する関数が削除され、`parseISO`を使用することが推奨されています。
- この変更は、日付の解析をより厳密にし、エラーを減らすために行われました。

## 引数の形式の変更

### `format`関数の変更

**バージョン1のコード例**:
```javascript
// バージョン1では、年を'YYYY'、日を'DD'としていました。
console.log(format(new Date(2019, 0, 1), 'YYYY-MM-DD')); // 出力: "2019-01-01"
```

**バージョン2のコード例**:
```javascript
// バージョン2では、年は'yyyy'、日は'dd'となります。
console.log(format(new Date(2019, 0, 1), 'yyyy-MM-dd')); // 出力: "2019-01-01"
```

**対応策**: すべての`format`関数を見直し、フォーマット文字列を新しい仕様に合わせて更新します。

## 関数の挙動の変更

### `addDays`関数のタイムゾーンの扱い

**バージョン1のコード例**:
```javascript
// バージョン1では、タイムゾーンの影響を受ける可能性がありました。
const result = addDays(new Date('2019-03-30T10:00:00Z'), 1);
console.log(result); // タイムゾーンによっては、結果が異なる可能性があります。
```

**バージョン2のコード例**:
```javascript
// バージョン2では、タイムゾーンの影響を受けずに日数を加算します。
const result = addDays(new Date('2019-03-30T10:00:00Z'), 1);
console.log(result); // タイムゾーンに関係なく、一貫した結果が得られます。
```

**対応策**: タイムゾーンに依存するコードがある場合は、その挙動を確認し、必要に応じて修正

## ロケールの扱いの変更

### ロケールの明示的な指定

**バージョン1のコード例**:
```javascript
// バージョン1では、グローバルにロケールを設定
import { es } from 'date-fns/locale/es';
dateFns.locale(es); // グローバルにスペイン語ロケールを設定
```

**バージョン2のコード例**:
```javascript
// バージョン2では、関数ごとにロケールを指定します。
import { format, es } from 'date-fns';
console.log(format(new Date(2019, 0, 1), 'P', { locale: es })); // 出力: "1/1/2019"
```

**対応策**: ロケールを使用する各関数に対して、明示的にロケールオプションを渡すように変更
Apache archiva 400 Bad Request 404 Not Found 対応メモ

# 概要
Apache archiva経由でMavenCentralへアクセスした際に400 Bad Requestや404Not Foundが出力される場合があります。
RepositoryのDirectoryを絶対パスに修正することで疎通しました。備忘として残しておきます。

# 環境
Windows 64bit
Java 8
apache-archiva-2.2.10
自宅環境（社内プロキシ設定など無し）

# 事前準備
今回はデフォルトのリポジトリであるsnapshotsを例に疎通を行っています。
なおsnapshotsはcentralのプロキシがデフォルトでは設定されておらず、これが原因で404になるため事前にプロキシ設定を追加してください（Addボタンを押下してそのままの設定でOKを押下すればよいです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385780/e77dd263-aca3-479b-5104-48cfc435861d.png)

# 設定変更前

Directory　./repositories/snapshots
Index Directory　./repositories/snapshots/.indexer

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385780/8311beaa-b691-738e-9b89-db0cfc948810.png)

ブラウザで以下の様にアクセスすると400エラーが返ってきます。

>http://localhost:8080/repository/snapshots/junit/junit/3.8.1/junit-3.8.1.jar
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385780/bace09cd-9449-2539-663c-85d7abddaa5e.png)

# 設定変更後

Directory　D:\develop\apache-archiva-2.2.10\repositories\snapshots
Index Directory　D:\develop\apache-archiva-2.2.10\repositories\snapshots\.indexer

※上記のパスは例です。自身のApache archivaの配置箇所を指定してください
※変更前の区切り記号は「/」ですがWindowsエクスプローラのデフォルトである「\」に揃えています
※Saveを押下した時に1回目はエラー文言が出ますがもう一度押すと通ります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385780/7be81733-64ef-f668-1f6b-231c9293a3bd.png)

ダウンロードすることが出来た
※ブラウザでアクセスする際のアドレスは「repositories」ではなく「repository」です
>http://localhost:8080/repository/snapshots/junit/junit/3.8.1/junit-3.8.1.jar
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385780/d619f377-927e-cb2e-c7a3-4bfe8b704d2b.png)

# その他
## repositories/repositories構造
疎通した後に再度リポジトリの設定画面に遷移してみると「D:\develop\apache-archiva-2.2.10\repositories\repositories\snapshots」と何故か「repositories」が2つ挟まったパスに更新されています。また、Index Directoryのパスが相対パス表記に戻っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385780/e28cbb91-8a46-8e74-b65b-4d6987f0a8a1.png)

生成されたフォルダを見てみると確かに「repositories/repositories」階層となっています。
ミラーリポジトリは「repositories/repositories」配下のsnapshotsで生成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385780/8c096d86-f6b2-04fa-b7df-b1b1e0c32496.png)

これは再度絶対パス表記に修正し直すことで解消する様子。
今回は素直に\repositories\snapshots配下に生成したいのでこの様な再修正を行いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385780/c3b68d5f-4f65-b34c-e7de-c877ba108385.png)

以上
【VB.NET】E-Mailアドレスの正規表現

## E-Mailの正規表現
VB.NETの場合
```vb
' ローカル部分の連続するドット、先頭末尾のドットを禁止
^[a-zA-Z0-9_+-]+(\.[a-zA-Z0-9_+-]+)*@([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]*\.)+[a-zA-Z]{2,}$
```
- [a-zA-Z0-9_+-]+ ：半角英数字と`_+-`を1回以上繰り返す。
- (\.[a-zA-Z0-9_+-]+)* ：`.`と半角英数字と`_+-`を0回以上繰り返す。
- @([a-zA-Z0-9][a-zA-Z0-9-]\*[a-zA-Z0-9]*\.)+ ：
    - ローカル部分を`@`で結ぶ。
    - 半角英数字または、半角英数字と`-`を0回以上繰り返すまたは、半角英数字を0回以上繰り返す。そのあと`.`で結んだ文字を1回以上繰り返す。
- [a-zA-Z]{2,} ：半角英字を最低2回以上繰り返す。(トップレベルドメイン)


## 参考サイト
https://www.javadrive.jp/regex-basic/sample/index13.html

https://www.megasoft.co.jp/mifes/seiki/meta.html
List型のfirstやlastを使う際は要注意

安直にfirstやlastを使って要素にアクセスしてしまっており、不具合を起こしてしまっていたので備忘録。

例えば以下のコードはエラーになります。
```dart
  final List<String> list = [];
  print(list.last);  // Uncaught Error: Bad state: No element
```

そのため以下のように修正する必要があります。
```dart
  final List<String> list = [];
  print(list.isEmpty ? '' : list.last);
```

first、lastでの要素アクセスについてでしたが、単純にインデックスを使ったアクセスでも要素が空だとエラーになるので注意が必要です。
業務で使用頻度の高いショートカットキーと小技集

# 当ページのターゲット
・IT業界1～2年目の方
・Windows PC（パソコン） を使用している方

# 目的
IT業界に就職して、Excelなどのソフトやツールを日常的に利用する方が多いと思われるため、
使用頻度が高いショートカットキーを共有し些細なことかもしれないが、少しでも作業効率を上げること、
自分自身の備忘を目的として記載する。

# ショートカットキー一覧 / 小技集
## 【Windows】
###### 入力した文字を半角アルファベットに変換：F10

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363268/6f1e39c9-8dfd-b736-e9af-ef462b1a5b54.png)


---
###### 画面全体をキャプチャー（スクリーンショット）：Prt Sc（prt scr）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363268/d68fa992-1e1e-6fe2-81f0-e41d1882e899.png)

---
###### アクティブな画面をキャプチャー（スクリーンショット）：Alt + Prt Sc（prt scr）
上図でテキストエディターのみキャプチャーしたい場合、テキストエディターを選択（アクティブ）にした状態で「Alt + Prt Sc」を押下するとテキストエディター部分のみキャプチャーされる。

---
###### 画面の必要な部分のみを切り取る：Windows + Shift + S
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363268/3975b502-1a1a-0526-57f3-865a7ed419e8.png)

## 【Excel】
###### セルの書式設定：Ctrl + 1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363268/ec738da9-7582-9cf4-6e60-02d5caaec138.png)

---
###### 取り消し線を追加：Ctrl + 5
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363268/d6519a06-e431-a87c-d723-3c94e2e1876e.png)

---
###### シート内の先頭セルに移動：Ctrl + Home
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363268/1aed18e7-d04d-8f02-b039-1d807a7ac827.png)

---
###### 右隣のシートに切り替え：Ctrl + PgDn　※左隣のシートへの切り替えは「Ctrl + PgUp」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363268/471371c9-6c91-5ea8-6597-0fea00f3a424.png)

---
###### データの入力位置まで移動：Ctrl + 矢印キー　※下図は「↓」キーを押下した場合の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363268/58134f00-342b-97d2-142d-553bdabd113c.png)
<font color="Red">※セルを選択した状態で移動したい場合は、「Ctrl + Shift + 矢印キー」。</font>

---
###### 行・列の削除：Ctrl + "-（マイナス）"　※下図は行を削除する場合の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363268/17625eed-ab5d-0ae5-d5b7-57fc074be180.png)
<font color="Red">※行を追加したい場合は「Ctrl + "+（プラス）"」。</font>

---
###### 本日の日付を入力：Ctrl + ";（セミコロン）"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363268/909a2640-62fa-7e0b-174b-d3494d6b18a8.png)

---
###### 現在の時刻を入力：Ctrl + ":（コロン）"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363268/9316a171-4fc7-5010-c596-a6370afba142.png)

## 【サクラエディタ】
###### 昇順に並び替え：並び替えたい範囲を選択した状態で、Alt + A
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363268/e88ec22e-e60d-12b3-ced3-20ac43978405.png)

---
###### 行のマージ：マージしたい範囲が昇順もしくは降順で並んでおり、かつマージしたい範囲を選択した状態で、Alt + M
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363268/cdcda7f8-6eb9-091e-669a-b6e11437c4f4.png)

---
###### 矩形選択：Alt + 矢印キー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363268/9f9ff5f1-2b40-6f0b-637b-03c9d2a348b3.png)
- <b>【応用】上図のように矩形選択した状態で「コピー」もしくは「カット」し、別の行の任意の位置に「ペースト」</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3363268/fd910a10-8331-fe9b-ac0b-ef7eab62526a.png)
WEBスクレイピング

Pythonで東京都にあるカーディーラーの某WEBサイトをスクレイピング。
865店舗の店舗名と住所をスクレイピングしてcsvファイルに保存。
生成したcsvファイルの活用編は次回！

※スクレイピングが禁止されているサイトもあるので利用規約を要確認。
 WEBサイトに負荷が掛かる場合があるので要time.sleep

```
import requests
from bs4 import BeautifulSoup

base_url = "WEBサイトのURL"

url = base_url
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
soup

#soupでHTMLを表示して抽出したいタグを確認
#今回は店舗名と住所をスクレイピング
---------------------------------------------------------------------------
import requests
from bs4 import BeautifulSoup
import csv

base_url = "WEBサイトのURL（ページナンバーは削除）"
total_pages = 29 #全部で29ページ

with open('生成するファイル名.csv', 'w', encoding='shift_jis') as csv_file:
    csv_writer = csv.writer(csv_file)

    for page_number in range(1, total_pages + 1):
        url = base_url + str(page_number)

         response = requests.get(url)
        soup = BeautifulSoup(response.text, 'html.parser')

       for shop_info in soup.find_all(""抽出する要素"):
             shop_name = shop_info.find("店舗名の要素").text

            address = shop_info.find("住所の要素").text

            csv_writer.writerow([shop_name, address])
```

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615177/dbe6edfd-8916-ee31-8ace-b84c66e90dbc.png)
Embulkで発生したエラーのメモ

最近Embulkを用いてpostgresからデータを抽出し、csvに加工したりしています。その際に困ったことなどを随時メモしていこうと思います。


:::note info
query部分にSQLのコメントアウトは記載できない。
-
`--`を用いてコメントを記載するとSQLが正しくても、`hoge must appear in the GROUP BY clause or...`というエラーや`expecte <block end>, but found Scalar`というエラーなどが発生する。

対処法
* `--`を用いたSQLのコメントアウトは全て削除する。
:::
Amazon SageMaker Studio が起動できなかった時の対処法 (アプリ再起動)

Amazon SageMaker Studioを使用していて、ユーザープロファイルを開こうとすると、たまに以下のエラーメッセージが出てJupyter Notebookが開かないことがあります。

```
The loading screen is taking too long. Would you like to clear the workspace or keep waiting
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/c7a3f9fd-7caf-9d28-6dbd-5dec6da10f65.png)


この時、Clear Workspaceのボタンを押すと大抵復活しJupyterの画面が開くのですが、今回そうならず、ずっとブラックアウト画面 →　上記エラーメッセージ →　ブラックアウト画面・・・が続いて起動しない状態に陥りました。

以下のガイドにしたがって対処するのですが、

Amazon SageMaker Studio を起動できないのはなぜですか?
https://repost.aws/ja/knowledge-center/sagemaker-studio-launch-issues

AWSコンソール画面構造が少し変わっていて辿りづらかったので、個人メモもかねて記録を残します。（2023年11月6日時点)

なお、こちらにも類似記事がありますが、Studio全体を削除する方法なので、今回は実施しませんでした。
https://qiita.com/KC_NN/items/5037400655fecf5e80d6

# 試した手順
1. ブラウザの履歴を消す（キャッシュ・履歴・Cookie）
1. Amazon SageMaker Studioのドメインのユーザープロファイルのアプリを一旦全削除する

1は、ChromeやFirefoxなどブラウザごとのキャッシュ削除の手順で実施しますが、これでは解決しなかったので2へ。

2は、ユーザープロファイルに紐づくアプリを一旦綺麗にするということ。AWSコンソール上でAmazon SageMaker Studioのドメイン設定にある以下の絵の通り、各自が使うPersonal Appsを一旦消して再作成させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/6f8d695d-adee-22a4-2d29-2b832da2d650.png)

## アプリ削除の手順
1. AWSコンソール上でAmazon SageMakerを開く
1. 左側のペインで、Admin configurations > Domainsをクリック
1. 使っているドメイン名をクリック  << このあたりがわかりづらかった
1. ユーザープロファイルのタブで、問題のユーザーの名前をクリック  << このあたりがわかりづらかった
1. アプリケーションが一覧されているので、全てのアプリケーションをアクション列のボタンから削除する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/011cf15d-f20b-26dc-18ab-d2aa3bca17eb.png)

アプリケーションを削除、をクリックすると確認画面が出ます。ここに書いてありますが、ディレクトリに保存していたNotebookファイルは消えません。（未保存のNotebookがあった場合はその作業状態は消えます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/de4d0f0c-f882-9c7c-5318-97dabd3e5170.png)

# アプリ削除後の確認
全て削除したら、改めてユーザープロファイルを選択してStudioを起動すると、Jupyter Server含むアプリが再作成されて、綺麗な状態に戻ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/796e766f-0187-1b7c-f6eb-ce6e5f107fdd.png)
GenServerとは

- [GenServerとは](#genserverとは)
  - [GenServerモジュールの定義](#genserverモジュールの定義)
    - [`start_link(初期値)`の実装](#start_link初期値の実装)
    - [`init(初期値)`の実装](#init初期値の実装)
    - [クライアント側の関数を実装する](#クライアント側の関数を実装する)
    - [サーバー側のコールバックを実装する。](#サーバー側のコールバックを実装する)
  - [結論](#結論)

# GenServerとは

**GenServer**とは状態を保持し、<font color="red">クライアントからのリクエストに応答するプロセス</font>のこと。

具体的には**クライアントから呼び出す関数**と、**サーバー側のコールバックを実装する**ことで、
**クライアントとサーバー間でやり取りを行うこと**ができるようになる。

## GenServerモジュールの定義

GenServerの**Behaivor**(振る舞い)を実装したモジュールのことを、
**GenServerモジュール**と呼ぶ。

基本的なGenServerモジュールは、次の手順で定義することができる。

* `start_link(初期値)`の実装 - <font color="red">GenServerプロセスを開始する</font>ためのコールバック
* `init(初期値)`の実装 - 上記の関数から引数を受け取り、<font color="red">GenServerプロセスの初期状態を設定するため</font>のコールバック
* クライアント側の関数を実装する
* サーバー側のコールバックを実装する

### `start_link(初期値)`の実装

GenServerプロセスは次の2つの関数を使用して生成することができる。

* `GenServer.start(GenServerモジュール, 初期値, オプション)`
* `GenServer.start_link(GenServerモジュール, 初期値, オプション)`

GenServerモジュールを定義するには`GenServer.start_link(GenServerモジュール, 初期値, オプション)`を使用する。

またこれらの関数は、<font color="red">呼び出し元のプロセスとリンクしているか</font>が異なる。

GenServerモジュールの`start_link(初期値)`は、この`GenServer.start_link(GenServerモジュール, 初期値, オプション)`を呼び出す関数となる。

GenServerモジュールの`start_link(初期値)`は、次の記述で実装できる。

```elixir
def start_link(init_status) do
  GenServer.start_link(__MODULE__, init_status, name: __MODULE__)
end
```

### `init(初期値)`の実装

GenServerモジュールの`init(初期値)`は以下のように実装することができる。

```elixir
def init(init_status) do
{:ok, init_status}
```

### クライアント側の関数を実装する

GenServerプロセスはクライアント-サーバ間で**メッセージでやり取り**を行う。

実際にはクライアントが実行する関数内で、<font color="red">GenServerプロセスへメッセージの送信</font>を行う。

メッセージを送信する関数は次の2つが存在する。

* `GenServer.call(__MODULE__, メッセージ, ミリ秒(オプション)` - クライアントがサーバにメッセージを送信し、応答を待つための関数。またタイムアウトまでのミリ秒を設定することができる。
* `GenServer.cast(__MODULE__, メッセージ)` - サーバーがメッセージを受信して、処理を行う関数。応答は返さない。

記述例は以下のようになる。

```elixir
der initialize_status() do
  GenServer.cast(__MODULE__, {:update, :init})
end

def get_by_key(key) do
  GenServer.call(__MODULE__, {:get, key})
end
```

### サーバー側のコールバックを実装する。

クライアント側の処理を行うには、次の関数を実装する。

* `handle_call(メッセージ, from, status)` - GenServer.callからメッセージを受信し、応答を返す。fromは呼び出し元プロセスの情報。
* `handle_cast(メッセージ, status)` - GenServer.castからメッセージを受信し、処理を行う。

`handle_call(メッセージ, form, status)`は次のように実装することができる。

```elixir
def handle_call(メッセージ, _from, status) do
  {:reply, 応答, 状態}
end
```

この関数は同期的な操作を行い、戻り値は`:reply`から始まる。

また同期的な操作を行うため、<font color="red">応答が返るまでクライアントは操作ができない</font>。

`handle_cast(メッセージ, status)`は次のように実装することができる。

```elixir
def handle_cast(メッセージ, status) do
  {:noreply, 更新後状態)
end
```

この関数は非同期的な操作を行い、戻り値は`:noreply`から始まる。

また非同期的な操作を行うため、クライアントは<font color="red">メッセージを送信直後に操作を行う</font>ことができる。

## 結論

GenServerモジュールを定義するには以下を行う。

1. `start_link(初期値)`を定義する。
2. `init(初期値)`を定義する。
3. `GenServer.call(__MODULE__, メッセージ)`や`GenServer.cast(__MODULE__, メッセージ)`を呼び出すクライアント側の関数を実装する。
4. メッセージを処理する`handle_call(メッセージ, from, status)`や`handle_cast(メッセージ, status)`を実装する。

定義したGenServerモジュールを起動することで、GenServerプロセスを生成し、メッセージを処理することができるようになる。
SQLで日付の比較をおこなう(oracle)

# やりたいこと
PHP上でSQLを利用して日付型カラムと指定した日付で比較を行いたい。
検索フォームで日付を指定し、該当する日付のもので検索を書けるようなシステム。
検索フォームからの日付は$search['regist_date']としてPHP側に渡る。
使用DBはoracle

# 成功したSQL
~~~
$sql = "SELECT * from customer";
$sql .= "where regist_date = TO_DATE('".$search['regist_date']."', 'YYYY/MM/DD')";
~~~

# 必要だったこと
- 検索フォームで指定した日付をTO_DATEで日付型にする。
~~~
TO_DATE('日付型文字列', 'フォーマット')
~~~
**このとき、$search['regist_date']をシングルクォーテーション（’ ’）で囲んでいなかったのが失敗した原因の１つだった。**

# まとめ
TO_DATEの書式の理解に足りていない部分があった。また、TO_CHAR(TO_DATE(... の書き方と混ざっている部分もあった。単純な日付の比較ではTO_DATEだけで事足りると思われる。
また、日付の比較では＝が使えないという話も見られたがそのようなことは（Oracleでは）なさそう。
【学習メモ】API Gateway Lambda オーソライザーとは

# Lambda オーソライザーとは
・Lambda 関数を使用して、API へのアクセスを制御する API Gateway の機能
（クライアントが認可された人か確認するってこと）

クライアントがリクエストをAPI Gatewayへ送信
↓
API GatewayがLambda オーソライザーを呼び出し
↓
Lambda オーソライザーが認可戦略を使用して、「この人はOK」か確認
↓
OKの場合、IAM ポリシーを出力として返す

# Lambda オーソライザーの種類
## トークンベース の Lambda オーソライザー
・TOKEN オーソライザーのこと
・JSON ウェブトークン (JWT) や OAuth トークンなどのベアラートークンで発信者 ID を受け取る

## リクエストパラメータベースの Lambda オーソライザー
・REQUEST オーソライザーのこと
・ヘッダー、クエリ文字列パラメータ、stageVariables、および $context 変数の組み合わせで発信者 ID を受け取る
・WebSocket API では、リクエストパラメータのみ使える

# 参考サイト
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html
RustのIterator: anyとfindの違い

Rustの`Iterator`トレイトは、コレクションの要素を検査するための強力なメソッドを提供しています。その中でもよく使われるのが`any`メソッドと`find`メソッドですが、これら二つのメソッドは異なる目的で使用されます。

## `any`メソッド
`any`メソッドは、イテレータを介してコレクションの各要素に対して指定した条件をテストします。もし条件を満たす要素が一つでもあれば、`true`を返し、そうでなければ`false`を返します。このメソッドは、特定の条件を満たす要素がコレクションに存在するかどうかを確認する際に便利です。

### 例:
```rust
let numbers = vec![1, 2, 3, 4, 5];
let has_even = numbers.iter().any(|&x| x % 2 == 0); // 偶数が含まれているため、trueを返す
```


## `find`メソッド
一方で、`find`メソッドは、イテレータの各要素に対して指定した条件をテストし、条件を満たす最初の要素をSomeでラップして返します。条件を満たす要素が一つもなければ`None`を返します。`find`は、条件に合致する具体的な要素を見つけ出す必要があるときに使用されます。

### 例:
```rust
Copy code
let numbers = vec![1, 2, 3, 4, 5];
let first_even = numbers.iter().find(|&&x| x % 2 == 0); // Some(&2)を返す。2が最初の偶数のため。
```

# 要約
`any`はブール値を返し、条件を満たす要素の存在をチェックします。
`find`はオプション値を返し、条件に合致する最初の要素そのものを見つけます。


どちらのメソッドもイテレータを消費しますが、条件を満たす要素が見つかった時点でイテレーションを停止するという短絡評価の性質があります。これにより、パフォーマンスを向上させることができます。

# 参考記事
[Iterator::any](https://doc.rust-jp.rs/rust-by-example-ja/fn/closures/closure_examples/iter_any.html)
[Searching through iterators](https://doc.rust-jp.rs/rust-by-example-ja/fn/closures/closure_examples/iter_find.html)
Reactの記述

## はじめに
Reactの記述方法の備忘録です💁
初心者です😅
間違えてる部分多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇


## コンポーネントとは
* 見た目と機能を持つUI部品
* コンポーネントを組み合わせてページを作る
* 大きく2種類のコンポーネントにわかれる → Class Component （クラスコンポーネント） → Functional Component（関数コンポーネント）

## なぜコンポーネントを使うのか
* 再利用するため。同じ記述を何度もする必要がなくす。
* コードの見通しをよくするため。

:::note info
コンポーネントで押さえどころ
* 1コンポーネント=1ファイル
* 別ファイルに分けることでコードが読みやすくなる※変更に強くするため
* 修正はなるべく1箇所だけでいいようにするため
:::

## コンポーネントは
Class Component （クラスコンポーネント） Functional Component（関数コンポーネント）
に分かれていて両方ともで表現できる。
今は「Functional Component」が主流。

## 親コンポーネント
* 子コンポーネントを呼び出して使うコンポーネント
* 子コンポーネントを呼び出すときに「import Article from "/components/Article";」を冒頭に記載して呼び出す。**※reactのバージョン17以降はなくてもOK**👍

## 子コンポーネント
* 一つ一つの部品。（モジュールに近い）
* 子コンポーネントの一つ一つのファイルの最後に
「export default Article;」を追加することで、他で呼び出せるようにする。


## propsで指定する
### 子コンポーネントではpropsを使って記入。

<h2>{props.title}</h2>
<p>{props. content}</p>
これを親要素で指定して使う。

<INS>**子要素はあくまでも型を作るイメージ。**</INS>

### 親コンポーネントで内容を記載
親コンポーネントはpropsは子コンポーネントのpropsで指定した名称を定義して入力するものを決める。

```jsx:sample.jsx
<Article
    title={'新・日本一わかりやすいReact入門'}
    content='今日のトピックはpropsについて。'
/>
```

## propsで渡せるデータ
*   propsのデータは4に記述
*   文字列、数値、真偽値、配列、オプジェクト、日付などなんでもOK
*   変数を渡すことも可能
*   文字列はなしでもOK

## コンポーネントの利用詳細
* 同じコンポーネントをいくつも呼び出すことができる
*   配列データをmap（メソッドで処理するのが一般的（実践編で解説）

:::note info
押さえておくべき点🧠
* なるべく細かく子コンポーネントを作成する
* propsを使って子コンポーネントではなく親コンポーネントに内容を入力して子コンポーネントは部品として使えるようにする。
:::

## 参考にしたサイト
[とらぜみさんのYouTube]（https://youtu.be/Q-df0QgZuhE?si=4SuGSE9swBu3rPWK)
AI-102試験対策のまとめ「Azure Container Registry(ACR)」

## はじめに
Azure AI Engineer Associate(AI-102)取得に向けた勉強でまとめた内容を本記事では投稿しています。
試験範囲の内容を私が勉強していく中で、
・忘れてしまっていた内容
・他の知識と絡めて理解した方が良い内容
・Microsoft Learnの読解に苦戦した内容
などをできるだけ分かりやすく簡潔にまとめることを意識しています。
Azureの勉強を一から始め、AI-102取得を目指している方の参考になれば幸いです。
※本記事の内容が必ず試験に出るわけではないこと、ご注意ください
※勉強しながら投稿しているため、追加で学んだことがあれば随時投稿内容を更新します。

## 試験対策のまとめ
### Azure Container Registry(ACR)
コンテナイメージと関連する成果物を保存/管理可能  
デプロイパイプラインやACRタスクでビルドを自動化可能  
Azure RBACを使用してレジストリに対する細かなアクセス制御が可能  

#### **ACRを使用したコンテナイメージの実行**
※既存のコンテナイメージを修正して使用する場合
1. ACRインスタンスの作成
1. レジストリへのログイン
1. 実行したいコンテナイメージの準備
    1. 既存のコンテナイメージをプル
    1. カスタムDockerfileを作成
1. レジストリインスタンスにイメージをプッシュ
1. `docker run` コマンドでコンテナイメージを実行

* 参考
    - https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-intro
    - https://learn.microsoft.com/ja-jp/azure/container-registry/container-registry-get-started-azure-cli

## 次の試験対策のまとめ
* **AI-102試験対策のまとめ「Azure AI Servicesの診断ログ有効化」**

https://qiita.com/fsd-jume/items/7b623d3d9e6fbbb0cb1d

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/65aba5d5514e023fd66d
ログイン時間の履歴


+ [Login hours](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007OXPvZ)

 ユーザー A (sf admin) のログイン履歴には、正しいログイン時間が午前 8 時から午後 5 時まで記載されています。(ユーザーは 1 人だけ)

※ユーザーBのログイン履歴は一定間隔で24時間分のログイン時間があります。MFA を使用して接続する場合は送信元 IP アドレスが異なりますが、それ以外の場合は送信元 IP アドレスが異なります。(数人のユーザー)

 * ログを調べると、24 時間接続されていたようです。ログイン履歴では定期的に接続されているように見えますが、接続されていないことはわかっています。

他のユーザーに聞いてみると、勤務時間外は接続しないとのこと。

パソコンからのみ接続しており、電話からはアクセスしておりません。ログアウトでシステムからログアウトしても、接続時間が履歴に残ります。



以下が気になる

+ [Logins not recorded in login history or audit trail??](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A7ezvSAB)
+ [User's Login History Not Showing](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000BtYy0SAF)

:::note
I beleive the issue all of you are experiencing is related to 'Session Settings'. If you are in an org with session settings around 12-24 hours it is completely possible for your users to have rolling multiple day sessions. 
 

After running into this issue myself I have determined this to be the issue. 
 

If you are seeing users create and update records for specific dates where there is no login history consider checking your session settings and tweaking as necessary. 
 

You can also control session settings at the profile level if different profiles have varying levels of risk associated with data.
皆さんが経験している問題は「セッション設定」に関連していると思います。セッション設定が 12 ～ 24 時間程度の組織にいる場合、ユーザーが 複数日にわたってセッション をローリング する可能性は十分にあります。
 

私自身この問題に遭遇した後、これが問題であると判断しました。 
 

ログイン履歴がない特定の日付のレコードをユーザーが作成および更新している場合は、セッション設定を確認し、必要に応じて調整することを検討してください。 
 

プロファイルごとにデータに関連するリスクのレベルが異なる場合は、プロファイル レベルでセッション設定を制御することもできます。
:::


 # 関連資料

 + [ログイン履歴の監視](https://help.salesforce.com/s/articleView?id=sf.users_login_history.htm&type=5)
 + [サインインエラー: 「ログイン数超過」](https://help.salesforce.com/s/articleView?id=000381578&type=1)
新米SEが気付いた富士通のAWS認定試験への取り組み

# はじめに
## 自己紹介
はじめまして、2023年に富士通へ新卒入社した1年目です。
先日、富士通の2023 Japan AWS Jr. Champions(以降は「AWS Jr. Champions」と略します。)が主催した社内のLTで発表させていただく機会がありました。
そこで発表した**私が入社してから気付いた弊社のAWS認定試験への取り組み**についてQiitaに投稿したいと思います。

私のバックグラウンドは以下の通りです。
- AWS認定資格
    - 入社前にAWS Certified Cloud Practitioner(CLF)を取得
    - 入社後にAWS Certified Solutions Architect - Associate(SAA)を取得
- AWSの実務経験はなし

## 社内LTでの発表のきっかけ
[Japan AWS Jr. Championになったきっかけ](https://qiita.com/Pretzelisa/items/1eb3e863d99ded54b238)を投稿されたAWS Jr. Championの齋藤さんからお声がけいただき社内のLTで発表することになりました。
ただ、私はAWSの実務経験はなく資格取得をしているのみです。そのため、技術の観点ではなく資格の観点で新人の目線を活かしつつ気付いたことなら話せると考え、発表テーマを決めました。

社内にはAWS認定試験に関する情報が多く存在するため、それらを探しながら活用していくには一苦労ありました。そのため、自分なりにそれらをどう活用しているのかをまとめることで、同じように資格取得を目指している方の一助に繋がればと思い、社内では発表させていただきました。

また、私はこういった会社における資格取得への取り組みを入社前にもう少し知ることができれば、成長を促すような環境があるかどうかの判断材料が増えて嬉しかったと感じています。(結果的に、富士通にはそのような環境が整っていると感じています。)
そのため、社外の方に対しては、もし興味がある方がいらっしゃったらこのQiita投稿を通じて、富士通の取り組みや新人がどのようにそれらを活用しているのかを知っていただく機会となれば幸いです。

早速、本題に入っていきます。

# AWS認定試験に対する富士通の取り組み
※以下、2023年度における説明となります。
「制度」「教育」「環境」の3つに大きく分けてみました。

## 制度編:tools:
### 個人負担0円で試験の申し込みが可能
会社の資格取得推進施策によって、AWS認定試験の受験料が全額無料になるバウチャーが提供されています。これによって個人負担0円でAWS認定試験を受けることができます。

2023年11月現在で、AWS認定試験の受験料(税抜)は以下の通りになっています。
これらの受験料を気にすることなく、積極的に受験できる制度が整っています。
(参考) [試験前 | AWS 認定に関する情報とポリシー | AWS](https://aws.amazon.com/jp/certification/policies/before-testing/#Exam_pricing)
|  試験のタイプ  |  受験料  |
| ---- | ---- |
|  Foundational |  11,000円  |
|  Associate  |  15,000円  |
|  Professional  |  30,000円  |
|  Specialty  |  30,000円  |

入社前に自腹で受験してCLFを取得していたのですが、受験料だけで言えば入社してから受験すればよかったなと後悔しています......

## 教育編:books:
### 社内教育
Qiitaには文字通りまとめきれないほど様々なAWS教育が社内から提供されています。
この項目についてはクローズドな情報も多いですが、充実していることは確かです。
私は社内教育を活用して、AWS Certified Security - Specialty(SCS)の取得に向けてAWSのセキュリティ周りを学んでいこうと計画中です。

### Udemy Business
ご存知の方も多いと思いますが、Udemy BusinessはUdemy社が提供する法人向けのオンライン動画プラットフォームです。
Udemy Businessでは提供されている講座は受け放題であるため、AWS試験対策講座や模試などを受講して自身のペースで試験対策を進めることができます。
私自身、Udemyの講座や模試をSAAの勉強の際にはとても活用しました。これがなければ合格できなかったです。

### KinoDen
KinoDenは紀伊国屋書店が提供する学術和書電子図書館サービスです。
AWS認定試験の参考書も読むことができるため、動画だけではなく電子書籍でも試験対策が行えます。

## 環境編:sunny:
### AWS技術者育成コミュニティ
社内SNSのコミュニティの一つとしてAWS技術者育成コミュニティがあります。そこではAWS教育、イベント、認定試験の合格体験記などの情報が共有されています。
特に、合格体験記にはコメントやリアクションがたくさん来るため資格のモチベーション維持につながる環境になっています。

### 2023 Japan AWS Jr. Championsの存在
富士通には2023 Japan AWS Jr. Championsに選ばれた方が2名いらっしゃいます。
今回、社内LTとQiitaへのこのような投稿の機会をいただいたのも、社内のAWS Jr. Championsがきっかけでした。
AWS Jr. Championsの方々はこれ以外にも様々な社内におけるAWS活動をリードされており、とても大きい存在だなと感じています。日々刺激を受けています。

# さいごに
ざっくりとまとめたのでまだまだ紹介しきれていないものや自分がまだ把握できていないものもありますが、弊社でのAWS認定試験への取り組みを知るきっかけとなれば幸いです。
email templateを使った場合にメール送信できない



+ [パートナーコミュニティユーザがメールを送信するときに「メールを送信できませんでした。もう一度試してください。」エラー](https://help.salesforce.com/s/articleView?id=000383543&type=1)

Spring '19 以降、Lightning テンプレートを使用してメールを送信しようとすると、パートナーコミュニティユーザに対してエラーが発生する場合があります。

+ [メール送信時のエラー「メールを送信できません。もう一度試すか、Salesforce システム管理者にお問い合わせください。」と表示される](https://help.salesforce.com/s/articleView?id=000382707&type=1)

Einstein 活動キャプチャ (EAC) が有効な場合、Lightning Experience (LEX) ユーザやシステム管理者以外のユーザが Salesforce から送信メールを送ることができません。その場合に「メールを送信できません。もう一度試すか、Salesforce システム管理者にお問い合わせください。」というエラーが表示されます。

# 一部のユーザでメールを送信できない

+ [【未解決】We couldn't send your email. Please try again" tied to email template](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007PgCxkSAF)
wslでelixir その93

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題、やってみた。

# 練習問題
pngファイルをパースせよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d94a3003-a015-bed4-f925-e0beb83f8f12.png)

# サンプルコード

```
defmodule Pang do
	def parse(filename) do
		{:ok, bindata} = File.read(filename)
		<<hader:: size(64),
			length:: big - size(32), 
			type:: big - size(32), 
			width:: big - size(32), 
			height:: big - size(32), 
			bit_depth:: size(8), 
			color_type:: size(8), 
			compression_method:: size(8), 
			filter_method:: size(8), 
			interlace_method:: size(8),
			data:: binary>> = bindata
		IO.puts("length: #{length} Width: #{width} Height: #{height}")
	end
end

Pang.parse("1.png")
```

以上。
wslでelixir その92

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題、やってみた。

# 練習問題
bmpファイルをパースせよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1cbfa66a-cebd-58e4-7a3c-89bbe5ae9527.png)

# サンプルコード

```
defmodule Bmp do
  def parse(filename) do
    {:ok, bindata} = File.read(filename)
    <<"BM", _:: size(64), 
      offset:: size(32) - little, _:: size(32), 
      width:: size(32) - little, 
      height:: size(32) - little, _:: size(16), 24:: size(16) - little, _rest:: binary>> = bindata
    IO.puts("Offset: #{offset} Width: #{width} Height: #{height}")
  end  
end

Bmp.parse("color.bmp")

```

以上。
様々な画像劣化に対応するDASRスーパーレゾリューションモデル

https://github.com/The-Learning-And-Vision-Atelier-LAVA/DASR

これが元画像128*171
![IMG_8316.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/7b65e6a4-acc4-cfa2-385c-87fdb55e8e8f.jpeg)

見やすいように引き伸ばすと、ピクセルのギザギザが出ます。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/7b65e6a4-acc4-cfa2-385c-87fdb55e8e8f.jpeg width=512>

これをDASRで４倍スケール（512*684）にすると

![e5402346-a980-49bb-b65c-af44f54a4de8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/d9a8cfad-4bee-114e-c229-958517d13c37.png)

ネックレスや背景を比べてみると、割とはっきりしていることがわかるのではないかと思います。

世の中、いろんな画像がありいろんな劣化があります。それに対応しようという。

# 使い方

インストール

```shell
git clone https://github.com/The-Learning-And-Vision-Atelier-LAVA/DASR.git
cd DASR
```

実行

```shell
!python quick_test.py --img_dir='your_dir/your_image.jpg' --scale='4' --resume=600 --blur_type='aniso_gaussian'
```

事前トレーニング済みモデルはリポジトリに含まれています。
実行時間は256*256で0.2秒（T4）と速いです。


🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
Laravelでページを表示する方法

# 始めに
bladeを使用したページの出力方法を備忘録として書いていきます。
# 環境
* Windows11 HOME
* WSL2
* Laravel10
* VScode
## 環境構築
Laravelプロジェクトはsailで用意しました。
下記コマンドを実行し、「blade-test」という名前でプロジェクトを作成します。
~~~
curl -s https://laravel.build/blade-test | bash
~~~
# ページの表示
### bladeの作成
下記のviewsフォルダにpage.blade.phpという名前でファイルを作成します。
`resources\views`

![ページの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3607729/0940846d-28d5-921e-2ecb-b4593ffd73ae.png)
page.blade.phpの中身は下記のようになっています。
~~~
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>test</title>
</head>
<body>
    <h1>TEST!</h1>
</body>
</html>
~~~
### ルーティングの設定
下記にweb.phpがあるので編集します。
`routes\web.php`
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3607729/50ee2ab7-f308-2034-2eba-97aa3c1cb230.png" width="800">
下記の内容をweb.phpに追加します。
~~~
Route::get('/page', function () {
    return view('page');
});
~~~
これで、ページを表示させる準備が出来たのでブラウザに下記のURLを打ち込めば「TEST!」と表示されます。
`http://localhost/page`
2023/11/6主にITとかセキュリティの記事

北朝鮮ハッカーは新たなmacOSマルウェアでブロックチェーンエンジニアを標的に(11/3)
https://nextmoney.jp/?p=62040

北朝鮮のサイバー攻撃グループ「Lazarus」、macOSのブロックチェーンエンジニア狙う(11/3)
https://news.mynavi.jp/techplus/article/20231103-2809626/

【第2回】ライフサイエンス業界に迫る拡大するランサムウェア・マルウェア被害、サイバーセキュリテ ィの展望(11/3)
https://www.gmp-platform.com/article_detail.html?id=22260&lang=ja

フェイク画像の検証、グーグルがやってくれるよ(11/4)
https://www.gizmodo.jp/2023/11/googles-latest-updates-helps-root-out-ai-deepfakes.html

イスラエルの企業狙う破壊的なマルウェア「BiBi-Linux」発見(11/3)
https://news.mynavi.jp/techplus/article/20231103-2807731/

Huawei、Googleアプリをマルウェアと誤検知(11/3)
https://www.zaikei.co.jp/article/20231103/744320.html

「被害」企業に刑事罰も　四谷大塚など情報流出事件続く(11/3)
https://www.nikkei.com/article/DGXZQOUC113750R11C23A0000000/

ソラナ大手DEX「Jupiter」、仮想通貨「JUP」エアドロップ計画　パーペチュアル取引導入も(11/4)
https://coinpost.jp/?p=489969

Google、議論を呼んだ「Web Environment Integrity」提案を撤回(11/3)
https://news.mynavi.jp/techplus/article/20231103-2810016/

スマートコントラクトとは？概要や仕組み・活用シーンを解説(11/3)
https://xrcloud.jp/blog/articles/business/2495/

「暗号資産の冬」は終わった／証券と分類されたらどうなる？【週末に読みたい厳選10本】(11/4)
https://news.yahoo.co.jp/articles/239c8a99edf5fbba9bae71b864fef2ed5807b5bf

IBMのCEOがアドバイス！ 自分のキャリアをAIに奪われないためのスキルとは（海外）(11/4)
https://news.yahoo.co.jp/articles/720ad78d2b2269dfc39e9949c6de48458962fcd4

サイバー特許、トップ10に中国勢6社　ファーウェイなど(11/4)
https://www.nikkei.com/article/DGXZQOUC049D30U3A001C2000000/

ITリテラシーが低いことで起こる4つのリスク！原因や対処法も紹介(11/3)
https://www.sejuku.net/blog/225315
[Xcode Cloud]「an out-of-date resolved file was detected at 〇〇 ...」というエラーが出た時の対処法

Xcode Cloud、 便利ですよね。 個人開発で最近導入したのですが、導入方法が超絶簡単でびっくりしました。
そしてシンプルがゆえにワークフローがあまりカスタマイズできません。
例えば、xcodebuildコマンドが使えないため細かいビルドの設定が不可能だったりします。
なのでエラーに当たった際、対処法が他のCIサービスと異なるので探すのが大変です。
今回のエラーもなかなか苦労したので、今回は

```
Could not resolve package dependencies:
  an out-of-date resolved file was detected at /Volumes/workspace/repository/〇〇.xcworkspace/xcshareddata/swiftpm/Package.resolved, 
which is not allowed when automatic dependency resolution is disabled; 
please make sure to update the file to reflect the changes in dependencies. 
Running resolver because requirements have changed.
```
こちらのエラーの修正方法について書きました。

# 解決方法
プロジェクトのルートディレクトリに`ci_scripts/ci_post_clone.sh`を作成し、以下のようなスクリプトを書きます。

```sh:ci_scripts/ci_post_clone.sh
#!/bin/zsh

defaults delete com.apple.dt.Xcode IDEPackageOnlyUseVersionsFromResolvedFile
defaults delete com.apple.dt.Xcode IDEDisableAutomaticPackageResolution
```

次にchmodでexecutaleに変換します
```
$ chmod +x ci_scripts/ci_post_clone.sh
```

以上で完了です！
このようにすることで、CI上でPackageのResolveをするのではなく、既存のPackage.resolvedファイルで定義された依存関係をそのまま使用することができます。

## 他のCIサービスでの対処法
xcodebuildコマンドを使用できる際は、`-disableAutomaticPackageResolution`フラグを追加することで対処が可能なようです (未検証です🙏)

# まとめ
Package.resolvedが最新のはずなのにこのエラーがでるのは謎ですが、ひとまずエラーに対処することができてよかったです。
他のCIサービスと対処法が違う＆まだまだネット上に情報が少ないので、Xcode Cloudで詰まった際は対処法を探すのが大変ですね...
CloudFormationで複数のIamユーザーをまとめて作成

## 背景

AWSのIaCのCloudFormationでループ処理ができるようになっていたらしい(2023/07くらい)

[AWS Docs](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-foreach.html)

CloudFormationでIamユーザーを複数作る際に似たような処理を何回も記載するのは面倒だったけど、これで一気に作成できる


## CloudFormation yml

ymlで記載

```yml
AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::LanguageExtensions'
Description: Template for creating Initial IAM

Parameters:
  UserNames:
    Type: List<String>
    Default: user01, user02, user03

Resources:
  IAMGrouopInitialTest:
    Type: 'AWS::IAM::Group'
    DeletionPolicy: Retain
    Properties:
      GroupName: "test-user-group-01"
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/ReadOnlyAccess'
  'Fn::ForEach::CreateUserLoopName':
    - username
    - !Ref UserNames
    - 'IAMUserInitial${username}':
        Type: 'AWS::IAM::User'
        DeletionPolicy: Retain
        Properties:
          UserName: !Ref username
          Groups: 
            - "test-user-group-01"

Outputs:
  'Fn::ForEach::OutputUserLoopName':
    - username
    - !Ref UserNames
    - 'UserNames${username}':
        Description: Information about User name
        Value: !Sub "IAMUserInitial${username}"

      'PasswordSettingURL${username}':
        Description: Please create a password at the URL
        Value: !Join 
          - ''
          - - 'https://'
            - console.aws.amazon.com/iam/home?region=
            - !Ref 'AWS::Region'
            - '#/users/'
            - !Ref username
            - '?section=security_credentials'

  LoginURL:
    Description: Information about console login URL
    Value: !Join 
      - ''
      - - 'https://'
        - !Ref 'AWS::AccountId'
        - .signin.aws.amazon.com/console
```

ポイントは2つ. 1つ目は`Parameters`でstringのlistを作成. ここでユーザー名の一覧を記載.

2つ目は`Fn::ForEach::CreateUserLoopName`でループを定義.
```yml
  'Fn::ForEach::CreateUserLoopName':
    - username
    - !Ref UserNames
    - 'IAMUserInitial${username}':
```

usernameの部分でループ変数を定義している.
```yml
    - username
    - !Ref UserNames
```

あとはこれを普通cloudformation通りに実行してstackを作成すれば良い.

実行すると、ymlで指定したユーザーグループ、`test-user-group-01`にユーザーが複数作成されていた. 

![スクリーンショット 2023-11-06 2.42.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1154503/2f3c347e-deb9-2c20-94b5-b74fcd27d5b0.png)
PrismのDelegateCommand.ObservesPropertyのテスト

Prismで用意されているDelegateCommandはObservesPropertyメソッドを指定することによってCanExecuteを再評価してくれる。しかもメソッドチェーンで複数指定可能。
プロパティをネストして指定したり重複する場合、どういう挙動をするのかメモ。

実行するコード
```csharp

public static class TestCode {

	public static void Main(string[] args) {
		var root = new RootClass();
			
		root.NotifyObject = new NotifyObj() { Name = "test1" };
		root.NotifyObject.Name = "test2";

        root.NotifyObject = new NotifyObj() { Name = "test3" };
        root.NotifyObject.Name = "test4";
        Console.ReadKey();
	}
}
```
用意したコード
```csharp

	public class RootClass : BindableBase {
		public RootClass() {
			Command = new DelegateCommand(() => { })
                .ObservesProperty(() => NotifyObject)
                .ObservesProperty(() => NotifyObject.Name);
            
			Command.CanExecuteChanged += (s, e) => { Console.WriteLine($"changed! {NotifyObject.Name}"); };
		}
		NotifyObj notify = new NotifyObj();
		public NotifyObj NotifyObject {
			get { return notify; }
			set {
				SetProperty(ref notify, value);
			}
		}
		DelegateCommand Command { get; set; }
	}
    public class NotifyObj : BindableBase {
		public NotifyObj() { }
		string name = "default";
        public string Name {
            get { return name; }
            set {
                this.SetProperty(ref name, value);
            }
        }
    }
```

実行結果は以下
![screenshot.12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70164/8474aca5-3470-5f5f-5835-e248aee0d263.jpeg)

NotifyObjectが変更されると二重でCanExecuteChangedが呼ばれている。
ということで以下のように記述すれば重複して呼び出されない。
``` csharp
	public class RootClass : BindableBase {
		public RootClass() {
			Command = new DelegateCommand(() => { })
                .ObservesProperty(() => NotifyObject.Name);
            
			Command.CanExecuteChanged += (s, e) => { Console.WriteLine($"changed! {NotifyObject.Name}"); };
		}
        //以下略
    }
```
![screenshot.12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70164/791eeed6-7e3a-1237-aebe-72a242b619e5.jpeg)
というわけで、同名プロパティ変更通知は重複する。
可能な限り対象のインスタンスのメンバーで完結させたい。
プロジェクト大炎上

別に大炎上ということでもないですが、私一人で抱えていたら必ず大炎上につながり、
より多くの人に迷惑をかけていただろうと思います。

会社の人に相談したことで、その対応をしてくれるとのことで、心が軽くなりました（すごく、、すごく）

とある開発案件での出来事

プロジェクトを難化させた要因
　１.顧客側の管理者が変わった
　２.開発側（こちら側）のPMが突然の長期休暇（メンタル的なものではない）により、私にその役割が回ってきた

「１.顧客側の管理者が変わった」について
今までは、顧客側でも認識相違なく勧められたが、社の方針が変わったらしく
色々無駄を省くような体制になったため、管理者は不満があり退職することとなった。
それにより後任の方は、ガチガチのWBSをこちらに提示しスケジュールがひっ迫する状況となった。

「２. PMが突然の休暇」について
PMが長期休暇を取ることとなったためその役割を私が担うようになった。
一番の問題は、前任の管理者と合意が取れていた事項がすべてひっくり返されたため
色々かみ合わず、しかもすべて細かく管理したがるタイプだったので、こちらのバッファがとれず
めんどくさい。まじでめんどくさい。

最後に私自身もプロジェクトへの理解が浅く、適当に流していた部分もあったので、その辺は反省点として
考えておきます。
Markdownで技術同人誌のPDFが生成できるOSSを公開しました

こんにちは、以前 [FlightBooks](https://flightbooks.pub/)というサービスを立ち上げていたのですが、2年ほどメンテしていなかったため、ローカル動作するOSS版として公開することにしました。

https://flightbooks.pub/

OSS版を作るにあたり、エディタ部分はVSCodeなりお好きなエディタを使ってもらうとして、

- MarkdownからHTMLを生成する部分
- HTMLからPDFを生成する部分

を切り出して公開しました。

https://github.com/ku-suke/flightbooks

# ほかのサービスや技術と何が違うの？

技術書をマークアップテキストで書くプラットフォームとしては、Re:VIEW、Vivliostyleなどがありますが、FlightBooksは「出版やDTPに関する知識がなくても印刷所にだしたい」というエンジニア諸氏のために開発されました。

## 「商業印刷」にどこまで向き合うか

ご家庭のプリンタに印刷を指示すると、ファイルの情報がプリンタドライバに送信され、そこでインクの出し方を制御するためのデータに変換されます。印刷所での印刷も基本は同じで、データをRIPというものに送ると、印刷機が扱える形式にデータを変換します。

しかし商業印刷、とくに版を作って大量印刷するオフセット印刷では以下のような点が異なります。

- 1色ごとに印刷するので、いい感じに色が再現できるバランスで色の3原色を混ぜないといけない。
- 印刷したい人が見ている色にできるだけ忠実に再現したい
- 製作者のパソコンにインストールされているフォントがRIPにインストールされているとは限らない
- 紙はだいたい模造紙みたいなサイズに一気に複数ページ印刷して後で裁断する方式

そのため、画像はCMYK形式で350dpi、用紙は一回り大きいサイズでデータを用意して実際の紙のサイズにはトンボと呼ばれるマークで裁断位置を指定、裁断が1mmずれてもいいように3mm大目に背景色を塗っておく、ノンブルと呼ばれるページ数を必ず埋め込むように、フォントは埋め込みまたはアウトライン化などなどを施す必要があります。

https://www.morisawa.co.jp/blogs/MVP/6430

しかし同人印刷所はこの辺をよしなに対応してくれるので、同人印刷所ではカバーしきれないフォントの埋め込みと、上下左右の余白をちゃんととってノンブルを合成することだけFlightBooksで担っています。イラスト同人誌などと違い、技術同人誌は紙の端っこまで印刷することはほぼないですからね。

同人印刷所に「仕上がりサイズのPDF原稿です、テキスト主体なので塗足しなし、カラーはRGB、フォント埋め込み済みです」という呪文を唱えれば受け付けてもらえるはずです。

Re:VIEWやVivlioStyleは残りの項目にも対応していますが、中身はpress-readyを使っているようなので、ご自身でpress-readyを活用すれば同人印刷所以外でも印刷できるようになるかもしれません（未検証）

https://github.com/vibranthq/press-ready


## 「組版」にどこまで向き合うか

さて、印刷所に出せるデータが作れるとわかりましたが、つぎは「本」としての体裁をどこまで作りこむかです。本には表紙、裏表紙、中表紙などがあり、本文に入る前に「はじめに」や目次、奥付や「おわりに」がありますね。

ページの中でも章タイトルや見出しなどがあります。画像を挿入したら下部にキャプション「図6.1：Like数の推移」などを入れたいかもしれません。このテキストや画像などを紙の中にどうレイアウトするかが「組版」とよばれています。そしてそこにも専門用語が多数登場します。

![出典：日本印刷技術協会](https://www.jagat.or.jp/wp-content/uploads/2016/07/type-page_AICS4.ai_.jpg)

出典：https://www.jagat.or.jp/archives/25594

これらを何らかの技術でレイアウトとして実現しなくてはなりません。Re:VIEWは原則TeXで、FlightBooksとVivlioStyleはHTMLとCSSで実現していますが、特にこだわりのないエンジニアも多数いると思い、FlightBooksではシンプルなテンプレートとして提供しています。

妥協した部分としては、目次にページ数がありません。PDFを生成するまでどこが何ページになるかわからないためです。同様の理由で右のページと左のページで余白サイズを変えることもしていません（一般的に書籍は紙の真ん中で折って綴じるのでその分余白が大きいほうが読みやすい）また、〇章を参照といった自動リンクや脚注表記にも対応していません。

設計思想として、できることが少ない＝使い始める時に知っておかないといけないことが少ないを目指しています。

FlightBooksではMarkdownをPDFに変換するためにNodeJS/HTML/CSSを用いているため、これらの知識を活用すれば自分でカスタマイズすることも簡単です。

コード品質については本職のエンジニアではないので、期待しないでください。2年前のコードを引っ張り出してChatGPT先生とペアプロしながら公開することができました。

# 使い方

https://github.com/ku-suke/flightbooks をcloneして、ビルド環境を整えます。おすすめはDockerで、以下のコマンドを打ち込めばbuild/ディレクトリにPDFが生成されます。
```
docker compose build
docker compose run flightbooks node generate_html.js
docker compose run flightbooks node generate_pdf.js
```

最終的なPDF以外にも

- Markdownを単純にHTMLにしたもの
- HTMLをPDFに変換したもの（ページ番号・メタデータなし）

が中間生成物として出力されますので、お好みでいじってみてください。

# 要望や不具合に関しては？

Twitter(X)でつぶやくか、ここにコメントをするとひとまず目は通します。しかし対応できる技術力があるとは限らないので、PRを送っていただくのが一番たすかります。
pipenvでsslエラー


# `pipenv sync`で ssl エラー

`pipenv sync`で環境構築を行おうとしたところ，ssl エラーが発生した．その解決策を未来の自分に向けて残しておく．

# 環境

-   MacBook Pro (M1, 2020)
-   macOS Sonoma 14.0
-   Python 3.10.11
-   pip 23.3.1
-   pipenv, version 2023.10.24

# 問題点

`pipenv sync`で環境を構築しようとしたところ，以下のエラーが発生した．

```zsh
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/asgiref/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/asgiref/
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/asgiref/
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/asgiref/
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/asgiref/
Could not fetch URL https://pypi.org/simple/asgiref/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/asgiref/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping
ERROR: Could not find a version that satisfies the requirement asgiref==3.5.2 (from versions: none)
ERROR: No matching distribution found for asgiref==3.5.2
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping
```

# 解決策

`brew`が使えるなら，以下のコマンドを実行する．

```zsh:terminal
brew install openssl@1.1
```

今までは`brew install openssl`でインストールしていたが，これで install されていたのは`openssl3`だった．`openssl@1.1`が必要らしいので改めてインストールした．

これを行うとしっかりと`pipenv sync`が通るようになった．

# 参考

https://www.python.jp/news/wnpython310/require-openssl11.html

https://qiita.com/nunnunnununun/items/76b9a6b8b9eadbe495fe
Power BI 社内勉強会をやってみた

::: note
この記事は、[Power BI Advent Calendar 2023](https://qiita.com/advent-calendar/2023/powerbi) 12月17日担当分の記事です。
:::
# はじめに
Qiita初投稿です。[Power BI Weekly News](https://pp-weeklynews.connpass.com/)で2年前から勉強させていただいています。製造業の社内に向けて、学びをOutputしよう！と思い 2023年より社内勉強会をやってみました。

# 勉強会のテーマ
テーマはこんな感じです
|開催月|実施回|テーマ名|
|:---|:---:|:---|
2月|第1回|Power BI 概要
6月|第2回|SharePoint にある Excel の取り込み
9月|第3回|Power Query
12月|第4回|スタースキーマ

### 第1回 Power BI 概要
所属事業部向けに公開しているレポート(各工場のCO2排出削減量など)を事例に、Power BI Desktop編集→Power BI service発行→組織アプリ共有までの流れを説明しました。合わせて「Power BIに求められる知識」も紹介しました。[Power BI Advent Calendar 2022 のオオトリ](https://qiita.com/yugoes1021/items/9f96d09aea560ad643c2)、Power BI MVP清水優吾さんの記事を参考にさせていただきました。

### 第2回 SharePoint にある Excel の取り込み
webコネクタを知らないことでヘルパークエリだらけになっている惨状を社内で見た事があります。そこでSharePointに保存されたExcelファイル単体を直接取り込むwebコネクタを紹介しました。オンラインで勉強会をやっているとオーディエンスの反応が掴めずにやりにくいと思っていたところ、いつしかMVP石川陽一さんが活用していたPollsを真似することで格段にやりやすくなりました。また、この頃からXの3行ポストをやり始めました。

### 第3回 Power Query
Pollsで確認するとPower BI Desktopを触ったことない、という方が何名か参加されていましたので、馴染みのあるExcelでPower Queryのハンズオンをすることにしました。まず何よりPower Queryを知って欲しいと思ったのです。この回は Power BI 勉強会なのにExcelしか使いませんでした。また、BIレポート見て「このデータちょうだい」と言ってくる人が一定数いるので、そういう場合はエクスポート方法を案内しています。"with Excel"って良い考えですね。

### 第4回 スタースキーマ
モデリングは大事ですね。正規化し過ぎずに非正規化した方が良いディメンションテーブルの事例を考えて、社内データを用いて伝搬の違いを実演しました。[Power BI 勉強会 in 佐賀](https://qiita.com/PowerBIxyz/items/cc98414a1e71d837fd32)でMVP加賀田さんが“ビジネスエンティティ間をOne to Many / Singleで“という話をされていたことを参考にさせていただきました。

このような社内勉強会ができたのはユーザーコミニュティのおかげです。MVPの皆様、界隈の皆様に感謝です🙏

# おわりに
2023を振り返ってみると **できることが増えていた**💪

:::note info
* ZoomIt, PowerToys, Pollsの活用
* Viva Engageで社内発信する習慣
* 学びをXで3行ポストする習慣
* 今まさに初アドベントカレンダーを書いている
:::

結論、Outputして良かったです

# 参考
https://pp-weeklynews.connpass.com/

https://powerbi.connpass.com/

https://marshal115.hatenablog.com/
GitHubのSSH接続テスト(ssh -T git@github.com)が返答ないときの解決方法

# GitHubのSSH接続で応答がない
GitHubで公開鍵設定をした後、接続テストをかけました。
しかし、秘密鍵のpassphraseを入力してもGitHub側から応答がありません。

```terminal
$ ssh -T git@github.com
Enter passphrase for key '/home/xxx/.ssh/id_rsa':
^C
```

[公式のトラブルシューティング](https://docs.github.com/ja/authentication/troubleshooting-ssh)を参考にしても、応答しないパターンの解決法はありません。
そんな方向けの解決方法兼忘備録

# 解決方法

下記方法で通るかテストしてみてください。

```terminal
$ ssh -o IPQoS=none -T git@github.com
Enter passphrase for key '/home/xxx/.ssh/github_id_rsa':
Hi xxxx! You've successfully authenticated, but GitHub does not provide shell access.
```

この方法で通った場合、~/.ssh/configファイルに以下設定を入れてあげてください。
GitHub用設定を入れている方は、IPQoS欄だけ追記してあげてください。

```config
Host *
    IPQoS = none
```

# 通った方向け解説

この設定で解決した方のインターネットは、NTT回線でIPoE接続されている方だと思います。

NTT回線(NGN)において、QoS(IPパケットの優先度設定)のパケットは「帯域優先機能」を提供しているサービスでしか転送保証されていません。

> 2.4.4 帯域優先に関する仕様
> 
> 契約帯域の範囲で優先クラスを利用したIPv6(IPoE)通信が可能となるサービスにて、当該サービス契約者の端末
> 機器からIP通信網に送信されるIPv6パケットにおいて、RFC2474に規定される優先度の指定が可能です。当該サー
> ビス契約者の端末機器からIP通信網に送信されるIPv6パケット(IPoE方式）のトラヒッククラスフィールドの先頭6
> ビットに、DSCP値として8(001000)を指定することで、優先トラヒックとして転送します。
> 尚、指定された優先度以外が設定されたパケットの転送は保証しません。

参考: https://flets.com/pdf/ip-int-3.pdf

SSHのパケットはQoSがデフォルトでonになっており、NTT側でパケットがドロップされた結果、表示されない問題が発生していました。

この問題、Qiita内でもいくつか記事が存在します。

フレッツ光回線でscpが遅かった話: https://qiita.com/tango110/items/c8194d43b46fa2a712d1
フレッツ回線 + IPv6 環境で SSH できない: https://qiita.com/hoto17296/items/d8874a67b082dcc42516

解決方法は簡単、単にQoSを外してあげればいいだけです。

# 問題解決手順(興味のある人用)

ここからはどうやってこの問題を解決したのか、手順を残しておきます。

## ネットで調べる

当たり前ですが、`Permission denied (publickey).`等のエラー表示系記事は出てきますが、"何も出ない"系のエラーは見つかりませんでした。

## 繋がる端末と比較

同一ネットワーク内に、同じOS(Ubuntu22.04)を採用していて、`ssh -T git@github.com`のテストが通る端末がありました。
(SSHがQoSにより不安定になる事象は知っていたので、昔にQoSの設定を入れていたものでした)

そこで、`ssh -T -v git@github.com`(verbose mode)を行い、どこで引っかかるか確認を行いました。
sshの停止箇所までは確認できましたが、テストが通る端末とログを突き合わせても停止箇所までの挙動は同じでした。

少し時間をおいてsshの挙動を調べていたところ、sshのオプションに`-vvv`(詳細出力を増やす)モードがあることを見つけました。
-vvvモードで再度ログの突き合わせを行ったところ、繋がらない側の端末にだけ、下記一行がありました。

```terminal
debug3: set_sock_tos: set socket 3 IP_TOS 0x10
```

調べてみたらQoS関連だと判明し、sshとNTT回線の相性を思い出しました。
この問題、githubだけではなくssh周り全体の相性問題なので、頭の隅に入れておくといいかもしれません。
【Macチートシート】ターミナル基本コマンド/ショートカットキー

# キーボードショートカット

|     キー/コマンド  | 説明 |
|------------|-----|
| Ctrl + A | 現在入力している行の先頭に移動します。 |
| Ctrl + E | 現在入力している行の末尾に移動します。 |
| Ctrl + L | 画面をクリアします。 |
| Cmd + K | 開始位置までクリアします。 |
| Ctrl + U | 現在のカーソル位置から行頭までをカットします。 |
| Ctrl + K | 現在のカーソル位置から行末までをカットします。 |
| Ctrl + W | スペースを区切り文字として、現在のカーソル位置より前の単語をカットします。 |
| Ctrl + Y | 最後のカットコマンドでカットしたものを貼り付けます。 |
| Ctrl + H | バックスペースと同じです。 |
| Ctrl + C | 現在のターミナルで実行中のどんなものも停止します。 |
| Ctrl + D | 実行中のプロセスが存在しない場合に現在のシェルを終了するか、EOFを送信します。 |
| Ctrl + Z | 実行中のプロセスを中断し、バックグラウンドプロセスに挿入します。 |
| Ctrl + _ | 最後のコマンドを元に戻します。 |
| Ctrl + T | カーソル位置の前にある2つの文字を入れ替えます。 |
| Ctrl + F | カーソルを一文字右に移動します。 |
| Ctrl + B | カーソルを一文字左に移動します。 |
| Option + → | カーソルを一単語右に移動します。 |
| Option + ← | カーソルを一単語左に移動します。 |
| Esc + T | カーソル位置の前にある2つの単語を入れ替えます。 |
| Tab | ファイル名やフォルダ名を自動的に補完します。 |

# 重要なコマンド

| キー/コマンド | 説明 |
|---------------|------|
| cd [folder] | ディレクトリを変更します。 |
| cd | ホームディレクトリに移動します。 |
| cd ~ | ホームディレクトリに移動します。 |
| cd / | ドライブのルートに移動します。 |
| cd - | 前のディレクトリに戻ります。 |
| cd .. | 一つ上の階層のディレクトリに移動します。 |
| ls | 現在のディレクトリにあるファイルやディレクトリを表示します。 |
| ls -l | ファイルやディレクトリの詳細も同時に表示します。 |
| ls -a | 隠しファイルも含めすべてのファイルやディレクトリを表示します。 |
| ls -al | 隠しファイルも含めすべてのファイルやディレクトリの詳細を表示します。 |
| ls -lh | ファイルサイズの表記が含まれる詳細リストを表示します。 |
| ls -R | 再帰的にすべてのフォルダの内容を表示します。 |
| sudo [command] | 管理者のセキュリティ権限でコマンドを実行します。 |
| open [file] | ファイルを開きます。 |
| top | 現在動作中のプロセスを表示します。 |
| nano [file] | nanoエディターを使用してファイルを開きます。 |
| vim [file] | vimエディターを使用してファイルを開きます。 |
| clear | 画面をクリアします。 |
| reset | ターミナル画面をリセットします。 |

# 連鎖コマンド

| キー/コマンド | 説明 |
|---------------|------|
| [command-a]; [command-b] | Aコマンドの成功にかかわらず、Aコマンドの実行後にBコマンドを実行します。 |
| [command-a] && [command-b] | Aコマンドが正常に実行されると、Bコマンドが実行されます。 |
| [command-a] || [command-b] | Aコマンドが失敗した場合、Bコマンドを実行します。 |
| [command-a] & | Aコマンドをバックグラウンドで実行します。 |

# パイプコマンド

| キー/コマンド | 説明 |
|---------------|------|
| [command-a] \| [command-b] | Aコマンドを実行し、その結果をBコマンドに渡します。 |

# コマンド履歴

| キー/コマンド | 説明 |
|---------------|------|
| history n | 入力したものを表示します。nの部分に項目の数を指定する数字を入力します。 |
| Ctrl + r | 以前に入力したコマンドをインタラクティブに検索します。 |
| ![value] | 「value」で始まる最後に入力されたコマンドを実行します。 |
| ![value]:p | 「value」で始まる最後に入力されたコマンドをコンソールに出力します。 |
| !! | 最後に入力したコマンドを実行します。 |
| !!:p | 最後に入力したコマンドをコンソールに出力します
プログラムの3つのメモリ領域

## プログラムの3つのメモリ領域


|種類|  使い方| 格納される情報|確保される単位  |
|:-|:-|:-|:-|
| 静的領域|  アプリケーション開発時に確保する |グローバル変数、実行コード   | アプリケーションでまとめて1つ  |
|   ヒープ領域|開発時に一定領域を確保し、必要な都度アプリケーションに割り当てる|任意（アプリケーションによる） | システムまたはアプリケーションで1つ|
|スタック領域|LIFO 後入れ先だし方式|呼び出したサブルーチンの引数、ローカル変数、戻り先 | スレッドごとに1つ |


▼参考

https://bookplus.nikkei.com/atcl/catalog/21/S00180/