OmniAICreator/Qiita-1.07M huggingface dataset:
AWS EC2 AMIからAuto Scalingで使う起動テンプレートを作成する

## 概要

EC2のAMIから起動テンプレートを作成する方法を簡単にまとめる。

## 前提

下記の方法で現存するインスタンスからAMIを作成した。

https://qiita.com/miriwo/private/2d4911b2fa30a1dfd72a

## 基本的な設定項目

| 項目 | 成約や選択や内容 | 備考 |
| --- | --- | --- |
| 起動テンプレート名 | 最大文字数不明<br>特殊文字不可<br>日本語不可 |  |
| Template version description | 255文字以下<br>日本語不可 | 起動テンプレートの説明 |
| 起動テンプレートでインスタンスタイプを設定するかどうか |  | 設定する場合はインスタンスタイプを決めておく |
| キーペア |  | EC2にSSH接続する際のキーを設定する<br>特にこだわりがなければAMI生成元インスタンスのキーと合わせておく |
| サブネット |  | AMI生成元インスタンスが所属しているサブネットを事前に調べておく。 |
| セキュリティグループ |  | AMI生成元インスタンスが使用しているセキュリティグループを事前に調べておく。 |

## 方法

1. AWSのコンソールにブラウザからログインし、EC2のサイドバーの「起動テンプレート」をクリックする。
1. 「新しい起動テンプレート」の「起動テンプレートを作成」をクリックする。（初めて作成する場合）
1. 必要情報を入力する。
1. 「EC2 Auto Scaling で使用できるテンプレートをセットアップする際に役立つガイダンスを提供」にチェックをつける。
1. AMIの設定では、下記の記事で作成したAMIを選択する。（AMI名は「laravel10_ami」としている）
    - [AWS EC2 作成済みインスタンスの AMIを作ってみる](https://qiita.com/miriwo/private/2d4911b2fa30a1dfd72a)
1. 今回はインスタンスタイプを設定しておこうと思う。「t3a.micro」を選択する。
1. キーペアの設定ではAMI生成元インスタンスのキーペアを選択する。
1. サブネットの設定ではAMI生成元インスタンスのサブネットを選択する。（筆者は検証のためのEC2なのでデフォルトサブネットに作られていた。デフォルトサブネットの1dのものを指定した。）
1. ファイアウォールの設定では「既存のセキュリティグループを選択」を選び、API生成元インスタンスのセキュリティグループを選択する。（筆者は検証のためのEC2なのでインスタンス作成時に作られたセキュリティグループを指定した。）
1. 指定したら「起動テンプレートを作成」をクリックする。
1. サイドバーの「起動テンプレート」をクリックすると一覧の中にただいま作った起動テンプレートが表示される。
マークダウン記法

# よく使うマークダウン記法をまとめてみました☺️

### ・`#`…見出し
 `　#`半角スペースで見出しになる。
```
# 大見出し
## 中見出し
```
結果
# 大見出し
## 中見出し
最大`######`まであり、数が大きくなるほど小さな見出しになる。


### ・ `>` …引用文を表現
 `>`半角スペースで引用表現となる。
 ```
> 引用表現
 ```
 結果
 > 引用表現
 
### ・ `---`…区切り線。
　`---`で上下に線を入れて空行を入れることが出来る。
 ```
 ---
 ```
 結果
 
 ---
 
 となる。
 

### ・ `*`…斜体文字
　`*`で最初と終わりを囲むと斜体文字になる。
 ```
 *斜体文字*
 ```
 結果
 *斜体文字*

### ・ `**`…太字
　`**`で最初と終わりを囲むと太字になる。
 ```
**太字**
 ```
 結果
 **太字**
 
### ・ `- ` …箇条書きリスト
箇条書きにしたい要素の前に`-`を入力し、半角空白を入れる。
その下に半角空白2つと、`-`で入れ子にできる。
```
~箇条書きリスト~
- 項目1
  - 入れ子A
  - 入れ子B
- 項目2
- 項目3
```
結果

~箇条書きリスト~
- 項目1
  - 入れ子A
  - 入れ子B
- 項目2
- 項目3



### ・` 1.`・・・順序付きリスト
順序書きにしたい要素の前に`1.`を入力し、半角空白を入れる。
`2. 3.`と書いても良いが後で訂正が発生した時に番号を振り直すのが大変なので全て`1.`で記述する方が良い。
```
~順序付きリスト~
1. リスト1
1. リスト2
1. リスト3
```
結果
~順序付きリスト~
1. リスト1
1. リスト2
1. リスト3

### ・ `[]()`…リンクの表現
`[テキスト](URL)`でURLのリンク先を貼れる。
```
[MDN](https://developer.mozilla.org/ja/)
```
結果
[MDN](https://developer.mozilla.org/ja/)

### ・ ```…コードを表現
バッククオート３つで複数のコード表現ができる。
バッククオート1つで囲むと文中のコードを表現できる。
※バッククオートのに空白は入りません。
```
` ` `
<p>コード表現</p>
` ` `
```
結果
```
<p>コード表現</p>
```

### ・` ![]()`…画像を表現
`![画像の説明](URL)`で画像が添付できる。
```
![子猫の画像](https://user0514.cdnw.net/shared/img/thumb/shikun20220402_114719-2_TP_V.jpg)
```
結果
![子猫の画像](https://user0514.cdnw.net/shared/img/thumb/shikun20220402_114719-2_TP_V.jpg)

---
※マークダウン記法はエンジニアが使うさまざまなWebサービスで使われていますがたまに「こっちのサービスでは使える」けど「こっちのサービスでは使えない」こともあるので注意してください。
「北風と太陽」に学ぶメンバーとの関わり方

# はじめに

本記事ではチーム開発においての人のマネジメントをオライリーの著書「[Team Geek](https://www.oreilly.co.jp/books/9784873116303/)」の内容から「北風と太陽」を例えに、どうすれば「太陽」のように人を動かすことができるかをエンジニア歴5年目の若造がまとめてみたものになります。

一部主観的な部分もありますが異論は認めます。

# 人が動く原動力
友達や先輩に「このドラマおすすめだから見てみなよ」と言われたこと一度はあると思います。（ドラマでも映画でもなんでもいいですが）

その後、果たしてそのドラマを見た人はどのくらいいるのでしょうか？
少なくとも自分は普段の会話の中でおすすめされたもの、ことについて本気で興味がない限り自ら見ることはありませんでした。

人の原動力とはつまり受動的に感じたものから生まれることより、能動的に感じたことから生まれることの方が多いと自分は考えました。

仕事上でもお願いをしたにも関わらず、なかなか着手してくれなかったり、適当にあしらわれる経験は上記と同じ理論だと感じました。

## 能動的に感じさせるには

デール・カーネギーの『人を動かす』においても「北風と太陽」が例に挙げられています。

同著の中では、
>人を説得しようとした際には、北風のように強引に言い聞かせようとしたり怒鳴っても、相手を意固地にさせたり反>発を食らうだけである。太陽のように、穏やかに暖かな感情で話しかけることが肝心である。

と説かれています。

ここでいう太陽とは、「親切」「友愛」「感謝」の心であり、世の一切の怒声よりもたやすく人の心を変えることが出来ると、説明されています。

このことから、人を動かすためには敬意を持って接し、本人にとって受動的に動いているように促すことが大事だとわかります。



# どうすれば敬意を持って話せるか

オライリーの「[Team Geek](https://www.oreilly.co.jp/books/9784873116303/)」においては以下の三点が大切と説かれています。
- 謙虚 (Humility)
- 尊敬 (Respect)
- 信頼 (Trust)

これら三つを総称してHRTと呼び、コミュニケーションやソフトウェア開発においては非常に有用とされています。


### 謙虚

仕事上、なんでも知っているかのような振る舞いをする人はいます。
会議の中でもあらゆる提案や議論の細部にコメントしたり自分を宣伝するような振る舞いは生産性を阻害し、速度を落とします。
とはいえ「黙る」ということではなく仮に精通していたとしても他人の意見に耳を傾けることがチームにおいては必要であり、そういった姿勢は新しいアイデアやアプローチを受け入れる柔軟性も育めます。

謙虚になるためには自分のスキルに自信過剰にならず、他人が自分に新しい価値を与えてくれると信頼することが重要です。

コーディングにおいても同じで、不具合が起きた際、律儀にコミットログから誰のミスか詮索するような行動も「謙虚」という点においては意味をなしません。
（歴史を知るという点においては多少の意味はありますが）

同著で説明がある通り
***コードは人を表すものではなくその人の価値を示すものでもありません。***

たとえ不具合を起こそうと、指摘を受けようがあなた自身が攻撃されているわけでは全くない、という認識を持つことも重要です。

逆に指摘する際も、「間違っています」ではなく「この書き方でも実現できますか？」等あくまで問題があるわけではなく、自分の疑問として投げかけることで相手を攻撃している姿勢を見せず説明をしてもらうことができます。



### 尊敬

ソフトウェア開発において「批判」とは個人的なものではなく、優れたプロダクトを作るためのプロセスの一部でしかありません。
関わる人間全てが***成果に対する建設的な批判と性格に対する攻撃的な批判の違い***を理解する必要があります。
重要なのはそこに尊敬があることで、建設的な批判をする人は心から良いプロダクトを作りたいと思っており、決してその人の価値をどうにかしてやろうと考えていないということです。

チームメンバーは新たな価値を生み出してくれるもので自分のロボットではありません。
表面上、メンバーはPMにとって下に見えますが時にメンバーの意見が新しい価値を生むこともあり、優れたプロダクトを作る上では関わる人全てを尊敬することが重要です。

自身の経験としてはメンバーへの尊敬がないために意図せずその人への批判的な指摘をしてしまったことがあり、同著を読んだ際はかなり心に刺さりました。


### 信頼

信頼は、人間関係の基盤であり、効果的なコミュニケーション、強固なチームワーク、そして個人間および組織全体の生産性の向上に不可欠です。
信頼がある環境においては、メンバーはよりオープンになり、円滑にプロジェクトを遂行できます。
同著には以下のように説かれています。

>自分以外の人は有能であり、正しいことをすると信じよう。そうすれば仕事を任せることができる


過度な信頼は危険ですが、尊敬と謙虚さを持って適切にコミュニケーションを取ることで「危険な信頼」もなくせると考えます。




# まとめ：太陽になるためには

「[Team Geek](https://www.oreilly.co.jp/books/9784873116303/)」から学んだHRTの原則に則って、いろいろと書きましたが結局太陽になるにはどうすればいいのでしょうか。

太陽とは***権力や圧を利用せず、対等にコミュニケーションを取り、その人のパフォーマンスが最大限引き出せる環境を作れる人***だと感じました。

この記事を通じて少しでも太陽になろうとする人が増えると幸いです。


太陽に憧れるがあまり熱量が高すぎる人材になっては元も子もありませんが笑



# 参考文献
説明、内容は一部主観を除いてオライリー「[Team Geek](https://www.oreilly.co.jp/books/9784873116303/)」の引用になります。
興味がある方はぜひ読んでみてください。
あ

理解しました。以下は、指定された処理をPythonで実行するコードです。空白を無視して指定された文字列を抜き出し、CSVに書き出します。

```python
import csv

# ASCファイルのパス
asc_file_path = "path/to/your/file.asc"

# CSVファイルのパス
csv_file_path = "path/to/your/output/file.csv"

# データ抽出とCSV書き出しの関数
def process_asc_and_export_to_csv(asc_path, csv_path):
    with open(asc_path, 'r') as asc_file, open(csv_path, 'w', newline='') as csv_file:
        csv_writer = csv.writer(csv_file)
        csv_writer.writerow(["ExtractedData"])  # CSVヘッダー

        for line in asc_file:
            if line.strip().startswith(("0 0 8  8 10 12 67 01", "0 0 8  8 21", "0 0 8  8 22")):
                # 各行から指定された位置の文字列を抜き出す（空白を無視）
                data_1 = line.split("10 12 67 01", 1)[1][:4].strip() if "10 12 67 01" in line else ""
                data_2 = line.split("21", 1)[1][:7].strip() if "21" in line else ""
                data_3 = line.split("22", 1)[1][:5].strip() if "22" in line else ""

                # 1〜3の内容を連結してCSVに書き込む
                concatenated_data = f"{data_1}{data_2}{data_3}"
                csv_writer.writerow([concatenated_data])

# 処理を実行
process_asc_and_export_to_csv(asc_file_path, csv_file_path)
```

このコードは、指定された文字列が各行の先頭にあるかどうかを確認し、それに基づいて各行から指定された位置の文字列を抜き出しています。CSVには1行ずつ書き込んでいます。
vyosに公開鍵でsshする方法

# はじめに
vyosに公開鍵でsshを試みて、30分程はまったので忘備録として残しておきます。

|OS | バージョン|
|:---- | :------|
|vyos | 1.4-rolling-202307141223|

# 結論
```~/.ssh/authorized_keys```に直接書き込んでもログインできない。
configureから公開鍵を登録する必要がある。

# 補足
sshを有効にしたうえで、configureから直接公開鍵を登録してください。
識別用の名前はなんでも入ると思います。バックスラッシュ```\```も入りました。
後で分かりやすいように名前とホストが分かるといいのではないでしょうか。

文法
```
set service ssh
set system login user '(ログインユーザー)' authentication public-keys '(識別用の名前)' key '(公開鍵)'
set system login user '(ログインユーザー)' authentication public-keys '(識別用の名前)' type '(鍵の種別)'
```

流し込んだもの
```
set service ssh
set system login user 'vyos' authentication public-keys 'pose@winpc' key 'AAAA***...'
set system login user 'vyos' authentication public-keys 'pose@winpc' type 'ssh-ed25519'
```

最終的なコンフィグ
```
public-keys pose@winpc {
    key "AAAA***..."
    type "ssh-ed25519"
```

# 参考
VyOSにSSHの鍵認証でログイン - Jaybanuan's Blog
https://redj.hatenablog.com/entry/2019/02/11/034844
パイソンでアスキーからcsv

以下は、指定された処理をPythonで実行するコードです。空白を無視して特定の文字列を抜き出し、CSVに書き出します。

```python
import csv

# ASCファイルのパス
asc_file_path = "path/to/your/file.asc"

# CSVファイルのパス
csv_file_path = "path/to/your/output/file.csv"

# データ抽出とCSV書き出しの関数
def process_asc_and_export_to_csv(asc_path, csv_path):
    with open(asc_path, 'r') as asc_file, open(csv_path, 'w', newline='') as csv_file:
        csv_writer = csv.writer(csv_file)
        csv_writer.writerow(["ExtractedData"])  # CSVヘッダー

        for line in asc_file:
            if line.startswith(("1.0", "2.0", "3.0")):
                # 各行から指定された位置の文字列を抜き出す（空白を無視）
                data_1 = line.split("10 12 67 01", 1)[1][:4].strip()  # 1.0 0 8  8 10 12 67 01の後の4文字
                data_2 = line.split("21", 1)[1][:7].strip()  # 2.0 0 8  8 21の後の7文字
                data_3 = line.split("22", 1)[1][:5].strip()  # 3.0 0 8  8 22の後の5文字

                # 1〜3の内容を連結してCSVに書き込む
                concatenated_data = f"{data_1}{data_2}{data_3}"
                csv_writer.writerow([concatenated_data])

# 処理を実行
process_asc_and_export_to_csv(asc_file_path, csv_file_path)
```

このコードでは、`split`関数を使用して指定された文字列を基準に行を分割し、空白を取り除くことで指定された位置の文字列を抜き出しています。これをCSVに1行ずつ書き込む形にしています。
ブラウザ上でリポジトリの内容を確認するコマンド git instaweb を使ってみる

# はじめに

こんにちは、ken です。
先日`git reflog`の使い方を確認しようと思い [git の公式ドキュメント](https://git-scm.com/docs)を読んでいたところ、あまり使ったことがない git コマンドが目につきました。
気になって使ってみたところ思いの外便利そうだったので今回はその git コマンド `git instaweb` について紹介しようと思います。
本記事はHRBrain Advent Calendar 2023の1日目の記事です。

https://qiita.com/advent-calendar/2023/hrbrain
# git instaweb って？

`git instaweb`はローカルの Git リポジトリの状態をブラウザ上で確認することができるコマンドです。ターミナル上で`git instaweb`と入力するとブラウザが立ち上がり、画像のようなページが表示されます。
ここではコミット履歴の確認やコミットごとの diff の確認などが簡単に行うことができます。
（以下に載せる画像の中には本名やメールアドレスが映っている部分があるので一部マスクしています）

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649218/08659001-7d30-0f4d-9210-31301e322793.gif)


# 使用方法

状態を確認したい git プロジェクト上で次のコマンドを入力します。

```
$ git instaweb
```

<details><summary>lighttpd not found.というエラーが出た場合</summary>

このコマンド実行時に次のようなエラーが出ることがあります

```
lighttpd not found. Install lighttpd or use --httpd to specify another httpd daemon.
```

lighttpdというのは web サーバーの1つです。`git instaweb`コマンドではローカル Git リポジトリのコンテンツをウェブブラウザを通じて閲覧可能にするために web サーバを用意する必要があります。
なのでこのエラーが表示された場合は案内に従ってlighttpdをインストールしましょう。Mac の場合は次のコマンドでインストールが可能です。

```
brew install lighttpd
```

インストール後は再度`git instaweb`コマンドを実行してみてください。

また、Macの場合は元からRubyが入っており、その標準ライブラリであるWEBrickを使えばlighttpdをインストールせずとも`git instaweb`を動かすことができます。手っ取り早く動かしたい方はこちらを使うと良いかもしれません。
```
git instaweb --httpd=webrick
```

</details>
無事にコマンドが成功すれば先程お見せしたようなような画面になると思います。

# `git instaweb`から確認できること

ここから先は`git instaweb`のコマンドで立ち上がるページから確認できることについて書いていきます。

## shortlog

`git shortlog`コマンドと同様に、コミット履歴を一覧で見ることができます。
そしてもし一覧の中で気になったコミットがあればそのコミットの diff を確認できます。
![shortlog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649218/125e1490-ff3c-72f5-7096-621cf33fbad0.png)

## log

先程の`shortlog`とほとんど同様ですがより詳細なログを見ることができます
![log.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649218/db0d53dd-58f2-2bf1-3999-5468fe793e94.png)

## commit

`shortlog`もしくは`log`のページで気になるコミットがあればそのコミットの詳細を閲覧できます。
ここでは GitHub のようにそのコミットで行ったファイルの変更（diff）などを確認できます。
そして diff は inline 形式と side by side 形式で表示を切り替えることができます。
![commit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649218/61180204-bcaf-334f-cbbd-e6c197cd4eea.png)

## 検索機能

ここではリポジトリの情報を検索できます。

![search.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1649218/142dae4e-a869-1602-3c2f-64eb2fc7ff9d.png)


この検索機能には commit,grep,author,committer,pickaxe の 5 種類があり、なかでも`pickaxe`を使うと**検索文字列が現れたり消えたりしたすべてのコミット（文字列を追加、削除、修正した変更）をリストアップできます。**
たとえば「TODO」という文字列をpickaxeで検索するとTODOコメントをつけたり削除したりしたコミットの一覧が見られるということですね。これは知っておくといつか使い道がありそうです。
また検索バーの横にある「re」にチェックを入れれば正規表現を使った検索も可能です。

## 停止コマンド
このコマンドを使ったあとは、システムリソースを解放するためにきちんと以下の停止コマンドを実行しましょう。
```
git instaweb --stop
```

# さいごに

今回は `git instaweb` コマンドをご紹介しました。
terminal 上では見にくい diff や log がブラウザ上だとスッキリと表示されるので非常に見やすいですね。
忘れがちなgitコマンドもこのinstawebさえ覚えておけばコミットの詳細やログを簡単に追うことができます。まだまだgitには知らないコマンドがあるということを実感しました。

そして株式会社HRBrainでは新しいメンバーを募集しています。

https://www.hrbrain.co.jp/recruit

弊社に興味を持った方がいればぜひご応募ください！
AWS EC2 作成済みインスタンスの AMIを作ってみる

## 概要

すでに手動にて構築したEC2インスタンスのAMIを作成する方法を簡単にまとめる

## 基本的な設定項目

| 項目 | 制約や選択や内容 | 備考 |
| --- | --- | --- |
| イメージ名 | 127文字以下<br>日本語不可 | 後から変更できない |
| イメージの説明 | 255文字以下<br>日本語不可 | 任意 |

## 方法

1. AWSのコンソールにブラウザからログインし、EC2のサイドバーの「インスタンス」をクリックする。
1. AMIを作成したいインスタンスを選択する。
1. 右上の「アクション」をクリックする。
1. 「イメージとテンプレート」から「イメージを作成」をクリックする。

    ![インスタンス___EC2___ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a9cd2c1c-c182-dade-fd9c-a4af76fcda10.png)

1. 遷移先の画面で必要情報を入力し「イメージを作成」をクリックする。
1. 作成開始すると画面の上部に帯で作成中の旨が表示される。

    ![インスタンス___EC2___ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/cab71a2f-cdad-1a31-03d9-7aad5f1124a1.png)

1. サイドバーの「AMI」をクリックする。
1. 一覧の中に作成中のAMIが表示される。ステータスが「保留中」から「利用可能」に変われば使えるようになる。

    ![イメージ___EC2___ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/0a2bc3ec-5f5e-1cc5-5411-a50fe0780677.png)
[Laravel] ヘルスチェックのセッションを保存しないようにする

# この記事について

Laravelアプリケーションではセッション情報をデータベースに保存することが可能です。アプリケーションにリクエストが発生するたびに、セッションをデータベースに保存します。

もしLaravelアプリケーションの正常性を監視するためにヘルスチェックを実装している場合、セッションをデータベースに保存したくありません。

ヘルスチェックのような特定のリクエストのセッションをデータベースに保存しないようにする手法についてこのメモにまとめます。

# 構成

Laravel(バージョン10)アプリケーションはECSにて稼働しています。
ECSのタスク内にはLaravel(PHP-FPM)コンテナとNGINXコンテナが稼働しています。

ALBを経由して、ユーザのリクエストをアプリケーションに送信します。

バックエンドDBとしてはRDS(MySQL)を利用しています。
アプリケーションのデータと、セッションをこのRDSに保存するようにしています。

```
[ユーザー] => [ALB] => [NGINX(ECS)] => [Laravel(ECS)] => [MySQL(RDS)]
```

# 結論

`ルーティングにて、セッションをDBに保存しないように設定する`ことで実現可能です。


今回であればヘルスチェックのルーティングに以下のエントリーを追加すれば良いです。

```
config()->set('session.driver', 'array');
```

Laravelにはセッションドライバーという設定があります。セッションドライバーとはセッションを保存する場所です。config/session.phpファイルにセッションドライバーを定義すると、アプリケーション全体でそのセッションドライバーが利用されるようになります。(実際にはSESSION_DRIVERなどを.envにて指定します。このSESSION_DRIVERなどの変数がconfig/session.phpにて利用されています。)

特定の箇所にてセッションドライバーを指定したい場合は`config()->set('session.driver', 'xxxx')`と定義します。

セッションドライバーをarrayにすると、セッション情報はPHP配列として保存されて、永続化されなくなります。

```plaintext:routes/web.php
// アプリケーションのルーティング
Route::group(['prefix' => 'app'], function () {
    Route::get('index', [AppController::class, 'index'])->name('index');
    Route::get('create', [AppController::class, 'create'])->name('create');
    Route::post('create', [AppController::class, 'store'])->name('store');

});


// ヘルスチェックのルーティング
Route::group(['prefix' => 'healthcheck'], function () {
    config()->set('session.driver', 'array');

    Route::get('/', function () {
        return response()->json([]);
    });
});
```

このようにヘルスチェックのルーティングのグループ内に設定を差し込むことで、ヘルスチェックのセッションはデータベースに保存されなくなります。

# 参考

https://laravel.com/docs/10.x/session
microCMS × PHP レンタルサーバーで構築

## お客さんのレンタルサーバー
クライアントが用意したレンタルサーバーへftp接続している状況でmicroCMSを使用したい、というパターンではJamstack構成を組めない。

PHPが使用できるなら、それが最も手っ取り早くmicroCMSを組むこめる方法かもしれない。

## microCMSが提供しているSDKを利用するべきか
microCMSでは、PHPを使用するためのSDKが用意されている。
しかし、このSDKを利用するためには、composerというPHPのバージョン管理アプリが必要となる。

このcomposerを、**人さまのサーバーに勝手にインストールしてよいはずがない。**

## SDKを利用せず、PHPのみの実装
SDKは使わないでPHPだけで書く方法はあって、それは簡単に実装できた。
一覧ページと個別ページだけなら、2ファイルだけで済む。
実際にはAPIキーの隠蔽は別途行うのでアクセス権限を設定したディレクトリに変数を格納しておく必要があるが、わかりやすく2ファイルだけにすると以下のようになる。

### 一覧ページ

```archive.php
<?php
// API呼び出し
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://XXXXXXXXXXXXXXXXXXX.microcms.io/api/v1/news');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');

$headers[] = 'X-MICROCMS-API-KEY: XXXXXXXXXXXXXXXXX';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);

// 取得したら表示
$result = json_decode($response, true);
foreach ($result['contents'] as $contents) {
$url = 'http://XXXXXXXXXXXXX?id=' . $contents['id'];
ShowHtml(
$contents['title'],
$contents['createdAt'],
$url,
$contents['linkbool']
);
}

function ShowHtml($title, $createAt, $url, $linkbool)
{
echo '<meta name="viewport" content="width=device-width, initial-scale=1.0">';
echo '<h2>タイトル:' . $title . '</h2>';
echo '<p>作成日:' . $createAt . '</p>';
echo '<p>URL: <a href="' . $url . '">' . $url . '</a></p>';
echo '<p>詳細画面へ遷移boolian：' . $linkbool . '</p><hr>';
};
?>
```


### 記事ページ

```single.php
<?php
$id = $_GET['id'];

// クエリパラメータを取得
if (isset($id) == true) {
GetContent($id);
} else {
echo 'Set query parameters';
}

function GetContent($id)
{
// API呼び出し
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://XXXXXXXXXXXX.microcms.io/api/v1/news/' . $id);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');

$headers[] = 'X-MICROCMS-API-KEY: XXXXXXXXXXXXXXXXXX';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);

// 取得したら表示
$result = json_decode($response, true);
ShowHtml(
$result['title'],
$result['createdAt'],
$result['updatedAt'],
$result['body']
);
}

// コンテンツ表示部
function ShowHtml($title, $createAt, $updatedAt, $body)
{
echo '<meta name="viewport" content="width=device-width, initial-scale=1.0">';
echo '<h2>タイトル:' . $title . '</h2>';
echo '<p>作成日:' . $createAt . '</p>';
echo '<p>更新日:' . $updatedAt . '</p>
';
echo '<article style="background-color: aliceblue;">本文:
' . $body . '</article>';
}
?>
```
ミニバッチ学習

## バッチ学習
学習用データを一度にすべて入力し、重みを更新する学習方法

## ミニバッチ学習
学習用データを小さなバッチに分けて、その小さなバッチ毎に重みを更新していく学習方法。



特徴
・バッチサイズが大きくなると勾配推定が正確になる


バッチ学習はデータが大きくなると計算に時間がかかるため、あまり使われない。




##### 非復元抽出を理解するために復元抽出をやってみた。
```python
np.random.seed(1234) #seedは乱数を固定
train_size = train_labels.shape[0]
batch_size = 32
max_iter = 10  #ループの回数
network = None #ダミー

for i in range(max_iter):
    batch_mask = np.random.choice(train_size, batch_size) #random.choiceで復元抽出
    print("i=%s, "%i, "batch_mask=%s"%batch_mask[:10])
    x_batch = train[batch_mask]
    y_batch = train_labels[batch_mask]

    trainer(network, x_batch, y_batch)
```



非復元抽出
```python
np.random.seed(1234)
train_size = train_labels.shape[0]
batch_size = 32
epochs = 10
network = None #ダミー
minibatch_num = np.ceil(train_size/batch_size).astype(int) # ミニバッチの個数
    
for epoch in range(epochs):
    
    # indexを定義し、シャッフルする
    index = np.arange(train_size)
    np.random.shuffle(index)
    
    for mn in range(minibatch_num):
        """
        非復元抽出によるループ
        """
        batch_mask = index[batch_size*mn:batch_size*(mn+1)]        
        print("epoch=%s, "%epoch, "batch_mask=%s"%batch_mask[:10])
        x_batch = train[batch_mask]
        y_batch = train_labels[batch_mask]

        trainer(network, x_batch, y_batch)
```
rex0220 計算式プラグインの使い方をGPTsに学習させてみる（その２１）まとめ

計算式プラグインの使い方を試行錯誤しながら GPTs に学習させてきましたが、現状をまとめてみます。

[rex0220 計算式プラグインの使い方をGPTsに学習させてみる（その２０）名前はフォルトン](https://qiita.com/rex0220/items/c9bf8e65810258b35bcf)の続きです。

# 概要
GPTs の学習から公開までしたので、現状をまとめてみます。
ChatGPT Plus の新規会員登録が停止しているとのことなので、使ってもらうには時間がかかりそうです。

# GPTs の開発環境
開発用で、変更した資料を試して、問題が無いようなら公開用にアップロードしています。
ただプログラムのマイグレーションと違って、同じ資料を学習させたから応答も同じになるとは限りません。

- 開発用：DEV rex0220 計算式プラグインの使い方
- 公開用：[rex0220 計算式プラグインの使い方](https://chat.openai.com/g/g-wvbi2Ah1R-rex0220-ji-suan-shi-puraguinnoshi-ifang)

# configure

## アイコン

GPTs が自動生成してくれるアイコンは、なんだか気味が悪い。
マスコットキャラを作った中から、顔の部分を切り抜いてアイコンにした。

## Name
名前は、当初のまま
- rex0220 計算式プラグインの使い方

## Description
いい文章が思い浮かばず、アドバイザーのフォルトンに聞いてもらう感じで。

- フォルトンに聞いてみよう

## Instructions
計算式プラグインの概要を記述。
アドバイザーとしてフォルトンの名前を記述しただけで、それらしく振舞ってくれる。

```.txt
あなたは、計算式プラグインのアドバイザーで、名前はフォルトンです。
2023年11月13日に誕生しました。

計算式プラグインについて、使い方

計算式プラグインは、クラウドサービスの kintone で、動作するプラグインの一つです。
計算式に kintone アプリのレコード上の項目を指定して、計算結果を他の項目に設定することができます。

計算式の書き方
フィールドコードの設定
計算式では、 フィールドコードを使いますので、初期設定のままでは大変分かりにくくなってしまいます。
計算式を書く前に、フィールドコードをラベルにあわせてアプリ設定で変更しましょう。

既定のフィールドコード：　数値 * 数値_0
ラベルに合わせた変更後：　単価 * 数量

計算式に「改行」を指定して、式を見やすく出来ます。
「改行」は、実行時には無視されます。

計算式の要素

定数
文字： "" で、囲みます。
"株式会社", "個"

数字： 数字をカンマ無しでそのまま記述
0, 1234, 123.456

演算子
文字連結： &
算術： +,-,*,/,%,**,^
比較： =,==,===,!==,>,<,>=,<=,!=,<>
論理： &&,||

関数
関数は、下記のように「(」を空白を入れずに、記述します。
空白があると、fieldcode として扱われます。

　関数名(パラメータ)

OK: CEIL(数値, 1)
NG: CEIL (数値, 1)

コメントの書き方
計算式に「//」を記述すると、行末までコメントになります。
(コメント機能は、Ver.34 以降でサポート)

例1：１行すべてコメント
// １行コメント

DATE_FORMAT(日付)
例2：行の途中から行末までコメント
DATE_FORMAT(日付) // コメント
例3：コメントが混在
// １行コメント

DATE_FORMAT(日付) //コメント

& 時刻 // コメント
"//"文字列の記述方法
計算式内で「//」を記述すると、行末までコメントになりますので、"//" 文字列を直接記述できません。
文字列連結で、「/」を分けて記述してください。

記述例
"/"&"/"
"AB/"&"/CD"
```

## Conversation starters
とりあえず、「計算式プラグインの使い方」入門的なものを並べた

- フォルトンの自己紹介
- 計算式の書き方
- 計算式の簡単な質問をするには？
- 計算式の要件を箇条書きで質問するには？

## Knowledge
URL での参照は、学習効果がなさそうなので削除
画像ファイルも、画像指定で要求すれば応答で画像を見せてくれるが、用途としては？なので削除

![2023-11-25_22h54_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/5ad0f0af-e839-360a-2fa7-83a8699ac46a.png)

## Capabilities
とりあえず、すべて外した。
![2023-11-25_22h55_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ec415606-fbc4-4084-75c0-e0df6236a6f2.png)

## Actions
まだ試していない。

![2023-11-25_22h56_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f5b38a3a-f1f9-345b-e599-fe4d4effe6de.png)

## Additional Settings
問合せた内容を学習させると、変な学習が反映されそうなので、無しにした。

![2023-11-25_22h57_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/62e4c400-f6d5-7d9e-eae7-dc81b95c1003.png)

# 今後の GPTs の更新について

学習させたはずの内容が、素直に応答に反映されないところがある。
ただよくよく考えてみると、教えたことよりもいい答えの時もある。
まだまだ学習が足らないところがあるので、気が付いたところは随時アップデートしていきたい。
CSSライブラリやフレームワークを導入する時に考えたいこと

CSSのライブラリやフレームワークを導入する際に考えたいことをまとめました。
これから技術選定をする人にとってヒントになればと思います！

:::note info
【この記事を読んでほしい人】
・現在CSSのライブラリやフレームワークの導入を検討している人
:::

## CSSライブラリとフレームワークの導入時に考えたいこと
ライブラリやフレームワークの導入は労力と時間がかかります。
選定する際の観点として参考にしてください。

- 継続的に開発できる人材をプロジェクトに配置できるか？
- ライブラリやフレームワークの導入で何を解決したいことは？
- 他のライブラリやフレームワークへの乗り換えが容易か？

人員の状況によってはライブラリやフレームワークの導入を見送ることも決断の一つかもしれません。
チームの状況に応じて左右されるところだと思います。

## CSSライブラリやフレームワークの導入で何を解決したいのか？
まずは要件の定義から行います。

:::note warn
技術選定に慣れてない人の失敗としては先にライブラリやフレームワークの特徴を調べ始めてしまい、少し回り道になる恐れがあります…（無駄にはなりません）
:::

ライブラリやフレームワークの導入意図は下記のような点を解決したいことが多いと思います。

- 現在運用しているサイトのCSSの詳細度がバラバラでスタイルを実装するのに時間がかかっている
- 開発者の技術レベルにバラつきがあることで記述方法の一貫性が保ちにくい

## 現在ならどんな選択ができるか？
現時点でたくさんのライブラリやフレームワークがありますが、ざっくり選び方のポイントをこちらもリストにしてみました！

- 学習コストはどれくらいかかるか
- 利用するJSフレームワークは何か
- ライブラリやフレームワークのメンテナンス状況や将来性
- パフォーマンスは良いか
- 状態に応じたスタイリングはしやすいか
- デザイナーはどれだけプロジェクトに関われるか
- 静的解析ツールなどのデバッグ機能を利用できるか
- デザインの自由度はどこまで許容するか
- サイト規模に対して見合うライブラリ・フレームワークであるか

上記のような項目に当てはめてみると利用するCSSライブラリやフレームワークは絞られていくと思います！
具体的な例をいくつか紹介します！

例えば、「学習コスト」に言及すると…

:::note info
チームはJavaScriptの知見が浅い状況ではあるが、これまでのコーディング経験が豊富ということであれば、「[CSS Modules](https://github.com/css-modules/css-modules)」や「[Emotion](https://emotion.sh/docs/introduction)」のような比較的書き心地がCSSに近いものを選ぶのが良い
:::
のような考え方です。

デザインの自由度に言及すると…

:::note info
CSSに近い書き心地のものは、どんなデザインでも表現可能で柔軟に対応できます。
しかし、フレームワークである「[TailwindCSS](https://tailwindcss.com/)や「[Chakra UI](https://chakra-ui.com/)」などはデザインに一定制限を受けます
:::

サイト規模に対して見合うかどうかに言及すると…

:::note info 
小規模のスタートアップで開発者が少数のサイトであれば、「CSS Modules」のように自由度の高いものを選んでもCSS詳細度や記述方法は統一されることになるので問題はないと思います。

しかし、大規模でたくさんの開発者を抱えるサイトであれば自由度の高すぎる技術を選定してしまうと、技術的な知識な偏りによって変更容易性はすぐに保たれなくなると思います。
なので制限を一定設けやすいフレームワークを選ぶのが良い
:::

のようにそれぞれの特徴と実現させたいことに照らし合わせて絞り込んでいきます。

## 【CSSライブラリやフレームワークを導入する時に考えたいこと】まとめ
挙げた例は一例です。
技術選定はチームの状況や会社の状況、市場の変化に左右されるのが常です。

:::note alert
なので1年前の選択は良くなかったと評価されることもあります…
結果として仕方ない部分もあると思います…
:::

ただ、その時に何を考えて何を検討したのかを記録として残す[ADR](https://www.google.com/search?q=%E6%8A%80%E8%A1%93%E9%81%B8%E5%AE%9A+ADR&oq=%E6%8A%80%E8%A1%93%E9%81%B8%E5%AE%9A%E3%80%80ADR&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIHCAEQABiABDIHCAIQABiABDIHCAMQABiABDIHCAQQABiABDIHCAUQABiABDIHCAYQABiABDIHCAcQABiABNIBCDMxNjlqMGo3qAIAsAIA&sourceid=chrome&ie=UTF-8#ip=1)というものがあります。
プロジェクトのリポジトリに残して後の開発者にとって知見になるようにしておけることが良いのではと考えています。
LaravelでAuth::attempt()には'password'を渡すこと

## 前書き
以下の環境で実行した内容となります。

- PHP 8.2
- Laravel 10.31.0

## 背景
Laravel10を使って開発中、認証機能を使いたいものの既存テーブルにあるユーザー情報を活用したいと思いました。
そのまま利用してもLaravelのusersテーブルを探しに行ってしまうので、既存テーブルに指定すればよいと楽観視していました。
ここでは例として以下のような構造とします。

テーブル名：login
| userID | pass |
|:-:|:-:|
|user1|\\$2y\\$..|

## 変更点

- Models\User のクラスにテーブルを指定
- テーブル構造が異なるのでその他設定を追加

```
class User extends Authenticatable
{
    ...
    
    //既存のログインテーブルを使う
    protected $table = 'login';
    protected $primaryKey = 'userID';
    //remember_tokenはないためfalse
    protected $rememberTokenName = false;
    //主キーは文字列のためauto_incはfalse
    public $incrementing = false;

    // パスワードのカラムを取得するように
    public function getAuthPassword(){
        return $this->pass;
    }

    ...
}
```

## 問題
ここまで行ってログインできるユーザー情報を渡してもAuth::attempt()はfalseを返す...
構造が変わったので対応する形の配列で渡していました。

```
Auth::attempt(['userID' => 'hoge', 'pass' => 'fuga']);
```

Userクラスで該当のユーザーは取得できているのでテーブルは見れています。
既存テーブルを利用する元のシステムではログインできるので、当然パスワードなどは有効です。

## 結論
attempt()に渡す配列は **'password'** で渡すこと。
今回でいえば以下の形の配列が必要ということになります。

```
Auth::attempt(['userID' => 'hoge', 'password' => 'fuga']);
```

悩んでいる箇所のズバリそのもの、こちらの記事が見つかりました。
'password'固定で渡してやる必要がありました。

https://qiita.com/idylwork/items/fee405d9a711609337e2

## まとめ
Laravelの認証機能を拡張して既存テーブルから認証することができました。
'password'固定となっているのは盲点でしたが、せっかくのフレームワークならテーブルもマイグレーションで管理しているテーブルを使える方が楽ですね。

### 試行錯誤内容
どこでつまずいているか切り分けるために行った内容を備忘録として残しておきます。

1. そのままAuth::attempt()を実行する※それぞれのテーブルからはデータが取れている
    1.1. usersテーブルで['email' => 'hoge', 'password' => 'huga']を渡す => ture
    1.2. loginテーブルで['userID' => 'hoge', 'pass' => 'huga']を渡す => false

2. usersの構造で実施
    2.1. テーブル名のみ変更し['email' => 'hoge', 'password' => 'huga']を渡す => true
    2.2. emailをuserIDに変更し['userID' => 'hoge', 'password' => 'huga']を渡す => true
    2.3. passwordをpassに変更(getAuthPasswordなど追加)し['userID' => 'hoge', 'pass' => 'huga']を渡す => false
    
3. loginのpassをpasswordに変更(protected $rememberTokenName = false;を追加)し['userID' => 'hoge', 'password' => 'huga']を渡す => true
4. loginテーブルに合わせ、['userID' => 'hoge', 'password' => 'huga']を渡す => true

### 参考文献
- https://qiita.com/idylwork/items/fee405d9a711609337e2
- https://qiita.com/SkipEveryLunch/items/34ac59e987ecaa154ed3
- https://qiita.com/n_oshiumi/items/a466ff2c8f20c3494538
- https://zakkuri.life/laravel-auth-by-other-table/
- https://github.com/laravel/framework/blob/10.x/src/Illuminate/Auth/EloquentUserProvider.php#L151
ascii読み出し加工してcsvに吐き出し

VBA（Visual Basic for Applications）を使用してASCファイルから特定の文字列を抜き出し、CSVに書き出す例を以下に示します。この例では、ASCファイルから各行の特定の文字列を抜き出して、それをCSVに書き出す簡単なプロシージャです。

```vba
Sub ExtractDataFromASCAndExportToCSV()
    Dim ascFilePath As String
    Dim csvFilePath As String
    Dim inputData As String
    Dim outputData As String
    Dim fileNumber As Integer
    
    ' ASCファイルとCSVファイルのパスを指定
    ascFilePath = "C:\Path\To\Your\File.asc"
    csvFilePath = "C:\Path\To\Your\Output\File.csv"
    
    ' ASCファイルを開く
    fileNumber = FreeFile
    Open ascFilePath For Input As fileNumber
    
    ' CSVファイルを作成または既存のファイルを上書き
    Open csvFilePath For Output As fileNumber
    
    ' ASCファイルから行ごとにデータを読み込み、特定の文字列を抜き出してCSVに書き込む
    Do Until EOF(fileNumber)
        Line Input #fileNumber, inputData
        ' 適切な処理を追加して特定の文字列を抜き出す
        ' 例: outputData = Mid(inputData, 1, 10) ' 最初の10文字を抜き出す
        ' CSVにデータを書き込む
        Print #fileNumber, outputData
    Loop
    
    ' ファイルを閉じる
    Close fileNumber
End Sub
```

このVBAマクロは、指定したASCファイルからデータを読み込み、特定の文字列を抜き出してCSVファイルに書き込む基本的な例です。適切な文字列の抽出ロジックを `outputData` の値を設定する部分に追加してください。
tmux 非アクティブのウインドウペインの背景色を変更


[tmux]でウインドウ（窓）を複数のペイン（窓ガラス）に分割している時に、初期設定のままだとどれがアクティブなのかわかりにくいです。

非アクティブのウインドウペイン（窓ガラス）の背景色を変更することにより、見た目で判別しやすくなります。

調べたことをここにメモしておきます。

![tmux-dim-inactive-panes.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82804/ffb5977a-db65-1f96-9396-f3447c278335.gif)

## やりかた

たくさんある[options]のうち、[window-style]と[window-active-style]の`fg`(foreground colour)と`bg`(background colour)を変更することにより実現できます。

`fg`は文字の色、`bg`は背景の色です。両方またはどちらか一方を調整することにより、お好みの色の組み合わせにします。

```shell:$HOME/.tmux.conf
# 非アクティブな窓ガラス
set -g window-style 'bg=#303030'

# アクティブな窓ガラス
set -g window-active-style 'bg=#000000'
```

```shell:$HOME/.tmux.conf
# 非アクティブな窓ガラス
set -g window-style 'fg=colour244,bg=colour234'

# アクティブな窓ガラス
set -g window-active-style 'fg=white,bg=black'
```

https://man.archlinux.org/man/tmux.1#STYLES


## 使える色

- `black`, `red`, `green`, `yellow`, `blue`, `magenta`, `cyan`, `white`
- (明るい色がサポートされている場合)　`brightred`, `brightgreen`, `brightyellow`
- [8ビットカラー]の256色（`colour0` 〜 `colour255`）
- `default`（[tmux]のデフォルト）
- `terminal`（ターミナルのデフォルト）
- [RGB]（`#000000` 〜 `#ffffff`）

色の見本は[Wikipedia](https://en.wikipedia.org/wiki/Xterm)にいいのがありました。

![](https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg)

## さいごに

status line の色の変更にも取り組みました。もしよかったらご覧ください。

https://qiita.com/mnishiguchi/items/18ff80c0cb8269ff6dd8

本記事は [autoracex #259](https://autoracex.connpass.com/event/300537/) の成果です。ありがとうございます。

https://autoracex.connpass.com/

https://qiita.com/torifukukaiou/items/1edb3e961acf002478fd

![toukon-qiita-macbook_20230912_091808.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82804/fd5c55ec-4fe0-8af6-59bc-bab1ef3d182b.jpeg)

[tmux]: https://github.com/tmux/tmux
[tmux manual]: https://man.archlinux.org/man/tmux.1
[window-style]: https://man.archlinux.org/man/tmux.1#window-style
[window-active-style]: https://man.archlinux.org/man/tmux.1#window-active-style
[options]: https://man.openbsd.org/OpenBSD-current/man1/tmux.1#OPTIONS
[8ビットカラー]: https://ja.wikipedia.org/wiki/%E8%89%B2%E6%B7%B1%E5%BA%A6#8%E3%83%93%E3%83%83%E3%83%88%E3%82%AB%E3%83%A9%E3%83%BC
[RGB]: https://ja.wikipedia.org/wiki/RGB
Macでも年末調整申告書入力用PDFはAdobe Readerで開きましょう

来年からの年末調整で、二度と入力用PDFのフォントサイズで悩まないように記録します。

# TL;DR
公式の冒頭にきちんと書いてありました。~~公式ドキュメントを読みましょうは官公庁でも一緒。~~
[各種申告書・記載例（扶養控除等申告書など）｜国税庁](https://www.nta.go.jp/users/gensen/nencho/shinkokusyo/)

>※　入力用PDFの利用方法
>
>1 「入力用」のPDFファイルは適宜の作業場所にダウンロード保存してください。
>2　Adobe Readerを起動し、「ファイルを開く」を選択後に、1で保存した「入力用」のPDF ファイルを開いて、入力をしてください。
>(Adobe Readerをお持ちでない方は、Adobeのダウンロードサイトからダウンロードしてください。)

というわけで、公式の通りAdobe Readerを使用しましょう。
**絶対にMac標準のプレビュー.appで編集してはいけません。**

# 入力手順
### 1. Adobe Acrobat Readerをインストールする
brewあります
[adobe\-acrobat\-reader — Homebrew Formulae](https://formulae.brew.sh/cask/adobe-acrobat-reader)
### 2. 年末調整申請書の入力用PDFをダウンロードする
冒頭のリンクを再掲
[各種申告書・記載例（扶養控除等申告書など）｜国税庁](https://www.nta.go.jp/users/gensen/nencho/shinkokusyo/)
### 3. Adobe Acrobat Readerで入力用PDFを開いて入力する
![Adobe Readerで開くと、氏名のフリガナの文字が入りきっている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601565/c43e8bf0-a45e-8aec-54b6-0cad08577769.png)
氏名のフリガナの文字がちゃんと枠内に収まりました！🙌
長い住所も文字サイズが調整されています。
(例では全角30文字入れてみました)

私が入力する範囲だと、保険料控除申告書の保険等の種類が文字数制限オーバーで入りきらないということはありましたが、それ以外の箇所は多少文字数が多くてもフォントサイズが調整されて入りきりました。
金額入力のときもコンマを自動補完してくれます。

フリガナ入力時、Fn+F7でカタカナ変換しようとすると、謎にスペルチェックのウインドウが開いて機能しないのが気になりますが…。
Mac標準の入力ソースでは、変換時のリストを上に遡ればすぐにカタカナあるので、それで乗り切りましょう。

# プレビュー.appで開いてはいけない理由
Adobe Readerが入っていないと、PDFはMac標準のプレビュー.appで開きますよね。
こちらでも入力はできるのですが、文字が入りきらない箇所がとても多いです。
上記の例と同じように入力しても、氏名のフリガナの文字が入りきっておらず、住所も全角20文字までしか入っていないです。
![プレビュー.appで開くと、氏名のフリガナの文字が入りきっておらず、住所も全角20文字までしか入らない](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601565/e7a95954-64cc-18ea-4cad-9a83b2e1f69e.png)
フォントパネルから文字サイズ変更できるかと思いきや、フォーカスを外すと元のサイズに戻ります。

Adobe Readerだと上手くいくという情報を見つけて、brewダウンロードしてPDFを開いたんですが、フォントサイズが大きいままという事態が発生。
![プレビュー.appで保存したPDFをAdobe Readerで開いても、文字サイズが大きいまま](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601565/ef639187-b309-44c6-caa0-95c3d389ce5b.png)
嘘やったんか…？と疑心暗鬼になってたところ、Xに以下の情報がありました。
- プレビュー.appで開くとフォントサイズが固定される
- その状態で保存すると、他のソフトで開いてもフォントサイズは固定のまま

上記の事態は、まさにプレビュー.appで編集保存したファイルをAdobe Readerで開いたために起こっていました。
というわけで、PDFをダウンロードしなおしてAdobe Readerで開いて編集したら、無事にフォントサイズが自動調整されました。

これで来年からの年末調整申請書の作成が楽になります。
同様にフォントサイズに困っている方はぜひ参考にしてください。


# 参考
- [プレビュー\.appでPDFに文字を書き込んだら文字が枠からはみ出て困った \- PIYO \- Tech & Life \-](https://blog.piyo.tech/posts/2018-11-16-edit-pdf-previewapp/)
- https://twitter.com/10cube/status/1599192979478310912
IBM i アーキテクチャー：プロセス・アクセス・グループ Process Access Group : PAG

前の記事、複数論理コピーMLPについて説明しました。MLPのうち、個々のジョブが個別に持つメモリ領域であるPAG Process Access Groupについて説明します。

## PAGの構成要素
PAGには個々のジョブが専用で使用する情報が格納されています。PAGを構成する主要な要素は以下になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/0796f95c-396b-d112-f64e-a0a0a806e9ee.png)

1.PCS : Process Control Space : PAG全体の制御域です。
　PCS内はさらにICB:Invocation Control Block :プログラム呼出し制御域と,PCB:Process Control Block : ICBの制御情報に分類されます。

 2.PSSA : Process Static Storage Area : RPG, COBOLなどのプログラム内で定義されたデータ・フィールド、標識、配列などを格納します。

 3.PASA : Process Automatic Storage Area : CLP等の変数を格納します。

 4.ODP : Open Data Path : プログラムによってオープンされたファイルに関する情報が格納されます。

 ジョブが開始されると32KB x 3のメモリがPAGに割り当てられます。このメモリ領域を使い切ると32KBずつ追加の記憶域が割当られます。

 PAGはジョブが終了するとメモリ上から除去されます。

## PAGの構成要素の3分類（3つのエリア）
PAGの構成要素を役割毎に分類すると以下の3つのエリアがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/32ef811e-ebd4-eb16-356e-91743a5b66c1.png)

エリア1：コントロール・エリア
このエリアはIBM i OS, SLICマイクロコードが参照し、タスクのディスパッチが行われます。また、ジョブ内で行われたInvocation Stack（プログラムの呼び出しスタックの情報など）もコントロールエリアに存在します。

エリア2：フィールド・エリア
プログラムで使用される変数情報、配列情報が入ります。

エリア3：ファイル・エリア
このエリアにはストレージ装置から読み込まれたデータがいったん主記憶域（メインメモリ）にロードされた後は行ってきます。実際にプログラムがデータを使用するにはファイルエリアからフィールド・エリアに移されなければなりません。
error: 'ringbuf_type_t' has not been declared

PlatForm IO でBLEDeviceライブラリを使用した時に発生するエラー

重要なBLEDeviceのライブラリはarduinoライブラリにすでに入っているからこのようなことが発生するらしい。

```
lib_deps = 
	m5stack/M5StickCPlus@^0.1.0
	nkolban/ESP32 BLE Arduino@^1.0.1
```
↓
```
lib_deps = 
	m5stack/M5StickCPlus@^0.1.0
```
に変更したら直った。

参考にした英語の記事
https://github.com/nkolban/esp32-snippets/issues/1100
MBSDさんの勉強会が良かったのでお勧めしたい

船井総研デジタルのよもぎたです。

# サマリ

先日参加させていただいた[三井物産セキュアディレクション株式会社さん（MBSDさん）](https://www.mbsd.jp/)の[Webセキュリティ診断の勉強会](https://mbsd-ws.doorkeeper.jp/)がとても良かったのでお勧めしたいです。過去にも同じ内容で開催されているということで、今後も開催していただけるかもしれません（ぜひ開催していただきたい）。その時ご都合が合えば参加してみてはいかがでしょうか。

# 勉強会の概要

勉強会と銘打って開催されていますが、実際は講習＋ハンズオンでした。HTTP通信の内容の基礎的な説明やハンズオンで使う[Burp Suite](https://portswigger.net/burp)の無償版のセットアップと使い方に始まります。ハンズオンではそのために用意されたSNSサービスにある脆弱性が示されて、実際にその脆弱性をついて「被害」を体験しました。

# どんな脆弱性を突いたか

Webサービスの脆弱性というと、クロスサイトスクリプティング（XSS）やSQLインジェクションを思い浮かべる方が多いかと思います。しかし、ハンズオンで取り上げられた脆弱性はそういった「典型的なモノ」とは一味違いました。具体的には、サービスの権限周りの仕様を適切に実装できていないというもので、それを悪用して越権行為が出来てしまう、というものでした。

例えば、SNSサービスで仕様上はフレンド登録は承認制なのに、承認を経ずに勝手にフレンドになってしまったりしました。

# どういう学びがあったか

XSSやSQLインジェクションといった脆弱性は認知度も高く、コーディング規約を守る、フレームワークやライブラリを適切に使う、といったことで予防できることが多いと思います。しかし、この勉強会で体験した脆弱性はそれには当てはまらず、サービスの仕様に踏み込んだものでした。こういったモノは、単に開発者だけで予防するのは難しいと感じました。ビジネスサイドも巻き込んでサービスの仕様を詰めて、どうすべきかを決めて実装する必要があると感じました。

# 脆弱性診断、セキュリティ診断に興味がある方へ

勉強会、面白かったですよ！
特に、ブラックボックス（使い方や機能の説明が無いという意味で）のサービスを探索して行って、与えられたミッションを達成できそうなパラメータ改ざんポイントを探すのが楽しかったです！

# 最後に
内容を細かくお伝えするよりも、実際に参加していただいて実際に体験していただきたい！と思い、あえて簡易な記事にしています。次の機会を逃さないよう、勉強会のページをウォッチしたり、SNSをフォローしたりすると良いと思います。百聞は一見に如かず、です。

最後までお読みいただきありがとうございました。
M5StickCPlus のビルド方法(Visual Studio Code + PlatformIO)

# M5StickCPlus のビルド方法
- いつも忘れるのでメモ

## ビルド方法
よくあるのは Arduino IDE ですが、あれは遅すぎるので、Visual Studio Code + PlatformIO を使おう。

## Visual Studio Code をダウンロード/インストール
1. https://code.visualstudio.com/download からダウンロードしてインストールする

## PlatformIO IDE のインストール
1. Visual Studio Code を起動する
1. 左のバーから Extensions を選び、PlatformIO を検索
1. インストール ボタンを押下する
![platformio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/ffa08218-d12f-2488-9d2d-afe74acf0dcd.png)

## プロジェクトの作成
1. Visual Studio Code を起動する

1. 左のバーから PlatformIO を選ぶ
![start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/ac19ae23-f434-946e-ff84-05b37c3b638f.png)

1. Create New Project を選び、+ New Project を選択し、プロジェクトを作成する
   - Name: に適当なプロジェクト名を
   - Board: は M5Stick-C (M5Stack) を選択し
   - Framework: は Arduino を選択する
![wizard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/5036fe03-9641-127a-5cb3-2fbd6935e8a3.png)
Use default location の場合は、ドキュメント内の PlatformIO\Projects\LChika にプロジェクトが生成されます。

1. Libraries を選択して、M5StickCPlus を探して Add します
![lib.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/cbed77b4-9f8f-115e-206e-b2f01286576a.png)
![lib2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/bc33b309-128e-76d3-da1c-878186d47639.png)

## コーディング / ビルド
左ペインから src/main.cpp を選択して、コーディングします。
![main.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/62608bf6-5b58-0f57-79de-8cd4c68e4867.png)
~~~ c++:main.cpp
#include <M5StickCPlus.h>

void setup()
{
  M5.begin();
  pinMode(10, OUTPUT);
}

void loop()
{
  digitalWrite(10, HIGH);
  delay(1000);
  digitalWrite(10, LOW);
  delay(1000);
}
~~~

ビルドとアップロードはそれぞれのアイコンをクリックします。
![build.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/c7b06597-6d20-a132-338d-fde54aaaae9e.png)
![upload.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/28c339bb-09f0-7777-2396-b53444486a5f.png)
Pardot ：　他の仕組みを使った連携

[Pardotの質問と回答をまとめに戻る](https://qiita.com/Keiji_otsubo/items/a3ccd1370697dd914723)

+ [Pardot with Zoom](https://qiita.com/Keiji_otsubo/items/cbe0f6788b8925c62866)

# LinkedIn

+ [LinkedIn コンバージョンが Pardot に表示されない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000077lcHL)

:::note
Please check this article.

How to automatically set the Pardot source campaign when you get a lead from a LinkedIn ad
https://www.linkedin.com/pulse/how-automatically-set-pardot-source-campaign-when-you-julia-valentine
:::
[Pardotの質問と回答をまとめに戻る](https://qiita.com/Keiji_otsubo/items/a3ccd1370697dd914723)



# WordpressプラグインMW WP Form

+ [MW WP Formとの連携について（チェックボックスの子要素のname値（もしくはvalue）を計測したい）(https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007LWC2b)

# Zapier 

+ [Gravity Forms + Leads in Salesforce + Pardot Automations?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007QdoWk)

:::note
Please check this article.

5 Pardot Email Template Best Practices for the Lightning Email Builder
https://www.salesforceben.com/the-drip/pardot-email-template-best-practices-for-the-lightning-email-builder/
:::
YAMLを読み書き、"Yaml"

[Symfony Component Advent Calendar 2023](https://qiita.com/advent-calendar/2023/symfony-component)の3日目の記事です。

## YAMLを読み書き、"Yaml"

[Yaml](https://symfony.com/doc/current/components/yaml.html)は、Yamlの解析や作成を行うコンポーネントです。Symfony以外でも使え、Symfonyコンポーネントの中でも使われてるサービスが特出して多いコンポーネントになります。

### インストール

```shell
composer require symfony/yaml
```

### 解析

解析、つまり読み込みに関しては文字列とファイルの両方をサポートします。

```php
use Symfony\Component\Yaml\Exception\ParseException;
use Symfony\Component\Yaml\Yaml;

try {
    $result = Yaml::parse('apple: りんご'); // ['apple' => 'りんご']
    $resultFromFile = Yaml::parseFile('/path/to/file.yaml'); // YAMLファイルを解析
} catch (ParseException $e) {
    echo "failed";
}
```

### 書き出し

書き出しについては、`dump()`メソッドで行います。

```php

$param = [
    'fruits' => [
        'apple' => 'りんご',
        'orange' => 'オレンジ',
        'pear' => 'なし',
    ],
    'date' => '2023-12-03',
];

$dumped = Yaml::dump($param);
/*
fruits:
    apple: りんご
    orange: オレンジ
    pear: なし
date: '2023-12-03'
*/

```

### 特殊な解析

フラグをつけることで特殊な解析を行うことができます。いくつかピックアップしてご紹介します。

#### PARSE_DATETIME

`2023-12-01 00:00:00` みたいな文字列を日付型にしたい場合は解析時に `Yaml::PARSE_DATETIME`を指定します。

```php
Yaml::parse('date: 2023-10-01 12:34:56', Yaml::PARSE_DATETIME);
/*
[
  "date" => DateTimeImmutable @1696163696 {#195
    date: 2023-10-01 12:34:56.0 UTC (+00:00)
  }
]
*/
```

#### PARSE_CONSTANT

PHPの定数を解析します。 `!php/const PHP_INI_SIZE`であれば、 PHP_INI_SIZEの値を、
`!php/enum {Enum}`であれば、Enumの値として解析します。

```php
Yaml::parse('size: !php/const PHP_INI_SIZE, meal: !php/enum App\Enum\MealType::Lunch', Yaml::PARSE_CONSTANT);
/*
[
  "size" => 8,
  "meal" => App\Enum\MealType^ {#195
    +name: "Lunch"
    +value: "昼食"
  }
]
*/
```

## まとめ

今回は`Yaml`を紹介しました。Symfonyは設定にYAMLを使っていますが、裏側ではこのコンポーネントが頑張って解析してくれていたのがよくわかります。
広告: Pardotのまとめ

[Pardotの質問と回答をまとめに戻る](https://qiita.com/Keiji_otsubo/items/a3ccd1370697dd914723)


+ [Yahoo!広告（リスティング）でのPardot計測方法をご教示いただきたい](
https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007OYFWt)
+ [Google Tag Manager and Enhanced Landing Pages](https://qiita.com/Keiji_otsubo/items/2a7ee99804ea0c5ae668)
+ [Google 広告と Pardot の間のコンバージョン数に関するデータの不一致](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007PzG5H)

:::note
This could be anything. The first thing I would investigate is if you've got duplicate tracking tags running that could cause a double-count. Sometimes this is due to do an iframe embedded form running duplicate tracking script, but ultimately it's a web developer issue. 

これは何でも構いません。最初に調査するのは、二重カウントを引き起こす可能性のある重複した追跡タグが実行されていないかどうかです。これは、iframe 埋め込みフォームが重複した追跡スクリプトを実行することが原因である場合もありますが、最終的には Web 開発者の問題です。 
:::

+ [The Advanced Guide To Using Google Analytics UTM Parameters](https://holini.com/utm-parameters/#9)
AI-102試験対策のまとめ「Face APIにおけるFind Similar APIの呼び出し」

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

## 試験対策のまとめ
### Face APIにおけるFind Similar APIの呼び出し
* faceIdを指定して、下記のリストから似た顔を検索可能
    - faceListId：最大1,000個の顔候補リスト
    - LargeFaceListId：最大1,000,000個の顔候補リスト
* 類似顔検索は下記の2つの動作モードがある
    - `matchperson`
        - 内部の同一人物しきい値を使用して、可能な限り同一人物の顔を検索しようとする
        - デフォルトのモード
        - 知っている人の他の写真を見つけるのに便利
    - `matchface`
        - 同一人物のしきい値を無視し、たとえ類似度が低くてもランク付けされた似た顔を返す
        - 有名人の顔を検索する場合などに便利
* POSTリクエスト
    - `POST {Endpoint}/face/v1.0/findsimilars`
<br>

* 参考
    - https://learn.microsoft.com/ja-jp/rest/api/faceapi/face/find-similar?view=rest-faceapi-v1.0&tabs=HTTP
    - https://learn.microsoft.com/ja-jp/rest/api/faceapi/large-face-list?view=rest-faceapi-v1.0

## 次の試験対策のまとめ
* **AI-102試験対策のまとめ「顔をPersonGroupに追加」**

https://qiita.com/fsd-jume/items/0d1e320ff3da5cbe442b

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

https://qiita.com/fsd-jume/items/65aba5d5514e023fd66d
サイトをリデザインする！対応するブラウザバージョンを決める時に考えたいこと

新しくサイトを作る時にどのブラウザバージョンまで対応するか悩みます…。
考えるべきポイントを紹介するので迷った場合は参考にしてください！

## 流入割合を見る
現在運営中のサイトがある場合は分析ツールを使って流入データを確認します！
新しくサイトを作成する場合は、サイトで現在のブラウザシェアを確認します！

https://gs.statcounter.com/

## 使いたいCSSプロパティを基準にして絞り込む
例えば、「gapを使いたいからSafari14.1以降から対応する」とかです。
当然サイトの現状の割合を加味して判断が必要ですが、5％は捨てることになるけど全体の95％をカバーできるならOKとする。と判断できるでしょう。

:::note info
全体のどこまでをカバーするかは、開発者だけではなく、SEO担当者やステークホルダーともすり合わせをしましょう！
:::

## 運用コストから考える
古すぎるブラウザで表示を担保しようとすると使えないCSSプロパティやJavaScriptのメソッドが出ていきます。

それによって開発するコストが大きくなったり、変更する際の障害になったりします。
見た目や動作の保証がされないユーザーが増えることはサービスにとってリスクですが、サービスを成長させるための改修が容易ではないこともリスクです。

:::note warn
新しく作るサイトでも最新のブラウザだけに対応してしまうと表示が崩れていたり、ページが動作しないユーザーが多くなる可能性があるので注意してください…
:::


## 最後に
対応ブラウザの選択に正解はないです。
状況やサイトの性質によって変化します。

継続定期に最適化するのが良いと考えています。
どれくらいの期間で見直すのかは議論が必要になりますが、短くても6ヶ月〜1年ぐらいの期間で見直して調整をかけられると良いのでは？と考えています！
AXIOSでヘッダーに認証情報をつける処理でエラーが出た話

### はじめに
本記事ではCORSエラーが出てから解消するまで流れを記述しています。
以下のアーキテクチャ図で取得したデータをフロント側で表示、制御をしています。
今回はフロント側からAPIを叩く際にCORSエラーがでて苦戦したのでその部分について書いています。

APIでの認証にAPIキーを使用しています。
基本的にはAPIキーを使用するべきではありませんが、今回は検証用で一時的に利用するものなので使用しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524923/4b8b369f-1256-fa93-981a-3efa6ef2c6b5.png)

### API Gatewayの設定
以下のレスポンスヘッダーに'*'を使用して全てのオリジンからのアクセスを許可をしています。
Access-Control-Allow-Headers
Access-Control-Allow-Methods
Access-Control-Allow-Origin


### エラーが出た時のコード
今回エラーが出たときに記述していた内容としては以下になります。
```ts
const URL = "APIGatewayのエンドポイント";
const API_KEY ="APIと関連付けたAPIキー";
const ID = "DynamoDBテーブルのID"; 

axios.defaults.headers["X-API-KEY"] = API_KEY;
```
URLではAPIGatewayで自分が作成したAPIのエンドポイントを定義し、API_KEYでは作成しAPIGatewayと紐付けたAPIキーを定義し、IDはDynamoDBのテーブルで使用したキーを定義しています。

axiosでヘッダーにAPIキーをつける処理のところでエラーが出てしまいました。
フロントエンド側のコンソールを確認するとCORSエラーが出ていました。

### エラー解消した後のコード
```ts
const URL = "APIGatewayのエンドポイント";
const API_KEY ="APIと関連付けたAPIキー";
const ID = "DynamoDBテーブルのID"; 

axios.defaults.headers.common["X-API-KEY"] = API_KEY;
```
headersのあとにcommonを追加でエラー解消できました。

### commonはどんな意味を持つのか
この一文では、認証に利用するTokenなどをHeaderに設定したい場合にdefaults値に設定することでaxiosでリクエスト毎にヘッダーに設定せずに済むようにしています。
このエラーを解消しようと色々調べてみまたところcommonを使用しているものが多く出てきました。[AXIOSのドキュメント](https://axios-http.com/docs/config_defaults)を見てもcommonを使用していました。

このcommonの場所では特定のHTTPリクエストタイプを選択し適用することができcommonにすると全ての種類のHTTPリクエストに適用されることがわかりました。

### まとめ
実はこのエラーが出る前に、一度同じアーキテクチャで別のページを作成していたことがあり、今回のAPIを叩く処理はその時と全く同じように作成をしました。前回はcommonをつけずにAPIを叩くことができ、エラーも出なかったので、この処理は間違っていないと思い込んでしまいエラー解消に手間取りました。
通常は特定のリクエストタイプ（get、post など）に対して個別にヘッダーを設定するために使用され、axios.defaults.headers を直接使用してヘッダーを設定する方法は、一般的ではないことが調べる中でわかりました。
一度うまくいった処理を使っていても別のところでエラーが出た場合には、ちゃんと調べることが大事だと思わされました。
セマフォ不足によるApacheサーバーの再起動問題

# 【事象】
Apacheの起動・再起動を行った際に、下記のエラーが出てApacheが立ち上がらない
```
Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
```

/var/log/httpd/error_log を確認すると以下のようなメッセージが表示されている
```
No space left on device: AH00023: Couldn't create the ssl-cache mutex
```

# 【原因】
原因としては、セマフォが不足しているかららしい。
セマフォの状態は、ipcsコマンドで確認できます。


```
ipcs -s
------ セマフォ配列 --------
キー     semid      所有者  権限     nsems
0x00000000 1343490    apache     600        1
0x00000000 1376260    apache     600        1
0x00000000 1376261    apache     600        1
0x00000000 1376262    apache     600        1
0x00000000 1376263    apache     600        1
0x00000000 1343496    apache     600        1
0x00000000 1343497    apache     600        1
0x00000000 1343498    apache     600        1
0x00000000 1343499    apache     600        1
0x00000000 1343500    apache     600        1
0x00000000 1376269    apache     600        1
```

ここでApache関連のセマフォがずらっと大量に並んでいたら、
Apacheユーザーのセマフォに何らかの問題が発生して、Apacheの起動を妨げている可能性があるので、Apacheのセマフォをクリアにする必要があります。

# そもそも、セマフォってなに？
セマフォ（Semaphore）は、オペレーティングシステムの中で、複数のプロセスが同時に行われる際に、それらが互いに干渉しないように制御するためのメカニズムです。簡単に言うと、セマフォはプロセス間の割り込み処理をコントロールするための信号システムのことを指します。

Apacheサーバーの再起動に失敗した原因として考えられるのは、システムがセマフォのリミットに達し、新たなセマフォを割り当てることができなくなった為。
システムで設定されているセマフォの最大数を超える、多くのプロセスやスレッドが同時に実行されることによりapacheの再起動に失敗しておりました。


# [対策]
上記、理由によりApache関連のセマフォを解放する為、下記コマンドを実行する。
実行すると無事にapacheの再起動が出来ました。

```
ipcs -s | grep apache | awk ' { print $2 } ' | xargs ipcrm sem
```
初めて学ぶ SAML

# SAMLとは

Web アプリのシングルサインオン (SSO) を実現する XML ベースでやり取りを行うことで、異なるインターネットドメイン間でユーザー認証を行うための認証情報の規格です。

要するに、シングルサインオン (SSO) を実現するための手段の1つです。

正式名は"Security Assertion Markup Language"です。

# シングルサインオン (SSO) とは

一度のログインで、利用したいサービス全てにログインできる仕組みのことです。

例えば、業務に利用するサービスの数が増加すると、当然ユーザーにとっては各サービスにログインするためのパスワード管理が煩雑になってしまいます。
その結果、推測されやすい危険なパスワードを設定してしまう人も出てきます。

この解消に役立つのがシングルサインオン (SSO) です。

シングルサインオン (SSO) は認証を行えば、認証サーバーが認証情報をサービスと連携してくれるため、ユーザーは一度のログインで他のサービスを利用できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513259/e70a7d85-a9e6-fc1e-d319-a8a68bab9628.png)

繰り返しとなりすが、SAML は SSO を実現するための手段の1つである ということです。

※他の仕組みについて
ここでは触れませんが、SSO の実現するためのには 5つ の方式があり SAML がその中でも有力な選択肢となっています。

・代行認証方式
・リバースプロキシ方式
・エージェント方式
・フェデレーション方式....SAML,OpenID Connect
・Kerberos認証

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513259/af78271c-6260-f786-2abc-58b590aeb6bd.png)

# セキュリティ用語について

具体的にSAMLの話をする前に今回の絡む一般的なセキュリティ用語を説明します。

・認証...ユーザーの本人確認を行うこと。本人であることの証明をすること。

・認可...情報やシステムなどのリソースにアクセスする権限を付与する。認証後にそのサービスでできる権限を与えること。

# SAML 用語
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513259/fa1480f3-fbce-119f-1b01-d54278252fc9.png)

# 認証フローの説明

以下が大まかなフローです。

1.ユーザーが SP (サービス)へアクセスするために IdP(認証プロバイダー) にて認証を実施します。

2.認証が成功すると IdP から Assersion(トークン) が発行されます。

3.SP (サービス)は　Assersion (トークン)　を連携してもらうことで、そのユーザーが正当であるとみなして、サービスを展開します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513259/0a92d94d-d990-d26a-c4c7-d5716e0aad88.png)

またもう一つ重要なポイントとして、SAML とはあくまでやり取りのことである ということです。

つまり、SAML を利用する際の認証方法については関与しないことには注意が必要です。

# 実際のフロー

SAML 認証には2種類のフローがありますが、起点の違いだけです。

(1).SP-initiated SSO   →   SP が起点
(2).IdP-initiated SSO   →   IDP が起点

(1).SP-initiated SSO 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513259/68841c03-4843-6cb7-ad25-b46255f6383f.png)

1. ユーザーが SP (例.Webサービス) にアクセスします。

2. SP はユーザーの要求が未認証であることを検知し、SAML AuthRequest (認証要求)を作成します。
(SAML AuthRequest には、リクエスト識別子、SAMLバージョン、要求する属性やサービスのエンドポイントなどの情報が含まれる)

3. SP はユーザーを選択した IdP にリダイレクトします。このリダイレクトには、SAML AuthRequest (認証要求)も含まれます。

4. ユーザーは IdP の認証ページにリダイレクトされ、ユーザー名とパスワードなどの認証情報を提供して認証を行います。
IdP はユーザーのアイデンティティを確認し、SAML Response(応答)を生成します。
(ユーザーの認証ステートメントや属性情報が含まれる)

5. この SAML Response(応答)は、SP が提供されたエンドポイントに送信されます。

6. SP は SAML Response(応答)を受信し、署名の検証を行います。
応答が正当である場合、ユーザーは認証されたとみなされ、SP のサービスにアクセス権が与えられます。

* * *

(2). IdP-initiated SSO
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3513259/2bbf415a-fbbc-6931-4f87-12a812f1ec52.png)

1. ユーザーが特定のアプリケーションやサービスに直接アクセスする代わりに、最初に IdP にアクセスして、認証情報を提供して認証を行います。

2. IdP はユーザーの認証情報を確認し、SAML Response(応答)を生成します。そしてユーザーがアクセスしようとしていたSPに連携します。

3. SAML Response(応答)を受け取った SP は、ユーザーのアイデンティティと属性情報を検証します。ユーザーが認証されると、SP のサービスにアクセスできるようになります。


* * *
以上、SAML の基本についての記載でした。

この記事に関して間違いなどありましたら、ご指摘いただけるとうれしいです。
Cocoa Podsの導入

# 前提
rubyがインストールされていること
```shell
% gem -v
3.0.3.1
```

# インストール
```shell
sudo gem install cocoapods
```

# バージョンを指定してインストール
```
sudo gem install cocoapods -v 1.13.0
```

# 最新版へアップデート
```
sudo gem install cocoapods
```

# プレリリースバージョンへアップデート
```
sudo gem install cocoapods --pre
```

# アンインストール
```
sudo gem uninstall cocoapods
```

## 参考記事
https://guides.cocoapods.org/using/getting-started.html