OmniAICreator/Qiita-1.07M huggingface dataset:
SupabaseでDBデータが空で返ってくる

# はじめに

久しぶりにSupabaseを使って忘れていて少し時間を使った箇所があったのでかいておきます

# 問題

Supabaseのデータを取得するような処理を書きました

```ts
export const getEvents = async () => {
  const { data, error } = await supabase.from("events").select("*");

  if (error) {
    console.log(error);
  }

  return data;
};
```

しかし返ってくるdataは`[]`となっていました

# 解決方法

これはSupabaseのデータベースにある**RLS**というセキュリティがかかっているのが原因です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/068b6821-5d71-b04a-7767-24c53edd441f.png)

ここを設定することでうまくいきました
すぐに確認するなら`disabled`にしてしまうのもよいかもです(あとで設定はしましょう)

# おわりに

3回くらい同じことで躓いている気がする
Arduinoでサーボモータを制御する

# モータ制御
モータの種類
・普通のモータ（ミニ四駆など）
・サーボモータ
・ステッピングモータ（３Dプリンタ制御など）


# 使うもの
Arduino Uno
緑の基板（オリジナル）
サーボ(SG90)
USBケーブル
竹ひご＆ビーズ
輪ゴム
![IMG_9645（大）.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/397078a4-f695-7951-776a-e4fa48b65bb6.jpeg)

# 基板の取り付け
向きと位置を写真参考に差し込む。
Arduinoに端子の切れ目があるので、よく見てください。

![IMG_9646（大）.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/472df773-9a0b-c0da-dbc2-b3a43380a588.jpeg)

# サーボモータの取り付け
上から
　オレンジ(Signal)
　赤(+5V)
　茶(GND,-)

![IMG_9647（大）.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/37272441-0f6d-fc69-b5e7-492d3cf4b94b.jpeg)

# 輪ゴムで固定
![IMG_9648（大）.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/c62d8974-cbb3-3a85-9650-9a6863517428.jpeg)

# サーボ　ライブラリのインストール
Arduinoのメニュー＞スケッチ＞ライブラリをインクルード＞「ライブラリを管理」からservoで検索。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/4167dfcd-b4ca-fc40-1038-049fc42f4d0d.png)

# ボードとportの設定
Arduinoのメニュー＞ツール＞ボード＞Arduino Uno
Arduinoのメニュー＞ツール＞シリアルポート＞/cu.usbmodem14xxxx

# コード
```c++:arduino
#include <Servo.h>

Servo myservo;

void setup() {
  myservo.attach(9);//９番使う
}

void loop() {
  myservo.write(60);//60度に設定
  delay(100);
  myservo.write(80);//80度に設定
  delay(100);
}
```

myservo.write(角度0~180);
delay(待ち時間ミリ秒)

※モータは指定の角度に達するまでに時間がかかる。到達までに、次の角度指定があると、たどり着かないうちに次の角度へ回ろうとする点に注意。100msでは早すぎることもあるし、おそすぎることもあるので、調整しましょう。

# 追加
自分のビートを刻みましょう。

# 可変抵抗値を読み取って、サーボを動かす(Arduino内で完結)
![IMG_7036.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/9c9999c7-8210-ef45-cd05-22899250e233.jpeg)

アナログ０に接続された可変抵抗の値を読み取り、レンジを0~180に変換します。
```c
#include <Servo.h>

Servo myservo;

void setup() {
  myservo.attach(9);
}

void loop() {
  int R = analogRead(A0);//可変抵抗値を得る
  int conv_R = map(R, 0,1023, 0,180);//可変抵抗値を角度に変換する
  
  myservo.write(conv_R);
  delay(10);
}
```

# Processingからサーボモータを制御する
```java
import processing.serial.*;
Serial port;

void setup() {
  size(180, 180);

  port = new Serial(this, "/dev/cu.usbmodem14201", 9600);//port設定は各自で変更
}

void draw() {
}

void mouseMoved(){
  byte data = (byte)mouseX;
  port.write(data); //送信
}
```

```c
#include <Servo.h>

Servo myservo;

void setup() {
  myservo.attach(9);
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() >= 1 ) {
    int R = Serial.read();
    myservo.write(R);
  }
  delay(10);
}
```
PowerShellがコンソールに出力する文字コードを変更する

# 背景
- PowerShellからUTF-8としてコンパイルされたexeを実行すると出力の日本語文字が文字化けする
- もともとコンソールでの表示に使われる文字セットはShift-JISのため、これをUTF-8にしたい

# やり方
こいつをたたけばセッションを閉じるまでは出力がUTF-8になる
```powershell
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding('utf-8')
```
PowerShell 5.1、およびPowerShell 7.xで動作を確認した
プロファイルに記載することで起動時に自動で実行することもできる
[プロファイルについて - PowerShell | Microsoft Learn](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.4)

