OmniAICreator/Qiita-1.07M huggingface dataset:
FVM をより便利に使う fvm-activate

プロジェクトに対して Flutter のバージョンを固定するために [Flutte Version Management (FVM)](https://fvm.app/) を利用することがあります。チームで開発する際に発生しがちな開発環境の差異を減らすことができるようになります。

# FVM について

プロジェクトのディレクトリで `fvm use stable` を実行すると、 `.fvm` に SDK のシンボリックリンクと `fvm_config.json` が作成されます。 `fvm_config.json` を Git リポジトリに commit することで、他の人たちは `fvm install` で同じ SDK を利用することができます。詳しくは [公式ドキュメント](https://fvm.app/docs/getting_started/overview) をご確認ください。

```
.fvm
├── flutter_sdk -> $HOME/fvm/versions/stable
└── fvm_config.json
```

その後、この SDK を利用するには通常のコマンドの代わりに `fvm flutter` や `fvm dart` を利用します。あるいは VS Code の `.vscode/settings.json` や InteliJ/Android Studio の `idea/workspace.xml` で設定します。

# FVM の不便なところ

通常のコマンドの代わりに `fvm flutter` や `fvm dart` を利用しなければならないというのが少し不便でして、 `fvm` を付け忘れて普通に `flutter` コマンドを利用してしまうと、管理されていないシステムにインストールされたバージョンが利用されてしまいます。

他の例えば Python の venv などであれば、 `PATH` 環境変数を入れ替えて今開いているシェルの `python` コマンドを差し替えたりします。こうすれば間違えてしまうことはありません。

# fvm-activate を作ってみる

Python の venv の activate スクリプトを参考に FVM 版を作成してみました。

https://gist.github.com/utisam/7d06e75c1f9a7620b7020207881f1778

これをプロジェクトの `scripts/fvm-activate` に配置します。そして `source scripts/fvm-activate` を実行すると、FVM で管理された SDK が優先的に利用されるようになります。

`fvm-deactivate` で元に戻すことができます。
【JavaScript】??と||の違い

## `??`

`??`は左辺が`null`か`undefined`である場合に右の値を返し、それ以外の場合は左の値を返します。

```js
const foo = null ?? 'default'
console.log(foo) // 'default'

const baz = 0 ?? 1
console.log(baz) // 0
```

## `||`

`||`は左辺の値が`null`や`undefined`の場合に加えて、何らかの偽値であった場合に右の値を返します。

```js
const foo = null || 'default'
console.log(foo) // 'default'

const baz = 0 || 1
console.log(baz) // 1
```

偽値には以下のようなものがあります。

<table>
  <thead>
    <tr>
      <th>値</th>
      <th>型</th>
      <th>説明</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>null</td>
      <td>null</td>
      <td>値が存在しないことを示します。</td>
    </tr>
    <tr>
      <td>undefined</a></td>
      <td>undefined</td>
      <td>プリミティブ値。</td>
    </tr>
    <tr>
      <td><code>false</code></td>
      <td>論理値型</td>
      <td>false。</td>
    </tr>
    <tr>
      <td>NaN</td>
      <td>数値型</td>
      <td>数値ではない。</td>
    </tr>
    <tr>
      <td><code>0</code></td>
      <td>数値型</td>
      <td>ゼロ （従って、 <code>0.0</code> や <code>0x0</code> なども含みます）。</td>
    </tr>
    <tr>
      <td><code>-0</code></td>
      <td>数値型</td>
      <td>マイナスゼロ（従って、 <code>-0.0</code> や <code>-0x0</code> 等も含みます）。</td>
    </tr>
    <tr>
      <td><code>0n</code></td>
      <td>長整数型</td>
      <td>長整数型のゼロ（従って、 <code>0x0n</code> も含みます）。なお、長整数型にはマイナスゼロはありません。 <code>0n</code> の負の数は <code>0n</code> です。</td>
    </tr>
    <tr>
      <td><code>""</code></td>
      <td>文字列型</td>
      <td>空文字列。<code>''</code> や <code>``</code> も含みます。</td>
    </tr>
    <tr>
      <td><code>document.all</code></td>
      <td>オブジェクト</td>
      <td>JavaScript で唯一の偽値のオブジェクトは、組み込みの <code>document.all</code> です。</td>
    </tr>
  </tbody>
</table>
確率統計学・統計検定学習備忘録　③標本平均・標本分散（※復元抽出）、数Ⅰと数Bの統計の違い①

普段より、自分のプログラミング等に関する質問に答えて下さっている皆様ありがとうございます。m( _ _)m　よろしければ統計検定の学習等にご利用ください

**なお、以下の資料の計算はあくまで過去に個人的に確認したもので、公的に査読されていないため、間違っている箇所があれば、遠慮なくご連絡いただけるとありがたいです。**

※最近たまたま見つけた以前計算していたノートの続編の一部です（前職で、もしかしたら使うかもとおそらく休みとかに計算したものの、使う気配全くなく存在すら忘れていたノート）

**非復元抽出の場合は以下リンクへ**
https://qiita.com/thinking-weed/items/8f0d04e622912c58e05d

<h1> 標本平均・標本分散の定義

https://drive.google.com/drive/u/0/folders/1ZqON1V_DZpcBKK38ZUBYtc4TVvJjGRqK

<h1> （注：抽出の仕方が「復元抽出」だった場合の）標本平均・標本分散に関する公式

https://drive.google.com/drive/u/0/folders/1jAHjco0YJtlQWMf3vX5DXs-9BPtf6RSw

<h1>Githubリンク（※中身は一緒です）

https://github.com/thinking-weed/analysis-statics-memo/tree/main/Sample_mean_and_Sample_variance

ところで、**小中高でも今は実は統計教育が推進されているのですが、ざっくり言うと数Ⅰと数Bの統計で微妙に気をつけるべき違いがあります。**

（※結構あるため、一気には書き切る自信がないので、随時このQiitaも更新します）


<h1>よくお世話になった参考資料一覧（※全部の内容を自分も理解できているわけではないです。）

・統計検定1級公式問題集　実務教育出版　
　※過去問のページもありました。　https://www.toukei-kentei.jp/prepare/kakomon/
・青チャートI＋A、Ⅱ＋B　数研出版
・理工系の微分積分学　吹田信之、新保経彦　共著　学術図書出版書
・線形代数入門　齋藤正彦　著　東京大学出版会
・定本　解析概論　高木貞治　著　岩波書店　
・数学シリーズ　数理統計学　改訂版　稲垣萱生　著　裳華房
・数学シリーズ　集合と位相　内田伏一　著　裳華房
・one point 推定と検定　鷲尾泰俊　著　共立出版
・電磁場とベクトル解析　深谷賢治　著　岩波書店
・シリーズ物理数学1　フーリエ解析　江沢　洋　著　朝倉書店
（※一見、統計とは全く関係なさそうですが、実は中に統計・確率に関する章があります。しかも結構詳しく書いてくれてある。江沢さんの本は難しいけど丁寧だから基本オススメ
stlをsolidに変換する


`FreeCAD`を使用します．`FreeCAD`のインストール方法は以下．

https://serverarekore.blogspot.com/2022/05/ubuntu-desktop-2204freecad.html

以下記事を参考にfreecad内で,stlをsolid形式に変換.

https://zenn.dev/marbocub/articles/convert-stl-to-solid-on-freecad

生成した`solid`形式のパーツを選択し ファイル > エキスポート からデータをエキスポート(stepなどで出力すれば良い）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/dbc50960-dc6e-092c-0229-c3dffb0f4718.png)
出力設定は以下のようにした.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/0b87d275-6a7f-3aa7-fbe3-46162641f2b5.png)

onshape上でいい感じのsolidとして読み込めました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/df6841d0-738e-42c8-5306-247ffed30f96.png)



参考: `onshape`の対応フォーマット
https://licensecounter.jp/engineer-voice/blog/articles/20211004_onshape_support_file_formats.html
SvelteでSupabaseを使う（SvelteKit）

久しぶりの記事投稿！
SvelteとSupabaseを一緒に使えるようにしていく
Supabase公式ドキュメントを参照しつつ進めていくー:walking:

https://supabase.com/docs/guides/getting-started/quickstarts/sveltekit

基本yarnを使っています。

# Supabaseの会員登録
https://supabase.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416489/0645018d-957f-99d1-dc33-8702fbaa9f39.png)
会員登録後、プロジェクトを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416489/9f0b1216-77c0-c6e2-3db7-d40510759c1e.png)
プロジェクト名や、パスワード、リージョンを設定する。
あとは適当にテーブル作っておく。

