OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】TextMeshProでもっと太いアウトラインを描画する方法

# 概要

TMPro で一部の場面に使うフォントを、より太いアウトラインにする方法を模索しました。
実用性がありそうな方法には 🌟 を付けています。
そして、[Unity 標準の Outline を再現する方法](#-unity-標準の-outline-を再現する)を実現できるコンポーネントを[作りました。](#unity-標準の-outline-を再現するコンポーネント)

# 模索

### Unity 標準の Outline を使う
TextMeshPro は非対応です。

### TextMeshPro の Material 設定にある Outline を使う
太さに限界があります。

### 🌟 Dilate を下げて調整する
FontSize と Character を調整し Material の Dilate を下げれば、もう少し太く見えます。
この方法も良いですが、調整の手間や文字本体が細くなるといった問題があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/a6e3c951-af90-bdc5-0366-28d77d987609.png)

### Padding を大きくする
テクスチャが肥大化してしまいます。

### 🌟 Padding を大きくした Dynamic Font を Addressables で利用

**変化の少ない文字を長時間表示する際に適しています。**
短時間の利用ではメモリ確保とフォントの書き出しによるスパイクが割に合わなそうです。
特定の文字を長時間表示する際は Static Font に特定の文字だけ登録する方が良さそうです。

### 🌟 Unity 標準の Outline を再現する

Unity 標準の Outline に習い複数の TMP_Text を前後上下にずらして背後に配置する手法です。
**文字を短時間表示する用途に適しています。**
常にオーバードローしているので、重い処理中や長時間の利用には向きません。
[複数の TMPro が Mesh を生成するのは無駄なので、解決するコンポーネントを作りました。](#unity-標準の-outline-を再現するコンポーネント)

### Shader を使う

下記のシェーダでもアウトラインを太くできますが TMPro 以上に太くすると縁で途切れます。
良いシェーダがあったらコメントで教えてください。

https://forum.unity.com/threads/plans-for-hdrp-compatibility-for-tmp.660598/page-2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/d19e131c-d4bf-586b-96b1-d3f686987a92.png)

# Unity 標準の Outline を再現するコンポーネント

[Unity 標準の Outline を再現する方法](#-unity-標準の-outline-を再現する)では、ずらす数だけ無駄な Mesh 生成が行われます。
そこで、TMPro から Mesh と Material を参照して利用するコンポーネントを作りました。
ずらす方向は個別に設定できますが、簡単に設定できるプリセットも用意しています。
不具合や改善点についてコメントをいただけると助かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/c8a965da-a7b1-977a-0b60-1f519f47df4a.png)

### 留意点

```TextMeshProUGUI```のみ対応しています。
RenderMode は```ScreenSpace - Canvas```と```ScreenSpace - Camera```に対応しています。


# コード

https://github.com/yamara-mh/CodeStorage/blob/main/Codes/TMProUI_Outline.cs

# 詳細

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307985/5c5bb5d3-a89a-2785-399f-8b1caee7c351.png)

|項目|説明|
|-|-|
|Width|太さ|
|Directions|アウトラインを描画する方向|
|Directions Preset|アウトラインを描画する方向のプリセット|

## 関数

|関数名|説明|
|-|-|
|UpdateRenderer|描画を更新します<br>TMPro の描画が変更された直後に自動で呼ばれます<br>SetWidth() や SetDirections() でも呼ばれます（更新しない事もできます）|
|SetDirections|アウトラインを描画する方向を設定できます|
【Filament 2.x】テーブルビルダーで主キーのないテーブルを作る

## 概要

https://filamentphp.com/docs/2.x/forms/getting-started#preparing-your-livewire-component

Resourceクラスから生成されるテーブルではなく、テーブルビルダーを使ってテーブルを生成した際
groupByで集計テーブルを作った時に主キーが無いのでエラーが出る。
> 例えば、勤怠テーブルを集計して誰が指定月に何回出勤した　などの表を作りたい際

```
getTableRecordKey(): Return value must be of type string, null returned
```

オーバーライドして空文字を返す。

```php
class MonthlyWorkDailyReportTable extends Component implements Tables\Contracts\HasTable
{
    use Tables\Concerns\InteractsWithTable;
...

    public function getTableRecordKey(Model $record): string
    {
        return '';
    }
}
```
コマンドキー

使用するシェルやオペレーティングシステムによって異なる場合がある

- Ctrl + C: 実行中のプロセスを強制終了
- Ctrl + Z: 実行中のプロセスをバックグラウンドに移動
- Ctrl + D: 現在のシェルを終了
- Ctrl + A: コマンドラインの先頭に移動
- Ctrl + E: コマンドラインの末尾に移動
- Ctrl + K: カーソル位置から行の末尾までを切り取り
- Ctrl + U: カーソル位置から行の先頭までを切り取り
- Ctrl + L: ターミナルやコンソールをクリア
- Tabキー: ファイルやディレクトリ名の補完やコマンドの一覧表示
- 上矢印キー: コマンド履歴を上方向に遡る
- 下矢印キー: コマンド履歴を下方向に遡る

＊すべてのシェルや環境で動作するわけではない
特定のシェルや環境では、キーバインディングがカスタマイズされている場合もある
GUIベースのターミナルエミュレータを使用している場合は、一部のキーバインディングが異なる場合もある
スマホからRaspberryPi上で動いているサービスを止める

### 本記事の前提条件
・RaspberryPiとスマホは同じネットワーク内であること
※外出先から操作する場合は別途設定が必要

### 想定している使われ方
・モーターを開始、停止
・スイッチのOn/Off
・RaspberryPiの再起動

### スマホにterminusを入れる
１．Playストアからterminusを検索し、インストールする
２．＋ボタンでNew Hostをタップ
３．以下の項目を埋める
　　・Alias：エリアス名
　　・HostName：ホスト名（IPアドレス）
　　・SSH：チェックを入れる
　　・Port：22を入れる
　　・Username：ラズベリーパイのユーザ名
　　・Password：ラズベリーパイのパスワード
4.Hostエリアスをタップする

### ラズベリーパイにログイン成功すると以下の画面が表示される
そこでいろんなコマンドを入力して、RaspberryPiの遠隔操作ができるようになる。

![Screenshot_20230516-104346.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576081/66dcce3e-80bc-3d3f-1197-78f002de1023.png)

例えば、pinoutを打ち込むと
![Screenshot_20230516-105457.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576081/fbff1269-a836-ece0-adfd-6707dd5a6d14.png)
このようにラズベリーパイのGPIOの配置を知ることができる。

これを見ながら、配線することも可能になります。
※ただし、配線する場合は必ず、ラズベリーパイの電源をOFFにしてください。

### サービスの停止と再起動の事例

![Screenshot_20230516-135525~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576081/ff8af192-7df7-afd4-3a27-7d88646db4eb.png)
Reactを使ったプロジェクト10選

Reactは柔軟性とパフォーマンスを兼ね備えた強力なJavaScriptライブラリで、幅広いアプリケーションで採用されています。以下に、Reactを活用した10の驚くべきプロジェクトを紹介します。

## 1. [Facebook](https://www.facebook.com)

Reactの生みの親であるFacebookは、自社の製品であるReactを活用し、ユーザーエクスペリエンスを向上させています。特にニュースフィードやコメントなど、リアルタイムで更新される部分にReactが使用されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/6cd902c8-6ecf-33ea-6b36-31e3d133f74f.png)

## 2. [Instagram](https://www.instagram.com)

InstagramはReactで全面的にリニューアルされました。特にフィード、ストーリーズ、通知などの動的な要素が、Reactの効率的なDOM操作によりスムーズに動作します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/95edc56c-92d3-2419-7b42-ad43f80d4b86.png)

## 3. [WhatsApp](https://web.whatsapp.com/)

WhatsApp WebはReactを使用しており、大量のリアルタイムメッセージを効率的に処理しています。特にチャットのリストやメッセージ送信フォームなど、ユーザーインタラクションが頻繁に起こる部分でReactが活用されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/83b56c25-63e7-6cfc-b2df-7f66e94c35be.png)


## 4. [Airbnb](https://www.airbnb.com)

Airbnbでは、物件の一覧表示や詳細ページ、予約フォームなどでReactが使用されています。これにより、ユーザーが効率的に物件を探し、予約できるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/448a6f52-a23a-8cd3-21ab-3b29ef2e81fc.png)

## 5. [Netflix](https://www.netflix.com)

Netflixでは、映画やテレビ番組の一覧表示や詳細ページでReactが使用されています。これにより、ユーザーが効率的にコンテンツを探し、視聴できるようになっています。

## 6. [Codecademy](https://www.codecademy.com)

