OmniAICreator/Qiita-1.07M huggingface dataset:
文系大学生がスタートアップに新卒入社して半年経ったので振り返る

こんにちは！ジャックです！
外国語大学の23卒として今年の4月に都内のスタートアップに入社し、半年ほど経過したのでどんな業務を行なってきたか振り返ろうと思います。

## 前提
新卒として入社したとはいっても内定者インターンで一年弱働いておりました。
エンジニアとして全くのノースキルで入社したというわけではないのでご承知おきください。入社時のスペックを以下に書いておきます。

* 内定者インターンとしてRailsでAPI開発を担当(1年弱)
* Web制作会社でインターン経験あり(1年強)
* 0→1のMVPまでの新規開発
* Reactで個人開発の経験がはあるが、実務経験はない
* API, DB設計は数回行ったことがある
* インフラはさっぱりわからない
* 実務で使用したことのある技術: Ruby, Rails, Rspec, HTML, CSS, WordPress, jQuery, Git, GitHub

バックエンドの開発はたまに先輩にサポートいただきながらですが、ある程度一人称で開発ができる程度のレベルでした。

API以外にもJobやメーラーの作成などバックエンドのタスクは色々こなしたのかなぁという印象です。

### 開発環境

会社の規模やエンジニアチームなどの開発環境は以下の通りです。

* 3期目のスタートアップ
* 社員数は20名ほど(副業や業務委託など含めると100名弱)
* 事業は2つあり、SaaS事業と別の事業
* エンジニアチームのメンバーは5〜7名(うち正社員は自分含め3名、副業が2〜4名)
* 開発手法はアジャイル

上記の通り、正社員のエンジニアは自分含め3名しかおりません。
そのため、一人ひとりの裁量が大きく自分次第で色々なことを任せてもらえます。

## 半年でやってきたこと

4月からの半年で行ってきたことは主に以下の通りです。

* KPI測定をするために必要なデータを出力するjobの作成
* ユーザーヒアリング
* Vue2系からのReactへのリプレイス(責任者)

上記以外にもクライアントから個別で依頼されたデータを出力するためのスクリプトを書いたり、プロダクトマニュアルの作成・ディレクションを行ったりと細かいタスクもしてきました。

中でも大変だったのは2つ目と3つ目のユーザーヒアリングとフロントのリプレイスです。

### ユーザーヒアリング

スタートアップということで開発のタスクが一時的に少なくなってきたり、リソースの問題などで新卒のエンジニアである私がユーザーヒアリングを行うことになりました(笑)

ヒアリングって質問するだけでしょ？ってやってみる前は思っていましたが、実際は全然違いました。やってみると

* どういったところにユーザーは課題に感じているのか
* どのように質問すれば本質的に解決したい課題を聞き出せるのか

という一見簡単そうに見えることがとても難しく、全然できなかったのを覚えています。

また、質問した内容の回答に対して深掘りをしないといけないのですが、ドメインに関する知識も全くないせいで、ヒアリングをしても「へ〜そうなんだ」と思うだけでインサイトを得ることが全然できませんでした。

ヒアリングは2ヶ月ほどしかしていませんが、PdMって偉大なんだなぁと実感しました(笑)

結局チームの体制が変わったりフロントのリプレイスを行うということで、私はヒアリングをすることはなくなり、開発業務にもどりました。

### フロントのリプレイス

vue2系が2022年でサポートが終了するということでリプレイスプロジェクトが立ち上がりました。
当初は3系にする流れでいたのですが、私が「いや、Reactでもいいんじゃないですかね？」と提案し、色々協議した結果3系ではなくReactにリプレイスすることになりました。

社内にフロントに強い人材がおらず、Reactを触ったことがあるのが個人開発程度ですが私しかいなかったため、フロントのリプレイスの責任者は私が担うことになりました。

リプレイスなんてもちろんやったことありませんし、Next.jsも触ったことなく一から全部調べ上げました。どのようにリプレイスを進めれば安全に素早く進められるのか。どのライブラリ等の技術を選べばいいのか。

幸いにも副業の方がReactに詳しかったため、まとめてきたものをレビューしていただくことができ、設計方法やライブラリ等の技術選定を決めることができました。

自分が先頭を切って技術のキャッチアップをしながらそれを教えたり、進捗管理やタスクの切り出しなど大変ですが、とても貴重な経験をさせていただいて感謝しております。

また、今まではただのメンバーとして開発をしていましたが、責任者ということで「自分がなんとかするぞ」と意識が変わったり、マネージャーから見てメンバーは「こう動いてくれると助かるな」などがわかり、社員としての視座が一段上がった気がしています。

まだ絶賛リプレイス最中ですが、なんとかしてこのプロジェクトを完遂しようと思います。

## 最後に

拙い文章ですが、最後まで見ていただきありがとうございました。
スタートアップでは大変なことも多いですが、その分プロダクトを作り切った時や契約報告をもらった時はとても嬉しいです。

エンジニアとしてまだ半人前ですが、プロダクト、会社と共に成長していつの日か上場できるように邁進して参ります。
Pyrebase4チートシート

ほぼ https://github.com/nhorvath/Pyrebase4 にある内容と一緒です。
firebaseは無料で使えるので趣味グラマにはかなり良い選択肢だと思います。

今回はそのfirebaseのpython版ライブラリであるpyrebase4の基本構文をまとめておきます。

### おまじない
```python
config = {
    "apiKey": "***",
    "authDomain": "***",
    "databaseURL": "***",
    "storageBucket": "***"
}

firebase = pyrebase.initialize_app(config)
db = firebase.database()
```
これらのconfigは概要→登録したアプリ内の設定で見ることができます。

### データ作成

#### push
```python
data = {"name": "Mortimer 'Morty' Smith", "age": "17"}
db.child("users").push(data)
```
#### set
```python
data = {"age": "17"}
db.child("users").child("Morty").push(data)
```
pushとsetは両方ともデータを作成しますが、pushはランダムな自動生成のkeyを使い、setは自分で用意したkeyを使います。後で探すときにどちらが良いかの話だと思います。

オンラインゲームのようなcreateが頻発するような場合は前者で、wikiのような管理された情報の場合は後者な気がします。

## データ変更
```python
db.child("users").child("Morty").update({"name": "Mortiest Morty"}) #update
db.child("users").child("Morty").remove() #remove
```
childでkeyを指定している部分がミソです。

```python
data = {
    "users/Morty/": {"name": "Mortimer 'Morty' Smith"},
    "users/Rick/": {"name": "Rick Sanchez"}
}
db.update(data)
```
このように複数のデータを変更することもできるようです。その場合データは辞書の辞書で、辞書キーはデータへのpathのような形になっています。

## データ検索
基本的に```child().get()```でデータの検索結果オブジェクトが取れるようです。
検索結果オブジェクトにはval, key, eachが存在します。

- val: 検索結果のvalueを出します
- key: 検索結果のkeyを出します
- each: 検索結果1つ1つに対して上の処理を行えます

```python
users = db.child("users").get()

print(users.val()) # {"Morty": {"name": "Mortimer 'Morty' Smith"}, "Rick": {"name": "Rick Sanchez"}}
print(users.key()) # users

for user in users.each():
    print(user.key()) # Morty
    print(user.val()) # {"name": "Mortimer 'Morty' Smith"}
```
これを見ると、子要素のデータのkeyはeachでしか取り出せないような形に見えます。

と思っていたらshallowを使えば良いらしいです。
```python
all_user_ids = db.child("users").shallow().get() # ["Morty", "Rick"]
```

## 検索クエリ
もちろん複雑な検索もできます。ただかなり最低限のものに限られているようです。

```python 
# ランキング: 名前要素でソートして、最も若い順に3件取り出します
# 例えば作成された日付が早い順や、人数が少ない順とか
users_by_name = db.child("users").order_by_child("name").limit_to_first(3).get()

# イコール: scoreが10と等しいもののみを取り出します
# bool値に使いやすそうです
users_by_score = db.child("users").order_by_child("score").equal_to(10).get()

# 3番目から10番目を取り出します
users_by_score = db.child("users").order_by_child("score").start_at(3).end_at(10).get() 
```

これらはfirebaseにあらかじめindex登録をしておく必要がありそうです。
詳細は以下の記事

https://stackoverflow.com/questions/34968413/error-index-not-defined-add-indexon

要はfirebaseに以下のようなルールを追加しておきます

```
{
  "rules": {
    "rooms": {".indexOn": ["player_count", "is_private"]},
    ".read": true,
    ".write": true
  }
}
```

## その他
他にもローカルファイルの画像をfirebase上に上げられるstorageなどがあるっぽいです。
自分はいらないので割愛しますが、画像が扱いやすいのはかなりアドバンテージな気がしました。

以上が基本的なチートシートになります。
Go 1.22でのForループの変数スコープの変更について

