OmniAICreator/Qiita-1.07M huggingface dataset:
GlanceのText ComposableでTextOverflow.Ellipsisを指定する方法

# 概要

Jetpack GlanceはJetpack Compose[^1]でApp Widgetsを作成できるフレームワークです。バージョンは2023年3月1日時点で[1.0.0-alpha05](https://developer.android.com/jetpack/androidx/releases/glance?hl=ja)になります。

https://android-developers.googleblog.com/2021/12/announcing-jetpack-glance-alpha-for-app.html

# GlanceのText Composable

GlanceのText Composableでは、overflowプロパティがありません。colorやfontSizeもTextStyleで指定します。

```kotlin
@Composable
fun Text(
    text: String,
    modifier: GlanceModifier = GlanceModifier,
    style: TextStyle? = null,
    maxLines: Int = Int.MAX_VALUE
): Unit
```

https://developer.android.com/reference/kotlin/androidx/glance/text/package-summary

# GlanceのText ComposableでのTextOverflow.Ellipsisの指定方法

1.0.0-alpha05の時点では、次のように `maxLines` を指定することで自動的にellipsisされるようになっていました。

```kotlin
Text(
    text = text,
    maxLines = 1,
)
```

# まとめ

GlanceでのApp Widgets開発の体験はとても良かったです。一方通常のComposeと微妙に使い勝手が異なる点もあり、嵌るポイントにもなっています(α版なので今後変更があるかも)。

また、AndroidView ComposableのようにAndroidRemoteView Composableを使うと従来のRemoteViewと組み合わせてUIを構築することが可能です[^2]。Glanceで実装が難しい場合、以前のようにlayout.xmlで実装することを検討しても良いでしょう。

# 参考資料

- https://android-developers.googleblog.com/2021/12/announcing-jetpack-glance-alpha-for-app.html
- https://developer.android.com/jetpack/androidx/releases/glance?hl=ja
- https://github.com/android/user-interface-samples
- https://stackoverflow.com/questions/65736375/how-to-show-ellipsis-three-dots-at-the-end-of-a-text-line-in-android-jetpack-c
- https://stackoverflow.com/questions/75138251/ellipsis-overflow-in-glance-widget/75590810#75590810


[^1]: 通常のComposeと全く同じではありません。packageがandroidx.glanceに分かれ、Textでも指定できるプロパティが異なるなど同じComposeでも微妙に使い勝手が異なります。ModiferもGlanceModifierですし、Brashを取れるbackgroundがGlanceModifierに無かったり、Textのoverflowプロパティが無いなど違いがあります。

[^2]: 既存のWidgetの資産を再利用できるのが良いポイント > AndroidRemoteView Composable
Chrome開発者ツールを利用して、Workatoワークスペースのコラボレーター（ユーザー）のリストをJSON形式や表形式でさくっと取得する

# はじめに
期末、半期、四半期などのタイミングでWorkatoワークスペースのコラボレーター（ユーザー）の棚卸しを行う際に、現在のユーザーのリスト構造化されたデータでを取得したい場合があります。
このような場合は、次のコードをChrome開発者ツール上で実行することでJSON形式、あるいは表形式でその結果を取得することができます。
取得した結果は、Excelやスクリプト上へ読み込んで利用することができます。

# 手順
## 1. Workatoへログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/334c4c51-1535-44b9-66c3-426a7a97fab6.png)

 
## 2. Chrome開発者ツールを開き、コンソールへ以下のコードを入力し、実行します。

### コード
|変数|値|
|:-------|:---------|
|page |ページ番号|
|per_page |1リクエストあたりの表示件数|
|sortTerm|ソートキー|
|sortDirection|昇順(asc)・降順(desc)|


```javascript
let baseUrl = 'https://app.workato.com/members.json';
let sortTerm = 'name';
let sortDirection = 'asc';
let perPage = 5;
let result = [];

// 合計ページ数を算出する
let url = baseUrl 
    + '?page=1'
    + '&per_page=' + String(perPage)
    + '&sort_term=' + sortTerm
    + '&sort_direction=' + sortDirection;

let res = (await (await fetch(url)).json()).result;
let totalPages = Math.ceil(res.count / perPage);

// データを取得する
for (let i = 1; i <= totalPages; i++) {
    url = baseUrl 
        + '?page=' + String(i)
        + '&per_page=' + String(perPage)
        + '&sort_term=' + sortTerm
        + '&sort_direction=' + sortDirection;

    res = (await (await fetch(url)).json()).result;
    result = result.concat(res.items);
}

// JSON形式で出力
console.log(result);

// 表形式で出力
console.table(result);
```

## 3. 出力結果を右クリックし、「objectをコピー」をクリックします。
コピーした内容がクリップボードに格納されます。コピー後、テキストエディタ等へ貼付して利用してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/630e55b1-f350-d36f-ccc9-0768b441fb3e.png)

# 最後に
Workatoには、Workato自身を管理するためのREST APIが用意されていますが、現在のところ残念ながらユーザーリストを出力するエンドポイントが提供されていません。このため、構造化データとしてユーザーリストが必要な場合は、一例として、本ページに記載の手順で対応することになります。また、ユーザー追加・編集・削除可能なREST APIエンドポイントも、現在のところ提供されていません。

なお、WorkatoはSAML SSOによる認証に対応しており、かつSCIMによるユーザー情報の同期に対応しています。SCIMを利用することで、ユーザー追加・編集・削除はIdPで行えるようになりますし、IdPにユーザー管理のためのREST APIが用意されていれば、IdPを介してWorkatoのユーザー管理の自動化も実現することができます。よって、もしユーザー管理を効率化したいのであれば、Workatoビルトインの認証を使い続けるのではなく、SAML SSOとSCIMで対応いただくのがベターであるといえます。

※個人的には、ユーザー管理の自動化が必要な場合はSCIMで管理してほしいというのがWorkato社の答えであると、勝手に思っています。（APIによるユーザーの追加・編集・削除ができないというのも、セキュリティ面を考慮すると合理的な判断であると考えています。ただ、ユーザーのリストくらいは出力させてほしいですが・・・）

ただし、SAML SSO + SCIMな環境においても、孤立しているユーザー（IdPには存在せずWorkatoにのみ存在するユーザー）を特定する場合や、Workato上における実際のマッピング（各ユーザーがWorkatoにおいて実際にどのグループに所属していて、どのロールが割り当てられているのか）の確認を行いたい場合は、本手順は役立つと思います。
Github codespacesでvue.js

最近の開発環境はVScodeとgithubcodespacesの組み合わせ。

色々試したいが環境が汚れると後々再現性が無くなり困るため、codespaceをなるべく利用。

そんな中、以前は使えていたcodespaceでvueがデバッグ出来ない。。

解決としてはViteが変わっていたから
ローカルで立ち上げたvueプロジェクトは動いた（もちろんだけど。。）
v2のviteでは動いた。（バージョンを下げた）

vite.config.tsにサーバーのホスト設定をtrueにするという方法でした。
よく見たらnpm run devってやったときに--hostって書いてある。
2日無駄にしました。。

```
# こちらはreactですがvueでも一緒

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
  server: {
    host: true,
    port: 4040
  }
})

```
Cのプログラムを任意のRISC-V拡張に対応させてクロスコンパイルする方法(macOS, Ubuntu 22.04) (20230818改訂)

macOS で表題のことを行うには，`brew install riscv64-elf-gcc` とします．
Ubuntu で表題のことを行うには，`riscv-gnu-toolchain`をインストールします．

# macOS

```zsh
brew install riscv64-elf-gcc
```

すると `/opt/homebrew/opt/riscv64-elf-gcc/bin`に，`riscv64-elf-`で始まるツールチェーンがインストールされます．2023年8月現在，次のコマンドがインストールされます．

* `riscv64-elf-c++`
* `riscv64-elf-cpp`
* `riscv64-elf-g++`
* `riscv64-elf-gcc`
* `riscv64-elf-gcc-13.2.0`
* `riscv64-elf-gcc-ar`
* `riscv64-elf-gcc-nm`
* `riscv64-elf-gcc-ranlib`
* `riscv64-elf-gcov`
* `riscv64-elf-gcov-dump`
* `riscv64-elf-gcov-tool`
* `riscv64-elf-lto-dump`

またこれにより，`riscv64-elf-binutils`もインストールされます．`/opt/homebrew/opt/riscv64-elf-binutils/bin`に，`riscv64-elf-`で始まるツールチェーンがインストールされます．2023年8月現在，次のコマンドがインストールされます．

* `riscv64-elf-addr2line`
* `riscv64-elf-ar`
* `riscv64-elf-as`
* `riscv64-elf-c++filt`
* `riscv64-elf-elfedit`
* `riscv64-elf-gprof`
* `riscv64-elf-ld`
* `riscv64-elf-ld.bfd`
* `riscv64-elf-nm`
* `riscv64-elf-objcopy`
* `riscv64-elf-objdump`
* `riscv64-elf-ranlib`
* `riscv64-elf-readelf`
* `riscv64-elf-size`
* `riscv64-elf-strings`
* `riscv64-elf-strip`

