OmniAICreator/Qiita-1.07M huggingface dataset:
Androidスマートフォンを工場出荷時に初期化。しかし、思わぬ落とし穴が。。。

# 事の起こり
3月と言えば新生活応援セールがあちこちで行われますが、Google StoreでもGoogle Pixelなどの製品を大幅値引きして販売するセールが行われました。筆者はPixel 7aを昨年の5月に購入したのですが、画面内指紋センサーの感度がいまいちで大変不満でした。ネットで検索してみても同様の不満の声が書き込まれているレビューを時々見掛けるので、筆者の端末だけが初期不良ということでもなさそうです。よって、このセールでPixel 8を狙うことにしました。セール値引きに加えてPixel 7aを購入した時に貰ったストアクレジットを加えて、更に旧端末を下取りに出せば更に大幅な値引きが期待出来ます。幸いPixel 7aの前に利用していたPixel 5(筆者にとっては初めてのPixel)も綺麗な状態で残っています。さあ下取りに出そうと勇んだのですが。。。危うく下取りが受けられないことになる所でした。。。:scream: :scream_cat: そんな思わぬ落とし穴を回避する方法を備忘録として残しておこうと思います。

# 下取りの準備
Googleが公式に行っている下取りサービスを今回は利用することにしました。Pixel 5だと最大43,100円で下取りして貰えることが分かりました。ネットで下取りを受けるまでに必要な作業について調べると以下のサイトの様に詳しく解説してくれているサイトが見つかります。

https://zo-ken.com/pixel-shitadori/#index_id4

下取りを解説しているサイトでは以下の様に、本人限定受取で受け取る旨が記載されていることが多いのですが、筆者が下取りを行った2024年3月現在はシステムが変わっていて、発送用のラベルと箱がいきなり送られて来ます。マニュアルなども特に付属しておらず、少々戸惑います。ペーパーレス化の一環なのかもしれませんが、マニュアルぐらいは付属して欲しいなと思います。後、届いた箱はPixelピッタリサイズの箱ではないため、緩衝材などを詰め込まないと輸送中に破損する可能性が有ります。環境面重視を謳うのも良いのですが、もう少し何とかならないのかと思いました。。。

> 下取りを利用するを選択して購入した商品が到着してから数日後、郵便局から「本人限定受取(特例型)郵便物等の到着のお知らせ」が届きます。
> この手紙が届いたら指定の郵便局に下取りキットを受け取りにいきましょう。

# 工場出荷時の状態に初期化
発送前に工場出荷時の状態に初期化する必要が有ります。初期化の方法は`設定>システム>リセットオプションすべてのデータを消去 (初期設定にリセット)>すべてのデータを消去`で出来ます。これでPixelの初期化は完了です。さて、これで発送すれば、当該Pixel 5はカバーや画面シールを貼って使っていたので傷も殆どなく、正常に動作するので、下取り額は上限額に達するだろうと喜び勇んで発送の準備をしました。ところが、上記サイトを再度読み返してみると思わぬ見落としが有りました。。。

# 初期化だけでは不十分？
実は通常の初期化では設定とデータは完全に削除出来ます。ところが、おサイフケータイの肝であるFeliCaの初期化は出来ません。。。よって、別途FeliCaが購入時の状態から変更されている場合はFeliCaの初期化が必要になります。これが出来ていないと下取りをして貰えません。。。発送前に気付いたので良かったですが、危うく工場出荷時の状態に初期化したことで満足して発送するところでした。。。:scream: :scream_cat: 因みに、FeliCaが初期状態になっているかは以下のサイトで紹介されている方法で確認出来ます。

https://engrholiday.jp/android/check-felica-data/

この方法で筆者のPixel 5の状態を調べたところ。。。初期化出来ていない状態でした。。。

![利用中.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/f923870d-cf43-8162-3ce8-baeb2758d8c1.jpeg)

# FeliCaの初期化実施
おサイフケータイアプリ内でGoogleアカウントにログインをしてFeliCaに残っているカード情報を調べました。筆者のPixel 5のFeliCa内にはヨドバシカメラのゴールドポイントカードアプリの情報と横浜銀行のはまPayのカード情報が残っていることが判明しました。ヨドバシカメラの方は以下のサイトで紹介されている方法に従ってすぐに削除出来ました。(アプリを再インストールするという手間は発生しましたが。。。)

https://usedoor.jp/howto/web/osaifu-keitai/android-yodobashi-goldpoint-sakujo/

苦戦したのは、はまPayアプリの方でした。。。そもそもログインに必要な情報を忘れてしまっており、コールセンターに電話するところから始めました。。。何とか再ログイン出来たことで分かったのが、アプリからはカード情報を直接消せず、iDアプリを再インストールしてそこから削除する必要が有るということでした。。。

https://faq.boy.co.jp/hojin/1268

https://id-credit.com/support/smt/setting_delete.html

無事FeliCaのリセットが完了し、以下の様に利用状況が未利用(つまり初期状態)に初期化出来ました。ここで、再度`設定>システム>リセットオプションすべてのデータを消去 (初期設定にリセット)>すべてのデータを消去`を実施しました。

![未利用.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/088f6b64-8e91-fa99-43f6-17fd85f61a3e.jpeg)

# 後日談
無事満額43,100円で下取り出来ました。Pixel 7aを購入した時に貰ったストアクレジットとセール値引きを合わせて購入できたので、112,900円のPixel 8が36,800円で購入できました。Pixel 8の画面内指紋センサーの感度は非常に良く、顔認証も高速化されていました。とても良い買い物が出来たと満足しています。Googleストアの下取りはもう少し親切なシステムになってくれることを願いつつ、Pixel 8を愛用したいと思います。
M5StampPICO(S3) をI2Cサブ（スレーブ）にする

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) できたっぽい
## やること
M5StampPICO をI2Cサブ（スレーブ）として設定し、
Aruduino系（今回はArduino UNO）からI2Cデバイスとして認識させます。
M5StampS3版のサンプルスケッチも最後に掲載しています。

## 準備物・実施環境
- M5StampPICO
- Arduinod UNO
- Arduino IDE

## スケッチ

#### メイン（マスター）側（Arduino UNO）
アドレス0x58番のI2Cデバイスにアクセスし、16個のデータを要求し、結果を表示します。

```JAVA:
#include <Wire.h>
#define I2C_DEV_ADDR 0x58

uint32_t i = 0;
byte pad_data[16];

void setup() {
  Serial.begin(115200);
  Wire.begin();
  Wire.setClock(100000); // 通信速度を100kHzに設定
}

void loop() {
  delay(500);

  Wire.requestFrom(I2C_DEV_ADDR, 16);
  i = 0;
  while (Wire.available()) { // バッファにデータがある間
    byte c = Wire.read();  // バッファから1バイト読み取り
    pad_data[i] = c;
    i ++;
  }

  // 表示
  for (int i = 0; i < 16; i++)
  {
    Serial.print(pad_data[i]);
    Serial.print(" ");
  }
  Serial.println();
}
```
<br>

#### スレーブ側（M5StampPICO）

今回はアドレス0x58番のI2Cデバイスとして機能し、呼ばれた時に16バイトの数値を返します。データは1ずつ加算されたものになります。

```JAVA:
#include <arduino.h>
#include <Wire.h>

#define I2C_DEV_ADDR 0x58
int j = 0;

void onRequest()
{
  for (int i = 0; i < 16; i++)
  {
    Wire.write(j);
    j++;
    if (j > 254)
    {
      j = 0;
    }
  }
}

void setup()
{
  Serial.begin(115200);
  Wire.onRequest(onRequest);
  Wire.begin((uint8_t)I2C_DEV_ADDR);
}

void loop() {}
```

## 接続

|Arduino UNO|M5StampPICO|
|:-:|:-:|
|GND|GND|
|5V|5V|
|SDA|21番ピン(SDA)|
|SCL|22番ピン(SCL)|

他のI2Cデバイスがある場合も同様に接続します。


## 実行結果
下記はArduino UNO（I2Cメイン）のシリアルモニタの表示例です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a0e51bf0-448f-0013-3070-fa64b621f910.png" width=400>

## メイン側をESP32DevkitCにしても同様に動きました。

|ESP32DevkitC|M5StampPICO|
|:-:|:-:|
|GND|GND|
|5V|5V|
|21番ピン(WIRE_SDA)|21番ピン(SDA)|
|22番ピン(WIRE_SCL)|22番ピン(SCL)|

## メイン側をTeensy4.0にしても同様に動きました。

|Teensy4.0|M5StampPICO|
|:-:|:-:|
|GND|GND|
|5V|5V|
|18番ピン(SDA0)|21番ピン(SDA)|
|19番ピン(SCL0)|22番ピン(SCL)|

## サブ側をM5StampS3にする場合のスクリプトは以下で動きます。

|Arduino UNO|M5StampS3|
|:-:|:-:|
|GND|GND|
|5V|5V|
|SDA|13番ピン(SDA)|
|SCL|15番ピン(SCL)|

```JAVA:
#include <arduino.h>
#include <Wire.h>

#define PIN_SDA 13
#define PIN_SCL 15
#define I2C_DEV_ADDR 0x58
int j = 0;

void onRequest()
{
  for (int i = 0; i < 16; i++)
  {
    Wire.write(j);
    j++;
    if (j > 254)
    {
      j = 0;
    }
  }
}

void setup()
{
  USBSerial.begin(115200);
  USBSerial.setDebugOutput(true);
  
  Wire.setPins(PIN_SDA, PIN_SCL);
  Wire.onRequest(onRequest);
  Wire.begin((uint8_t)I2C_DEV_ADDR);
  Wire.setClock(100000); // 通信速度を100kHzに設定
}

void loop() {}
```

