OmniAICreator/Qiita-1.07M huggingface dataset:
アンガーマネジメント入門

## はじめに
アンガーマネジメントを実践していくことにより、日々生きていく上でのもやもやであったり怒りに対する対処を知ることができ、人間関係の悩みを軽減することができます。

### アンガーマネジメントとは
怒りをコントロールしながらうまく付き合うことで、怒りで後悔することを防ぐマネジメント手法です

怒りという感情自体を沸き起こらないようにすると思われがちですが、そうではなく怒りと向き合い冷静に対処するためのメソッドを紹介しています。

### 対象読者
- ついイラッとしてきつく言ってしまう人
- イライラが態度にでて周りを不快にしてしまうことがある方
- イライラが溜まってしまい、言い出せない人


## 怒りのメカニズムを知る
怒りとはどういうものなのかについて説明します。
### 怒りは"べき"の違いによって生じる
- MTGの5分前には来るべきだろ！
- プルリクを出すときはCIが通ってから出すべきだろ！
- タスクの状況は毎日報告すべきだろ、なぜそんな事もできないんだ！

怒りの理由はいろいろありますが、これらは自分の中の常識（〇〇すべき）から外れた場合に起きます。

### 怒りは第二次感情
私もこれを知ったときは驚きましたが、怒りは第二次感情から発生します。

先程の例で行くと
- MTGの5分前には来るべきだろ！
  - MTG開始のときにバタついて会議に集中できなくなりそうで**不安**
- プルリクを出すときはCIが通ってから出すべきだろ！
  - いちいちこちらから教えてあげなくてはいけないし自分で気づいてほしいし、指摘することすら**面倒** or **疲れる**
- タスクの状況は毎日報告すべきだろ、なぜそんな事もできないんだ！
  - 状況が把握できないとスケジュールが組めないし、実際本当に進んでいるのだろうか。。。**不安**だ

このように、第一次感情が大きくなってくると、そのうちに怒りに変わっていきます。


## 怒りを制御する
では怒りについてどのように対応していけばよいでしょうか

### 対処法："べき"の違いによって生じる怒り
- 自分の"べき"と相手の"べき"が違うことを認識する
- "べき"についてレベル分けをする
  - 3段階くらいに分けて、何に対して自分が怒りを覚えるのかを認識する
    - まずは"べき"についてのレベル分けを行ってみましょう

> MTGの5分前には来るべきだろ！

レベル1：5分前にくる（これは自分の"べき"と同じ感覚）
レベル2：時間ちょうどにくる
レベル3：遅刻してくる

レベルを分けて考えることにより自分を知ることができます。
- 相手の"べき"を踏まえた上でレベル2に対してイライラしないか
  - イライラする場合はどうすれば許容範囲を広げることができるか

このように相手の"べき"と違う部分とそれに対して許容できるかできないかを考えてみましょう。
許容範囲を広げることができればイライラは減ります。

#### レベル3に達した場合
レベル3に達し、許容範囲を超えてしまう場合はしっかりと怒りましょう。
ただ、感情のままに怒ってしまっては結局何が伝えたいかわかりませんね。
どう怒ればよいのか、第二次感情からのアプローチを見てみましょう！

### 対処法：第二次感情からのアプローチ
上記の通り、怒りとは第二次感情のため、第一次感情が存在します。
ここでは第一次感情にフォーカスしたアプローチを見ていきます。

> MTGの5分前には来るべきだろ！
MTG開始のときにバタついて会議に集中できなくなりそうで**不安**

#### どうして不安になる？
- 会議の開始が遅れることによって伝えたいことが伝えられないかもしれない
- 時間を気にして焦ってしまいそう
- 一人でもバタついている人がいると周りの方の集中力に影響してしまうのではないか

つまり...
遅刻をすると私以外の人が迷惑を感じてしまう
<=> 逆に言うと遅刻さえしなければ周りは迷惑に感じないし、許容できるのではないか、
　　=> では遅刻した際にはきちんと伝えよう

このように何に対しては怒りとして現れるのか分析し、相手になぜそれが良くないのかを伝えるようにしましょう。
あくまでも怒りのパワーをぶつけるのではなく、自分が怒りを持たないためにも相手と冷静に話し合いましょう

上記のように第一次感情に注目することで、なぜ自分が怒りを感じるかが分析できるようになります。
自分の感情に目を向けることで怒りで後悔しないようなアプローチができるようになりましょう！


## 最後に
冒頭でもお伝えしましたが、怒ることは悪いことではありません。
怒りを知り、振り回されないように適切に相手に伝えたり、自分を見つめながら怒りで後悔しないようにしましょう！

## 参考資料
https://kanki-pub.co.jp/pub/book/details/9784761272081
Microsoft 365 開発者プログラムについて

# はじめに
つい最近知ったので，ご紹介。
Microsoft 365 開発者プログラムは、Microsoft 365 の API を活用して、クラウドアプリケーションやサービスを開発するためのプログラムです。このプログラムに参加すると，Microsoft 365 の機能を利用して，強力なクラウドベースのアプリケーションを作成することができます。
多くの会社がMicrosoft 365（旧:office365）を使用されていると思いますが，
Microsoft 365の機能を使ったサービスを開発するときのテスト環境として利用できます。
特に，Microsoft Graph APIのテストなんかにはもってこいな感じ？
自分は，Microsoft Graph APIのテスト目的で利用しましたが，もっと大がかりなこともテストできるのでしょう。
（Microsoft 365 E5のライセンスの環境だそうです）

例：Microsoft 365 開発者プログラムの画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601976/40a287e2-d5b8-20d8-d241-7246ec34482a.png)

例：テスト環境でのMicrosoft 365管理センターの画面
普段はMicrosoft 365の単なるユーザーなので，この画面は新鮮。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601976/3f57f3e1-31d7-0dda-d44b-eb64c70eb7af.png)

userもある程度用意されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601976/937cca21-c477-3654-6bfd-7d55fa14e3ed.png)

# 参加方法
Microsoft 365 開発者プログラムに参加するには、以下の手順を実行します。

1. Microsoft 365 Developer Program サイトにアクセスします。
https://learn.microsoft.com/ja-jp/office/developer-program/microsoft-365-developer-program

1. 「参加する」ボタンをクリックします。
1. Microsoft アカウントでサインインします。
1. アカウント情報を入力します。
1. 利用規約に同意し、「参加する」ボタンをクリックします。
1. 参加すると、Microsoft 365 の開発に必要なリソースにアクセスすることができます。また、コミュニティに参加することもでき、開発者同士の情報交換やサポートを受けることができます。
ArtNet で Unity のライトをリアルタイムに操作してみる

以前、[はてなブログの方](https://naoyakohda.hatenablog.com/entry/2021/12/21/unity-lighting-with-dmx)に Unity で ArtNet を扱う内容に関して投稿しました。

Unity で ArtNet を受け取るプログラムとエディタ拡張を GitHub で Public に公開したので、今回はその内容についての記事を書こうかなと思います。

https://github.com/nasshu2916/ArtNet-Unity/tree/v0.1.3


## ArtNet とは
### 概要

ArtNet は舞台照明などの制御で使われるプロトコルです。舞台照明などの制御は DMX512-A で制御するのが一般的ですが、DMX は1本のケーブルで 512 チャンネルで、各チャンネル 0~255(8bit) の値で制御することができます。この DMX を Ethernet を介してやり取りできるようにしたものが  ArtNet になります。

ArtNet は UDP 6454 番ポートが使われます。また、基本的なパケット構造は以下の様な形になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3081963/544c7eba-1459-abbb-2772-3d9f91f1eb62.png)


0~7 バイト目は UDP パケットが ArtNet のパケットかどうかを識別するための場所になっています。この値は、`Art-Net\0` の固定値になっています。
8~9 バイト目は OpCode(operation code) になっています。また、この値は little endian になっています。この OpCode で ArtNet で使用されるコマンドの識別を行います。OpCode の例として、DMX データを表す `OpDmx(0x5000)` や ArtNet ノードの存在を確認するための `OpPoll(0x2000)` があります。

10 バイト目以降は OpCode によって内容が異なります。
OpCode が OpDmx(DMXパケット) の場合、10~11 バイト目はプロトコルバージョン、12 バイト目は シーケンス番号、14~15 バイト目には Universe 番号が入ります。

18 バイト目以降から DMX の値が順に入れられているのですが、16~17 バイト目には、18 バイト目以降の DMX の長さが格納されています。


他の OpCode など、より詳細は以下の公式ドキュメントに書かれています。

https://artisticlicence.com/WebSiteMaster/User%20Guides/art-net.pdf


