OmniAICreator/Qiita-1.07M huggingface dataset:
ブラウザバック時にReactでもフォームの値を保持したい！

## はじめに
業務においてReactを用いてフォームの作成をしていたところ、Reactではブラウザバック時にstateに保持していたフォームの値が消えてしまうということを知りました。
今回はその時の対策としてブラウザバック時にReactでもフォームの値を保持する方法をいくつか検討したのでまとめようと思います。

## 概要
通常のHTMLでは、ブラウザを戻ったり進んだりしてもフォームの値は保持されますが、Reactのstateは初期化されてしまうため、何かしらの方法でフォームの値を保持しておく必要があります。

## 検討１：イベントリスナーのpopstateを用いてhistoryオブジェクトに保持する
まず初めに、下記のようにイベントリスナーのpopstateイベントを用いてhistoryオブジェクトに保持することをを検討しました。
```tsx
const [value, setValue] = useState<string>('');

useEffect(() => {
  const handlePopState = (e: PopStateEvent) => {
    setValue(e.state?.formValue || '');
  };

  window.addEventListener('popstate', handlePopState);

  return () => {
    window.removeEventListener('popstate', handlePopState);
  };
}, []);

const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  const inputValue = e.target.value;
  setValue(inputValue);
  window.history.pushState({ formValue: inputValue }, '');
};
```
しかし、実際に試してみたところ、popstateがうまく発火せず、不安定であるため、この方法は採用しませんでした。少し調べたところ、
ブラウザによってはpopstateが発火しないものもあるらしく、あまりいい方法ではなさそうです（今回はChromeで発火しなかった）。

## 検討２：ブラウザバック時に確認ダイアログを表示させる
下記のように、そもそも保持せず、ブラウザバックさせないという方法も検討しました。
```tsx
const handleBeforeUnload = (e: BeforeUnloadEvent) => {
  const confirmationMessage = '本当にブラウザバックしますか？';
  e.returnValue = confirmationMessage;
  return confirmationMessage;
};


useEffect(() => {
  window.addEventListener('beforeunload', handleBeforeUnload);

  return () => {
    window.removeEventListener('beforeunload', handleBeforeUnload);
  };
}, []);
```
しかし、今回作成していたページはフォームを入力するページ、フォームの入力を確認するページとあり、確認ページからのブラウザバックには対応できないため見送りとしました。

## 検討３：localStorageを使って保持する
下記のようにlocalStorageを用いた方法も検討しました。
```tsx
const [value, setValue] = useState<string>(localStorage.getItem('formValue') || '');

useEffect(() => {
  localStorage.setItem('formValue', value);
}, [value]);

// 不要になったlocalStorageの値を消すための何か
// 不要になったlocalStorageの値を消すための何か
// 不要になったlocalStorageの値を消すための何か

```
しかし、あるタイミングで不要になったlocalStorageの値を削除するロジックを組み込む必要があり、そのタイミングが複雑であったため採用しませんでした。

## 検討４：sessionStorageを使って保持する
localStorageでは不要になった値が残ってしまうこと、削除するタイミングが困難であるということが課題でした。
それならばと、セッション単位で値を保持するsessionStorageを用いた方法も検討しました。
```tsx
const [value, setValue] = useState<string>(sessionStorage.getItem('formValue') || '');

const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  const inputValue = e.target.value;
  setValue(inputValue);
  sessionStorage.setItem('formValue', inputValue);
};
```
この方法ならば削除するロジックは必要なく、セッションが切れれば値は削除されるので、この方法を採用することになりました。


## 最後に
今回のケースでは、通常のHTMLに似た挙動を目指していたのでsessionStorageを利用する方法が最適でした。
しかし、多種多様なケースがありますので、今回採用を見送った方法が最適な方法の可能性もありそうですね。いい学習になりました。

ご覧いただきありがとうございました！
ChatGPTが見て、聞いて、話すことができるようになったから試してみた！すごい

2023年9月25日、突如としてOpenAIの公式Xにより、ChatGPTがマルチモーダル機能が追加されると発表されました

これにより、ChatGPTのアプリでChatGPTとまるで人と会話をするようにやり取りできたり、画像ベースでの質問をすることができるようになります。


>ChatGPTは見て、聞いて、話すことができるようになりました。今後2週間で、PlusユーザーはChatGPTと音声で会話できるようになり（iOS & Android）、会話に画像を含めることができるようになります（すべてのプラットフォーム）。
（日本語訳）


https://twitter.com/OpenAI/status/1706280618429141022

## ChatGPTのマルチモーダル機能とは？

![スクリーンショット 2023-09-26 7.25.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/658b7062-2a7b-660d-d863-a893dc5733fd.png)

今回、追加される機能は大きく分けて2つあります

![スクリーンショット 2023-09-26 7.27.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/23f3d8d9-efe2-e0a5-b589-75842e2d76a2.png)


1つ目は、「音声による会話」機能で、こちらはChatGPTの公式アプリ（iOS・Android）に搭載されます。

これにより、ユーザーはテキスト入力だけでなく、音声での質問や指示をChatGPTに伝えることができるようになります。

例えば、運転中や家事をしながらでも、ChatGPTとの会話を楽しむことができるようになります。音声入力を使用することで、手を使わずに情報を得たり、疑問を解決したりすることが可能となり、さらにアクセス性と使いやすさが向上します。

![スクリーンショット 2023-09-26 7.25.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/df15a1cc-fa76-58c5-c3bc-a816f7fb2eef.png)

2つ目は、「画像ベースの質問」機能で、これはすべてのプラットフォームで利用可能になります。

この機能により、ユーザーはChatGPTに画像を送信し、その画像に関する質問や説明を求めることができます。

例えば、ある物体や場所の写真を送信して「これは何ですか？」といった質問をすると、ChatGPTがそれに対して答えを提供することができます。また、複雑なグラフや図を送信して、それに関する説明や解釈を求めることも可能です。

## 日本でも使える？

「音声による会話」、「画像について質問」どちらの機能も日本でも利用が可能ですが、「画像についての質問」は画像から英語以外の文字を読み取る場合にはパフォーマンスが低下すると発表されています。

「音声による会話」は日本語での会話が可能です

↓実際に日本語で音声による会話をした様子は以下のページで公開しています！

https://generativeinfo365.com/?p=1836


## いつから開始

ChatGPT Plus（有料版）に加入しているユーザーに、今後2週間以内（9/25~10月頭頃）にリリースしていくとのことです。

## マルチモーダル機能を利用してできること

①グラフから情報を読み取る

![スクリーンショット 2023-09-26 7.28.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/40b807d0-92a4-7361-e00e-dd46106a051f.png)

例えば、グラフの画像をChatGPTに読み込ませて、そのグラフから読み取れることを質問することが可能です

これにより、グラフや図表の解釈が難しい場合や、特定のデータポイントに関する詳しい情報が欲しい場合に、ChatGPTにサポートを求めることができます

②試験問題の読み取り

![スクリーンショット 2023-09-26 7.46.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/ab1bab0c-c197-ab07-bb01-e87e99f36db3.png)

試験問題の画像を読み取ることで、問題の内容や解答方法に関するヒントや説明をChatGPTから得ることができます。特に、学生や受験生が難しい問題に取り組む際、迅速にサポートを受けることが可能となります。

## 実際に使ってみた感想

今回は、先んじて「音声による会話」機能が利用開始になっていたので、こちらを試してみます。

まず、音声は男性2パターン、女性3パターンの合計5パターンから選ぶことができます

![IMG_3205.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/9d090f23-5c7b-2c00-4d95-4f9b0565f4db.jpeg)

これらの声は、プロの声優と協力して作成されており、話した言葉は、Whisperという音声認識システムでテキストに変換されます。

音声機能の開始は、チャット画面の右上にあるヘッドホンアイコンから簡単にできます。

![IMG_3206.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/5653a41b-91ce-5e20-a651-183d3e93b527.jpeg)

実際に会話をしてみたところ、まるで、実際の人と話しているくらい、驚くほど自然な音声で返答が返ってきました。

しかし、日本語の発音に関しては、海外の人が日本語を話すような感じがしました。聞き取りにくいというわけではありませんが、違和感を感じないと言ったら嘘になるという感じです

また、「音声による会話」機能は、他のアプリを開いたままのバックグラウンドでも利用可能でした。

これは非常に便利な機能で、例えばメール作成中にChatGPTに情報を尋ねることができたり、ChatGPTとの会話内容を参考にして、メモアプリでまとめることも可能です。

まだ、触ったばかりですが、ちょっと触るだけでもめっちゃ便利というのが伝わってきました。

ただ、Qiitaでは動画を貼れないので、実際の音声会話によるやり取り等は以下のページで確認してみてください！

また、ChatGPTでいち早く「音声会話機能」を使う方法も解説していますので、試してみたい人はぜひこちらを参考にしてみてください！

https://generativeinfo365.com/?p=1836
Qiita で$(ドルマーク)を書くには2回エスケープ

## 先に結論

`\\$` と書けばOK。エスケープ1回ではなく2回。

## 経緯

先日、以下の記事を Qiita に書いてるときに \\$(ドルマーク)を1行に複数書こうとして書けないことがありました。

https://qiita.com/saoyagi2/items/41e2a695a8eed74a3ad0

Markdown の記述