## 課題感
I2C通信速度がプルアップ抵抗を入れても100kまでしかあがりませんでした。
なにか良い方法があるのかも。

## 参考

https://github.com/espressif/arduino-esp32/tree/master/libraries/Wire/examples
セッションマネージャーを使ってEC2へアクセスする


セッションマネージャーを利用すれば、キーペアによる認証をせずにEC2へアクセスすることが可能です。

また以下のリンクに記載されているAMIであれば、SSMエージェントが事前にインストールされているため、すぐに利用できます。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/ami-preinstalled-agent.html

※デモなので、権限周りの設定は適当です。

## EC2インスタンス用のIAMロールを作成する

EC2インスタンスに割り当てるIAMロールには、 AmazonSSMManagedInstanceCore というポリシーを付与します。

コンソールから作成する場合は、ユースケースから EC2 ＞ EC2 Role for AWS Systems Manager を選択し次へ進むと上記ポリシーを付与できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764512/1d3f3807-c8a5-5632-a911-5ab56aaff599.png)

## EC2インスタンスに作成したIAMロールを付与する

EC2インスタンスの アクション ＞ セキュリティ ＞ IAMロールを変更 を押下します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764512/1b9bf48d-112f-6cea-73df-ed14e1e9591d.png)

先ほど作成したIAMロールを選択し更新します。

## 接続に失敗した場合は

IAMロールがEC2インスタンスに反映されるまで時間がかかるようです。暫く様子を見てみてください。
私の場合は20分程度かかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3764512/41a3a8bd-9b7c-53b4-c38f-3055a344efb9.png)

それでも接続できない場合は、アウトバウンドルールでHTTPS（443）を制限してないか確認してください。

## 参考文献

https://dev.classmethod.jp/articles/ec2-access-with-session-manager/

https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/ami-preinstalled-agent.html
SQLでテーブル名を取得する

※参考 兼 自身のメモ用
※随時追記

SQLで基本的なSELECT文は勉強したが、仕事でテーブル名を検索したい場面がありわからなかったので調べた内容をまとめる

```sql:sampleSelectTableNameForAll.sql
-- DB内のテーブル一覧からテーブル名を取得する
-- 取得できる内容は「DBA_TABLES」を指定した際と同様
SELECT
    TABLE_NAME
FROM
    ALL_TABLES
;
```

```sql:sampleSelectTableNameForUser.sql
-- ユーザーが所有するテーブル一覧からテーブル名を取得する
SELECT
    TABLE_NAME
FROM
    USER_TABLES
;
```
何故か一部css反映されない

<h4>開発環境</h4>
 Laravel Framework  10.30.1
<br></br>
<br></br>
<br></br>
<br></br>



<h2>起きた問題</h2>
localhostではきちんと反映されるのに、デプロイしたとこでは当たってない...
しかも一部のみ...
<br></br>
<br></br>




```
<button {{ $attributes->merge(['type' => 'submit', 'class' => 'bg-cyan-800 text-white display: inline-block px-16 py-2 rounded-sm']) }}>
    {{ $slot }}
</button>
```


![スクリーンショット 2024-04-27 223803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634951/8c5e52d2-eced-e417-4900-52c15b798128.png)

px-16 → 左右のpaddingのみ当たってない...

<br></br>
<br></br>

<h2>原因究明</h2>

色々調べた結果、<br></br>
●リセットcssが原因？
    → デベロッパーツールで確認したけど余計なmarginは見当たらないので違う<br></br>
●本番用にwebpack.mix.jsに追記？
    → そもそもwebpack.mix.jsない...
<br></br>
●アセットプリコンパイルがきちんとできているか？
    → /public/assetsにあるの確認


<br></br>
なんなんだ...
<br></br>
<br></br>
<br></br>
<br></br>
<h2>解決</h2>
awsのインスタンスに接続後、<br></br>

```
cd /var/www/プロジェクト
```
に移動後

```
npm run build
```

再度、パブリック IPv4 アドレスで行ってみると
<br></br>
![スクリーンショット 2024-04-27 224937.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634951/ef5c3e91-20f1-b22d-3d20-ff892edd06d2.png)

なってるーーーーーーー:raised_hands_tone1:


<br></br>
<br></br>
<h2>npm run buildについて調べてみた</h2>
作成したVueアプリケーションをコンパイルし、<br></br>
サーバーアップロード（本番環境）向けにファイルサイズを小さくしたものを生成するコマンド
<br></br>
<br></br>
- npm run build: 本番環境での設定方法(の一部)

<br></br>
jsファイルやCSSファイルなどのマージをしているとのこと
<br></br>
<br></br>
<br></br>

<h2>はじめて記事投稿してみて</h2>
考えを文字化するのは苦手なのでいい機会だった。<br></br>
マークダウンの記法もちょろっと知れたし♪<br></br>
頭の中の整理に良いなって思った。<br></br>

勉強しつつ、
備忘録・頭の整理として自分のペースであげていけたらな:relieved:
【セキュリティニュース解説】「クラウドの設定ミス対策ガイドブック」が公表されたので概要をまとめた

Bom dia:relaxed:

2024年4月26日に総務省が公表した「クラウドの設定ミス対策ガイドブック」の概要をスライド1枚に整理しました。

自社で起こり得るミスの原因を特定したうえで、4観点での対策を綜合したセキュアな仕組み作りが大切です。
詳細な対策は、参考リンク先の公開資料 ”（別紙）「クラウドの設定ミス対策ガイドブック」” からご確認ください。

![20240420_セキュリティニュースまとめ_クラウドの設定ミス対策ガイドブック.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3299903/8db7c218-1889-eb6d-5831-6c7f5b4705e6.jpeg)

## 参考
・「クラウドの設定ミス対策ガイドブック」の公表,総務省, https://www.soumu.go.jp/menu_news/s-news/01cyber01_02000001_00209.html
java　クラス　インスタンス

## クラスとインスタンス
クラスとは、値の元となるもの。実態はなくデータや操作などの型。設計図
その設計図をもとにして作られたものをインスタンスという。具体化し実体がある。

#### クラスの作成
```
public class クラス名 {
}
```


#### インスタンスの生成
```
クラス名　変数名　= new クラス名();
```
#### フィールドの宣言
フィールドとは、クラスブロック内に宣言された変数。情報をもつ。属性
```
データ型. フィールド名
```
データ型の前にアクセス修飾子をつける（省略可）が、勉強順にアウトプット一旦この形です...


#### フィールドへの値の代入

```
変数名.フェールド名 = 値;
```

```Person.java
public class Person {
 // フィールドの追加
 String name; // 名前の宣言
 int age; // 年齢の宣言
}
```
```Main.java
public class Main {
 public static void main(String[] args) {
  Person p = new Person(); // Person クラスからインスタンスを生成し、変数 p に入れる
  p.name = "タロウ"; //変数 p の name に代入
  p.age = 25; //変数 p の age に代入
  System.out.println("私の名前は" + p.name + "で、年齢は " + p.age + "です。");
 }
}
```
```結果.
私の名前はタロウで、年齢は 25です。
```

## 初期値設定と定数
フィールド宣言と同時に値の代入も記述すると初期値設定や値を書き換えられない定数フィールドを宣言できる
```
public class Hero {
 final int HP; 50 // フィールド内のHPを10で固定
 final int MAX_HP; 50 // 最大HPを50で固定
 int level; 10 // 初期値10で設定
} 
```
定数フィールドは一目見てわかるように大文字での記述するとよい。
複数単語の場合はアンダースコア　`-`　を使う

## 操作の宣言方法
```Heor.java
public class Hero{
 String name;
 int hp;
 public void eat() {
  this.hp = 50;
  System.out.println(this.name + "は、食べてHPを" + this.hp + "回復した");
 } 
}
```
```Main.java
public class Main {
 public static void main(String[] args) {
  // インスタンスの生成
  Hero h = new Hero();
  h.name = "タロウ";
  // メソッドの呼び出し
  h.eat();
 }
}
```
`this.`は特別に準備された変数
自身のインスタンスを意味している。ドット`.`は日本語の「の」意味。

```結果.
タロウは、食べてHPを50回復した
```

## クラスとメンバの命名ルール
フィールドとメソッドをメンバと総称する
クラスは「処理」と「データ」をまとめたもの
メソッドが「処理」
フィールドが「データ」
|対象|品詞|規則|例
|:--:|:--:|:--:|:--:|
|クラス名|名詞|単語の頭が大文字|Person, Hero
|メソッド名|名詞|小文字。区切りは大文字|set, ageSet|
|フィールド名|動詞|小文字。区切りは大文字|name, firstName|

## インスタンスの利用
```Person.java
public class Person {
 String name; // 名前の宣言
 int age; // 年齢の宣言
       
 // メソッドの定義
 public void introduce() {
  System.out.println("私の名前は" + name + "で、年齢は" + age + "です。");
 }
}
```

```Main.java
public class Main {
 public static void main(String[] args) {
 // インスタンスの生成と利用 
 Person p1 = new Person();
 p1.name = "タロウ";
 p1.age = 25;
 p1.introduce(); // メソッドの呼び出し
        
 // 別のインスタンスを生成して利用
 Person p2 = new Person();
 p2.name = "ハナコ";
 p2.age = 30;
 p2.introduce(); // メソッドの呼び出し
 }
}
```
```結果.
私の名前はタロウで、年齢は25です。
私の名前はハナコで、年齢は30です。
```
#### まとめ
インスタンスの生成には`new`を使う
フィールドを利用するには`変数名.フィールド名`
メソッドの呼び出しは`変数名.メソッド名()`
Cypress で最初からDevToolを開いておく方法

# TL;DR
Configを見てください

