OmniAICreator/Qiita-1.07M huggingface dataset:
DOMをキャプチャしてPDFで保存する方法

## はじめに

DOMを画像としてキャプチャし、PDFに挿入してダウンロードする方法を備忘録として残します。

## 使用モジュール

以下のモジュールを使用します。

### html-to-image

バージョン：1.11.11
DOMを画像に変換できる

### jspdf

バージョン：2.5.1
PDFを生成・保存できる

## コード

```typescript
import { toBlob } from 'html-to-image';
import { jsPDF } from 'jspdf';

// blobファイルを読み込む
const readBlobAsDataURL = (blob: Blob) => {
  return new Promise<string>((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = () => {
      const result = reader.result as string;
      resolve(result);
    };

    reader.onerror = reject;
    reader.readAsDataURL(blob);
  });
};


// PDFをダウンロードする
const downloadPDF = async () => {
  const element = document.getElementById('app');

  if (!element) {
    return;
  }

  // blob形式に変換
  const blob = await toBlob(element);

  if (!blob) {
    return;
  }

  const dataUrl = await readBlobAsDataURL(blob);

  // jsPDFのインスタンスを生成
  const pdf = new jsPDF({
    orientation: 'p',
    unit: 'px',
    format: 'a4',
    compress: true,
  });

  // PDFの横幅
  const pdfWidth = pdf.internal.pageSize.getWidth();

  // 比率を計算
  const scale = pdfWidth / element.clientWidth;

  // 同じ比率でサイズを調整
  const width = element.clientWidth * scale;
  const height = element.clientHeight * scale;

  // PDFに画像を挿入
  pdf.addImage(dataUrl, 'JPEG', 0, 0, width, height);

  // PDFをダウンロード
  pdf.save('capture.pdf');
};
```

## 注意点

PDFのサイズが大き過ぎる場合、保存時にエラーになることがあります。
その場合は、複数ファイルに分けるなどの対処が必要になります。

## 最後に

### GoQSystemでは一緒に働いてくれる仲間を募集中です！

ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site?qiita=8ed0f600c487dfbcceb2
個人開発のテックブログ

## 概要
2024年春から個人でサービスの開発を行っています。本ページでは各サービスの技術構成、設計ポイント、実装ポイント、進捗状況などを紹介します。

## サービス(Q)
**期間：** 2024/06/01～現在 

**進捗：** 10%程度  

**概要：**  
　個人で使用するための金融×AIのサービスとして開発しています。webアプリ、Androidアプリ、iOSアプリ、Windowsアプリを展開したいと考えています。  
　このサービスを個人使用目的で開発する意図として、リスクの高いサービスであっても個人使用の範囲であればチャレンジできること、
リターンを個人で受けられることがあります。  
　また、金融知識の勉強やサービス開発の勉強のためにもなると考えています。  