### 実装
Unity(C#) で ArtNet のパケットを受け取り、各 OpCode に対応する Class のコンストラクタで初期化を行う実装部分を抜き出すと、以下の様な感じになります。
(UDP パケットの受信、各 OpCode に対応するクラスは省略しています)
```c#
namespace ArtNet.Packets
{
    public abstract class ArtNetPacket
    {
        private const string ArtNetId = "Art-Net\0";
        private const byte FixedArtNetPacketLength = 10;
        private static readonly byte[] IdentificationIds = Encoding.ASCII.GetBytes(ArtNetId);

        public static ArtNetPacket Create(byte[] buffer)
        {
            if (!Validate(buffer)) return null;
        
            return GetOpCode(buffer) switch
            {
                OpCode.Poll => new PollPacket(buffer),
                OpCode.PollReply => new PollReplyPacket(buffer),
                OpCode.Dmx => new DmxPacket(buffer),
                _ => null
            };
        }
        
        private static bool Validate(IReadOnlyList<byte> buffer)
        {
            if (buffer.Count < FixedArtNetPacketLength) return false;
            return !IdentificationIds.Where((t, i) => buffer[i] != t).Any();
        }
        
        private static Enums.OpCode GetOpCode(IReadOnlyList<byte> buffer)
        {
            return (Enums.OpCode) (buffer[8] + (buffer[9] << 8));
        }
    }
}


namespace ArtNet.Enums
{
    public enum OpCode : ushort
    {
        Poll = 0x2000,
        PollReply = 0x2100,
        Dmx = 0x5000
    }
}

```

UDP で受け取ったデータを OpCode の値で分岐させ、OpCode に対応するクラスに変換しています。この後、OpCode に合わせ、必要な処理を追加していくと、Unity のライトをリアルタイムで操作できるようになります。

![qiita_artnet_unity.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3081963/749285ec-84d5-261a-b596-2cba1702787d.gif)


## まとめ
Unity でライトのパラメータを変更する場合、Timeline などを使いますが、
舞台照明などの制御で使われるプロトコルの ArtNet を使うことで、物理照明と Unity を連動させることが可能になります。

実装内容は一部抜粋して書きましたが、ソースコードは GitHub にて公開しています。

https://github.com/nasshu2916/ArtNet-Unity/tree/v0.1.3
Crystal言語でインクリメンタルコンパイルが難しい理由

## はじめに

Crystal言語は、素晴らしい言語です。
プログラミングの仕事には向いていないかもしれませんが、趣味としてプログラミングに触れていると、この言語ほど面白いものはありません。Rubyと互換性のある文法でありながら、C言語に匹敵する実行速度が得られます。

## Crystal言語の普及には課題がある

しかし、Crystal言語の性能は高くても、まだあまり普及していないようです。
その理由の一つがコンパイル速度の遅さです。

コンパイル速度が遅い理由は、並列でコンパイルできないからです。
Crystalでプログラムをビルドしている間に、例えば htop コマンドなどを使ってプロセスの状況を確認すると、Crystalはコンパイル時に1つのコアしか使っていないことがわかります。Crystal本体をコンパイルするときも同様で、1コアだけを使ってコンパイルするため、時間がかかってしまいます。インクリメンタルコンパイルができないため、1コアしか使えないのです。

## Aryさんの記事紹介

Crystalの作者であるAryさんが作成したdev.toの記事を読むと、その理由が詳しく説明されています。
その内容を紹介します。

https://dev.to/asterite/incremental-compilation-for-crystal-part-1-414k

CrystalはRubyとの互換性を重視しており、かなりの程度まで型の記述を省略することができます。例えば、

```crystal:add.cr
def add(a, b)
  a + b
end
```

のようなコードを書くことができます。しかし、その代償として、addメソッドの型はこのコードを見ただけでは決定できません。add を呼び出してるオブジェクトが何かを確認する必要があります。Crystalはコンパイルのたびにファイル全体を調べて、何のオブジェクトがaddを呼び出すかを特定して関数を生成するのです。したがって、`add.cr` をコンパイルするたびに、依存するすべてのファイルを精査して、`add` を呼び出している箇所をチェックし、型を推測しなければなりません。

そういうわけでCrystalでは、ファイル単位での分割コンパイルが難しくなります。毎回すべてのファイルを精査しなおさなければならないので、コンパイルの再利用や、並列コンパイルができないそうです。

これに関して、NimのようにCrystalでも型の注釈をもっとつける方向性にしようという議論もあります。そうすればコンパイルは今よりも遥かに高速になると思いますが、個人的には反対です。それはCrystalの奇妙な美しさと個性を打ち消すことになるのではないかと思います。

Crystal言語はこのような面白い課題があります。Crystalはアルゼンチンに開発の中心がある珍しい言語です。多くの開発者が参加することでより素晴らしい言語になっていくのではないかと思います。

この記事は以上です。

（この記事は、Aryさんの記事の紹介記事なので、興味を持ったら、Aryさんのエントリを読んでくださると幸いです）
Office JavaScript APIを使用してみた 導入時の所感

## 概要

https://learn.microsoft.com/ja-jp/office/dev/add-ins/overview/office-add-ins

https://learn.microsoft.com/ja-jp/office/dev/add-ins/reference/javascript-api-for-office

Office、今回はWord上でアドインとして使えるアプリケーションの制作を試みました。
開発フレームワークはReactです。
なお筆者はReactを仕事で扱ったような経験はありません。

私が開発したプロジェクト上では下記のとおり。

```console
% npm list --depth=0
~中略~
├── react@18.2.0
```

## 所感

- 既存アプリケーションのheadタグ内にscriptタグを埋め込めば、おそらく問題なく動作する
- Yeoman generatorによる導入は、私のようなReact初学者には扱いが難しい
- ブラウザコンソール上でエラーを確認しても、Office Word内では正常動作を確認できた

### 「既存アプリケーションのheadタグ内にscriptタグを埋め込めば、おそらく問題なく動作する」

これがこの記事の結論となります。

```html:public/index.html
<!-- headタグ内に記述 -->
<script type="text/javascript" src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js"></script>
```

#### おまじないを付けておく

Office.jsは、下記設定をnullにするそうです。

```javascript
window.history.replaceState = null;
window.history.pushState = null;
```

検証不足なのですが、おそらくブラウザコンソール上でこのエラーを確認できても、Office上では正常動作を確認できるかもしれないです。

それでも念の為、下記参考サイトのとおりに、headタグ内に追記を行って回避しています。コードはリンク先でご確認ください。

https://stackoverflow.com/questions/42642863/office-js-nullifies-browser-history-functions-breaking-history-usage

#### Office.jsの初期化について

https://learn.microsoft.com/ja-jp/javascript/api/office?redirectedfrom=MSDN&view=common-js-preview#functions

Microsoftによる公式ドキュメントにも、初期化を行うべきだという記述がありますが、私は初期化せずとも正常動作を確認できました。あまりこの有無についてはよく分かっていないです。

### 「Yeoman generatorによる導入は、私のようなReact初学者には扱いが難しい」

https://learn.microsoft.com/ja-jp/office/dev/add-ins/develop/yeoman-generator-overview

Reactに慣れ親しんでいる方は `yo office` でプロジェクトひな形を作成するかたちでよいと思います。

該当Generatorは現在も開発が進んでいるそうですが、Reactのバージョンが最新でない等、useStateを使うのがやっとな私には扱いが難しかったです。

プロジェクト作成時のパッケージバージョン記載は下記。

```javascript:package.json
  "dependencies": {
    "@fluentui/react": "^8.52.3",
    "core-js": "^3.9.1",
    "es6-promise": "^4.2.8",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "regenerator-runtime": "^0.13.7"
  },
```

### 「ブラウザコンソール上でエラーを確認しても、Office Word内では正常動作を確認できた」

一部と内容が重なりますが、動作確認はブラウザとOfficeの両方で行うとよいかと思います。

```
Uncaught (in promise) ReferenceError: Word is not defined
```

私はWord上で動くアドインを開発しましたが、ブラウザコンソール上で上記を確認しても、プログラムによってWordを操作することができました。

これがこの記事の肝であり、私はブラウザ上でデバッグを行っていたばかりに、Word上で動作確認をしないことで、かなりの時間を消費しました。
私のような被害者が生まれませんように…。

参考サイトリストは、今回各所にリンクを貼ったので割愛。
Next.jsでAPIサーバーを実装する時APIレスポンスに型をつける方法

# はじめに

APIサーバーを構築する際、型を活用することで開発スピードを劇的に改善できます。Next.jsはReactをベースに構築されたフレームワークであり、TypeScript対応もしているため、型に関する様々な恩恵を受けることができます。本記事では、APIサーバーのレスポンスに型をつける方法を紹介します。

# やり方 手順

1. まずはじめに、次のようにNextApiResponseに型を記述するインターフェースを用意します。

```typescript
interface ApiResponse<T> extends NextApiResponse {
  status: number;
  data: T;
}
```

この中で、`T`にはレスポンスの型を記述していきます。

2. 次に、APIのエンドポイントである関数の例を示します。

```typescript
export default async function handler(
  req: NextApiRequest,
  res: ApiResponse<{ message: string }>
) {
  try {
    const message = 'API response';
    res.status(200).json({ message });
  } catch (error) {
    console.error(error);
    res.status(500).json({ message: error.message });
  }
}
```

`handler`関数内では、`ApiResponse`型を使って`res`の型を指定しました。`{ message: string }`はレスポンスで渡すデータの型を表します。このようにすることで、TypeScriptがコンパイル時に型チェックを行い、想定しないエラーが発生することを防止できます。

3. 最後に、次のようにhelperの関数を使って、オブジェクトを生成します。

```typescript
export function ApiResponse<T>(res: NextApiResponse, data: T, status: number = 200): void {
  res.status(status).json({ data, status });
}
```

これにより、レスポンスの内容を効率的かつ簡素に構築することができます。


# 注意点、補足

- `ApiResponse`はインターフェースとして定義されていますが、関数として使用できます。
- `ApiResponse`の定義で`NextApiResponse`を継承しているため、その他の`NextApiResponse`のメソッドも使用できます。

以上が、Next.jsでAPIサーバーを構築する際にNextApiResponseに型をつける方法の紹介でした。規模の大きいプロジェクトでは、型チェックが必要不可欠なので、ぜひ型を活用して開発を進めてみてください。
prometheusのkeep/drop

前提：ifHCInOctetsにはifIndexとifNameの紐づけを行っている
・keepするmibを2種類に制限 'sysUpTime|ifHCInOctets'
・更にifNameに特定の文字列を含むmetricsのみに制限

        metric_relabel_configs:
      - source_labels: [__name__]
        regex: 'sysUpTime|ifHCInOctets'
        action: keep
      - source_labels: [ifName]
        regex: '|wlan.*|enp.*'
        action: keep

・ここには登場していないが、ifHCOutOctetsは破棄される
・ifHCInOctetsの'|wlan.*|enp.*'はkeepされる
・ifIndexを含んでいないsysUpTimeもkeepされる

以下でも、sysUpTimeは拾える。
ifNameを持っていないメトリクスの場合は、keep/dropの判断対象外

        metric_relabel_configs:
      - source_labels: [ifName]
        regex: '|wlan.*|enp.*'
        action: keep
ReactのチュートリアルでcreateContextを追加したら保存毎にエラーが出た話

react のチュートリアルでcreateContextを追加したら保存毎にエラーが出続け流ようになったけど、GPT先生に聞くとあっさり治った話
React: v18.2.0

# エラー内容

```Error
Warning: You are calling ReactDOMClient.createRoot() on a container that has already been passed to createRoot() before. Instead, call root.render() on the existing root instead if you want to update it.
ReferenceError: Cannot access 'App' before initialization at main.tsx:21:10
[hmr] Failed to reload /src/App.tsx. This could be due to syntax errors or importing non-existent modules. (see errors above)
```


# GPT先生

このエラーは、２つのソースが原因で発生している可能性があります。

１つ目のエラーに関連する Warning: You are calling ReactDOMClient.createRoot() on a container that has already been passed to createRoot() before. について

この警告は、Appを再レンダリングした場合に何度も毎回新しいルートを作成しようとしていることが原因であると言えます。そのため、次のように書くと良いです。

```jsx
const rootElement = document.getElementById('root')
if (rootElement !== null && rootElement.childNodes.length === 0) {
  const root = ReactDOM.createRoot(rootElement);
  ...
}
...
```

# 最後に

ChatGPTが出てから学習に詰まることが少なくなって良き
Pythonのasyncioでgraceful shutdown

プログラム実行中にハンドリングできない例外が発生した場合に、後処理を行ってからプログラムを終了させたい場合がある (graceful shutdown)。通常は`try~except`で実装するが、asyncioを使っていると各コルーチンでハンドリングできない例外が送出された場合に`try~except`で例外を処理することができない。

"python asyncio graceful shutdown"などで検索すると色々な方法が出てくるが、すぐに使い回せるコードが見つからなかったためまとめておく。ここではasyncioの挙動については割愛する（詳細は末尾の参考文献を参照）。

ハンドリングするべき例外はsignalとExceptionがあり、それぞれのハンドラーを作成してからイベントループに登録しループを回せばよい。追加のエラーハンドリングは`shutdown()`に実装する。

検証環境はCentOS7, Python3.10。指定するsignalはOSによって異なる可能性がある。

```python
import asyncio
import signal


async def task() -> None:
    cnt = 5
    while True:
        print(f"task is running... will raise Exception in {cnt} seconds")
        await asyncio.sleep(1)
        cnt -= 1
        if cnt == 0:
            raise Exception("something wrong happened")


async def shutdown(loop, signal=None) -> None:
    if signal:
        print(f"received exit signal {signal.name}...")
    tasks = [t for t in asyncio.all_tasks() if t is not
             asyncio.current_task()]

    [task.cancel() for task in tasks]

    print(f"cancelling {len(tasks)} outstanding tasks")
    await asyncio.gather(*tasks, return_exceptions=True)
    print("cancelled tasks")

    # add custom shutdown logic here

    loop.stop()
    print("gracefully shutdown the service.")


def handle_exception(loop, context) -> None:
    # context["message"] will always be there; but context["exception"] may not
    msg = context.get("exception", context["message"])
    print(f"caught exception: {msg}")
    asyncio.create_task(shutdown(loop=loop))


def main() -> None:
    loop = asyncio.get_event_loop()
    signals = (signal.SIGHUP, signal.SIGTERM, signal.SIGINT)  # may want to catch other signals too
    for s in signals:
        loop.add_signal_handler(
            s, lambda s=s: asyncio.create_task(shutdown(loop=loop, signal=s)))

    loop.set_exception_handler(handle_exception)

    try:
        loop.create_task(task())
        loop.run_forever()
    finally:
        loop.close()


if __name__ == "__main__":
    main()
```

元ネタはこちらの記事。不要な部分を削って必要最小限のコードにした。

https://www.roguelynn.com/words/asyncio-graceful-shutdowns/
https://www.roguelynn.com/words/asyncio-exception-handling/
MW WP Formで確認画面に上手くいかなくて悩んだ話

# はじめに
Wordpressのお問い合わせフォームのプラグイン「MW WP Form」を用いてお問い合わせ画面を作ったんだけど確認画面へ遷移するとき上手くいったりいかなかったりして詰んだので備忘録としてココに記します。

# 事象

## 確認画面への遷移が不安定
以下のようなコードを入れて、入力画面→確認画面→完了みたいなステップの画面をつくってた

```
[mwform_bconfirm class="back" value="confirm"]確認画面へ &#x25b6;[/mwform_bconfirm]
[mwform_bsubmit name="submit" class="back" value="send"]送信する &#x25b6;[/mwform_bsubmit]
```

画面上で一通り入力終えたら、

1. 「確認画面」を押す
1. 確認画面へ遷移する
1. 「送信する」ボタンを押す
1. サンクスページ → お問い合わせ完了

という流れを踏みたいのだけれど、 1 から 2 の遷移がされたりされなかったりしていた。
バリデーションチェックも、正しく判断してるときもあれば、せずに通っちゃったり。  
4 の完了画面も遷移するときもあればエラーがでたり、送信もされたりされなかったり。。

jQueryの読み込み順とかも変えてみたけれども、だめ。。

## 記述していたコード (こいつが問題だった)

`page-contact.php` という固定ページのファイルをつくって
ショートコードを呼び出す記述をしていた。

```
<?php echo apply_shortcodes('[mwform_formkey key="xxx"]'); ?>
```

もしかして、ページからショートコードを読んでるのがだめ・・・？ 
※ key="xxx" のチョメチョメの部分は適宜変えようね。

# 解決策

```
<?php the_content(); ?>
```

ならば `the_content` で読み出して
管理画面上からショートコード `[mwform_formkey key="xxx"]` を入れてみる。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3292454/12b79805-d08e-8563-e045-36c853913e5f.png)