## 経緯

Cypressを用いて開発環境に向けてビルドしたアプリを試していたりすると開発環境用のログ出力を確認したい場合があると思います。

Cypressを普通に立ち上げてテストを書いていく分にはCypress起動後にDevToolをひらけばいいですが、CI内にheadlessで走らせて失敗時の録画などで確認したい際には最初から開いていておいて欲しいものです。

そのためのセットアップを書いておきます。

## Config

```typescript:cypress.config.ts
import { defineConfig } from "cypress"

export default defineConfig({
  e2e: {
    setupNodeEvents(on) {
      on("before:browser:launch", ( browser, launchOptions) => {
      if (browser?.family === "chromium" && browser?.name !== "electron") {
          launchOptions.args.push("--auto-open-devtools-for-tabs")
          launchOptions.args.push("--disable-dev-shm-usage")
        }
        return launchOptions
      })
    }
  }
})
```

## 簡単な解説

### e2e

`defineConfig`で最初に指定している`e2e`はテストランナーについての設定をオーバーライドするものです。
[Configuration | Cypress Documentation #e2e](https://docs.cypress.io/guides/references/configuration#e2e)

### setupNodeEvents

テストランナーのうちCypress自身に触れる部分になります。
引数には上記のデモに渡しているプラグインイベントである`on`の他にオプショナルな引数として`config`を渡すこともできます

[Configuration | Cypress Documentation #e2e](https://docs.cypress.io/guides/references/configuration#setupNodeEvents)

プラグインイベントには色々なものがあります。タスクごとに処理を追加したり、テストファイルのテスト完了時のフックを拾って別のWebhook叩いたりといったことも可能になりますし便利です。

ここで設定している `launchOption`はchromium系のブラウザに有効な起動時のオプションを色々なオプションがあります。
下記が参考になります

`--auto-open-devtools-for-tabs` が全てのタブであらかじめDevtoolを開いていてくれるものになります。
`--disable-dev-shm-usage`はこの記事のコンテクストとは関係ないですがブラウザクラッシュが起きにくくなるのでおすすめです。

https://peter.sh/experiments/chromium-command-line-switches/
新人エンジニアのキャリアと指導を行う際に意識したこと

# 概要
以前、新人エンジニアを指導する機会があり、どのポイントを意識して指導したかを本記事にまとめる。

# 意識したこと
1. 実業務で今後活躍できるよう意識することが大切なので、**実業務もしくはそれに紐づくタスク**を考える。
2. 本人のキャリア志向を尊重する。志向の具体的なものがない場合は、どの志向に進んだ時もより応用が効きやすいタスクになるべくする。
3. 業務に必要な具体的な技術スキルや社内スキル（ハードスキル）はもちろん、考え方の面もより深化・向上させれるような資料・座組みを考える（ソフトスキル）

# キャリア志向のロードマップについて
## ①エンジニアスキルとしては、Developer Roadmapsを利用
https://roadmap.sh/

例えば、[frontend](https://roadmap.sh/frontend)・[backend](https://roadmap.sh/backend)・[DevOps](https://roadmap.sh/devops)での具体的なスキルの積み方が明示してある。
その中で、**どの位置・どのスキルのことを習得するために、今の業務・タスクをアサインしようと考えているか**を伝えた。

仮に本人に具体的な志向が無かったとしても、それぞれの共通部分（例えばキャリア序盤ならインターネットの考え方やプログラミング、OSの考え方など）もあると思われるため、そのような部分に重点を置いた業務・タスク割り振りを考えた。

## ②プロダクト全体像の中の立ち位置としては、プロダクトトライアングルを利用
https://tumada.medium.com/product-management-triangle-job-description-d18d1855ef65

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175433/894191ef-736a-6acc-ee1b-3e2ec2e091af.png)

仮に本人がエンジニアにこだわってなくても、プロダクトやサービスの全体の中から、開発者起点からどういう職種へのパスがあるか？を伝える（参照記事は更に各種プロダクト構造から、具体的な職種の位置付けについても言及しておりよりイメージしやすい）

# 各種Tips
## ハードスキル
- 実務も研修も学び手を動かす系を優先的に考える（実際手を動かさないとなかなか定着しない）
- 包括的理解のための手段として資格の導入も検討（資格ありきでは考えない）
- 社内の部署の位置付けや、そもそも部署の設立経緯・歴史を共有する
- 扱っているプロダクトの技術やその技術選択・導入の流れを共有する
- 社内や技術・ビジネスの共通言語で参考になりそうな本や資料などあれば、共有する
- **技術的な不明な用語・構造や社内での共通言語は、都度調べる・聞けるようにする**

## ソフトスキル
- 振り返りと課題洗い出し・具体的改善策の習慣づけ
- 自責型思考の習慣づけ（自分のコントロール範囲がどこか？）
- メタ認知のサポート（360度のフィードバックの中で、自分の強みと課題の洗い出し）
- 周囲もスキルの高いメンバーの中に入れ、自分の出来ることを見出すなど出来れば理想
    - その中で、**自分も追いつこうとする力学が働くし、チームの中で自分がその時点で必要とされている部分・価値を発揮できる部分はどこか？を訓練する**ことはやはり重要であると思うため。

# その他
新人の指導については、以下の記事も参考になるかもしれません。
もし宜しければ参考にして頂けましたら、幸いに思います。

https://note.com/hinom77/n/n7a14cd41dbc8

https://qiita.com/hinom77/items/822e1b9730a939aa53df


--- 
記事をお読みいただき、ありがとうございました！
もし参考になったと感じましたら、「いいね」や共有など頂けたら嬉しく思います！
何卒よろしくお願い致します！
SQLのDDLについて

## データ定義言語（DDL)について記載。
※参考 兼 自身のメモ用
※随時追記

### CREATE文
空のテーブルを作成できる。
データの追加は`INSERT文`を使用し、必ずデータ型を指定する。
### 命名ルール
1. 使用可能な文字は、半角英数字とアンダースコア"_"のみ
2. 名前の先頭文字列はアルファベットを使用する
3. 名前は重複してはならない
```sql:sampleCreateTable.sql
-- テーブルの新規作成
CREATE TABLE テーブル名 (
    列名1　データ型　制約,
    列名2　データ型　制約,
    列名3　データ型　制約,
    ...
-- テーブル制約（主キー制約）
-- ※必ず必要、1つのみ
-- 主キーは必ずNOT NULL制約
PRIMARY KEY (列名),
-- 参照整合性制約（外部キー制約）
FOREIGN KEY (外部キー)
REFERENCES 参照テーブル (参照カラム)
)
;

```

### DROP文
テーブルをオブジェクト単位で削除することができる。
一度削除したテーブルはROLLBACK（復旧）できないので、削除する際はよく確認してから実行する。
```sql:sampleDropTable.sql
-- テーブルの削除
DROP TABLE テーブル名;
```

### TRUNCATE文
テーブル内の全レコードを削除することができる。
DROP文との違いは、DROP文がテーブルも含めた全レコードを削除しているのに対し、TRUNCATE文はテーブルの表構造はそのままの状態でレコードのみ削除される。
```sql:sampleTruncateTable.sql
-- テーブルの全レコード削除
TRUNCATE TABLE テーブル名;
```

### ALTER文
定義済みテーブルを更新することができる。
```sql:sampleAlterTableDrop.sql
-- テーブルの列を削除する
ALTER TABLE
    テーブル名
DROP COLUMN
    列名
;
```

```sql:sampleAlterTableAdd.sql
-- テーブルの列を追加する
ALTER TABLE
    テーブル名
ADD COLUMN
    列の定義
;
```

```sql:sampleAlterTableRename.sql
-- テーブル名を変更する
ALTER TABLE
    変更前テーブル名
RENAME TO
    変更テーブル名
;
```
BigQuery Analytics Hub の Exchange は dataset と異なる region を選択すると Listing が作成できない


## はじめに

今回、 Analytics Hub の Publisher 側 Exchange 及び Listing を設定する時に異なる region を選択したがために先へ進めなかったという話。

## Analytics Hub とは

> Analytics Hub は、堅牢なセキュリティとプライバシー フレームワークを備え、組織の境界を越えてデータと分析情報を大規模に共有できるデータ交換プラットフォームです。
>
> [Analytics Hub の概要](https://cloud.google.com/bigquery/docs/analytics-hub-introduction?hl=ja) から引用

要は、 Dataest 等のデータを異なる Google Cloud の組織間で共有する機能 = Analytics Hub です。

https://cloud.google.com/analytics-hub?hl=ja

https://cloud.google.com/bigquery/docs/analytics-hub-introduction?hl=ja

https://qiita.com/na0/items/442b590c0ca6ecd5cb7b

Analytics Hub を利用することで、データ利用状況を確認できたりと組織間のデータ共有を安全かつ簡単に行うことができます。

## Exchange を作成する region に気をつけて

タイトルの通り、BigQuery Analytics Hub の Exchange を作成する region が 参照したい Dataest と異なる場合 下記のようなエラーが出て Listing の作成が完了しません。

> Please choose a source dataset in the same location as your listing.
> リスティングと同じ場所にあるソース データセットを選択してください。

![Screenshot 2024-04-27 at 23-14-16 Create listing – BigQuery – mziyut-com – Google Cloud console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55950/4c8065b9-5e12-9dc4-38bd-d6ff29503c45.png)

ちなみに上記エラーを発生させるために、作成したリソース及び設定は以下のとおりです。

- Dataset
  - name: `analytics_hub_some_region_dataset`
  - region; `asia-northeast1(tokyo)`
- Analytics Hub / Exchange
  - name; `analytics_hub_some_region_exchange`
  - region: `US (multiple regions in United States)`

## さいごに

同じリージョンで作る前提になっており、ドキュメントにも出てこない。
私のように知らなかった方のために書き残しておきます。
RDS の復元について

- RDS の復元で、スナップショットからの復元と、ポイントインタイムリカバリーの両方を試すことができたのでそのときのメモです
- (今回はマスクする箇所が多かったので、画面のスクショはありません)

# 前提
- 今回はRDS for MySQL のお話です

# 設定項目の違い
- スナップショットからの復元、ポイントインタイムリカバリーともにDB を復元させることには変わりありませんが、復元時の設定項目に違いがあったのでメモです

## 共通項目
- 設定
    - DB インスタンス識別子
- インスタンスの設定
    - DB インスタンスクラス
- ストレージ
    - ストレージタイプ
    - ストレージ割り当て
- マルチ AZ 配置
- 接続
    - Virtual Private Cloud (VPC)
    - DB サブネットグループ
    - パブリックアクセス
    - VPC セキュリティグループ (ファイアウォール)
    - データベースポート
- データベース認証
    - データベース認証オプション
- タグ
- 暗号化
    - 暗号化
- 追加設定
    - DB パラメータグループ
    - オプショングループ
    - バックアップ
        - スナップショットにタグをコピー
    - ログのエクスポート
    - マイナーバージョン自動アップグレード
    - 削除保護

## ポイントタイムリカバリーしか存在しない項目
- 復元時刻
    - 復元する時点
        - 当然ですね...
- 接続
    - アベイラビリティーゾーン
    - 認証機関
- 追加設定
    - 最初のデータベース名
    - バックアップ
        - 自動バックアップを有効にします
        - バックアップ保持期間
    - メンテナンスウィンドウ

# まとめ
- ざっと挙げてみましたが、ポイントタイムリカバリーの方が復元の設定時にいろいろとできる結果でした
- とはいえDB インスタンス作成後に設定変更できるので、気にならない部分でもありますが、RDS の設定変更には多少なりに時間がかかるので、少しでも早く使える状態に持っていくときはポイントインタイムリカバリーが良いと考えています
ABC351をPythonで（A～D、F）

AtCoder Beginner Contest 351の解答等のまとめ

https://atcoder.jp/contests/abc351

# A問題
先攻がとった点数から後攻がとった点数を引くと後攻が引き分けになるための点数になる。
よってそれに1を足せばいい。
```python:A
print(sum(map(int, input().split())) - sum(map(int, input().split())) + 1)
```
# B問題
全て調べて違う座標を表示すればいい
```python:B
n = int(input())
a = [input() for _ in range(n)]
b = [input() for _ in range(n)]

for i in range(n):
    for j in range(n):
        if a[i][j] != b[i][j]:
            print(i + 1, j + 1)
```
# C問題
数の変化の仕方に気を付けて愚直にやる
```python:C
n = int(input())

s = list()
for a_i in map(int, input().split()):
    now = a_i
    while s and s[-1] == now:
        now += 1
        s.pop()
    s.append(now)

print(len(s))
```
# D問題
根本はBFS
磁石の周辺でない場所から移動できる場所をBFSで調べる
ただ、磁石の周辺に移動するときのフラグの持ち方に気を付ける
```python:D
from collections import deque

h, w = map(int, input().split())
field = [input() for _ in range(h)]

ans = 1
check = [[False] * w for _ in range(h)]
for i in range(h):
    for j in range(w):
        if field[i][j] == "#" or check[i][j] or any(
                field[a][b] == "#" for a, b in [(i + 1, j), (i - 1, j), (i, j + 1), (i, j - 1)] if
                0 <= a < h and 0 <= b < w):
            continue
        q = deque()
        q.append([i, j])
        searched = {(i, j)}
        while q:
            x, y = q.popleft()
            mag = False
            for x_i, y_i in [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)]:
                if 0 <= x_i < h and 0 <= y_i < w:
                    mag |= field[x_i][y_i] == "#"
            if not mag:
                check[x][y] = True
                for x_i, y_i in [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)]:
                    if 0 <= x_i < h and 0 <= y_i < w:
                        if (x_i, y_i) not in searched:
                            searched.add((x_i, y_i))
                            q.append([x_i, y_i])

        ans = max(ans, len(searched))

print(ans)
```
# F問題
数列を後ろから考える
各$a_i$で、$a_i$より先に出た数の中で
- $a_i$より大きい数が何個あるか
- $a_i$より大きい数の総和

が求まれば
- ($a_i$より大きいもの)の総和$- a_i \times (a_i$より大きいもの)の個数

の和が答えになる
```python:F
from sortedcontainers import SortedList


class BinaryIndexTree:
    def __init__(self, n):
        self.size = n
        self.tree = [0] * (n + 1)

    def sum(self, i):
        s = 0
        while i > 0:
            s += self.tree[i]
            i -= i & -i
        return s

    def add(self, i, x):
        while i <= self.size:
            self.tree[i] += x
            i += i & -i

    def range_sum(self, i, j):
        if i == 0:
            return self.sum(j)
        return self.sum(j) - self.sum(i - 1)


n = int(input())
a = list(map(int, input().split()))

lst = sorted(set(a))
d = {l_i: i + 1 for i, l_i in enumerate(lst)}
ans = 0
s = SortedList([])
BIT = BinaryIndexTree(n + 10)
for a_i in a[::-1]:
    i = len(s) - s.bisect_right(a_i)
    if i:
        ans += BIT.range_sum(d[a_i] + 1, n + 1) - a_i * i
    s.add(a_i)
    BIT.add(d[a_i], a_i)

print(ans)

```
信頼性設計の用語まとめ

情報処理技術者試験でも出ましたが、いまいち整理できていなかったので、まとめてみました。

## フェールセーフ
障害が発生しても、人／システムに危害を及ぼさないようにする設計手法
「車が故障したら暴走する前に停止させるようにしよう」

## フェールソフト
障害が発生しても、システム／サービスは停止させないようにする設計手法
「飛行機のエンジン2基のうち片方が故障しても、残り1基で最寄り空港までは飛べるようにしよう」

## フェールプルーフ
誤操作／誤動作をしても、障害が発生しないようにする設計手法
「炉の蓋が開いたままでは点火できないようにしよう」

## フェールオーバー
障害発生時に、予備システムに切り替える設計手法

## フォールトトレランス
障害が発生した時の対策を練ることで信頼性を確保する考え方
上記4点がその具体例

## フォールトアボイダンス
障害が発生しないように対策を練ることで信頼性を確保する考え方
[test24]SVG ポリゴンの中に線を引く

[test24]SVG ポリゴンの中に線を引く

# 1.基本
## 1-1.ベースを作る
- サイズ500*400、背景はライトグレー
```HTML
<style>
svg{background-Color:lightgray;}
</style>
<svg width=500 height=400 id="svg">
</svg>
```

## 1-2.ポリゴンを書く
- 3点 [100,200],[300,300],[400,100]の黄色い図形を書く
```HTML
<style>
svg{background-Color:lightgray;}
</style>
<svg width=500 height=400 id="svg">
<polygon points="100,200 300,300 400,100" fill=yellow />
</svg>
```

## 1-3.ポリゴンをプログラムで書く
1-2のpolygonをプログラムに落とし込む
```HTML
<script>
const createPolygon=(points=[],fill=null)=>{
  const svgNS = svg.namespaceURI;
  /**
    * SVG内に新しい要素を追加するにはcreateElementNSで
    * 所定のnamespaceを設定して要素の種類を指定する
    */
  const polygon=document.createElementNS(svgNS,"polygon");
  /**
    * SVG内の要素を属性を追加するにはsetAttributeNSで
    * 第一引数にnullを設定して属性名と値を指定する
    */
  polygon.setAttributeNS(null,'fill',fill);
  const pointsStr=points.map(x=>x.join(",")).join(" ");
  polygon.setAttributeNS(null,"points",pointsStr);
  return polygon;
}
window.addEventListener('DOMContentLoaded', ()=>{
  const points=[[100,200],[300,300],[400,100]];
  const polygon=createPolygon(points,"yellow");
  svg.appendChild(polygon);
});
</script>
<style>
svg{background-Color:lightgray;}
</style>
<svg width=500 height=400 id="svg">
</svg>
```
## 1-4.ポリゴンの辺を線分として分解しておく
3ポイントを結ぶそれぞれを線分の形式に変更しておく
```javascript
points=[[100,200],[300,300],[400,100]];
↓↓↓
lines=[
 {x1:100,y1:200,x2:300,y2:300},
 {x1:300,y1:300,x2:400,y2:100},
 {x1:400,y1:100,x2:100,y2:100}, // 終端から先頭に戻る
 ];
```
上記を関数に起こすとこう
 ```javascript
const createLines=points=>points.reduce((x,y,z,w)=>{
  const nextPoint=w[w.length==z+1?0:z+1];
  const x1=y[0];
  const y1=y[1];
  const x2=nextPoint[0];
  const y2=nextPoint[1];
  return x.concat({x1,y1,x2,y2});
  },[]);
const points=[[100,200],[300,300],[400,100]];
const lines=createLines(points);
console.log(lines);
```
pythonの条件の基本


あまり知らかったが常識として以下をメモしとく
## PythonでのTrue, False
```
print(1==1 or 2==1) #True
print(1==1 or 2!=1) #True
print(1!=1 or 2==1) #False
print(1!=1 or 2!=1) #True

print(True or False)  #True
print(True or True)   #True
print(False or False) #False
print(False or True)  #True

print(True and False)  #False
print(True and True)   #True
print(False and False) #False
print(False and True)  #False
```
OpenELM を簡単に動作させてみる

# 目的
apple の言語モデルが公開された.
ただ sample を動作させ雰囲気を見る.




# machine spec
- mac
    - m1
    - mem: 16GB
- mac
    - i9
    - mem: 32GB
- linux
    - ryzen 1700
    - gpu: gtx 1080, 8GB



# 動作所管
- m1 mac での処理時間はそこそこかかる.  
    - OpenELM-270M-Instruct: 約10秒
    - OpenELM-450M-Instruct: 約20秒
- intel mac 
    - 上記の倍の処理時間
- linux with 1080
    - 約4~7秒
    - 270, 450M, 1B model とも数秒で返る
        - 文章量と所要時間を鑑みると十分な速度と思える
    - 3B model では memory 不足で動作しない

m3, nvidia の高容量memory を積んでいれば高速かつ, 大規模モデルも快適に動かせそう




## 動作結果 sample SS
![スクリーンショット 2024-04-27 22.22.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118627/b1614990-c31e-7401-b6e0-5190ea9a184c.png)

![スクリーンショット 2024-04-27 22.23.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118627/e7f46790-1739-4e88-50f6-a71aca345968.png)




# 使い所
- 現状では, open AI などの api は料金や情報の精査が必用となる
- local や closed で動作できるなら, 上記の制約から開放されるので嬉しい





# setup
## hugging face アカウントを作成， token 作成

以下, アカウント作成の流れがわかる記事 :pray:
https://zenn.dev/protoout/articles/73-hugging-face-setup





## llama の使用申請
https://huggingface.co/meta-llama/Llama-2-7b-hf/tree/main

- 末尾の申請フォームより
- 1~2時間程度で許可された




## install git lfs
```
brew install git-lfs
```

https://git-lfs.com/




## clone repo
```
git clone https://huggingface.co/apple/OpenELM
cd OpenELM
```




## setup
https://huggingface.co/apple/OpenELM#setup
上記内容を実行し、各種 install を行う




## 動作確認
https://huggingface.co/apple/OpenELM#usage

```
prompt='Write a story about Richard Phillips Feynman'


python generate_openelm.py \
    --model apple/OpenELM-270M-Instruct \
    --hf_access_token hf_xxxxxx \
    --prompt "${prompt}" \
    --generate_kwargs repetition_penalty=3.2


python generate_openelm.py \
    --model apple/OpenELM-450M-Instruct \
    --hf_access_token hf_xxxxxxxxxxxx \
    --prompt "${prompt}" \
    --generate_kwargs repetition_penalty=3.2


python generate_openelm.py \
    --model apple/OpenELM-1_1B \
    --hf_access_token hf_xxxxxxxxxxxxx \
    --prompt "${prompt}" \
    --generate_kwargs repetition_penalty=3.2


python generate_openelm.py \
    --model apple/OpenELM-3B-Instruct \
    --hf_access_token hf_xxxxxxxxxxxxxxxxx \
    --prompt "${prompt}" \
    --generate_kwargs repetition_penalty=3.2
```

- access token を書き換える
- 動作すると、何らかの文章が出力される
- model size を変更すると、精度が上がるが処理能力がだいぶ必要となる
    - 線形に増加するだけなら良いが, 実メモリが必要になる
デジタル画像のフォーマット解説：SVG、PNG、JPEGの違いとは？

画像フォーマットの選択はウェブデザインやデジタルコンテンツの品質を大きく左右します。SVG、PNG、JPEGといった主要な画像フォーマットは、それぞれ特有の特性を持ち、使用するシナリオによって最適な選択が異なります。本記事ではこれらのフォーマットの基本的な特徴、利点、適用シナリオについて深掘りし、デジタルコンテンツ制作における適切なフォーマット選択の指南を行います。

# 第1節: SVGフォーマットの基礎知識
### ベクター形式の利点
SVG（Scalable Vector Graphics）は、XMLベースのベクターイメージフォーマットで、拡大や縮小をしても画質が劣化しないことが最大の特長です。この性質は、ロゴやアイコン、図表など、解像度に依存しない清潔感のあるグラフィックが必要な場合に理想的です。

### SVGの主な用途
ウェブデザインにおいてSVGは、ユーザーインターフェースの要素、特にレスポンシブデザインに適しています。また、CSSやJavaScriptと組み合わせることで、動的に色や形を変更するインタラクティブなビジュアルエフェクトを実現できます。

### SVGを使用する際のベストプラクティス
SVGファイルはコードで表現されるため、編集が容易であり、ウェブ上でのロード時間を短縮するためにファイルサイズの最適化が推奨されます。また、アクセシビリティを向上させるために、画像には意味のあるタグやラベルを付けることが大切です。

# 第2節: PNGフォーマットの詳細
### ラスター形式としてのPNG
PNG（Portable Network Graphics）は、ラスターベースの画像フォーマットであり、その透明性のサポートが特徴です。PNGは、色の精度が要求されるデジタルアートやウェブグラフィックに適しており、JPEGよりも圧縮時の画質劣化が少ないです。

### 透明性のサポート
PNG画像は、透明度（アルファチャンネル）を完全にサポートしているため、ロゴやウェブエレメントの背景を透明にして、どんな背景色にも自然に溶け込ませることができます。

### PNGが適しているシナリオ
画質を保ちつつファイルサイズを抑えたいウェブ用画像、透明背景が必要なグラフィック、テキストや線画が含まれるイメージに最適です。高解像度の写真には向かないことが多く、その場合はJPEGが適しています。

# 第3節: JPEGフォーマットの特徴
JPEGの圧縮技術
JPEG（Joint Photographic Experts Group）は、画像を高い圧縮率で保存できるフォーマットです。これにより、大きな画像ファイルでもウェブページのロード速度を遅くすることなく使用できます。ただし、圧縮はロスを伴うため、編集や再保存の過程で画質が低下する可能性があります。

### 画質とファイルサイズのトレードオフ
JPEGは圧縮率を調整することで、画質とファイルサイズのバランスを取ることができます。高い圧縮率を適用すればするほどファイルサイズは小さくなりますが、画像のノイズが増えるため、使用する画像の内容と用途を考慮する必要があります。

### JPEGの適用場面
写真やリアルなアートワークに最適であり、色の豊かさと複雑なディテールを保ちながら、ウェブでの使用に適したファイルサイズを実現できます。ただし、テキストやシャープなエッジが多用される画像には不向きです。

# 第4節: フォーマット選択のガイドライン
### 画像用途に応じたフォーマットの選び方
デジタル画像の用途に応じて最適なフォーマットを選ぶことが重要です。例えば、ウェブサイトのロゴやアイコンにはSVGを、透明背景が必要な画像にはPNGを、高品質の写真にはJPEGを選択します。

### 品質、ファイルサイズ、ローディング速度のバランス
画像の品質を維持しつつ、ウェブサイトのパフォーマンスを最適化するには、画像フォーマットの特性を理解し、適切に選択することがカギです。画像の解像度、圧縮設定、そして必要に応じて画像を最適化することが求められます。

| フォーマット | 特性                        | 透明性のサポート | 圧縮方式      | 主な用途                                                |
|--------------|-----------------------------|----------------|-------------|-------------------------------------------------------|
| SVG          | ベクターベース、スケーラブル | 〇              | ロスレス     | ロゴ、アイコン、図形、ウェブサイトのUI、拡大縮小が頻繁なグラフィック |
| PNG          | ラスターベース              | 〇              | ロスレス     | 透明背景が必要な画像、テキストや細かい線が含まれる画像          |
| JPEG         | ラスターベース              | ×              | ロッシー（圧縮劣化あり） | 写真、リアルなアートワーク、色の豊かな画像             |
Azure Stack HCI 23H2のActive Directory準備ツールの処理内容

# 本記事について
Azure Stack HCI 23H2ではActive Direcotryに専用のOUとユーザーアカウントが必要になります。
このOUとアカウントは手動で作成しておくこともできるのですが、専用の準備ツールがMicrosoftから提供されています。
この記事では準備ツールでおこなっているOUとユーザーアカウントの作成処理について、準備ツールのコードを読み解いていきます。

## 目的
Active Directoryは企業の中でも管理するユーザーが限られていることが多いかと思います。
Azure Stack HCIを導入しようとしている事業部門とAD管理者が異なることもあるでしょう。そんな時に準備ツールの内容を把握しておき説明できればスムーズに導入作業が進められることでしょう。
また、手動で準備する場合にも準備ツールと同様の設定をおこなうために細かな設定内容を把握しておきたいものです。

# 準備ツールの実行について
準備ツールの実行は非常にシンプルです。
まず、準備ツールをPSGalleyからインストールし、以下のようにOU名を指定して実行し、Get-Credentialのポップアップで作成するユーザーアカウント名とパスワードを指定するだけになります。
```
New-HciAdObjectsPreCreation -AzureStackLCMUserCredential (Get-Credential) -AsHciOUName "OU=hci,DC=contoso,DC=local"
```
※上記ではcontoso.localドメインにhciという名前のOUを作成

詳細はAzure Stack HCIのドキュメントを参照しましょう。
[Microsoft Learn | Prepare Active Directory](https://learn.microsoft.com/en-us/azure-stack/hci/deploy/deployment-prep-active-directory)

# 準備ツールの処理
今回確認する準備ツールのバージョンは以下になります。
23H2のリリース以降、準備ツールの処理もAzure Stack HCI側の仕様変更に併せて何度か変更されていますので今後も変更になる可能性があることには注意しましょう。
- 10.2402
[PSGallery | AsHciADArtifactsPreCreationTool](https://www.powershellgallery.com/packages/AsHciADArtifactsPreCreationTool/10.2402)
## 必要なモジュールと前提条件
この準備ツールでは以下3つのモジュールをインポートしています。
Active Direcotryサーバで本準備ツールを実行する場合は、おそらく既にインストールされていることでしょう。
- ActiveDirectory
- GroupPolicy
- Kds

また、本準備ツールを実行するにはOUの作成がおこなえる権限が必要になります。
## 処理
処理は大きく5つに分かれており個別の関数を呼び出しています。
1. Test-AsHciOU
引数に指定したOUの上位のパスが存在することを確認しています。
2. New-AsHciOrganizationalUnit
指定したOUを作成しています。
既に指定のOUがある場合は処理をスキップしています。
3. New-AsHciUser
OU内にユーザーアカウントを作成しています。
ここでも既に同名のユーザーアカウントがある場合は処理をスキップします。
なお、作成するユーザーアカウントのパスワードの有効期限は無期限に設定しています。
4. Grant-HciOuPermissionsToHciLCMUser
作成したOUをスコープとして作成したユーザーアカウントに以下の3種類の権限を割り当てています。
ここが一番の気になるポイントですね。
まず、前提として今回作成しているOUをスコープとして作成したユーザーアカウントに権限を割り当てています。
既存のOUやユーザーアカウントには手を入れません。
- OU内でコンピュータオブジェクトを作成・削除できる権限
- OU内の全オブジェクトのプロパティの読み取り権限
- "msFVE-RecoveryInformation"に対するフルコントロール権限
3つ目のフルコントロール権限についてはBitLockerの暗号鍵へのアクセス権限のようです。
5. Block-GPInheritance
作成したOUに対してグループポリシーの継承をブロックするように設定しています。

# まとめ
準備ツールは非常にシンプルな処理となっていました。
専用のOUの外部には影響しない処理になっていますので安心して利用できるかと思います。
制御系解析・設計における数値計算／数式処理ソフトウェアの活用

https://qiita.com/Carter/items/d6341edf18fe1e0dc4d5

:::note alert
ここでは，

* 川田昌克：[制御系解析・設計における数値計算／数式処理ソフトウェアの活用](https://doi.org/10.11509/isciesci.55.5_159)，システム/制御/情報，Vol. 55，No. 5，pp.159-164 (2011)

に関連して配布するファイルの説明を行います．
:::


<!-- ====================================================== -->
# <font color="#0070C0">配布するファイル</font>
<!-- ====================================================== -->

　「2．LMI に基づく制御理論とその周辺における数値計算ソフトウェアの活用」で掲載している MATLAB ファイルとその説明を行っている PDF ファイルを配布します．

* [matlab01_kawata_utf8.zip](https://github.com/Prof-Carter/iscie_Vol55_No05/blob/main/matlab01_kawata_utf8.zip)
* [doc01_kawata.zip](https://github.com/Prof-Carter/iscie_Vol55_No05/blob/main/doc01_kawata.zip)


<!-- ====================================================== -->
# <font color="#0070C0">一般化制御対象と極配置する円領域</font>
<!-- ====================================================== -->

　詳細を説明した PDF ファイルは

* [plant.pdf](https://github.com/Prof-Carter/iscie_Vol55_No05/blob/main/doc01_kawata/plant.pdf)

からダウンロードしてください．ざっくりとした説明は以下を参照してください．

https://qiita.com/Carter/private/36831a51a1355182a72f

<!-- ====================================================== -->
# <font color="#0070C0">Robust Control Toolbox を利用した LMI の求解</font>
<!-- ====================================================== -->

　詳細を説明した PDF ファイルは

* [sample_lmi_ct.pdf](https://github.com/Prof-Carter/iscie_Vol55_No05/blob/main/doc01_kawata/sample_lmi_ct.pdf)
* [sample_analysis.pdf](https://github.com/Prof-Carter/iscie_Vol55_No05/blob/main/doc01_kawata/sample_analysis.pdf)

からダウンロードしてください．ざっくりとした説明は以下を参照してください．

https://qiita.com/Carter/private/6b0ca18c8da1739dd9ea




<!-- ====================================================== -->
# <font color="#0070C0">LMI パーサ "YALMIP" とフリーの SDP ソルバを利用した LMI の求解</font>
<!-- ====================================================== -->

　詳細を説明した PDF ファイルは

* [sample_yalmip.pdf](https://github.com/Prof-Carter/iscie_Vol55_No05/blob/main/doc01_kawata/sample_yalmip.pdf)
* [sample_analysis.pdf](https://github.com/Prof-Carter/iscie_Vol55_No05/blob/main/doc01_kawata/sample_analysis.pdf)

からダウンロードしてください．ざっくりとした説明は以下を参照してください．

 https://qiita.com/Carter/private/732dbdf180ced22ce8f1

<!-- ====================================================== -->
# <font color="#0070C0">LMI パーサ "CVX" とフリーの SDP ソルバを利用した LMI の求解</font>
<!-- ====================================================== -->

　詳細を説明した PDF ファイルは

* [sample_cvx.pdf](https://github.com/Prof-Carter/iscie_Vol55_No05/blob/main/doc01_kawata/sample_cvx.pdf)

からダウンロードしてください．ざっくりとした説明は以下を参照してください．

 https://qiita.com/Carter/private/8f60bcf58002933e384c
Phi-3-mini-4k-instructをwindows11へ導入した手順書

# はじめに
この記事は、Phi-3をローカル環境で使用するために、行った手順を記録したものです。インストールしたPhi-3は以下のPhi-3 Mini-4K-Instructとなります。

https://huggingface.co/microsoft/Phi-3-mini-4k-instruct

# 準備
## 管理フォルダを作成
ダウンロードのフォルダの中に、"textAI"というフォルダを作成する（フォルダ名は何でもよい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/08961363-ca98-d324-bcd7-b68e0484180b.png)

## ソースコードを記述（コピーだけでよい）
"Sample inference code"という項目があるので、そこにあるソースコードをコピーして、張り付けるだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/7f39baff-4f82-577a-e03b-0e9e194f6d34.png)

ソースコードを保存して、実行するだけ（ファイル名は拡張子が".py"であればなんでもよい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/d452afd8-af3c-5c3d-7b8a-22fc3849ceb7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/39c52e7c-d616-703a-77d3-844881596f9a.png)

## 実行
プログラムにあるmessagesに質問したい内容を入力して、実行すれば、その質問に対する回答をphi-3がしてくれる。
```python:例
messages = [
    {"role": "system", "content": "You are a helpful digital assistant. Please provide safe, ethical and accurate information to the user."},
    {"role": "user", "content": "ごはんのおかずを教えて?"},
]
```

コマンドプロンプトまたはPowerShell上で、実行するだけ。

```:回答例
ごはんのおかずについて、安全で倫理的な情報を提供します。ごはんのおかずは多岐にわたりますが、以下にいくつかの代表的なおかずを紹介します。

1. 味噌漬物 (Miso pickles): 野菜や海藻を味噌で漬けたもので、健康的な代替食材として推奨されます。
2. 天ぷら (Tempura): 海老、野菜、その他の食材を衣にくぐらせて衣を取り除き、揚げた料理です。
3. おにぎり (Onigiri): ご飯を中心にした塩味の具材を包み、簡単で健康的なおかずです。
4. 刺身 (Sashimi): 新鮮な魚介類を細切りにして食べる料理で、栄養価が高いですが、生の魚介類を使用する場合は、その魚の排水 量に注意してください。
5. 刺身寿司 (Sushi): 魚介類を酢飯で包んだ料理で、健康的で美味しいですが、魚介類の排水量に注意してください。

これらのおかずは、食事のバランスを考慮して、適量を摂ることをお勧めします。また、食材の調理
```
あとはこのソースコードの内容をもとに、作りたいサービスに適応するだけのはず。


**参考画像**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/38c3ab2f-9b21-994a-8082-7532daed5748.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/f21830dc-0f84-6940-f460-7d8ef610778a.png)
GPUはフルマックスで使用されています。実行してすぐ回答を得られるだけのスペックにないことや回答される量によると思いますが、ある程度時間が必要です。

# その他
## エラー
参考に載せているだけ。

```:エラーの内容
AssertionError: Torch not compiled with CUDA enabled
```
以下の記事の解決方法を実行したら、エラーなく、実行することができた。

https://qiita.com/sakusaku3939/items/1a133729c7f38e8403ce


## CUDAが利用可能の状態になっているかを確認するコード
```python
import torch

# CUDAが利用可能かどうかを確認
cuda_available = torch.cuda.is_available()

if cuda_available:
    print("CUDAが利用可能です。")
    # 利用可能なCUDAデバイスの数を表示
    print("利用可能なCUDAデバイスの数:", torch.cuda.device_count())
    # 利用可能なCUDAデバイスの名前を表示
    print("利用可能なCUDAデバイスの名前:", torch.cuda.get_device_name(0))
else:
    print("CUDAは利用できません。")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3079289/a6acfc51-3fd8-5c1d-cc15-a5ffb504ddb8.png)

## スペック
OS：Windows11
プロセッサ：AMD Ryzen 5 4500 6-Core Processor 3.60 GHz
RAM：32.0GB
システムの種類：64 ビット オペレーティング システム、x64 ベース プロセッサ
グラフィックボード：NVIDIA GeForce RTX 4060 8.0GB
pythonバージョン：Python 3.10.6

## Phi-3

https://huggingface.co/collections/microsoft/phi-3-6626e15e9585a200d2d761e3
LLaMa-3をAPIサーバーのように使う方法

# 結論
[ollama](https://github.com/ollama/ollama)というツールを使ってLLaMa-3を立ち上げると、REST APIサーバーお自動的に立ち上がる。

# REST APIサーバーの立ち上げ方
環境 : linux (インストール方法は環境に依存。詳しくは参考サイト）

##  ollamaをインストール
```
curl -fsSL https://ollama.com/install.sh | sh
```

## LlaMa-3を動かす
```
ollama run llama3
```

実は、これでREST APIサーバーが自動的に立ち上がります。
LLaMa-3以外にも色々なモデルを動かすことができるみたいです。
| Model               | Parameters | Size | Download                      |
|---------------------|------------|------|-------------------------------|
| Llama 3             | 8B         | 4.7GB| `ollama run llama3`           |
| Llama 3             | 70B        | 40GB | `ollama run llama3:70b`       |
| Phi-3               | 3.8B       | 2.3GB| `ollama run phi3`             |
| Mistral             | 7B         | 4.1GB| `ollama run mistral`          |
| Neural Chat         | 7B         | 4.1GB| `ollama run neural-chat`      |
| Starling            | 7B         | 4.1GB| `ollama run starling-lm`      |
| Code Llama          | 7B         | 3.8GB| `ollama run codellama`        |
| Llama 2 Uncensored  | 7B         | 3.8GB| `ollama run llama2-uncensored`|
| LLaVA               | 7B         | 4.5GB| `ollama run llava`            |
| Gemma               | 2B         | 1.4GB| `ollama run gemma:2b`         |
| Gemma               | 7B         | 4.8GB| `ollama run gemma:7b`         |
| Solar               | 10.7B      | 6.1GB| `ollama run solar`            |

### サーバーにアクセス

### Generate Mode
```
curl http://localhost:11434/api/generate -d '{
  "model": "llama3",
  "prompt":"Why is the sky blue?"
}'
```
### Chat Mode
```
curl http://localhost:11434/api/chat -d '{
  "model": "llama3",
  "messages": [
    { "role": "user", "content": "why is the sky blue?" }
  ]
}'
```

# 参考
1. [ollama](https://github.com/ollama/ollama)
1. [ollama-API](https://github.com/ollama/ollama/blob/main/docs/api.md#generate-a-completion)
Material Design In XAML Toolkit 4.9→5.0 バージョンアップ時のエラーと解決策

2024年3月に Material Design In XAML Toolkit のバージョンが 4.9 から 5.0 にアップされました。

そこで、Nuget経由で 4.9から5.0にバージョンしたところ、エラーが発生しました。

2024年4月現在において、公式サイトの情報が 5.0 に追い付いていないため、備忘録を兼ねて原因と解決策について記載しておきます。


## エラー１．'materialdesigntheme.defaults.xaml' を検索できません。
バージョンアップ後にビルドすると、次のエラーが発生します。

`
 IOException: リソース 'themes/materialdesigntheme.defaults.xaml' を検索できません。
`

### 【原因】
これは、materialdesigntheme　というリソースディクショナリが廃止されたことによります。

App.xaml の MaterialDesign2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775985/23ef51cc-aa2f-4829-630b-805674ff023a.png)

### 【解決策】

1. 赤枠の"MaterialDesignTheme" を "MaterialDesign2" 又MaterialDesign3" に書き換え
1. 「ソリューションのクリーン」を実行
1. 「ソリューションのリビルド」を実行

## エラー２．MaterialDesignThemes の 5.0.0 から 4.9.0 へのパッケージ ダウングレードが検出されました

MaterialDesignThemesの古いバージョンを使っているプロジェクトを参照していると、次のエラーが発生する場合があります。

`
NU1605	エラーとして警告: MaterialDesignThemes の 5.0.0 から 4.9.0 へのパッケージ ダウングレードが検出されました。別のバージョンを選択するには、プロジェクトから直接パッケージを参照してください
`


### 【原因】
プロジェクトファイル(*.csproj) に記載されたMaterialDesignThemesのバージョンが古いままになっていると、このエラーが発生します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775985/b3e85ada-4e0e-92a3-65b2-dcae66110385.png)

### 【解決策】
1. プロジェクトファイルの赤枠の部分"Version="4.9.0" を Version="5.0.0" に書き換え
1. 「ソリューションのクリーン」を実行
1. 「ソリューションのリビルド」を実行


## （参考）MaterialDesignInXAML 4.9から5.0への移行ガイド

4.9から5.0 にバージョンアップしたことによる変更点が公式サイトに記載されています。

[Material Design In XAML Toolkit 5.0 移行ガイド](https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit/discussions/3466)

 以下は、公式サイトから抜粋したものを日本語に訳したものです。
- アイコン生成時の透明色対応
- ExpanderAssistクラスに新オプション追加
- TextBoxにAutoSuggestion機能追加
- マルチセレクトTreeViewの新機能
- Chipテンプレートのバグ修正
- ライブラリから"Accent"の使用をすべて削除
- SplitButtonでPopupBoxを利用
- RichTextBoxでTextFieldAssist.HasClearButtonをサポート
- FlipperControlの追加
- md3ガイドラインのためのスライダーテーマ作成
- 値を丸めるコンバーターの修正

## まとめ
Material Design In XAML Toolkit は頻繁にバージョンアップされており、4.9 から 5.0 にバージョンアップすると、エラーが発生する場合があります。

いずれもエラーが発生する部分を書き換えてあげれば解決しますが、書き換えた後はプロジェクトのクリーンを行ってから、リビルドするようにしてください。

material designの使い方について詳しく知りたい方は、下記の記事が参考になります。

[【WPF】material designとC#で作るモダンUI入門](https://resanaplaza.com/2024/03/31/%e3%80%90stable-diffusion%e3%80%91stability-matrix-%e3%81%a7%e7%94%bb%e5%83%8f%e7%94%9f%e6%88%90ai%e3%82%92%e7%b0%a1%e5%8d%98%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%ef%bc%88%e3%83%a2/)
Xcode ショートカットキー

`command + r`
シュミレータを再生

`command + .`
シュミレータを停止

`command + b`
ビルド　（エラーがないかチェック）

`command + shift + K`
プロジェクトをクリーン（フレームワークがおかしいとき、なんかおかしいとき）

`control + i`
インデントを揃える

`command + /`
コメントアウトしたいとき

`command + option + control + enter`
ストーリーボードとそれに紐付いているコードをに分割表示する

`command + shift + F`
プロジェクト内検索

`command + control + e`
同一のコードを一斉に編集できる

`command + shift + option + K`
Derived Dataも含めてプロジェクトをクリーンする　（Derived Data：ビルド時の情報が入っているファイル）

`command + shift + Y`
Debug Area（下側）の表示・非表示

`command + 0`
Navigator Area（左側）の表示・非表示

`command + option + 0`
Utilities Area（右側）ほ表示・非表示

`command + 1,2,3,4,5,,6,7,8,9`
Navigator Areaの切り替え（左から1,2,3,…）

`command + shift + [ or ]`
タブの移動

`command + control. +  ← or →`
開いていたファイルに戻る・進む

`command + shift + L`
Objects Windowを開く

`command + option + ¥`
ブレークポイントをつける・消す（シュミレータがブレークポイントに達すると停止する）

`command + shift + O`
プロジェクト内検索

`command + control + j`
関数や変数を使っているところに飛ぶ

`command + option +  ← or →`
リボン機能（コードをしまう、非表示にする）

`command + control + Y`
ブレークポイントで停止したシュミレータを再開する

`F6`
ブレークポイントから一行ずつ実行させる

`F7`
関数に飛ぶ→次の一行を実行→関数に飛ぶ・・・の繰り返し

`command + shift + option + L`
Objects Windowを表示して固定する

`command + , (カンマ)`
設定画面を表示（どのアプリでも可能）

`option + ドラッグ`
複数のカーソルで一斉に編集

`command + L`
任意の行にジャンプ

`command + shift + ;`
コードを拡大

`command + -`
コードを縮小

`command + 0`
コードを最初の大きさに戻す

`command + shift + K`
シュミレータとMacのキーボどの切り替え

`command + S`
シュミレータのスクリーンショットを撮る

`command + ← or →`
シュミレータの画面を回転

`command + shift + H`
シュミレータのホーム画面に移動

`command + HH`
シュミレータでマルチタスクを表示
C言語 (GCC) で配列の配置先を切り替えて実行可能にする

# 実行できない配列

例として、x86_64 で第1引数と第2引数の値の和を返すプログラムを用意する。

```
89 f8    mov eax, edi
01 f0    add eax, esi
c3       ret
```

これを呼び出すプログラムを用意する。

:::note info
このようにデータへのポインタを関数ポインタに変換するのはC言語の規格には違反するみたいだけど、目をつぶってね…
:::

```c
#include <stdio.h>

unsigned char program[] = {0x89, 0xf8, 0x01, 0xf0, 0xc3};

int main(void) {
	int (*add)(int, int) = (void*)program;
	printf("%d\n", add(40, 2));
	return 0;
}
```

しかし、これを実行するとエラーになってしまった。

[yUZ7Mw - Online C Compiler & Debugging Tool - Ideone.com](https://ideone.com/yUZ7Mw)

これは、メモリ上でデータを格納する領域とプログラムを格納する領域が分かれており、データを格納する領域にあるデータをプログラムとして実行しようとするとエラーとして落とす設定になっているからであると考えられる。

# 実行できる配列

GCC では、`section` 属性を用いることで、変数を配置するセクションを指定できる。

[Common Variable Attributes (Using the GNU Compiler Collection (GCC))](https://gcc.gnu.org/onlinedocs/gcc-13.2.0/gcc/Common-Variable-Attributes.html#index-section-variable-attribute)

これを用いてプログラムを格納した配列をプログラムを格納する領域 (`.text` セクション) に配置することで、配列に格納したプログラムを実行できるようになる (ことがある)。

```c
#include <stdio.h>

__attribute__ ((section (".text")))
unsigned char program[] = {0x89, 0xf8, 0x01, 0xf0, 0xc3};

int main(void) {
	int (*add)(int, int) = (void*)program;
	printf("%d\n", add(40, 2));
	return 0;
}
```

[XUDB3j - Online C Compiler & Debugging Tool - Ideone.com](https://ideone.com/XUDB3j)

ただし、プログラムを格納する領域への書き込みは許可されておらず、プログラムを格納する領域に配置した配列の要素への代入はエラーの原因となる。

```c
#include <stdio.h>

__attribute__ ((section (".text")))
unsigned char program[] = {0x89, 0xf8, 0x01, 0xf0, 0x83, 0xc0, 0x01, 0xc3};

int main(void) {
	int (*add)(int, int) = (void*)program;
	program[6] = 0x2; /* エラー */
	printf("%d\n", add(40, 2));
	return 0;
}
```

さらに、この方法を応用し、`main` 関数を配列として記述することも可能である。

```c
__attribute__ ((section (".text")))
char main[] = "H\xb8orld\n\0\0\0PH\xb8hello, wP\xb8\x01\0\0\0\x89\xc7H\x89\xe6\xba\r\0\0\0\x0f\x05H\x83\xc4\0201\xc0\xc3";
```

[L54eSJ - Online C Compiler & Debugging Tool - Ideone.com](https://ideone.com/L54eSJ)

<details><summary>アセンブリソース</summary>

```nasm
bits 64

	mov rax, 0x0a646c726f
	push rax
	mov rax, 0x77202c6f6c6c6568
	push rax
	mov eax, 1
	mov edi, eax
	mov rsi, rsp
	mov edx, 13
	syscall
	add rsp, 16
	xor eax, eax
	ret
```

</details>
レコードタイプとページレイアウトによる項目の表示制御

## はじめに
ページレイアウトやレコードタイプはSalesforceの基本の1つです。しかし、実際に実装してみると意外と難しいものです。
今回は、Salesforceビギナーの私が初めて要件に沿ってレコードタイプとページレイアウトによる項目の表示制御を設定した時のお話をしたいと思います。

## 要件
今回は、取引先周辺の実装にフォーカスしていきます。
頂いた要件は下記です。
1. A社のSalesforceにB社も追加したい
2. 取引先については、お互いのレコードを参照可能
3. 各社に専用項目があり、A社ユーザーがB社のレコードを参照した場合はB社専用項目が表示されない
4. 専用項目の中には、別会社ユーザーの画面に表示されないが、レポートには表示される項目がある
5. 両社のレコードが参照可能なユーザーも存在する 

この要件を実現するためには、主にプロファイル、項目レベルセキュリティ、レコードタイプ、ページレイアウトを設定する必要があります。
1つずつ見ていきましょう。

## プロファイル
まず、A社とB社が同じ組織に所属しながら異なる権限を持つためには、プロファイルを分ける必要があります。また、両社のレコードを参照可能なユーザーにも別のプロファイルが必要です。
A社用プロファイル、B社用プロファイル、両社参照可能なユーザー用のプロファイルを用意しましょう。

## 項目レベルセキュリティ
レポートへの表示有無は、項目レベルセキュリティで制御する必要があります。
ページレイアウトへの表示有無は、後述するページレイアウトで設定します。
具体的な設定値は下記になります。
- A社のページレイアウトには表示しないが、レポートには表示するB社専用項目
　→A社のプロファイルに対して有効
 <br>
 
- A社のページレイアウトにもレポートにも表示しないB社専用項目
 　→A社のプロファイルに対して無効

※A社専用項目についても同様

また、両社のレコードが参照可能なプロファイルに対しての設定は、いずれの項目も有効に設定します。


## レポートタイプ
取引先のレポートタイプはA社用とB社用の2つを用意します。

## ページレイアウト
ページレイアウトは、各レポートタイプに2つずつ作成する必要があります。
各ページレイアウトの詳細は下記になります。

- A社ユーザー用のA社ページレイアウト
使用ユーザー：A社ユーザー
取引先：A社の取引先
A社専用項目：配置する
B社専用項目：配置しない
有効にするレポートタイプ：A社用
有効にするプロファイル：A社プロファイル、両社のレコードが参照可能なプロファイル
 <br>
 
- A社ユーザー用のB社ページレイアウト
使用ユーザー：A社ユーザー
取引先：B社の取引先
A社専用項目：配置しない
B社専用項目：配置しない
有効にするレコードタイプ：B社用
有効にするプロファイル：A社プロファイル
 <br>
 
- B社ユーザー用のA社ページレイアウト
使用ユーザー：B社ユーザー
取引先：A社の取引先
A社専用項目：配置しない
B社専用項目：配置しない
有効にするレポートタイプ：A社用
有効にするプロファイル：B社プロファイル
 <br>
 
- B社ユーザー用のB社ページレイアウト
使用ユーザー：A社ユーザー
取引先：B社の取引先
A社専用項目：配置しない
B社専用項目：配置する
有効にするレコードタイプ：B社用
有効にするプロファイル：A社プロファイル、両社のレコードが参照可能なプロファイル

## おわりに
今回の要件のようにユーザーの所属によって項目の表示制御をするためには、プロファイル、項目レベルセキュリティ、レコードタイプ、ページレイアウトを駆使して実装します。関与する機能が多い分最初は難しいですが、コツを掴めば複雑な表示制御も実現可能にする便利な武器になってくれそうです。
久しぶりに個人開発してみました！

歴史上の人物とチャットできたらいいなと思った人いますか？

そんな夢を叶えてくれるサイトを作りました。
https://type-writer.work/

下記のような歴史上の人物とLine風のチャットで話ができます！
・織田信長
・羽柴秀吉
・沖田総司
・クレオパトラ
・楊貴妃
・小野小町

中身はChatGPTのAPIを使っています！

Laravelを使ってサクッと作ってみました。
ぜひ使ってみてください。
Windowsでターミナルを起動しないCrystalの実行ファイルを作成する

## 要約

Windowsでターミナルを表示しない実行ファイルを作るには、ビルドオプションに `--link-flags=/SUBSYSTEM:WINDOWS` を指定すればよい。

## はじめに

Crystal言語はRubyによくにた文法のプログラミング言語である。
最近Windows対応が進められている。

## 解決したい課題

Crystalコミュニティは比較的小規模であるため、WindowsでCrystalを使うよい方法はあまり確立されていない。しかし、将来的にはGUIを持つ小規模なアプリをCrystalで書けるようになると考えられる。

しかし現状では、実行ファイルを起動すると、必ずターミナルが起動する。GUIアプリではこれは不要である。そこで crystal の issue を探していたところ次のissueを見つけた。

https://github.com/crystal-lang/crystal/issues/13058

## 結論

いろいろ難しいことが書いてあるが、結論としては

`--link-flags=/SUBSYSTEM:WINDOWS`

をビルドオプションにつけるだけでよい。

```
crystal build --link-flags=/SUBSYSTEM:WINDOWS a.cr
```

この記事は以上です。
改行が消えた？！ noteエディタ回避法

noteエディタをつかうと改行が消える場合がある。
回避方法を考えてみた。

## noteの不具合

ブログサイト **noteでもmermaid記法** で書くことができる。

**例**
```mermaid :書き方
```mermaid
%%{init:
    {  "pie": {"textPosition": 0.5},
       "themeVariables": {"pieOuterStrokeWidth": "5px"}
    }
}%%
	pie showData
	title 成分表
	"Calcium" : 42.96
	"Potassium" : 50.05
	"Magnesium" : 10.01
	"Iron" : 5
```

ところが「コードブロック内で、さらにコードブロックを」という例のない特殊な仕様から、思わぬトラブルになることがある。

私はSafariブラウザ（iPadOS 17.4.1）上でnoteエディタを使っているのだが、編集中にコードブロックを取り消すと``````(6個のバック-シングル-クオート)が重なり「Syntax error in text」になることが頻発した。

さらにこのとき、iPhone,iPadからだと文字化けも起きた。
より具体的には **「改行が消える」**。

このため再度コードブロックを指定（行頭に```を入力）しても、円グラフはそもそもエラーすら表示されなくなる。

<iframe src="https://player.vimeo.com/video/939163659?h=d56f8f0cd2" width="640" height="564" frameborder="0" allow="autoplay; fullscreen" allowfullscreen></iframe>

**悪い冗談のような仕様** だが問い合わせたところ、このことはヘルプに記載されているとの回答だった。

運営では再現せず利用者の操作ミスになっている。ＯＳ（operating system:オペレーティングシステム）があつかう改行コード（LF or CRLF）の違いによるものだと思ったのだが、AndroidやWindows、あるいはどこか矛盾した話ではあるが**アプリでは起きない**ことなのかもしれない。

パソコンがなく私にも解らなかった。なによりそんなヘルプみたことない。いや、大急ぎで今ごろつくっているかもだから、それはそれとして回避方法がないか募集してみた。

## 回避方法

正直、回避方法はない。

ただ1件、聞くところによると「改行で文字が消える謎の字数制限があるようだからインデントをやめて、```（シングル-バッククォート）も~~~（チルダ）に替えてみては？」とのアイデアを頂いた。

```mermaid :回避方法
~~~mermaid
%%{init: 
 { "pie": {"textPosition": 0.5},
  "themeVariables": {"pieOuterStrokeWidth": "5px"}
 }
}%%
 pie showData
 title 成分表
 "Calcium" : 42.96
 "Potassium" : 50.05
 "Magnesium" : 10.01
 "Iron" : 5
~~~
```

改行キーで文字が消えたり、バックスペースで改行が消えたり、このajaxオブジェクトはどこかおかしい。ということはよく考えてみるとやっぱダメじゃん？