## はじめに
最近、Goのブログで「[Fixing For Loops in Go 1.22](https://go.dev/blog/loopvar-preview)」という記事が公開されました。この記事では、Go 1.22でのforループの変数スコープに関する変更について詳しく説明されています。
以下、その内容を紹介します。

## 記事の内容
Goのコード書いていて、forループの変数スコープに関する問題に直面したことはありますか？
Go 1.22では、この問題に対する重要な変更が導入されます。

## 問題点
Goでの一般的なミスの一つは、**ループ変数への参照をその反復の終了後も保持してしまうこと**です。
これにより、予期しない動作が生じることがあります。

例えば、以下のコードを考えてみましょう。

```go
package main

import "fmt"

func main() {
	done := make(chan bool)
	values := []string{"a", "b", "c"}
	for _, v := range values {
		go func() {
			fmt.Println(v)
			done <- true
		}()
	}
	// すべてのゴルーチンが終了するのを待つ
	for _ = range values {
		<-done
	}
}
```

このコードでは、3つのゴルーチンがすべて同じ変数vを出力しているため、通常は「c」、「c」、「c」と出力されます。
しかし、期待される出力は「a」、「b」、「c」のいずれかの順序です。

## 修正
Go 1.22では、これらの変数のスコープをループ全体のスコープではなく、反復ごとのスコープに変更する予定です。これにより、上記のような問題が解消されます。

新しいセマンティクスは、go.modファイルでgo 1.22以降を宣言するモジュールに含まれるパッケージにのみ適用されます。これにより、後方互換性が確保されます。
Javaで「格納されている文字列の長さを変更する」の動作を確認してみた

# 概要

Javaで「格納されている文字列の長さを変更する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/stringbuilder/index9.html

# 実装

以下のファイルを作成しました。
```JSample9_1.java
class JSample9_1{
  public static void main(String[] args){
    StringBuilder sb = new StringBuilder();

    sb.append("ABCDEF");
    System.out.println("[" + sb.toString() + "]");
    System.out.println(sb.length());

    sb.setLength(3);
    System.out.println("[" + sb.toString() + "]");
    System.out.println(sb.length());

    sb.setLength(6);
    System.out.println("[" + sb.toString() + "]");
    System.out.println(sb.length());
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample9_1.java 
$ java JSample9_1 
[ABCDEF]
6
[ABC]
3
[ABC]
6
```

# まとめ

何かの役に立てばと。
Tips: Vimのterminalコマンドが便利

## はじめに
vimには`terminal`というコマンドが存在します。
この`terminal`コマンドは、実行するとターミナルをVim内で開くことができます。
この記事では、この`terminal`コマンドの使い方や便利な機能について紹介します。

## terminalコマンドの便利な使い方

### ターミナルにコマンドを送り、結果を出力する
`terminal`コマンドは、第一引数に実行したいコマンドを指定すると、実行結果を出力することも可能です。
例えば以下のようにコマンドを実行すると、現在のディレクトリ内にあるファイル一覧を表示することができます。

```
:terminal ls
```

また、結果はテキストとして表示され、他のファイルと同じように結果もVimでそのままアクセスできるため、ヤンクなども
Vimのコマンドを使って簡単にすることができます。

### ターミナルにコマンドだけ送る
`terminal`コマンドは、`++close`オプションを渡し、第一引数に実行したいコマンドを指定することで、実行が終が終わると同時にそのままウィンドウを閉じるようにすることもできます。
例えば以下のように`tig`コマンドを実行すると、tigを用いてgitを操作することができ、そのままtigを閉じると同時にウィンドウも閉じます。

```
:terminal ++close tig
```

### おまけ
`terminal`コマンドは、`vert`を使うことでターミナルウィンドウを垂直に分割することができます。
これを用いると、横に結果などを出しながらコードを書いたりすることができるので便利です。

## 最後に
このように、terminalコマンドを使うとVim上でも大抵の操作が可能です。
Vimだけあればtmuxなども使わず色々なシーンでの開発をすることができます。
ChromeのバージョンアップでERR_SSL_PROTOCOL_ERROR

Chromeのバージョンアップ(116/117)で楽天FXの取引画面が「ERR_SSL_PROTOCOL_ERROR」で開けなくなった。
原因はサーバー運営者側の対応漏れ（まだSHA-1を使用している）と思われますが、
ユーザーサイドの応急措置を調べたので、他のサイトとかでもこのエラーになった場合の参考になればと記載いたします。

①chrome://flagsとアドレス欄（検索欄？）に入力
②「Allow SHA-1 server signatures in TLS.」を検索
③「Enabled」を選択して再起動
Tanzu Service Meshのトレース情報をAria Operations for Applicationsに転送する

三番煎じくらいな記事。
Tanzu Service Mesh(以下TSM)のトレース情報をAria Operations for Applications(以下AOA)に転送する方法は以下あたりに紹介記事がある。
- [Enabling Distributing Tracing in TSM and Integrating with Tanzu Observability](https://github.com/rroquevmware/TO-TSM/blob/main/README-tsm-to.md)
- [Tanzu Service Meshの分散トレーシングをWavefrontにフォワードする](https://blog.lespaulstudioplus.info/posts/4/)

ただ、細かい説明が記載されていなかったので、ここでは補足説明を付けながら試してみる。

TSMでIstioをインストールすると、`istio-system`というNamespaceのConfigMapの`istio`の中に、以下のような設定を見つけられる。
```yaml
data:
  mesh: |-
    accessLogFile: ""
    defaultConfig:
      discoveryAddress: istiod.istio-system.svc:15012
      proxyMetadata:
        ISTIO_META_DNS_AUTO_ALLOCATE: "true"
        ISTIO_META_DNS_CAPTURE: "true"
      tracing:
        zipkin:
          address: zipkin.istio-system:9411
```
`address: zipkin.istio-system:9411`は、[Istioのドキュメント](https://istio.io/latest/docs/ops/integrations/zipkin/)にある、`--set meshConfig.defaultConfig.tracing.zipkin.address=<zipkin-collector-address>:9411`の部分であり、これでZipkinへ転送する場合の送信先を指定している。
デフォルトでは`zipkin.istio-system`、すなわち`istio-system` Namespace内の`zipkin`というサービスになっている。
このサービスを作成し、AOAのWavefront Proxyのアドレスを書いてあげることで、
```
Istio -> Wavefront Proxy -> AOA
```
という形でAOAにトレーシングデータが転送できるようになる。

最初に、Istioのトレーシング機能を有効化する。
```yaml
$ kubectl edit cm istio -n istio-system
：（省略）
    enableTracing: true
：（省略）
```
次にトレーシングのサンプリングレートを100％に引き上げる
```yaml
$ kubectl edit deploy istiod -n istio-system
：（省略）
        - name: PILOT_TRACE_SAMPLING
          value: "100"
：
```
最後に、`Service`を作成する。
Wavefront Proxyの`Service`がインストール方法によって異なるため、確認しながら作成する。
Namespaceと名前を見つけ出す。
```sh
$ kubectl get svc -A |grep wavefront
tanzu-observability-saas   wavefront-proxy-tanzu                            ClusterIP      100.69.23.13     <none>         2878/TCP,9411/TCP                            9d
```
Tanzu Mission Control(以下TMC)のIntegration機能を使うと、上記のようなNamespaceと名前で作成される。
次にServiceを作成する。TMCのIntegration機能を使っていない人は`externalName`で指定するServiceの名前が変わる点に注意。
```yaml
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: zipkin
  namespace: istio-system
spec:
  type: ExternalName
  externalName: wavefront-proxy-tanzu.tanzu-observability-saas.svc.cluster.local   
EOF
```
先程の`istio-system`というNamespaceのConfigMapの`istio`の中のZipkinの参照先が`zipkin.istio-system:9411`だったため、`zipkin.istio-system`の通信を`wavefront-proxy-tanzu.tanzu-observability-saas.svc.cluster.local`に転送する形で`externalName`で作成する。
なお、`wavefront-proxy-tanzu.tanzu-observability-saas.svc.cluster.local`は上での`kubectl get svc`の結果を見ると分かるが、デフォルトで9411ポートを利用しているので、ポートの変換などはせずにそのまま利用できる。
また、Serviceを作りたくない人は、`istio-system`というNamespaceのConfigMapの`istio`の中の`address: zipkin.istio-system:9411`を直接`wavefront-proxy-tanzu.tanzu-observability-saas.svc.cluster.local`に書き換えても動作する。

`Service`作成後、しばらくするとAOAの`Applications` -> `Operation Dashboard`などからZipkinというApplication名でトレース等が確認できるようになる。
![1696238288757.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/472c35e2-c0bd-5a8e-57de-d4db9e0b472a.png)
[Laravel] 電話番号のバリデーションルール書き方

## やりたいこと

- 以下の条件で、携帯番号のバリデーションを行う
    - 数字11桁
    - 070/080/090 で始まる
    - ハイフンなし
    - **(例: 08012341234)**

## バリデーションルールの書き方

### 書き方は主に2パターン

#### 1. `パイプ(|)区切り` パターン

```
^(070|080|090)\d{8}$
```

「先頭が 070, 080, 090 のいずれか」+「半角数字8桁(半角数字で終わる)」

#### 2\. `[abc]のいずれか` パターン

```
^0[789]0\d{8}$
```
「先頭0始まり」+「7, 8, 9のいずれか」+「0」+「半角数字8桁(半角数字で終わる)」

### 実際のコード例

#### パイプ区切り パターン

- パイプ区切りの正規表現を使えるように、配列形式でバリデーションを定義する
- バリデーションルールをパイプ区切りにしてしまうと、正規表現との区別ができずエラーになる

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class PhoneNumberController extends Controller {
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'phone_number' => ['requied', 'string', 'regex:/^(070|080|090)\d{8}$/'],
        ]);
        
        // do something...
    }
}
```

#### [abc]のいずれか パターン

- バリデーションルールを配列形式で定義しなくてよいため、見た目がすっきり
- 正規表現も、より短くシンプルに定義できる

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class PhoneNumberController extends Controller {
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'phone_number' => 'required|string|regex:/^0[789]0\d{8}$/',
        ]);
        
        // do something...
    }
}
```

### 結論

1: `['requied', 'string', 'regex:/^(070|080|090)\d{8}$/']`
2: `'required|string|regex:/^0[789]0\d{8}$/'`

後者のほうがムダがなく、短く書けそうです👍
現実的に少しでも副収入を得る方法を考える！



最近は、様々な原因で物価が上がってるというのがニュースになってます。
しかし、なかなか給料が上がらないのは厳しいとこですよね。

でも最近は副業OKの会社が増えており、政府も副業とかリスキリング（学びなおし）を推進しています。

ということで、今回は現実的に副収入を得る方法を5つ考えてみました。


1.WEB制作の案件を受注して普通に稼ぐ
WEB制作の知識を学習して、案件を獲得する方法。
プログラミングに比べ、学習がしやすく、かつ簡単。
この方法の一番の利点は、実力を付けることが出来ればその後の選択肢が様々広がることでしょう。

2.タスク案件をこなしまくる
クラウドワークスのタスク型案件をこなしまくって稼ぐ方法。
タスク型なら面倒な交渉も不要で、誰でも参加可能な案件が多いです。
タスクをまじめにこなし続ければ実績として積み上げていくことも出来るのでプロジェクト形式の案件を取る事にもつながるでしょう。

3.ブログで記事を書く（+セルフバック）
ブログを書いてアフィリエイト報酬・セルフバック報酬を獲得していく方法です。
無料で始めることも可能で、うまくいけばアフィリエイト報酬、最低でもセルフバックでお金を稼ぐことができる。

4.アンケートサイトで稼ぐ
サイトを通して送られてきたアンケートに答えるだけで、ポイントが貯まり、貯まったポイントを現金や商品券に交換できます。

5.ポイントサイトを利用する
普段の買い物をハピタスを通して行う事で、どんどんポイントが貯まっていき、貯まったポイントは現金に交換できます

各項目の詳しいやり方解説は下の記事にまとめています。
是非ご覧くださいませ。
https://web-create-kokusyo.com/load/extra-money/
AWS未経験でAWS Certified Cloud Practitioner (CLF-C02) 受験してみた

## はじめに
2023年の9月末までの目標として「AWS Certified Cloud Practitionerを取得する」を設定していたので、ギリギリになってしまいましたが受験したのでそのことについてまとめています（2023年9月末時点の情報）。

私はAWSの経験がほとんどなく、社内のハンズオンで少し触ったことがある程度です（Azureは少しですが経験があります）が、合格することができました。

## 試験について
問題数：65問
試験時間：90分

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3057699/fc73af31-6363-1437-36be-2da636ff051d.png)