Codecademyはプログラミングを学ぶためのオンラインプラットフォームで、そのインタラクティブな学習環境がReactで構築されています。特にエクササイズやクイズ、実際のコーディング環境などでReactが活用されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/8700272e-1347-f98e-ae92-3057e213d7fd.png)


## 7. [Dropbox](https://www.dropbox.com)

Dropboxはファイル共有サービスで、そのウェブアプリケーションでReactが使用されています。特にファイルやフォルダの一覧表示、プレビュー、共有設定などのUIがReactで実装されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/247d561a-55d4-01f0-68a7-e38e82d15cf3.png)

## 8. [Atlassian](https://www.atlassian.com)

Atlassian製品（Jira, Confluenceなど）のフロントエンドは大部分がReactで書かれています。タスク管理、ドキュメンテーション、チームコラボレーションといった複雑なワークフローを効率的にサポートしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/2ef5f481-0c7c-cf7e-30ab-af87cf7f5086.png)


## 9. [BBC](https://www.bbc.com)

BBCの新しいモバイル対応ウェブサイトは、Reactを使用してパフォーマンスを最大化しています。ニュース記事の表示、ユーザーのコメント、各種メディアコンテンツのプレイバックなどがReactによって高速化されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/415c0d3a-f8b8-43d9-36f4-7ecbe1e6d7e9.png)


## 10. [Uber](https://www.uber.com)

UberのウェブインターフェースはReactを使用しており、乗車リクエストやトラッキング、料金計算などのリアルタイムな更新をスムーズに行っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/76f5857b-7c19-de11-67f9-3008b5f8f2d6.png)
【Filament 2.x】レコード作成機能の「保存して、続けて作成」ボタンを消す

## 概要

レコード作成ページには
- 作成
- 保存して、続けて作成
- キャンセル

のボタンが自動生成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/4b93413e-13db-9e4e-113c-bbd617abccfc.png)


Createクラス内で`$canCreateAnother`プロパティを追加して「保存して、続けて作成」ボタンを消す

```php
class CreateStore extends CreateRecord
{
    protected static string $resource = StoreResource::class;
    //↓追加
    protected static bool $canCreateAnother = false;
}
```

![スクリーンショット 2023-05-16 10.55.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282328/d64bf2cf-11ef-3baa-8c5b-ccb049cd428c.png)

はい消えた。
【Filament 2.x】Resourceクラスで作成機能だけ無効化する

## 概要

以下のようにリソースクラスを作成すると

```terminal
$ php artisan make:filament-resource Customer -- generate
```

- 一覧
- 新規登録
- 編集

機能が自動生成される

作成機能や編集機能を無効化させたい際、[ドキュメントにはポリシー使え](https://filamentphp.com/docs/2.x/admin/resources/creating-records#authorization)と書いてあるが面倒臭い
誰であろうと無効化したい。

Resourceクラス内でcanCreateをオーバーライド

```php
class CustomerResource extends Resource
{
    public static function canCreate(): bool
    {
        return false;
    }
```

これで一覧ページの右上の作成ボタンが消え、URL直打ちしても404になる
AccessRuntimeで特定フォルダー内のファイルに限り『セキュリティに関する通知』を表示させない設定

# 概要

自作のAccessファイルをAccessRuntimeで起動すると下記が出る。

> MicrosoftAccessのセキュリティに関する通知
> セキュリティに影響を及ぼす可能性のある問題点が検出されました。
> 警告:このコンテンツの発行元がしんらいできるかどうかを確認することはできません。…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/48c6eec4-fd62-2288-bf8a-b02773ba8649.png)

この通知が毎回出ないように設定したい。
でも、全マクロを有効にするとセキュリティが下がる。
なので、 **特定フォルダー内のAccessファイル** を開く時 **だけ** この通知が出ないようにしたい。

# やり方

## 前提

AccessRuntimeはセキュリティセンターのUIが無いので、レジストリを直接編集が必要です。

## レジストリーエディター起動

『HKEY_CURRENT_USER』配下のキーの設定なので、 **AccessRuntimeを実行するユーザーで** ログインした状態でレジストリーエディターを起動します。

## キーへ移動

レジストリエディタで下記へ行きます。

```
コンピューター\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Access\Security\Trusted Locations\
```

上記のキーはそのユーザーでAccessRuntimeを使った場合に初めて作成されます。
もしこのキーが無い場合はAccessRuntimeで何かしらのシステムを起動してキーを作っておく必要があります。

:::note warn
レジストリーのキーのパスはAccessRuntime 2016の場合となります。
:::

## キーを作成

```Trustted Locations``` 配下に『Location数字』でキーを作成。
数字は既存と被らない10や11などの任意の値。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/044a47e6-9c96-6c04-bba8-3ac2fdb06191.png)


新規 ⇒ 文字列 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/1b34eea9-ffd6-7574-9618-ec249487d36d.png)
名前は『Path』で値を許可したいフォルダーパスに。
（末尾の\は不要）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/443fc015-429e-c70e-4cac-747cf1652ffd.png)

新規 ⇒ DWORD値 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c67e17c6-7f50-0071-4281-8a74c7d18673.png)
名前は『AllowSubfolders』で値は『1』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/abb6eb26-f9bb-4207-2f58-ca78fc81ebea.png)

下記は『Location11』というキーを作って設定が終了した状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8d2611e3-c335-cd26-d13c-fac706fa1256.png)

# 参考サイトさん

https://nyanblog2222.com/programming/cmd/3384/

# バージョン

Windows 10 IoT Enterprise 22H2 19045.2965
AccessRuntime 16.0.4288.1001
DXRuby ゲーム制作リファレンス

## Windowのサイズについて
```rb
Window.width = 360
Window.height =  480
```

# 画像関係
## 画像データの読み込みの方法
#### 一つのファイルに一つの画像しか無いときに使う
```ruby:
image = Image.load("filepath")
```

#### 一つのファイルに全てのサイズが同じである複数の画像がある場合に使う
```rb
image_array = Image.load_tiles("filepath", xcount, ycount)
```

### 画像を読み込み、表示する方法

```rb
# coding: utf-8
require 'dxruby'
x = 0
y = 0

image = Image.load_tiles("./character.png", 4, 4)

sample_sprite = Sprite.new(x, y, image[0])

Window.loop do
  Sprite.draw(sample_sprite)
end
```

## 画像データの画面内移動のしかた
```rb
Window.loop do
  sample_sprite.x += 1
  sample_sprite.y += 1
  Sprite.draw(sample_sprite)
end
```
 ***


# 操作関係
## キャラクタの操作の実装方法
```rb
Window.loop do
  if Input.keyDown?(K_L)
    sample_sprite.x += 1
  end
  Sprite.draw(sample_sprite)
end
```

| メソッド | 意味 |
|:-:|:-:|
|  keyDown?  | キーボードのキーが押されている間、実行される  |
|  keyPush?  |  キーボードのキーが押された瞬間のみ、実行される |


■ 右に進む場合 sample_sprite.x += 1

■ 左に進む場合 sample_sprite.x -= 1

■ 上に進む場合 sample_sprite.y -= 1

■ 下に進む場合 sample_sprite.y += 1