保存して改めてお問い合わせ画面で試してみると・・・

__できた〜〜〜！__

というわけで MW WP Form を確認画面を入れるとき (いれないときも) は
固定ページにショートコード記入ではなく、エディタから入れましょういうことを学んだのでありました。

そもそもなんで固定ページのファイルからショートコード読みだそうとしてたのかは今となってはわからない。。。
Sourcetree Windows版でClone時に「エラー: The host key is not cached for this server:」というエラーになる場合の対象法

SourcetreeをインストールしてSSHの鍵を生成してGitHubに登録、いざCloneするぞ、という時に「ソースパス/ソース URLとして正しくありません」であったりその`詳細…`で「エラー: The host key is not cached for this server:」というエラーが表示されてしまう方向けの記事です。

↓このようなエラーです↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754230/d324d6f0-5bdc-a48e-b7de-696cfb5a75eb.png)

## 何が起きているのか

:::note warn
Hint
解決を急ぐ方は以下の解決方法まで読み飛ばしてOKです。
:::

SSHは初めてアクセスするホストの場合、接続先ホストのフィンガープリントを提示して本当にアクセスしてよいか対話的に確認します。コマンドラインでgit cloneする場合にはここで `y [エンター]` を叩けば良いのですが、SourcetreeはGUIのため、対話的にyを叩くチャンスがなくエラーになってしまいます。
ではコマンドプロンプトから`ssh git@github.com`を実行し、この時にyを叩いてからSoucetree側でCloneすれば良いように思いますが、この時のコマンドラインから見えているsshクライアントとSourcetreeが利用するsshクライアントが異なっているため、このアプローチもうまくいきません。

## 解決方法１：plink.exeを直接実行して信頼する

コマンドプロンプトから以下のようにplinkを実行し、 `y [エンター]` を叩きます。

```
%LOCALAPPDATA%\SourceTree\app-3.4.11\tools\putty\plink.exe  git@github.com
```

:::note warn
Hint
GitHubの場合の例です。接続先に合わせて適宜書き換えてください。
:::

:::note warn
Hint
SourceTree 3.4.11の場合の例です。パスにバージョン値が含まれていますので、適宜書き換えてください。
:::

## 解決方法２：PuTTYの代わりにOpenSSHを利用する

上部メニューから`ツール` → `オプション` でオプションウィンドウを開き、SSH クライアントを`OpenSSH`に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754230/7131533a-7a91-f686-10b6-726b0f7978cb.png)

