OmniAICreator/Qiita-1.07M huggingface dataset:
Microsoft Azure - API Management Service: 固定のレスポンスを返す

Azure の API Management Service で、 固定のレスポンスを (サーバを作らずに) 返す方法を紹介します。

Frontend と Inbound の設定を行うことで、可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25846/9a493b1a-f743-4f0e-726f-5bb5035ba9a7.png)

## STEP 1

Mock としてのレスポンスを有効にします。
これは、Inbound のポリシーを使います。

"Add policy" をクリックして、GUIで設定可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25846/1a6333f5-c5a4-14a4-9201-477915937e59.png)

Add policy をクリックすると、追加可能ないくつかのポリシーが表示されます。 そのなかから Mock responses を選びます。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25846/fb5e90f9-a856-dc01-a6ce-8054e2521461.png)

選択後は、レスポンスステータスとレスポンスのmime type入力する画面になります。 "200 OK, text/plain" にしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25846/de901400-9217-2de2-520d-b9b7c2dc05c4.png)

これを XML を使って記述すると下のようになります。

```xml
<policies>
    <inbound>
        <base />
        <mock-response status-code="200" content-type="text/plain" />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>
```

この時点でAPIへリクエストを行うと、BODYのないレスポンスが返ってきます。

## STEP 2

Frontend の設定で、先ほど設定したレスポンスにマッチするBODYを記述します。
ステータスは 200、 Content-Type は text/plain でしたから、それに合わせたレスポンスを設定します。 "sample" という文字列を返すように設定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25846/5063f1d5-5391-da43-05b7-cbaf4a687108.png)

これでBODYを含む固定のレスポンスが返るようになりました。

Content-Type を application/json に設定していれば 決まった JSON を返すこともできます。

## テスト

上で設定したAPIへリクエストを送ってみました。
期待通りの結果が返ってきました。

```zsh
% curl -i -X GET \
 'https://xxx.azure-api.net/test4'
HTTP/1.1 200 OK
Content-Length: 6
Content-Type: text/plain
Date: Tue, 03 Jan 2023 13:44:14 GMT

sample
```
もっと簡単にガンマ関数を導く