```
料金プランは Free($0/月)、Solo($7/月)、Team($29/月)、Enterprise($54/月) の4種類です。
```

実際の表示

> 料金プランは Free($0/月)、Solo($7/月)、Team($29/月)、Enterprise($54/月) の4種類です。

\\$ マークで囲われた部分は数式モードになりますから、これは当然ですね。

では \\$ マークをエスケープすればいいかと思ったのですが、これがうまくいかない。

Markdown の記述

```
料金プランは Free(\$0/月)、Solo(\$7/月)、Team(\$29/月)、Enterprise(\$54/月) の4種類です。
```

実際の表示

> 料金プランは Free(\$0/月)、Solo(\$7/月)、Team(\$29/月)、Enterprise(\$54/月) の4種類です。

ググったところ、実体参照で書けばよいという記事もあったのですが、これも Qiita ではうまくいきませんでした。

Markdown の記述

```
料金プランは Free(&#36;0/月)、Solo(&#36;7/月)、Team(&#36;29/月)、Enterprise(&#36;54/月) の4種類です。
```

実際の表示

> 料金プランは Free(&#36;0/月)、Solo(&#36;7/月)、Team(&#36;29/月)、Enterprise(&#36;54/月) の4種類です。


仕方なく記事では以下のように修正してとりあえず逃げました。


Markdown の記述

```
料金プランは Free(0ドル)、Solo(7ドル/月)、Team(29ドル/月)、Enterprise(54ドル/月) の4種類です。
```

実際の表示

> 料金プランは Free(0ドル)、Solo(7ドル/月)、Team(29ドル/月)、Enterprise(54ドル/月) の4種類です。

記事は書けたのですが、\\$(ドルマーク) が記載できないのは気持ち悪いなぁということで Qiita のサポートに問い合わせたところ、冒頭に書いたエスケープ2回の方法を教えていただきました。

Markdown の記述

```
料金プランは Free(\\$0/月)、Solo(\\$7/月)、Team(\\$29/月)、Enterprise(\\$54/月) の4種類です。
```

実際の表示

> 料金プランは Free(\\$0/月)、Solo(\\$7/月)、Team(\\$29/月)、Enterprise(\\$54/月) の4種類です。

確かにこれで望み通りの表示が出来るようになりました。

なんで \\$(ドルマーク) だけエスケープ1回ではなく2回なのかというと、おそらくこの辺りが関係しているのでしょう。

https://qiita.com/Qiita/items/c686397e4a0f4f11683d#%E6%95%B0%E5%BC%8F%E3%81%AE%E6%8C%BF%E5%85%A5

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86075/a7031ec9-b4a4-a202-0950-d94a9145407f.png)

数式モードの中でエスケープが衝突するから2回エスケープが必要というのは分かりますが、数式モード自体を表す \\$ にも適用されるというのがちょっとはてなではありますけれども。
Oracle Analytics Cloud：自分の書いたQiita記事の一覧をREST APIで取得する

# はじめに
Oracle Analytics Cloud（**OAC**）では、REST APIをソースとしてデータセットを作成することができます。
- [Oracle Analytics Cloud：ニューヨーク市で人気の赤ちゃんの名前をREST APIで取得して可視化してみる](https://qiita.com/tyo38/items/88c91be960d49621d55d)

この機能を使って、Qiitaに投稿した自分の記事の一覧を取得してみようと思います。

# 1. 事前準備
こちらのページで個人用アクセストークンを取得しておく必要があります。
- https://qiita.com/settings/applications

発行されたトークンは、OACで接続を作成する際に必要となります。

# 2. 接続の作成
OACにログインし、接続を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/bfc96a49-242c-cad2-70ec-87c706342442.png)
「REST API」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/48c0b0fe-8b22-66d9-634e-6a8858d6d41e.png)
任意の接続名を入力し、「RESTベースURL」に「https:\//qiita.com」と入力します。
続いて、「エンドポイントの追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/14182964-cc33-fb15-0d33-4f8a6c77d7c3.png)
次のようにエンドポイントを修正します。
|名前|相対URL|
|:-|:-|
|Items|/api/v2/items?page=1&per_page=100&query=user%3A＜ユーザID＞|

※＜ユーザ名＞を自分のQiitaユーザIDに置き換えてください。
さらに、次のように認証情報を設定します。
|設定|値|
|:-|:-|
|認証|HttpHeader|
|認証ヘッダー|Authorization|
|セキュリティ・トークン|Bearer ＜Access Token＞|

※＜Access Token＞をQiitaに発行してもらったアクセストークンに置き換えてください。
「保存」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/ecfe846f-0a41-cec0-eec6-866530904a72.png)
すべて問題なければ、接続が保存されます。

:::note
取得するデータを作成日でフィルタしたい場合は、このような相対URLにします。
※特定のユーザが2023/6/1以降に作成した記事
/api/v2/items?page=1&per_page=100&query=created%3A%3E2023-5-31+user%3A＜ユーザID＞

pageの初期値は1、pageの最大値は100です。また、per_pageの初期値は20、per_pageの最大値は100です。
複数ページを繰り返し取得はできないため、取得する記事が100件以内になるように条件を工夫してください。
:::

# 3. データセットとワークブックの作成
作成した接続を使用してデータセットを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/4a59242f-6ca3-1f7a-6bd9-1d985b113222.png)
「スキーマ」「AUTOREST」を展開し、「ITEMS」をドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/b1f7c89d-2376-b06f-07b1-e6754ea0faca.png)
データセットを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/1f40bb00-a167-7eae-861e-b72763dfa655.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/f1e11001-b603-15f6-fdb5-09fa81f8160a.png)
作成したデータセットを使用してワークブックを作成します。
タイトル毎のビューカウント数でグラフ化してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/7c27e7c1-a47b-8810-2890-e00ca251c078.png)

# 参考情報
QiitaのAPIについては、こちらに詳しく記載されています。

https://qiita.com/api/v2/docs
FlutterでのFirebase関連のビルドエラー(android)とその解決方法



FlutterAndroidでプロジェクトをビルドする際に、Firebase関連でいくつかのエラーが発生しました。この記事では、それらのエラーとその解決方法について詳しく説明します。特に、`android/build.gradle`と`android/app/build.gradle`の変更点に焦点を当てています。

## 1. Firebase関連のビルドエラー

### エラー内容

ビルド時に以下のエラーが発生しました。

```
Error while evaluating property 'extraGeneratedResDir' of task ':app:mapDebugSourceSetPaths'
```

### 解決方法

このエラーは、FirebaseのGradleプラグインのバージョンが古いために発生することがあります。解決するためには、`android/build.gradle`の`dependencies`セクションを以下のように更新する必要があります。

```gradle
dependencies {
    classpath 'com.android.tools.build:gradle:7.3.0'
    // START: FlutterFire Configuration
    classpath 'com.google.gms:google-services:4.3.14' // バージョンを4.3.10から4.3.14に更新
    // END: FlutterFire Configuration
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
```

## 2. 64Kメソッド制限の問題

### エラー内容

ビルド時に以下のエラーが発生しました。

```
ERROR:D8: Cannot fit requested classes in a single dex file (# methods: 66746 > 65536)
```

### 解決方法

このエラーは、アプリケーションのメソッド数が64Kを超えた場合に発生します。解決するためには、`android/app/build.gradle`に以下の設定を追加する必要があります。

```gradle
defaultConfig {
    ...
    multiDexEnabled true
}

dependencies {
    ...
    implementation 'androidx.multidex:multidex:2.0.1'
}
```

**注意:** 上記の変更は`android/build.gradle`ではなく、`android/app/build.gradle`に追加する必要があります。


## 3. Gradleのクリーンとビルド(補足)

エラーの解消後、プロジェクトのビルドを確実に行うために、Gradleのクリーンとビルドを実行することをおすすめします。これにより、前回のビルド時に生成された一時ファイルやキャッシュがクリアされ、新しい設定でのビルドが正確に行われます。

### 実行方法

Terminalやコマンドプロンプトを開き、プロジェクトの`android`ディレクトリに移動して、以下のコマンドを実行します。

```bash
./gradlew clean
./gradlew build
```

これにより、Gradleがプロジェクトをクリーンし、その後ビルドを行います。


## 参考記事