パスが通っているsshが接続先ホストと公開鍵認証で疎通できる状態であれば、これだけでOKです。

これからセットアップする場合はおおむね以下の手順になります。

1. ssh クライアントをインストール（GitBash付属のもの、PowerShellのもの、MSYS2のものなど、なんでもいいです）
1. シェルを開き、`ssh-keygen`を実行して鍵ペアを作ります
1. 作った公開鍵が`~/.ssh/`にあるので、これをサーバに登録します（GitHubであれば https://github.com/settings/ssh/new です）
1. `ssh [server]` を実行し、信頼済みホストに登録しておきます（GitHubであれば`ssh git@github.com`です）
1. オプションウィンドウから`SSH クライアントの設定`の`SSH キー`に先ほど作った鍵ペアの秘密鍵の方（拡張子が無いもの）を指定します

この状態でSourceTreeからCloneを実行すれば件のエラーは解消していると思います。

## 最後に

以前はYes/Noのところでダイアログボックスが表示されませんでしたっけ・・・？
接続先ホストのフィンガープリントを自力で計算してPuTTYの信頼済みホストに登録する方法も模索したのですが、PuTTYのフィンガープリントの計算方法がわからず断念しました。
M2 MacDockerインストール

# 1. はじめに
最近M2 Mac miniを手に入れました。
(これまでは2015年モデルのMac book pro を使っており、新機購入の際にデータ移行はフルで行ないました)

Pythonを使いたいものの環境は汚したくない…
初心者のため勉強も含めてDockerを使ってみることにしました。

# 2. 環境
OS：Mac OS Ventura 13.2.1

# 3. インストール
インストールはこちらのURLから
https://www.docker.com

M2なので左下のApple Chipをクリック
![スクリーンショット 2023-03-21 19.15.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/961807/f38f879e-7ba3-56d9-2326-1cb3e5ebcff2.png)

ダウンロードされた Docker.dmg ファイルを開き、drag and drop

![スクリーンショット 2023-03-21 19.20.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/961807/0404f10b-400e-32b9-f9a9-c4d0c2ecf0db.png)

# 4. エラーが出た
下記のようなエラーが出て一向に進まなくなってしまった。
>Fatal Error 
com.docker. backend cannot start
Exit code 150

![スクリーンショット 2023-03-21 16.52.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/961807/23c118a5-8259-dfe3-54a9-3378d0eb6bb5.png)

ググってみたら、過去にインストールしていたDockerが悪さをしているよう・・・

# 5. アンインストール
下記サイトが参考になった。
フォルダを移動し、ファイルを1つ1つ削除していった。

再度インストールからやり直したところ、Docker Desktopが無事動き始めた。
https://www.drbuho.com/jp/how-to/uninstall-docker-mac
AI・機械学習、データサイエンティスト教材メモ

# YouTube

https://www.youtube.com/@AIcia_Solid

https://www.youtube.com/watch?v=ZQZ38rK28Gk

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

# Webサイト

https://tutorials.chainer.org/ja/01_Welcome_to_Chainer_Tutorial.html

https://free.kikagaku.ai/

https://nlp100.github.io/ja/

https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess

https://learn.microsoft.com/ja-jp/

https://datawokagaku.com/

https://tt-tsukumochi.com/

https://developer.ibm.com/

# 書籍

https://www.amazon.co.jp/gp/product/4297125218/ref=ppx_yo_dt_b_asin_image_o02_s00?ie=UTF8&psc=1

https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585?crid=3VKB0UPOJ1BVI&keywords=%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8Bdeep+learning&qid=1676802989&sprefix=%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8B,aps,218&sr=8-1&linkCode=sl1&tag=joshikiblog-22&linkId=18bdcb8fa18fe153e492c5e78c61c3f9&language=ja_JP&ref_=as_li_ss_tl

https://www.amazon.co.jp/dp/4802613776?&linkCode=sl1&tag=aicia_solid-22&linkId=7e818e169cf0ab1b5475743c9bda2710&language=ja_JP&ref_=as_li_ss_tl

https://www.amazon.co.jp/Kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93-%E9%96%80%E8%84%87-%E5%A4%A7%E8%BC%94/dp/4297108437?crid=VOA6Z8EVT3QE&keywords=kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93&qid=1676737839&sprefix=Kaggle,aps,353&sr=8-1&linkCode=sl1&tag=joshikiblog-22&linkId=bdf7d12b4f4660395e6d3a4e1811efdc&language=ja_JP&ref_=as_li_ss_tl

https://www.amazon.co.jp/Kaggle-Grandmaster%E3%81%AB%E5%AD%A6%E3%81%B6-%E5%AE%9F%E8%B7%B5%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81-Abhishek-Thakur/dp/4839974985?crid=VOA6Z8EVT3QE&keywords=kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93&qid=1676737839&sprefix=Kaggle,aps,353&sr=8-42&linkCode=sl1&tag=joshikiblog-22&linkId=71b7ef04b5aede2a1a6f2cc625d509d7&language=ja_JP&ref_=as_li_ss_tl

https://www.amazon.co.jp/Kaggle%E3%81%AB%E6%8C%91%E3%82%80%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E6%A5%B5%E6%84%8F-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E5%B0%8F%E5%B5%9C-%E8%80%95%E5%B9%B3/dp/4065305136?crid=3SPO3MLPL8OA2&keywords=kaggle%E3%81%AB%E6%8C%91%E3%82%80%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E6%A5%B5%E6%84%8F+ks%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8&qid=1676792180&s=books&sprefix=Kaggleni,stripbooks,248&sr=1-1&linkCode=sl1&tag=joshikiblog-22&linkId=3bb42922539c3415477cc62e3c428d74&language=ja_JP&ref_=as_li_ss_tl



# Udemy

https://www.udemy.com/user/kame-reon/
読書感想文的なもの#1 ゼロ秒思考

# はじめに

まず初めに私の自己紹介と、なぜ読書感想文的なものを書くに至ったかのご説明をさせていただければと。

とある企業でプログラマーとして働いている、長所が周りに気が使えるくらいの普通の人です。

普通の人すぎるが故に、「プログラマーとして何か一つに尖りたいなぁ」、「論理思考力を鍛えないとなぁ」といったようなことを日々考えている成長意欲がわりと高いマンです。行動が伴ってないですが。。。

そんな私の自己紹介はこんなものにして…
__（これ以上特に言うことがない）__
###

私の会社では半期ごとに"どんな価値を生み出せる人材になりたいか（なるべきか）"を２つ設定して、それに対する目標を立てて、その目標を遂行していくということを行っております。

自分で立てた目標の難易度的なものがあり、またその目標の達成度合いで給料も少し変動しますので、自分の身の丈にあった目標を立て、しっかり目標を達成することが重要。

そんな私は昔から目標だけは一丁前に立てますが、なかなか遂行できない意志フニャフニャヘナチョコ人間でございまして、、、(夏休みの宿題だいたい最終日に泣きながらやるタイプ)

このような人間性なので非常にeasyな目標を2つ立て、それらを適当にこなして
__「拙者、目標達成できたでござる!!!これで給料UPなのじゃ!!!!」__
と言ったことをこっそり考えておりました。(カス)

しかし、このままでは今までの怠惰な自分から脱却できないと気づきまして、そこからどうなりたいか、なりたい自分になるための目標を決めました。

決めたことは2つございますが、1つだけご紹介します。
##
###
__まずどのような人になりたいか__
* 技術土台をしっかり作り上げて、新しいことや言語に挑戦する際に柔軟に対応できる地力やビジネス力をつける。
* その結果、どの案件先でも「〇〇」のエンジニアは優秀という印象を与えることができる人材を目指す。

※〇〇の部分は会社名です。
##
###
__目標はこちら__
* ビジネス本、または参考書を読了して内容をQuitaに投稿する。(6冊)
* オンライン教材︎(UdemyやSchoo等)を受講する。(6個)
##
###

いかがでしょうか。
###
__「なんやこいつ、こんな目標で変わろうとしてんのかい！！！！！」
「おめぇ、そんな目標ででえじょうぶか〜〜〜〜〜〜〜？？？？？」__
###
という声が聞こえてきそうですが、少なくとも私にとってはかなり大変な目標です。

そもそも私、読書はあまり好きではございません。

しかしながら、お手軽に賢い方々の思考や知識を学ぶことができるので、成長には欠かせないと前々から
ず〜〜〜〜〜〜〜〜〜〜〜〜〜〜っと思っていました。

せっかくの機会ですのでここで読書する習慣を身につけ、1人のビジネスパーソンとして重宝されるような人になるためにこの目標を立てました。
###
そんな中で初めに選んだ本が、__『ゼロ秒思考』__ です。
###
# ゼロ秒思考ってなあに？
###
結論から申し上げますと
#### タイトルに対して想起されることを1分と言う短い時間で、
#### 思いつく限りブワ〜〜〜ッと箇条書きでメモ書きすること
になります。
###
ゼロ秒思考を読んだ当初は
__「こんなの簡単だえ〜〜〜(天竜人風)」__
とぶっちゃけ思っていたのですが、

__これが思いのほか難しい・・・__

最初は一つのお題に対して3個くらいしか思ったことが出ず、その後は途中で思考が止まってしまいそのままタイムアップまで手が動かないということを繰り返していました。

