OmniAICreator/Qiita-1.07M huggingface dataset:
Experience Cloud サイトのレコード詳細ページに Lightning レコードページを設定する

[テクノサポートJan 10, 3:59 PMの記事](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UvNEQ)

Lightning レコードページは Lightning Experience もしくは Salesforce モバイルアプリケーションにてご利用可能な機能でございますので、Experience Cloud サイトでは設定できかねますが、Experience Cloud サイトのページをカスタマイズいただいて、ご希望の配置やデザインに設定いただくことは可能です。

具体的には、以下の手順でカスタムページを作成することで、特定のオブジェクトのレコード詳細ページをカスタマイズいただけます。

**カスタムページ設定手順概要**
1. [設定] から [すべてのサイト] と検索して [すべてのサイト] に遷移
2. 対象エクスペリエンスサイトの [ビルダー] をクリック
3. 画面左上の [Home] が表示されている箇所の歯車アイコンをクリックし、[新規ページ] をクリック
4. 種別で「オブジェクトページ」を選択してページを作成後、ご希望のコンポーネントを配置してページをカスタマイズ
5. ビルダー画面右上の [公開]をクリックし、作成したページを公開する

■参考ドキュメント

【エクスペリエンスビルダーを使用したカスタムページの作成】
https://help.salesforce.com/s/articleView?id=sf.community_builder_create_page.htm&type=5
Chromium でショートカット ファイルをダウンロード時、.download に変換されるのは仕様

# これは何？
Edge で .lnk ファイルをダウンロードしようとすると、".download" という拡張子に変換され、
そのままだと即座に実行できないという動作があります。
これが仕様である根拠です。

※ ファイルダウンロード中の一時ファイル用拡張子である ".crdownload" とは別物です。

# 根拠
https://bugs.chromium.org/p/chromium/issues/detail?id=159292

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48302/41f8b4f8-0da9-622c-9682-c6cec97015f2.png)

# 意訳
ダウンロードという領域はセキュリティ分野で地雷原のようなもので、対処しなきゃいけないものはたくさんある。
そんな状況なので、大して重要でもないくせに何でもできてしまう .lnk の面倒を追加で見たくないよ、ごめんね！

