OmniAICreator/Qiita-1.07M huggingface dataset:
転職して年収100万円上がった! 俺の転職活動のやり方

# 自己紹介
齢29にして転職回数3回。転職して年収が400から500に上がった。

# 決めていた最低条件

* 現職より年収50万円以上は上がること
転職先でもしミスマッチが起きても、年収が上がっていれば、後悔は少ないと思ったので。

# 使用する求人サイトは1つだけにした
そこにしか掲載していない求人があるから、使いこなせるなら全求人サイトに登録したほうが良いとは思います。

しかし、サービスごとに
* 履歴書・職務経歴書の登録・編集
* 求人オファーの確認・返信
* 既に応募済みの企業かどうか確認
などをする必要があり、すごく負担がかかります。
私は1年くらいかけて転職活動をする覚悟だったので、思い切って求人サイトを1つに絞りました。
おかげで無理なく転職活動を続けることが出来ました。

# 転職エージェントは使わなかった

私は今まで転職エージェントを使用していましたが、今回は使わなかったです。

■理由
* 長期的に転職活動したかったから
転職エージェントは、自分が担当している人をなるべく時間をかけずにどこかの会社に入社してほしいと思っているはず。
今回は転職活動を1年ぐらいかけてするつもりだったので、通常の転職エージェントは相手してくれないと思った。
* 落ちた会社のフィードバックはあまり意味がない
転職エージェントのメリットでよく聞くのが自分が採用で落とされた理由が知れることです。
あくまでその企業の面接官の主観でしかなく、「コミュニケーションが足りない」とか、「この希望年収とスキルが釣り合わない」とかは言われなくても大体分かることだし、自分自身、常に改善を心がけていくべきだと思う。  
落ちた理由のフィードバックを得たからといってこれからの行動は変わらないし、変えるべきではないと思う。