## どんな準備をしたのか
- 参考書を読む
 [AWS認定資格試験テキスト　AWS認定 クラウドプラクティショナー　改訂第2版 (ＡＷＳ認定資格試験テキスト)](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88-%EF%BC%A1%EF%BC%B7%EF%BC%B3%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E5%B1%B1%E4%B8%8B%E5%85%89%E6%B4%8B/dp/4815622744)
 このテキストを1周しました（3日間）
　
- 模擬試験を解く
[【CLF-C02版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-4260/)
この問題を3周しました（6日間）

試験3日前からは1日に4時間くらい勉強するようにしていました。
模擬試験で初めて見る製品・サービスもあったので、やっておいてよかったなと思います。


## 受験した感想
想像していたよりは難しくなかったです。
これまでUdemyで受けた模擬試験は60%くらいしか取れておらず本番ももしかしたらこれくらいしか取れないかもと思っていたのですが、なんとか合格できました。


## おわりに
Cloud Practitionerの試験には合格できましたが、実際にAWSを操作したりすることはできていないので、実業務で使えるように引き続き勉強していきたいと思っています。
【SwiftUI】Menuに赤いボタンを追加する

# はじめに
SwiftUIのMenu内に「削除」ボタンを実装しようとした時に、
削除ボタンの色は赤くしたかったのでtintやforgroundStyleなどで色変更しようとしてもできなかったので方法を記録しておきます。

# 実装
Buttonのルールを`.destructive`にするとボタンが赤くなります
```swift
Menu {
    Button(role: .destructive) {
        // 処理
    } label: {
        Label("削除", systemImage: "trash")
    }
} label: {
    Image(systemName: "ellipsis")
}
.foregroundStyle(.secondary)
```

# ダメな例
```swift
Menu {
    Button {
        // 処理
    } label: {
        Label("削除", systemImage: "trash")
    }
    .foregroundStyle(.red)
} label: {
    Image(systemName: "ellipsis")
}
.foregroundStyle(.secondary)
```

# おわり
これ知らなかったです
NvidiaのUbuntu22.04コンテナ上でapt-get updateができない対応策

# 前書き
事象をメモするの忘れたので、ごめんなさい。
GPGとかいろいろやったけどコレだけだった。。。

# 環境
WSL2上のDockerでベースイメージはこれ
`FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04`

# 対応策

以下のようにupdateする前に`chmod 1777 /tmp`を追加する

```bash
FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04

RUN chmod 1777 /tmp \ 
	&& apt-get -y update \
		...
```

これでダメたら大抵システム時間が合っていないせいなので、WSL2上のシステム時間を合わせ、`/usr/share/zoneinfo/Asia/Tokyo:/etc/localtime:ro`をマウントすれば行ける
Windows で init.vim（.vimrc）を素早く Neovim でひらきたい

私は Neovim を使っています。Neovim の設定ファイルは `init.vim` で設定します。
この `init.vim` いつも行方不明になります（笑）。

というのも1年半ほど前から会社PCが Windows になりまして、 Windows の場合だと `init.vim` の場所が Mac と異っていた ＆ Neovim の設定が成熟してきていて、`init.vim` を修正する機会が少なってきているため、毎回場所どこやねん状態になっていました。

いいかげん、対策しようと思い、対策しました。

## "nvim init.vim へのパス" のコマンドを関数化する 

最初に結論を書くと `$PROFILE` に `editvimrc` という名前の関数を登録し、PowerShell で `editvimrc` を入力することで素早く `init.vim` を開けるようにしました。

登録した `editvimrc` 関数は下記の通りです。

```powershell:$PROFILE
# init.vim を neovim で開く
# Set-Alias だと nvim に渡すパスを含めてエイリアスを設定できないため、関数を定義している
function editvimrc {
    nvim $HOME\AppData\Local\nvim\init.vim
}
```

ここからは、上記にいたるまでの考えの流れをメモ書きしておきます。

### 読み込まれている init.vim の場所を特定する

まず、「`init.vim` の場所はどこやねん」を明らかにします。ChatGPTに聞きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960076/f2dc4e83-1cb1-b491-a511-0c7e2fe99cd2.png)

`:echo $MYVIMRC` を vim で実行します。
![~_works 2023-10-02 15.27.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960076/ff01e62d-fee3-9806-1365-525ea8b09fd0.png)
すると、`C:\Users\sasab\AppData\Local\nvim\init.vim` と表示されました。
なるほど。こりゃ自分で特定できる自信がありませんｗ。

### init.vim をひらくためのエイリアスコマンドを作成する

ついでに、PowerShell で `neovim init.vim へのパス` をエイリアス化するにはどうすれば良いか、ChatGPTに聞きました。

すると下記の回答を得られました。
![Vim 設定ファイルの場所 - Google Chrome 2023-10-02 10.04.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960076/ccc8276b-02d3-fc11-120b-9264078d83df.png)

この回答によると、一度関数化して、さらにエイリアスを設定するみたいです。
なぜ、この手順が必要なのか分からなかったので試しに `Set-Alias editvimrc nvim $HOME\AppData\Local\nvim\init.vim` を `$PROFILE` に設定します。

実行すると、`$PROFILE` 読み込みの時点でエラーを吐きました。
![__works 2023-10-02 10.03.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960076/b46536eb-ee9b-d395-3f69-b1f6338d7f18.png)
どうやらパスの部分がエイリアスの引数として正しくないようです。

ググると下記のQiita記事を見つけました。

https://qiita.com/ikanamazu/items/5f29e09b80849a4efa58

引数ごとエイリアスとして設定したい場合は、`Set-Alias` を使わずに関数化するようです。
なるほど。となるとChatGPTが最初に関数化して、エイリアスを貼っていたのも納得できます。

### 関数化しよう

ChatGPTは関数化後にさらにエイリアスを貼っていましたが、自分がやりたいことは関数化の部分だけで満たされます。

悩んだのは関数名（実行するときのコマンド）です。
ChatGPTの画像をよく見ると分かるのですが、最初私は `init.vim` ではなく `vim.init` だと思っていました。今後も同様の勘違いをしてコマンド自体が忘れ去られる可能性があります。

なので、ChatGPT がおすすめしてくれたように、vim 時代から親しみのある `vimrc` というワードをコマンド名にいれることにします。（editvimまでは覚えられそう&あとはtab補完でなんとかなるやろという考えもありました）

ということで記事の頭らへんで紹介した内容を `$PROFILE` に書きます。

```powershell:$PROFILE
# init.vim を neovim で開く
# Set-Alias だと nvim に渡すパスを含めてエイリアスを設定できないため、関数を定義している
function editvimrc {
    nvim $HOME\AppData\Local\nvim\init.vim
}
```

`$PROFILE` に書き込み後、PowerShell を再起動し、 `editvimrc` を実行すると見事に `init.vim` が Neovim で開けることを確認できました。

最悪、コマンドを忘れても、この記事を書いたことは頭に残っているのでコマンドが行方不明になることもなさそうですｗ。アウトプットはこういう意味でも大切だなーと思いました。
既知の問題: winter 24


# よく質問があるエラー

+ [Filter Your Report : trailhead](https://qiita.com/Keiji_otsubo/items/8eb54e0bb98d4126570e)
+ [winter24でのchatterメール通知の件](https://qiita.com/Keiji_otsubo/items/eee84486ce8f4d48d2e2)
+ [Add Business Logic - Automate with Flow Builder - No DONE フローの仕様が変わった](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007MZv2m)

:::note
Done button will be visible in Free-from mode not in auto layout please switch the flow in Free-from.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9c9cb6e2-546d-ddd6-db3e-6be066543140.png)


完了ボタンは、自動レイアウトではなくフリーフロム モードで表示されます。フローをフリーフロムに切り替えてください。
:::

+ [which is not available in my case (The "Done" icon) after which](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eqHHM)

# フローのエラー

+ [API 58 で動作していたフローが API 59 で例外をスローする](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007HNhqv)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/39bc6dd8-60e6-e0ca-b9b6-d53847fcddbe.png)