[前回の記事](https://qiita.com/Ken-ichi_Hironaka/items/64c19f8651f7d0b6f429)で、ポアソン過程からガンマ関数を導くという遊びをしましたが、[Twitterでもっと簡単にガンマ関数を導く方法](https://twitter.com/fermatslibrary/status/1608837425375182849)を知ったので、備忘録ついでに紹介します。

$\lambda>0$のとき、指数関数の積分について、次が成り立ちます。

```math
\int_{t=0}^{\infty} e^{-\lambda t}dt = \left[ - \frac{1}{\lambda} e^{-\lambda t} \right]_{t=0}^{\infty} \\
= \frac{1}{\lambda} \\
= \lambda ^ {-1}
```
この両辺を$\lambda$で微分してみます（１階微分）[※](#注)。

```math
\int_{t=0}^{\infty} \left( -t e^{-\lambda t} \right) dt = - \lambda ^ {-2}
```

さらに両辺を$\lambda$で微分します（２階微分）。

```math
\int_{t=0}^{\infty} \left[ (-t)^2 e^{-\lambda t} \right] dt = (-1)(-2) \lambda ^ {-3}
```

この調子で両辺を$\lambda$で$k-1$階微分すると、

```math
\int_{t=0}^{\infty} \left[ (-t)^{k-1} e^{-\lambda t} \right] dt = (-1)(-2)\cdots(-k+1) \lambda ^ {-k+1}\\
\int_{t=0}^{\infty} \left[ (-1)^{k-1}t^{k-1} e^{-\lambda t} \right] dt = (-1)^{k-1}1\cdot2\cdots(k-1)\lambda ^ {-k+1}\\
\int_{t=0}^{\infty} t^{k-1} e^{-\lambda t} dt = (k-1)!\lambda ^ {-k+1}\\
\int_{t=0}^{\infty} (\lambda t)^{k-1} e^{-\lambda t} dt = (k-1)!\\
\int_{t=0}^{\infty} t^{k-1} e^{-t} dt = (k-1)!

```
というわけで、現代的なガンマ関数の形（第二種オイラー積分）が出てきました。

---
##### 注
ここで半無限区間の積分と微分の順序を交換しています。
参考：[微分と積分の順序交換](https://mimsystudent.wordpress.com/2010/11/09/%E5%BE%AE%E5%88%86%E3%81%A8%E7%A9%8D%E5%88%86%E3%81%AE%E9%A0%86%E5%BA%8F%E4%BA%A4%E6%8F%9B%EF%BC%8C%E3%81%82%E3%82%8B%E3%81%84%E3%81%AF%E7%A9%8D%E5%88%86%E8%A8%98%E5%8F%B7%E4%B8%8B%E3%81%AE%E5%BE%AE/)
DelphiのIDEでバージョン管理(git)の設定方法

``` bat
C:\>git config  --list
user.name=takanaweb5
user.email=12345678+takanaweb5@users.noreply.github.com
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/74eb1f0e-7183-b34e-0a1d-b7dd9d7ad6d9.png)

### 文字コードのデフォルトをUTF8にする

https://qiita.com/ht_deko/items/59ca8a2aade3f59d7fae

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/6a482c4e-718b-2207-cc27-b377ac128044.png)

### dfmをテキストで保存する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/2a5a88f1-9242-f779-ce57-4841d813523d.png)


### Historyの作成は不要にするなど

https://qiita.com/miu31/items/ed67eed2513b69df8729
【Xcode】新しいSFSymbolでも全てのOSバージョンで使いたい

# はじめに
「うわ！めっちゃ欲しかったSFSymbolsが追加されてるじゃん！使お」
「まじか、iOS16.1からしか使えないじゃん」

こんな経験ありますよね

大丈夫、使えるんです

# やりかた
① 使いたいシンボルを選択します
② 「ファイル」を選択します
③ 「シンボルを書き出す...」を選択します
![スクリーンショット 2023-01-03 22.05.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e1c3425e-7664-67c8-b355-7d186d2ba31a.png)

④ 「書き出す」を選択します
![スクリーンショット 2023-01-03 22.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/3001404c-3bbc-04fd-c951-4ad427896cb1.png)

⑤ ファイル名を決めます
⑥ 保存場所を決めます
⑦ 「書き出す」を選択します
![スクリーンショット 2023-01-03 22.12.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/7f6c1c4e-6d1a-456b-9429-bdead7c4e9f0.png)

⑧ Assetsを選択します
⑨ 先ほど書き出したファイルをAssets内にドラッグします
![スクリーンショット 2023-01-03 22.15.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/491ebd5a-20df-c2d9-cc1c-b4ae4a5fcaeb.png)

# 使い方
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        Image("sos")
    }
}
```

# おわり
iOS14でも使うことができました
![simulator_screenshot_F17EEEDB-ECED-4EBA-ADC5-AEB5E54E5E9E.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/0aaeebe9-b069-1d99-513c-13ef850adcd9.png)
Pythonのバグ技 —— クラス以外を継承する

# どういうこと？？

Pythonでのクラスの継承は次のように書きます。

```python
class B:
    """The base class."""

class C(B):
    """A new class that inherits B."""
```

ここでの`B`はクラス、言い換えれば`type`型である必要が...ありません。

# クラス以外を継承する方法

適当なオブジェクトを用意します。

```python
class _X:
    pass
B = _X()
```

このオブジェクトに`__mro_entries__`を追加します。`__mro_entries__`は、（クラス以外のオブジェクトを含む）全て継承元の型を引数に、（クラスのみからなる）実際の継承元の型を返すようにします。この特殊メソッドが継承時に呼び出されます。

```python
B.__mro_entries__ = lambda bases: (str,)
```

これで`str`のサブクラスが定義できます。

```python
class C(B):
    pass
c = C("abc")
type(c)  # Out: __main__.C
```

`__mro_entries__`さえあれば何でもよいので、`__mro_entries__`を無理やりセットできるものであればなんでも行けます。たとえば、こういうやばい使い方もできます。

```python
import math

math.__mro_entries__ = lambda bases: (str,)

class C(math):
    pass
c = C("abc")
type(c)  # Out: __main__.C
```

# 実際にどう使われるの？

継承の時点で、たとえば多重継承を検出してエラーにすることとかができます。

```python
def _mro_entries(bases: tuple):
    if len(bases) > 1:
        raise TypeError("Multiple inheritance is forbidden")
    return (str,)
B.__mro_entries__ = _mro_entries
```

通常はメタクラスを定義することで実現されますが、継承元を確認するだけならこっちの方が楽だと思います。

ちなみに標準実装の`NamedTuple`も、常に継承する形で使われますが、その実態は関数です。

```python
from typing import NamedTuple
type(NamedTuple)  # Out: function
```

そのため、怖いことに`isinstance`チェックができません。注意しましょう。

```python
class Point(NamedTuple):
    x: int
    y: int

p = Point(x=0, y=1)
isinstance(p, NamedTuple)  # TypeError: isinstance() arg 2 must be a type or tuple of types
```
Swiftのenumでraw typeにTupleを設定した(つもりになる)方法

## はじめに

:::note alert
```Swift```で```enum```の```raw type```に```タプル```を設定すると、激しめに怒られます。[^1]
:::

![SS0003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/4f52054b-b7b1-79e9-686a-2045a76e34f3.png)


## 対策案
1. 1番目の```String```は```raw type```で設定する。
2. 2番目の```String```は```CustomStringConvertible```に準拠して、```description```プロパティの中で設定する。
```Swift
enum TargetLang: String, CaseIterable {
    case EN
    case EN_GB = "EN-GB"
    case EN_US = "EN-US"
}

extension TargetLang: CustomStringConvertible {
    var description: String {
        switch self {
        case .EN:    return "English"
        case .EN_GB: return "English (British)"
        case .EN_US: return "English (American)"
        }
    }
}
```

## 使い方
1. 1番目の```String```は```.rawValue```で取得する。
2. 2番目の```String```は```.description```で取得する。

これによって、擬似的に```Tupple```っぽい使い方ができます。
```Swift
let items = TargetLang.allCases.map {
  (param: $0.rawValue, title: $0.description)
}
print(items)
/*
[(param: "EN", title: "English"),
 (param: "EN-GB", title: "English (British)"),
 (param: "EN-US", title: "English (American)")]
*/
```

## おわりに
ちょっと面倒かもしれませんが、```enum```で１つの```case```に２つの```String```を設定できました。[^2]
ご参考になれば幸いです。

[^1]: エラーの解説は省略します。
[^2]: 「タプルや構造体の配列じゃだめなのか？」という問いには、「思いついちゃったから」と答えておきます:relaxed:
Unity, ml-agentsでの強化学習，ちょっとしたTIPSなど

Unityのパッケージである`ml-agents`を使用した強化学習の備忘録です．以下のことについて説明します．

1. 環境構築
1. とりあえず学習させる
1. Continuous ActionとDiscrete Action
1. InputSystemでのHeuristic()の定義

# 環境構築

公式のGitHubを確認するのが一番正確でわかりやすいです．はまりポイントは特にありません．

https://github.com/Unity-Technologies/ml-agents/blob/release_19_docs/docs/Installation.md

やることは（大体の記憶ですが）以下でした．

- pythonのインストール，仮想環境作る，python環境のセットアップ
    - 仮想環境はpython3の`venv`でもいけます．`anaconda`は過剰かなー？と思う方はぜひ．
- `ml-agents`リポジトリのクローン

参考ですが，使用した諸々のバージョンは以下です．
- Unityのエディタ: 2022.1.1f1
- python: 3.9.13
- pytorch (1.7.1) とmlagents (0.28.0) はGitHubで指定されているもののままです．

# とりあえず学習させる

これも公式のGitHubを確認しましょう．こちらもはまりポイントは特にありません．`RollerAgent`を作る以下の記事の各ステップを正しく実施すれば，確実に学習済みモデルが作成されます．

https://github.com/Unity-Technologies/ml-agents/blob/release_19_docs/docs/Learning-Environment-Create-New.md

学習を途中でやめる際は，Unityのエディタのプレイボタン `▶` を押した後，ターミナルで`Ctrl + C`で大丈夫っぽいです．

学習済みモデル（`*.onnx`）はUnityエディタの適当な場所に放り込んで，インスペクタの`Behavior Parameters`の`Model`の部分に放り込みましょう．その後Unityエディタのプレイボタン`▶`で学習済みモデルを動かせます．

# Continuous ActionとDiscrete Action

`RollerAgent`のサンプルでは，エージェントの行動に`Continuous Action`のみが使われていました．それに対して，`Discrete Action`なるものも存在します．

`Continuous Action`はゲームパッドのスティック入力のような，連続値をとるような場合に使用するようです．例えばゲームパッドの左スティック，左右（水平）の操作だけを学習の対象にしたければ，インスペクタの`Behevior Parameters`，`Continuous Actions`の数値は1にすべきようです．`RollerAgent`のように上下左右への行動を観測の対象にさせたくば，`Behevior Parameters`，`Continuous Actions`の数値は2とするようです．

`Discrete Action`はゲームパッドでいえばボタン入力，またキーボード入力のような，離散値をとるような場合に使用するようです．

`Discrete Action`はインスペクタでの設定が少々難儀します．以降は完全に理解していないので参考程度に読んでください．まずインスペクタ上の`Discrete Branches`を操作すると，インスペクタ上の`Branch`の項目自体が増えます．一つの`Branch`は一つの排他な行動セットを意味するようです．排他な行動セット（※この名前は今適当に決めました）とは，例えばWASDでの移動を考えたとき，上に進みながら下に進む，という行動は定義できないはずです．つまりWとSは排他といえます．簡単のためWASDそれぞれを排他と考えたとき，このWASDの4つの行動は，排他な行動セット，と考えて良いでしょう．このような行動を学習させたい場合，Branchの値は5 (= 4 + 1)とします．この+1の行動は，何もしないという行動です．

また，プレイヤーがWASDで移動しながら，スペースキーでジャンプするような場合を一括で学習させたい場合，`Discrete Branches` = 2 にして，一つ目のBranchは5, 二つ目のBranchは2（ジャンプするという状態，何もしないという状態）とすることで，移動とジャンプと同時に学習させることが可能になるようです．

# InputSystemでのHeuristic()の定義

学習のために作成した環境がうまくできているかどうかを，エージェントをマニュアルで操作して確かめることができます．そのためには，`Heuristic()`にユーザの操作でのエージェントの動作を記述する必要があります．

Unityではユーザの入力を受け付けるとき，従来の`Input Manager`（`Input.GetAxis`や`Input.GetButtonDown`等）と，新しい入力システムである`Input System`のいずれかを選択することができます．`RollerAgent`のサンプルでは，より簡便な`Input Manager`が使用されていましたが，`Input System`を使いたい場合もあると思います．そのときの答えは以下のページに書いてありました．

https://forum.unity.com/threads/ml-agents-and-new-input-system.924899/

重要な部分を抜粋すると，以下になります．

```csharp
public override void Heuristic(in ActionBuffers actionsOut) {
    controls.Enable();
    actionsOut[0] = controls.Player.Move.ReadValue<Vector2>()[0];
    actionsOut[1] = controls.Player.Move.ReadValue<Vector2>()[1];
}
```

ここで，変数`controls`は，InputSystemのインスタンスです．`Player`であったり`Move`であったりは既に定義している前提です．

同様に，ジャンプのような入力は，以下のコードで取り出せるはずです．

```csharp
actionsOut[0] = controls.Player.Jump.IsPressed() ? 1 : 0;
```

# おわりに
ちょっと図がないのでわかりにくいですが，まあ備忘録ということで．

間違いがあったらごめんね，参考程度に読みましょう．
ngrokでForwardingしたURLにアクセスできない

# はじめに

この記事は以下の書籍をやっていてつまったところから記事にしたものになります
一部書籍についての内容があります

https://www.amazon.co.jp/%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%82%8F%E3%81%8B%E3%82%8B-Kotlin-%E5%AF%8C%E7%94%B0-%E5%81%A5%E4%BA%8C/dp/4863542917/ref=sr_1_10?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2O4K3CGL83O4E&keywords=kotlin&qid=1672750623&sprefix=kotli%2Caps%2C225&sr=8-10

# 問題

書籍で`ngrok`の使い方が割愛されていたため以下の手順で入れました

https://ngrok.com/download

ここからファイルをダウンロードしてインストールしました

```
$ sudo tar xvzf ~/Downloads/ngrok-v3-stable-linux-amd64.tgz -C /usr/local/bin
```

そして、Kotlinで作ったアプリケーションを`localhost:8080`で立ち上げました
ngrokを利用してフォワーディングを行います

```
$ ngrok http 8080
```

すると以下のログが出力されました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/f70e0254-0c8a-3f60-0d8f-3f8bbd3130a0.png)

`Forwarding`のアドレスにアクセスしたところアクセスできませんでした

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/a906d08b-fe3e-ded5-d395-e93d12eafbf0.png)

# 解決方法

`localhost:4040`を開くとURLを確認できるようなので確認したところ以下のようになっていました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/146a2b53-9c31-2fb3-5c1b-e63ddf5f098f.png)


先程アクセスしたのが`https://2492-240f-3e-3ec3-1-f4ac-18d7-97a2-f127.jp/`だったのに対してURLは`https://2492-240f-3e-3ec3-1-f4ac-18d7-97a2-f127.jp.ngrok.io`でした

他の記事をみると全て最後に`ngrok.io`がついていましたが、最新版では省略されてるようでそれが原因でした

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/3a4c4881-8fdb-7dbb-f37e-1cd8f98a831a.png)

