OmniAICreator/Qiita-1.07M huggingface dataset:
個人的に使ってよかったCSS編

個人的に便利と思ったCSSを記載していく。
あくまでも個人の記録用としての使用として追記していく予定です。


### 1. class$=

**説明**
cssのセレクタ指定方法にてセレクタ名の後方一致 

```css
[class$="__inner"]{
    padding: 0 10vw;
}
```

**コメント：**
他にも、前方一致や部分一致でも設定できる。

```jsx
div[id^="block__"] { /* セレクタ名の前方一致 */
   background-color: white;
}
```

```jsx
div[id*="text"] { /* セレクタ名の部分一致 */
  font-size: 15px;
}
```

### ２. 親(要素) >子(要素)

**説明**
特定の要素の直下の要素だけに一括で設定

```jsx
#container>* {
　　margin: 0 10px;
}
```

### ３. picture

**説明**
sourceタグの属性に条件を指定することで、「〇〇px以上のときはbnr_r.pngを表示する」のようにレスポンシブ対応が可能

```html
<picture>
    <source srcset="<?php echo get_template_directory_uri(); ?>/imgs/top/bnr_r.png"  
media="(max-width: 530px)" >
     <img src="<?php echo get_template_directory_uri(); ?>/imgs/top/bnr.png" 
alt="bnr" width="100%">
</picture>
```

## 参考
rex0220 計算式プラグイン ログインユーザーの所属組織と役職

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で、ログインユーザーの所属組織と役職を取得します。

# 概要

スペース項目に、ログインユーザーの所属組織と役職を表示します。

![2024-02-22_10h03_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/89ca703f-56f5-192e-1dfb-0c0034c4da7b.png)

# 計算式プラグイン設定
UINFO, OINFO, GINFO 関数を使用する場合は、プラグイン設定画面で「ユーザー情報」をチェック
計算式でスペース項目に文字列をセットすると、そのまま表示されます。

![2024-02-22_10h13_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/53a057ff-c5c7-d4c4-0dc5-bb1e7e7e213f.png)

```.js
// (sp1) SPACER
LET(
  loginCode, LOGIN_CODE(), // ログインコード
  orgId, UINFO(loginCode,"primaryOrganization"), // 組織id
  orgName, OINFO(orgId,"name"), // 組織名
  orgUsers, UINFO(OINFO(orgId,"users"),"code"), // 組織ユーザー
  titles, SPLIT(OINFO(orgId,"titles"),","), // 役職リスト
  userPos, INDEXOF(orgUsers,loginCode), // ユーザー位置
  userTitle, ARRAY_GET(titles,userPos), // ユーザー役職
  TRIM(orgName&" "&userTitle) // 組織＆役職
)
```

- LOGIN_CODE() 関数でログインユーザーのユーザーコードを取得
- UINFO 関数でログインユーザーの優先する組織ID（primaryOrganization）を取得
- OINFO 関数で組織IDから組織名（name）を取得
- 同じく OINFO 関数で組織内のユーザーコードリスト（users）を取得し、UINFO 関数でコードリストを取得
- OINFO 関数で組織内の役職リスト（titles）を取得し、カンマで分割して配列にする
- 配列内でログインユーザーの位置を INDEXOF 関数で探し、その位置に対応する役職を ARRAY_GET 関数で取得
- 組織名とユーザーの役職を結合して、最終的な文字列を作成

# UINFO 関数について
[UINFO 関数](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E6%83%85%E5%A0%B1)は、オプションによって指定したユーザー情報を取得できます。

```.js
UINFO(,"id,code,name") // ユーザーid, ユーザーコード, ユーザー名
->  ["2,user1,ユーザー1","3,user2,ユーザー2","4,user3,ユーザー3","5,user4,ユーザー4","7,user5,ユーザー5"]

UINFO("2","name") // ユーザー名
-> ["ユーザー1"]

UINFO("2","primaryOrganization") // 優先する組織ID
->  ["1"]
```