# Ubuntu 22.04

参考記事: https://msyksphinz.hatenablog.com/entry/2022/05/24/040000

次のようにしました．

```bash
sudo apt update
git clone https://github.com/riscv-collab/riscv-gnu-toolchain.git
cd riscv-gnu-toolchain
mkdir build
./configure --prefix=/usr/local/riscv
make -j$(nproc)
make install
```

すると `/usr/local/riscv/bin` に次のコマンドがインストールされます．

* `riscv64-unknown-elf-addr2line`
* `riscv64-unknown-elf-ar`
* `riscv64-unknown-elf-as`
* `riscv64-unknown-elf-c++`
* `riscv64-unknown-elf-c++filt`
* `riscv64-unknown-elf-cpp`
* `riscv64-unknown-elf-elfedit`
* `riscv64-unknown-elf-g++`
* `riscv64-unknown-elf-gcc`
* `riscv64-unknown-elf-gcc-12.2.0` このコマンドについてはバージョンが上がるとバージョンを表す数字が変わるものと思います．
* `riscv64-unknown-elf-gcc-ar`
* `riscv64-unknown-elf-gcc-nm`
* `riscv64-unknown-elf-gcc-ranlib`
* `riscv64-unknown-elf-gcov`
* `riscv64-unknown-elf-gcov-dump`
* `riscv64-unknown-elf-gcov-tool`
* `riscv64-unknown-elf-gdb`
* `riscv64-unknown-elf-gdb-add-index`
* `riscv64-unknown-elf-gprof`
* `riscv64-unknown-elf-ld`
* `riscv64-unknown-elf-ld.bfd`
* `riscv64-unknown-elf-lto-dump`
* `riscv64-unknown-elf-nm`
* `riscv64-unknown-elf-objcopy`
* `riscv64-unknown-elf-objdump`
* `riscv64-unknown-elf-ranlib`
* `riscv64-unknown-elf-readelf`
* `riscv64-unknown-elf-run`
* `riscv64-unknown-elf-size`
* `riscv64-unknown-elf-strings`


# 使い方

標準状態では RV64G(RV64IMAFD) 向けにクロスコンパイルするものと思います(正確なところはドキュメント等で確認できませんでした)．オプションでいうと，`-march=rv64g -mabi=lp64d`です．

もし異なる拡張を指定したい場合には，たとえば次のようにします．拡張の組み合わせについては，自由に設定できるわけではなく，下記以外の組み合わせでは，コンパイルできてもリンクしてコードを生成するときにエラーが出ることがありました．

* RV64G `-march=rv64g -mabi=lp64d`
* RV64GV `-march=rv64gv -mabi=lp64d`
* RV32I `-march=rv32i -mabi=ilp32`
* RV32IMAC `-march=rv32imac -mabi=ilp32`
* RV32IMAFC `-march=rv32imafc -mabi=ilp32f`

Zで始まる拡張を指定するときには次のようにします．

* RV64GCZifencei `-march=rv64gc_zifencei -mabi=lp64d`

Auto-vectorizationは働きませんでした．Auto-vectorizationの対応状況がどうなっているのかが，よくわかりません．Clang 16ではAuto-vectorizationできているらしいので，確認してみたいと思っています．
プリザンターのメール送信APIについて

 # はじめに
プリザンターでメール送信APIを使用してメールを送信する時、レコード下部に表示される送信内容を削除又は非表示にできるのでしょうか。結論は「できない」です。メール送信APIは特定のレコードと紐づけるAPIだからです。

 # メール送信API
下記マニュアルにてメール送信APIの詳細が記載されています。メール送信APIについて少し深堀しようと思います。メール送信APIは単にメールを送信する機能ではなく、特定のレコードと紐づけてメールを送信する機能になります。そのため、メール送信APIを使用してメールを送信すると、紐づけたレコードの下部に送信内容が記載されます。したがって、レコードIDの指定が必要になります。下記マニュアルに記載のあるURL「http://{サーバー名}/api/items/{レコードID}/OutgoingMails/Send」に指定する{レコードID}には紐づけるレコードIDを記載することになります。もちろん、レコードIDを記載しなければエラーになりますし、レコードと紐づけないということはできない仕様になっています。

https://pleasanter.org/manual/api-mail


 # さいごに
どうしても送信内容を削除又は非表示にしたい場合、ダミーレコードを作成しメール送信APIと紐づけるか、DBから直接送信履歴を削除する必要があります。
Rubyでソースコードから特定の文字列を抽出する

## 概要

iOSのコード内で使用しているAPIのリストを作成したいという要望があり、何か適当なコードを書いて一発で引っこ抜いたろと安易な気持ちでRuby書いてみました（Rubyは全く書いたことないのに）。
その備忘録です。

きっと雑なコードなのでしょうけれども目的は達成できたのでヨシ！

## 実装内容

プロジェクトディレクトリ配下の .swift ファイルからAPIのパスを抽出するコードをrubyで書きました。
なぜrubyだったかというと、bashで抽出しようとしたところコード上のスペースやタブでsplitされコード1行を1行として扱えなかったためです（あと単純に勉強したかったという意図も）。

コード上のAPIのパスはおおかた下記のような書き方で記されていることを想定しています。

- `"/abcdef/xxx"`
- `"/abcdef/yyy/\(id)"`
- `return "/abcdef/xxx"`
- `.get("/abcdef/yyy/\(id)") {`

下記の内容の.rbファイルをプロジェクトディレクトリ直下に置き、rubyコマンドで実行することで結果をCSVファイルに出力します。

```ruby:get_api_list.rb
results = []

## プロジェクトディレクトリ以下のディレクトリを抽出
Dir.glob("*") do |dirname|

  ## 特定のディレクトリ（下記の場合テストコードのディレクトリ）は除外
  if dirname != 'XXXTests'

    ## 上記で抽出したディレクトリの中からswiftファイルを再帰的に抽出
    Dir.glob("#{dirname}/**/*.swift") do |filename|

      ## /abcdefを含むコードを抽出
      grep_results = File.readlines("#{filename}").grep(/.*\"\/abcdef.*\".*/)
      ## ファイル名と/abcdefの文字列のみに加工
      grep_results.each { |line| results << filename + ',' + line.slice(/\"\/abcdef.*\"/).gsub(/\"/, '') }

    end
  end
end

## csvファイルに書き出し
File.write("result.csv", results.join("\n"), mode: "w")
```

```bash
## 実行
$ ruby get_api_list.rb
```
移送依頼番号の上限値を設定する

移送依頼番号のアサイン範囲の変更はテーブルE070LのフィールドTRKORRを更新します。

```
UPDATE <schema>.E070L SET TRKORR = '<SID>K9XXXXX' WHERE LASTNUM = 'TRKORR';
```

移送依頼番号の上限値を設定する場合はフィールドLASTNUMがTRKORR_HIのエントリを追加します。

```
insert into <schema>.E070L(LASTNUM,TRKORR) values ('TRKORR_HI','<SID>K9XXXXX');
```

上限値を超える番号で移送依頼を登録しようとするとエラーとなります。
（Internal number assignment for requests not currently possible）

上限値の変更はUpdate文でTRKORR_HIのエントリを変更、撤廃にはDELETE文でTRKORR_HIのエントリを削除で対応可能です。

【参考】
1674286 - How to modify CTS transport number range (ABAP)
https://launchpad.support.sap.com/#/notes/1674286
PDF からの情報漏えいを考える

# 概要
PDF からの情報漏えいが度々発生しています。
https://www.itmedia.co.jp/news/articles/2302/28/news189.html#utm_term=share_sp

この記事では、なぜ PDF からの情報漏えいが発生するのか、必要な対策はなにか？　について検討します。
この記事は、PDF の技術的な特性だけでなく、PDF からの情報漏えいに関する包括的な対応について検討を行います。

# 注意
この記事は、記載の対策によって安全であることを保証するものでは有りません。
PDF やファイルを共有する際は、組織のルールに従って共有をしてください。

この記事は、永遠に作りかけです。
対策方法が分かり次第、対応策を逐次追記します。

# TL;DR
以下のような対応は情報漏えいにつながるため、避けてください。(SHOULD NOT)