# まずはSvelteのインストールから
任意のディレクトリで
```:terminal
npm create svelte@latest <プロジェクト名>
```
今回はスケルトン状態で作っちゃいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416489/4fb50b83-ccb2-3742-d10a-a3c7f3af41b3.png)
作成されたディレクトリで`yarn start`、ブラウザでみるとこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416489/4317d5db-1503-9411-e9a8-755fd1ebc935.png)
# Supabaseのクライアントライブラリをインストール
Svelteが起動することを確認したので、Supabase Clientライブラリを追加する。


```
yarn add @supabase/supabase-js
```
package.jsonに@supabase/supabase-jsが追加されていることが確認できる。

# Supabase クライアントを作成
ドキュメントの指示に従い、`src/lib`ディレクトリ内にsupabaseClient.jsファイルを作成
```javascript:src/lib/supabaseClient.js
  import { createClient } from '@supabase/supabase-js'

  export const supabase = createClient('https://<project>.supabase.co', '<your-anon-key>')
  ```
※`.env`ファイルを使う方法でもよい

  createClientの引数には、プロジェクトURLと、anonキーを入力する。
最初に作ったSupabaseプロジェクトのSetting＞APIのページで確認する。
一番上とその次くらいに書いてある。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416489/85dc675b-d1fc-3940-b4e1-ce7b7988a287.png)

  # Supabaseからデータをクエリ
  routeディレクトリ直下に+page.server.jsファイルを作成
  ```javascript:route/+page.server.js
import { supabase } from "$lib/supabaseClient";  // Supabaseクライアントをインポート

export async function load() {
  const { data } = await supabase.from("user").select(); // userテーブルから全てのデータを取得
  return {
    users: data ?? [],
  };
}
  ```
  userの部分は、事前に作成したテーブル名を指定する。
      returnの前に`console.log({data})とか仕込んでおくと、ターミナルにデータが取れるのが確認できるはず。:laughing::tada:
      私の用意したデータの場合はこんな感じ（created_atのが上に来ててちょっときもちわるい）
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416489/4e0ecacb-65fc-e4ea-dd90-46eef5402916.png)
  この時点で取得できていないようなら、一度入力内容を確認したほうがよいかも:point_up:


  # クエリしたデータを表示する
  同じrouteディレクトリ直下の+page.svelteファイルを以下に書き換える。
  
  
  ```+page.svelte
<script>
	export let data; // dataをserver.jsから受け取る宣言
</script>