# OINFO 関数について
[OINFO 関数](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73#%E7%B5%84%E7%B9%94%E6%83%85%E5%A0%B1)は、オプションによって指定した組織情報を取得できます。

```.js
OINFO(,"id,code,name") // 組織id, 組織コード, 組織名
->  ["1,sales,営業部","2,dev,開発部","3,総務部,総務部","4,dev1,開発1課","5,dev2,開発２課","6,dev1-1,開発１課１係","7,dev1-2,開発１課２係","8,500,大阪支店","9,100,仙台支店"]

OINFO("1","name") // 組織名
-> ["営業部"]

OINFO("1","users") // 組織メンバー
->  ["営業太郎,yamada hanako,Alex2013,rex0220"]
```
.envファイルがあるのにprocess.envで参照できなかった件

# はじめに
どうもこんにちは！僕は現在1ヵ月本気の技術力向上を目指している現役高校生1年生です！
現在Reactでアプリ開発をしているのですが、jestを用いてテストを行おうとしたところエラーが出てうまくいかなかったのでまとめます。

# 問題
下記のようなエラーが出た
```terminal
supabaseUrl is required.
```
僕が開発しているアプリではsupabaseを利用しているのですが、そのsupabaseのクライアントの初期化するファイルでエラーが出ているようです。supabaseのurlやanon_keyに関しては.env.localで管理しています。
```js:supabase.js
import { createClient } from '@supabase/supabase-js'

export const supabase = createClient(
    //.env.localファイルで環境変数を定義しています。
    process.env.VITE_SUPABASE_URL,
    process.env.VITE_SUPABASE_URL
);
```

```:.env.local
VITE_SUPABASE_URL=[秘匿情報]
VITE_SUPABASE_ANON_KEY=...[秘匿情報]
```

# 仮説
エラー内容によると...
> supabaseのurlは必須やよ！絶対ないとあかんよ！

というように怒られてしまっているので、process.env.VITE...の部分で環境変数をうまく参照できていないことが考えられます。

# 解決策
結論
<font color="red">**.env.localを.envという名前に変更した**</font>

# 原因
以下はjestの設定ファイルです。(jest.config.mjsは割愛させていただきます)
```js:jest.setup.js
import "@testing-library/jest-dom";

// dotenvの設定
require("dotenv").config();
```
requireのところでdotenvのモジュールを呼び出し、環境変数をprocess.envで参照できるように設定しています。
しかし、dotenvはデフォルトでは

**設定が呼び出された作業ディレクトリ内の<font color="red">.env</font>を探す**
という仕様になっているようです。
<br/>

以下のように記述することもできますが、ファイル名で指定してしまうと今後めんどくさいことになってきてしまうので僕は上記の方法で解決しました。
```js:jest.setup.js
import "@testing-library/jest-dom";

// dotenvの設定
require("dotenv").config({path: ".env.local"});
```
<font color="grey">※このように記述すると.env.localを探してくれるようになるのですが、この後僕はgithub actionsで自動テストを実装しようとしているのでこの方法はやめました。実際に.env.localはpushしないので、
のちに**github actionsでこんなファイルはないよ**!!!!!と怒られてしまうので(汗</font>

# .envの種類
調べている中で気になった内容があったので共有します。特にReactなどとは関係なくプログラミング自体の仕様にこういったものがあるらしいです。

> .env→開発環境でも本番環境でも読み込まれる。
.env.local→開発環境でも本番環境でも読み込まれる。
.env.development→開発環境だけで読み込まれる。
.env.production→本番環境だけで読み込まれる。
>
>優先順位
>[こちら](https://note.com/writeryama/n/nd9ae2c18f15d)の記事から引用

# 参考
https://www.npmjs.com/package/dotenv?activeTab=readme#%EF%B8%8F-usage

https://note.com/writeryama/n/nd9ae2c18f15d

# 終わりに
最初の記事投稿から出会ったエラーの中で一番苦しんだので、解決することが出来て記事にできてよかったです。
この記事が他のどなたかを救ってくれるといいなと思います。

# About Me
- Twitter

https://twitter.com/shunii_hack
Datadog US -> JP に変えたときに引っかかった罠

一部JPの環境を使うことがあり、その時に引っかかったメモ

# AWS Integration
手動設定するときにハマったところ
どうやってもエラーになってしまい、
`Datadog is not authorized to perform action sts:AssumeRole
Regions: Every region`
と表示されていた

AWS マニュアルセットアップガイド
https://docs.datadoghq.com/ja/integrations/guide/aws-manual-setup/?tab=roledelegation

Datadog のための AWS IAM ロール
> 10.Account ID として、464622532012 を入力します。これは Datadog のアカウント ID で、Datadog に AWS のデータへのアクセスを許可するものです。

サポートに確認したらJPのAccount IDは `417141415827` でした。

# Datadog Forwarder

https://docs.datadoghq.com/ja/logs/guide/forwarder/?tab=terraform#%E3%82%B3%E3%83%B3%E3%83%95%E3%82%A3%E3%82%AE%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E4%BE%8B


datadog forwarderのlambdaを作成する際に「DbSite」の指定が必要です。
デフォルトがUSリージョンなってます。

```
resource "aws_cloudformation_stack" "datadog_forwarder" {
  name         = "datadog-forwarder"
  capabilities = ["CAPABILITY_IAM", "CAPABILITY_NAMED_IAM", "CAPABILITY_AUTO_EXPAND"]
  parameters   = {
    DdApiKeySecretArn  = "REPLACE ME WITH THE SECRETS ARN",
    DdSite             = "<code class="js-region-param region-param" data-region-param="dd_site"></code>",
    FunctionName       = "datadog-forwarder"
  }
  template_url = "https://datadog-cloudformation-template.s3.amazonaws.com/aws/forwarder/latest.yaml"
}
```

# AWS Logs
## Send logs API
ここはV1/V2共に動作する
ap1を付けるだけなので迷わないゾーン
https://docs.datadoghq.com/ja/api/latest/logs/

## Datadog Kinesis Firehose Destination を使用して AWS AWS Services Logs を送信する
これがめっちゃ罠でした
多分api v1ないです。USのURLをap1にするだけじゃダメでした。
AWS ConsoleからFirehose作成してみてdatadog ap1選択するとendpoint URLわかります。
```
https://aws-kinesis-http-intake.logs.ap1.datadoghq.com/api/v2/logs?dd-protocol=aws-kinesis-firehose
```
FortiClient 7.2.2でVPN接続時にGUIを隠さないようにする

FortiClientのバージョンを上げたらVPN接続するとConsoleが非表示になったのでその対処

# 手順
- FortiClientのGUIから設定をエクスポートする
    - 鍵マークをクリックする
    - 歯車マークをクリックする
    - バックアップをクリックする
    - 保存するファイル名を入力してOK
    - 任意のパスワードを入力する
    - OKをクリックする

- 上記で保存したxmlのVPN - VPN options の下記を変える
    - minimize_window_on_connect : 1 -> 0

- インポート
```
FCConfig -m all -f <filename> -o import -i 1 -p <encrypted password>
```

# メモ
FortiClientのインストーラの抽出の仕方

- FortiClient Online Installerを実行する
- `%TMP%`にイメージがダウンロードされ、その後抽出される。
    - exe or msiファイルを保存したい場所に複製する

# 参考(公式)
XML Configuration Guide
https://docs.fortinet.com/document/forticlient/7.2.2/xml-reference-guide/812076/xml-configuration-file

Backing up and restoring CLI utility commands and syntax
https://docs.fortinet.com/document/forticlient/7.2.2/xml-reference-guide/10217/backing-up-and-restoring-cli-utility-commands-and-syntax
MiniAPI(二十二)：HttpClient

説明：この記事ではHttpClientの使用方法ではなく、asp.net core mini apiフレームワークでのHttpClientの導入と使用方法について共有します。
ビジネス開発では、第三者のサービスを呼び出すことが避けられず、HttpClientが使用されます。早期のasp.net coreフレームワークでは、新しいHttpClientを通じて第三者へのリクエストを実現していましたが、現在ではHttPClientFactoryを通じて実現できます。これにより、接続をプールしてリソースを節約できます。
基本的な使用方法は非常に簡単です：
```csharp
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient();
var app = builder.Build();
app.MapGet("/test", async (IHttpClientFactory clientFactory) => {
    var client = clientFactory.CreateClient();
    var content = await client.GetStringAsync("https://www.google.com");
});
app.Run();
```
プロジェクトに複数の第三者サービスリクエストがある場合、各サービスを区別するために、命名方式を採用できます
```csharp
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient("Google", httpClient =>{
    httpClient.BaseAddress = new Uri("https://www.google.com/");
});
builder.Services.AddHttpClient("BaiDu", httpClient =>{
    httpClient.BaseAddress = new Uri("https://www.baidu.com/");
});
var app = builder.Build();
app.MapGet("/testgoogle", async (IHttpClientFactory clientFactory) => {
    var googleClient = clientFactory.CreateClient("Google");
    return await googleClient.GetStringAsync("search?q=桂素伟");
});
app.MapGet("/testbaidu", async (IHttpClientFactory clientFactory) => {
    var baiduClient = clientFactory.CreateClient("BaiDu");
    return await baiduClient.GetStringAsync("s?wd=桂素伟");
});
app.Run();
```
また、プロジェクト内の各サービスのリクエストをそれぞれに封印し、それぞれのHttpClientを使用することもできます：
```csharp
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpClient<IGoogleService, GoogleService>();
builder.Services.AddHttpClient<IBaiDuService, BaiDuService>(httpClient =>{
    httpClient.BaseAddress = new Uri("https://www.baidu.com/");
});
var app = builder.Build();
app.MapGet("/testgoogle", async (IGoogleService google) => {
    return await google.GetContentAsync();
});
app.MapGet("/testbaidu", async (IBaiDuService baidu) => {
    return await baidu.GetContentAsync();
});
app.Run();
interface IGoogleService{
    Task<string> GetContentAsync();
}
class GoogleService : IGoogleService{
    private readonly HttpClient _httpClient;
    public GoogleService(HttpClient httpClient)
    {
        _httpClient = httpClient;
        _httpClient.BaseAddress = new Uri("https://www.google.com/");
    }
    public async Task<string> GetContentAsync()
    {
        return await _httpClient.GetStringAsync("search?q=桂素伟");
    }
}
interface IBaiDuService{
    Task<string> GetContentAsync();
}
class BaiDuService : IBaiDuService{
    private readonly HttpClient _httpClient;
    public BaiDuService(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }
    public async Task<string> GetContentAsync()
    {
        return await _httpClient.GetStringAsync("s?wd=桂素伟");
    }
}
```
(Translated by GPT)

元のリンク：https://mp.weixin.qq.com/s?__biz=MzA3NDM1MzIyMQ==&mid=2247484977&idx=1&sn=4023f8c03b848e23d547dd3b51433036&chksm=9f00591ba877d00dc9061a553ce7d09396d59d3050ab900ec0ec690818667bd248eeeacb0906&token=541757603&lang=zh_CN#rd
Azure の VM インスペクター を試す！！

こんにちは、アーキテクトのやまぱんです。
補足コメントや質問、<font color="red">いいね、拡散</font>、是非お願いします🥺！
間違ってたら<font color="red">優しく</font>教えてください！

## 前書き
今回は Azure の VM インスペクター を試してみたいと思います。
サポートエンジニアが使うマイクロソフトの社内ツールが一般公開されて、Azure Portal からでも利用できるようになって、**VM インスペクター**として実装されたようです。
（あくまで推測ですが、サポートエンジニア時代に似たようなツールをよく使っていました)


## VM インスペクター とは
詳細は下記の公式ページをご覧ください。

https://learn.microsoft.com/ja-jp/troubleshoot/azure/virtual-machines/vm-inspector-azure-virtual-machines

上記より引用
> VM インスペクター ツールは、Windows または Linux 仮想マシン (VM) に影響を与える可能性があるオペレーティング システム (OS) に関連する問題のトラブルシューティングに役立ちます。 これは、特権アクセス権を持つ顧客、サポート エージェント、またはサード パーティの担当者が Azure VM の OS ディスク上でログと構成ファイルを直接収集できるようにするセルフヘルプ診断ツールとして設計されています。 VM Inspector は、承認されたユーザーが VM OS ディスクから既知のログ ファイルを取得してゲスト OS の問題を診断するための高速で安全な方法です。

なお、執筆時時点でプレビュー機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/560a03bb-d32d-eb50-adf2-fcea547498d6.png)

## 実行イメージ
下記は Windows OS で実行した場合です。イベントログが取得できているのが分かります。
Linux だともちろん Syslog なども利用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/156f696b-4ed4-aa60-8efd-5d11c3ad5dc9.png)

ストレージ アカウント側は下記のような命名でコンテナーと zip が作られていました。
> コンテナー名：vmguestdiagnostics-d09bac25-d0db-4675-8942-a147de20355a
> zipファイル名：DiskInspection_2024-1-4 1:54:01.zip
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/6ff55486-025d-1aab-8f80-be99d555c38a.png)


:::note
+ Azure VM は起動状態でないと実行できません
+ ストレージ アカウント が必要です
その他必要なロールなどは公式ドキュメントをご確認ください。
:::

## あとがき
これによって VM にログインはできないけど、Azure Portal の操作権限があるような管理者がログ情報を取得することができるようになりました。
トラブルシューティングするときや、SR 起票 の時に役立つと思われます。
Salesforce認定Platformアプリケーションビルダー受験レポート