# 参考
[PowerShell 7のコードページと$OutputEncodingと[Console]::OutputEncodingについて - nislandのブログ](https://nisland.hatenablog.com/entry/2021/05/08/160222)
公開鍵認証でリモートサーバへのSSH接続

# 初めに
リモートサーバへのSSHについてターミナルごとに記載します。

:::note warn
秘密鍵が`<ユーザのHome>\.ssh\remote_server.key`である場合の記載です。
自環境の状況に応じて読み替えてください。
:::

## Visual Studio Code (vscode)を使用する場合
### 1. vscodeインストール
環境に合ったパッケージをダウンロードしてインストール
https://code.visualstudio.com/download

### 2. 拡張機能をインストール
リモート接続用の拡張機能をvscodeにインストールし、接続設定を行う
(下記が大変分かりやすいです)

https://blog.masuyoshi.com/vscode%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E7%92%B0%E5%A2%83%E3%81%ABssh%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E6%8E%A5%E7%B6%9A%E6%89%8B%E9%A0%86/

### 3. 接続情報記載
```ssh
Host remote_server
  Hostname <remote_host_ip>
  User <login_user_name>
  PasswordAuthentication no
  IdentityFile C:\Users\<local_user_name>\.ssh\remote_server.key
  IdentitiesOnly yes
```

### 4. 日本語化(任意)
拡張機能で日本語化できます。
下記を参考にしてください。

https://www.javadrive.jp/vscode/install/index4.html

***

## PowerShell / コマンドプロンプトを使用する場合
### 1. 鍵の配置確認
```powershell
> dir ~\.ssh\remote_server.key

    ディレクトリ: C:\Users\xxxx\.ssh

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2023/12/04     16:26           1702 remote_server.key
```

### 2. SSH接続
```powershell
> ssh -i "~\.ssh\remote_server.key" <login_user_name>@<remote_host_ip>
```

***

## Linux系ターミナルを使用する場合
### 1. 鍵の配置確認
```powershell
# パーミッションは600などにしておかないとエラーが出る可能性があります
$ ls -l ~/.ssh/remote_server.key
-rw------- 1 hoge hoge 1676 Jan 15 12:43 /home/hoge/.ssh/remote_server.key
```

### 2. SSH接続
```bash
$ ssh -i "~/.ssh/remote_server.key" <login_user_name>@<remote_host_ip>
```

***
ファイルのタイムスタンプが1時間以内か判定【Python Tips】

### はじめに
１時間ごとに実行する監視ツールを作ったときに、次のような課題と遭遇しました。

* ログファイルからエラーの有無を確認したいが、ローテーションが頻繁な環境のため、１時間の中で複数のファイルに分かれてしまっている。
* １時間以上前の古いファイルが大量にあるため、1時間以内に生成されたログファイルだけをチェック対象にしたい。

### 関数
ファイルのタイムスタンプが１時間以内かどうかをチェックするために次のような関数を作りました。
以下では例としてファイルの文字列を直接変数定義していますが、実際の使用の中では、subprocessやparamikoでlsコマンドを実行して結果を変数に格納するようにしています。

```python
import datetime
import calendar
import re

def is_within_last_hour(log_string):
    current_datetime = datetime.datetime.now()

    # ログから月、日、時刻を抽出
    match = re.search(r"(\w{3}) (\d{2}) (\d{2}:\d{2})", log_string)
    if match:
        month_str, day_str, time_str = match.groups()
        month = list(calendar.month_abbr).index(month_str)
        day = int(day_str)
        hour, minute = map(int, time_str.split(':'))
        # print(month_str)
        # print(list(calendar.month_abbr).index(month_str))
        # ログの日時を作成（年は一致すると仮定）
        log_datetime = datetime.datetime(current_datetime.year, month, day, hour, minute)
    else:
        return False

    # 現在時刻とログの時間差が1時間以内であるかどうかを判断
    delta = current_datetime - log_datetime
    return delta.total_seconds() < 3600

log_str1 = "-rw------- 1 root root 16102602 Jan 15 12:03 /var/log/example.log"
log_str2 = "-rw------- 1 root root 16104860 Jan 12 02:08 /var/log/example.log"

print(f"Jan 15 12:03 {is_within_last_hour(log_str1)}")
print(f"Jan 12 02:08 {is_within_last_hour(log_str2)}")
```

### 実行例
1/15の12:41に実行したので、1/15 12:03のファイルはTrueで返ってきます。
1時間以上古いファイルはFalseで返ってきます。
```sh
[user1@server1 ~]$ python3 check_log_time.py 
Jan 15 12:03 True
Jan 12 02:08 False
```

### 解説
#### calendar.month_abbr
以下ではJanのような月の文字列を数字に変換しています。
```python
# コード
month = list(calendar.month_abbr).index(month_str) # month_str: Jan
print(f"calendar.month_abbr: {calendar.month_abbr}")
print(f"list(calendar.month_abbr): {list(calendar.month_abbr)}")
print(f"month: {month}")

# 標準出力
calendar.month_abbr: <calendar._localized_month object at 0x7fec48c42d68>
list(calendar.month_abbr): ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
month: 1
```
calendar.month_abbrをリストオブジェクトに変換すると、13個の要素(1つ目は空文字)を取得できます。
indexメソッドで対象の月の要素番号を取得することで、Jan→1の形で変換します。

#### delta.total_seconds()
現在時刻とファイルのタイムスタンプの時間差を秒換算して、3600秒以内ならばTrueを返す

```python
# 現在時刻とログの時間差が1時間以内であるかどうかを判断
delta = current_datetime - log_datetime
print(f"current_datetime: {current_datetime}")
print(f"log_datetime: {log_datetime}")
print(f"delta: {delta}")
print(f"delta.total_seconds: {delta.total_seconds()}")
return delta.total_seconds() < 3600

# 標準出力
## Jan 15 12:03 → True
current_datetime: 2024-01-15 12:41:53.496180
log_datetime: 2024-01-15 12:03:00
delta: 0:38:53.496180
delta.total_seconds: 2333.49618

## Jan 12 02:08 → False
current_datetime: 2024-01-15 12:41:53.496689
log_datetime: 2024-01-12 02:08:00
delta: 3 days, 10:33:53.496689
delta.total_seconds: 297233.496689
```
LazyVStackの孫ViewのStateが画面外でリセットされる

# SwiftUIのLazyVStackの孫ViewのStateが画面外でリセットされる
とても長いタイトルですが、タイトルままです
他の方が報告されている、こちらのOpen Radarと同じ問題です

https://openradar.appspot.com/FB9900814

iOS 17.2.1、Xcode 15で確認してます

# 起きている現象
例えば下記のようにLazyVStackの子ViewとしてChildView、ChildViewの子ViewとしてSubViewを配置します
（つまりLazyVStackから見たら、SubViewは孫View）
この時、SubViewの持つ<span>@</span>State及び<span>@</span>StateObjectが、そのSubViewが画面外に行った際にリセットされてしまいます
ChildViewの方は値が保持されているので、おそらく不具合かなと考えています

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214313/d869f359-9850-7198-33a6-b711d7cbb5c9.gif" width="250">

```swift
struct ContentView: View {
    @State var items: [String] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".map { String($0) }
    var body: some View {
        ScrollView {
            LazyVStack {
                ForEach(items, id: \.self) { ChildView(item: $0) }
            }
        }
    }
}

// 子View
struct ChildView: View {
    let item: String
    @State var flag = false
    var body: some View {
        HStack {
            Toggle("\(item): ChildView", isOn: $flag)
                .fixedSize()
            SubView()
        }
        .padding()
        .border(Color.blue)
    }
}

// 孫View
struct SubView: View {
    @State var flag = false
    var body: some View {
        Toggle("SubView", isOn: $flag)
            .fixedSize()
            .padding()
            .border(Color.blue)
    }
}
```

# 対策
ChildViewで値を持ち、SubViewにBindingで渡すのがシンプルな解決策だと思います

```diff_swift
 struct ChildView: View {
     let item: String
     @State var flag = false
+    @State var flagForSubView = false
     var body: some View {
         HStack {
             Toggle("\(item): ChildView", isOn: $flag)
                 .fixedSize()
+            SubView(flag: $flagForSubView)
-            SubView()
         }
         .padding()
         .border(Color.blue)
     } 
 }

 struct SubView: View {
+    @Binding var flag: Bool
-    @State var flag = false
     var body: some View {
         Toggle("SubView", isOn: $flag)
             .fixedSize()
             .padding()
             .border(Color.blue)
     }
 }
```

しかし、SubViewを共通化しライブラリとして切り出している場合、親ViewにBindingを要求するのは若干、ライブラリとしての使い勝手が悪くなりがちです
そこで、ワークアラウンド（と言っていいか怪しいレベル）ですが、<span>@</span>State、<span>@</span>StateObjectを付けなければ値は保持されるので、attributeアリとナシのプロパティそれぞれで値を保持し、View内で適切に復元するロジックを組む事で、一応状態を維持できます
画像キャッシュライブラリのKingfisherのissueの議論がとても参考になりました

https://github.com/onevcat/Kingfisher/issues/1618

# 終わりに
遭遇したSwiftUIのLazyVStackの不具合についての話でした
もし、より良い解決手段をご存知でしたら教えて頂けるととても嬉しいです！
グループメンバーからユーザーレコードを取得(フローを使う)

+ [Get User Records from Group Member](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000BraV5SAJ)
+ [API to retrieve all users in a public group](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UtTDHSA3)

 非公式: 非公式 SF は、この種の問題を解決するために、広範囲にわたるオープン ソース コンポーネントを提供します。フロー コンポーネント ライブラリのメイン ページは次のとおりです:  https://unofficialsf.com/flow-resources/  

この特定のコンポーネントはまさに必要なものです。Get Lookup Collection (ページを下にスクロールして Get Lookup Collection を見つけます) これにより、フローが 2 つの主要なステップに減ります。すべての状況 (ユーザーではなく別のグループを指す GroupMember など) でフローを機能させるには、get レコードと get lookup コレクションをいじる必要があります。おそらく、ユーザーではない UserOrGroupId を除外するためのフィルター コレクション アクションです。

私の返答は2年前のものでした。それ以来、IN 演算子を使用したコレクション フィルターとレコードの取得という、より便利なフロー要素をいくつかリリースしました。

現在では、グループ内のすべてのレコードを取得し、結果のコレクションをループしてテキスト コレクション変数にユーザー ID フィールドを追加し、ループ後に、テキスト コレクションに UserId が含まれるユーザー オブジェクトに対して別のレコードの取得を実行できます。


この自動起動フローをREST API使えば面白いことができるかもしれません。

[REST API からのフローの起動](https://qiita.com/Keiji_otsubo/items/5bb86d385ed67e3a06af)

+ [ネストされたパブリック グループに電子メールを送信するフローを構築したことがある人はいますか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KeIF1)

:::note
レコードトリガーフローを使用してパブリックグループのメンバー/ユーザーにメールを送信する

https://thesalesforcetutorial.blogspot.com/2024/06/send-email-to-members-in-public-group.html
:::


# コレクション変数に更にフィルターをかける

+ [フロー：コレクション変数に更にフィルターをかけ要素数をカウントする](https://sfdctechsite.com/2022/11/06/flow_collection_recount/)
+ [Flow Builder のコレクションの項目の絞り込み](https://help.salesforce.com/s/articleView?id=release-notes.rn_automate_flow_builder_filter_collection.htm&release=236&type=5)
+ [フローを使って開始日と終了日の期間に対して月に１つのレコードを作成する](https://qiita.com/Keiji_otsubo/items/08ec90f4cbf61fc4b40f)
GitHub Organization内のactionをDiscordで通知する

# 目的
プログラミングコンテストで出場した後に途端にやる気をなくすコンテストあるあるに苛まれているためアクションをDiscordに通知してまだプロジェクト自体は動いてる感を出し、メンバーの創作意欲を復活させます

### やってみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627466/ddb5ea9a-6c50-038c-a98b-d7848760a9c7.png)
1. GitHubの通知を受け取るテキストチャットを作ります（作らなくてもOK)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627466/54a34672-cfd7-735d-b8c8-4fadb5b3027e.png)
2. [チャンネル編集]から[連携サービス]を選択しウェブフックを作成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627466/5de07eb2-2938-2031-76ed-1b094ce1777c.png)
3. 作ったウェブフックの名前とチャンネルを編集し（編集しなくてもOK）、ウェブフックURLをコピーします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627466/e9d18629-7f70-6480-cb27-5b4966bd716c.png)
4. GitHub Organizationの[setting]→[Webhooks]→[Add webhook]と進んでください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627466/148f1a4f-1750-33d8-0be8-ed5299c54b19.png)
5. [Payload URL]に先ほどコピーしたURLをペーストし、URLの後ろに`/github`を追加してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627466/7c7d2a0b-7cca-3683-21a4-5fd79b12521d.png)
6. [Content type]を`application/json`に変更してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627466/f908500c-ce81-d84a-c626-a2ded4c94efd.png)
7. [Which events would you like to trigger this webhook?]ではどのアクションを通知するかを選べます。今回はとにかくたくさん通知が欲しいので２番目にします
8. 他は何もしなくて大丈夫です。完了したら[Add webhook]を押します
これで完了です
### さいごに
たぶんこれでみんなの創作意欲も上がるはず、、、上がるよね、、、？
AWS CLIでCloudWatchLogsのロググループの保持期間を一括更新しよう