# Web面接はカンペ資料を提示した
面接で話すことをあらかじめ[Notion](https://www.notion.so/ja-jp/)でまとめておいて、Web面接時にその共有リンクをビデオ通話のチャット欄で共有して見てもらいました。
「苦労したこと」「自分の強み」とか前もって考えておかないと面接時に咄嗟に回答出来ないし、その都度考えてると会社ごとに違う答えを言ってるときもあったので、前もって考えておいて、話せるようにしたほうが良いかなと思ってました。
暗記するのは面倒で嫌だったので、今回はカンペを堂々と用意して公開することにしました。
賛否両論ありそうかもです。

# 転職で利用した資料はクラウドで管理しておく
* 履歴書
* 職務経歴書
* 面接時のメモ
今後も使う可能性があるので、クラウドに保存しておくと良いです。
また1から作成するとなるとかなりしんどいので。

当初はgitで管理しようとしたけど、面倒だったので辞めました。Excelは素直に差分見れないし、そもそも差分とか見ることないし、最新のだけあれば良いので。

# さいごにアドバイス
慣れていない人は落選するたびに落ち込み、希望年収を下げようか考えてしまうが、1年経ってもダメそうなら下げれば良い。
新しい求人は日々出てくるから焦らずにのんびり転職活動をしよう。
日々のインプット・アウトプットの実践方法/心構え

# この記事は？

[ことみん Advent Calendar 2022](https://qiita.com/advent-calendar/2022/kotomin_m) 1日目の記事です！

新卒2年目エンジニアの私が、日々やっているインプット・アウトプットの方法を書いてみます。
こんな人もいるんだなと誰か（特に1,2年目のエンジニア）の参考になれば嬉しいです。

# インプットの方法

## 日常生活のインプット

普段はTwitterと会社のSlackから情報収集をしています。
毎日Twitterにはたくさんの情報が流れてきますし、会社のSlackにはエンジニアが良い記事を見つけたら共有してくれたりと知見が転がっています。

こういった多くの情報が流れてくるところで、インプットの質を高めるために「必ず読む記事」の基準を2つ決めてその情報には目を通すようにしています。

* 自分が「良さそう・知りたい」と思った記事
* 自分の知っている誰かがオススメしている記事

よく、やりがちなのが「Twitterに流れてきたこの記事良さそうだけど今はいいや、後で読もう」となってそのまま読まないというパターンです。
「必ず読む記事」の基準を決めて記事を読むようにしたことで、日々インプットする量と質も良くなってきた実感があります。

そして、これは本を読むのが苦手な私に向いているやり方でした。
本だとでハードルが高いのですが、記事なら「ちょっと頑張ったら読めそう」という気持ちで読むことが出来ています。
1記事にかかる時間も5分以内なのでTwitterを見るついでに続けるということが出来ています。

## イベントからのインプット

会社で開催しているLT会や、connpassに載っているイベント、様々な技術系カンファレンスなどに積極的に参加しています。
こういったイベントに参加することで、他の人の発表内容や発表の方法をインプットしています。

イベントに参加することで得られるインプットの質が高いことはもちろん、参加することが好きなので楽しくやっています。

# アウトプットのやり方

## 日常生活のアウトプット

### Twitterの投稿

私は仕事中に調べて得た知見などをTwitterにメモ程度に投稿することが多いです。
Gitコマンドのオプションで初めて知ったもの、程度の粒度感でたまに投稿するようにしています。

気軽に社外にアウトプット出来る手段として有効だと感じています。

### Slackの分報チャンネル

アウトプットする数で一番多いのは会社のSlackの自分の分報チャンネルです。
※分報チャンネルについての説明は省略

日々仕事中に調べたことや悩んだことを投稿しています。
投稿するときの心構えとして意識していることは2つです。

#### ①基本的に自分のために投稿する

自分の分報チャンネルとはいえ他の人も参加しているので「こんなこと投稿してもいいのかな」と遠慮してしまうかもしれません。
ですが、自分が悩んだことは他の人も悩むかもしれないですし、自分のメモ代わりに投稿しています。

悩んでいるところももしかしたら、知っている人が教えてくれるかもしれません。

#### ②自分がこういうことをしているというアピールを周りにする

リモートワークだと、自分が今何をやっているのかが他の人は意外と見えていません。
タスク単位では知っているかもしれませんが、今実際にどういう箇所の実装をしているだとか、細かいところはほとんど見えていないです。

見えていないところで進捗が悪くなっていたりするとチームにとって良くないので、「今自分はここに困っているぞ！」「こういうことを調べているぞ！」というアピールをすることが大切です。

## イベントへのアウトプット

社外のイベントでも発表することはありますが、一番多いのは社内のLT会で発表することです。
社内外問わず、イベントで発表するように意識しています。

発表する前にやっていることは2つです。

### ①発表することを決意表明して周りに言う

「発表したい気持ちが少しある、でも発表出来るか迷っている」みたいな人は、この方法が一番良いです。
周りに言うことでやらなきゃいけないという気持ちになるので、当日までに準備をして発表をする環境を自分から作り出すことが出来ます。
（このアドベントカレンダーの記事も自分が「やるぞ」と周りに決意表明をして書いています）

### ②発表出来そうなネタを日頃から探しておく

「発表する話が思いつかない」「何を発表したらいいのか分からない」ということになるので、日常生活のアウトプットをしながら「これは発表できそうだ」という話を探す癖をつけるよう意識しています。
これは今も出来てなかったりして難しいですが、出来るようになるといつでも発表出来るだろうなと思って頑張っています。

# おわりに

読んでいただきありがとうございました！誰かの参考になれば嬉しいです。
Qiitaデイリーに載ってしまった…ので、Qiitaの非公開記事と公開記事とQiitaデイリーの仕様分析してみた

正直、デイリー入りなんて全く考えてなかったんですが、入ったからには対策していきます。
入らない対策ではなく「入れるんだったらやった方がいいよね」というポジティブな対策です。

[Qiitaデイリーに載った記事](https://qiita.com/nomurasan/items/885444cec8eefe37ac07)

投稿日でサーチしてるので、過去に投稿したけど使っていない（[下書き記事](https://qiita.com/drafts)に出てくるから下書きだと思って放置してたら、実は公開してしまっていた）記事を再利用して作っていたんですが、これすごくもったいない！という事に気付きました。
これに気付いた当初は、アドベントカレンダーにかこつけて下書きを整理してしまうのも目的の一つでした。

が、デイリーに乗ると閲覧者が増えます。
更新日の本日の記事がまさに記事の書き方・考え方について言及している記事なので、詳細はそちらをご覧いただきたいんですが、私のアドカレ記事のみならず、Qiitaに投稿しているものは見せる事を目的としたものではありませんでした。
なので、閲覧者とか全く気にしていなかったんですが、デイリーに載る（閲覧者が増える）可能性があるなら別です。
記事の内容というか書き方として見せる目的にはしていませんが、閲覧者が増えるに越したことはないです。そのための施策は講じていくつもりです。

とはいえ、下書き一覧で表示される記事はさっさと処分していきたいのも本音です。
これらのせいで、本当の意味で考えている下書きがどれか分からなくなってしまっています。
まずはこれを何とかしたいんですよね。
→（追記：後述）

なので、今後方針は以下のようにやっていきます。

1. アドカレの記事は新規投稿する
1. アドカレに乗せない記事は古い投稿を圧縮する

これで古い記事がいいねされる事はないでしょう。
そもそもQiitaのおすすめの仕組みがどうなっているのか分からないですし、真面目に研究する気も今のところないのですが、せっかく公開するからには目に留まりやすくなる努力はしていこうと思います。
（なお、手っ取り早いのは記事に閲覧者数の多いタグを付ける事ですが、吟味して真面目に設定はしていませんでしたので、これも改善の余地があります）

という意思表示でした。
今後Qiitaに投稿していこうと考えている方は参考にしてみてください。

あなたの記事が、Qiitaデイリーやランキングに載る事を祈ります。
一緒に頑張りましょう！

## せっかくなので、耳寄り情報をもう一つ
アドカレに登録できる記事は１日１記事です。
今日みたいに突発でなにか書こうと思って関連させようとしたんですが、アドカレの制限のためできなかったので諦めました…。
しかも、この記事も元々は限定公開で作っていて、更新日を見てもらえば分かりますが、もう差し替えが出来ないんですよね。
こういう事を見越して（？）初日の記事をインデックス的な使い方をしていて良かったと今改めて思いました。
（元々は別サイトでアドカレの内容をバックアップを取りつつ公開しているので、そちらでのインデックスが必要になったため作成していました）

頑張って朝早く起きて手動で差し替え直します。
しばらくご不便をおかけしますが、よろしくです…！

## 将来の自分のための備忘録
- 公開記事のURL： `https://qiita.com/(ユーザーID)/items/(記事ID)`
- プライベート記事のURL： `https://qiita.com/(ユーザーID)/private/(記事ID)`
- 下書き記事のURL： `https://qiita.com/drafts/(記事ID)`
  - なお、`/edit`をつけると編集画面になります
  - 下書きの場合はユーザーIDは不要です。

ここでの記事IDは同じです。
アドカレに登録した非公開記事のURLを当日に擬似的に差し替えたい場合など（今の私の状況など）で使えます。

## 【追記／運営への要望】未投稿か、投稿済みかの見分け方
まず、一覧から確認する方法は分かりませんでした。
個別ページに入ると、タイトル欄の右側に「投稿済み」or「未投稿」の表示があります。
また、投稿時のボタンが「内容を確定」or「下書き保存」となっています。
注意深く見ないと気付けないので注意しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/5a17afea-ece3-d18b-fca8-66a3f3e62d57.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/06e8a6aa-8566-1820-3263-428e08937406.png)

さて、要望ですが現状の表示方法だと上記を留意しておかないと記事の公開状況が分かりにくいので、下書き一覧の段階で投稿済みor未投稿の見分け方、あるいはフィルタが出来ると大変助かります。
下書き一覧から未投稿の記事を探して消したりするのが面倒くさいので、飽きっぽい私のようなユーザーにとって下書き機能自体が使い物にならなくなってしまっています。
この問題は未編集でも下書きページを開けば発生してしまう（？）ため、過去の記事からテンプレート部分をコピペしただけでも編集扱いになってしまい、ユーザーが知らない間に下書きが増えてしまっている問題を誘発しているように思います。

運用対処として、編集はしていなくても画面を抜ける時は必ず「内容を確定」させて出るようにするしかないように見えます。

## Qiitaデイリーの仕組みと、デイリーに載ったエビデンス
見落としていた上に解説もしていなかったんですが、Qiitaデイリーの投稿は内容を毎日更新しているため、たとえばデイリーなどは日をまたぐと上書きされリンクが消えます。
リンクが消えると、Qiitaのトラックバックからも消滅するため、本稿のようにQiitaデイリーに載ったよ！なんて言っても後日確認すると悲しみに包まれるようです。

タイトルに「デイリーに載った」なんて書いてしまったのに、翌日以降は消される事を知らなかったので、ちゃんと載ってたよっていうエビデンスを置いておきます。
が、元記事へのリンクを貼ると、元記事にトラックバックリンクが作成され本来想定されている利用者にとって邪魔になるため、本稿でのリンクは控えます。

元記事の当該リビジョン
https://qiita.com/koki_develop/items/fa223e1fa0ab057a54bc/revisions/822

私のQiitaID「nomurasan」で検索してもらえると、私の投稿履歴が見つかります。

## 次の記事
- [最もシンプルな記事の書き方・考え方紹介(本当の5日目の投稿) ](https://qiita.com/nomurasan/items/6cdde5886073c571349c)
- [カレンダーページ](https://qiita.com/advent-calendar/2022/oreno_nomurasan2022)
herokuデプロイが楽になるシェルスクリプトを書いてみた

# 前節
AWSでDjangoの開発をしようにもなぜか動かない
nodejsとかならfirebaseとかもあるかもしれないけど
Djangoを勉強してしまった僕にとっては例え無料プランがなくなろうともherokuからは逃げられない
せっかくだからアドベントカレンダー書いてみようと思ったらあったのでついでにあげてみた

# 本題
最近bashScriptを知りその素晴らしさに感嘆した
使ってれば覚ええるじゃんといわれても覚えるまでが面倒なのだ
ということで開発しているにあたり大体使うherokuCliをbashスクリプトとして組み込み少しの楽と調べる時間を短縮した

使う人はいないと思うがもしいれば，
```bash
debugApp="debug"
productApp="product"
```
の部分を自分のアプリの名前にすればいいと思います
顔文字はご愛嬌

```bash
if [ "$1" = '-h' ]; then
  echo
  echo \#\#\#   -m        : 本番環境
  echo \#\#\#   -d        : for debug app
  echo \#\#\#
  echo \#\#\#     manage  : その先も含めた "manage.py"
  echo \#\#\#     on      : メンテナンスモード on
  echo \#\#\#     off     : メンテナンスモード off
  echo \#\#\#     log     : リアルタイムlogの表示
  echo \#\#\#     push    : 今のbranchをpush
  echo \#\#\#     reset   : dbリセット
  echo \#\#\#     bash    : bashの表示
  echo \#\#\#     merge   : -dのみ developへマージ
  echo \#\#\#     copy    : 本番からdebug用へdbのcopy
  exit 0
elif [ "$1" = '' ] || [ "$2" = '' ]; then # 入れ忘れ
  echo -h to helop
  echo "(*'-')"
  exit 0
fi

debugApp="debug"
productApp="product"

if [ $1 = '-m' ]; then
  app=$productApp
elif [ $1 = '-d' ]; then
  app=$debugApp
fi

if [ $2 = 'manage' ]; then
  comd="heroku run python manage.py $2 $3 $4 $5 -a=$app"
elif [ $2 = 'on' ]; then
  comd="heroku maintenance:on -a=$app"
elif [ $2 = 'off' ]; then
  comd="heroku maintenance:off -a=$app"
elif [ $2 = 'log' ]; then
  comd="heroku logs -t -a=$app"
elif [ $2 = 'push' ]; then
  ===
  branch=`git rev-parse --abbrev-ref HEAD`||exit
  comd="git push heroku_dev $branch:master $3"
  # comd="git push heroku_dev for_winter_onetime:master"
elif [ $2 = 'reset' ]; then # dbのリセット用
  echo -n dbを削除します, 良ければ'yes'を入力:
  read str 
  if [ str = 'yes' ]; then
    echo delete
    heroku pg:reset -a=$debugApp
  fi
  return 0
elif [ $2 = 'bash' ]; then # bash
  comd="heroku run bash -a=$app"
elif [ $2 = 'merge' ]; then # bash
  if [ $1 = "-m"]; then
    return 0
  fi
  branch=`git rev-parse --abbrev-ref HEAD`||exit
  git checkout develop
  comd="git merge $branch"
elif [ $2 = 'copy' ]; then # bash
    comd="heroku pg:copy $productApp::DATABASE_URL DATABASE_URL -a $debugApp"
else
  comd="heroku $2 $3 $4 $5 $6 $7 -a=$app"
fi

echo "$comd"

read -p 'ok? (*`･ω･)ゞ (enter): ' yn
case "$yn" in
  "") $comd ;;
  *) echo "(´･ω･｀)ﾉo >bye"
    exit 
    ;;
esac
```

# 終わりに

ゆうて本番で使っちゃだめらしいね
AWS勉強しよ
(´･ω･｀)ﾉo
vPro対応PCを検証用仮想プラットフォームにする話(1)

# vPro対応PCを検証用仮想プラットフォームにする話(1)

## はじめに
自宅で各種のOS検証環境を構築するために、VirtualboxやVMware Player、Hyper-V などメイン端末上のHypervisor をお使いの方も多いと思います。<br>
この方式はメイン端末のリソースを消費するため、複数仮想マシンを同時起動するとメモリやストレージが不足する場合があります。

メイン端末から独立した仮想プラットフォームがあると自由度が高まります。

自宅に本格的なサーバーを構えている自宅ラック勢もいらっしゃると思いますが、(逸般ではない)一般の家庭では真似することは難しいです。

ここでは数回に分けてvPro対応のPCを検証環境マシンとして構築する方法をご紹介します。


## vProとIntel AMT　について
vProとはリモート管理機構を備えた企業向けPCのintelのブランド名です。企業のシステム管理者(シスアド)が効率よく業務用PC端末を運用管理できるような便利な機能が搭載されています。（PCとしての基本性能は変わりません）

vProに対応したPCはIntel AMT を備えています。<br>
Intel AMT はintel CPUの世代に合わせて進化しています。第2世代(Sanday 
Bridge)のCore i5/i7 CPUに対応したintel AMT Version 6.0 以降はリモートKVM機能がサポートされています。<br>
AMTはPC上のOSからは独立して動作し、ネットワーク経由での、電源制御、ディスプレイ表示、キーボード/マウス操作、ISO形式imageファイルのマウントなどを可能にしています。各社x86サーバー機に搭載されている HPE iLO、DELL iDRAC、Cisco CIMC、富士通 iRMC などと同様のことができます<br>

vProとintel AMTについて知るためには Internet Watch の「[vProの匠](https://internet.watch.impress.co.jp/docs/column/vpro_takumi/)」の連載がおすすめです。

## vPro対応PCの活用方法
intel AMTを利用すればvPro対応PCをヘッドレス運用の簡易サーバーとしての運用が可能です。<br>
vPro対応PCはその仕様上intel製ネットワークコントローラ(NIC)を搭載しています。VMware vSphere HyperVisor(ESXi)のinboxドライバで認識されるため、インストールして仮想プラットフォームとして利用することができます。ESXiはvPro対応PCを正式サポートしてはいませんが、私の経験では問題なく動作しています。


## vPro対応PC選び方
一般消費者向けの機能ではないため、vPro対応PCを家電量販店などではあまり見かけません。
intel NUCシリーズのミニPCや大手コンピューターメーカーのビジネス向けPCにvPro対応機種を見つけることができます。

個人的にはヤフオクなどのオークションサイトで、企業リースアップ品の中古PCを狙います。

以下に代表的なvPro対応デスクトップPC機種を紹介します。 <BR>

|メーカー|シリーズ|備考|
|:-:|:-:|:-:|
|HP|EliteDesk 800 シリーズ||
|HP|ProDesk 600シリーズ|G3以降|
|DELL|OptiPlex 7000 シリーズ||
|DELL|OptiPlex 9000 シリーズ||
|富士通|ESPROMO D900/D9000シリーズ||
|Lenovo|ThinkCentre M70/M80/M90シリーズ|モデルによって様々|

搭載CPUの違いやBIOSによって非対応の場合があります。
カタログやメーカーサイトでvPro対応有無をチェックしてください。
中古品を狙う場合は筐体に貼られたvProシールの有無が目安になるでしょう。

## 自作PCの場合
vProはCPUとチップセットの内蔵機能を利用して実現されます。
対応した CPUとチップセットの組み合わせで機能します。

ざっくり言うと、intel Core i5/i7/i9 シリーズのCPUと Qシリーズチップセットの組み合わせが必要です。
正確には [intel Arkサイト](https://ark.intel.com/content/www/jp/ja/ark.html)で確認してください。

ASUS、Gigabyte、Supermicro 社などがQ470/Q370チップセットを搭載したマザーボードを一般向けに販売しています。
ヤフオクなどには CPUが抜かれたvPro対応のPCが出品されていることがあります。これをベースにするのも良いでしょう。

## 次回予告
今回は前起きばかりになってしましました。
次回は実際にvPro PCを用意してセットアップを行う予定です。
CrystalでWebAssemblyを出力する

## はじめに

本記事は、下記のノア・エバレットさん[記事①](https://glue.im/noah/introduction-to-webassembly-in-crystal) [記事②](https://glue.im/noah/webassembly-host-functions-in-crystal)のうちの記事①の一部に基づいています。ノア・エバレットさんは[Twitpic](https://ja.wikipedia.org/wiki/Twitpic)の設立者で、現在新しいSNS、[glue](https://glue.im/)を立ち上げており、そのなかでCrystalが積極的に利用されているそうです。この記事の扱う内容はその前半の抜粋なので、よかったら元記事を参照してください。

## wasmとは

wasmとは何か？については、（私は正しく説明できる自信がないので）他の記事に譲ります。

## Crystalでwasmを出力する

Crystalは[LLVM](https://e-words.jp/w/LLVM.html)を利用しているので、wasmの出力なんか簡単だ、と思うじゃないですか。でも、

```
crystal build a.cr --target wasm32-wasi
```

とやるとエラーが出てしまいます。動作させるためには `libc`、`librt`、`libpcre` が必要です。そこで、これらのwasmのコンパイル済みライブラリを入手して静的にリンクするようにしましょう。

https://github.com/lbguilherme/wasm-libs

世の中にはちゃんと便利なツールを準備してくれている人がいます。上記の[リリース](https://github.com/lbguilherme/wasm-libs/tags)から、コンパイル済みのwasmライブラリをダウンロードしましょう。この記事の作成時点では、0.0.2が最新です。

* wasm32-wasi-libs.tar.gz

をダウンロードして展開します。
環境変数 `CRYSTAL_LIBRARY_PATH` に `$PWD/wasm32-wasi-libs` をセットして、`hello.cr` をビルドしてみましょう。

```sh
export CRYSTAL_LIBRARY_PATH=$PWD/wasm32-wasi-libs
crystal build hello.cr -o hello.wasm --target wasm32-wasi
```

hello.wasm が出力されたと思います。

wasmはバイナリファイルですが、中身を覗いてみたい方は[wabt](https://github.com/WebAssembly/wabt)というツールを使うと、wasmの内容を閲覧することができます。

```
wasm2wat hello.wasm
```

とはいえ、なかなか人間が読んでもわかるものではなさそうです。


## 実行してみよう

一般にwasmはブラウザで実行します。しかし、私はWeb技術に関する知識にうとく、ブラウザでwasmを実行することにはあまり興味がありません。それよりも、[CPU/OSに依存せずに利用できるライブラリ](https://zenn.dev/koduki/articles/f1b342079788be#%E3%83%A6%E3%83%8B%E3%83%90%E3%83%BC%E3%82%B5%E3%83%AB%E3%81%AA%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA)や、[プラグインの基盤](https://zenn.dev/koduki/articles/f1b342079788be#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%AE%E3%83%9E%E3%82%AF%E3%83%AD)としてのwasmに興味があります。

ブラウザの外でwasmを動かすツールは、[Wasmer](https://github.com/wasmerio/wasmer)や[Wasmtime](https://github.com/bytecodealliance/wasmtime)があります。どちらを利用しても、`hello.wasm` を実行できると思います。

```
wasmer hello.wasm
```

```
wasmtime hello.wasm
```

いずれの場合も、`hello` が表示されたら成功です。

## まとめ

この記事では、Crystalを使ってWebAssemblyを出力して実行しました。多少手間がかかるところもありますが、今後コミュニティの有志の力によって、ますます利用しやすいものになっていくでしょう。実際にこの手法も、Crystalコミュニティの中で生み出されたものです。WebAssemblyが出力できるようになるまでのやりとりを知りたい場合は、下記のフォーラムを読んでみてください。

https://forum.crystal-lang.org/t/trying-out-wasm-support/

来年もCrystalの利用シーンが少しずつ拡大し、Crystalコミュニティのメンバーに幸いがありますように。

この記事は以上です。
zoom の画面共有で発表者ツールが表示されてしまう場合の対処法

# 想定する状況

リモートと対面のハイブリッドの場合によくあるパターンで、自分の手元では発表者ツールで表示しつつ、会場のスクリーンとzoomには発表スライドのみを表示したい場合の方法です。会場では発表スライドのみに見えても、zoomには発表者ツールが見えてしまう、というのがよくあるパターンではないかと思います。その状況を回避する方法について、自分もうっかりハマったのでメモしておきます。。

# 対処法

**zoom の画面共有は、スライドを再生してから行う。** 

に尽きるのではと思ってます。(もし違ってたらご指摘ください。)

図で示すとこんな感じ。

![zoom_share.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179652/07610280-f6dc-c1dd-e55e-51b855ddd79d.png)

1. スライドショーを開始する。zoom の画面共有はまだしない。上の例では、別のdisplayに全画面表示のスライドが表示されている。
2. zoom でスライド画面を選択して共有する。この時に、ppt を選択してしまうと、発表者ツールが見えてしまうので注意。

## 補足

ミラーリングの有無に関係なく、zoom は選択した時の画面を共有するので、**zoomで画面共有をする前にスライドショーを開始し**、適切なものを選択すればOKなはずです。keynote や 他のアプリでも、基本的には操作後に適切な共有する画面を選択する、というのだけ覚えておけばOKだと思う(たぶん)。
【Git】 頻繁にブランチを切り替えている人にオススメのファイル(タブ)記憶方法

## はじめに

普段開発をしていると、バグが発生して今開発しているものは一旦置いておいて、急ぎでバグ修正をしなければいけない場合がよくあるかと思います。
そんなときは、`git stash`コマンドを使用して一旦現在の変更を退避させて、皆さん別ブランチに切り替えてバグ修正を行っているかと思いますが、下記のようなことができたらいいなと思ったことありませんか・・・？

- 退避させたブランチで開いていたファイル(タブ)も記憶したい
※ブランチ戻った際に、いちいち全てタブを開き直すのが面倒(もとのブランチのファイルをそのまま開いてバグ修正をするとタブがごちゃごちゃになって作業しづらいなど・・・)

今回は上記のような状況で活躍する、便利な拡張機能をご紹介します！

:::note warn
注意点
筆者はVSCodeでしか使用したことがありませんので、他エディターで使用できなかったらごめんなさい！
:::

## 実現したいこと
- ブランチを退避させる前に現在のブランチで開いているファイル(タブ)を記憶しておいて、別作業が終わってブランチに戻ってきて、`git stash apply`などで退避した作業内容を呼び戻したあとに、以前記憶したファイル(タブ)をすべて復元する。

## 前提(準備)
- Gitの基礎知識
- VSCode
    - 他エディターでツールがあるかは検証してません。
- [Git Branch-wise Session](https://marketplace.visualstudio.com/items?itemName=mangano-ito.git-branch-wise-session)
    - VSCodeのExtension(拡張機能)からインストール可能。

## 使い方(実際に使用する際の流れのイメージ)
1. 作業中に、優先して対応するバグ修正が入る
2. ブランチを退避させる前に、`Cmd + Shift + P`で入力欄が出てくるので、> `Git Branch-wise Session: Save Session for Current Branch`と入力して選択し、ファイル(タブ)をここで記憶しておく。
3. `Cmd + Shift + P`で、> `View: Close All Editors`と入力して記憶したファイルをすべて閉じておく(バグ修正する予定の別ブランチで作業しやすいようにスッキリさせておく)
4. `git stash`コマンドで現ブランチの作業内容を退避させて、別ブランチ(バグ修正するブランチ)に移動する。
5. バグ修正の対応作業完了後、ファイルをすべて閉じておいてから、以前作業していたブランチに戻って`git stash apply`などで、退避させていた作業を復元させる。
6. `Cmd + Shift + P`で、> `Git Branch-wise Session: Restore Saved Session for Current Branch`と入力して選択すると、以前記憶してファイル(タブ)がすべて復元される。
7. 以前の作業の続きをすぐに開始・・・！

※**コマンドの入力はある程度入力すると候補で出てきますので選択できるかつ、履歴が残るので次回は選択するだけでOK**

※ちなみにあまり使用しないかもしれませんが、セッションは > `Clear Session` と打つと出てくるコマンドで消せるみたいです。

## デモ
![b71ae1546293aaa35d78a5da63c1b8d8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1040483/b4b24a08-b02f-027c-c0fe-2cd2a4201e83.gif)


## 終わりに
ちょこちょこと小さい修正をするために頻繁にブランチを変えている自分には・・・便利スギィ！！

## 参考
- [VSCode でブランチごとにタブ状態を復元する拡張](https://mangano-ito.hatenablog.com/entry/2020/04/13/143226)
DoctrineとEloquent比較大全1: 1レコードを表すクラス（Entity vs Model）

day1の今日はidとtitleという項目を持つbooksテーブルがあったとき、DoctrineとEloquentそれぞれでどう表すのか見てみます。
booksテーブルのmysql用のSQLは　[こちら]()

## Doctrine

Entityクラスを定義します。
```php
<?php

declare(strict_types=1);

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
#[ORM\Table(name: 'books')]
class Book
{
    #[ORM\Id]
    #[ORM\Column(type: 'integer')]
    #[ORM\GeneratedValue(strategy: 'AUTO')]
    private string $id;

    #[ORM\Column(type: 'string', length: 255, nullable: false)]
    private string $title;

    public function getId(): string
    {
        return $this->id;
    }

    public function setId(string $id): void
    {
        $this->id = $id;
    }

    public function getTitle(): string
    {
        return $this->title;
    }

    public function setTitle(string $title): void
    {
        $this->title = $title;
    }
}
```

<https://github.com/77web/doctrine-vs-eloquent/blob/2f71adc7b61a1bff0214f9890395b986e55b7628/Doctrine/Entity/Book.php>

- 何も継承する必要はありません。必要に応じて何かを継承させたければ何を継承してもOK。interfaceを実装してもOK。
- PHP8+のAttributeを使ってテーブルについての設定や各カラムについての設定をします。
- データベース上に存在して、PHPから利用したいカラムはプロパティとして定義する必要があります。例ではprivateとしてgetter/setterメソッドを定義していますが、publicプロパティとして定義し、getter/setterを作らないこともできます。

## Eloquent

Modelクラスを定義します。

```php
<?php

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

/**
 * App\Models\Book
 *
 * @property int $id
 * @property string $title
 */
class Book extends Model
{
    public $fillable = [
        'title'
    ];
}
```
<https://github.com/77web/doctrine-vs-eloquent/blob/2f71adc7b61a1bff0214f9890395b986e55b7628/Eloquent/Models/Book.php>

- `Illuminate\Database\Eloquent\Model` を継承します。
- テーブルに存在するカラムについて記述する必要はありません。IDEで補完を効かせる目的で `@property` phpdocを書くことができます。
- `$fillable` プロパティを設定しておくとEloquentの便利な機能を使ってデータを保存するときに役立ちます。
要件定義について

<br>

昨日（2022/11/29）から、エンジニアYoutubeｒの山浦清透さんが運営している独学エンジニアで学習をスタートしたので、その学習内容を定期的にアップする。

※レッスン1、2に関しては既知のことが多かったため、ここでは割愛する。
# プログラムを作れるようになるために

◯プログラミングの文法について学んでもプログラムを作れない原因は、プログラムの作る経験を積んでいなから。（筆者はよく料理をするのだが、確かに動画やレシピを見て料理をひたすら作っているだけで、ただの一度も料理の基礎について学んだことはない。）

◯課題設定とタスクばらしが骨格で、以下の流れで作成する。
1. 課題を設定する
2. 要件に落とし込む
3. 要件をタスクにバラし、実行する順番を決める
4. 一つずつ増やしていく

# 課題定義
◯背景・目的
* 解決したい課題は？
* 何のためにしたいのか？
* なぜシステム化する必要があるのか？

◯ゴール
* 目標は？
* 達成したいときにどのような状態になっていればよいのか？

◯やらないこと
* スコープの対象外のことは？
* 制約条件は？

◯インセプションデッキ
* 「アジャイルサムライ」という本を読むと良いらしい。

# 要件定義

**システムを作る上で「必要な条件」を定義して、システムに落とせるようにする。**
**業務要件、機能要件、非機能要件、運用・保守要件を定義する。**

※今回は非機能要件、運用・保守要件については記載しない。

◯業務要件
* 業務フロー
登場人物ごとに業務（行動）の流れを図にする。

◯機能要件
* ページ遷移図
必要なページを洗い出して、ページの流れを図にする。

* WF（画面図）、機能、データ
WFはデザインをあてずにページの構成要素をまとめたもの。項目とか文言はここで決め、見た目の装飾以外は決める。
機能はこのページで使う機能、できること。
データはこのページで登録したり、使用するデータのこと。

WF（画面図）、機能、データの3点は同画面に記載するとわかりやすい。

# タスクばらし

◯方法
１．ゴールを確認・理解する
２　ゴール達成のために必要な項目をリストアップする
３．実行順に並び替える

コツは１時間以内の小さな単位で分割すること

◯毎日の仕事をタスクばらししよう
* 仕事に取り掛かる前に、今日やることを1時間単位でスケジュール作成
* 仕事完了後に、目標、実際、差分を記載(差分からなぜできなかったかを考える)

# その他

* 要件定義資料作成ツール
[figma](https://www.figma.com/files/recent?fuid=1179778366557585083) 
[sketch](https://www.sketch.com/)

* バリデーション　
文字数が正しいか、規定の文字が入っているか確認し、入力内容に不備がないか確認すること。

# 参考にしたサイト
[独学エンジニア](https://dokugaku-engineer.com/course/serverside)
Windows11おすすめソフト（デスクトップ美麗化）

# Windowsってなんかごちゃごちゃしてるよね
　Windowsっていつになっても，なんかごちゃごちゃ感というか，洗練された感がない．
こんなときぶっちゃけMac使えば解決じゃん？って思う人もいると思うのですが，仕事の都合上Windows機を使わなきゃいけない人もいるはず．昔はMacであってもBootCamp使ってWindowsとMacOS共存できましたけど，今やApple Silliconでできないですからね．
でも，Windowsのデスクトップだけはちょっとかっこよくしたい！そんな人に向けたソフト紹介です．

本日のソフトを全て導入すると以下のような感じになります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676391/e8c43120-7233-efa0-6701-3a7f9e5a5947.png)
どうです？かっこいいでしょ？画像ではわからないですが，壁紙も実は動きます．

一部有料もありますが，ワンコインで収まる程度です．満足度は十分高いですから，買う価値はあると思います．
こんなソフトもありますよとおすすめがある人はコメント残していただけると幸いです．

**<font color="Red">※毎度のことですが，導入の際は自己責任でお願いします**</span>
# ソフト紹介
## Translucent TB
### 説明
Translucent TBは，タスクバーを透明化するフリーソフトです．レジストリをいじることでも同様のことはできるようですが，透明度に限界があるようです．こちらのソフトを用いればタスクバーを完全に透明化することができます．
![こんなふうにタスクバーを透明化できる](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676391/9d65954d-70c0-744b-7522-3691826d937d.png)
透明化以外にもすりガラス状にしたり，単一色にしたりなどバリエーションもあり，またスタートメニューを起動したときやソフトを最大化したときの挙動の変更も行えます．
### 配布先

https://github.com/TranslucentTB/TranslucentTB

通常のインストール版とストアアプリ版が選べるみたい．アップデートも自動でやってくれるストアアプリ版がおすすめ．
## Rainmeter
### 説明
Windows 7まであったウィジェット機能の上位版．ウィジェットのことをスキンと呼び，時計やリソースモニタを始め，天気予報スキンなども追加できる．
自分で1から作成することもできるが，[DeviantArt](https://www.deviantart.com/rainmeter)コミュニティで配布されているものを使うのがおすすめ．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676391/9956a1c9-679f-fd9b-2529-84ed9379c88a.png)
### 配布先

https://www.rainmeter.net/

以下のリンクよりダウンロードできる．
コミュニティでダウンロードしたカスタムスキンはダブルクリックで実行することでインストールできる．





随時追加予定
プログラミングが副業になるロードマップ

# 要約

本稿ではプログラミングをする上で必要な知識について解説をした。

時間がない人やとりあえず行動したい人向けに誤解を恐れずに内容を簡潔に伝えるならば

「脱初心者するためには登録料無料のクラウドソーシングサイトに登録をし案件を獲得してみよ。」

ということである。

例としてLancersを挙げている。とりあえず行動してみたい人は登録をし自分のプログラミングスキルで可能な案件がないか探してみてほしい。

https://www.lancers.jp/affiliate/track?id=2484168&link=%2F

# 序文

プログラミングにゴールはなくプログラマーは常に学び続けなければならない。

これはプログラミングをする上での定説である。

しかし、プログラミングに興味を持つ人やプログラミング初心者がそんなことを聞いてしまえば挫折してしまうだろう。

その為本稿ではプログラミングをする上で脱初心者の条件とも言えるプログラミングでお金がもらえるまでの道をロードマップとして作成した。

本稿がプログラミングを始めようと考えている人やプログラミング初心者の力になれば幸いである。

# 自己紹介

私の自己紹介をさせて頂く。

システムエンジニア、機械学習、WEBライター、プログラミング講師。

使用言語はRuby（RoR)、Python

地方国立工学部の知識を活かしながらLancersというクラウドアウトソーシングサイトでフリーランスとして活動中。

https://www.lancers.jp/affiliate/track?id=2484168&link=%2Fprofile%2Fren_nak

以上が私の簡単なプロフィールである。

# 動機づけ

本題に戻ろう。

まず、プログラミングを始めるには動機づけが必要である。

動機はプログラミングへのあこがれ、業務効率化のため、副業にしたい等なんでも構わない。

この動機こそが自分を動かすガソリンであり、ゴールに進むための羅針盤なのである。

また、動機に応じたプログラミング言語を勉強する必要がある。

具体的には、
・WEBアプリ開発ならRuby(RoR)
・フロントサイドWEBサイト開発ならJava script
・Androidアプリ開発ならJava
・iPhoneアプリ開発ならSwift
・機械学習ならPython
・ゲーム開発ならC#
であろう。

何事にも適材適所が肝心ということである。

とりあえず1つのプログラミング言語の読み書きが難なくできるレベルになれば他言語に移る場合にそれほど苦労を要さない為、初めに学んだ言語にこだわる必要はない。。

# 必要なスキル

次にプログラミングをするために必要なスキルについて解説する。

列挙するならば

・自分のPCを操作できる能力（ショートカットコマンド）
・プログラミング上の最低限の文法
・高校程度の数学力（冗長なコードを避けることができる）
・問題解決のための論理的思考力（問題解決能力）
・多少の英語力（エラー文、公式ドキュメント）

まず自分のPCを操作できる能力というのはプログラミングというのはPCとにらみ合い、空を眺めて考えて、自分の思考をプログラムに落とし込むということなのだからPCが自分の体の一部のように動かなければ話にならない。
ショートカットコマンドとして意識せずともコピー＆ペーストやアプリの切り替えができてPCが自分の体の一部として機能するのである。

プログラミングをする上で最低限の文法として必要なものを挙げておく。
・条件分岐
・繰り返し
・オブジェクト指向

これだけ押さえていれば知識の組み合わせで様々な問題に対応できる。

高校程度の数学はなくともプログラミングは可能である。
しかし、数学力がある人の書くコードは美しくなによりも早い。
人の手より遅いプログラミングになど価値がないのだから早さは不可欠である。

問題解決のための論理的思考力というのは世の中には学校のように定量的に表された問題は存在しない。
そのため自分で問題点を見つけ出し適切なキーワード検索によって調べ、問題点を解消できたか定量的な評価をする力が必要である。

英語力というのは大前提としてRubyを除くメジャーな言語はすべて外国産の言語である。
そのため公式ドキュメントは英語で記載されているものが多い。
プログラマーにとって公式ドキュメントはバイブル的存在である。
読めなければ話にならない。
また、エラー文はすべて英語で出力されるためRubyを使用するからと言って英語を避けて良い理由にはならない。
英語には日本語の30倍の量の情報がWEB上では転がっている。
つまり、英語ができるということは単純計算で30倍の確率で問題が解決するのである。

# 到達目標

最後にプログラミング初心者脱却とはどのレベルを指すかについてである。

ITには様々な資格が乱立しているが、基本的にどれも必要ない。

よって募集要項として資格が必要とされている場合以外は資格勉強よりポートフォリオ作成に注力するべきである。

そのためプログラミング脱初心者の指標としては案件をいただけるかという点であろう。

案件を頂くということは第三者から自分のスキルが認められ、お金を出しても良いと思われるレベルまで成長したということである。

ここまで読んでくれたあなたには是非一度Lancersに登録し自分にもできる案件がないか探していただきたい。

https://www.lancers.jp/affiliate/track?id=2484168&link=%2F

もちろん登録に費用はかからない為、良いベンチマークになるはずだ。

もし自分にできる案件がなかったとしても問題はない。

確認することで自分のプログラミングレベルをどこまで上げなければならないかはっきりするはずである。

あとは基礎力を磨き、案件を受けられるレベルになれば良いのである。

ここまで来ればあなたのことをプログラミング初心者と呼ぶ人はいないだろう。

自信を持ってゴールのないプログラミングの道を自分の羅針盤を頼りに進んでいけば良い。
【初心者向け】全角スペース・全角英数字を駆逐してQOLを高める

# 最初に

[フィヨルドブートキャンプ アドベントカレンダー PART2](https://adventar.org/calendars/7786)の1日目の記事です。

1日目なので最初らしくプログラミング学習の序盤にやった方がいいこととして、
全角の英数字と記号への対策などのちょっとしたtipsを紹介したいと思います。

なお、本記事では、「Google日本語入力」や「VS Code」を具体的に紹介しており、
その他のソフトに関しては紹介してませんので、あしからず。

# 最初にすべき設定のまとめ

これから紹介していくTipsをまとめておきます。

- 日本語入力は、英数字・記号のデフォルトを半角にできるものを使う。
  - Macのデフォルトだと厳しかったので、「Google 日本語入力」をインストール。
  - 特にスペースキーでの入力のデフォルトを、半角スペースにする。
- エディタで、全角スペースを可視化する。
  - VS Codeを使う。

## 英数字・記号・スペースの入力で、半角を優先にする

個人的にオススメしたいのが、
**日本語入力時のスペース・英数字などのデフォルトを半角にする**、ということです。

なぜスペース・英数字・一部の記号のデフォルトを半角にした方がいいのでしょうか。

全角と半角は、見た目が似ています。
しかし、だいたいコードやマークダウン等で、同じように振る舞わないです。
そのため、全角が混入し、バグ等の要因になりやすいです。

特に全角スペースは、プログラマ初心者が躓いて悩んで質問してる光景をしばし目にします。

できるだけ使わない全角は未然に防いだ方が良いです。

あと、たぶんプログラマは全角英数字が嫌いです。
出来るだけ使わない方が良いでしょう。



## 半角英数字を優先する方法

実際どうするかというと、日本語入力の設定を変更します。

ただ、そういう設定がない場合には、設定を変更できるものを使うと良いでしょう。
自分は「[Google 日本語入力](https://www.google.co.jp/ime/)」を使用しています。

以下、Macでの「[Google 日本語入力](https://www.google.co.jp/ime/)」での具体的な方法を簡単に紹介します。
「[Google 日本語入力](https://www.google.co.jp/ime/)」は使いたくない等の方は、ごめんなさい。

それから、インストール方法は省略します。
インストールできてるものとします。

「Google 日本語入力」の環境設定(Preferences)をクリックし、
環境設定のウィンドウを開きます。

- スペースの設定は、「一般」タブ
- 英数字や記号の設定は、「入力補助」タブ

まずは、スペースです。
<img src="https://i.gyazo.com/728f297ffcb3bebf7d35b446841c5ca6.png" alt="Image from Gyazo" width="400"/></a>
「スペースの入力」のデフォルトを「半角」にします。

自分の経験では、全角スペースは使うことほぼないです。
半角スペース2個で、全角スペース1個の幅をとれます。小が大を兼ねる。
なお、一時的に全角スペースが必要な場合、Google日本語入力では、**shiftと一緒に**スペースキーを押せば、全角スペースになります。


次に、英数字・その他一部の記号のデフォルトを「半角」にします。
「入力補助」タブの下半分の項目です。
<a href="https://gyazo.com/1eb100846354d9d77326e3e227648520">
<img src="https://i.gyazo.com/1eb100846354d9d77326e3e227648520.png" alt="Image from Gyazo" width="400"/></a>

カタカナや句読点を半角にしないように注意しましょう。
普通、日本語で主に使うものは全角だと思います。

それ以外のものは、コード上で書くことが多く、半角が優先になると良いでしょう。
アルファベット、数字などなどは、半角の方が良いと思います。

## エディタの全角スペースを可視化する

次に、それでも全角が入ってしまったケースについての対応を書きます。

現在のVS Codeだと嬉しいことに、
デフォルトで全角のスペースやイコールなどが強調され目立ちます。

ただし、これも限界があって、全角の丸括弧などは強調されないようです。

全角の丸括弧は、どうすれば良いでしょう?
少し上中級者向けですが[Highlight](https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-highlight)という拡張機能がありました。

これを用いると、色々とカスタマイズすることが出来ますので、
全角の丸括弧だけ色をつけたり太字にしたり強調することができます。

ただ、これは初心者向けの機能ではないので、
VS CodeやJSONに慣れた方が使うと良いと思います。

【参考】
[VSCodeでさっくり作る快適な執筆環境。オススメ拡張機能3つ。｜リョウ｜note](https://note.com/ryryo/n/n0ca42c3901d0)
上記の記事の中ほどの「Highlight(ハイライト)」の項目。

# 逆に、半角スペースを可視化する

全角を強調する方法はわかりました。
反対に、半角スペースの

VS Codeでは、「Render Whitespace」という設定で、
半角スペースに薄いドットを表示させて、少し目立たせることができます。
デフォルトの`selection`よりも`all`や`boundary`が良いと思います。

【参考】
[Visual Studio Codeで最初にしておきたいオススメ設定 - Visual Studio Code - [SMART]](https://rfs.jp/sb/vsc/vsc-setting.html#i-8)
「空白文字の可視化」の項目です。

## 全角スペースが紛れた際の挙動

また、全角スペースが紛れた際の挙動がどうなるか簡単に知っておくと嬉しい気がします。
次の記事は、自分が簡単にまとめたものです。

[Qiita: いくつかの言語での全角スペースの挙動](https://qiita.com/universato/items/c1f97e1843e010ed8dd8)

JavaScriptは全角スペースも半角スペースと同じように振る舞いますが、
Rubyの全角スペースはアルファベットのように変数になったりするので大変です。
そんなことが簡単に書いてあります。

# 最後に

自分はフィヨルドブートキャンプとあまり関係ないことを書いてしまいましたが、
明日はよかじさんがフィヨルドブートキャンプの入学から卒業までを記事に書いてくれるらしいです。
JavaScript でフォームの値を localStorage に記録、読み込み、削除する

弊社営業課長から

「予約フォームで名前、生年月日、電話番号、メールアドレスを入力した後に一度サイト抜けて、また予約フォーム入ったらまた名前、生年月日、電話番号、メールアドレスを入力し直しってユーザーしんどいよね。何とかならない？」

という要望があったので、予約フォームの入力値を javascript 側で localStorage に保存しておいて、再度予約フォームまで来た時に localStorage から読み出す方式を取る事にした。

## github
https://github.com/kanagama/copy-paste-form-value-vanilla-js


## 使い方

### js/copy-paste-form-value.min.js を読み込む

```html
<script type="text/javascript" src="copy-paste-form-value.min.js"></script>
```

<br><br>

### form の値を記録開始

function 実行後、form の change イベント発火時 localStorage に form の値が記録されます。

```js
formChangeEvent();
```

<br>

### form の値を読み込み

function 実行時、localStorage から記録していた form の値を呼び出してセットします。

```js
loadForm();
```

<br>

### 記録していた form の値を削除

※localStorage の値が全て消えます

```js
clearStorage();
```

<br><br>

基本的にはフォームの値を記録したいページで js を読み込んで

```js
loadForm();
formChangeEvent();
```

を実行するだけ。

また、記録を削除したいページで js を読み込んで

```js
clearStorage();
```

すればいいかなと思います。（予約完了画面とか）

<br>

## 注意事項

- 対象は input, select, textarea です。
- hidden パラメータはコピー・ペーストを行いません。
- 画面上にフォームが存在しない場合、動作しません。
- 画面上に複数のフォームが存在している場合、正常に動作しません。
- ajax を利用して動的に要素の表示・非表示を制御している場合、正常に動作しない場合があります。


## chrome 拡張機能版

Alt + i で form の値を記録、 Alt + o で 記録した値を form にペーストします。
in, out で覚えていただければ…。

https://qiita.com/kazumacchi/items/e7d50bb0e4da3ae64c8d

## 変更履歴


### 2023/02/15 - v1.1.0
- ペースト時、要素の click() と change() イベントを発火させるように修正
- ペースト時、20ms の待機時間を発生させるように修正

### 2022/12/02 - v1.0.1
- ちょっとした不具合対応
- テストコードの追加
HTML メルマガ


## メルマガって難しい

テーブルタグで書くことも知らなかた。
そんな時はGitHubのテンプレ！

[テンプレ](https://github.com/leemunroe/responsive-html-email-template)

これを叩き台として制作していきました。

## tableの中にテーブルを入れる違和感。。


まだまだ勉強中です！
東京Web3ハッカソン参加記

# はじめに

10月22日から11月6日に開催されていた[東京Web3ハッカソン](https://tokyo.akindo.io)に参加してきました。
場を提供していただいたハッカソン運営の皆さんには、この場をかりてお礼申し上げます。

今年（2022年）の一人アドベントカレンダーは、このハッカソンでの開発を通して学んだことなどを中心に書いていきたいと思います。

# なぜWeb3に興味を持ったのか

まず、なぜWeb3に興味を持ったのかということを書きたいと思います。
ブロックチェーン、暗号通貨などをベースとしたWeb3の流れは、賛否両論ありつつも確かな潮流となって拡大しているように見えます。
個人的なスタンスとしては、バブル気味だった投機的な暗号通貨市場やスタートアップ市場、バブリーなNFTなどにはしっかりと距離を置きつつ、様々な技術側面には非常に興味を持っています。

まぁなんというか、Web3界隈はほんとに胡散臭いのもあるし、メタバース＝Web3だというのをことさらに騒ぎ立てている人たちも、正直なところどうかと思いますが、一方で詳しく技術やコンテキストを知らずに批判するのも違うのだろうなと思う部分もあります。

また、技術的にも興味深いところは多く、特に個人的に興味がある部分が、Ethereumで使われているSolidityによるスマートコントラクトの仕組み、ZCashの匿名暗号通貨、IOTAのタングルなどです。要は、データ構造、分散システム、暗号、コンピューティングといった側面に非常に興味があるわけです。

そんな折に、以下のようなTweetをしたところ、

https://twitter.com/k0uhashi/status/1486959461042630658?s=20&t=2A73XYuDdskyLj1kVJw_2A

と「CryptoZombies」を教えていただきました。
これ以前にブロックチェーンの仕組みは概念的な理解はできていたと思うのですが、実際に手を動かしてSolidityを書いて動かしてというのを進めると、断然理解の解像度が上がっていきました。

だいぶ前になりますが、知人に教えてもらいOHOコインを作ったことがあり、多分その時初めてSolidityを書いたのですが、その時は穴埋めクイズ的な感じであまり理解できていなかったなと、今になって思います。

そんなこんなで、ITエンジニアとして学んだ技術を使って何か作りたいと思い始めたわけです。

# 締め切り駆動でハッカソン参加だ！

ということで、学んだ結果で何かスマートコントラクトを使って作ってみたいというところで、ハッカソンを知りました。
いつものようにハッカソンで締め切り駆動開発だと参加を決めました。

# 何を作る？

折角なのでずっと興味を持っているARクラウドに関係するものを作ります。
既存のARクラウドシステムで、コンテンツ管理は基本的にはプラットフォーム提供者が完全に管理します。
一方でこれまでQiitaでも書いてきたような僕の作りたいARクラウドでは、WWWのように、明確な管理者が存在しない分散システムを目指しています。
そこで、場所にARコンテンツを結び付ける仕組みをスマートコントラクト化したらどうなるかということを考え始め、
ハッカソンで作ってみることにしました。

これまで、DNSのような分散システムとして考察していた仕組みですが、考えてみるとスマートコントラクトも要件的には適合しそうです。
実際に、ENSというDNSのスマートコントラクト版のようなものもありますし、おそらく思考の方向性は間違っていないと思います。
そこで、少し色気をだして（ちょっとお金になりそうかもとか…）、CryptoZombiesで学んだNFTの仕組みをベースに作ってみることを考えました。

# ハッカソン結果

実際に、独自NFTのスマートコントラクトを作って、それらを操作するWebシステムも作って、OpenSeaで売買できることも確認して、
クライアントのUnityアプリも作って、Unityアプリからスマートコントラクトにアクセスするようにしたりしてと、
かなり多岐にわたる技術を駆使した開発になりました。それだけで面白く、久しぶりにワクワクしながら開発しました。
入賞はかすりもしませんでしたが、一通り動くところまででき、締め切り駆動の目的は達成しました。

# 感想

完全にオンラインに引きこもってのぼっちハッカソン（オフラインイベントも任意であったが）だったので、これと言って何かというか、いつもの趣味開発の延長的になっていた感じでした。

ただ、最近思うのは、今回のハッカソンというわけでなく、様々なハッカソンで、ペインとか社会的意義・社会課題の解決とかUI/UXとか、なんかそういう高尚な言葉が多く、純粋に技術を用いて作りたいもの、面白いものを作るというスタンスは、少なくなっているのかなぁというところです。
個人的にはそういう技術・開発・動いた！みたいなテンションが好きなんですよね…
VPNの種類（ポリシーベース・ルートベース）

●ゲートウェイの種類
VPNまたはExpressRouteのいずれかを選択。

●VPNの種類
VPNゲートウェイにはポリシーベースとルートベースの２種類のルーティング方法がある。

※VPNの種類はゲートウェイの作成時のみ選択でき、後から変更することはできない。

・ポリシーベース
IPsecポリシーに基づいてペケットを送信する。サイト間通信のみ使用可能で選択可能なゲートウェイSKUは主にテストや評価用を目的としたBasic SKUに限定される。アクティブ/アクティブモードなどは使用できない。

・ルートベース
IP転送やルーティンングテーブルのルートに基づいてパケットを送信。ほとんどのVPNゲートウェイのこうせいでは、ルートベースが使用される。
サイト間接続だけでなく、ポイント対サイト接続、仮想ネットワーク間接続もサポートしている。
OnCall の functions を呼び出した際 UNAUTHENTICATED が返ってくる

## 状況
OnCall で作成した functions をクライアントから呼び出した際、`UNAUTHENTICATED` が返ってきてしまう。

## 原因
作成された functions に誰でもアクセスできる権限が振られていなかった。

## 対応
1. GCP の functions へ
1. 対象の functions に全てチェックをいれる
1. 左上の「権限」を押す
1. 「プリンシパルを追加」を押す
1. 新しいプリンシパルに `allUsers` を追加
1. ロールに `Cloud Functions 起動元` を追加
1. 保存

## 疑問点
今までこんなことしなくてもアクセスできたはず。
確認したところ、やはり他のプロジェクトはこれをやらずとも権限が振られていた。
なぜこのプロジェクトだけ振られていないのだろうか？
Expressで多次元配列でフォームの入力値を受け取る

Expressでフォームの入力値を配列で受け取るにはexpress.urlencodedの指定が必要。

```javascript
app.use(express.urlencoded({extended: true}));
```

[Expressでbody-parserがいらない理由: “bodyparser is deprecated”](https://qiita.com/hirochan/items/e63d74cb70f0b97889fc)

どういった形式で指定することが出来るかのサンプルを以下に記載する。

```html
   <input  type="text" name="sample"/>

    <input  type="text" name="apple[0]" value="あ"/>
    <input  type="text" name="apple[1]" value="い"/>
    <input  type="text" name="apple[2]" value="う"/>
    
    <input  type="text" name="lemon[]" value="あ"/>
    <input  type="text" name="lemon[]" value="い"/>
    <input  type="text" name="lemon[]" value="う"/>

    <input  type="text" name="pear" value="あ"/>
    <input  type="text" name="pear" value="い"/>
    <input  type="text" name="pear" value="う"/>

    <input  type="text" name="banana[blue][]" value="あ"/>
    <input  type="text" name="banana[blue][]" value="い"/>
    <input  type="text" name="banana[red][]" value="う"/>
    <input  type="text" name="banana[red][]" value="え"/>

    <input  type="text" name="grape[1][1][1]" value="あ"/>
    <input  type="text" name="grape[1][1][2]" value="い"/>
    <input  type="text" name="grape[1][2][1]" value="う"/>
    <input  type="text" name="grape[1][2][2]" value="え"/>
    <input  type="text" name="grape[2][1][1]" value="お"/>
    <input  type="text" name="grape[2][1][2]" value="か"/>
    <input  type="text" name="grape[2][2][1]" value="き"/>
    <input  type="text" name="grape[2][2][2]" value="く"/>

    <input  type="text" name="Mango[1][1]" value="1"/>
    <input  type="text" name="Mango[1][2]" value="2"/>
    <input  type="text" name="Mango[2][]" value="3"/>
    <input  type="text" name="Mango[2][]" value="4"/>

    <input  type="checkbox" name="Melon[]" value="Cantaloupe" checked  />
    <input  type="checkbox" name="Melon[]" value="Honeydew" checked />
    <input  type="checkbox" name="Melon[]" value="Watermelon"/>

    <input  type="radio" name="Orange[]" value="Clementine"   />
    <input  type="radio" name="Orange[]" value="Mandarine" checked />
    <input  type="radio" name="Orange[]" value="Tangerine"/>

```


``console.log(req.body);``で出力すると以下の通りになる。

```javascript
{
  sample: '',
  apple: [ 'あ', 'い', 'う' ],
  lemon: [ 'あ', 'い', 'う' ],
  pear: [ 'あ', 'い', 'う' ],
  banana: { blue: [ 'あ', 'い' ], red: [ 'う', 'え' ] },
  grape: [ [ [Array], [Array] ], [ [Array], [Array] ] ],
  Mango: [ [ '1', '2' ], [ '3', '4' ] ],
  Melon: [ 'Cantaloupe', 'Honeydew' ],
  Orange: [ 'Mandarine' ]
}

```

console.logだと深い階層は[Array]表示になるので
``console.log(JSON.stringify(req.body.grape,null,''));``で出力すると
以下の通りになる。

```javascript
[[["あ","い"],["う","え"]],[["お","か"],["き","く"]]]
```
PostgreSQL 15 日本語マニュアルあり〼

PostgreSQL 15 日本語マニュアルは現時点で以下のURLにあり〼
https://pgsql-jp.github.io/jpug-doc/15.0/html/
（現時点ではcurrentにリダイレクトします）

　　　　〜〜終了〜〜

...ではありますが、もう少し説明をします。

PostgreSQL 15.0が2022年10月13日にリリースされました。
PostgreSQLの日本語マニュアルは、従来どおりであればリリースされてから作業を始めて、半年以上先に完了します。
完了したら以下のURLで公開されます： https://www.postgresql.jp/document/　
そのため、完了まで待たれている方もいるかもしれません。

## PostgreSQL 15.0の日本語マニュアルの違い

しかしながら、PostgreSQL 15の日本語マニュアルは、これまでのバージョンと違いほとんど日本語翻訳が入ったバージョンが既に存在します。

https://pgsql-jp.github.io/jpug-doc/15.0/html/

14までのバージョンでも開発の最新版を公開していましたが、15.0の最新版は、これまでのバージョンとは違いがあります。

GitHub Pagesで公開しているバージョンは、以前から英語の原文の後に日本語訳が表示されて、問題があった場合のフィードバックを受け付けるようになっています。

そして最新版は、日本語翻訳の作業中のものを1日毎にビルドして公開しているため、日本語訳が抜けている箇所があります。が、15.0では抜けている箇所はごく一部のみで、ほとんどの箇所では、日本語訳が入っています。

例えば、15.0で新しく追加された[basebackup-to-shell](https://pgsql-jp.github.io/current/html/basebackup-to-shell.html)の項目では、現時点(2022年12月1日）では、以下のような状態になっています。

![Screenshot from 2022-11-27 11-38-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18555/a6565251-7b51-ffa1-79b0-34fad9f22a66.png)

通常のように、日本語翻訳が入っていますが、その頭に`《機械翻訳》`という表記が入っています。これは、人が翻訳したのではなく機械翻訳の訳がそのまま入っています。（※ 機械翻訳は[みんなの自動翻訳＠TexTra](https://mt-auto-minhon-mlt.ucri.jgn-x.jp/)を使用しています。）

また、別のところでは、頭に`《マッチ度[90.786948]》`のような表記が入っている箇所があります。これは、その部分のブロックに英語原文の方に変更が入ったため、日本語翻訳を追随する必要がある箇所が残っていることを表しています。
数字はマッチ度が高ければ、14の文と類似度が高く（％と同じに考えてもらえば良いですが、数値は厳密なものではありません）、変更は少しであることを表しています。逆にマッチ度の数字が少ない場合は、日本語訳が違っている可能性が高くなります。

その他にも翻訳対象となるべき箇所が英語のままになっている箇所が一部あります（例えば、新しく追加された章のタイトルは訳さない方が良い場合があるので人が判断して入れるまで抜けたままになっています）。

これらを前提として https://pgsql-jp.github.io/jpug-doc/15.0/html/ を見てもらえば、PostgreSQL 15の日本語マニュアルとして十分に使えるものになっていると思います。おかしいなと思えば、英語原文をすぐに確認できます。

PostgreSQL 15の翻訳作業は、これらを（またはそれ以外の部分も）、修正していくという工程になっています。
もし、「あれ、ここ違っているな」と思ったらフィードバックをお寄せください。
それは、もう立派な翻訳作業です。
MessagePipeのハンドリング漏れを防止するAnalyzerの導入 [Unity]

`MessagePipe`はとても便利なライブラリですが、Subscribeした際の戻り値である`IDispose`は購読終了時に必ずDisposeする必要があります。

```CS:SampleMonoBehaviour.cs
using System;
using MessagePipe;
using UnityEngine;
using VContainer;

public class SampleMonoBehaviour : MonoBehaviour
{
    [Inject] private ISubscriber<SampleEvent> sampleEventSubscriber;

    private IDisposable disposable;

    private void Start()
    {
        // 戻り値のIDisposableがDisposeされておらず、リークしている
        sampleEventSubscriber.Subscribe(x => Debug.Log(x.Name));

        // このようにハンドリングすることでリークを防ぐことができる
        disposable = sampleEventSubscriber.Subscribe(x => Debug.Log(x.Name));
    }

    private void OnDestroy()
    {
        // 破棄時にDisposeを行う
        disposable?.Dispose();
    }
}
```

しかし、リークしているかどうかを目視()で確認するのは、漏れが発生する危険もありできれば避けたいところです。
幸い、`Cysharp`から公開されている`MessagePipe.Analyzer`というRoslyn Analyzerを活用すればハンドリング漏れをコンパイルエラーとして表示することができ、リークを100%防ぐことができます。
今回はこの`MessagePipe.Analyzer`の導入方法を紹介します。

# 導入

まず、`MessagePipe`のリポジトリのReleaseから、`MessagePipe.Analyzer.dll`をダウンロードしてきます。

https://github.com/Cysharp/MessagePipe

ダウンロードしてきたdllを、`Assets`以下の任意のディレクトリに配置します。

![スクリーンショット 2022-12-20 235157.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987563/bb4290dc-240d-6223-2c59-dd7dbab532ac.png)

配置時点では例外が発生しますが問題ありません。
次にdllの設定をインスペクタ上で次のように変更します。

* **Select platforms for plugins**のチェックをすべて外す
* **Asset Labels**に`RoslynAnalyzer`というタグを追加する

![スクリーンショット 2022-12-20 235519.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987563/652a7fe0-65ad-9946-648f-9608807bc5d7.png)

これで、ハンドリングが漏れている場合にエラーが発生するようになりました。

![スクリーンショット 2022-12-20 235841.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2987563/f77c5a27-60fb-8ae1-49e9-62ce215315be.png)

# 参考

https://tech.cygames.co.jp/archives/3477/
JavaScriptを基礎から/ for文の基礎

現在独学でJavaScriptを学んでおります、実務未経験エンジニアりーたまです。

最近の学習の進捗と本日学習した内容をまとめました。

JavaScriptで初めに学んだのは

https://youtu.be/ig3GosWuKF0

セイト先生の動画です(わかりやすい...!!)
その後本による学習を、と思い
![4815601577-1-468x596.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2854762/475566c8-443a-d738-8bf2-88f7ddf7646a.jpeg)

https://www.sbcr.jp/product/4815601577/


こちらの本を購入。Chapter5まで学習しました(jQueryについては学ぶか迷いとりあえず中断)
こちらもわかりやすくより実践的なテクニックも書いてあります。

でJSprimerを1からやろうと思っていたところに、下記のツイートを発見

https://twitter.com/hideki_climax/status/1604415675069476864?s=20&t=rt2VEy2qAi7KLO_Tn3SWSQ

JSのロードマップ！ふむふむ。
と思い早速いただきました。
小林さん、ありがとうございます。

どちらにせよ基礎は固めないといけないと思いまして

本日は
・JavaScriptPrimer(https://jsprimer.net/)

　演算子
　暗黙的な型変換
　関数と宣言
　文と式
　条件分岐
　ループと反復処理
　オブジェクト

・ドットインストール(https://dotinstall.com/)
　詳解JavaScript基礎文法編

そして最後にロードマップ内にあったハンバーガーメニューを途中までやりました。

本日気になったものの1つ
JavaScriptのfor文を紹介、書き止めておきます。


```javascript

for(let i=1 ; i<10 ; i++){
   console.log(`hello${i}`)
}
```

変数iに1を代入して、10よりその変数が小さければ
条件式(ここではhelloを出力する)を実行し
増分式として変数を1ずつカウントアップしていく。

この書き方には慣れが必要かなと思いました。
あとアロー関数等も...。

というわけで本日はここらへんで。
読んでいただきありがとうございました。
Power BIを久しぶりに触れてみる～箱ひげ編～

## はじめに
この記事は、「Microsoft Power BI Advent Calendar 2022」の20日目の記事です。
https://qiita.com/advent-calendar/2022/powerbi

この記事の情報は2022/12時点のものです。

## この記事では...
今回は普段業務で使用しないけれど、久しぶりにPower BIをいじってみたというものです。
気軽に見ていただければと思います。

## 久しぶりにPowerBIを触ってみると...
ある日、久しぶりにPower BIを開いていじってみると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/8e8adbc1-8835-40ee-bb63-143eeb2926ab.png)

...「AppSourceから」というものを発見。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/0a3e4f5b-1346-5840-d658-70fad4c03b09.png)

<b>AppSource</b>ってなんでしょう。気になってクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/0b97b24d-3156-72ad-2ff3-cf564f835ea0.png)

おお～これはマーケットプレイスのようなものでしょうか。
ちょっと気になったのがこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/4feda7d0-465c-3fcd-72e6-05ea6a41e227.png)
多分、箱ひげ図が書けるやつかな...ということで早速「追加する」を押してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/9fb5cec3-2381-6c55-5918-c07ed136f5f0.png)


## ダウンロードしたものとは
これは「Box and Whisker chart by MAQ Software」というもので、アメリカの企業、MAQ Softwareという企業が出しているものです。
こちらの会社は、PowerBIのパートナーでも有名な企業のようです。
https://maqsoftware.com/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/a00704c5-a27a-b811-5dc7-31363377b52f.png)


## 箱ひげ図

箱ひげ図は統計学では必須の<b>「データのばらつき具合」</b>を図にして示したものです。
詳しくは以下のサイトにわかりやすい説明があるので見てみてください(丸投げではないですよ...はい。)

https://kou.benesse.co.jp/nigate/math/a13m0404.html

https://cacco.co.jp/datascience/blog/statistics/203/

https://bellcurve.jp/statistics/course/5220.html


## 使ってみよう

ある身長のデータを作ってみたので、これを箱ひげ図にしてみよう。
1.「Excelからデータをインポートする」で、データを読み込みましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/1d08fda9-626e-0686-f7c0-4c01bd79075d.png)
Box and Whisker chart by MAQ Softwareのマークを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/1169f808-f609-a177-0172-2d800ef05f93.png)
とりあえずフィールドで値を設定してみると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/0e12be01-09ea-7702-5569-bdf9a0f890e4.png)
おお、できたぞ！
ほかにもいじってみよう。

## 向きを変えてみる
視覚化にある「ビジュアルの書式設定」→Orientationのところから「Vertical」→「Horizonal」を選択すると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/de8e8d63-9a7a-75a9-2fb1-ea7b35f5f96e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/17234d14-de19-60e1-8ec8-e0deead9be9a.png)
おお、できたぞ！

## 色を変えてみる
じゃあ箱の色を変えようかな...この色だと地味だし。
「ビジュアルの書式設定」→Box Optionのところから、「Upper box color」に青、「Lower box color」に明るめの緑を設定してみると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/89d7b3b5-299c-3189-eebf-ca7c0f7e15cd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/f9ddc5ef-6ee0-d0f8-d9b0-4a51403c04f7.png)
できました！
ほかにもX軸、Y軸の値の文字、点(ドット)の色を変えることも可能です。


## まとめ

今回は非常に簡単ですが、箱ひげ図をPower BIで作成してみました。
統計はRPAやAWSの学習でなかなか時間が確保できずにいますが、Power BIを通して少しでも理解が深まればと思います。
最後までお読みいただきありがとうございます！

## 参考URL
BI online 【PB-050-030-C】Power BIで箱ひげ図を作成する手順
https://bi-online.jp/powerbilib/PB-050-030-C
Startup CTO of the year を観覧してきました

駄文になります。
はてなさん、Qiitaさんの座談会でアウトプットしろって言ってたので書いてます。続けていきたいです。

# TL;DR
- たのしかった！
- CTOやっぱ大変そうだけど、意外とよくわからん世界にいる人間ではない
- アウトプットしていこう
- CTO気軽にやってこ

# ABOUT ME
愛知県でノリで独立したフリーランスエンジニアです。
普段は愛知県で一番大きな会社さんの下請けとして、R&Dエンジニアやってたり、スタートアップ企業さんから業務委託をうけてテックリード？なるものをしていたりします。社外CTOだったりもします。

# なぜ参加したか
ノリです。
社外CTOとして参画してるスタートアップ会社さんの一つにこんなのあるんよ！っておすすめされて、ほかの会社のCTOってどんなもんやろ？の軽い気分で参加を決めました。
普段は愛知にいることもあって東京が恋しくて現地参加です。

# 感想
すごかったです。（小並感）
ビジネス課題に対してのアプローチがすごく整理されているな、と感じました。
詳細を語れるほどぼくの理解があるわけではないですが、大変簡単な感想をプログラムごとに書いていきます。

ちなみに懇親会含め、登壇者の方とは一切お話をしておりません。（他の方と喋ってたら終わってた）

## FastLabel 恋塚さん
えー…………、大変申し訳ございません。遅刻したため、ピッチほぼ見れておりません。。。
違うねん、充電がなくてな、、、カフェで充電しながら仕事しててな、、、仕事してたら捗っちゃって、、、、、、

Sagemakerを活用されてる事例を久々に聞きました。取引先でも活用している会社さんはあるのですが、チームビルディングにも活かしている例は中々見たことがなかったので、そういう使い方もあるよねーとなりました。
（AzureMLではいけない理由もあれば聞いてみたいです）

コスト管理聞きそこねました。sagemakerってほぼIaaSみたいなものだから高いイメージあるんですが、どう運用されてるんだろう、、、

## テックタッチ 日比野さん
ブラウザの拡張機能として、他社SaaSの補助をするというおもしろいサービスだな、と感じました。プロダクトに関して一番印象に残ってます。
技術負債解消のために1年間費やしてフルスクラッチしたスタートアップって中々ないんじゃなかろうか。
実際SaaSは十全に活用されてないことが往々にしてあるのでこういうのあると助かるな、を体現してくれてるサービスだと思いました。

## ログラス 坂本さん
スタートアップってそうだよね、と思い出させてくれました。
課題の深掘りが徹底的で感動しました。結果gitじゃんになったのは草です。
そのあとのプロダクト開発スピードも凄まじかったですが、やはりスタートアップとしての顧客課題への向き合い方がとても参考になりました。


## FLUX リィさん
まずはじめに、
W3C正会員は聞いてない！
ほんっとうにアカデミックな一面が目立つ方だったなと思います。
CTO初めてでエンジニアも初めてとのことでしたが、経歴が特殊すぎて参考にならないとまでは言わないけど、非常に稀有な例だなと感じます。
エンジニアの探し方として「リファラルで人を捕まえる」が理想に近い形になってる中で、「自分がスピーカーする場所で探しに行く」は新しい形であり、アカデミックな面を持つリィさんならではの探し方だと思いました。

## スマートラウンド 小山さん
CTO of the year受賞おめでとうございます！
質疑応答でユーザが多かったのおもろかったです。
正直、起業したことない人間なので、どこまでの価値があるかが十分にわかってないのですが、それでも魅力的に感じるプロダクトでした。
というか、ぼくはなんとなくすでにそういったプロダクトあるのかと思ってました。VCさんとか投資家さんって意外と風土古めなんですかね？

エンジニア募集中らしいです。ぼくはKotlinわからないのでちょっとだめっぽい。

## ナレッジワーク まやさん
振り返って公式のプログラム見るまで名前しか思い出せませんでした。
チームビルディングがすっごい理想形だと感じました。
PO、デザイナー、フロントエンド、バックエンド、この形で分けるのは言うのは簡単だけど組むのけっこう大変だったんじゃないかなと思ったりしてます。（前提としてのお金結構かかりそうだし、、、）
POがCEOでも破綻しなかった例としてすごく参考になったと思います。POだけどデザイナーさんの権力のが強かったりするんかなとか思ったり。

## はてな×Qiita CEO座談会
この記事を書いている理由です。
Qiitaの創業者の方がはてなのインターン行ってたとか、そのとき同じチームに当時エンジニアの現はてなCEOがいたとか、社会せま！？となりました。いや、だからこそ似て非なる2つのサービスがあるのかもとも思うのですが。
やっぱ聞いててアウトプットって大事だなと感じました。
あとQiitaの柴田さんが言ってた「会社員として行ってた業務でアウトプットとして出してセーフかアウトかわからない」はめちゃめちゃあると思います。それで蓋してる人もたくさんいると思います。（ぼくもそうだったりする）

## なぜ経営と技術の融合が(etc.
めちゃめちゃふわふわとした議論で盛り上がってましたが、印象に残ったものとしては、

- 10年後も同じ形で存続しているとは思ってない
- 経営と技術は分けて考えるものではない
- AIはリアルの拡張

あたりですね。
特にAIに関してはChatGPTで大盛り上がりしてましたが、それで一番影響がありそうな一休の榊代表がポジティブな捉え方をしてたのが印象的でした。
アートなどの芸術分野は残ってくだろうなと思ってましたが、五感で感じる体験の重要性やAIによって気付かされる未来があるかもなど、想像が膨らむ時間でした。

## 忘年会
楽しかった！！！

# 最後に
これ書き始めたの新幹線乗り始めで、書き終わったらちょうど名古屋なんですけどすごくないですか！？
趣味･初心者･使い捨てのコードと重要な業務で長く使うコードの違い

クリティカルなある機能(外部システム連携）を実装して､完成後に､コードを眺めていて感じたこと｡

｢機能そのもの（=実現したいこと）のコードが短い･･･｡｣

それを思ったコードは以下のような感じ

- アクセス権限をチェックする
- 入力値をチェックする｡不正だった場合､ごにょごにょ
    - CSRFとかよくあるチェックはフレームワークがやってくれる
- Transactionで囲む
- 例外処理で囲む
    - ごにょごにょ
    - リトライ処理対象として記録
    - パラメタやスタックトレース収集して､関係者に通知(Eメール､LINE､Slack) ※ここではないけど電話自動Callすることも
- ★`実現したいこと`★ ← これだけ!!
- 操作履歴を記録する
    - 更新系であれば変更前と後の差分を記録する
- ログを出力する

さらに､､､

- 性能最適化のために｢キャッシュ｣利用
- 保守性を考えて
    - メソッドを移動させたり
    - 集約したり
    - 定数化したり
    - システム設定化して管理サイトからON/OFFできるようにしたり

プロとして､やって当たり前のことではあるけど､疲れる･･･｡

20年前に学習はじめた時に､こんなコードの記述を強要されたら､心折れただろうな｡と思いました｡
USB-MIDIコンをArduinoで自作した

# なぜ自作するのか

VDMXで使ういい感じのMIDIコントローラーがないので自作することにした。
最近MIDIコンを自作するVJが多い、流行ってるんか？

欲しい機能は
 - 単純なボタンが碁盤状に並んでいること
 - 無限に回るツマミがほしい

# VDMXって何？

スクリーンに自由自在に映像プレゼンテーションするためのアプリ
例えば結婚式や、DJやライブの音楽イベント、学園祭で映像の演出をするのに使われるアプリ
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588661/fb22304c-a1c9-87e0-9f33-a2452dc363a7.png)

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

https://vidvox.net/

# MIDIコン自作の情報

## ともかく情報収集

ロータリーエンコーダ
　無限にクルクル回るツマミを作るための部品

https://qiita.com/Ninagawa_Izumi/items/d2792b10c4860d41a88a


内部プルアップ抵抗

https://mag.switch-science.com/2013/05/23/input_pullup/


USB MIDI

https://ryokosaka.com/blog/201115_0.html


Keypad

https://novicengineering.com/arduino%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E3%83%86%E3%83%B3%E3%82%AD%E3%83%BC%E3%83%91%E3%83%83%E3%83%89%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/

## USB機器を作るにはleonardoを使う
MIDIコンのようなUSB機器を作るには、Arduinoはunoではなくleonardoを使う。その方が手間が少ない。
Arduino unoは2つチップを搭載していて、USBに使われてる方のチップのファームウェアを書き換える必要があるが、leonardoなら1チップなのでファームウェア書き換えが不要。
![unoとleonardo比較](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588661/5fa8c84b-da20-80cf-cbed-ecd155bcc4c6.png)

# 材料
- Arduino leonardo
- ロータリーエンコーダー
- 押しボタンスイッチ

# 材料をつなぐ
やりたいことはいろいろあるが、まずは調べた情報通りに作ってみる


押しボタンスイッチはGNDと4につなぐ
エンコーダーのAを5, Bを6に, CをGNDにつなぐ
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588661/1522daa8-708a-19dc-1f32-ad6266429e13.png)




# ひらってきたArduinoコード

まずArduino IDEでこのライブラリを追加
- [TimerOne](https://www.arduino.cc/reference/en/libraries/timerone/)
- [Encoder](https://www.arduino.cc/reference/en/libraries/encoder/)
- [USB-MIDI](https://www.arduino.cc/reference/en/libraries/usb-midi/)

ひらってきたコードをIDEにコピペ
そしてArduinoに書き込む

```cpp:SwitchAndEncoder_MIDI.ino
#include <TimerOne.h>
#include <Encoder.h>
#include <USB-MIDI.h>
USBMIDI_CREATE_DEFAULT_INSTANCE();

#define OFF 0
#define ON 1
#define SW_PIN 4
#define ENC_PIN1 5
#define ENC_PIN2 6

Encoder myEnc(ENC_PIN1, ENC_PIN2);
volatile long oldPosition  = -999;
volatile long newPosition  = 0;
int TOGGLE = OFF;

void RotEnc() {
  newPosition = myEnc.read();
}

void setup() {
  pinMode( SW_PIN, INPUT_PULLUP);
  pinMode(ENC_PIN1, INPUT_PULLUP);
  pinMode(ENC_PIN2, INPUT_PULLUP);
  MIDI.begin(10);
  Timer1.initialize(500); //500μs(マイクロ秒)で設定
  Timer1.attachInterrupt(RotEnc);
}

void loop() {

  if(digitalRead( SW_PIN ) == HIGH && TOGGLE == ON ){
    TOGGLE = OFF;
    MIDI.sendNoteOn(36, 100, 10);
  }else if(digitalRead( SW_PIN ) == LOW && TOGGLE == OFF ){
    TOGGLE = ON;
    MIDI.sendNoteOff(36, 0, 10);
  }

  if (newPosition > oldPosition) {
    oldPosition = newPosition;
    MIDI.sendNrpnIncrement(67, 1);
  }else if(newPosition < oldPosition ){
    oldPosition = newPosition;
    MIDI.sendNrpnIncrement(61, 1);
  }

}
```

# VDMXでMIDIコンを設定する

さっそく作ったMIDIコンをVDMXで使えるように設定する
設定のやり方はこちら

https://saikuro0526.hatenablog.com/entry/2015/11/24/060120

とりあえず上の要領で設定したら、ロータリーエンコーダー(無限に回るツマミ)の設定を変える
ロータリーエンコーダーをアサインしたUIを選択して、UI InspectorでEndless MIDI Modeで64-0/65-127を選択する
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588661/1092bd3a-90c0-2155-8471-bf86b27c589b.png)