# はじめに
こんにちは。
Salesforceの認定資格であるアプリケーションビルダーを受験したので、その勉強法などを書いていきたいと思います。
- 資格の概要
認定 Platform アプリケーションビルダーには、Salesforce Platform の宣言型カスタマイズ機能を使用してカスタムアプリケーションを設計、構築、実装するスキルと知識が必要となります。
以下の画像の通り、開発者としては入口の資格と思ってください。
もっと詳細を知りたい方はこちらをクリック。⇒[公式サイトの認定資格一覧](https://tandc.salesforce.com/credentials "")
- 試験の実施要項
 
| 項目| 内容 |
|:-|:-|
| 推奨される実務経験 | Lightning Platform でのアプリケーション構築の 6 か月～ 1 年の経験 |
| 設問数 | 60問 |
| 合格点 | 63%  |
| 試験の所要時間  | 105分 |
| 結果 | 即時通知 |
| 受験料  | $200  |
| 受験場所  | オンラインまたは最寄りの施設  |
| 制限  | 試験中に紙媒体やオンラインの資料を参照することはできません  |

- 試験の内容
次に示す主なセクションから出題されます。割合も公表されています。

| セクション | 割合 |
|:-|:-:|
| SALESFORCE の基本  | 23% |
| データモデリングおよび管理  | 22% |
| ビジネスロジックとプロセスの自動化  | 28% |
| ユーザインターフェース  | 17% |
| アプリケーションのリリース  | 10% |

# 勉強の方法
- トレイルヘッド
試験対策のモジュールなど多数あります。全部実施したかったところですが、時間があまりとれなかったため練習問題だけ少し実施しました。
- 勉強会
会社の勉強会で以下の書籍を利用して学習しました。英語も抵抗がなければお勧めです。
問題集ばかりではなかなか身につかないので、実際に触ってみるのが大切だと感じました。
「Salesforce Platform App Builder Certification Guide」
- 問題集
インターネットで検索すると問題集がヒットします。
問題慣れするためには最適だと思います。ただ、回答が明らかに間違えているなどありましたので、実際に自分で確認して裏どりするようにしましょう。
また、本格的な勉強に入る前にどんな問題がでるのかを見ておくのも効果があると思います。

# 受験結果
上記の「勉強の方法」で試験には合格することができました。
データモデリングおよび管理のセクションがイマイチでしたが、その他はそれなりに取れました。
全体では、81～82%の正答率でした。

| セクション | 割合 | 問題数(計算上) | 正答率 | 正解数(計算上) |
|:-|:-:|:-:|:-:|:-:|
| SALESFORCE の基本  | 23% | 14問 | 92% | 13問 |
| データモデリングおよび管理  | 22% | 13問 | 61% | 8問 |
| ビジネスロジックとプロセスの自動化  | 28% | 17問 | 76% | 13問 |
| ユーザインターフェース  | 17% | 10問 | 100% | 10問 |
| アプリケーションのリリース  | 10% | 6問 | 83% | 5問 |

# 振り返りと改善点
認定アドミニストレータを受けた時は問題集よりの勉強をしていましたが、今回はなるべくSalesforceを触って確かめるように心がけました。そのためか自身を持って回答できたものが多かったかなと思いました。
弱点セクションの分析が少し甘く、そこだけ合格ラインを下回ったのが悔やまれます。

# 次のステップ
今回受験した資格は、宣言型カスタマイズ機能を使う知識がメインでしたが、次はApexを使ったプログラミングを学ぶため、認定Platformデベロッパー合格を目指したいと思います。
UnrealEngine5.3でCesium for Unreal 2.3.0プラグインをプロジェクト内に配置するとエラーになった

自分たちのプロジェクトをUnrealEngine5.3にアップグレードした際にCesium for Unrealプラグインをプロジェクト内のPluginsフォルダに配置しようとするとエラーなってできないという問題が発生しました。
ここでは、問題の内容とその対応方法についてメモしておきます。

# 自分の環境

UnrealEngine5.3.2
[Cesium for Unreal](https://www.unrealengine.com/marketplace/ja/product/cesium-for-unreal) 2.3.0

# 発生した問題

Cesium for UnrealプラグインをプロジェクトのPluginsフォルダに配置すると以下のようなエラーが大量に出てプロジェクトがビルドできませんでした。

```text
UE_5.3\Engine\Source\Runtime\UMG\Public\FieldNotification\FieldNotificationDeclaration.h(15): warning C4996: 'FieldNotificationDeclarationHeaderDeprecatedWarning': Including FieldNotification/FieldNotificationDeclaration.h is deprecated. The location of has changed. Please include FieldNotificationDeclaration.h instead and add the module FieldNotification to your .build.cs Please update your code to the new API before upgrading to the next release, otherwise your project will no longer compile.
UE_5.3\Engine\Source\Runtime\UMG\Public\Components\Widget.h(222): error C4042: 'unnamed-parameter': has bad storage class
UE_5.3\Engine\Source\Runtime\UMG\Public\Components\Widget.h(223): error C3646: 'UE_FIELD_NOTIFICATION_DECLARE_FIELD': unknown override specifier
UE_5.3\Engine\Source\Runtime\UMG\Public\Components\Widget.h(223): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
```

Cesium for UnrealプラグインをEngineに配置するとエラーは発生せずにビルドできました。

# 対応した方法

先に結果から書くとCesium for Unreal中のCeciumRuntime.Build.csに以下のようにDefaultBuildSettingsを追加すると問題なくビルドできました。

```csharp:CeciumRuntime.Build.cs
public class CesiumRuntime : ModuleRules
{
    public CesiumRuntime(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
        ShadowVariableWarningLevel = WarningLevel.Off;

        DefaultBuildSettings = BuildSettingsVersion.V4; // <= 追加
```

# 原因の調査

原因はよくわかってないですが、自分のプロジェクトのビルド設定が古いので、includeのパスの関係で新しいビルド設定が必要なCesium for Unrealプラグインでエラーになっていたようです。
以下では調査した内容を記載しておきます。

[Ceciumのサンプルプロジェクト](https://github.com/CesiumGS/cesium-unreal-samples/releases/tag/v2.3.0)で同じようにプラグインをプロジェクト内に配置してもエラーは発生しませんでした。

サンプルプロジェクトでEditorからC++コードを追加し、生成されたTarget.csを確認したところ以下のようなコードが含まれており、このコードをコメントアウトすると同じようなエラーになりました。

```csharp
DefaultBuildSettings = BuildSettingsVersion.V4;
```

自分のプロジェクトを確認したところ、DefaultBuildSettingsの設定はTarget.csに記述されていませんでした。

DefaultBuildSettingsについて[公式サイトのドキュメント](https://docs.unrealengine.com/5.3/ja/unreal-engine-build-tool-target-reference/)では以下のように記述されているがよくわかりません。
> DefaultBuildSettings (BuildSettingsVersion)
> 後方互換性があるデフォルト ビルド設定を維持するエンジン バージョン > >> ?(DefaultSettingsVersion.Release_4_23、DefaultSettingsVersion.Release_4_24 など) を指定します。現>在のエンジン バージョンのデフォルト設定が常に使用されるように DefaultSettingsVersion.Latest を指定します。ただし、アップグレード時にビルド エラーが生じるリスクを伴います。

ただ、以下のような話をみるとどうもincludeのパスの挙動に関係しているようです。
https://github.com/getnamo/BLUI-Unreal/issues/52


以下のフォーラムの質問でも同じようなエラーについて書いてありました。
https://forums.unrealengine.com/t/is-including-widgetcomponent-h-no-longer-possible-in-5-3/1388339

こちらも内容や対応方法はよくわかっていないですが、どうもincludeのパスの関係でそうなっているようです。
Cursorエディタ　日本語化

## Cursorエディタとは
VScodeを元にOpenAIが開発したエディタです。
チャットGPTがエディタ内でコードを書いてくれたりアドバイスをくれます。

プロジェクトのファイル全体を把握してコードを書いてくれるので
ブラウザを立ち上げてチャットGPTを使うより精度が高いです。

## インストール
https://cursor.sh/

## 日本語化
メインメニュー「View」→「Command Palette」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3686263/a19e0a9d-e33a-d157-bf0a-3bd5906baec2.png)

「Configue Display Language」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3686263/71b6eef5-e610-ff64-ecce-37f73aaa3e56.png)


「日本語」
（ここでEngleshしか出てこなかったら一回Engleshを選択すると次からリストが出てきます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3686263/9e1a18dd-9272-7050-2ef6-2206da7f6d32.png)

リスタート後日本語化されます。

## AI補完
「ctrl + K」で入力フォームが出てくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3686263/2671e232-380a-6ec5-5371-3320e01e54d2.png)

やりたいことを書く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3686263/eb99c97e-2c65-daa0-5193-714dba80b7e3.png)

補完してくれるので内容が合っていれば「ctrl + Enter」で確定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3686263/7efcbb08-6cc8-747a-9273-55c7e3cadfbb.png)