:::note
+ [「レコードを識別する条件を指定する」に設定された保存済みフローのレコード更新要素は、最初の編集時にオプション カードを評価しません。](https://issues.salesforce.com/issue/a028c00000uXbZVAA0/)


今のところ回避策はありません。
:::
【ServiceNow】sys_userの参照項目で姓名の表示順番を変更する方法

## 概要
ユーザーテーブル（sys_user）の参照項目でユーザーを選択した場合、OOTBでは「<名><姓>」で表示されます。
（表示値はOOTBで「名前（name）」になっています。）

日本では基本的に「<姓><名>」で表示されることが多いため、表示の変更方法を記載していきます。
※言語は「日本語」の画面で説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073316/399402ad-54e3-b637-4aa7-3348ddfd89c4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073316/5f0ff40d-a544-d9d7-116a-131e0ceb07c6.png)

## バージョン
サンディエゴ

## 実装方法
１．sys_userテーブルの「名前（name）」のディクショナリーを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073316/72477574-ea05-d280-1138-1a7a59e5f2f0.png)

２．計算された値のスクリプトを修正する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073316/cad53293-82ed-4b87-3fc6-7098cfe19d8b.png)

14行目の処理（OOTBのスクリプト）で「<名(first_name)><姓(last_name)>」の順で表示するように設定されている。
この１行の処理を逆にした以下のスクリプト挿入する。（画像の15行目）
```js
current.last_name + ' ' + current.first_name;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073316/3f5fbed2-64e6-c3a3-fc1e-c7231dccf3cd.png)


## 結果
ユーザーテーブル（sys_user）の参照項目が「<姓><名>」の順に表示されるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073316/acfb95e2-471e-a765-3022-b10369fb85bb.png)
スッキリわかるJava入門 実践編 第３版 まとめ - part7 -さまざまなファイル形式

# はじめに
こんにちは　◤●ㅅ●◥ﾉ

今回は代表的なデータフォーマットとその操作方法について学びました！

## 第７章　さまざまなファイル形式
### 1.データフォーマット
複数のデータについてどのような形式や順序で保存するかを定めたルール
→ __データフォーマット__
複数のデータをファイルに保存したり、ネットワークを経由して遠隔地に伝送する場合に役立つ
ファイル内のデータ構造→ファイルフォーマット
メッセージのデータ構造→メッセージフォーマットor電文フォーマット

### 2.CSV形式
複数のデータをカンマで区切って順に格納するデータフォーマット形式
→ __CSV__ と呼ばれている

書き込み...各データの合間にカンマ記号を出力する
読み込み...基本的に１文字ずつ読み進めながらカンマかどうかを判断する

### 3.プロパティファイル形式
CSV形式のカンマ区切りやスペース区切りでは力不足な場合
→Javaでは __プロパティファイル形式__ を用いる

形式には次のようなルールに従って、データをキーと値のペアで格納する
:star: プロパティファイル形式の主なルール
・データは文字情報として保存する
・各行には「キー」と「値」をペアとして、それらを「ペアデリミタ」で区切って記述をする
・ペアデリミタはイコール、コロン、空白のいずれかの文字
・シャープまたは感嘆符で始まる行はコメントとして無視される
・ファイルの拡張子には「.properties」が用いられる

プロパティファイル形式の読み書き
→java.utilパッケージにはPropertiesクラスが用意されている

プロパティファイル形式の書き込み
→PropertiesインスタンスにsetProperty（）でキーと値のペアをセットした上でstore()を呼び出す

実際にはより高度なjava.utilのResourceBundleクラスが多い
ResourceBundleはファイルに書き込む命令を備えていない他、以下の２点の特徴を持つ
1.プロファイルを「クラスパス上」から探し出せる
　:pencil2: クラスパスからプロパティファイルを探す
`ResourceBundle rb = ResourceBundle.getBundle(文字列);`
2.場合に応じて異なるプロパティファイルから値を読み取れる


### 4.XML形式
親子関係の構造（ネスト）である場合にXML形式の利用をする
XMLはタグと呼ばれる不等号記号で囲まれたラベルの中にデータを記述するフォーマット
→タグの中にタグをネストさせ親子関係の構造にすることも可能

JavaではXML形式のファイルを操作するためのAPIとしてJAXPが提供されている
javax.xml.parsersパッケージやorg.w3c.domパッケージなどから構成される比較的複雑なAPI

### 5.JSON形式
CSV以上XML以下のニーズに合うファイルフォーマットとしてJSONが存在している

:star:  JSON形式の主なルール
・必ずUTF-８という文字コードで記述する
・原則、どこでも開業できる（リテラルの途中を除く）
・文字列リテラルは二重引用符で囲む
・整数や少数はそのままリテラルとして表記できる
・null,true,falseはそのままリテラルとして表記できる
・[]内にカンマで区切られた値で、リスト構造を表す
・{}内にカンマで区切られたキー：値の記述で、マップ構造を表す

### 6.オブジェクトの直列化
Javaには１つの命令を呼び出すだけで、あるインスタンスの内容を丸ごとそのままバイト列に変換したり
逆にバイト列をインスタンスに戻す
→直列化という仕組みが備わっている

直列化は扱いに注意が必要、矛盾した状態で復元されてしまうことがある
→未然に防ぐためにシリアルバージョンUIDというクラスフィールドとして宣言しておく

## まとめ
複数のデータをカンマで区切って順に格納するデータフォーマット形式をCSV形式
さまざまな種類のCSVに対応するため、ライブラリを用いて読み書きすることが多い
タグを用いた記述でネストしたデータ構造を表現できるXML形式
JAXPというAPIを利用して読み書きできる
XMLより手軽でネストしたデータ構造を表現できるJSON形式
JSON-Pや各種のライブラリを用いて読み書きできる
直列化の仕組みを使うとインスタンスを丸ごとバイト列と相互変換できる
LPをコーディングする(特に特集記事など)に気をつけるべきこと

表題の通りLPコーディング時に気をつけるべきことを残します。

# フォント指定があった場合の対応
* web-fontをlinkタグでインポートする。
* importをする。
以下のサイトでフォントの検索ができるので、link or importで対応できる。
https://fonts.google.com/
※やり方は後日別の記事に書きます。

# metaタグのtitle, descriptionの内容をあらかじめ確認
* 後からでも別に問題はないけど、先に確認しておいた方がベター。
* パンくずリストがあった場合は、それも調整しておく。

# 既存のヘッダーやフッターが存在する場合
* 影響範囲も考えてsectionを作ること。
→ヘッダーやフッターにマージンが指定されていた場合は打ち消さないといけない。
その際に他の場所にも影響が及ぶ可能性があるので、最初に確認しておくとGoodかも。

# GoogleSpeedInsghtでスピードチェック
サイトが完成したらGSIでスピードチェックを行う。
合格表示されればOK
SEOに関しての分析や改善点も表示されるので、それを確認して修正するとよし。
https://pagespeed.web.dev/?hl=ja

# ローカル環境で実機確認できるように環境を作っておく
自分は作成せずVScodeの拡張機能LiveServerを使って確認していたんですがそれだと他のメンバー(特にメンターやチューターがいる場合)は実機で確認ができなくなってしまうので、作成しておくべき。
※作成方法は自分で作成してみてから、後日別の記事で書きます。

# altタグの入力漏れがないかの確認(SEOに関わってくる。)
imgを挿入する際は出来うる限りaltタグの記載をするべき。
デザイナーさんが作成した画像でaltのつけようがないものは空でもいいが、一旦確認するとベターかも。

# 環境依存文字がデザインにある場合は、文字コードでコーディングする方がベター。
ブラウザ差異やフォントファミリーでの差異が発生する可能性があるので、あらかじめ文字コードで記載しておくとgood
※🅰️という文字を打ちたかったのですが、デザインカンプからコピペしたものと、(えー)と打って変換したものが別のもので、実機確認した時に表示に差異が発生した経験があります。
https://gray-code.com/html_css/list-of-symbols-and-special-characters/

# 大元のサイトがワードプレスで作成されている可能性もあるため、cssをbodyタグの中で読み込む処理を書く必要ありかも。
これはまだ経験がないのですが、クライアントによってはこういう指定をしてくることもあるので、可能性を頭に入れておいた方が良い。

# まとめ
長くなりましたが、以上が私が最初に担当した案件で得たLPコーディング時の注意点です。
また、他の案件を通じて別記事として更新していけたらと思っています。
Certified Kubernetes Security Specialist(CKS) 受検記録


Certified Kubernetes Security Specialist(CKS) に合格しましたので、受検記録を投稿します。

## 受検までにやってたこと

### KodeKloud

CKAD, CKA では Udemy で講座を受けていましたが、同じ講師の方が自身でラーニングプラットフォームを展開するようになりました。  
そんな KodeKloud というサブスクリプション型のサービス内の CKS 対策コースを中心に勉強していました。

https://kodekloud.com/courses/certified-kubernetes-security-specialist-cks/

### Killer.sh

CKA/CKAD/CKS の受検資格を購入すると、2回分の [Killer Shell](https://killer.sh/) での模試がついてきます。

https://training.linuxfoundation.org/announcements/linux-foundation-kubernetes-certifications-now-include-exam-simulator/

Killer Shell の模試は本番より難しく設定されているので、これを完璧にすればほぼ安心といったところです。  
本番は2時間で15~6問の設問ですが、こちらは2時間で22問くらいあり、時間的にもかなりタイトになります。  

### 先達の記事

特に以下の記事にお世話になりました。公式で提示している試験範囲は結構ぼんやりとしていて「結局何ができるようになればいいのか？」が分かりづらい部分があります。そういった部分を補完する意味合いでとても役に立ちました。

https://zenn.dev/cloud_ace/articles/26aa0e5ee9d825

https://github.com/abdennour/certified-kubernetes-security-specialist

## 受検環境

2年前と大きく変わったのが試験環境。  
2年前はブラウザ上にターミナルが表示される形でしたが、昨年からブラウザ上にLinuxの仮想デスクトップが表示され、公式ドキュメントの閲覧やメモ、ターミナルといった全ての操作は仮想デスクトップ内で行うものとなりました。  
そのため、かつてやっていた公式ドキュメントの便利ブックマーク作成は意味をなさなくなりました。

他にも、
- 仮想デスクトップであるがゆえのラグ（耐えられないほどではない）
- コピーペーストのクセ（macの場合`cmd+C/V`は使えず`ctrl+shift+C/V`となります）
- 1画面に問題が表示されるカラムと仮想デスクトップのエリアを表示するため、画面が小さくなる
  - ブラウザも小さくなるためドキュメントが見づらい

といったやりづらさを感じました。

とはいえ、以下のようなメリットも感じました。
- 仮想デスクトップではアクセスできるウェブページが制限されている（らしい）ので、公式ドキュメント内のリンクからうっかり開いてはいけないページを開くなどといった事故がなくなる
- デスクトップなのでターミナルのウィンドウを複数開ける

ほか、差分については以下の記事が詳しいです。

https://itnext.io/cks-cka-ckad-changed-terminal-to-remote-desktop-157a26c1d5e

## 結果

![Screenshot 2023-09-30 at 12.27.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66988/27ef06a4-f05b-9a76-af3d-3dfbcb5a254f.png)

76点で合格。CKA, CKAD の時と比べると低い。

## 感想

CKA, CKAD とに比べ、System Hardening やコンテナランタイム、コンテナの脆弱性など、Kubernetes 以外の部分も多く含まれるため、試験対策は結構ハードな印象を受けました。

合格という観点では、KodeKloud の講座を一通りさらって、Killer Shell の模試で実践していけば合格はすると思いました。逆に言うとそこまでやらないと安定したラインには行かないかもな...という感じ😇

CKAの取得から2年開けてしまったので、来年CKA, CKADがexpireします。気が向いたら再認定するかも。
コードレビューしましょう

## チェックリスト
- 見た目の美しさ
    - インデントやタブ、改行が適切か
    - デザイン通りか、違和感がないか
    - コーディング規約に準拠しているか
    - 不要なコードが残ってないか
- 動き
    - 仕様通りか
    - 負荷が大きくないか
    - N+1などあるか
    - 別の影響されるところがあるか
    - 動作問題ないか
    - ロジックが正しいか
    - 新しいバグが追加されていないか
    - テスト環境に確認必要か
- 可読性
    - 名付けは適切か、 
        - 関数名は機能を明確に表したものになっているか
        - 変数名から内容が予測できる名称になっているか
        - 長さは適切か
    - 処理や制御がわかりやすくになっているか、
    - ネストしすぎていないか
        - 階層最大3になるか
    - コメントは明確か
        - 簡潔なコメントか
        - 必要に応じて参照のリンクがあるか
        - FIXMEやTODOなど場合、ちゃんと明確にされているか
            - 例：TODO:内容、タスクリンク、作成者名前
    - コードの構造が明確であるか
        - 不要なループはないか
        - 適切な例外処理が入っているか
- 拡張性・保守性
    - DRYを意識できているか
        - 共通化できているか
        - より良い方法にリファクタリングできているか
        - 関数化ができているか、
    - セキュリティ面での欠陥がないか


## 意識ポイント
- わからない場合は質問する
- いいコードと思う場合褒める
- コメントに[must][imo][nits][ask]などの先頭付けて、コミュニケーション効率化にする
- 根拠を示す
- フレンドリーで具体的
- あまり小さなことにこだわらない
- 改善すべき点がある場合言う
eBay rlogid を見つける方法

:::note warn
2023年10月2日の情報です。
:::

### 対象
- eBay の Error Response から rlogid を見つける方法を探している
- Error Response までは出力できている

### res 入力で ↓ までは頑張って出してください

```
#<Net::HTTPOK 200 OK readbody=true>
```

### ヘッダーの中に答えはある

```
res.each_header.to_h
```

### 青枠部分に rlogid がある
![rlogid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158349/d21e9a1b-02e0-8af2-1f3d-0ab37a2876e6.png)
selesforceのフロー、日付を使い何日後に処理をする

selesforceを構築する中で、レコードの日付になったら、メールを送ったりtodoを作ったりしたい要望があると思います。

その時に簡単に、レコードの日付や時間項目を対象に、何日後、何ヶ月後にその後の処理を実行できるコンポーネントがあります。


それが一時停止のコンポーネントです。
使用できるフローの種類としては、スケジュールフロー、自動起動フロー（Apexかプロセスビルダーで呼び出し可能）でのみ今は使用できる様です。

今回はスケジュールフローで作成します。
クイック検索＞フロー＞新規フローでスケジュールフローを選びます

![スクリーンショット 2023-10-02 15.12.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904276/3afc20c4-b95a-23f8-9383-6ee469980891.png)

その後スケジュールフローの開始日、開始時刻頻度を選択します。
![スクリーンショット 2023-10-02 15.14.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904276/a7b891ca-0411-d832-dd83-e2330a3a181e.png)

※スケジュールの起動時間の考慮として、他のスケジュールの起動時間が被るとうまく起動しなかったことがるので、必ず起動時間はずらして設定した方がいいです。

起動するオブジェクトを選択します。

![スクリーンショット 2023-10-02 15.24.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904276/6522c94c-eb03-9bf7-3254-7907615e40cc.png)

取引先オブジェクトを設定します。
![スクリーンショット 2023-10-02 15.25.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904276/bead8846-299c-4b5e-42c7-9141f48b4101.png)

今回は特に起動条件は設定しませんが、なるべくスケジュールや更新は起動しない構造にした方が長く環境を構築する上では安全です。
（処理が多くなると、影響範囲が多くなりエラーが発生する可能性が高くなります）

一時停止のコンポーネントを選択して、設定して行きます。
![スクリーンショット 2023-10-02 15.16.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904276/20478802-e2cb-4dbe-8933-47ff8f2cdef9.png)


一時停止の表示ラベルや、分岐のラベル名を設定してからイベントを再開のタブを選択してください。

![スクリーンショット 2023-10-02 15.18.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904276/3ea037b8-d9aa-2af5-4da3-8dcbb4917c9b.png)


以下を設定
基準時刻：取引先.最終更新日
オフセット：１０
オフセット単位 (Hours または Days)：Days
![スクリーンショット 2023-10-02 15.29.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904276/9132bffe-cc92-e29f-bf20-3074fc4ad8b7.png)

一応取引先を更新する処理を更新日の１０日後に実行する様に設定しておきます。
![スクリーンショット 2023-10-02 15.33.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904276/66e864de-eb0d-2b0b-0489-5294d1458d15.png)



保存することを忘れない様にしまししょう！

![スクリーンショット 2023-10-02 15.31.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904276/7f1386e7-babf-81af-79b0-a5e988fd6ef5.png)

有効化して動かして行きます。

すぐにテストしたい場合はスケジュールの起動の部分を現在時刻に合わせて、直近で起動する様にしてください。
設定した流れだけ確認したい場合はデバックで確認してください。

起動後に一時停止しているか？確認したい場合
クイック検索より「一時停止中の失敗したフローインタビュー」を検索してクリックします。
![スクリーンショット 2023-10-02 15.45.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/904276/d8289212-c80a-73e3-d5ed-545daf520b55.png)



ここで対象のフローの名前のものがあれば起動成功です。
この後の処理は、更新日の１０日後に処理されてフローインタビューのレコードが削除されます。

フローインタビューが対象のレコードと紐づいているか？フローで取得できるので、興味があれば調べて取得してみてください！

ではまた！

salesforceの解説用動画をUdemyで作っています。
興味のある方は見てもらえたら嬉しいです。
よろしくお願いします！

https://www.udemy.com/course/salesforce-basics-j/?referralCode=4200CF5D86BBE3ABF2D4
UnityでHTTPなAPIにGETやPOST

UnityでHTTPのやつにPOSTやGETするメモ

3秒ごと呼び出したら、遅延したので、リアルタイムは弱そう

強くする方法あるのかな？？


``` C# Api.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.VisualScripting;
using UnityEngine.Networking;
using System.Text;
public class Api : MonoBehaviour
{
  public const string API_HOST_URL = "http://127.0.0.1:5500/";
  string sendData = "";
  void Start()
  {
    //StartCoroutine(UploadSend(API_HOST_URL + "", sendData));
    // StartCoroutine(GetRequest(API_HOST_URL + "/?id=100"));
  }

