OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Static WebAppsでカスタムドメインを利用する。

自作のブログをAzure Static WebApps で運用しており、カスタムドメインを設定しました。
ドメインの購入から設定まで前提知識なしでも辿り着けるよう記事を書いたので、ぜひ最後までお読みください。

## 環境について

ホスティングには「Azure Static WebApps」
ドメインの取得には「お名前.com」を使いました。

### ホスティングサービス

https://azure.microsoft.com/ja-jp/products/app-service/static

Azure Static WebAppsのGAは2021年されたサービスです。
主な特徴として、グローバルなコンテンツ配信、柔軟なCI/CDワークフロー、プレビュー環境の自動プロビジョニング、カスタムドメインと無料のSSL証明書の設定、認証プロバイダへのアクセス、カスタムルーティング、Azure FunctionsによるサーバーレスAPI統合などが挙げられます。開発者向けのVisual Studio Code拡張機能や豊富な機能を備えたCLIも提供されています。

https://azure.microsoft.com/en-us/blog/develop-production-scale-modern-web-apps-quickly-with-azure-static-web-apps/

### ドメイン取得サービス

ドメインの維持費用・有名ドメインの網羅性・サービスの充実度のすべてを兼ね備えている[お名前.com](https://www.onamae.com/)を利用しました。

## ドメインの取得

お名前.comで取得しようとしているドメインが空いているかどうかを確認することができます。取得したいドメインにチェックをつけて「申し込み」をします。

![スクリーンショット 2023-08-26 12.33.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235110/193d3606-7d9a-d392-99a3-2214c692c701.png)

更新やドメインの保護でお金がかかりますが、支払い方法などを設定し申込をします。`.blog`など無料で取得できるドメインもあるのでそちらを取得することをお勧めします。

![スクリーンショット 2023-08-26 12.35.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235110/0a493ed7-c84c-ea62-6ba9-6a92eec6a0e4.png)

ドメインを取得すると一覧に表示されます。

![スクリーンショット 2023-08-26 13.05.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235110/3ac3b139-010d-bc19-0195-650a6d6efb90.png)


## ドメイン登録

![スクリーンショット 2023-08-26 12.41.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235110/e6299797-7dfe-8f06-4150-b3fcbb6d2425.png)

Azure Static WebAppsの画面に移動し、カスタムドメインの追加を選択します。

![スクリーンショット 2023-08-26 13.11.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235110/c0ae0241-4395-c139-1b18-6f466b2eaa92.png)

次へをクリック

![スクリーンショット 2023-08-26 13.12.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235110/e92984df-069b-02ae-6c23-9cf17e6d0093.png)

ホスト名は`www.`を先頭に追加、TYPEはCNAMEをVALUEはAzure Static WebAppsにデフォルトで設定されているURLを入力します。

![スクリーンショット 2023-08-26 13.26.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235110/89033ec9-c557-9b47-6017-d6586b2c396d.png)


追加をクリックして、```www```を先頭につけてカスタムドメインを追加します。
DNSサーバーの設定がうまくいっていくと「検証済み」の表示に切り替わります。

![スクリーンショット 2023-08-26 13.09.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235110/62ab5b18-75c7-3a45-9c72-20796e09ec92.png)

取得したドメインからAzure Static WebAppsでデプロイしたWebサイトにアクセスできることが確認できました。またSSL証明書も自動で付与されています。
![スクリーンショット 2023-08-26 13.16.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235110/a07a7311-2a61-c56b-a8c9-1146fb05b1d1.png)

### 参考
https://learn.microsoft.com/ja-jp/azure/static-web-apps/custom-domain

#### SSLの設定
Azure Static WebAppsでカスタムドメインを利用する場合は無料のSSL／TLS証明書が自動的に提供されます。

https://learn.microsoft.com/ja-jp/azure/app-service/configure-ssl-certificate?tabs=apex
SMTP経由でメール発報をするソフトの超簡易版

SMTPを使ってメールを発報するソフトの超簡易版で、かつGUIでそれぞれ入力欄にパラメーター入れて(=コマンドを入力する必要がないもの)完結するものを探しています。

今、自分の案件でSMTPメールを送る設定があるソフトを扱っているのですが、うまく行かず、そのソフトにはエラーログを発する機能もないので、原因の切り分けがすすみません。

そもそも、自分たちの選んだSMTPサーバー経由でメール発報が正しく機能しているのか、
それとも発報はされているがその先のどこかで止っているのか、といった検証が必要です。
巷にはこのようなソフトが多くあるようですが、25番ポートしか使えなかったり、IMAPとSMTPが混ざっていたり、玄人向けでコマンドを多用するものだったりで、適度にシンプルなものに巡り合えていません。

要件としては、下記の基本7要素を入れるだけでメール発報のテストができればいいんです。まずはSMTPサーバーは、情報公開されているGmailサーバーで試そうと思っていますが。

SMTPサーバーのホスト
SMTPサーバーのポート番号(25/465/587の3通り)
上記サーバーのユーザー名
上記サーバーのパスワード
暗号化方式(なし/SMTPS/TLSの3通り)
宛先のメアド
送信元のメアド

ありそうですぐ見つからないのがこのてのものですね。情報あれば。
教えてChatGPT先生

# Homebrewにパスを通す
新Macにbrew入れたら

```bash
==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
    (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/<ユーザ名＞/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
```
と言われた。時代は変わった・・・

## ご回答
:::note info
このコマンドは、Homebrewが提供するコマンド群をターミナルで利用するために必要な設定を行うものです。具体的には、Homebrewのパスをシェルの環境変数に追加して、Homebrewのコマンドをターミナルから直接実行できるようにするためのものです。

このコマンドの内容を解説します：

    (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/<ユーザ名>/.zprofile
        echo コマンドは、空行を出力します。このコマンドは改行を挿入するために使用されます。
        echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' は、Homebrewの設定を行うためのコマンドを文字列として出力します。
        >> /Users/<ユーザ名>/.zprofile は、前述のコマンドの出力をユーザーのホームディレクトリにある .zprofile ファイルに追記します。
        .zprofile ファイルは、ログインシェルが起動される際に読み込まれる設定ファイルです。

    eval "$(/opt/homebrew/bin/brew shellenv)"
        eval コマンドは、文字列として渡されたコマンドを評価・実行します。
        $(/opt/homebrew/bin/brew shellenv) は、Homebrewが提供する環境変数を設定するためのコマンドを実行してその結果を返します。
        これにより、ターミナルの環境にHomebrew関連の設定が反映されます。
:::
[SQL]FOREIN KEY制約の書き方

# FOREIN KEY制約の書き方
カラムに対してFOREIGN KEY制約を設定する場合、子テーブル側で行う。FOREIGN KEYで外部キーとなるカラムを設定し、REFERENCESで親テーブルのカラムを指定する。
```sql
CREATE TABLE db_name.tbl_name
  (col_name data_type, ..., 
   FOREIGN KEY [index_name] (col_name, ...) 
   REFERENCES tbl_name (col_name, ...))
  [ON DELETE reference_option] [ON UPDATE reference_option])
```

# REFERENCESについて
ON DELETEとON UPDATEを指定することができる。それぞれの違いは以下の通り。
- ON DELETE
    - データを削除した際の振る舞い
- ON UPDATE
    - データを更新した際の振る舞い

reference_optionには以下の4つを指定することができる。それぞれの違いは以下の通り。
- RESTRICT
親テーブルがもつキーを子テーブルの外部キーで指定されていた場合、親テーブルのレコードを削除または更新を行うとエラーとなる。[default]
- CASCADE
親テーブルに対して削除または更新を行うと、子テーブルで同じ値を持つカラムのデータに対して削除または更新を行う。
- SET NULL
親テーブルに対して削除または更新を行うと、子テーブルの同じ値を持つカラムの値がNULLになる。
- NO ACTION
親テーブルに対して削除または更新を行うとエラーとなります。[RESTRICTと同じ]

# 参考
[FOREIGN KEY制約(外部キー制約を設定する)](https://www.javadrive.jp/mysql/table/index11.html)
【Swift】OrderedDictionaryの導入手順から使用方法

## はじめに
Dictionaryを配列のようにIndex番号で取得する必要があり、**OrderedDictionary**というライブラリを使用して実装したので、忘れないようにメモします。
## OrderedDictionaryとは
`OrderedDictionaryは、DictionaryをIndexで指定して取得できたり、順番をソートできるライブラリです。`
Swift標準のDictionaryは、要素の順番が保証されていないため、配列のようにIndexを指定して要素を取得できません。

## 導入手順
OrderedDictionaryは標準のライブラリではないため、外部からインストールする必要があります。ここでは、CocoaPodsからのインストール手順を説明します。

### 手順１
podfileに以下を追加してくだい。
```:Podfile
pod 'OrderedCollections'
```
### 手順２
ターミナルを開き自分のプロジェクトがあるディレクトリまで移動します。
その後、ターミナルで以下を実行してください。
```
pod update
```
これで、ライブラリの導入は完了です。

## 使用方法
続いて、使用方法を解説します。
Dictionaryとの違いを比較しながら違いを見ていきましょう！
### 定義 
まず、`OrderedCollections`をインポートします。
```Swift: 
import OrderedCollections // 追加

// Dictionary
var fruits_1: Dictionary<Int, String> = [
    1 : "りんご",
    2 : "ぶどう",
    3 : "なし",
    4 : "もも"
]
// OrderedDictionary
var fruits_2: OrderedDictionary<Int, String> = [
    1 : "りんご",
    2 : "ぶどう",
    3 : "なし",
    4 : "もも"
]
print(fruits_1) 
// [3: "なし", 4: "もも", 1: "りんご", 2: "ぶどう"]
print(fruits_2) 
// [1: りんご, 2: ぶどう, 3: なし, 4: もも]

/* おまけ
-------------------------------- */
// 空で定義も可能
fruits_3: OrderedDictionary<Int, String> = [:]

// 構造体を使用しての定義も可能
struct Features {
    var price: Int
    var color: String
}
fruits_4: OrderedDictionary<String, Features> = [
    "りんご" : Features(price: 100, color: "red"),
    "ぶどう" : Features(price: 300, color: "purple"),
    "なし" : Features(price: 200, color: "green"),
    "もも" : Features(price: 400, color: "pink"),
]
```
:::note alert
File not found: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a
:::

もし上のようなエラーが出た場合は、以下の記事を参考にして、**Minimum Deployments**のバージョンをあげればエラーは消えると思います。

https://zenn.dev/ischca/articles/a00c3adf626ea0

### 追加方法
``` Swift
fruits_1[5] = "パイナップル"
fruits_2[5] = "パイナップル"
print(fruits_1)
// [3: "なし", 4: "もも", 1: "りんご", 5: "パイナップル", 2: "ぶどう"]
print(fruits_2)
// [1: りんご, 2: ぶどう, 3: なし, 4: もも, 5: パイナップル]
```
### 削除方法
``` Swift
fruits_1.removeValue(forKey: 1)
fruits_2.removeValue(forKey: 1)
print(fruits_1)
// [3: "なし", 4: "もも", 5: "パイナップル", 2: "ぶどう"]
print(fruits_2)
// [2: ぶどう, 3: なし, 4: もも, 5: パイナップル]
```
### 順序入れ替え
``` Swift
var fruits_5: OrderedDictionary<Int, String> = [
    3 : "なし",
    1 : "りんご",
    4 : "もも",
    2 : "ぶどう"
]
// ソート
fruits_5.sort()
print(fruits_5)　// [1: りんご, 2: ぶどう, 3: なし, 4: もも]
// シャッフル
fruits_5.shuffle() // [4: もも, 3: なし, 1: りんご, 2: ぶどう]
print(fruits_5)
// スワップ
fruits_5.swapAt(0, 3)
print(fruits_5) // [2: ぶどう, 3: なし, 1: りんご, 4: もも]
```

### 取得方法
``` Swift
// Keyでアクセス
print(fruits_1[2]) // Optional("ぶどう")
print(fruits_2[2]) // Optional("ぶどう")

// Indexを指定
print(fruits_1.elements[0].value) 
// Dictionaryは、Indexで取得できないため以下のエラーがでる
// Value of type 'Dictionary<Int, String>' has no member 'elements'

print(fruits_2.elements[0]) // (key: 1, value: "りんご")
print(fruits_2.elements[0].value) // りんご

// タイプの確認
print(type(of: fruits_1)) // Dictionary<Int, String>
print(type(of: fruits_2)) // OrderedDictionary<Int, String>

```

## おわりに
使い方は、標準のDictionaryとほとんど一緒でしたね！
今後も便利なライブラリをどんどん紹介していきたいと思います！
Python & simple-salesforce を使って Salesforce のオブジェクト項目一覧・各属性情報を抽出する

## 背景
生成 AI を活用して Salesforce をごにょごにょしようとした時に、オブジェクトの項目一覧・各属性情報をうまく使う必要が出てきました。抽出のやり方はいくつかあるのですが、出力結果をテキスト整形したかったこともあり、この目的のための使い用としてはあまり見かけない Python & simple-salesforce を使った例の記録です。

## 環境
* Python 3.10.12 (Google Collaboratory)
* simple-salesforce==1.12.4

https://github.com/simple-salesforce/simple-salesforce

## 試し方
以下は Google Colaboratory での操作手順を想定していますが、パソコンで直接実行でももちろん動きます。
### 1.simple-salesforce をインストール
まずは必要なライブラリをインストールしましょう。次をコードブロックに転記し実行します。
```Shell
!pip install simple-salesforce
```
### 2.環境変数にユーザー名とパスワードを設定
続いて環境変数を設定します。次のコードを該当箇所を書き換えて、コードブロックに転記し実行します。
```Shell
%env USERNAME=使用する Salesforce のユーザー名に書き換え
%env PASSWORD=↑のパスワードに書き換え
```
### 3.コードを実行
次をコードブロックに転記し実行します。
```Python
import os
import pprint
from simple_salesforce import Salesforce

# 環境変数から当該組織へアクセスできるユーザー名/パスワードを読み込み
USERNAME = os.environ['USERNAME']
PASSWORD = os.environ['PASSWORD']

# 接続実施
# Sandbox に接続する場合は引数に domain='test' を加える
sf = Salesforce(username=USERNAME, password=PASSWORD, security_token='')

# 特定オブジェクトの項目情報を取得
# 次は取引先(Account)の項目。Account を Contact や Opportunity に変えることで他のオブエクトの項目情報を取得できる
fields = sf.Account.describe()['fields']

# 項目名と型を出力
for field in fields:
    print(f'{field["name"]} {field["type"]}')
```
* describe() で返されるオブジェクトや取り出した field にどんな情報が含まれているかは、次を参考にすると良いです。
    * [SOAP API 開発者ガイド -> 参照 -> 記述用の API コール(describe) -> DescribeSObjectResult](https://developer.salesforce.com/docs/atlas.ja-jp.244.0.api.meta/api/sforce_api_calls_describesobjects_describesobjectresult.htm)

## 実行結果例
次のように 項目名 型 の一覧が表示されれば成功です。
![colab-simple-salesforce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3535779/b0517ba6-3cb3-ef42-b40a-5a4e122b2068.png)

出力の仕方を変えることで、例えば次のような一覧形式にすることもできます。
```text
Id id(18),
IsDeleted boolean,
MasterRecordId reference(18) to Account,
Name string(255),
LastName string(80),
FirstName string(40),
Salutation picklist(40),
Type picklist(255),
RecordTypeId reference(18) to RecordType,
ParentId reference(18) to Account,
BillingStreet textarea(255),
BillingCity string(40),
BillingState string(80),
BillingPostalCode string(20),
BillingCountry string(80),
〜以下略〜
```
あれに似てますよね。Salesforce のオブジェクトの項目構成をこのように表記する必要は`基本的にはない`のですが、これを使った検証については別記事で解説します。

以上、「Python & simple-salesforce を使って Salesforce のオブジェクト項目一覧・各属性情報を抽出する」でした。
「100Contribution」のバッジを獲得しました

久しぶりにQiitaのページを開いたら、こんな通知が！

>「100Contribution」のバッジを獲得しました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265690/30b374c2-65c0-d614-f2f0-f2adad1f8beb.png)

おおお、こういうモチベートしてくれる仕組み、いいですねえ。
自分のバッジの獲得履歴は、このページで参照できるようです。（要ログイン）

[https://qiita.com/badges](https://qiita.com/badges "バッジ")

いいねやストックしてくれた皆さん、ありがとうございます。
これからも、ぼちぼち投稿していきますので、よろしくお願いいたします。
Ubuntu Serverでフォントサイズを変更する方法

## フォントサイズを変更する方法
```UbuntuServer
# ルート権限で入る
sudo -s
# Configureing console-setupを開く
dpkg-reconfigure console-setup
```
* UTF-8を選択しOKを押下
* Guess optimal character setを選択しOKを押下
* Font for the console: 画面で以下から任意のものを選択しOKを押下
    * Fixed
    * Goha
    * GohaClassic
    * Terminus
    * TerminusBold
    * TerminusBoldVGA
    * VGA
    * Do not change the boot/kernel font
    * Let the system select a suitabl font 
* Font Sizeを任意のもの選択
MacOSでHomebrewをインストールしたのに 「command not found: brew」と言われた

# はじめに
「zsh: command not found: brew」 とググると色々出てくるが、そんな大それた問題じゃない。
違うんだ！インストールは成功しているんだと思っている方。

僕自身もMacOSにHomebrewをインストールしたときに地味にハマったので備忘録として。

# 環境
- macOS: 13.4


# 事象
[公式サイト](https://brew.sh/index_ja)より以下コマンドを実行する
```
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"


==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
  https://docs.brew.sh/Analytics
No analytics data has been sent yet (nor will any be during this install run).

==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations

==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
    (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/user/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
- Run brew help to get started
- Further documentation:
    https://docs.brew.sh

```

お！成功したっぽい・・！
以下コマンドを実行すると・・

```shell
 % brew -v
 
 zsh: command not found: brew
```

**おおん？？？なんでや？？成功しているやんけ？？**

ここで「zsh: command not found: brew」と焦って調べてみると・・
ターミナルの設定が違う？
いやいや違う違う・・そんなわけない・・

エラー文をよく読んでみると・・
```shell
==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
    (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/user/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
```

**「パスが通っていないので以下コマンドを実行してください」**

言われたとおりに以下を実行
※ユーザーネームはご自身の名前に置き換えてください！

```shell
%  (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/ユーザーネーム/.zprofile
%  eval "$(/opt/homebrew/bin/brew shellenv)"
%  brew -v   

Homebrew 4.1.6
```
できた！！！！！！！！！！！！


# 最後に
改めてエラー文をしっかり読もうと実感した瞬間でした。
開発にも慣れてくると自分の力を過信して、細かな単純な問題に意外と苦労することあるよね・・
AWS Rust SDKを使ってAssume Roleする方法

```rust
use aws_config::default_provider::credentials::DefaultCredentialsChain;
use aws_config::sts::AssumeRoleProvider;
use aws_types::region::Region;

#[tokio::main]
async fn main() {
    let credentials_provider = DefaultCredentialsChain::builder().build().await;

    let assume_role_arn = "TARGET_ROLE_ARN";

    let assume_role_provider = AssumeRoleProvider::builder(assume_role_arn)
        .region(Region::new("ap-northeast-1"))
        .build(credentials_provider);

    let aws_config = aws_config::from_env()
        .region("ap-northeast-1")
        .credentials_provider(assume_role_provider)
        .load()
        .await;

    let client = aws_sdk_route53::Client::new(&aws_config);

    let hosted_zones = client.list_hosted_zones().send().await.unwrap();

    for hz in hosted_zones.hosted_zones.unwrap() {
        println!("{}", hz.name.unwrap());
    }
}

```
VisiDataの操作方法について

# はじめに

構造化データ向け分析ツールの一つである、「VisiData」を使ってみたので
備忘録として記載しています。

https://www.visidata.org/

# 基本操作

| 記述 | 解説 |
|:-----------|:------------|
| vd xxx.csv       | csvファイルをVisiDataで開く|
| h                | 左に移動      |
| j                | 下に移動      |
| k                | 上に移動      |
| l                | 右に移動      |
| gj               | 一番下に移動   |
| gk               | 一番上に移動   |
| gh               | 一番左に移動   |
| gl               | 一番右に移動   |
| ctrl-F           | 1ページ下がる   |
| ctrl-B           | 1ページ上がる   |
| q                | 終了       |
| ctrl-q           | 強制終了   |
| /xxx             | xxxを検索  |
| g/xxx            | xxxを全体検索  |
| s or t           | 対象行を選択  |
| u                | 対象行の選択を解除  |
| gs or gt         | 全行を選択  |
| gu               | 全行の選択を解除  |
| \|(縦バー)        | 検索対象のカラムから特定のものを検索  |
| \\(バックスラッシュ) | \|での検索解除  |
| g\|(縦バー)       | 全カラムから特定のものを検索  |
| g\\(バックスラッシュ) | g\|での検索解除  |
| ,(カンマ)         | 選択行、列と同様の内容のものを選択  |
| "(ダブルクォテーション)   | ソート内容を新規コピー(オリジナルはバックグラウンドにある)  |
| Shift-S           | 新規シートを作成  |
| Alt+N(ショートカット番号) | ショートカット番号のシートへ移動  |
| Control-^         | 現在のシートと前のシートを行き来する  |
| Control-s         | シートを保存  |
Javaで「便利な書き込み用クラス」の動作を確認してみた

# 概要
Javaで「便利な書き込み用クラス」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/stream/index7.html

# 実装
以下のファイルを作成しました。
```StreamTest7.java
import java.io.File;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.PrintWriter;
import java.io.IOException;

class StreamTest7{
  public static void main(String args[]){
    try{
      File file = new File("test.txt");

      if (checkBeforeWritefile(file)){
        PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));

        pw.println("今日の最高気温は");
        pw.println(10);
        pw.println("度です");

        pw.close();
      }else{
        System.out.println("ファイルに書き込めません");
      }
    }catch(IOException e){
      System.out.println(e);
    }
  }

  private static boolean checkBeforeWritefile(File file){
    if (file.exists()){
      if (file.isFile() && file.canWrite()){
        return true;
      }
    }

    return false;
  }
}
```
以下のコマンドを実行しました。
```
$ javac StreamTest7.java 
$ java StreamTest7 
```

# まとめ
何かの役に立てばと。
asdf 複数のプラグインを一氣にまとめてインストール

[asdf]は複数のプログラムの複数のバージョンを管理できて便利です。必要な時にひとつひとつインストールするのは別に苦にならないと思いますが、まっさらな[パーソナルコンピュータ]（PC）や[仮想機械]（VM）の設定を行う時には必要なプログラムを一氣にまとめてインストールしたくなります。

https://asdf-vm.com

https://qiita.com/search?q=asdf

<!-- begin hyperlink list -->
[パーソナルコンピュータ]: https://ja.wikipedia.org/wiki/パーソナルコンピュータ
[仮想機械]: https://ja.wikipedia.org/wiki/仮想機械
[asdf]: https://asdf-vm.com/
[asdf Getting Started]: https://asdf-vm.com/guide/getting-started.html
[bash]: https://ja.wikipedia.org/wiki/Bash
<!-- end hyperlink list -->


## 戦略を練る

### プログラミング言語
ターミナルで直接使える[bash]にすることにします。

### 繰り返し処理
複数の対象に対して同じ処理を行うには多分ループがそれ相当のものが必要であると考えられます。

## bashでループ
これさえできれば、目的が達成できるはずです。
ネット検索して練習しました。

```bash:闘魂フォーエバー
n=1; while true; do echo "闘魂 $n"; ((n++)); sleep 1; done
```

```bash:123-1
for n in 1 2 3; do echo $n; done
```

```bash:123-2
for n in {1..3}; do echo $n; done
```

[bash]に配列なんてあったんですね。

```bash:123-3
numbers=(1 2 3); for n in "${numbers[@]}"; do echo $n; done
```

https://stackoverflow.com/questions/8880603/loop-through-an-array-of-strings-in-bash

これで技術的な準備はOK!

## 一氣にまとめてインストール

繰り返し処理以外は[asdfの公式ドキュメント][asdf Getting Started]に書いてある通りです。

```bash:terminal
# asdfをインストール
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.12.0

# 万一インストールされたasdfのバージョンが最新でない場合にアップデート
asdf update

# インストールしたいasdfのプラグインの名称を配列に入れる
plugins=(
  erlang
  elixir
  neovim
  delta
  fzf
  lua
  nodejs
  ripgrep
  shfmt
  zig
)

# 配列に対して繰り返し処理
for plugin in "${plugins[@]}"; do
  asdf plugin add "$plugin"
  asdf install "$plugin" latest
  asdf global "$plugin" latest
done
```

[asdf]をインストールした後のやり方がお使いのシェルによって異なるため、詳しくは[asdfの公式ドキュメント][asdf Getting Started]をご参照ください。[bash]の場合は以下の通りです。

```bash:terminal
echo '. $HOME/.asdf/asdf.sh' >> ~/.bashrc
echo '. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc
source ~/.bashrc
```

## プラグイン名の確認方法

プラグイン名は[asdf-vm/asdf-plugins](https://github.com/asdf-vm/asdf-plugins/tree/master/plugins)のリポジトリで確認できます。

[asdf]をインストールした後は、`asdf plugin list all`コマンドを打つと利用可能な全てのプラグインを列挙できます。あまりにも数が多いので`less`か`grep`にパイプするとみやすくなりそうです。

```bash:CMD
asdf plugin list all | less
```

```bash:CMD
asdf plugin list all | grep -e '^e'
```

:tada::tada::tada:

## asdfでよく使うコマンド
[asdf]の使い方を忘れたらこれを思い出してください。何も暗記する必要はありません。

https://qiita.com/torifukukaiou/items/9009191de6873664bb58
CMake参考書紹介(2022年時点)

# 記事の概要

著者がマルチプラットフォームで動作するC++のオープンソースソフトウェアを作るときに役に立ったCMakeの参考書を紹介します。

**なお、著者がCMakeを積極的に触っていたのは2022年の話なので、この記事は2022年時点の情報です。**

:::note info

**CMakeとは**

C/C++をプラットフォーム間の差異を吸収してビルドしてくれるツールです。
CMake用のビルド設定ファイル（Visual Studioで言うソリューション、プロジェクトに対応するもの）を正しく書くと、様々なプラットフォームで同じコマンドを打つだけでビルドできるようになります。
つまり、C/C++をマルチプラットフォームで動かさなくてはならない人にとって、神ツールです。

なお、C/C++をマルチプラットフォームで動かす気がないならCMakeは要らないと思います。
:::

# 参考書① [An Introduction to Modern CMake](https://cliutils.gitlab.io/modern-cmake/)

無料。

個人用のCMakeプロジェクトを作るくらいはできると思います。

無料なのでとりあえずこれを読んでみて、解決しなければ②を読むのが良いと思います。

# 参考書② [Professional CMake: A Practical Guide](https://crascit.com/professional-cmake/)

有料。

この本の内容をそのまま実践したらマルチプラットフォーム対応のCMakeのオープンソースプロジェクトを作ることができました（体験談）。

CMakeの使い方を周辺知識も織り交ぜながら網羅的に説明してくれます。加えて、説明が丁寧でわかりやすいです。（正直CMakeの公式Getting Startedにこの本の内容をそのまま書いてほしいくらいです。）

CMakeのアップデートが入ると改訂版を出してくれるのも偉いです。なお、1度購入すればその後の改訂版は無料でもらえるので安心してください。

# 雑談

CMakeは公式リファレンスがCMakeを分かっている人にしか分からないようにできています（要検証）。加えて、2022年時点だと適当に検索してヒットする日本語の記事にはまともなものがありませんでした（個人の感想）。ですので、上記参考書に出会うまでは地獄でした。
著者は上記参考書の回し者ではありませんが、この2つに救われたのに加え、これらにたどり着くまでがかなり大変だったのでこの記事を書きました。特に②のほうはStack overflowの何かの質問の返信に添えられてたリンクを踏んでたどり着いたんだったと思います。
npm エラー解決 Sorry, there's a problem with nodist. Couldn't resolve npm version spec match : Couldn't find any matching version

# 経緯
Reactの開発環境を構築している最中に、npmコマンドをたたくと以下のようなエラーが発生した。
```
Sorry, there's a problem with nodist. Couldn't resolve npm version spec match : Couldn't find any matching version
```
このエラーをググると、`nodist npm match`というコマンドが有用らしいのだが、こちらをたたいても以下のエラーとなり動けない状況だった。
```
>nodist npm match
npm match
(node:11060) UnhandledPromiseRejectionWarning: Error: Version spec, "v0.12.2", didn't match any version
    at Object.versions.find (C:\Program Files (x86)\Nodist\lib\versions.js:52:15)
    at C:\Program Files (x86)\Nodist\lib\nodist.js:470:16
    at C:\Program Files (x86)\Nodist\lib\nodist.js:416:7
    at processTicksAndRejections (internal/process/task_queues.js:79:9)
(node:11060) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:11060) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
```
# 解決方法
https://zenn.dev/ymasaoka/articles/note-uninstall-nodish-windows

上記を参考にアンインストールし、残ったファイルを削除した後、インストーラから再ダウンロード→再インストールで解決。

原因は最初にダウンロードしたときにnpmの実行ファイルがダウンロードできてなさげだったことだと思ってる。（検証してないから知らない）
ただUninstall.exeを起動させての再インストールだと、再度同じエラーが発生したため、残ったファイルの削除がミソだったのではないかなと思う。
Excuse Queryでストアドプロシージャ起動

　Excuse QueryアクティビティでSQLサーバーに登録する人は多いと思います。

　ただし、中にはVBAでストアドプロシージャを起動して登録していたのでそれを踏襲してほしいと言われることがあります。

　では、どのように行うのか？簡便に説明したいと思います。

　そもそもの仕様につきましては公式を参照してください。
https://docs.uipath.com/ja/activities/other/latest/developer/execute-query

　ちなみに、サーバーとのコネクションについては以下のブログが詳しいです。
http://zawanii.com/uipath-database-connect/

　その際、DatabaseConnection型変数を出力で設定していると以後の作業がやりやすくなります。その変数を「既存の接続」に代入すれば接続サーバーで作業は可能となります。

　コマンドと変数ですが、通常「select」もしくは「insert」は「SQL」の欄に代入するとは思います。ストアドプロシージャはどうすればいいのか？「SQL」の欄にストアドプロシージャ名を代入すれば大丈夫です。

　変数は、パラメータに記入いたします。注意するべきことは、対象の変数に「@」を忘れないことです。
RubyとRubyGemsのバージョン違いで困ったときの解決策：rbenv編

## rbenvとは？

rbenvはRubyのバージョンを管理するためのツールです。rbenvを使えば、プロジェクトごとに異なるRubyのバージョンを使うことができます。

## rbenvでの対処法

### 対処 1: rbenvでRubyのバージョンを揃える

Gemfileに指定されたRubyのバージョンと、実際にシステムで使っているRubyのバージョンが異なる場合、rbenvを使って解決できます。

#### Step 1: 利用可能なRubyのバージョンを確認

```bash
rbenv install --list
```

#### Step 2: 必要なRubyのバージョンをインストール

```bash
rbenv install 3.2.2
```

もし、`definition not found`というエラーが出た場合は、ruby-buildをアップデートしてください。

```bash
brew update && brew upgrade ruby-build
```

#### Step 3: プロジェクトディレクトリで使うRubyのバージョンを指定

```bash
cd /your/project/directory
rbenv local 3.2.2
```

これで、そのプロジェクト内ではRuby 3.2.2が使われるようになります。

### 対処 2: rbenvでRubyGemsのバージョンを更新する

rbenvを使用している場合、特定のRubyバージョンに紐づいたRubyGemsを更新することも可能です。

```bash
# 現在のRubyバージョンでRubyGemsを更新
rbenv exec gem update --system
```

## まとめ

rbenvはRubyのバージョン管理を容易にしてくれます。特定のプロジェクトで必要なRubyのバージョンを簡単に設定できるので、バージョンによる問題を効率的に解決できます。
自作PCまとめ（歴代PC一覧付き）

PCの利用の歴史と、自作PCのまとめを記録する。

 ＜この記事は書きかけです。順次追記します。＞
 This article is not completed. I will add some words in order.

# プログラミング電卓
電子計算機の利用は、プログラミング電卓が始め。

CASIOのプログラミング電卓を購入し、ひたすらゲームを打ち込んだ。　

写経の始まりである。

# 8bit PC
## 借り物 TSS80
８ビットPCは、結局購入しなかった。　

Tandy RadioshackのTRS-８０を借りて使った。

ちょうど、その後参加した、名古屋のパソコンサークルが、
TRS-80のユーザ会を母体にしていたことを知ったのは、もっと後のことだ。

## 借り物　８びっっとボードコンピュータ
TK-80はじめ、８ビットボードコンピュータは全部借り物
シリアル通信でつないで、プログラムの埋め込み、動作確認などをした。

# 16bit PC
## PC-9801M2
最初に購入した１６ビットPC。

名古屋工業大学の計算機センターのコンピュータとのシミュレータの移植を行なったのも、このPCでだ。　

移植とはいえ、１００人以上の人に利用してもらった最初のプログラムかもしれない。

PC-9801シリーズで、手を加えたのは、8087という数値計算プロセッサを刺したくらい。


## N5200
8080系のCPUを使ったオフコンで、PC-9801と同じNECが出していた。

MS-DOSのMS Cで、キーボード練習プログラムを作った。
１００人以上の人に利用してもらった次のプログラムかもしれない。
のちに、MS-DOSのTypeQuickを購入し、商用ソフトに移行した。　

自作ソフトの出来と、商用ソフトの出来を比較するよい機会になった。

### VZeditor移植。
 VZエディタ移植に当たって実施したことと成果、仮説(115)
https://qiita.com/kaizen_nagoya/items/5551be98dcbed8f41949

# 32bit PC

## Indy
電源断ボタンを押すと自動的にshutdownコマンドを発行して、安全に終了してくれる。
Macintosh

https://wired.jp/2004/11/30/sgi社製『indy』、ファンに根強い人気/

## ichigo jam 

https://fukuno.jig.jp/3103
http://dakeigai.shizentai.jp

## HP UX
購入したわけではない。あるサービスで、HPUXにログインできるものがあり、勉強会などを開いた。

## 自作32ビットPC
16ビットPCの時代に、自作PCしたことがなかった

### ASUS
自作PCで、マザーボードで、一番多かったのはASUS。
https://www.asus.com/jp/motherboards-components/motherboards/all-series/

# 64bit PC

## 自作６４ビットPC
ひょっとしたら、64ビットCPUになってから、自作PCって数台あったかなかったか。

安いショップPCがあったり、中古PCを購入したりして、自作する利点をあまり感じなくなったからかもしれない。

# 参考資料
ディープラーニングのための初めての自作PC
https://qiita.com/yusuke-saruya/items/af86ee3a8e434ff1bf43

ディープラーニング用に自作PCを作る
https://qiita.com/futakuchi0117/items/5d31aacac5f6ab6665dd

初めて自作PCを作った話
https://qiita.com/ait-sysken/items/4c0314a01e56e1235067

初めての自作PC紹介
https://qiita.com/hirono-freelance/items/2828027629a97d6ba653

自作PC構成2020
https://qiita.com/ekusiadadus/items/2e1291686d1cf6c8603d

自作PCメモ
https://qiita.com/eisoku9618/items/9edad1f95a33307e24e8

自作PC~2019年~
https://qiita.com/grapefruit1030/items/de3ddb082a429370833c


自作PCの作り方
https://qiita.com/DJ-yamada/items/4922b1b8287ad10e9f78

【空冷自作PC】Ryzen7 5700G + ASRock DeskMini X300をノクチュア NH-P1でファンレスにした話
https://qiita.com/Nisi/items/24bc1fb90d23b03f64aa


 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong. 


# 文書履歴(document history)
ver. 0.01 初稿　　20230827
ver. 0.02 ありがとう追記　　20230827

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Laravel + jwt-auth トークン有効期限の設定

configディレクトリのjwt.phpのファイルで設定できる。


```php:jwt.php
    /*
    |--------------------------------------------------------------------------
    | JWT time to live
    |--------------------------------------------------------------------------
    |
    | Specify the length of time (in minutes) that the token will be valid for.
    | Defaults to 1 hour.
    |
    | You can also set this to null, to yield a never expiring token.
    | Some people may want this behaviour for e.g. a mobile app.
    | This is not particularly recommended, so make sure you have appropriate
    | systems in place to revoke the token if necessary.
    | Notice: If you set this to null you should remove 'exp' element from 'required_claims' list.
    |
    */

    'ttl' => env('JWT_TTL', 60),
```

デフォルトで60(1時間)に設定されている。
ここを変更することで設定可能。
正規表現の先読み、後読みの記号の覚え方

正しい由来はわかりませんが、自分は以下のような記号の理解をしました。

`?`: 調べる
`=`: 含まれているかどうか
`!`: 含まれていないかどうか(論理否定)
`<`: 後ろに向いているから後読みになる※

※先読み後読みというのは時間軸ではなく、位置の前・後ろという捉え方をしましょう。
先読みは前を調べるのに、後読みは後ろを調べるのに使います。
（後ろ→文字列→前）

これらを組み合わせれば先読み後読みが作れます。
`?=`: 肯定先読み
`?<=`: 肯定後読み
`?!`: 否定先読み
`?<!`: 否定後読み

----
もう一度先読み、後読みを復習したいという方はこちらへ

正規表現 | 先読みと後読みを使ったパターン - javadrive
https://www.javadrive.jp/regex-basic/writing/index2.html

正規表現の先読み・後読みを極める！ - あらびき日記
https://abicky.net/2010/05/30/135112/
[shell]　zsh、.zshrcとは

# 目的
Macのターミナルで使用しているシェルであるzshとその設定ファイルである./zshrcについてまとめる。

# zshとは
シェルの一つ。
- シェル
		カーネルと利用者の橋渡しをするプログラム。複数あり、zshの他にsh,bashcsh,tcsh,kshなど
		ターミナルから受け取った命令をカーネルに伝える
		
# ~/.zshrc

 zshの設定ファイル。rcは[Run Command]の略。zshrcは「zshを実行するためのコマンド」。
 ログインシェル、インタラクティブシェルの場合に読み込まれる。
 環境変数(OSが持っている変数)として読み込ませたいパスを書く。
  - シェルの分類
	   - ログインシェル　ログイン時に起動するシェル
	   - インタラクティブシェル　ログインシェルから起動されるシェル
	   - シェルスクリプト　.shファイル(シェルへの命令をまとめたプログラム)のこと

#### .zshrcの中身の例
``` .zshrc
export PS1="%~ %n" PATH="$HOME/.nodebrew/current/bin:$PATH"
```
 - exportコマンド
	環境変数を定義するためのコマンド
	<br>
- PS1
	Prompt Statement。プロンプトの表示形式。%nはユーザー名。
	- プロンプト
		 システムの操作時に入力他処理などを促す文字列などのこと
　　

- PATH
ファイルがどこにあるか　　
　　
- eval
	文字列を標準出力としてシェルに与え、実行。
	例）`eval "$(rbenv init -)"`

# ./zshrcを変更した際に設定を反映
```
source ~/.zshrc
```

# シェルの切り替え
```
#　今のシェル
echo $SHELL

#　ログインシェルの切り替え
which zsh
chsh -s /usr/bin/zsh
```
## 参考
[【保存版】zshrcって何だろう？中身を見てみましょう。](https://note.com/standenglish/n/ne9825624fe93)
[【シェル】いつも使うけどいつも忘れるzshrcについていい加減まとめてみた！](https://nonakayasuo.com/zshrc/#:~:text=zshrc%E3%81%A8%E3%81%AF%E3%80%81zsh%20%2B%20rc,%E3%81%A8%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)
[`zsh`で`eval`する](https://qiita.com/Soluna_Eureka/items/fd1cbf3540af38eeed74)
ChatGPT、Vertex AI等の生成AIを簡単にカスタマイズして自社用に使いこなせるオープンソース"Skeet"がGPT-3.5のファインチューニングにも対応しました

![FineTuningWithGPT35Turbo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780317/057cd6e0-9189-d7c3-8347-9c0dfd543a4b.png)


gm! ELSOUL LABO の kishi.sol です。

ChatGPT、Vertex AI 等の生成 AI を簡単にカスタマイズして自社用に使いこなせるオープンソース "Skeet" のプラグイン "Skeet AI" の バージョン 1.4.0 をリリースしました。

Skeet は GCP (Google Cloud) と Firebase 上にフルスタックアプリを構築できるオープンソースの TypeScript 製サーバーレスフレームワークです。

API サーバーから Web・iOS・Android アプリまですべてを TypeScript で爆速開発することができます。

今回のアップデートにより、Skeet では TypeScript を使って GPT-3.5 の Fine-tuning を簡単に実行できるようになりました。

Skeet AI (GitHub): https://github.com/elsoul/skeet-ai

## ChatGPT の GPT-3.5 Turbo を使用したファインチューニング(Fine-tuning)

ファインチューニングの利点は、次のとおりです。

- 高品質な応答の生成
- より多くの例の適用
- コストの節約（トークン数、処理時間の削減）

初期のテストにおいてファインチューニングした「GPT-3.5 Turbo」は、特定の狭いタスクに関して「GPT-4」と同等、またはそれ以上のパフォーマンスを発揮できることが報告されています。

Skeet では、GPT-3.5 Turbo を使用したファインチューニングを簡単に実行でき、出来上がったモデルをアプリケーションに組み込む準備はできています。

ファインチューニングのためのデータセット(JSONL 形式)を様々なデータ形式(例えばドキュメントの Markdown 等)から作成するためのツールも提供するため、AI モデルのカスタマイズから、それを活かしたアプリケーションの開発までを一貫して爆速で行うことができます。

今後も AI を活用するための多岐にわたる開発サポートを充実させ、より速く、より便利な開発環境を構築してまいります。

Skeet は世界中すべてのアプリケーション開発現場の開発・メンテナンスコストを削減、開発者体験を向上させるためにオープンソースとして開発されています。

詳しくは公式ドキュメントを御覧ください。

Skeet ドキュメント: https://skeet.dev/ja/
せんせー、モノクローナル抗体ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、モノクローナル抗体ってなに？

# モノクローナル抗体とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## モノクローナル抗体って何？

みんな、身体が風邪をひくと、体を守るために「戦士」が出てくるのを知ってますか。
この「戦士」たちは、病気の原因となるバイキンを攻撃してくれるんです。
モノクローナル抗体は、特定のバイキンや病気を攻撃する特訓された「戦士」のようなものです。

## どういうこと？

科学者たちは、特定の病気やバイキンに対して効果的に戦える「戦士」を作ることができるんです。
それがモノクローナル抗体なんです。

## どうしてそれがすごいの？

このモノクローナル抗体を使うと、特定の病気や問題に対して、効果的に戦うことができるからすごいんです。
新しい薬や治療法を作るときにも使われます。

## だから、モノクローナル抗体ってなに？

モノクローナル抗体は、特定の病気やバイキンに効果的に戦うために作られた特訓された「戦士」のことなんです。

# まとめ

このように、モノクローナル抗体は私たちの体を守るために科学者たちが作った特別な「戦士」で、新しい薬や治療法を開発するのに役立っているんです。
せんせー、フォトニッククリスタルってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、フォトニッククリスタルってなに？

# フォトニッククリスタルとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## フォトニッククリスタルって何？

みんな、虹を見たことあるよね？虹は太陽の光が雨の粒とぶつかることで、きれいな色に分かれて見えるんです。
フォトニッククリスタルは、光を特別な方法で操作することができる素材なんです。

## どういうこと？

フォトニッククリスタルは、とても小さな穴や模様が並んでいる素材で、これによって光を特定の方向に進めたり、
特定の色だけを透過させたりすることができます。

## どうしてそれがすごいの？

この素材を使うと、新しい種類のライトや、特別なカメラ、センサーなどを作ることができるんです。
それは、私たちの生活や科学の研究に役立つかもしれないです。

## だから、フォトニッククリスタルってなに？

フォトニッククリスタルは、光を特別な方法で操作することができる素材のことなんです。

# まとめ

このように、フォトニッククリスタルは、光の動きを特別にコントロールするための素材で、新しい技術や製品を作るのに使われることがあるんだよ。
せんせー、フォトニッククリスタルってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、フォトニッククリスタルってなに？

# フォトニッククリスタルとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## フォトニッククリスタルって何？

みんな、虹を見たことあるよね？虹は太陽の光が雨の粒とぶつかることで、きれいな色に分かれて見えるんです。
フォトニッククリスタルは、光を特別な方法で操作することができる素材なんです。

## どういうこと？

フォトニッククリスタルは、とても小さな穴や模様が並んでいる素材で、
これによって光を特定の方向に進めたり、特定の色だけを透過させたりすることができます。

## どうしてそれがすごいの？

この素材を使うと、新しい種類のライトや、特別なカメラ、センサーなどを作ることができるんです。
それは、私たちの生活や科学の研究に役立つかもしれないです。

## だから、フォトニッククリスタルってなに？

フォトニッククリスタルは、光を特別な方法で操作することができる素材のことなんです。

# まとめ

このように、フォトニッククリスタルは、光の動きを特別にコントロールするための素材で、
新しい技術や製品を作るのに使われることがあるんです。
IPアドレスの仕組み

### 32ビットIPアドレスの構成
IPアドレスは、LANを幾つかのグループに分け、各ノードに設定した「LAN番号+ノード番号」という形式の論理的アドレスのLAN番号からノードが属するネットワークが分かるといった利点がある。
#### IPアドレス構成
TCP/IPネットワークに接続されたホスト（ノード）を識別するため、ホスト一台一台に割り当てられた識別番号がIPアドレス。
「ネットワークアドレス部」
（ホストが属するネットワークの番号）
+
　ネットワーク内のホストに割り当てられた番号を表す「ホストアドレス部」
32ビットを8ビットずつ四つに区切り、192.168.1.1は10進数に変換したものです。
8ビット表現できる数は0～255（2⁸-1）、256⁼2⁸個の数
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/f3684c5a-83ea-bf1c-61b0-51933eadccda.png)
上の図のIPアドレスでは、左から24ビットで表現される192.168.1　はLAN番号で、後ろの１　はノード、ホスト番号である。
ホスト番号は0と255が使えないため、ホスト番号の数は最大254です。
#### IPアドレスのクラスによる分類
IPアドレスの分類法に、クラスという概念があり、IPアドレスのをネットワークアドレス部の長さ、ホストアドレス部の長さによって分類する。
クラスA⇒　ネットワークアドレス部８ビット+ホストアドレス部24
割り当て可能なIPアドレスは16777214個
クラスB⇒　ネットワークアドレス部16ビット+ホストアドレス部16
　2¹⁶-2　65534個
クラスC⇒　ネットワークアドレス部24ビット+ホストアドレス部8　
　2⁸-2　254個
よって、IPアドレスのクラスは、ネットワークの規模で分配する。
#### 一つのネットワークをサブネットに分割
クラスCを用いてIPアドレスを割り当てた場合、最大254台接続できるが、小さいグループごとに部署ごとにネットワークを分けたい際に、ネットワークをさらに分割して使うのです。一つのネットワークを幾つかに分割したものをサブネットワークという。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/ec15158a-e3c9-1cdb-e034-72ab7f638a68.png)
図では、IPアドレス192.168.1.0のネットワークを、幾つかのサブネットに分割する場合、ホスト番号をサブネット番号+ホスト番号になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/8f22ea9f-148a-e5a0-e9da-d2adc3faf162.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/8d4dd018-1891-01c5-925b-eea36a49539e.png)
この部分をサブネットアドレス部。
三つのサブネットを分割する場合、ホスト番号は８-2、6桁になり、割り当て可能なIPアドレスは2⁶-2　62個になる。
#### IPアドレスからネットワークアドレスを求める
IPアドレスだけではサブネットアドレスかホスト番号は判断出来ないので、サブネットマスクが用いられる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/75ba1300-c62b-0948-53fc-d62d961ce39e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/8ac0aed5-cfcf-dfc3-e417-8f48d937de23.png)

クラスレスの割り当て方法は　サイダー（CIDR）
どこまでがネットワークアドレス部か分かるように、
192.168.1.49/28　28がネットワークアドレスの長さ。

#### 練習問題
同一ネットワーク内で割り当て可能なIPアドレス数は、ホスト番号部のビット数で決まる。
IPアドレス192.168.1.1　つまり11000000　10101000　00000001　00000001、はクラスCのIPアドレスである。
サブネットマスクは、ネットワークアドレス部とサブネットアドレス部に対応する部分のビットを１に設定したビット列である。
せんせー、プロトセルってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、プロトセルってなに？

# プロトセルとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## プロトセルって何？

みんな、生き物はどこからきたと思いますか？
昔昔、最初の生き物ができる前の、生き物のようで生き物じゃないものがあったんです。
それを「プロトセル」と呼びます。

## どういうこと？

プロトセルは、生き物のように見えるけれど、本当の生き物ではないものです。
でも、プロトセルは、生き物ができるための最初のステップとして、
とても大切な役割を果たしていたんです。

## どうしてそれがすごいの？

プロトセルは、私たちや動物、植物が今いるような生き物の起源になっているかもしれないんです。
だから、プロトセルを知ることで、生き物がどのようにして生まれたのかを理解する手助けになります。

## だから、プロトセルってなに？

プロトセルは、生き物のようで生き物じゃない、昔の地球にあった特別なものなんです。

# まとめ

このように、プロトセルは、生命の起源と関連している可能性があるとても興味深い存在なんです。
せんせー、ハイブリッドエネルギーストレージシステムってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、ハイブリッドエネルギーストレージシステムってなに？

# ハイブリッドエネルギーストレージシステムとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## ハイブリッドエネルギーストレージシステムって何？

みんな、家の中にあるおもちゃの箱を知ってるよね？おもちゃをたくさん入れることができる箱です。
ハイブリッドエネルギーストレージシステムは、エネルギー（電気のようなもの）を保存する特別な「箱」のことなんです。

## どういうこと？

この「箱」は、いろんな種類の方法でエネルギーを保存することができます。
たとえば、太陽の光で作ったエネルギーや、風で作ったエネルギーを、この「箱」に入れて保存しておくことができます。

## どうしてそれがすごいの？

エネルギーを色々な方法で保存できると、もっとたくさんの電気を使うことができます。
夜や風のない日でも、この「箱」に保存しておいたエネルギーを使って、家の電気をつけたり、テレビを見たりすることができるんです。

## だから、ハイブリッドエネルギーストレージシステムってなに？

ハイブリッドエネルギーストレージシステムは、いろんな種類のエネルギーを保存しておける特別な「箱」のことなんです。

# まとめ

このように、ハイブリッドエネルギーストレージシステムは、私たちが使うエネルギーを色々な方法で保存しておける特別なシステムなんです。
Threadsの共有ボタンを実装する方法

以下のような形式のURLにアクセスするとThreadsの共有画面が開きます。``text``パラメーターに共有したいテキストを設定してください。

```
https://www.threads.net/intent/post?text=<共有したいテキスト>
```

[公式のThreadsロゴ](https://about.meta.com/ja/brand/resources/instagram/threads/)に上記のリンクを設定すれば、共有ボタンの完成です。

------

**ここから下は古い内容なので、一応残しておきますが気にしないでください。**

:::note warn
この記事で紹介する方法はドキュメントに記載されていないため、正しく動作しなかったり、将来的に動作しなくなったりする可能性があります。必ず[注意事項](#注意事項)を確認してください。
:::

## 動作確認環境

この記事の内容は、以下の環境で検証しています。

- Google Pixel 6
- Android 13（ビルドTQ3A.230805.001）
- Threads v298.0.0.16.109

## 本題

Threadsがインストールされたスマートフォンで、以下のURLにアクセスすることで投稿画面を開けます。

```
barcelona://create
```

``text``パラメーターに共有したいテキストを設定すると、そのテキストが入力された状態で投稿画面を開けます。

```
barcelona://create?text=<共有したいテキスト>
```

## 注意事項

- このインテントはMetaの公式ドキュメントに記載されていないため、正しく動作しなかったり、将来的に動作しなくなったりする可能性があります
- PCや、Threadsアプリがインストールされていないスマートフォンでは動作しません
- カスタムURLスキームはアプリを一意に特定できないため、同じスキームを宣言している別のアプリが開く可能性もあります
"kintone全体のカスタマイズ"が読み込まれる画面一覧

# "kintone全体のカスタマイズ" とは？

`/k/admin/system/customize` で設定するJavaScript / CSSによるカスタマイズを指します。

# 調査日時

2023/8/26

# "kintone全体のカスタマイズ"が読み込まれる画面

* ポータル画面
    * /k/#/portal
* ピープル画面
    * /k/#/people/user/\*
* 通知画面
    * /k/#/ntf/\*
* 全体検索の結果
    * /k/search
* スペース画面
    * /k/space/\*/thread/\*
* アプリ画面
    * /k/[nnn]/
* 新規作成
    * /k/[nnn]/edit
* 詳細・編集
    * /k/[nnn]/show
* ファイルに書き出す
    * /k/[nnn]/exportRecord
* 出力されたファイル
    * /k/downloadList
* ファイルから読み込む
    * /k/[nnn]/importRecord
* 読み込まれたファイル
    * /k/importInfo
今日やったことメモ



*ベンチャー企業のインターンの参加* 
---
就活IT業界に関する考え方が変わった。
Railsで何かアプリを作る→ポートフォリオの充実
もっと色々やってみる気になった
アルバイト先のシフト作成アプリを作りたい
githubの使い方を学んだ→実際使ってアプリ作る

*M１Mac(OS:Venture13.5)Railsの環境開発*
---
正直発展なし
```
x21024xx@x21024xxnoAir ~ % rbenv install 3.2.2

To follow progress, use 'tail -f /var/folders/mq/x7rmlj0j7s5c3pq1tybgm6n00000gn/T/ruby-build.20230826002544.44088.log' or pass --verbose
Downloading openssl-3.1.1.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/b3aa61334233b852b63ddb048df181177c2c659eb9d4376008118f9c08d07674
Installing openssl-3.1.1...
Installed openssl-3.1.1 to /Users/x21024xx/.rbenv/versions/3.2.2

Downloading ruby-3.2.2.tar.gz...
-> https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.gz
Installing ruby-3.2.2...
ruby-build: using readline from homebrew
ruby-build: using libyaml from homebrew
ruby-build: using gmp from homebrew

BUILD FAILED (macOS 13.5 using ruby-build 20230717)

Inspect or clean up the working tree at /var/folders/mq/x7rmlj0j7s5c3pq1tybgm6n00000gn/T/ruby-build.20230826002544.44088.57BWto
Results logged to /var/folders/mq/x7rmlj0j7s5c3pq1tybgm6n00000gn/T/ruby-build.20230826002544.44088.log

Last 10 log lines:
checking for llvm-strip... no
checking for gcc... clang
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... configure: error: in `/var/folders/mq/x7rmlj0j7s5c3pq1tybgm6n00000gn/T/ruby-build.20230826002544.44088.57BWto/ruby-3.2.2':
configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details
make: *** No targets specified and no makefile found.  Stop.
x21024xx@x21024xxnoAir ~ % 
```
このエラーが解決できない、、、
***
HHKBでターミナルに*アスタリスクを入力できない

# サマリ
* Fn + [任意のキー] に * を割り当てていたが、入力されない
* この時にマップされているのは、テンキーの*であった
* ZSHはデフォルト設定ではテンキー入力を受け付けない
* 以下のテンキー有効化の設定を.zshrcに記載することで解決
``` .zshrc 
# Keypad
# 0 . Enter
bindkey -s "^[Op" "0"
bindkey -s "^[Ol" "."
bindkey -s "^[OM" "^M"
# 1 2 3
bindkey -s "^[Oq" "1"
bindkey -s "^[Or" "2"
bindkey -s "^[Os" "3"
# 4 5 6
bindkey -s "^[Ot" "4"
bindkey -s "^[Ou" "5"
bindkey -s "^[Ov" "6"
# 7 8 9
bindkey -s "^[Ow" "7"
bindkey -s "^[Ox" "8"
bindkey -s "^[Oy" "9"
# + -  * /
bindkey -s "^[Ok" "+"
bindkey -s "^[Om" "-"
bindkey -s "^[Oj" "*"
bindkey -s "^[Oo" "/"

````


# 問題
HHKBでFn+gを*(アスタリスク)に割り当てているが、ターミナルに入力すると以下の出力になる

` $ lsOj  `

直前に入力されたコマンド + Oj になっている。
この場合はlsを直前に入力していたから、 ls + Oj となっている。
SHIFT + 8だと*の入力は可能なので、Fnキーとの組み合わせに問題がありそう。

# 環境 
    * Windows 10
    * WSL
    * UBUNTU
    * zsh

# 解析
## 環境切り分け
* bashとzshで切り分け
  * zshでしか発生しない
    →zsh固有の問題のようだ。

## 実際に入力されているkeyを調べる
[結論]：テンキーの*が入力されている。

* キーコードの表示サイトを利用
    http://nas6.net/keyboard.htm
    入力 : Fn+g（* アスタリスクを入力）
    * keyIndexId:106
    * keyRealID:VK_MULTIPLY
    * keyAliasID:VK_No*

    入力 : SHIFT + 8 = *
    * keyIndexId:56
    * keyRealID:VK_8

    VK_MULTIPLYにはどうやらテンキーの*を表しているようだ。

## 再現確認
テンキーがあるキーボードで、テンキーの*を入力。
` $ lsOj  `
再現完了。zsh + テンキー入力に問題があることが分かった。
HHKB使っているとテンキーがないから気が付かなかった。
ここまで分かればググれば解決できそう。

## zsh + テンキー入力
記事があった。感謝。
https://superuser.com/questions/742171/zsh-z-shell-numpad-numlock-doesnt-work
設定ファイルに以下を入力で、テンキー有効化
``` .zshrc 
# Keypad
# 0 . Enter
bindkey -s "^[Op" "0"
bindkey -s "^[Ol" "."
bindkey -s "^[OM" "^M"
# 1 2 3
bindkey -s "^[Oq" "1"
bindkey -s "^[Or" "2"
bindkey -s "^[Os" "3"
# 4 5 6
bindkey -s "^[Ot" "4"
bindkey -s "^[Ou" "5"
bindkey -s "^[Ov" "6"
# 7 8 9
bindkey -s "^[Ow" "7"
bindkey -s "^[Ox" "8"
bindkey -s "^[Oy" "9"
# + -  * /
bindkey -s "^[Ok" "+"
bindkey -s "^[Om" "-"
bindkey -s "^[Oj" "*"
bindkey -s "^[Oo" "/"
````
## 効果確認
HHKBから入力してみる
`$ * `
解決！
C言語における#defineについて

# `#define`とは
- C言語におけるディレクティブの一つ
- コード内で定数やマクロを定義するためのプリプロセス命令

:::note info
C言語のプリプロセス命令（プリプロセッシング命令）とは
ソースコードをコンパイルする前に、コードの変換や置換を行うための命令のこと。
これらの命令はコンパイラがソースコードを実際の機械語に変換する前に実行される。
プリプロセス命令は通常、#記号から始まる特別な形式の行で表される。
- #include
- #define:
- #ifdef、#ifndef、#else、#endif
- #pragma
- #error
- #undef
などがある
:::

## `#define`を使用することで何ができるか
- 特定の値や式に名前を付けて、後でコード内でその名前を使用することができる
    - これにより、コードをより読みやすく、保守しやすくすることができる

# `#define`の基本的な使い方と例

``` c
#include <stdio.h>

// 定数の定義
#define PI 3.14159265359
#define MAX_VALUE 100

// マクロの定義
#define SQUARE(x) ((x) * (x))
#define SUM(x, y) ((x) + (y))

int main() {
    // 定数の使用
    double circle_area = PI * SQUARE(5);
    int sum_result = SUM(10, 20);

    printf("Circle Area: %f\n", circle_area);
    printf("Sum Result: %d\n", sum_result);

    return 0;
}
```
上記の例では、#defineを使って2つの定数と2つのマクロを定義している。

- `#define PI 3.14159265359`
    - PIという名前で円周率の値を定義している
- `#define MAX_VALUE 100`
    - MAX_VALUEという名前で最大値を定義している
- `#define SQUARE(x) ((x) * (x))`
    - SQUAREという名前で与えられた値の二乗を計算するマクロを定義している
- `#define SUM(x, y) ((x) + (y))` 
    - SUMという名前で与えられた2つの値の合計を計算するマクロを定義している

このように、後でコード内でこれらの定数やマクロを使用する際に、単にその名前を書くだけで、事前に定義した値や式を利用できるようにするために`#define`を使用する。
CloudFront関数をTerraformで管理しよう

# 経緯
https://tryt-group.hatenablog.com/entry/2022/12/09/120000

上記記事に有るように、末尾が「/」や「.」で終わるURIの時にリロードを行うと、空のフォルダをダウンロードしてしまう不具合があった。
それを解決する手段として擬似的に「inde.html」を付与する関数を作成。

従来はCloudFrontの関数に直接書き込んでいたが、それをTerraformで管理することになった。

# CloudFront関数をTerraformで管理しよう

CloudFrontの関数をTerraformを使用して管理する方法を紹介します。具体的には、URLの末尾が `/` もしくは `.` で終わる場合に、`index.html` を追加してダウンロードを制御する関数をテラフォームで設定する方法を解説します。

## CloudFront関数の設定

まず、CloudFrontで現在使用している関数を確認します。以下は、`hogehoge.js` という名前の関数の一例です。

```jsx
function handler(event) {
    var request = event.request;
    var uri = request.uri;

    if (uri.endsWith('/')) {
        request.uri += 'index.html';
    } else if (!uri.includes('.')) {
        request.uri += '/index.html';
    }

    return request;
}
```

この関数は、URLの最後が `/` で終わる場合やファイル拡張子が含まれない場合に、リクエストされたURIに `index.html` を追加します。

## Terraformでの設定

以下は、上記の関数をTerraformで管理する方法を示したコード例です。

```hcl
resource "aws_cloudfront_function" "example" {
  name    = "example"
  runtime = "cloudfront-js-1.0"
  comment = "example function"
  publish = true
  code    = file("hogehoge.js")
}

resource "aws_cloudfront_distribution" "example" {
  # ... 他の設定 ...

  # function_association is also supported by default_cache_behavior
  default_cache_behavior {
  # ... 他の設定 ...

    function_association {
      # specific event_type viewer-request or viewer-response
      event_type   = "viewer-request"
      function_arn = aws_cloudfront_function.example.arn
    }
  }
}
```

このコードは、CloudFront関数をTerraformで定義する例です。関数は `aws_cloudfront_function` リソースで定義されており、関数のコードはファイル `hogehoge.js` から読み込まれます。

## 参考文献

- [CloudFront FunctionsをTerraformで書いてみた - Qiita](https://qiita.com/yoshuuua/items/08f6df850ef36ac41d4d)
- [TerraformでCloudFront Functionsを環境ごとに有効化/無効化してみた | DevelopersIO](https://dev.classmethod.jp/articles/cloudfront-functions-per-env-terraform/#toc-6)
- [TerraformとCloudFrontでBasic認証をかける - Zenn](https://zenn.dev/kou_pg_0131/articles/tf-cloudfront-basicauth)
C言語における「&=」「|=」「~変数」について

プログラム言語は、言語ごとに使える演算子が異なることがある。
今回は、C言語のコードを読む中で、初めて見る演算子を見かけたので、備忘録。

# `&=`演算子:
- ビットごとの論理積（AND）演算を行い、結果を左辺の変数に代入する
- 具体的には、`a &= b` は `a = a & b` と同じ意味
- ビットごとの論理積演算は、対応するビットが両方のオペランドで共に1の場合に1を返し、それ以外の場合には0を返す
- この演算子は、特定のビットをクリア（0にする）するために使用する

# `|=`演算子:
- ビットごとの論理和（OR）演算を行い、結果を左辺の変数に代入する
- 具体的には、`a |= b` は `a = a | b` と同じ意味
- ビットごとの論理和演算は、対応するビットがどちらか一方または両方のオペランドで1の場合に1を返し、両方とも0の場合には0を返す
- この演算子は、特定のビットをセット（1にする）するために使用することができる

# `~`演算子:
- ビットごとの否定（NOT）演算を行う
- 具体的には、`~a` は `a の各ビットを反転させた結果`を返す
- つまり、1は0に、0は1に変わる
- この演算子はビットの反転やビットマスクの作成などで使用される

これらの演算子は、ビット単位の操作を行う場合に非常に便利です。
ビット演算は主にハードウェア制御やデータ圧縮、暗号化、ビットマスクの操作などで使用されます。
NeoVimにddc.vimを導入する

ddc.vimはShougoさん開発の自動補完プラグインです。
deopleteの後継プラグインで、さらに高速化、高機能化しています。

導入に際してあまり多くの情報が見当たらなかったので備忘録を兼ねてまとめておきます。

NeoVimを使用しているので設定はinit.vimに記述します。
なお一部NeoVim専用の機能や設定を使用していますので、Vimの方は削除する必要があります。

私の環境は以下の通りです

- Macbook Air M2 2022
- NVIM v0.9.1
- Warp Terminal（標準のTerminalでも動作します）

# 必要なソフトウェアの導入

ddcはdenoを必要とします。

```zsh
brew install deno
brew install neovim
```
# init.vimでの設定

## プラグインのインストール

- 私はインストーラにDeinを使用しています。
- 補完候補のポップアップにはネイティブUIを使用しています。(pum.vimは使用していません)
- 検索はファジー(揺らぎ)検索を可能にしています。

```vim
	call dein#add('vim-denops/denops.vim')

    call dein#add('prabirshrestha/vim-lsp')
	call dein#add('mattn/vim-lsp-settings')

	call dein#add('Shougo/ddc.vim')
	call dein#add('Shougo/ddc-ui-native')
	call dein#add('Shougo/ddc-around')
	call dein#add('matsui54/ddc-buffer')
	call dein#add('shun/ddc-source-vim-lsp')
	call dein#add('tani/ddc-fuzzy')
```

## LSPの設定

最初にLeaderキーをSpaceキーに設定しています。以下のキー設定はその前提です。

- 「Space l i」を順番に押すと、インストール可能なLSP一覧が出ます。インストールもここでできます
- 「Space l h」を順番に押すと、カーソル下の関数などの宣言を参照できます
- 「[ e」を順番に押すと、LSPが検出した前のエラーにジャンプします
- 「] e」を順番に押すと、LSPが検出した次のエラーにジャンプします
- 「Ctrl+]」を同時に押すと、カーソル下の関数の宣言箇所へジャンプできます

```vim
let mapleader = " "

"===================================
" LSP Settings
"===================================
nnoremap <Leader>li :LspManageServers<CR>
nnoremap <Leader>LI :LspInstallServer<CR>
nnoremap <Leader>ls :LspStatus<CR>
nnoremap <Leader>lh :LspHover<CR>
nnoremap ]d :LspNextDiagnostic<CR>
nnoremap [d :LspPreviousDiagnostic<CR>
nnoremap ]e :LspNextError<CR>
nnoremap [e :LspPreviousError<CR>
nnoremap <C-]> :LspDefinition<CR>
```

## ddc.vimの設定

基本的にVim標準の補完機能とあまり変わらないキー設定になっています。

- 「Ctrl+n」で次の候補を選択
- 「Ctrl-p」で前の候補を選択
- 「Tab」か「Enter」で候補を選択
- 基本的に「.」や「->」などクラスの要素にアクセスするタイミングで補完一覧が勝手に出ます
- 何らかの単語を2文字程度入力すると、周囲のコードやバッファ内のソースコードから似た単語を候補として挙げてくれます

```vim
"===================================
" Ddc Settings
"===================================
call ddc#custom#patch_global({
\	'ui': 'native',
\	'sources': [
\		'vim-lsp',
\		'around',
\		'buffer',
\	],
\	'sourceOptions': {
\		'_': {
\			'matchers'  : ['matcher_fuzzy'],
\			'sorters'   : ['sorter_fuzzy'],
\			'converters': ['converter_fuzzy'],
\			'ignoreCase': v:true,
\		},
\		'around': {
\			'mark': '[Arround]',
\		},
\		'buffer': {
\			'mark': '[Buffer]',
\		},
\		'vim-lsp': {
\			'mark': '[LSP]',
\			'forceCompletionPattern': '\.\w*|:\w*|->\w*',
\		},
\	},
\	'sourceParams': {
\		'around': { 'maxSize': 500 },
\		'buffer': {
\			'limitBytes': 5000000,
\			'forceCollect': v:true,
\			'fromAltBuf': v:true,
\		},
\	 },
\})
call ddc#enable()
```

他にもアドバイス等あればぜひ教えてください。
設定の参考になれば幸いです。