無事開けました

# 書籍のはなし

slackで`Slash Command`を登録する際は以下のように設定します

```
https://2492-240f-3e-3ec3-1-f4ac-18d7-97a2-f127.jp.ngrok.io/slack/events
```

英数字の部分はそれぞれ違います。注意としてはngrok.ioまでいれることです

# おわりに

ngrokはそれぞれで調べて設定してくださいというので、思ったよりも時間がかかりました
ここは説明すべきなのではと思ってしまいました

ngrok久しぶりに使いましたが便利ですね
[Apache Hop] Hop Webのデモサーバを試してみた

> 注意事項: 2023年1月の投稿であり、現在はデモサーバは公開されてません。備忘録として投稿は残します。

# 対象者
- Apache Hop (データオーケストレーションプラットフォーム) を試してみたい方
- ローコードでデータ収集、変換処理を設計、実装を検討しているかた。

# 紹介したいこと
- **公式のHPでHop Webのデモサーバが公開されました。Hop Web (GUI) をすぐに試せる**ようになりました。(2023/01/03時点)
- GUIで、どんなふうに定義するのか、実行するのか、どんな部品があるのか、興味がある人がいらしたら、お試しみてほしいです。
- あくまでも一時的に試す環境で30分ごとにリセットされるような環境です。**これを使ってみて興味もっていただけたら、ダウンロードして試してみてほしいです！**

# Apache Hopとは
- Apache Hop は オープンソースのデータ統合プラットフォームです。 ETL (Extract/Transform/Load) の開発ツール・実行エンジンです。

- 日本Apache Hopユーザーグループのとりまとめの案浦さんの紹介動画

https://www.youtube.com/watch?v=-GJIXh4eSrA



# 手順
- 公式のHPのURLにアクセスします。PCサイトでアクセスしてください。

https://hop.apache.org/

- ページの中央にいくと以下のセクションがあるので、例えば、Hop Web (Latest release)のアイコンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/aeb23afe-4c7a-1d12-1713-6d745957b5b1.png)

- 以下の画面が起動します。
samplesのプロジェクトが開いています。
もしも、違うProjectが選択されていたら、samplesをドロップダウンから選択してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/eb4800f2-66f5-b8b7-f661-bd0634fb086e.png)

- Welcomeダイアログをとじて、タブで開いてるデータ変換のフロー(パイプライン)を操作することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/e729a4be-5832-52b3-70ac-1a1ac219aafe.png)

- 以下のフォルダのアイコンをクリックすると他のサンプルのデータ変換の定義のファイルを開くことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/85085b6b-eb10-4397-f1ba-a490487de559.png)

例えば、transformsフォルダに、以下のサンプルがあります。ファイル名から興味のありそうな、変換を探してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/ac974273-2cae-cb8f-b9d6-bc085bab3947.png)

sort-rows-basic.hplを開くと以下のような定義が開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/9849a763-30db-d04d-a088-4986c234514b.png)

サンプルの実行方法などは、以下のページの「サンプルの変換処理を試す」を参照ください。

https://qiita.com/Tadataka_Takahashi/items/58f69ceb466a5c3a295a

# まとめ

- **公式サイトのデモサーバでHop Webを気軽に試せるようになったこと**を紹介しました。
これをみて、試していただき、**Hopの可能性、魅力をかんじていただければ幸い**です。

- 紹介したデモサーバはあくまでも一時利用を、お試しを目的としたものなので、ちゃんと使おうとおもったらJavaのバイナリ、Dockerなどでダウンロードして、環境構築して試されるのをお勧めします。



- 著者は単なるユーザの立場でこの記事を書いてます。デモサーバの公開は、2023/01/03時点の状況です。今後の利用のされかたなどで、公開のされかた変わるなど可能性はあるかもしれません。ただし、この機会によってHopの魅力に気づいてくれたり、何か学びを得られるとよいと思っております。ここ最近のレビジョンのリリース情報を見る限り、Hopのプロジェクトとしては、ユーザもふえきて、新しい開発項目にチャレンジしていて、技術的に魅力のあるOSSだと思います。データ変換処理、ソフトウェア開発などにかかわっているかたは何かしら学びがあるのではないかと思います。

- Hopの開発、関係者の人たち、デモサーバの公開、ありがとうございます。2023年度もよろしくお願いします！
Hop Webが過去のレビジョンと比較すると、とても操作しやすくなっていて、びっくりしました。

## 参考

https://www.youtube.com/@ApacheHop
ベンゼン環に数字を付与する

# 背景
簡単にベンゼン環に位置を表す数字をつけたい．


chemfigパッケージはTikZを利用して作られている．
$\to$TikZの色指定をうまく利用して背景色と同じ白にすればうまくいきそう．

# 方法
ここではパッケージやTikZの詳細については割愛する．

chemfigパッケージは結合の線を以下のようなパラメータを用いて描画している．
```
-[角度,長さの倍率,結合元原子の番号,結合先原子の番号,TikZのオプション]
```
したがって線を隠して描画するには
```
-[,,,,white]
```
とすればよい．ここで角度を持たせる際などは適宜変更する．ただし，TikZのオプションのみでの利用はできないため，前の4つの```,```は必須である．

# 利用例
- benzene
```
\chemfig{*6((-[,,,,white]5)=(-[,,,,white]4)-(-[,,,,white]3)=(-[,,,,white] 2)-(-[,,,,white]1)=(-[,,,,white]6)-)}
```
![スクリーンショット 2023-01-03 21.53.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921144/1aadf17f-6713-b95a-8c15-bc7926b71f8d.png)

この図からわかるように数字が炭素から離れてしまっている．
距離を縮めたい場合は2つ目のパラメータ(線の倍率)を用いて
```
\chemfig{*6((-[,0.3,,,white]5)=(-[,0.3,,,white]4)-(-[,0.3,,,white]3)=(-[,0.3,,,white] 2)-(-[,0.3,,,white]1)=(-[,0.3,,,white]6)-)}
```
などとすればよい(この場合は0.3倍にしている)．

- naphthalene
```
\chemfig{*6((-[,,,,white]6)=(-[,,,,white]5)-*6(-(-[,,,,white]4)=(-[,,,,white]3)-(-[,,,,white]2)=(-[,,,,white]1)--)=-(-[,,,,white]8)=(-[,,,,white]7)-)}
```
![スクリーンショット 2023-01-03 21.54.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2921144/1a35fc30-9fcd-8b6d-b33c-774097fc5e3e.png)
お正月っぽいプログラム

## はじめに
今回は、Qiita投稿のテストも兼ねて投稿を行っている。

皆さんはプログラムでハングマンというゲームを知っているだろうか。

<h1>ルール</h1>
ルールは簡単<br>
作成者が決めた文字や数字を当てるゲームになっている。
間違えると配列に格納されているハングマンの絵が1行づつ出力され最後まで出力されるとゲームオーバー
ハングマンが完成する前に当たられればゲームクリアとなる。


↓この画像見たいなイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2702878/e6c8aa52-92b4-4a0c-bc92-aaa2b4e3cff4.png)

### ハングマン（お正月Vre）
今回はこのプログラムのお正月バージョンを作成した。
といっても絵と答えが変わっただけど。。

ちなみに今回はpythonで書かれている。

```python
def keyWord(word):
    wrong = 0
    stages = ["",
        "       _〆      ",
        "      (∴)       ",
        "   (￣￣￣￣)    ",
        " ＜(￣￣￣￣￣)＞ ",
        " [二二◆二二◆二二] ",
        "　 　  |◇ ● ◇ |    ",
        "　 　  |______|    ",
        "  謹 　賀　 新　 年   ",
              ]
    rletters = list(word)
    board = ["_"] * len(word)
    win = False
    print("絵当てゲームへようこそ!")
    while wrong < len(stages) - 1:
        print("\n")
        msg = "1文字を予想してね! "
        char = input(msg)
        if char in rletters:
            cind = rletters.index(char)
            board[cind] = char
            rletters[cind] = '$'
        else:
            wrong += 1
        print(" ".join(board))
        e = wrong + 1
        print("\n".join(stages[0:e]))
        if "_" not in board:
            print("あなたの勝ち!")
            print(" ".join(board))
            win = True
            break
    if not win:
        print("\n".join(stages[0:wrong+1]))
        print("あなたの負け!正解は {}.".format(word))

keyWord("かがみもち")
```

上から作成されていき、絵が完成する前に「かがみもち」と１文字ずつ入力できれば勝ち
今回は８回間違え続けると鏡餅の絵が完成する。

## まとめ
面白いかと聞かれたら、うーんって感じ（笑）

stagesに絵を格納しているが、この絵をもっと増やしてレパートリーが多くなると多少マシかもね。
とりあえず、今回はお正月風なプログラムを作ってみた感じ！
終わり！
TerraformでAWSのIAMまわりをデプロイする