##
### やり方
1. __タイマーを1分にセット__
2. __A4用紙を用意して左上にタイトルを書く__(右上に日付を書いた方が良いですが私はめんどくさくて書いていませんでした。)
3. __タイマーをスタートして、箇条書きでタイトルから想起されることをワ〜〜〜〜ッと書き殴る。__
4. __ここまでを１セットとしてそれを10枚、異なるタイトルで書く__
##
これを毎日行うことで思考がクリアになり、さまざまな場面でアイデアが浮かびやすくなるとのこと。

コツとしては「なんでも思ったことを書くこと」だと思います。
###
このメモ書きは誰にも見せないものなので、例えばお題が、
__「なぜ〇〇の顔を見ると腹立たしいのか」__
でも全然良いわけです！
###
それに対して思ったことを紙に書き殴れば、
・〇〇が仕事で責任を果たさずに逃げ出したことに腹たつ。
・それにも関わらずヘラヘラ楽しそうにしているのが、社会人とは思えない立ち回りでそれも腹が立つ。

といったように、ただ腹立たしいのではなくなぜそう思ってしまうのかが明確になり、それに対する対処法も生まれてきやすくなるのです。
###

# 実際にやってみた感想
###
実際にゼロ秒思考を継続してみて、如実に感じたのが __頭のスッキリ感__ です。

私たちは日々膨大な情報に晒され続けおり、常に脳を酷使しています。
脳内はさまざまな情報で溢れかえっており、霧がかかったようにもやもやしている状態の方が非常に多いのでは、と思います。

ゼロ秒思考で、「もやもやした何か」をメモとして言葉で書き出すことにより、自らを俯瞰してみることができます。

__「自分はこんなことで悩んで、辛いと感じていたんだな」__

ということが明確になり、そこからさらに解消する方法をメモとして書き出せば、自ずとその悩み、もやもやは解消されて頭がスッキリすることで結果仕事にも良い影響が出てきます。
##
###
またこれを繰り返すことで __思考力を鍛えることができている__ と感じます。

私がゼロ秒思考を始めたばかりの頃と現在とでは、一つのタイトルに対するメモ書きの内容が量や質共にかなり変わったと感じております。
これは1分という短い時間の中で思ったことをパッと言葉で書き出す訓練を日々行うことによって、瞬間的な思考力が鍛えられた結果だと思います。

# まとめ
###
ここまでゼロ秒思考に関することを書いてみましたが、
###
「ゼロ秒思考を続けて日々が劇的に変わりました！！！！」
「もうゼロ秒思考なしの生活なんて考えられません☺️」
###
__なんてことは決してございません！__
###
私はいまだにちょこちょこサボってしまったり、ついつい自己流でやってしまい、
あまり効果を感じることができなかったりします。(基本を徹底しないお前が悪い)

ゼロ秒思考が自分にフィットするか、本当に自分にとって有益なものかどうかは
ぜひ、貴方自身でゼロ秒思考を実践していただいて判断していただきたいです！
###
私は仕事において、まだまだ下っ端も下っ端ではございますが、、、

役職が上に行けば行くほど大事な選択を急に迫られることが増えると思います。
どんな時でも大事な選択を迫られた時に誤った選択をしないためにも、ゼロ秒思考で頭を整理しておき、
「いつでもかかってこい状態」を作っておくことがきっと大事な気がします。(事前に言ってほしいですけども)
###

役職が上の方でも、そうでない方でも、
ゼロ秒思考を実践してみて、私のように何か少しでも変化を感じることができたら良いなと思います。

拙文最後までお読みいただきありがとうございました！
###

https://books.rakuten.co.jp/rb/12570596/
calc()内でscssの変数表記を使いたい

ちょろい内容ですがいっつも書き方忘れるのでメモ。
calc()内でscssの変数表記を行っても、変数展開されないのでその時のTips

```scss
// 両端にmarginで余白を取り、widthはそれを引いた値にしたい

// NG
$margin-width: 20px;
.sample {
  width: calc(100% - $margin-width * 2); // この書き方ではだめ
  margin: 0 $margin-width;
}

// OK
$margin-width: 20px;
.sample {
  width: calc(100% - #{$margin-width} * 2); // #{}で囲む
  margin: 0 $margin-width;
}
```

地味に困ってる方いるんじゃないでしょうか。。。
EVMのざっくり理解

IPA試験対策勉強をしています。　プロジェクト管理手法の __EVM__ の自分なりの理解です。

# 問題
以下の表は10日間のプロジェクトの、5日目の終了時点での状況を表している。
この時点でのコスト効率が今後も続くとしたら、EACはいくらになるか？

| 管理項目 | 金額（万円） |
|:---:|:---:|
|BAC|100|
|PV|50|
|EV|40|
|AC|60|

# 考え方
PV(Planned Value : 出来高計画値)は50万円だから、5日目の時点で50万円分の仕事をする計画のようだ。　でもEV(Earned Value : 出来高実績値)は40万円しかないから、計画未達じゃないか。　プロジェクトは遅れているみたいだね。

EVの40万円の作業をするのに、実際にはAC(Actual Value : コスト実績値)の60万円もかかってる。　だから作業効率CPI(Cost Performance Index : コスト効率指数)は $\frac{EV}{AC}$より66.7%だ。　効率悪いな……

プロジェクトの残り5日の作業は$BAC - EV$ だから60万円分ある。　だけどCPIで効率悪いことがわかってるから、実際のコストはもっとかかってしまうだろう。　残りの作業にかかるコストを表すETC(Estimate To Completion : 残作業コスト予測値)は$\frac{BAC - EV}{CPI}$で90万だ。

5日目時点での作業でACの60万円がかかっているから、それに残作業の予測値ETCを加えれば完成時のコストがわかる。　EAC(Estimation At Completion : 完成時総コスト予測値)は$AC + ETC$で150万円だ。

# まとめ

- $CPI = \frac{EV}{AC}$
- $ETC = \frac{BAC - EV}{CPI}$
- $EAC = AC + ETC$
より

$EAC = AC \cdot \left(1 + \frac{(BAC - EV)}{EV} \right)$
【Android】RecyclerViewで最後のアイテムが完全に表示されているかを検知する方法

# はじめに

皆さん、ごきげんよう！れぶです！

今回の記事では、``RecyclerView``をスクロールした場合、最後のアイテムが完全に表示されているかを検知する方法について書きます。

2分以内で読めます。それでは、参りましょう！！

# 開発環境

* MacBook Air
* Android Studio Electric Eel | 2022.1.1
* Kotlin
* compileSdkVersion 33
* minSdkVersion 21

# サンプルコード

以下のように``OnScrollListener``の``onScrolled()``内で、RecyclerViewの``LayoutManager``に対して``findLastCompletelyVisibleItemPosition()``を呼び出します。

```MainActivity.kt
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
        super.onScrolled(recyclerView, dx, dy)

        val layoutManager = recyclerView.layoutManager as LinearLayoutManager
        val totalItemCount = layoutManager.itemCount
        val lastVisibleItem = layoutManager.findLastCompletelyVisibleItemPosition()

        if (lastVisibleItem == totalItemCount - 1) {
            // 最後のアイテムの底までスクロールされた
            // ここに処理を追加する
        }
    }
})
```

findLastCompletelyVisibleItemPosition()と似たメソッドに、``findLastVisibleItemPosition()``が存在します。

この``findLastVisibleItemPosition()``は、最後に表示されるアイテムの**一部**が少しでも表示されていれば、その位置を返してしまいます。一方、``findLastCompletelyVisibleItemPosition()``は最後に**完全**に表示されているアイテムの位置を返すため、今回はこちらを使用します。

以上です。ありがとうございます。