  void Update()
  {

  }

  IEnumerator GetRequest(string uri)
  {
    using (UnityWebRequest webRequest = UnityWebRequest.Get(uri))
    {
      // Request and wait for the desired page.
      yield return webRequest.SendWebRequest();
      string[] pages = uri.Split('/');
      int page = pages.Length - 1;
      switch (webRequest.result)
      {
        case UnityWebRequest.Result.ConnectionError:
        case UnityWebRequest.Result.DataProcessingError:
          Debug.LogError(pages[page] + ": Error: " + webRequest.error);
          break;
        case UnityWebRequest.Result.ProtocolError:
          Debug.LogError(pages[page] + ": HTTP Error: " + webRequest.error);
          break;
        case UnityWebRequest.Result.Success:
          Debug.Log(pages[page] + ":\nReceived: " + webRequest.downloadHandler.text);
          break;
      }
    }
  }

  IEnumerator UploadSend(string uri, string sendData)
  {
    var url = uri;
    // var json = JsonUtility.ToJson(sendData);
    var postData = Encoding.UTF8.GetBytes(sendData);
    using var request = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST)
    {
      uploadHandler = new UploadHandlerRaw(postData),
      downloadHandler = new DownloadHandlerBuffer()
    };
    request.SetRequestHeader("Content-Type", "text/plain");
    yield return request.SendWebRequest();
    // operation.completed += _ =>
    // {
    //   Debug.Log(operation.isDone);
    //   Debug.Log(operation.webRequest.downloadHandler.text);
    //   Debug.Log(operation.webRequest.isHttpError);
    //   Debug.Log(operation.webRequest.isNetworkError);
    // };
  }
}
```
要件定義の情報収集したメモ

要件定義の始まりは要求事項の整理から


### 要件定義の項目

・背景/目的/目標：開発の目的を明確にする

・成果物概要：第三者でも成果物がイメージできるものを図示する

・動作環境：アプリケーションの動作環境を記載する

・ユースケース：重要なユースケースを挙げる

・機能要求：要求事項を実現するための機能を検討する

・入力/出力要求：アプリケーションの入力、出力を明確にする

・接続性要求：連携するアプリケーションがあれば記載する

・ソフトウェア要求：保守性、信頼性、拡張性の目標とするレベルを定義する

・セキュリティ要求：セキュリティの側面からの対応内容を検討する

・スケジュール要求：要求されるスケジュールを記載する

### 要件定義書を書く時の注意点
#### 機能要求の整理

要求の最小単位を明確にして構造的に記載することで、
下記のようなメリットが得られます。

・要求全体の理解がしやすくなる
・石器フェーズでソフトウェア構造を検討するときにプラスになる
・要求が追加、変更になった場合に影響範囲がとらえやすくなる

#### 曖昧さを排除する
ある処理結果までの時間に対する要求であれば、
「処理時間は○○秒以内」と愚弟的に記載する

#### 非機能要件にも注意する
非機能要件に対する対応策をしっかりとまとめておく！

#### 設計はしない

要件定義とは要求を分析し、
アプリケーションの外部の振る舞いを検討する作業

要件定義の段階では設計の自由度を
残しておくことがベストプラクティス

#### 依頼者からの機能要求を無批判に受け入れない

設計にかかわるくらいの「何をどうする？」という機能要求がでたとしても、
その背景、課題、解決方法など、
ヒアリングを行い要件定義書に記載する。

### よりよい要件定義のための一工夫

#### プロトタイプを活用する

画面仕様の要求の確認に対してのプロトタイプは有効

最終的なアプリケーションのような振る舞いをするプロトタイプの作成には
準備に時間も工数もかかるため、
画面遷移と各画面のレイアウトのイメージがわかる資料を簡単に作成し、
紙芝居的な動きを見せるだけでも十分に効果がある。

### おわりに
この記事は、
自分なりに要件定義の理解を深めようと、
情報を咀嚼した残骸のようなものです。

ためになるひとが一人でもいればそれでいいと思って書いています。

最近私の記事に、
フォローやいいね、キープなどのアクションが
少しずつ見られるようになってきました！

そういった皆さんの反応が、
とてもうれしいのでまだまだ頑張っていきます。

何卒応援よろしくお願いします。
エンジニアでもUIデザインスキルアップを目指した話

## 初めまして、エンジニア５年目です
詳細には、バックエンドも触るエンジニアとして２年半ほど、フロントエンドのエンジニアに転向して3年ほどです。
元々デザインなどに興味があった私ですが、デザイン課題という形で現役デザイナーにレビューをもらいながらデザインデータを作成する機会をいただき、デザイン未経験からUIデザインスキルアップを目指したので、スキルアップできたのか、何が有効的であったと感じているかについてまとめていこうと思います。
※個人の意見になりますので、参考程度にご覧ください。

## 結論、UIデザインスキルはアップしたのか？何が有効的だったのか？
結論、UIデザインスキルはアップしたと思います。
特にデザインツールの使い方、デザインの考え方については、ただ興味があった以前の自分と比べると、
パーツの配置などに理由を持ってデザインデータを作成できるくらいには、スキルがアップしたように思います。
このスキルアップには、手を動かして作成したものをデザイナーにレビューをもらい改善するというサイクルが、必要不可欠だったように思います。

## デザイン課題の内容
上記にも記載した通り、デザイン課題は1年ほどやってきたのですが、1年で6つの課題に取り組みました。

### 私のデザインスキルレベル感
今の会社に入る前の転職活動中、独学でXDなどを少々勉強し、オンラインの学習サービスで成果物を作成し投稿していました。


### 使用ツール
今回は1年を通してFigmaを使用しました。

https://www.figma.com/ja/


### 各課題でやってきたこと
各課題では以下のように段階を踏んで制作するものが本格的になっていきました。
1. webサイトをトレースする
2. 所属事業のトンマナを刷新する
3. webサイトを改善・リニューアルする①
4. webサイトを改善・リニューアルする②
5. LP制作
6. ポートフォリオ制作

2つ目までの課題で基礎的な部分を学び、3、４つ目の課題から、ユーザーを見据えたデザインの作成を行うようになり、より本格的なデザイン作成になっていきました。

### デザイナーや共通の課題に挑戦したエンジニアから学んだこと
興味はあっても、インプットの仕方もよくわからなかったが故に、「良きデザインを作るコツとかがあるんだろうな」とぼんやりと思っていた筆者ですが、良きデザインの裏にはたくさんの努力がしっかりとありました。

#### たくさんのデザインを見てたくさんインプット
課題の3つ目から5つ目の制作中、「どう改善していいかわからない」「何を参考にすれば良いかわからない」という気持ちになり、手が止まってしまう場面が多くありました。
そんな中、レビューの中で「Pinterestなどで探してみるといいかも」と言ったようなコメントをもらったことがありました。Pinterestというと、いろいろな画像を見ることができるサイトというレベルの認識だったのですが、デザイナー曰く、Pinterestで良いと思うサイトデザインなどを探したりしているとのこと。
それを聞いて、5つ目の課題ではPinterestやwebデザインをパーツで絞り込んで探せるサイトなどを使いつつ、デザインを作成しました。
また、成果物のデザインの評価が良かった共通の課題に挑戦したエンジニアのデザインを見ると、明らかに自分とは桁違いな量の調査結果がまとめられていました。
デザインを作るにはたくさんのインプットが必要不可欠であると言えると思います。

#### デザインシステムとは何かを理解すること
1つ目から4つ目の課題まででよくもらっていた指摘に、「他と違っていて違和感がある」や「一貫性がない」という指摘がありました。
一貫性がないということは、「デザインシステムに沿えていなかった」のだと、今振り返ると思います。
デザイン未経験だった筆者は、そもそもデザインシステムがなんのためにあり、どのようにして活用していけるのかという点の理解が、甘かったです。そのため、本来デザインシステムに沿ってデザインしていれば一貫性が保てた箇所も一貫性がないデザインになってしまっていました。
これは考察なのですが、サイト内の一貫性がないということは、ユーザーが直感的に理解・操作しにくいUIになっているということで、実際、決定ボタンが今まで赤だったのに、急に青いボタンになっていたら操作に迷いが生じるかと思います。
課題を実施するまでは、なんとなく揃っているから良さそうやこのほうがそれっぽいなど曖昧な理由で見てしまっていたUIデザインですが、実際に指摘をもらい考えて制作することで、納得しながら学ぶことができた、大事なポイントだったように思います。

## 最後に
「手を動かすこと」「レビューをもらうこと」「基礎を知ること」「たくさんのインプット」の4つがUIデザインスキルアップへの近道だと筆者は考えています。そのため、課題は終了していますが、これからもこれらの4つを実施し、スキルアップを狙っていけたらと思います。
IDX workbench and flex card issue.



+ [IDX workbench and flex card issue.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007JDBVH)

:::note alert
No Vlocity DataPack Configuration Set for DataPack Type: VlocityCard
:::

 IDX workbench の問題？

I had a chat with Salesforce the other day - apparently IDX workbench does not work on windows properly.

先日、Salesforce とチャットしましたが、どうやら IDX ワークベンチが Windows 上で正しく動作しないようです。

#  IDX workbench 

IDX Workbench は、OmniStudio DataPack と Salesforce メタデータをある環境から別の環境に移行するために使用できるデスクトップ アプリケーションです。メタデータの移行は常に同じ方向、つまりソース環境からターゲット環境へ進みます。
2023年10月 AIOps 定点観測

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

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

![20231004_AIOps_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/dfb3c3ff-6936-c5bd-cf3f-265a305e433c.png)

* PureStorage
* IBM
* Splunk
* Dynatrace

先月とまったく同じです。
PureStorage がトップで IBM と Splunk が続いています。

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

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

![20231004_AIOps_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/75b7fa83-7c11-33e8-74fc-c12f68de4db5.png)

* HPE
* Splunk
* 日立製作所
* ServiceNow
* IBM

上位3位までは先月と同じです。4位と5位の入れ替えはありましたが、上記5社の顔触れは先月と全く同じです。
HPE が強調スニペットでトップに表示されています。 その後に Splunk、日立が続いています。

先月の結果はこちら --> [2023年9月 AIOps 定点観測](https://qiita.com/mkodera/items/44b49cc7af2ca6782ca7)
tmuxでpyenvを使う時

# 1. はじめに
tmux 上で
```
pyenv local <環境変数名>
```
で仮想環境を変更できなかったことがあるため、自分がやった解決法を載せる


# 2. やり方
tmux に入ると環境変数 `PYENV_VERSION` が別の仮想環境に設定されていた

よって環境変数 `PYENV_VERSION` を以下のコマンドで外す
```
pyenv shell --unset
```
\
このコマンドを実行すれば`pyenv local`が効くようになる
英文自我介紹、CV如何撰寫、英文履歷、英文面試的必備技巧


隨著國際化的趨勢，英文成為了一種重要的溝通工具。對於想要在國際舞台上發展的人來說，具備良好的英文能力、優秀的自我介紹能力、簡潔精煉的CV（Curriculum Vitae，簡歷）和出色的面試技巧至關重要。因此，在這篇文章中，我將介紹英文自我介紹、CV的撰寫要點、如何編寫英文履歷以及面試時的一些技巧，幫助大家更好地準備面對英文世界。

英文自我介紹：
[英文自我介紹](https://www.apexcharity.org/news/3/92)是一種展示自己的機會，也是與他人建立良好關係的重要方式。在自我介紹時，應遵循簡單、明確、流暢的原則，並突出自己的優勢和特點。首先，應該用簡單的句子表達自己的姓名、年齡、出身地等基本信息。接著，可以用幾個關鍵詞來描述自己的個性特點，如“積極主動”、“擅長溝通”等。然後，可以說明自己的學歷背景、專業技能及工作經驗。最後，可以以一個積極的總結來結束，如“我期待著和大家建立良好的合作關係，共同實現我們的目標”。

CV的撰寫：
[CV](https://www.apexcharity.org/news/3/88)是對個人學歷、工作經驗及技能的總結，是自我介紹的重要工具。在撰寫CV時，首先應該保持簡潔明了的格式。常見的CV格式包括個人信息、學歷背景、工作經驗、專業技能、獎項及證書等。在填寫每個項目時，應該注意使用具體的詞語，如“擔任主管”可以具體改為“負責安排員工工作”等。同時，應該注意適當地強調自己的優勢和突出特點。在最後的總結中，可以適當融入一些自我評價，如“擁有良好的團隊合作精神”等。

英文履歷：
[英文履歷](https://www.apexcharity.org/news/3/91)（Resume）與CV有些類似，但是更加注重技能和職場經驗。在撰寫英文履歷時，應該更加突出自己的專業技能和工作經驗，避免冗長的語句。履歷中的每一個項目都應該具有可測量性，如“負責管理一支20人的團隊，完成項目進度控制及質量檢測”，這樣可以更直觀地展示自己的專業能力。同時，應該根據不同的求職職位，精心挑選適合的工作經驗和技能項目，突出自己的符合度和競爭力。

英文面試技巧：
[英文面試](https://www.apexcharity.org/news/3/93)是展示自己的最後一道關卡，也是獲得工作機會的決定性因素。在面試前，應該調整好心態，保持自信和平靜。在回答面試官的問題時，應該適當地運用自己的英文知識，避免過分翻譯中文，使答案更流暢、更符合英文表達習慣。同時，可以適當添加一些例子或個人經歷來支持自己的回答。最後，在總結時可以再次強調自己的求職動機，表示對該職位的熱切渴望。

總結：
以上就是關於英文自我介紹、CV撰寫、英文履歷和英文面試技巧的介紹。希望本文能對準備走向國際舞台的朋友有所幫助。最後，想提醒大家的是，無論是自我介紹、CV還是面試，最重要的是保持真誠、自信、並展現出自己的專業能力和潛力。相信有耐心和努力的朋友，一定可以順利迎接屬於自己的成功。
コンソール端末で Xon を無効化させる

TeraTerm とか PuTTY 界隈を使っちょると、crtl+sを押してしまって、スワ暴走に遷移してプチパニックになる人の為の最も効果的な方法

```cmd
stty stop undef
```

これまた、忘備録。
FlutterでJavaScriptと連携する

### 【はじめに】

Flutterを使用したアプリケーションでは、JavaScriptと簡単に連携できます。このチュートリアルでは、flutter_inappwebview パッケージの addJavaScriptHandler メソッドを使用して、JavaScriptからFlutter関数を呼び出す方法を紹介します。

### 【セットアップ】

まず、flutter_inappwebview パッケージをプロジェクトに追加します。
pubspec.yamlファイルに以下の行を追加してください。

```yaml
dependencies:
  flutter:
    sdk: flutter
  in_app_webview: ^5.7.2+3 # 最新のバージョンを使用してください