Terraformシリーズ第３弾ということで実際にどうコーディングしていくか、というのを書いていきたいと思います。まずは**IAM**から。そんなもん「Terraform Registry」見ればいいやんというツッコミが入らないよう、実際に環境を作っていて気になったポイントとかを交えつつ書いていきます:sparkles:

※過去の記事はこちら
第一弾：[TerraformでAWSリソースをデプロイしてみる](https://qiita.com/hiyanger/items/ca337f70ad4801072850)
第二弾：[TerraformでAWS環境をデプロイする前に認識しておくべきこと（tfstate.tf / providor.tf / output.tf / ディレクトリ構造）](https://qiita.com/hiyanger/items/9efdc570e6cfed5aab13)

## IAMポリシー
```
resource "aws_iam_policy" "ポリシー名" {
  name        = "ポリシー名"
  path        = "/"
  policy = file("ポリシー格納先ディレクトリ/ポリシー名.json")
}
```
シンプルなので特に気になるポイントはないですが、**path**ってなんだろうってなりました。検索かけるときに影響するものみたいです。基本はデフォルトの「/」でOK。

※pathの参考
https://dev.classmethod.jp/articles/aws-iam-with-path/

## IAMグループ
```
#IAMグループ作成
resource "aws_iam_group" "グループ名" {
  name = "グループ名"
}

#ポリシーのアタッチ（ポリシーは複数アタッチのパターンが多いので、countを使って取得させています）
resource "aws_iam_group_policy_attachment" "グループ名" {
  count = "${length(local.グループ名)}"
  group = aws_iam_group.グループ名.name
  policy_arn = "${element(local.グループ名, count.index)}"
}

#グループに追加するインラインポリシー（もしある場合）
resource "aws_iam_group_policy" "グループ名-in01" {
  name  = "インラインポリシー名"
  group = aws_iam_group.グループ名.name
  policy = templatefile("ポリシー格納先ディレクトリ/XXX.json")
}
```
コメントアウトにも記載しましたが、ポリシーは複数アタッチするパターンが多いため、**count**を使って変数から取得させています。また、インラインポリシーを追加する場合はここに追記します。

## IAMユーザー
```
#IAMユーザー作成
resource "aws_iam_user" "ユーザー名" {
  name = "ユーザー名"
}
#IAMグループへの追加
resource "aws_iam_group_membership" "IAMグループ名" {
  name = "IAMグループ名"

  users = [
    aws_iam_user.IAMユーザー名.name
  ]
  group = aws_iam_group.IAMグループ名.name
}
```
## IAMロール（EC2用の場合）
```
#assume role
data "aws_iam_policy_document" "assume_role" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["ec2.amazonaws.com"]
    }
  }
}

#IAMロール作成
resource "aws_iam_role" "ロール名" {
  name = "ロール名"
  assume_role_policy = data.aws_iam_policy_document.assume_role.json
}

#IAMポリシー付与（グループ同様複数の前提です）
resource "aws_iam_role_policy_attachment" "ロール名" {
  count = "${length(local.ロール名)}"
  role = aws_iam_role.ロール名.name
  policy_arn = "${element(local.ロール名, count.index)}"
}

#インラインポリシー付与（もしある場合）
resource "aws_iam_role_policy" "ロール名-in01" {
  name = "インラインポリシー名"
  role = aws_iam_role.ロール名.name
  policy = file("ポリシー格納先ディレクトリ/XXX.json")
}

#インスタンスプロファイル作成（EC2へのロール付与なのでインスタンスプロファイルが必要になります）
resource "aws_iam_instance_profile" "ロール名" {
  name = "ロール名"
  role = aws_iam_role.ロール名.name
}
```
ロールは他のポリシーとちょっと毛色が違いますね。そもそものIAMロールの仕組みとして以下軽く抑えておけば良いと思います。

①assumerole：Credential情報がなくても一時的にAWSリソースへのアクセスが可能
https://qiita.com/masato930/items/28f1adf9c0dd8e88fb17

②インスタンスプロファイル：EC2へのロール付与はインスタンスプロファイルが必要
https://baresupport.jp/blog/2022/06/29/142/
tunefabの定期購読を解約する方法

tunefabのサブスク解約方法は公式ホームページにも載っていないため非常にわかりづらいため、方法を共有する

注：クレジット決済でのサブスク登録（applemusic版）のため、PayPalなどの他の決済方法で可能かどうかは検証していない

必要な情報：注文時にメールで送信された注文番号

1,mycommerceにアクセスする
mycommerceはtunefabの再販業者、ここから支払い方法の変更や解約ができる
https://account.mycommerce.com/

2,パスワードの設定
初期の状態ではログイン情報が設定されていないため、ログインフォーム下部の「ユーザーデータ をお忘れの場合、またはご存知ない場合」をクリック
購入の際に使用したメールアドレスの入力を求められるため、入力して「データを要求」をクリック
メールの受信ボックスに「ユーザーアカウントデータに関するお問い合わせについて」が届くのでパスワードの再設定URLにアクセス
パスワードを設定（大文字小文字特殊文字数字を使用した12文字）

3,ログイン
2,で設定した情報を使ってログインをする
1,のURLに再度アクセスし、ユーザーネームにメールアドレス、パスワードに2,で登録したパスワードを入力してログイン

4,マイアカウントから解約処理
ログインするとマイアカウントのホームに飛ばされるので、解約する対象を確認して「参照番号」をクリックすると購読管理ページに遷移する
購読管理ページに遷移すると購入の情報の下の方に赤い「購読をキャンセル」のボタンがあるためそこから解約できる

以上
Chrome拡張機能の開発でハマったこと

自分用のちょっとしたツールを作っていたらハマったのでメモ

## 前提
- manifest_version: V3

## ハマったこと
### クリックイベントが無視される
`default_popup`が設定されていると`service_worker`で指定したJSの`onClicked`イベントは無視されます。
```json:manifest.json
  "action": {
    "default_title": "My Bookmarks",
    "default_icon": "icon.png",
    "default_popup": "popup.html" // これがあると無視される
  }
```
**popup.html** で使用したい`onClicked`イベントが記述されたJSは、`service_worker`経由ではなく、普通にhtmlから読み込むようにしましょう。

### ログの確認方法
Chrome拡張機能で`console.log()`しても、通常のWebページ用のデベロッパーツールにはログは出力されません。

**popup.html** を使用している場合は、表示されたポップアップ画面を右クリックして「検証」からDevToolsを起動するか、
もしくは`chrome://extensions`の「ビューを検証」をクリックして確認する必要があります。

### その他
- ブラウザ操作系が動かない時は **manifest.json** の`permissions` や `host_permissions` をまず疑え

- **popup.html** を使用している場合は、DOMが読み込まれる順にも注意
これは当たり前すぎますが、サンプルを参考にJavascriptだけガリガリ書いていたら結構ハマったの参考まで

## 参考
https://github.com/GoogleChrome/chrome-extensions-samples
node.jsの基本知識を整理

# node.jsとは
javascriptは本来ブラウザでのみ実行可能な言語である。
しかしnode.jsを使えば、PCやサーバなどのマシン上でJavascriptを実行することが可能になる。（ブラウザ以外でもjavascriptを実行可能）

javascriptは`v8`というエンジンで実行することができ、ブラウザにはこの`v8`のエンジンが組み込まれている。しかし、node.jsにも`v8`のエンジンが組み込まれているため、javascriptを実行することができる。


# javascriptの実行の流れ
① javascriptのコードを`v8`のエンジンが読んで、機械語に変換する。
② CPUやRAMは変換された機械語の実行する。

# javascriptの実行環境の違い
### ① ブラウザ
ECMAScriptを使用
Web APIを使用可能

### ② node.js
CommonJSを使用
Web APIは使用不可


# node.jsの利用場面
・Webサーバとして利用可能
・フロントエンドのビルド環境として利用可能

# node.jsのバージョンの意味
### 偶数バージョン
・長期サポートが行われているバージョン
・以下の3つのStopの期間が設けられている。
|step|内容|
|---|---|
|current|重要ではない変更事項の対応期間|
|active|新しい昨日の追加やセキュリティのバグの修正を行う期間|
|maintenance|脆弱性に対応する習性が発生する場合の期間|

### 奇数バージョン
試験的に行われているバージョン（新しい機能を追加するためのバージョンであるため長期サポートはなし）

# node.jsでのモジュール
nodejsでは複数のモジュールを管理することができる。
モジュールは、ソースコードを機能ごとに分割した一つの単位のこと。
javascriptだと、一つのファイルごとに機能を分割したことを意味する。
nodejsでは基本的にはCommonJsとESmoduleの方式でモジュールを管理している。
CommonJsでモジュールを作成する際には、拡張子を`XXX.cjs`にすること。

ESmoduleを利用したい場合は、package.jsonに以下のように追記する。
```json:package.json
{
  "type": "module"
}
```
または、ファイルの拡張子を`XXX.mjs`にする。


# CommonJs
・node.jsの独自の仕組み（ESmoduleが発表される前から使用）
・ブラウザでは使用不可
・module.export, requireと記載してmoduleとして利用する。

# ESmodule
・ECMAScriptの標準
・ブラウザで使用可能
・nodejsで使用する場合には、明示的に指定する必要がある。
・export, importが使える。
Databricksにおけるジョブ失敗のトラブルシュートとリペア

[Troubleshoot and repair job failures \| Databricks on AWS](https://docs.databricks.com/workflows/jobs/how-to-fix-job-failures.html) [2022/12/7時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

Databricksジョブ実行において、(メール通知や監視ソリューション、DatabricksジョブのUIなどを通じて)タスクが失敗したという通知を受け取ったものとします。本書のステップでは、ジョブ実行に失敗した理由を特定するのか、特定した問題の修正に関する提言、そして、どのように失敗したジョブ実行をリペアするのかのガイドを提供します。

# 失敗の原因の特定

DatabricksジョブのUIで失敗したタスクを特定するには:

1. サイドバーの![](https://docs.databricks.com/_images/jobs-icon.png)**ワークフロー**をクリックします。
1. **名前**の列でジョブ名をクリックします。**ジョブの実行**タブにはアクティブなジョブ実行、失敗したものを含む完了したジョブ実行が表示されます。
1. マトリックススビューに切り替えるには、**マトリックス**をクリックします。魔トリックビューには、それzれおのジョブタスクの成功、失敗を含むジョブの実行履歴が表示されます。マトリックスビューを用いることで、ジョブ実行で失敗したタスクをクイックに特定することができます。
![](https://docs.databricks.com/_images/job-runs-matrix-view.png)
1. 関連メタデータを確認するために失敗したタスクの上にマウスカーソルを移動します。メタデータには、開始日、終了日、期間、クラスター詳細、エラーメッセージが含まれています。
1. 失敗の原因の特定を行うために、失敗したタスクをクリックします。**タスク実行の詳細**ページが開き、タスクの出力、エラーメッセージ、メタデータが表示されます。

# 失敗の原因の修正

あなたのタスクは、データ品質問題、設定ミス、不十分な計算リソースなどあらゆる理由によって失敗することがあり得ます。以下には、タスク失敗における一般的な問題修正のステップを示しています。

- 失敗がタスク設定に関連している場合には、**タスクを編集**をクリックします。新規タブでタスク設定ページが開きます。必要に応じてタスク設定を更新し、**タスクを保存**をクリックします。
- 問題が不十分なインスタンスなどクラスターのリソースに関連している場合には、いくつかの選択肢があります:
    - ジョブがジョブクラスターを使うように設定されている場合には、共有all-purposeクラスターを使うことを検討します。
    - クラスター設定を変更します。**タスクを編集**をクリックします。クラスターを設定するために、**ジョブの詳細**パネルの**クラスター**の下の**設定**をクリックします。ワーカー数、インスタンスタイプ、その他のクラスター設定オプションを変更することができます。また、他のクラスターにスイッチするために**切り替え**をクリックすることもできます。利用可能なリソースを最適に活用できるように、[クラスター設定のベストプラクティス](https://qiita.com/taka_yayoi/items/ef3dc37143e7b77b50ad)をご覧ください。
    - 必要であれば、クラウドアカウントやワークスペースがデプロイされているリージョンのリソースクオータを引き上げることを管理者に依頼してください。
- 失敗が同時実行数の最大値を超えたことによって引き起こされているのであれば、以下のいずれかを行います:
    - 他のジョブ実行が完了するのを待ちます。
    - **タスクを編集**をクリックします。**ジョブの詳細**パネルの**同時実行ジョブを編集**をクリックし、**同時実行可能な最大ジョブ数**に新たな値を入力し、**確認**をクリックします。

特には失敗の原因が外部データソースが利用できないなど、ジョブの上流の存在することがあります。外部の問題が解決した後には、次のセクションで説明されているジョブ実行のリペアを活用することができます。

# 失敗し、スキップされたタスクの再実行

Databricksジョブの[リペア、リラン](https://qiita.com/taka_yayoi/items/b3275a1983c51a8bbe1a#%E6%88%90%E5%8A%9F%E3%81%97%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%82%B8%E3%83%A7%E3%83%96%E5%AE%9F%E8%A1%8C%E3%81%AE%E3%83%AA%E3%83%9A%E3%82%A2)機能によって、失敗したタスクやスキップされたすべての後段のタスクを再実行することができます。失敗の原因の修正した後は、以下のステップでジョブ実行をリペアすることができます:

1. **完了済みの実行アイテム (過去60日)**の**開始時刻**カラムにある失敗ジョブ実行のリンクをクリックするか、マトリックスビューで失敗したタスクをクリックします。**ジョブ実行の詳細**ページが表示されます。
1. **ジョブ実行を修復**をクリックします。**ジョブ実行を修復**ダイアログが表示され、再実行されることになるすべての失敗タスクと依存タスクが一覧されます。
1. 修復するためにタスクのパラメーターを追加、変更するには、**ジョブ実行を修復**ダイアログでパラメーターを入力します。**ジョブ実行を修復**ダイアログで入力したパラメーターは既存の値を上書きします。以降の修復ジョブ実行では、**ジョブ実行を修復**ダイアログのキーバリューをクリアすることでオリジナルの値に戻すことができます。
1. **ジョブ実行を修復**ダイアログの**ジョブ実行を修復**をクリックします。
1. 修復ジョブが終了すると、修復ジョブ実行の新規カラムでマトリックスビューが更新されます。赤色だったすべての失敗タスクが、ジョブ全体の実行を成功したことを示す緑色に変わっているはずです。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
GPT-3 APIの出力結果に、予期しない改行が挿入されている場合の対処法

# 課題
　GPT-3 APIを使用したサービスを作っているときに、出力結果に予期しない改行が挿入される問題が発生しました。
　GPT-3 API 出力結果 改行 いらない」などで検索しても、解決方法がすぐに出なかったため、ここで共有させていただきます。
　予期しない場合に改行が発生したケースは、以下のような場合です。出力結果の先頭に、改行が2回されています。
![Chill_Guys 2023_01_03 20_55_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3082957/b48a65b2-4672-cf95-fb04-6dd1fcaf3d39.png)

# 結論
結果の文字列に対して、改行を""(空文字列)に置換する。

# 具体的なコード（GASを使用している場合）
結果の文字列は、`json["choices"][0]["text"]`です。
```javascript:変更前
      return json["choices"][0]["text"];
```

```javascript:変更後
      //結果の文字列をpre_resultsに入れる
      pre_results = json["choices"][0]["text"];
      //デフォルトで入っているすべての改行を、""（空文字）と置き換える
      results = pre_results.replace(/\n/g, "");
      return results;
```
正規表現の `\n` は、改行を表す特殊文字です。g オプションを指定することで、文字列中のすべての改行を置き換えることができます。

上記のコードを実行すると、`results`変数に、改行が空文字列に置き換えられた文字列が格納されます！


# 具体的なコード（Pythonを使用している場合）
`response['choices'][0]['text']`に、結果の文字列が入ってます。

```python:変更前のviews.py
results = response['choices'][0]['text']
```

```python:変更後のviews.py
# GPT-3 APIからの結果を、文字列として取得
pre_results = response['choices'][0]['text']
# デフォルトで入っている'/n'を、"”(空文字列)と置き換える
results = pre_results.replace("\n", "").replace("\r", "")
```
基本的に改行は`\n`で表現するので、`.replace("\n", "")`としています。
しかしWindows の場合は、改行には `\r\n` が使われることがあるため、上記のように `.replace("\n", "").replace("\r", "")`とすることで、`\r` も空文字列に置き換えるようにしています。

# 最後に
　今回は、GPT-3 APIを使用するサービスで、予期しない改行が挿入された場合の対処法を紹介しました。
　主に、GASとPythonでGPT-3 APIを使用しているので、この2つの場合の例を示しましたが、「結果の文字列に対して、改行を""(空文字列)に置換する」という基本的な方針はほかの言語でも使用できると思われます。ぜひ試してみてください！
　最後までお読みいただき、ありがとうございました！
【わたし気になります！】RailsのArray#forty_two

Ruby on Railsを用いて開発をしていると、配列の先頭の要素を取得するメソッドや2番目の要素を取得するメソッドなど、特定の位置にある要素を取り出すメソッドをよく使います。
```ruby
array = %w(apple banana orange lemon grape)
array.first # apple
array.second # banana
array.last # grape
```

実際、私はこの3つくらいしか使ったことがないですが、他にもRailsの拡張により、多くのメソッドが用意されています。

```ruby
array.first # 先頭の要素を取得
array.second # 2番目の要素を取得 
array.third # 3番目の要素を取得 
array.fourth # 4番目の要素を取得 
array.fifth # 5番目の要素を取得 
array.forty_two # 42番目の要素を取得 
array.third_to_last # 最後から3番目の要素を取得 
array.second_to_last # 最後から2番目の要素を取得 
array.last # 最後の要素を取得 
```


......？
`forty_two`といういつ使われるか全くわからないのがいます。。。

この存在がとても気になったので、今回はRailsの`forty_two`メソッドについて考察します。

### コミットログを見てみる
まず、`forty_two`が追加されたときのコミットログを見てみます。

タイトルは「Reduced the number of literal aliases to the range that has actually seen personal use. With the massive savings in overhead, I was able to fit Array#forty_two」で、後半部分を読んで思わず「なんでやねん」と言ってしまいました。
そして、コメントの中には「これを待っていたんだ！」「最高！」といった発言もあり、盛り上がっている様子が見られます。

[参考]
https://github.com/rails/rails/commit/e50530ca3ab5db53ebc74314c54b62b91b932389#activesupport/lib/active_support/core_ext/array/access.rb


### 42の元ネタ
先程見たコミットログのコメントで説明している人がいましたが、42という数字が用いられた背景には「The Hitchhiker’s Guide to the Galaxy」という作品の存在があります。

この作品の中で、スーパーコンピュータに「生命、宇宙、そして万物についての究極の疑問の答え」を計算させるというシーンがあり、そのスーパーコンピュータが750万年の末に出した答えが、「42」なのです。

これにより、「42」という数字はSFファンの中で有名になり、Rubyのメソッドにも使われるようになったのです。


### その他にも42が使われている？！
プログラミング言語の中でforty_twoメソッドが用意されているのはRailsのみのようですが、他にも42は色んなところでネタとして使われています。

例えば、Googleで「生命、宇宙、そして万物についての究極の疑問の答え 計算」と検索すると42という結果が出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644489/1a85373a-2112-99ba-73bb-ad430c58f1de.png)
そして、もちろん「5 + 生命、宇宙、そして万物についての究極の疑問の答え」は「47」になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644489/abc61d28-a184-eb1d-81f7-fc504e8978cb.png)

また、Siriに「人生ってなに？」と尋ねると「42.」と返ってきます。
![IMG_3546.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2644489/670a9c53-f6d2-1d32-162d-09d3be86710e.jpeg)

このように42ネタは広く愛されているようです。

### まとめ
今回RailsのArray#forty_twoを発端として42というネタについて調べてきました。私はITに触れてまだ半年ですが、こういうネタにも精通して業界の文化もたくさん知りたいなぁと思います。
麻雀で学ぶTypeScript 2

前回：[麻雀で学ぶTypeScript　補足説明](https://qiita.com/bonetaro/items/5d3562f698e83e98cde8)
ソースコード：https://github.com/bonetaro/mahjong-ts

なんとか局の進行ができるところまで実装しました。
動作イメージは以下です。
![スクリーンショット 2023-01-03 205751.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4989/d7e78e67-1388-d10d-eda9-c7a3cb59ecd8.png)

入力処理に思ったより手こずりました。
さらに鳴きの処理やアガリ判定なども未実装で、まだまだ完成は程遠いです。

ここでアガリ判定や向聴数計算処理を実装することもできますが、キリよく鳴きの処理を実装してからにしようかと思います。

今回はあまり技術的な学びところはあまりないですが、単体テスト(jest)をどうカバレッジ高くしていくかのお勉強が必要そうです。せっかくTypeScriptを使っているのに型の恩恵や言語の特長を活かせてないんでしょうね（もともと活かせるスキルがあるのだろうか）。

まあ、アウトプットにもなってますし、これを勉強しなおす題材にできればいいんですが・・。
zshのスタートアップファイルについて

ユーザーズガイドの2章に記載されています。
[A User's Guide to the Z-Shell](https://zsh.sourceforge.io/Guide/)

2.1でシェルのタイプとしてインタラクティブシェルとログインシェルの説明があります。「インタラクティブ」とは、プロンプトでコマンドを入力して各コマンドが実行されるのを待つケースです。「非インタラクティブ」とはファイルからコマンドを読んで実行するようなケースです。ログインシェルは、最初にコンピュータにログインするときのシェルのことです。などなど…。
[2.1 Types of shell](https://zsh.sourceforge.io/Guide/zshguide02.html#l7)

2.2にすべてのスタートアップファイルについて説明があります。
[2.2 All the startup files](https://zsh.sourceforge.io/Guide/zshguide02.html#l9)
<dl>
    <dt>/etc/zshenv</dt><dd>どのzshでも常に(always)実行される</dd>
    <dt>~/.zshenv</dt><dd>どのzshでもたいてい(usually)実行される</dd>
    <dt>/etc/zprofile</dt><dd>ログインシェルで実行される</dd>
    <dt>~/.zprofile</dt><dd>ログインシェルで実行される</dd>
    <dt>/etc/zshrc</dt><dd>インタラクティブシェルで実行される</dd>
    <dt>~/.zshrc</dt><dd>インタラクティブシェルで実行される</dd>
    <dt>/etc/zlogin</dt><dd>ログインシェルで実行される</dd>
    <dt>~/.zlogin</dt><dd>ログインシェルで実行される</dd>
</dl>

* ホームディレクトリのスタートアップファイルは、`$ZDOTDIR`で設定されるディレクトリにあるスタートアップファイルが優先されます。
* zprofileとzloginはどちらもログインシェルで実行されますが、実行される順序が違います。zprofileはzshrcが実行される前に、zloginはzshrcが実行された後に実行されます。

他にも`NO_RCS`の説明やzlogoutの説明があります。
とりあえずzprofileとzshrcに記載すれば問題なさそうですね。
『イミュータブルデータモデルで始める実践データモデリング』感想

:::note warn
書籍の感想です。
:::

# 読んだ記事

『イミュータブルデータモデルで始める実践データモデリング』

掲載：WEB+DB PRESS Vol.130 特集１
著者：川島義隆

https://gihyo.jp/magazine/wdpress/archive/2022/vol130

# 感想

## 概念と実装を区別する

ER図を書く/書かれていることは多いですが、ほぼ物理レベルになっています。物理レベルになると技術的な都合がいろいろと入ってきてしまい、本来求められる形が見えにくくなってしまいます。なのでできる限りWhyとして論理レベルも残しておくのが良いと思っています。
（とはいえ物理レベルで考えがちなので、うまく実装を切り離して論理レベルを考えるようにしたいところ）

## ２つの複雑さ

ソフトウェアでも、小さな１つのクラスにカプセル化するのは「単一のエンティティに内包される複雑さ」を解決するため、と考えられます。一方これに難色を示してトランザクションスクリプトにするのは「エンティティの数の多さからくる複雑さ」を気にしてのことだと思います。複雑さを議論する場合はどちらの複雑さについての話なのか認識を合わせたほうが良さそうです。

また、この「２つの複雑さ」は「モノリスと分散システム（マイクロサービス）」にも当てはまりそうです。マイクロサービスにしても生来的複雑さは変わらないので、それをコントロールする力はどうしても必要になるでしょう。

## 変更日時

とりあえずで付けがちな「変更日時」ですが、自身の経験からも実際に役に立ったことはありません。
データベースに履歴を残すほどでなければ、アプリケーションログにでも出力したほうがまだ有用な情報を残せると思います。

## マスタ/トランザクションとリソース/イベント

テーブルの接頭辞に「M_」や「T_」を付けたプロダクトに関わったことがありますが、これらの分類について明確な基準は示されていませんでしたし、実装上も接頭辞以外の違いは見て取れませんでした。なので、結局これらを元に何かの判断をしたことはありませんでした。
曖昧なマスタ/トランザクションといった分類よりも、リソース/イベントに注目した方がどのように扱うべきなのか分かりやすいと思います。

# やってみた

掲載されていたモデルについて、単一エンティティと分割されたエンティティそれぞれで実装してみました。

https://github.com/blue32a-sandbox/immutable-database

残念ながらがこのくらいの規模ではそれほど複雑にはならないものの、単一エンティティの方では**更新するカラムを間違えてしまうことがありました**。。一方で分割されたエンティティの方はイベントごとにテーブルが分かれるのでそうした間違いはありませんでしたが、テーブルをJOINすることが多いので、テーブルが多くなるとこのあたりが課題になりそうです。

今回はやれませんでしたがイベントソーシングパターンも関心があるので今後の課題とします。

# まとめ

イミュータブルなデータベース設計については『[現場で役立つシステム設計の原則](https://gihyo.jp/book/2017/978-4-7741-9087-7)』でも解説されていますが、こちらは物理レベルが中心です。それ対してこちらの記事は論理レベルが中心で、モデリングを通してコミュニケーションしたり分析したりするための方法について学ぶことができました。

また複雑さについてうまく説明できないモヤモヤした部分があったので、「２つの複雑さ」という見方がその解決になりそうです。
UnityでFungusを使って会話シーンを作る

Unityの会話イベントとしてよく使われるFungusについて
記事はたくさんUPされていますが、備忘含めて
改めて使い方を書き出しておきます。

## 環境
Unity 2021.3.10f1
Windows 11
Fungus

Fungus先生、いつの間にか2021verにも対応してくれています。
oculusでも余裕で動いてくれる、無料で高性能なツールだなと（感謝

https://github.com/snozbot/fungus

## 初期設定
まずはFungusをインポートします。
今回はテストなので必要な分だけを選択しています。
![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/5696738a-890d-3e75-ad38-4f55243bf377.png)

その後メッセージが出てきますが、こちらは真ん中を選択しています。

![bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/79d10556-f9de-81f3-04d1-03e30c76e749.png)

次に、Fungusの管理画面を作ります。
Tool＞Fungus＞FlowChart　を選択します。

![cc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/2674e377-77a4-5308-bd4f-d0e0f3065e62.png)

また、メッセージを表示させる部分を構成するため、Say Dialogも選択しておきます。

![dd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/b9e2e841-b1fd-ec03-efc5-fa8f6d4d3baa.png)

今回はOculusに入れ込みたいので、CanvasのRendererModeをWorldSpaceに変更して
よしなに大きさを変えておきます。

これでいったん準備完了です。

## 会話内容を作る
HierarchyにあるFlowChartを選択すると、Inspectorに「OpenFlowchartWindow」というボタンが出てくるので、そちらを押します。

![ee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/ee622a9f-a0ef-8a1b-a3aa-6afb1d2b9272.png)

すると、FlowChartの画面が出てくるのでここから設定をしていきます。

![ff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/7b8ad120-fdec-1c20-6fbd-a5d1af2cc0e2.png)

FlowChartの画面にある「New Block」を押すと、Inspectorが切り替わるので
右下にある「＋」を押して「Narrative/say」を選択します。

![gg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/95f407bd-68eb-b40a-e02f-cf6d5ba532c1.png)

すると、上側のCommandsに「Say」という項目が追加されますので
その部分をクリックします。

![hh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/0959ee18-5a61-cf49-d555-7e08a608f9fe.png)

後はテキスト文字を入れつつ、適宜「＋」ボタンを押すことで会話の追加や
イベント処理を実行することができます。

その後の処理は先達がたくさん記事を置いていただいているため
割愛しておきます。

https://unity.moon-bear.com/dragons-and-knight/talk1-fungus/

https://qiita.com/Kirikabu_ueda/items/bfc6e086d408b1cba34b

https://wisteria-sophy.com/540/unity_basis6/


もう少し仲良くなるとこんな感じにできます（まだ途中

https://twitter.com/hidaka_2022/status/1610246072206778368?s=20&t=emoQumFDMDwrjy5TiptGJQ
【Kotlin】関数に書いてあるUnitとは

# はじめに
プログラミング学習中の[@kat_log](https://twitter.com/kat__log "Twitter")と申します。

Kotlinの学習をし始め、ちょっとした学びや驚きもアウトプットしておこうと思い記事にしました🙇

関数に書いてある（ことがある）`Unit`についてです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/e6bb1b7a-8490-5013-62e2-2b85ce13ffb7.png)

# 結論
関数に戻り値が無い場合に記載するものです。

# Kotlinの関数
Kotlinでは関数を

```Kotlin
fun 関数名 (仮引数名: 引数の型, ...): 戻り値の型 {
    //処理
}
```
といった形で**戻り値の型**も記載します。

ところが関数には戻り値が無い、不要な場合もあると思います。
そういった、戻り値が無い関数の場合に戻り値の型の部分に`Unit`と記載します。

:::note info
Kotlinでは基本的に戻り値の型の宣言が必要なようですが
`Unit`は省略も可能みたいです。
:::

```Kotlin
fun sayHi (name: String): Unit {
    println("Hi, ${name}!")
}
```

こちらを以下のように書き換え可能です！
（`Unit`省略しただけです…！😅）

```Kotlin
fun sayHi (name: String): {
    println("Hi, ${name}!")
}
```

# おわりに
お読みいただきありがとうございました。
自分と同じく初学者の参考になれば嬉しいです。
一緒に頑張っていきましょう〜😄

# 参考
https://www.udemy.com/course/kotlin-beginner/
【Rails】SNS機能で相互フォロー一覧を取得する

フォロー一覧、フォロワー一覧を実装する記事はよく見かけるのですが、相互フォロー一覧を取得する実装は見かけなかったので、今回記事にしました。

## 前提
基本的なフォロー・フォロワー機能がすでに実装してあることが前提となります。
具体的には以下のような実装を前提としています。

## モデル

```ruby: user.rb
class User < ApplicationRecord
  has_many :relationships, class_name: 'Relationship',
                           foreign_key: 'follower_id',
                           dependent: :destroy,
                           inverse_of: :follower
  has_many :reverse_of_relationships, class_name: 'Relationship',
                                      foreign_key: 'followed_id',
                                      dependent: :destroy,
                                      inverse_of: :followed
  has_many :followings, through: :relationships, source: :followed
  has_many :followers, through: :reverse_of_relationships, source: :follower

  def follow(other_user_id)
    relationships.create!(followed_id: other_user_id)
  end

  def unfollow(other_user_id)
    relationships.find_by(followed_id: other_user_id).destroy!
  end

  def following?(user)
    followings.include?(user)
  end
end
```
実装は、以下の記事を参考にしました。
[[Rails]フォロー、フォロワー機能](https://qiita.com/nakachan1994/items/e6107fe3003f6515e385)

## 相互フォロー一覧の取得
結論から書くと、以下の実装で相互フォロー一覧が取得できます。
```ruby: user.rb
def mutual_followings
  followings & followers
end
```

順番に見ていきましょう。
まず`followings(followers)`とすることで、ユーザーに紐づく`フォロー(フォロワー)一覧`を取得できます。
なぜなら`Userモデル`と`Relationshipモデル`を関連付けをしているからです。

以下の部分です。
```ruby
has_many :followings, through: :relationships, source: :followed
has_many :followers, through: :reverse_of_relationships, source: :follower
```

で、`followings & followers`と書くことでどのような状態となっているかというと、

```ruby
# followings のレスポンス & followers のレスポンス
[object, object, object] & [object, object, object]
```

このようになっています。
`&`演算子を使うことで両方の配列に含まれる要素からなる新しい配列を返します。

```ruby: 例
[1, 1, 2, 3] & [3, 1, 4] #=> [1, 3]
```
_Ruby3.2リファレンスマニュアルから引用_

つまり、**自分がフォローしている、かつ自分をフォローしてくれている(相互フォロー状態)のユーザー一覧**を取得できるということです。

## 参考資料
[Ruby 3.2 リファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/method/Array/i/=26.html)
[[Rails]フォロー、フォロワー機能](https://qiita.com/nakachan1994/items/e6107fe3003f6515e385)
ipv6-literal.net に変換するスクリプト

Windows で UNC アクセスする際に IPv6 のアドレスを簡単に変換したい時に使うシェルスクリプトを書いてみた。

```shell:ipv6-literal.net.sh
#!/bin/sh
if=`ifconfig | grep inet6 | sed 's|^.*inet6 \(.*\) p.*|\1|' | awk -F% '{print$1".ipv6-literal.net"}'`
for adrs in $if
    do
    echo $adrs
done
exit
```
Microsoft Azure - API Management Service: Policy を使ってリクエストを Slack へ投稿する

Microsoft Azure の API Management Service で、 API Management Service に来た POST リクエスト (Content-Type: "application/json") を Slack へ投稿する場合の Policy を紹介します。

Slack への投稿には Incoming WebHook を使うものとします。

## サンプル

inbound の記述を追加します。

```xml
<policies>
    <inbound>
        <base />
        <set-body template="none">@{ 
            JObject inBody = context.Request.Body.As<JObject>(); 
            string message = JsonConvert.SerializeObject(inBody, Newtonsoft.Json.Formatting.Indented);
            
            JObject jObject = new JObject();
            jObject["channel"] = "#channel_name";
            jObject["icon_emoji"] = ":ghost:";
            jObject["text"] = "```\n" + message + "\n```";
            jObject["username"] = "Something";
            return jObject.ToString();
        }</set-body>
        <rewrite-uri template="/xxxxxxxxxxxxxxxxx" copy-unmatched-params="false" />
        <set-backend-service base-url="https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxxx" />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>
```

`set-body` の中で、 body の変換を行います。 ここでは もともとのリクエストがJSONということにしていますが、 `context.Request.Body.AsFormUrlEncodedContent()` を使うとフォームのデータも取得できます。

`JsonConvert.SerializeObject(inBody, Newtonsoft.Json.Formatting.Indented)` は、リクエストのボディにあるJSONを読みやすい形にフォーマットしています。

改めてJSONの文字列を作成するため、 `jObject` を生成して新しいJSONを作成します。 最後には、 `ToString()` で文字列への変換が必要です。

`rewrite-url`, `set-backend-service` で Slack の WebHook のURLを設定しています。 `base-url` と `template` をつなげたものがPOST送信先のURLになります。

## 補足

Path の中でのパラメータ、たとえば `/test/{id}` の中での `id` を取得する場合は次のようにして値を取得できます。

```csharp
context.Request.MatchedParameters["id"]
```

クエリパラメータは次のように取得できます。

```csharp
context.Request.Url.Query.GetValueOrDefault("param_name", "default_value")
```

## 参考

* [API Management の変換ポリシー](https://learn.microsoft.com/ja-jp/azure/api-management/api-management-transformation-policies)
* [API Management policy expressions](https://learn.microsoft.com/en-us/azure/api-management/api-management-policy-expressions)
react-hook-formとuseRefを併用したい

# 経緯

RHFはinputにrefを渡す必要があるが、独自にrefを渡したい場合、1つのコンポーネントに複数のrefを渡す必要があるので困っていた。

# 結論

公式ドキュメントに書いてあった

https://www.react-hook-form.com/faqs/#Howtosharerefusage

# 解説

ポイントは2箇所

1.refはコールバックにできた

https://ja.reactjs.org/docs/refs-and-the-dom.html#callback-refs

```TSX
<input {...rest} name="firstName" ref={(e) => {
	ref(e)
	firstNameRef.current = e // you can still assign to ref
}} />
```

2.nullとのUnionにすることで、currentプロパティがreadonlyではなくなる。

```TSX
const firstNameRef = useRef<HTMLInputElement | null>(null);
```
Qiita の疑似新着一覧


# これはなに？

Qiita の新着一覧 `https://qiita.com/items` が[停止](https://blog.qiita.com/close-item-list-page/)してしまったので、[先人の知恵](https://qiita.com/rana_kualu/items/83dbe4c9972d2e255e22)を参考に作ってみたものです。

# Qiita の全記事一覧

* [Qiita の全記事一覧](https://qiita.com/search?sort=created&q=created%3A%3E1970-01-01)

# 今週の記事

未来日付の物もあります。ご注意ください。

* [2025-06-28 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2025-06-28)
* [2025-06-27 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2025-06-27)
* [2025-06-26 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2025-06-26)
* [2025-06-25 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2025-06-25)
* [2025-06-24 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2025-06-24)
* [2025-06-23 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2025-06-23)
* [2025-06-22 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2025-06-22)


# 先週の記事

* [2025-06-21 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2025-06-21)
* [2025-06-20 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2025-06-20)
* [2025-06-19 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2025-06-19)
* [2025-06-18 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2025-06-18)
* [2025-06-17 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2025-06-17)
* [2025-06-16 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2025-06-16)
* [2025-06-15 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2025-06-15)


# 約１年前の記事

* [2024-06-29 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2024-06-29)
* [2024-06-28 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2024-06-28)
* [2024-06-27 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2024-06-27)
* [2024-06-26 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2024-06-26)
* [2024-06-25 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2024-06-25)
* [2024-06-24 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2024-06-24)
* [2024-06-23 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2024-06-23)


# 約３年前の記事

* [2022-06-25 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2022-06-25)
* [2022-06-24 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2022-06-24)
* [2022-06-23 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2022-06-23)
* [2022-06-22 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2022-06-22)
* [2022-06-21 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2022-06-21)
* [2022-06-20 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2022-06-20)
* [2022-06-19 の記事一覧](https://qiita.com/search?sort=created&q=created%3A2022-06-19)
Rubyで二分岐検索を書いてみる

## 環境
Ruby2.6

## はじめに
Rubyで書いた二分岐検索のコードについて、解説したいと思います。二分岐検索とは、簡単にいえば、たくさんのデータの中から探したいデータを、効率的に検索するためのアルゴリズムです。プログラミング言語を学習するとき、一度くらいは、二分岐検索のコードを書いたことがある人は多いかと思います。しかし、二分岐検索のアルゴリズムそのものは、仕事で使うことは殆どないかと思います。折角学習しても、殆どの人は、役に立てることがありません。それでも、言語の学習教材としては、うってつけのアルゴリズムだとは思います。

二分岐検索の詳細についてはこちらをご参照ください。
https://e-words.jp/w/%E4%BA%8C%E5%88%86%E6%8E%A2%E7%B4%A2.html

## コードの解説

```
gets.chomp.to_i
```
標準入力で入力した値を取得して、数値に変換します。getsしただけでは、改行コードがついているため、chompで改行コードを取り除きます。

```
ary.sort!
```
ランダムに作った配列を昇順にソートします。

```
mid = (str + fin) / 2
```
配列から真ん中の要素数を取得します。例えば、[1,2,3]の場合、真ん中の要素数は1です。[1,2,3,4,5]の場合は2になります。

```
when ary[mid] <  n then
    str = mid +1
```
配列の真ん中の要素と検索したい数値とを比較して、検索したい数値の方が大きい場合、真ん中の要素より下にある要素は、全て検索対象からごっそりと除外します。これで検索にかかる労力が半分になります。

```
when ary[mid] >  n then
    fin = mid -1
```
配列の真ん中の要素と検索したい数値とを比較して、検索したい数値の方が小さい場合、真ん中の要素より上にある要素は、全て検索対象からごっそりと除外します。これで検索にかかる労力が半分になります。

```
while str <= fin
```
while文でループさせながら、検索したい要素が存在する範囲を少しづつ、絞り込んでいきます。

```
when ary[mid] == n then 
    ans = mid
    break
```
検索したい要素を絞り込んでいった結果、遂に、検索したい要素が見つかれば、ループ処理から抜けます。

## コード

```ruby.rb
n = gets.chomp.to_i
ary = [1,6,44,99,3,56,74,12,89,45,80,7,34,56]
ary.sort!

# 初期化
ans = nil
str = 0
fin = ary.count - 1
mid = 0

while str <= fin

    mid = (str + fin) / 2

    case 
        when ary[mid] == n then 
            ans = mid
            break
        when ary[mid] <  n then
            str = mid +1
        when ary[mid] >  n then
            fin = mid -1
    end
end
if ans.nil? 
    puts "要素がありません"
else
    puts "#{ary}"
    puts "#{n}は上記配列の "+ ans.to_s + "番目の要素に存在します"
end
```

## 実行結果

```
[1, 3, 6, 7, 12, 34, 44, 45, 56, 56, 74, 80, 89, 99]
6は上記配列の 2番目の要素に存在します

[1, 3, 6, 7, 12, 34, 44, 45, 56, 56, 74, 80, 89, 99]
74は上記配列の 10番目の要素に存在します
```
Ethernet, TCP/IP, Some/IP, DoIP, MACsec and Firewall

# Ethernet 関連

Specification of Time Synchronization over Ethernet, No.676, CP, AUTOSAR R22-11 新

https://qiita.com/kaizen_nagoya/items/ad6cf51771c05eabc505

Specification of Ethernet State Manager, No.415, CP, AUTOSAR 22-11(2)

https://qiita.com/kaizen_nagoya/items/c1184d1f5f7c0f4d8de6


Specification of Ethernet Interface, No.417, CP, AUTOSAR R22-11(2)

https://qiita.com/kaizen_nagoya/items/1371d63ae808c53c3e08



Requirements on Ethernet Support in AUTOSAR, No.419, CP, AUTOSAR 22-11(2)

https://qiita.com/kaizen_nagoya/items/b5a5421fc1a91588da5a


Specification of Ethernet Transceiver Drive, No.431, CP, AUTOSAR R22-11(2)

https://qiita.com/kaizen_nagoya/items/f8e85c9b3113a7de4d52


Specification of Ethernet Switch Driver, No.656, CP, AUTOSAR 22-11 新

https://qiita.com/kaizen_nagoya/items/94a467cc0aa1d7d90296


Specification of Time Synchronization over Ethernet, No.676, CP, AUTOSAR R22-11 新

https://qiita.com/kaizen_nagoya/items/ad6cf51771c05eabc505



# TCP/IP関連


# MACsec 関連文書



# Firewall 関連文書

Explanation of Adaptive Platform Design,  No.706,


# Some/IP 関連文書　



Specification of SOME/IP Transformer, No.660, CP, AUTOSAR R22-11 新

https://qiita.com/kaizen_nagoya/items/df3c5a100c7546f48511


SOME/IP Protocol Specification,, No.696, FO, AUTOSAR R22-11 新

https://qiita.com/kaizen_nagoya/items/4c5db71c51716d26291e

# SOVD


# DOIP 関連

Specification of Diagnostic over IP, No.418, CP, AUTOSAR R22-11(2)

https://qiita.com/kaizen_nagoya/items/763cc1f172c64ebda2f7
SSH接続でUSBメモリを使いたいとき

ssh接続でusbメモリを扱いたいときの手順。忘れがちなので備忘録として。

手順1:lsblk -fでファイルシステムの情報を確認
手順2:sudo mount /dev/sdb1 /media/任意のマウントポイント --types=ファイルシステムで確認したフォーマット --options=rw