- Excel や Word で機密データを黒塗りする。
- PDF ファイルの編集で機密データを黒塗りする。(ただし、[墨消しツール](https://helpx.adobe.com/jp/acrobat/kb/6111.html)を除く)
- PDF ファイル上で機密データを編集して保存する。 (ただし、[墨消しツール](https://helpx.adobe.com/jp/acrobat/kb/6111.html)を除く)
- PDF 前のファイル名や、作者などに機密情報が入っている。
- モザイク処理で機密データをマスクする。
- マーキングペンにより物理的に機密データをマスクする。

# なぜ漏洩が発生するのか？
PDF から情報漏えいが発生する背景には、 PDF ファイルがもった技術的な特徴が影響している場合が多いと考えます。
ここでは、情報漏えいにつながる背景や、必要な対策について検討します。

#### レイヤー機能によりデータが閲覧できる。
PDF は、 透明なシートが複数重なって 1枚の紙になったようなデータ構造をしています。

よくある漏洩として、画像や文書の上に黒いシートを重ねた状態で公開している。というものがあります。
この場合、上の黒いシートを移動させることで下の情報を確認することが出来ます。

これは、例えば Word や Excel などで、上に黒いシートを重ねて PDF 変換した場合も同様です。

Word や Excel から黒塗り変換を行いたい場合は、データを削除した上で黒塗りを行う。
または、一度画像に変換し、画像編集ソフトで黒塗り処理を行う必要があります。

#### 編集履歴により、過去の機密データが残る。
PDF は、追記型のデータ構造をしています。

たとえば、編集でデータを削除しても、以前のバージョンを復元することが可能です。
PDF 編集ソフトで、データの削除や黒塗りを行っても、以前のバージョンを復元することでデータが漏洩することが考えられます。

対策としては、印刷機能を経由して PDF 変換を行うことが考えられます。
最近のパソコンには、 印刷機能のなかに PDF 変換が含まれています。
これを利用することで、過去の編集履歴は変換時に失われるため、以前のバージョンからのデータ漏洩は発生しません。

#### メタデータに機密情報が入っている。
PDF には、文書自体の情報であるメタデータが含まれています。

これには、変換前のオリジナルの文書名や、オリジナルの形式、オリジナルのソフト名、作成者、変換ソフトなど、多岐にわたる情報が含まれています。
ファイル名に、氏名などの機微情報を含んでいた場合、PDF のメタデータに該当の情報が残る場合があります。

PDF 変換を行う際は、オリジナルのファイルから機微情報を削除するとともに、変換のオプションでメタデータを極力含まないように変換してください。
また、変換後のメタデータを確認することで、意図しないデータが含まれていないか確認を行った後に共有を行うことが必要です。

#### モザイク処理が完全ではない。
人間の認識による不備で、モザイク処理が読める場合があります。

モザイク処理で画像や文字列を隠した場合、元の画像では読めなくても、縮小すると読めるようになることがあります。
これは、人間の目がかけた情報を補い、補完するためです。

特に、数字や英語、ひらがななどの簡単な文字列の場合、縮小することによって読めるようになることが多々あります。

マスク処理を行う場合は、モザイクのマス目を充分に大きくする、黒塗りにするなどの対策が必要です。

#### マーキングペンによる黒塗りが不完全
マーキングペンによって行われた黒塗りが、画像加工によって情報漏えいする場合があります。

一度印刷したものをマーキングペンによって黒塗り、スキャンして PDF 変換する場合、
紙の状態や PDF データ上では完全に黒塗りされているように見えても、画像処理によって復元可能な場合があります。

マーキングペンなどの物理的な手法によって行われた黒塗りは不完全であることの確認が難しいため、
必ず画像編集ソフトなどを用いたデジタル上での黒塗りも併用してください。

以上
自社内の週報と月報リマインダーツールをAWS環境で自動化した話

## リマインドツールの導入経緯
・営業が毎回のように送る同じ内容
・営業が送らないといけないことによるリマインドの周知漏れをなくす
・定期実行されることで全社員の提出意識ができる
・AWSの各種サービスを利用することで、自社内の勉強・初期開発段階の構築を担える。

などなど、いろんなことがメリットになると考えられたためAWS環境を利用してリマインドツールを開発

## 利用技術
- AWS Lambda
- AWS EventBridge
- AWS Cloudwatch
- AWS IAM
- AWS SecretManager
- Python
- SlackAPI

## 設計
EventBridge上からスケジュールを組んでjsonパラメータを渡しSlackへポストするという流れです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542047/a1add73d-fec2-1e51-be22-8a7fceec1d83.png)

## 解決したこと
- 営業さんからのリマインド漏れがなくなる
- 社員の報告業務の周知が行き渡るようになる
- AWS開発でのナレッジを共有できる
- 新人さんの研修にもつながる内容になる
paiza.ioでelixir その202

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
"255"を"ff"で返す関数を書け。

# サンプルコード

```

defmodule Main do
	def hex(s) do
	    i = String.to_integer(s)
	    j = Integer.floor_div(i, 16)
	    i = rem(i, 16)
	    i = Integer.to_string(i, 16)
	    j = Integer.to_string(j, 16)
	    "#{j}#{i}"
	end	
	def main() do
	    hex("255")
	    |> IO.puts
	end
end

Main.main

```

# 実行結果

```
FF
```

# 成果物

https://paiza.io/projects/yWaHzYM0sMhJiYv7kfJX4w?language=elixir

以上。
AuraコンポーネントでMapを表示する


lightning:map では一度にプロットできるマーカーが10個と制限があります。　Google Mapだと有料ですので、無料のMapツールを探しているとよさそうなものがあります。

+ [Google Maps APIに頼らなくてもできる！「Leaflet」で地図を埋め込む](https://www.nowhere.co.jp/blog/archives/20180705-25751.html)
+ [Introduction of Leaflet Map in Salesforce Lightning Component](https://www.forcetalks.com/blog/introduction-of-leaflet-map-in-salesforce-lightning-component/)

ソースをみるとcssなどを静的リソースに登録する必要がありそうです。
zipファイルを以下から入手し静的リソースに登録しておきます。

https://leafletjs.com/index.html

確かに表示できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/38647507-26ac-78b6-98de-fec0271140f8.png)

プログラムはjsのロード時に指定しておけばデフォルトで表示されるようです。

```
jsLoaded : function(component, event, helper) {
        var map = L.map('map', {zoomControl: false}).setView([37.784173, -122.401557], 2);
        L.tileLayer(
            'https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}',{
                attribution: 'Tiles © Esri'
             }).addTo(map);
        component.set("v.map", map);
    },
```


 attribution: 'Tiles © Esri'　は以下のとことみたい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d34f982e-5b00-b933-b21e-deb9a534ee3b.png)


# 使ってみてよくわからん

+ [LはLeafletJsのどこで定義されていますか?](https://stackoverflow.com/questions/58932742/where-is-l-defined-in-leafletjs)

Lはありませんが。リーフレットの src コードを見ると、 export されていますdefault。名前ではありません

```
import L from 'Leaflet'
```

を調べますnode_modules/leaflet/Leaflet.js。すべてが名前なしでインポートされるため、import Lマップ、ジオメトリ、およびその他のオブジェクトが既に含まれています。

jsLoadedメソッドの外で使えないのが痛い。
doInitの中でApex Classをコールしたいのだがどうやってもできないですね。

Lというのがどうやっても参照できない。

L.Icon is not a constructor

Icons.get is not a function

L.marker is not a function

# 地図タイルの変更

https://ujicya.jp/blog-mapping/xyz-tiles-url/


# 資料

https://michaelsoriano.com/lets-build-map-application-using-leaflet-and-lightning-components/

http://andynix.uk/lightning-component-with-leaflet-js
Python3: MongoDB のデータを削除 (Delete)

## プログラム

フォルダー構造

```text
$ tree -a
.
├── .env
├── config_mariadb.py
└── mongo_delete.py
```

```py:mongo_delete.py
#! /usr/bin/python
#
#	mongo_delete.py
#
#					Mar/01/2023
#
import	sys
import	string
import	pymongo
#
from config_mariadb import config_mariadb_proc
# -------------------------------------------------------------------
def	mongo_delete_proc (db_aa,collection,key_in):
	db_aa[collection].delete_one ({"key": key_in})
#
# -------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
key_in = sys.argv[1]
sys.stderr.write("%s\n" % key_in)
#
host,user,password,data_base = config_mariadb_proc()
collection='saitama'
client = pymongo.MongoClient(host,username=user,password=password,
			authSource=data_base,authMechanism='SCRAM-SHA-256')
db = client[data_base]
#
mongo_delete_proc(db,collection,key_in)
#
sys.stderr.write("*** 終了 ***\n")
#
# -------------------------------------------------------------------
```

.env
config_mariadb.py
はこちら
[Python3: MongoDB のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/ed0914dbc61d092e45d0)

## 実行結果

```text
$ ./mongo_delete.py t1167
*** 開始 ***
t1167
*** 終了 ***
```
JavaでSJISの16進からUnicodeを得る

レガシーなシステムで文字コードを細かくチェックする機会があり、簡単なツールを作ってみました。

```Java

public class SjisToUnicode {
    public static void main( String[] args )
    {
        try {
            String sjisHex = "819d";
            byte[] sjisBytes = hexBin(sjisHex);
            String sjisStr = new String(sjisBytes, "Windows-31j");
            String unicode = strToUnicode(sjisStr);
            System.out.println(unicode);

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }



    //
    public static String binHex(byte[] data) {
        StringBuffer sb = new StringBuffer();
        for (byte b : data) {
            String s = Integer.toHexString(0xff & b);
            if (s.length() == 1) {
                sb.append("0");
            }
            sb.append(s);
        }
        return sb.toString();
    }

    public static byte[] hexBin(String hex) {
        byte[] bytes = new byte[hex.length() / 2];
        for (int index = 0; index < bytes.length; index++) {
            bytes[index] = (byte) Integer.parseInt(hex.substring(index * 2, (index + 1) * 2), 16);
        }
        return bytes;
    }


    private static String strToUnicode(String original)
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < original.length(); i++) {
            sb.append(String.format("\\u%04X", Character.codePointAt(original, i)));
        }
        String unicode = sb.toString();
        return unicode;
    }


    private static String unicodeToStr(String unicode)
    {
        String[] codeStrs = unicode.split("\\\\u");
        int[] codePoints = new int[codeStrs.length - 1];
        for (int i = 0; i < codePoints.length; i++) {
            codePoints[i] = Integer.parseInt(codeStrs[i + 1], 16);
        }
        String encodedText = new String(codePoints, 0, codePoints.length);
        return encodedText;
    }
}
```

参考記事：[Java: 16進文字列とバイト列を相互変換する](https://techracho.bpsinc.jp/baba/2011_09_03/4414)
参考記事：[JavaのUnicode文字列の変換用メソッド("あ" <-> "\u3042")](https://qiita.com/sifue/items/039846cf8415efdc5c92)
Python3: MongoDB のデータを更新 (Update)

## プログラム

フォルダー構造

```text
$ tree -a
.
├── .env
├── config_mariadb.py
└── mongo_update.py
```

```py:mongo_update.py
#! /usr/bin/python
#
#	mongo_update.py
#
#					Mar/01/2023
#
import	sys
import	pymongo
import	datetime
#
from config_mariadb import config_mariadb_proc
# -------------------------------------------------------------------
def	mongo_update_proc (db_aa,collection,key_in,population_in):
	date_mod = datetime.datetime.now ()
	db_aa[collection].update_one({"key": key_in},{"$set":{"population": population_in,"date_mod": '%s' % date_mod}})
#
# -------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
key_in = sys.argv[1]
population_in = int(sys.argv[2])
sys.stderr.write("%s\t%d\n" % (key_in, population_in))
#
host,user,password,data_base = config_mariadb_proc()
collection='saitama'
#
client = pymongo.MongoClient(host,username=user,password=password,
		authSource=data_base,authMechanism='SCRAM-SHA-256')
db = client[data_base]
#
mongo_update_proc(db,collection,key_in,population_in)
#
sys.stderr.write("*** 終了 ***\n")
# -------------------------------------------------------------------
```

.env
config_mariadb.py
はこちら
[Python3: MongoDB のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/ed0914dbc61d092e45d0)

## 実行結果

```text
$ ./mongo_update.py t1163 459268700
*** 開始 ***
t1163	459268700
*** 終了 ***
```
Python3: MongoDB のデータを読む (Read)

## プログラム

フォルダー構造

```text
$ tree -a
.
├── .env
├── config_mariadb.py
└── mongo_read.py
```

```py:mongo_read.py
#! /usr/bin/python
#
#	mongo_read.py
#
#					Mar/01/2023
import sys
import pymongo
#
from config_mariadb import config_mariadb_proc
# -------------------------------------------------------------------
sys.stderr.write ("*** 開始 ***\n")
#
host,user,password,data_base = config_mariadb_proc()
collection='saitama'
#
client = pymongo.MongoClient(host,username=user,password=password,
			authSource=data_base,authMechanism='SCRAM-SHA-256')
#
db = client[data_base]
# db = client.city
collection = db[collection]
#
for data in collection.find():
#	print(data)
	str_out = data["key"] + "\t" + data["name"] + "\t"
	str_out += str(data["population"]) + "\t" + data["date_mod"]
	print(str_out)
#
sys.stderr.write ("*** 終了 ***\n")
# -------------------------------------------------------------------
```

.env
config_mariadb.py
はこちら
[Python3: MongoDB のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/ed0914dbc61d092e45d0)

## 実行結果

```text
$ ./mongo_read.py
*** 開始 ***
t1161	さいたま	52913	2003-8-20
t1162	所沢	17465	2003-2-10
t1163	越谷	91654	2003-7-14
t1164	久喜	53672	2003-9-9
t1165	熊谷	42391	2003-8-4
t1166	秩父	35187	2003-1-21
t1167	川越	81946	2003-7-23
t1168	和光	29714	2003-10-16
t1169	新座	41823	2003-12-25
*** 終了 ***
```
OpenAI Whisperのタイムスタンプを出力する方法

# whisperの文字お越しでタイムスタンプ

どうやらデフォでタイムスタンプを出力させることができるようだ

```python
model = whisper.load_model(VOICE_TYPE)
result = model.transcribe(audio_name, fp16=False, verbose=True)
```
ただ`verbose=True`はあくまでログとして出力されるだけ。

それならモジュールを直接いじろうと思ったんですが、

どうやらresultの中身にタイムデータも入ってたことに今更気づいた・・・

```
{'text': 'わずもキゅうき',
'segments': [{'id': 0,
'seek': 0,
'start': 0.0,
'end': 4.5,
'text': 'わずもキゅうき',
'tokens': [50364, 9206, 18216, 4801, 15535, 824, 227, 2646, 7016, 50589],
'temperature': 1.0,
'avg_logprob': -2.158733194524592,
'compression_ratio': 0.7,
'no_speech_prob': 0.16119693219661713}],
'language': 'ja'}
```
※[引用元](https://www.ai-shift.co.jp/techblog/3093)

```python
model = whisper.load_model(VOICE_TYPE)
result = model.transcribe(audio_name, fp16=False)

for i in result['segments']:
    print(f"{i['start']} --> {i['end']}")
    print(i["text"])
```

簡単だった。
隙間時間で簡単なアプリ作ってみた


## なぜ作ったのか
- 宇宙兄弟の影響でISSかっけーってなったから
- 星じゃなくてISS見るために空見るってかっこよさそうだったから
みたいなふわふわした感じで作り始めました。

## 使用技術
```
Rails7
line-bot-api
```
## 苦労したこと
ISSが見える時間を取得するのが難しかったです。
情報取得までの道のりはこんな感じです。

- 既存のAPI
既存のAPIがあったのですが、ISSの位置情報だけを取得するので、見えるかどうかの判定するための実装が難しく断念
http://open-notify.org/Open-Notify-API/ISS-Location-Now/

- スクレイピング
スクレイピング対象のサイトになります。
[#きぼうをみよう](https://lookup.kibo.space/observation/tokyo/?t=1677010230000&s=1677010230000)
最初は[mechanize](https://github.com/sparklemotion/mechanize)というgemを使用してスクレイピングしようとしました。
SPAで構築されていたのでうまくスクレイピングできませんでしたが、使い方としてはとても簡単でした。
その他chromedriverを使用してスクレイピングしたのですが、本番環境で動作するのか分からずという感じでした。
こちらの記事が参考になりました。
https://zenn.dev/usmoo/articles/133bb9ab4864d7

- [#きぼうをみよう](https://lookup.kibo.space/observation/tokyo/?)のjsonファイルを直接取得する
サイトの検証ツールのNetworkタブを見ると、tokyo.jsonなるものが読み込まれている？
![スクリーンショット 2023-02-22 14.50.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077510/ebc061a3-3b8d-e244-0d68-6a4803c6803e.png)
これを開いて見ると、取得したかった情報が全て詰まっているではありませんか！！！

ということで結果的にスクレイピングせずに実装完了しました。

最後にISSが見れる時間をLINEで通知するようにしてみました。
![スクリーンショット 2023-02-22 14.42.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077510/6460f3e0-8921-fc03-19c5-81c55429eb7e.png)

## さいごに
messagingAPIは無料枠なので、サービス公開は控えようかなと思います。
ちなみに10人に一斉送信すると10通としてカウントされるので、無料枠はすぐに消化しちゃいそうでした。
(2023年6月から無料枠200通)

最後まで見ていただきありがとうございました。
ジャーナルログについて

## 環境
Ubuntu20.4

## 出力場所の設定
ジャーナルログのデフォルトの出力場所は、Ubuntu18.04を境にして変更になっています。

| Ubuntu18.04以前 | Ubuntu18.04以降 |
|:-----------:|:------------:|
| /run/log/jounal       | /var/log/journal        |

ファイルシステムを確認すると、/runは、**tmpfs**という少し特殊なファイルシステムになっています。ちなみに、/varのファイルシステムは、**ext4**です。
```cmd
$df -TH
Filesystem                 Type      Size  Used Avail Use% Mounted on
tmpfs                      tmpfs     1.1G  1.2M  1.1G   1% /run
```
tmpfsでフォーマットされたファイルシステムは、ハードディスク上に作成されるのではなく、メモリ上に作成されます。よって、OSを再起動すると、/run上に作られたファイルは全て消えてしまいます。

Ubuntu18.04以前では、ジャーナルログは、/run/log/jounalに作成されていたため、OSを再起動するたびに全て消えていました。それが、Ubuntu18.04以降は、永続的に保存されるようになったということです。

Ubuntu18.04以降であっても、ジャーナルログの保存先を、Ubuntu18.04以前の/runに戻すことができます。ジャーナルログの保存先を変える場合は、/etc/systemd/journal.confを修正します。

コンフィグファイルを参照すると、全ての設定がコメントになっています。
```
$cat /etc/systemd/journal.conf
```

コメントになってる設定が、デフォルトの設定として有効になっています。ジャーナルログの保存先を設定する箇所は、**#Storage**です。デフォルトでは、**auto**になっています。

autoの意味は、/var/log/journalディレクトリが存在すれば、このディレクトリにジャーナルログが保存され、存在しなければ、/run/log/jounalディレクトリに保存されるという意味になります。autoにするのではなく、明示的に保存先のディレクトリを指定することもできます。

## ログの参照
ジャーナルログに保存されたログは、バイナリファイルで保存されます。よって、catやviで参照することはできません。ジャーナルログを参照するには、**journalctl**といった専用のエディタを使くことになります。

## サービスの再起動

ジャーナルログは、**systemd-journald**というサービスを使って収集されています。**/etc/systemd/journal.conf**の設定を変更した場合は、サービスを再起動して、設定を有効にする必要があります。
```
$systemctl restart systemd-journald
```

サービスのステータスを参照する場合です。
```
$systemctl status systemd-journald
```
作業効率化Tips

## 囲み文字簡単作成
下記設定をすることで、CSVの囲み文字を一発で作成できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818285/98e1623c-6dab-105e-5aa2-e662689b8136.png)
2023年3月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2023年3月1日の検索結果 (リスティング広告)

![20230301_AIOps_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/18c52e2c-f918-6f1c-821d-853c05f8d345.png)

* Splunk
* Pure Storage
* ServiceNow

Splunk がトップで Pure Storage が続いています。 IBM がなくなりました。

先月の結果はこちら --> [2023年2月 AIOps 定点観測](https://qiita.com/mkodera/items/047386ca5a7dc89cde24)

# 2023年3月1日の検索結果 (広告以外)

![20230301_AIOps_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/4beb9c49-49c5-8aa8-c7b5-c36f4b4e9179.png)

* Splunk
* ServiceNow
* intra-mart (NTTデータ イントラマート)
* HPE
* ITmedia
* JBSVC

広告以外では Splunk がトップで ServiceNow が続いています。HPE が浮上してきました。

先月の結果はこちら --> [2023年2月 AIOps 定点観測](https://qiita.com/mkodera/items/047386ca5a7dc89cde24)
Net Zero Cloud


時々質問を見かけますが、中身はよく分かりません。


# 無料の環境

+ [ネットゼロクラウドトライアル組織を作成する](https://help.salesforce.com/s/articleView?id=sf.netzero_setup_create_net_zero_cloud_trial_org.htm&type=5)
+ [Try Net Zero Cloud for Free](https://developer.salesforce.com/free-trials/comparison/net-zero-cloud)
+  [Hello, I have made all the steps about request and enable a Net Zero org, but it does not recognize the developer edition org, can anyone help me please?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007es0tD)

:::note
Yes, actually I'd like to share what happened: 

I had a correct Playground, but in the Company info, the lenguage was in Spanish and, it seems, that just work correctly in english.
:::




# ライセンス

+ [一般的な組織には、負債、税金、組織または運用構造が狭いなどのさまざまな理由から、2 つ以上の法人組織があります。この場合、購入したライセンス (スターターまたはグロース) はこれらのケースをサポートしていますか、それとも複数組織サポートアドオンを購入する必要がありますか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifnmh)

:::note
子会社が親会社によって 51% 所有されている限り、MOS ライセンスを購入せずに拡張境界会計を使用できます。

親会社の持分が 50% 以下の企業で炭素会計を行う必要がある場合は、法的に製品を購入する必要があります。
:::


# 未整理

+ [Can't create NZ Analytics App](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Jf9PS)

:::note alert
 In the 'LOAD_DATASET0' node, the 'SustainabilityCredit' object doesn't exist or isn't accessible to the Integration User.
:::


+ [Analytics Studio \ Tableau Error - Object doesn't exist or isn't accessible to the Integration User](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JdMaZSAV)

:::note alert
wave.template.WaveTemplateException: In the 'LOAD_DATASET0' node, the 'SustainabilityCredit' object doesn't exist or isn't accessible to the Integration User.
:::


+ [Net Zero Cloud Carbon Marketplace integration](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Px4cISAR)

:::note
I am the lead product manager for Net Zero Marketplace.  We do have an integration between purchased credits from the marketplace and carbon credit management in Net Zero Cloud, but unfortunately, at this time, only organizations with a US entity are able to purchase from Net Zero Marketplace.  

私は Net Zero Marketplace のリード プロダクト マネージャーです。マーケットプレイスから購入したクレジットと Net Zero Cloud のカーボン クレジット管理は統合されていますが、残念ながら現時点では、米国法人を持つ組織のみが Net Zero Marketplace から購入できます。
:::

+ [I can't create a Building Energy Intensity Record](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifemc)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/746feff8-a3f8-a75d-b518-f04e602e0724.png)

:::note
Please check this article.

Set Up Record Types for Net Zero Cloud
https://help.salesforce.com/s/articleView?id=sf.netzero_setup_record_types.htm&type=5
:::

# トレイルヘッド

+ [【未解決】We can’t find the ‘US EPA - Electricity - EGRID’ Emissions Factors dataset.](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PWV9b0AH)
【SQL】SQLでboolean(真偽値)を返す

## 現状
アプリケーション作成で条件によって`true`,`false`を返す必要が出てきたのでやってみる。（普通に値を返すだけしかやったことないので真偽値を返す方法を知らなかった・・・）

## 条件
テーブルとして`users`、カラムとして`id`,`name`があります。
この2つのカラムの現状が↓になります。idと名前が入っています。
| id  | name      |
| --- | --------- | 
| 1   | tanaka    |
| 2   | sato      |
| 3   | takahashi | 

ここに例えば、`id→1` `name→tanaka`を検索するとすでにDBの中に2つのカラムのデータが存在しているので`true`を返し、どちらか一方でも一致しない場合は`false`を返すようにしたいと思います。

## やってみる
結論、下のSQL文でできます。

```sql
SELECT EXISTS(SELECT 1 FROM users WHERE id = '[比較するid]' AND name = '[比較するname]');

```
idとnameが一致している場合は1(true)、一致していない場合は0(false)が返されます。

`EXISTS`句はデータの存在チェックで利用されます。また、該当データが存在する場合は`1(true)`、存在しない場合は'0(false)'を返します。

後ろの
```sql
SELECT 1 FROM users WHERE id = '[比較するid]' AND name = '[比較するname]'
```
に関してはまず、
`WHERE id = '[比較するid]' AND name = '[比較するname]`はレコードの検索条件を指定しています。

`SELECT 1`に関してはレコードが存在するために使用しています。`1`は任意の数字、文字になります。今回は分かりやすいように`where`で指定した条件で当てはまっていたら`1`を返すようにしているだけです。`SELECT *`でも問題ありません。

以上このようにして条件によって異なる真偽値を返す、SQL文を書くことができました！
Jetpack ComposeでconstraintLayout実装時に気をつけたいこと

# 初めに
今回は、`JetpackCompose`実装時に`ConstraintLayout`を使う時に個人的に気をつけた方がいいなと感じたことを紹介していこうと思います
### 本文
***Constraint Layoutを使いすぎない***
---
基本的には`Compose`で書いている時によほど複雑でない場合は`ConstraintLayout`を使ってるプロジェクトでも`ConstraintLayout`を使いすぎないということです。
これは、単に`Compose`で書いているのに`ConstraintLayout`を使ってしまうと変にコードが複雑になり、可読性が下がってしまい`Compose`本来の使い道と合ってないように感じるからです

***Dimensionを適宜設定する***
---
`Compose`で`ConstraintLayout`を使って実装したことある方は分かると思いますが、従来の`XML`での実装同様の規約を持たせるには`Dimension`を適宜設定しないと自分が想定した通りの表示にならないことが多いです。
せっかく`ConstraintLayout`を使うのであれば、しっかりと設定をして想定通りの実装ができるように気をつけましょう

***createRefsの命名をわかりやすくする***
---
これも一つ目同様可読性に関わってくるものですが、複雑な`View`になっているからこそ`ConstraintLayout`を使ってるのでどの部品がどういった役割を持っているのかなどを命名のみで分かるように意識をすることで他者や後日自分が見たときの理解のスピードに直結します
### 最後に
今回は自分がCompose実装時にConstraintLayoutを使っていて感じたことをまとめてみました
どなたかのお役に立てれば幸いです
Tang-Nano-9Kで動作するＮＥＳの音声HDMI出力化とSDカード起動

# 目的
　fpganesのTang-Nano-9Kへの適用により、NESを動作させる事は上手く行った。
　Tang-Nano-9Kには音声出力は無いので、DeltaSigma処理によりお茶を濁した。
　しかし、音がちんけで一寸聞くに堪えない。
　でも、DACとアンプを外付けするのもちょっち。
　◆◆◆　そうだ、HDMIで繋いだモニターから音を出そう　◆◆◆
　参考資料は見つかったが、Tang-Nano-9K用なんてのが有るはず無いが其処は根性で。


# 実施内容
　HDMI接続での音声接続は見本が有るが、どうやつてTang-Nano-9Kへ適用するかが課題であった。
　しかし、下記の文献のサンプル中に「GW_IDE」の文字を発見。
　　「[SystemVerilog code for HDMI 1.4b video/audio output on an FPGA.](https://github.com/hdl-util/hdmi)」
　もしやと思い、ものは試しとGW_IDEを定義したら、音が出るじゃ無いですか。
　　※HDMIの出力ドライバーの追加は必要。
　これにNESの音声出力を繋げば、ゲームから音が出る筈である。
　　※解決すべき別の問題が発生したが。

　ついでに、SDカードから読出し起動が出来るように機能を追加。
　これで、モニターさえあればＰＣレスで何処でもNESで遊べる。
　SDカードを交換すれば、ゲームの選択も可能だし。
　　※なんて書いたが、購入した小型モニターからはNESの音は出なかった。PCに繋げば出るのだけど。
　　　まず、間口の広いPCモニタで動作を確認してね。


# 参照資料
　※格納位置は前回と同じ。
　※通信速度を従来の4倍に上げたので、ロードが失敗する場合は速度を下げてください。
　「[fpganes Tang-Nano-9K バージョン](https://github.com/hi631/tang-nano-9K/tree/master/NES/fpganes)」
　「[fpganes Tang-Nano-9K ローダー](https://github.com/hi631/tang-nano-9K/tree/master/NES/loader)」
　「[fpganes Tang-Nano-9K モニター](https://github.com/hi631/tang-nano-9K/tree/master/NES/mon)」
　「[Tang-Nano-9K 音声HDMI出力化例](https://github.com/hi631/tang-nano-9K/tree/master/NES/hdmi+a)」

# 音声出力の機能概説
　音声出力化自体はサンプルの微修正で実現できたが、NESへの適用で問題発生。
　元々のHDMI化は、VGAの同期信号をHDMIが受け付けて変換する形で有ったが、サンプルはHDMI側で同期信号などを発生していたので、信号を繋ぐと同期が取れず画面が流れてしまった。
　そこでVGA側で作製している同期信号で、HDMI側に強制同期を掛けると言う荒業で解決。
　　※HDMI側で何しているのか理解して無いので、此処に落ち着くまが一苦労。
　画面と音声は出たが、NESクロックで作製していた画面が汚くなったので、Pixelクロック同期に変更。
　　※こんな感じ、画面横方向に縮んだが、之が正規サイズ(4:3)なのだろう。
![nes-dq+m.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/ac3194fa-8cd1-27ce-225a-1ec7147433b2.jpeg)

# SDカードからの起動概説
　リセット直後にカードの初期化に成功すれば、カードデータを書込むと言う単純な処理。
　カードデータ読み込み後も、PCからのダウンロードは受け付ける。
　SDカードはiNES形式のままで、先頭からベタ書きして作成する。
　　※win32diskimageを使用する場合、512byteに満たないデータは書き込まない様なので要注意。
　　　末尾の16byteが書込まれないので、ダミーデータを496byte追加しておく必要が有る。


# Tang-Nano-9K 音声HDMI出力化サンプル
　NESに組み込んだ形では音声HDMI出力の方法が判り難いと思ったので、簡単な例を示す。
　元ネタをTang-Nano-9Kに組み込み、ビープ音源を追加しただけである。
　　※音声出力の動作確認に使用した。
　「hdmi+a」のSRCのtop.sv内の、audio_sample_wordに音声データを入れれば発音する。
　　※画面が出ない(同期が取れない)と、音も出ない。
　　※見本では音量を絞っている。

# リソースとコンパイル時間
　今回のリソース(LUT)の使用率は88%、アナライザも組み込むと97%に達していた。
　流石に激重で、コンパイルに5分以上かかってしまう。
　　※配置配線を繰り返しているのだろう。
　　　[80%] Routing から数分間ピクリとも動かない、フリーズしたのかと思ったよ。
　Tang-Nano-9KのLUTは8640有るが、その利用は下記となっていた。
　　ＮＥＳ　　２７２７
　　ＤＲＡＭ　１２３１
　　ＨＤＭＩ　　９０８
　　ＵＫＰ　　　４３８
　　ＳＤ　　　　４３２
　　※Hierarchy画面を右側に引き延ばせば、数字が表示される。つい最近まで知らなかった。

　NES本体は約3割なので、周辺回路が結構重い。
　もし再コンパイルするのなら、define UseSDCardとdefine UseGamepadのコメントアウトを勧める。
　これなら、2分前後でコンパイルが完了する。


# 感想
　音声出力とSD化によりPCの軛を脱した事だし、NESシリーズは今回で終わりだろう(多分)。
　まだまだ動かないカートリッジも有ると思うが、其処は各自で頑張ってください。
　なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。
Go: crypto/subtle の "subtle" の意味

Go の標準パッケージに含まれる [crypto/subtle](https://pkg.go.dev/crypto/subtle) の "subtle" という単語の意図が少し気になったので調べて見ました。crypto/subtle は暗号ライブラリの共通関数的なものが定義されているパッケージです。

## "subtle" の意味
[crypto/subtle パッケージの Overview](https://pkg.go.dev/crypto/subtle#pkg-overview) には "require careful thought to use correctly" と説明があります。「正しく使用するには慎重な考えが必要」という意味に取れるので、"subtle" は「繊細な」(delicate) に近い意味で用いられているようです。[unsafe パッケージ](https://pkg.go.dev/unsafe)と同じく、利用者の注意を促す目的で選択された単語のようです。

> 2. fine or delicate in meaning or intent; difficult to perceive or understand
> https://www.collinsdictionary.com/dictionary/english/subtle

## Web Crypto API の SubtleCrypto の例
調べていると [Web Crypto API](https://www.w3.org/TR/WebCryptoAPI/) にも [SubtleCrypto というインタフェース](https://www.w3.org/TR/WebCryptoAPI/#subtlecrypto-interface)があることを知りました。この [API のドラフト](https://w3c.github.io/webcrypto/#subtlecrypto-interface)には名前の由来がしっかりと記載されていました。

> The SubtleCrypto interface is named "SubtleCrypto" to reflect the fact that many of these algorithms have subtle usage requirements in order to provide the required algorithmic security guarantees.
> https://w3c.github.io/webcrypto/#subtlecrypto-interface

"algorithms have subtle usage requirements" とあり「繊細な (subtle) 使用要件を持つアルゴリズム」を反映した名前であることが明記されています。

なお、SubtleCrypto が導入されたのは [2013 年のコミット](https://github.com/w3c/webcrypto/commit/6adc23136ca80a3be03c2f4db86fa734ae6f5a3a)です。Go の crypto/subtle の導入は [2009 年のコミット](https://github.com/golang/go/commit/ad67a86626bc9fa73ec09c8355b91bcdcb916f2e)なので、コミット履歴を見る限りでは Go の方が "subtle" の使用は早いようです。

## おわりに
もともとの疑問は、共通関数的なパッケージになぜ "subtle" という「微妙な、繊細な」などの意味の単語が使われているかでした。Overview を見ると意図が理解できたので、当たり前の話ですがパッケージ自体のドキュメントも重要だと実感しました。
アルコールチェッカー Bluetooth内蔵 スマホ対応


https://www.amazon.co.jp/KOUSYU-%E3%82%A2%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%81%E3%82%A7%E3%83%83%E3%82%AB%E3%83%BC-Bluetooth%E5%86%85%E8%94%B5-%E3%82%A2%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%AB%E6%A4%9C%E7%9F%A5%E5%99%A8-2500%E5%9B%9E%E6%88%96%E3%81%84%E3%81%AF%E4%B8%80%E5%B9%B4%E9%96%93%E4%BD%BF%E7%94%A8%E5%8F%AF%E8%83%BD%EF%BC%88%E7%99%BD/dp/B0BGKGD9FN?th=1

+ 【革新機能】Bluetooth付き、iOS/Android向けのアプリあり、写真とる/メモリー/パソコンへ送信可能、アプリ：Smart Safety

革新的にBluetoothを付き、スマホと接続可能、下記機能が実現できる
・アプリ：Smart Safety（App Store/Google Play）
①テスト現場撮影、もっと詳細なテストデータを記録する
②過去のデータ導入、昔のテスト結果が失う可能性がない
③デコード検索可、スマホですぐ全てデータを把握できる
④メール送信可、パソコン或いは他の人にデータを発送可能

スマホアプリで接続は出来るが結果が同期出来ない事がよくある。途中で止まったり。インカメラ、アウトカメラの切替はスマホ機種によって出来るものと出来ないものがある。連携は期待外れ。アプリの出来が良くない。メール送信も送信するときは毎回すべて送信するようで新しいものだけ送信することが出来ない。

---------------------

https://store.shopping.yahoo.co.jp/jctmedicalshop/AT8-JCT.html#

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/19a8d882-c443-57a6-9512-a4d80d146083.png)

---------------------------------

https://item.rakuten.co.jp/tanaka-denki/cax-ad300-2/?iasid=07rpp_10095___eg-lixwc9f2-7u-c12d6b6a-9ffc-4b6f-85ff-9b0bd00ffa58

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4577d527-5e4e-4769-8a6a-232a8269a54b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/eeb25c26-325f-78b2-3369-706fc6259f86.png)

https://prtimes.jp/main/html/rd/p/000000210.000045133.html

1．スマートフォンと連携し、測定結果や測定者情報を管理者用のPCにメール送信可能
アルコール検知器に通信機能を搭載することにより、スマートフォンとBluetooth®で接続できるようになります。測定中は、検知器でアルコール濃度の測定を行うとともに、専用のスマートフォンアプリで測定者を写真撮影します。この測定結果と測定者情報（写真データ、位置情報など）を、スマートフォンの通信機能を使用して管理者のPC管理ソフトウェアにメール送信することが可能です。


---------------------------

https://pai-r.com/product/alkillernex/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/51e868f3-3753-d292-0b27-bf196254299a.png)

-------------------------------

Power Automateでつくるアルコールチェックアプリ
https://note.com/mkmk69/n/n18487b262b6b

---------------------
https://pai-r.com/2022/01/plus0117/

■有反応が出た際にMicrosoft Teamsに通知を送れるようになりました

今までは有反応が出た際の通知はメールでのみ行えましたが、Microsoft Teamsへ通知メッセージを送れるようになりました。

Microsoft TeamsのWebhook機能を利用します。Microsoft TeamsのWebhook機能が利用できるかをご確認ください。
コスパ最強。おすすめのレンタルサーバーはコアサーバー一択です。他４選

# 結論

日本国内のコスパ最強のレンタルサーバーを選ぶ場合。

1. コアサーバー
1. coloful box
1. ロリポップ
1. スターサーバー
のいずれかが良いでしょう。面倒なら、コアサーバー一択です。

ちなみに、エックスサーバーをお勧めしているサイトは、アフィリエイト目的の可能性が高いので、鵜呑みにしてはいけません。

# 200円台

ロリポップの【ライトプラン】は、200円台のレンタルサーバーではスペックが高くおすすめ。

# 500円台

500円以下でレンタルサーバーを使うなら、ColorfulBoxが一番おすすめ。

ロリポップ！の「スタンダードプラン」を6ヶ月以上で契約するのもあり。

# 注意

さくらのレンタルサーバーの場合は、https化対応が有料＆手間がかかったり、wordpressを簡単インストールする際にも一手間かかったりするとの意見があるらしい。
ChatGPTちゃんにExcel VBAを作ってもらったのでメモ

ChatGPTちゃんにExcel VBAを作ってもらったのでメモしておく場所です。

VBAから逃げ続けてきた人生でしたが、業務の3割Excelなので流石に限界が来ていたところ
ChatGPTちゃんという救世主が出てきたのでありがたさしかないです。


### すべてのシートで「全選択してコピーして値貼り付けする」操作を実行するVBA

```
Sub PasteValuesOnAllSheets()
    Dim ws As Worksheet
    
    For Each ws In ActiveWorkbook.Worksheets
        ws.Select
        Cells.Select
        Selection.Copy
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
        Application.CutCopyMode = False
    Next ws
End Sub
```


### 全てのシートについて、一つのシートを一つのブックに分けてそのファイル名をシート名にして保存してくれるVBA

```
Sub saveSheet()
    Dim shObj As Worksheet
    Dim newBook As Workbook
    Dim newBookName As String
    Dim folderParent As String
    
    'シートの保存先はこのブックと同じとする
    '必要に応じてこの変数を変更する
    folderParent = ThisWorkbook.Path & "\"
    
    'ワークシートの分だけ繰り返す
    For Each shObj In Worksheets
        'シート名を変数に格納しておく
        newBookName = shObj.Name & ".xlsx"
        
        'シートを新しいブックにコピーする
        shObj.Copy
        '移動先のブックがアクティブになっているので変数に格納する
        Set newBook = ActiveWorkbook
        '新しいブックを名前を指定して保存する
        newBook.SaveAs folderParent & newBookName
        '新しいブックを閉じる
        newBook.Close
    Next shObj
End Sub
```
カテゴリ毎の商品実績ランキング(SPSS Modeler データ加工逆引き11-12)

# カテゴリ毎の商品実績ランキング表を作成する

![スクリーンショット 2023-02-15 11.48.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/20280fe7-7faf-4403-a1bf-8b88ca4faa99.png)

## 1.想定される利用目的

・データ理解のための基礎統計量確認
・固定帳票の作成


## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/cate_rank.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2023-02-15 11.49.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/00604d5b-6fac-e437-1b55-ddb68ba7de89.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2023-02-15 11.49.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4ebfb8bf-b797-9bc2-0615-4a9f06447a02.png)

b.　[レコード集計]ノードを編集します。商品番号で集計しますがそのカテゴリも識別できるよう大分類もキーに含めます。
![スクリーンショット 2023-02-15 12.38.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5142a695-ef1b-df1c-2a36-bc6326ce706d.png)

c.[ソート]ノードを編集します。大分類がセットになるようにしてから売上で降順にソートします。
![スクリーンショット 2023-02-15 12.39.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d4f46f3f-429c-f0e1-f65c-50058250f86e.png)

[プレビュー]します。
![スクリーンショット 2023-02-15 12.47.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/afa3424f-411e-3852-686e-d4ba04983917.png)


d.[フィールド作成]ノードを以下のように編集します。列方向に参照するオフセット関数を利用します。[@&#xFFF0;OFFSET(フィールド,1)]でフィールドの値の1行上を参照します。大分類が入れ替わると連番がリセットされるように設定しています。
![スクリーンショット 2023-02-15 12.39.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9a515b98-0f5f-4e38-d33d-f5934bf6f532.png)

[プレビュー]します。
![スクリーンショット 2023-02-15 12.48.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2a17d420-80d5-ec54-e003-b4bf952661ef.png)

e.[条件抽出]ノードを編集してランキングは上位10位に足切りします。
![スクリーンショット 2023-02-15 12.40.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6c28f125-69f9-3b4d-9fae-eaeb41f716f3.png)

f.[再構成]ノードを編集します。
![スクリーンショット 2023-02-15 12.41.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c0d64ad9-a82a-e72e-c97b-341d5fb0b298.png)

[プレビュー]します。
![スクリーンショット 2023-02-15 12.49.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2c032e01-387f-686d-3eed-13567fec43f9.png)

g.[レコード集計]のキーをランキング番号にして欠損値を圧縮します。
![スクリーンショット 2023-02-15 12.42.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/38e7a532-48c7-9bbd-4a1e-8fa6ce60f92a.png)

h.[フィールド順序]ノードで適宜表示する列の順番を変更します。
![スクリーンショット 2023-02-15 12.43.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d487ff80-9cdb-8acf-1ab0-c41acea194e2.png)

[デーブル]ノードを実行します。
![スクリーンショット 2023-02-15 12.43.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4a3ff223-7b44-2988-3181-fdd5c512c8ed.png)


#### 注意事項

[再構成]ノードで列に展開するメンバーが表示されないときは入力でデータ型の[値の読み込み]を実行します。
Excelで表頭を入れ子にすると表が見やすくなります。

## 4.参考情報

####  全レコード/設備毎に通し番号を振る

https://qiita.com/416nishimaki/items/8cd1fc55261fd36a9013

####  カテゴリ値を列に展開してIDで集約　縦持ちを横持ちへ

https://qiita.com/416nishimaki/items/2519553c7cce0fc0b0e0

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
📖「良いコード／悪いコードで学ぶ設計入門」（第３章 クラス設計）を読んだ感想

## 前回の話
https://qiita.com/tomonac/items/1b290c380f80e7fdc60d

## 感想　（第3章 クラス設計）

![image.001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3144766/929d61da-9e30-ab1c-42bd-536dd20a5062.png)

- どのようなクラス設計を行えば、悪魔に対抗出来るのか学びがあり、潜む悪魔とそれに対抗出来る手段をサンプルコードを元に比較し理解することができました。問題解決に繋がる設計パターンが大事で、自己防衛が出来るクラス設計を行う事で様々な問題に対応できるようになります。



**[ 学んだこと ]**

- 完結したクラス設計を行うこと
  - 複数のクラスと密結合な設計にしない
- 成熟したクラス設計を行うこと
  - ガード節を用いた正常値のみ許容するような設計であること
  - 関係するロジックは、別クラスに実装せずデータ保持側に寄せ高凝集な構造にする
  - 不要なメソッドは実装しない
  - 値渡しに不正が無いように、型指定にする

## 次回
https://qiita.com/tomonac/items/a553f256b071fff98906
BigQueryのテーブルへのリンクを作る、URL直打ちでテーブルへ移動する方法

誰かに「このテーブルです！」ってテーブルへのリンクをそのまま渡せると便利なんですが、なかなかその情報が載っていなかったのでメモ。

## BigQueryのテーブルへのリンクを作る、URL直打ちでテーブルへ移動する方法
以下のようなフォーマットで作るとテーブルへのリンクになります。

```
https://console.cloud.google.com/bigquery?p=[project_id]&d=[dataset_name]&t=[table_name]&page=table
```

## 注意
以前は、テーブルへのリンクのURLフォーマットが違ったようです。[こちらのQiita記事](https://qiita.com/YumaInaura/items/dca227dee4992b0b6b3f)のような形式だったようです。

webコンソールの仕様が変わるとこのURLも変更になるんじゃないかなと思っています。なので、時間がたつと変わってしまうのかもです。
アニメーション(transition)

#### 小さなアニメーション

- transitionを使うとアニメーションをつけることが出来る。
「変化の対象」や、「変化にかかる時間」などを指定可能。

- 「変化の対象」にはcolorなどのプロパティを指定するが、allを指定すると全てのプロパティに適用出来る。
transitionは多くの場合hoverと組み合わせて使う事が多い。

```html
<div>
  <h1>programming</h1>
</div>
```

```css
div {
transition: all 1s;
}

div:hover {
background-color: red;
}
```
ChatGPTやAI関連で面白かった・気になった事例まとめ

# はじめに
前回のChatGPTで電卓アプリを作れるか試した件について、Twitter等からも反応を見ることができて嬉しかったです。

おまけの評判が良かったので、私がここ最近で気に入ってるChatGPT関連の情報をまとめさせていただきます。

※私も前回おまけをまとめていて、本編よりもこっちを見てほしい！！と途中から思っていたので、評判が良くて嬉しかったですｗ

# ChatGPT
## 感情回路を埋め込み
https://twitter.com/fladdict/status/1626936471969218560

## 大学の授業レポート代行
https://twitter.com/gizmodojapan/status/1629406381441794050

## AlexaでChatGPTとやり取り
https://twitter.com/hiraoka_dx/status/1629466264048631810

## ロボット制御に応用
https://twitter.com/Yamkaz/status/1630704453648281601

## Pythonコードを、JavaScriptに書き換え
https://twitter.com/itsumonotakumi/status/1630549257949421570

## p5.jsで冬の情景を描画
https://twitter.com/Iinkage/status/1630551990743846912

## デバイスの傾きで左右に回転する三角形をHTML上で描画
https://twitter.com/google_homer_/status/1630355170226999298

## Googleアドセンス合格した方法
https://twitter.com/keyword_sentei/status/1630401337740660736

## VSCodeのChatGPTプラグイン
https://twitter.com/NuCode/status/1630435163934167040

## ChatGPTを日本企業はどう使う？
https://www.businessinsider.jp/post-265674?fbclid=IwAR1_mN4vR-QHNWwXtDTIvK0GaoZzUO2DDyh8PlnzMzXZd1vSqwGRQWpYYxQ

# その他AI言語モデル関連
## ローカルでも動かせる言語モデル「FlexGen」
https://twitter.com/gigazine/status/1628152642240385027

## シーケンス図の作成も可能な「Notion AI」
https://twitter.com/NotionJP/status/1628884909581279241

## MicrosoftのBingにAIチャット機能が追加
https://808hanablog.com/explanation-of-how-to-start-and-use-microsoft-bing-ai-chat

## Metaが公開したLLaMAベースモデルRLHFでより効率的に学習できる「ChatLLaMA」
https://twitter.com/goto_yuta_/status/1630228747273261058

# AI使用の派生

## 誰でもキャラクターAIが作れるサービスを開発
https://twitter.com/aivtuber_zero/status/1629805886305878016

## 自分のAIと会話出来るようになった(GPT3.5を利用)
https://twitter.com/cumulo_autumn/status/1623589509823893504

## テキスト指示から複数のUIデザインを生成
https://twitter.com/Yamkaz/status/1628929397435813888

## ウェブサイト情報を自動で抽出してデータベース化
https://twitter.com/masahirochaen/status/1626087621444374529

# おわりに
ここ最近、AI関連はほぼ毎日何らかの発表があり凄いですね…。
また何か見つけたら追記or別記事作れたらと思います。
【Rails】acts_as_listを使用した並び替え機能

## 概要
タスク管理アプリの作成で各タスクの並び替え機能を実装する為に、Gemの`acts_as_list`を導入。
導入手順は以下の通り。

## 1. gemのインストール

```ruby:gemfile
gem 'acts_as_list'
```
```:ターミナル
bundle install
```

## 2. positionカラムの追加
`acts_as_list`は`position`カラムを使用しなければならない為、並び替え機能を実装したいモデルに`position`カラムを追加．

```:ターミナル
% rails generate migration AddPositionToCard position:integer
```

## 3. モデルにacts_as_listを記述
`acts_as_list`を並べ替え機能を実装したいモデルに追記することで、データ作成時に`position`カラムにデータが入る。
```ruby:models/card.rb
class Card < ApplicationRecord
  acts_as_list
end
```

## 4. コントローラーにmove_higher&move_lowerメソッドを記述
各要素を上下にひとつ動かしたいだけなので、`move_higher`と`move_lower`を使用。
他のメソッド記述方法は下記参照。
リンク：[github/acts_as_list](https://github.com/brendon/acts_as_list)
```ruby:cards_controller.rb
  def index
    @cards = Card.all.order(:position) #positionカラム順に並べる
  end

  def move_higher
    Card.find(params[:id]).move_higher #move_higherメソッドでpositionを一つ上に
    redirect_to action: :index
  end
  
  def move_lower
    Card.find(params[:id]).move_lower #move_lowerソッドでpositionを一つ下に
    redirect_to action: :index
  end
```

## 5. ルーティングの設定

上記で新規アクションを設定したので、新たにルーティングの設定。
```ruby:config/routes.rb
resources :cards do
  member do
    get :move_higher
    get :move_lower
  end
end
```

## 6. ビューの編集

```ruby:card/index.html.erb
<% @cards.each do |card| %>
<div class="card_arrow">
  <%= link_to "∧", move_higher_card_path(card) %>
  <%= link_to "∨", move_lower_card_path(card) %>
</div>
<% end >

```
## 動作イメージ例
上記手順で実装すると下記のような動作が行えるようになりました。
[![Image from Gyazo](https://i.gyazo.com/b2bf89cb44b6173ca41899bc57e1945d.gif)](https://gyazo.com/b2bf89cb44b6173ca41899bc57e1945d)
## 備考
今回の実装は同期通信で実装していますが、非同期通信でもできるみたいですので、
非同期でも並び替え機能を実装できたら、記事の更新をしたいと思います。
ヘッダーのレイアウト(透明化）

#### ヘッダーの透明化について

- opacityには要素の中身全てを透明にするという性質があり、背景色のみを透明にするには、rgbaというものを使う必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123154/2bf54d3a-3d5e-dd6c-e1e9-4ad7a6a2df60.png)

- opacity

```css
.box1 {
  opacity: 1;
}
```

- rgbは色の指定の仕方の1つで、3つの値の組み合わせで表示する色を決める。

````css
box1 {
background-color: rgb(255,147,30);
}
````
紫の部分である、255,147,30と#ff931eは同じ色。

```css
box2 {
background-color: #ff931e;
}
```

opacityプロパティは要素全体を透過させるが、rgbaを使うとその色だけを透明にすることが出来る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3123154/e5c22cd3-db5a-23dd-04cb-8b45664f86f2.png)
【VBA】ファイルの存在確認

# メモ
業務でファイルの存在確認を行う事がよくある為に、メモで残しておく。

## ファイルの存在確認
`Dir関数`を使用して、ファイルの存在確認を行えます。
下記のように記載する事で、確認出来ます。存在する場合はファイル名を返し、存在しない場合は空欄が返ります。

```:ファイルの存在確認
Sub Check_File()

    Dim File_Pass As String
    File_Pass = Dir("C:\スクリプト類\*.txt")

    Debug.Print File_Pass

End Sub
```

ファイルが存在しない場合に、ファイルを生成したい場合は下記のようにしています。

```:ファイルが存在しない場合に、生成
Sub Check_File()
    
    If Dir("C:\スクリプト類\test.txt") = "" Then
    
        Open "C:\スクリプト類\test.txt" For Output As #1
        Close #1
    
    End If
    
End Sub
```