# 参考サイト
* [findLastCompletelyVisibleItemPosition](https://developer.android.com/reference/kotlin/androidx/recyclerview/widget/LinearLayoutManager#findLastCompletelyVisibleItemPosition())
* [findLastVisibleItemPosition](https://developer.android.com/reference/kotlin/androidx/recyclerview/widget/LinearLayoutManager#findLastVisibleItemPosition())
* [RecyclerViewのItemが底まで表示されたかどうか判定する](https://qiita.com/jumperson/items/e1535d5f0aea21b1cc88)
システム設計書の作成における処理詳細の書き方：コツとポイント

# はじめに
システム設計において、処理詳細の記述は重要な作業の一つです。
処理詳細には、機能の具体的な処理内容や手順、入出力条件、例外処理などが記載されています。
本記事では、システム設計書における処理詳細の書き方について、コツとポイントを解説します。

# 1.処理詳細とは何か？
処理詳細とは、システム設計書において、システムが行う各機能の処理内容や手順、入出力条件、例外処理などを具体的に記載したものです。
処理詳細は、システム開発において重要な情報を提供し、設計者や開発者、テスターなど関係者のコミュニケーションを円滑にする役割を持っています。

# 2.処理詳細の役割と重要性
処理詳細は、システム開発において以下のような役割を持っています。

```
・ 機能の正確な理解を促進する
・ 開発者による実装のための手順書として機能する
・ テストの基準として機能する
・ 開発者やテスター、その他関係者の意思疎通を助ける
```

処理詳細は、システム開発において非常に重要な情報であり、
設計者や開発者、テスターなどが正確な理解を持っていることが求められます。

# 3.処理詳細を書く前に考えるべきこと

処理詳細を書く前には、以下のようなことを考えておく必要があります。

#### 3.1 機能要件を明確にする
>システム設計書の中で処理詳細を記述するためには、まず機能要件を明確にする必要があります。
処理詳細は、システムがどのように動作するかを記述するためのものです。
そのため、まずどのような機能が必要かを明確にすることが重要です。

#### 3.2 全体の流れを把握する
>処理詳細を書く前には、全体の流れを把握することも重要です。
システム設計書の中で、処理詳細はあくまでも一部であり、
全体のシステムの流れを考慮した上で、処理詳細を記述する必要があります。
全体の流れを把握しておくことで、処理詳細を正確に記述することができます。

#### 3.3 制限事項を把握する
>処理詳細を書く前には、制限事項を把握することも重要です。システムには、様々な制限事項があります。
たとえば、処理速度やデータ量の上限などがそれにあたります。
これらの制限事項を把握しておくことで、処理詳細をより現実的なものにすることができます。

# 4.処理詳細の書き方のコツ

処理詳細を書く際には、以下のようなポイントに注意することが大切です。

#### 4.1 抽象度を適切に調整する

>処理詳細は、システムの実装者が実際に手順を実行するための指針となるものです。
そのため、抽象度が高すぎると実装者が理解しにくくなります。一方で、詳細すぎると逆に読み手が混乱することがあります。
適切な抽象度を選択するためには、読み手のレベルや、システムの規模、実装者の経験などを考慮する必要があります。
ただ、現場によってのすでに作成されているものを参考にして抽象度を調整することも大切です。

#### 4.2 具体的な手順を記載する

>処理詳細は、具体的な手順を記載することが求められます。手順を記載する際には、以下のような点に注意することが重要です。

```
・ 手順の実行に必要な入力データを明示する
・ 手順の実行結果として出力されるデータを明示する
・ 手順に関する前提条件や注意点を明示する
・ 手順に関する制約事項を明示する
```

#### 4.3 入出力条件や例外処理も記載する

>処理詳細には、処理に必要な入力条件や、処理後に出力されるデータなど、入出力に関する情報を含めることが必要です。
また、想定されるエラーの種類や、その際の例外処理についても記載することが望ましいです。
例えば、ある処理が特定の入力値に対してエラーを返す場合、そのエラーの内容や、
エラーが発生した場合の処理内容について、明確に記載しておくことが重要です。

# 5.処理詳細のレビューと改善

システム設計書に書かれた処理詳細は、設計の実現性や正確性を確保するために重要です。
しかし、一人で書いた設計書が完璧かどうかを判断することは困難です。そのため、レビューと改善が必要となります。

まず、レビューは他の設計者や関係者に設計書を確認してもらうことです。
レビューを受けることで、自分の設計の誤りや見落としが発見され、改善することができます。
レビューの際には、以下の点に注意して行いましょう。

```
・ 設計の完全性を確認する
・ 正確性や妥当性を確認する
・ 一貫性や統一性を確認する
   （自分の記述した内容はもちろん、ほかの資料と比べて統一されているかも確認しましょう）
・ わかりやすさや明瞭性を確認する
```

また、レビューは複数回行うことが望ましいです。
最初のレビューで指摘されなかった問題点が、2回目や3回目のレビューで指摘されることもあります。

レビュー後、改善が必要とされた場合は、設計書を修正しましょう。
設計書を修正する際には、以下の点に注意して行いましょう。

```
・ 指摘された問題点に対して、正確に修正する
・ 修正後の設計書が、一貫性や統一性を保ったままになっているか確認する
・ 修正後の設計書が、わかりやすく明瞭になっているか確認する
```
# 6.まとめ

システム設計書の作成において、処理詳細を書く際には、機能要件や制限事項を明確にし、具体的な手順を記載することが重要です。
また、レビューと改善によって、設計書の完全性や正確性を確保し、一貫性や明瞭性を保ちましょう。
これらのポイントを押さえることで、より良いシステム設計書を作成することができます。
[HTML/js] SVGファイルをPNGに変換するツール

## 背景など

javascriptのキャッチアップ練習です。
指定したSVGファイルをPNGファイルに変換してダウンロードします。

変換用のソフト（ペイント3Dとか）が使えないところでは便利かもしれません。

動かした環境は次の通り。

- Windows 11 Home 22H2
- Microsoft Edge バージョン 111.0.1661.44 (公式ビルド) (64 ビット)

## コード

```html:svg2png.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>svg2png</title>
    <script>
      document.addEventListener('DOMContentLoaded', (ev) => {
        document
          .querySelector('#file_select_button')
          .addEventListener('change', (ev) => {
            // キャンセルの場合は何もしない
            if (!ev.target.files.length) {
              return;
            }
            // 選んだファイル
            const f = ev.target.files[0];
            // 保存名
            const pngName = f.name + '.png';
            // 画像読み込み用 Image要素
            const imgElement = new Image();
            // 読み込み後処理
            imgElement.onload = (ev) => {
              const img = ev.target;
              // 用済みのオブジェクトURLを解放
              URL.revokeObjectURL(img.src);
              // canvas生成
              const canvas = document.createElement('canvas');
              canvas.width = img.width;
              canvas.height = img.height;
              // canvasにimgを描画
              canvas.getContext('2d').drawImage(img, 0, 0);
              // PNGフォーマットでObjectURLを取得
              canvas.toBlob((blob) => {
                const pngurl = URL.createObjectURL(blob);
                // ダウンロード用にa要素を作成して、押す
                // （直接のダウンロードは行えないので、ダウンロード用リンクを作成しそれを踏む）
                const aElement = document.createElement('a');
                aElement.href = pngurl;
                aElement.download = pngName;
                aElement.dispatchEvent(new MouseEvent('click'));
                URL.revokeObjectURL(pngurl);
              }, 'image/png');
            };
            // ファイルをオブジェクトURLにして読み込み開始
            imgElement.src = URL.createObjectURL(f);
          });
      });
    </script>
  </head>
  <body>
    <input type="file" id="file_select_button" accept="image/svg+xml" />
  </body>
</html>
```

ObjectURLの必要生存期間がよく分からないです。dispatchEvent直後に解放しちゃダメな気もする。
ドラッグ＆ドロップに対応できると、より使い勝手がよさそう。

## 参考

[ウェブアプリケーションからのファイルの使用 - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/File_API/Using_files_from_web_applications)
[HTMLCanvasElement.toBlob() - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/HTMLCanvasElement/toBlob)
[javascript - Convert SVG to image (JPEG, PNG, etc.) in the browser - Stack Overflow](https://stackoverflow.com/questions/3975499/convert-svg-to-image-jpeg-png-etc-in-the-browser)
[SVG画像をjavascriptでpngに変換してダウンロードする方法](https://zenn.dev/skryo/articles/7d7f1ce601510b)
VimiumでMarkdownのURL(+タイトル)コピペを楽にする

# やりたいこと

`YY` を押すだけで`[Title](URL)` 形式で一発コピーをしたい。


# Vimiumで行うには

残念ながら、通常のVimiumでは難しそう
ブックマークレットに追加して、呼び出すやり方がおそらく最速

https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb

## セットアップ

1. ブックマークに`[Title](URL)`型式でクリップボードにコピーするJavascriptを登録
  ブックマーク名は先人に倣って`copy_markdown` とします。
      ```js
    javascript:navigator.clipboard.writeText('['+document.title.replace(/([\[\]])/g,'\\$1')+']'+'('+location.href+')')
    ```

## 使い方

1. `b`キーで表示できるブックマーク用Vomnibarを表示
2. `copy_markdown`を入力しEnter
  (最後まで入力せずに、候補が絞られた時点でEnter入力でOK)


# でもやっぱりコマンドだけで実行したい

ここまでで十分なのですが、コマンドだけで呼び出したいというVimmerは次の方法を

# Vimium-cで行う

Vimiumをベースに拡張されたVimium-cと呼ばれるものがあるらしい

https://chrome.google.com/webstore/detail/vimium-c-all-by-keyboard/hfjbmagddngcpeloejdejnfgbamkjaeg

https://github.com/gdh1995/vimium-c

Vimium-cではVimiumのカスタムコマンドではできない特定URLを開くなどが可能になっている
これを使えばYY入力だけで実現できる

## セットアップ

1. Vimium-Cの拡張機能オプションを開く
2. 「Custom key mappings」に下記のマッピングを追加してSave
    (特定のURLを開く`openURL`コマンドに、先ほどのJavascriptを指定しています)
    ```.vimrc
    map YY openUrl url="javascript:navigator.clipboard.writeText('['+document.title.replace(/([\\[\\]])/g,'\\\\$1')+']'+'('+location.href+')')"
    ```
 
## 使い方

1. YY 押下

# 最後に

QiitaのURLリンクなどをメモに追加するのが格段に楽になりました🎉
Vimium-Cには他にも色々機能はありそうですが、とりあえずやりたいことができたのでここまで

yyでのヤンクと同様に「Cliped！」といったメッセージを出す方法がわかる方がいればコメント欄でお願いします。


# 参考サイト

* [Vimiumで快適なコピペ生活(Title/URL) - Qiita](https://qiita.com/nakataka777/items/c70dd9730fb96aa1d537)
* [ウェブページにある表をクリップボードにポチッとコピーするブックマークレットの巻](https://vucavucalife.com/table-wo-clipboard-ni-copy-surudakeno-bookmarklet/)
* [Opening a bookmarklet and mapping to another key sequence · Issue #333 · gdh1995/vimium-c](https://github.com/gdh1995/vimium-c/issues/333)
privateメソッドのテスト

## 前提
privateメソッドのテストをそもそも書くべきかは要検討！
privateメソッドのモック化やverifyの確認に詰まったので記しておきます。

## テスト対象のクラス
```:Kotlin
class PrivateMethodClass {
    fun publicMethod(): String {
        privateMethodReturnNothing()
        return privateMethodReturnString("test")
    }

    // 戻り値ありのprivateメソッド
    private fun privateMethodReturnString(text: String): String {
        return text
    }

    // 戻り値なしのprivateメソッド
    private fun privateMethodReturnNothing() {
        privateMethodReturnString("hoge")
    }
}
```

## テストコード
```:Kotlin
@Test
fun publicMethodTest() {
    val privateMethodClass = spyk(PrivateMethodClass(), recordPrivateCalls = true)

    // 戻り値ありのprivateメソッドのモック化
    every {
        privateMethodClass["privateMethodReturnString"](allAny<String>())
    } returns "test"

    // 戻り値ありのprivateメソッドのモック化
    every {
        privateMethodClass["privateMethodReturnNothing"]()
    }.answers { nothing }

    // テスト実施
    assertEquals("test", privateMethodClass.publicMethod())
    verify {
        privateMethodClass["privateMethodReturnString"](allAny<String>())
        privateMethodClass["privateMethodReturnNothing"]()
    }
}

```
ChatGPTの有料会員(Plus)になってGPT-4を利用する方法

# 筆者の関連記事
https://qiita.com/tak001/items/c3000b3ce9b6e72b2ae5

https://qiita.com/tak001/items/7605f0be7b424118e5a5

https://qiita.com/tak001/items/951cee065d7c20e17a0e


# 有料会員(Plus)になってGPT-4を利用する方法
現在(2023/03/21時点)では、有料会員になることで、GPT-4を利用することができます。

## 手順
- ChatGPTにログインする
- 左メニューの「Upgrade to Plus」をクリック
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/ace0354d-00ba-1d64-6955-ce318affe96d.png)
- ChatPGT Plusの「Upgrade plan」をクリック
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/742c6e85-13f9-f1cf-b686-07b46018b52b.png)
- 登録している電話番号にコードが送られるので、確認して入力
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/685e430b-85f3-c421-0b58-5f28f7badb32.png)
- カード情報と住所を入力して「Subscribe」をクリックする
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/6d76b1d2-c580-f0b3-26c5-64612cf2e297.png)
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/b86b230e-49f6-b9ef-4d9b-766ab3a56d57.png)
- 完了すると以下のページが表示されるので「Continue」をクリック
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/53d6c877-6668-2f0c-084f-b254dc7d370e.png)
- すると、「Try GPT-4」というボタンが表示されるのでクリック
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/eff8fe46-6253-a22b-b094-d07d81952019.png)
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/14443da3-1fe6-adf4-c888-3b9eb3f5adb8.png)
- TOPページに「Model」という項目が選べるようになっているので、「GPT-4」を選択してから、今まで通り質問を投げかける
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/ac7549d1-adb5-dfdd-9ea3-a0a55fee2c34.png)
- 下に書かれている通り、現在は制限がかかっています
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/e776598e-302f-b5f0-b1a7-95b12a625ddf.png)
Excelの基本について