[Flutter3.10.0での新規プロジェクトにFirebaseを導入した際、Android向けビルドでエラーが出る現象の解決方法](https://zenn.dev/welchi/articles/flutter-3101-firebase-error)
`android/build.gradle`の変更に関する情報が提供されています。この記事と同様の内容を参考にして、問題を解決することができました。

---

以上、FlutterプロジェクトでのFirebase関連のビルドエラーとその解決方法についての説明でした。同様の問題に直面している方の参考になれば幸いです。

---
TiDB CloudのServerless Driverを試してみる

# Serverless Driverとは
TiDB CloudのServerless Driverは、通常MySQLプロトコルで接続ができないEdge FunctionからHTTPSでTiDB Serverlessに接続するためのドライバです。

9月19日にひっそりと[Betaで公開](https://docs.pingcap.com/tidbcloud/tidb-cloud-release-notes)されました。

従来はData proxyなどを経由したり、APIを作ったりする必要があったかと思いますが、これで直接利用できることになり、開発がサクサク進むことが期待されます。

## 公式ドキュメント、リポジトリなど

- [公式ドキュメント(日本語)](https://docs.pingcap.com/ja/tidbcloud/serverless-driver)
- [GitHubリポジトリ](https://github.com/tidbcloud/serverless-js)
- [デモ](https://github.com/tidbcloud/car-sales-insight)
- [デモリポジトリ](https://github.com/tidbcloud/car-sales-insight)

デモではよくある分析ダッシュボードのバックエンドをVercel, Cloudflare, Netlifyのそれぞれで動かし、TiDB Serverlessに直接接続しています。実際の利用例はこちらを参照すると良いと思います。

![自動車販売ダッシュボード](https://github.com/tidbcloud/car-sales-insight/raw/main/images/car-sale.png)

## 最小セットで試す

公式ドキュメントにある、[こちら](https://docs.pingcap.com/ja/tidbcloud/serverless-driver#query)のソースコードと同等のものをローカル環境でさっくり試してみることにします。

```typescript
import { connect } from '@tidbcloud/serverless'

const conn = connect({url: 'mysql://username:password@host/database'})
const results = await conn.execute('select * from test where id = ?',[1])
console.log(results)
```

### 1. TiDB Serverlessで適当なクラスタを立ち上げて接続文字列を取得

TiDB CloudのコンソールからServerlessクラスタを起動し、connectボタンを押してパスワードを設定します。接続文字列はSQL Alchemyの形式なので、`connect with`メニューでSQL Alchemyを選択すると簡単です。デフォルトでTLS接続をするようなので `?ssl_ca=` から先は不要です。

![スクリーンショット 2023-09-26 8.14.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12495/0bfe0b2a-27cb-d976-d12b-0f19cfe92e97.png)

この例だとtestというデータベースに接続しています。クラスタを作成すると自動で作られているはずです。

### 2. 適当なテーブルを作成

適当なtestテーブルを作成します。TiDB CloudのChat2QueryメニューからSQLエディタでDDLを流します。

```sql
USE test;
CREATE TABLE test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(20) NOT NULL
);
INSERT INTO test (name) VALUES ('Taro Yamada'),('Hanako Suzuki'),('Jiro Tanaka');

```

### 3. サンプルソースを準備

適当なディレクトリを作成して、下記を実行します。
その後、公式のサンプルコードの接続文字列を変更して `serverless.ts` という名前で保存しています。

```bash
% npm init
% npm install typescript
% npm install "@tidbcloud/serverless"
% ls 
node_modules		package-lock.json	package.json		serverless.ts
```

### 4. トランスパイルと実行（注意）

ここでちょっとハマったのですが、TiDB Serverless DriverはES moduleなので、nodejsで実行する際に `type: module` の指定が必要でした。 package.json を書き換えます。

```diff_json
{
+ "type":"module",
  "dependencies": {
    "@tidbcloud/serverless": "^0.0.5",
    "typescript": "^5.2.2"
  }
}
```

あとは、tscでトランスパイルして、実行するだけです。tscを使う際のオプションもES Module対応にする必要があります。この辺はNext.jsやパッケージマネージャーはよろしくやってくれるようですね。

```bash
% tsc -t es2020 -m esnext --moduleResolution node serverless.ts
% node serverless.js
```

### 5. 実行結果
```bash
%  node serverless.js
[ { id: 1, name: 'Taro Yamada' } ]
```

無事、出力されました。

## 型安全なSQL

ただこのままだとSQLを直書きしないといけないです。せっかくtypescriptを使っているので型安全にSQLを作りたい... という人は[Kyselyアダプタ](https://github.com/tidbcloud/kysely)を作っているようなので是非試して見ると良いと思います。
資格は必要か

# はじめに

こんな資格とっても実務じゃ役に立たないから不要だ。
こんな話は古くからずっと言われてきたのではないだろうか。
今回は資格取得賛成派の人間として、資格取得に関して意見を記載したいと思います。


# 資格は実務役に立たない？

これに関しては賛成派のわたしも概ねYesです。
ただ一方で「多く」という言葉をつけさせていただき、資格は実務の多くでは役に立たない。
というところかなと思います。
生かされるところは資格取得で勉強したごく一部です。
例えば、先日
https://qiita.com/jun2/items/518623e60946e619dec3
を投稿したわけですが、この内レプリケーションなどについてはシステムの規模感や、基板側で可用性を担保していればここまで深い知識は不要です。
一方で、解析情報などについてはこれからのパフォーマンスチューニングにおいて広い視野を持って分析できるようになったと思います。

# 勤め先にもよる

例えば転職をしようとした時に資格を重視するか？これは相手先にもよりますが、比較的若い層で実力主義的な企業においては実務経験を重視されると思います。
こういった働き方をされる場合は、実力が伴っていれば問題ないでしょう。
**資格は完全に不要です。**

一方で、勤め先が資格取得を奨励していたり、資格による優遇処置などがある場合、これにわざわざ歯向かうことはおすすめできません。
わざわざ資格を取得したら評価しますと言っているようなものなのですから。
最終評価者はよほど優れている or 劣っていない限りは数値で見えるもので判断するしかないのではないでしょうか。
すべての従業員の一挙手一投足を神のように見守ることは難しいわけですから。
評価しやすい数字を提供できるようにすることも評価してもらいたいなら必要だと思います。
いわゆるポイント稼ぎに近いかもしれませんね。
**ただ、そうだとしても努力ができる人間であるという証明には変わりはありません。**

数値と言った意味では業種にもよるでしょう。
業務成果が数値となって現れるイメージがありますが、こういった方も資格という意味では必要な資格を除けば資格は不要なのではないでしょうか？
一方でこういった方は大成するために別な努力を大量にしているはずです。（相手と話すために趣味を増やすとか、休日にコミュニケーションをとるとか）

# なんだかんだで嬉しいよ？

なんだかんだ言っても、自宅に証書が届くと嬉しいものですよ。
自分の努力が形になった瞬間と言いますか。
私は学生自体あまり努力ができる人間ではありませんでしたが、大人になって努力することが楽しいと思えるようになりました。
いささか遅かったかもしれませんが、自己実現のプランの目に見える要素の一つとして資格取得に前向きになってみてはどうでしょうか？

いいね！ストックなどモチベーションに繋がりますのでポチッていただけると嬉しいです(^^)
NeosVR コンパイラ その8

# 概要
NeosVRのオブジェクトを外部で生成するコンパイラを開発した。
俺コードの言語仕様を見直しする。

# 俺コードの言語仕様

- use Ore test0
rootのオブジェクトを実体化して、「test0」と名前を付ける。


- new LogiX.T
LogiXオブジェクトの「T」を実体化する。



- add LogiX.T
LogiXオブジェクトの「T」をrootのChildrenにpushする。


- {a} = LogiX.T
aは、バーチャルワイヤーでLogiX.Tの出力に繋ぐ
入力は無し。

- {} = LogiX.Display a
バーチャルワイヤーaを、LogiX.Displayの入力に繋ぐ
出力は無し。

# 俺コードのサンプル

LogiXノード、TとDisplayを繋ぐコード。
```
use Ore test0
new LogiX.T
new LogiX.Display
{a} = LogiX.T
{} = LogiX.Display a
add LogiX.T
add LogiX.Display
```

以上。
メモ　

内閣サイバーセキュリティ センター(NISC)
金融情報システムセンター
  PCIデータセキュリティ
  Wi-Fi(無線LAN)
経済産業省
情報処理推進機構(IPA)
 IPA 企業・組織向け (マネージメント、情報漏洩対策）
 IPA システム開発・運営向け
 IPA テクニカルウォッチ
 IPA　海外セキュリティ関連文書
Critical Security Controls
7JPCERT/CC
日本シーサート協議会
迷惑メール対策推進協議会(ASPC)
フィッシング対策協議会
データベース・セキュリティ ・コンソーシアム（DBSC)
日本ネットワークセキュリティ 協会(JNSA)
日本セキュリティオペレーション 事業者協議会(ISOG-J)
日本データセンター協会(JDCC)
日本スマートフォンセキュリティ 協会(JSSEC)
デジタル・フォレンジック研究会(IDF)
Netcraft
aguse
SHODAN
VirusTotal
ACTIVE(マルウェア対策支援)

日本サイバー犯罪対策センター(JC3)
NeosVR コンパイラ その7

# 概要
NeosVRのオブジェクトを外部で生成するコンパイラを開発した。
Phoenixのapiサーバが出来たのでテストする。

# 期待する動作
名前で呼び出すとオブジェクトが生成される。

# 仕組み
"Ore"でapiサーバを叩くと、jsonが返るので、evalで実体化する。

# テストコード

```
function make(name) {
	var endpoint1 = "http://localhost:4000/api/posts/q";
	var src = '{"post": {"body":"a", "title":"' + name + '"}}';
	var xhr = new XMLHttpRequest();
	xhr.onreadystatechange = function() {
		if (xhr.readyState == 4 && xhr.status == 200)
		{
			var oreo = JSON.parse(xhr.responseText);
			eval(name + " = " + decodeURIComponent(oreo.data.body));
		}
		else
		{
			//alert(xhr.readyState);
			//alert(xhr.status);
		}
	};
	xhr.open("POST", endpoint1, false);
	xhr.setRequestHeader('Content-Type', 'application/json');
	xhr.send(src);
}

var Ore = {};
function test() {
  make("Ore");
  alert(Ore.Object.Name.Data);
}




```

# 実行結果

成功

# 成果物

https://embed.plnkr.co/plunk/YGeYcLig6eOFLnon


以上。
Lyytiでデータを通じてより良いイベントを

<font color="Grey">*[Better events through data with Lyyti](https://aiven.io/blog/better-events-through-data-with-lyyti)の翻訳です。*</font>

2022年12月1日

# Lyytiでデータを通じてより良いイベントを

当社の顧客であるLyytiが、データによってどのようにイベント管理分野を変革しているかをご覧ください。

私たちは、セミナー、会議、ワークショップのようなイベントを、ユニークで特別なものだと認識しています。私たちは計画を立て、準備をし、イベントが開催され、そしてレトロセッションを行い、次回のための教訓を得る。そして、それで十分だと考えている。


しかし、リィティはもっとやりたいと考えている。


「イベント管理は、歴史的にデータを活用し、体系的にビジネスを発展させることにあまり重点を置いてきませんでした」とLyytiのCTOであるLauri Lehtinen氏は言う。「20年前のマーケティング予算の策定方法を思い返すと、ビジネスは数値化不可能で、特定のマーケティング投資の効果を測定することはできませんでした。その後、最新のツールやマーケティング・オートメーションが登場し、マーケティングはB2Bにおいて最も簡単に測定できるようになりました。私たちは、イベント・マネジメントでも同じことが起こることを望んでいます。"


Lyytiは、イベントプランナーがオンライン、オンサイト、ハイブリッドイベントを簡単に作成できるイベント管理スイートを提供している。登録管理、コミュニケーション・ツール、イベント・プラットフォーム・コネクタなど、通常のビルディング・ブロックを提供している。しかし、測定スイートや分析・マーケティングツールとの統合も提供している。顧客はこれらを使って出席者数を分析し、傾向や相関関係を見出すことができる。


「イベント管理は、よりデータ主導型に移行していると考えています。イベント管理者がデータとツールにアクセスできるようにすることで、この変革を加速させ、イベントの測定と開発をまったく新しいレベルに引き上げることができます」とラウリは言う。「私たちは、この道を歩み始めたばかりなのです」。


## マジックを支える技術


毎年80,000以上のイベントがLyytiを通じて開催され、2,000万人以上のユーザーがいます。これは大量のデータであり、Lyytiはそれを扱うための堅牢なフレームワークを必要としています。


Lyytiの技術スタックは現在、古いレガシーシステムと、まだ[Aiven for PostgreSQL®](https://aiven.io/postgresql)の上に構築されている新しいシステムの組み合わせです。バックエンドにはPHPと[Laravel](https://aiven.io/blog/add-aiven-database-magic-to-your-laravel-project)を使用し、TerraformとAnsible®でセットアップ全体を管理している。「今風に言えば、Infrastructure-as-codeですね」とラウリは微笑む。「このソリューションはGCPベースでコンテナ化されており、Kubernetesの複雑さを避けるためにCloud Runでオーケストレーションされている。


しかし、LyytiはGCPに完全に依存することを避けたかった。多くの理由があり、そのうちのいくつかは潜在的なGDPRのコンプライアンス問題に関係するものであり、そのうちのいくつかは、1つのカゴにすべての卵を入れることに対する、よりハイレベルな懸念であった。そのため、サードパーティのサービス・プロバイダーを探していた。いざというときに、あるクラウドから別のクラウドへのデータ転送を可能にしてくれる会社を探していたのだ。そして見つけたのがAivenだった。Aivenには嬉しいサプライズもあった。


「私たちの現在のシステムは、たまたまアップクラウド上で動いているのですが、Aivenはアップクラウド向けのプランを提供しているのです。世界的なハイパースケーラーがいる一方で、フィンランドのアップクラウドがそこにあるのですから。"


マネージド・データ・インフラストラクチャを持つことは、Lyytiにとって重要である。「特に、ユーザー数の増加に伴い、データベースのメンテナンスがシステム全体のメンテナンスの大部分を占めるようになります。Aivenは、自社で構築することが事実上不可能なオプションを提供してくれると同時に、インフラを機能的に維持してくれます。安全でスケーラブルな方法でデータベースをセットアップするなど、細かいニーズごとに人材を確保する心配はありません"


## データ主導の成功への構築


イベントの成功管理という新しいコンセプトが支持を得ている今、Lyytiの次のステップは、データ洞察力を高めることである。彼らは、マーケティング・ミックスの中でイベント・マネジメントにふさわしい地位を与えたいと考えており、そのためには、分析・予測ツールを顧客に提供する必要がある。顧客は、自分たちが主催するイベントの影響力を測定し、それに影響を与える変数を特定することができるようになる。


「例えば、あるイベントを企画し、会計セミナーの招待状を送ることを考えてみてください。「今日のLyytiシステムでも、技術的にはそれほど難しいことではありません。しかし、経理担当者やその他の財務担当者が、通常毎月20日前後に会議に出席し、月の変わり目には決して出席しないことを、すぐに知ることができるシステムがあったとしたらどうでしょう。そして、最も開封され、読まれる可能性の高い時期に、いつ招待状を送るべきかをシステムが教えてくれるとしたらどうだろう。"


#フィンランドの足元で


「Aiven、UpCloud、Lyytiのフィンランドでのつながりについて考えてみました。「SaaSプロバイダーとして、母国にルーツがあるテクノロジーを選択できるのは素晴らしいことです。フィンランド人はあまり多くのことに長けているわけではありませんが、インターネットのバックエンド技術の大部分はフィンランドで生まれました。フィンランドは、LinuxやMySQLから80年代のIRCにインスパイアされたメッセージングシステムに至るまで、現代のインターネットの構成要素の多くを生み出してきた。Aivenも含め、フィンランドの基盤の上にLyytiのクールなものを構築できるのは素晴らしいことだ。"
Javaで「日時を加算/減算する」の動作を確認してみた

# 概要

Javaで「日時を加算/減算する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/calendar/index4.html

# 実装

以下のファイルを作成しました。
```TestCalendar3.java
import java.util.Calendar;

class TestCalendar3{
  public static void main(String args[]){

    Calendar calendar = Calendar.getInstance();

    System.out.println("日時を2005/12/30に設定します");
    calendar.set(2005, 11, 30);
    dispCalendar(calendar);

    System.out.println("-- -- -- -- -- --");

    System.out.println("日を1ずつ増加させます");
    for (int i = 0 ; i < 6 ; i++){
      calendar.add(Calendar.DAY_OF_MONTH, 1);
      dispCalendar(calendar);
    }

    System.out.println("-- -- -- -- -- --");

    System.out.println("日時を2006/1/31に設定します");
    calendar.set(2006, 0, 31);
    dispCalendar(calendar);

    System.out.println("-- -- -- -- -- --");

    System.out.println("月を1ずつ増加させます");
    for (int i = 0 ; i < 4 ; i++){
      calendar.add(Calendar.MONTH, 1);
      dispCalendar(calendar);
    }
  }

  private static void dispCalendar(Calendar calendar){
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH) + 1;
    int day = calendar.get(Calendar.DATE);

    StringBuffer sb = new StringBuffer();
    sb.append("設定されている日時は");
    sb.append(year + "年" + month + "月" + day + "日");
    sb.append("です。");

    System.out.println(new String(sb));
  }
}
```

以下のコマンドを実行しました。
```
$ javac TestCalendar3.java 
$ java TestCalendar3 
日時を2005/12/30に設定します
設定されている日時は2005年12月30日です。
-- -- -- -- -- --
日を1ずつ増加させます
設定されている日時は2005年12月31日です。
設定されている日時は2006年1月1日です。
設定されている日時は2006年1月2日です。
設定されている日時は2006年1月3日です。
設定されている日時は2006年1月4日です。
設定されている日時は2006年1月5日です。
-- -- -- -- -- --
日時を2006/1/31に設定します
設定されている日時は2006年1月31日です。
-- -- -- -- -- --
月を1ずつ増加させます
設定されている日時は2006年2月28日です。
設定されている日時は2006年3月28日です。
設定されている日時は2006年4月28日です。
設定されている日時は2006年5月28日です。
```

# まとめ

何かの役に立てばと。
tabby でフォントサイズを大きくするショートカット

Windows 10 上で使用している tabby で、フォントサイズを小さくしたところ元に戻せなくなってしまうという現象が発生しました。tabby ではフォントサイズを大きくする (Zoom in) ショートカットには `Ctrl + '='` が割り当てられています。しかし日本語キーボードに `=` はないので、 `Ctrl + Shift + '+'` に置き換えてしまいましょう。

または `Ctrl + 0` で拡大率をリセットしましょう。

Before:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78152/3098e522-a313-0213-7d09-c9f0932c1275.png)

After:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78152/70429a14-be06-b21e-af85-9c593eca005b.png)

以下ソース

https://github.com/Eugeny/tabby/issues/24

https://github.com/Eugeny/tabby/commit/353a4da083c6f1faad643773b186dd39f2cc70f8
2023/9/26主にITとかセキュリティの記事

脆弱性情報データベース(CVE)に多数の古いバグが登録される問題発覚(9/24)
https://news.mynavi.jp/techplus/article/20230924-2776603/

『スプラトゥーン3』非正規アプリの使用に厳重注意　広がる外部サービス活用ーー“グレー”は“白”か、“黒”か(9/24)
https://news.yahoo.co.jp/articles/5035bbb56866e4e7a5af243009e325099d0b516e

テルモ、医療機器にサイバー対策　ソフト欠陥素早く修正(9/24)
https://www.nikkei.com/article/DGXZQOUC2145N0R20C23A8000000/

アングル：バルカン半島のミクロ国家「リベルランド」、自由と暗号資産で描く未来(9/24)
https://jp.reuters.com/world/europe/CTZSEJVBGFJODOD3FX6AJMPINE-2023-09-23/

電子書籍を中古販売？　ブロックチェーンが可能にした「NFT電子書籍」(9/25)
https://xtech.nikkei.com/atcl/nxt/column/18/01679/073100125/

JPCERT/CCが注意喚起　アップデートでは対応が不十分(9/25)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031800050/091900055/

住友生命が1万人で生成AI活用、独自プロンプトを用意し企画書作成が1日で完了(9/25)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/08425/

安保の観点で高まる国内産ニーズ、建設分野のドローン業界地図(9/25)
https://xtech.nikkei.com/atcl/nxt/column/18/02541/080700003/

SBOM（Software Bill of Materials）(9/25)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/091500151/

生成AIに舵を振り切る　システム開発の変革を先導(9/25)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600003/092000072/

美しいコードを書けても先がない　エンジニアと生成AIが共存する道(9/25)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/091400148/

生成AIに舵を振り切る　システム開発の変革を先導(9/25)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600003/092000072/

SaaS版「SAP S/4HANA」導入　バージョンアップに堪える体制が鍵(9/25)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600004/091500140/

DNSによる負荷分散(9/25)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031500132/091900020/
Oracleの設定ファイルについて

### 1.tnsnames.ora

データベースに接続する側に配備しておくファイル。
「ネットサービス名」を「接続記述子」に変換してOracleクライアントからDBサーバーに接続することができるようになる。

### 2.listener.ora

Oracleサーバーへの接続を受け付けるリスナーの設定を行う

### 3.sqlnet.ora

ログファイルの出力先などを設定するファイル
Azure WebAppsを定期的に再起動する方法

定期的にAzure WebAppsを再起動させたい。
Azure Automationを使ってもよいが、PowerShellも書きたくない人に向けてLogicAppsでの実現方法を解説する。

## LogicAppsデザイナー全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/b198f910-31f8-8a82-14fd-61b2c44c52c3.png)


- スケジュール 「Recurrence(繰り返し)」トリガー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/3a180d26-2747-3a50-a1b7-d9c5e654d28e.png)

- Azure AppService 「Webアプリの再起動」アクション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/c6f2a0ba-5a74-7d9a-5c5f-f4f20daf2371.png)

認証方式はマネージドIDを使う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/9836afd5-0204-a7fa-786a-0123568da584.png)

LogicAppsのIDから有効化
有効化したIDをWebAppsのIAMに追加
ロールは「Webサイト共同作成者」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/b2a56912-2021-19ad-dbf9-4c1bf10d4510.png)

実際に再起動されたかは、WebAppsのアクティビティ ログから確認できる

## 料金
最初の4,000回は無料なので無料で利用できそう
https://azure.microsoft.com/ja-jp/pricing/details/logic-apps/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206219/80bc62e3-0d4e-d4b6-149c-9e0b80d5ed71.png)
【分析】海外ドラマを例に適合度検定を行う

# 本記事の目的
大好きな海外ドラマ（とあるシチュエーションコメディ）を見ていて気になったことがありました。
登場人物の物理学者（博士）は、友人の発言がきっかけで研究資金調達のためラスベガスへ行った際にこんな事を言ってました。
「（吹替）何時間もこのルーレットを観察してカイ二乗検定をしたんだ！それでボールが落ちやすいポケットがどれなのかわかった！32,17,5だ！このルーレット盤交換しないでくれる？大きく賭けたい！！」
この後、カジノスタッフに連行されてしまう博士ですが・・・。
ここでは博士が行ったカイ二乗検定について想像しながら見ていきたいと思います。

# ルーレットのデータ
博士は何時間もこのルーレットを観察して・・・と言っているので、ここでは3時間と仮定、ルーレット1ゲームを1分と仮定すると、180個のデータを観測したとします。
ルーレットで観測できるデータは以下の画像で見ていきます。当たり障りのないところでWikipedia様からの引用です。
#### ルーレット回転盤
<img width="500" alt="ルーレット回転盤.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642161/1a6e7428-82b6-5ce4-5b13-95c9580e2276.jpeg">

#### ルーレットテーブル
<img width="500" alt="ルーレット2.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2642161/13fca86b-cf63-c358-a348-ce59f600cc5c.jpeg">

（画像出典：https://ja.wikipedia.org/wiki/%E3%83%AB%E3%83%BC%E3%83%AC%E3%83%83%E3%83%88）

ディーラーは1個のボールをルーレット回転盤に投げ入れるので、1ゲームで得られるデータは1個になります。
また、赤黒に数字が分かれてますが、数字の重複はないため、0~36までのいずれかにボールが落ちるということになります。ここではサンプル的に以下のデータを使用していきます。

|ポケット（ルーレット盤の数字）|　　出現回数（観測度数）　　|
|:---:|:---:|
|0	|2
|1	|6	
|2	|5	
|3	|4	
|4	|2	
|5	|11	
|6	|5	
|7	|2	
|8	|5	
|9	|4	
|10	|6	
|11	|2	
|12	|6	
|13	|4	
|14	|8	
|15	|7	
|16	|2	
|17	|12	
|18	|3	
|19	|4	
|20	|5	
|21	|6	
|22	|3	
|23	|7	
|24	|3	
|25	|8	
|26	|1	
|27	|5	
|28	|1	
|29	|6	
|30	|4	
|31	|2	
|32	|11	
|33	|7	
|34	|5	
|35	|4	
|36	|2	

# 適合度検定
ルーレットデータを見ると5、17、32の出現回数が他より多いことがわかりますが（意図的に増やしてます。）、これが統計的に理論値と差があるのか、ないのかわかりません。
カイ二乗検定をよく使うケースとして、2×複数のクロス表の2変数（行列）が独立か、独立でないかを検定する「独立性の検定」と、観測度数分布が理論上の期待度数分布（理論値）とどれだけ一致しているかを検定する「適合度検定」があります。
今回は、後者の適合度検定を使用し、全てのポケットには等しい確率でボールが入るとして180/37※を期待度数とする理論値と観測値の分布が一致しているかを検定していきます。
※180はデータ総数、37は全ポケット数

### 帰無仮説と対立仮説
帰無仮説・・・観測した分布は理論値の分布と一致する（度数分布に偏りがない）
対立仮説・・・観測した分布は理論値の分布と一致しない（度数分布に偏りがある）

# 適合度検定の実施
### 計算方法は多くの記事や書籍で記載されていますし、ExcelでもPythonでも簡単に算出できますので省略します。
(観測度数ー期待度数)²)/期待度数　を計算し、その総和（検定統計量Χ²）を求めますが、今回の期待度数iはiによらず全て同じ値（=180/37）です。
```math
 \chi^2=\sum \frac{(観測度数i-期待度数i)^2}{期待度数i}
```

### 結果（カイ二乗値とp値）
Pythonで計算した結果を以下に示します。有意水準は5%とします。
```
from scipy import stats

observed_freq = [2, 6, 5, 4, 2, 11,　5,　2,　5,　4,　6,　2,　6,　4,　8,　7,　2,　12,　3,　4,　5,　6,　3,　7,　3,　8,　1,　5,　1,　6,　4,　2,　11,　7,　5,　4,　2]
expected_freq = []
for i in range(0,37):
    expected_freq.append(180/37)
result = stats.chisquare(observed_freq, expected_freq)
print('カイ二乗値:{0}  p値:{1}'.format(round(result.statistic,3),round(result.pvalue,3)))
```
カイ二乗値:55.156  p値:0.021
p値<0.05のため、帰無仮説を棄却し、検定結果は対立仮説を採択「観測した分布は理論値の分布と一致しない（度数分布に偏りがある）」となります。

# 考察
博士は、上記のような検定を行ったのかなと想像します。
ルーレットを観察し収集したデータは、理論データ（全てのポケットに等しくボールは入り、偏りがないデータ）と比較して、偏りがある、と判断し、観測データの分布から5、17、32の相対度数が他より高いので、ボールが落ちやすいポケットであると判断したのではないでしょうか。
ポケットだけでなく、赤黒の色でも偏りを見ているかもしれません。

あくまでドラマの話ですし想像でしかないですが、同じように考えてみたことのある人は教えてください！
CVPR2023の枝刈り論文 (1)

# 概要

この記事では、[CVPR2023](https://cvpr2023.thecvf.com/Conferences/2023)の枝刈り論文を紹介します。[^1]

[^1]: 画像や数式は論文から引用しています。


# X-Pruner: eXplainable Pruning for Vision Transformers

https://openaccess.thecvf.com/content/CVPR2023/html/Yu_X-Pruner_eXplainable_Pruning_for_Vision_Transformers_CVPR_2023_paper.html

- 概要：X-Pruner. Vision Transformer向け枝刈り
- 新規性：枝刈りの基準の説明性を考慮して設計した。
- キモ：各マスクのクラスへの寄与を測る。


# Training Debiased Subnetworks With Contrastive Weight Pruning

https://openaccess.thecvf.com/content/CVPR2023/html/Park_Training_Debiased_Subnetworks_With_Contrastive_Weight_Pruning_CVPR_2023_paper.html

- 概要：DCWP. 偏りのある（データと特徴に誤った偏りのある）ニューラルネットワークの理論的考察
- 新規性：偏りのあるニューラルネットワークの部分ネットワークに最適なニューラルネットワークがあるかの理論的考察。


# CP3: Channel Pruning Plug-In for Point-Based Networks

https://openaccess.thecvf.com/content/CVPR2023/html/Huang_CP3_Channel_Pruning_Plug-In_for_Point-Based_Networks_CVPR_2023_paper.html

- 概要：ポイントクラウド向け3次元DNNのチャンネル枝刈り
- 新規性：2次元の枝刈りの方法を3次元でも効果的に扱えるようにする。
- キモ：チャンネル重要度にFig. 1の2)3)の重要度を加える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/6abf7fd6-351a-92b2-6c79-9ad85bada8ea.png)


# Global Vision Transformer Pruning With Hessian-Aware Saliency

https://openaccess.thecvf.com/content/CVPR2023/html/Yang_Global_Vision_Transformer_Pruning_With_Hessian-Aware_Saliency_CVPR_2023_paper.html

- 概要：NViT. 刈りやすいViT
- 研究機関：NVIDIA
- 新規性：DeiTからGlobal Pruningして小さなブロックの組み合わせによるモデルNViTを提案した。
- キモ：DeiTからHessian-based structure pruningする。


# Bias in Pruned Vision Models: In-Depth Analysis and Countermeasures

https://openaccess.thecvf.com/content/CVPR2023/papers/Iofinova_Bias_in_Pruned_Vision_Models_In-Depth_Analysis_and_Countermeasures_CVPR_2023_paper.pdf

- 概要：枝刈りと帰納バイアスの関係をResNetで解析した。
Hyperledger FireFlyを触ってみる

先日から、ブロックチェーン関連の調査をしているときに、Hyperledger FireFlyというフレームワークに出会いました。
Hyperledger FireFlyは、分散型のデジタルエコシステムを構築および管理するためのオープンソースということで各メディアで紹介がされていることを知り、今回は、Hyperledger FireFlyの調査した概要を紹介したいと思います。

## Hyperledger FireFlyの概要
Hyperledger FireFlyは、分散型のデジタルエコシステムを構築するためのフレームワークです。これは、異なるデータソースやエンタープライズシステム間でデータを共有し、効率的なプロセスを実現するのに役立ちます。

## Hyperledger FireFly の入手

### 本体のダウンロード
Hyperledger FireFlyはこちらからダウンロードができます。
執筆時点では、v1.2.2が最新版となります。

https://github.com/hyperledger/firefly-cli/releases/tag/v1.2.2

### FireFly公式マニュアル

https://hyperledger.github.io/firefly/

## Hyperledger FireFlyセットアップ
以下のURLの手順通りに進めると環境が出来上がります。

https://hyperledger.github.io/firefly/gettingstarted/

### FireFly UI/UX

メインUI
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/5f5042ed-0d81-b883-81aa-c3425974b893.png)


Sandbox
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/6ec0000f-2ab2-6d2a-2707-fd28affd60c4.png)