<ul>
	{#each data.users as user}
		<li>{user.name}</li>
	{/each}
</ul>
```
うまくいくとブラウザの表示はこんな感じに。:beers:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416489/3cfdb75e-d701-e841-0820-11e60f7c1954.png)
GitHub(, GitLab, Codeberg etc.)複数アカウント管理のための ssh, git, gh 周辺セットアップ

# 要旨
GitHubアカウントを複数所持している人がそれらを管理する(使い分ける)際にやっておくと便利な設定をまとめました。 
(**Mac**ユーザー向けの記事です)

:::note warn
GitHubでは個人が **無料** アカウントを複数所持することは<ins>禁止</ins>されています。
:::

## `gh`, `direnv` (, `git`)のインストール
```bash
brew install gh direnv # and git
```

## 状況想定
あなたは

- `Alice@github.com`
- `Bob@github.com`
- `Mike@codeberg.org`

という3つのアカウントを所有していて、

- デフォルトは Alice
- (カレントディレクトリが `~/dev/repos/github.com/alice` 配下で Alice の `gh` が有効)
- カレントディレクトリが `~/dev/repos/github.com/bob` 配下では Bob
- カレントディレクトリが `~/dev/repos/codeberg.org/mike` 配下では Mike

を使いたいという想定で話を進めます。

## 各種設定ファイル場所 root 一覧
`$HOME`ディレクトリは散らかしたくないので、`~/.config` に置けるものはなるべくそこに置きます。(`direnv`の`.envrc`の置き場はご自分の環境に依存します)

| サービス名 | 設定ファイル場所 root | 内容 |
|:-:|:-|:-:|
| ssh | `~/.ssh` | [SSH の設定](#ssh-の設定) |
| gh | `~/.config/gh` | [gh の設定](#gh-の設定) |
| git | `~/.config/git` | [git の設定](#git-の設定) |
| direnv | `~/dev/repos/<host>/<username>`<br>`~/dev/repos/github.com/bob`<br>`~/dev/repos/codeberg.org/mike` | [direnv の設定](#direnv-の設定) |

## ssh の設定
`ssh-keygen`で鍵ペア作成(作成方法は他の記事に譲ります)

```sh
$ tree ~/.ssh/github
$HOME/.ssh/github
├── alice
│   ├── id_ed25519
│   └── id_ed25519.pub
└── bob
    ├── id_ed25519
    └── id_ed25519.pub

3 directories, 4 files
```

`~/.ssh/codeberg/mike`も同様に作成

```:~/.ssh/config
# alice
Host github github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/github/alice/id_ed25519
  IdentitiesOnly yes
```

## `gh` の設定
```sh
$ tree ~/.config/gh
$HOME/.config/gh
├── alice.yml
├── bob.yml
├── config.yml
└── hosts.yml

1 directory, 4 files
```

プロトコルを`ssh`にします。
```sh
$ gh config set git_protocol ssh
```

GitHub で personal access token を取得後、下記ファイルの `oauth_token` にコピペ:

```sh:~/.config/gh/alice.yml
github.com:
    oauth_token: *******************************
    user: alice
    git_protocol: ssh
```

`~/.config/gh/bob.yml`も同様

## `git` の設定
コミッターの名前とメアドを設定します。

```yaml:~/.config/git/config
[user]
    name = Alice
    email = 123456789+alice@users.noreply.github.com
[includeIf "gitdir:~/dev/repos/github.com/bob/"]
    path = ~/.config/git/github/bob
[includeIf "gitdir:~/dev/repos/codeberg.org/mike/"]
    path = ~/.config/git/codeberg/mike
```

```yaml:~/.config/git/github/bob
[user]
    name = Bob
    email = 12345678+bob@users.noreply.github.com
```

`~/.config/git/codeberg/mike`も同様に設定

## `direnv` の設定
`direnv`のフックを`.zshrc`に追加:
```sh:.zshrc
eval "$(direnv hook zsh)" # 追記後 source
```
`~/dev/repos/github.com/bob` に `.envrc` を作成し編集します:
```sh:bob/.envrc
export GIT_SSH_COMMAND="ssh -i ~/.ssh/github/bob/id_ed25519" # bob/id_ed25519.pub を GitHub に事前に置いておく
/bin/cp ~/.config/gh/bob.yml ~/.config/gh/hosts.yml && gh auth status # この行は GitHub 以外のプラットフォームでは必要ない
```

アラートに従い `direnv allow` を実行

> :bulb: これ以降このディレクトリに移動した際に`.envrc`が自動的に読み込まれることになります

下記ディレクトリも似た流れで設定
- `~/dev/repos/github.com/alice`<br>(`alice/.envrc` では `bob/.envrc` の一行目が要らない(global に設定されているから))
- `~/dev/repos/codeberg.org/mike`<br>(`mike/.envrc` では `bob/.envrc` の二行目が要らない(GitHubではないため))

# 最後に
大分省略して書きました。
間違い・不明点ございましたらお知らせ下さい。
【MySQL】Unexpected error occurred Error: Access denied for user 'XXX'@'localhost' (using password: YES)で苦戦した話

# はじめに
こんにちは。
本日はMySQLでエラーが出て苦戦していたので備忘録として残そうと思います。

# 環境
環境は大事だったのでとりあえず記載します。
* OS
  * MacOS
* MySQL
  * 8.0.29
  * docker-compose.yamlで環境作成
* アプリ
  * Express(TypeScript)
# エラー内容
タイトル通りですが以下のエラーが出ていました。
`Unexpected error occurred Error: Access denied for user 'XXX'@'localhost' (using password: YES)`
またコンソールでも以下が出ていました。
`Failed to load resource: the server responded with a status of 500 (Internal Server Error) express`
500のエラーが出ているということで、サーバー側のエラーなのは確かで次に記載していくが以下を試した。
# 試した内容
とりあえずググって以下を試したのですが、全てうまくいきませんでした。
### 対応１
一番最初に疑ったのがDockerに設定した内容とExpressに設定した内容が間違っている可能性が本当に間違っていないかを疑った。。。
が当然うまくいかない。もし違っていたら違うエラー出そうだし。。
### 対応２
volumesを破棄して新たに作成する
まずエラーでググると上記の対応が出ましたが。。うまくいかず。
一応Volumesの削除の方法は以下になります。
```
$ docker volume ls
$ docker volume rm ${Volume ID}
再度作成
$ docker-compose up -d
```
これで行くかも！と思ったがダメだった。。
### 対応３
Servicesの修正
正直エラーだけでは原因が全然わからなかったので、とりあえず試せることを試そうと思い。
docker-compose.ymlのservicesに関係があるのかと以下を確認
ちなみにservicesは以下で作成していた。
```
services:
  mysql:
    image: mysql:8.0.29
    platform: linux/x86_64
    ports:
      - 3306:3306
```
#### portの修正
ポート3306を変えたらできたという記事が出たのでとりあえず試してみることに
とりあえず以下に修正。
```
ports:
  - 3307:3306
```
当然ダメでした。。笑
#### platformの修正
platform: linux/x86_64だと起動しないという記事を発見したのでとりあえず
platformを削除して確認。あまり期待はしていなかったがとりあえず試せる方法は片っ端に試すことにだが当然うまくいかず。

### 対応4
色々と漁っていると一つの記事があった。
内容はというと、もともと別で入れたMySQLとDocker環境のMySQLがある場合は別環境のMySQLを参照しようとしてエラーが起きているという記事を発見。私の環境ではhomebrewから入れたMySQLがあったためMySQLを切断することに以下コマンドを実行。
`mysql.server stop`
そして念の為に再度、対応２をおこなったがダメだった
※この対応４については後ほどもう一度話をさせていただきます

# 解決方法
色々失敗方法を試しましたが、ここからは解決方法をお話しします。
今回のエラーの原因は対応４の原因が近くhomebrewのMySQLが起動しており、docker-composeのMySQLではなくhomebrewのMySQLを見に行っていたためにエラーが起きていたようです。
でも対応４でMySQLの接続を切ったのではないの？と思った方私も思いました。
それで以下を追加で試してみました。
```
// ここでMySQLを切断
$ mysql.server stop
// 接続状況を確認
$ mysql.server status
```
すると切断のコマンドを叩いてはいるのだが、ステータス状況を確認すると切断されていない
あれ。。と思いhomebrewのMySQLは切断方法は違うのかと再度検索すると記事が出てきた。homebrewから導入したMySQLは切断方法が違うらしい。。。
以下のコマンドを叩いた
※@5.6は導入しているバージョンなので自分のバージョンに合わせてください。
`brew services stop mysql@5.6`
するとエラーが解消した。
（すごく疲れた。。。）

# 最後に
MySQLって環境の違いでコマンド違うんですね。
あまり考えていなかったので、そういうこともあるんだなと思いました。
またdocker導入すると今回のように既存からあるものを参照することもあるんだなと知りました。
あまりdockerは使用しないので色々と勉強になりました。
最後までご覧いただきありがとうございました。
OCIで二段階認証設定を放置したらログインできなくなった

:::note warn
二段階認証は期限までにちゃんと設定しましょう。
:::

OCIから来ていた二段階認証の設定期限を無視していたら、OCIコンソールにログインできなくなった。

〇症状
7月半ばからメールで7月28日から二段階認証ポリシーをアクティブにする旨の通知が来ていた。
だが、そのメールによると二段階認証をオンにする対応は「recommend」だったので無視していれば、有効化されないか、何かしらのバイパス手段が提供されると楽観視して対応を放置していた。
ところが、いざ有効化されてみると、バイパスコードがない限り、OCIコンソールにログインできなくなったうえ、そもそも二段階認証をオンにしていなかったので、バイパスコードの発行もしていなかった。
結果、OCIコンソールにログイン不能となった。SSHは生きているのでサーバを操作することは可能で、また直ちにセキュリティ上の懸念があるものでもなかったので放置していたが、さすがに４か月ログインできないのもいかがなものかと思われたので、対応をすることにした。

〇解決策
以下URLで「Karthik-Oracle」さんが案内している引用の方法を試したところ、二段階認証なくIDとPWのみで、セキュリティプロファイル設定ページに入ることができ、そこで二段階認証アプリの設定とバイパスコードの取得をすることができた。

    Try this, if it can solve ..

    Go to login page, and next screen where auth code is required.. and here note down the URL starting like https://idcs-*******.identity.oraclecloud.com/

    Now modify that URL as below

    https://idcs-*******.identity.oraclecloud.com/ui/v1/myconsole?root=my-info&my-info=my_profile_security

    In this new URL, check options if you can disable MFA, or get bypass codes, or any such options which you can recover.

https://community.oracle.com/customerconnect/discussion/704858/failed-to-get-the-verification-code-for-2-step-verification-now-i-cant-log-in-to-oracle-cloud

〇その他試した方法
・my oracle supportからテクニカルSRを作成してサポートを求める
　⇒失敗。オラクルIDとサービスの紐づけがされていない（またはFree Tierアカウントだったため？）のか、作成自体ができない。
 ・日本オラクルの電話サポートに架電して助けを求める
 　⇒ノンテクニカルSRとしてサポートはして貰えたものの、どうもFree Tierだとサポートされないらしく、その調査中に上の解決方法が見つかったので結果的に意味がなかった。なお一部で、無料ユーザはゴミのように扱われるなどといった評価も見かけたが、少なくとも対応してくれたオペレータはそういったことはない印象を受けた。対応は遅かったが無料ユーザなのでこれは仕方がない。
 
:::note warn
recommendであってもメールを無視するのは止めよう
:::
ChatGPT GPTs作成者名を自分のウェブサイトにする方法

GTPsを公開するにあたり、気をつける点があったので忘れないようにメモ。
※GPTsを利用するには現時点でChatGPTPlus(有料)を契約している必要があります。
※ChatGPT等OpenAIの製品はすごい勢いで進化しているので、少し古くなるとUIなど参考にならないかと思いますのでご了承ください。

## 1. まずGPTsを公開するには、GPTs作成者情報を設定する必要があるようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/8d61ab55-c11e-4e27-905d-43e43cd75fb9.png)

## 2. ChatGPT Plusのユーザーであれば、ChatGPTの画面左下の自分のアイコン部分をクリック＞プラス設定＆ベータを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/2222b984-b112-ba40-ab2f-82d944a90c47.png)

## 3. Builder profileより、NameかWebsiteをONにすれば、Publicが選択できるようになり公開できるようです。
**Nameで公開する場合**は、請求先に登録されている名前が表示されるようで、公開すると「By〜」と名前が表示されました。

**Websiteを登録して公開する場合**は、今回少しハマったので、誰か少しでも参考になれば幸いです。
Websiteに登録できるのはDNSを自身で設定できるドメインを持っている必要があります。

また、ドメイン設定の際www.example.comのように、サブドメイン入りで登録するとDNSの認証(Verify)は通るものの、
なぜか、スイッチの方がONに切り替えられない模様です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/9ff0800b-c762-c1c5-1064-d8a00192c2e0.png)

また何故か、下記最初に登録したサブドメインの方のドメインに「✓」マークが入ってますが、他のルートドメインは選択できず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/9ab18d33-7cbd-d044-4cf3-b71ecbb7fc79.png)

ただ実際には、「✓」が入った方は使われず、２つ目ルートドメインの方が公開されたGPTｓには表示されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/658507a7-9a5b-3cd7-89b9-53ec4800da54.png)


Websiteで公開するとBy〜の部分もしっかりリンカブルになるので、宣伝したい方良いかもしれません。

以上、
website登録してDNSのTXTレコード認証も通ったのに、スイッチが切り替えられない方の参考になれば幸いです。m(_ _)m
Dispatcherを用いてUIを明示的に更新する

# 背景
業務で明示的にUIを更新しないといけない場面があり、以下のコードをコピペして解決できたが、具体的にどういう操作をしてるのか分からなかったので調べてみた

```c#
/// <summary>
/// Viewの更新
/// </summary>
public void UpdataView()
{
    DispatcherFrame frame = new DispatcherFrame();
    var callback = new DispatcherOperationCallback(obj =>
    {
        ((DispatcherFrame)obj).Continue = false;
        return null;
    });
    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, callback, frame);
    Dispatcher.PushFrame(frame);
}