```

https://pub.dev/packages/flutter_inappwebview

ターミナルを開いてプロジェクト内でflutter pub getでパッケージをインストールして下さい。


### 【サンプルコード】

以下は、addJavaScriptHandler を使用した簡単な例です。


```webViewPage.dart
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';

class WebViewPage extends StatelessWidget {
  // JavaScriptから呼び出されるこの関数
  void _receiveMessage(List<dynamic> args) {
    String message = args.first;
    print("Message received from JavaScript: $message");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("WebView Interaction Example"),
      ),
      body: InAppWebView(
        initialFile: 'assets/message.html', // 初期HTMLファイルを設定
        onWebViewCreated: (InAppWebViewController webViewController) {
          // JavaScriptハンドラを追加
          webViewController.addJavaScriptHandler(
            handlerName: 'receiveMessage',
            callback: _receiveMessage,
          );
        },
      ),
    );
  }
}
```
上記の例では、assets/message.html ファイル内のJavaScriptから receiveMessage ハンドラを呼び出すと、Flutterの _receiveMessage 関数が実行されます。





次に、assets/message.html ファイルで receiveMessage ハンドラを呼び出すJavaScriptの例です：

```receiveMessage.html
<!DOCTYPE html>
<html>
<head>
    <title>WebView Interaction Example</title>