### IPFS管理画面（api UI）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514304/40bcf848-1a02-539b-9df9-992efba1c6a5.png)

:::note info
IPFSサービスもDocker上に起動します。
以下のURLで確認することができます。
api UI :
http://localhost:10206/webui

gateway UI:
http://localhost:10207/ipfs/<CID>

:::

## ffコマンド

### スタック一覧表示
セットアップしたスタックを一覧表示します。
```
$ ff list
FireFly Stacks:
dev
```

### スタックの起動/停止
スタックの起動、停止します。
```
$ ff start dev # devスタックの起動
$ ff stop dev # devスタックの停止
```

### スタックの削除
スタックを削除します。
```
$ ff remove dev
```

### ユーザのアドレスとプライベートキー
スタック内のユーザのアドレスとプライベートキーを表示します。
```
$ ff accounts list dev
[
  {
    "address": "0xaBcDeFgH1234567890iJkLmNoPqRsTuVwXyZ",
    "privateKey": "aBcDeFgH1234567890iJkLmNoPqRsTuVwXyZWXYZabcdEfghIjKlMnOpQrStU"
  }
]
```

## 次回は
Hyperledger FireFlyとevmconnectorを使用して、NFT登録について動作確認をしたいと思います。
【Java】オーバーロードとオーバーライド