# はじめに
CloudWatchLogsのロググループにログがたまり続けると、AWS利用料が密かに上がってしまいます。

AWS CLIを用いて一括更新するシェルスクリプトを作ってみました。

# スクリプト

```sh:update_log_retention.sh
#!/bin/sh

cd `dirname $0`

# 保持期間を1日にしています。
RETENTION_IN_DAYS=1
REGION=ap-northeast-1

LOG_GROUPS=$(
  aws logs describe-log-groups \
    --query "logGroups[].logGroupName" \
    --output text \
    --region ${REGION}
  )

for LOG_GROUP in ${LOG_GROUPS}
do
  aws logs put-retention-policy \
    --log-group-name ${LOG_GROUP} \
    --retention-in-days ${RETENTION_IN_DAYS} \
    --region ${REGION}
done

exit 0
```
apk の中の AndroidManifest.xml を手軽に確認する方法2種

## はじめに

ビルドされた apk の中の AndroidManifest.xml に書かれている内容を確認したい！ってことありますよね。
このマニフェストファイルは勿論ソースコードの中にもあるのですが、

* ソースコードが手元にない
* 意図通りにビルドされているか実物を確認したい

とかの理由で「apkの中の」ものを見たいこともあります。
（特に現在では Jenkins などの CI/CD ツールを使って自動的に、かつ dev/prod などの接続先や debug ビルド/release ビルドなどのバリエーション違いのバイナリが生成されることもあるので）

apk を単純に unzip してもマニフェストファイルは人間が読める形にはなっておらず困ったので、調べた内容を書いておきます。

## 前提条件

