OmniAICreator/Qiita-1.07M huggingface dataset:
Vim Bootstrap 基本プラグイン 2022ver

# 概要
Vim Bootstrap の記事を書いてから五年が経ちました。
2017年の記事は[こちら](https://qiita.com/uyo/items/2f8f1d6173b7ee0c0fac)。
今回は前回と比較しながら最新の内容を紹介します。

# Vim Bootstrap 2022 解説
https://vim-bootstrap.com/
あなたにフィットする vimrc が手軽に作成できるサービスです。
NeoVim/Vim 対応で対象言語とフレームワーク、テーマを選択してあなたが欲しい vimrc を作成することができます。
ここからは2017年にはなかった機能を紹介します。

## 言語選択の種類
最新の人気言語にもバッチリ対応されています。
![スクリーンショット 2022-12-04 10.40.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185747/74e6cc84-49ab-6c09-2e84-c13f9769a07d.png)

## フレームワーク選択
Javascriptのフレームワーク Svelte と Vue.js の開発に必要なプラグインが導入されます。
選択すると以下がインストールされます。
- svelte
  - [vim-svelte-plugin](https://github.com/leafOfTree/vim-svelte-plugin)
- Vue.js
  - [vim-vue](https://github.com/posva/vim-vue)
  - [vim-vue-plugin](https://github.com/leafOfTree/vim-vue-plugin)

## テーマ選択
様々なカラースキームの選択が可能になりました。
選択できるテーマは、 以下の９つです。
- [codedark](https://github.com/tomasiser/vim-code-dark)
- [dogrun](https://github.com/wadackel/vim-dogrun)
- [dracula](https://github.com/dracula/vim)
- [gruvbox](https://github.com/morhetz/gruvbox)
- [molokai](https://github.com/tomasr/molokai)
- [pencil](https://github.com/preservim/vim-colors-pencil)
- [sonokai](https://github.com/sainnhe/sonokai)
- [vadelma](https://github.com/severij/vadelma)
- [wombat](https://github.com/sheerun/vim-wombat-scheme)
![スクリーンショット 2022-12-04 10.28.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185747/4a7698b2-5c34-437d-bfbf-4bf6f58fce5b.png)

# Vim Bootstrap 基本プラグインリスト 2022
差分のみ紹介しますが、あまり変わっていないです。
それだけ プラグイン開発者が長年にわたって開発を行なっていただいているということです。
開発者の皆様ありがとうございます。

## [ale](https://github.com/dense-analysis/ale)
Asynchronous Lint Engine 名前の通りです。
NeoVim 0.2.0+ および Vim 8 にて編集中に Linting を提供するプラグインです。
簡単に言えばIDEみたいにチェックしてくれるやつをサポートしてくれるやつです。

## [vim-rhubarb](https://github.com/tpope/vim-rhubarb)
vim-fugitive（VimでGit操作を行うやつ)をより便利に使用するためのプラグインです。
対象のGithub URLを開いたりしてくれます。

# 気に入った方は
[Product Hunt](https://www.producthunt.com/products/vim-bootstrap) で応援してあげてください！
またあなたが 貢献することも可能です!
https://github.com/editor-bootstrap/vim-bootstrap
ノーコードで実行できる最新AIまとめ

# はじめに
こんにちは。watnowという関西IT団体に所属しているシュウです。最近、進化が早すぎるAIについてまとめてみました。ノーコードで実行できるようになっているので、ぜひ試しみてください。


# 作曲AI(text to music)
テキストから音楽を生成する音楽生成AIです。

[Hugging Face](https://huggingface.co/)のアカウントがある方は、こちらの[サイト](https://huggingface.co/spaces/Mubert/Text-to-Music)で実際に実行してみましょう。promptには実行したい曲の詳細を入れます。そして、下の送信を押して、しばらくすると生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971960/ab1efe1b-99cc-17c2-c068-68f796ea22ad.png)

また、mubert-text to musicを使うことで、ローカルの[Google colab](https://colab.research.google.com/github/ferluht/Mubert-Text-to-Music/blob/main/Mubert_Text_to_Music.ipynb)でも試すことができます。

:::note warn
実行するにあたって、先にOpenAIの登録が必要です。
:::

詳しくは[こちらの記事がオススメ！](https://kan-kikuchi.hatenablog.com/entry/Mubert-Text-to-Music)


実行してみると、数秒で１分程度の曲が作ることができます。人間であれば一ヶ月くらいかかりそうな曲を数秒で返してくるので驚きですね。

# 画像生成AI(Stable Diffusion)
text-to-imageモデルで、主にテキスト入力に基づいて画像生成します。Stable Diffusionは、2022年にOSSになり、最近ではよく目にします。twitterでも話題になってますね。

こちらの[サイト](https://app.baseten.co/apps/VBlnMVP/operator_views/nBrd8zP)(Stable 2.0)で簡単に試すことのできます。画像のクオリティが高いですね。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971960/276c4816-c347-fc08-d965-1a2c91b723ef.png)
「bulldog with sunglasses, beach side」で試しみました。


紹介程度ですが、LINEでも「お絵描きはばりぐっどくん」を友達追加すると、Stable Diffusionを体験できます。

# コード生成AI(ChatGPT)
こちらが一番衝撃的ですよね笑
OpenAIによって開発されたチャットボットAIで、11月30日に公開されました。Transformersと呼ばれる技術が用いられ、人間のような自然な言語処理に設計されています。

OpenAIはそのほかにも、text-to-imageモデルのDALL-Eを作った人工知能の非営利団体です。

ChatGPTは、質問応答やプログラムを自動で生成します。本当に色々な質問に答えてくれます。

では、試しにやってみましょう！
今回は、[ChatGPT](https://chat.openai.com/chat)にサインインして、検索バーに「Pythonを使ってブロックチェーンを作成する方法」と打ってみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971960/42cdba45-4dd4-ab74-d5e3-e05f83f976a0.png)
```ruby:
# モジュールのインポート
import hashlib
import json
from time import time

# ブロックチェーンクラス
class Blockchain:
    def __init__(self):
        self.chain = []
        self.current_transactions = []

        # ジェネシスブロックを作成する
        self.new_block(previous_hash=1, proof=100)

    def new_block(self, proof, previous_hash=None):
        """
        新しいブロックを作成する
        :param proof: <int> プルーフ・オブ・ワークアルゴリズムから得られるプルーフ
        :param previous_hash: (オプション) <str> 前のブロックのハッシュ
        :return: <dict> 新しいブロック
        """

        block = {
            'index': len(self.chain) + 1,
            'timestamp': time(),
            'transactions': self.current_transactions,
            'proof': proof,
            'previous_hash': previous_hash or self.hash(self.chain[-1]),
        }

        # 現在のトランザクションリストをリセット
        self.current_transactions = []

        self.chain.append(block)
        return block

    def new_transaction(self, sender, recipient, amount):
        """
        次に採掘されるブロックに加える新しいトランザクションを作成する
        :param sender: <str> 送信者のアドレス
        :param recipient: <

```
という結果が返ってきました。

ここまでの結果が返されると、正直にビビりますよね。


# まとめ
今回は最近自分で触ったAIについてザッと紹介しました。まとまったサイトがなかったので紹介になればと思います。AIを触ってみてスゲ〜と思いましたが、こんなことまでAIにできてしまうのかと思うと複雑な気持ちになりました。ご質問等ありましたら、[ChatGPT](https://chat.openai.com/chat)の方までお願いします。ありがとうございました。
using Photon.Pun; が使えない

こんにちは、ユーゴです。
今回は、UnityでPhotonを使おうと思った時につまずいたエラーを紹介します。

## 解決したいこと
以下のコードを書くと、Photonを入れているはずなのに無いとエラーが出る

```cs
using Photon.Pun;
```

> The type or namespace name 'Pun' does not exist in the namespace 'Photon'

## 解決策
旧式のPhotonである「Photon Unity Networking Classic - FREE」を使っていた。
新しいのは「**PUN2 - FREE**」のため、旧式のPhotonを消して新しいPhotonを入れる。
![スクリーンショット 2022-12-03 13.00.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/fd758154-d083-7cdc-f988-8d11b08db649.png)

## 補足
(2022/12/25追記)
そのPUN2よりもさらに新しいバージョンで、「Photon Fusion」というものがあるようです。(私は検証できておりません...)
新しいため資料が少ないようですが、そちらに挑戦してみるのも良いかもしれません。

@lensoukoさん、情報提供ありがとうございます！

## まとめ
いかがだったでしょうか。
今回は、using Photon.Pun;が使えないという問題を紹介しました。
無料のPhotonアセットにも2種類あって、ぱっと見で「Photon」という文字がある方を入れてしまいたくなりますが、PUN = Photon Unity Networkingのことなので、「PUN2」を入れましょう。

このように、中堅的な技術の紹介から、初級〜上級向けの技術紹介をしています。内容も、UnityだけでなくGASやストア公開、VRChat系などを取り扱っています。
気に入っていただけましたら、LGTM・フォローの方よろしくお願いいたします。
JIS G5502 ISO法の黒鉛形状区分Ⅰ～Ⅵの丸み係数について

# はじめに
今年（2022年）4月に改正されたJIS G5502 球状黒鉛鋳鉄品のISO法による黒鉛球状化率の測定では、画像処理を用いて次の①または②の方法で求めると規定されています。

①ISO945-1の黒鉛形状区分のタイプⅥおよびⅤに分類される黒鉛の全面積を、全黒鉛の面積で割って求める
②丸み係数が0.6以上の黒鉛の面積を、全黒鉛粒子の面積で割って求める

ここで、方法①で球状化率を求める場合、JISでは具体的な方法は規定されていませんので、組織画像からタイプⅥおよびⅤに相当する黒鉛を何らかの方法で分類する必要があります。

ここでは、手始めとして、ISO945-1のFig.1のタイプⅠ～Ⅵの黒鉛形状を丸み係数で分類できるか調べてみました。

# ISO945-1のタイプⅠ～Ⅵの丸み係数
タイプⅠ～Ⅵにおける個々の黒鉛の丸み係数を求めた結果を下図に示します。図において、白丸は個々の黒鉛の丸み係数で、数字は各タイプの丸み係数の平均値です。また、図中の赤線は丸み係数0.6の位置を表しています。図より、タイプⅤの黒鉛でも丸み係数が0.6未満のものがあることや、タイプⅢおよびⅣでも丸み係数が0.6以上のものがあることが分かります。このことから、ISO945-1のタイプⅤ、Ⅵの黒鉛を丸み係数だけでタイプⅠ～Ⅳと完全に分類するのは難しいことが分かります。

![Figure.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/da0cd985-0d24-5599-98cf-f0a8490c45ae.jpeg)
図　ISO945-1のタイプⅠ～Ⅵの丸み係数
チームにアウトプットの文化を作ろうとしている話

# はじめに

私は都内のweb系の企業でエンジニアをしています。
業務で学んだこと、気づいたことをお互いにアウトプットする**文化の形成**のために行っている取り組みについて話します。

# その１ - 定期勉強会を開く(失敗)

## 目的

* 定期的にいろいろな分野の勉強会を軽い感じで自分が開けば後に続いてくれたりするかも！

## 数か月続けた結果

⇒ <font color="red">**勉強会を開くおじさんになりました。**</font>

私は勉強会を開く人。
周りのチーム員は聞く側。
という風に役割が固定してしまいました。。。。

# その２ - 勉強会を持ち回り制にしてみた(失敗)

## 目的

* 私だけに役割を固定せずに、**みんなが勉強会を開く人**の役割になる

## 結果

⇒ <font color="red">**開催されない**</font>

ん～、勉強会ってハードルが高かったのかもしれません...

* 忙しいから...
* 話す内容が見つからなくて...
などの理由でなかなか開催されない...


# その３ - 数分のLT(ライトニングトーク)で技術紹介をしてみた(失敗)

## 目的

1. 技術者の創作意欲をかき立てる！
1. 何かを作る！
1. それをLTでいいから聞かせてとねだる！
1. アウトプットを狙う

## 結果

* **<font color="red">1. 技術者の創作意欲をかき立てる！までしか進まない...</font>**

LTの感想としては
* 作ってみたくなった！
* これくらいなら話せそう
* 学習意欲が高まりました

のような割と良い意見が出ており、これはいい流れか！と思ったのですが、
<font color="red">結局続きませんでした...</font>

# 今行っている取り組み - いい感じ？

## 12月いっぱいで何か1つのwebアプリケーションを作ってみよう！

* 何を作れば良いかわからない。
* 作りたいものが特にない
* 使いたい技術もわからない

上記のような理由で学習から遠ざかっていた人が多かった。
そういった人にテーマ決めから技術選定まで付き合い、
一人一つ何かのwebアプリケーションを作ってみようとしております。

今のところいい感じに全員が動いているので、今月末が楽しみです！


※ 追記

全員が完成まではいきませんでしたが、
全員が手を動かしてくれました👍

来年からもチームビルディング頑張ります！
技術力アップの個別開発勉強会 -モブプロ開発を行っているチームでやっている取り組み-

# はじめに

本記事は[モブプロ開発を行っているチームでやっている取り組み Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mob_torikumi_example)の20日目の記事です

私たちのチームでは会社で利用したことない技術や取り組みを行うという研究開発がミッションとして任せられています。その一環で新技術の利用として社内で利用実績のない、`Go`, `React`, `TypeScrpt`の構成で社内システムを作ることにしました。

しかし、私以外はすべての利用経験はないですし、静的型付けの経験、JavaScriptのフレームワーク経験すらありませんでした。そんな中でモブプログラミングからペアペアプロ、キャプテン制度が行えるまでチーム全体の実装力を伸ばすために行った「個別開発勉強会」について紹介します

# 前回

https://qiita.com/Sicut_study/items/4e93f53b8625599e4811


# Chpater#19 1人でやって実力がわかる

ベープ「いやーReact楽しいですね」
もうこの言葉はこの連載で何度目かというくらいベープさんはReactに虜だ

ミュート「でも、Routerの設定だったり、filter、Mapだったりあまり機会がないけど絶対必要な機能はあまりできていないので自分でやったらできるかは不安ですね」
アール「実際に環境構築からやってはいますが、実際に自分でやったらそこもスムーズにできるか不安はあります。いまはみんなでやってるからスムーズにいけてる感じですかね」
じん「私たちの会社では1カ月32時間ほど自由に業務内で学習してよいという制度があるので、この時間をうまく使って今回は個別開発勉強会をやろうと思います！」

じん「個別開発勉強会は月の初めからスタートして毎日1-2時間ほどそれぞれが好きなものを開発する時間を取り、月末に何を作ったか簡単なプレゼンテーションをしてもらいます。ここで自分でWEBアプリが作れるなら自信をもって開発もできると思いますし、すべて一人でやるので自分が理解していないところもわかると思います」
ミュート「楽しそうですね。チケット周りを楽に管理できるアプリケーション作りたかったのでやりたいです」

# 個別開発勉強会とは

個別開発勉強会は会社で設けられている32時間という勉強に自由に使ってよい時間の中で学習した技術を利用して、好きなWEBアプリケーションを作る勉強方法です。
最後に作ったアプリケーションについて簡単なプレゼンテーションをして終わりです

ここで各自が作るアプリケーションについて最初に決めるのですが以下の点に注意します
- 20時間程度で終わるくらいのボリュームにする
- バックエンドは作らない(Firebase)でフロント(React)に集中する
- Reactに慣れている場合は、少し挑戦を行う(使ったことないCSSフレームワークを使うなど)
- そのアプリを使うことで何か問題が解決できるものを作る

ポイントとしてはしっかり期間内で作りきることだと思っています。
なので、勉強会の最初に「今日どこまで進めるのか」を聞いて、最後に「どこまで終わったか」を聞くようにしていました
またわからない箇所などあれば少し考えてもらって、一緒に手伝ってあげるようにしました


それと大事にしているのは「そのアプリが何か問題を解決する」というところです。なので単純な`TODOリスト`を作るというのはこの勉強会ではNGとしています

アイデアを出すために`Yahooハッカソン`の動画も全員に見てもらいました。この動画は開発する視点を学べるのでとても学びがあります

https://www.youtube.com/watch?v=w_Fb7wVX0bA

# 作ったもの

1カ月もあったので割と色々なシステムが作れました (1人2つくらいは作れました)
そこでいくつか紹介します

まずは私が作成したNext.jsでできたテックブログ

https://qiita.com/Sicut_study/items/35d7edd832debb7e0f14

それと5段階評価をみんなで行うシステム

https://qiita.com/Sicut_study/items/33eb916c2b92f03be6c3

ベープさんが作った`技術メモ`をためておくアプリであったり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/9624f7c8-c1a1-74ac-b5cf-44a39bb088e5.png)

アールさんが作った毎日成長したことを共有するアプリであったり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/676039ed-59e5-137a-7dc9-f6b8b0ff4732.png)

などなど細かいものも含めて1カ月という短い時間で多くの便利ツールが生まれました
この勉強会を通してそれぞれの実力が確かなものになったかなと思い、Reactに関しては心配はいらないレベルになりました

# 次回

https://qiita.com/Sicut_study/items/e315d2fbd7c6a9cd56e1

# おわりに

勉強時間を業務にとれる環境であれば自分で何かものを作る経験はその価値にとても見合うと思います
ちゃんと時間内でつくれるもので挑戦的なものを設定してあげるのがマネジメントに必要にはなりますが、終わったころには1つアプリを作った達成感で視野がかなり広くなると思います

ぜひ試してみてください
NetBSD/armのuart

NetBSDではシリアルコンソールはデフォルトのシリアルからデバイスのシリアルになります。

デフォルトのシリアルでは割り込みを使わずビジーループで出力しますが、タイマーを動かすところから割り込みが使われるようになります。

初期のデフォルトのシリアルの初期化はsys/arch/evbarm/gemini/gemini_machdep.cには下記のようにあります。

```c
void
consinit(void)
{
        static int consinit_called = 0;

        if (consinit_called != 0)
                return;
        consinit_called = 1;

        if (comcnattach(&gemini_a4x_bs_tag, consaddr, conspeed,
                GEMINI_COM_FREQ, COM_TYPE_16550_NOERS, conmode))
                        panic("Serial console can not be initialized.");
}
```

comcnattach()はdev/ic/com.cにある関数です。

sys/kern/init_main.cからもよばれるので、一度しか処理しないようにしています。

第三引数のTYPEはいのように定義があります。

```
        /*
         * There are a great many almost-ns16550-compatible UARTs out
         * there, which have minor differences.  The type field here
         * lets us distinguish between them.
         */
        int sc_type;
#define COM_TYPE_NORMAL         0       /* normal 16x50 */
#define COM_TYPE_HAYESP         1       /* Hayes ESP modem */
#define COM_TYPE_PXA2x0         2       /* Intel PXA2x0 processor built-in */
#define COM_TYPE_AU1x00         3       /* AMD/Alchemy Au1x000 proc. built-in */
#define COM_TYPE_OMAP           4       /* TI OMAP processor built-in */
#define COM_TYPE_16550_NOERS    5       /* like a 16550, no ERS */
#define COM_TYPE_INGENIC        6       /* JZ4780 built-in */
#define COM_TYPE_TEGRA          7       /* NVIDIA Tegra built-in */
#define COM_TYPE_BCMAUXUART     8       /* BCM2835 AUX UART */
#define COM_TYPE_16650          9
#define COM_TYPE_16750          10
#define COM_TYPE_DW_APB         11      /* DesignWare APB UART */
```
この関数はレジスタが1バイト毎に並んでる場合に使います。SOCによっては4バイト毎になっていて、その場合はcomcnattach()の中身をいじる必要があるので、自前で用意します。4バイトすなわち2ビットシフトでcom_init_regs_stride()関数を呼びます。

```c
int
m83comcnattach(bus_space_tag_t iot, bus_addr_t iobase, int rate,
    int frequency, int type, tcflag_t cflag)
{
        struct com_regs regs;

        /*XXX*/
        bus_space_handle_t dummy_bsh;
        memset(&dummy_bsh, 0, sizeof(dummy_bsh));

        /*
         * dummy_bsh required because com_init_regs() wants it.  A
         * real bus_space_handle will be filled in by cominit() later.
         * XXXJRT Detangle this mess eventually, plz.
         */
        com_init_regs_stride(&regs, iot, dummy_bsh/*XXX*/, iobase,
                2);


        return comcnattach1(&regs, rate, frequency, type, cflag);
}
```

これでデバイスになるまではOKです。

あとはcomデバイスのattach()でもcom_init_regs_strideを呼びます。

comにも上記のようにいくつかのタイプの処理がはいっていますが、大幅に違う場合は独自に実装しているケースもあるようです。

comの実装は分かりにくくて、よくありません。

sys/arch/evbarm/devにもcomのコードがあるようです。

RT1310でuartが暴走するので調べてみたら受信をsoftintしているところで、暴走してました。とりあえず、rxはsoftintしないで直に実行するようにしたらうごきました。なんか動きが変です。
contabo VPSにWireGuardをインストールしてみた

参照サイト
https://gihyo.jp/admin/serial/01/ubuntu-recipe/0614
https://mirahouse.jp/n10/blog/2020/vpn-wireguard/


# WireGuardをインストールする
```
sudo apt install wireguard
```

# サーバー用秘密鍵・公開鍵を生成する
```
wg genkey | sudo tee /etc/wireguard/server.key
sudo cat /etc/wireguard/server.key | wg pubkey | sudo tee /etc/wireguard/server.pub
```

# クライアント用秘密鍵・公開鍵を生成する
今回はPC用とスマホ用に2つ作る
01と02フォルダにそれぞれ秘密鍵・公開鍵が生成される
```
mkdir ~/wireguard/01
cd ~/wireguard/01
wg genkey | sudo tee client.key
sudo cat client.key | wg pubkey | sudo tee client.pub

mkdir ~/wireguard/02
cd ~/wireguard/02
wg genkey | sudo tee client.key
sudo cat client.key | wg pubkey | sudo tee client.pub
```


# サーバー設定をする

クライアントに割り当てたVPN用IPアドレスをAllowedIPsに設定する
サブネットマスクは/32でないとエラーになるという情報があったので
その通りにした。
PostUp/PostDownはWireGuardの起動/終了時に実行するコマンド
iptablesのフォワーディングの設定を追加しているので
スマホ > WireGuardサーバー > インターネット
という経路が利用できるようになる。

```conf:/etc/wireguard/wg0.conf

[Interface]
PrivateKey = (serverPrivateKey)
Address = 10.0.0.1
ListenPort = 51820
SaveConfig = true
PostUp = iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -o %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -o %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = (clientPublicKey1)
AllowedIPs = 10.0.0.2/32

[Peer]
PublicKey = (clientPublicKey2)
AllowedIPs = 10.0.0.3/32
```

# クライアント設定をする
[Interface]
DNSはサーバーがアクセス可能なDNSを指定する
(指定しないとインターネットにアクセスできなかった)

[Peer]
AllowedIPs = 0.0.0.0/0を指定することで
クライアントのすべての通信をWireGuard経由にする
EndpointにはサーバーのIPアドレスとListenPortを指定する
```conf:client1
[Interface]
PrivateKey = (clientPrivateKey1)
Address = 10.0.0.2/32
DNS = 8.8.4.4

[Peer]
PublicKey = (serverPublicKey)
AllowedIPs = 0.0.0.0/0
Endpoint = x.x.x.x:51820

```
```conf:client2
[Interface]
PrivateKey = (clientPrivateKey2)
Address = 10.0.0.3/32
DNS = 8.8.4.4

[Peer]
PublicKey = (serverPublicKey)
AllowedIPs = 0.0.0.0/0
Endpoint = x.x.x.x:51820

```

# サーバーでWireGuardを起動する
```
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
```

# クライアントでVPN接続し、サーバーで接続状態を確認する

```
sudo wg
```
<img width="400" alt="wg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99234/46e70933-bac9-1864-05dd-f2e86feae7d1.png">

# 検証する
WireGuard無効の時は、フリーwifiのアドレスが表示される
<img width="400" alt="ip1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99234/bc31e200-5658-1646-c259-3cb44795fdc1.png">

WireGuard有効の時は、contabo VPSのアドレスが表示される
<img width="400" alt="ip2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99234/638339aa-269b-f173-a38c-f84b0913caf5.png">
絶対に止めれないシステムの作り方

# 絶対に止めれないシステムとは
もちろん銀行システムとかのクリティカルなシステムもそうなのですが、今回は、そこまでではないのですが、データ連携上一部のapiは止めれないシステムを指します。
僕は直面したのが、Lineでのユーザー登録によるwebhookを受け取るって奴です。
昔のキャリアのユーザー登録であれば、止まっていた時には別途データが飛んできてまとめて処理とかも出来ましたが、Lineさんのはありません。ユーザー登録時のwebhookを取りこぼすと２度と受信出来ないのです。
同様にSNS等で登録時にwebhookが来て、対応する必要があるシステムもあると思います。
LINE、現在は再送機能があるみたいです。
https://developers.line.biz/ja/news/2022/04/19/webhook-redelivery/

# どうすれば良いか？
先ず思うのは、AWSでLambdaで受け取って処理すれば良いと思うでしょう。
これでも良いのですが、Lambdaがエラー処理で落ちたりすることもあります。
## 最初の構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/9d838c57-4857-540e-c8ee-7d5dec19bfcd.png)

この構成の場合は、通常時は良いのですが、トラブル時にデータをロストしてしまいます。
- webhook側でエラー
- ALBとEC2の通信障害

トラブル以外にもデプロイ時のwebサービスの再起動等の時もデータがロストしてしまいます。
## 改善したシステム構成
なので下記構成にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/32afb6a8-877d-7901-1952-61c7a0ecfdfd.png)
ALB->Lambda->SQS->Lambda->webhook(API)
１．最初ALBからlambdaを呼び出す
２．lambdaは、SQSでキューを登録し終
３．別のlambdaを定期的起動させ、SQSのキューをチェックさせる
４．キューがあったら、取り出し、webhookAPIをコールする
２でキューを追加する場合は、冪等性を担保するために、そのデータが以前に処理されたことがあるかどうかをチェックします。

# 最後に
これによりシステム停止時にも問題なく稼働するシステムが構築できましたが、SQSでなくても、S3に保存したり、
他にもやり方はあると思います。
皆さんが考えたaws構成について教えて下さい
LivewireのpublicプロパティにCollectionを入れる際にはArrayに変換しよう。

# 理由
hydrateの際に不要なクエリが発行されるらしい。

# これを知った発端はこの質問
https://forum.laravel-livewire.com/t/how-to-prevent-hydrating-public-property/4418

どうやら質問者はLivewireのライフサイクルの内の一つであるHydrateの際に、<b>更新前の状態を維持するためのクエリが発行されるのをどうしたら止められるんやってことを聞いている</b>ようである。

# 結論
Livewireでは更新前と更新後の状態を取得するためにクエリを発行するそうです。実際、更新後だけしか必要ないときの方が多いのかなーと思うので、できれば更新前の状態を取得するクエリは発行したくないですよね。

解消方法は3パターン
### ①CollectionをArray型にしてpublicプロパティに入れる。
Collectionじゃなければクエリは発行されないとのこと。（Modelはわからん）

この時使うメソッドはall()かtoArray()のどっちがいいんやろか。。。

https://qiita.com/ucan-lab/items/47638a7b52090f59c2bf

### ②Collectionの主キーだけpublicプロパティで管理する
Collectionを直接publicプロパティに入れるのではなく、主キーだけを配列で入れる。
renderの際に、主キーを使ってblade側に渡せばよい。

### ③wire:ignoreを使う
上記質問の解答にこう書いてある。
「Depending on how you use these categories, you may be able to exclude them from your component or <b>use wire:ignore so that they are not rendered on every view render</b>.」

訳：それらのカテゴリープロパティ（public $categories）をどのように使うか次第で、Livewireコンポーネントから取り除けるかもしれないし、<b>プロパティが毎度毎度レンダーされないようにwire:ignoreを使えるかもしれない。

これは興味深いですねぇ。ｵｰﾝ。

# まとめるンゴ
近いうちに実際に自分で開発したアプリケーションを使ってクエリ発行数を抑えられるか試してみようかと思います。
ひとまずpublicプロパティを使う時の問題点と、改善の手段としてこういうのがあるで～というのを紹介してみました。
<b><font color="red">実際に試したり改善できた方はぜひ記事にして下さい。

### <b>いいね100回連打します。レンダーだけに。（バカウケ）</b>
性能テストってなんだ

性能テストについての備忘録。



# 性能ってなんだ


性能とは、「**システムが処理結果を返す力**」である。 
性能で確認する観点は下記の３つで、それぞれは強く影響しあっている。
![スクリーンショット 2022-12-04 10.34.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255565/99a8ab5b-6311-5817-dfa4-11b2c85126f1.png)


# 性能テストの2つの目的

## 目的① : 「運用時」に想定ユーザ数の利用に耐えられるか

「運用時」と言う言葉がとても大事である。もし、運用を意識しなくても良いならば、単に想定ユーザの分だけリクエストを投げて耐えられるかどうかを見るだけという単純なテストになる。しかし、それぞれのシステムはそれぞれの特性のもと動作する。なので、性能テストは様々な角度でのテストが必要になる。

例としては下記である。
- 長時間負荷がかかることがあるのか？
- スパイラルは起こり得るのか？
- データは大量に増えることはあるのか？
- リソースはどの程度で運用するのか？
- 他サービスとの兼ね合いはあるのか？ Etc…

大事なのは、そのシステムで起こりうる**環境的な事象**に対して、想定通りに動作することを保証することである。

## 目的② : 性能限界の把握とその対策法を準備すること

言わずもがなであるが、システムは**変容**し続ける。API自体が改訂されたり、APIの使われ方が変わったり、リソース量を減らしたり、アクセス数が増えたりと状況は変わり続ける。


この前提に立つと、システムが落ちるという最悪のケースを避けるためにも、限界点を知っておくことは不可欠である。この限界点さえ知っておけば、事前に対策を練っておくことができる。

例えば、あるAPIは「100TPSの負荷がかかると平均レスポンス速度が5秒ほど遅くなり、要件を満たさない。」という限界事実が性能テストによって明らかになったとする。
現状、50TPSしか利用されないとすると、今の対応は必要はないが、将来変容した結果100TPS以上使われる瞬間があるのであれば、リソースの増加をするなど瞬時に対応できる。


## 負荷テストってなんだ

負荷テスト、性能テスト、パフォーマンステストなどネットには様々な言葉が散乱しているように見受けられる。

結論、明確な定義はないように思える。各書籍、各団体によって定義は微妙に異なる。
ここで重要なのは、チームとしてこのテストが「何を図るためのテストであるか」という点が共有されていることである。とはいえ、簡単にテスト名と内容をマッピングした。
- 負荷テスト
    - システムの限界値を見つけること。
- スケーラビリティテスト
    - システムの拡張が負荷に沿って可能かどうかを確認すること。
- 耐久性テスト
    - 長時間の負荷に対してのパフォーマンスを確認すること。
- 容量テスト（キャパシティテスト）
    - 容量に対しての拡張が負荷に沿って可能かどうかを確認すること。
- 応答性テスト（スパイクテスト）
    - 負荷の変化に対して、どれだけ反応できるかを確認すること。
- ボリュームテスト
    - 大量のデータに対するシステムの応答性を確認すること


上記を見ると、負荷テストは性能テストの一部でしかないことがわかる。
システムの限界値は「システムが処理結果を返す力」に依存していると考えると当たり前である。
ちなみに、性能テストとパフォーマンステストは同意味であると私は認識している。


## 性能テストで見る観点の具象

性能テストで見る観点で述べた、「量を返す力」「早く返す力」「力の源」はそれぞれ下記にマッピングされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255565/a13f8aaa-239e-d2de-16dc-455d47a91948.png)

それぞれの詳細な説明は割愛するが、簡単な意味は
- スループット：単位時間あたりの処理件数（Transaction Per Secondで表されることが多い)
- 応答時間：リクエストからレスポンスまでの時間 (msで表されることが多い）
- リソース： CPU利用率、ヒープ、DB CPU使用率 etc (%で表されることが多い)


である。


性能テストは、未来を想定しながらテストする必要も考慮すると想像以上に奥深い。経験を通じてもっと学んでいきたい。以上。


## 参考
- [限界スループットの確認方法](https://ptune.jp/tech/how-to-check-the-maximum-throughput/)
- [負荷テストの種類](http://mislead.jp/451.html)
- [負荷テストアプローチ別の目標設定と指標の考え方](https://www.oracle.com/jp/technical-resources/article/ats-tech/tech/useful-class-8.html)
【WordPress】テーマをインストールする

# 前回の記事

前回の記事では、WordPressの基本的な設定について確認しました。

https://qiita.com/raptony110/private/32a6e8b09cb23df3c8df

今回は、ビジュアル的にも楽しいテーマ選びです。テーマはいくつでもダウンロードすることができます。お気に入りのテーマ探しはとても楽しいです笑

僕のAdvent Calendarを読み終わった人が、
「へぇ簡単なんだなぁ〜　自分もWordPress使ってサイト作ってみようかな〜」って思うあなたがそこにいたのなら、、、、
読むだけで、頭の中WordPress化しちゃったんだよッ！！！！

https://qiita.com/advent-calendar/2022/wordpress-output

# テーマを変更する
テーマの変更は、「外観>テーマ」から行うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/d8197b39-13d3-ff92-2e95-e35444fc9c5d.png)

## テーマを検索する
まずはどんなテーマがあるか検索してみましょう。
左上にある新規追加ボタンを押します。そうすると、人気のテーマが表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/6a16ed09-3495-16c9-ad90-da3b05e41bcb.png)
すでにインストールされているテーマには、インストール済みの文字がついているのでわかりやすいですね。たくさんのテーマがあると何をインストールしたのかわからなくなってきます笑

左上のジャンルから検索しても良いですし、右上の検索ボックスにキーワード入れて検索するのも良いです。
本当にたくさんのおしゃれテーマがありますので、ご自身のイメージにあったものを選ぶと良いでしょう。
もちろん、テーマは後からでも変更することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/64707f82-509c-174e-dc7f-aa9a31ed0062.png)

サムネイルをクリックすると、詳細やプレビューを確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/270ce9a4-dcfd-4b02-89e0-999a9f40eafa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/4c17ceb3-b3e4-d044-930f-b8653afd3a6a.png)

## インストールする
良さそうなテーマを見つけたらインストールしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/8c9b9072-8916-410d-d650-17f61988f1e3.png)
インストールボタンを押します。
インストールしただけでは、サイトに適用されませんので安心してください。

## テーマを有効化する
サイトに適用するには、有効化をする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/199a19bf-cb54-3388-e838-103b4dba21b1.png)
テーマのインストールが完了すると、インストールボタンが有効化ボタンに変わりますので、その場で有効化しても良いですし、
テーマ一覧から有効化したいテーマを選んで有効化しても良いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/4b29de01-4f31-cdb4-e232-630eca1e0b56.png)

有効化したら、サイトを確認して、適用されているかを確認しましょう。

# おわりに
今回の記事で、テーマの探し方、インストール、有効化までをみてきました。ここでグッとイメージしていたサイトに近づいたのではないでしょうか。
僕は、いつもテーマ選びにかなり時間を使ってしまい日が暮れます。悩みすぎないことがおすすめです。テーマは、イメージと合っているかどうかくらいでOKです。

それでは、次回は、テーマをカスタマイズして、より自分のサイトを完成に近づけていきましょう。
envmap　背景のHDRI設定

「instantNeRFで遊ぶ Advent Calendar 2022」の7日目です。

今日はtestbedの背景にHDRI画像を配置する方法を見つけました。

:::note
業務外の個人的な検討活動です。
:::

##### nerf_loader.cu
transform.jsornに"envmap"を含めると良さそうです。
![7-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/222bc2fb-bf7c-8bb8-c1d0-d1c2a292e51a.png)

##### HDRI画像の準備
せっかくなのでexrファイルを生成しました。
Gimpで多重露光したHDRI画像をHDR合成します。

![7-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/c9037bf1-b5a6-beee-0163-77a8f998ae5a.png)

##### transform.json
transform.jsornに"envmap"を指定します。
パスはtransform.jsonがあるフォルダから相対指定のようです。
![7-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/be4e10f8-3f47-618a-11c9-3bb692a227f2.png)

##### 実行結果
背景にHDRI画像が取り込まれました。
![7-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/76b9a664-33cb-6429-05c0-47eca5a4ed8d.png)

##### 参考
https://ameblo.jp/dogame/entry-12708157764.html

http://tir.astro.utoledo.edu/jdsmith/code/exposure_blend.php
Rust で Fast API のように開発する！

Python の [FastAPI](https://fastapi.tiangolo.com) のように、Rust でもWebサーバー側で OpenAPI を生成させたいと考えていました。

[axum](https://github.com/tokio-rs/axum) の [Issue](https://github.com/tokio-rs/axum/issues/50) を覗いてみると、 [aide](https://crates.io/crates/aide) というクレートが有望そうです。
（`axum` 自身は現状ロードマップに取り込むつもりがないようです）

下記が調査で得られた成果物です。Rust の型変更をするだけで、フロントのAPIクライアントがリアルタイムで定義変更を検知します。  
（画像の解像度が悪いですが、左が TypeScript, 右が Rust のコードです）

![ezgif-1-04c614a4d0.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801258/6e3ae714-3a4f-8cdd-2104-a6a2a67957e7.gif)

1. Rust 側のスキーマ変更を cargo watch で監視
2. aide で OpenAPI を自動生成
3. OpenAPI から TypeScript の型を自動生成
4. フロントの axios クライアントが API の定義変更を自動検知

実際に触ってみた感想をまとめました。

## ドキュメントは少ない

crate の README.md は非常に少ないです。 [examples](https://github.com/tamasfe/aide/tree/master/examples/example-axum) を参考に調査する必要があります。

![スクリーンショット 2022-12-04 10.39.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801258/edfa3682-4a56-fbb8-f655-d5d1bbc05e24.png)



## どのように実装されているのか？

axum のルータを OpenAPI も扱える様に自前実装しています。

次の様な使い方です。

```rust
let mut api = aide::openapi::OpenApi::default();


let app = aide::axum::ApiRouter::new()
    .api_route(
        "/todo/:id",
        aide::axum::routing::get(get_todo)
        .delete(delete_todo),
    )
    .api_route(
        "/todo/:id/complete",
        aide::axum::routing::put(complete_todo)
    )
    .nest_api_service(
        "/docs",
        docs_routes()
    )
    .finish_api(&mut api)
    .layer(Extension(Arc::new(api)));
```

基本的には `axum::routing::*` を `aide::axum::routing::*` で置き換えれば良い様です。

OpenAPI も出力できる様になる理由を探るため、 `axum::routing::get` のトレイトを比較してみましょう。

```rust
// axum の場合
pub fn get<H, T>(self, handler: H) -> Self
where
    H: Handler<T, S, B>,
    T: 'static,
    S: Send + Sync + 'static,

// aide の場合
pub fn get<H, I, O, T>(self, handler: H) -> Self
where
    H: Handler<T, S, B> + OperationHandler<I, O>,
    I: OperationInput,
    O: OperationOutput,
    B: Send + 'static,
    T: 'static,
```

`aide` はトレイトが増えていますね。 `OperationHandler` というものが増え、このトレイトは `axum` 本家の Router では知ることのできない `OperationInput` と `OperationOutput` の情報を追加で持っています。


つまり、 `aide` の大まかなコンセプトは下記の様になっています。

- 通常の API サーバとして動作させるとき： `Handler<T, S, B>` を用いる（`axum` と同様）
- OpenAPI を生成したいとき： `OperationHandler<I, O>` を用いる

なるほど！

## aide と FastAPI との比較

両方を利用してみたときの感想です。

### aide のメリット

- エラーレスポンスも型から自動生成できる様になる（例外ではなく Result でエラーを扱うため）

### aide のデメリット
- API のスキーマだけを変更した場合、handler 内のロジックが壊れるので、 `todo!` を仕込む必要がある
- トレイトが複雑なのでデバックに時間がかかる
- ビルドが遅い

### Fast API のメリット
- API のスキーマだけを変更するだけで OpenAPI が出力可能（自動テストは壊れるが、後で直せば良い）
- ドキュメントが豊富

### Fast API のデメリット
- エラーレスポンスを自動で生成できない
- OpenAPI の出力結果は間違っている部分がある（Option の扱いとか。 [Pydantic V2](https://pydantic-docs.helpmanual.io/blog/pydantic-v2/) に期待）

## 感想

動かせる様になるまで少し時間がかかりましたが、上手く機能しています。
今後の成長に期待です！
NTT：譲渡不可の NFT の紹介

NFT はもうよく聞いていると思いますが、今年からはおそらく「転送不可な NFT」というお話も聞いたことがあると思います。
この辺の試みの１つ NTT についてちょっと紹介したいと思います。

## NTT：転送不可な NFT 
NTT は、もちろんあの企業のことではありません。「Non-Transferable Non-Fungible Token」もしくは「Non-tradable Token」の略語であり、「転送不可のNFT」のことです。
NFT または　ERC 20 などのトークン系は、取引をメインの目的としていますが、取引ではなく、バッジまたは卒業証書・オンライントレーニング修了証のようなものでしたら、そもそも取引というか、転送の必要もないので、このような提案が上がられました

### [ERC 1238 github issues](https://github.com/ethereum/EIPs/issues/1238)

> Non-transferable tokens
Simple Summary
A badge is a token that once assigned it cannot be transferred. Badges can be accumulated through time and put at stake. Simply speaking, badges are statements about a public key, they can be quantitative (e.g. reputation, experience) or qualitative (badges, titles).

- 2018 年 7 月提案され、バッチにフォーカスしている内容になります
- 正式な EIP プロセスにのってないので、実際どの段階まで議論できたかは分かりませんが、 Pull Request 自体は既にクローズされています

### [EIP-4671: Non-Tradable Tokens Standard](https://eips.ethereum.org/EIPS/eip-4671)
> A standard interface for non-tradable tokens, aka badges or souldbound NFTs.

- 2022 年 1 月に「取引不可トークン」として提案され、現時点ではステータスがまだ Draft です。
- 「大学の卒業証書、オンライントレーニングの修了証、政府発行の書類（国民ID、運転免許証、ビザ、結婚式など）、ラベルなど、本来は個人所有のもの（物質・非物質）を表します。」ように NTT を定義しています。
- 上記の目的であるため、設計としては
    - １つのコントラクトで単一の書類を管理することになります。
    - 削除・転送はできないが、管理ロールは、書類を発行・無効にすることができます

## 他の実装方法
できるだけ ERC721 / ERC1155 との互換性を守りたいため、既存の規約を拡張するやり方もあります。
`OpenZeppelin Contracts v3.0.0` から新しい機能として [openzeppelin hooks](https://docs.openzeppelin.com/contracts/3.x/extending-contracts#using-hooks) 仕組みを導入されています。
転送系の処理（_mint / _transfer / _burn) に全部処理の最初にこの hook を呼び出しているため、ここで拒否すれば「転送不可」の意図は実現できます。

```solidity
function _beforeTokenTransfer(
    address from,
    address to,
    uint256 tokenId
) internal pure override {
    // mint の場合のみは許可する
    require(from == address(0));
    ...
}
```

- _mint：https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol#L286-L291
- _transfer：https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol#L355-L363
- _burn：https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol#L321-L324

## まとめ
バッチや政府発行の書類など、取引目的ではない場合、転送不可 NTT を使いたいが、どう実装すべきかは迷いますね。
似ている概念として SBT もあるので、また紹介します。
AutoGymデータサイエンスコースでの3か月で学習した内容

**受講したきっかけと受講前の私のレベル**
私は現在文系の大学3年生であり、2022年の秋学期から休学している。統計学の授業をとったのをきっかけにデータサイエンスに興味を持ち、データサイエンティストとして就職することを目標に休学を決断した。プログラミング経験は全くなく、8月はprogateなどを活用してpythonを最も基本の部分から学習を開始した。この時同時に統計検定二級の学習も並行していた。

その後pythonや統計学の基礎的な学習は一通りしたものの、学習計画や学習の中身について質問できる環境が欲しいと考え8月中旬あたりからスクールを探した。AutoGymに決めた理由としてはチャットでの質問対応だけでなく週一回の面談があることでメンターと週単位での計画について相談できること、教材としてKaggleに取り組めること、相対的に安価であったことがあげられる。

**実際の学習内容**　
**9月**
三か月のうちの最初の一か月はLaibraというプログラミング学習サイトを利用してnumpyやpandasからscickit-learnやkerasなどの機械学習ライブラリについて基礎を学んだ。

**10月**
Laibraが終わると次に前処理やEDAにおいて大事となってくる処理を『データサイエンス100本ノック　構造化データ加工編ガイドブック』を使って学んだ。このあとデータサイエンスコンペに取り組むうえでこの本にあったことの重要性が分かってきました。またシンプルに多くのコードに触れたことで基本的なプログラミングに対する理解も少しずつできたのではないかと感じている。
例：054: 顧客データデータフレーム（df_customer）の住所（address）は、埼玉県、千葉県、東京都、神奈川県のいずれかとなっている。都道府県毎にコード値を作成し、顧客ID、住所とともに抽出せよ。値は埼玉県を11、千葉県を12、東京都を13、神奈川県を14とすること。結果は10件表示させれば良い。
```python:100本ノック
df_customer_tmp = df_customer[['customer_id', 'address']].copy()
df_customer_tmp['prefecture_cd'] = df_customer['address'].str[0:3].map({'埼玉県':'11',
                                                                       '千葉県':'12',
                                                                        '東京都':'13',
                                                                        '神奈川':'14'})
df_customer_tmp.head(10)
```

**11月**
三か月目はデータサイエンスコンペに取り組んだ。まずKaggleのチュートリアルであるTitanicやHouse Pricesを解答を見ながら取り組むことで流れを把握した。最初に基本的なフォーマットを知れたことでそのあとSignateのコンペに自力で取り組むときにもスムーズに進められた。
自力で取り組む際は『Kaggleで勝つ　データ分析の技術』を主に使用することでそれなりに精度も上げることができた。
この段階では安易に質問することを避けてできる限り自分で調べることを大切にした。最初は全くわからないエラーが出ても案外何とかなることを知った。
以下一部抜粋
```python:Signate練習問題
lgb_params = {"objective":"regression", 
              "metric":"mse"}
cat_features = {"origin", "car name"}
evaluation_results = {}
scores = []

kf = KFold(n_splits = 5)
for tr_index, va_index in kf.split(train_x):
  tr_x, va_x = train_x.iloc[tr_index], train_x.iloc[va_index]
  tr_y, va_y = train_y.iloc[tr_index], train_y.iloc[va_index]
  
  lgb_train = lgb.Dataset(tr_x, tr_y)
  lgb_eval = lgb.Dataset(va_x, va_y)
  
  model = lgb.train(lgb_params, num_boost_round=500,
                    categorical_feature=cat_features,
                    verbose_eval=20, 
                    evals_result=evaluation_results,
                    early_stopping_rounds=10,
                    train_set=lgb_train,
                    valid_sets=[lgb_train, lgb_eval], valid_names=["Train", "Valid"])
```
**講座の感想**
やはり週一回の面談は自分に合っていたと思う。モチベーションを保つことができたり、チャットでわざわざ質問しないような細かいこともさらっと聞けたのが良かった。内容面は自分のペースでサクサク進められる教材だったので独学しているのと感覚的には変わらず、プラスして質問がしやすい環境だったのでモチベーションの高い生徒にとっては非常に良いと感じた。

**今後の展望**
休学を決めた段階から長期インターンをする予定だったので、可能であればデータサイエンスに関するインターンをすることで実務経験を得たいと考えている。ただ最近はもし厳しいようだったら興味のある業界に関するドメイン知識を得るためにデータサイエンスと関係ない職種でも悪くはないかなと考え始めた。その場合はKaggleに集中することでメダル獲得まで挑戦したい。
Unity Catalog のカタログIsolation機能を試す


# はじめに

Unity Catalogでカタログまたはスキーマレベルで保存するストレージ領域を選択できる[カタログIsolation機能](https://docs.databricks.com/release-notes/product/2022/november.html#specify-a-cloud-storage-location-for-unity-catalog-managed-tables-at-the-catalog-and-schema-levels)がリリースされました。どんな機能でどのように設定するのか見てみたいと思います。


# 何がうれしいのか？
従来はUnity CatalogのManaged Tableとして利用する場合、DeltaLakeの保存先はUnity Catalogセットアップ時に作成するメタストアのストレージのみでした。そのため複数のワークスペースでUnity Catalogを共有してもストレージは同じになってしまうため、管理や課金を分割出来ないという問題がありました。（従来は外部テーブルしか利用できなかった）

今回の機能によって、カタログやスキーマ単位でストレージロケーションを分けられるため上記のような問題が解消されます。これは管理者からするとかなり嬉しい機能なのです。

# 設定方法

マニュアルは[こちら](https://docs.databricks.com/data-governance/unity-catalog/create-catalogs.html#create-catalog&language-Data%C2%A0Explorer)（AWS, Azureで利用可能です）

### 1. ストレージロケーションの作成

まずは保存先となるストレージを作成し、外部ロケーションとしてUnity Catalogに登録する必要があります。外部ロケーションの作成＆登録方法はこちらをご覧ください。

- [Unity Catalog 外部ロケーションの登録 (AWS)](https://qiita.com/maroon-db/items/6f3dee8a8ebd863989a6)
- [Unity Catalog 外部ロケーションの登録 (Azure)](https://qiita.com/maroon-db/items/ae65a6154b633fec3e33)

今回AWS上で作成したもの
・　S3 bucket : db-managed-bucket2
・　IAM Role: uc-managed-catalog2

Databricks上で設定したもの
・ ストレージ資格：　　
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/defcf514-d61c-cd49-f2b2-2ac799ced600.png' width=500>

・　外部ロケーション
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/ba8c8ef7-e787-43b5-58ee-1a710a704709.png' width=500>

### 2. カタログ作成

「データエクスプローラー」画面に移動し、右上の「カタログを作成」ボタンをクリックし、新規にカタログを作成します。その際に、Managed locationというオプション欄に先ほど作成したS3Bucketのパスを登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/6b33c2f5-27a0-71c1-546c-5926901de0f3.png)

スキーマ作成時も同様の方法でストレージを選択できます。

# 確認

まずは詳細タブでカタログ情報を確認してみます。ご覧のとおりストレージロケーションが指定したバケットへのパスになっております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/397a3bb9-c1e1-7574-aff8-8380093f2451.png)

次にスキーマやテーブルを作成してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/b43af708-6348-a8f8-d0a6-3dd5c8bea40d.png)

テーブル詳細をチェックしてみると、Managed Tableとして別のS3バケット上に保存されておりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/a3433bbc-cd2e-aba3-b949-d7d9d98b228d.png)

AWSコンソールからS3バケットをチェックしてみるとちゃんとDeltaLakeができておりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/dd75f8ac-fb6e-7816-c825-ce8d5a53950e.png)


# コードベースでロケーションするには？

マニュアルにはUIベースでの指定方法のみ記載がありましたが、SQLコマンドでCatalogやスキーマ作成時に、外部ストレージを指定出来るか確認してみました。

今回は、db_catalog というカタログをmetastore上に作成し、新規スキーマを別S3バケット上に指定して作成してみます。

```sql:
create schema if not exists db_catalog.isolation_test location 's3://db-managed-bucket2'
```

テーブルも以下のように作成します。

```sql:
create table if not exists db_catalog.isolation_test.test1 AS
select
  *
from
  samples.nyctaxi.trips
LIMIT
  1000
```

テーブル詳細を確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206424/397f7445-7933-4ea0-51ee-edf0704ad8fa.png)

コードベースでもロケーション指定することが出来ました。



# その他

UnityCatalogのセットアップや機能については[こちら](https://qiita.com/maroon-db/items/57cee03cef202c839b94)をご覧ください。
Visual Studio コマンドラインでアセンブルしてみた

# 環境

Windows 11 Pro (64bit)
Visual Studio Community 2022

# バッチファイル

```dev32.bat
@echo off
path %path%;D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.34.31933\bin\Hostx64\x86
set lib=%lib%;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x86
cmd
```

# アセンブリ ソース

```hello.asm
comment *
ml /c hello.asm
link /subsystem:windows hello
*
includelib kernel32
includelib user32

.model flat

NULL equ 0
MB_OK equ 0

ExitProcess proto stdcall :dword
MessageBoxA proto stdcall :dword,:dword,:dword,:dword

.const
caption	db	'hello',0
text	db	'hello, world',0

.code
start proc c
	invoke	MessageBoxA, NULL, addr text, addr caption, MB_OK
	invoke	ExitProcess, 0
start endp

end start
```

# 実行例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257554/c50221d6-a975-6f13-88fc-4a7c79442e5b.png)
Visual Studio コマンドラインでコンパイルしてみた

# 環境

Windows 11 Pro (64bit)
Visual Studio Community 2022

# バッチファイル

```dev32crt.bat
@echo off
path %path%;D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.34.31933\bin\Hostx64\x86
set include=%include%;D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.34.31933\include
set include=%include%;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt
set lib=%lib%;D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.34.31933\lib\x86
set lib=%lib%;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x86
set lib=%lib%;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x86
cmd
```

# Cソース

``` hello.c
/*
cl /MD hello.c
*/
#include <stdio.h>

int main()
{
	printf("hello, world\n");
}
```

# 実行例

```
D:\Projects\msvc>cl /MD hello.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.34.31935 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

hello.c
Microsoft (R) Incremental Linker Version 14.34.31935.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:hello.exe
hello.obj

D:\Projects\msvc>hello
hello, world

D:\Projects\msvc>
```
Laravel Sailでphp.iniの変更の仕方が分からなかったので調べてみた

Laravel Sailでphp.iniの内容を変えたくてphp.iniを変更後、コンテナを再起動しても反映されず少し戸惑いました。
調べてみたらやり方は公式ページに載っていて、通常とは違った方法でやらないとならないことが分かりました。

公式ページを見れば一目瞭然ですが、一応説明だけ書いておきます。

公式ドキュメント：
https://laravel.com/docs/9.x/sail#sail-customization

まず以下のコマンドを実行。
```
sail artisan sail:publish
```

そうするとプロジェクトルート直下にdockerフォルダが作成され、PHPのバージョンごとのフォルダ以下に4つのファイルが書き出されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930440/c444edc8-aaa0-f5c3-2ced-49826da32e82.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/930440/9777c48d-3c01-c1fa-489b-7e4fd00bff4b.png)

対象のPHPバージョン以下のフォルダ内のファイルを書き換えればOKです。
今回はphp.iniを書き換えたいのでこれを書き換えてsail build --no-cacheで完了！

関係ないけど、Sailのパッケージ内にはviさえも入ってないのがびっくり。こんな感じでホストから編集→ビルドみたいな感じで使うことを想定しているから必要ないという前提なのだろうか？
でもやっぱりviくらいは入ってないといざというとき不便なのでDockerfileに追記しておきました。
【WordPress】WordPressの基本的な設定

# 前回の記事

前回の記事では、WordPressの管理画面メニューについてざっくりと確認しました。

https://qiita.com/raptony110/private/d980f2739f8752772c44

今回は、それぞれ実際に設定してみながら、設定方法を確認していきましょう。今回は、まず最初に設定しておきたい項目です。

僕のAdvent Calendarを読み終わった人が、
「へぇ簡単なんだなぁ〜　自分もWordPress使ってサイト作ってみようかな〜」って思うあなたがそこにいたのなら、、、、
読むだけで、頭の中WordPress化しちゃったんだよッ！！！！

https://qiita.com/advent-calendar/2022/wordpress-output

# Webサイトを検索エンジンの検索結果に表示させないようにする
まだサイトが未完成の状態で、検索エンジンの検索結果に表示させないようにしたい場合などに利用します。
## 設定>表示設定>検索エンジンでの表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/fb96f837-550f-c44f-2a5b-d9828e8bbd77.png)
この項目にチェックを入れた状態で保存すると、検索エンジンの検索結果に、作成中のWebサイトが表示されなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/e8b849c5-9213-c9d4-e2bc-c42205ae29ca.png)

# パーマリンクのフォーマットを設定する
## 設定>パーマリンク>パーマリンク構造
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/c3e77cc4-89ba-33a0-f319-2434de483093.png)
様々な構造を定義するタグを利用することで、様々なパーマリンクを設定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/368ffcc8-0bb3-8100-24c2-427ffb7ce4e0.png)
今回はデフォルト設定の「日付と投稿名」の組み合わせで設定していきます。

# コメントの許可設定をする
## 設定>ディスカッション>デフォルトの投稿設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/dbfe057a-10e5-8ba0-8477-5fa4986fb2c0.png)
コメントの禁止にするには、新しい投稿へのコメントを許可のチェックボックスを外します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/ae3c0a56-e178-0580-219a-1911f2617c73.png)
記事を投稿する際に、記事ごとにコメントを許可するかを設定できますが、記事ごとの設定の方が優先されます。

# おわりに
今回の記事で、パーマリンクの構造を変更して、コメント許可設定を変更して、検索エンジンにインデックスされないように設定しました。特に、検索エンジンにインデックスされないようにする設定は、個人的にはMustだと思っています。作成中のサイトがむやみに公開されてしまうことを避けるためにも、完成に近くなった時に公開に切り替えるべきです。

それでは、次回は、テーマの変更を見ていきましょう！
paiza.ioでelixir その115

# 概要
paiza.ioでelixirやってみた。
Enum.reduce使ってみた。


# サンプルコード

```
                c = 140
                l = 4
                b = "fizz"
		        s = String.split(b, "", trim: true)
		        #IO.inspect(s)
			    str = Enum.reduce(s, ["", c], fn x, y ->
			        pc = Enum.at(y, 1)
			        str = Enum.at(y, 0) <> 
			            "            #{pc}:\n" <>
			            "            begin\n" <>
                        "                out <= \"#{x}\";\n" <>
                        "                pc <= #{pc + 1};\n" <>
                        "            end\n"
                    pc = pc + 1
                    [str, pc]
                    
			    end)
			    str = Enum.at(str, 0) <>
    			    "            #{c + l}:\n" <>
		            "            begin\n" <>
                    "                out <= \" \";\n" <>
                    "                pc <= #{c + 10};\n" <>
                    "            end\n"
			    IO.puts str
			    
			    
			    
			    
```

# 実行結果

```
            140:
            begin
                out <= "f";
                pc <= 141;
            end
            141:
            begin
                out <= "i";
                pc <= 142;
            end
            142:
            begin
                out <= "z";
                pc <= 143;
            end
            143:
            begin
                out <= "z";
                pc <= 144;
            end
            144:
            begin
                out <= " ";
                pc <= 150;
            end

```

# 成果物

https://paiza.io/projects/NMoeqnjGhnwCCKpEfbpG-A?language=elixir


以上。
Charites で国土地理院最適化ベクトルタイル

## はじめに
国土地理院は 2022-09 に[国土地理院最適化ベクトルタイル](https://github.com/gsi-cyberjapan/optimal_bvmap)をリリースしています。このアップデートの内容については、[地理院地図Vector の従来版と最適化版の比較メモ](https://qiita.com/mg_kudo/items/99c1d2a2b12bd9c8789a)を出しておられる方がいます。素晴らしいと思います。

## 最適化ベクトルタイルのスタイルの Charites YAML
国土地理院最適化ベクトルタイルのスタイルを [Charites](https://github.com/unvt/charites) 用 YAML 変換したものを次のリポジトリに置いています。

https://github.com/optgeo/optbv-charites

`style.yml` を見ていただけると、どういった style layer で構成されているか見ていただきやすくなると思います。

https://github.com/optgeo/optbv-charites/blob/main/style.yml

## 最適化ベクトルタイルのスタイル国際化版
国連オープンGISイニシアティブ [DWG7 on Smart Maps](https://github.com/unopengis/7)　の第4目標（公平なスマートキャンパスソリューション）では、インド Nascent の Santosh のリードで日本の大学のキャンパスを当初対象としたソリューションの構築を検討しています。

そのソリューションの背景地図に国土地理院最適化ベクトルタイルを使っていただく目的から、Charites YAML で組み直したスタイルをさらに国際化したスタイルを作っています。

https://github.com/optgeo/optbv-intl

この国際化バージョンに加えた新機軸は次の2点です。

- [style.yml](https://github.com/optgeo/optbv-intl/blob/main/style.yml) の layer 名から日本語を外してアルファベット表記にしている。リポジトリから[日本語ファイル名のファイルを消す](https://github.com/optgeo/optbv-intl/tree/main/layers)。
- 多言語化地名ベクトルタイルの Mapbox vector tiles 版である ise を組み込む。 

ise も DWG7 on Smart Maps 活動の一部であり、レポジトリは次の場所にあります。

https://github.com/optgeo/ise
AAudioの実力を測る

　Googleが開示しているAndroid開発ガイドによれば、AAudioの章で、「GitHubで入手可能なオープンソースoboeライブラリの使用」を推奨？していたので、oboeを下敷きにして音声アプリを作った。その結果、以前に使用したことのある「AudioRecord/AudioTrack」というAPIと比較して格段にレイテンシが改善されていることを確認した。下図に示す通り、マイク入力→イヤホン出力までの時間を計測すると、一桁改善していることがわかる。
　当方のアプリは、音声をトランペットの音に変換するものであり、演奏時の応答性の観点では、「まあメロディ系なら及第点はあげられるかな」という感触である。しかし、ドラムやピアノなどのリズムセクション系の楽音は、数msecオーダーに改善する必要があるだろう。
![AAudioの実力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659855/21183a0e-bdb0-a280-a783-5a43c7653fcd.png)
[shell]ループ文でシングルクォートの中にダブルクォートやシングルクォートがネストになっている文字列に変数を埋め込む方法

## やりたいこと

以下のループ文でシングルクォートの中にダブルクォートやシングルクォートがネストになっている文字列の`$i`を正しく動くようにしたい

```:test.sh（失敗）
for ((i=0 ; $i < 3 ; i++))
do
echo 'シングルクォートのネストのテスト。\'\""${i}"\"\''
done
```

このままだと１つ目の`\'`のエスケープがなかったこと（文字列`\`と`'`扱い）にされて、以下のエラーが発生する。
```:エラー文
test.sh: line 3: unexpected EOF while looking for matching `''
test.sh: line 5: syntax error: unexpected end of file
```

## 解決方法
シングルクオートを切り離して文字列結合する。（`'`を一つの文字列とみなす）

```:test.sh（成功）
for ((i=0 ; $i < 3 ; i++))
do

# 以下のように書くことで成功します。ちなみにエスケープをしないとシングルクォートが通常の働きをしてしまうので注意です。
TMPVAR=シングルクォートのネストのテスト。\'\""${i}"\"\'
VAR=\'${TMPVAR}\' 

echo $VAR
done
```

```:出力結果
'シングルクォートのネストのテスト。'"0"''
'シングルクォートのネストのテスト。'"1"''
'シングルクォートのネストのテスト。'"2"''
```


## 余談
筆者は上記はcurlコマンドをshellで作るときに使用しました。

上記の経緯はthirdパーティのnodeのapiがバグのような挙動を起こしていたためcurlによるapiに選択し直したというものでした。
そしてループ文を使ってコマンドを準備するときに苦労した部分が今回の内容だったので備忘録として残しました。
prettify-symbols-mode のススメ


この記事は [Emacs Advent Calendar 2022](https://qiita.com/advent-calendar/2022/emacs) 4日目の記事です。

# はじめに

org-mode を使い込んでくると、プロパティドロアですとか、ソースブロックですとか、通常の文章の中に制御コード的なものが入り込んできます。プロパティドロアですと、`:PROPERTIES:`という文字列が表示され、折りたたまれた一文の中にたくさんのメタデータが保存されます。

■ 折りたたんだ状態
![Screenshot 2022-12-04 at 7.44.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12232/d87fa5e6-c5c8-a402-5a4b-93123fab178f.png)

■ 展開した状態
![Screenshot 2022-12-04 at 7.44.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12232/5a3d52e6-c488-e9e9-477e-183867df5612.png)

もし、これらの制御コードがうざったらしいな...と思い始めたら、`prettify-symbols-mode`の出番です。

# prettify-symbols-mode を使って制御コードをシンプルに

`prettify-symbols-mode` は、`prog-mode.el`に定義されているマイナーモードで、パッケージの追加無しで使えます。例えば、こんな感じです。

■ 制御コードを短縮表示
![Screenshot 2022-12-04 at 7.48.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12232/28963989-b9f8-55c4-f59c-4c5a67343709.png)

ご覧の通り、`:PROPERTIES:`が `»`に置き換わって、目立たなくなっているのがわかると思います。上の例ではさらに、`#+begin_src`を`▨`に置き換えています。

# 設定例

`prettify-symbols-modes`はビルトインなので、例えば下記のコードを`init.el`に入れておけば、すぐに使うことができます。置き換えるテキストは、ユニコードから頑張って探すのが良いと思います。もし、`all-the-icons.el`とか`icons-in-terminal.el`を使っているなら、それらのフォントを使って置き換えることもできます。

```emacs-lisp
(add-hook 'org-mode-hook 'prettify-symbols-mode)
(setq-default prettify-symbols-alist '((":PROPERTIES:" . "»")
                                       (":LOGBOOK:" . "›")
                                       (":END:" . "›")
                                       ("#+begin_src" . "▨")
                                       ("#+end_src" . "▨")
                                       ("#+RESULTS:" . "▨")
                                       ("[ ]" .  "☐")
                                       ("[X]" . "☑" )
                                       ("[-]" . "☒" )))
```

配色は別途、`org-src-block-faces`, `org-block-begin-line`, `org-block-end-line` をカスタマイズすることで変更できます。このあたりは、[10.27. [org-babel] ソースブロックの配色](https://takaxp.github.io/init.html#org556eb376) を御覧ください。

チェックボックスを変えることもできて（下の例では`icons-in-terminal.el`のフォントを使っています）、わりと気に入っています。

![Screen Shot 2022-12-04 at 8.52.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12232/a8121216-a108-c3ac-c815-4fab5c9f72aa.png)

# 留意点

バッファの中に、`"` のような文字がペアではなく一つだけ存在すると、それ以降に登場する`prettify-symbols-alist`で指定した文字列が正しく置換されないので注意してください。

# まとめ

今回は、org バッファの見た目をスッキリさせてくれるビルトインの`prettify-symbols-mode`を紹介しました。Enjoy Emacs!!
MATLAB で Digital Lossy VST プラグインを作る ～ 聴覚心理特性とは？ ～ 非同期バッファで MDCT（最終予告編）

[<B>MATLAB/Simulink Advent Calendar 2022</B>](https://qiita.com/advent-calendar/2022/matlab) に参加予定です。
<br>
キリがないのでこれで完成！
<br>

・使用ツール
<dt>　MATLAB</dt>
－Audio Toolbox
<br>
<br>

・デモ動画
<B>[Digital Lossy VST プラグイン]</B><iframe width="703" height="268" src="https://www.youtube.com/embed/eQLXjcwAZX4" title="DLossy7 - Digital Lossy Plugin" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<br>
<br>
<H4>[<B>note</B>]<a href="https://note.com/leftbank/"</a> にUpします。</H4>