## オーバーロード
* 同じ名前で引数が異なるメソッドを<INS>複数定義</INS>すること。
* 同一クラスで行われる。
```java
public class Main{
	public static void  main(String[] args) {
		Sushi s = new Sushi();
		s.neta("たまご");
		s.neta("サーモン",220);
		s.neta("いくら",480,"北海道");
		s.neta("ウニ",800,"羅臼");
	}
}
class Sushi {
	void neta(String name) {
		System.out.println(name + " 通常価格 110円");
	}
	void neta(String name,int price){
		System.out.println(name + " 時価 " + price+ "円");
	}
	void neta(String name,int price,String area) {
		System.out.println(area + name + " 時価 " + price + "円");
	}
}
```
【実行】
![スクリーンショット 2023-09-25 214613.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/1e99ba98-8dab-5e91-5652-129e09b6cf40.png)


## オーバーライド
* 継承時、<INS>親クラスと同じ名前のメソッドを子クラスで再定義</INS>すること。
* 継承クラス間で行われる。
```java
public class Main{
	public static void  main(String[] args) {
		Sushi s = new Sushi("うみ寿司");
		event e = new event("10周年キャンペーン");
		
		s.store();
		s.neta("納豆巻き");

		e.store();
		e.neta("納豆巻き");
	}
}
class Sushi { // 親クラス
	String store;
	 Sushi(String store){
		 this.store = store;	 
	 }
	void store(){
		System.out.println(this.store);
	}
	void neta(String name) {
		System.out.println(name + " 通常価格 110円");
	}
}
class event extends Sushi { //子クラス
	public event(String name) {
		super(name);
	}
	void neta(String name) {
		System.out.println(name + "通常価格 99円");
	}
}
```
【実行】
![スクリーンショット 2023-09-26 013140.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3520365/73f221b7-e617-e910-eeb9-4b0d72937863.png)