**技術構成：**  
　アーキテクチャとしては、バックエンドをAPIとしたマイクロサービスにしたいと思っています。インフラはAWSを使用しています。  
　\-関連記事1- [個人開発サービス(Q)の技術構成](https://qiita.com/junetoken/items/5ff14c255126122f36b6)  
　\-関連記事2- [個人開発サービス(Q)のインフラ(AWS)アーキテクチャ](https://qiita.com/junetoken/items/60e43bf69cc18e599857)

**設計ポイント：**  
　//未作成  

**実装ポイント：**  
　//未作成  

**進捗状況：**  
　//未作成

## 関連記事一覧
 - [個人開発サービス(Q)の技術構成](https://qiita.com/junetoken/items/5ff14c255126122f36b6)  
 - [個人開発サービス(Q)のインフラ(AWS)アーキテクチャ](https://qiita.com/junetoken/items/60e43bf69cc18e599857)
仮想メモリ ＝ pagefile.sys は間違いです

Windows でメモリ関連の話をするときに噛み合わないな思い、これを説明することがよくあります。

## よく聞く間違い
Windows で仮想メモリに関連する設定は、パフォーマンス オプションにあり、pagefile.sys の配置先ドライブやサイズを変更できます。仮想メモリという項目で設定できるので、仮想メモリ ＝ pagefile.sys と考えている人を見かけますが、それは正しくないので注意が必要です。

![VirtualMemory.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853334/bb89081a-8620-9392-97ca-1dfd49aa6dda.png)

[変更] ボタンからページ ファイルの設定を変更できますが、今回は設定方法の話ではないので、設定方法を知りたい方は別の Web サイトに詳しく書いたので、そちらをご覧ください。

ページ ファイルの設定を変更する方法 | Microsoft Japan Windows Technology Support Blog
https://jpwinsup.github.io/blog/2023/02/08/Performance/Hang_BSOD/HowToChangePagingFileSetting/

## 仮想メモリの設定項目って何ができるの？
この設定では、ページ ファイル（pagefile.sys）のサイズを変更することで、仮想メモリのサイズを変更できます。ということは、**"仮想メモリ ＝ pagefile.sys"** であってるのでは？っと思ってしまいますが、仮想メモリのサイズには、物理メモリのサイズが含まれるので、これが間違いになります。

## 仮想メモリのサイズ
仮想メモリのサイズは、物理メモリのサイズとページ ファイルのサイズを足したものになります。つまり、以下の数式が成り立ちます。
```text
仮想メモリのサイズ = 物理メモリのサイズ + ページ ファイルのサイズ
```
端末に搭載している物理メモリのサイズが 4096 MB で、ページ ファイルのサイズを 1024 MB に設定すれば、仮想メモリのサイズは、5120 MB になります。

なお、仮想メモリのサイズ、物理メモリのサイズ、ページ ファイルのサイズは、PowerShell コマンドで確認できます。

```powershell
$wmiobject = Get-WmiObject Win32_OperatingSystem
# 仮想メモリのサイズ
Write-Output "Virtual Memory Size (KB): $($wmiobject.TotalVirtualMemorySize.tostring("#,0"))"
# 物理メモリのサイズ
Write-Output "Visible Memory Size (KB): $($wmiobject.TotalVisibleMemorySize.tostring("#,0"))"
# ページ ファイルのサイズ
Write-Output "Page File (KB): $($wmiobject.SizeStoredInPagingFiles.tostring("#,0"))"
```

Win32_OperatingSystem class - Win32 apps | Microsoft Learn
https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-operatingsystem


## もう一つの間違い
「ページ ファイル（pagefile.sys）って物理メモリが不足したときに使用される領域でしょ！」と考えていたらそれも間違いです。

物理メモリが不足していなくても使用されます。疑い深い人は、物理メモリが不足していない状態で、以下の PowerShell コマンドを実行し、CurrentUsage が０でないことを確認してみてください。
```powershell
Get-WmiObject Win32_PageFileUsage | Select-Object Name, AllocatedBaseSize, CurrentUsage | fl *

# 実行結果例
# Name              : C:\pagefile.sys
# AllocatedBaseSize : 33168
# CurrentUsage      : 638
```
Win32_PageFileUsage class - Win32 apps | Microsoft Learn
https://learn.microsoft.com/en-us/windows/win32/cimwin32prov/win32-pagefileusage

## さいごに
じゃあ仮想メモリって一体なにというかんじだと思いますが、それは別の投稿にしようかなと思っています。
Google Apps ScriptでSlackにメッセージを送信する方法

## はじめに ##

Slack APIを使用して、指定したチャンネルにメッセージを自動送信するスクリプトをGoogle Apps Script（GAS）で作成する方法をご紹介します。プロジェクト管理や通知の自動化に役立つ実装です。

## 必要な準備 ##

### Slack APIトークンの取得 ###
1. まず、Slack APIを利用するためにAPIトークンを取得します。 SlackのワークスペースにてSlack APIのページにアクセスし、適切な範囲の権限を持つトークンを取得してください。
トークンは、chat:write 権限を持っている必要があります。
1. Google Apps Scriptでの環境設定
Google Apps Scriptでプロジェクトを作成し、スクリプトプロパティにSlack APIトークンを保存します。
スクリプトプロパティは、以下のコードで設定します。
```javascript:title.gs
PropertiesService.getScriptProperties().setProperty('SLACK_API_TOKEN', 'your-slack-api-token');
```

以下は、Slackの指定チャンネルにメッセージを送信するための関数です。

```javascript:title.gs
/**
 * Slackの指定されたチャンネルにメッセージを送信する関数。
 * 
 * @param {string} channel - メッセージを送信するSlackのチャンネル名。例: "#general" や "#task"。
 * @param {string} text - 送信するメッセージのテキスト。例: "タスクが完了しました。"。
 */
function sendMessageToSlack(channel, text) {
  let url = 'https://slack.com/api/chat.postMessage';
  
  // スクリプトプロパティからAPIトークンを取得
  let scriptProperties = PropertiesService.getScriptProperties();
  let token = scriptProperties.getProperty('SLACK_API_TOKEN');
  
  if (!token) {
    Logger.log("Error: Slack API token is not set in script properties.");
    return;
  }
  
  // リクエストのペイロード
  let payload = {
    'token': token,
    'channel': channel,
    'text': text
  };
  
  // オプション設定
  let options = {
    'method': 'post',
    'payload': payload
  };

  try {
    // Slack APIにリクエストを送信
    let response = UrlFetchApp.fetch(url, options);
    let result = JSON.parse(response.getContentText());

    // Slack APIからのレスポンスを確認
    if (result.ok) {
      Logger.log("Message sent successfully to channel: " + channel);
    } else {
      Logger.log("Error: " + result.error);
    }

  } catch (error) {
    Logger.log("Error sending message to Slack: " + error.toString());
  }
}
```
## コードの解説 ##

- APIトークンの取得
スクリプトプロパティ (PropertiesService.getScriptProperties()) を使用して、Slack APIトークンを取得します。このトークンが存在しない場合、エラーログを出力して処理を終了します。
- ペイロードの作成
Slack APIにPOSTする際のペイロード（送信データ）を作成します。ここでは、APIトークン、送信先チャンネル、送信するテキストを設定します。
- APIリクエストの送信
UrlFetchApp.fetch を使用して、Slack APIにPOSTリクエストを送信します。成功した場合はログに成功メッセージが表示され、エラーが発生した場合はエラーメッセージが表示されます。
## 注意点 ##

- SlackのAPIトークンは機密情報のため、漏洩しないようにスクリプトプロパティや外部ファイルで管理しましょう。
- トークンやチャンネル名が正しく設定されていないと、メッセージ送信に失敗します。特にSlackのワークスペースやチャンネルが公開されているか、権限が正しく設定されているか確認してください。
## おわりに ##

このスクリプトを使えば、プロジェクトの進捗状況やタスクの完了通知などをSlackで自動化することができます。
【Javascript】乱数～ランダムな数字を出力する～


```ruby:0～1のランダムな数が出る（1は含まない）

var randnum = Math.random(); 
console.log(randnum);

出力例
0.87420719877558
0.16926314395231623
```
```ruby:0～10の間でランダムな数が出る（10は含まない）
var randnum = Math.random()*10; 
console.log(randnum);

出力例
4.8754318842710065
8.9099030485857
```
```ruby:0～10の間でランダムな整数が出る（10は含まない）
var randnum = parseInt(Math.random()*10);
console.log(randnum);

出力
0,1,2,3,4,5,6,7,8,9
```

```ruby:1～10の間でランダムな整数が出る（10を含む）
var randnum = parseInt(Math.random()*10) + 1;
console.log(randnum);

出力
1,2,3,4,5,6,7,8,9,10
```

```ruby:1～3の間でランダムな数が出る
var randnum = parseInt(Math.random()*3) + 1; 
console.log(randnum);

出力
1,2,3
```

```ruby:5～7の間でランダムな数が出る
var randnum = parseInt(Math.random()*3) + 5; 
console.log(randnum);

出力
5,6,7
```
Azure初心者がLogic Appsについて調べてみた

## はじめに
先日、Microsoftのイベント「Azure Bootcamp 2024」にて開催されたセッション「AI時代におけるアプリイノベーション」に参加しました。そこで紹介されたトピックのうち、Azure Logic Appsの基本知識をまとめたいと思い、この記事を書くことにしました。

## Azure Logic Appsとは
[公式サイト](https://learn.microsoft.com/ja-jp/azure/logic-apps/logic-apps-overview)には
>クラウド プラットフォームであり、コードをほとんど、またはまったく使用せずに、自動化されたワークフローを作成して実行できます。事前構築済みの操作から選択することで、アプリ、データ、サービス、システムを統合および管理するワークフローをすばやく構築できます。

とありますが、これだけではあまりわからなかったので、記事などをみて理解を進めたところ、以下のような機能を提供するサービスであるという理解に落ち着きました。
- **プログラミングスキルがなくても、自動化システムを直感的に構築できる**
- **トリガーとアクションを組み合わせることで、タスクの自動化やスケジュール設定、メールの自動送信などを簡単に実現できる**


## 他サービスとの比較
Microsoftは、Azure Logic Appsのほかにも多くのサービスを提供しており、混同しやすいサービスもあります。その違いについてみていきましょう。
### 1. Azure Functionsとの違い
Azure Logic AppsとAzure Functionsは、どちらもサーバーレスでオーケストレーションができるサービスなので、混同しやすいですが、**コードを使用するかしないかが大きな違いだと思います。**

・Azure Functions：プログラミング言語を使ってアプリを作成するためのAzureサービス
・Azure Logic Apps：ノーコード・ローコードでアプリ開発を行うサービス

### 2. Microsoft Power Automateとの違い
Azure Logic AppsとMicrosoft Power Automateは、どちらもワークフローができるサービスです。
その違いは使用する用途の違いだと思います。


Azure Logic Appsはシステム開発などに使用されるのに対し、Microsoft Power Automateは企業の業務プロセスの自動化などに使用されます。

また、Azure Logic Appsを元にMicrosoft Power Automateは作られているため、操作性など似ている点が多いと言われています。


## 自動化の具体例
公式サイトでは、Azure Logic Apps を使用して自動化できるタスク、ビジネス プロセス、ワークロードの一例として下記のものが挙げられています。

- Office 365 を使用して、特定のイベント (新しいファイルのアップロードなど) が発生したときの電子メール通知をスケジュールして送信する。
- オンプレミス システムとクラウド サービスの垣根を越えて顧客注文をルーティングし、処理する。
- アップロードされたファイルを SFTP サーバーまたは FTP サーバーから Azure Storage に移動する。
- ツイートを監視したり、そのセンチメントを分析したり、確認が必要な項目についてアラートやタスクを作成したりする。


これを、トリガーとアクションの組み合わせに分けて読み解くと下記のようになります。
- 特定の時間になったら（トリガー）、メールを通知する（アクション）
- 顧客の注文がオンプレミスシステムに到着したとき(トリガー)、その注文データをクラウドのサービスに送って処理する(アクション)
- SFTP/FTPサーバーに新しいファイルがアップロードされた時(トリガー)、そのファイルをAzure Storageに移動(アクション)
- 特定のツイートやキーワードがTwitterに投稿された時(トリガー)、そのツイートをセンチメント分析し、必要に応じてアラートやタスクを自動生成(アクション)


**これらのタスクは、Logic Appsの「コネクタ」を使用して構築されます。**
コネクタは、トリガーとアクションを組み合わせるための豊富な選択肢を提供しており、あらゆるサービスやアプリケーションと簡単に連携できるようです。


## ワークフロー作成の手順
Azure Logic Appsでワークフローを作成するには、以下の基本手順に従います。

1. リソースの作成
Logic AppsをAzureポータルで新規作成します。

2. トリガーの設定
ワークフローを開始する条件（トリガー）を設定します。たとえば、ファイルがアップロードされたときや、特定の時間に自動実行されるように設定します。

3. アクションの設定
トリガーが発生した後に実行されるアクションを設定します。例として、メールの送信やファイルの転送などが含まれます。

## Azure Logic Appsのメリットとデメリット
### メリット
1. 視覚的なワークフロー作成
コードを書かずに、視覚的にワークフローを作成できる。GUIを使って、必要なトリガーやアクションを簡単に設定できるため、プログラミング経験がなくても開発が可能。

2. 開発時間の短縮
ローコードツールであるため、クリック操作のみでワークフローの設計・実装ができ、開発時間を大幅に短縮できる。

3. 豊富なコネクタ
多数の事前構築済みコネクタが提供されているため、Office 365、Salesforce、Twitter、Azureの各サービスなどと簡単に連携できる。


### デメリット
1. 従量課金制によるコスト増加
Logic Appsは従量課金制のため、トリガーが頻繁に発生するワークフローや、大規模な処理を行う際はコストが高くなる可能性がある。特に、トリガーの発生頻度が多い場合は注意が必要です。

2. カスタマイズの限界
高度なロジックやユニークな要件を実現する際には、Azure Functionsなどのコードを書くサービスと組み合わせる必要がある。


## まとめ
プログラミングの知識があまりない初心者でも、視覚的なGUIでタスクの自動化ができるという点が、最大の魅力だと思います。従量課金制となるので、個人での利用の際は費用の面が心配ですが、簡単なタスクの自動化を試してみたいと思いました。
GenericHostのILoggerでDebug以下のログを出す時に引っかかりがちなポイント

# 概要

.NET 8のテンプレートでWindowsサービスを作成した場合に（つまりテンプレートでGenericHostを使った場合に）、ILoggerでDebug,Traceなどの詳細レベルのログを出そうとすると、デフォルトでOFFになっている上にフィルタの階層が複数あるので、意外なところで引っかかります。その解決方法をいくつか紹介します。ちなみに、Windowsサービスの作成方法は[以前の記事](https://qiita.com/spc_ksudoh/items/675b8fe5b04596763ede)で紹介しました。

# 最初に結論

1. カテゴリ別のデフォルト設定を持っているタイプ（コンソール出力のConsoleLoggerProviderなど）は、appsettings.jsonやコード上のAddFilter()でフィルタを上書きする必要があります。
2. カテゴリ別のデフォルト設定を持たないタイプは、まずテンプレートで生成されているappsettings.jsonに注意。そこを書き換えるか、削除してコード上のSetMinimumLevel()などで設定する必要があります。

## 詳しく

## カテゴリ別のデフォルト設定を持っているタイプ

とりあえず動作確認として手軽にログを見ようとする場合、GenericHostに最初から入っているコンソール出力やAddEventLog()で追加したイベントログ出力が便利なので、使うことは多いと思います。しかし、そこにDebugレベル以下を出そうとすると、出ません。 `builder.Logging.SetMinimumLevel(LogLevel.Trace)` のようにログレベルを設定してみても、出ません。

ConsoleやEventLogのプロバイダは、カテゴリ別のデフォルト設定を持っているためです。それぞれのプロバイダに対して、設定を上書きする必要があります。appsettings.jsonの追記、もしくはコードの追記で、これらを書き換えます。コンソールの設定例を次に書きます。

appsettings.jsonの例

```json
{
  "Logging": {
    "Console": {
      "LogLevel": {
        "Default": "Trace"
      }
    }
  }
}
```

コードの例

```csharp
var builder = Host.CreateApplicationBuilder(args);
（略）
builder.Logging.AddFilter<ConsoleLoggerProvider>(level => LogLevel.Trace <= level);
```

このどちらかの設定をすると、コンソールへのログ出力に、Trace・Debugのレベルが含まれるようになります。

## カテゴリ別のデフォルト設定を持っていないタイプ

カテゴリ別のデフォルト設定を持っていなければ、全体の設定に従います。では今度こそ、 `builder.Logging.SetMinimumLevel(LogLevel.Trace)` を設定すれば出力される・・・と思ったら、出力されません。ここで、コードの方だけを見ていると罠にはまります。

テンプレートで生成されたコードをよく見てみると、プロジェクトの中に「appsettings.json」ファイルが有ります。こいつが、次の内容になっています。

```json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
}
```

この `"Default": "Information"` でフィルタされてしまうので、コードの方だけで設定を変更しても出力されません。自分でappsettings.jsonを書いていればすぐ気付くことですが、テンプレートで生成してそのままにしておくと見落としがちなので、注意です。

というわけで、次のようにTraceレベルに変更すれば、出力されるようになります。

```json
{
  "Logging": {
    "LogLevel": {
      "Default": "Trace",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
}
```

あるいは、その `"Default"` キーの部分は削除してしまい、コード上で設定します。

```csharp
var builder = Host.CreateApplicationBuilder(args);
（略）
builder.Logging.SetMinimumLevel(LogLevel.Trace);
```

これで、デフォルト設定を持っていないプロバイダのログ出力に、Trace・Debugのレベルが含まれるようになります。

# まとめ

ILoggerでのDebug・Traceレベルのログ出力方法について、引っかかりがちなポイントを2つ紹介しました。同じところで引っかかっている人の問題解決に役立ったら嬉しいです。

ILoggerはとても便利な仕組みで、あれこれ初期化や組み込むためのコードを書かずともログ出力ができて助かります。しかし、デフォルトと違う動作にしようとすると、理解して使わないと意外なところで引っかかるので、注意です。もっとちゃんと全体を理解しようという場合は、MSのこのあたりのドキュメントが良いと思います。[C# でのログ記録 - .NET | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/core/extensions/logging)
API Management セマンティックキャッシュの魅力【Microsoft Azure Bootcamp】

# はじめに

先日の9月12日に行われたイベント
「Microsoft Azure Bootcamp -AI 時代におけるアプリイノベーション-」に参加しました。

https://www.microsoft.com/ja-jp/events/jpazurebootcamp/

<br>

本イベントでは、AIがアプリケーション開発に与える影響や、Microsoftの戦略的ビジョンについて詳しく説明されました。
AI技術がどのように設計・開発・展開プロセスを革新するかを学べるセッションで、AIを活用した次世代アプリの構築や既存のソリューションへの統合方法が紹介されました。

<br>

本記事では、**Azure API Managementのセマンティックキャッシュ**を使用することで得られるメリットについて解説します。


# API Managementとは?


その名の通り**APIを効率的に管理できるサービス**で、以下のような特徴があります。


1. **リソース使用量の可視化**: トークン使用量を追跡し、ユーザー、サービス、サブスクリションごとの詳細な分析を提供

1. **リアルタイムモニタリング**: 使用状況をリアルタイムで監視し、将来の需要を素早く予測

1. **コスト割り当て**: チャージバック機能により、リソース使用コストを適切な部門やチームに割り当て可能


<br>

例えば、複数のユーザーで共有されるクォータ(容量)がある場合に、
**トークンを追跡することで、リソースを誰がどのように使っているのかを可視化することができます。**

https://azure.microsoft.com/ja-jp/products/api-management

<br>


## セマンティックキャッシュとは？
Azure OpenAIとAPI Managementを組み合わせることで、追加のポリシーを利用することができます。
その一つが**セマンティックキャッシュ**です。

セマンティックという言葉の意味はコンピュータが文書や情報の意味を正確に理解し、関連付けや検索を効率化する技術です。
<br>


**セマンティックキャッシュ**を利用することで、前にユーザーが入力した質問や答えを保存しておき、似たような質問がきた時にLLMを使わずにすぐに保存された答えを返すことができます。


<br>

これにより得られる**メリットが二つ**挙げられます。

#### 1. 回答速度の向上

キャッシュから回答を返すため、応答速度が劇的に改善されます。
イベントで行われたECサイトの商品検索チャットデモの例を挙げます。

マグカップについてチャットで質問を行いました。
<br>

初回の応答時間は1.7秒だったのに対し、
2回目の同じ質問に対しては**0.2秒**で回答が返されました。

これは**約8倍の速度向上**です。

応答待ちの時間が短くなることで、ユーザーエクスペリエンスを向上させることができます。


#### 2.コスト削減
同じ質問に対して毎回LLMを呼び出さないことで、APIの呼び出し回数を削減でき、その結果として運用コストが抑えられます。
特にLLMを利用する際には、コストが高くつく場合もあるため、頻繁に行われる質問への対応をキャッシュで済ませることは、サービス提供者にとって大きな利点となります。


https://learn.microsoft.com/ja-jp/azure/cosmos-db/gen-ai/semantic-cache


## 終わりに
以上のことから、Azure API ManagementとAzure OpenAIの連携で使える**セマンティックキャッシュ**という機能は、
よくされる質問に対してキャッシュを活用することで素早く回答を返すだけでなく、コスト削減も期待できるのでユーザーとしても、開発者としても大変役に立つ機能だということがわかりました。

FAQシステム、製品検索など、類似の質問をされる可能性の高い場合に活用していけそうですね！

他にもマルチAIエージェントなど、APIを活用した事例が発表され、今後のAI活用の幅が広がったと感じたイベントでした。
Pardot API を使って　行動履歴を取得する



フィルター条件でNullを選択したいようです。

+ [Querying and filtering visitor activity of non-prospects (Pardot API)](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifnMFSAY)

I tried using prospectId=NULL but that doesn't work.  Is there any way I can use operators like is NULL or != ? 


以下の解説やリファレンスを見ても、NULLでの検索はなさそう。

+ [ApexでAccount Engagementの行動履歴を取得する](https://qiita.com/nobuyuki-ishii/items/19b250a1b32d5521bd5f)

+ [Visitor Activity Object](https://developer.salesforce.com/docs/marketing/pardot/guide/visitor-activity-v5.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c5627a17-5080-074e-138e-36fe67746a47.png)
[FontViewMax]真に利用可能なフォント一覧を表示するフォントビューアをリリース(一般ユーザとして追加したフォントも見れる)

# Font Viewer を作りました
以下の Github にて公開していますので、ダウンロードして使ってみてください。

https://github.com/tkmry/FontViewMax

![screen_shot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124578/7b9a7364-dae1-3ca1-84d2-543ef5980aef.png)

以降はなぜ作ったのかや、実装するための技術的な情報について落としておきます。

# はじめに
最近 GIMP という画像編集ソフトを触る機会があり、様々なテキストを画像内に配置していました。その際にどのフォントを当てようか悩む事が多々あり、この不満を解消できるようなフォント一覧化ツールを探しましたが、自分で追加したフォントが一覧ツールに表示されませんでした。

色々調べてみた所、フォントの追加には「システムにインストール」と「個人のプロファイルにインストール」する2種類ある事が分かりました。

どうやら既存のツールはこの「システムにインストール済み」のフォントは表示できるが、後者に未対応であったようでした。調べたそのままの流れで、せっかくならば作ってしまおうと思い、リリースするに至りました。

# 実行環境
* Windows 11 Pro 23H2

# 使用技術
* PowrShell
* Webview2
* HTML/CSS/JS+jQuery

# PowerShell + WebView2 について
私の過去の記事をご参照ください。古い記事で拙い点も多いですが。。。

https://qiita.com/tkmry/items/c8987fe57a7469d53977

# フォント一覧の取得(システムに追加されているフォント)
PowerShell で フォント一覧を取得するのは以下のように実行するだけで取得できます。

https://yomon.hatenablog.com/entry/2015/07/27/192837
```powershell
Add-Type -AssemblyName System.Drawing
(New-Object System.Drawing.Text.InstalledFontCollection).Families.Name
```

ただし、このコードで取得できるのは「システム」にインストールされたフォントのみとなります。
フォントの管理フォルダは「システム」用以外にも、ユーザプロファイル配下にも存在するため、そちら側の情報も拾えるようにする必要がありました。

# フォント一覧の取得(一般権限で追加したフォント)
一般権限で追加したフォントはユーザプロファイル配下の `%LOCALAPPDATA%\Microsoft\Windows\Fonts\` に追加されます。
このフォルダ直下のファイルをそのままフォントとして指定したいのですが、フォントを利用する際にはフォントのファイル名ではなく、それ自身のフォント名を指定する必要があります。
以下の要領でフォントファイルからフォント名を取得します。

https://dobon.net/vb/dotnet/graphics/privatefontcollection.html
```powershell
Add-Type -AssemblyName System.Drawing
$fo = New-Object System.Drawing.Text.PrivateFontCollection
$fo.AddFontFile($fontPath)
$fo.Families.Name
```

# WebView2 でブラウザで見れるようにする
WebView2 の技術を使うと、スクリプトやプログラムに MS Edge を埋め込む事ができます。
これを活用して以下のように実装しました。
1. PowerShell でフォント一覧を取得する(システム及びユーザ追加分)
1. WebView2 でウィンドウの一部としてブラウザを表示する
1. PowerShell から WebView2 に利用可能なフォント一覧を送信してサンプルを表示

[PowerShell] と [PowerShell から起動した WebView2] は専用のメソッドでメッセージング通信が可能になります。
ブラウザ側のレンダリングが落ち着いたらフォント情報を要求し、PowerShell 側から取得したフォント名を送る事にしました。

# ブラウザ側でのフォントの表示
システムにインストール済みのフォントは CSS で font-family を指定すれば普通に使えました。しかし、ユーザプロファイル配下に追加したフォントは、デフォルトではブラウザから利用ができませんでした。そこで、font-face を用いてローカルファイルを参照可能にする方法を利用しました。

https://autoproject.nagoya/4510/
```css
/* ユーザプロファイルに追加されているフォントの数だけ定義する */
@font-face {
    font-family: "${fontName}";
    src: url("${fontPath}");
    font-display: swap;
}
```

フォントを利用できるようにするためには、フォントのPathが必要になるため、PowerShell から WebView2 に送信する内容に、ローカルのフォントファイルのPathを付帯させる事にしています。

# おわり
このようにして以下の2種類のフォントの一覧化ツールを実装しました。

* システムにインストール済みのフォント
* ユーザプロファイルにインストール済みのフォント
デザインパターンなど暗記するな、要はインターフェイスの使いどころだ

# デザインパターンが覚えられない？
私もです。
忘れて読んで、意識して使うことなく、時を経てまた忘れます。

いいんです、そんなの。
知らなくってもいいコード書けます。
知ってる GoF パターンの数と、プログラマーの生産性が比例するわけでもない。

そうやって自分の記憶力のなさを慰めてきました。

ただ、ここ最近行った機能拡張のためのリファクタリング作業で、あるインターフェイスを導入することで一気にコードが整理されていくという経験を経て、確信に変わりました。

# デザインパターンを覚える必要などありません。
あえて挙げるなら、ストラテジーのエッセンスだけ、覚えるというより馴染むことができるといいでしょう。
あとはぼんやり「そんなのあったな」くらいの状態で頭に残しておき、必要なときにピンと来て調べれば十分です。

現実的なことで言うと、今どきの充実したフレームワーク環境で求められるのは、パターンの組み方より使い方です。
歴史的には、ソートアルゴリズムを組めることが生産的なプログラマーの必要条件でなくなったことと似ています。
現代のプログラミング言語を使っていれば、自然と馴染んでいる部分が多々あります。

思えばデザインパターンを覚えようとしていたのは、「これくらい知っていないと恥ずかしい」というネガティブな動機からでした。
今はそのことを恥ずかしく思います。
特に知らずに困ったとか、あのとき知っていれば、という経験はないのです。

もともとデザインパターンは、優秀な人が時間をかけるとたどり着く解を汎用的に整理したものです。
再利用性が高いならフレームワークがサポートすべきですし、そうでないなら使える場面は限られます。
同じく迷う人のヒント、省力化にはなりますが、実務では試験のようにまんまのお題は出てきません。
丸暗記しても使いどころを間違えるだけです。
改修であれば既存コードをよく知ることも必要不可欠でしょう。
今困っていることに最適な解は、最終的には自分で見出だすしかありません。

# 残念ながら、パターンを覚えたくらいでコード品質が上がるほど現実は甘くない
ということですね。
知識を持っているだけでは負債です。
使いこなせて初めて、技術の効果が出ます。
使いこなせるということは、使う場を間違えない、必要な場でしか出さない、ということになります。

ドラえもんに求められるのは、持っている道具の数ではありません。
膨大な数の道具から、今ののび太にふさわしい道具を見つけ出すことです。
それができているかは評価の分かれるところですが。

# ブレークスルーを起こすのは適切なインターフェイスの導入です。

コード空間に広がる概念を、どういう枠でどう括るか。
これは形式的に体系化するのが難しいかもしれません。
知識ではなく、実践にもとづくセンスが求められます。

いつでもどこでも使えるような正解はありませんが、適切なインターフェイス導入の効果は絶大です。
これまでの開発経験の中で、「このインターフェイスが勝負を決めた」ということが何度かありました。
それを生み出す過程は、瞬間の思いつきだったり、丸一日かけた試行錯誤の末だったり、いろいろです。

こうしたインターフェイスの特徴として、しっくりくればくるほど、目立たない形で力を発揮します。
その枠に沿って実装していると、自然と恩恵を受け続けることができます。

# では、それを習得するにはどうすればいいのか？
インターフェイスについては、抽象化、標準化、疎結合…いろいろと表現できると思いますが、肝となるのは「どの切り口でどこまでのクラス群を括り、どんな役割を与えるか」でしょう。
各インターフェイスの役割と適用範囲が明確になることで、独立性の高い協調関係が生まれます。

私がうまくいったと思ったときは、以下のような点が功を奏しました。

- 命名は重要です。役割、適用範囲が決まったら、それらを名前に込めましょう。そうすることで、ブレることなく、適切なクラスで実装、適切な場で使用されることが期待できます。

- 継承関係のない（異なる成り立ちを持つ）対象も透過的に扱うことになりますので、機能にしても適用範囲にしても、あまり欲張らない方がいいです。実装には網羅性が求められますが、インターフェイスは想定された文脈において必要となる振る舞いさえサポートできれば十分です。

- なくて済むならインターフェイスはいらないです。なんとなく、とりあえず、格好いいから、皆そうしているからとインターフェイスをつけてみたところで、あとでいいことが待っているわけではありません。役に立つ場面がなければ開発効率を下げるだけですので、現実の要件やソースコードと向き合って吟味しましょう。

- リバート覚悟でいろいろ試して最適解を見つけるのも、過程はしんどいですが、いい経験になります。

# と、勢いで書いてみたものの
これまで何度かデザインパターンの本を通読する中で、考え方など勉強になった点は多々あります。
もちろんインターフェイスの使い方以外にも。
リファクタリングのパターンなどは、「なるほど！」と、そのまま使えるものも結構ありました。
凝縮された先人の知恵ですから、暗記せずとも、一度は目を通してみるといいですね。

# なんだ、抽象的な精神論か。
デザインパターンと違ってコード例もないし。
そう思われたかもしれませんね。

そうなんです。
インターフェイスという抽象的な手法を身につけるには、具体的な How To より、抽象的に考える習慣の方が役立つのではないか。
それには、解説付きの正解を見るのでなく、解答のない問いに自分でぶつかるのが一番だ。
飛び道具はないから、日々の開発を丁寧に行うことが、結果的に最短の道だろう。
というのがこの記事の問いでした。
Arduino UNO 3でmin(最小)を求めて遊ぶ


Arduino UNO 3でmax(最大)を求めて遊ぶ


C++ Arduino アルゴリズム ArduinoUno


目的
マクロを使い配列から最小値をサーチして求める


いろいろ
アルゴリズムの教科書では、
ドラクエ1的に言ったらレベル99で最終章
初期値に最大の値を設定するところがちょつとムズイ


結果

![o_coq420.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4049225c-3e72-705a-c4d6-beaaa616e960.jpeg)


プログラム


```c++


#include <Arduino.h>

//min_wo_sagasu_UNO_1

//初期化
// the setup routine runs once when you press reset:
void setup() {

  //シリアルポートの初期化
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);

}//setup


#define n 20

//メインループ
// the loop routine runs over and over again forever:
void loop() {

  int a[n] = {
    67, 36, 69, 73, 51, 55, 40, 43, 29, 35,
    70, 49, 34,  1, 41, 41, 53, 67, 34,  3
  };

  int min_a = 32767;
  for (int i = 0; i < n; i++) {
    min_a = min(min_a, a[i]);
  }//for

  //結果の表示
  // print out the value you min:
  Serial.println(min_a);
  delay(1000);        // delay in between reads for stability

}//loop


```
AWS Lambda - Provisioned Concurrency設定時の振る舞い

AWS LambdaにProvisioned Concurrencyを設定した際、不可解な現象に遭遇したため、原因を調査した。

### 発生した現象

Provisioned Concurrencyを設定したLambda関数について、同時実行がないにも関わらず下記のような `Init Duration` を含むログが出力され、コールドスタートが発生してしているように見える。さらに `Init Duration` の数値がOn-Demand Concurrencyの場合に比べて大幅に増加している。

```
REPORT RequestId: xxxx	Duration: xx ms	Billed Duration: xx ms	Memory Size: xx MB	Max Memory Used: xx MB	Init Duration: xx ms
```

### 解析結果

* 結論としては、ログに `Init Duration` が出力されているが、実際にはコールドスタートは発生していない。
* Provisioned Concurrencyを設定した場合も定期的にインスタンスの破棄・再構築が行われる。設定したConcurrency数を常に維持するように、インスタンスの破棄・再構築はLambda関数実行とは非同期に実行されるが、再構築直後の関数実行時のREPORTログに再構築時のInit処理時間が `Init Duration` として記録される。
* On-Demand ConcurrencyではInit処理にCPU burstが適用されるが、Provisioned Concurrencyでは適用されない。このためInit処理時間が長くなる。

### 参考

* [Understand the Lambda execution environment lifecycle - AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtime-environment.html)
* [Provisioned Concurrencyで予約したLambda実行環境のライフサイクルを調べてみた #reinvent | DevelopersIO](https://dev.classmethod.jp/articles/provisioned-concurrency-env-lifecycle/)
* [LambdaのINITフェーズではメモリ128MでもCPUパワーをフルに使える？！boost host CPUの動きを確認してみた | DevelopersIO](https://dev.classmethod.jp/articles/lambda-boost-host-cpu-in-init-phase/)
* [Provisioned Concurrency な Lambda の実行時間をどう監視すべきか - ENECHANGE Developer Blog](https://tech.enechange.co.jp/entry/2022/03/18/172741)
* [Why cold starts of a lambda with provisioned concurrency are much slower than cold starts of on demand instances? | AWS re:Post](https://repost.aws/questions/QUoK1sk8CUTyGN7VESAcjlgA/why-cold-starts-of-a-lambda-with-provisioned-concurrency-are-much-slower-than-cold-starts-of-on-demand-instances)
JavaScriptのprintデバッグは{variable}形式が便利


JavaScript や TypeScript で print デバッグを行うとき、確認対象と変数名を一緒に表示するためにラベル用の文字列をつけて表示することがあるかと思います。例えば以下の感じ。

```javascript
const cat = { emoji: '🐈' };
const dog = { emoji: '🐕' };
console.log('cat: ', cat); // -> cat:  { emoji: '🐈' }
console.log('dog: ', dog); // -> dog:  { emoji: '🐕' }
```

このとき、[オブジェクトの値の省略記法](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AE%E5%AE%9A%E7%BE%A9)を使うと便利です。

これは「キーと同じ名称の変数を値にとるオブジェクトを生成するときには値の記述を省略できる」というもので、確認対象の変数をオブジェクト初期化子でラップすることで結果としてラベル（キー）つきで表示できます。

```javascript
// my favorite style
console.log({ cat }); // -> { cat: { emoji: '🐈' }
console.log({ dog }); // -> { dog: { emoji: '🐕' }
```

この方法を使うと、変数名を繰り返す必要がなくなり、またエディタのリネーム機能（e.g. [VSCode の場合](https://code.visualstudio.com/docs/editor/editingevolved#_rename-symbol)）を使って変数名を変更した際にラベルも一緒に変更されるため、変数名とラベルの整合性を保ちやすくなります。

コスパの良い print デバッグの tips としておすすめなので、手癖でオブジェクト初期化子でラップしておくと良いかもしれません。
aws hands-on がすごく役立った件

## aws初心者の私は、これがとても役立ちました。
自分用メモです。

### AWS ハンズオン資料
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-hands-on/

AWS 初心者向けハンズオン
AWS 初心者向けに「AWS Hands-on for Beginners」と題し、初めて AWS を利用する方や、初めて対象のサービスを触る方向けに、操作手順の解説動画を見ながら自分のペースで進められるハンズオンをテーマごとにご用意しています。
CLFのOUTPUT

# コンピューティングリソースの最適化
## サイジングとは？
システムやサービスの規模に合わせてリソースを見積、適切な規模を決定することを指す。
### 主な特徴
- システムやサービスの要件に基づいて、必要なサーバー台数、ディスク容量、ネットワーク帯域などのリソースを見積もる作業
- システムの安定稼働の為に非常に重要な工程
- 新規システム構築の場合は、予想に基づいて見積もりを行う
### AWSでサイジングを特定できるAWSのサービスまたはツールは何か？
#### AWS Compute Optimizer
AWS Compute Optimizerは機械学習を利用してインスタンスの使用パターンを分析し、パフォーマンスとコストのバランスを最適化するためのインスタンスタイプやサイズの推奨事項を提供する
#### AWS Const Explorer
使用状況とコストのデータを視覚化し、インスタンスの最適化を支援するために推奨されるサイズの機会を提供
ARFoundationでArucoMarkerをマーカーに指定すると"Failed to get enough key points from target image"とエラーが出てビルドできない

問題：タイトルの通り

解決法：ArucoMarkerの周囲に余白を追加する

環境：
Windows10
Unity2022.3.19f1
BuildSettings Android

Source:
https://stackoverflow.com/questions/78941537/opencv-not-able-to-detect-aruco-marker-within-image-created-with-opencv
2024/9/17主にITとかセキュリティの記事

日本の自動車業界に迫るサイバーセキュリティの脅威とは？
日本の自動車産業のサイバーセキュリティの現状(9/14)
https://news.3rd-in.co.jp/article/a5b734b4-7233-11ef-b4d5-9ca3ba083d71#gsc.tab=0

創業者が逮捕された通信アプリTelegramが内包する危険性(9/14)
https://news.yahoo.co.jp/articles/f6e44b9682ad08717415dc5b533f94ff71283eeb?source=rss

HTTP通信を止めて書き換えるBurp Suite入門(9/15)
https://dev.classmethod.jp/articles/burp-suite-getting-started/

米国 CISA リスクと脆弱性のアセスメント 2023年度版(2024.09.13)(9/15)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/09/post-05b234.html

AWSを不正利用された際の反省と教訓(9/14)
https://qiita.com/JZ8xNeXY/items/1f31aa7c85742558709d

VPNをわざわざ利用するメリットは一体何でしょう？(9/15)
https://ascii.jp/elem/000/004/221/4221859/?rss

社長はiPhoneとAndroidどちらがいい？(9/15)
https://agora-web.jp/archives/240913222844.html

NewsPicks トピックス 『デジタル政策と未来社会』のまとめ(2024.9.9～2024.9.15）
https://blogs.itmedia.co.jp/business20/2024/09/newspicks_2024992024915.html?ref=rss

能動的サイバー防御　通信の秘密侵す恐れないか(9/15)
https://www.chugoku-np.co.jp/articles/-/527283

Qiitaのトレンド記事を要約してまとめたモノ（さぼり）(9/15)
https://qiita.com/chi1180/items/dd11c1ff97f070ead8b0

ランサムウェア被害の発生について　藤森工業株式会社(9/15)
https://ssl4.eir-parts.net/doc/7917/ir_material9/237327/00.pdf

カード停止後も不正利用相次ぐ スマホのタッチ決済悪用か(9/15)
https://www3.nhk.or.jp/news/html/20240915/k10014582481000.html

ドローン戦に備えゲーマー人材の自衛官採用を　チーム連携と課題解決能力に期待(9/15)
https://www.sankei.com/article/20240915-U46THZD3TRKE7MHJAIRES7EYOU/
ゼロから始めるAIシステム開発 #01 「初歩の初歩」

## 自己紹介
ミナイと申します。
- 非エンジニア
- 工業系の高校と大学でプログラミング経験あり
- 進路は別ジャンルへ、20年ほどブランクあり
このほぼゼロの状態からAIシステム開発を勉強する過程を公開していこうと思います。

## 1週目
- Amazon Bedrockについて調べる
そもそもAWSについて概念しか分かってないので単語レベルですべてが分からない。エンジニア語が出るたびにググる始末。寄り道に寄り道を重ねた末にAWSコンソールをチョットワカル程度になり、Stable Diffusion XLを体験。
- Stable Diffusion XLについて調べる
触りながら調べる。思い描いた構図で出力するのがかなり難しい。ガチャとはよく言ったもの。多少でも絵心があればi2iでやったほうが大幅に早そう。
### SDXL 設定について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885923/af13b765-95dd-546c-6661-da73ae7c1fbf.png)
- Action
t2i、i2i、編集の3つ。
- 応答画像
ランドスケープは横長、ポートレートは縦長
- プロンプト強度
プロンプトを反映させる強度。
- 生成ステップ
サンプリングの回数。大きければ正確な画像が出やすいらしい。
- シード
ガチャの番号みたいなもの。同じシード値にすると同じキャラを出せたりするらしい。
### コスト
SDXLは小サイズで1枚3円弱、Titanはもうちょっとだけ安い。

## 入門書を読むことに
ボスからの提案により入門書を読んで実践することに。

**Amazon Bedrock 生成AIアプリ開発入門 ［AWS深掘りガイド］**
https://amzn.asia/d/co7MB5S
![2240915.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885923/644c78f6-022e-6115-34f4-de9085a66320.jpeg)
80Pほど読了。2章のハンズオンの部分直前で全体の15％ほど。かなり基本のキからやってくれるのでありがたい。（以下の記述には一部僕の解釈が含まれます。）
### 1章 生成AIの基本と動向
箇条書きでメモ。
- 人口知能 ⊃ 機械学習 ⊃ 深層学習
生成AIは深層学習。特徴量（結論を導くための手がかり。たとえば競馬なら「府中は直線が長いから差し馬が有利では？」的な推論のこと）を人間の手で与えずとも機械が見つけてくれるのが強み。
- 基盤モデルとは
大量のデータでトレーニングされた汎用モデルのこと。これを調整することで用途に特化させることができる。
- パラメーター
ここからはモデルの用語。この数字が大きいほど推論の性能が上がるが計算リソースやコストも上がる。
- トークン
モデルがデータを処理する際の単位。モデルの一度の処理限界量のように表記される。8Kトークンだとブログ記事1本程度、100Kトークンだと文庫本1冊程度が目安。
- ディメンション（次元数）
「埋め込み」の性能の一つ。埋め込みとは単語にベクトルを付与して関連性を角度や距離の遠近で表現できるようにすること。次元数が大きいと多方向（多次元）にベクトルを伸ばせるので多くの情報を保持できる。
### 2章 Amazon Bedrock入門
他サービスと比較してのBedrockの優位性と使える生成AIについての説明。
Bedrockの優位性は
- シェアが高いので知見を得やすい
- 既存のAWSシステムに生成AIを組み込みやすい
- モデルを利用する際にデプロイが不要
- 高いセキュリティとガバナンス
とのこと。

使えるモデルの種類は主に3種
- テキスト生成
- 埋め込み
- 画像生成

テキスト生成モデルは
- Anthoropic社の「Claude 3」シリーズ
この書籍オススメのモデル。他は日本語非対応なものが多いがこれは上中下位3段階のモデルが全て日本語対応。
- Cohere社の「Command R」シリーズ
RAG（解説は4章）に強いらしい。最上位モデルは日本語対応。
- Amazonの「Titan Text」シリーズ
RAGやAIエージェント（解説は5章）に強いらしい。最上位モデルは英語のみで中位下位モデルは日本語対応。自社モデルだからかClaude3シリーズより安め。
- Meta社の「Llama」シリーズ
オープンソースなのが特徴。コストはClaude3シリーズより安め。
- Mistral AI社の「Mistral」シリーズ
日本語非対応だが高性能でオープンな大規模言語モデルが含まれるため企業開発向き。コストは普通。
- AI21 Labs社の「Jurassic」シリーズ
日本語非対応でコストも高め。あまり利点は感じない。

埋め込みモデルは
- Amazonの「Titan Text Embeddings V2」「Titan Multimodal Embeddings G1」
- Cohere社の「Embed」シリーズ
の2社のみ。Titanのほうが入力可能なトークンが大きい上にコストも安い。Titan Multimodal Embeddings G1はBedrockで唯一マルチモーダル（テキストに画像を含んだ入力のこと）の埋め込みが可能。

画像生成モデルは
- Stability AI社の「Stable Diffusion XL」
- Amazonの「Titan Image Generator」シリーズ
の2つ。書籍の説明が明らかに薄い。テキスト生成推しなのだろうか。Titanシリーズのほうがちょっと安め。
## ハンズオンへ
書籍はここからハンズオンのコーナーなのだが使用されているCloud 9がサービスを停止しているため代替手段を使用予定。
## 次回へ続く
今回はここまで。今週はオンラインとオフラインのセミナー2つを受講予定なのでそれについてレポート予定。
【AtCoder】おすすめのマクロ

## ポイント
- 頻度やコード長などを考えて簡略化したい部分をマクロ化する
- マクロが増え過ぎても混乱するので、ある程度は絞った方が使いやすい

個人的には、`long long`は型名の途中に空白が入っているのが気持ち悪く感じるからか、一度しか使わない場合でもマクロにしている。

```C++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vi = vector<int>;
using P = pair<int, int>;
#define all(a) (a).begin(), (a).end()
#define rep(i, n) for (int i = 0; i < (n); ++i)

// マクロの使用例
int main() {
  int N; cin >> N;
  vector<P> L;
  rep(i, N) {
    int v; cin >> v;
    L.emplace_back(v, i);
  }
  sort(all(L));
  
  vector<vi> A(N, vi(N));
  rep(i, N) rep(j, N) cin >> A[i][j];
}
```
nmapでローカルのSSH接続可能なRaspberryPiをリストする

## 目的

同じネットワーク上にいるデバイスのうち、SSH接続できるラズパイとそのIPをnmapでリストします。

具体例としては、Wi-Fi設定をImagerで事前に済ませたラズパイでディスプレイやキーボードを接続することなくSSH接続できるようIPを特定するなどが挙げられます。

この記事ではラズパイを対象としますが、そうでない場面でも応用は効くと思います。

## 注意

テストはLinuxマシン(EndeavourOS / 6.10.6-zenカーネル)で行いました。
Macマシンの場合はおそらくそのまま動きます。
Windowsマシンについては今回は取り扱いません。適宜読み替えるか、WSLを使用してください。


## 前提要件
:::note warn
見つけたいデバイスと捜索に使用するデバイスが**同じネットワーク上にいる**ことを確認してください。別ネットワークにいるデバイスをスキャンする場合はこの記事の対象外となります。
:::

まずは、捜索に使用するデバイスへnmapをインストールしておきます。

次にコンソールで`ip a`を実行して、適切なインターフェースの`inet`セクションに表示された値をコピーしておいてください。
例: `192.168.xxx.xxx/24` (一部はマスクしています)


## スキャン

:::note warn
スキャンは自身の所有するネットワーク上で、自身の所有するマシンに対してのみ行ってください。他人のネットワーク上で、または他人の所有するマシンに対してスキャンを行う際は、事前に許可を取るようにしてください。
:::

### 一般ユーザーとして実行する

```shell
nmap -p 22 --open <アドレス>
```

指定したアドレス空間に存在するデバイスのうち、22番ポートが開いているデバイスをリストします。

<details><summary>オプションの解説</summary>

nmap:
- `-p`: スキャンするポートやその範囲を指定する。22番ポートはSSHに用いられるデフォルトのポート
- `--open`: 開いているポートのみ一覧に表示する

</details>

<details><summary>実行例(一部マスク)</summary>

```terminal
$ nmap -p 22 --open 192.168.xxx.xxx/24
Starting Nmap 7.95 ( https://nmap.org ) at 2024-09-16 23:35 JST
Nmap scan report for 192.168.68.xxx
Host is up (0.044s latency).

PORT   STATE SERVICE
22/tcp open  ssh

Nmap scan report for 192.168.xxx.xxx
Host is up (0.072s latency).

PORT   STATE SERVICE
22/tcp open  ssh

Nmap scan report for 192.168.xxx.xxx
Host is up (0.069s latency).

PORT   STATE SERVICE
22/tcp open  ssh

Nmap done: 256 IP addresses (12 hosts up) scanned in 6.06 seconds
```

</details>

### rootとして実行する(推奨)

前述したコマンドをrootとして実行することで、一覧でMACアドレスとともにベンダーが表示されるようになります。ラズパイには`Raspberry Pi Trading`と書かれているはずです。

Grepと組み合わせることで、より出力を簡略化することができます。

```shell
sudo nmap -p 22 --open <アドレス> | grep -B 6 'Raspberry Pi'
```

<details><summary>オプションの解説</summary>

grep:
- `-B <行数>`: 一致した行から指定した行数分だけ前の行までを表示する

</details>

<details><summary>実行例(一部マスク)</summary>

```console
$ sudo nmap -p 22 --open 192.168.xxx.xxx/24 | grep -B 6 'Raspberry Pi'
[sudo] meatwo310 のパスワード:

Nmap scan report for 192.168.xxx.xxx
Host is up (0.037s latency).

PORT   STATE SERVICE
22/tcp open  ssh
MAC Address: D8:3A:DD:xx:xx:xx (Raspberry Pi Trading)
```

</details>



## 高速化を図る

### オプションを調整する
巨大なネットワークでは、スキャンにより多くの時間を要することが考えられます。
以下のオプションの一部を使用することでより速くスキャンすることができるかもしれません。

`-T4`: スキャンを高速化するテンプレートを適用
`-T5`: T4よりもさらに精度を犠牲にして高速化するテンプレートを適用
`--host-timeout <時間>`: 1ホストにかける時間を制限

詳細:

https://nmap.org/man/ja/man-performance.html


### 処理を考え直す

あるいは、処理自体を変更することで、高速なスキャンを実現します。
例えば、ポートスキャンを行わずPingスキャンのみを行う場合:

```shell
sudo nmap -T4 -sn -n <アドレス> | grep -B 2 'Raspberry Pi'
```

<details><summary>オプションの解説</summary>

- `-sn`: Pingスキャンによるホストの発見**のみ**を行う。rootとしてローカルな有線ネットワークに対してスキャンする場合は、自動的にARP要求(`-PR`)が用いられる
- `-n`: DNS解決を行わない

詳細:

https://nmap.org/man/ja/man-host-discovery.html

</details>

<details><summary>実行例(一部マスク)</summary>

```console
$ sudo nmap -T4 -sn -n 192.168.xxx.xxx/24 | grep -B 2 'Raspberry Pi'
Nmap scan report for 192.168.xxx.xxx
Host is up (0.038s latency).
MAC Address: D8:3A:DD:xx:xx:xx (Raspberry Pi Trading)
```

</details>


### 参考

https://nmap.org/book/reduce-scantime.html
個人開発サービス(Q)の技術構成

## 概要
2024年春から個人でサービス(Q)の開発を行っています。本ページではサービス(Q)に含まれる各アプリの技術構成を紹介します。

＊サービス自体は非公開としています。

## フロントエンド
- [ ] React 
  - シングルページアプリケーション(SPA)とするために採用しました。
  - SPAの場合、フロントエンドとバックエンド(API)が分離できることが利点だと考えています。
- [ ] TypeScript 
  - JavaScriptとの比較で型付けを利点として採用しました。

## バックエンド
- [ ] Spring Boot (REST)
  - オーソドックスなフレームワークを採用したかったのでSpring Bootになりました。
  - ただしRESTフレームワークとして使用しています。
- [ ] Java 
  - バックエンドには静的型付けのオブジェクト指向言語をと考えて採用しました。
  - オーソドックスなバックエンド言語としての魅力も考慮しました。
- [ ] Postgres
  - 汎用性、安定性を考慮して選択しました。

## バックエンド(機械学習)
- [ ] PyTorch
  - 現段階では実装をなるべくシンプルにしたかったために採用しました。
- [ ] Python
  - 機械学習ライブラリの豊富さにより採用しました。
  - オブジェクト志向的、関数的、構造的など広いパラダイムをサポートできる汎用性が魅力です。
  - TypeHintを利用することで静的チェックによる型のサポートを受けることができるため、TypeScriptのような位置づけにできます。

## インフラ
- [ ] AWS CloudFront
- [ ] AWS EC2
- [ ] AWS RDS(Postgres)
- [ ] AWS ELB
- [ ] AWS CloudFormation(IaC) 
  - 普及率が高いクラウド基盤だったために採用しました。
  - 無料枠が使用できるためコスト面の条件にも一致しています。
- [ ] Cloudflare
  - 契約の事情がありドメインサービスとして一時的に利用しています。

## CI/CD
- [ ] JUnit5 (ユニットテスト)
  - バックエンドからテストの自動化を進めています。
- [ ] Git
  - 標準的なバージョン管理システムとして利用しています。
- [ ] Gitlab 
  - バージョン管理のプラットフォームとして利用しています。
  - １次のCI/CDパイプラインとして利用しています。
- [ ] AWS CodePipeline
  - 2次のCI/CDパイプラインとして利用しています。

## ふりかえり
本サービスはまだ開発の初期段階にあります。
本ページで紹介した技術構成はすべて着手済みor開発中orリリース済みですが、まだまだ流動的な面もあります。
今後も随時アップデートをしたいと考えています。
[Flutter]スプレッド演算子を使って動的なWidgetを簡単に生成する方法

## はじめに
FlutterでWidgetをList配列でループさせて表示させようと無邪気にfor文を使うとまんまとエラーになり、ハマるので簡単な解決方法をメモします。
Dart言語で用意されているスプレッド演算子(...)を使ってFlutterで動的にWidgetを作成することができます。
（スプレッド演算子を使うことでスタイリッシュに記述できます）

## 無邪気にfor文でList配列をループさせてみる

List配列を用意します
```dart
List<Widget> textWidgets() {
    return [
        Text('hogehoge1'),
        Text('hogehoge2'),
        Text('hogehoge3'),
    ];
}
```

List配列をforループさせて実行させます
```dart
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('With Spread Operator'),
        ),
        body: Column(
          children: [
              for(int i = 0; i < textWidgets().length; i++) {
                textWidgets()[i]
              }
          ],
        ),
      ),
    );
  }
}
```

実行結果
コンパイルエラーになります
```
Error: A value of type 'Set<Widget>' can't be assigned to a variable of type 'Widget'.
```

##　原因
Flutterでは動的にWidgetを配置する場合にはfor文を純粋に使うだけではうまくいきません。（これはFlutterの仕様でそうなっています）

## 解決策1:スプレッド演算子を使う（for{}...)

for{}...でスプレッド演算子を使って動的に表示することができます（下記コードはエラーにならず、うまく表示されます。）
```
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('With Spread Operator'),
        ),
        body: Column(
          children: [
              for(int i = 0; i < textWidgets().length; i++) ...{
                textWidgets()[i]
              }
          ],
        ),
      ),
    );
  }
}
```

## 解決策2:スプレッド演算子を使う（List<Widget>に...)

そのままList<Widget>にスプレッド演算子を使うこともできます。（下記コードはエラーにならず、うまく表示されます。）
```
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('With Spread Operator'),
        ),
        body: Column(
          children: [
            ...textWidgets()
          ],
        ),
      ),
    );
  }
}
```

## 解決策3:スプレッド演算子を使う（...[]for(){})

配列にスプレッド演算子を使って動的に表示することができます（下記コードはエラーにならず、うまく表示されます。）
```
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('With Spread Operator'),
        ),
        body: Column(
          children: [
              ...[
                for(int i = 0; i < textWidgets().length; i++) textWidgets()[i],
              ]
          ],
        ),
      ),
    );
  }
}
```

## スプレッド演算子を使わない場合
基本的に動的にWidgetを表示する方法はスプレッド演算子を使う方法しかFlutterはなさそうです。そもそも連続して表示する場合のコンテンツとしてListViewやGridViewなどがあるためそれで大概は解決します。しかしプログラムして同類のコンテンツをループさせたいシチュエーションはあるためその時のために覚えておくと便利です。

スプレッド演算子を使わない方法
- for文を使わずにそのまま配列のWidgetをインデックスを指定して表示する
- ListViewなどを使って動的に表示する

## さいごに
Flutterも然り、宣言型UIのプログラムはレイアウトとロジックを組み合わせる仕組み上、どうしても独特のルールが存在します。SwiftUI,JetpackComposeも同様にそれぞれ強めのルールがあるため個別にルールとして記憶して対応するのが良いでしょう。（内部的に深く追求するのもいいと思います。）
参考記事

## Docker
・[Dockerインストール Ubuntu](https://www.kagoya.jp/howto/cloud/container/dockerubuntu/)

## プライベートIP固定
### windows
・[固定方法](https://www.buffalo.jp/support/faq/detail/15257.html#:~:text=4.-,%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82,OK%5D%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)
### ubuntu
・[固定方法](https://www.miraiserver.ne.jp/column/about_ubuntu-ipadress/)

## VSCode
### SSHでUbuntuへのリモート環境を作成
・[SSH接続](https://tekkubu.com/remote-ssh/)

## WEB
### システム概要
・[システム概要](https://www.infraexpert.com/info/server17.html)

### ruby on rales
・[ralesドキュメント](https://railsdoc.com/)


### unicorn
・[unicorn概要](https://chopesu.com/programing/aws%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89-nginx%E3%81%A8unicorn%E3%81%AE%E5%B0%8E%E5%85%A5%E3%81%AE%E7%9B%AE%E7%9A%84%E3%82%92%E8%87%AA%E5%88%86%E3%81%AA%E3%82%8A%E3%81%AB%E3%83%A1%E3%83%A2/)
State of Javascript 2023をかいつまんで読んでみた

[State of Javascript 2023](https://2023.stateofjs.com/en-US/)がついに公開されてました。
2024年もあと4ヶ月経てば2025年になってしまうので、今年は来ないと思いましたがまさかこのタイミングでくるとは思いませんでした。

やっと去年の状況を見ることができると思い、早速読んでみました。

1. 今年の各フレームワークの人気ランキング
2. 新しいフレームワークの登場の確認

# 1. 今年の各フレームワークの人気ランキング
[Front-end Frameworks Ratios Over Time](https://share.stateofjs.com/share/prerendered?localeId=en-US&surveyId=state_of_js&editionId=js2023&blockId=front_end_frameworks_ratios&params=&sectionId=libraries&subSectionId=front_end_frameworks)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848371/262f30ce-e731-82a0-1845-0828b8df4f3c.png)

1位: React
2位: Vue.js
3位: Angular
4位: Preact
5位: Svelte
6位: Alpine.js
7位: Lit
8位: Solid
9位: Qwik
10位: Stencil
11位: HTMX

今年は各フレームワークの使用率などが表示されなくて少し残念でした。。。

結局今年も1位は不動のReactでした。npmのライブラリ一覧の数見ても他のフレームワークのと比べて数が圧倒的に違うので、もうここは今後も変わることはないのかなと思っています。
2位はやっとVue.jsが来たなと。Nuxt.jsもv3がやっと安定してきて、情報が整理されてきて使用する人が増えたのかなと思っています。

[Meta-Frameworks](https://share.stateofjs.com/share/prerendered?localeId=en-US&surveyId=state_of_js&editionId=js2023&blockId=meta_frameworks_ratios&params=&sectionId=libraries&subSectionId=meta_frameworks)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848371/098b2714-c375-0c22-6614-ed96fa85738f.png)


1位: Next.js
2位: Nuxt
3位: Gatsby
4位: Remix
5位: Astro
6位: Eleventy
7位: SvelteKit
8位: Docusaurus
9位: SolidStart
10位: Deno Fresh

1位はNext.js。ここについてはReact同様、そうだろうなと思っていました。が、2位にReactベースのGatsbyが3位になってNuxtが上がってきたのは予想外でした。Vueユーザの自分にとっては嬉しいところ。v3も安定してきているので、今後上位3位まではこの順位が固定になる予想。

意外にもSolidJSで開発ができるSolidStartが9位なのは驚きなのとAstroが5位なのは意外。Astroは「これめっちゃいいぞ」と結構多くの意見を見ていた気がしたのとTier表でもSランクになっていたので触れている人が多いと勝手に思っていましたので、ここは予想外でした。

# 2. 新しいフレームワークの登場の確認

今回気になったのはHTMX。Javascriptを書かずに動的なページがかける、かつCDNで簡単に.htmlファイル上で利用可能なのが魅力的でした。
NuxtやNextなどで作成しているWebアプリであればあまり関係性はないですが、DjangoなどのTemplateHTMLのような機能であれば親和性が高く、今後DjangoのTemplateHTMLなどで活躍できるのではないかと思っています。

実際に少し触ってみましたが、導入はかなり楽。
ただし、HTMXならではの書き方にまだ馴染めてないので、もう少し勉強してみようと思います。

# 最後に

ここまで来ると初心者の人に勧めるのならやっぱりNext Reactあたりになるのかなと。
最近後輩がWebアプリ勉強しているらしいのでこのあたりの話はしようかなと思います。
技術者ブログを始めてみる

# ブログを書く目的
1. アウトプットを意識することでインプットの質を高めたい
1. マークダウン形式の文書作成の練習がしたい
1. 記録を残して、過去の自分と対話がしたい

# 何を書きたいか？
-   AIのこと
-  ソフトウェアのこと
-  資格試験のこと
-  技術書のこと
-  デスクワーク環境のこと
とりあえず、エンジニア4年目くらいまでは自分の専門領域を決めつけずに
色々なことやってみたいという気持ち。


## AIのこと
大学で物理と数学を学んでいたこともあって、相性が良いので好き。
物理の側面で言うと、モデル化、予測、近似する考え方がある程度染み付いていて、それらの威力を知っているので相性が良い。
数学の側面で言うと、数理論理学の威力や、数理統計学の威力を知っている、時には幾何学的に捉えたり、時には代数学的に構造を捉えたりすることできるのを知っているという点で相性が良い。
AIは全般興味があって、統計的機械学習、深層学習、生成AI、LLM、XAIの数式からの理解を進めている。
現在は完全に趣味だが、これから継続的に取り組んで仕事にしたいと思っている。

## ソフトウェアのこと
とりあえずは広く浅く、フルスタックエンジニアを目指したい。
プログラミング、ネットワーク、セキュリティ、DBなどの基礎事項
Docker/k8sのディベロッパーエンジニアの領域
AWSについて、システムアーキテクチャについて
幅広くキャッチアップしていきたい。

## 資格試験のこと
初学者にとって、資格試験は結構役に立つと思っている。
期限付きなので、やる気を駆立ててくれるし、
自主学習だけだと、内容が発散しがちだが、資格試験で
内容を絞ることによってフォーカスできる。
以下の資格を取得しようと思っている。
AWSの資格をSAPまで
G検定,E資格
統計検定準一級、一級
データサイエンティストエキスパート
基本情報・応用情報
情報処理安全確保支援士
これらの資格がいいなと思った理由は別記事で書く。

## 技術書のこと
技術書が好きなので、思い思いに読んでいる。
自由に読んでばかりいると、整理せずに一読して終わっている本が残っているので、
ブログとしてアウトプットすることで知識を整理するつもり。

## デスクワーク環境のこと
リモートワークの中で、指や手首、腰や首を痛めたことがある。
おすすめのキーボードやデスク・チェア、PC周辺機器など紹介したい。

# 最後に
将来的には究極の自動化を追求できる人になりたいなと思っています。
~Opsってありますが、様々な~Opsが連動してビジネス価値を生み出すシステムやプラットフォームの作成に貢献できれば良いなと思っています

~~軽い気持ちで作成したけど、後で修正とかできるのかな？テスト的に投稿してみるか~~
マイページから自分の記事を開き、左下の三点リーダーから編集できました！
【Terraform】resourceとmoduleって何が違うの？？？

## 結論
去年はじめてTerraformを使ってからあまり違いを理解せずにいましたが、現在は
**`resource`はあるリソースを作成する、`module`は複数の`resource`を組み合わせてテンプレート化したもの**という感じで理解しました。`module`を使うと複数のリソースを簡単に作れるイメージです。

以降では、30日後にglacier deep archiveへオブジェクトを移行するライフサイクルルールを持つS3バケットをTerraformで作る例をあげながら、`module`と`resource`の違いについて説明していこうと思います。

## resourceとは
resourceを使う場合、ライフサイクルルールを適用したS3を作成するには以下のようなコードになります。
```terraform
# S3バケット作成
resource "aws_s3_bucket" "example_bucket" {
  bucket = "example-bucket-123"
}