使いたいキーのコードを調べたい場合、 [DXRuby キーコードリファレンス](http://mirichi.github.io/dxruby-doc/api/constant_keycode.html) を参照して下さい。

##  マウスカーソルの入力
```rb
require 'dxruby'

chara_img = Image.load('./character.png')  
chara = Sprite.new(100, 100, chara_img)

Window.loop do
  x = Input.mouse_x  # マウスカーソルのx座標
  y = Input.mouse_y  # マウスカーソルのy座標
  
  chara = Sprite.new(x, y, chara_img)
  Window.draw(x, y, image)  # data.pngを描画する
end
```



## 衝突判定
```rb
image = Image.load_tiles("./character.png", 4, 4)
sample_sprite = Sprite.new(200, 200, image[0])

image_box = Image.load_tiles("./image/colorbox.png", 6, 1)
box = Sprite.new(400, 200, image_box[0])

Window.loop do
  if Input.keyDown?(K_L)
    sample_sprite.x += 1
  
    if sample_sprite === box
      sample_sprite.x -= 1
    end
  end

  Sprite.draw(sample_sprite)
  Sprite.draw(box)
end
```

## ブロックの出現場所を制御する
randメソッドを使って、ブロックが出現する時のx座標の位置をランダムにする
```rb
item = nil

Window.loop do
  if item.nil? = true
      x = rand(340)
      item = Sprite.new(x, y, image_box[0])
  end

  Sprite.draw(item)
end
```

## 文字の描画
```rb
# coding: utf-8
require 'dxruby'

font = Font.new([３２])

Window.loop do
  Window.draw_font(100, 100, "ふぉんと", font)
end
```
文字列に"\n"をいれると改行することができる。


### 数値を文字列に変換して表示させたい場合
#{変数名.to_s}で文字列に変換する
```rb
# coding: utf-8
require 'dxruby'
score = 50
font = Font.new([３２])

Window.loop do
  Window.draw_font(100, 100, "score: #{score.to_s}", font)
end
```
Neovim Can't open file /share/nvim/syntax/syntax.vim

# 概要
NeovimをTarballでインストールした後、nvimのバイナリファイルをを/usr/local/bin/にコピーしてして使っていたらエラーが発生した。

# 解決策
ばいなりでインストールした場合は、そのディレクトリから移動させるとエラーが発生する。
なので、バイナリは移動させず、PATHをはってnvimを呼び出せるようにする。
~/.zshrcに以下を追記。
```~/.zshrc
export PATH=$PATH:~/nvim-linux64/bin
```

# 参考リンク
https://www.reddit.com/r/neovim/comments/spnc91/neovim_error_e484_cant_open_file/
Jestの実行が止まらない問題

微妙に詰まったので備忘録的に

dbをテストするコードを書いてtestを実行してみると、成功はするものの実行が終わらない状態に

どうやら接続を切らないとずっと待ち受けちゃうらしい

```typescript
describe('データベースをテストするサンプルコード', () => {

    let transaction;

    beforeEach(async () => {
        transaction = await sequelize.transaction()
    });

    afterEach(async () => {
        await transaction.rollback()

        //　ここが必要
        await sequelize.close()
    });
});
```

これ以外にも、lisnarを起動する系のものは同じことが発生するらしい

jestの問題なのかdbの問題なのか非同期処理の問題なのか切り分けができなくて詰まってた
Kintone Portal Designer を VScodeで実現する

Chromeのプラグインとして提供されているKintone Portal DesignerをWebpackでバンドルする環境を作成しました。

デモではバンドルするとタブを表示するカスタマイズJSが作成できます。
https://github.com/blue-willow/Portal_Customize

環境構築
> npm install

> yarn install

ビルドコマンド
> npm run build:dev

> yarn build:dev

kintone ポータル開発にお役立てください。
SSL証明書更新作業の手順書(更新中)

# CSR生成手順
<pre>
[作成するファイル名]
【ア】擬似乱数ファイル　　　　　　　　：rand.dat
【イ】秘密鍵ファイル名　　　　　　　　：{{domain}}.key.pem
【ウ】秘密鍵ファイル名パスフレーズ埋込：{{domain}}.key.pem.signed
【エ】CSRファイル名　　　　　　　　　 ：{{domain}}.csr
</pre>

## 1.opensslコマンドで擬似乱数ファイル【ア】を作成する。
<pre>
openssl md5 {適当に既存のテキストファイルを指定} > rand.dat
</pre>
## 2.擬似乱数ファイルを使って秘密鍵【イ】を作成する。
<pre>
openssl genrsa -rand rand.dat -des3 2048 > {{domain}}.key.pem
※「Enter pass phrase:」を求められたらPWを入力します。適当で入力する。
</pre>
## 3.秘密鍵にパスフレーズを埋め込む。【ウ】
<pre>
openssl rsa -in {{domain}}.key.pem > {{domain}}.key.pem.signed
※「Enter pass phrase for {{domain}}.key.pem:」と表示されたら、2番で入力したPWを入力する。
</pre>
## 4.作成した秘密鍵ファイルパスフレーズ埋め込み【ウ】からCSR【エ】を生成する。
<pre>
openssl req -new -key {{domain}}.key.pem.signed -out {{domain}}.csr
</pre>
## 5.企業情報入力
<pre>
[CSR情報]には以下「:」右の情報を実際の情報入力します。
 Country Name (2 letter code) [XX]:
 State or Province Name (full name) []:
 Locality Name (eg, city) [Default City]:
 Organization Name (eg, company) [Default Company Ltd]:
 Organizational Unit Name (eg, section) []:
 Common Name (eg, your name or your server's hostname) []:
以降は何も入力せずに EnterでOKです。
</pre>
## 6. csrファイルで企業が証明書発行
Platform Analyticsのデータの流れに関してまとめ（MicroStrategy）

# はじめに
株式会社ジールの@y_saharaです。

本記事ではMicroStrategyにおいて、
監査ツールであるPlatform Analyticsの
データ保管の流れについてご紹介します。

# 本記事の概要
・構築時理解しがたいと感じた箇所
・データ保存期間を指定するパラメータ
・データの流れ

# 構築時理解しがたいと感じた箇所
公式のドキュメントを読みパラメータに関して理解しがたいと感じた箇所を説明しようと思います。

1、後述する①viewCutoffRangeInDays、②currentFactDataKeepDaysと③daysToKeepとで別ファイルで日数を設定する仕様であるためその点に伴ったデータの流れの理解
履歴FACTテーブルを運用しない方法では、②より③の期間が短く設定していますが、どちらの設定が優先され反映されるのか。
→③が有効になることを確認

2、パラメータごとの設定に対応する期間の理解
後述する①viewCutoffRangeInDaysが14日間と②currentFactDataKeepDaysが180日間と設定した場合、14日間分はキューブにもFACTテーブルにもデータが存在することになるのか。または14日間分はキューブのみ、15日目からFACTテーブルに保存されることになるのか。
→前者であることを確認

# データ保存期間を指定するパラメータ
設定ファイルは2つに分かれていて下記3つのパラメータがあります。

・PAConsumerConfig.yaml
① viewCutoffRangeInDays
→キューブにデータを保存しておく期間
② currentFactDataKeepDays
→ファクトテーブルにデータを保存しておく期間

・purgeConfig.yaml
③ daysToKeep
→全体のデータ保持期間

参考
・[PAConsumerConfig.yaml ファイルを使う方法](https://www2.microstrategy.com/producthelp/2020/PlatformAnalytics/ja/Content/configure_pa_yaml_file.htm?TocPath=%E6%A7%8B%E6%88%90%20%7C%E8%A9%B3%E7%B4%B0%E6%A7%8B%E6%88%90%7C_____1)
・[Platform Analytics ウェアハウスの削除](https://www2.microstrategy.com/producthelp/2020/PlatformAnalytics/ja/Content/purge_platform_analytics_wh.htm?Highlight=purgeconfig)

# データの流れ

ここでは図を用いて説明していこうと思います。
パラメータを以下に設定した場合のデータの流れとなっております。
viewCutoffRangeInDays:14
currentFactDataKeepDays:180
daysToKeep:1095(３年間)
![2023-04-26_16h24_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3313808/db7bd313-dfd2-6781-9c57-c2384213c495.png)

上記を踏まえて履歴FACTテーブルを運用しない方法も考えられます。
viewCutoffRangeInDays:14
currentFactDataKeepDays:180
daysToKeep:30
![2023-04-26_16h28_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3313808/9bcc495f-e751-7e1f-ee79-c3af39d869a6.png)

上記のように設定するとFACTテーブルの保持期間の方が、全体保持期間より長いためFACTテーブルから履歴FACTテーブルへの流れがなくなります。
よって履歴FACTテーブルを運用しないことも選択できます。

# 終わりに
細かい部分に関してでしたが、Enterprise ManagerからPlatform Analyticsへの切り替え時など、少しでも参考になればと思います。
TypeScript + Jest「SyntaxError: Cannot use import statement outside a module」の直し方

Jestを学び始めていざテスト実行した時にエラーになってしまったので直し方を備忘録として残しておきます！

今回遭遇したエラーは以下のエラーです。


> SyntaxError: Cannot use import statement outside a module

エラーの原因は、sum.test.tsにsum.tsをimportしたことによるエラーのようです。

エラーはtestの実行時に発生しました。

scriptの実行コマンドは以下の通りです。

```json:package.json
{
"scripts": {
    "test": "jest"
  }
}
```

原因は下記の記事にわかりやすく記載されてました！

https://qiita.com/masato_makino/items/269617904a7660c85edd


```typescript:sum.ts
export const sum = (a: number, b: number) -> a + b;
```

```typescript:sum.test.ts
import { sum } from './sum';

test('1 + 2 equals 3', () => {
  expect(sum(1, 2)).toBe(3)
});
```

エラーは、`import { sum } from './sum';`の箇所で起こってました。

`jest.config.js`を作って下記の記述記載することでエラーを解消することができました！

```typescript:jest.config.js
module.exports = {
  preset: 'ts-jest',
  transformIgnorePatterns: ['/node_modules'],
};
```

テストを実行すると下記のようになり無事テストがpassedになりました。

```
> jest@1.0.0 test
> jest

 PASS  src/scripts/tests/sum.test.ts
  ✓ 1 + 2 equals 3 (2 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        2.293 s
Ran all test suites.
```

引き続きテストをかけるように精進します！
はじめての「Genesis64」

# SCADA
いままで扱ったSCADAは
・Intaract
・看太郎
・Fix
・Intouch
・JoyWatcher
そして････　はじめての「Genesis64」となります
それよりも「Qiita」への投稿もはじめて！
同時進行で覚書として投稿していきたいと思います

# インストール
・IIS
・SQL-Server　
　の順にインストールし、「Genesis64」のインストールとなります

手順は、「ICONICS Product Suite スタートガイド」の通りに進めば特に問題なくインストールできました。

# GenDemo
デモ画面がインストールされますので動作確認を行います
![GenDemo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361877/0309d49b-2499-058e-4ff3-a2d015f260c2.png)

# おわりに
これから使っていきます！
ただ、マニュアルが･･･　詳しいのは英文のようです
データサイエンスのための微分積分 第4回 数列極限の性質

:::note info
本記事は数学講座[2.3数列極限の性質](https://www.matongxue.com/lessons/553/parts/783)を勉強して投稿したメモです。詳細は元の素晴らしい講座のページをチェックしてください。
:::

# 数列の極限の一意性 (Uniqueness of the limit of a sequence)

定理（数列の極限の一意性）: もし数列${a_n}$が収束するならば、**その極限は一意**です。
参照：[数列極限の厳密な定義](https://qiita.com/Junlee/items/d39b5962aa66c8e5f419#%E6%95%B0%E5%88%97%E6%A5%B5%E9%99%90%E3%81%AE%E5%8E%B3%E5%AF%86%E3%81%AA%E5%AE%9A%E7%BE%A9)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/38907359-aa01-3d15-5cea-9135a4ed730e.png)
以下は**その極限は一意**の証明です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/e98c84fd-74c8-b81d-7677-64c936fcb4a3.png)

# 有界数列 (Bounded sequence)

数列 {$a_n$} の定義について:
- $\forall n\in\mathbb{Z}^+，a_{n}\le A$ である場合、この数列は **上界** を持つと言い、$A$を数列の **上界** と呼びます。
- $\forall n\in\mathbb{Z}^+，a_{n}\ge B$ である場合、この数列は **下界** を持つと言い、$B$を数列の **下界** と呼びます。
- $\forall n\in\mathbb{Z}^+，|a_{n}|\le M$ である場合、この数列は **有界** であると言い、$M$を数列の **界** と呼びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/071027c9-a0f4-45a9-a5a8-49264d1348dd.png)

# 収束数列の有界性 (Boundedness of a convergent sequence)

数列 {$a_n$} が**収束**する場合、必ず数列 {$a_n$} は**有界**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/76943052-395b-13a9-8f2f-d7d036f80ea4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/0884c9f6-8baa-b7aa-af64-3872097a1378.png)

- 収束　$→$　　有界
- 発散　$→$　　無界
- 有界　$→$　　収束、発散
- 無界　$→$　　発散

# 収束数列の保符号性 (Preservation of signs in a convergent sequence)

もし $\displaystyle\lim_{n\to\infty}a_n=L $であり、$L > 0（または L < 0）$であるならば、$\exists N\in\mathbb{Z}^+ $であって、$\forall n > N$ に対して $a_n > 0（または a_n < 0）$となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/f6dc956a-0341-2708-b7a6-459eca728d50.png)

# 部分数列 (Subsequence)

数列 {$a_n$} の定義について:
数列 {$a_n$} から任意の数を取り出し、**その順序を保ちながら**、且つ**無限**、そうして得られる数列を、元の数列 {$a_n$} の 子数列 と呼びます。

例えば、数列 $\displaystyle{\frac{1}{n}} $から任意の数を選び、順序を保ちながら無限に取り出すと、下記の図に示されるような数列の部分数列が得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/a7149fd1-895d-4d43-1c04-ed93a883e1bc.png)


# 収束数列の部分数列 (Subsequence of a convergent sequence)

定理（収束数列の部分数列も収束する）
数列 {$a_n$} が$L$に収束する場合、その任意の部分数列も収束し、その極限値も$L$となります。
以下のように、元の数列及び部分数列の極限値が0です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/693bd052-330d-1498-fe15-40df34ed288a.png)