</head>
<body>
    <script type="text/javascript">
        function sendMessage() {
            window.flutter_inappwebview.callHandler('receiveMessage', 'Hello from JavaScript!');
        }

        sendMessage();
    </script>
</body>
</html>
```
このJavaScriptコードは、sendMessage 関数を実行すると、receiveMessage ハンドラが呼び出され、Hello from JavaScript! メッセージがFlutterの _receiveMessage 関数に渡されます。

### 【最後に】

これで、JavaScriptからDartへデータを送信し、そのデータをDartで処理することができます。
以上が、Flutterのflutter_inappwebviewパッケージのaddJavaScriptHandlerメソッドを使用した基本的な使い方です。これにより、FlutterアプリとWebページとの間で簡単にデータのやり取りが可能となります。
繰り返しによる造形

# ANDY GILMORE作品を参考にして
https://www.agilmore.com/

# 繰り返しの例１

~~https://www.agilmore.com/Mana~~

https://cargocollective.com/crowquills/Mana

この作品を事例に考え方を述べる。

注）忠実な模倣は目指さない
条件：法則性を見出し「for文」を使って造形する。

①部分円として扱う
②arc命令を使う
https://processing.org/reference/arc_.html

まず１つ描く
時計の３時の方角が０ラジアン
（１２時の方角から、９時の方角へ描く）
（ただし、y軸が下向きプラスなので、注意）
-π/2からπまで描く

```java
size(1024,1024);
arc(512, 512, 1024, 1024, -HALF_PI, PI, PIE);
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/b14109a1-e140-768d-a867-d278d58aeebb.png)


次に「コピペして」たくさん描く

```java
size(1024,1024);
arc(512, 512, 1024, 1024, -HALF_PI, PI, PIE);
arc(256, 256, 512, 512, -HALF_PI, PI, PIE);
arc(128, 128, 256, 256, -HALF_PI, PI, PIE);
arc(64, 64, 128, 128, -HALF_PI, PI, PIE);
arc(32, 32, 64, 64, -HALF_PI, PI, PIE);
arc(16, 16, 32, 32, -HALF_PI, PI, PIE);
arc(8, 8, 16, 16, -HALF_PI, PI, PIE);
arc(4, 4, 8, 8, -HALF_PI, PI, PIE);
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/1f31bbdc-43ed-c3ad-c14d-61f24debd948.png)

# 法則性を見出し、for文に置き換える

プログラムを、じっと見つめて、法則性を見出し、for文に置き換える。
for文に置き換えができれば、繰り返し回数は、何回でも増やせる。

```java
size(1024, 1024);
for (int a=512; a>0; a=a/2) {
  arc(a, a, a*2, a*2, -HALF_PI, PI, PIE);
}
```

# png画像で保存する

```java
size(1024, 1024);
for (int a=512; a>0; a=a/2) {
  arc(a, a, a*2, a*2, -HALF_PI, PI, PIE);
}
save("image.png");
```

# PDFで保存する

processingでの保存方法はpngなどの画像だけにとどまらない。

プログラムファイルに名前をつけて保存する。
そのフォルダが、PDFファイルの保存先になる。
PDFファイルで保存し、イラストレータで開いて編集してみる。

```java
import processing.pdf.*;
  
size(1024, 1024, PDF, "filename.pdf");
for (int a=512; a>0; a=a/2) {
  arc(a, a, a*2, a*2, -HALF_PI, PI, PIE);
}

exit();
```

# SVGで保存する

SVG（ベクターデータ）でも、保存できる。

https://processing.org/reference/libraries/svg/index.html

```java
import processing.svg.*;

size(1024, 1024);
beginRecord(SVG, "filename.svg");

for (int a=512; a>0; a=a/2) {
  arc(a, a, a*2, a*2, -HALF_PI, PI, PIE);
}

endRecord();
```

# 繰り返しの例２

円を大きくしながら、左から右へ描画。
円を小さくしながら、右から左へ描画。

```java
size(800, 800);
noStroke();

background(0);