* apk ファイルが PC にあること
* [Android Studio](https://developer.android.com/studio?hl=ja) がインストールされていること※

※非開発者であっても adb コマンドを使っている人であればインストールされていることが多いかなと思います。
プロジェクトのインポートやビルドまでは難しくても、インストールするだけなら簡単です。

## 環境

* macOS : Ventura 13.4
* Android Studio : Giraffe 2022.3.1 Patch 3

## aapt を使う方法

https://yuki312.blogspot.com/2011/10/apk.html

こちらのページを参考にしたのですが、自分の環境だと aapt の場所だけ違っていて、 build-tools の下にありました。
コマンドは上記ページ記載のもの（以下に引用）で大丈夫でした。

> aapt dump xmltree hoge.apk AndroidManifest.xml > foo.txt

1. Finder や Terminal で aapt を見つける
例： `/Users/ユーザ名/Library/Android/sdk/build-tools/バージョン番号/aapt`
1. Terminal で aapt がある場所へ移動（cd）するか、aapt がある場所を PATH に追加しておく
1. 上述の引用を参考に aapt コマンドを実行する（※apkファイル名やパス、出力するテキストファイル名は適宜変更する）
1. 出力されたテキストファイル（上記例だと foo.txt）をテキストエディタで開けばOKです。

## Android Studio 付属の APK Analyzer を使う方法

後から知ったのですが、こちらの方が読みやすいです…！

https://developer.android.com/studio/debug/apk-analyzer?hl=ja

公式ページだと APK Analyzer の起動方法は下記ですが、非開発者の場合ローカルにソースコードやプロジェクトが無いこともありますよね。（その場合、[Editor][Project]ウィンドウや[Build]メニューが出てきません）

> ・ APK または App Bundle を Android Studio の [Editor] ウィンドウにドラッグします。
> ・ [Project] ウィンドウの [Project] ビューに切り替えて、デフォルトの build/output/apks/ ディレクトリにある APK をダブルクリックします。
> ・メニューバーで [Build] > [Analyze APK] を選択し、APK または App Bundle を選択します。

自分の場合、下記手順でも AndroidManifest.xml の内容を表示できました。

1. Android Studio を起動する
1. メニューバーの [File] > [Profile or Debug APK] を選択
1. APKファイルを選択する
1. ウィンドウの左サイドメニューのファイル一覧から AndroidManifest.xml をダブルクリックして開く

## おわりに

昔似たようなシチュエーションで aapt を使ったような…という記憶はあったのですが、たまにしかやらないし mac も新しくなってるしで手こずりました。
一夜明けて調べ直してみたら Android Studio 便利やん…となったので、「ビルドなんてしないし adb コマンドも使わない」という人でもインストールしておくといいんじゃないかなと思いました！ （adb も便利なのでオススメです）
Android Chromeで混在コンテンツ(Mixed Contents)を表示する方法

# はじめに
テストサイトで画像表示されない問題がおきてしまい、テスト時に対策が必要となりました。

# 方法
1. URLに下記入力
chrome://flags/#unsafely-treat-insecure-origin-as-secure
※入力大変なら、chrome://flags、unsafelyで項目検索
2. 設定をEnabledに変更
3. テキストボックスに表示するコンテンツのURLを入力
4. 入力後、Relaunch表示されるので実行 

参考
https://android.stackexchange.com/questions/224891/allowing-mixed-insecure-content-on-chrome-for-android


# まとめ
そもそも混在コンテンツとなる状況は対策しましょう
https://developers-jp.googleblog.com/2019/11/https.html
https://developer.mozilla.org/ja/docs/Web/Security/Mixed_content
apple watchへのアプリインストールができないときの対策

# 導入
apple watchデビューして約半月。最大の問題は、元々iPhoneに入っていたアプリの一部がwatch側にインストールできないことでした。通常のインストールで上手く行きませんでした。色々検索しても、「参考」のところに書いたような対策しか現れず、解決できませんでした。今回はそれが解決したので記事にしたいと思います。

# 問題
apple watchに新規でアプリを入れられない。
　iPhoneに入っていた一部分のアプリは初期設定時にapple watchにはいりましたが、例えばLINEやyoutube musicなど、だめなアプリもありました。
　それらのアプリは、apple watchのApp storeからでも、iPhoneのwatchアプリからでも、インストールボタンを押しても、くるくる回るボタン表示のまま、数時間立ってもインストールされませんでした。


# 原因
apple accountへのサインインができていない。
何度かはこのサインイン要求が出ていた気がしますが、途中からこれがでなくて忘れていました。

# 解決方法
再度iPhoneのwatchアプリからインストールボタンを押し、apple watch側でサインイン要求が出たら（出ない場合も結構あり、原因は分かりませんが、何度かやり直すと出ました）、iPhone側にキーボード入力を託すような表示が出るのでそれを使ってパスワードを入力する。
　私の場合、設定していたパスワードの最初は小文字だったため、apple watch側で手書き入力すると、必ず自動で大文字に変換されてしまい、全く入力できませんでした。そこで、パスワードを押した場合にiPhoneにでたiPhone側のキーボードを使うという通知を押すと、iPhoneから入力でき、問題なくアカウントへのサインインができ、アプリをインストールすることができました。

# 参考 chatGPTが回答した解決に至らなかった方法
chatGPT3.5 turboでは以下のような回答でしたが、全て試して、上手く行きませんでした。
1. iPhoneとApple Watchのペアリングを確認する：まず、iPhoneとApple Watchが正しくペアリングされていることを確認してください。iPhoneのBluetooth設定で、Apple Watchがリストに表示されていることを確認しましょう。
1. iPhoneのソフトウェアを最新版に更新する：App Storeから最新のiOSソフトウェアが利用可能かどうかを確認し、更新が必要な場合はインストールしてください。
1. Apple Watchのソフトウェアを最新版に更新する：Apple Watchアプリを開き、一般→ソフトウェア・アップデートの順に進み、最新のソフトウェアが利用可能かどうかを確認して、更新が必要な場合はインストールしてください。
1. Apple Watchの再起動：Apple Watchを再起動してみることで、一時的な問題が解決する場合があります。Apple Watchの電源ボタンを長押しし、スライダーが表示されたら、スライダーをスライドして電源を切り、再度電源を入れてみてください。
1. アプリの再インストール：iPhoneのApp Storeから、Apple Watchにインストールしたいアプリを探し、インストールボタンをタップして再インストールしてみてください。
1. Apple Watchの容量を確認する：Apple Watchには容量制限がありますので、容量が不足している場合は、不要なアプリやデータを削除して容量を確保してみてください。

# まとめ
こんなことで数週間捕まっていました。appleのQAサイトも見ましたが、参考になるものがなく、自身で解決したので、誰かのお役に立てばと思いメモ！誰かの役に立てば幸いです。
【ChatGPT有＋DALL-E3】対象物の配置について。


　どうも、カーブミラーです。

　今回は、対象物を配置する際の注意点を上げます。その対策もあります。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
あしからず。
:::
***
　以前に、
　　被写体の向きを
　　　記事にしました。
[【ChatGPT有＋DALL-E3】で人物の向きをどう指定すればいいのでしょうか。](https://qiita.com/kabumira/items/96fb0c668ab0b9cc777f)

　次に、
　　カメラ撮影用語
　　　（被写体に向ける用語）を
　　　　使ってのサンプル画像を
　　　　　記事にしました。
[【ChatGPT有＋DALL-E3】カメラでの撮影をもとに、描画依頼します。その１](https://qiita.com/kabumira/items/309f6c29db453044bf8c)

　次が、
　　カメラ撮影用語を
　　　使っての人物ポーズを
　　　　記事にしました。
[【ChatGPT有＋DALL-E3】カメラでの撮影をもとに、描画依頼します。その２](https://qiita.com/kabumira/items/be1d592e639fc9711f51)

　それから、
　　カメラ撮影用語を
　　　使ってのアングルを
　　　　記事にしました。
[【ChatGPT有＋DALL-E3】カメラでの撮影をもとに、描画依頼します。その３](https://qiita.com/kabumira/items/262d6cc81f7388fe130f)

　最後に
　　ハンドサインのことを
　　　記事にしました。
[【ChatGPT有＋DALL-E3】ハンドサインを指定して、描画依頼します。](https://qiita.com/kabumira/items/9ef25033be14cf9886a4)
***
　今回は、
　　対象物の配置を
　　　記事にします。

　実を言うと、
　　以前からなのですが、
　　　対象物の配置が
　　　　おかしいことに
　　　　　気付いていました。

　右に配置を指示したら、左に
　　左に配置を指示したら、右に
　　　という感じになるんです。

　それで
　　いくつかやって
　　　確認してみました。

　それからまた、
　　ChatGPTさんからの
　　　返答が英語になりだしました。

　二転三転するのは
　　やめて欲しいですよね(T_T)

　それから
　　Qiitaに、画像をアップし過ぎて、
　　　記事に画像をアップ
　　　　できなくなりました(^o^;)

　なので、
　　文字だけになります。

　サイズダウンすれば
　　いいだけなのですけどね。

　というわけで
　　やり取りをどうぞ。
***
***User***
聖母マリアの上の天使。描画

***ChatGPT***
（画像）
こちらは聖母マリアの上に天使がいる天空のシーンを描いたもので、古典的な宗教美術を思わせるスタイルで制作されている。
（OK）

***User***
聖母マリアの下の天使。描画

***ChatGPT***
（画像）
これは、聖母マリアとその下にいる天使を描いたもので、宗教美術の古典的伝統を反映したスタイルで描かれている。
（OK）

***User***
聖母マリアの左側に天使。描画

***ChatGPT***
（画像）
左側に天使を従えた聖母マリアが、伝統的な宗教美術を思わせるスタイルで描かれている。
（マリアの左側を指定したがNG）

***User***
聖母マリアの右側に天使。描画

***ChatGPT***
（画像）
こちらは聖母マリアの右側に天使が描かれた像で、古典的な宗教芸術作品と呼応するスタイルで制作されている。
（OK）

***User***
リトライ

***ChatGPT***
（画像）
これは、聖母マリアの右側に天使が描かれ、古典的な宗教芸術のスタイルでデザインされた修正画像である。
（NG）

***User***
リトライ

***ChatGPT***
（画像）
こちらは、聖母マリアの右側に天使が描かれた、伝統的な宗教様式でデザインされた別のバージョンの画像。
（OK）
***
　“リトライ”というのは
　　“再描画”では、“同じです”と
　　　文句を言われるので
　　　　これを使うようになりました。

　それはともかく、
　　どうでしたか？

　おかしいでしょう？

　上下は、
　　もちろん大丈夫ですけど。
***
　そこで
　　配置を
　　　正しく指定する方法は
　　　　ないのか？と考えました。

　以下に
　　その方法を
　　　上げます。
***
　対象物がふたつ以上であれば、
　　プロンプト上で、
　　　登場させる順に
　　　　こちらから見て、
　　　　　左側から描画
　　　　　　されますので、
　　　　　　　これを使えばOKです。

　また、複数人を描画する際には、
　　人数指定は、思いどおりに
　　　なりません。
　　　　なったとしても
　　　　　たまたまです。

　少人数であれば、
　　ひとりひとりを
　　　指定していくのが、
　　　　いいと思います。

　例えば、
　　「日本人男性と
　　　レトリバーと
　　　　アメリカ人女性と
　　　　　火星人が並んでいる」とか。

　今、描画してみたら
　　火星人が、緑色のグレイに
　　　なってしまったw

　【注意！】
　　リトライを重ねていくと
　　　人物の順番が変わります。
　　　　同じプロンプトを
　　　　　与える方がいいかと。
***
　以上になります。

　どうでしたか？

　みなさんの作品制作の
　　参考になれば
　　　幸いです。

　今回は、ここまで。

　次回があれば、
　　そのときはまた。
　　　今は、何も用意して
　　　　いませんので(=^･^=)
Zenohのメッセージ通信を使いやすくしたい記事

# はじめに
以前、[Zenoh](https://zenoh.io/)で以下のようなメッセージ通信の記事を書いた人です。

https://qiita.com/motii8128/items/442d89da1c8e4a7da2da

この度はメッセージの定義を容易にしてくれるツールを作成したので紹介する記事です。

# 実装
がっつりRustで実装しました。

https://github.com/PureRustRobot/zenoh_msg_generator

ROS2のメッセージを書くときに使う.msgを使って生成できるようにしました。

```:Hello.msg
float64 x
float64 y
float64 z
bool enable
```

こちらをzenoh_msg_generatorのCargo.tomlと同じディレクトリ配下に置いたら実行します。
まずはパッケージの新規作成を行うので、オプションにnewを指定します。
また、その次にパッケージ名、最後に.msgのファイル名を与えます。
```
cargo run -- new hello_msgs Hello.msg
```

```
user@user-Laptop:~/zenoh_msg_generator$ cargo run -- new hello_msgs Hello.msg
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/zenoh_msg_generator new hello_msgs Hello.msg`
[ZenohMsgGenerator][INFO]:Start Generator
[ZenohMsgGenerator][INFO]:create lib.rs
[ZenohMsgGenerator][INFO]:Get .msg file contents
[ZenohMsgGenerator][INFO]:create msg.rs
[ZenohMsgGenerator][INFO]:Successfull generate
```
成功すると以下のようなログが出るのでホームディレクトリにパッケージが作成されているはず。

![Screenshot from 2024-01-15 08-51-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119891/3a257d2f-856c-aedd-0eb9-2168de58badc.png)

vscodeで開いてみました。
詳しい実装は**はじめに**載せた記事を参考にしてください。

他の.msgを追加することもできるので実行します。

```:Motii.msg
string name
int32 id
float64 power
```
以下のコマンドを実行します
```
cargo run -- add hello_msgs Motii.msg
```
成功のログが出たあと、確認するとちゃんとできてますね。
![Screenshot from 2024-01-15 11-04-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119891/d653cd3b-89dc-1376-818e-2c9fc2b07df8.png)

今回は構造体の定義に加えserialize関数とdeserialize関数も作成するようにしました。
構造体メンバがpublicになっていないので後で修正します。

このパッケージをGithubに上げるなりして他のパッケージでも利用しましょう。

# 関連記事

https://qiita.com/motii8128/items/442d89da1c8e4a7da2da
seleniumのsystem specでheadless chromeを利用している際, Chrome120に更新されてから通らなくなった原因の解消

ruby3.1
rails 7.0
selenium-web-driver 4.16
capybara 3.39.2


結果としては、headless chromeを使う際のオプション名が原因でbrowserNameがchromeとなるはずがchrome-headless-shellになっていた。
chromeはヘッドレスモードが2種類あり、古い方がchrome-headless-shellとなるようだ。
chrome-headless-shellは別で専用のバイナリが公式から用意されていて、そちらをDLして使う事も可能らしい。

修正前
```ruby
Capybara.register_driver :chrome do |app|
  options = Selenium::WebDriver::Options.chrome
  options.args << '--headless'
  options.args << '--no-sandbox'
  options.args << '--disable-dev-shm-usage'
end
```

修正後
```ruby
Capybara.register_driver :chrome do |app|
  options = Selenium::WebDriver::Options.chrome
  options.args << '--headless=new' # 新しいheadless modeを使う
  options.args << '--no-sandbox'
  options.args << '--disable-dev-shm-usage'
end
```


参考
https://www.selenium.dev/blog/2023/headless-is-going-away/
https://developer.chrome.com/blog/chrome-headless-shell?hl=ja
Vs-CodeでSDKが見つからない時

MacにUnityを入れてVscodeを開いたがSDKが認識されない時の処理です。

Mac M1
Unity 2022.3.16
vscode  1.85.1
dotnet 7.0.404

dotnetがおかしいのか確認。
*********************************************
% dotnet --info
.NET SDK:
 Version:   7.0.404
 Commit:    22f221a24c

ランタイム環境:
 OS Name:     Mac OS X
 OS Version:  14.2
 OS Platform: Darwin
 RID:         osx-arm64
 Base Path:   /usr/local/share/dotnet/sdk/7.0.404/

Host:
  Version:      7.0.14
  Architecture: arm64
  Commit:       808851b07a

.NET SDKs installed:
  7.0.404 [/usr/local/share/dotnet/sdk]
*********************************************
C# DevKitがよくないとかなんとか。

解決策
Unityのエディタから開いたらダメ。
Vscodeの開くからUnityのプロジェクトを指定して開く。
そうすればうまくいきました。


すごく時間がかかりました。
これでうまくいきました。
ハート頂ければ嬉しいです。

原因は何なのかわかればどなたか教えてください。
電源沼

DACなどのための電源をいろいろ調べていました。

電源は大きく分けると、

* スイッチング方式
* トランス（リニア）方式

に分けられます。スイッチング方式のほうが小さく軽く作れますが、ノイズが大きくなります。オーディオ関係ではトランス方式を押す人が多いです。

トランス方式の定電圧回路には以下のタイプがあります。

* 普通のレギュレーターを使ったもの
* 可変のレギュレーターを使ったもの
* LDOなレギュレータを使ったもの
* DC-DCを使ったもの
* ディスクリートでトランジスタを使ったもの
* ディスクリートでFETを使ったもの

これもLDOより普通のレギュレータの方がいいとか、レギュレータよりディスクリートの方がいいとかあります。またレギュレータでもLTの部品がいいとか言う話しもありました。

いきなりDC-DCはあまり見かけません。

肝は電流が変動した時に電圧が一定になるかのようです。

ディスクリートはツェナーダイオードを使うのが一般的ですがLEDを使ったもののを試されている方もいます。

ディスクリートで制御部分をNJM723のようなICを使うケースとオペアンプとシャントレギュレーター(TL431)で作るケースなどがあるようです。消費電力が小さければトランジスターだけでも組めるようです。

DACなどは5Vや3.3Vでオペアンプは正負が必要です。またDACやオペアンプは100mAくらいですが、私が使っているMIPSモジュールは500mAくらいで、使ったことないですがラズパイなどは1Aを越えているようです。

この大きさや、変動幅を考慮して考えるのが良さそうです。

結構沼です。
CellにPresenter渡してみた（MVP）

仕事でMVPアーキテクチャを用いてiOSアプリの実装をしているときにCellにPresenterを渡してみた結果かなりコード量を削減できたのでメモ程度にここに残しておきます。

```swift
final class TestViewController: UIViewController {

    typealias Cell = TestTableViewCell
    private var presenter: TestPresenterInput!

    override func viewDidLoad() {
    super.viewDidLoad()
    presenter = TestPresenter(view: self)

}

extension TestViewController: TestPresenterOutput {

    // View側の描画処理を記述

}
```
上記がVCのPresenterの設定だとして
```swift
extension TestViewController: UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // 使用している配列の個数をReturn
    }

    func func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: Cell.identifier, for: indexPath) as! Cell
        cell.configure(presenter: presenter) // cell描画時にPresenterを持たせる
        return cell
    }
    
}
```
上記のようにcellの描画関数に引数としてPresenterを持たせることでCell側から直接Presenterの関数にアクセスできるようにします。
```swift
final class TestTableViewCell: UITableViewCell {

    static let identifier = "TestTableViewCell"
    static func nib() -> UINib {
        UINib(nibName: identifier, bundle: nil)
    }

    @IBAction private func tappedTestButton(_sender: UIButton) {
        presenter.tappedTestButton(cell: self) // CellのインスタンスをPresenterの関数の引数に渡すことでボタンタップ後の描画処理をPresenterから呼び出せるようにしています
    }

    private presenter: TestPresenter!

    func configure(presenter: TestPresenterInput) {
        self.presenter = presenter // Cell内に定義したPresenterに代入してIBActionなどで使えるようにする
        // その他の描画処理を行う
    }

    func configureAlreadyTappedTestButton() {
        // ボタンタップ後の描画処理を行う(Presenterから呼び出す)
    }
    
}
```
Cellのコードは上記の通りです。VCからPresenterをもらっておけばIBActionの中からPresenterの関数を呼び出せて楽です。
Presenterの関数呼び出し時に引数としてCell自身のインスタンスを渡しておけば、ボタンタップ後の描画処理（ここではconfigureAlreadyTappedTestButton()）をPresenterから直接呼び出すこともできます。
```swift
protocol TestPresenterInput: AnyObject {
    func tappedTestButton(cell: TestTableViewCell)
}

protocol TestPresenterOutput: AnyObject {
    // VC側の描画処理記述
}

final class TestPresenter {

    private weak var view: TestPresenterOutput!

    init(view: TestPresenterOutput) {
        self.view = view
    }

}

extension TestPresenter: TestPresenterInput {

    func tappedTestButton(cell: TestTableViewCell) {
        // Cellのボタンタップ時の処理を記述
        cell.configureAlreadyTappedTestButton() // Cellに定義しているボタンタップ時の描画処置をPresenterから呼び出す
    }

}
```
上記がPresenterのコードです。

これでCell↔️Presenter間に相互的に関数を呼び出せる状況が完成しました。
今まではVCを経由してDelegateを用いてコーディングしていて、とても追いにくいコードになっていました。
この方法なら一発で該当の関数に飛べるし、余分なDelegateがなくなってスッキリしました。

まだ試しに一回使ってみた程度でいろんなパターンに対応できているかはわからないので、使ってみて不便だったりしたポイントがあれば教えていただけると嬉しいです！

個人的にはSelfが解放されてしまうパターンなどがないかが心配なところです…🥺

本当にメモ程度で申し訳ありませんが、以上です。

2024/01/16追記：
記事投稿時にはTableViewに対して１つのCellしか使っていなかったので、コードがスッキリしたように見えましたが、複数になってくるとどうなんだろうという意見をいただきました。
CellごとにInputを作成してそれぞれのCellのOutputをPresenterに渡していく方がいいのか、やりすぎると逆に複雑になってしまうのか。。迷いどころです。
いい折り合いをつけてからもっといい設計にして投稿しなおしたいです。
ループメニュー１をやっていく2

https://paiza.jp/works/mondai/loop_problems/loop_problems__rep_num_step1

Python
```py
for _ in range(8):
    print(3)
```
PHP
Pythonと違うので未だに改行コードを入れないといけないことを忘れます汗
あと、改行コードは’’だとだめで””でないと展開されないみたいです

```php
<?php
    for($i=1; $i<=8; $i++){
        print(3 . "\n");
    }
?>
```
https://paiza.jp/works/mondai/loop_problems/loop_problems__rep_num_step2

Python

```py
N, K = map(int,input().split())
for _ in range(K):
    print(N)
```

PHP
```php
<?php
    list($N,$K) = explode(" ",fgets(STDIN));
    for($i=1; $i<=$K; $i++){
        print($N . "\n");
    }
?>
```

https://paiza.jp/works/mondai/loop_problems/loop_problems__print_alpha

Python
これは力技でした汗
```py
A = 'abcdefghijklmnopqrstuvwxyz'
for i in A:
    print(i)
```
いい加減文字コードとChrを使う方法も覚えないと。。。

```py
for i in range(97, 97 + 26):
    print(chr(i))
```

PHP
力技の方法だと、
まず文字列の長さは`strlen()`
文字列切り出しは`substr()`が使える

PHP7.4以降だと`mb_str_split()`が使える模様。
アルファベットなのでstr_split()でもよさそうだけど、
ひらがなも含む場合、はじめからmb_str_split()を使っていたほうが楽？なのかな。
この場合配列の要素は`count()`
でも結局普通に力技その1のほうが行数が少なくなる結果に

文字列Chr関数を使った方法はPHPにもあった。
Pythonとの挙動の違いにだけ注意。
ぶっちゃけPHPはChr関数を使ったほうが楽よな。。。覚えてたら。。。

```php

<?php
//力技その1
    $A = 'abcdefghijklmnopqrstuvwxyz';
    for($i=0; $i<=strlen($A); $i++){
        print(substr($A,$i,1) . "\n");
    }    
?>

<?php
//力技その2
    $A = 'abcdefghijklmnopqrstuvwxyz';
    $char = mb_str_split($A);
    for($i=0; $i<=count($char); $i++){
        print($char[$i] . "\n");
    }    
?>

<?php
//文字コードとchr関数を使った例
    for($i=97; $i<97+26; $i++){
        print(chr($i) . "\n");
    }    
?>
<?php
//文字コードとchr関数を使った例その2
    $i=97;
    while ($i < 97+26){
        print(chr($i) . "\n");
        $i++;
    }    
?>

```
SPSS Modeler 18.2.2以降で既存ファイルにレコード追加の際にサイズが2GBを超える場合の回避策

SPSS Modeler 18.2まではフラットファイルの追加出力時に特に制限はありませんでしたが、[18.2.2以降は2GBを超える場合に元のデータが削除されてしまう制限](https://www.ibm.com/support/pages/node/7030344)があります。
これは、Modeler18.2.2以降で使用しているICU4Cライブラリーに制限のためです。

この制限をPySparkの拡張ノードをつかって回避する方法を考えました。

* サンプルストリーム

https://github.com/hkwd/210224PythonExtension/raw/master/240112append2g/append2g2.str

* テスト環境
    * Modeler 18.4
    * Windows 11 64bit

# 1. PySpark拡張ノードを使った既存ファイルにレコード追加

「拡張のエクスポートノード」に以下を入力して実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/6e1583a6-5029-42d5-1f1b-5fc183d7dec9.png)

```python:既存ファイルにレコード追加
#ファイル名
filename='C:/temp/modelertmp2/2G.csv'

import spss.pyspark.runtime
ascontext = spss.pyspark.runtime.getContext()

import numpy
import pandas as pd
import csv

indf = ascontext.getSparkInputData()
df=indf.toPandas()
# Appendモードで出力。文字列はダブルクォートで囲む。index列とヘッダー行は出力しない。
df.to_csv(filename, quoting=csv.QUOTE_NONNUMERIC,mode='a', header=False, index=False)
```
以下で追加先のファイル名を指定しています。環境にあわせて修正してください。この部分を[カスタムノード化](https://qiita.com/kawada2017/items/732de5a97c719a31d3a7)してしまうのもよいと思います。

filename='C:/temp/modelertmp2/2G.csv'

# 2.テスト実行

データは以下のような2GBのデータを用意しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e62c2939-8a2f-53e3-7075-27ec1d9cd003.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a8bc392e-23bb-f2df-2f41-dba534781377.png)


「拡張のエクスポートノード」を実行すると１MB増えています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/60d57338-0691-987e-9aec-6f8ac26346f5.png)

最後の2行を確認すると確かに1MBのデータが一行追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/bd7b82fd-a717-ca3b-2504-6a9cbf4f02e1.png)

# 3.制限の確認
既存ファイルにレコード追加の際にファイルサイズが2GBを超える場合に元データが削除される制限を確認してみます。
通常の「フラットファイルのエクスポートノード」で「レコード追加」してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/100456b5-b11d-489e-d9e6-85c9d5785e75.png)

ファイルのサイズが2GBあったものが1MBになってしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ff5b044e-1681-62aa-b05f-01a11fbd26ca.png)

追加した1MBのデータだけになっていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/feec0124-292c-be52-5d9e-99b7e3aa7702.png)

なお、Modeler18.5ではメッセージが出力され実行が中断するように修正されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b4aea37a-2a88-8c10-142c-9ce789e4090e.png)


# 4. 日付型、タイムスタンプ型、時間型の注意
pandasのDataFrameにした際に日付型、タイムスタンプ型、時間型はうシリアル値になります。ですので、以下のような変換などをする必要があります。

```python:シリアル値から日付型への変換
df['ds'] = pd.to_datetime('1970/1/1') + pd.to_timedelta(df['ds'] , unit='days')
```

# 参照
#### エクスポート[フラットファイル]ノードの保存モード[レコード追加]のファイルサイズの制限について

https://www.ibm.com/support/pages/node/7030344
【Rails】ERB Formatter/Beautifyがうまく動かない


VSCodeの拡張機能であるERB Formatter/Beautifyをインストールした時にエラーで少しハマったので、同様の問題で悩んでいる方のために解決策を共有したいと思います。
環境はmacM2です。

## エラー
- VSCodeの拡張機能からインストール
- Gemfileに gem 'htmlbeautifier' を追記して bundle install
これで動くはずなんですが、フォーマットを実行してみると以下のようなエラーが

```
Error occurred while formatting: Command failed with exit code 1
```
```
Failed with exit code: 1. '/Users/hogehoge/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/htm
lbeautifier-1.4.2/bin/htmlbeautifier:12:in `rescue in beautify':
Error parsing standard input: invalid byte sequence in US-ASCII on
line 1 (RuntimeError) from 
```
エラー文を見ると標準入力を解析する際にASCII以外の無効なバイトシーケンスがある的なことが書かれてるので、文字コードの設定でエラーが発生してるのかなと推測できます。
## 解決方法
ERB Formatter/BeautifyのREAD MEの下の方にKnown Issuesとして解決方法の記載がありました。
具体的な設定のやり方として

（１）⌘Pからsettings.jsonを開く
（２）⌘f でvscode-erb-beautifyを検索
（３）以下の通り記載
```
    "vscode-erb-beautify.customEnvVar": {
        "LC_ALL": "en_US.UTF-8"
    },
```
これで VSCodeを開き直したらうまく動きました。
参考にしたGithubのissueのリンクです↓。
https://github.com/aliariff/vscode-erb-beautify/issues/47
C++ operator() (xxx, yyy) みたいなやつの使い方

# C++ operator() (xxx, yyy) みたいなやつの使い方

参照したページ
https://en.cppreference.com/w/cpp/language/operators

1. operator()を構造体内に定義する。複数でも可(オーバーロード可)
2. 構造体を初期化する
3. 初期化した構造体を関数のように使う。

上記のようにすると、下記コードのdouble a, b; の初期化を関数の実行前に実行できてすっきりする?


## コード

```cpp
#include <iostream>

struct Linear
{
    double a, b;
    double operator() (double x) const
    {
        return a * x + b;
    }
    double operator() (double x, double y) const
    {
        return a * x + y + b;
    }
};

int main()
{
    Linear f{2, 1};
    Linear g{-1, 0};

    double f_0 = f(0);
    double f_1 = f(1);
    double f_0_1 = f(0, 1);
    double f_1_3 = f(1, 3);
    // double f_1_3_3 = f(1, 3, 3);
    // error: no match for call to ‘(Linear) (int, int, int)’
    // Linearにoperatorとして定義されていない関数型は実行できない
    
    double g_0 = g(0);
    double g_1 = g(1);

    std::cout << "f_0: " << f_0 << std::endl;
    std::cout << "f_1: " << f_1 << std::endl;
    std::cout << "f_0_1: " << f_0_1 << std::endl;
    std::cout << "f_1_3: " << f_1_3 << std::endl;

    std::cout << "g_0: " << g_0 << std::endl;
    std::cout << "g_1: " << g_1 << std::endl;
    return 0;
}
```


## 実行結果

```
(base) mozaki@yoshitsune:~/004_HDD/001_CODE/101_CPLUS_STUDY/Operator$ ./a.out
f_0: 1
f_1: 3
f_0_1: 2
f_1_3: 6
g_0: 0
g_1: -1
(base) mozaki@yoshitsune:~/004_HDD/001_CODE/101_CPLUS_STUDY/Operator$
```
コマンドの自動補完をしてくれる Fig.app を使い始めたがかなり便利だったのでシェア

## ■ はじめに

### **説明**
最近、業務で Flutter を使い始めたので Windows から Mac へお引っ越しをしました。
ずっと Windows を使っていたのもあって、Mac のおすすめ設定や便利なツール集など読み漁ってます。
その中で、Fig.app というコマンドの自動補完をしてくれるという最高なものを見つけました。
インストール自体は簡単なのですが、どうやら現在サインアップが出来ないらしく Fig の起動が出来ないみたいなんです。（ Amazon CodeWhisperer に変わった？結合した？のが原因っぽい）

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/6982f52d-701f-804f-9c88-31cb802a49a3.png)

複数のサイトを見てもそのやり方がなさそうだったので、ここに手順書いておきます。
結論、Webからインストールはダメで brew を使ってインストールが必要なのと、Fig をインストール後は起動させずに「Fig integrations install dotfiles」が必要でした。（詳しくは項番1.3を参照）

### **環境**

- Macbook Air M2 sonoma(14.0)
- fig_cli 2.17.0

## ■ 手順
1.1　まずは、以下のコマンドを実行しインストールします。

```bash
% brew install --cask fig
==> Downloading https://formulae.brew.sh/api/cask.jws.json

==> Caveats
Please launch the Fig application to finish setup.

==> Downloading https://repo.fig.io/generic/stable/asset/2.17.0/universal/fig.dm
Already downloaded: /Users/k.takasugi/Library/Caches/Homebrew/downloads/002edc32fde5c17649525d22df1e51853777ff573af22eef17caf323f81234f6--fig.dmg
==> Installing Cask fig
==> Moving App 'Fig.app' to '/Applications/Fig.app'
==> Linking Binary 'fig-darwin-universal' to '/opt/homebrew/bin/fig'
🍺  fig was successfully installed!
%
```

1.2　システム設定→プライバシーとセキュリティ→アクセシビリティにて、Figの許可をオンにします。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/c64300db-56de-26fd-a364-ccee3118d374.png)

1.3　dotfiles をインストールします。「Installed!」と表示されればOKです。その後、ターミナルを再起動して下さい。
```bash
% fig integrations install dotfiles

Installed!
%
```

1.4　以下の様に自動補完してくれるようになります！

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/95bd958d-da2f-e3e6-b180-cb40c050ac05.png)
![4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/6a9e0ef5-e113-f6a0-029f-9e0cf82f164b.png)
![888.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/0cd9a221-4a6f-5f4d-5e9e-643daf8e2ff0.png)

又、各種設定を確認したい場合は、以下の公式ドキュメントを参照して下さい。（変更後、ターミナルの再起動が必要です）

https://fig.io/docs/support/settings

以上。

### 参考サイト

https://it-jog.com/cmd/install-fig#install
AWS認定資格取得に向けての公式トレーニング開始手順で迷ったのでまとめた

# はじめに

AWS認定資格取得に向けて、AWS公式のトレーニング(無料)を開始したかったが、
開始までに迷った部分があったのでまとめる。

# どこから開始するの？

開始は、AWS training and certification (https://www.aws.training/) から。
右上を必要に応じて「日本語」に変更しつつ、サインインを押す。
![0000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668873/631a69bf-e98e-2a7a-bc78-b9fe6654fd4b.png)

# 何を作成するの？

AWSビルダーID を作成するところから開始。
![0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668873/f0ed66d9-bc8d-b471-3eee-89a1d254c404.png)

「メールアドレス」、「名前」を入力して次へ。
![0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668873/5a553930-8ec6-420d-ec32-cacc8a5a7997.png)

メールで「認証コード」が送られてくる。
![0004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668873/fee6d271-bf87-7c8c-ad72-0616e8d37351.png)

「認証コード」を入力して認証。
![0003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668873/30cc9fcb-fd71-ce9e-f2ca-2d8364796243.png)

「パスワード」を設定して、AWS Builder ID を作成。
![0005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668873/97464a94-1a97-40db-1d45-242104f98384.png)

初回のみ利用規約への同意が求められる。
![0006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668873/ba55525c-6c62-92e6-7818-d0f7682fa9a3.png)

サインインすると、個人情報の入力を求められるので、「名前」、「メールアドレス」、「国/地域」、「会社名」、
「AWS経験レベル」等を入力して CONTINUE。
後から日本語に変更できるので、とりあえず適当に入力して進めても良い。
![0007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668873/8cb383e0-5114-22fd-0e34-a666ff7445af.png)

「AWS トレーニングと認定」アカウントが作成され、メールが届く。
![0012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668873/a807ad7e-a9c0-a1d8-9ff5-b6bf5223688a.png)


「AWS トレーニングと認定」(https://www.aws.training/) へサインインした際、画面上部にある
「AWS Skill Builder」を選択すると学習画面へ移動。
![0009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668873/8372d6b0-2a2d-d6af-6126-9ff70d3060b7.png)

# 学習画面

学習ダッシュボードにくるので、学習したいものを選択して開始。
![0011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668873/b2f111b4-716e-e009-4415-708b0bf60447.png)

# 最後に

「AWS トレーニングと認定」のアカウントと「AWS ビルダー ID」アカウントの関係性をきちんと理解できて
いないが、AWS training and certification (https://www.aws.training/)
からサインインし、学習したいものを選択し、学習開始できた。
[Builder pattern] オブジェクト内に Date.now() を  inject する方法

## 動機

Builder パターンで作成される、time フィールドを持つオブジェクトを考える。
このtimeフィールドに関して、以下を実現したい。

- アプリケーション起動時には、現在時刻`Date.now()`を設定
- テスト時には、特定の時刻を注入



## 結論

コンストラーのオプション引数として、`time = () => Date.now()`(value function)を指定する。

## 具体例

```ts
export class MyEvent {

  private event = new Map<string, string | number | Array<string> | Array<number>>();

  private readonly time: () => number;
  private readonly instanceId: string;
  private readonly eventType: "web" | "app";

  // デフォルトで、() => Date.now()とする。
  // timeが注入されなかった場合は現在時刻を使う。
  constructor(time = () => Date.now() / 1000, instanceId: string = CONFIG.INSTANCE_ID) { 
    this.time = time
    this.instanceId = instanceId
  }

  private setCurrentTime(): IngestEvent {
    this.event.set("time", this.time());
    return this;
  }

  private setInstanceId(): IngestEvent {
    this.event.set("instance_id", this.instanceId);
    return this;
  }

  private setEventType(value: EventType): IngestEvent {
    this.event.set("event_type", value);
    return this;
  }


  buildWebEvent(): MyEvent { 
    return this
      .setCurrentTime()
      .setEventType("web")
      .setInstanceId()
  }


  buildAppEvent(): MyEvent { 
    return this
      .setCurrentTime()
      .setEventType("app")
      .setInstanceId()
  }

  toString(): string {
    return JSON.stringify(Object.fromEntries(this.event));
  }
}
```

src codeでの使い方

```js
cosnt webEvent = new MyEvent().buildWebEvent()
const appEvent = new MyEvent().buildAppEvent()
```

test での使い方

```js
const fixedTime = new Date('December 17, 1995 03:24:00') / 1000
const fixedConfig = ...

// 注入できる
cosnt webEvent = new MyEvent(() => fixed_time, fixedConfig).buildWebEvent()
```
Terminatorの画面上の位置が動かせなくなったときの対処方法

# 導入
　皆様、あけおめでございます。
　さて、本日Ubuntuの設定で去年半ば頃から数ヶ月ほったらかしていた問題が解決したので、メモがてら書きます。さくっと結論欲しい人は以下の"問題"のところから見るだけで十分です。
　その問題とは下記にも書きましたが、terminatorの位置がマウスドラッグで動かせなくなってしまったんです。
ただし、Alt+F7で位置を動かしたり、Alt+F10で最大化等はできるので、ほったらかしていましたが、やっぱりぱぱっとマウスで位置が動かせたほうがいいなーと思っていました。
　しかし、ググってもドンピシャな情報は出てこず、上記のショートカットによる対策が出てくるだけでした。
　新年になってやっぱり気持ち悪いなー、と思って、いっそterminatorのremoveとinstallを試してみました。しかし、同じ状況でした。そこで、設定が残っていて、それが悪さしていることを疑いました。
　terminatorの設定は「~/.config/terminator/config」にあります。私は普段emacsを使うことが多く、過去のconfigがconfig~として残っていたので、今のconfigと比較してみると、何やら怪しげな「borderless=true」という設定が見えました。これを消してみるとドンピシャでした。
 　あ、結論まで一気に書いちゃった。でも見にくいと思うので、以下に簡潔にまとめます。

# 問題
Ubuntuのterminalのひとつであるterminatorの画面上の位置が、マウスドラッグで動かせなくなった。

# 原因と解決方法
~/.config/terminator/config に書かれている`borderless=true`を消す。
　なぜかこの設定がglobalの中に入ったので、GUIで動かすために掴むべき部分がなくなってしまったのでした。

# まとめ
以上、分かってしまえば超簡単な原因でしたが、実際に解決するにはすごく長い時間がかかったのでご紹介でした。
　それにしても私はこんな設定自分で書いてないのに、どのタイミングで勝手に書かれてしまったのだろう...。
Qiitaで量子まわりの記号を表示するためのチートシート

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [行列](#c1)
1. [ブラケット](#c2)
1. [その他よく使う記号](#c3)
1. [参考文献](#ref)

<!-- 各チャプター -->
<a id="#c1"></a>
# 行列

````markdown
```math
\begin{pmatrix}
1 & 0
\end{pmatrix}
```
````

```math
\begin{pmatrix}
1 & 0
\end{pmatrix}
```

````markdown
```math
\begin{pmatrix}
1 \\
0
\end{pmatrix}
```
````

```math
\begin{pmatrix}
1 \\
0
\end{pmatrix}
```

````markdown
```math
\begin{pmatrix}
1 & 0 \\
0 & 1 \\
\end{pmatrix}
```
````

```math
\begin{pmatrix}
1 & 0 \\
0 & 1 \\
\end{pmatrix}
```

<a id="#c2"></a>
# ブラケット

````markdown
```math
\bra{0}
```
````

```math
\bra{0}
```

````markdown
```math
\ket{1}
```
````

```math
\ket{1}
```

````markdown
```math
\Braket{0|A|1}
```
````

```math
\Braket{0|A|1}
```

<a id="#c3"></a>
# その他よく使う記号
### ハット(演算子)
````markdown
```math
\hat{A}
```
````

```math
\hat{A}
```

### 添え字
````markdown
```math
\gamma_{01}
```
````

```math
\gamma_{01}
```

### テンソル積
````markdown
```math
\ket{0} \otimes \ket{1}
```
````

```math
\ket{0} \otimes \ket{1}
```

### 複素共役
````markdown
```math
\gamma ^\ast
```
````

```math
\gamma ^\ast
```

### エルミート共役
````markdown
```math
U^{\dagger}
```
````

```math
U^{\dagger}
```


<a id="#ref"></a>
# 参考文献
- [QiitaのMarkdown記法10選](https://qiita.com/TakoTree/items/f1c050c2cad5e01cd482)
- [Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
- [Qiita用MathJaxマクロ集](https://qiita.com/Baruim/items/89b99bb80bf4d4fb15ba)
- [MathJaxの使い方](https://www.eng.niigata-u.ac.jp/~nomoto/download/mathjax.pdf)
29章 不完全データの統計処理

# 欠損値の発生メカニズム
- MCMR
欠損がランダムに生じるパターン。統計量が完全データの性質と似通る傾向がある

- MAR
欠損が観測データに依存して生じるパターン

- MNAR
欠損が（本来得られていたはずの）欠損データの値に依存して生じるパターン

# 欠損値の扱い
- CC（complete case）解析
欠損値が生じている場合、欠損のないデータのみを使って解析をする方法
使えるデータ数がかなり少なくなってしまうケースが多いが、欠損データが少ない場合はこちらを推奨
MCMRはこちらを推奨

- AC（available case）解析
欠損値が生じているデータも使えるデータはすべて使う方法
MARの場合はこちらを推奨
  - 平均値代入
  - 回帰代入
  - Hot Deck法
類似のデータを探してきて代入

# 正規分布による推測（一変量正規分布）
MCMRの場合は、観測データのランダムネスが保たれるためそのまま観測データのみを使って問題はない
MNARの場合は欠損の理由を加味した分析が必要
c以下のデータのみが得られた場合、cを超えたデータ数が判明している場合は打ち切り、判明していない場合はトランケート

- 切断正規分布
https://bellcurve.jp/statistics/blog/18075.html
https://ja.wikipedia.org/wiki/%E5%88%87%E6%96%AD%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83

# 例1
(29.2)式に当てはめて計算
m=8の平均値は370/8 = 46.25
$ \Phi(a^0) = \Phi((60-46.25)/10) = \Phi(1.375) = 0.916 $
$ \varphi(a^0) = \frac{\exp(-1.375^2)}{\sqrt2\pi} = 0.155 $

$ \mu^1= \frac{1}{10}(370 + 2*(46.25 + \frac{0.155}{1-0.916}*10))=49.64$

...

$ \mu^3 = 50.05 $
...
$ \mu^6 = 48.65 $

# 正規分布における推測（2変量正規分布）
- MCMRのときは、削除法を使用して観測データの標本平均を$\mu_Y$の推定値とするか、回帰直線を使用して推定する。回帰直線を使用した方法では、標準偏差が低く、相関係数が高いyを推定してしまうデメリットがある。
- MARの場合は、回帰直線を使用する方法で$\mu_Y$を推定する。

# 例2
回答のとおり

#EMアルゴリズム
https://ocw.u-tokyo.ac.jp/lecture_files/engin_01/4/notes/ja/D4-GaussianMixture.pdf

# 例題
(1)
テスト1の結果をX、テスト2の結果をYとする二変量の問題とみる。
Xの点数が一定以上のものは、テスト2の結果が結束しているとしてみることができるため、欠測メカニズムはMARである。
MARの性質として、平均値を過小評価、相関係数を過小評価する傾向にあるため、答えは5（p177 図29.1参照）

(2)
回帰直線を使用してテスト2が免除された人たちのYの値を予測している。p284の記載のとおり、平均値は偏りなく推定できるが、相関係数が高く出てしまう。答えは２
末尾再帰と再帰

## 再帰関数
自分自身を呼び出す関数.
問題を小さな部分問題に分割し、それらを解決するために同じ関数を再帰的に呼び出す方法.

## 末尾再帰
再帰呼び出しがその関数の**最後**で行われる特殊な形式.
再帰呼び出しが他に何もせずにただ返される形.
→いくつかのプログラミング言語では最適化が行われ、スタックの使用量を削減できる可能

## コード例
階乗計算：
### 再帰関数
```
function(n)
    if(n==1)
        return 1
else
    n*return function(n-1)
```
![截屏2024-01-15 8.43.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941840/96f9ec6f-31b8-51f2-c848-85ce9d6924a9.png)
スタックの深さが増え続けると、スタックオーバーフローが発生し、プログラムが異常終了する可能。

### 末尾再帰関数
```
result=1
function(n,result)
    if(n==0)
        return result
    else
        return function(n-1,n*result)
```
![截屏2024-01-15 8.43.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941840/3541fdb7-1d8b-8eca-fcb2-a73b5d15bb79.png)
スタックの使用を最小限に抑える効果がある(一部のプログラミング言語やコンパイラ)
## C言語
C言語は末尾再帰関数を書けるが、最適化処理しない。スタックの使用量を削減するなどを実現できないはず。
ユークリッドの互除法を使った最大公約数を求めるプログラムを実装しました

ユークリッドの互除法を使って最大公約数を求めるPythonプログラムを実装しました。

```Python
###########################
## ユークリッドの互除法
##########################

input_line1 = input("MとNを、M Nの形式で入力してください\n")
array1 = input_line1.split(' ')
M = int(array1[0])
N = int(array1[1])
if M < N:
  tmp = N
  N = M
  M = tmp

while True:
  d = M % N
  if d == 0:
    print(N)
    break
  M = N
  N = d
```

試しに、M = 40 N = 16で実行します。

![uuu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/fbef1d47-4281-9348-a191-4ed62b169adb.jpeg)


実際に計算すると
>40 % 16 = 8
>16 / 8 = 0
>最大公約数は8ですね