# 参照

https://wiis.info/math/real-number/convergent-sequence/convergence-and-boundedness/
相次ぐAI画像禁止、続々消えるAI絵師のマネタイズ手段。その受け皿をリサーチ

## AI生成作品の(マネタイズ手段の)取り扱いを一時的に禁止するサービス

* ピクシブ「pixivFANBOX」「pixivリクエスト」
* 虎の穴「Fantia」⇒ ["偽りのAI活用"を乗り越えろ。FantiaがAI主体作品を全面禁止へ【AIイラスト問題】 - YouTube](https://www.youtube.com/watch?v=bj6DL7MGHwI)
* 株式会社エイシスが運営する「DLSite」
* 「Ci-en」
* Patreon(?)

https://twitter.com/PleaseBanKai/status/1656531555316277249

## AI生成作品のマネタイズ手段を提供する(予定も含む)サービス

* Patreon(AI禁止になるかどうか今のところ未定? 利用者多数存在)
* [セルフ出版 | Amazon Kindle ダイレクト・パブリッシング](https://kdp.amazon.co.jp/ja_JP) ⇒ [【誰でもすぐにできる】AI美女を作って写真集を出版する方法](https://www.youtube.com/watch?v=esbJXsaLfw8)
    * https://bit.ly/3IrlJNi Amazon Kindle Unlimited って、1ページ読まれるごとに0.5円もらえるんだって！そこだけ参考になったｗ
* [AI生成のジャンル作品一覧 - FANZA同人](https://www.dmm.co.jp/dc/doujin/-/list/=/article=keyword/id=160132/section=mens/) ⇒ [FANZA通販で作品を販売してくれるサークルさん大募集！](https://sp.dmm.co.jp/mono/feature/doujin-recruit/)
* AI生成作品専門の投稿サイト「chichi-pui」(2023/05/16現在予定・開発中)
* [Fantasfic](https://fantasfic.fun/)
* [AVerse](https://averse.jp/about) ⇒ [AVerse | 検索](https://averse.jp/search)
* petapi（ペタピ）⇒ [日本初！LoRAモデル作成者・プロンプト作成者にも収益還元される、AIイラスト投稿サービス『petapi（ペタピ）』をリリース｜株式会社シアンのプレスリリース](https://prtimes.jp/main/html/rd/p/000000056.000057964.html)

> これまでは、LoRAモデルや新たなプロンプトを作成し公開しても、それを用いてマネタイズに繋げることが難しい現状がありました。
> そこで、petapiでは、LoRAモデルの販売、LoRAモデルを使用した2次創作で上がった売上の一部をモデル作成者に還元する仕組みを作ることで、LoRAモデルでのマネタイズを支援する仕組みを作ります。
> さらに、プロンプトも売買することができる仕組みを作ることで、今までただ公開していたプロンプトもマネタイズに使用できるようにする仕組みを作ります。


https://twitter.com/sazyou_roukaku/status/1656881670094741504

https://twitter.com/pink_engineer_/status/1656534003204378626
PythonとBioPythonを使ったFASTA形式ファイルの読み込み方法

# はじめに
生物情報学では、DNAやタンパク質の配列データを扱う際に、テキストベースの形式であるFASTA形式が一般的に使用されます。今回は、このFASTA形式について解説し、PythonとBioPythonを使ったFASTAファイルの読み込み方法を紹介します。

# FASTA形式とは？
FASTA形式は、シーケンスデータ（DNA、RNA、タンパク質など）を表現するためのシンプルなテキスト形式です。基本的な構造は以下の通りです：

ヘッダーライン: 先頭が '>' 記号で始まり、その後に配列の識別子とオプションで記述が続きます。例えば、">sequence1 description here"
シーケンスライン: ヘッダーの次の行から配列が記述されます。一般に、一行には80文字まで含めますが、これは必須ではありません。
例:
```
>sequence1
ATGGCCATGGCGCCCCAGCACTAAGAAAGAGGAGAATGAGCTGATGTTAGAAGGACAAGG
>sequence2
ATGGCCATGTCGCCCCAGCATTAAGAAAAGGAGAATGAGCTGATGTTAGAAGGACAAGG
```
この例では2つの配列があり、それぞれの配列はヘッダーラインで始まり、次にその配列が続きます。

# PythonとBioPythonを使ったFASTAファイルの読み込み方法

PythonでFASTAファイルを読み込むための方法はいくつかありますが、その中でもBioPythonというライブラリを使用する方法が一般的です。BioPythonにはBio.SeqIOというモジュールがあり、これを使用するとFASTA形式のファイルを簡単に読み込むことができます。

以下にBioPythonを使用してFASTAファイルを読み取る基本的なコードを示します:
```
from Bio import SeqIO

def read_fasta_file(filename):
    sequences = []

    for record in SeqIO.parse(filename, "fasta"):
        sequences.append(record)

    return sequences

filename = "path_to_your_file.fasta"
sequences = read_fasta_file(filename)

for seq in sequences:
    print("ID:", seq.id)
    print("Sequence:", seq.seq)
    print("Description:", seq.description)

```
このコードでは、BioPythonのSeqIO.parse関数を使用してファイルを読み取ります。この関数は、ファイル名とファイル形式（この場合は"fasta"）を引数に取ります。

SeqIO.parse関数はジェネレータを返し、各要素はSeqRecordオブジェクトです。SeqRecordオブジェクトには、識別子(id), シーケンス(seq), 記述(description)などの情報が含まれます。

全ての配列データを一度にメモリにロードすると問題になる場合（たとえば、非常に大きなファイルを扱う場合など）は、ジェネレータを直接処理すると効率的です。
```
from Bio import SeqIO

def process_sequences(filename):
    for record in SeqIO.parse(filename, "fasta"):
        print("ID:", record.id)
        print("Sequence:", seq.seq)
        print("Description:", seq.description)

filename = "path_to_your_file.fasta"
process_sequences(filename)
```
このコードでは、各シーケンスが読み込まれるたびにそれを処理します。これにより、全てのシーケンスを一度にメモリにロードする必要がなくなり、大きなファイルを効率的に扱うことができます。

# まとめ
BioPythonを使うと、PythonでFASTA形式のファイルを簡単に読み取ることができます。生物情報学におけるデータ解析や研究に、ぜひ活用してみてください。
ADOQuery 集計Query

### ADOQueryで、集計Queryを使用するときの注意

LockTypeをltReadOnlyとする必要がある。
デフォルトは、ltOptimisticとなっている。

デフォルトのままだと、
ORA-00937: not a single-group group function.
のエラーが出るので注意。

### おわりに

これまで別のところに書いていたブログを、Qiitaに書き直した記事です。
support caseで組織を選べない


+ [can't see my org in org picker](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8z28SAB)

:::note
**Production** : If the issue you're facing is in the Production, then you could log a case here : https://help.salesforce.com/orgpicker

**Developer sandbox** : Developers can get support by logging a case in the Production org and providing the ID of the sandbox.

**Free Dev org** : I don't think Salesforce provides support for free Dev orgs.Free Developer orgs do not show up under Select your org. Here is an open idea for enabling logging a case for Free Dev orgs

https://success.salesforce.com/ideaView?id=0873A000000lGplQAE&sfdcIFrameOrigin=null
:::

+ [Can't find Einstein Prediction Builder tile.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PemudSAB)

I opened that page and selected the most obvious options, however the "Log a 
Ticket" button stays grayed out.  Am I missing something?


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/748884d7-8529-2258-ceba-74ce70530a18.png)


+ [Unable to see my salesforce support open cases](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UrwAl)


+ [【未解決】Admin - Can't log in and can't send a support case](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X7RGg)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ad128303-6a5d-9a92-e19a-ef19bc8afa45.png)
blocklyでverilog その3

# 概要
blocklyでverilog、やってみた。
練習問題、やってみた。

# 練習問題
半加算器を書いて、iverilogで検証せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/39449825-e155-1143-bc60-339c6d44b06a.png)


# 生成したコード

```
module x (input a, input b, output c, output d);
assign c = (a ^ b);
assign d = (a & b);
endmodule

```

# テストベンチを書く。

```
module test;
	reg a,
		b;
	x u(.a(a), .b(b), .c(c), .d(d));
	initial
	begin
		$display(" a b c d");
		$monitor(" %b %b %b %d", a, b, c, d);
			a = 0;
			b = 0;
		#10;
			a = 0;
			b = 1;
		#10;
			a = 1;
			b = 0;
		#10;
			a = 1;
			b = 1;
		#10;
		$finish;
	end
endmodule
```

# iverilogでコンパイル実行

```
>iverilog block1.v

>vvp a.out
 a b c d
 0 0 0 0
 0 1 1 0
 1 0 1 0
 1 1 0 1
block1.v:27: $finish called at 40 (1s)

```

# 生成したフローのxml

```
<xml xmlns="http://www.w3.org/1999/xhtml">
  <variables>
    <variable type="" id="kVo~|WbMj?w*jRaeu?IZ">c</variable>
    <variable type="" id="=/oZ/]#8U{fqxA)!ixB$">d</variable>
    <variable type="" id="US6mg:+!q~Nw!qA4u~S)">a</variable>
    <variable type="" id="]wH}w0D?XRXn4i7NX^Wq">b</variable>
  </variables>
  <block type="module_dec" id="4SExhY1)y(jwDTBa0Nj+" x="32" y="21">
    <field name="modName">x</field>
    <field name="varNames">input a, input b, output c, output d</field>
    <next>
      <block type="assign_block" id="PVW_J{B2Etv`jhQBz+6a">
        <field name="var" id="kVo~|WbMj?w*jRaeu?IZ" variabletype="">c</field>
        <value name="NAME">
          <block type="logic_operation" id="bzrS@SuPHa6[u4Z8qCcx">
            <field name="OP">XOR</field>
            <value name="A">
              <block type="variables_get" id="B8;pCVg~4X3%ha/=,V-|">
                <field name="VAR" id="US6mg:+!q~Nw!qA4u~S)" variabletype="">a</field>
              </block>
            </value>
            <value name="B">
              <block type="variables_get" id="xEyk9Z[cB:g~HbM=ZMPm">
                <field name="VAR" id="]wH}w0D?XRXn4i7NX^Wq" variabletype="">b</field>
              </block>
            </value>
          </block>
        </value>
        <next>
          <block type="assign_block" id=";nO;o[],=M)~nH0n0;8C">
            <field name="var" id="=/oZ/]#8U{fqxA)!ixB$" variabletype="">d</field>
            <value name="NAME">
              <block type="logic_operation" id=".c)8pX*$AcfRpLMGhF38">
                <field name="OP">AND</field>
                <value name="A">
                  <block type="variables_get" id="T~_-pvJ5BT)Iz}X_m:pj">
                    <field name="VAR" id="US6mg:+!q~Nw!qA4u~S)" variabletype="">a</field>
                  </block>
                </value>
                <value name="B">
                  <block type="variables_get" id="+{yuU=6cL1oDiC(;*c.2">
                    <field name="VAR" id="]wH}w0D?XRXn4i7NX^Wq" variabletype="">b</field>
                  </block>
                </value>
              </block>
            </value>
            <next>
              <block type="end_module" id="ODsu=)XrOwDd2b~P;iY-"></block>
            </next>
          </block>
        </next>
      </block>
    </next>
  </block>
</xml>
```


以上。
Android Network接続確認を監視するコードをサクッと書いてみる

# AndroidでNetworkへの接続を確認する
自分で作ったことなかったので、サクッとやったメモ
https://github.com/kkhouse/Playground/tree/main/AndroidProject/Network/connecticitySample


```kotlin
sealed class NetworkStatus {
    object Unknown: NetworkStatus()
    object Connected: NetworkStatus()
    object Disconnected: NetworkStatus()
}

class NetworkConnectivityServiceImpl(
    context: Context,
    request: NetworkRequest = NetworkRequest.Builder()
        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
        .build(),
): NetworkConnectivityService  {
    private val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    override val networkStatus: Flow<NetworkStatus> = callbackFlow {
        val connectivityCallback = object : ConnectivityManager.NetworkCallback() {
            override fun onAvailable(network: Network) {
                trySend(NetworkStatus.Connected)
            }

            override fun onUnavailable() {
                trySend(NetworkStatus.Disconnected)
            }

            override fun onLost(network: Network) {
                trySend(NetworkStatus.Disconnected)
            }
        }
        connectivityManager.registerNetworkCallback(request, connectivityCallback)
        awaitClose {
            connectivityManager.unregisterNetworkCallback(connectivityCallback)
        }
    }
        .distinctUntilChanged()
        .flowOn(Dispatchers.IO)

}
```

- ConnectivityManagerがCallbackだったので、callbackFlowでラップする。

- `Channel`にて`trySend`することで値の変更を送信する。


```kotlin
val networkStatus = NetworkConnectivityServiceImpl(context).networkStatus.stateIn(
        initialValue = NetworkStatus.Unknown,
        scope = viewModelScope,
        started = WhileSubscribed(5000)
    )
```

`ViewModel`等で監視すればComposable側で使える。(上はベタガキですが、ContextはDIした方が良いです。）


![Screenshot 2023-05-16 at 6.40.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700755/11263b02-2545-4550-e690-47c347a1d435.png)

機内モードにするとDisconnectedなので多分動いている。
blocklyでverilog その2

# 概要
blocklyでverilog、やってみた。
練習問題、やってみた。

# 練習問題
andを書いて、iverilogで検証せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2955bf17-fef9-4bae-0192-8069951f3aa1.png)

# 生成したコード

```
module x (input a, input b, output c);
assign c = (a & b);
endmodule

```

# テストベンチを書く。

```
module test;
	reg a,
		b;
	x u(.a(a), .b(b), .c(c));
	initial
	begin
		$display(" a b c");
		$monitor(" %b %b %b", a, b, c);
			a = 0;
			b = 0;
		#10;
			a = 0;
			b = 1;
		#10;
			a = 1;
			b = 0;
		#10;
			a = 1;
			b = 1;
		#10;
		$finish;
	end
endmodule
```

# iverilogでコンパイル実行

```
>iverilog block0.v

>vvp a.out
 a b c
 0 0 0
 0 1 0
 1 0 0
 1 1 1
block0.v:25: $finish called at 40 (1s)


```

# 生成したフローのxml

```
<xml xmlns="http://www.w3.org/1999/xhtml">
  <variables>
    <variable type="" id="kVo~|WbMj?w*jRaeu?IZ">c</variable>
    <variable type="" id="US6mg:+!q~Nw!qA4u~S)">a</variable>
    <variable type="" id="]wH}w0D?XRXn4i7NX^Wq">b</variable>
  </variables>
  <block type="module_dec" id="4SExhY1)y(jwDTBa0Nj+" x="31" y="6">
    <field name="modName">x</field>
    <field name="varNames">input a, input b, output c</field>
    <next>
      <block type="assign_block" id="PVW_J{B2Etv`jhQBz+6a">
        <field name="var" id="kVo~|WbMj?w*jRaeu?IZ" variabletype="">c</field>
        <value name="NAME">
          <block type="logic_operation" id="bzrS@SuPHa6[u4Z8qCcx">
            <field name="OP">AND</field>
            <value name="A">
              <block type="variables_get" id="B8;pCVg~4X3%ha/=,V-|">
                <field name="VAR" id="US6mg:+!q~Nw!qA4u~S)" variabletype="">a</field>
              </block>
            </value>
            <value name="B">
              <block type="variables_get" id="xEyk9Z[cB:g~HbM=ZMPm">
                <field name="VAR" id="]wH}w0D?XRXn4i7NX^Wq" variabletype="">b</field>
              </block>
            </value>
          </block>
        </value>
        <next>
          <block type="end_module" id="ODsu=)XrOwDd2b~P;iY-"></block>
        </next>
      </block>
    </next>
  </block>
</xml>

```


以上。
スッキリわかるSQL入門 第7章~第8章 学習備忘録

## はじめに

以下はスッキリわかるSQL入門第7章から第8章までの学習備忘録です。

引用されている個所は書籍の内容をそのまま書き、引用されていない箇所は私が調べて補足した内容を書いてあります。`SQL`のタグが付いているコードブロックに関しては、書籍の引用と私が調べて補足したものを織り交ぜた内容になっています。

また私が曖昧な理解や、知識として定着していない個所を記述していますので、基本的な文法や構文に関しては記述されていない可能性があることをご了承ください。

**RDMSについてはMySQLを想定しています。**

# 第7章 副問い合わせ

## 7.1 検索結果に基づいて表を操作する
<br>

**副問い合わせ(サブクエリ)**
> 他のSQL文の1部分として登場するSELECT文。丸かっこでくくって記述する。
<br>

**副問い合わせの3つのパターン**
> * 単一の値(スカラー)の代わりとして、副問い合わせの結果を用いる。
> * 複数の値(ベクター)の代わりとして、副問い合わせの結果を用いる。
> * 表の値(マトリックス)の代わりとして、副問い合わせの結果を用いる。

:::note info
**データ構造の種類**
ITの世界の中で、1つ以上のデータで形成されたものをデータ構造(data structure)と呼ぶ。
> * **スカラー**・・・単一の値
> * **ベクター**・・・1次元に並んだ値/配列
> * **マトリックス**・・・2次元に並んだ値/表

副問い合わせの3つのパターンは、検索結果がそれぞれスカラー、ベクター、マトリックスになると考えると理解しやすい
:::

## 7.2 単一の値(スカラー)の代わりに副問い合わせを用いる
<br>

**単一行副問い合わせとは**
> * 検索結果が1行1列の1つの値となる副問い合わせのことを指す。
> * SELECT文の選択列リストやFROM句、UPDATEのSET句、また1つの値との判定を行うWHERE句の条件式などに記述できる。

## 7.3 複数の値(ベクター)の代わりに副問い合わせを用いる
<br>

**複数行副問い合わせとは**
> * 検索結果がN行1列の複数の値となる副問い合わせ(ただしnは1以上)
> * 複数の値との判定を行うWHERE句の条件式(IN、ANY、ALL演算子を用いた条件式)や、SELECT文のFROM句に記述可能。

:::note alert
**複数行と比較したい時には**
複数行副問い合わせは複数の値に化けるので、単なる等号や不等号では比較できない(エラーが発生する)。等号や不等号にANYやALL演算子を組み合わせることで、複数の値と比較が可能となる。
:::
<br>

**同じ意味となる演算子**
> * **NOT IN** と **<>ALL**はすべての値と一致しないことを判定する演算子
> * **IN** と **=ANY** はいずれかの値を一致することを判定する演算子

:::note alert
**副問い合わせがNULlを含んでいた場合**
 **NOT IN** と **<>ALL**で判定する副問い合わせの結果に **NULL**が含まれると、全体の結果も **NULL**となる
:::
<br>

**副問い合わせの結果から確実にNULLを除外する方法**
> 1\. 副問い合わせの絞り込み条件に、**IS NOT NULL** 条件を含める。
> 2\. **COALESCE** 関数を使って **NULL** を別の値に置き換える。

## 7.4 表(マトリックス)の代わりに副問い合わせを用いる
<br>

**表形式の結果となる副問い合わせとは**
> * 検索結果が **n行m列** の表となる副問い合わせ(ただしn、mは1以上)
> * SELECT文のFROM句やINSERT文などに記述可能。

# 第8章 複数テーブルの結合

## 8.1 リレーショナルの意味
<br>

**リレーションシップ**
> ある2つのテーブルの行に情報としての関連があること。

**外部キー**
> 他のテーブルの関連行を指すための値を格納することでリレーションシップを結ぶ役割を担っている列のこと。

:::note info
**複数のテーブルに分けるメリット**
データを複数のテーブルに分けて格納した方が、安全、確実にデータを管理しやすい。
そして、開発者が普段利用する多くのデータベース製品は、複数のテーブルに分けて格納されたデータを関連付けて管理、利用するための様々な機能を有している。
このようなデータベースを特に、**リレーショナルデータベース**(RDB: Relational Database)と呼ぶ。
:::

## 8.2 テーブルの結合
<br>

**1\. 内部結合**
```sql: sql
/* 選択列リストには両テーブルの列を指定 */
SELECT 選択列リスト
FROM テーブルA
JOIN テーブルB
  ON 両テーブルの結合条件
```

> * **結合に関係する2つのテーブルは対等な関係ではない**
あくまでもFROM句で指定したテーブル(以後、左表)が主役であり、それにJOIN句で指定したテーブル(以後、右表)の内容を必要に応じて**結合**していく。
**結合**とは、テーブルを丸ごと繋ぐことではなく、結合条件が満たされた行を1つ1つ繋いでいくこと。<br><br>
> * **右表の結合条件列の重複**
繋ぐべき右表の行が複数ある時、DBMSは左表の行を複製して結合する。
結果表の行数は、元の左表の行数より増える。<br><br>
> * **結合相手のない結合**
右表に結合相手の行がない場合や、左表の結合条件の列がNULLの場合、結果表から消滅する。

**2\. 左外部結合**
```sql: sql
/* 選択列リストには両テーブルの列を指定 */
SELECT 選択列リスト
FROM 左表
LEFT (OUTER) JOIN 右表
  ON 両テーブルの結合条件

/* ※結合相手の行がない場合や、左表の結合条件列がNULLの場合、
選択列リストに抽出される右表の列はすべてNULLとなる。*/
```

**※右外部結合と完全外部結合は使う事例はほとんどないと言われているので割愛します。**

## 8.4 結合に関するさまざまな構文
<br>

**結合構文のバリエーション**
> * 3テーブル以上の結合も、順に1つずつ処理される。
> * 副問い合わせの結果表と結合することも可能。
> * 自分自身のテーブルと結合することが可能。
[自分用]Reactの特徴とファイルルーティングシステムについて

## Reactの特徴について
### ①宣言的なview
これまでjQuery等で行っていた直接DOMを操作するような記述は「命令的なview」という。
一方Reactは「宣言的なview」を採用しており、データさえ与えていれば勝手にviewが変わるようになっている。こちらの方がメンテナンスをしやすい！

### ②コンポーネントベース
従来であればページ単位で開発をしていたため、「ページ①」「ページ②」で同じコンポーネントがあったとしても同じ実装をしなくてはいけない。
しかしReactではコンポーネント単位で開発をしており、簡単にいうと部品を組み合わせて実装を行うため、何度も同じ実装をする必要がない。

### ③一度学習すれば、どこでも使える
Nodeを使ってSSRができたり、React Nativeを使ってモバイルアプリを作ることもできる。

### コンポーネントベースのメリット
①コンポーネントを使い回せる
②変更があった場合は、一箇所のみの修正でOK
③propsを使えば一部アレンジを加えてコンポーネントに利用ができる
④状態や再レンダリングを管理してUIを作っていける

## pages
pagesディレクトリの中にあるindex.jsがメインページ。
例えばこのディレクトリの中にabout.jsを作成したら、/aboutでabout.jsを表示することができる。

これがNext.jsの機能で自動的に反映される。
Weights & Biases (wandb)を使った機械学習のトラッキングと可視化

## はじめに
機械学習の実装は、単にモデルを訓練するだけでなく、訓練の進行を監視し、ハイパーパラメータを調整し、結果を評価する必要があります。このプロセスを効率化するためのツールの一つが、[Weights & Biases](https://wandb.ai/site/jp-home)(wandb)です。

Weights & Biasesは、機械学習の実験を追跡し、視覚化するためのツールです。この記事では、Weights & Biasesのアカウントの作成方法、Pythonでのログインと実装での使用方法、そしてその有用性について説明します。

## 1. Weights & Biasesのアカウント作成
[Weights & Biases](https://wandb.ai/site/jp-home)のアカウントを作成するには、以下の手順を行います。

[Weights & Biases](https://wandb.ai/site/jp-home)のウェブサイトにアクセスします。
「Get started for free」をクリックします。
GitHub、Google、またはAppleのアカウントでサインインするか、メールアドレスとパスワードを使用して新しいアカウントを作成します。
これで、Weights & Biasesのアカウントが作成され、使用する準備が整いました。

## 2. Pythonでのログインと実装での使用方法
PythonでWeights & Biasesを使用するには、まずライブラリをインストールする必要があります。以下のコマンドでインストールできます：

```bash
pip install wandb
```
次に、以下のコマンドを使ってwandbにログインします：
```
wandb login
```

これを実行すると、ログインページのURLとAPIキーを入力するためのプロンプトが表示されます。URLを開き、アカウントにログインした後、APIキーをコピーし、プロンプトに貼り付けてEnterを押すと、Pythonでwandbを使用できるようになります。

実装でwandbを使用するには、以下のようにコードに追加します：
```
import wandb

# Start a new run
run = wandb.init(project="my-project", config={
    "learning_rate": 0.01,
    "architecture": "ResNet",
    "dataset": "CIFAR-10"
})

# Log metrics inside your training loop
wandb.log({"loss": loss, "accuracy": accuracy})
```
上記のコードでは、wandb.init関数を使用して新しい実験を開始します。projectパラメータはプロジェクトの名前を指定し、configパラメータは実験の設定（ハイパーパラメータなど）を指定します。

wandb.log関数は、訓練ループ内で使用して、各エポックまたはバッチの結果を記録します。引数は辞書形式で、キーはメトリクスの名前、値はそのメトリクスの値とします。

最後に、訓練が終了したら、wandb.finish関数を呼び出して、実験を終了します。
```
wandb.finish()
```
これにより、ログ情報はWeights & Biasesのウェブサイトに送られ、後から確認したり、視覚化したりすることが可能になります。

## 3. Weights & Biasesの有用性
Weights & Biasesの主な特長と利点は以下の通りです：

実験の追跡： Weights & Biasesは、訓練の進行状況を追跡し、各エポックまたはバッチのロスや精度などのメトリクスを記録します。これにより、モデルの訓練がどのように進んでいるかをリアルタイムで見ることができます。

ハイパーパラメータの調整： Weights & Biasesは、ハイパーパラメータの調整を助けます。異なるハイパーパラメータを使用した実験の結果を比較し、最適なハイパーパラメータを見つけることができます。

結果の視覚化： Weights & Biasesは、訓練の結果を視覚化します。ロスと精度のグラフだけでなく、混合行列やROCカーブなどの分類タスクの結果も視覚化できます。

チームワーク： Weights & Biasesは、チームでの作業をサポートします。プロジェクトを共有し、他のメンバーと結果を共有したり、フィードバックを得たりすることができます。

以上がWeights & Biasesの基本的な使い方とその有用性についての解説です。機械学習のプロジェクトにWeights & Biasesを組み込むことで、実験の追跡と結果の視覚化が簡単になり、モデルの性能向上につながるでしょう。
JJY NTPD ST1

Arduinoで作ったSEIKOのタイムサーバクローンの[JJYS](https://github.com/yamori813/JJYS)でntpdをST1にしていて設定ファイルはこのようにしてます。

```:/etc/ntp.conf
tinker panic 0

logconfig =allall

driftfile /var/db/ntp/drift 
 
statistics loopstats peerstats clockstats
statsdir /var/db/ntp/
filegen loopstats  file loopstats  type day enable
filegen peerstats  file peerstats  type day enable
filegen clockstats file clockstats type day enable

server   127.127.40.0   mode 6
fudge    127.127.40.0   time1 0.014
```

いろいろ試行錯誤して、必要の無い設定もあります。

シリアル信号を受けるために2ポートシリアルにするため、DTSに以下を設定しています。

```
uartf {
        ralink,group = "uartf";
        ralink,function = "gpio uartf";
};
```

この設定を試してみた所uartfがcuau0になり、uart(lite)がcuau1になりました。

![FON2405_GPIO.png](https://qiita-image-store.s3.amazonaws.com/0/104066/d02079b7-e06c-df2b-2ae8-d9eca63d804d.png)

ログは以下のようになります。

```:/var/db/clockstat
60079 72886.767 127.127.40.0 === polls=1361 reach=1111111
60079 72887.001 127.127.40.0 <-- <STX>2305162051447<ETX>
60079 72887.014 127.127.40.0 <-- <STX><xE5><ETX>
60079 72887.017 127.127.40.0 === 2023/05/16 05:14:47.000 JST   ( 2023/135 20:14:47.000 UTC )
60079 72887.018 127.127.40.0 --- status 6 [*] Sys.Peer : offset -0.151 mSec. : jitter 2.073 mSec.
60079 72950.767 127.127.40.0 === polls=1362 reach=1111111
60079 72951.003 127.127.40.0 <-- <STX>2305162051551<ETX>
60079 72951.015 127.127.40.0 <-- <STX><xE5><ETX>
60079 72951.018 127.127.40.0 === 2023/05/16 05:15:51.000 JST   ( 2023/135 20:15:51.000 UTC )
60079 72951.019 127.127.40.0 --- status 6 [*] Sys.Peer : offset -1.095 mSec. : jitter 1.691 mSec.
```

JJYのドライバーは40番でモード6で動かしています。

JJYSは毎分59秒のエッジを基準にして、後はArduinoのTimerで秒を刻んでいます。水晶発信子のAdruinoのTimerはけっこう精度いいです。セラミック発信子だとおちます。

JJYSは毎秒出力してますが、ntpdはだいたい1分おきにシリアル入力を拾って、時間を合わせます。

JJYSがエラーなどで出力を停止していると、ntpdはシリアル入力を30秒くらいは待ちますが、それを越えるとエラーになります。

ntpd -xで起動してますが、安定するまでかなり時間がかかります。

![filename(7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/13ae6540-418e-d085-41bb-05f819efcddb.png)

最近何故かよくwatchdogでリブートしているのですが、リブートしないとこんな感じです。

![filename(12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/851fe5f9-76fa-3741-a15a-4195fb9ad57b.png)

![filename(11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/42797011-3d27-c7e2-3212-04a256bbf970.png)

家をあけていたのと、外部からのノイズが少ない季節で、これがおそらくベストです。

![filename(16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/717be5c6-9e52-bda8-48dc-166ab401d753.png)

![filename(15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/619a5036-0759-2169-a87f-ccc6fc01ad1c.png)

エアコンなどの季節要因のノイズもあるようです。
UEFI setting must be the same for the instance and the boot disk.

スナップショットからリストアしたディスクをComputeEngineのブートディスクとして設定しようとしたら
「UEFI setting must be the same for the instance and the boot disk.」
というエラーがでた。

コンソールから下記のようなコマンドでディスクを作成し
改めてComputeEngineのブートディスクとして設定したら正常に設定ができた。
無事ComputeEngineも起動した。
gcloud compute disks create new-boot-disk-from-snapshot
  --source-snapshot=snapshot-name
  --guest-os-features=UEFI_COMPATIBLE 
  --architecture=X86_64
  --zone=asia-northeast1-a
EfficientDet: 高効率な物体検出モデルの概要と実装

EfficientDetは、Googleの研究者たちにより開発された、高効率な物体検出モデルです。このモデルは、画像内の物体を特定し、その位置を示す矩形を生成します。EfficientDetは、パフォーマンスと効率のバランスを重視して設計されており、低リソースの環境でも高性能な結果を提供します。

## EfficientDetの特徴

EfficientDetは以下のような特徴を持っています。

1. **Compound Scaling**: EfficientDetは、解像度、深さ、幅を同時にスケーリングするCompound Scalingという新しい手法を採用しています。これにより、ネットワークのバランスを保ちながら、モデルの効率と精度を高めます。

2. **EfficientNet-backbone**: EfficientDetは、EfficientNetをバックボーンとして使用します。EfficientNetは、画像分類タスクで優れたパフォーマンスを示すモデルであり、EfficientDetにもその高性能が活かされています。

## EfficientDetの実装

PythonとTensorFlowを使用したEfficientDetの基本的な実装は以下のようになります。

```python
from keras_efficientdet import EfficientDet

# EfficientDetモデルの作成
model = EfficientDet(
    num_classes=80,  # 分類するクラス数
    input_size=512,  # 入力画像のサイズ
)

# モデルのコンパイル
model.compile()

# モデルの訓練
model.fit(x_train, y_train, epochs=10, validation_data=(x_val, y_val))
```
## EfficientDetの最適な使用ケース
EfficientDetはその名の通り、効率性に優れています。特にリソースに制限がある場合や、リアルタイムの物体検出が必要な場合に適しています。また、各種の画像分析タスク、例えば監視カメラ映像の分析や自動運転車の環境認識などにも利用できます。

また、EfficientDetは様々な解像度の画像に対応しているため、異なるサイズの画像を扱うプロジェクトにも適しています。

## まとめ
EfficientDetは、高効率で高性能な物体検出モデルであり、多くの物体検検出タスクに適しています。様々な解像度の画像に対応しており、リソースが限られた環境でも使用できるのが大きな特長です。機械学習やディープラーニングを活用して物体検出を行いたい場合、EfficientDetは優れた選択肢となるでしょう。

## 参考文献

- [EfficientDet: Scalable and Efficient Object Detection](https://arxiv.org/abs/1911.09070)
- [EfficientDet GitHub Repository](https://github.com/google/automl/tree/master/efficientdet)

以上でEfficientDetの概要と実装についての解説を終わります。次のステップとして、具体的なデータセットを使ってEfficientDetの訓練を試みると良いでしょう。
VSMAPEについての深掘り：定義、実装、および応用

時間系列予測の精度を評価する指標として、MAPE（Mean Absolute Percentage Error）が一般的に使用されますが、今回はその改善版であるVSMAPE（Volume Scaled Mean Absolute Percentage Error）について取り上げます。VSMAPEは、予測された値がゼロに近いときにMAPEが無限大になるという問題を解決します。

## VSMAPEの定義
VSMAPEは、絶対パーセンテージ誤差の平均を取る代わりに、誤差の絶対値を全体の出力ボリュームでスケールします。この指標は特に、予測すべき値がゼロに近い場合や、時系列のボリュームが大きく変化する場合に有用です。

数式で表すと、VSMAPEは次のように定義されます:

VSMAPE = Σ (|y_true - y_pred| / Σ |y_true|)

ここで、

y_trueは実際の値
y_predは予測値
Σはシリーズ全体での和を示します。
## PythonでのVSMAPE実装
PythonでのVSMAPEの実装は非常にシンプルです。NumPyライブラリを使用して、以下のように記述できます。
```
import numpy as np

def vsmape(y_true, y_pred):
    return np.sum(np.abs(y_true - y_pred)) / np.sum(np.abs(y_true))
```
ここで、y_trueとy_predはNumPy配列として入力され、VSMAPEスコアが返されます。

## VSMAPEの適用ケース
VSMAPEは、多様な時系列予測タスクで役立つ評価指標です。例えば、製品の需給予測、エネルギー消費予測、株価予測など、多くのケースで使用可能です。

特に、予測するデータにゼロや近い値が含まれている場合、またはデータのボリュームが時間とともに大きく変化する場合にVSMAPEは優れた指標となります。このようなシナリオでは、MAPEよりもVSMAPEが適切な評価指標となるでしょう。

例として、ある製品の売上予測タスクを考えてみましょう。製品の売上は通常、季節性やトレンドに影響を受け、時間とともに大きく変化します。また、新製品の場合、売上が始まったばかりで値がゼロまたはゼロに近い場合もあります。このようなケースでは、VSMAPEを使用して予測モデルの精度を評価することが適切です。

以下に、このシナリオでVSMAPEを使用して予測モデルを評価するPythonコードを示します。
```
import numpy as np
from sklearn.model_selection import TimeSeriesSplit
from sklearn.linear_model import LinearRegression

# VSMAPEの定義
def vsmape(y_true, y_pred):
    return np.sum(np.abs(y_true - y_pred)) / np.sum(np.abs(y_true))

# データ生成
np.random.seed(0)
X = np.linspace(0, 10, 100)
y = X + np.random.normal(0, 1, 100)

# 時系列クロスバリデーション
tscv = TimeSeriesSplit(n_splits=5)

for train_index, test_index in tscv.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

    # モデル学習
    model = LinearRegression()
    model.fit(X_train.reshape(-1, 1), y_train)

    # 予測と評価
    y_pred = model.predict(X_test.reshape(-1, 1))
    print('VSMAPE:', vsmape(y_test, y_pred))
```
VSMAPEは、ゼロやゼロに近い値に強く、またボリュームの大きく変化する時系列データに対しても有効な評価指標であることを理解することが重要です。これにより、予測モデルの精度をより適切に評価し、より良い予測モデルを構築することが可能になります。

## まとめ
VSMAPEは、時系列予測タスクの評価指標としてMAPEの問題を解決するものであり、予測値がゼロに近い場合やデータのボリュームが大きく変化する場合に特に有用です。Pythonでの実装も簡単で、多くのデータ分析や機械学習タスクに役立つことでしょう。
2023/5/16主にITとかセキュリティの記事

日本人標的サイバー攻撃　２グループ暗躍か(5/13)
https://www.sankei.com/article/20230513-QOVZ5SQN5BL43KRICSQ5RNG2TA/?ownedutm_source=owned%20site&ownedutm_medium=referral&ownedutm_campaign=ranking&ownedutm_content=%E6%97%A5%E6%9C%AC%E4%BA%BA%E6%A8%99%E7%9A%84%E3%82%B5%E3%82%A4%E3%83%90%E3%83%BC%E6%94%BB%E6%92%83%E3%80%80%EF%BC%92%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E6%9A%97%E8%BA%8D%E3%81%8B

福井銀行を偽るフィッシング確認、注意を(5/14)
https://news.mynavi.jp/techplus/article/20230514-2678651/

家庭用ルーターが標的に　サイバー攻撃、発信元偽る
在宅下、企業情報窃取か(5/14)
https://www.nikkei.com/article/DGKKZO70974790U3A510C2EA1000/

トヨタでさえ起きる「顧客情報漏洩事故」…“情報漏洩”や“サイバー攻撃”に備えて入るべき「保険」とその「4つの補償」(5/13)
https://gentosha-go.com/articles/-/51376

【速報】トヨタ、215万件の顧客情報が流出した可能性があると発表(5/12)
https://iphone-mania.jp/news-536850/

マイナカードで人為ミスやシステムトラブル続出(5/14)
http://economic.jp/?p=99442

クレカ不正利用増加　茨城県内相談1.3倍　ネット被害、手口巧妙化(5/14)
https://news.yahoo.co.jp/articles/996a90a42afdd1797df0a8aeb23dffe42cee5be4

陸、海、空にサイバーも　G7サミット直前、攻撃に備え警備ピリピリ(5/14)
https://news.yahoo.co.jp/articles/ab5514c23b616121ef9b6ed1a150fab19de1c8f6

Pythonでメールを自由自在に操る、受信からデータ収集・分析まで(5/15)
https://xtech.nikkei.com/atcl/nxt/column/18/02430/041400001/