## まとめ
時代ですね。
慣れると開発速度が上がるので頑張って触っていこうかと思います。
また便利な機能を覚えたら追記していきます。

ご覧になって頂いてありがとうございました。
Obsidiainの壁紙を、自分の好きな画像にしたい！

# Obsidanに背景画像を足したい。
皆さんがはメモを取るのにどんなツールを利用していますか？
これまで私は、メモ、リマインダー、カレンダーをそれぞれMacの純正を使ってきました。

しかし、これらを1つのツールにまとめられるということでObsidianを活用しました。

プログラムも書けるし、markdownも使えるし便利です！
使い方の説明は他の方の記事とか見てください

# この記事で出来るようになること
１、Obsidianの編集ページと閲覧ページ、さらに全体に背景画像を設置できる！
これで、無機質な壁紙とはおさらば！

# できないこと
現状、PCでしか壁紙の設置はできません。
既存のプラグイン（https://github.com/samuelsong70/obsidian-dynamic-background）
を活用すれば、PC,モバイル両方に壁紙を設置できます。(私が作成したプラグインではありません）
しかし今回は、CSSを使って自分で壁紙を設置します。
このほうが細かい設定もできるし、プライベートな画像を壁紙にするのにプラグインを使うのは気が引ける人におすすめです。

# 手順
１、適当なフォルダに、壁紙に使用したい写真を入れます。
２、python -m http.server 1010　をターミナルで実行
３、http://[::]:1010/　　にアクセス
4、ローカルサーバーが立ち上がり、![スクリーンショット 2024-02-22 8.56.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631067/07759cf6-7974-0dd3-65f0-f6868e306cea.png)
このように、フォルダ内にアクセスできるようになる。
５、自分が先ほど作成したフォルダにいくと画像がいる。![スクリーンショット 2024-02-22 8.57.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631067/fb4f70f5-2864-c831-957c-e5530d3e288d.png)
6、画像をクリックするとwebページ上に画像が表示される。
7、この画像のURLをコピー（後でCSSで使用）
今回であればこれ　http://[::]:1010/obsidian%20%E5%A3%81%E7%B4%99/IMG_2393.JPG

8、CSSファイルを作成する。

```CSS

.view-content {
    margin: 0;
    background-image: url('http://localhost:1010/%E5%86%99%E7%9C%9F/37BF9858-F5EE-46BC-A69D-34DF64522457_1_102_o.jpeg');
    background-repeat: repeat; /* 画像をタイル状に繰り返し表示 */
    background-size: 240px 426px; /* タイルのサイズを指定 */
    filter: saturate(0.7); /* 彩度を下げる */
    filter: brightness(0.8); /* 明度を下げる */
  }
  
  body {
    margin: 0;
    width: 100vw;
    height: 100vh;
    background-image: url("http://localhost:1010/%E5%86%99%E7%9C%9F/37BF9858-F5EE-46BC-A69D-34DF64522457_1_102_o.jpeg");
    background-repeat: repeat; /* 画像をタイル状に繰り返し表示 */
    background-size: 240px 426px; /* タイルのサイズを指定 */
    filter: saturate(0.7); /* 彩度を下げる */
    filter: brightness(0.8 ); /* 明度を下げる */
  }
  
```

9、作成したCSSは以下の場所に設置する。
    9.1 Obsidianを開く
    9.2 左したの歯車マークをタップ
    9.3 外観をタップ
    9.4 外観の一番したのCSSスニペットの横のファイルマークをタップ
    9.5 ここにファイル名.css で保存
    9.6 ファイルマークの横にある再読み込みボタンを押せばCSSが選択可能
    9.7 ![スクリーンショット 2024-02-22 9.05.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631067/ad94058d-c61b-1594-2664-3c98ca142369.png)
    9.8 選択肢が青くなればOK




# Before　After

Before
![スクリーンショット 2024-02-22 9.08.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631067/40c2a462-5c0f-db06-f76b-209d957359a0.png)

After
![スクリーンショット 2024-02-22 9.09.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3631067/e53ae5e9-6c60-2003-c1f0-af4f8014cd97.png)


今回は　.view-content と　bodyの両方に同じ画像を使用しましたが、これを変えるとノートの部分の壁紙と、フォルダなどの壁紙は変更できます。
また、今回はタイル状に配置しました。このタイル状も写真のサイズに合わせればより綺麗になります。
もちろんタイル状にせず、1枚の写真で壁紙にすることも可能です。

# 注意点

CSSに、壁紙にしたい写真のpathを貼り付けても反映されません。
必ず今回のように個人で構わないのでローカルサーバーを立ち上げてください。

また、選んだ壁紙によって、テキストのサイズやフォントを変更してください。
読めなくなります。

今回は画像を壁紙にしましたが、gif画像を自分で作成すれば、１０秒ごとに壁紙を変えることも可能です。色々試してください。



# まとめ
今回は、Obsidianでお気にいるの写真を壁紙にする方法を紹介しました。
この方法なら編集画面にも壁紙が設置できるので、試してみてください。

今後時間に余裕があれば、これをプラグインにして、モバイルでも壁紙が設置できるようにしたいです。
fly.io on WSL2 で"$ fly auth signup/login"ができない

# 概要

[公式ドキュメント通り](https://fly.io/docs/hands-on/)に進めると、サインアップとサインインの時に標準出力に何も表示されない。

```
$ fly auth signup
(なにもでない)
```

```
$ ln -s /usr/bin/wslview /usr/local/bin/xdg-open
$ fly auth login
(なにもでない)
```

Ctrl+Cすると認証用URLが表示されるのでそこにアクセスすればブラウザ上でログイン扱いにはなるが、CLI側にリダイレクトできていないようで進めなくなる。

調べても見当たらなかったので共有。

# 対応

WSLユーティリティであるwsluが、Ubuntu 22.04 LTS以降はインストールされていないために起きる。
WSL2(Ubuntu)なら以下参照。

https://wslutiliti.es/wslu/install.html#ubuntu

コマンドとしては以下。

```
$ sudo add-apt-repository ppa:wslutilities/wslu
$ sudo apt update
$ sudo apt install wslu
```

これで解決。
【備忘】CircleCIとは？

## CircleCIとは
一言でいえば、Saas型のCI/CDサービス
CircleCIは、ソフトウェア開発プロセスを効率化し、自動化するためのツールとなり、特にCI/CD（Continuous Integration / Continuous Deployment）のプロセスを容易にするもの。

## 前提知識
### CI/CDとは
**CI（Continuous Integration）＝継続的インティグレーション**
・CIとはテストや静的コード解析などの作業を自動化し、継続的に実行する手法。
・開発者はソースコードをマージするだけで良く、ソフトウェア品質の維持・向上および開発作業の効率化が図れるのがメリット

**CD（Continuous Delivery）＝継続的デリバリー**
・CDとは各環境へのデプロイ作業を自動化し、継続的に実行する手法。
※CDはCIを拡張した手法ともいわれている。
（テージング環境や本番環境へのデプロイは、CIで自動化した作業の次に引き続き行われるようになっているため）

### CI/CDツールでできること
**テストの自動化**
単体テスト（ユニットテスト）・静的コード解析・文法チェック・E2E（End to End）テストなど、コードに行う作業を自動化することが可能

**ビルドの自動化**
ビルド（build）=プログラムの元ネタ（ソースコード）をあれやこれやして実際のプログラムを作る作業
動的テストやデプロイを自動化するために、対象のソースコードからビルドを行う必要があり、その作業を自動化可能。

**デプロイの自動化**
デプロイ（deploy）=作ったプログラムをしかるべき場所に置いたり、あれやこれやの設定をしたりして、使える状態にすること。
このデプロイを自動化することが可能。

## CircleCIでできること
CircleCIでできること（主な機能）は以下
**1.ワークフロー管理**：複数のジョブやステップを組み合わせて、複雑なビルドやデプロイメントプロセスを管理可能。

**2.環境の設定**：異なる環境でのテストやデプロイメントをサポートし、開発プロセスをスムーズにする。

**3.通知とアラート**：ビルドやデプロイの状況をリアルタイムで把握し、必要に応じて通知を受け取ることが可能。

## CircleCIの機能
**利便性の高いダッシュボード**
・CircleCIのダッシュボードは視覚的に見やすく、機能的に様々な情報にアクセスしやすく構成されている。
・Jobsからプロジェクトの一覧や最新のジョブの実行結果などが確認できるようになっている。
・一覧や結果詳細のリンクからGitホスティングサービスの対象のコミットやコミッターが参照可能。
・またInsightsからビルドステータスやパフォーマンスのグラフが表示可能。

**Workflowによるジョブの制御**
・Workflowは複数のジョブを組み合わせて、順次実行・並列実行するための機能。
・Workflowを使用すると時間のかかる処理を分割し、平行実行することで処理時間の短縮が見込める。
・またcronによるWorkflowの定期実行など、自動化の契機となるアクションの指定を行うことも可能。

**ローカルCLIツール**
・CircleCI CLIをインストールすると、ローカルの開発環境でCircleCI設定ファイルのバリデーションやジョブの実行などを行うことが可能。
・またビルド済みのCircleCI Dockerイメージを使用することも可能。

## 他社CI/CDツールとの比較
**柔軟性とカスタマイズ性**
CircleCIは、様々なプログラミング言語やフレームワークに対応しており、柔軟性が高い。
また、ユーザーは自由にカスタムジョブやワークフローを設定可能。

**シンプルな構成**
CircleCIは直感的なインターフェースを提供し、設定が比較的容易。
初心者でもすぐに利用を開始できるため、使いやすさがある。

**高速なビルドとテスト**
CircleCIは、並列処理やキャッシュ機能を利用してビルドとテストを効率化できる。
これにより、開発者は短い時間でフィードバックを受け取ることが可能。

**スケーラビリティ**
CircleCIは、小規模な個人プロジェクトから大規模なエンタープライズプロジェクトまで、幅広い規模に対応。
また、クラウド上で動作するため、インフラストラクチャの管理が不要。

**エコシステムの拡張性**
CircleCIは、多くのサードパーティツールやサービスとの統合が可能。
これにより、開発者は自分のワークフローに最適なツールを組み合わせることが可能。

総合的に言えば、CircleCIは使いやすさと柔軟性を両立させたCI/CDツールであり、開発チームが迅速かつ効率的にソフトウェアを開発、テスト、デプロイするための理想的な選択肢となる。

## CircleCIのデメリット
**コスト**
・CircleCIは、プランに応じた料金体系を採用しています。特に大規模なプロジェクトや頻繁にビルドする場合、高い料金が発生する可能性あり。

**複雑な設定**
・CircleCIの設定やカスタマイズは、初心者にとっては少し学習コストがかかることがある。
特に、複雑なワークフローや環境のセットアップに関しては、理解に時間がかかる場合あり。

**制限されたリソース**
・CircleCIの無料プランでは、同時実行ジョブの数やビルド時間などに制限あり。
これにより、大規模なプロジェクトや急速な成長を遂げるプロジェクトには制約が生じる可能あり。

**オンプレミスの制限**
オンプレミス環境でCircleCIを使用する場合、クラウドサービスと比較して柔軟性や機能に制限が生じる可能性あり。

## 補足
他社製品比較として、以下サイトが分かりやすかった
https://circleci.com/ja/blog/ci-tool/

## まとめ
CircleCIは、開発者が迅速かつ効率的にソフトウェアをビルド、テスト、デプロイするための重要なツール。
自動化されたプロセスと柔軟なカスタマイズオプションにより、開発チームはより信頼性の高いソフトウェアを迅速にリリース可能。

[CircleCI](https://circleci.com/ja/)
Lightning Editor for Email Composers in Email-to-Case



# 不具合

+ [Lightning Editor for Email Composers in Email-to-Caseでの不具合](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Px1j8)

:::note
 We just filed a bug internally as well as with the vendor who supplies the base component for the editor. In short, there's inconsistent newline behavior depending on how the underlying HTML is formatted. We found that adding spaces or newlines between tags prevented the issue. So you can try separating HTML elements in your email templates, and that may help. I realize this would be extremely tedious.

 私たちは社内だけでなく、エディターの基本コンポーネントを提供するベンダーにもバグを報告しました。つまり、基になる HTML のフォーマットに応じて、一貫性のない改行動作が発生します。タグの間にスペースまたは改行を追加すると、この問題が回避されることがわかりました。そのため、電子メール テンプレートで HTML 要素を分離してみると、役立つ場合があります。これは非常に面倒な作業になることは承知しています。
:::

+ [Image Library No Longer Available After Enabling Lightning Editor for Email Composers](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XIQdo)

:::note
 This is a bug with the new editor. We're trying to get it fixed for the Summer release. Apologies for the inconvenience.
:::

# Lightning Editor for Email Composers

+ [メールを作成するときに、最初の行 (挨拶行) の末尾でリターン キーを押すと、追加の行が追加されることがわかりました。追加された追加のスペース (行) を削除すると、カーソルが最初の行の末尾に戻ります。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cmD21)

:::note
メール署名の HTML コードに問題があるようです。

https://issues.salesforce.com/issue/a028c00000zJTBSAA4/in-the-new-lightning-email-composer-spaces-are-created-between-table-rows-in-custom-html-template
:::

+ [nter キーを押すと予期しない動作が発生するという報告がユーザーから寄せられています。](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54V00007Px1j8)

:::note
2024/07/17

改行の動作の問題は、今週公開されるパッチで修正されるはずです。月曜日にもう一度確認して、解決されていない場合はお知らせください。
:::

# 変なテーブルが表示される

+ [Transition to Lightning Editor for Email Composer in Email-to-Case](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000SWdGd)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a181ce77-67fe-4e4f-924b-b7ad5781d93d.png)
【Rails】MySQLのパスワードの確認方法

### configディレクトリ内にあるdatabase.ymlファイルにあるpasswordの欄をチェック。
```
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: 
  host: db
```
「現代数理統計学の基礎」演習問題解法メモ　第6章問4～8

問4は2017年統計検定1級数理統計の問2とほぼ同じです。
問4(3)は、参考にするものによって表現の仕方が少しずつ違っています。
![第6章問4 P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/d2aa8dbf-1afd-0fcb-04b1-567c45d80a3e.jpeg)
![第6章問4 P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/029d8afe-86dd-f689-bd24-e744563f14da.jpeg)
![第6章問4 P3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/ab67c6b2-3ca1-2ebd-c07c-181573b66347.jpeg)
![第6章問4 P4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/249dead6-6c8d-05d3-4ce0-b385b20319ab.jpeg)
![第6章問4 P5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/cd605beb-dbcc-fa30-b2a3-719800af9269.jpeg)
![第6章問5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/7c6bccca-6bc2-b6e0-3691-a11e39519c94.jpeg)
![第6章問6 P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/fa53c8c7-2cb9-9bd6-254a-534b9f41712f.jpeg)
![第6章問6 P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/c32d0bc0-fce5-221f-2a9f-746348c95b78.jpeg)
![第6章問7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/1535404d-e780-0497-f2f4-517ddd0ed5a0.jpeg)
![第6章問8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/9d2d9279-f367-3b60-e0aa-aac8b897cc66.jpeg)
高速画像生成 SDXL-Lightning

# 1秒画像生成

テキストから画像を生成するAI、Stable Diffusion は画像を生成するのにけっこう時間がかかってまあそれで使うにはちょっと気が重かったりするが、
**こちらは速くて高品質**。
A100GPUで試すと**1秒台で生成。**
（漸進的敵対的拡散蒸留法というのを使っているらしい。）

```
person disassembling a computer
```
![e612329b-5398-47fc-9ad0-b3b9e6d306b2 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/17dd556d-de2d-d600-e9b0-d0e4994065dd.png)

https://huggingface.co/ByteDance/SDXL-Lightning

テキストを入力するだけでデモを試せる。
が、デモはGPU割り当てに時間がかかるので、せっかくならコードで爆速を実感してほしい。

https://huggingface.co/spaces/AP123/SDXL-Lightning

# 使い方

以下のコードをColabで実行できる。

```bash
pip install diffusers
```

### インストール

```python
import torch
from diffusers import StableDiffusionXLPipeline, UNet2DConditionModel, EulerDiscreteScheduler
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file

base = "stabilityai/stable-diffusion-xl-base-1.0"
repo = "ByteDance/SDXL-Lightning"
ckpt = "sdxl_lightning_4step_unet.safetensors" # Use the correct ckpt for your step setting!

# Load model.
unet = UNet2DConditionModel.from_config(base, subfolder="unet").to("cuda", torch.float16)
unet.load_state_dict(load_file(hf_hub_download(repo, ckpt), device="cuda"))
pipe = StableDiffusionXLPipeline.from_pretrained(base, unet=unet, torch_dtype=torch.float16, variant="fp16").to("cuda")

# Ensure sampler uses "trailing" timesteps.
pipe.scheduler = EulerDiscreteScheduler.from_config(pipe.scheduler.config, timestep_spacing="trailing")
```

### Run

```python
pipe("person disassembling a computer",negative_prompt="anime, illustration", num_inference_steps=4, guidance_scale=0).images[0].save("output.png")
```

# 例

```
RPG characters
```

![396ca61f-0e3c-4ffe-b56e-9bcc75fd960e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/0ffd87ec-bb47-675e-b64b-d6e679ad6842.png)

```
a person drinking coffe
```

![output (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/ac54ca72-aac7-070a-8072-d3e500e3fd42.png)

すぐ画像が見れるので楽しい。

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[X](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
Excel-DNA で、log4net を利用する際のエラーを解決

### 課題
`Excel-DNA` で、`log4net` を利用する際、次のようにconfigファイルを指定するとします。

```csharp
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]
```
すると、次のエラーが発生するかもしれません。

```
log4net:ERROR Exception calling [log4net.Config.XmlConfiguratorAttribute] .Configure method.
```

おそらく、configファイルをLoadできないか処理できないようです。

:::note warn
2024-3-31追記
次の解決方法では、デバッグ時には有効でしたが、Excel-DNAで、hogehoge-AddIn-packed.xllのシングルファイルにビルドした時は、機能しませんでした。
configファイルを利用するのではなく、C#のコードでlog4netの設定を行う方法で解決しました。
[Excel-DNA で、log4net を利用する（C#で設定）](https://qiita.com/hiro_t/items/94e4b18b7a6014b637a8)
:::

### 解決方法

代わりに、コードでconfigファイルを指定するとうまくできました。
```csharp
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));
```

### 留意事項
[Using Log4Net in an Excel-DNA add-in](https://github.com/Excel-DNA/Samples/tree/master/UsingLog4Net)では、configファイルを、アドインのファイル名と一致させる（The name must exactly match the name of the add-in）とあります。しかし、この方法は、機能しませんでした。
<del>また、そうする必要もありません。別名のファイルで機能します（ここでは、`log4net.config`） </del>

### 参考
[.NET Core 3.1でLog4netを使う](https://qiita.com/n-noguchi/items/5181fc9dc7929ddb7d13)

### 環境
- ExcelDna.AddIn 1.7
- log4net 2.0.15
GitHubとGitとSSHと

# 趣旨
GitHubの初期設定のやり方を毎度忘れて毎度検索してるのでそれに終止符を打ちます。

間違えてる部分があったらご指摘をお願いします。

# GitHubとGitとSSH接続の設定

GitHubでプロジェクトを始める際の手順と、それに伴うGitおよびSSH接続の設定について解説します。プロジェクトを新しく始める場合と、既にローカルでコードを書き始めている場合の2つのシナリオに分けて説明します。

## まっさらな状態から始める場合

### GitHubでリポジトリを作成する

1. **GitHubにログイン**します。
2. 右上の**「New repository」**ボタンをクリックします。
3. リポジトリ名を入力し、**「Initialize this repository with a README」** のチェックボックスをオフにしてリポジトリを作成します。これにより、空のリポジトリが作成されます。

### ローカルにリポジトリをPullする

1. **Git Bash**や**ターミナル**を開きます。
2. `git clone [リポジトリのURL]`
    - このコマンドは、GitHub上に作成したリポジトリをローカルマシンにコピーします。
    - `[リポジトリのURL]`は、GitHubリポジトリページの「Clone or download」ボタンから取得できます。

## 既にコードを書き始めている場合

### GitHubでリポジトリを作成する

- 先ほどと同じ手順でGitHub上に新しいリポジトリを作成しますが、READMEの初期化は行いません。

### SSH接続設定をする

1. **SSHキーを生成する**
    - `ssh-keygen -t rsa -b 4096 -C "your_email@example.com"`
    - このコマンドは、SSHプロトコルで安全に通信するためのキーペアを生成します。`"your_email@example.com"`はGitHubアカウントに関連付けられたメールアドレスに置き換えてください。
2. **生成した公開キーをGitHubに登録する**
    - `cat ~/.ssh/id_rsa.pub | clip`
    - このコマンドは、公開キーの内容をクリップボードにコピーします。その後、GitHubのユーザー設定ページからSSHキーを新規に追加し、クリップボードの内容を貼り付けます。

### ローカルからGitHubにPushする

1. **Gitリポジトリの初期化**
    - `git init`
    - このコマンドは、現在のディレクトリをGitリポジトリとして初期化します。
2. **ファイルのステージング**
    - `git add .`
    - このコマンドは、変更されたすべてのファイルをGitのステージングエリアに追加します。
3. **コミットの作成**
    - `git commit -m "初回コミットのメッセージ"`
    - このコマンドは、ステージングエリアに追加された変更をコミットします。コミットメッセージは、行った変更の説明を簡潔に記載します。
4. **GitHubリポジトリとのリンク**
    - `git remote add origin [リポジトリのSSH URL]`
    - このコマンドは、ローカルのリポジトリとGitHub上のリポジトリを関連付けます。`[リポジトリのSSH URL]`は、リポジトリページの「Clone or download」ボタンからSSH形式で取得できます。
5. **GitHubへのプッシュ**
    - `git push -u origin master`
    - このコマンドは、ローカルの変更をGitHub上のリポジトリにプッシュします。初回プッシュ時には、ブランチ（ここでは`master`）を明示的に指定する必要があります。

以上の手順で、GitHubを使ったプロジェクトの管理を行う準備が整います。何か疑問点があれば、GitHubやGitの公式ドキュメントを参照すると良いでしょう。


# ssh-keygen
ssh-keygen コマンドは、SSHプロトコルで使用する公開鍵認証のためのキーペア（公開キーと秘密キー）を生成するために使用されます。

ssh-keygen: SSHキーペアを生成するコマンドです。

-t rsa: キーのタイプを指定します。ここではrsaを使用していますが、他にdsa、ecdsa、ed25519などがあります。rsaは広く使用されている安全なアルゴリズムです。

-b 4096: キーのビット長を指定します。4096ビットは現在推奨される長さで、より高いセキュリティを提供します。デフォルトは2048ビットですが、より強固なセキュリティを求める場合は4096ビットを選択します。

-C "your_email@example.com": キーに関連付けるコメントです。ここではメールアドレスを使用していますが、任意の文字列を使用できます。このコメントはキーを識別するのに役立ち、特に複数のキーを管理する場合に有用です。

ssh-keygen コマンドを実行すると、キーペアの生成プロセスを開始され、~/.ssh/id_rsa（秘密キー）と~/.ssh/id_rsa.pub（公開キー）というファイルに保存されます。プロセス中にパスフレーズの設定を求められることがあります。パスフレーズはオプションですが、秘密キーの追加保護として設定することをお勧めします。キーペアが作成された後、公開キー（.pubファイル）をサーバーに登録することで、パスワードなしで安全にサーバーへのSSH接続が可能になります。

このコマンドは、リモートサーバへのセキュアなアクセスを設定する際に非常に重要であり、GitHubのようなサービスでSSH経由での安全なGit操作を行うためにも使用されます。
Enum の toString() と name() の違い【Java】

# toString()
オーバーライド可能なので、より見やすい形に成形された文字列が返ってくる可能性がある。

# name()
final で宣言されているためオーバーライド不可であり、Enum で宣言されたそのままの文字列を取得することが出来る。

# 状況に依りけり
公式 [(Java 8 Enum JavaDoc)](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Enum.html) によれば、 `name()` が(宣言部分を書き換えない限り)常に同じ文字列を返すことを利用したプログラムのような特殊な場合でのみ利用を推奨し、それ以外の場合は `toString()` の利用を推奨、ということらしい。

大抵の場合、Enum には何かしらの値が設定されているだろうからそれを取得しようとする場合は toString をオーバーライドして実装するのが一番手っ取り早く、そのように用途に合わせた小回りを利かせられることから「ユーザーフレンドリ」と言われているのだろう。
> **ほとんどのプログラマは、このメソッドよりもtoString()メソッドを使用するようにしてください。これは、toStringメソッドの方がユーザーフレンドリな名前を返すことができるからです。**
> https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Enum.html#name--
AWS NATゲートウェイの状態がFailedになる

## 概要

NATゲートウェイ（NGW）を作成後、状態を確認していたらFailedになっていることに気がついた。自分の場合のトラブルシューティングを簡単にまとめる。

## 原因

NGWが所属するVPCにインターネットゲートウェイ（IGW）が設置される前にNGWを作成していた。

## 詳細

NGWの状態メッセージに下記のように出ていた。

```
Network vpc-0ff1012a9b84d58bb has no Internet gateway attached
```

これはNGWがインターネットにアクセスできていないということだ。

原因は先にも記載したが所属VPCにIGWを作るより前にNGWを作ってしまった。
そのためNGWがインターネットに接続できない状態になっていた。

## 解決方法

1. IGWを作成しVPCにアタッチした。
1. 状態がFailedになっているNGWを一旦削除
1. 再度NGWを作り直す。

上記を実施し、問題は解消した。
[Linux]tailコマンドの使い方

## 要　旨
Linuxにおいて、tailコマンドの使い方を簡単に記述します。
## 実施要領
tailコマンド:指定されたファイルの最後の指定行を表示します。
デフォルトでは、最後の１０行を表示する。
```linux
tail [ファイル名]
```
これでファイルの最後の１０行が表示される。
最後の２０行を表示させたい場合は、以下のとおり。
```linux
tail -n 20 [フィル名]
```
リアルタイムで表示させたい場合は、以下のとおり。
```linux
tail -f [ファイル名]
```
これで指定されたファイルの最後の１０行から以降リアルタイムで表示されていく。
最後の２０行からリアルタイムで表示させたい場合は、以下のとおり。
```linux
tail -f -n 20 [ファイル名]
```
なおリアルタイムの表示を終了させたい場合は、Ctrlを押しながらcキーを押します。
## 結　言
今回は、Linuxにおいて、tailコマンドの使い方を簡単に記述しました。
Intellij IDEA で自作ライブラリの作成方法とその設定方法

:::note warn
~~以下の内容は間違っている可能性が出てきたので現在検証中です。~~
現時点で正常に作用したので恐らく間違いではないです。
:::

## ライブラリの自作手順
開発環境
- Windows 7 ( x86 )
- Intellij IDEA 2018.2.8
- Java 8

（例として「JarIOtools」というライブラリを作るとする）
※内容は既に完成しているものとする。

:::note warn
ライブラリは必ず何かしらのパッケージに含めた方が名前空間的にも良い。
（デフォルトパッケージにしない事）
:::
1. [プロジェクト構造] の [成果物] をクリック
1. [＋]をクリックして出たポップアップの中から [Jar] - [空] を選択
![myLibraryCreate2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552853/11fbe2bf-0e25-6429-5755-efec63c59774.png)
1. 名前には設定したいライブラリ名（例では「JarIOtools」）を入力（デフォルトでは生成されたJarファイルのディレクトリ名にもなる）
1. [出力レイアウト] - [＋] をクリックして出たポップアップの中から [モジュール出力] を選択し、パッケージ名（例では「JarIOtools」）をクリック
1. 同じく [出力レイアウト] - [＋]をクリックして [モジュールソース] を選択し、パッケージ名（例では「JarIOtools」）をクリック
![myLibraryCreate3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552853/faf7bcb0-240c-c995-be93-b05ea59ebcd3.png)
1. [プロジェクト構造] を閉じて [ビルド] - [成果物のビルド]をクリックして出たポップアップの中から [(さっき設定したライブラリ名)] - [build] を選択
![myLibraryCreate4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552853/e0ff5a3c-0509-1844-d3e9-e8189c6b733f.png)
![myLibraryCreate5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552853/8c5751c3-c467-a0ed-7ae8-87ea6fd26c9c.png)
1. これで [out] - [artifacts] - [mySwingUtils] に「mySwingUtils.jar」ファイルが生成される
:::note
以下の様に[artifacts]フォルダの下のフォルダ名はライブラリ名になる。
そのフォルダの下にJarファイルが生成される。
```directory
[out]
  └──[artifacts]
          └──[JarIOtools] <--このフォルダの名前は3で設定した名前
                   └──[JarIOtools.jar]
```
:::

## グローバルライブラリへの設定方法
1. [プロジェクト構造] - [グローバルライブラリ] をクリック
1. [＋] をクリックして出たポップアップの中から [Java] を選択
1. 上記の様に生成されたJarファイルを選択すれば完了！

## プロジェクトにグローバルライブラリから追加する方法
1. [プロジェクト構造] - [モジュール] をクリック
1. [依存関係] - [＋] をクリックして出たポップアップの中から [Library...] を選択
1. グローバルライブラリにあるライブラリ一覧が表示される
1. 追加したいJarファイルを選択すれば完了！
:::note alert
きちんと追加し、コード補完にも出てくる。それなのに実行時に
```Java
java.lang.NoClassDefFoundError
```
が発生する場合、マニフェストファイルが正常に更新されていない可能性があります。
```
[META-INF]
    ┗━ MANIFEST.MF
```
その際は「META-INF」フォルダ内の「MANIDEST.MF」ファイルを削除し、
[プロジェクト構造] - [成果物] 内のJarを削除してから、再度Jarを設定してください。
推測ですが、原因は新しく追加したライブラリ用JarファイルがMANIFEST.MFに追加されていないため、ビルド時にJarファイルにライブラリが追加されず、実行時にクラスが見つからないエラーが発生していたと思われる。
:::
-------------
参考元
- [IntelliJでJavaのライブラリを作る](https://www.haljion.net/index.php/2019-11-22-06-40-16/435-intellij-java)
- [ライブラリを使って作業する(公式サイト)](https://pleiades.io/help/idea/2018.2/library.html)
研修備忘録①

とあるIT系の研修で沼ったことを記録しておく～sshkey編～

※かなり記憶がかすれているうえメモも少ないから詳細は闇の中だし、とりあえずメモ

次の仕事でGitHubを使うとのこと。
GitHubは学生の頃の使ってたしまあなんとなく知ってる。
とか思ってるのが甘かった。

講師「sshkeyをgitに公開、接続できているか確認しましょう」

ほーーーーーーーん………

とりあえず渡された手順書通りにやってみる。

sshkey作成、GitHubに公開。できた。
そして接続を確認

'ssh -T git@github.com'
実行

結果　エラー
'Error: Permission denied (publickey)'

ふーん、なるほどね。
とりあえずカフェインの用意をした。

エラーの内容はざっくりいうと「テメーに接続権限は無え！」とのこと。
なんでやねん。

とにかくひたすらググった。PATHとかもいじった記憶があるけど、直接の原因じゃないか他で沼った時のことなのか、メモになかったので、今回は解決した手順を残す。


やったこと
・.ssh/configを追加
・.ssh/known_hostを追加

とりあえずこれだけ。
そして'ssh -vT git@github.com'でデバッグ。

結果、'type -1'の表示
これは使用できるsshkeyがないとかどうとかそういうやつらしい（大嘘なので後で自分で調べるべし）

次にやったこと
・eval"$(ssh-agent -s)"でssh-agentを有効に
なんか知らんがこれしろってどっかの記事に書いてあった（大罪）

続いて'ssh-add ~/.ssh/(id_git_rsa)'コマンドでキーを取得しているか確認

すると取得してるsshkeyが表示された！

てことで、手順をもう一度確認するためにid_rsaで秘密鍵を作り直し、'ssh -T git@github.com'を実行

無事に接続テストができた。良かった！

でも結局原因が何かわからないまま。良くない！
確かconfigの中身もちょこちょこいじってたはず。ただメモにないし記憶も曖昧だからわからん。

次からは沼った時は全部メモしとこう！
AHC030解説記事の補足（自分用メモ）

## はじめに
この記事は，[@aplysia さんの記事[2]](https://qiita.com/aplysia/items/c3f2111110ac5043710a)

https://qiita.com/aplysia/items/c3f2111110ac5043710a

を読んでいて，躓いた部分の補足です．
自分用に書いたメモですが，せっかくなのでQiitaにあげてみました．
初投稿なので，使い方とかよく分かりません．内容が間違っている可能性もあります．
問題があればご指摘よろしくお願いします．

## 前提
要素数が $k$ の集合 $S$ について，真の埋蔵量の総和が $v(S)$ ，占いによって得られた値が $x$ の時，尤度 $L$ を求めたい．

[問題文[1]](https://atcoder.jp/contests/ahc030/tasks/ahc030_a) より，$x$ は
- 平均 $\mu = (k - v(S))\epsilon + v(S)(1 - \epsilon)$
- 分散 $\sigma^2 = k\epsilon(1 - \epsilon)$

の正規分布 $N(\mu, \sigma^2)$ からサンプリングされた値を $x_0$ として， 
$x = \max(0, \text{round}(x_0))$ が得られる．

### 累積分布関数 (Cumulative Distribution Function; CDF)
確率密度関数を $f$ とすると

`CDF(x)` := $\int_{-\infty}^{x} f(t) dt$
`x`以下，`(-inf, x]` の値が得られる確率．

`prob_in_range(l, r) := CDF(r) - CDF(l)`
`(l, r]` の値が得られる確率．
参考：[[3]](https://mathlandscape.com/distrib-func)

## 尤度(Likelihood)の実装部分
ここから分からなかった所．

@aplysia さんの記事では，
> 尤度 $L$ は，正規分布 $N(\mu, \sigma^2)$ の `prob_in_range(x-0.5, x+0.5)` になります．ただし，$x=0$の場合は `prob_in_range(-inf, x+0.5)` になります．

とあるが，
なんで $\pm 0.5$ なのか，なんで $-\infty$ なのかが分からない．

### Q1. なんで $\pm 0.5$ なのか
[前提](#前提) より，$x_0$ は `round()` によって四捨五入される．

| $x_0$ | $x$ ||
|:-:|:-:|:-:|
|0|0||
|0.4|0||
|0.5|1|<|
|0.6|1|<|
|1|1|<|
|1.4|1|<|
|1.5|2||

という感じで，例えば $x=1$ が得られた時に考えられる $x_0$ は $[1-0.5, 1+0.5)$ である.

つまり，占いで得られた値 $x$ に対して，ありえる元の値 $x_0$ は $[x-0.5, x+0.5)$ の範囲に存在する．

### Q2. なんで $-\infty$ なのか
[前提](#前提) より，$x_0$ は `round()` されたあと，さらに $0$ と`max` を取る．
例えば， $x_0 = -998244353$ とか，$x_0 = -1$ とか，$x_0 = 0$ が全部 $x=\max(0, x_0)=0$ になる．
つまり，占いで得られた値 $x = 0$ の場合，ありえる元の値 $x_0$ は $(-\infty, x+0.5)$ の範囲に存在する．

### Q3. なんで半開区間が逆なのか
[前提](#前提) より，`prob_in_range(l, r)` は 区間 `(l, r]` の値が得られる確率を表す．
なのに，実装例で `prob_in_range()` に渡す引数は `[l, r)` とか `(l, r)`．
てりーさんとか，wata さんの提出コードを読んでみても同じ．

？？？

ヒントを求めて，[大昔に使っていた教科書[4]](https://www.kyoritsu-pub.co.jp/book/b10010407.html) を漁ってみると，
> 確率密度 $p(x)$ に従って発生したデータ $x_1$ に対して，$p(x_1)$ は $x_1$ が発生する確率ではない．$x_1$ が発生する確率は $0$ である．なぜなら，特定の値は幅 $0$ の区間であり，そこでの積分値が常に $0$ になるからである． $p(x_1)$ を $x_1$ の尤度と呼んで区別するのは一つには，このためである． (p.136)

との記述があった．
なるほど，つまり，正規分布のような連続確率分布では，`[l, r)` も `(l, r]` も `[l, r]` も `(l, r)` も変わらんということか．

## おわりに
学校で一応習ったものの，テストでなんとなく解いて終わっていたベイズの定理と少し仲良くなれた気がします．
きっかけを作ってくださった @aplysia さん，ありがとうございました．
それから，いつも面白い問題を作問してくださる wata_admin さん，ありがとうございます．AHCが楽しくて，私生活が終わっています．

## 参考文献
- [1] https://atcoder.jp/contests/ahc030/tasks/ahc030_a
- [2] https://qiita.com/aplysia/items/c3f2111110ac5043710a
- [3] https://mathlandscape.com/distrib-func
- [4] 金谷健一, これなら分かる最適化数学, 共立出版, 2005, https://www.kyoritsu-pub.co.jp/book/b10010407.html.
transformersのモデルのダウンロードについて

## 目的  

transformersのモデルをローカルにダウンロードする方法を示す。

## 動機

transformersで作業を続けているとき、アップデートが
入ると再ダウンロードが必要になる。Phi-2で約5GBの保存容量が必要になり
ダウンロードの度にそれなりの時間がかかり煩わしい。(光回線が引けない家🥺)

## ダウンロードするためのコード

AutoTokenizerやAutoModelForCausalLMのsave_pretrained関数[[1]](#save_pretrained関数について)のsave_directoryという引数に
保存先を指定するとモデルを指定場所に保存できる。
保存したあとはfrom_pretrainedのpretrained_model_name_or_path引数に保存した場所を指定すれば
モデルを読み込み使用できる。

```python

from pathlib import Path
from transformers import AutoTokenizer, AutoModelForCausalLM

def get_tokenizer_and_model(pre_trained_model_name, save_dir)
    if not Path(save_dir).exists():
        # download model
        self.tokenizer = AutoTokenizer.from_pretrained(pre_trained_model_name)
        self.model = AutoModelForCausalLM.from_pretrained(pre_trained_model_name)
        # save model
        self.tokenizer.save_pretrained(save_dir)
        self.model.save_pretrained(save_dir)

    else:
        # load model
        tokenizer = AutoTokenizer.from_pretrained(save_dir)
        model = AutoModelForCausalLM.from_pretrained(save_dir)

```  

## "the attention mask and the .."という警告

しかし、ダウンロードしたモデルで推論させようとすると次のような警告が表示される。

```txt
The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results.
```

これはモデルにパディングトークンが渡されていないために発生する。
通常はパディングトークン=EOSトークンとして扱ってしまって問題ないので
次のコードのようにpad_token_idにtokenizer.eos_token_idを設定する。[[2]](#the-attention-mask-and-the-という警告に関する質問)

```python
model.generate(**encoded_input, pad_token_id=tokenizer.eos_token_id)
```

そうすることで上記の警告は発生しないように。

## まとめ

時々入る再ダウンロードに煩わされることがなく快適に!!

## 参考サイト

### save_pretrained関数について

https://huggingface.co/docs/transformers/v4.37.2/en/main_classes/model#transformers.PreTrainedModel.save_pretrained

### "the attention mask and the .."という警告に関する質問

https://stackoverflow.com/questions/69609401/suppress-huggingface-logging-warning-setting-pad-token-id-to-eos-token-id/71397707#71397707
Edge/ChromeのブックマークをHTMLに変換するPowerShell

# はじめに

Windowsが起動できないとかで通常の手順ではEdge/Chromeから
ブックマークが救出できないときに転ばぬ先の杖として書いたスクリプトです。

# 対象ファイル

Edge/Chromeのブックマーク情報が保存されているjson形式のファイル

- Microsoft Edge
`C:\Users\*****\AppData\Local\Microsoft\Edge\User Data\Default\Bookmarks`
- Google Chrome
`C:\Users\*****\AppData\Local\Google\Chrome\User Data\Default\Bookmarks`

# つかいかた

スクリプトと同じフォルダに上記ファイルをコピーして実行すると、
`Bookmarks.html`というファイルが出来上がります。

# ソース

```powershell:bkm2html.ps1
###############################################################################
# Edgeのブックマークデータをインポート可能なHTML形式に変換するスクリプト
###############################################################################

###############################################################################
# 定数定義 ####################################################################

# 入力ファイル
$cInFile  = '.\Bookmarks'

# 出力ファイル
$cOutFile = '.\Bookmarks.html'

# HTMLヘッダ
$cHtmlHead = '<!DOCTYPE NETSCAPE-Bookmark-file-1>
<!-- This is an automatically generated file.
     It will be read and overwritten.
     DO NOT EDIT! -->
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<TITLE>Bookmarks</TITLE>
<H1>Bookmarks</H1>
<DL><p>'

# 子要素ブロックヘッダ
$cLayerHead = '<DL><p>'

# 子要素ブロックフッタ
$cLayerFoot = '</DL><p>'

# データ要素ヘッダ
$cDataHead = '<DT>'

# フォルダ要素ヘッダ
$cFolderHead = '<H3 >'

# フォルダ要素フッタ
$cFolderFoot = '</H3>'

# 項目ヘッダ
$cUrlHead = '<A HREF="'

# 項目中間文字列
$cUrlMiddle = '">'

# 項目フッタ
$cUrlFoot = '</A>'

# インデントの文字数
$cIndentSize = 4

###############################################################################
# グローバル変数定義 ##########################################################

# ソースとなるJSONデータ(PSCustomObject)
$json = Get-Content -Path $cInFile -Encoding UTF8 | ConvertFrom-Json

# 出力するHTML文字列を格納するStringBuilderオブジェクト
$html = New-Object System.Text.StringBuilder

###############################################################################
# 関数定義 ####################################################################

# 再帰的にJSONデータをスキャンしHTML文字列を作成する
function json2html([object]$obj,[int]$indent = 0){
    foreach($o in $obj){
        $istr = ' ' * ($indent * $cIndentSize)
        switch($o.type){
            'folder'{
                $html.AppendLine(
                    "${istr}${cDataHead}${cFolderHead}$($o.name)${cFolderFoot}"
                ) > $null
                $html.AppendLine("${istr}${cLayerHead}") > $null
                $html.Append((json2html $o.children ($indent + 1))) > $null
                $html.AppendLine("${istr}${cLayerFoot}") > $null
            }
            'url'{
                $html.AppendLine(
                    "${istr}${cDataHead}${cUrlHead}$($o.url)${cUrlMiddle}$($o.name)${cUrlFoot}"
                ) > $null
            }
        }
    }
}

###############################################################################
# エントリポイント ############################################################

# HTMLヘッダ部書き込み
$html.AppendLine($cHtmlHead) > $null

# JSONデータ書き込み
json2html $json.roots.bookmark_bar 1
json2html $json.roots.other
json2html $json.roots.synced

# ファイル出力(BOMなしUTF-8)
[Text.Encoding]::UTF8.GetBytes($html.ToString()) | Set-Content -Path $cOutFile -Encoding Byte

```