```

# この記事の要約
- Dispatcherとは、UIを操作するための仕組み
- DispatcherFrameとは、UIのタスクを実行するループ(実行ループ)を表すクラス
- BeginInvokeメソッドは、実行ループでのUI処理の順番を指定する
- PushFrameメソッドは、実行ループを開始する

# 本文
## Dispatcherとは
大田一希さんの「WPF 4.5入門」によると、Dispatcherとは、UIを操作するための仕組みらしい
>WPF では、他の UI フレームワークと同様に UI を操作するには専用のスレッドから操作をする必要があります。
WPF では、この操作を簡単にするために Dispatcher という仕組みを提供しています

参考サイト：
- [WPF4.5入門のPDF - かずきのBlog@hatena](https://blog.okazuki.jp/entry/2014/12/27/200846)
- [samples/wpfedu at master · runceel/samples · GitHub](https://github.com/runceel/samples/tree/master/wpfedu)

## DispatcherFrameとは
- BeginInvokeメソッドで指定する処理を行うための枠(frame)のこと
- この枠を実行ループとMSDNでは呼ばれている
- 実行ループは、Continueプロパティがtrueの間、実行され続ける

参考サイト：
- [DispatcherFrame Class (System.Windows.Threading) | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.threading.dispatcherframe?view=windowsdesktop-8.0)

## BeginInvokeとは
**概要**
MSDNによると以下の通りである。
>Dispatcher が関連付けられているスレッドで、指定した引数を使用して、指定したデリゲートを指定した優先順位で非同期的に実行します。

**書式**
BeginInvokeメソッドの書式は以下の通りである。
```C#
public System.Windows.Threading.DispatcherOperation BeginInvoke (System.Windows.Threading.DispatcherPriority priority, Delegate method, object arg);
```
**引数**
- priority
  - 指定したデリゲート(メソッドを代理で呼び出すための型)の優先順位
  - 優先順位の指定は [DispatcherPriority Enum (System.Windows.Threading) | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.threading.dispatcherpriority?view=windowsdesktop-8.0) を参照
- method
  - デリゲート
- arg
  - 指定されたメソッドに引数として渡すオブジェクト

参考サイト：
- [Dispatcher.BeginInvoke メソッド (System.Windows.Threading) | Microsoft Learn]( https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.threading.dispatcher.begininvoke?view=windowsdesktop-7.0#system-windows-threading-dispatcher-begininvoke(system-windows-threading-dispatcherpriority-system-delegate-system-object) )


## PushFrameとは
- 引数で指定した実行ループを開始する

参考サイト：
- [Dispatcher.PushFrame(DispatcherFrame) Method (System.Windows.Threading) | Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.threading.dispatcher.pushframe?view=windowsdesktop-8.0)

# 結論
はじめに記載したコードでは、実行可能状態にあるUIのタスクをすべて処理した後、実行ループを抜ける処理を行っていた
pkillすると抗議してくるコマンド

N高生です。

`pkill`を叩くことがあると思うんですが、何も言わずに消えてくのが儚いので、抗議してもらいます。


### 環境
- vim


```zsh:.zshrc
function pkill() {
    /usr/bin/pkill $@
    echo 「なぜ殺したんだ」
    echo 「かわいそう」
}
```

```zsh
$ source ~/.zshrc
```

```zsh
$ pkill Splice
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437056/49240c48-9c1f-fc2e-bff2-180ee84b1481.png)


以上です。
リーマンのξ関数を手実装で計算してプロットする - JavaScript

ライブラリを使わずにゼータ(ζ)関数、クシー(ξ)関数を計算する。($0<\Re(s)<1$)
$$\xi(s)=\frac{1}{2}s(s-1)\pi^{-\frac{s}{2}}\Gamma\left(\frac{s}{2}\right)\zeta(s)$$

# プログラム

$s=c+ki\ \ (0<c<1)$に対する$\zeta(s)$または$\xi(s)$の実部(赤)と虚部(青)をプロットする。（右側は極座標表示）
Absoluteをチェックすると絶対値をプロットする。
$|\xi(s)|$は$s$の虚部$k$が大きくなると指数関数的に小さくなっていくため、描画スケールを調整してある。($\zeta(s)$のプロットに関しても$k$に応じて若干描画スケールを補正している。)

検算はあまり真面目にやってないので、バグがある可能性あります。（何個かゼロ点が合っていることは確認していますが、Pythonのライブラリなどの計算結果との比較はしていない。）

<p class="codepen" data-height="570" data-default-tab="result" data-slug-hash="abXEPjJ" data-user="kob58im" style="height: 570px; 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/kob58im/pen/abXEPjJ">
  Riemann Xi-function</a> by kob58im (<a href="https://codepen.io/kob58im">@kob58im</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# ガンマ関数の計算

Lanczos近似を使って計算している。（下記のPythonプログラムを移植。虚部の切り捨て処理は誤差が増える要因となったので削除して使用している。）

https://en.wikipedia.org/wiki/Lanczos_approximation

# ゼータ関数の計算

オイラー・マクローリン(Euler & Maclaurin)の和公式を使ってリーマンのゼータ関数を計算している。

https://mathlog.info/articles/2061

$$ \zeta(s)=\lim_{n\to\infty}\left(\sum_{k=1}^n\frac{1}{k^s}\ -\frac{1}{1-s}n^{1-s}-\frac{1}{2}n^{-s}+\sum_{j=1}^m\frac{B_{2j}}{(2j)!}(s)_{2j-1}n^{-s-2j+1}\right) $$
$(s\neq 1, \ \Re(s)>-2m-1)$

に$m=1$を代入した下記の式を使用。

$$ \zeta(s)\simeq \sum_{k=1}^n\frac{1}{k^s}\ \ -\ \frac{1}{1-s}n^{1-s}-\frac{1}{2}n^{-s}+\frac{s}{12}n^{-1-s} $$

$n$をどの程度にすればよいかが判断できなかったので、プログラム内でスライダーを使って調整できるようにしてある。
【Day 5】Web環境構築 - CypressでE2Eテスト実行

## はじめに

![スライド6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/bda8cc66-7102-7085-45aa-c2879a824db7.png)

---

**2023年アドベントカレンダー5日目**です。

https://qiita.com/advent-calendar/2023/life-sync-app

前回の続きで「開発者はWebの開発を進めることができる」を進めていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/13e79272-8479-39f1-e857-a04f2bfcc4b1.png)


## Cypress

### Cypressとは

`Cypress`とは、ウェブアプリケーションのエンドツーエンドテストに特化したJavaScriptベースのテストツールです。

https://www.cypress.io/

### 事前準備

#### パッケージ

起動に必要なパッケージをインストールしていきます。

```bash
apt-get install libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libnss3 libxss1 libasound2 libxtst6 xauth xvfb
```

#### chrome

chromeでの動作を想定したいので、chromeをインストールします。

```bash
sudo apt update && sudo apt -y upgrade && sudo apt -y autoremove
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt -y install ./google-chrome-stable_current_amd64.deb
```

#### フォント

日本語が文字化けしてしまうために、フォントをインストールします。

```bash
sudo apt install fonts-noto
```

:ok: ここまでで事前準備は終了です。

### install

TypeScriptで開発していきたいので、こちらの手順を追っていきます。

https://docs.cypress.io/guides/tooling/typescript-support

```bash:e2e/web/
npm init -y
npm install --save-dev cypress typescript
```



```json:tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "lib": ["es5", "dom"],
    "types": ["cypress", "node"]
  },
  "include": ["**/*.ts"]
}
```

cypressの起動、E2Eテスト実行のスクリプトを設定します

```diff_json:package.json
  "scripts": {
-   "test": "echo \"Error: no test specified\" && exit 1"
+   "cypress:open": "cypress open",
+   "test:e2e": "cypress run --e2e chrome"
  }
```

### Setting

```bash
npm run cypress:open
```

* このような画面が自動で開きますので、**E2E Testing**を選択
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/eda3c5e2-543e-1ac7-e49c-ae92f2f58e9c.png" width=600 />

* Configファイルの生成するかどうか聞かれるので、そのまま**Continue**
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/708b6dc2-4902-2cbb-d36d-75cb9f139526.png" width=600 />
* テストするブラウザを選ばされるので、先ほどインストールした`Chrome`を選択し、`Start E2E Testing in Chrome`
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/efb3aaef-32b2-0c67-963f-be7f2cbe5793.png" width=600 />
* :ok: このような画面がでたらOKなので、一度終了します。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/61708878-28e5-2727-658e-0543b8354ccf.png" width=600 />

configにアプリの`baseUrl`を設定します

```diff_typescript:cypress.config.ts
import { defineConfig } from 'cypress'

export default defineConfig({
  e2e: {
    setupNodeEvents(on, config) {
      // implement node event listeners here
    },
+   baseUrl: 'http://localhost:3000',
  },
})
```

これでCypressでのE2Eテストの準備が整いました。
次はWeb開発時の、Bffのモックサーバーをセットアップしていきます。
【Swift】配列の全ての要素が条件に一致しているかをチェックする

# はじめに
配列の全ての要素が条件に一致しているかをチェックする機能があることを知ったので記事にしておきます。

# 実装
```swift
let array = ["acerola", "almond", "apple", "avocado"]

// 配列の全ての要素にaが含まれているかを判定
array.allSatisfy { $0.contains("a") } // true

// 配列の全ての要素にbが含まれているかを判定
array.allSatisfy { $0.contains("b") } // false

// 配列の全ての要素にcが含まれているかを判定
array.allSatisfy { $0.contains("c") } // false
```

:::note warn
空の配列に対しては常にtrueが返されるので注意が必要です。
```swift
let array = [String]()
array.allSatisfy { $0.contains("a") } // true
```
:::


# おわり
これ結構便利ですね
`allSatisfy`がない場合、`filter`や`reduce`を使って同じ事ができそうですが、冗長になりそうですね