## はじめに

今回はエクセルの基本について解説します。
完成版ではないので、都度更新していきますのでよろしくお願いいたします。
自身の備忘録として書きますので参考になると幸いです。

## Excelの関数一覧

絶対参照　fn+F4
SUM関数（合計）=SUM(○○:○○)　Shift+Alt+=
IF関数（条件分岐）IF(論理式,真の場合,偽の場合) =IF(○○>○○,"",""　


## ショートカットキー
上書き保存　Ctrl+s
名前を付けて保存　fn+F12
計算式のチェック　Ctrl+Shift+@
セルをA1に戻す（一番上に戻す）　Ctrl+home
文字があるセルの末尾に進む　Ctrl+矢印
文字があるセルを一括指定　Ctrl+shift+矢印
セルの編集　fn+F2　もしくは　F2
今日の日付を表示　Ctrl+;
今の時間を表示　Ctrl+:
計算式のコピペ　ダブルクリック
検索　Ctrl+F
置換　Ctrl+H
リンク指定　Ctrl+K
セルの書式設定 Ctrl+1 
メモ　shift+fn+F2
右クリック→コメントの挿入

## エラー

①ゼロで割ってしまった　#DIV/0!
②参照元のセルがない　#REF!
③数字が大きくてセルに表示できない　##### 1E+9


## その他

ユーザー定義　語尾に付けたいものや、番号を0から始めたい時は右クリックでセルの書式設定を変更する

注意書き設定　セルの書式設定→文字を「上付き」にする

ファイル名ルールや保存方法
　タイトル_年月日_バージョン
　例)売上管理_20230321_3
　保存するたびに日付を入れておけば、最新版が分かりやすい
　日付が変わったら、またバージョンを1に戻す
　古いファイルは全てoldフォルダに移しておく。最新のフォルダのみ表に出しておく。そうすると、最新のファイルがどれか分かりやすい。


## おわりに

今回はExcelについて解説しました。
都度更新していきますのよろしくお願いいたします。
CrossEntropyLossの挙動を確認する

# 推定結果(x)が[0.6,0.4]でラベル(y)が[1,0]のクロスエントロピーを求めたい。
期待する数式は以下のようになり、その答えは0.510826となるはずである。
``` math
loss = -1*\log(0.6)-0*\log(0.4)=0.510826
```
これをCrossEntropyLossで実装してみる。
``` python
x = torch.Tensor([0.6,0.4])
y = torch.Tensor([1,0])
result = torch.nn.CrossEntropyLoss()(x,y)
print(result)
```
この結果は0.5981になる。
結果が異なった原因は[公式ドキュメント](https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html)を読むと解決できる。
>This criterion computes the cross entropy loss between input logits and target.

