OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Direct Connect 提供方法

:::note info
AWS Direct Connect 経由での S3 への接続方法に注意が必要だったので、
ここにDirect Connect の提供方法を含めた情報を記載します。
:::
:::note warn
ホスト型接続は提供事業者によっては、パブリックVIFの提供がない場合がある。
:::
:::note alert
パブリックVIFの提供がない場合、S3等、AWSパブリックサービスへのオンプレミスからの接続には、パブリックVIFを使用しない接続方法が必要。
:::

# ■ 仮想インターフェイスの違い
##### ・プライベート仮想インターフェイスとパブリック仮想インターフェイス
| 仮想インターフェイスの種類 | 説明 |
|:-:|:-:|
| プライベート仮想インターフェイス（Private VIF）  | オンプレミス環境からAWSのVPC内リソース（例: EC2、RDS）へのアクセスを提供。プライベートIPアドレスを使用して通信を行う。  |
| パブリック仮想インターフェイス（Public VIF）  | オンプレミス環境からAWSのパブリックサービス（例: S3、DynamoDB）のパブリックエンドポイントへのアクセスを提供。パブリックIPアドレスを使用して通信を行う。  |

![What is AWS Direct Connect?](https://docs.aws.amazon.com/images/directconnect/latest/UserGuide/images/dx-vifs.png "What is AWS Direct Connect?")
> 出典：[What is AWS Direct Connect?](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html)

# ■ Direct Connectの接続方法
##### ・専用接続とホスト型接続
| 接続方法 | 説明 | 仮想インターフェイスの提供方法 |
|:-:|:-:|:-:|
| 専用接続（Dedicated Connection）  | AWSが提供する専用の物理ポートを使用して、1Gbps、10Gbps、または100Gbpsの帯域幅で直接接続。1つの接続で複数のVIFを作成可能。  | プライベートVIFとパブリックVIFの両方を作成可能。  |
| ホスト型接続（Hosted Connection）  | AWS Direct Connectパートナーが提供する共有帯域を利用し、50Mbpsから10Gbpsまでの帯域幅で接続。各接続は1つのVIFに対応。  | プライベートVIFとパブリックVIFの提供可否は、パートナーのサービス内容による。  |

###### ・専用接続
![専用接続](https://atbex.attokyo.co.jp/files/news2/Blog/AWS_Direct_Connect_KIMURA/senyousetsuzoku.png)
###### ・ホスト型接続
![ホスト型接続](https://atbex.attokyo.co.jp/files/news2/Blog/AWS_Direct_Connect_KIMURA/hostsetsuzoku.png)

> 出典：[【保存版】AWS Direct Connectとは？概要やVPNとの違い、接続タイプについて詳しく解説！](https://atbex.attokyo.co.jp/blog/detail/9/?utm_source=chatgpt.com)

# ■パブリック仮想インターフェイスの提供状況
:::note info
ホスト型接続を提供する事業者の中には、セキュリティや運用上の理由から、プライベート仮想インターフェイスのみを提供し、パブリック仮想インターフェイスを提供しない場合がある。

そのため、オンプレミス環境からAWSのパブリックサービス（例: S3）にアクセスする必要がある場合、以下の点を考慮することが重要。

* 事業者のサービス内容の確認: 利用予定の事業者がパブリックVIFを提供しているか事前に確認。

* 代替手段の検討: パブリックVIFが利用できない場合、VPN接続やインターネット経由でのアクセス、またはプロキシサーバの設定など、他の方法でAWSパブリックサービスへのアクセスを確保する必要がある。
:::
:::note warn
具体的な提供状況やサービス内容は事業者によって異なるため、詳細は各事業者の公式情報やサポート窓口に問い合わせが必要。
:::
Azure Functions blob trigger|bindings を使って MarkItDown


MarkItDown そのものの解説や、Http Trigger や PowerApps 経由での利用例は下記が参考になります。

https://qiita.com/Leapcell/items/c8787a267dd3a262fce8

https://qiita.com/DEmodoriGatsuO/items/3b0fa7885ebae9e1c881

https://qiita.com/reire/items/bc2243e53dc5e0d502e0

この記事では、[Azure Functions Azure Blob Storage のバインドとトリガー](https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-storage-blob?tabs=isolated-process%2Cextensionv5%2Cextensionv3&pivots=programming-language-python) を用いて `MarkItDown` を動かしてみました。

# 作ったもの

https://github.com/georgeOsdDev/markitdownAzureFunction/tree/main

# はまったところ

`MarkItDown` そのものとはあまり関係ない部分もあるけどはまったところ

## 保存時のblobnameの指定

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-storage-blob-output?tabs=python-v2%2Cisolated-process%2Cnodejs-v4&pivots=programming-language-python#usage

> 使用法
> 関数のパラメーターを次の型で宣言し、BLOB ストレージに書き込むことができます。
> 
> func.Out[str] は文字列
> func.Out[func.InputStream] はストリーム
> 詳細については、「出力 - 例」を参照してください。

このとき例では
```python:sample.py
@app.blob_output(arg_name="outputblob",
                path="newblob/test.txt",
                connection="<BLOB_CONNECTION_SETTING>")
```

となっており、blob 名が固定となっている。
どうしたものかと色々試した結果、trigger 側の blob 名をパターン指定することで取ってこれるらしい。
すなわち、以下のアノテーションとすることで、`input/test.docx`で関数がトリガーされた結果、`output/test.docx.md`　として保存することができる。

```python:function_app.py
@app.blob_trigger(
    arg_name="input", path="input/{blobname}", connection="markitdown_blobstorage"
)
@app.blob_output(arg_name="outputblob", path="output/{blobname}.md", connection="markitdown_blobstorage")
```

## 変換できるファイルが限られている模様

OpenAI を使うのは画像系ファイルの場合[`".jpg", ".jpeg", ".png"`](https://github.com/microsoft/markitdown/blob/main/src/markitdown/_markitdown.py#L1004) に限られていたり、
何でもかんでも対応しているわけではないっぽくて、拡張子を見て（あるいは [mimetypes.guess_type](https://github.com/microsoft/markitdown/blob/main/src/markitdown/_markitdown.py#L166-L169)して）変換している様子



そのため、以下のようにした。

```python:function_app.py
default_supported_extensions = (
    '.pptx', '.docx', '.xlsx', '.pdf', '.csv', '.zip', '.html', '.htm'
    # ".xml", ".rss", ".atom",'.ipynb', // not working
)
llm_supported_image_extensions = ('.jpg', '.jpeg', '.png')

use_llm = True if os.environ.get('markitdown_azureopenai_key') else False
if use_llm:
    # create an instance of the AzureOpenAI class
    client = AzureOpenAI(
        azure_endpoint=os.environ.get('markitdown_azureopenai_endpoint'),
        api_key=os.environ.get('markitdown_azureopenai_key'),
        api_version=os.environ.get('markitdown_azureopenai_apiversion'),
    )
    md = MarkItDown(llm_client=client, llm_model="gpt-4o")
    supported_extensions = default_supported_extensions + llm_supported_image_extensions
else:
    md = MarkItDown()
    supported_extensions = default_supported_extensions
```
【C#】地味に便利な機能まとめ

## はじめに
C#には普段何気なく使っている便利な機能がたくさんあります。この記事では、日々の開発で役立つ地味だけど便利な機能をまとめてみました。

以下で紹介した内容と重なる機能もあるかもですが、個人にはスニペット（Tab補完）機能は好きでかなり使っているので、それらも入れて改めてまとめました。

https://qiita.com/Sakai_path/items/5cdbf0c3690d4c8a9d07


## コード入力支援機能

Visual Studioなどのエディタで利用できる入力支援機能です。

### スニペット（Tab補完）機能

```csharp
// if + Tab + Tab で展開
if (condition)
{
    
}

// ctor + Tab + Tab でコンストラクタ
public ClassName()
{
    
}

// prop + Tab + Tab でプロパティ
public Type PropertyName { get; set; }

// propfull + Tab + Tab で完全なプロパティ
private Type propertyName;
public Type PropertyName
{
    get { return propertyName; }
    set { propertyName = value; }
}
```

## 便利な構文機能

### null関連の機能

```csharp
// nullチェック付き代入（null合体演算子）
string value = someString ?? "デフォルト値";

// null条件演算子
int? length = someString?.Length;
```

### switch式
```csharp
string message = value switch
{
    0 => "ゼロです",
    1 => "イチです",
    _ => "その他です"
};
```

### using宣言
```csharp
// 自動でDisposeされる
using var reader = new StreamReader(path);
```

### 文字列補間
```csharp
string name = "World";
Console.WriteLine($"Hello, {name}!");
```

## 地味だけど役立つ機能たち

### default式の型推論
```csharp
// 型指定が不要になり、コードがスッキリ
Dictionary<string, List<int>> dict = default;
```

### 配列初期化の省略記法
```csharp
// 型指定が不要
var array = new[] { 1, 2, 3 };
```

### out変数の宣言
```csharp
// 従来の書き方
int number;
if (int.TryParse("123", out number)) { }

// C# 7.0以降
if (int.TryParse("123", out int number)) { }
```

### タプル構文
```csharp
(string name, int age) GetPerson()
{
    return ("John", 30); // 明示的なタプル作成が不要
}
```

### オーバーフロー制御
```csharp
// オーバーフローを検出する
checked
{
    int result = Int32.MaxValue + 1; // OverflowExceptionが発生
}
// オーバーフローを無視する
unchecked
{
    int result = Int32.MaxValue + 1; // オーバーフローを許可
}
```

### イニシャライザでのプロパティ設定
```csharp
var person = new Person 
{
    Name = "John",
    Age = 30
}; // コンストラクタを作らなくても初期化できる
```

### プロパティの必須化

```csharp
// オブジェクト初期化時に必須プロパティを強制
public class Employee
{
    public required string Name { get; init; }
    public required int EmployeeId { get; init; }
}
```

### パターンマッチングでのwhen
```csharp
if (obj is string str when str.Length > 5)
{
    // 型チェックと条件チェックを1行で
}
```

### スレッドセーフなシングルトン
```csharp
private static readonly Lazy<MyClass> _instance = 
    new Lazy<MyClass>(() => new MyClass());
```

### 名前付き引数
```csharp
// パラメータの順序を気にせず指定可能
Calculate(height: 180, weight: 70);
```

### 部分的なusing
```csharp
using static System.Math; // Mathのメソッドを直接使える
var result = Sqrt(16); // Math.Sqrt()と書かなくて良い
```

### 破棄パターン
```csharp
var (first, _, third) = tuple; // 不要な値を破棄できる
```

## まとめ

この記事で紹介した機能は、C#の基本的な機能の一部ですが、適切に使用することでコードの可読性と保守性を向上させることができます。日々の開発で取り入れていただければ嬉しいです。

## 参考
- [C# Documentation](https://docs.microsoft.com/ja-jp/dotnet/csharp/)
- [C# Language Reference](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/)
TailwindでもSubgridを使ってみたい

## はじめに

CSSのSubgridは2019年に全主要ブラウザへの対応が完了し、TailwindCSSはv3.4系のリリースで対応が完了しました。
改めて使いたい場面や使い方を整理したいと思ったのでまとめています。


【参考】

https://caniuse.com/?search=subgrid

https://tailwindcss.com/blog/tailwindcss-v3-4


## Subgridとは:thinking:

CSS Gridでは親要素（グリッドコンテナ）と子要素のレイアウトはそれぞれ独立したルールになります。
しかし、subgridを使うと、**子要素が親要素のルールを引き継ぐ**ことができます！

例えば、親要素が3つの列を持っている場合、子要素もその列にピッタリ合わせることができます。

### どんなときに使う？

- **親子関で整ったレイアウトを作りたいとき**
- **親と子で同じ列幅や配置を使いたいとき**
- **コードをシンプルにしたいとき**

文章で書いてもわかりにくいので、実際のコードを元に説明します。

## 実際に書いてみよう:writing_hand:

### SubGridを使わなかった場合

```html
<div class="grid grid-cols-3 gap-4">
  <!-- カード -->
  <div class="grid gap-3">
    <h2 class="text-xl font-bold">見出し</h2>
    <div class="h-24 bg-slate-100"></div>
    <p>説明文が入ります</p>
    <button>ボタン</button>
  </div>
  <!-- カードここまで -->
</div>

<!-- ※本筋と関係のないスタイルは除外しています -->
```


![スクリーンショット 2024-12-29 8.44.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545547/eba2df7d-8bac-d40d-a571-c466ac98b6b5.png)


この場合下記のような問題点があります。
- 見出しが2行になると水平ラインがズレる
- 説明文が2行になると水平ラインがズレる

このように、コンテンツの内容が異なる場合でもラインを揃えたい場合があります。
今まではJavaScriptなどを利用していましたが、subgridを利用すればCSSだけで解決できるようになりました！



### SubGridを使った場合

```html
<div class="grid grid-cols-3 gap-4">
  <!-- カード -->
  <div class="row-span-4 grid grid-rows-subgrid gap-3">
    <h2 class="text-xl font-bold">見出し</h2>
    <div class="h-24 bg-slate-100"></div>
    <p>説明文が入ります</p>
    <button>ボタン</button>
  </div>
  <!-- カードここまで -->
</div>
```

![スクリーンショット 2024-12-29 8.45.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545547/ca72d376-fc45-8e74-43f7-c1d3455835ae.png)

内部コンテンツの高さがバラバラでも、高さが揃うようになりました！

追加したクラスについての説明は下記です。
- `grid-rows-subgrid`: `grid-template-rows: subgrid;`
    - 子要素にsubgridを適応します
    - 親要素の行と揃えることができます
        - 列方向に揃えたい場合は`grid-cols-subgrid`を適応します
- `row-span-4`: `grid-row: span 4 / span 4;`
    - 親要素の4行分を使うことを示します
        - 今回は「見出し・画像・説明文・ボタン」の4行に分割できる
    - 列方向に揃えたい場合は`col-span-XX`を適応します

### おまけ：親のグリッドを可変にしたい時はどうする？

コンテンツが2つの時は2列にしたい…という場合はCSSだと下記のように書けます。
```css
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
```

しかし、Tailwindの既存クラスでは表現できず、[arbitrary values](https://tailwindcss.com/docs/adding-custom-styles#using-arbitrary-values)を使うしかありません。
その場合はTailwindのPluginを作成するなどしておくと便利に利用することができます。
subgridを活用していくのであれば用意しておくといいでしょう。

【参考】

https://zenn.dev/chot/articles/grid-template-auto-fill-with-tailwind



## 終わりに

以上です。
何かの参考になれば幸いです！間違いがあればご指摘お願いします。
Javaで「改行の消費」が必要な理由をわかりやすく解説！

Javaの`Scanner`を使って入力を処理するとき、「**改行の消費**」という言葉を耳にしたことがある方もいるかもしれません。  
この記事では、初心者でも理解できるように、改行の消費が必要な理由とその解決方法について解説します！😊

---

### **改行の消費ってなに？**
プログラムにユーザー入力を求めるとき、数字（例えば`123`）や文字列（例えば`Hello`）を入力しますよね？  
Javaの`Scanner`を使うと、数値入力（`nextInt()`）や文字列入力（`nextLine()`）を処理できます。

しかし、**数値入力の後に文字列を入力しようとすると、「改行」の扱いで問題が発生する**場合があります。これが「改行の消費」の原因です。

---

### **具体例: 問題が発生するコード**
以下のコードを見てください。

```java
import java.util.Scanner;

public class Example {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("数字を入力してください: ");
        int number = scanner.nextInt(); // ユーザーが「123」と入力してEnterを押す

        System.out.print("文字列を入力してください: ");
        String text = scanner.nextLine(); // 文字列を入力する前にスキップされる！
        
        System.out.println("入力された数字: " + number);
        System.out.println("入力された文字列: " + text);
    }
}
```

#### **実行例**
```plaintext
数字を入力してください: 123
文字列を入力してください: 入力された数字: 123
入力された文字列: 
```

---

### **なぜ文字列がスキップされるの？**
1. **`nextInt()`の挙動**  
   - `nextInt()` は **数字だけを読み取ります**。その後に入力される改行（Enter）は無視されず、入力バッファに残ります。

2. **`nextLine()`の挙動**  
   - 次に呼び出された`nextLine()`が、この残った改行（Enter）を読み取ります。そのため、文字列入力のチャンスがなくなり、結果的に空文字（`""`）が返されます。

---

### **解決策: 改行を明示的に消費する**
この問題を解決するには、`nextInt()`の後に **`scanner.nextLine()` を挿入して改行を消費** します。

修正したコードはこちらです👇

```java
import java.util.Scanner;

public class Example {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("数字を入力してください: ");
        int number = scanner.nextInt(); // 数字だけを読み取る
        scanner.nextLine(); // 改行を消費！

        System.out.print("文字列を入力してください: ");
        String text = scanner.nextLine(); // 文字列を正しく読み取れる

        System.out.println("入力された数字: " + number);
        System.out.println("入力された文字列: " + text);
    }
}
```

#### **実行結果**
```plaintext
数字を入力してください: 123
文字列を入力してください: Hello
入力された数字: 123
入力された文字列: Hello
```

---

### **改行の消費のポイント**
1. **`nextInt()` や `nextDouble()` などの数値入力は改行を消費しない**
   - 数値だけ読み取るので、改行（Enter）は残ります。
2. **`nextLine()` は改行を含めてすべて読み取る**
   - 残った改行文字を最初に拾ってしまうため、次の入力をスキップします。

そのため、数値入力後に文字列入力をする場合は **必ず`scanner.nextLine()`を挿入** して、残った改行を消費しましょう。

---

### **簡単なまとめ**
- **問題**: `nextInt()` の後に `nextLine()` を使うと改行が残り、文字列がスキップされる。
- **解決策**: 数値入力の後に **`scanner.nextLine()` を挿入して改行を消費する**。

---

### **改行の消費をマスターして快適なプログラム作りを！**
`Scanner`を使ったユーザー入力処理は、Javaプログラムの基本です。改行の消費を理解すれば、スムーズにユーザー入力を扱えるようになります。ぜひ、この知識を使ってプログラムを作成してみてください！

質問や気になる点があれば、コメントで教えてくださいね！ 😊

--- 

💡 **他にも知りたいJavaの基本知識があればリクエストをどうぞ！**
KiCad8でガーバーデータを出力

## はじめに
KiCad8になってから製造ファイル出力画面がかわりましたので作ってみました。


## 製造ファイル出力
基本的なオプションはこの設定でElecrow用のガーバデータが作れます。
![スクリーンショット 2024-12-29 9.40.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/700978a6-e656-8343-b131-d26edeac22b8.png)


## ドリルファイルを生成
基本的なオプションはこの設定でElecrow用のガーバデータが作れます。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/e6b2be7d-4973-6a70-7399-f4b82bdd9def.png)


## ドリルファイルを生成

https://www.g200kg.com/archives/2020/08/kicad-gerberzip-1.html
Javaでの定数の定義と使い方

Javaを学び始めた方の中には、「**定数**って何？どうやって使うの？」と疑問を持つ方もいるのではないでしょうか。この記事では、Javaにおける**定数の基本**とその**使い方**を具体例とともに解説します。

---

## 定数とは？

**定数（constant）** とは、一度値を設定すると変更できない変数のことです。  
例えば、「円周率」「最大値」「固定の割引率」など、プログラム中で変更が必要ない値を表現します。

Javaでは、定数を定義する際に`final`キーワードを使用します。さらに、クラス全体で共有する場合は`static`キーワードを併用します。

---

## 定数を定義する方法

### クラスの中で定義する
定数は通常、`public static final`の形で定義します。

```java
public class Constants {
    public static final double PI = 3.14159; // 円周率
    public static final int MAX_USERS = 100; // 最大ユーザー数
}
```

ポイント：
- **`public`**: 他のクラスからもアクセス可能。
- **`static`**: クラス全体で共有（インスタンスを作らずにアクセス可能）。
- **`final`**: 値が変更不可。

### メソッドの中で定義する
メソッド内で定義する場合、`static`は不要です。

```java
public class Example {
    public void calculate() {
        final int DISCOUNT_RATE = 10; // 割引率
        System.out.println("割引率は: " + DISCOUNT_RATE + "%");
    }
}
```

---

## 定数を使う例

定義した定数は、以下のようにアクセスします。

```java
public class Main {
    public static void main(String[] args) {
        // クラスの定数を参照
        System.out.println("円周率: " + Constants.PI);
        System.out.println("最大ユーザー数: " + Constants.MAX_USERS);
    }
}
```

結果：
```
円周率: 3.14159
最大ユーザー数: 100
```

---

## 定数を使うメリット

1. **可読性の向上**
   - 「3.14159」や「100」などのマジックナンバーを避け、意味を持つ名前で値を表現できます。

2. **値の変更が簡単**
   - 定数を一箇所で定義しておけば、値を変更する際も1箇所修正するだけで済みます。

3. **再利用性**
   - 同じ値を複数の場所で使う場合に便利です。

---

## 定数の命名規則

定数名は、一般的に**全て大文字**で記述し、単語の間はアンダースコア（`_`）で区切ります。

```java
public static final int MAX_USERS = 100;
public static final String DEFAULT_MESSAGE = "Hello, World!";
```

この規則に従うことで、変数と定数を簡単に区別できます。

---

## 注意点

- `final`キーワードを使っても、オブジェクトの参照先（値そのものではなく、参照先の内容）は変更できる点に注意してください。

```java
public class Example {
    public static final List<String> NAMES = new ArrayList<>();

    public static void main(String[] args) {
        NAMES.add("Alice"); // OK: リストに追加
        // NAMES = new ArrayList<>(); // エラー: 参照の変更は不可
    }
}
```

---

## まとめ

Javaで定数を使用する際のポイントを整理すると以下の通りです：
1. 定数には`final`を使う。
2. クラス全体で共有する場合は`static final`。
3. 命名規則に従って可読性を意識する。

定数はコードの品質を高めるための重要なツールです。ぜひ活用してみてください！
備忘録まとめ記事：BIOSとの出会いを振り返りながら、知識を簡単に整理してみた

## はじめに

BIOS（Basic Input/Output System）について勉強が必要だと感じたため、改めて薄れかけていた自分の知識を整理する目的で、この記事をまとめることにしました。

:::note warn
***最近では、BIOSに入って設定を変更する機会は減ってきましたが、自宅環境でBIOS画面を開くときには、いつもワクワクした気持ちになります（笑）。***
:::

この記事は、未来の自分への備忘録として、簡単に知識を整理する内容ですが、***誰かの技術的な支えになれば嬉しいです！***

## 私とBIOSの出会い
普段、パソコンを使っているとBIOSに入る機会はほとんどありません。

私が初めてBIOSに入ったのは、購入したWindowsパソコンのタッチパッドの制限を解除するために設定を変更したときでした。

:::note alert
***ただし、BIOSを操作する際には、ある程度のIT関連知識が必要ですので注意が必要です。***
:::

その後、BIOSの設定をいじることで、パソコンの根本的な設定を変更できることを知り、触れる範囲の設定については一通り試した記憶があります。

## BIOSをいじる際の注意点

BIOS（Basic Input/Output System）は、コンピュータの基本的な設定を管理する重要な部分です。

***設定を誤るとシステムに問題が発生する可能性があるため、以下の点に注意してください。***

:::note warn
- **設定内容を記録する**
設定を変更する前に、現在の設定値をメモしておくことで、トラブルが発生した場合でも元に戻すことが簡単になります。

- **アップデートは慎重に行う**
BIOSのアップデートは慎重に行いましょう。失敗するとシステムが起動しなくなるリスクがあります。

- **セキュリティ対策**
BIOSにパスワードを設定する場合は、忘れないよう注意してください。忘れるとシステムにアクセスできなくなる場合があります。
:::

***BIOSアップデートを行う際は、必ず電源コードを接続し、作業中に電源が切れないように注意しましょう。***

実際に、私自身もアップデート中に誤って電源コードを抜いてしまい、アップデートが中断されました...

:::note alert
***その結果、一部の機能に不具合が発生してしまい、現在も修復が完了していません（多分治らない、、、泣）。***
:::

## BIOSの基本
BIOS（Basic Input/Output System）は、コンピュータのマザーボード上に組み込まれたファームウェアの一種です。

:::note info
***BIOSは、PCが電源を入れられてからオペレーティングシステム（OS）が起動するまでの間に、ハードウェアとソフトウェアの基本的な橋渡しをする役割を果たします。***
:::

## 主な役割
### ハードウェアの初期化
PCが起動するとき、BIOSはCPU、メモリ、ストレージ、キーボード、マウスなどのハードウェアをテスト（POST: Power-On Self-Test）して正常に動作しているかを確認します。

### ブートローダーの起動
OSを起動するために必要なプログラムを、指定されたブートデバイス（HDD、SSD、USBメモリなど）から読み込みます。

### 設定の管理
BIOS設定画面（一般に「BIOSセットアップユーティリティ」と呼ばれる）で、起動順序、ハードウェアの動作設定、セキュリティオプションなどを設定できます。

## BIOSの仕組み
BIOSは、以下の手順で動作します。

### 1. 電源投入
PCの電源が入ると、まずBIOSがPOST（Power-On Self-Test）を実行します。このプロセスでは、ハードウェアコンポーネント（CPU、メモリ、ストレージなど）が正常に動作しているか確認します。

### 2. ブートデバイスの選択
POSTが完了すると、BIOSは設定された起動順序に基づき、ブートデバイス（HDD、SSD、USBメモリなど）を検索します。

### 3. ブートローダーのロード
指定されたブートデバイスから、OSを起動するためのプログラムであるブートローダーをメモリに読み込みます。

### 4. 制御の移譲
ブートローダーが読み込まれると、BIOSはその制御をブートローダーやOSに移します。それ以降の操作はOSが管理します。

## まとめ

ここまでお読みいただき、ありがとうございました！

:::note warn
***私自身、MacBookを使い始めてから、BIOSに触れる機会は減りましたが、BIOSはシステムの根幹を管理する非常に重要な機能です。***
:::

***今後も定期的に知識を整理し、振り返りたいと思います！***

## おまけ：UEFIとの違い
近年では、BIOSに代わってUEFI（Unified Extensible Firmware Interface）が普及しています。

:::note info
***それぞれの主な違いを以下の表にまとめました！***
:::


| 項目            | BIOS                 | UEFI                          |
|-----------------|----------------------|-------------------------------|
| **起動速度**    | 比較的遅い           | 高速                          |
| **ブートデバイス** | 2TBまで対応          | 9ZB（ゼタバイト）以上に対応   |
| **インターフェース** | テキストベース        | グラフィカル                  |
| **セキュリティ**  | 基本的なパスワード保護のみ | セキュアブートに対応          |
| **アップデート**  | 手動更新が主         | ネットワーク経由の自動更新も可能 |

これらの違いから、今後UEFIが主流になることは間違いないと感じます。

:::note warn
***これを機に、BIOSだけでなくUEFIについても理解を深めていきたいと思います！***
:::

## 関連記事

https://motomuralog.com/logistics-glossary/bios/

https://www.iodata.jp/column/storage/059/index.htm

https://www.ask-corp.jp/guide/motherboard-bios-part1.html
シンセ先輩から貰った TG-LPC11U35-501、Lチカで遊ぶ。( Ubuntu 24.04 lts , Firefox )


参考

![o_coq706.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8562ee95-fc73-aa2c-fe10-133bb4bb3663.jpeg)


http://park11.wakwak.com/~nkon/homepc/tg-lpc11u35/

x arduinoじゃないけど　ちょつとかんれん?

x 過去ログを見よ!!!
x こまかい所は、省略、各自独自に調査せよ!!!
x linuxの基本操作がわからないと激ムズ
(ちなみに20年から30年UinxをやっているAIX,Solaris(なんのこと))
(ls cd cp mv rm mkdir pwd(は、おぼえよう))(dd は　おまけ)

目的
ubuntuでmbedで遊ぶ
(mbedは、2027年で終了)



● mbedにログイン、プロジェクトの新規作成、いろいろ、コンパイル
----

![o_coq700.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1175cd80-9a41-475d-5d6a-e8708770c3a5.jpeg)



ソース


```c++

#include "mbed.h"

DigitalOut myled(LED1);

int main() {
  while(1) {
    myled = 1;
    wait(0.2);
    myled = 0;
    wait(0.2);
  }
}



```



● コンパイル完了、ダウンロードディレクトリーにコピー完了
----

![o_coq701.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ab205494-d646-a412-2c6a-120e9ed19807.jpeg)



● ファイルからコンパイル済みバイナリーの確認
----

![o_coq702.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d84ed495-bc56-212c-2887-839c7a87fba3.jpeg)



● ISPを押しながらリセット操作し、ディスクから状態を確認
----

![o_coq703.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/80816034-0c21-fd75-79e3-10cc1adebdb4.jpeg)


● なぜか普通にコピーすると失敗するのでddコマンドでコピー
----

![o_coq704.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9418d180-1e7b-131d-38fb-1ae69644d3e3.jpeg)


ダウンロードディレクトリーで操作


```

dd bs=1024 conv=nocreat,notrunc if=c011_mbed2-example-blinky.LPC11U35_501.bin of=/media/user1/CRP\ DISABLD/firmware.bin

```


● リセット後にLチカ成功
----

![o_coq705.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/edc879cc-152c-b269-8b2c-4bd497664079.jpeg)
第11回 Try English LT! for engineers 発表資料まとめ

# Try English LT! for engineersとは？

エンジニア向けの英語のみのLTイベントを行なっています！
発表テーマはエンジニア向けの内容であれば自由です。
英語でLTをやるとなると、中々ハードルが高く、 参加者が海外の人ばかりだと、なおさら難しく感じると思います。
ちょっと自信はないけど、 英語のLTにチャレンジしてみたいという人にぜひ発表してもらいたいです。
英語が好きなエンジニア同士で交流できるイベント運営ができればと思っています。

第11回イベントページ

https://try-english-lt.connpass.com/event/337313/

## 発表資料
・Nobu 
カナダでの就職活動
Job hunting in Canada

https://docs.google.com/presentation/d/1vIrYvq1nHgFCJm2T00J-asJ2OnvewVQjOCiDvNelPWs/edit?usp=sharing

TomoyaOgashiwa さん
How to Implement Infinite Scroll with TanStack Query

https://docs.google.com/presentation/d/1NLz1evoXi4yBYywktQ-RbGNqHnXvgFHDjdhNOv5NF_I/edit#slide=id.p

ShinichiHosomi さん
ROBO x AI

https://docs.google.com/presentation/d/1QDqB2QmKTfLV2ALsTXpvdvXl0vGatRlJEeVwojBe_j8/edit#slide=id.p

nk（えぬけー）さん
Guide to creating an AWS Lambda function in Python with DuckDB

https://speakerdeck.com/nkforwork/guide-to-creating-an-aws-lambda-function-in-python-with-duckdb

ボーノ さん
The "emotion-driven" way to learn English
「感情駆動」英語勉強法のすすめ

https://drive.google.com/file/d/1jQBfUN57L8xpV1q_ySdH2D4F0-emoPzo/view
WhatsApp番号詳細検出API


WhatsAppは広く使用されているメッセージングアプリケーションであり、WhatsAppアカウントの詳細を理解することは、様々なビジネスアプリケーションにとって重要です。この記事では、[WhatsApp詳細検出API](https://ekycpro.com/whatsAppNumberCheck)を使用してWhatsAppアカウントのステータスと詳細を確認する方法を紹介します。

## 主な機能

WhatsApp詳細検出APIは以下の強力な機能を提供します：

### 包括的なアカウント詳細

このAPIは、登録状況、最終ステータス更新時間、法人アカウントかどうかなど、WhatsAppアカウントに関する詳細情報を提供できます。

### リアルタイムステータス確認

WhatsApp番号の現在のステータスをリアルタイムで確認でき、最新の情報を確実に入手できます。

### 簡単な統合

APIは簡単な統合のために設計されており、開発者は既存のシステムにシームレスに組み込むことができます。

## <a name="使用步骤"></a>使用手順

WhatsApp詳細検出APIの使用は簡単です。以下の手順に従ってください：

1. 登録してAPIキーを取得する
2. 認証にAPIキーを使用する
3. APIを呼び出してWhatsApp番号の詳細を確認する

### コード例
##### WhatsApp詳細検出APIを使用するコード例：

```javascript
import axios from 'axios';

const apiKey = 'YOUR_API_KEY';
const phoneNumber = '1234567890';
const country = 'ID'; // country code, for example: ID is Indonesia

axios.post('https://api.ekycpro.com/v1/wadetail', null, {
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'X-API-Key': apiKey
  },
  params: {
    number: phoneNumber,
    country: country
  }
})
.then(response => {
  console.log('WhatsApp number detail detection result:', response.data);
})
.catch(error => {
  console.error('Detection failed:', error);
});
```


### API応答の説明

API応答は以下のフィールドを含むJSONオブジェクトとなります：
- `number`: 照会されたWhatsApp電話番号で、確認している特定の番号を表します。
- `whatsapp`: このフィールドはWhatsAppアカウントに関する結論を提供し、通常は番号がWhatsAppに登録されているかどうかを示す文字列です。
- `status_update`: このフィールドは最後のステータス更新時間を表示し、アカウントのアクティビティレベルを理解するのに役立ちます。
- `signature`: これはAPI応答を検証するための署名で、データの整合性と信頼性を確保します。
- `avatar`: WhatsAppアカウントにプロフィール画像がある場合、このフィールドにはアバターのURLが含まれ、このリンクを通じてプロフィール画像を表示できます。
- `region`: このフィールドは電話番号に関連する地理的地域を示し、通常は国や地域の名前です。
- `carrier`: このフィールドは電話番号に関連する通信事業者の情報を提供し、その番号のネットワークプロバイダーを理解するのに役立ちます。

### よくある質問

##### 1. WhatsApp詳細検出APIとWhatsApp番号検出APIの違いは何ですか？

WhatsApp詳細検出APIは、WhatsApp番号検出APIよりも包括的で、登録状況、最終ステータス更新時間、法人アカウントかどうかなど、WhatsAppアカウントに関する詳細情報を提供します。

##### 2. どの国がサポートされていますか？

現在、世界中の200以上の国と地域でWhatsApp番号詳細検出APIサービスを提供しています。世界のすべての国と地域が含まれます。

##### 3. WhatsApp詳細検出APIの価格はいくらですか？

WhatsApp詳細検出APIの価格は1クエリあたり$0.0001です。より多くのクエリが必要な場合は、[お問い合わせ](https://ekycpro.com/whatsAppNumberCheck)ください。

##### 4. 1日の最大クエリ数は何件ですか？

無料クエリの最大数は30件です。より多くのクエリが必要な場合は、[お問い合わせ](https://ekycpro.com/whatsAppNumberCheck)ください。
ssh -X to vagrant linux

# env

Host:Ubuntu 22.04
Guest:RockyLinux 9(Vagrant)

# vagrant setting

```ruby:Vagrantfile
  config.ssh.forward_x11 = true
  config.vm.network "private_network", ip: "192.168.56.101"
```

ここのサブネットの決まり方をいまいち理解していない。
たぶんVirtualBoxが環境ごとに何かしら選んでいるはず

```
issei@issei-AORUS:~/vms/rocky-rubydcl$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'bento/rockylinux-9.0' version '202207.20.0' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
The IP address configured for the host-only network is not within the
allowed ranges. Please update the address used to be within the allowed
ranges and run the command again.

  Address: 192.168.50.101
  Ranges: 192.168.56.0/21

Valid ranges can be modified in the /etc/vbox/networks.conf file. For
more information including valid format see:

  https://www.virtualbox.org/manual/ch06.html#network_hostonly
```

ひとまずエラーを出して探るスタイルで強行突破した。

# Guest

```
dnf install xinit xterm xorg-x11-server-Xorg motif
```

# Host -> Guest

```
ssh -X vagrant@192.168.56.101
```

デフォルトはユーザ名と同じなので、気になる場合は変えたほうが良い

# 参考

https://blog.amedama.jp/entry/vagrant-x-window-system

https://note.com/egao_it/n/n9612608af3e3
文系未経験者の独学日記　＃３

本日は技術書を読む気分にならなかったのでPaizaのCランクスキルチェックをいくつか解きました。
１週間ほどぶりのコードを書いたのですが、案外すんなり手が進んでほっとしました。
実際に手を動かして問題を解くことに苦手意識があったのですが、Cランクの問題ならなんとか自力で解けるレベルになった気がします。
自分はJavaの勉強を「やさいいJava」という本で勉強したのですが、かなり丁寧に説明が書いてあり、Javaを学びたい初心者の方にはおすすめだと思います。
この本を２周して基本的な知識はあるのですが、Paiza進めるうちにHashMapや正規表現など、使えると便利な知識を身につけられているので、気軽にできて良いアウトプットになっています。
Cランクをすべて解き、はやくBランクの問題に挑戦したいです。
libLZFの使い方はとても簡単

[binary_compressedされたPCDファイル](https://pcl.readthedocs.io/projects/tutorials/en/master/pcd_file_format.html#pcd-file-format)を自前プログラムで読めるようにしたいと思い、libLZFの使い方を調べてみました。例によって日本語の説明は見つからなかったのですが、試してみたらとても簡単で、ヘッダファイルに書かれていた情報だけで実装できました。

 - [libLZFのページ](https://software.schmorp.de/pkg/liblzf.html)
 - [旧libLZFのページ](http://oldhome.schmorp.de/marc/liblzf.html)（オリジナル作者のMarc Lehmann氏のもの？）
 - [Githubリポジトリ](https://github.com/nemequ/liblzf)

テストコードは次のようなのです。

```C
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
#include <errno.h>
#include <liblzf/lzf.h>

#define DEFAULT_SIZE 10000

int main(int argc, char *argv[])
{
  uint8_t *data_org;
  uint8_t *data_comp;
  uint8_t *data_decomp;
  size_t size_org, size_comp, size_decomp;
  int i;
  bool result = true;

  size_org = argc &gt; 1 ? atoi( argv[1] ) : DEFAULT_SIZE;
  data_org = malloc( sizeof(uint8_t) * size_org );
  data_comp = malloc( sizeof(uint8_t) * size_org - 1 );
  data_decomp = malloc( sizeof(uint8_t) * size_org );
  for( i=0; i&lt;size_org; i++ )
    data_org[i] = rand() % 0x10;
  size_comp = lzf_compress( data_org, size_org, data_comp, size_org - 1 );
  if( size_comp == 0 ){
    fprintf( stderr, "compression error\n" );
    result = false;
  } else{
    size_decomp = lzf_decompress( data_comp, size_comp, data_decomp, size_org );
    if( size_decomp == 0 ){
      fprintf( stderr, "decompression error\n" );
      result = false;
    } else{
      printf( "original size = %lu\n", size_org );
      printf( "compressed size = %lu\n", size_comp );
      printf( "decompressed size = %lu\n", size_decomp );
      for( i=0; i&lt;size_org; i++ )
        if( data_org[i] != data_decomp[i] ) result = false;
    }
  }
  printf( "%s\n", result ? "Success" : "Failure" );
  free( data_org );
  free( data_comp );
  free( data_decomp );
  return 0;
}
```

エラーチェックを真面目にしていませんが、ご容赦下さい。

圧縮する関数
```C
  actual_size_comp = lzf_compress( data_org, size_org, data_comp, size_comp );
```
と解凍する関数
```C
  actual_size_org = lzf_decompress( data_org, size_org, data_decomp, size_decomp );
```
がほぼ全てです。

前者はサイズ`size_org`である元データ（メモリ上先頭アドレス`data_org`）を、アドレス`data_comp`以降の領域にサイズ`size_comp`以下になるように圧縮したい、という意味で、返り値`actual_size_comp`は実際に作成された圧縮データのサイズです。
圧縮に失敗した（サイズを`size_comp`以下に出来なかった）場合は、返り値は0となります。

後者はその逆で、`size_decomp`である圧縮データ（メモリ上先頭アドレス`data_decomp`）を、アドレス`data_org`以降の領域に解凍したい（サイズは`size_org`であることを期待する）、という意味で、返り値`actual_size_org`は実際に作成された解凍データのサイズです。
解凍に失敗した（サイズが`size_org`以下でなかった）場合は、返り値は0となります。

どちらも、圧縮/解凍サイズを前もってある程度予想出来ないと使えません。例えば圧縮時は、少なくとも元サイズ`size_org`よりは小さくなることを期待するので、ワースト値`size_org - 1`としておけば良いように思いますが、元サイズがそもそもあまり大きくない（100バイト程度とか）場合は高確率で失敗するようです。解凍時も同様です。

PCDでは解凍後のサイズをヘッダに書く決まりがあるので、その点は問題ありません。[Zeo](https://github.com/mi-lib/zeo)の[zeo_vec3d_pcd.c](https://github.com/mi-lib/zeo/blob/main/src/zeo_vec3d_pcd.c)にPCDファイルread/write処理を実装しています。
PHP × Node.js 開発環境を一体化！Docker でラクラク Laravel 開発

# PHP × Node.js 開発環境を一体化！Docker でラクラク Laravel 開発

Docker 上で PHP と Node.js の両方が使える便利なイメージを紹介します。**[softjpn/laravel-nodejs-dev](https://hub.docker.com/r/softjpn/laravel-nodejs-dev)** は、**php:8.2-fpm** をベースにして、Laravel や Composer、Git、Node.js & npm などの主要ツールをあらかじめインストールしたものです。このイメージを使えば、ローカル環境にこれらのツールをひとつずつインストールする必要がありません。

---

## このイメージに含まれているもの

- **PHP 8.2**  
- **Composer** (PHP の依存管理)  
- **Laravel Installer** (Laravel プロジェクトの新規作成が簡単)  
- **Git** (バージョン管理)  
- **Node.js & npm** (JavaScript まわりの開発に必要)

これらがオールインワンで入っているため、プロジェクトに合わせて PHP だけでなくフロントエンド系のビルドやツールもすぐに扱えます。

---

## 使い方のポイント

どのコマンドでも共通しているのは、**`-v "$PWD:/app"`** でローカルのカレントディレクトリをコンテナ内の `/app` にマウントする点です。コンテナ内で作成・編集されるファイルは、同じディレクトリ内に直接反映されます。

### 1. 新しい Laravel プロジェクトを作る

```bash
docker run --rm -it -v "$PWD:/app" softjpn/laravel-nodejs-dev laravel new example-app
```

- `laravel new example-app` は Laravel Installer を使って `example-app` フォルダに新規プロジェクトを作成。  
- `--rm -it` は終了時にコンテナを自動削除し、対話モードで実行するオプションです。  

### 2. 簡単な PHP スクリプトを実行する

```bash
docker run --rm -it -v "$PWD:/app" softjpn/laravel-nodejs-dev php helloworld.php
```

- ローカルの `helloworld.php` をコンテナ内で実行できます。  

### 3. Node.js スクリプトを実行する

```bash
docker run --rm -it -v "$PWD:/app" softjpn/laravel-nodejs-dev node ./helloworld.js
```

- Node.js があらかじめ入っているので、JavaScript の実行も可能です。

### 4. PHP のバージョンを確認する

```bash
docker run --rm -it -v "$PWD:/app" softjpn/laravel-nodejs-dev php --version
```

- 現在のコンテナに入っている PHP のバージョンが表示されます。  

### 5. Git を使う

```bash
docker run --rm -it -v "$PWD:/app" softjpn/laravel-nodejs-dev git --version
```

- バージョン確認だけでなく、commit や push/pull などのコマンドも実行可能。  

### 6. npm のバージョンを確認する

```bash
docker run --rm -it -v "$PWD:/app" softjpn/laravel-nodejs-dev npm --version
```

- npm コマンドも同様に利用できます。`npm install` や `npm run dev` なども自由に実行可能です。

---

## 補足情報

- **デフォルトコマンド**  
  特にコマンドを指定しない場合、コンテナは `php-fpm` を起動します。Laravel を Docker Compose で動かす際に便利です。  

- **コンテナの作業ディレクトリ**  
  `/app` がデフォルトになっています。必ず `-v "$PWD:/app"` を付けてローカルのフォルダをマウントしましょう。  

- **エントリーポイント**  
  `docker-php-entrypoint` を使っているため、PHP 関連のコマンドが正しく初期化されます。  

このイメージは、Laravel と Node.js をまとめて使えるようにした軽量な開発環境です。複数のツールをあちこちインストールする必要がなく、しかも更新も自動で追従しやすいので、手元の環境を汚さずに開発を進められます。ぜひ試してみてください。

DockerfileSource Code on [**Github**](https://github.com/softjapan/laravel-nodejs-dev)
C891Fを使用した自室用ネットワーク構築

どうしても自室にCiscoルーターを入れたかったんです・・・（ろまんじゅうし）
中継器（LANポートついてる）で電波をとってきて、中継器LANポートと891FのWANポートでLANケーブルを挿し、ごにょごにょすることにより構成できます。要するに二重ルーターってやつです。
とりあえず使えるようにしただけです。

```
Building configuration...

Current configuration : 2509 bytes
!
! Last configuration change at 07:57:54 UTC Tue Sep 17 2024
!
version 15.4
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname Router
!
boot-start-marker
boot-end-marker
!
!
!
no aaa new-model
!
!
!
!
!
!
!
!
!
!


!
ip dhcp excluded-address 192.168.2.1 192.168.2.99
!
ip dhcp pool local
!
ip dhcp pool lan
 network 192.168.2.0 255.255.255.0
 default-router 192.168.2.1
 dns-server 8.8.8.8
 lease 0 12
!
!
!
ip cef
no ipv6 cef
!
!
!
!
!
multilink bundle-name authenticated
!
!
!
!
!
!
!
!
cts logging verbose
license udi pid C891FJ-K9 sn FGL222594K2
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
interface BRI0
 no ip address
 encapsulation hdlc
 shutdown
 isdn termination multidrop
!
interface FastEthernet0
 no ip address
 shutdown
 duplex auto
 speed auto
!
interface GigabitEthernet0
 switchport access vlan 10
 no ip address
 spanning-tree portfast
!
interface GigabitEthernet1
 switchport access vlan 10
 no ip address
 spanning-tree portfast
!
interface GigabitEthernet2
 switchport access vlan 10
 no ip address
 spanning-tree portfast
!
interface GigabitEthernet3
 switchport access vlan 10
 no ip address
 spanning-tree portfast
!
interface GigabitEthernet4
 switchport access vlan 10
 no ip address
 spanning-tree portfast
!
interface GigabitEthernet5
 switchport access vlan 10
 no ip address
 spanning-tree portfast
!
interface GigabitEthernet6
 switchport access vlan 10
 no ip address
 spanning-tree portfast
!
interface GigabitEthernet7
 switchport access vlan 10
 no ip address
 spanning-tree portfast
!
interface GigabitEthernet8
 ip address dhcp
 ip nat outside
 ip virtual-reassembly in
 duplex auto
 speed auto
!
interface Vlan1
 no ip address
!
interface Vlan10
 ip address 192.168.2.1 255.255.255.0
 ip nat inside
 ip virtual-reassembly in
!
interface Async3
 no ip address
 encapsulation slip
!
ip forward-protocol nd
no ip http server
no ip http secure-server
!
!
ip nat inside source list 1 interface GigabitEthernet8 overload
ip route 0.0.0.0 0.0.0.0 dhcp
!
!
access-list 1 permit 192.168.2.0 0.0.0.255
!
control-plane
!
!
mgcp behavior rsip-range tgcp-only
mgcp behavior comedia-role none
mgcp behavior comedia-check-media-src disable
mgcp behavior comedia-sdp-force disable
!
mgcp profile default
!
!
!
!
!
!
 vstack
!
line con 0
 logging synchronous
 no modem enable
line aux 0
line 3
 modem InOut
 speed 115200
 flowcontrol hardware
line vty 0 4
 login
 transport input none
!
scheduler allocate 20000 1000
!
!
!
end
```
Windows Server 2022とTailscaleを使用して、外部からもログインを可能にする

<h1>注意事項</h1>
今回の記事では、写真の準備を一切してません。見づらくてごめんなさい。<br>
各記事を参照し、AD構築が完了しているものとします。
知識もあまりないので、質問とかされてもあまり答えられないかも。
<h1>AD鯖構築の参考記事</h1>

[Windows Server 2022 で、 Active Directory ドメインサービスを構築しよう](https://www.truesystems.jp/blog/install-windows-server-2022-adds-1/)
[[Windows Server]ユーザーアカウントの新規または追加作成方法(Ative Directory)](https://faq.mypage.otsuka-shokai.co.jp/app/answers/detail/a_id/315651/~/%5Bwindows-server%5Dユーザーアカウントの新規または追加作成方法(ative-directory))
[これだけは絶対やっちゃダメなWindowsServer設定(辛酸なめました）](https://www.tomsword.com/weblog/this-is-the-only-windows-server-setting-that-you-should-never-do/)<br>
こちらの記事を参考にして、AD鯖構築を行いました。
<h1>TailScale導入の参考記事</h1>

[tailscaleの導入と使い方]("https://utakamo.com/article/network/vpn/tailscale/index.html")
Tailscaleの導入はこちらの記事を参考にさせていただきました。
Windows Server(ADサーバ・クライアントPCともにインストールが必要)

<h1>外部からもADユーザーにサインインするには</h1>
まず内部ネットワーク内でドメインサインインし、ユーザーにログインした後Tailscaleをインストールします。インストールしログインが完了したら、TailscaleのDNS設定をADサーバのDNS（TailscaleのIP）に変更します。
Ubuntu Serverで毎日午前4時にパッケージ更新・再起動を行うシェルスクリプト

表題の通りです。Ubuntu 22.04にて。主に自分用。
（GPT君が作ってくれたんだけど、まとめがてら。技術的な細かい突込みはやめてください。）
<h1>スクリプトの準備・作成</h1>

まず、ホームディレクトリなどで`update_and_reboot.sh`を作成。
```
nano update_and_reboot.sh
```

<h2>スクリプト作成</h2>

```update_and_reboot.sh
#!/bin/bash

# ログファイルのパス
LOG_FILE="/var/log/update_and_reboot.log"

# 日本時間のタイムスタンプを取得
TIMESTAMP=$(TZ='Asia/Tokyo' date '+%Y-%m-%d %H:%M:%S')

# ログに実行時刻を記録
echo "[$TIMESTAMP] Starting system update..." | tee -a "$LOG_FILE"

# 更新プログラムのインストール
sudo apt update && sudo apt upgrade -y | tee -a "$LOG_FILE"

# 再起動のログを記録
TIMESTAMP=$(TZ='Asia/Tokyo' date '+%Y-%m-%d %H:%M:%S')
echo "[$TIMESTAMP] Rebooting system..." | tee -a "$LOG_FILE"

# システム再起動
sudo reboot
```
<h2>実行権限を付与</h2>

```
chmod +x update_and_reboot.sh
```
<h2>安全なディレクトリに配置</h2>

```
sudo mv update_and_reboot.sh /usr/local/bin/update_and_reboot.sh
```
<h1>cronジョブの設定</h1>
<h2>cronを編集</h2>

```
sudo crontab -e
```
エディタは何でも良いです。お好みのエディタでどうぞ。
（ﾜｼはnanoをよく使いますが。）
<h2>以下を追加</h2>

```
0 4 * * * /usr/local/bin/update_and_reboot.sh
```
書き込んだら保存して、終了。
<h1>~動作確認~</h1>

```
sudo /usr/local/bin/update_and_reboot.sh
```
これで一度動作確認を行ってください。
再起動後に下記コマンドを打てば、ちゃんと動作しているか確認できるかと思います。
```
cat /var/log/update_and_reboot.log
```

これで毎日4時に、自動で更新・再起動が入るはずです。
Amazon Bedrock Guardrails のマルチモーダル有害性検知機能

:::note info
2024/12 現在 プレビュー
:::


# 内容

AWS re:Invent 2024 で発表があった Amazon Bedrock Guardrails のマルチモーダル有害性検知機能 をシンプルに纏めます。

https://aws.amazon.com/jp/blogs/news/amazon-bedrock-guardrails-now-supports-multimodal-toxicity-detection-with-image-support/

https://aws.amazon.com/jp/about-aws/whats-new/2024/12/amazon-bedrock-guardrails-multimodal-toxicity-detection-image-content-preview/

- Amazon Bedrock Guardrails に、テキストだけでなく画像にも対応した「マルチモーダル毒性検出」機能が追加


# 対応リージョン

- 米国東部 (バージニア北部、オハイオ)、米国西部 (オレゴン)
- アジア太平洋 (ムンバイ、ソウル、シンガポール、東京)
- ヨーロッパ (フランクフルト、アイルランド、ロンドン)
- AWS GovCloud (米国西部) 


# 設定

ちょっと良い画像がなく、また検証もしずらいので詳しい検証まではできませんが、
[ガードレール] で　「コンテンツフィルターの設定」で、 [憎悪]、[侮辱]、[性的]、[暴力] のカテゴリーで設定すれば良いようです。

![スクリーンショット 2024-12-29 1.37.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/cdfb9a2a-edcd-9489-ee4d-f6b9a052b909.png)


# その他

ここに書くのもどうかかですが、新しく記事にする程でもないと思ったので、Amazon Bedrock Guardrails に関連する記事をここにリンクしておきます。
Guardrails が価格を最大 85% 引き下げになったと！！！

https://aws.amazon.com/jp/about-aws/whats-new/2024/12/amazon-bedrock-guardrails-reduces-pricing-85-percent/
AIがオリジナルのカクテルを作ってくれるサービスを作りました🍸

## はじめに
はじめまして、新卒エンジニアのroutechanと申します😀
Qiita初投稿です🔰

ReactのアウトプットとしてWebアプリケーションを作ってみました😉

## 作ったもの
[AIバーテンダー](https://ai-bartender-67d9c.web.app/)

ユーザーが入力した材料・アルコールの強さ・気分などからAIのバーテンダーがオリジナルのカクテル🍸を生成してくれるサービスです！

↓デモ

![aiバーテンダー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3972769/b038a9da-2975-7e52-b4e6-755f4f7ba69f.gif)


入力された情報に基づいて、AI🤖がオリジナルカクテルの名前や材料・作り方・カクテルのストーリーなどを出してくれます😮

入力された気分によっても結果が変わってきたりします

材料を1つにするとその材料を使ったカクテルを作ってくれます（例：ジンだけ入力したらジンを使ったオリジナルのカクテルを生成します）

## 使用技術
フロントエンド　React, Tailwind CSS
その他　OpenAI API

入力された値をchatgptのAPIに渡して結果を受け取り、それを出力しています

## 作ろうと思った経緯
ChatGptのAPIを使って、冷蔵庫の残り物から料理を作ってくれるサービスを知り、何か他のもので応用できそうだなと思って作りました

**参考にさせていただいた記事**
https://qiita.com/super-appy/items/ee91df62683d208b318d

## 感想
今回、はじめてOpenAI APIを使ってみたのですが、こんなことまでできるんだと思いました:sunny:

使用するのもそこまで複雑ではないので、アイデア次第でいろんなものが作れそうだなと感じました。（ただ、APIを使用するのに5ドル支払いました・・・💸）


拙い文章ですが、ここまで読んでいただきありがとうございました:relaxed:
今後も何か作ったら投稿しようと思います！！
「Apple Silicon ネイティブが Rosetta 2 より遅い」とはならなくなった

# これは何？

昔

https://qiita.com/Nabetani/items/0c4e00c2a49cb92ed442

という記事を書いたんだけど、この記事を書いた時点では

```ruby:ruby
N=10000
r=(1..N).max_by{ |x| ((N-x)**x/7) % 6074001001 }
p r
```

という計算は、ARM64 版 の ruby で動かすより、Rosetta 2 上で x86_64 版を動かしたほうが速いという結果になっていた。

で、今はどうなってるの？　という話。

# 環境

使った ruby は、以下の 8個。

* ruby 3.1.5p252 (2024-04-23 revision 1945f8dc0e) [x86_64-darwin24]
* ruby 3.1.6p260 (2024-05-29 revision a777087be6) [arm64-darwin24]
* ruby 3.2.5 (2024-07-26 revision 31d0f1a2e7) [x86_64-darwin24]
* ruby 3.2.6 (2024-10-30 revision 63aeb018eb) [arm64-darwin24]
* ruby 3.3.5 (2024-09-03 revision ef084cc8f4) [x86_64-darwin24]
* ruby 3.3.6 (2024-11-05 revision 75015d4c1f) [arm64-darwin24]
* ruby 3.4.0dev (2024-12-25 master f450108330) +PRISM [x86_64-darwin24]
* ruby 3.4.1 (2024-12-25 revision 48d4efcb85) +PRISM [arm64-darwin24]

ハードウェアは同一で、MacBook Pro M1 非Max。

x86_64 版と arm64 版のバージョンが合ってないのは良くないわけだけど、サボった。

時間の測定は time コマンドなんだけど、time の前に一回動かしている。

# 結果

結果は以下の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6854/185d2a6a-ee9d-3fcd-4647-e30e5de97c9f.png)

arm64 版は、3.2 → 3.3 でなにかあったらしく、3倍ぐらい速くなっている。すごい。

# ちなみに

ちなみに同種の計算

```python:python
N=10000
r=0
m=0
for x in range(1,N+1):
    n=((N-x)**x//7) % 6074001001
    if m<n:
        r=x
        m=n
print(r)
```

を Python 3.13.1 で行うと

```
$ python3.13 -V -V                                                             
Python 3.13.1 (main, Dec  3 2024, 17:59:52) [Clang 16.0.0 (clang-1600.0.26.4)]

$ python3.13 -c "import platform;print(platform.machine(), platform.version())"
arm64 Darwin Kernel Version 24.2.0: Fri Dec  6 19:01:59 PST 2024; root:xnu-11215.61.5~2/RELEASE_ARM64_T6000

$ python3.13 python/test.py 
8663

$ /usr/bin/time -h python3.13 python/test.py
8663
        4.55s real              4.53s user              0.01s sys       
```

という感じ。

# まとめ

以前

> 今遅いものもそのうち早くなるんじゃないかと思うよ（思うだけ）。

と書いたけど、やはりそうなった。
開発者の皆様ありがとうございます。
DVDのVIDEO_TSフォルダをMP4へ変換

# 発端
とあるお気に入りDVD映像をスマホに保存して、いつでも見られるようにしたい！！！　と思い、CDみたくすぐできると思ったけど、すごい苦労しました。ひと記事にまとめてますが、実際は2-3日費やしてます(-_-;)

# 試したこと
- まずDVDのファイル構成を調査。
- - IFOファイル : 音声、字幕の選択やチャプター情報など制御情報ファイル
VOBファイル : 映像や音声、字幕など実際のデータ
BUPファイル : IFOファイルのバックアップファイル

- どうやら、フォルダ中のVOBファイル（VTS_01_1.VOB）が核なようなので、これをmp4に変更。しかし、再生できず。そもそも、VOBファイルで再生できるらしいが、私のDVDのVTS_01_1.VOBは一応（VLCで）再生できたが、ブロックノイズがすごく見るに堪えられなかった。
- VLC media playerで、VIDEO_TSやVOBファイル単体で変換を試す。しかし、生成された動画は、テレビの砂嵐に不気味にカラフル画素が存在するような、少なくとも原型は保たれていないファイルだった。
- ffmpegでmp4変換。しかし、codec erorrで変換できず。
- Handbrakeで変換。生成された動画は、グリーンやグレーのノイズが激しい動画に。フィルター設定で、インタレースやノイズ関係の選択をいろいろ変更したが、改善なし

コピーガードがかかっているのかと思い諦めかけたが、再度VLC media playerで試したところ、成功しました。

なお、[コピーガード - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%94%E3%83%BC%E3%82%AC%E3%83%BC%E3%83%89)によると、
>CSS等の暗号型の保護技術を回避してのDVDのリッピングは私的複製の対象外となり違法行為となる（ただし、CSS等の保護技術が使われていないDVDのリッピングについては、改正後も従来と変わりはない）。

と、コピーガードを解くのは違法になるので注意です。
（この記事はファイル変換で、市販DVDのコピーガード解除はできません。）

# やり方
1. "メディア"から"変換/保存"（Ctrl + R）を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951138/f5237049-b77b-2ab4-b5ad-615c96cfd09c.png)
　
1. 今までは"ファイル"タブから、VIDEO_TSフォルダやその中のファイルを選択して変換を試みていました。ただ、これでは、失敗しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951138/46813c98-4c2d-0ab9-8c66-12f3e177236c.png)
　
そこで "ディスク"タブを選択します。VIDEO_TSはこちらで変換をする必要がありました。
ディスクデバイスで、DVDドライブもしくは、VIDEO_TSフォルダを"参照"で指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951138/24a7d69e-0c45-89f9-313f-12095fe870cd.png)
　
1. 今回はMP4に変換したかったので、プロファイルからH.264 + MP3(MP4)を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951138/982071f0-d6e2-0292-f56f-3929385b5085.png)
　
これでmp4に変換できた、と思ったのですがファイルを開くと、もう一つ難所がありました。それは、変換後の動画は音声がなくなっていたのです。
　
1. そこで、プロファイルでH.264 + MP3(MP4)を選択後、スパナマークをクリックします。
　

1. "オーディオコーデック"タブを選択、"エンコーディングパラメーター"の"コーデック"から```MPEG 4 Audio(AAC)```を選択し、保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951138/f1e5cccc-8b3c-23c0-4d0c-9029a590f8c4.png)
　
1. 出力用URLで出力ファイルを指定し、"開始"をクリック。
あとは、待つだけです。

以上で、無事mp4動画に変換できました。

ただ、インターレース？なのか横一線のギザギザが多少気になります。まだ、改善の余地がありそうです。

とにかく、私にとっての心の癒しを手元に置いとけるようになったので満足です
LinuC Open Networkに参加してみました。


- 誰でも参加できる。
  - 参加に必要なEDUCO-IDは誰でも取得可能！
- 参加登録時にちょっとわかりづらかったところとか。



## LinuC Open Network とは。

原文ママですが、
`社会貢献を目的とし、IT技術を利用しているすべての人々がIT技術の知識と理解を深め持続的な成長をする場としてのオープンなコミュニティです。`

https://qiita.com/organizations/linuc/profile

これだけちょっと難しい感じですが、LinuxのようなOSS・オープンテクノロジーのコミュニティです。
LinuC等の資格試験を提供しているLPI-Japanの友達みたいな感じです。
~~ちゃんと調べるまでLPI-Japanの下部組織とかプロジェクトの一部だと思ってました…~~

Qiita Organization にもあったのですが、こちらの解説がわかりやすいと思います。

https://linuc.community/mod/page/view.php?id=7

## 参加の経緯

もともと所属組織がLPI-Japanのスポンサー企業であり、今年はとある職業訓練校でLinuC レベル1の講座を担当したこともあり、接点はありました。
[OSSummit 2024](https://qiita.com/oishi-d/items/106cd0aa59871135c0fd)でも中の人達とお会いしてお声がけいただいていたのですが、後述のEDUCO-IDの取得にLPI-Japanの資格取得が必須だと思い込んでいたので、参加していませんでした。

年末年始でLinuC受験しようと思い、試験の予約準備をする中でEDUCO-ID取得にに資格不要であることを知り、参加しました…


## 参加の方法

以下を参照し、参加登録を行います。

https://linuc.community/mod/page/view.php?id=9


### EDUCO-ID の取得
EDUCO-IDについての解説がテキストで書いてないのですが、説明画像をよく見るとLPI-Japanの資格試験を**初めて受験する方**が、と記載があります。
なので、LPI-Japanの資格試験の認定をもっていなくてもEDUCO-IDの取得はでき、LinuC Open Networkへの参加も可能です。

自分は「EDUCO-ID？初耳だけど資格取得時に発行されるIDかな？」と思って回れ右してしまったので、参加していませんでした。

なお、姓名の入力が洋風なので要注意だと思います。

### LinuC Open Networkの利用登録

直前にEDUCO-IDの払い出しがされるのでこれが要求されるのかと思いきや、メールアドレスが要求される罠に見事に引っ掛かりました。


登録時に興味のある分野について聞かれるのである程度イメージしておくといいかもしれません。
私は以下にしてみました。

![スクリーンショット 2024-12-28 182626.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/72a72a76-b020-0e53-bc88-598da6f32eb6.png)


プロフィール設定画面は項目が結構あり、あまり触りませんでした。
![スクリーンショット 2024-12-28 182647.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/6ebc7a7b-b2bc-b36e-ea07-41e978ffef6b.png)



プレファレンス(preference)という言葉をあまり目にしたことがないのですが、設定と理解していいのかな？



https://e-words.jp/w/%E3%83%97%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9.html#google_vignette


## 登録すると出来ること

登録・ログインするとマイページ・コンテンツのタブが増えます。

マイページは資格受験者向けのものです。
コンテンツは結構あるので、登録してみてのお楽しみということで。
でも、学習コンテンツ一覧はもっと公開してもいいのでは？と思いました。

## 会員専用Slack への参加

参加方法の最下部・コンテンツ書いてあるのですが、そこから参加出来ます。


自己紹介チャンネルがあるので参加しましょう。
自己紹介テンプレートは以下です。

```
氏名（ニックネーム可）
会社名（任意）
①現在の業務内容
②スキル・経験・保有認定
③これから学びたいこと・やりたいこと
④プライベートの紹介（趣味など）
⑤その他（SNSなど）

テンプレートは強制ではありません。
よろしければご活用ください。
```


私が投稿したサンプルはこちら。



```
①Proxmox 金のリセラー中の人
②業界10以上・LPICは取得しましたがLinuCは取得していません。Cisco・AWSなども取得したことがありますが、いずれも失効しています。
③Proxmoxを中心にオープンテクノロジーに貢献していきたいです。
④JPmoxs（https://jpmoxs.connpass.com/）というProxmox の日本国内コミュニティ（≒ファンクラブ）の中の人をやっています。
⑤Twitter：https://x.com/oishid20240325
　Qiita：https://qiita.com/oishi-d
```



## おまけ
LPICの履歴が引き継げることを知りました。
10年以上前の履歴を今更引き継いでもかなりの内容が陳腐化しているしなぁ…という感じで、いいかな…となりました。

https://linuc.org/linuc/lpic03.html?_ga=2.35768736.1069190695.1735372511-74743132.1735372511


### 参考
https://linuc.community/
dynabook（windows11)でのタッチパッド操作できない事象について

今回は自分がつい先日ノートPCのタッチパッドが急に使えなくなったときの解決方法をこちらに残していこうと思います。

**前提**
今回はまずノートPCで外付けUSBのマウスを使えばカーソルは使用できるというのが前提条件です。

# 0.デバイスマネージャーについて
初めにタッチパッドが使えないと思ったのはタッチパッドで右クリック、もしくは左クリックをしようとしようとしたときでした。
急に反応がなくなり、カーソルを動かすこともできない。
だが、外付けのマウスでは操作ができる。

このような状態でまず試したのが、マウスを取り外したときの動作でした。
マウスを取り外すと驚いたことに、カーソルが画面上から消えたのでした。

なぜマウスを取り外したのかというと、確か外付けマウスを付けてるとタッチパッドが無効化されてしまうという設定があったのをなんとなく記憶していたので、そこを確認するために行いました。

# 1.次の操作
次にタッチパッドの操作が聞かないため、上記したタッチパッドの設定を行うためにFn + F9のキーを押しました。
そうすると本来はタッチパッドの設定で、ON/OFFが切り替わるはずでした。
しかし切り替えてもタッチパッドは機能しないまま。

次にネットで調べるとデバイスマネージャーというものが、この操作？をつかさどってる可能性があるというのを見つけたため、一度そちらを調べることにしました。
そうすると、「マウスとそのほかのポインティングデバイス」という項目をみつけたため、これだ！と思った矢先、これはUSBのマウスを外すと項目は消えてしまいました。

# 2.ヒューマンインターフェイスデバイス
困り果てた私が再度調べると、ヒューマンインターフェイスデバイスという所で、タッチパッドを制御してるデバイス？ドライバ？があると知り、そちらを確認すると、「I2C HID　デバイス」というものに⚠マークがついておりました。

そこからはログを表示し、動かなくなった時の時間、もしくは、動かないため再起動をしたときの時間が表示されていることから、これが原因であると何となくの認識をしました。

しかし、原因がわかっても表示されているのは下記の文面です。
「このデバイスが使用できる空きリソースが不足しています。 (コード 12)

このデバイスを使用する場合は、このシステムのほかのデバイスの 1 つを無効にする必要があります。」

この文面を見るとそのほかにいろいろと名前がダブってる制御デバイスの項目があったため、それらを止めれば行けるのか？という認識になるはずです。

# 3.I2C HID　デバイスの無効化実行→有効化実行（再起動も行う）
しかし自分はチキンだったため、ほかの正常に動いてるものを無効化し、その後有効化するときにうまく有効化できないと怖いと考え、それならもとからエラーを起こしてるやつを一度無効化してやればいい！と思いました。

そして実際無効化して有効化を行ったところ、タッチパッドは元気に機能をしてくれるようになりました。


# 4.まとめ
今回は当初、汗でshortした？、仮想マシンの立ち上げでカーネルパニックとかになってたのが何らかの影響を与えたのか？、そもそも経年劣化？（買ってまだ1年）などいろいろ考えましたが、なかなかネットにはいい答えが載っていなかったので大変苦労と不安がありました。

ただしかし、大事なノートPCがただ壊れた、それだけであきらめられるほどのSEではなかったため、必死に考えて解決までたどり着きました。
この記事が自分自身の小さな自信になったことと、ほかの人の手助けになれることを願ってこの投稿を締めます。
**お読みいただきありがとうございます。**
[ネタ] Simulinkモデルのプレビューを任意の画像にする

# はじめに
Simulinkモデルのプレビューを自分の好きな画像にしたいな~と思い、方法を探していたところ、結構簡単に変更ができたので、記事として残そうと思います。

ただ、今のところ、プレビュー変更後にモデルが開けなくなります。
原因は調査中です。あくまでネタとしてお楽しみください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662936/507ab306-70e6-d4bf-6e30-f0b5cf44c768.png)


# 用意するもの
* プレビューにしたい画像
* Simulinkモデル(.slx)

# 方法
## 1.Simulinkモデルの拡張子を.zipに変更する
ご存じの方も多いとは思いますが、.slxの正体は.zipです。なので拡張子を.zipに変えてあげれば、Simulinkモデルを構成している情報(XMLとかとか)が確認できます。
参考：https://blog.smooth-works.net/archives/3123

今回はtest.slxというモデルをサンプルにします。
test.slx ⇒test.zipにするとzipフォルダとして展開できるようになります。

[before]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662936/2fa2c446-41c7-7e43-2f61-370e71ea6dd8.png)

[after]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662936/c7223524-fb32-4b0d-e818-2b02c6f6a939.png)

## 2.thumbnail.pngを置き換える
モデルのプレビューはこの画像ファイルが表示されるようです。
もともとあったthumbnail.pngを削除し
表示させたい画像ファイルを"thumbnail.png"という名前で置き換えます。

[もともとのthumbnail.png]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662936/4a03be3d-aa95-074b-8337-b5f7715f2503.png)

## 3.拡張子を.slxに直してプレビューを確認
結果はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662936/dc8b253e-b095-0de7-1e3f-a94578746ae7.png)


# 終わりに
先輩の作成したSimulinkモデルにいたずらしてみてください。
バックアップをとるのはわすれずに。

なんでモデルが開けなくなるかは調査してみます、、
XMLとかでなんかもちょもちょやってるのかもしれない、、、