# 公式ドキュメント
https://developer.apple.com/documentation/realitykit/loadrequest/allsatisfy(_:)
【備忘録】[Linuxコマンド] tar.gzの展開によるシンボリックリンクの削除

# はじめに
当たり前のことを書いていますが、実は忘れがちなので、個人的な備忘録という意味でも纏めています。

システム構築やデータ移行等で別サーバに纏めてファイルを持っていく場合、複数ファイルを纏めて（かつディレクトリ階層を維持して）圧縮し別サーバへコピー、展開することがあると思います。
展開先に対象のディレクトリが存在している、かつそのディレクトリが実ディレクトリとして存在していれば問題ありませんが、シンボリックリンクの場合はそのリンクが切れてしまいます。

Ubuntuなどの場合、ディレクトリの構造の見た目は同じでも、バージョンによって少し異なります。
例えば、/libディレクトリを見ても、18.04は実ディレクトリとして存在しますが、20.04は/usr/libへのシンボリックリンクとなっています。
この状態で展開先が/libの圧縮ファイルをそのまま展開してしまうと、20.04以降の場合、/libのシンボリックリンクが切れてしまい、標準コマンドが実行できなくなります。

# 動作確認
Ubuntu22.04の環境で試しに展開先で既にディレクトリが存在しており、それがシンボリックリンクの場合で圧縮ファイルを展開してみます。
なお、動作確認のディレクトリ構成は以下の通りです。
※ libディレクトリはusr/libディレクトリのシンボリックリンクとなっています。
```
$ ls -l ~/
total 8
drwxrwxr-x 2 userA userA 4096 Nov 18 21:35 gz
lrwxrwxrwx 1 userA userA    8 Nov 18 21:57 lib -> usr/lib/
drwxrwxr-x 3 userA userA 4096 Nov 18 21:32 usr

$ ls -l ~/usr/lib/
total 0
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 a.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 b.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 c.txt

$ ls -l ~/lib/    # ~/usr/libと同じ
total 0
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 a.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 b.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 c.txt
```

ここでgzディレクトリの中にある展開対象の圧縮ファイルとその中身を確認します。
```
$ ls -l ~/gz/lib.tar.gz 
-rw-rw-r-- 1 userA userA 161 Nov 18 21:34 /home/userA/gz/lib.tar.gz

$ tar tf ~/gz/lib.tar.gz 
lib/                    #展開先がlibディレクトリの直下担っています。
lib/f.txt
lib/e.txt
lib/d.txt
```

実際に展開先のディレクトリを指定してlib.tar.gzを展開してみます。
```
$ tar zxf ~/gz/lib.tar.gz -C ~/

$ ls -l ~/
total 8
drwxrwxr-x 2 userA userA 4096 Nov 18 21:35 gz
drwxrwxr-x 2 userA userA 4096 Nov 18 21:33 lib  #シンボリックリンクが消えています。
drwxrwxr-x 3 userA userA 4096 Nov 18 21:32 usr

$ ls -l ~/lib/
total 0
-rw-rw-r-- 1 userA userA 0 Nov 18 21:33 d.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:33 e.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:33 f.txt
```

このコマンドの結果から、<font color="red">圧縮ファイルを展開するとシンボリックリンクが削除されます。</font>
そのため、もし圧縮ファイルを展開する際に圧縮ファイル内でディレクトリが含まれている場合、展開先がシンボリックリンクになっていないか十分確認するようにしましょう。

# おまけ
もしlibが実ディレクトリだった場合は以下のようになります。
```
$ ls -l ~/
total 8
drwxrwxr-x 2 userA userA 4096 Nov 18 21:35 gz
drwxrwxr-x 2 userA userA 4096 Nov 18 21:32 lib
drwxrwxr-x 3 userA userA 4096 Nov 18 21:32 usr

$ ls -l ~/lib/
total 0
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 a.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 b.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 c.txt

$ tar zxf ~/gz/lib.tar.gz -C ~/

$ ls -l ~/lib/
total 0
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 a.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 b.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:32 c.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:33 d.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:33 e.txt
-rw-rw-r-- 1 userA userA 0 Nov 18 21:33 f.txt
```

展開後はlibディレクトリの中に元々存在しているファイルと展開後のファイルが両方存在していることがわかります。
MacでXサーバーとSourceTreeを連携した

すでにXserver経由でアップロードしていたサイトのファイルをGit管理することにした。
知識不足でつまずきまくったので備忘録。
ひとまずcloneするところまで。