この関数は、input logitsとtargetの間のクロスエントロピーを求めるとある。targetはラベルのことだと思うが、input logitsとはなんぞや？
[調べてみる](https://minus9d.hatenablog.com/entry/2020/10/25/193018)とlogitsは, softmax関数に通す前のニューラルネットワークの出力らしい。
さらにこのような説明もある。
> The input is expected to contain the unnormalized logits for each class (which do not need to be positive or sum to 1, in general).

正である必要や和が1になっている必要はないとある。いろいろ調べてみると、どうやらCrossEntropyLossは, 第1引数(推定結果側)に入ってきた値のsoftmaxを計算しているようである。
つまり、CrossEntropyLossでは、以下の式を計算していることとなる。
``` math
    loss = -1*\log\biggl(\frac{e^{0.6}}{e^{0.6}+e^{0.4}}\biggr)-0*\log\biggl(\frac{e^{0.4}}{e^{0.6}+e^{0.4}}\biggr)
```
上式を計算すると0.5981となる。pythonでの実行結果と一致した...!!
それなら、入力である0.6や0.4のlogを取ってあげれば、
``` math
\begin{align}
loss &= -1*\log\biggl(\frac{e^{\log(0.6)}}{e^{\log(0.6)}+e^{\log(0.4)}}\biggr)-0*\log\biggl(\frac{e^{\log(0.4)}}{e^{\log(0.6)}+e^{\log(0.4)}}\biggr)\\
 &=-1*\log\biggl(\frac{0.6}{0.6+0.4}\biggr)-0*\log\biggl(\frac{0.4}{0.6+0.4}\biggr)\\
 &=-1*\log(0.6)-0*\log(0.4)\\
 &=0.5108
\end{align}
```
となり、求めたい値と一致するはずである。よって、pythonでの実装にlogをとる処理を追加してみる。
``` python
x = torch.Tensor([0.6,0.4])
y = torch.Tensor([1,0])
result = torch.nn.CrossEntropyLoss()(torch.log(x),y)
print(result)
```
この結果は0.5108となる。期待する値と一致した...!!

# weightってなんぞや？
CrossEntropyLossにはweightという引数がある。これの挙動を確認する。
推定結果がx=[0.6,0.4]、ラベルがy=[0.5,0.5]、weight=[1,2]とする。
``` python
x = torch.Tensor([0.6,0.4])
y = torch.Tensor([0.5,0.5])
weight = torch.Tensor([1,2])
result = torch.nn.CrossEntropyLoss(weight=weight)(x,y)
print(result)
```
これの実行結果は, 1.0972となる。
公式ドキュメントを元にこの値と一致する数式を考えると、以下の式のように計算されているようである。
``` math
    loss = -1*0.5*\log\biggl(\frac{e^{0.6}}{e^{0.6}+e^{0.4}}\biggr)-2*0.5*\log\biggl(\frac{e^{0.4}}{e^{0.6}+e^{0.4}}\biggr)
```
よって、それぞれのクラスごとに何倍するかを表しているものがweightらしい。

# ignore_indexってなんぞや？
分からん。
特定のクラスを無視する的なこと書いてあるけど、指定するとエラーがでてくるので今回はskip!!

# reductionってなんぞや?
"mean"とか"sum"とか書いてあって、クロスエントロピーにmean??みたいなことになったので、挙動を確認していく。
xとyをそれぞれ、バッチサイズが3のデータであるとする。
``` python
x = torch.Tensor([[0.6,0.4],
                  [0.6,0.4],
                  [0.6,0.4]])
y = torch.Tensor([[1,0],
                  [1,0],
                  [1,0]])

result = torch.nn.CrossEntropyLoss(reduction="mean")(x,y)
print(result)
```
この結果は、0.5981
```python 
x = torch.Tensor([[0.6,0.4],
                  [0.6,0.4],
                  [0.6,0.4]])
y = torch.Tensor([[1,0],
                  [1,0],
                  [1,0]])

result = torch.nn.CrossEntropyLoss(reduction="sum")(x,y)
print(result)
```
この結果は1.7944
初めの実験で、x=[0.6,0.4],y=[1,0]とバッチサイズを1で入力したときは、結果は0.5981となっていた。これは、"mean"で行なった場合の結果と一致している。次に"sum"で行なった場合は、0.5981*3=1.7944と3倍になっていることが分かる。これより、データが複数ある場合にそれぞれのクロスエントロピーの和を取るか平均を取るかがreductionであることが分かった。
Rubyに関して業務で最近学んだことの備忘録

実務での学びを忘れないように備忘録を残す。
あくまでも個人的な備忘録なので、手間をかけずググったサイトを貼り付けて一言添える感じで。



### テンプレートレンダリングの評価順
バグの調査でビューが原因となっているケースがあり、application.htmlとrender対象のどちらが先に評価されるのかを特定するために参考にした記事。
結果、render→application.htmlの順で評価されていた。
参考:
[Railsのテンプレートレンダリングを分解調査する#2 ActionView編](https://techracho.bpsinc.jp/hachi8833/2019_01_18/68009 )
[Railsのviewとlayoutの評価順についてコードを読んで納得した](https://blog.freedom-man.com/rails-view-layout)

### メソッドの定義場所を探す方法
クラスにメソッドが生えているかチェックした時に活用。
ソニックガーデン伊藤様の記事。RSpec等々いつもお世話になっております。
本記事も超有用でした。
[Rubyでメソッドの定義場所を見つける方法](https://qiita.com/jnchito/items/fc8a61b421d026a23ffe)

### clone、dupメソッド、浅いコピーと深いコピー
cloneとdupはオブジェクトを複製して返す。両方浅いコピー。
浅いコピーはオブジェクトの参照先までは複製しない。
深いコピーはMarshalクラスを使う。


[リファレンス-clone](https://docs.ruby-lang.org/ja/latest/method/Object/i/clone.html)
[Rubyでのオブジェクトコピー dupとcloneについて](https://mgre.co.jp/blog/3252)
[Rubyでオブジェクトの複製を作るならdupメソッドを](https://style.potepan.com/articles/27809.html)
([ruby]浅いコピーと深いコピー)[https://qiita.com/oyrarumakan/items/5cfcac1b8e67184641f1]

### try/try!メソッド
某gemで利用されており知らなかったので調べた。
メソッドがあれば利用し、なければnilまたはnomethoderrorを返すメソッド。
便利だけどそもそもこのシチュエーションあるのか？
[Railsドキュメント-try](https://railsdoc.com/page/try)
[【Ruby on Rails】tryとtry!と&.（ぼっち演算子）の違い](https://qiita.com/massaaaaan/items/ce5856559e55e85b69d8)

### gsub/gsub!メソッドの返り値の違い
正規表現などを使って文字列を置換するときに活用。
gsub!は置換しない場合、nilを返す。（勘違いに注意）
[Ruby3.2リファレンス-gsub](https://docs.ruby-lang.org/ja/latest/method/String/i/gsub.html)
[Ruby3.2リファレンス-gsub!](https://docs.ruby-lang.org/ja/latest/method/String/i/gsub=21.html)

### HTMLエンコード
h()もしくはhtml_escape()でエンコードできる。CSRF対策とかで使うよう。
[h( ... ) でHTMLエンコード ](http://rubist.blog77.fc2.com/blog-entry-36.html)

### 例外処理
rescueの書き方が曖昧だったので。
特定のエラーを拾うのに活用できる。
参考:
[【Rails】例外を発生させる方法｜rescueの使い方。begin rescueとの違いやraise, retry, ensure](https://prograshi.com/framework/rails/rescue_rais_retry_ensure/)
[【Rails】例外処理の書き方(begin, rescue, raise,retry, ensure)](https://qiita.com/ngron/items/4c319ae7340b72c7e566)

### ブロックの渡し方
そもそもブロックってなんだっけ？状態からのスタートだったので。
Procとかyieldは
block_given?はブロックを受け取っているかの評価ができる。

[Rubyのブロック、ブロック引数、Proc、yieldをまとめてみた](https://rails-study.net/proc-block/#i-2)
[Ruby3.2リファレンス　module function Kernel.#block_given?](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/block_given=3f.html)

以上。パート2とかも出していきたい。（多分無理か、、。）
[AWS Q&A 365][EFS]AWSのよくある問題の毎日5選 #11

# 1. アマゾンエラスティックファイルシステムとは何ですか？
答え：アマゾンエラスティックファイルシステム（Amazon EFS）は、Amazon EC2 インスタンスやオンプレミスサーバーで使用するための、スケーラブルで高可用性、セキュアなファイルストレージサービスを提供する完全に管理されたファイルストレージサービスです。

# 2. Amazon EFSはAmazon EC2やその他の対応する計算インスタンスとどのように連携していますか？
答え：Amazon EFSは、ファイルシステムインターフェース、ファイルシステムアクセスセマンティクス（強い整合性やファイルロックなど）、標準のファイルシステムAPIを提供し、アプリケーションやサービスとAmazon EFSをシームレスに統合できます。Amazon EFSは、Amazon EC2インスタンスやその他の対応する計算インスタンス（オンプレミスサーバーを含む）と、Network File Systemバージョン4（NFSv4）プロトコルを使用して連携します。

# 3. Amazon EFSで利用可能なストレージクラスは何ですか？
答え：Amazon EFSは、StandardとOne Zoneの2つの異なるストレージクラスを提供しています。Standardストレージクラスは、リージョン内の複数のアベイラビリティゾーンにデータを格納することで、高可用性と耐久性を提供します。One Zoneストレージクラスは、Standardストレージクラスと同じレベルの可用性と耐久性が必要とされないワークロード向けの低コストストレージを提供します。

# 4. Amazon EFSでファイルシステムを作成・管理する方法は？
答え：AWS管理コンソール、AWS CLI、またはSDKを使用して、Amazon EFSでファイルシステムを作成・管理できます。ファイルシステムを作成するには、パフォーマンスモード、スループットモード、ストレージクラス、その他の設定オプションを指定する必要があります。また、ファイルシステムのマウントターゲット、セキュリティグループ、アクセスポイントを管理できます。

# 5. Amazon EFSのパフォーマンス問題を監視・トラブルシューティングする方法は？
答え：CloudWatchメトリクス、パフォーマンスモード、スループットモード、およびNFSクライアントのマウント設定など、さまざまなツールや手法を使用して、Amazon EFSのパフォーマンス問題を監視およびトラブルシューティングできます。さらに、小さなファイルのパフォーマンス、ディレクトリのパフォーマンス、およびNFS read_ahead_kbサイズを最適化してパフォーマンスを向上させることができます。また、AWS BackupおよびEFSレプリケーションを使用して、データを保護および複製できます。
UbuntuでVisual Studio Codeをインストールした場合の実行ファイルの格納場所

Gitのデフォルトエディターの設定で、Visual Studio Codeの実行ファイルがあるディレクトリパスが必要だったんですが、なかなか探せず、更にそれほど需要もないのか、いい検索記事がなかったので備忘録的にメモしておきます。

/usr/share/code/bin/code

ここにありました。
[AWS Q&A 365][EFS]Daily Five Common Questions #11

# 1. What is Amazon Elastic File System? 
Answer: Amazon Elastic File System (Amazon EFS) is a fully managed file storage service that provides scalable, highly available, and secure file storage for use with Amazon EC2 instances and on-premises servers. 
# 2. How does Amazon EFS work with Amazon EC2 and other supported compute instances? 
Answer: Amazon EFS provides a file system interface, file system access semantics (such as strong consistency and file locking), and a standard file system API that allows you to seamlessly integrate Amazon EFS with your applications and services. Amazon EFS works with Amazon EC2 instances and other supported compute instances, including on-premises servers, using the Network File System version 4 (NFSv4) protocol. 
# 3. What are the different storage classes available in Amazon EFS? 
Answer: Amazon EFS offers two different storage classes: Standard and One Zone. The Standard storage class provides high availability and durability by storing data across multiple Availability Zones in a region. The One Zone storage class provides lower-cost storage for workloads that don't require the same level of availability and durability as the Standard storage class. 
# 4. How do I create and manage a file system in Amazon EFS? 
Answer: You can create and manage file systems in Amazon EFS using the AWS Management Console, AWS CLI, or SDKs. To create a file system, you need to specify the performance mode, throughput mode, storage class, and other configuration options. You can also manage mount targets, security groups, and access points for your file systems. 
# 5. How do I monitor and troubleshoot performance issues in Amazon EFS? 
Answer: You can monitor and troubleshoot performance issues in Amazon EFS using various tools and techniques, such as CloudWatch metrics, performance modes, throughput modes, and NFS client mount settings. You can also optimize small-file performance, directory performance, and NFS read_ahead_kb size to improve performance. Additionally, you can use AWS Backup and EFS replication to protect and replicate your data.