- - -

『オーバーロード』は複数定義、『オーバーライド』は再定義。
どちらもメソッドに関与する言葉だが用途は全く違うので混同注意！！！
urqlのPersisted QueriesでメソッドがGETにならなかった

## 経緯
バックエンドをNestJS(Fastify互換)、フロントエンドをNext.js(App Router)で開発しており、GraphQLのPersisted Queriesを利用するにあたってフロントエンドにurqlを導入した
その際に、公式に書いてあった方法で設定を試みたがリクエストを送る際にPersisted Queriesが有効にならなかった

## バージョン等
    "@urql/core": "^4.1.1",
    "@urql/exchange-persisted": "^4.1.0",
    "@urql/next": "^1.0.0",
    "graphql": "^16.7.1",
    "next": "13.4.7",
    "urql": "^4.0.5"

## やったこと

GraphQL自体の導入は終わっていたので、Persisted Queries導入のため以下のようにpersistedExchangeを設定に追記したが、Persisted Queries導入前と挙動が変わらなかった
```ts
createClient({
    url: 'http://localhost:8080/graphql', // 例
    exchanges: [
      cacheExchange,
      fetchExchange,

      // ↓のpersistedExchangeを追記した
      persistedExchange({
        preferGetForPersistedQueries: true
      })
    ]
})
```