# 目次
1. [XserverでSSH接続の準備](#xserverでssh接続の準備)
2. [Macの.ssh/configファイルを編集](#macのsshconfigファイルを編集)
3. [MacのターミナルからXServerにSSHで接続](#macのターミナルからxserverにsshで接続)
4. [Gitを導入](#gitを導入)
5. [SourceTreeの設定](#sourcetreeの設定)
6. [参考記事](#参考記事)
7. [その他](#その他)

# XserverでSSH接続の準備
[公式ページ](https://www.xserver.ne.jp/manual/man_server_ssh.php)を参考に設定

:::note warn
- パスフレーズは設定しない
- 生成された`【任意の名前】.key`は`/Users/【アカウント名】/.ssh/`に格納する
:::

# Macの.ssh/configファイルを編集
```
# --- 【任意の名前（例：Xserver ホスト名）】  ---
Host 【任意の英数字】
    HostName 【ホスト名（例：sv***.xserver.jp）】
    User 【サーバーID】
    IdentityFile /Users/【アカウント名】/.ssh/【任意の名前】.key
    Port 10022 #XSERVERのデフォルト
    TCPKeepAlive yes
# ----------------------------
```
# MacのターミナルからXServerにSSHで接続
```
$ ssh 【サーバーID】@【ホスト名（例：sv***.xserver.jp）】 -p 10022 -i ~/.ssh/【任意の名前】.key
```
# Gitを導入
gitが入っていることを確認
```
$ git --version
```
git管理したいフォルダへ移動
```
$ cd 【git管理したいフォルダ】
```
git管理したいフォルダへ移動して下記を実行
```
$ git init
$ git add .
$ git commit -m "first commit"
```
情報を登録
```
$ git config --global user.email "【メールアドレス】"
$ git config --global user.name "【名前】"
```
リポジトリを登録
```
$ mkdir git
$ cd git
$ mkdir demo.git
$ cd demo.git
$ git init --bare
```
# SourceTreeの設定
新規 > URLからクローン で 以下を設定
|項目名|入力内容|
|-------|---|
|ソースURL|`ssh://【サーバーID】@【ホスト名（例：sv***.xserver.jp）】:10022/home/【サーバーID】/【git管理したいフォルダ】/demo.git`|
|保存先のパス|【ローカルで置きたい場所を指定（例：`/Users/【アカウント名】/Desktop/【任意のフォルダ】`）】|

設定が完了すると任意のフォルダにcloneされる
# 参考記事
- [XServerにGitを導入、MacのSourcetreeを使ってSSHで繋ぐまで](https://chomolungma-kids.com/2018/04/16/9)
- [エックスサーバーにGitを導入する手順](http://vdeep.net/xserver-git)
- [xserverにssh接続してgit操作 | Zenn](https://zenn.dev/kazweda/scraps/c1679adbcfdcdd)
- [GitとGitHubの違い。そして'push'一発でサイト更新する術を知る | note](https://note.com/obachan_50over/n/nefb13c506e0d)

# その他
色々めも
- 連携がうまく行かなかったのはconfigを設定していなかったからっぽい。chatGPTにエラー投げまくってたけど全然解決してくれなかった。エラーは自分でなんとかするしかない。
- githubも連携しようかなと思ってたけどGit＋SourceTreeでやるなら特に現段階ではいらないと気づいたのでその作戦は変更。
- Qiita CLIも試してたら簡易なメモを上げてはいけなかったらしく怒られた。泣いた
  - 限定公開のものはpullもできないっぽくてこれまた号泣。気をつけよ。
    - [ユーザー設定ファイルについて | README](https://github.com/increments/qiita-cli#user-content-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)見て解決。`qiita.config.json`の`includePrivate`を`true`にすればいいだけだった！嬉しい！
- Qiitaは一旦全体公開したら限定に戻せないの知らなくてターミナルでエラー出しまくった。無駄な時間すぎる。
【Unity】Swift のネイティブプラグイン開発において Foundation が便利

## 本記事について

この記事は [CoreBluetoothForUnity Advent Calendar 2023](https://qiita.com/advent-calendar/2023/core-bluetooth-for-unity) の14日目の記事です。

Swift の標準ライブラリには String, Array, Dictionary などの基本的なデータ構造が用意されています。

Unity のネイティブプラグイン開発において、これらではなく Foundation にある NSString, NSArray, NSDictionary 等を使うとできることについて紹介します。

## 環境

- CoreBluetoothForUnity 0.4.4

## Foundation とは

https://github.com/apple/swift-corelibs-foundation

[Apple ドキュメント](https://developer.apple.com/documentation/foundation)

Swift で `import Foundation` すると使えるフレームワークです。
インポートすると、NSString 等の NSxxx という名前のクラスが使えるようになります。

CoreBluetoothForUnity 0.4.4 では例えば以下のクラスを使っています。

- NSString
- NSNumber
- NSArray
- NSDictionary

NSBool はなく、NSNumber が 0, 1 で論理値を表現します。

## なぜ NSString 等を使うのか

Foundation フレームワークの NSString 等のクラスは、標準ライブラリの String 等と比較して、Unmanaged 型への変換が容易である点が大きなメリットとなります。

[Unmanaged 型](https://developer.apple.com/documentation/swift/unmanaged) を取得する [passRetained](https://developer.apple.com/documentation/swift/unmanaged/passretained(_:)) の引数はクラス(= AnyObjectを継承している)です。

[標準の String](https://developer.apple.com/documentation/swift/string) は値型のため passRetained の引数にはできません。NSString はクラスなため可能です。

実際のコードは以下です。

[リンク](https://github.com/teach310/CoreBluetoothForUnity/blob/0.4.4/Plugins/CoreBluetoothForUnity/Sources/CoreBluetoothForUnity/FoundationForUnity/FoundationForUnity.swift)

```FoundationForUnity.swift
@_cdecl("ns_string_new")
public func ns_string_new(_ str: UnsafePointer<CChar>) -> UnsafeMutableRawPointer {
    let nsstring = NSString(utf8String: str)!
    return Unmanaged.passRetained(nsstring).toOpaque()
}
```

このように、NSString を用いることで、Swift と C# の間での文字列やデータの受け渡しを簡単に実現できます。
NSArray や NSDictionary でも同様です。

[Foundation のリポジトリの README](https://github.com/apple/swift-corelibs-foundation#why-include-nsstring-nsdictionary-nsarray-and-nsset-arent-those-already-provided-by-the-standard-library)にも、この「クラスであること」のメリットが書かれています。

> They provide reference semantics instead of value semantics, which is a useful tool to have in the toolbox.

## 基本的な機能なため、ネイティブプラグインが複数あると重複する

0.4.4 時点の CoreBluetoothForUnity では、Foundation フレームワークの基本的な機能を含んでいますが、
Swift のネイティブプラグインを複数プロジェクトに入れると重複してしまいます。

上記の例では `ns_string_new` という汎用的な名前を使っていますが、これだと衝突しそうなためもっとユニークな名前をつけた方が良いかもしれません。

直近優先度は高くはありませんが、将来的には CoreBluetoothForUnity から Foundation 部分は切り出そうと思っています。

## おわりに

本記事では Swift のネイティブプラグイン開発において Foundation フレームワークの NSString 等を使うとできることについて紹介しました。
Swift 始めた時は `import Foundation` に何の意味があるのか全然わからなかったため、ネイティブプラグインの開発過程で良さがわかってよかったです！
[swift] Library not found for -lrealm-monorepoの解決策

realmを用いた個人開発中に「Library not found for -lrealm-monorepo」というエラーと出会し、数十分格闘したのちに一瞬で解決する方法があったので共有します。
![スクリーンショット 2023-11-18 21.42.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/be6ee3df-dfcc-a603-601b-c08e33de27bb.png)

結論、ターミナルのコマンドラインで
```
pod update
```
または
```
pod install
```
と記述すると解決しました。
ご参考までに
nixで古いverilatorを使いたい

# はじめに
verilator-5.018だとなんかバグるので、5.016に戻したいんだけどもうnixpkgs-unstableに存在しないので、5.010に戻すことにした.


```shell
% nix-channel --add https://nixos.org/channels/nixpkgs-unstable unstable
% nix-channel --add https://nixos.org/channels/nixpkgs-23.05-darwin nixpkgs
% nix-channel --list 
nixpkgs https://nixos.org/channels/nixpkgs-23.05-darwin
unstable https://nixos.org/channels/nixpkgs-unstable
% nix-env -iA nixpkgs.verilator nixpkgs.systemc
```

# ひどい技
```
% cd ~/.nix-defexpr/channels/nixpkgs/pkgs/applications/science/electronics/verilator/
% chmod 755 .
% curl https://raw.githubusercontent.com/NixOS/nixpkgs/69919a28af1c181dc84523b100a8ed45d4071304/pkgs/applications/science/electronics/verilator/default.nix > default.nix
% chmod 555 .
```
「トークンが正しくない。トークンは無視されます。」の原因と対処方法

## はじめに

私は日頃、IBM iでプログラム開発をする際はSEUを使用しています。
SEUはRPGの入力補完をしてくれるので、重宝しています。

しかし、先日SEUが何度確認しても間違っていない箇所で「トークンが正しくない。トークンは無視されます。」というメッセージを表示して困ってしまいました。
しかも、コンパイルは問題なくできる...

この記事では、上記のような状況でSEUから表示されるメッセージ「トークンが正しくない。トークンは無視されます。」の原因と対処方法をご紹介します。


## 原因

SEUはIBM i 6.1の時点で機能拡張を停止しています。

そのため、機能拡張停止以降に使用できるようになった機能に対して「トークンが正しくない。トークンは無視されます。」というメッセージを表示します。


## 対処方法
1. IBM iの公式ページ等で使用したい機能が、IBM i 6.1よりも後に追加／変更された機能か確認（画像１）
2. 1.に該当していたら、メッセージを無視して、「メンバーの変更／作成」→コンパイル

（画像１）
![tokenIncorrectCause_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2962887/c7a776fe-22de-09a1-f462-3433dcebb250.png)
[IBM Documentation](https://www.ibm.com/docs/ja)


## おわりに

SEUについては[PDMとSEU｜ IBM iの開発に欠かせない2つのツールがもつ強みと考慮点　～IBM iの開発環境を見直そう](https://www.imagazine.co.jp/ibmi-devre002/)で詳しくご紹介されています。

ご参考になれば幸いです。最後までお読み頂きありがとうございます。
８. 撲殺バットMODの作成（MOD公開）

# 概要
前回まででMOD開発が完了しました。
今回はSteam WorkshopへのMOD公開方法を解説します。[^1]

# １. MOD構成のおさらい
サンプルMODの解説の際に解説しましたが、MOD構成は下記の通りでした。
```
C:\Users\%username%\Zomboid\Workshop
 └─ P4BokusatsuBat              ←--  MODフォルダ１
     │  preview.png             ←--  Workshopで表示されるMODアイコン
     │  workshop.txt            ←--  Workshopで表示されるMOD概要
     │
     └─ Contents
         └─ mods
             └─ P4BokusatsuBat  ←--  MODフォルダ２
                 │  mod.info    ←--  MOD設定ファイル
                 │  poster.png  ←--  ゲーム内のMOD一覧で表示されるMODアイコン
                 │
                 └─ media       ←--  MOD実装
                     └─・・・
```
MODフォルダ２以下は、前回までのMOD開発にて完成している状態です。逆に、MODフォルダ１配下の「preview.png」と「workshop.txt」は未作成のため、MOD公開に先立って用意します。ただし、「workshop.txt」はMOD公開をすると自動で作られるファイルなので、初回公開時は無視して構いません。

「preview.png」はWorkshopで表示されるMODアイコンとなります。任意のアイコンを用意すればよいのですが、「poster.png」と変える必要もないと思われますので、今回は「poster.png」をリサイズした物を配置します。
![preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/ca3c6b1c-218e-0557-5ec2-808f841ed4ab.png) preview.png

# ２. MOD公開
ゲームを起動し、タイトル画面からMOD公開を実行します。

![08-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/6a4416c8-dca3-3fba-a755-6abcb9ddcff2.png)
１．タイトルメニューから「WORKSHOP」を選択します。

![08-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/845fa04d-a2ec-33d1-68b4-4d808153b150.png)
２．「アイテムの作成と更新」をクリックします。

![08-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/72fc14a5-8dd1-6a37-57ae-6566960a50b7.png)
３．MOD一覧の中から「P4BokusatsuBat」を選択し、「進む」をクリックします。

![08-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/ae066086-2501-cf31-343e-2e04b5723dbb.png)
４．MOD情報を入力し、「進む」ボタンをクリックします。
* タイトル：MODのタイトルを入力します
* 説明：MODの説明を入力します
* タグ：既定のタグから任意のタグを選択します
* 公開設定：公開設定を選択します
:::note info
タグ以外はSteam Workshop画面で後で変更できます。
タグはMOD更新時に合わせて変更できます。
:::
:::note info
説明にはマークアップタグが使えます、詳細は下記のURLを参照してください。
[Text Formatting](https://steamcommunity.com/comment/Guide/formattinghelp)
:::

![08-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/96788185-86fe-6d8f-2d46-5bd8b5e7cdd7.png)
５．「新規のWORKSHOPアイテムです」をクリックします。

![08-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/c3de3578-db5e-af21-a3fd-fd59f04fb39f.png)
６．変更履歴の編集はSteam Workshop画面でも編集ができるので、ここで入力しても、後から入力しても構いません。問題なければ「Steam WORKSHOPにアップロードする！」をクリックします。

![08-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/501a12bc-f95b-f5c3-d9ae-3706d4f64561.png)
７．アップロードに成功するとWORKSHOP IDが払い出され、公開完了となります。

![08-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/9e7e24a0-2f0a-afda-c3e5-a376242a41db.png)
８．Steam Workshop画面で、MODが公開されていることが確認できます。

# あとがき
これでMOD開発からMOD公開までの一通りの手順を説明しました。今回説明した方法は、数ある方法の中の１つにすぎませんので、実際にMOD開発で困った場合は、バニラ実装や他MODを参考にして開発を進めてください。

---
索引：[Project ZomboidのMODを開発する](https://qiita.com/PePePePePeil/items/5db632d902eb91847541)
前：[７. 撲殺バットMODの作成（独自ギミック追加２）](https://qiita.com/PePePePePeil/items/2877ece62d151c5ecf51) 
次：-

[^1]: 今回の内容を反映したMODファイルは下記。
💾 [P4BokusatsuBat_08.zip](https://www.pepepepe.com/zomboid/Qiita/P4BokusatsuBat_08.zip)（MD5チェックサム：58BA12B7A362559B0BF9D9AA347105D9）
Project ZomboidのMODを開発する

# 前書き
本記事では、Project Zomboid（以下、**PZ**）のMOD開発について記載します。
![Project Zomboid](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/49b7df76-a545-1959-94ee-3de74e38a5f6.jpeg)

# 目指すところ
* MOD開発における基本的な構成を理解する
* 簡単なMODを作成できるようになる
* 作成したMODをSteam Workshopで公開できるようになる

# 前提
* PZについて基本的な仕様を把握していること
* 一般的なプログラミング開発、およびスクリプト言語の経験があること [^1]
* 本記事はPZ「ビルド41.78」での開発を対象としています

# 注意事項
* 本記事で紹介する開発方法は、あくまで私の個人的なものとなります。
必ずしも最適な手法ではないと思いますので、参考までにご参照ください。
* 画像ファイル以外の添付ファイルは、自前のサーバ[^2]へリンクしています。
MD5チェックサムを記載しておりますので、自己責任でご活用ください。

# 全編を通しての参考情報
MOD開発における詳細情報は、ほぼ全て下記参考URLに記載されています。
本記事ではそれらの説明は最小限に留め、どちらかというとチュートリアルを目指します。
* [Modding - PZwiki](https://pzwiki.net/wiki/Modding)
* [Zomboid-Modding-Guide](https://github.com/FWolfe/Zomboid-Modding-Guide)

# 記事一覧
* [１. サンプルMODの作成（Hello World）](https://qiita.com/PePePePePeil/items/d115d365620871597e44)
* [２. 撲殺バットMODの作成（アイテム追加）](https://qiita.com/PePePePePeil/items/de2b4e2ddeb96a737378)
* [３. 撲殺バットMODの作成（各種差替え）](https://qiita.com/PePePePePeil/items/0f0403e33f2bb4f83f6c)
* [４. 撲殺バットMODの作成（レシピ追加）](https://qiita.com/PePePePePeil/items/d6e4c534070b23a34195)
* [５. 撲殺バットMODの作成（翻訳追加）](https://qiita.com/PePePePePeil/items/48fb6cbae1aa5b2b8952)
* [６. 撲殺バットMODの作成（独自ギミック追加１）](https://qiita.com/PePePePePeil/items/4365bbd374eaf334d416)
* [７. 撲殺バットMODの作成（独自ギミック追加２）](https://qiita.com/PePePePePeil/items/2877ece62d151c5ecf51)
* [８. 撲殺バットMODの作成（MOD公開）](https://qiita.com/PePePePePeil/items/eaf56f74f90f640bdbe6)

 [^1]: PZのMODは、基本的にLua言語での開発となります。
 Lua言語が未経験の場合も、一般的なスクリプト言語の知識があれば問題ないと思います。
 本記事では、開発全般や言語に関する一般的な説明は割愛します。
 [^2]: [https://www.pepepepe.com](https://www.pepepepe.com)
言語処理100本ノック2020 解答記事まとめ

# はじめに
言語処理100本ノックを解いた記録を記事にしました。使用言語はPythonです。

https://nlp100.github.io/2020/ja/

# 第1章
[言語処理100本ノック2020 (00~09)](https://qiita.com/Dukapan100knock/items/4c354abf4dc2f5035532)

# 第2章
[言語処理100本ノック2020 (10~19)](https://qiita.com/Dukapan100knock/items/62caddf7adb00d5c3878)

# 第3章
[言語処理100本ノック2020 (20~29)](https://qiita.com/Dukapan100knock/items/10568b5c1dfbab4e4542)

# 第4章
[言語処理100本ノック2020 (30~39)](https://qiita.com/Dukapan100knock/items/7db1d7d570122286459a)

# 第5章
[言語処理100本ノック2020 (40~44)](https://qiita.com/Dukapan100knock/items/86d6649096127f2f8d7a)
[言語処理100本ノック2020 (45~49)](https://qiita.com/Dukapan100knock/items/e0ead26e5402b1cfb039)

# 第6章
[言語処理100本ノック2020 (50~54)](https://qiita.com/Dukapan100knock/items/77ed7b5cd4eacf3e757e)
[言語処理100本ノック2020 (55~59)](https://qiita.com/Dukapan100knock/items/8af17bfa6959b1b0b96c)

# 第7章
[言語処理100本ノック2020 (60~64)](https://qiita.com/Dukapan100knock/items/d27d5071c316d5824186)
[言語処理100本ノック2020 (65~69)](https://qiita.com/Dukapan100knock/items/7ab949d209bf6dbc4802)

# 第8章
[言語処理100本ノック2020 (70~74)](https://qiita.com/Dukapan100knock/items/206264d41212624cabb9)
[言語処理100本ノック2020 (75~79)](https://qiita.com/Dukapan100knock/items/98d0c94a4caf9c90f01e)

# 第9章
[言語処理100本ノック2020 (80~84)](https://qiita.com/Dukapan100knock/items/13b18d68a6f0466f6cb0)
[言語処理100本ノック2020 (85~89)](https://qiita.com/Dukapan100knock/items/866e30222661b141c486)

# 第10章
[言語処理100本ノック2020 (90~94)](https://qiita.com/Dukapan100knock/items/dd1ae465e47c71599c67)
[言語処理100本ノック2020 (95. サブワード化)](https://qiita.com/Dukapan100knock/items/75d21a16e3c267260c75)
[言語処理100本ノック2020 (96, 97)](https://qiita.com/Dukapan100knock/items/abee50b776aa67a2e787)
[言語処理100本ノック2020 (98. ドメイン適用)](https://qiita.com/Dukapan100knock/items/05fc72a5e10227bb43a6)
[言語処理100本ノック2020 (99. 翻訳サーバの構築)](https://qiita.com/Dukapan100knock/items/bd8966fbb3c3597ce62b)
EC2で新規のインスタンスを立てたら外部への通信がうまくいかなかった時の話

先日遭遇したのでメモとして

原因の可能性はたくさんあるので、トラブルシューティング用としてご活用ください

# 症状
新規で立てたEC2インスタンス(ubuntu20.04/22.04)で外部へのアクセスが出来ない
今回試したコマンドは以下の2つ
```
$ sudo apt update
$ wget https://holyday.co.jp
```

ちなみにpingは通る

## 解決方法
1. まずはAWS公式で出ているトラブルシューティングを行う
    https://repost.aws/ja/knowledge-center/ec2-connect-internet-gateway
    ネットワークの設定ミスがとにかく多い
2. OSのバージョンを確認
    wgetの方は関係ないけど、パッケージ管理の場合はリポジトリのURLが死んでいる場合もある
    ちなみに今回はAWS公式のimageを使っていたのでこの懸念はあまりなかったけど、エラー文を元に検索するとだいたいこのケースがヒットする
3. IMDSv2の設定を確認
    今回はこのケースだった
    どうもv1からv2にバージョンアップしないとうまく動かなかった模様
    IMDSについては公式を確認してください
    https://aws.amazon.com/jp/blogs/security/get-the-full-benefits-of-imdsv2-and-disable-imdsv1-across-your-aws-infrastructure/

## まとめ
まあメモなので内容はこんなもんで・・・
別リージョンとか別アカウントとかで試して疎通可能なインスタンスと比較して発見しました
誰かのお役に立てばと・・・
Oktaに関するアウトプット

# このカレンダーについて
- Oktaの管理者になって数年経過しますが、これまで特にアウトプットなどしてきませんでした。
- アウトプットすることで自分の理解度を確認したいというのと、それが誰かの役に立てばと思って記載します。
- 記事中で日本語と英語が混じった表記になる可能性がありますがご容赦ください。


# 記載する記事
以下の内容をざっくり記載していきたいと思います。
※以下の目次は途中で変わる可能性があります。
※記事の作成状況によって順番が前後する可能性があります。

1. Oktaのライセンスでできること
    - 話題にするもの
        - Single Sign-On
        - Multi-factor Authentication
        - Adaptive Multi-factor Authentication
        - Lifecycle Management
        - Univarsal Directory
    - 正直ここからは触ったことないので話題にしません。
        - API Access Management
        - Advanced Server Access
        - Access Gateway
        - Workflows
        - Identity Governance
1. 簡単なメニュー説明①
    - Dashboard
    - Directory
    - Customizations
    - Applications
1. 簡単なメニュー説明②
    - Security
    - Workflow
    - Reports
    - Settings
1. Directory - People
1. Directory - Profile Editor
1. Directory - Groups
1. Directory - Rules
1. Applications
1. Admin Console Session Time
1. Applications - Template apps
1. 便利なChrome拡張機能 - Copy CSS Selector
1. テンプレートアプリ作成での留意事項（昨日の続きから）
1. Security - General
1. サインインを自社拠点IPからのみに制限する
1. サインイン時にMFAを求める
1. サインイン時にMFAを求めないパターンを残す
1. サインイン時にリスク判定を追加する
1. 特定のアプリのみ自社拠点外からのサインインを許可する
1. 便利なChrome拡張機能 - SAML-tracer
1. 便利なChrome拡張機能 - rockstar
1. Access Testing Tool
1. Okta - Administrators
1. GASでグループ作成＆リソースセットへの追加
1. AD->Oktaの同期をOkta->ADに切り替えた話

(2023/12/16 追記)
　12/25までの予約投稿が完了したため本ページの「記載する記事」も更新しました。
　当初何となく考えた内容とは結構変わりましたが、より意味のある内容にはなったかと思います。
【React×Blender】react-three-fiberで表示した3Dモデルに発光感（ブルーム）を付ける

# 背景
Blenderで作成した3Dモデルを`react-three-fiber`を使用し、
画面上に3Dモデルを描画する際に、できるだけBlenderで作成した3Dモデルの見た目のままWebサイト上に表示したいです。
Blenderでは発光感を出すBloom（ブルーム）を設定する事があります。
`react-three-fiber`を使用し、3Dモデルを描画するときにもこのブルームを反映できないか試してみました。

- react-three-fiber

https://github.com/pmndrs/react-three-fiber

### ◆ 3Dモデル描画完成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/18f20262-86bb-1481-8b3e-64dcc62c49d0.png)

# 3Dモデルの準備（Blender側）
今回はBlenderでブルームを付けた以下画像の3Dモデル（moon_and_star.glb）を準備しました。
画像内の3つのオブジェクトはいずれも`放射の強さ`は`3.0`で設定しています。
![moon_and_star2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/d9e251dc-f617-e20b-5800-6d993f401386.png)

Blenderでエクスポートする際の設定は以下の通りです。
glTF型式でエクスポートしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/56bcc94f-5d68-ff52-803e-90781cefd6cd.png)

# 前提
以下の記事で作成した環境で3Dモデルを描画します。
本記事の環境もこちらと同じものです。

https://qiita.com/enumura1/items/8449c2c0b00c8eeac6c6

### ◆ 環境
- Blender：3.4
- Typescript：4.9.5
- React：18.2.0
- React-three-drei：9.88.11
- React-three-fiber：8.15.9

# 3Dモデルの描画
先に`App.tsx`の全体のコードは以下の通りです。
3Dモデル表示について記載した[こちらの記事](https://qiita.com/enumura1/items/8449c2c0b00c8eeac6c6)の`App.tsx`に加えて、
本記事の`App.tsx`では、`ブルームエフェクト`について記載を追加しています。

```react:App.tsx
import { Canvas } from '@react-three/fiber'
import { OrbitControls, useGLTF } from '@react-three/drei'
import { Bloom, EffectComposer } from '@react-three/postprocessing';

function Model() {
  const { scene } = useGLTF("assets/moon_and_star.glb")
  return <primitive object={scene} />
}

export default function App() {

  return (
    <>
      <Canvas camera={{ position: [2, 1, 2], near: 0.05 }}
        style={{ background: "#001122" }}>
        {/* 3Dモデルの表示 */}
        <group>
          <Model />
        </group>
        {/* 自動横回転 */}
        <OrbitControls autoRotate />
        {/* ライト */}
        <directionalLight position={[5, 5, 5]} castShadow />
        {/* ブルームのエフェクト */}
        <EffectComposer>
          <Bloom />
        </EffectComposer>
      </Canvas>
    </>
  )
}
```

### ◆ 詳細：発光感（ブルーム）を付ける方法
`react-postprocessing`の`EffectComposer`と`Bloom`を使用する事で、
Blenderでの発光感に近いオブジェクトを表示できました。
以下の通り、`EffectComposer`内に`Bloom`の記載をしています。

```react
{/* ブルームのエフェクト */}
<EffectComposer>
  <Bloom />
</EffectComposer>
```

### ◆描画結果
Blenderでの見た目と多少異なりますが、
ブルームにより発光感が付いた3Dモデルが描画できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/d883c156-5d0e-1fe1-568a-d38f065dc8a7.png)

比較として、ブルームのエフェクト( `<EffectComposer>～<EffectComposer/>`)部分を記載しなかった場合と記載した場合のWebサイト上の見え方を比べてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/4860b850-d6cd-ea30-88de-c852ccc1a5c5.png)

# 参考
- https://docs.pmnd.rs/react-postprocessing/effects/bloom
- https://docs.pmnd.rs/react-postprocessing/effect-composer
- https://github.com/pmndrs/react-postprocessing
- https://threejs.org/docs/#examples/en/postprocessing/EffectComposer
android studio 覚書 (お題 1：ボタンを押してテキストを更新する)

## お題 1：ボタンを押してテキストを更新する

### 1-1. イメージ

下記のような画面を実装する。

ボタン押下前
![スクリーンショット 2023-11-18 203537.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723869/38afe4b7-8f35-a5a6-ba75-ab7c9a1c2a60.png)

ボタン押下後
![スクリーンショット 2023-11-18 203600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723869/eaf14ee9-8385-2139-006e-af87f23dafb8.png)

---

### 1-2. 実装
実装したコードは下記の通り。
MVC ModelのC(Controller)に該当する部分？
V(View)はxmlファイルの画面定義、M(Model)は...？

```java
package com.example.helloworld;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // TextViewを取得
        final TextView text = (TextView)findViewById(R.id.text);

        // Buttonを取得
        Button button = (Button)findViewById(R.id.button);

        // Buttonをタップされた時の処理
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                text.setText("Click!!");
            }
        });
    }
}
```

---
### 1-3. 画面上のオブジェクトを取得する処理

画面上に生成されたTestViewやButtonにアクセスするため、それぞれのオブジェクトを取得する。

```java
        // TextViewを取得
        final TextView text = (TextView)findViewById(R.id.text);

        // Buttonを取得
        Button button = (Button)findViewById(R.id.button);
```


---
### 1-4. ボタン押下時の処理

ボタン実行処理は、下記の通り。
``` button.setOnClickListener(instance);```
```java
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                text.setText("Click!!");
            }
        });
```
コールバックに設定しているのは、Viewクラスインスタンスらしい。

---
### 1-5. 所感など

#### 所感 1. Modelとは...？  
MVC Modelについて、調べると画面に表示する内容を作るようなメインのロジックは、Modelで行うらしい。恐らく、今回作成したアプリの```public void onClick(View v)```関数の中身が該当する？
本来は、画面に対応するModelクラス実装し、ボタン押下時に走る処理はその中に記述する...のが望ましい？

#### 所感 2. ボタン押下時のコールバック登録記述が長い
下記のようにも書いて改善できるらしい。
``` buttonClick ```は、関数オブジェクトというらしい？


```java
public class MainActivity extends AppCompatActivity {
    private TextView text;
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // TextViewを取得
        text = (TextView)findViewById(R.id.text);

        // Buttonを取得
        button = (Button)findViewById(R.id.button);

        // Buttonをタップされた時の処理
        button.setOnClickListener(buttonClick);
    }

    private View.OnClickListener buttonClick = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            text.setText("Click!!");
        }
    };
}
```