# すぺさん
[データ全損ニキ](https://twitter.com/HomesickTic)

# 余談
地雷原 (minefield) という表現から John Burak -san の何とも言えない感情が伝わってきて趣深いですね。
Astroでreact-iconsを使う方法

## AstroでReact-iconnsが使えない！？

https://astro.build

SSGに特化したWeb開発フレームワークで有名なAstroですが、ビルド時にreact-iconsが使えないという問題が開発中に発生しました。
ローカル環境だとうまく動作するのですが、ビルド時、あるいは本番環境で500エラーが起きる可能性があります。
実際に開発中のプロジェクトで次のような書き方をしてVercelにデプロイしたところ500エラーが起きました。
```jsx
import { IoLogoGithub } from 'react-icons/io5';
```

## 原因はVite
AstroではバンドルツールにViteが採用されています。Viteではバンドルの際にCJSが用いられ、このインポート方法でエラーが起こります。(おそらく厳密ではありません。悪しからず)

## 解決方法
1. **CJS記法に倣う**
    ```jsx
    import pkg from 'react-icons/io5';
    const { IoLogoGithub } = pkg;
    ```
    CJSに倣った書き方です。しかし、これでは逐一パッケージを定数にインポートしてから分割代入で取り出す作業が必要になり、冗長かつ使いたいアイコンの数だけパッケージを定義しなければなりません。
1. **Viteの設定を変更する(推奨)**
    ```js:astro.config.mjs
    import { defineConfig } from "astro/config";

    export default defineConfig({
      ...,
      vite: {
        ssr: {
          noExternal: ["react-icons"],
        },
      },
    });
    ```
    Viteがreact-iconsのファイルをバンドルしないようにastro.config.mjsを変更します。
    こちらのissuesから拝借しました。
    
https://github.com/withastro/astro/issues/7629

# おわりに
Astroは多くのスタックを柔軟に取り入れることのできるフレームワークであるという長所ゆえの、このようなエラーやコンフリクトが起こりやすい短所も持っています。ドキュメントは非常に親切ですが、カバーしきれていない部分も非常にたくさんあります。そんなときはGitHubのissuesを除いてみてください
Gitのコミットの取り消し

## 環境
Ubuntu20.4

## はじめに
コミットの取り消しの実演を行います。個人で開発している分には、コミットを取り消したい場面に遭遇することは滅多にありません。「しまった、やってしまった。急いで取り消さなくては！」という事態に遭遇したとき、恐らく、気持ちの面では、相当程度焦っていると思われるため、こういった作業は、サクッと行えるようにしておいた方がいいだろうと思います。

## やったこと
gitのログを確認すると、現在このようになっています。
```
$git log --oneline
e6f6bc1 (HEAD) aaaccc
0619520 aa
8786091 ad
1ff8c28 aaa
5d9625c add
b3aa690 add file
8b66d30 ggg
3a68b15 ddd
```

直前のコミットを１つ取り消します。
```
$git reset --hard HEAD^
```

確かに、直前のコミット（aaaccc）が取り消されて、次の履歴であるaaがHEADに繰り上がりました。
```
$git log --oneline
0619520 (HEAD) aa
8786091 ad
1ff8c28 aaa
5d9625c add
b3aa690 add file
8b66d30 ggg
3a68b15 ddd
```

もう一度、同じコマンドを実行すると、次は、現在HEADになっているaaが取り消されて、その次の履歴であるadがHEADに繰り上がりました。
```
$ git reset --hard HEAD^
$ git log --oneline
8786091 (HEAD) ad
1ff8c28 aaa
5d9625c add
b3aa690 add file
8b66d30 ggg
3a68b15 ddd
```

オプションでHEAD^を指定すると、直前のコミット１つが取り消されますが、HEAD^の代わりに、IDを指定して取り消すこともできます。

現在、HEADになっているIDを指定して取り消しを行いました。当然、何も起こりません。
```
$git reset --hard 8786091
$ git log --oneline
8786091 (HEAD) ad
1ff8c28 aaa
5d9625c add
b3aa690 add file
8b66d30 ggg
3a68b15 ddd
```

HEADの次の履歴のIDを指定して取り消しを行います。すると、現在HEADになっているadが取り消されて、次の履歴であるaaaがHEADに繰り上がりました。
```
$git reset --hard 1ff8c28
$ git log --oneline
1ff8c28 (HEAD) aaa
5d9625c add
b3aa690 add file
8b66d30 ggg
3a68b15 ddd
```

IDを指定すると、複数のコミットをまとめてごそっと取り消すこともできます。次の例では、２つのコミットを一気に取り消しています。
```
$git reset --hard b3aa690
$ git log --oneline
b3aa690 (HEAD) add file
8b66d30 ggg
3a68b15 ddd
```
「Linuxのしくみ 増強改訂版」のコードを実行するため、DockerでUbuntuの仮想環境を構築する方法

# はじめに
[「Linuxのしくみ 増強改訂版 実験と図解で学OS、仮想マシン、コンテナの基礎知識」](https://www.amazon.co.jp/%EF%BC%BB%E8%A9%A6%E3%81%97%E3%81%A6%E7%90%86%E8%A7%A3%EF%BC%BDLinux%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF-%E2%80%95%E5%AE%9F%E9%A8%93%E3%81%A8%E5%9B%B3%E8%A7%A3%E3%81%A7%E5%AD%A6%E3%81%B6OS%E3%80%81%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%80%81%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98%E3%80%90%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88%E3%80%91-%E6%AD%A6%E5%86%85-%E8%A6%9A/dp/429713148X)はサンプルコードを物理マシン上にインストールしたUbuntu20.24上で実行することを想定しています。しかし、私はmacOSを使用しているので、Ubuntuの仮想環境を構築して学習を進めることにしました。今回の記事dは、DockerでUbuntuの仮想環境を構築する方法をまとめていきます。

# GitHubのリポジトリ
このリポジトリに仮想環境を構築する際に必要な、ソースコードやDockerfileがあります。また、GitHubのREADMEにも本記事と同じ手順が記されているので、ご覧ください。

https://github.com/zakzackr/hands-on-linux.git

*書籍のサンプルコード（[linux-in-practice-2nd](https://github.com/satoru-takeuchi/linux-in-practice-2nd.git)）を使用しています。

# 手順1
Desktopに移動し、本リモートリポジトリをgit cloneする。本リポジトリの内容がhands-on-linuxフォルダとしてクローンされます。 今回の例では、Desktop以下にフォルダを作成していますが、どこでも大丈夫です。

```
cd Desktop
git clone https://github.com/zakzackr/hands-on-linux.git
```

# 手順2
Dockerfileが存在するhands-on-linuxフォルダに移動します。その後、2行目でDockerfileからhands-on-linuxというdocker imageを作成し、3行目でhands-on-linux(docker image)からコンテナを起動しています。

```
cd hands-on-linux
docker image build -t hands-on-linux .
docker run --rm -it hands-on-linux /bin/bash
```
手順2までを実行すると、下記のようにlinux-in-practiceフォルダ内に「Linuxのしくみ」を学習する際に必要なソースコードが表示されます。
```
root@8138f14ec0a3:/# cd linux-in-practice 
root@8138f14ec0a3:/linux-in-practice# ls
01-operating-system-overview  02-process-management-1  03-process-scheduler  04-memory-management  05-process-management-2  07-filesystem  08-storage-hierarchy  09-block-layer  10-virtualization  12-cgroups  LICENSE  README.md
```

# 試しにp.6のhello.goを実行してみる
```
root@8138f14ec0a3:/linux-in-practice# cd 01-operating-system-overview
root@8138f14ec0a3:/linux-in-practice/01-operating-system-overview# go build hello.go
root@8138f14ec0a3:/linux-in-practice/01-operating-system-overview# ./hello
hello world
root@8138f14ec0a3:/linux-in-practice/01-operating-system-overview# strace -o hello.log ./hello
hello world
root@8138f14ec0a3:/linux-in-practice/01-operating-system-overview# cat hello.log
...
write(1, "hello world\n", 12)           = 12
...
```

# おわりに
書籍と同じ結果が得られました！今後学習を進めていく中でうまく動作しない部分があれば、適宜更新していきたいと思います。
もう何も読みたくない人、何かちゃんと読みたい人向け- LLMテキスト要約術

## 概要
皆さん普段どのようにあらゆるコンテンツを読んでますか。

私は今までは真面目に読みましたが、もう。。。ChatGPTの要約なしでは読めない人間になってしまいました。
- 画面の見過ぎ「目が疲れてもう読めない😥」
- 子育てや家事で時間がない
- もっと楽しいところに使いたい

といった個人的な理由もありますが、実はきれいに要約するというところには科学的な根拠もあります。
 
#### 人の集中力の限界
人が集中して読める文字数は1200～1800文字ということです。 コンテンツに含まれる引用やリンクに使う文字数などを考慮すると、**10～20％程度差し引いて考えられるため、全体で1000文字程度**と言えます。

#### 構造化
最近、文章ばっかり並んでいる本を読んだ覚えはありますか。私は4～5年の間ない気がします。さらに、モニターで表示すると理解はもっと下がるので伝わりやすくするためには構造化が必要です。

#### ムダな広告
ネット上のページでよくコンテンツを読んでますが、
ある研究によるとサイトに記載されているムダな広告とポップアップで脳のパフォーマンスが10%程度は減るらしいです。

## 本題
今回は実践例として以下サイトをまとめてみることにしました。
**[プロンプトの例](https://www.promptingguide.ai/jp/introduction/examples "プロンプトの例")**

真面目に読むとしたら結構長い・・・時間があれば見比べてみてください。 **約 5600文字。**

### まとめるこつ
#### 1. まずは内容を1,000文字以下にする。
ネット接続が制限されているところだとそのままテキストを渡すか、ネットURLを渡す。

例えば
プロンプト:以下URLの記事を1000文字以下要約して or 以下テキストを1000文字以下で要約して。

#### 2. 予約した文をもとにさらに絞り、構造化する

例えば
プロンプト:

```  
以下の「本文:」 内容を修正してください。フローは次のstep1. からstep.5 通りでやってください。
step1. **主要な情報を特定する：** リンク先の内容を読み、主要なトピックやキーポイント、重要なデータを把握します。
step2. **不要な情報を取り除く：** 細かい詳細や関連性の低い情報を除去し、読者が理解すべき核となる情報だけを残します。
step3. **構造化された形式にする：** 情報をリスト、箇条書き、見出しやサブヘッダーを使用することで読者が追いやすい構造にします。
step4. **分かりやすい言葉で再構成する：** 専門用語や複雑なフレーズを簡単な言葉に置き換え、よりアクセスしやすい言葉遣いで内容を伝えます。
step5. **要約を提供する：** 全体の要点を簡潔にまとめた要約を文章の最初または最後に配置します。

「本文:」は長いので省略しましたが、１.で要約してもらった平文です。
```

出力：
# 👇ChatGPTが分かりやすくまとめたもの👇

## 要約
このテキストは、大規模言語モデル（LLM）の使用例とプロンプトエンジニアリングの技術について説明しています。様々なタスクの例が挙げられており、テキスト要約、情報抽出、質問応答、テキスト分類、会話、コード生成、推論などが含まれ、それらの精度を向上させるための高度なプロンプト技術については次章で詳しく説明されます。

## 本文
大規模言語モデル（LLM）はプロンプトエンジニアリングにより多岐にわたるタスクをこなす能力を持ちます。以下に具体的な応用例を示します：

- **テキスト要約:** 抗生物質に関する長い説明文を短い概要にまとめる。
- **情報抽出:** 特定の情報を文から抽出する（例：ChatGPT）。
- **質問応答:** 特定の情報（例：Teplizumab）に基づいた質問に答える。
- **テキスト分類:** テキストを感情によって分類する（肯定的、否定的、中立的）。
- **会話:** プロンプトでAIの応答スタイルやトーンを調整。
- **コード生成:** 挨拶からMySQLクエリまで、様々なコードを生成。
- **推論:** 複雑な計算やタスクの解決に挑戦し、より洗練されたプロンプトが必要。

このガイドは、プロンプトエンジニアリングを適用することで性能を向上させる方法を示し、それが実用的な製品や体験の構築にどのように役立つかを探ります。次章では、タスクのパフォーマンスをさらに向上させるための高度な技術に焦点を当てます。

## 結論
どうでしょうか。ムダを読む努力を１～3つのステップで減らせると思いませんか。

- 内容要約
- 構造化
- 判断

読んだあと興味がある記事、自分に必要かどうか判断しましょう。理解を深めるのはその後でも良いのでは。
ナレッジベースプロジェクトの振り返り

# 

# 概要

サービスが10年を超えたことで、以下のような問題が発生し、生産性への足かせとなっていました。
1. 様々な機能追加が行われた結果、システムの全体像を把握するのが難しくなり、属人化や認知コストが増加
1. 過去のドキュメントはフォーマットや粒度、場所が統一されておらず見つけづらい
1. 「なぜこの機能を作ったのか」の経緯が失われていることが多く、「元々の実装経緯が分からず、処理を変えられない」、「この機能を消したいけど、誰がどんな目的で使っているのか分からないから提案できない」といった状況が発生

そこで、ドキュメント管理の方針決定と運用を推進する3人ほどのチームを作り、「ナレッジベースプロジェクト」と名付け、整備を進めました。

ドキュメントを作り上げた！ではなく、チーム全員で継続的にドキュメントを残し、資産にするための「仕組み作り」に関する振り返り記事です。

# What

ナレッジベース = サービスに関わるエンジニアが早期にパフォーマンスを発揮できるように、厳選した業務知識をまとめたGitHubリポジトリ。知識領域ごとに機能ベースでまとめたドキュメント。

# Why
### このシステム覚えること多すぎるよね?

1. 全体像や、どこにどんな機能が、なぜあるのか、どうやって動いているのかを把握するのに時間がかかる
2. 覚えるべき領域、優先度もよくわからない
3. 毎度、実装調査や人に聞いたりする必要がある
4. 障害・問い合わせ対応の心理的負担が大きい

### 開発者がパフォーマンスを発揮するまで時間がかかる

1. 部分的な深い知識だけでは、障害‧問い合わせ対応で活躍
できない、提案もしづらい
2. 歴の⻑い人にどんどん属人化してしまう
3. 覚える量に圧倒され、諦める、やる気を失う、悲しくなる
    - 俺たちのプロダクトだぜ!という気持ちを持ちづらい
    - どことなく不安になる

# コンセプト

1. このサービスにどのような機能が存在し、なぜ存在し、どのように連携しているのか、なるべくスピーディに理解しよう
2. 情報を厳選しよう
    - 「正確な情報」
    - 「メンテナンスされるべき情報」
    - 「最低限は知っておいて欲しい情報」
3. 「T型」知識をつけよう
    - 最低限知るべき知識 (横軸で広く浅く)
        - 今回はこちらを対象に、サービスにJOINしたらまず知ってもらう情報を整備
    - 専門的な深い知識 ( 縦軸で狭く深く )
        - ゆっくりと専門領域を深めてもらう、細かい仕様は各リポジトリで管理
4. 完了の定義を設け、品質を担保しよう
    - GitHubを利用し、ApproveとMergeという過程を経て完了とする
    - オマケの効果として、人事評価や目標設定にも活用しやすい定量的な基準になることも期待

# やってみて良かったこと

1. 想定読者を決める
    - その機能の開発に携わったことがない、または初めて知る人向け
2. 「分かっている前提」のCurse of knowledge（知識の呪縛）に陥らないようにする
    - 読んだ人がどうなることを望んでいるのかを考えながら書く
3. ディレクトリを分ける
    - 「**/<サービス名>の知識**」
        - 今回のコンセプトを表現し、遵守するディレクトリ
    - 「**/<サービス名>の開発・運用**」
        - 理解するにはもう少し詳細な仕様・フロー図が必要だよね!
        - 実装寄りの情報は壊れやすいため、メンテナンス不可能になる可能性もある
        - 最悪の場合、切り離して捨てる可能性を秘めたディレクトリ
    - その機能の開発に携わったことが無い、または初めて知る人へ
4. GitHubを使ったこと
    - レビューして貰えるので、変更も気軽
    - レビューにより品質担保、情報共有がしやすい
    - 個人目標に設定しやすい
        - レビュー通過の品質かつ、マージまでで完了を評価しやすい
            - ドキュメントをマージした = 知識がついた
    - GitHub Actions で色々出来そう
        - [textlint](https://github.com/textlint/textlint)が便利
        - リンク切れ等の検知も楽
5. 管理チームを立てたこと
    - 明確な方針を持ち、ルールや運用の設計をしたこと
        - Google [Technical writing](https://developers.google.com/tech-writing)をベースに設計、指導
    - 最初に「書いて欲しいこと」の骨組みを作ったこと
        - タイトル、段落を事前に7割程度作成していた
            - 内容のレベル感など期待値を伝えるとともに、書く人が無駄に迷わないようにする
    - 「書いてはいけないもの」は拒否したこと
        - コンセプトに沿わないものは
    - 一人では難しい取り組みだったが、小さな一歩を踏み出すことが出来た

# 今後に向けての課題

- ドキュメント作成は労力がかかる
    - プロジェクトの見積もりにドキュメント作成も含めるなどの工夫が必要
    - 皆に書いてもらう、習慣にしてもらう、というのが結局最も難しい
- 管理もそれなりに労力がかかる
    - 定期的に構成や導線の見直しが必要

今回は、ドキュメントを作り上げた！ではなく、ドキュメントを継続的に全員で作っていく、という仕組みや取り組みについて書いてみました。
AMAを利用している場合のLog Analytics ワークスペースとVMの切断方法

## はじめに
前回に続き、今回はAMA（Azure Monitor Agent）を利用している場合の、Log Analyticsワークスペースの切替方法を紹介します。

## AMAを利用している場合の注意点
AMA を利用したインベントリの収集の場合、MMA と大きく異なる点があります。
それは、有効化した際にデータ収集ルールが自動的に作成される点です。
ワークスペースとの接続との切断時に、自動作成されたデータ収集ルールを削除する必要があります。

なお、作成されるデータ収集ルールは、の名前は、"ct-dcr-" から始まる完全にランダムな命名となっています。

## Log Analytics ワークスペースとVMの切断方法
下記リンク先の①～③をすべて実施後、以下の手順⑤～に移ります。
https://qiita.com/utsunomiya_ff/items/febb8c4733f8c1b49be2

④ 対象のVMのページに移動し、[拡張機能とアプリケーション]からAMAをアンインストールする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/0872c1f8-1d00-d901-2607-d0f1be77753c.png)


 ⑤ 対象VMから、 ChangeTracking V2 エージェントも同様にアンインストールする。
   ※ Windows の場合 "ChangeTracking-Windows" 、 Linux の場合 "ChangeTracking-Linux" という名称で登録されている。

⑥ Azure Portalのすべてのサービスから、[モニター] ＞ [データ収集ルール]に移動し、"ct-dcr-" から始まるデータ収集ルールを削除する。
  ※ インベントリ収集に利用されているデータ収集ルールであるかどうか、スコープの対象 VM などを照らし合わせながら確認することを推奨。

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115411/88dcc899-62d7-b264-3bad-ae0d1feb5828.png)


これにて切断が完了です。

なお、詳細は以下のリンクを参考にしてください。

https://learn.microsoft.com/ja-jp/azure/automation/change-tracking/enable-vms-monitoring-agent?tabs=singlevm%2Carcvm

新規にワークスペースと接続したい場合は通常通り設定すれば問題ありません。

## おわりに
AMAの切替方法を紹介しました。
Azure Portalから削除できる簡単な方法なのでぜひ参考にしてください！
富岳のPyTorch-1.7.0で係り受け解析モジュールStanzaを動かすには

[昨日の記事](https://qiita.com/KoichiYasuoka/items/48da436803e828a3c8d4)を書きながら、スーパーコンピュータ「富岳」で[Stanza](https://stanfordnlp.github.io/stanza/)が動くのかが、気になった。現時点の富岳には[PyTorch-1.7.0](https://github.com/fujitsu/pytorch/wiki/PyTorch-DNNL_aarch64-build-manual-for-FUJITSU-Software-Compiler-Package-(PyTorch-v1.7.0)-JP)が[インストールされている](https://www.fugaku.r-ccs.riken.jp/doc_root/ja/user_guides/FugakuAIGuide/pytorch.html)ので、その上にStanzaを乗せて動かしてみよう。

```
#! /bin/bash
#PJM -L rscgrp=small
#PJM -L elapse=1:00:00
#PJM -L node=1
#PJM -j
#PJM -S

G=`id | sed 's/^.*gid=[0-9]*(\([^)]*\)).*$/\1/'`
set `ls -d /vol*/$G /vol*/data/$G` $HOME
export PYTHONUSERBASE=$1/Stanza
export PATH=/home/apps/oss/PyTorch-1.7.0/bin:$PYTHONUSERBASE/bin:$PATH
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/home/apps/oss/PyTorch-1.7.0/lib64
export STANZA_RESOURCES_DIR=$PYTHONUSERBASE/stanza_resources_dir
export TMPDIR=$PYTHONUSERBASE/tmp
mkdir -p $TMPDIR
pip3.8 install -U stanza deplacy tqdm typing_extensions --user

P=$TMPDIR/stanza.$PJM_JOBID.$$.py
cat << 'EOF' > $P
import stanza
nlp=stanza.Pipeline("eu")
doc=nlp("Gaur ama hil zen, gaur goizean ama hil nuen.")
import deplacy
print(deplacy.to_conllu(doc))
deplacy.render(doc)
EOF
python3.8 $P
```

富岳のログインノードから`pjsub`してみたところ、ジョブ待ち・インストール・ダウンロード等も含め、20分ほどで以下の結果が得られた。

```
# text = Gaur ama hil zen, gaur goizean ama hil nuen.
# sent_id = 0
1	Gaur	gaur	ADV	_	_	3	advmod	_	start_char=0|end_char=4
2	ama	ama	NOUN	_	Case=Abs|Definite=Def|Number=Sing	3	nsubj	_	start_char=5|end_char=8
3	hil	hil	VERB	_	Aspect=Perf|VerbForm=Part	0	root	_	start_char=9|end_char=12
4	zen	izan	AUX	_	Mood=Ind|Number[abs]=Sing|Person[abs]=3|VerbForm=Fin	3	aux	_	start_char=13|end_char=16
5	,	,	PUNCT	_	_	9	punct	_	start_char=16|end_char=17
6	gaur	gaur	ADV	_	_	9	advmod	_	start_char=18|end_char=22
7	goizean	goiz	NOUN	_	Animacy=Inan|Case=Ine|Definite=Def|Number=Sing	9	obl	_	start_char=23|end_char=30
8	ama	ama	NOUN	_	Case=Abs|Definite=Def|Number=Sing	9	obj	_	start_char=31|end_char=34
9	hil	hil	VERB	_	Aspect=Perf|VerbForm=Part	3	conj	_	start_char=35|end_char=38
10	nuen	edun	AUX	_	Mood=Ind|Number[abs]=Sing|Number[erg]=Sing|Person[abs]=3|Person[erg]=1|VerbForm=Fin	9	aux	_	start_char=39|end_char=43
11	.	.	PUNCT	_	_	3	punct	_	start_char=43|end_char=44

Gaur    ADV   <════╗         advmod
ama     NOUN  <══╗ ║         nsubj
hil     VERB  ═╗═╝═╝═════╗═╗ root
zen     AUX   <╝         ║ ║ aux
,       PUNCT <════════╗ ║ ║ punct
gaur    ADV   <══════╗ ║ ║ ║ advmod
goizean NOUN  <════╗ ║ ║ ║ ║ obl
ama     NOUN  <══╗ ║ ║ ║ ║ ║ obj
hil     VERB  ═╗═╝═╝═╝═╝<╝ ║ conj
nuen    AUX   <╝           ║ aux
.       PUNCT <════════════╝ punct
```

バスク語の例文「Gaur ama hil zen, gaur goizean ama hil nuen.」に対し、2つある「ama hil」がそれぞれnsubjとobjで繋がれている点も含め、ちゃんとUniversal Dependenciesで係り受け解析できている。とりあえず1ノードで動かしてみたけど、さて、大量の文章を係り受け解析する場合は、複数ノードにバラまいた方がいいかな。
2024年の数学の問題をRubyで

注）コメントをもとに問題文を修正しました(ありがとうございます！)。また、図を追加しました。

2024年に出るかもしれない数学の問題で気に入ったやつをRubyでやる。

> 2024を2個以上の連続した正の整数の和で表しなさい。(ただしRubyは使ってよいこととする。)

大人になると問題を解くのにRubyを使ってもよいのだ。

```ruby:sum2024.rb
n = eval(ARGV.shift || "2024")

(1...n).each do |first|
  (first..n).each do |last|
    sequence = first..last
    if sequence.sum == n
      puts "#{n} == (#{sequence}).sum, <#{sequence.size}>"
      break
    end
  end
end
```

これを実行すると
```
$ ruby sum2024.rb

2024 == (77..99).sum, <23>
2024 == (119..134).sum, <16>
2024 == (179..189).sum, <11>
```

のように、連続した整数の並びとその長さが表示される。


引数を与えるとその数で解く。`eval`を使ったのは、式でも指定できるようにしたかったから。
`(1...n)`のピリオドを2つにすると、自明な`2024 == 2024..2024` も表示するようになる。


<>の中は並びの長さを表しているのだが、23, 16, 11はどこから来たのだろう。
そこで2024を素因数分解してみる。

```ruby
# これを元のスクリプトに追加。
require 'prime'
p n.prime_division
```

すると下記の表示が追加されるようになる。
```
[[2, 3], [11, 1], [23, 1]]
```

奇数の`11`と`23`は、`2024 = 11*184` と考えて`184`を中心とした`11`個の並び、または
`2024 = 23*88` と考えて`88`を中心とした`23`個の並びを作ることに対応する。


一方、偶数の16は、因数の8を元にして`2024 = 8*253 = 8*126 + 8*127`と考えて、右側の塊の先頭が`127`となるような`8+8`個の並びを作ることに対応する。

わかりにくいので `84=2*2*3*7`を例にして図にしてみる。

まず`84=7*12`のような並びの数が奇数の場合。`12`を中心にして、左右3つずつに対して左から右に階段状に移せば連続した7つの数の並びの出来上がりだ。

![odd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986819/b41651f7-0b86-06ca-3489-6402fdb28031.png)

一方、`84=4*21`と考えた場合は、`21`を`10+11`と分けることができて、`4*10`と`4*11`の2つの塊ができる。これも左から右に階段状に移せば連続した`8`つの数の並びの出来上がり。

![even.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986819/41dbced7-d40f-78c9-f18b-3e0bc5ae5dce.png)

並びの長さが奇数の場合と偶数の場合で考え方が違うことが分かる。どちらも奇因数が大事なポイントになっている。2のべき乗の数は奇数を含まないので連続した整数の和で表すことができない。

良い問題ですね。今年の試験で使われるかな？
paizaラーニング解答: 素朴なソートアルゴリズムメニュー[Ruby]

# 素朴なソートアルゴリズムメニュー
https://paiza.jp/works/mondai/sort_naive/problem_index?language_uid=ruby

問題に挑戦する前にソートアルゴリズムについて解説されている下記の講座に取り組むのがおすすめです。

https://paiza.jp/works/algorithm-java/new-primer/algorithm-java-new-primer-4

## FINAL問題 挿入ソート
```ruby
def insertion_sort(a, n)
    for i in 1..n-1
        x = a[i]
        j = i - 1
        while j >= 0 && a[j] > x
            a[j + 1] = a[j]
            j -= 1
        end
        a[j + 1] = x
        puts a.join(' ')
    end
end

n = gets.to_i
a = gets.split.map(&:to_i)
insertion_sort(a, n)
```
問題文の疑似コードをRubyに書き直しています。
Rubyではdefを使うことでメソッドを定義できます。
## FINAL問題 選択ソート
```ruby
def selection_sort(a, n)
    for i in 0..n - 2
        min_index = i
        for j in i + 1..n - 1
            if a[j] < a[min_index]
                min_index = j
            end
        end
        a[i], a[min_index] = a[min_index], a[i]
        puts a.join(' ')
    end
end

n = gets.to_i
a = gets.split.map(&:to_i)
selection_sort(a, n)
```
swapはそれぞれをの数値を=で入れ替える処理しています。
## FINAL問題 バブルソート
```ruby
def bubble_sort(a, n)
    for i in 0..n-2
        for j in (n - 1).downto(i + 1)
            if a[j - 1] > a[j]
                a[j - 1], a[j] = a[j], a[j - 1]
            end
        end
        puts a.join(' ')
    end
end
n = gets.to_i
a = gets.split.map(&:to_i)
bubble_sort(a, n)
```

今回の問題集で登場した素朴なソートはどれも効率が悪く、実行時間が少し長いです。
◆HTML/CSS　備忘録② ブロック要素とインライン要素


## ブロック要素

要素が、行全体のまとまりになっているもの。

代表的なものは、【div/p/h1～h6/header/footerなど】

下記の特徴があります。

**・縦方向に積み上がる**
**・縦横の高さや幅を設定できる**

また、一般的に他のブロック要素やインライン要素を含むことができます。
 
![ブロック要素.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149624/6dcda53c-738b-a9b9-ec5e-6ca120009f22.png)

## インライン要素

要素が、行の中の一部のまとまりになっているもの。

代表的なものは、【a/spanなど】

以下の特徴があります。

**・横方向に並ぶ**
**・縦横の高さや幅の設定ができない**

また、一般的にテキストや他のインライン要素を含むことができますが、ブロック要素は含むことができません。

![インライン要素.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2149624/54a22682-a55c-602c-4437-b06152bc33de.png)


前回の記事はこちら
 [◆HTML/CSS　備忘録① 親子関係](https://qiita.com/ume_work0831/items/985bbd8d0088cbebe0a3)
C#とVB.NETでPDF から画像の抽出

## はじめに
PDFから画像を抽出することは、PDF文書内の画像リソースを効果的に管理し活用するための重要な手段です。これらの画像は、変換や編集、再利用、印刷など、さまざまな目的に活用できます。手動での抽出に加えて、プログラミングを使用して PDF から画像をバッチで抽出することもできます。この記事では、C#/VB.NETプログラムを使用してPDFから画像を抽出する方法について詳しく解説します。

## ツール
* Visual Studio 2022
* [Free Spire.PDF for .NET](https://www.e-iceblue.com/Introduce/free-pdf-component.html#.ZH_ihWdByUk)

このライブラリは、無料でPDFァイルを作成、編集、変換することができますが、ページ数の制限があります。または、有料版の製品の[無料トライアル](https://www.e-iceblue.com/TemLicense.html)を申し込むこともできます。

**有料版** : [Spire.PDF for .NET](https://www.e-iceblue.com/Introduce/pdf-for-net-introduce.html)

## インストール方法
1.[Free Spire.PDF for .NET](https://www.e-iceblue.com/Download/download-pdf-for-net-free.html)をダウンロードします。
2.Visual Studioで新しいプロジェクトを作成します。
3.「Solution Explorer」>「References」を右クリックし、「Add Reference」>「Browse」を選択します。
4.BINフォルダ内のdllファイルを見つけて、「OK」をクリックします。

## 説明
1.Spire.PdfおよびSystem.Drawingの名前空間をインポートします。
2.PdfDocumentクラスのインスタンスを作成します。
3.LoadFromFileメソッドを使用して、PDFファイルを読み込みます。
4.ページごとに画像を抽出し、指定したパスに保存します。
5.画像はPNG形式で保存されます。
6.最後に、それぞれの画像にユニークな名前を付けるために、カウンター変数iを使用します。

## サンプルコード
C#
```c#
using Spire.Pdf;
using System.Drawing;

namespace ExtractImages
{
    class Program
    {
        static void Main(string[] args)
        {
            //PdfDocumentインスタンスを作成する
            PdfDocument pdf = new PdfDocument();

            //PDF をロード
            pdf.LoadFromFile("sample.pdf");

            int i = 1;
            //すべてのページをループする
            foreach (PdfPageBase page in pdf.Pages)
            {
                //各ページから画像を抽出し、指定したパスに保存する
                foreach (Image image in page.ExtractImages())
                {
                    image.Save(@"C:/Users/Administrator/Desktop/Images/" + "image" + i + ".png", System.Drawing.Imaging.ImageFormat.Png);
                    i++;
                }
            }
        }
    }
}
```
VB.NET
```vb
Imports Spire.Pdf

Namespace ExtractImages
    Friend Class Program
        Private Shared Sub Main(ByVal args As String())

            'PdfDocumentインスタンスを作成する
            Dim pdf As PdfDocument = New PdfDocument()

            'PDF をロード
            pdf.LoadFromFile("sample.pdf")
            Dim i = 1

            'すべてのページをループする
            For Each page As PdfPageBase In pdf.Pages

                '各ページから画像を抽出し、指定したパスに保存する
                For Each image As Image In page.ExtractImages()
                    image.Save("C:/Users/Administrator/Desktop/Images/" & "image" & i & ".png", Drawing.Imaging.ImageFormat.Png)
                    i += 1
                Next
            Next
        End Sub
    End Class
End Namespace
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/9d71d7d0-6330-435b-97ff-f4f805a988b9.png)
VS CodeでJavaファイルだけ1行コピー・貼り付けの挙動がおかしくなる

# はじめに
VS Codeで掲題の事象が発生し、調査・暫定対処まで出来たので備忘

# 事象
VS Codeでは、文字を選択せずに`Ctrl + C`を押すと1行コピーとなります。
そのまま`Ctrl + V`で貼り付けると、現在の行の1行上にコピーした行が挿入されます。
(`Alt + Shift + ↑`と同じ動作)

![expect.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177673/668cbdbe-157f-3e55-bf4a-cd7fd7ef5d61.gif)

しかし、`.java`拡張子のファイルで上記操作を行うと、想定と異なる動作になりました。

![current.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177673/b3045561-2bbe-0795-fd96-2a3cde768fdb.gif)

## 調査結果
拡張機能の`Language Support for Java(TM) by Red Hat`を消すと正常な動作に戻ったので、これが原因と思われます。
（バージョン: `v1.25.1`）

というわけで、`Language Support for Java(TM) by Red Hat`のGitHub Issueで何か言われていないか検索してみましたが、特になさそうでした。
なので、Issue追加してみました。

https://github.com/redhat-developer/vscode-java/issues/3445

すると返信が！
「こっちでは再現しないけど、以下を設定したら回避できるかも」とのことでした。
```json
"[java]": {
    "editor.pasteAs.enabled": false
}
```
こちらを設定して無事回避できました 🎉

不具合自体は別のIssueが対応されればこちらも解消するかも、とのことでしたが、一旦これで解決しているので一旦上記の対応だけで良いかなと思います。

参考になれば幸いです :bow: 

# おわりに
...ここまで記事を書いてから見つけたのですが、全く同じ内容の記事が既にありました。

https://qiita.com/HoppingGanon/items/2328bb2f78f347bf2230

しかもGitHub Issueもある...
英語の検索って難しい_(:3 」∠ )_ 

# 追記
その後、改修が反映されました！
`v1.26.2024011008`にアップデートし、`settings.json`の設定を戻して確認したところ期待通りの動作になっていました。
2024/01/11時点で上記バージョンはまだプレリリース段階ですが、そのうちリリースバージョンになると思うのでいずれ解決すると思います。
どの言語でも! プログラミングが上達するきっかけになった事3選

## 最初に
もし何か誤字脱字等ございましたらコメントで優しくご指摘お願いします。

## 自分について
現在プログラミング歴4年でフリーのエンジニアとして働いています。
この記事ではあくまで**自分の主観で**知っておいたらいい事を書いておきました。
参考にしていただければ幸いです。

# 1 挫折するのはよくある事
一回の挫折でプログラミングの才能がないと思ってしまいプログラミングをやめてしまうのはよくあることです。
まずそこから変えてみましょう！
自分も最初にプログラミングを始めてからちゃんとしたものを書けるようになるまで**約2年**かかっているんですよね
独学だと数年かかることも普通にあります。
根気よくやりましょう！そして挫折してしまっても自分に才能がないと思うのはやめましょう！

# 2 分からないことがあったらすぐ調べる
エラーが出たらまずエラー文で検索してみましょう!
質問フォーラム等に質問をするのもいいと思います。
最近出てきたChatGPTを使うのも手です。
ただAIが出すプログラムは**使えなかったり、非推奨のライブラリを使っていたり**するのでうのみにするのはやめましょう!!!

# 3 プログラマーの友達を作る
結局はこれです。
身近にそんな人いないよって言う人も大丈夫です。
インターネットには無数のプログラミングコミュニティがあります。
Discord,Telegram,Twitterなどでプログラマーと絡むのはとてもいいと思います。
結局一人で悩むのと複数人で悩むのはわけが違うんです。
それに周りに一人でも自分より技術力が高い人がいると、相互作用で自分も技術力が上がることも普通にあります。
是非色々なプログラミングコミュニティに参加してみてください!!

## 最後に
あくまでこれは**自分の主観**なので鵜吞みにはしないでください
自分は他にもいろいろな記事を書いているので是非見ていってください
あと[Twitter](https://twitter.com/robot_request)等でプログラミング依頼も受けているので是非ご検討ください
読んでいただきありがとうございました。
プロセスメールアラートの Lightning メールテンプレートエラー: フィールドプレフィックス受信者を認識できません


+ [フローおよびプロセスのエラーメールの受信者の制御](https://help.salesforce.com/s/articleView?id=sf.flow_troubleshoot_error_email.htm&type=5)

+ [Lightning Email Template Error for Process Email Alert: We don't recognize field prefix Recipient](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8taW)

Winter 21 のリリースにより、メールアラートを介してフローおよびプロセスで Lightning メールテンプレートを使用できるようになりました。  

2021年時点では　クラシック テンプレートに切り替えるしか回避策がなかったようです。

これがそのままでは機能しないのは面倒ですが、私が思いついた簡単な回避策は、電子メール テンプレートに関連するオブジェクトに数式テキスト フィールドを作成することでした。あなたのケースでは、通常は電子メールで Recipient.FirstName を使用しますが、Owner First Name を数式として使用して、Account オブジェクトに Owner First Name という数式フィールドを作成し、その後、Account.Owner_FirstName__c を数式フィールドとして使用します。 Recipient.FirstName の代わりに差し込みフィールドを使用します。

現状では{{{ }}} を使えばできる？

「メールを送信」アクションで、「受信者 ID」に何を設定しましたか? 「電子メールの送信」アクションで電子メール テンプレートを使用している場合は、「受信者 ID」が必要です。フローがどのオブジェクトに基づいているかに応じて、フローが取引先責任者またはリードに対して実行されている場合は、受信者 ID として{!$ Record.Id } だけが必要になる場合があります。私はカスタム オブジェクトで作業しているため、カスタム オブジェクトには「Teacher」という名前の連絡先検索フィールドがあり、電子メールの送信アクションの受信者 ID は {!$Record.Teacher__r.Id} に設定されています。

 

正しい受信者 ID を設定すると、メール テンプレートで {{Recipient.FirstName}} などの差し込み項目の使用を開始できます。また、Lightning メール テンプレートでは、2 つのみしか使用していないことに注意してください。差し込みフィールドでは {{Recipient.FirstName}} を {{ }} で囲んでいますが、同じメール テンプレートでは、他のすべてのレコード差し込みフィールドは 3 つの括弧 {{{merge_field}}} であり、すべてが完璧に機能します。
整数除算切り上げテク直観的解説

## 整数除算切り上げテク直観的解説

整数除算で余りが出る（＝商に少数が含まれる）場合に、切り上げたいとき利用する有名なテクニックがあります。

割られる数$:a$
割る数$:b$

$\frac{a + b - 1}{b}$

上記のテクを利用せずとも、整数除算で余りが出るときに1を加え、そうでない場合は切り捨て計算を行う場合分けでも同じく計算可能です。

割られる数に$b-1$を加えて$b$で割るだけなのですが、$b-1$を加える理由は直観的に理解できます。

もし余りが出る場合は、割る数$:b$よりも絶対に小さくなります。
整数除算では余りの部分は切り捨てされてしまうので、これを商に含めるため割られる数に$b$を加える発想をします。これにより$b$を加えた1回余分に割ることができます。

ただし、割られる数に$b$をそのまま加えると、割り切れるものに対しても1回余分に割ってしまうので、余りがでたときには余分に1回割れるが、余りが出ないときには切り捨てされるような値、即ち$b-1$を割られる数に加えるというのが理由になります。

例）
5 / 3 = 1 ... 2 → 2
6 / 3 = 2 ... 0 → 2
7 / 3 = 2 ... 1 → 3
8 / 3 = 2 ... 2 → 3
9 / 3 = 3 ... 0 → 3

上記、余りが0の場合、商がそのまま切り上げ値になります。
余りがある場合、商に1を加えた値が切り上げ値になります。
割られる数に$3-1=2$を加えておけば、余りがある場合は余分に1回割ることができ、余りが無い部分は3に届かず切り捨てされるで、切り上げ値をちょうどよく求めることができます。


(5 + 2) / 3 = 2
(6 + 2) / 3 = 2
(7 + 2) / 3 = 3
(8 + 2) / 3 = 3
(9 + 2) / 3 = 3
【matplotlib】plotの見た目をサクッとカスタマイズする

# はじめに

本記事では、**matplotlibで作成したグラフをどう調整するか**について、折れ線グラフを例にご紹介します。今回は基本的な調整（文字の大きさや目盛りの間隔など）を行い、下図の右側のplotを作成します。

![plot_default-custom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1236393/1f108c1e-93f8-4722-fa2c-4267b1b4f8d9.png)


# 環境

- python: 3.12.0
- matplotlib: 3.8.2
- numpy: 1.26.3

# スクリプト

## ライブラリのimport

```python
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
```

## データの準備

plotに使用するデータを作成します。

```python
np.random.seed(0)
x = np.linspace(0, 10000, 100)
y1 = np.sin(x) + np.random.randn(100)*3
y2 = np.cos(x) + np.random.randn(100)
```

## デフォルト設定で描画

まずは細かい調整はせずにplotを作成します。

```python
fig, ax = plt.subplots(figsize=(4, 3))
# plot
ax.plot(x, y1, label='label1')
ax.plot(x, y2, label='label2')
# タイトル
ax.set_title('Title')
# 軸ラベル
ax.set_xlabel('X label')
ax.set_ylabel('Y label')
# 凡例
ax.legend()
# グリッド
ax.grid()

fig.show()
```

![plot_default.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1236393/91ea485d-68bd-d44f-023f-8d6b4bfb83e8.png)


## 調整を加えて描画

続いて、細かい調整を加えてplotを作成します。数値等は一例なので、適宜調整していただければと思います。

```python
fig, ax = plt.subplots(figsize=(4, 3))
# plot
ax.plot(x, y1, label='label1')
ax.plot(x, y2, label='label2')
# タイトルとラベル
ax.set_title('Title', fontsize=20, pad=10)
ax.set_xlabel('X label', fontsize=15, labelpad=10, weight='normal')
ax.set_ylabel('Y label', fontsize=15, labelpad=10, weight='normal')
# 軸の範囲
ax.set_xlim(-500, 10500)
ax.set_ylim(-9, 9)
# 目盛りの書式
ax.xaxis.set_tick_params(direction='out', labelsize=12.5, width=1.5, pad=10)
ax.yaxis.set_tick_params(direction='out', labelsize=12.5, width=1.5, pad=10)
# 目盛りの間隔
ax.xaxis.set_major_locator(mpl.ticker.MultipleLocator(2500))
ax.yaxis.set_major_locator(mpl.ticker.MultipleLocator(4))
# 3桁ごとにカンマをつける(1000→1,000)
ax.xaxis.set_major_formatter(plt.FuncFormatter(lambda x, loc: "{:,}".format(int(x))))
# 凡例（bbox_to_anchorで位置を指定）
ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0, fontsize=12.5)
# グリッド
ax.grid()

fig.show()
```

![plot_custom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1236393/15c1d6ae-dbfd-58fa-5410-65577824fa05.png)


# 終わりに

matplotlibでplotを作成する際の基本的な設定方法についてご紹介しました。簡単ですが以上で終わります。この記事が少しでも皆さんの助けになれば幸いです！

# 参考
- matplotlib API Reference, `matplotlib.axis`: https://matplotlib.org/stable/api/axis_api.html
- matplotlibのめっちゃまとめ, https://qiita.com/nkay/items/d1eb91e33b9d6469ef51
- Matplotlibでラベルと軸を調整して論文用のグラフの見栄えを良くする方法, https://sishida21.github.io/2020/05/11/graph-settings-for-paper-with-matplotlib/
Windowsで、cli-kintoneでAPIトークン使ったログインができないときの対策

最近（あれは2024年の1月のことじゃった・・・）、cli-kintoneでAPIトークン使ったログインに失敗してしまうのでどうしたものか？と試していて、原因がわかったので自分のためにも、今後ハマってしまったという人のためにもなるかもしれない・・・！というわけでぇ、メモ。

## つまずいた箇所

こちらの記事の初っ端でつまずきました。だってログイン失敗するんですもの。

[kintoneコマンドラインツール（cli-kintone）｜データをエクスポートする](https://cybozu.dev/ja/id/76b6fac0aa419889bcafa67d/#export)

https://cybozu.dev/ja/kintone/sdk/backup/cli-kintone/

## エラーの内容
### 実行したコマンド

コマンドプロンプトの場合
```shell
cli-kintone.exe record export --base-url https://{subdomain}.cybozu.com --app 423 --api-token xPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXz1
```

PowerShell の場合
```shell
.\cli-kintone.exe record export --base-url https://{subdomain}.cybozu.com --app 423 --api-token xPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXz1
```

### 結果
```
ERROR: KintoneRestAPIError: [520] [CB_WA01] ユーザーのパスワード認証に失敗しました。
「X-Cybozu-Authorization」ヘッダーの値が正しくありません。 (HMayL9ahwCqbzF5iqyU4)
```

API トークン使ったログインなのに、「ユーザーのパスワード認証」とは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/2ffe7bd5-9168-0a0a-d19d-2614dbaceb33.png)

## 原因と対策

環境変数に`KINTONE_USERNAME`とかない？ログインに関係しそうなやつ。
いたら、爆発四散させ（削除し）ちゃいましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/6fc0e3d7-270b-02d8-d0f2-93ce1d5013df.png)


私の場合、こちら、大昔に設定してもう使ってないやつでしたｗ

## うごいた

コマンドプロンプト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/a4b4d924-4fbf-bf37-9455-218ee1139d31.png)

PowerShell
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/642d419b-9341-92b3-65bc-09d06cf68421.png)

## まとめ
環境変数にKINTONEなんちゃらっていませんか？？
消して動けばそれが原因だと思いますが、消す前に大事な環境変数じゃないか確認してくださいね！

参考になったらいいな～

おしまい！
ポストモーテムを取り入れた1年の振り返り

# 概要
システム障害の際に 「ポストモーテム」 という事後の検証イベントをやり始めて1年経ったので、どうだったかを残します。失敗を咎めるのではなく「失敗から学ぶ」という文化や姿勢を育てるのに良い影響があったと感じています。

# 取り組み内容
* うまくやれたこと
* うまくやれなかったこと
* 幸運だったこと
* 今後できそうなこと

という4つの質問を、30分程度のミーティングで話し合うものです。
障害対応にあたったメンバー全員で「**対応のしかた**」そのものはどうだったか、次回もっと首尾よくこなすためにどんなことができそうかをディスカッションしました。

※ 前提として障害が発生した場合は、規定の報告書にて「直接・間接原因の調査結果、対応の時系列や修正状況」は報告をしていて、このポストモーテムではそれらとは別で行いました。

# 気をつけること
* ポストモーテムの目的を忘れない
  * 話が拡散しがちなので、システムのあそこどうなってたっけ? とか具体的な話が始まっちゃったら是正する
  * そうしないと30分で終わらない
* 誰の責任だ、や批判的な内容を含めない
  * 誰か個人のミスであったとしても、チームで仕組み化などを通して改善できないかを話し合うことが大切、個人を責めたところでなんの意味もないどころか、害になる

# 実際に話し合われたこと例
* 情報の拡散
  * うまくやれなかったこと
    * バタバタといろんなSlackスレッドで話が進んでしまい、途中参加しにくい、後から追えない
  * 今後できそうなこと
    * `〇〇-emergency`という、初動のチャンネルを作り、`障害かも?` というリアクションも作成する
      * 誰でも少しでも気になったら気軽に投稿し、気づき、周知、状況把握などの初動を可能な限り迅速に行う
    * `〇〇-emergency` で障害が確定したら、`障害20231001_〇〇の〇〇欠損`等での名称で別途チャンネル作成し、速やかに関係者を集め対応にあたる
      * チャンネル作成のSlack Workflowを作成する
* 事象の発見
  * うまくやれなかったこと
    * ビジネスサイドに数値異常を指摘されて気づいた
    * 問題の重大性に、エスカレーション当初に気づけなかった
  * 今後できそうなこと
    * ビジネスサイドの問い合わせ時点で速やかにSlackハドルを行い、口頭で状況把握と認識合わせを行う

事象の発見については、「幸運だったこと → たまたま〇〇さんが気づいてくれた」 と裏表で話される事が多かった印象です。その他の、システム的な改善案も多数出て修正されましたが、ここでは割愛します。

# おわりに
ポストモーテムを、バックエンドやアプリSDK、インフラチームで集まって行うことで、障害発生その時はなかなか理解が追いつかなかった対応内容を関係者全員がしっかり理解し、本質的な問題解決をする、またその文化の醸成に繋がったと感じます。

以前は障害対応内容を一部のメンバーしか把握しておらず、収束後の対応もその方に属人化してしまう問題がありましたが、自然と解消されていました。また、監視や観測の重要性をチームで再認識し、ログ設計の見直しやSLO/SLIといった話に進みやすい環境となっていきました。

余談ですが、この振り返りフレームワークは障害だけではなく、様々なプロジェクトでクロージングの際に行うことも出来そうで、今後取り入れていけたらと思っています。

 # 参考
 * [SRE サイトリライアビリティエンジニアリング](https://www.oreilly.co.jp/books/9784873117911/)
 * [ポストモーテムを理解する](https://qiita.com/an_sony/items/0565ad980f9097c76d11)
Customize your lighting Service console pages


# ステップ 7 でAccount Name、Case Owner、およびDate/Time Opened Date/Time がハイライト パネルに表示されない

+ [Added Fields do not show up in the highlight panel.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UvaJmSAJ)

:::note
I was able to get the issue resolved by clearing the cache and refreshing as was suggested

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000DeD31SAF
:::
動画編集・動画制作で役立ったおすすめサイトやツール

これから動画編集・映像制作を始める方や自身の備忘録も兼ねて、動画編集・映像制作で役立ったサイトやツールをまとめてみた。コンテンツが充実したサイトやコミュニティ機能があるサイト、最近話題のジェネレーティブAIで動画制作を効率化できるツールなど、本当に良かったものだけを厳選している。
※使って良かったものは随時追記更新していく予定

<h2>動画編集・動画制作で役立ったおすすめサイト</h2>
<h3>Movie Works</h3>
動画編集・映像制作領域特化と「Movie Works（ムービーワークス）」には、これから動画編集・映像制作を始める方向けのコンテンツがたくさん掲載されています。現在の動画編集・映像制作の市場規模や今後の将来性などが統計的にまとまっていたり、最新の案件・給料・時給情報、動画編集を学ぶためのサイトやツール、スクールや専門学校も掲載されていて参考になりました。
<br>
<a href="https://movie-works.jp/">Movie Works公式サイト</a>
<h3>OneSe（ワンス）</h3>
OneSeは、動画クリエイターとして高い実績を持つ大川氏が運営している国内最大級の動画クリエイターコミュニティです。動画編集をこれから習得したい方向けの学習コンテンツに加えて、コミュニティメンバー同士の助け合いを通じてスキルを学んでいけるなど、クリエイターにとって非常に役立ちます。
<br>
<a href="https://onese.jp" target="_blank" rel="noopener">Onese 公式サイト</a>
<h2>動画編集・動画制作で役立ったおすすめツール</h2>
<h3>Pictory</h3>
Pictoryは、テキストを動画にするジェネレーティブAIです。スクリプトや記事、テキストを動画に変換できたり、字幕を自動生成することもできます。最近話題のAIを使った動画作成ツールであり、初心者でも手軽に動画制作ができるのが使い勝手が非常に良かったです。
<br>
<a href="https://pictory.ai" target="_blank" rel="noopener">PICTORY公式サイト</a>
<h3>GliaStudio</h3>
GliaStudioは、ニュース・ソーシャルメディアの投稿・記事・スポーツのライブイベントの配信・各種統計データから動画を生成できるジェネレーティブAIです。自由度の高い編集が特徴で、多様な動画を簡単に作ることができます。
<br>
<a href="https://www.gliacloud.com/ja/" target="_blank" rel="noopener">GliaStudio 公式サイト</a>
新卒エンジニア　一年間を振り返って感じた知識不足

## はじめに
　エンジニアになって、もう少しで一年が経ちます。実務をする上で、「エンジニアは当たり前な知識だけど、学校で習わなかったな」を度々感じています。
　この記事では新卒エンジニアとして働く中で、事前に勉強しておけばよかったと思った知識とその簡単な説明をまとめてみました。
## プログラミング関連知識
### フレームワーク
フレームワークとは、アプリケーション開発の土台、枠組みとなるもの
* 利点
    * 機能が予め用意されており、0から開発をしなくていい
    * フレームワークの規約にのっとった実装になるため、コードが統一されやすい
* 欠点
    * フレームワークのルールから逸脱すると、保守性を大きく欠いてしまう
    * フレームワーク特有のコードがある
#### 業務で実施したこと
　私は普段の業務でRuby on Railsというフレームワークを扱っています。一般的な機能が自動で作成されるので便利な反面、理解のしずらさも感じました。 研修では[Ruby on Railsチュートリアル](https://railstutorial.jp/)という学習サイトを利用しました。学習時間は一か月ほどかかりますが、公式なので内容がしっかりとしています。

### テストコード
テストコードとは、プログラムが仕様通りに動作するか確認するソースコード
* 利点
    * 実装段階で早期にバグを発見できるため、全体的にコストを抑えることができる
    * テストを繰り返し実行でき、テストコードが仕様として残るので、コードの品質を保証できる
* 欠点
    * 実装に時間がかかる
#### 業務で実施したこと
　学生時代にテストコードを書いたことがなく、Ruby on Railsチュートリアルで行ったMinitestが初めてでした。テストにもフレームワークがあり、機能を簡単にテストできます。
## インフラ関連知識
### Linux
Linuxとは、WindowsやMacと同じOSの一種
* 狭義では、Linuxカーネルのこと
* 広義でいうと、Linuxディストリビューションのこと
    * Linuxディストリビューションとは、「Linuxカーネル + その他ソフトウェア 」のセットの配布形態のこと
    * Linuxカーネルだけでは、OSとして機能できない
    * そのため、その他ソフトウェアとセットで配布することで、OSとして使えるようにしている
#### 業務で実施したこと
　環境構築をする上で、WSLを使用してWindowsにLinuxをインストールする機会がありました。Linuxは環境構築やサーバー上の操作をする際によく使用します。

### アーキテクチャ図
アーキテクチャ図とは、システムの全体像を可視化した図
* 関係者のシステムへの理解度を高め、問題点を発見、検討しやすくなる。
    * システムで利用するサービスやコンポーネント、システムの境界にはどのようなものがあるか
    * 各要素がどこに配置され、どのような制限があるか
    * 各要素がどのように関連しているか

 以下は、AWSのアーキテクチャ図になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656638/a84e7e73-3e81-bf6c-e1f8-80d9807b38b1.png)
参照：[AWS のアーキテクチャ図を描きたい ! でもどうすれば良いの ?](https://aws.amazon.com/jp/builders-flash/202204/way-to-draw-architecture/?awsf.filter-name=*all)
* コンポーネントの解説
    * Route 53：名前解決などを行う
    * CloudFront：ウェブコンテンツの配信を高速化する
    * Amazon S3：データを保存しておく場所
    * Internet gateway：外部との通信を可能にする
    * Elastic Load Balancing：受信トラフィックを分散する
    * Amazon EC2：インスタンス(サーバー)
    * Amazon RDS：テーブル形式のデータベース
#### 業務で実施したこと
　システムの全体を把握する為に、アーキテクチャ図を読む機会がありました。シンプルな図でも、その図に描いてある機能がなんの為に存在しているのかが理解できず、行き詰まることがありました。アーキテクチャ図の理解には、インフラの知識が必要だと思います。
### ログの管理
ログとは、コンピュータやシステムの様々な履歴を記録したもの
* ログを集中的に管理することで、システムに散らばったログを時系列で確認できる
    * ログを一連の流れで見ることができるので、処理の挙動を分析できる
    * また、どのタイミングでエラーが発生しているか特定できる
#### 業務で実施したこと
　先輩社員から「現在動いているバッチの設定、ソースコードを元に、バッチが動いていない時間をまとめてほしい」と依頼がありました。現在動いているバッチのソースコードを読みつつ、AWSのCloudWatchを利用してログを調査しました。ログを残さないバッチや開始と終了の時間が不明瞭なバッチがあり苦労しました。
## 雑務
### 議事録
議事録とは、会議の内容や結果をまとめて、記録または周知するための文章
* 会議の内容を振り返ることができるため、認識の相違があった時に確認できる
* 会議で決定した内容の証拠になるため、トラブルを未然に防げる

#### 業務で実施したこと
　幾つかの会議に出席し、議事録を自分で書くことがありました。会議で話されるプロジェクトの理解度が低く、会話の主語を推察するのが大変でした。また、話し言葉を文章に書き起こすのに中々慣れず、簡潔な文章を書くのが難しかったです。
## 感想
　インフラ関連は重要であるが故に求められる知識の量が多く、学習時間が多く必要でした。仮想環境やフレームワークなど便利なものが増えるに伴って、その理解が困難です。大枠の知識の有無が、一つ一つの理解の深さに大きく影響すると思います。
paiza.ioでc

# 概要
paiza.ioでcやってみた。
４００行の正規表現エンジン見つけたので、やってみた。

# 参考にしたページ

https://github.com/cesanta/slre

# Find all URLs in a string


```
static const char * str = "<img src=\"HTTPS://FOO.COM/x?b#c=tab1\"/> "
  "  <a href=\"http://cesanta.com\">some link</a>";
static const char * regex = "((https?://)[^\\s/'\"<>]+/?[^\\s'\"<>]*)";

struct slre_cap caps[2];
int i, 
    j = 0, 
    str_len = strlen(str);
while (j < str_len &&
    (i = slre_match(regex, str + j, str_len - j, caps, 2, SLRE_IGNORE_CASE)) > 0) 
{
    printf("Found URL: [%.*s]\n", caps[0].len, caps[0].ptr);
    j += i;
}
```

Output:

```
Found URL: [HTTPS://FOO.COM/x?b#c=tab1]
Found URL: [http://cesanta.com]
```

# 成果物

https://paiza.io/projects/Uwd8by4s8GnMbMewegLneA


以上。
bolt-cepを使用して作成したプロジェクトのデバッグ

## 設定

```json:launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "chrome",
      "request": "attach",
      "name": "[Attach] CEP JavaScript",
      "port": 8868,
      "webRoot": "${workspaceRoot}",
      "pathMapping": {
        "/": "${workspaceRoot}"
      }
    },
    {
      "type": "extendscript-debug",
      "request": "attach",
      "name": "[Attach] Premiere Pro",
      "hostAppSpecifier": "premierepro-24.0",
      "engineName": "NewWorld",
      "aliasPath": "/Users/ユーザー名/Library/Application Support/Adobe/CEP/extensions/ExtensionのID"
    },
    {
      "type": "extendscript-debug",
      "request": "launch",
      "name": "Launch Script in ExtendScript Engine"
    }
  ],
  "compounds": [
    {
      "name": "[Compound] Debug CEP",
      "configurations": [
        "[Attach] CEP JavaScript",
        "[Attach] Premiere Pro"
      ]
    }
  ]
}
```

## ポイント

- "port"はcep.config.tsで設定したstartingDebugPortとは異なる場合がある。dist/cep/.debugを見て実際のポートを確認する。
- "engineName"はアプリケーションやそのバージョンによって異なるので、ExtendScript Debuggerのマニュアルを見て確認する。
- bolt-cepがdist/cepへのシンボリックリンクを貼る形でExtensionのインストールを行うため、"aliasPath"を指定しないとExtendScriptのデバッグができない。
- ExtendScriptにブレークポイントを設定する場合、dist/cep/jsx以下のファイルに設定しないと効果がない。CEPの方は普通にtsファイルにブレークポイントを設定できる。
Prometheusからリクエスト数を取得する方法

## はじめに
Sock Shopにリクエストする人数を取得するために行いました．

必要なもの
Prometheus，Istio

### KubernetesクラスタにPrometheusをデプロイする

Prometheusをデプロイするためにこの記事を参考に構築しました．
[KubernetesクラスタにPrometheusをOperatorを使ってデプロイしてみた (Helm無し)](URL"https://zaki-hmkc.hatenablog.com/entry/2020/10/11/170000")

https://zaki-hmkc.hatenablog.com/entry/2020/10/11/170000



### Prometheus Operatorをデプロイする

マニフェスト類の取得を手元にクローンする
```
$ git clone https://github.com/coreos/kube-prometheus
$ cd kube-prometheus
```

デプロイする
```
$ kubectl create -f manifests/setup
$ kubectl create -f manifests/
```
:::note warn
注意
manifests/setup以下にCRD等があるので，先にkubectl create -f manifests/を実行してしまうとエラーになってしまいます．
:::

dashboardにアクセス
デプロイすると各サービスリソースが作成されるので，基本的にそれにアクセスすればいいです．
```
$ kubectl get svc -n monitoring
```

### Prometheusにアクセス
```
$  kubectl port-forward svc/prometheus -n istio-system --address 0.0.0.0 9090:9090
Forwarding from 0.0.0.0:9090 -> 9090
```

**--address 0.0.0.0** : ポートフォワーディングがすべてのネットワークインターフェースからアクセス可能であることを指定しています.これにより，他のデバイスやホストからもアクセスできるようになります．

---------------------------------------
自分のIPアドレス＋9090でアクセスすると
 例　000.000.000.000:9090
 
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562114/b0388732-7c07-3e74-5f12-f106a9c9403a.png)

入れました！

このままではリクエスト数は取得できないのでIstioをインストールし，Sock Shopにラベル付けする必要があります．

### Istioをインストール
Istioのインストールはこちらの記事を参考にして行いました．
参考した記事にSock Shopにラベル付けする方法も載っております．

[Istioのインストール　~Sock Shop編~](URL"https://qiita.com/hikida621/items/ddebe34566d5fce913fc")

https://qiita.com/hikida621/items/ddebe34566d5fce913fc

インストールが終わり，Sock Shopにラベル付けが完了しました！
これでリクエスト数が取れます．

:::note alert
注意
IstioのインストールしSock Shopにlabel付けするためにcomplete-demo.yamlに追記をしたと思いますが追記した後，一度deleteしてまたapplyしないと反映されません．
:::

方法　
```
$ kubectl delete -f complete-demo.yaml
$ kubectl apply -f complete-demo.yaml
```
LIMIT句が便利すぎる件


## はじめに
設計でも開発でもテストでもDBから実際のデータを取得することありますよね。
ここってどういう風にレコード積み上がっているんだろう～こういう条件のデータを取得したいけど、テーブルの中身どうなっているんだろう～などなど。


カラムも10個以内、`INSERT`されているデータも数百件レベルなら`WHERE句`で条件を指定すれば良いのですがそうもいかない立ちはだかる膨大なデータ。
ちょっと見たいだけなのに、なんでこんなに`AND`書かなきゃいけないんだ…めんどくさいな…ってとき。


## LIMIT句が便利すぎる件




`LIMIT句`の役割を端的に説明しますと、**取得するデータの上限件数を指定**できます。

例えば以下のようなuserというテーブルがあったとします。
、例なので記載しているのは少ないですがこれが膨大なデータであると仮定してください。

|id |name |gender |age |address|
|---|---|---|---|---|
|1 |AAA |1 |20 |東京都港区 |
|2 |BBB |2 |32 |東京都千代田区 |
|3 |CCC|1 |25 |東京都新宿区　|
|4 |DDD |2 |30 |埼玉県さいたま市 |
|5 |EEE|1 |32 |神奈川県横浜市 |
|6 |FFF |2 |20 |神奈川県横須賀市 |
|7 |GGG|1 |40 |東京都中野区 |
|8 |ABC |2 |36 |東京都八王子市 |
|9 |DEF|1 |22 |東京都港区　|
|10 |GHQ |2 |42 |神奈川県川崎市 |
|11 |XXX|1 |31 |神奈川県秦野市 |
|12 |XYZ |2 |38 |千葉県館山市 |


例えば、神奈川県に若者向けのお店を作りたいけど20代の人ってどれくらいるんだろうな～パッと見でいいからなんとなく年齢見たいんだよな～というとき。


```SQL
SELECT age,address
FROM user
WHERE address like '神奈川%'
```

で絞った時にずらーーーーーーーーーーーーっと出力されたら、パッと見でわかりにくいし何よりDBに対して呼び出すので処理の時間もかかるので待つのも嫌ですよね。固まったりしたらなおさらめんどくさい。ちょっと見たいだけなんだよこっちは！！！　となります。


そこで以下のように`LIMIT句`を使うと10件のみを取得できます。

```SQL
SELECT age,address
FROM user
WHERE address like '神奈川%'
limit 10
```

超便利。


なお、`LIMIT句`は不等号もいらず単に取得したい件数をSQL文の最後に書くだけというシンプルさがまた最高。

脳死しているときに以上って指定した値含むっけ？、WHERE句の前だっけ後だっけ？などと一考する必要もないです。

**取得したい件数を最後に書くだけ！！！**

本当にシンプルで使いやすいので是非使ってみてくださいね。
DBが複雑になればなるほど使い勝手の良さに感動すると個人的には思っています。


## ちなみに

Oracleでは`LIMIT句`が使えないので`ROWNUM`で疑似列を作成して似たようなことができます。(※[参考](https://sql-oracle.com/?p=1423))





[弊社公式Ｘ](https://twitter.com/obg_ocr)ではこういった便利なIT小ネタについても呟いております。
覗いていただけると嬉しいです。
[AWS]データベースサービスのエンドポイントまとめ

# はじめに
AWSの各種DBサービスには接続用のエンドポイントを複数持つものがあります。

本記事で一番にお伝えしたいのは、**適切なエンドポイントを接続先に指定しないと、サービス停止などのリスクがある**ということです。

例えば書き込みオペレーションが発生するアプリケーションの接続先を **"プライマリインスタンスのインスタンスエンドポイント"** に指定した場合、何が起こるでしょう。

指定した当初はアプリケーションからの書き込み処理はプライマリインスタンスにルーティングされるため正常に実行されます。

しかし、なんらかの理由でフェールオーバーが発生しプライマリとレプリカが入れ替わった場合、アプリケーションは書き込み処理をレプリカインスタンスにリクエストしてしまうことになります。

その結果、書き込み処理は失敗しアプリケーションエラーが発生、サービス停止といった事態になりかねません。
どのDBにどのようなエンドポイントがあるか、よく確認しておくようにしましょう。

# 各DBサービスのエンドポイントタイプ
※インスタンス、ノードが1台のスタンドアロン構成の場合は省略します

## Aurora
| タイプ | 説明 |
|:-:|:-|
| クラスターエンドポイント |  DB クラスターの現在のプライマリ DB インスタンスに接続します。<br>書き込み処理を行うアプリケーションの接続先は基本的にこちらを指定してください。 |
| リーダーエンドポイント | DB クラスターへの読み取り専用接続を負荷分散します。<br>読み取り処理のみを行う場合はこちらを指定することでプライマリインスタンスの負荷を軽減できます。  |
| カスタムエンドポイント  | 選択した DB インスタンスのセットを表します。<br>ユーザーが用途に応じたインスタンスのグループを定義し、グループ内で負荷分散します。  |
| インスタンスエンドポイント  | クラスター内の特定の DB インスタンスに接続します。<br>特定のきめ細かい負荷分散が必要なケースなどを除いて、これをアプリケーションの接続先に指定することは非推奨です。  |

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.Overview.Endpoints.html#Aurora.Overview.Endpoints.Types


## ElastiCache
クラスターモードの有効無効でエンドポイントの種類が変わります。

#### ■クラスターモード有効の場合
書き込み処理、読み取り処理ともに **設定エンドポイント** を指定します。

#### ■クラスターモード無効の場合
| タイプ | 説明 |
|:-:|:-|
| プライマリエンドポイント  | 常にクラスターのプライマリノードに解決される DNS 名であり、書き込み処理はこちらに接続します。  |
| 読み込みエンドポイント  | ラウンドロビン方式でレプリカノードの 1 つの IP アドレスに解決される DNS 名です。読み込み処理はこちらに接続します。  |
| ノードエンドポイント  | 特定のノードに解決される DNS 名です。レプリカの追加削除などがあると都度アプリケーションの接続先を更新する必要があります。  |

https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/red-ug/Endpoints.html


## DocumentDB
| タイプ | 説明 |
|:-:|:-|
| クラスターエンドポイント |  クラスターの現在のプライマリインスタンスに接続するエンドポイントです。|
| リーダーエンドポイント | そのクラスターで利用できるレプリカの 1 つに接続するエンドポイントです。  |
| インスタンスエンドポイント  | 特定のインスタンスに接続するエンドポイントです。<br>これをアプリケーションの接続先に指定することは非推奨です。  |

https://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/endpoints.html


## RDS
RDSのDBインスタンスはそれぞれ一意のエンドポイントを持ち、明示的に接続先インスタンスを指定する形になります。

ただし、マルチAZクラスター構成でデプロイした場合はAuroraなどと同様クラスター、リーダー、インスタンスエンドポイントを持ちます。注意点もAuroraと同様です。

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_CommonTasks.Connect.html#CHAP_CommonTasks.Connect.EndpointAndPort

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/multi-az-db-clusters-concepts-connection-management.html#multi-az-db-clusters-concepts-connection-management-endpoint-types


## DynamoDB

DynamoDBはサーバレスサービスであるためクラスターやインスタンスといったものを意識する必要はありません。
そのためリージョンごとのDynamoDBエンドポイントに対してAPIリクエストを送信する形で操作を行います。

ただし、DynamoDB Accelerator（DAX）を使用する場合は独自のクラスターエンドポイント、ノードエンドポイントを持つことになります。
この場合は他のDBサービスと同様なるべくクラスターエンドポイントを使用するよう注意しましょう。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.API.html

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DAX.concepts.cluster.html#DAX.concepts.cluster-endpoint
Javaでコンストラクタを定義する方法

Javaでコンストラクタを定義する方法について説明します。コンストラクタは、クラスのインスタンス（オブジェクト）が生成されるときに自動的に呼び出される特別なメソッドです。コンストラクタは、オブジェクトの初期化に使用されます。以下に基本的なコンストラクタの定義方法を示します。

### コンストラクタの基本的な構造

1. **コンストラクタの名前**: コンストラクタの名前は、常にクラスの名前と完全に同じでなければなりません。
2. **戻り値を持たない**: コンストラクタは戻り値を持ちません。これは、コンストラクタが値を返す通常のメソッドとは異なる点です。
3. **アクセス修飾子**: コンストラクタは、`public`、`private`、`protected`、またはパッケージプライベート（修飾子なし）のいずれかのアクセスレベルを持つことができます。

### 簡単な例

Javaの`Person`クラスにコンストラクタを定義する例を以下に示します。

```java
public class Person {
    // メンバ変数（フィールド）
    private String name;
    private int age;

    // コンストラクタ
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // その他のメソッド（例えば、ゲッターやセッター）をここに追加できます。
}
```

この例では、`Person`クラスに対して`public`アクセス修飾子を持つコンストラクタを定義しています。このコンストラクタは、`name`と`age`という2つのパラメータを受け取り、それらをクラスのフィールドに割り当てています。

### コンストラクタの使用

コンストラクタは、新しいオブジェクトが作成される際に呼び出されます。例えば、上記の`Person`クラスのインスタンスを作成するには、次のようにします。

```java
Person person = new Person("Alice", 30);
```

この行は、`Person`クラスの新しいインスタンスを作成し、その`name`フィールドに"Alice"を、`age`フィールドに30を割り当てます。

### デフォルトコンストラクタ

クラスにコンストラクタが明示的に定義されていない場合、Javaはデフォルトコンストラクタを提供します。デフォルトコンストラクタは引数を取らず、フィールドにデフォルト値を設定します（数値型の場合は0、オブジェクト型の場合は`null`）。しかし、クラスに自分でコンストラクタを一つでも定義すると、デフォルトコンストラクタは提供されなくなります。
DXライブラリで使用するキーやジョイパッドの入力を扱いやすくする

# 初めに
この記事では、**DXライブラリ**で使用する**キー**や**ジョイパッド**の**入力**をより使いやすくなるコードを書いていきます。
cppと.hのコードを書くので、コピーして使ってください。

~~初心者が書いているので多少の粗は許してお兄さん~~

## 紹介するコードでできること
・ボタンを**押している間**、ずっと反応
・ボタンを**押した瞬間だけ**反応
・ボタンを**離した瞬間だけ**反応

上記の事ができるようになります。

## コード
```Pad.h
// コントローラー
#pragma once

// コントローラーからの入力状態を取得する
namespace Pad
{
	void Update();					// パッドの入力状態取得
	bool IsPress(int button);		// 押し下げ判定(ボタンを押している間、ずっと反応)
	bool IsTrigger(int button);		// トリガー判定(ボタンを押した瞬間だけ反応)
	bool IsRelase(int button);		// 離した判定(ボタンを離した瞬間だけ反応)
}
```

```Pad.cpp
#include "Pad.h"
#include <Dxlib.h>

namespace
{
	constexpr int kLogNum = 16;
	// 入力ログ 0が最新の状態
	int padLog[kLogNum];
}

namespace Pad
{
	// パッドの入力状態取得
	void Update()
	{
		// 現在のパッドの状態を取得
		int padState = GetJoypadInputState(DX_INPUT_KEY_PAD1);
		// ログの更新
		for (int i = kLogNum - 1; i >= 1; i--)
		{
			padLog[i] = padLog[i - 1];
		}
		// 最新の状態
		padLog[0] = padState;
	}

	// 押し下げ判定
	bool IsPress(int button)
	{
		return (padLog[0] & button);
	}

	// トリガー判定
	bool IsTrigger(int button)
	{
		bool isNow = (padLog[0] & button);	// 現在の状態
		bool isLast = (padLog[1] & button);	// １フレーム前の状態
		return (isNow && !isLast);
	}

	// 離した判定
	bool IsRelase(int button)
	{
		bool isNow = (padLog[0] & button);	// 現在の状態
		bool isLast = (padLog[1] & button);	// １フレーム前の状態
		return (!isNow && isLast);
	}
}
```
# 使い方
※更新処理を行う関数に**Pad::Update();** と書く必要があります。

例として**CircleMove**というクラスを作り、円を動かすプログラムを書いてみます。




```CircleMove.h
#pragma once

class CircleMove
{
public:

	CircleMove();
	virtual ~CircleMove();


	void Init();	// 初期処理
	void Update();	// 更新処理
	void Draw();	// 描画処理

private:

	void Move();	// 移動

private:

	// 座標
	int m_posX;
	int m_posY;
};
```




```CircleMove.cpp
#include "Pad.h"
#include <DxLib.h>
// この上のincludeがないとコントローラーが動きません
#include "CircleMove.h"

namespace
{
	// 円の半径サイズ
	constexpr int kRadiusScale = 32;

	// 移動量
	constexpr int kMoveDistance = 8;

	// 円のカラーコード(赤)
	constexpr int kColor = 0xff0000;
}

CircleMove::CircleMove():
	m_posX(),
	m_posY()
{
}

CircleMove::~CircleMove()
{
}

void CircleMove::Init()
{
	// 座標初期化
	m_posX = 0;
	m_posY = 0;
}

void CircleMove::Update()
{
	// パッドのアップデート処理
	Pad::Update();

	// 移動
	Move();
}

void CircleMove::Draw()
{
	// 座標の表示
	DrawFormatString(0, 0, 0xffffff, "m_posX : %d m_posY : %d", m_posX, m_posY);

	// 円の描画
	DrawCircle(m_posX, m_posY, kRadiusScale, kColor, true);
}

void CircleMove::Move()
{

	// パットで操作


	if (Pad::IsPress(PAD_INPUT_UP))			// 上入力
	{
		// 上に進む
		m_posY -= kMoveDistance;
	}
	else if (Pad::IsPress(PAD_INPUT_DOWN))	// 下入力
	{
		// 下に進む
		m_posY += kMoveDistance;
	}
	else if (Pad::IsPress(PAD_INPUT_LEFT))	// 左入力
	{
		// 左に進む
		m_posX -= kMoveDistance;
	}
	else if (Pad::IsPress(PAD_INPUT_RIGHT))	// 右入力
	{
		// 右に進む
		m_posX += kMoveDistance;
	}

}
```
このコードで**十字キー**もしくは、**十字ボタン**を押すことで、赤い円が上下左右に動きます。

もし、**ボタンを押した瞬間だけ反応**や**ボタンを離した瞬間だけ反応**などに変更したい場合は、**Pad::IsPress(PAD_INPUT_RIGHT)** の **IsPress** の部分を**IsTrigger**や**IsRelase**に変更してください。