## 結論
urqlのexchangeは記述する順番を間違うと動かない
今回だとfetchExchangeをpersistedExchangeの後に記述することで無事にPersisted Queriesが有効化された
詳細は[こちらの記事](https://qiita.com/mu-suke08/items/40d42919189d16f78e9d#%E6%B3%A8%E6%84%8F%E7%82%B9)が参考になった

完成形のコードは以下
```ts
createClient({
    url: 'http://localhost:8080/graphql', // 例
    exchanges: [
      cacheExchange,

      // ↓のpersistedExchangeを追記した
      persistedExchange({
        preferGetForPersistedQueries: true
      }),
      fetchExchange // fetchExchangeをpersistedExchangeの後に記述
    ]
})
```
Heredoc / Nowdoc Converter【ヒアドキュメント】

<p class="codepen" data-height="640" data-default-tab="result" data-slug-hash="oNJqoYG" data-user="04" style="height: 640px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/04/pen/oNJqoYG">
  Heredoc/Nowdoc Converter</a> by John Doe (<a href="https://codepen.io/04">@04</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

ヒアドキュメントを手動で書き換えるのはめんどいので変換ツール作りました。
`echo <<<END`と`$hoge = <<<END`とHeredocとNowdocに対応しています

ダブルクォーテーション使うでもいいと思います

https://stackoverflow.com/questions/38352808/what-is-differece-between-heredoc-and-double-quoted-strings-and-also-nowdoc-and
Do not use HEREDOC or NOWDOC syntax in your plugins

<p class="codepen" data-height="640" data-default-tab="result" data-slug-hash="oNJqoYG" data-user="04" style="height: 640px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/04/pen/oNJqoYG">
  Heredoc/Nowdoc Converter</a> by John Doe (<a href="https://codepen.io/04">@04</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

ヒアドキュメントを手動で書き換えるのはめんどいので変換ツール作りました。
`echo <<<END`と`$hoge = <<<END`とHeredocとNowdocに対応しています

# Do not use HEREDOC or NOWDOC syntax in your plugins

While both are totally valid, and in many ways desirable features of PHP that allow you to output content, it comes with a cost that is too high for most plugins.

The primary issue is that most (if not all) codesniffers won't detect lack of escaping in code when you use HEREDOC or NOWDOC. While there are ways around this they have the end result of dashing all that readability to the rubbish pile and leaving you with a jumbled mess that won't properly be scanned.

We feel the risk here is much higher than the benefits, which is why we don't permit their use.


ダブルクォーテーション使うでもいいと思います

https://stackoverflow.com/questions/38352808/what-is-differece-between-heredoc-and-double-quoted-strings-and-also-nowdoc-and
Push通知でハマったお話

## 初めに
廃止予定のclassicなAPIでの実装話
この先、切り替え対応もあるので、その後も起きるのかは要検証

### 廃止関連の参考記事

https://qiita.com/ynakamuuuuu/items/0dbf660e8c7947f76bdd

#### 何があったか
A,B同じ実装である前提の中

Aという環境では、Push通知画像が表示されて
Bという環境では、Push通知画像が表示されない

諸々、確認した結果、httpとhttpsの差が有った

B環境 httpでブラウザからの画像にアクセスは可能
試しにA環境上で、https -> httpの画像パスに変更した所再現

本当の原因がここにあるかまでは追えてないですがとりあえずこれで解決の方向になりそう

どなたか、情報持ってたらコメントくださいませませ。
SwiftUI ProgressViewのカスタマイズでできること・できないこと

# はじめに
本記事で取り上げるカスタマイズの内容はユースケースが限定的ですが、誰かしらのためになれば嬉しいです。
Horizontalな進捗バーを扱います。

# 標準のスタイル
`value`に0.0〜1.0を指定すると、進捗バーを実装できます。

```swift
ProgressView(value: 0.5)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/2ad4be00-0075-8c3d-6a01-0db5a34454eb.png)

# バーの色を変える
`tint(_:)`を使うとバーの色を変えることができます。

```swift
ProgressView(value: 0.5)
    .tint(.green)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/b3693810-eb92-96fd-4d88-41791d4867d9.png)

# バーの背景色を変える（変えてるように見せることはできる）
`background(:_)`を使えばいける気がしたんですが、左端をよーく見ると背景色が少し見えてしまっています。
バーの背景色を変更したのではなく、ProgressView全体の背景色を変更したことになるわけですね（後述の[ちなみに](#ちなみに)を参照ください）。
そして、バーの背景色は透過なので、ProgressView全体の背景色がバーの背景色を通して見えている、という状態です。なので以下の場合、純粋な`Color.red`が見えているわけではないです。

バーの背景色を変更するModifierは用意されていないようでした。

```swift
ProgressView(value: 0.5)
    .tint(.green)
    .background(Color.red)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/8d7d9ffb-1a26-2050-e0c2-c249a7d15a36.png)

↓拡大してみると、左端に赤色が見えている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/100fb769-064d-86f5-5a52-f45eb0d33817.png)

`clipShape(:_)`を使うことで、左端に見えていた赤色を見えないようにすることはできました。

```swift
ProgressView(value: 0.5)
    .tint(.green)
    .background(Color.red)
    .clipShape(RoundedRectangle(cornerRadius: 8))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/2003f2ff-ce13-b35c-e551-c152d74f1e30.png)

# 進捗バーの高さを変える
`scaleEffect(x:y:)`を使うと高さを変えることができます（デフォルトの高さは`4.0`になるようです）。
角丸のRadiusを変えられないので、あまり高さを大きくすると見栄えが悪くなりそうですね。

```swift
ProgressView(value: 0.5)
    .scaleEffect(x: 1, y: 4)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/fd1f5aeb-0766-fc66-b598-3f8a2d37d7fb.png)

バーの色変更と組み合わせてみます。

```swift
ProgressView(value: 0.5)
    .tint(.green)
    .background(Color.red)
    .clipShape(RoundedRectangle(cornerRadius: 8))
    .scaleEffect(x: 1, y: 4)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/c5ca0f71-f202-c136-fbbe-81ff85114ca1.png)

## 参考
https://stackoverflow.com/a/64937217

# 進捗バーの角丸を無くすことはできない
進捗バーはデフォルトで角丸になっていて、これを無くすためのAPIは提供されていないようです（ProgressViewStyleでもカスタムできなそう）。
自分が関わっているプロジェクトでは角が四角のデザインが要求されているので、ちょっと困っています...（デザイン変えてもらうか、ビューを自作するしかないかなあ...）

# ちなみに
ProgressViewのイニシャライザには、`label`と`currentValueLabel`という2つのViewBuilderクロージャを渡すことができます。

```swift
ProgressView(value: 0.5) {
    Text("loading...")
} currentValueLabel: {
    Text("50%")
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/0b61aca0-32cc-5bd6-0deb-9139ce75272a.png)

このビューに対して、前述のバーの色変更をしてみましょう。

```swift
ProgressView(value: 0.5) {
    Text("loading...")
} currentValueLabel: {
    Text("50%")
}
    .tint(.green)
    .background(Color.red)
```

前述の通り、`background(:_)`はバーの背景色ではなく、ProgressView全体の背景色を指定していることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/b737a70b-86ce-e26b-a2f2-76eb27a2dee4.png)
【RSpec】備忘録：stub_constメソッド、create_listメソッド


## stub_constで定数をスタブ化する

:::note
RSpecのテストフレームワークを使用しているRubyやRuby on Railsのプロジェクトで見られるメソッドの一つ。一時的に定数の値をスタブ（つまり、偽の値に置き換える）するのに役立つ。
:::

#### 使用例
特定の定数の値に依存するコードをテストしている場合、その定数の値を一時的に変更してテストシナリオを検証することができる。

```ruby
it "does something based on MY_CONSTANT" do
  stub_const("MyClass::MY_CONSTANT", "fake_value")
  
  # このブロック内では、MyClass::MY_CONSTANTは"fake_value"として扱われる
  expect(MyClass.some_method).to eq(expected_result_based_on_fake_value)
end
```

この例では、`MyClass::MY_CONSTANT`を`fake_value`に一時的に置き換え、その新しい値に基づいて動作するかどうかをテストする。

**stub_const**はテストの実行中だけ定数の値を変更し。テストが完了すると、定数の元の値が復元される。


## create_listを使用して、複数のインスタンスをまとめて作成する
:::note
FactoryBotのメソッドの一つで、指定されたファクトリ名を使って複数のレコードを一度に作成するために使用される。
:::

#### 使用例
以下のようなFactoryBotの定義あるときに、

```ruby
FactoryBot.define do
  factory :user do
    name { "John Doe" }
    age { 30 }
  end
end
```

5人のユーザーを一度に作成する場合は以下のようになる。

```ruby
users = create_list(:user, 5)
```

べてのユーザーに共通の属性をオーバーライドしたい場合は、以下のようになる。

```ruby
users = create_list(:user, 5, age: 25)
```
【Python】sympyの行列をlatex(matplotlib)で表示する

<h2>概要</h2>
sympyは代数の計算を行うことができる標準ライブラリです。<br>
sympy.latex()関数を用いることで簡単に計算式のlatexコマンドを得ることができますが、行列のlatexコマンドをmatplotlibで表示したところエラーが発生したため、その原因と解決策を書き残しておきます。

<h2>エラー</h2>
行列式を代入しlatex()でlatexコマンドへ変換した後、matplotlibでその数式を表示します。

```python
from sympy import symbols, Matrix, latex
import matplotlib.pyplot as plt

#xを入力時のシンボルとして指定
x = symbols('x')

#行列を定義
matrix = symbols("a:z", Integer=True)
matrix = Matrix()
m = Matrix([
    [x**3 + 2, x - 2],
    [2*x + 3, x**2 - x + 4]])

#mをlatexに変換
m = latex(m)

#図を定義
plt.rcParams["text.usetex"] = True
fig, ax = plt.subplots()
tex1 = m
ax.axis('off')
ax.text(0.5, 0.5, m, ha='center', va='center', fontsize=15)

#式の表示
plt.show(fig)
```

しかし、上記を実行すると下記の様なランタイムエラーとなってしまいました。

```c ruby: 出力結果
RuntimeError: latex was not able to process the following string:
b'\\\\left[\\\\begin{matrix}x^{3} + 2 & x - 2\\\\\\\\2 x + 3 & x^{2} - x +4\\\\end{matrix}\\\\right]'
Here is the full command invocation and its output:
latex -interaction=nonstopmode --halt-on-error --output-directory=tmp2rn45omx 704bb5753e3d22277de033293f40157c.tex
This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023) (preloaded format=latex)
 restricted \write18 enabled.