# ライフサイクルルールの設定 (30日後にglacier deep archiveに移行)
resource "aws_s3_bucket_lifecycle_configuration" "example_lifecycle" {
  bucket = aws_s3_bucket.example_bucket.id

  rule {
    id     = "move-to-deep-archive"
    status = "Enabled"

    transition {
      days          = 30
      storage_class = "DEEP_ARCHIVE"
    }
  }
}

```
まずは`aws_s3_bucket`でバケット名を指定し、S3を作成します。
その後、`aws_s3_bucket_lifecycle_configuration`にてライフサイクルルールを作成し、それをどのS3バケットに適用するかどうかを最初の`bucket`で指定しています。

このように、S3バケット本体やそれに適用する設定をそれぞれ記述する必要があります。そのため、ライフサイクルルール以外にもバケットポリシーやイベント通知など、**作成したいものが増えれば増えるほど書かなければいけない`resource`の数が増えていきます**。
一方で、**どのリソースをどのように作成し、どれに適用したかを自分で考えながら書くことができるので間違いは起きにくい印象**があります。

設定値のデフォルト値などを確認したい場合は`resource`のドキュメントを見る必要があります。
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket

## moduleとは
`module`を使う場合、ライフサイクルルールを適用したS3を作成するには以下のようなコードになります。
```terraform
# S3バケットのモジュールの呼び出し
module "s3_bucket" {
  source  = "terraform-aws-modules/s3-bucket/aws"
  version = "4.1.2"