for (int c=0; c<400; c=c+40) {
  fill(255-c, 255, c, 50);//R,G,B,A半透明で描画
  circle(c, 400, c*2);
  
  fill(255, 255-c, c, 50);
  circle(800-c, 400, c*2);  
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/8163497e-a43e-c1bd-0c01-a5a05d3c4556.png)
[AWS][Docker]lambdaをローカルでテストする方法

#### ターミナルで以下を実行する
```
sam build -m requirements.txt -t template.local.yaml
sam local start-api --docker-network docker.internal --env-vars .env.local.json
```

###### sam build -m requirements.txt -t template.local.yaml
- sam build: SAM アプリケーションの依存関係をビルドし、デプロイ可能な形式にパッケージ化。
- -m requirements.txt: Python の場合、requirements.txt ファイルにリストされている依存関係を使用してビルド。
- -t tempate.local.yaml: このオプションは、特定のSAMテンプレートを指定します。今回 template.local.yaml という名前のテンプレートを指定。

###### sam local start-api --docker-network docker.internal --env-vars .env.local.json
- sam local start-apiは ローカル環境で API Gateway を模倣して、サーバレスアプリケーションのエンドポイントをローカルでテストするためのコマンド。
- --docker-network docker.internalは　Lambda Dockerコンテナが接続する既存の Dockerネットワークの名前またはIDを指定する。これが指定されていない場合、Lambda コンテナはデフォルトのブリッジ Docker ネットワークにのみ接続される。今回だとdocker.internalでドメインを指定している。
- --env-vars .env.local.jsonは環境変数を JSON 形式で指定することで、Lambda関数がローカルで実行される際に環境変数が利用できるようになる

## 参照
[sam local start-api](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-local-start-api.html)
Flutter CSVデータを取得し文字コードを変換する

#### 【環境】
Flutter 3.7.7
Dart 2.19.4

#### 【パッケージ】
http
charset_converter
csv

https://pub.dev/packages/charset_converter

https://pub.dev/packages/csv


#### 【サンプルコード】
```dart
Future<List<List<dynamic>>> getCsvDatas() async {
    
    List<List<dynamic>> csvDatas = [];
    final response = await http.get(Uri.parse('https://your.csv.url.csv'));

    if(response.statusCode == 200){
    final utf8Data = await CharsetConverter.decode('Shift_JIS', response.bodyBytes);
          csvDatas = CsvToListConverter(shouldParseNumbers: false).convert(utf8Data);
        } else {
      // エラーハンドリング追加する

      return csvDatas;
    }
    return csvDatas;
  }
```

今回取得したCSVは文字コードがShift_JISとします。
charset_converterパッケージを使用してCharsetConverter.decode('Shift_JIS',contents),でShift_JISからUTF-8へと変換しています。
その後行っているCsvToListConverter(shouldParseNumbers: false).convert(utf8Data)はcsvパッケージを使用してCSVデータをリストへ変換しています。


ここで注意したいのがshouldParseNumbers: falseです。
これはCSVデータ内の数字は数値として解析されず、文字列として扱われます。つまり、CSV内のすべてのデータは文字列として扱われ、数値に変換されることはありません。

#### 【なぜshouldParseNumbers: falseを使用しているのか？】

今回取得したCSVデータの中に00000がありました。
このデータは00000として扱いたかった為、shouldParseNumbers: trueでは、整数として扱われるので0として解析されてしまいます。
この様な理由からshouldParseNumbers: falseにしています。


#### 【最後に】
csvデータの文字コードを変換する方法の記載になりましたが、いろいろと応用はできると思いますので参考になれば幸いです。
また、charset_converterパッケージはShift_JISだけではなく他の文字コードにも対応していますので、とても便利なパッケージだと思います。
お時間あれば確認してみて下さい。
rex0220 計算式プラグイン テーブルの転記

kintone で、テーブルAからテーブルBに転記したいというご要望がありましたので計算式プラグインを使って実装してみます。

# 概要

テーブルA で、対象に"チェック" された行をテーブルBに転記します。
※参考 [rex0220 計算式プラグイン 複数テーブルの転記](https://qiita.com/rex0220/items/6787eafd8f6c24ff37b4)

![2023-10-02_12h02_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b7047ee1-b509-5e29-7d25-0665608999ee.png)

# 操作例

![2023-10-02_12h08_06.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/5adec013-598b-63a3-4045-42aac92c09c7.gif)

# 計算式プラグインの設定

テーブルBに、テーブルAから CSV 変換・テーブル変換を行っています。
テーブルB.区分BとテーブルB.ユーザー選択Bは、計算式なしで編集不可とします。

![2023-10-02_12h10_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9d0c103c-80f9-91e6-8350-641b69985a29.png)


```.js
// テーブルB SUBTABLE
CSV_TVAL(
  OTCSV(テーブルA,
    TPFILTER(IN(対象,"チェック")),
    TPOUT(区分A,ユーザー選択A),
    TPLABEL("区分B","ユーザー選択B")
  )
)

// テーブルB.区分B DROP_DOWN
// テーブルB.ユーザー選択B USER_SELECT
```
【ChatGPT無】嘘吐きを減らそう（その４）


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

　今回は、ChatGPTの嘘吐き（ハルシネーション）を抑制する文言の報告です。知らないのに、さも知っているように話すChatGPTさんも、これには勝てない？

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　過去に
　　嘘吐き抑制の記事を
　　　三つアップしました。

[【ChatGPT無】嘘吐きを減らそう](https://qiita.com/kabumira/items/2da48c6728b0c1f9a76d)

[【ChatGPT無】嘘吐きを減らそう（その２）](https://qiita.com/kabumira/items/94567d7411309f63e7a5)

[【ChatGPT無】嘘吐きを減らそう（その３）](https://qiita.com/kabumira/items/c04419e9dd6a72ab70ec)

　今回は、
　　嘘吐き抑制の
　　　第四段です。
***
　これまで、
　　「スマホ熱中症」や
　　　「ペットボトル症候群」
　　　　という造語に対し、
　　　　　ChatGPTさんは、
　　　　　　推測という形で
　　　　　　　文章を紡いで
　　　　　　　　きました。

　つまり、
　　知らない言葉でも
　　　推測できる言葉の綴りには、
　　　　知らない言葉ではなく、
　　　　　わからない言葉でもない
　　　　　　ものである、
　　　　　　　と判断していた
　　　　　　　　わけです。

　しかし、
　　それは、ChatGPTさんが
　　　事実を知らないわけですから
　　　　こちらとしては
　　　　　困ります。
***
　そこで、
　　この嘘吐きを抑制するべく、
　　　試行錯誤を繰り返してきて、
　　　　ようやく見つけました。

　以下の文言を使います。
　　**「事実だけを述べてください。
知らなければ、知らないと答えてください。」**

　「事実～」と
　　「知らなければ～」は、
　　　別々に使っても、ダメです。

　両方一緒に使ってください。

　では、実行例を。
　　・抑制の文言を使わない場合
　　・「知らなければ～」の場合
　　・「事実～」だけの場合
　　・両方使用した場合
　　　と続けます。
***
・抑制の文言を使わない場合
***User***
「スマホ熱中症」とはなんですか？

***ChatGPT***
「スマホ熱中症」とは、スマートフォンやタブレットなどの電子デバイスを長時間使用することによって引き起こされる可能性のある健康問題を指す言葉です。主な症状には、目の疲れ、頭痛、首や肩のこり、手首の痛み、睡眠障害などが含まれます。スマートフォンの画面を長時間見続けたり、スマートフォンを使いながら姿勢が悪くなったりすることが原因とされています。

この症状を予防するためには、定期的な休憩や適切な姿勢を保つことが重要です。また、画面の明るさやフォントの大きさを調整して目に優しい設定にすることも役立ちます。スマートフォンの使用に注意し、バランスの取れた生活を送ることが大切です。
***
　それらしいですよね。

　でも、ウソです。
***
・「知らなければ～」の場合
***User***
知らなければ、知らないと答えてください。

「スマホ熱中症」とはなんですか？

***ChatGPT***
「スマホ熱中症」という用語は私の知識のカットオフまでには存在しません。一般的に、スマートフォンの使用が長時間続くことによって、過度の熱中症や目の疲れなどの健康問題が発生する可能性はありますが、具体的な医学的な用語としては知られていないかもしれません。医療関連の用語に関しては、専門家に相談することが重要です。
***
　こうした人間側の症状は、
　　「VDT症候群」と
　　　「スマートフォン症候群」が
　　　　あります。
***
・「事実～」だけの場合
***User***
事実だけを述べてください。

「スマホ熱中症」とはなんですか？

***ChatGPT***
「スマホ熱中症」は、長時間のスマートフォンの使用により、画面を見つめることや首を前かがみにすることによって引き起こされる、首や肩の痛みや不快感などの症状を指す言葉です。
***
　こちらも同じですね。

　さて、
　　大トリを飾りますのが、
　　　こちら。
***
・両方使用した場合
***User***
事実だけを述べてください。
知らなければ、知らないと答えてください。

「スマホ熱中症」とはなんですか？

***ChatGPT***
「スマホ熱中症」という用語は、私の知識ベースには含まれていません。知識のカットオフ日が2021年9月であり、それ以降の情報にはアクセスできません。新しい情報がある場合は、医療専門家や信頼性のある情報源から詳細を確認することをお勧めします。
***
　となりました。

　それぞれ、
　　三回Regenerateしました。
　　　出力内容は、ほぼ同じです。

　ちなみに、
　　「ペットボトル症候群」も
　　　対処できました。

　なんと
　「プロンプトエンジニアリング」
　　　も知らなかった！？

　英語に直したらちゃんと答えた。
　　ホッとしました。

　今回は、ここまで。