entering extended mode
....
```

<h2>原因</h2>
エラーコードにはlatexの記法が間違っていると書かれていますが、厳密には

`sympy.latex()` の戻り値はamsmathパッケージが使用された記法であり、デフォルトのmatplotlibではそのパッケージが有効になっていないためエラーを引き起こしています。

<h2>解決策</h2>
text.latex.preambleの設定からamsmathパッケージを有効にすることでエラーを防ぐことができます。

```python
m = r"$" + latex(m) + r"$"

plt.rcParams["text.usetex"] = True
plt.rcParams["text.latex.preamble"] = r"\usepackage{amsmath}"
```


<br>出力結果
![スクリーンショット 2023-09-25 234436.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564700/740f38a8-1425-fd91-d5fa-66197a236d11.png)


また拡張子.mplstyleに設定を保存し、それを呼び出すことでも有効にできます。
```python
plt.style.use(['スタイル名'])
```

参考:

https://matplotlib.org/stable/users/explain/customizing.html

<H2>おわりに</H2>
どこかでmatplotlibのlatex表記ではパッケージを利用できないという記述を見つけました。だからわざわざamsmath表記を数式モード表記に置換するというコードを書いたにも拘わらず、後からパッケージの使い方を知り無駄になってしまいました。
これを見て皆さんが同じ羽目に遭わないといいなと思います。
VSCodeにスニペットを登録する方法

## はじめに
VSCodeにスニペットを登録する手順です。
サンプルも紹介します。
スニペットを利用する言語を特定して設定できるのですごく便利です。
もちろん、言語関係なく、すべてのファイルに対して適用することも可能です。
（自分で作ったスニペットのprefixが覚えられないのは私だけでしょうか…）

## 手順
ファイル > ユーザー設定 > ユーザ スニペットの作成
とクリックし進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/9bf5484e-3de9-329c-8c48-c3eab2742e3f.png)

以下の表示になると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/b0cd2719-4cf8-7d6d-18ad-817b1e544939.png)

スニペットを適用する言語（拡張子）が決まっている場合は対象のものを選択。
    決まっていない。またはグローバルに設定したい場合は「新しいグローバル スニペット ファイル」を選択

「all-language」など適宜ファイル名を入力し、Enter。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/2c20fa32-371b-87b3-3eb2-ce34f12a732e.png)

今回は「all-language」としてEnter押下し、「all-language.code-snipets」ファイルを生成しました。
ファイルの中身を以下のように編集。
```json:all-language.code-snipets
{
	"SampleSnipets": {
		"prefix": "aaa",
		"body": [
			"サンプルスニペットです。"
		],
		"description": "スニペットの説明を記載"
	}
}
```

動作確認してみましょう。
prefixに設定した「aaa」を入力。
「Enter」または「Tab」キーを押下すると、bodyに設定した内容が入力されます。

![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/2ba5c63f-a2a1-3ecf-8278-738f02dfd48f.gif)


先頭に入力したSampleSnipets（キー名）はprefixを入力した際に候補として表示されます。
descriptionに設定した内容は、候補の右側、「>」を押下すると表示、非表示の制御が可能です。

## 終わりに
スニペットの登録は簡単ですね。

サンプルとして、GIF、コードの順に二つ紹介。

1: 「logcp」と入力すると、console.log('CheckPoint $1');
が入力され「$1」の箇所にカーソルが設定される。

![Animation1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/3023f97b-0ae7-5966-f234-d15d593e87cf.gif)

```json
  "LogCheckpoint": {
    "prefix": "logcp",
    "body": [
      "console.log('CheckPoint $1');"
    ],
    "description": "Log a checkpoint message"
  }
```

2: 「newfc」と入力すると、関数コンポーネントのひな形をファイル名から補完して作成する。

![Animation2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/97ee08e6-c9f8-1028-7d89-4b4814978be1.gif)


```json
		"NewFC": {
    "prefix": "newfc",
    "body": [
      "import { FC } from 'react';",
      "",
      "const $TM_FILENAME_BASE: FC = () => {",
      "  console.log('$TM_FILENAME_BASE');",
      "  return (",
      "    <>",
      "      <div>$TM_FILENAME_BASE</div>",
      "    </>",
      "  );",
      "};",
      "",
      "export default $TM_FILENAME_BASE;"
    ],
    "description": "Create a new React functional component"
  }
```
【Zod】ファイルのバリデーション

以下のようにすることでファイルのバリデーションを設定できます。

```js
const schema = z.object({
  avatar: z
    .any()
    .refine(
      (files) => ['image/jpeg', 'image/png'].includes(files?.[0]?.type),
      '.jpg, .jpeg, .pngのファイルを選択してください。'
    )
    .refine(
      (files) => files?.[0]?.size <= 1 * 1024 * 1024,
      '3MB以下のファイルを選択してください。'
    ),
})


```
【プラクティス紹介】1分でさらっと分かる「ハンガーフライト」

## プラクティス名（別名）
ハンガーフライト　（ハンガートーク、社内勉強会、Hometown Story）

## プラクティスの目的・狙い
* ベテランや先駆者の経験を共有する場をつくる
* 組織や部署の垣根を越えて、仲間の輪を広げる

## どんな時に使うか
* 若手や未経験者に対し、教科書だけでは分からないノウハウを継承したい時
* 特定の技術やスキルについて興味がある人を増やしたい時

## 実施手順
1. 日時/登壇者/参加対象者（原則参加任意）などを決め、開催案内を発信する
1. 事前に登壇者とは話すテーマや当日の進め方などを擦り合わせておく
1. こちらから一方的に経験談を伝えるだけではなく、参加者と対話する仕掛けもあるとよい


:::note info
テーマ例
・新しい技術の取り組み事例や成果（推しツールの紹介など）
・過去に経験した問題とその解決策（失敗談でもよい）
・今、社内でホットな話題に関するディスカッション
:::

## アレンジ例
* 簡単な食べ物/飲み物を用意する（最初は定時外にボランティアな運営で始めることが多いため）
* 必要なら上位のマネージャーからの支援を取り付ける（活動工数や軍資金など）
* 事後アンケートなどで参加者からのフィードバックを収集し、登壇者にも共有し、双方のモチベーションアップにつなげる
## アンチパターン
* 開催/運営をずっと同じ人が行っている（負荷が集中していると長続きしない）
* 登壇者に凝った発表資料を用意してもらう（準備が大変すぎると登壇者が続かない）

## 参考情報

https://www.shoeisha.co.jp/book/detail/9784798153346

## こぼれ話（私的コメント）
「ハンガーフライト」という名称は飛行機パイロットの習慣に由来します。昔、悪天候で飛行機を飛ばせない時にハンガー（格納庫）の片隅でベテランパイロットが若手に自分の経験談を語って聞かせていました。航空機器も未成熟でインターネットもなかった時代には、そういった雑談が若手の経験不足を補う貴重な情報源となっていたそうです。
ハンガーフライトを続けるコツはあまり気負わずに、気楽なスタイルで行うことかなと思います。僕自身いつも登壇者の方に「ありものの資料でよいので、なるべく手ブラで来て下さい」とお願いしています。また会の冒頭で、経験をシェアしていただけることに対する感謝の言葉を述べるなど話しやすい場づくりをしてから、発表してもらっています。テーマや参加者によっても色々なアレンジパターンがありそうです。

　[アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
【論文読み】経済情報に関心をもつSNSユーザの投稿内容に基づく株価騰落予測モデルの構築

## はじめに
こんにちは。論文を読んだ結果の紹介記事です。  
今回紹介するのは、「経済情報に関心をもつSNSユーザの投稿内容に基づく株価騰落予測モデルの構築」という論文です。  

- タイトル： 【論文読み】経済情報に関心をもつSNSユーザの投稿内容に基づく株価騰落予測モデルの構築
- 出典： 佐藤 大吾, et al.; 人工知能学会 2016    
- URL： https://www.jstage.jst.go.jp/article/jsaikbs/108/0/108_01/_article/-char/ja/


## 概要
オンラインニュース上の経済関連記事から特徴語を抽出し、特定の期間中におけるそれらの特徴語を含むツイートの投稿頻度に基づき、Twitterユーザの経済関連ニュースへの興味度を推定する。興味度が高いと推定されるユーザのツイートに対する感情極性値を利用し、株価騰落予測モデルを構築する。  
極性反転表現リストの有用性は確認できなかったものの、経済関連ニュースに一定の興味をもつであろうと推測されるユーザに限定してそのツイートの極性情報を用いることは、株価騰落予測に一定の効果があることが確認できたと言える。  

## 特徴
- 当日のニュース記事の名詞を抽出。1日分の記事集合を1つのドキュメントとして計算したTF-IDF値の上位m件をその日の特徴語とする。
- 極性分析。分析対象ユーザのツイート、およびオンラインニュース記事から算出した感情極性値を株価騰落予測モデル構築時の素性として利用。
- 株価、およびツイートとニュース記事の感情極性値をそのままモデル学習における素性として利用するのではなく、それらのデータ値に対する過去k日間のzスコアを利用。

## 想定される適用例
- 経済分野に関心のあるSNSユーザの投稿を用いた株価予測全般


## 参考
- [経済情報に関心をもつSNSユーザの投稿内容に基づく株価騰落予測モデルの構築](https://www.jstage.jst.go.jp/article/jsaikbs/108/0/108_01/_article/-char/ja/)