  bucket = "example-bucket-123"

  lifecycle_rules = [{
    id      = "move-to-deep-archive"
    enabled = true

    transition = [{
      days          = 30
      storage_class = "DEEP_ARCHIVE"
    }]
  }]
}
```
ここでは`terraform-aws-modules/s3-bucket/aws`というモジュールを使ってS3バケットを作成しています。
https://registry.terraform.io/modules/terraform-aws-modules/s3-bucket/aws/latest

`resource`を使った時と比べて、1つの`module`内でS3バケットの作成もライフサイクルルールの作成も完結しています。

実は`module`は複数の`resource`をまとめたものであり、`module`を呼び出す際に関数と同じように引数を渡してあげれば包括している`resource`を一気に作ってくれるようになっています。
例として、今回使ったモジュールのコードを見てみるとライフサイクルルールの作成は内部で`resource`の`aws_s3_bucket_lifecycle_configuration`を呼び出しています。
https://github.com/terraform-aws-modules/terraform-aws-s3-bucket/blob/master/main.tf#L240

`module`は`resource`と違いシンプルにリソースを作成することができるというメリットがある一方、`module`側が自動的にいくつかの`resource`を作成するため、
- `module`内部での設定が原因でエラーが発生した場合、**どの`resource`で問題が起きたか特定するのに時間がかかる**
- `module`が内部で**どの`resource`を作成するかを完全に把握するのが難しい**場合がある

といったデメリットがある印象です。

## まとめ
`resource`, `module`それぞれメリット／デメリットがあるので場合によって上手に使い分けていきたいなと思いました。

最初にTerraformを触った時、この`resource`と`module`の違いがよくわからず、プロパティの調べ方に困った過去があるのでどなたかのご助力になるといいなと思います。
VertiTab - サイドパネルの縦型タブ v2.9.0

こんにちは皆さん！VertiTabがv2.9.0にアップデートされました！

**Chromeブラウザで究極のサイドバータブ管理を体験しましょう**。便利な新機能が盛りだくさん！  
インストールはこちらから:  
[VertiTab - Chrome ウェブストア](https://chrome.google.com/webstore/detail/chejfhdknideagdnddjpgamkchefjhoi)

### 新機能
- **タブをクリア**: スナップショットを保存し、アクティブタブ以外の全タブを一括で閉じられます。必要に応じて最近閉じたタブやスナップショットから簡単に復元！
- **タブグループの自動有効化**: 新規タブを開くときに自動的にグループ化。関連するタブをスムーズに整理。
- **リストの垂直間隔**: 高度な設定でタブグループのリスト項目間隔をカスタマイズし、見た目を自分好みに。
- **複数URLのクイックアクセス登録**: 選択した複数のタブをグループ化し、ワンクリックでクイックアクセスに保存！
- **クイックアクセス項目の間隔調整**: オプションページでアイテムの間隔を細かく設定して、操作性を向上。

これまで以上にスマートで効率的なブラウジングを楽しんでください！
AWSクラウドプラクティショナー合格しました！

## AWSクラウドプラクティショナーに合格！

9月8日に**AWSクラウドプラクティショナー試験**に合格しましたので、僕が行った学習方法をシェアしようと思います！😊  
**勉強期間は2週間**、得点は**805点**でした。

### 学習方法は大きく分けて2つです。
1. **『図解 AWSの仕組みとサービスがたった1日でよくわかる』（書籍）を読む**
2. **『この問題だけで合格〜』(Udemy)を解く**

それぞれ詳しく説明していきます！

### 1. 書籍について
この書籍は**AWS初心者向け**に、多くの図を用いて丁寧に説明されています。まずは、この書籍をざっと一周しました（3日ほどかけて軽く読みました）。  
**Udemyの問題演習**を解く前に、一度全体の流れを把握するために読んでおくといいと思います。

### 2. Udemyの問題演習について
次にUdemyの問題演習ですが、**かなり難しい**ことを知っておいてください！最初に解いたとき、僕は基礎問題で60%、本番形式の問題では40%ほどしか取れませんでした💦  
ここで大切なのは、**落ち込まないこと**です！間違えた問題を復習する際に、**書籍で該当するサービスの内容を確認**しましょう。書籍の索引にないサービスも問題に出てくるので、その際は**ノートに自分なりにまとめる**ことをお勧めします。

この作業を繰り返し、基礎問題で90%、本番形式問題で80%を超えるまで続けました。試験前には、ノートを見返して復習しました。

### ⚠️注意点⚠️
**AWS CAF**（Cloud Adoption Framework）と**Well-Architectedフレームワーク**については、公式サイトで調べて**自分なりにまとめて暗記**することをお勧めします！  
僕が受けたときは、これらに関する問題が**5問ほど**出題されました。しっかり暗記しておけば間違いなく役立ちます。（僕は暗記できておらず、本番中に後悔しました…。）

### まとめ
- **書籍をさらっと一周する。**  
- **問題演習をひたすら解く。**  
- **間違えた問題のサービスを、書籍で確認する。**  
- **書籍に載っていない場合は適宜調べてノートにまとめる。**

この方法で十分に合格できると思うので頑張ってください！
新卒エンジニアのyuuです！

## 初めまして！新卒エンジニアのyuuです

こんにちは！2024年に新卒としてIT業界に飛び込んだyuuと申します。現在、**AWSを用いたインフラ業務**に携わっており、エンジニアとしてのスキルを学んでいます！

### 取得資格
- **基本情報技術者**
- **AWS クラウドプラクティショナー**

今のところはインフラをメインに業務を行っていますが、**フロントエンドやバックエンドの開発**にも興味があり、現在並行して学習を進めています。フルスタックエンジニアを目指して、技術の幅を広げていきたいと考えています！

### 取り組んでいる技術
- **AWS**
- **インフラ構築・運用**
- **Java**


### 今後の目標
今後は、AWSを使ったインフラ業務に加えて、アプリケーションの**開発**にも挑戦し、インフラからアプリケーションまで一貫してサポートできるスキルを身に付けたいです。また、技術的な発見や学びをQiitaで積極的に共有していこうと思っています！

### 最後に
エンジニアとしてはまだまだ未熟ですが、学びを続けてどんどん成長していきたいです。皆さんと一緒に技術を深めていければ嬉しいです！これからどうぞよろしくお願いします。
論理タスクにおける深層学習 〜深層学習で算術演算を行う〜

## 調査概要
Transformerなどの系列変換モデルを用いて数学の問題を解く研究に関してのサーベイになる．（特に今回は算術演算が多い）

1本目の論文は，四則演算から文章を用いた問題まで大きく8つの分野の数学的問題をLSTMやTransformerを用いてどの程度解くことができるのかのベンチマークを調べたものになっている．

2本目の論文は，Transformerを用いた四則演算では学習時に存在しない入力長の問題に対して汎化しない（OODに弱い）という問題があり，この解決策として入力をgridデータとして入れることで帰納バイアスを獲得したというものである．

3本目の論文は，2本目の論文の内容をUniversal TransformerというRNNのような構造を持つモデルを用いて取り組んだというものである．

<iframe src="https://www.slideshare.net/slideshow/embed_code/key/2YFQkMKoDAJvyN" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/slideshow/survey-on-math-transformer-2023-0628-sato/271645187" title="survey on math transformer 2023 0628 sato" target="_blank">survey on math transformer 2023 0628 sato</a> </strong> from <strong><a href="https://www.slideshare.net/satoyuta0112" target="_blank">satoyuta0112</a></strong> </div>

## 参考文献
- Analisying Mathmatical Reasoning Abilities of Neural Models, d.saxton et al. [ICLR 2019]
- Neural Seqeunce to grid Module for Learning Symbolic Rules, s.kim et al. [AAAI 2021]
- Transformers discover an elementary calculation system exploiting local attention and grid-like problem representation, S.Congolato et al. [EEEI IJCNN 2022]