OmniAICreator/Qiita-1.07M huggingface dataset:
技術者のための計算問題（ソフトウェア編）

#技術者のための計算問題（ソフトウェア編）

個人的に計算問題をまとめてみました。

##10進数、16進数、2進数
次の式が成立するとき、
10進数の5.125　+ 16進数のｘ = 2進数の110010.101
が成立するとき、16進数のxはいくらか。

＜答え＞
2D.8

＜解説＞
(1) 10進数で統一して、xをもとめる
   ｘ = 50.625 - 5.125 =　45.5
(2) (1)で求めたｘを16進数にする
10進数の45　= 16進数の2D、 10進数の0.5 = 16進数の0.8より、
10進数の45.5 = 16進数の2D.8


##伝送時間
1.44メガバイトのデータを48kbpsの回線で転送したとき、
転送時間は300秒であった。
回線の伝送効率は何%か。

＜答え＞
80%

＜解説＞
(1) ビットに統一する
　　1.44メガバイト = 1.44 * 8 * $10^6$ ビット
(2) 理想の時間tを求める
　　(1.44 * 8 * $10^6$) / (4.8 * $10^3$) = 240 秒　
(3) 伝送効率を求める　
　　(240 / 300) * 100 = 80%　


##ブール代数
次の式をの式を簡単化せよ。
$ \overline{(A + B)}・C + B・C + \overline{A}・\overline{B}・\overline{C} $

＜答え＞
$ \overline{A}・\overline{B} + B・C $

＜解説＞
(1) ド・モルガンの法則も用い、単純積の和の形に変形する。
$\overline{(A + B)}・C + B・C + \overline{A}・ \overline{B}・\overline{C} $
$= \overline{A}・\overline{B}・C + B・C + \overline{A}・ \overline{B}・\overline{C}$

(2) カルノー図を使って、簡略化すればよい。


##MIPS
400MIPS、3CPIのコンピュータがある。
クロック周波数は何Hzか。

＜答＞
1200 MHz または　1.2 GHz

＜解説＞
(1) 1命令の時間tを求める
   　t = 1 / (400 * $10^6$) s =  2.5 ns
(2) 1マシンサイクルの時間Tを求める
   T = t / 3 = (2.5 / 3) ns
(3) クロック周波数ｆを求める
  f  = 1 / T [Hz] = 1 / ((2.5 / 3) * $ 10^{-9} $) 
   = 1200 MHz
	  
	  
##システムの稼働率
ある通信回線の稼働率は0.9であった。
別の回線を追加して通信回線の二重化を行ったところ、
稼働率が0.999となった。
追加した回線の稼働率Aはいくらか。

＜答え＞
0.99

＜解説＞
(1)　稼働率Aを使って、式を立てる
　　 1 - (1 - 0.9) * (1 - A) = 0.999
(2)　稼働率Aを求める
　　(1 - 0.9) * (1 - A) = 1 - 0.999
　　1000 * {(1 - 0.9) * (1 - A)} = 1000 * {1 - 0.999}
  (1000 - 900)(1-A) = 1000 - 999
   100 (1-A) = 1
  100 - 100A = 1
   100A = 100 - 1 = 99
    A = 99/100 = 0.99
   

##アドレス空間
アドレスバスのビット長が23ビットのとき、
1番地=１バイトとして、アドレス空間は何メガバイト分あるか。  
ただし、2の常用対数は0.3とする。

＜答え＞
8MB

＜解説＞
（1）2の常用対数は0.3 より
　　　$10^{0.3}$ = 2
（2）10進数で考え、次の式を立てる
      $10^x　= 2^{23}$
（3）(1)の両辺の常用対数をとる
　　$ log_{10} (10^x) = log_{10} (2^{23}) $
　　$ x = 23 * log_{10} (2) = 23 * 0.3 = 6.9 $
（4）$10^x$を求める
　$10^x=10^{6.9} = 10^{0.3*3+6}$
    = $(10^{0.3})^3 * 10^6$
    = $2^3 * 10^6= 8 * 10^6$ = 8 [MB]


##ビット操作
C言語において、unsigned charで宣言された変数ｘがある。 
変数ｘの1が立っている最も右のビットだけ抽出したい。
どういうビット操作をすればいいか。

＜答え＞
x & (-x) または (x ^ (x - 1)) & x


##2の補数
8ビット固定で考える。
10進数の36にある値ｘを加算したら、
結果が符号なしで10進数の208であった。

結果を負数とみなすと、マイナスいくらとみなせるか。
また、ｘは16進数でいくらか。

ただし、負数は2の補数で考えるものとする。

＜答え＞
結果 = -48
x   = $ (AC)_{16} $

＜解説＞
(1) 208 - 36 =  172
(2) 256 - 172 = 48
   したがって、-48
(3) 10進数の172 = 16進数のAC
未経験からSESに転職した2021年を振り返る

今年ももう大晦日ですね。

私は今年からエンジニアになりました。
SES・受託開発の企業で、現在はSESとして案件に参画しています。

どちらかというとネガティブなイメージが強いSESですが、
どんな一年だったかを振り返ってみようと思います。

これから未経験からエンジニア転職する際の何か参考になると嬉しいです。


# 結論、めっちゃ楽しい1年だった

ありがたいことに、開発させてもらってます。
チケットから仕様を理解して開発させてもらってます。

その反面悩みすぎて少し仕事をお休みしたり、とても辛い部分も大きかったです。

ざっくりこんな一年でした。

##### 1月
通っていたスクールを卒業した🎉

転職活動が本格化

書類選考落ちや、返答すらないがほとんどだった

##### 2月

引き続き就活
Twitterで現職のCEOからお誘いもらい、面接に進んだ
面接を経て、内定をいただいた。

企業はこんな感じ↓

- 10人規模のベンチャー
- SES・受託開発
- フルリモート（案件先に端末取りに行くとか、必要なこと以外まじで出社してない）
- CEO CTOがいて、二人ともエンジニア

##### 3月

現職に進むことを決めた

vueのキャッチアップをしておくと良いかもと共有があったので、
Udemy講座を買ってみた

##### 4月

エンジニアとして働き出した🎉
受託の案件に携わることになった

右も左も分からない状態で、ポートフォリオ作ってた時当たり前にやってたこと（ブランチ切るとかプルリク出すとか）すら
ドキドキした

（結果、全く関係ないブランチにプルリクを出し、エンジニアライフ初のプルリクはヤンキープルリクと命名されることになった）

vueは2週間くらい触った程度だけど、「あ、全然行けますよ感」出して話してたらフロント側にアサインとなった（これは今でも良かったと思ってる）

やれることが少なく、とにかくタスクは貪欲に取りに行った（cssの修正とか）

##### 5月
css修正や、ロジックのバグ回収をひたすらやった気がする

mapとかfilterをちょこちょこ触り始める

先方への進捗共有をしだしたようなしてないような

##### 6月

ひたすら画面の修正した。

paizaのCランクが解けなくて焦り、paizaを始めた

emit propとかwatchとか、vueのお作法にちょっとずつ慣れてった

動的な配列操作ができてアガッた覚えがある

nuxt完全に理解したみたいな感じになった

##### 7月

正社員となった🎉

主にRailsとNuxtを使用している案件にSESで参画することになった。担当はフロントもバックエンドも両方
（しかもフロントバックエンドどちらもテストコードを書いてた）

やった！！フロントタスクや！！あ、Jest書いたことなかった😇はめっちゃ覚えてる
フロント側のテストは書き方がわからず、かなり苦戦した

初めてpaizaB解けた🎉

##### 8月

引き続き緊張してたなあ、
案件先の人とどう接したらいいかわからなくて、ちょこちょこ悩んでいった
このくらいのことは知ってて当然なんじゃないかとか、聞いてもいいことなのだろうかとか
いろいろ悩みがあった

期日マストと言われたタスクが期限内に完成せず、とても申し訳ない気持ちに襲われた
代わりに指示されたタスクもうまくこなせず、どんどん思い詰めて行った

テストが書けなくて悩んでたところ、テスタビリティについて知り、コードの書き方がかなり変わった
そこからテストが書きやすくなっていき、システムの改修しやすさを気にするようになった

##### 9月
**結果、病んだ**（今だからこう書けるけど、当時はデスクの前にも座れず、何も考えられなかった）

少しお休みをいただき、仕事から離れた
落ち着いてからいろいろ振り返ってみた

- 仲間ではないと思い込んでただけで、壁を作っていたのは自分だったと気づいた
- 歴ある人でもそこそこ自分が聞くか迷うレベルのことを聞いてたことに気づいた。（すんません、めちゃくちゃお恥ずかしい質問なのですが、、、←これ最強）
- 圧倒的に会話が少なかった。（当時はデイリーの報告程度の会話しかなく、雑談のような日常会話がなかった）

上記に気づいたあたりから少しずつ先方と打ち解けていったような気がする

##### 10月

現場で役立つシステム設計見て、db設計について少し学ぶ。案件先のバックエンドもそうなってることに感動した

この辺から先方への抵抗は無くなってた

SESとして参画するから、何らかの形でプロパー以上にギブする方が良さそうと思い出した（技術に限らずコミュニケーションとかでも）

デイリーでちょっとずつ自分のユーモアをだして、案件先の人が笑ってくれるようになった

##### 11月

参画先から評価をいただく機会があった。
結果、名指しでとても助かっていますという評価をいただけた。（これはめちゃくちゃ嬉しくてスクショ撮った）

そして、案件先の新しいプロジェクトに参画することになった

##### 12月

新しいプロジェクトの画面構成から、仕様を検討したり、引き続き前のプロジェクトのタスクをやってます。


# 開発できるかどうか、これを大事にしてほしい

こんな感じの一年でした。

実は転職活動開始時、自社開発に入りたいなという風に思ってました。
（Twitterとかで活躍されてる方はなんとなくですが、自社開発のイメージがあったし、やっぱりかっこいいよなと）
いわゆる「見栄」を張りたかったのです。

ですが、別のエンジニアコミュニティの飲み会とかで話を聞いていると、自社開発だってレガシーな技術のところもあるし、
SESだってモダンな技術で開発できるとこはあるという話を聞くことがありました。

そこから、何系の企業に入った！！ということより、開発できる企業に入った！！ことが大事なんじゃないかと思いました。

結果として、SES・受託系の企業に入りましたが、開発できた1年で私はとても満足しています。
少し下世話な話、未経験時代に落ちた企業さんからもスカウトをいただいたりと、ちょっとずつお話をいただくようになりました。


# フルリモートだって、デメリットがある

会話量は減ることが1番のデメリットかなと思ってます。
もちろん、苦にならない方もいらっしゃると思いますが、私にとっては溜め込みやすく孤独感を覚えやすかったなと思います。

他の会社でもフルリモートでは雑談の機会を設けるところはあるようで、私もSlackのハドル機能を使って同僚の方と会話しながら開発したりしています。

これだけでも結構気持ちは楽になるので、ハドルでたわいもない雑談することは結構おすすめです。
（なにより、ハドルのボタンクリックだけで会話できる手軽さがめっちゃいい）

# 最後に
いつ振り返ってもエンジニアになって良かったと思うくらい、エンジニアは楽しいです。
（その分めっちゃ大変だけど）
Amplifyにはフロント機能とバックエンド機能の２つがある

Amplifyを最初に勉強する時に勘違いしていた事実あって、明らかに時間の浪費をしたのでここにメモる

チュートリアルなんかで　ReactとかAngularプロジェクトなどからAmplifyに接続するお手本が多いが、たいていはフロントエンドのプロジェクト内で amplify initしている

てっきりフロントエンド側環境に amplify initして、環境を作らなければならないような錯覚に陥るんだけどそうじゃないです

amplifyには　フロントサイドとバックエンドサイド機能があって、全く構造が異なります。

フロントサイドは　package.jsonに　aws-amplify, aws-amplify-reactなどのようなパッケージを組み込んで、あくまでフロントエンド側の機能の一部として使います。

なので　amplify initは不要です。
つまりフロントエンドのプロジェクト内にamplifyフォルダ自体が不要なんです。

もちろん例外はあって、フロントエンド側を amplify publish使ってホスティングまでしたい場合はamplifyのバックエンド機能が必要となります。ただしホスティング機能のみ追加でOK

具体的には以下のコマンドのみ必要（完了までいろいろ聞かれるが割愛）

```
＄amplify init
$amplify add hosting
```

ホスティング機能だけのamplifyバックエンドがあればいいんです。


実際のAppsyncとかDB定義とかS3設定は別のバックエンド専用のプロジェクトを作って、その中で設定する。

じゃあ、バックエンド側の変更をフロント側に伝えるにはどうすればいいのかという話ですが、基本は　src/aws-export.js　src/API.ts src/graphql/フォルダ配下を共有すればいいと思います。

※共有ということはバックエンド側でこのソースを作ってやる必要があリます
※TypeScriptの場合です。iOSとかAndroidとかはまた別のファイル名になります。
※dev,stg,prodなどの複数環境で同一コードを利用するために　aws-export.js　はファイルサーバなどで管理し、それ以外はgitに入れてしまう運用をします。

graphql経由でlamda関数にアクセスし、そこでS3操作や、メール送信、SNSなどを実装してしまえば、上記graphql周りのコード共有だけで完結します。


なおgitを使わない方法もあって、もしamplify initをフロント側で実行してるなら以下のコマンドで、
バックエンド側のファイルをクラウド経由で持って来れます

```
$rm .graphqlconfig.yml
$amplify add codegen --apiId <AppsyncのAPI ID>
```

これを使うだけのためにamplify initをしてもいいかもしれないですが、amplify initするとクラウド側にそのAmplifyプロジェクトが生まれてしまうので注意が必要です。

正直git経由の運用は手間はかかるのですが、フロントエンドエンジニアにAmplifyのバックエンドを意識させたくないとか、余計なAmplifyプロジェクトを作りたくない場合はgit経由が良いと思います。
例えばamplify initするにはAWSのアクセスキーやシークレットキーが必要になるのですが、フロント作成は外注で教えたくないケースもあるかもしれません。

逆にフロント側作成も社内メンバーで、風通しが良い関係なら後者の方が良いと思います。「使ってないフロント専用のAmplifyプロジェクト見つけたら消すからね！」で通じる関係値ですね。

いずれにせよシンプルさを考えればAmplifyプロジェクトをバックエンド専用として分離してしまうのが得策だと思います。
Sidekiq

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102896/bfa84be9-030b-f5eb-e8d4-0009ec928d39.png)

Sidekiq は server プロセス起動時に Rails app を boot して、スレッドを作成する。
各スレッドが Redis から job を dequeue して、job を実行する。

### `bundle exec sidekiq`
bin/sidekiq の中で

- `CLI.run`

.https://github.com/mperham/sidekiq/blob/4d0084569c609fa63303d8bfa60f5279930ee353/bin/sidekiq#L26-L31

### `CLI.run`
- Rails アプリケーションを boot
  - (オプションで指定しなければ現在のディレクトリの) config/environment.rb を読み込む
- `Launcher` を `new` して `run`

https://github.com/mperham/sidekiq/blob/4d0084569c609fa63303d8bfa60f5279930ee353/lib/sidekiq/cli.rb#L37
https://github.com/mperham/sidekiq/blob/4d0084569c609fa63303d8bfa60f5279930ee353/lib/sidekiq/cli.rb#L273

.https://github.com/mperham/sidekiq/blob/4d0084569c609fa63303d8bfa60f5279930ee353/lib/sidekiq/cli.rb#L105-L116


### `Launcher#run`
- `Manager#start`

.https://github.com/mperham/sidekiq/blob/4d0084569c609fa63303d8bfa60f5279930ee353/lib/sidekiq/launcher.rb#L35


### `Manager#start`

`Manager` は `Processor` の管理（作成、死んだら新しいのを作る、シャットダウン）を行う。

- 初期化時に、指定された並列数分だけの `Processor` を作成
- `#start` で `Processor` を `start`

.https://github.com/mperham/sidekiq/blob/4d0084569c609fa63303d8bfa60f5279930ee353/lib/sidekiq/manager.rb#L32-L47

### `Processor#start`

スレッド上で Redis からジョブを逐次取ってきて実行する。

- `Thread.new` して `run`
- `run`
  - Redis からジョブを fetch
  - ジョブを実行 (job class をインスタンス化して、perform を呼ぶ)


https://github.com/mperham/sidekiq/blob/4d0084569c609fa63303d8bfa60f5279930ee353/lib/sidekiq/processor.rb#L67-L80
https://github.com/mperham/sidekiq/blob/4d0084569c609fa63303d8bfa60f5279930ee353/lib/sidekiq/processor.rb#L162-L166
https://github.com/mperham/sidekiq/blob/4d0084569c609fa63303d8bfa60f5279930ee353/lib/sidekiq/processor.rb#L132-L133
https://github.com/mperham/sidekiq/blob/4d0084569c609fa63303d8bfa60f5279930ee353/lib/sidekiq/processor.rb#L195-L197
【Project Euler】Problem 2: 偶数のフィボナッチ数

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 ２： 偶数のフィボナッチ数

原文 [Problem 2: Even Fibonacci numbers](https://projecteuler.net/problem=2)

**問題の要約：$4 \times 10^6$**以下の偶数のフィボナッチ数の合計を求めよ**

素直にインプリすると以下のようになります。数列を見ると偶数は３個置きに現れるので、間の２個をスキップするようなインプリも考えられますが、まずはシンプルなコードということで。

```python
f = f1 = f2 = 1
esum = 0
while f < 4*10**6:
    if (f % 2) == 0:
      esum += f
    f = f1+f2
    f2 = f1
    f1 = f
print(f"Answer: {esum}")
# Answer: 4613732
```


ただフィボナッチ数は今後も度々登場するのでpythonのyieldを使ってフィボナッチ数のgeneratorを作りました。引数に上限を指定するとfor分のiteratorとして使えます。リストの内包表記を使うとかなり短く書くことが出来ました。

```python
# Fibonacci number generator
def fibgen(bound=0):
  f = f1 = f2 = 1
  yield f
  while bound == 0 or f <= bound:
    yield f
    f = f1+f2
    f2 = f1
    f1 = f

fib = fibgen(4*10**6)
print(f"Answer: {sum([i for i in fib if i%2==0])}")
# Answer: 4613732
```
（開発環境： Google Colab）
CentOS-7.9にMateで日本語環境

Mateをインストール

```
$ sudo yum install epel-release
$ sudo yum groupinstall "MATE Desktop"
```

※ ここで、一度再起動して Mate を選択してログインし直します。

Anthyをインストール

```
$ sudo yum install ibus-anthy
```

日本語キーボードを設定

```
$ localectl set-keymap jp106
```

Windowsキーがある場合は、以下を設定

```
$ localectl set-keymap jp-OADG109A
```

設定を確認

```
$ localectl
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp-OADG109A
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp
```

~/.bashrc に以下を追記

```
export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
ibus-daemon -drx
```

ログインし直すと、日本語が入力できるようになっているはず。
DL380 と Raspberry Pi 4B の消費電力メモ

おっとさんの情報によれば、私もよく知っている HL ProLiant DL380 G4 の消費電力は、

- 電源 OFF 時で 17W
- アイドル時で 230W
- CPUとメモリに負荷を与えたときに 420W
- さらにHDDに負荷を与えたときに 454W

なのだそうです。

Raspberry Pi 4B を運用する場合、

- アイドル時で 2W
- HDD を接続して負荷も与えている場合に 5W を少し超える

という感じでした。

Raspberry Pi 4B を数台程度回しているときの消費電力は、 DL380 を電源オフしている時の消費電力とだいたい同じ、ということになります。
OSGeoLiveの近況と今後について

この記事は、[FOSS4G Advent Calendar 2021](https://qiita.com/advent-calendar/2021/foss4g) の25日目の内容になります。
(が、昨年に続き、投稿が大幅に遅れてしまって申し訳ないです...。)

# はじめに

昨年は、「[OmegaTでのOSGeoLiveドキュメント翻訳について](https://qiita.com/sanak/items/4ca1f7a6677056269f7d)」というタイトルで、OSGeoLiveドキュメントの日本語翻訳箇所を中心に取り上げましたが、今年はOSGeoLiveプロジェクト全体の近況について記載します。

OSGeoLiveそのものについては、昨年の記事中、「[OSGeoLiveとは](https://qiita.com/sanak/items/4ca1f7a6677056269f7d#osgeolive-%E3%81%A8%E3%81%AF)」でも取り上げてますので、そちらを参照ください。

# FOSS4G 2021 Buenos Aires

昨年の [FOSS4G 2020 Calgary](https://2020.foss4g.org/) は、COVID-19の影響で残念ながらキャンセルになったんですが、今年の [FOSS4G 2021 Buenos Aires](https://2021.foss4g.org/) はオンラインでの開催となりました。

OSGeoLiveプロジェクトの報告は日本時間の2021/09/29(水) 22:30から配信され、以下のYouTube動画リンクからも視聴することができます。

_FOSS4G - OSGeoLive project report_
<iframe width="560" height="315" src="https://www.youtube.com/embed/IaBc_WBjU6w" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

ちなみに、FOSS4G 2021 Buenos Aires全体のYouTube動画リストは以下で公開されています。
[FOSS4G 2021 Argentina - YouTube](https://www.youtube.com/playlist?list=PLqa06jy1NEM3PI3eQGemUgEmKS5oHAw7B)
全体スケジュールは以下にありますので、検索して良さげのがあれば是非視聴してみてください。
https://2021.foss4g.org/schedule/outline.html

## OSGeoLive14で新しくなったところ

動画の[7:39](https://youtu.be/IaBc_WBjU6w?t=459)辺りから触れられていますが、Lubuntuでデスクトップ環境がLXDEからLXQtに変更されたことへの追随の他、データサイエンス関連のPythonモジュール(pandas, Jupyterなど)の追加などがあるようです。動作検証を行うテスターが足りないので、募集中とのことでした。
![osgeolive10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104365/a4fb615e-3d49-e9ed-5952-6393148025a9.png)
![osgeolive11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104365/05ef131d-faa5-f146-e002-88724de20d64.png)
![osgeolive13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104365/42cd156a-98b1-cedf-b6cd-9af18f0fa63f.png)

## 今後のロードマップ

今後は来年8月22-28日開催の[FOSS4G 2022 Firenze](https://2022.foss4g.org/)に向け、来年4月のLubuntu 22.04 LTSリリースをベースとした、OSGeoLive15のリリースが中心となりそうです。
![osgeolive14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104365/9d507f95-6bbb-f72d-26b4-ccf9eb248ea8.png)

その他、地理情報関連の用語の標準化を目指す[Lexicon Committee](https://wiki.osgeo.org/wiki/Lexicon_Committee)なるものがあるようで、そちらとも連携を行っていくようです。

質問タイムで[MapLibre.js](https://github.com/maplibre/maplibre-gl-js)などのベクトルタイルが次期リリースに含まれないか質問してみたところ、メンテナーがいて、インストーラとクイックスタート・オーバービュードキュメントを用意できれば、大丈夫とのことでした。
![osgeolive04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104365/e2447511-ea80-a43d-e965-34fd96026bbb.png)

後から[OSGeoLiveのTrac](https://trac.osgeo.org/osgeolive)を確認したところ、5年ほど前からチケットが切られているものの、[t-rex](https://github.com/t-rex-tileserver/t-rex)追加後にあまり更新がないようでした。
[#1881 (Vector Tiles additions) – OSGeoLive](https://trac.osgeo.org/osgeolive/ticket/1881)

コードスプリントに少し参加した際に聞いたところ、メンテナーは該当プロジェクトの開発者でなくても良いとのことでしたので、私も時間がある時にベクトルタイル関係の学習がてらにでも、少しコントリビュートできればと思います。

# おわりに

以上、簡単にOSGeoLiveの近況と今後について記載しました。

私の方は、これまで、あまりOSGeoLive本体の構成のことは考えてこれてなかったのですが、来年は本体のビルドとかコントリビュートとかに挑戦していければと思っていますので、よろしくお願いします。

それでは、良いお年を！
Julia: Genie の使いかた

Julia のフレームワークである Genie の使い方です。
次のページを参考にしました。
[https://genieframework.github.io/Genie.jl/dev/tutorials/4--Developing_Web_Services.html](https://genieframework.github.io/Genie.jl/dev/tutorials/4--Developing_Web_Services.html)

#プロジェクトの作成#
>example01 というプロジェクトを作成します。

```text
julia> using Genie
julia> Genie.Generator.newapp_webservice("example01")
```

次のフォルダー構造が作成されます。

```text
$ tree -L 1 example01/
example01/
├── bin
├── bootstrap.jl
├── config
├── Manifest.toml
├── Project.toml
├── public
├── routes.jl
├── src
└── test
```

#サーバーの実行#

```bash
cd example01
bin/server
```

```text
$ bin/server 

 _____         _
|   __|___ ___|_|___
|  |  | -_|   | | -_|
|_____|___|_|_|_|___|

| Web: https://genieframework.com
| GitHub: https://github.com/genieframework/Genie.jl
| Docs: https://genieframework.github.io/Genie.jl/dev
| Gitter: https://gitter.im/essenciary/Genie.jl
| Twitter: https://twitter.com/GenieMVC

Active env: DEV


Ready! 

┌ Info: 2021-12-31 13:51:48 
└ Web Server starting at http://127.0.0.1:8000 - press Ctrl/Cmd+C to stop the server. 
```

クライアントで
[http://127.0.0.1:8000](http://127.0.0.1:8000)
　にアクセスします。
![genie_aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/fc41fbca-5065-2309-cae7-ba68e8e2bc7d.png)

#機能の追加#

routes.jl を改造します。

```julia:routes.jl
using Genie.Router

route("/") do
  serve_static_file("welcome.html")
end

route("/morning") do
  "おはよう"
end

route("/afternoon") do
  "こんにちは"
end

route("/evening") do
  "今晩は"
end
```

クライアントでアクセス

```text
$ http http://127.0.0.1:8000/morning
HTTP/1.1 200 OK
Content-Type: */*
Server: Genie/Julia/1.7.1
Transfer-Encoding: chunked

おはよう
```

```text
$ http http://127.0.0.1:8000/afternoon
HTTP/1.1 200 OK
Content-Type: */*
Server: Genie/Julia/1.7.1
Transfer-Encoding: chunked

こんにちは
```

```text
$ http http://127.0.0.1:8000/evening
HTTP/1.1 200 OK
Content-Type: */*
Server: Genie/Julia/1.7.1
Transfer-Encoding: chunked

今晩は
```
【R】Tidyverse を使わないでクロス集計表を作る（パート2）

【R】Tidyverseの関数群でクロス集計表を作る
https://qiita.com/eitsupi/items/942d913e7b98e853a36b

の後半の仕様がはっきりしなかったので，引用先を見てプログラムを書いた。
呪文のような tidyverse よりは，なにをやっているかわかりやすいか（プログラムがわかるという前提ではあるが）。

3 行目の m の値を変えれば何位までであっても汎用できる。

```R 
> system.time({
+ df = as.matrix(read.csv("sampledatacross2.csv")[, -1])
+ tbl = t(df) %*% df
+ m = 5
+ pair = matrix(character(m*2), m)
+ sorted_list = sort(tbl[upper.tri(tbl)], decreasing=TRUE)
+ for (i in 1:m) {
+ 	for (row in 1:(nrow(tbl)-1)) {
+ 		for (col in (row+1):ncol(tbl)) {
+ 			if (tbl[row, col] == sorted_list[i]) {
+ 				pair[i, ] = c(rownames(tbl)[row], colnames(tbl)[col])
+ 			}
+ 		}
+ 	}
+ }
+ df2 = NULL
+ for (i in 1:nrow(df)) {
+ 	for (j in 1:m) {
+ 		if (df[i, pair[j, 1]] && df[i, pair[j, 2]]) {
+ 			df2 = rbind(df2, df[i, ])
+ 			break
+ 		}
+ 	}
+ }
+ colnames(df2) = colnames(df)
+ })
   user  system elapsed 
  0.014   0.001   0.015 
> print(head(df2))
     果物.野菜    肉 日用雑貨 缶詰野菜 缶詰肉 冷凍肉 ビール ワイン 清涼飲料    魚  菓子
[1,]     FALSE FALSE    FALSE     TRUE  FALSE   TRUE   TRUE  FALSE    FALSE  TRUE FALSE
[2,]      TRUE FALSE    FALSE    FALSE  FALSE  FALSE  FALSE  FALSE    FALSE  TRUE FALSE
[3,]      TRUE  TRUE     TRUE     TRUE  FALSE  FALSE  FALSE   TRUE    FALSE  TRUE FALSE
[4,]      TRUE FALSE    FALSE    FALSE  FALSE  FALSE  FALSE  FALSE    FALSE  TRUE FALSE
[5,]      TRUE FALSE     TRUE    FALSE  FALSE  FALSE  FALSE  FALSE     TRUE  TRUE FALSE
[6,]     FALSE FALSE    FALSE    FALSE  FALSE   TRUE   TRUE  FALSE     TRUE FALSE FALSE
> print(tail(df2))
       果物.野菜    肉 日用雑貨 缶詰野菜 缶詰肉 冷凍肉 ビール ワイン 清涼飲料    魚  菓子
[442,]     FALSE FALSE    FALSE     TRUE  FALSE  FALSE  FALSE   TRUE    FALSE  TRUE  TRUE
[443,]      TRUE FALSE     TRUE    FALSE  FALSE   TRUE   TRUE   TRUE    FALSE  TRUE  TRUE
[444,]      TRUE FALSE    FALSE     TRUE  FALSE   TRUE   TRUE  FALSE    FALSE FALSE FALSE
[445,]     FALSE FALSE    FALSE     TRUE  FALSE   TRUE   TRUE  FALSE    FALSE  TRUE FALSE
[446,]     FALSE FALSE    FALSE     TRUE  FALSE   TRUE   TRUE  FALSE    FALSE  TRUE  TRUE
[447,]      TRUE FALSE    FALSE    FALSE  FALSE  FALSE  FALSE   TRUE    FALSE FALSE  TRUE
```
取消し・削除系のGitコマンドが、ワークツリー・インデックス・HEADのいずれに作用するか

Gitの取消し・削除系のコマンドが、ワークツリー・インデックス・HEADのいずれに作用するかをまとめました。

|#|コマンド|ワークツリー|インデックス|HEAD|
|:-:|:-|:-:|:-:|:-:|
|1|git checkout .|○|-|-|
|2|git rm [file]|○|○|-|
|3|git rm [file] --cached|-|○|-|
|4|git reset --soft HEAD^|-|-|○|
|5|git reset --mixed HEAD^|-|○|○|
|6|git reset --hard HEAD^|○|○|○|
|7|git restore --worktree file|○|-|-|
|8|git restore --staged file|-|○|-|
AWS Sticky Session チュートリアル

## Sticky Session とは？

>ELBにクライアントとバインド先を固定するスティッキーセッションという機能があります。
>HTTPレスポンスにELBでCookieを埋め込んで、
>そのクッキーを基にバインド先のインスタンスを固定するというものです。

>引用: https://dev.classmethod.jp/articles/elb-sticky-session/


Cookieの情報をもとに、それぞれのClient PCは毎回同じserverからサービスを受ける。
サーバーが別のサーバーに変わってしまうと、Cookieの情報が失われてしまうので、アクセスごとにアクセスサーバーを変更しないことでユーザーの体験向上が見込める。

![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/b175db0a-2225-32ee-dbe3-1710acb6d87e.png)


下記githubのCloudFormationで必要なリソースを作成できる。(EC2のインスタンスを3つ)
sticky-session-tutorial-keypairという名前でKeyPairを作成する必要があります。

github source:
https://github.com/yuks0810/aws-cfn-templates/blob/main/aws/cfn-templates/sticky-session-tutorial/sticky-session-tutorial.yml


## Target Group作成
* target group name:
    * sticky-session-tutorial-tg
* VPCは、`sticky-session-vpc`を選択
* Specify group detailsでinstancesを選択
* プロトコルは、HTTP/1, HTTP/2, gRPC好きなものを（今回はHTTP/1)
* Health check path
    * /index.html


以下のようにpendingリストに追加。

![スクリーンショット 2021-12-31 12.54.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/67c004ec-3c3e-3ba1-582c-f20aceeb469c.png)

## ALBの作成
ELBの作成画面から、以下の設定でALBを作成

* Application Load Balancerを設定
* Load balancer name:
    * sticky-session-tutorial-alb
* VPC:
    * sticky-session-vpcを選択
* Mappings：
    * 3つのCluodFormationで作成したinstanceを選択する
* Listeners and routing
    * sticky-session-tutorial-tgを選択
    * Protocol: HTTP
    * Port: 80
* Security Group
    * sticky-session-ec2-ec2-sgを選択

ここまで作成したら、ALBのDNSにアクセスすると3つのEC2インスタンスにそれぞれ接続できる。
現状ではsticky session未設定なので、それぞれのAZに振り分けてアクセスされる。

![iv8eu-s3ib3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/23485f2e-836d-dea6-a284-9f8d86dd5e7a.gif)

## Sticky Sessionを設定していく

Target Groupから、この部分を変更していく。

![スクリーンショット 2021-12-31 13.24.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/4f3385a2-78e5-b6c4-e162-520bdf50dc4f.png)

stikynessにチェックを入れて、保存する。

![スクリーンショット 2021-12-31 13.26.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381710/5cb0189d-9061-e638-e92f-5b6d10e2224f.png)

これで、1分間アクセスするEC2が固定される。
1分後に再度アクセスすると別のinstanceが表示される。

終了。
【2021年12月版】RaspbianでAWS CLI v2を動かす

# ラズパイでAWS CLI使いたくても公式サイトではダウンロードできない
AWS CLI、ARM対応してくれてますが、公式サイトで手順が紹介されているのはx86_64かaarm64のアーキテクチャのみ。ラズパイ用のバイナリはダウンロードできません。。。
そこで以下の記事にある手順に従って、`pip`経由でソースからインストールを行ってみます。

https://dev.classmethod.jp/articles/install-aws-cli-v2-from-sourcecode/
# インストールしてみる
AWS CLI の実態である botocore(低レベルAPI) と aws-cli(CLI向け高レベルAPI) の v2 ブランチを pip 経由で GitHub からインストールします、とのこと。

```
$ python3 -mpip install https://github.com/boto/botocore/archive/v2.tar.gz
....
Installing collected packages: awscrt, botocore
  Attempting uninstall: botocore
    Found existing installation: botocore 1.23.26
    Uninstalling botocore-1.23.26:
      Successfully uninstalled botocore-1.23.26
Successfully installed awscrt-0.12.4 botocore-2.0.0.dev155

$ python3 -mpip install https://github.com/aws/aws-cli/archive/v2.tar.gz
...
Installing collected packages: pycparser, wcwidth, cffi, ruamel.yaml, prompt-toolkit, distro, cryptography, awscli
Successfully installed awscli-2.4.7 cffi-1.15.0 cryptography-3.3.2 distro-1.5.0 prompt-toolkit-2.0.10 pycparser-2.21 ruamel.yaml-0.15.100 wcwidth-0.1.9
```
aws-cliのビルドには大層時間がかかります。めっっっちゃ時間かかります。不安なので`top`コマンドで見守りつつ、待っていたらインストールが完了いたしました。
そしてバージョンのチェック！

```
$ aws --version
aws-cli/2.4.7 Python/3.7.3 Linux/5.10.17-v7l+ source/armv7l.raspbian.10 prompt/off
```
はい、無事にビルドしてRaspbianで動くようになりました。
# ユーザーの設定
あとはいつも通り、awsのユーザーを設定します。

```
$ aws configure
AWS Access Key ID [None]: xxxxxxxxx
AWS Secret Access Key [None]: xxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
はい、設定完了です。
登録情報を確認してみましょう。

```
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ******************** shared-credentials-file    
secret_key     ******************** shared-credentials-file    
    region           ap-northeast-1      config-file    ~/.aws/config
```
以上でAWSのコマンドがラズパイ上で使えるようになりました。

さて、やっとスタートラインです。。。
Swiftでメソッドを学ぶ

おはようございます。

Swift初学者のnaokiです。

今回は備忘録として、Swiftのメソッドについて書いていこうと思います。

#メソッドとは
**メソッドは、型に紐付いた関数のことです。**
**クラス、構造体、列挙型でメソッドを定義することができます。**
#メソッドの定義方法
使い方は以下の通りです。

````example.swift
//基本形
//func メソッド名(引数名) -> 戻り値 {
    //処理の記述
//}

//使用例
struct Power {
    func training(weight:Int) -> Void {
        print(weight)
    }
}

let FirstPower = Power()

FirstPower.training(weight: 10)//10
````

#２種類のメソッド
メソッドには主に２種類のタイプに分かれます。

・インスタンスメソッド
・タイプメソッド

ではどのような違いがあるのでしょうか？

##インスタンスメソッド

**インスタンスメソッドは、インスタンスに紐付いたメソッドです。**

インスタンスを宣言してから使うことができます。

さっき紹介したコードがインスタンスメソッドになります。

````example.swift
struct Power {
    func training(weight:Int) -> Void {
        print(weight)
    }
}

let FirstPower = Power()

FirstPower.training(weight: 10)//10
````

##タイプメソッド
**タイプメソッドは、インスタンスを宣言せずに使うメソッドです。**

````example.swift
struct Power {
    static func training(weight:Int) -> Void {
        print(weight)
    }
}

Power.training(weight: 20)//20
````
#参考文献
[公式ドキュメント](https://swift.codelly.dev/guide/%E5%9E%8B%E3%81%AE%E6%A7%8B%E6%88%90/%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89.html#%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89)

#まとめ
**メソッドは型に紐付いた関数で、タイプメソッドとインスタンスメソッドに分けられる。**
【Python】matplotlib plot引数の基礎

## 概要

matplotlibで色々な折れ線グラフを描きたいけどいちいち調べるのめんどい！
と言うことで、備忘録として纏めました。

- 動作環境
 - Python 3.9
 - matplotlib 3.4.1

## インポート
```python:python
import matplotlib.pyplot as plt
```



## 共通設定

今回は下記にplotを追加する形で表示します。

```python:python
xdata = [1, 2, 3, 4, 5]
ydata = [1, 3, 5, 7, 9]

plt.grid()
plt.xticks(xdata)
plt.yticks(ydata)
plt.xlabel("x")
plt.ylabel("y")
```

- grid：グリッド線を描画
- xticks：X軸の目盛りを設定
- yticks：Y軸の目盛りを設定
- xlabel：X軸の軸ラベルを設定
- ylabel：Y軸の軸ラベルを設定


## 引数なし（plt.plot()）

引数なしにすると、何も描画されません。

```python:python
plt.plot()
```

![test1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2232588/316a6814-12ee-2e7f-e9ff-d00664cd7b0c.png)


## 基本的な描画（plt.plot(xdata, ydata)）
X軸のリスト、Y軸のリストを引数にすることで、基本的な描画が可能です。

```python:python
plt.plot(xdata, ydata)
```

![test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2232588/fdf58d89-3791-5597-fa2e-f6ae8e0caa4d.png)


## マーカー（plt.plot(xdata, ydata, marker)）
**marker**を設定することで、マークをつけることができます。
markerの種類は数多くあります。

```python:python
plt.plot(xdata, ydata, marker=".")
```

![test3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2232588/3b110cd2-b4bc-da50-3e6a-82f1067f1962.png)


## 色（plt.plot(xdata, ydata, color)）
**color**を設定することで、色を変えることができます。
colorは名称（redなど）、一文字（r）、16進数（#FF4500など）で表すことができます。

```python:python
plt.plot(xdata, ydata, color="red")
```

![test5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2232588/5fad7749-13de-7106-1020-07840df00b98.png)



## 透過（plt.plot(xdata, ydata, alpha)）
**alpha**を設定することで、マークをつけることができます。
alphaは０から１の範囲で設定し、１で透過なし、０で何も見えない状態になります。

```python:python
plt.plot(xdata, ydata, alpha=0.5)
```

![test4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2232588/766ddaaa-c6af-06d7-c85f-d9f373fbd492.png)
mac ショートカットキー一覧

##全般ショートカットキー（mac）

| ショートカットキー | 処理内容 |
|:-:|:-:|
|  ⌘ + C | 選択内容をクリップボードにコピー  |
|⌘ + X	|選択内容をクリップボードにコピーし、選択内容を削除する|
|⌘ + V	|クリップボードの内容を貼り付ける|
|⌘ + Z	|最後にした操作を取り消す
|⌘ + S	|変更を保存する
|⌘ + W	|最前面のウィンドウを閉じる|
|⌘ + tab	|開いているアプリをリスト表示する（tabを複数回押すと切り替える）|
|⌘ + F1(※)|	同一アプリの、別ウィンドウに切り替える|
|⌘ + F	|画面内で文字列を検索する|
|⌘ + T	|新しいタブを開く|
|⌘ + N	|新しいウィンドウを開く|
|⌘ + ⇧ + N	|シークレットウインドウを開く|
|⌃ + A（入力時）	|その行の先頭に移動する|
|⌃ + E（入力時）	|その行の末端に移動する|
|⌃ + H（入力時）	|前の文字を１つ消す（deleteと同じ）|
|⌃ + D（入力時）	|次の文字を１つ消す|
|⌃ + K（入力時）	|カーソルの右側の文字を全て削除する|
|⇧ + 上下左右（入力時）	|文字を選択・選択範囲を変更する|
|⌘ + R	|更新|
|⌘ + ⇧ + Z	|直前に取り消した変更内容をやり直す（元に戻す）|
|F11|	デスクトップを表示|
|⌘ + Q	|最前面のアプリケーションを終了する|
|⌘ + +/-	|画面の拡大/縮小|
|⌘+⇧+5	|スクリーンショット（動画）|
|⌘+⇧+4	|スクリーンショット（写真）|
|⌃＋F２	|メニューにフォーカスを移動|
|⌃＋F3	|dock上のアプリを起動|
|⌘＋⌃＋F	|ウィンドウを最大化・元に戻す|
|⌘＋H	|アクティブウィンドウを隠す|



##Finder内ショートカットキー

| ショートカットキー | 処理内容 |
|:-:|:-:|
|⌘ + ↓	|フォルダを開く/ファイルを開く（リスト表示・カラム表示の場合、単に→と入力してもフォルダを開くことができます）|
|⌘ + ↑	|一つ上の階層に行く（リスト表示・カラム表示の場合、単に←と入力しても上の階層に行くことができます)|
|Return	|名前の変更|
|⌘ + delete	|ゴミ箱に捨てる|
|⌘ + ⇧ + D	|デスクトップに移動|
|⌘ + ⌥ + L	|ダウンロードフォルダに移動|
|⌘＋O	|ファイル・フォルダ・アプリを開く|


##ターミナル内ショートカットキー

| ショートカットキー | 処理内容 |
|:-:|:-:|
|↑	|入力したコマンドの履歴を遡る|
|（入力途中で）tab	|入力補完※|
|⌃ + C	|プログラムの強制終了|

##Chomeショートカットキー

| ショートカットキー | 処理内容 |
|:-:|:-:|
|⌘ + 左右	|ページを戻る/進む|
|⌘ + 上下	|ページの最初/最後に移動|
|⌘ + ⌥ + 左右	|隣のタブに切り替える|
|⌘ + ⌥ + I	|要素の検証(デベロッパーツール)|
|⌘ + L	|アドレスバーに移動|
|⌘ + ⇧ + T	|最後に閉じたタブを開く|
【GPT-3】OpenAI  API Usage guidelines 日本語訳

## GPT-3 OpenAI API 利用ガイドラインの日本語訳

- [OpenAI  API Usage guidelines 日本語訳](https://beta-openai-com.translate.goog/docs/usage-guidelines?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=ja) @ Google 翻訳

:::note warn
<sub><sup><strong>筆者の翻訳は取り下げ、替わりに Google 翻訳のリンクに張り替えました。</strong>
<a href="https://beta.openai.com/docs/usage-guidelines">OpenAI API の使用ガイドライン</a>を Chrome の Google 翻訳で読むと、原文とは解釈が異なる翻訳になる箇所がいくつかあり、実際に間違えて利用している記事や SNS の投稿を目にしました。
自分の理解と整理のためガイドラインを翻訳したのですが、公式に翻訳の掲載許可を確認したところ「本家ガイドラインは適宜アップデートされるため、内容の同一性を維持することが難しいことから、さらなる誤解を招く可能性もあるため、ガイドラインの外部翻訳は、お断り申し上げまくっております」（超意訳）とのこと。本家のガイドラインを Google 翻訳、もしくは DeepL を使って読んで欲しいとのことでした。
そのため、翻訳は削除して替わりに Google 翻訳のリンクを貼ります。古い翻訳を読みたい場合は変更履歴を参照ください。なお、Google 翻訳より DeepL 翻訳の方が正確な翻訳になります。</sup></sub>
:::
Spring Bootでリクエストをコントローラにマッピングする処理を解析してみた その１ HandlerMapping

Spring Bootでリクエストをコントローラにマッピングする処理を解析してみました。
思いの外シンプルな仕組みでちょっと驚いています。
また、リクエストに対するマッピングする処理を、新しく作成できることも分かりました。
順を追って説明します。

## HandlerMappingインターフェイス

リクエストをコントローラ等にマッピングには、 `org.springframework.web.servlet.HandlerMapping` インターフェイスを実装したクラスのインスタンスをDIコンテナにに登録する必要があります。
複数のインスタンスを登録することができます。

```HandlerMapping.java
public interface HandlerMapping {
    @Nullable
    HandlerExecutionChain getHandler(HttpServletRequesxt request) throws Exception;
}
```

`HandlerMapping` インターフェイスを実装したクラスの `getHandler` メソッドは、以下のように動作します。

* 該当のクラスでそのリクエストを処理できる場合 `HandlerExecutionChain` のインスタンスを返却
* リクエストを処理できない場合 `null` を返却

`null` を返却した場合、次の `HandlerMapping` インスタンスに処理が引き継がれます。

Spring Bootでは、 `HanlderMapping` を実装した以下の5つのクラスのインスタンスがDIコンテナにあらかじめ登録されています。

* `org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping`
* `org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping`
* `org.springframework.web.servlet.function.support.RouterFunctionMapping`
* `org.springframework.web.servlet.handler.SimpleUrlHandlerMapping`
* `org.springframework.boot.autoconfigure.web.servlet.WelcomePageHandlerMapping`

## Orderedインターフェイス

`HandlerMapping` を実装した既存の5つのクラスには、 `Ordered` インターフェイスも実装されています。

```Ordererd.java
public interface Ordererd {
   int getOrder();
}
```

既存の複数の `HandlerMapping` インスタンスは `getOrder` の戻り値の順でソートされ、リクエストに対して順番に処理する仕組みとなっています。

ここからは `HandlerMapping` インターフェイスを実装した既存のクラスについて説明します。

## RequestMappingHandlerMappingクラス

コントローラとリクエストをマッピングするクラスです。
`@Controller` アノテーションが付与されたクラスの `@RequestMapping` アノテーションが付与されたメソッドを元に、事前にマッピング情報を生成しています。
リクエストのたびに、パスやHTTPメソッドを元に、コントローラのメソッドをマッピングした情報を返却するようになっています。

## BeanNameUrlHandlerMappingクラス

`@Bean` アノテーションの `name` 属性をパスとして、Beanとリクエストをマッピングするクラスです。
`@Bean` アノテーションを付与するメソッドの戻り値の型は、 `Controller` インターフェイスとするようです。

## RouterFunctionMappingクラス

`RouterFunction` インターフェイスによるルーティングとリクエストをマッピングするクラスです。

## SimpleUrlHandlerMappingクラス

`src/main/resources/static` ディレクトリ配下のリソースとリクエストをマッピングするクラスです。
このクラスではパスとのマッピングパターンに `/**` を使用しているため、すべてのリクエストがマッチします。
そのため `gerOrder` でこのクラスより大きな値を返すクラスは、マッピング処理で呼び出されないことになります。

## WelcomePageHandlerMappingクラス

`src/main/resources/templates/index.html` をサイトトップにマッピングするクラスです。
最近のSpring Bootでは、 `SimpleUrlHandlerMapping` クラスより `getOrder` が返す値が大きくなっているため、使用されません。


なお、 `HanlderMapping` クラスを実装したクラスをDIコンテナに登録するだけでは、リクエストに関する処理を完成できるわけではありません。
別途アダプタが必要になります。
こちらについては次回の記事で説明します。
SVN とは

## 勉強前イメージ

gitの前身的なやつ？

## 調査

### SVN とは？

正式名称はApache Subversionといい、subversionの略でSVNになります。
ソースコードのバージョン管理システムの一種で、
ソースコードの変更や履歴はすべて中央のリポジトリに記録されている、
`集中管理型` と呼ばれる管理方法を行っています。

### 集中管理型・分散型

- 集中管理型

ファイルのバージョン管理を専用のサーバで一元管理する方法。
サーバ上にリポジトリと呼ばれる管理用のディレクトリを作成して、
クライアントのPCにソフトを導入してそれぞれがサーバに接続する方法になります。
サーバ上でファイル情報を一元管理するため、つながらないと記録ができません。
CSVや今回のSVNがこちらになります。

![1● 2021-12-31 # SVN とは.dio - めも - Visual Studio Cod.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/50a2390c-6833-8ec3-76be-15c3eb07988d.png)


- 分散管理型

ユーザのPC内にそれぞれリポジトリのコピーを持つ方法で、
ファイルが更新されるとそれぞれのPCのローカルリポジトリに記録、
その後サーバ上のリモートリポジトリにpushします。
ユーザがそれぞれのPCにリポジトリを持っているため
サーバに繋がってなくても記録ができます。
gitやmercurialがこちらになります。

![2● 2021-12-31 # SVN とは.dio - めも - Visual Studio Cod.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/9e189d34-aa99-92c5-2806-d9d613efe21c.png)


### どっちを使えばいい？

メリット・デメリットを確認しないといけないですが、
今のトレンド的にはgitの方が人気があるようです。
gitかsvnかのどちらかを勉強するのであれば、
gitを勉強しておいたほうがいいのではないでしょうか。

![3svn, git - 調べる - Google トレンド - Google Chrome 2021-.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f1fe64d1-c0f8-7cd4-fc31-bf166afd9efd.png)


## 勉強後イメージ

管理方法が違うのね、知らなかった。。
最近はなんやかんやでgitの方が人気なのね。

## 参考

- [【今さら聞けない】バージョン管理システムの基礎知識](https://blog.members.co.jp/article/47070)
- [Subversion 対 Git：どちらを使うべきなのか？いろいろな観点から比較してみた](https://tracpath.com/works/development/subversion_vs_git/)
FlutterでAlgorithm HmacPBESHA256 not availableのトラブル

## Algorithm HmacPBESHA256 not availableのトラブル

#### 参考にしたサイト
https://note.com/iga34engineer/n/ndbe247c8e23a

のサイトを参考にしながら、keyを作成する。
作成されたkeyのパスワード、エイリアス名、jksファイルの場所をkeystore.propertiesファイルに書き込む

keystore.propertiesファイルの作成など、リリースビルド全般については、以下を参考にした。

https://qiita.com/kasa_le/items/d23075d817f42e869778

build.gradleはreleaseのみにする。

とりあえすこれでビルドは通った。

すみません、ほぼメモです。
asdf 自体をアップデートする方法

[asdf](https://asdf-vm.com/) という、言語ランタイムのバージョン管理ツールがあります。
言語に特化したものに rbenv 等がありますが、それらの汎用版です。

asdf 自体のインストール方法や、言語ランタイムのインストール方法は [Qiita の asdf タグ](https://qiita.com/tags/asdf) を追えばわかるのですが、asdf 自体のアップデート方法が書かれていなかったので、それを解説します。

### asdf 自体のアップデート

```bash
asdf update
```

実行の様子

```console
$ asdf update
Previous HEAD position was a1ef92a Update version to 0.8.1
HEAD is now at 9ee24a3 chore: release 0.9.0 (#994)
Updated asdf to release v0.9.0
```

おわりです。

`update` サブコマンドの実装は [`lib/commands/command-update.bash`](https://github.com/asdf-vm/asdf/blob/master/lib/commands/command-update.bash) に書かれています。GitHub から fetch してきて、新しいバージョンに `git checkout` してるんですね。

### おまけ: 言語ランタイムのバージョンの更新

インストールされているプラグインをすべて対象にするなら、

```console
asdf plugin update --all
```

個別に指定するなら

```console
asdf plugin update ruby
```

これで最新のバージョン一覧が入手できます。

## あとがき

要するに `asdf update` が言いたかっただけのブログ。

EoT
2021-12-31 AXI IIC > TX_FIFO書き込みに[66]を使っている理由

### axi_iic_ad[66]

FPGAの部屋さんの記事

Xilinx 社の AXI IIC IP で ADXL355 を使用する
https://marsee101.blog.fc2.com/blog-entry-5031.html

```
void acc_sensor_write(volatile uint32_t *axi_iic_ad, uint32_t device_addr, uint32_t write_addr, uint32_t write_data){
    idle_check(axi_iic_ad);
    axi_iic_ad[66] = 0x100 | (device_addr & 0xfe); // Slave IIC Write Address, address is 0x108, i2c_tx_fifo
    axi_iic_ad[66] = write_addr & 0xff;           // address
    axi_iic_ad[66] = 0x200 | (write_data & 0xff);      // data
}
```

`axi_iic_ad[66]`の66はどこから来たのか?


### PG090 

https://japan.xilinx.com/products/intellectual-property/axi_iic.html

https://japan.xilinx.com/content/dam/xilinx/support/documentation/ip_documentation/axi_iic/v2_1/pg090-axi-iic.pdf#page=11
にRegister Spaceがある。

TX_FIFOとして`108h`があるが、それは上の66とは異なる。

### [66]の使用例

ZedBoard Linux のフレームバッファにカメラ画像を表示１５（Linux既存のFBを使用）
https://marsee101.blog.fc2.com/blog-entry-2445.html

```c
    cam_i2c = setup_io((off_t)XPAR_AXI_IIC_MT9D111_BASEADDR);
    axi_gpio = setup_io((off_t)XPAR_AXI_GPIO_0_BASEADDR);
    
    cam_i2c_control_reg = cam_i2c + 0x40; // 0x100番地
    cam_i2c_status_reg = cam_i2c + 0x41; // 0x104番地
    cam_i2c_tx_fifo = cam_i2c + 0x42; // 0x108番地
    cam_i2c_rx_fifo = cam_i2c + 0x43; // 0x10C番地
```

cam_i2cというベースアドレス?からの差分としてtx_fifoの位置が0x42(66)ということのようだ。
cam_i2cはsetup_io()内にてmmapして得られるアドレス。
【2021年版】我が家のサーバー紹介

# 背景

数年間Raspberry Pi 4を自宅サーバーとして運用していますが、
ディスク容量がいっぱいになっちゃいました。
これ以上HDDを増やすと配線がすごいことになるので、
ハードウエアを変えようと思います。

# 新ハードウエアの条件

以下の条件を満たすハードウエアを探してみました。

- タワー系ケース
- Intel第4世代（Haswell）以降
- 内蔵HDDベイ4つ以上

### 見つかったモノ

ヤフオクでこんなものを購入しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285534/b7c95fc7-52a6-b0cc-31c6-7f5f98607984.png)
（実物ではない、参考写真です）

**Hitachi HA8000/TS10**
Intel Xeon E3-1265L v3
4GBメモリ
内蔵HDDベイx4

これは何と1万円で購入しちゃいましたー

# セットアップ
ARM → x86に変わったためデータ移行できないですが、
幸いAnsible+Dockerで立ち上げ手順を管理したので30分以内でできました。

https://github.com/adwinying/server-provisioning

https://github.com/adwinying/nas-docker

複数HDDを一つのドライブ（マウントポイント）に統合できるようにmergerfsも追加で入れました。

https://github.com/trapexit/mergerfs

# 使った感想

### メリット
- 内蔵HDDベイによりケーブル数を減らすことをできた
- Raspiよりパフォーマンスが優れている
- なぜかx86が落ち着く
- ケース表面のデザインがオシャレ

### デメリット
- タワーケース意外と重い（商業用なのかな？）
- ファンの音量がうるさい（Noctuaのファンに差し替えても気になる）
- SSH上手く接続できない時にディスプレイにあるとこに持ち運びが大変
- デカくて目立つ（ルータはリビングにあるためそこに置くしかない）
- 実際に計ったことないですが消費電力がかなり多い気がする

# 今後

来年になると思いますが、
学生時代に使ってたノートパソコン＋HDDケースに変えようと思います。

https://www.amazon.co.jp/dp/B07FTLZYJ5?coliid=I25MQROOV6A7U&colid=8HVQJH6PYBZ9&psc=1&linkCode=ll1&tag=takoandpancak-22&linkId=58adc7fd7ad7c0a09087705b668cb269&language=ja_JP&ref_=as_li_ss_tl

ノートパソコンだと

- ディスプレイ、キーボードがついているのでデバッグしやすい
- バッテリーがあることでUPS付きデバイスと見なすことができる
- 引っ越しする際に簡単に持ち運べる

今度ボーナスが入ってくる次第変えようと思います！
【Amazon RDS】RDSのオートスケーリングについて

## はじめに
RDSのオートスケーリングをEC2インスタンスのオートスケーリングと同様のものと考えていたが、認識が異なっていたため、RDSのオートスケーリングとは何か、AuroraやEC2の場合と比べて何が違うのかをまとめたいと思った。

## RDSのオートスケーリングとは
まず、RDSインスタンスを作成する場合について考えてみる。
RDSインスタンスを作成する際には、DBの容量を指定する必要がある。
2019年6月19日以前までは、DBの容量が不足した際に、手動で容量を追加する必要があった。
しかし、2021年6月19日以降は、自動的に容量を追加すること(オートスケーリング)が可能となった。
https://aws.amazon.com/jp/about-aws/whats-new/2019/06/rds-storage-auto-scaling/

具体的には、以下の条件全てに合致する場合に自動的にDB容量が追加される。

- 使用可能な空き領域が、割り当てられたストレージの10%未満になった場合
- 低ストレージ状態が5分以上の場合
- 最後のストレージ変更から 6時間以上経過している場合

追加されるDBのサイズは、次のうちいずれか大きい方の増分となる。

- 5 GiB
- 現在割り当てられているストレージの10% ※60 GiB割り当てられているなら、6 GiB。
- 直近 1 時間の FreeStorageSpace(使用可能なストレージ領域の容量) メトリクスの変動に基づいて予測される 7 時間のストレージの増分。 ※RDS DB インスタンスのストレージサイズが 100 GiB で 10.1 GiB の空き容量があり、ストレージの消費量が通常 1 時間あたり 100 MB の場合、100 MB × 7 時間 = 700 MB

オートスケールの詳細については、公式ページに記載されている。
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_PIOPS.StorageTypes.html#USER_PIOPS.Autoscaling
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/monitoring-cloudwatch.html

AWS管理コンソール上からは以下の手順で操作することが出来る。
以下の設定は、Aurora以外のDBを選択した際の管理コンソール画面となる。
![RDS_ストレージの自動スケール_操作方法_管理コンソール_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429119/11067bec-12ad-d81f-7465-f982468acb2e.jpeg)

## [補足] Auroraのオートスケーリングについて
Auroraの場合は、オートスケーリングで「Auroraレプリカ」を追加することが可能。
Auroraの構成として、SQL処理を行う「データベースインスタンス」とデータを格納する「クラスターボリューム」に分かれている。
「データベースインスタンス」は、さらに、「プライマリDBインスタンス」と「Auroraレプリカ」に分かれている。
SQL処理の中で、データの読み取り、更新を行うDBが「プライマリDBインスタンス」となり、データの読み取りのみを行うDBが「Auroraレプリカ」となる。
詳細については、公式ページに記載されている。
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.Overview.html

AWS管理コンソール上からは以下の手順で操作することが出来る。
![Aurora_リードレプリカAutoScalling_操作方法_管理コンソール_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429119/848330df-84a8-fa93-7d75-076b63e862ed.jpeg)
![Aurora_リードレプリカAutoScalling_操作方法_管理コンソール_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429119/95be6c61-81c6-7d8b-81fa-2ff6383353d1.jpeg)

## 注意点
EC2のオートスケーリング、Auroraのオートスケーリングどちらもインスタンスそのものを自動的に増やしているが、RDSのオートスケーリングは、データを格納する容量を自動的に増やしている点に注意する。日常生活で例えると、家を掃除する際に、掃除する人を増やすという観点がEC2やAuroraのオートスケーリングに該当し、掃除する時の収納を増やすという観点がRDSのオートスケーリングに該当すると考える。

## RDSのオートスケーリングは推奨されるのか
ちなみに、データロード(DBの読み取り)の増加が予想される場合は (RDS DB インスタンスの現在のストレージサイズの 20% を超えるロードなど)、データロードの前に RDS DB ストレージのサイズを手動で増加させることがベストプラクティスであると公式ページに記載されている。そのため、推奨設定ではないと考えている。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-autoscaling-low-free-storage/
denoの標準オプションでHotReloadする

# 結論


```shell
deno run --watch=<FILES> server.ts
```


`deno run`する際に `--watch`オプションを追加する
※UNSTABLEなので注意してください。

# 環境

```shell
$ deno --version
deno 1.17.0 (release, x86_64-apple-darwin)
v8 9.7.106.15
typescript 4.5.2
```

# 手順

### 1. server.tsを作成
```server.ts
import { serve } from "https://deno.land/std@0.119.0/http/server.ts";

serve(() => new Response("Hello Deno\n"));
```

### 2. --watchオプションをつけてサーバーを実行

```shell
deno run --allow-net --watch=./ ./server.ts
```

### 3. curlして結果をみる

```shell
$ curl localhost:8000
Hello Deno
```

### 4. server.tsを編集

```server.ts
import { serve } from "https://deno.land/std@0.119.0/http/server.ts";

serve(() => new Response("Hello 🦕\n"));
```

### 5. curlして結果を見る

```shell
$ curl localhost:8000
Hello 🦕
```

これでHotReloadできました。

今回使ったソースを以下に置きます。

https://github.com/sawadyecma/deno-hot-realod-example

# 備考・感想

- 今回使ったwatchオプションは`deno 1.17.0`現在では**UNSTABLE**なので、ご注意ください。
- [denon](https://github.com/denosaurs/denon)というHotRelaodツールもありましたが、筆者が使おうとしたタイミングでは、最新版のinstallができず、[folk後修正されたもの](denosaurs/denon#155 (comment))を使っていました笑
- denoのエコシステムは活動が活発なので、楽しくwatchしていきたいですね〜



# 参考

https://deno.land/manual@v1.17.1/getting_started/command_line_interface#watch-mode

https://qiita.com/nabezokodaikon/items/205c5fe0c65b351db743
ペットにバーチャル背景をつける　SematicImage

#ペットの動画にバーチャル背景をつける方法

<img src="https://user-images.githubusercontent.com/23278992/147276773-6571ca77-4b05-4ab8-a64d-1dafa8dd4be4.gif", width=600>

人間だけでなく、愛犬や愛猫の動画にバーチャル背景をつけられれば、
面白い編集ができる。

#バーチャル背景は人間にしかつけられないのか？

ペットの動画を処理したい。
そんなことできるのか？
そして、動画の処理を書くのは大変そう。

#[**SemanticImage**](https://github.com/john-rocky/SemanticImage)で秒で解決

[**SemanticImage**](https://github.com/john-rocky/SemanticImage)というライブラリなら、
かんたんに動物の動画にバーチャル背景を適用できる。

#使用方法

###１、SemanticImageをインポートする
SwiftPackageManagerで[**SemanticImage**](https://github.com/john-rocky/SemanticImage)を追加する。

```swift
import SemanticImage
```

###２、背景合成を実行

```swift
sematicImage. swapBGOfSalientObjectVideo(videoURL: url, backgroundUIImage: uiImage, { err, processedURL in
    // 処理済み動画URLをここで使う
})
```

これで動画が出力される。
かんたんでしょ？

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
簡単な開発内容をお書き添えの上、お気軽にご連絡ください。
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
【Vue.js】Twitterシェアボタンの実装（初心者向け）

#はじめに
こんにちは！
今回は【Vue.js】Twitterシェアボタンの実装についてアウトプットしていきます！

今回私は[こちらの記事](https://qiita.com/katonobo1/items/cac607cf0bb70977eb0c)を参考にして実行しました！

#対象
・vue.jsでTwitterシェアを実装したい方
・シンプルなコードで実装したい方

##使用環境

|使用技術  |バージョン  |
|:-:|:-:|
|nuxt.js  |2.15.7 |
|firebase |9.6.1  |
|firebase-tools |9.23.3  |
|@nuxtjs/tailwindcss |4.2.0  |

＊今回使用環境の関係性はないと思いますが、紹介として書いておきます

##使用ファイル,概要

|ファイル名  |概要  |
|:-:|:-:|
|pages/result.vue  |診断結果表示ページ |

#実装

```vuejs:pages/result.vue
<template>
   <div class="twitter_share">
     <button
       @click="twitterShare"
       class="
         border-2 border-blue-600
         rounded-full
         h-14
         w-64
         items-center
         flex
         justify-center
         m-auto
         my-8
         hover:bg-blue-200
         duration-1000
       "
     >
       Twitterで宣言する！
     </button>
   </div>
</template>

<script>
  methods: {
    twitterShare() {
      //シェアする画面を設定
      var shareURL =
        "https://twitter.com/intent/tweet?text=" +
        "◯月◯日までに（診断結果で出た本）を読み、感想をツイートします！" +
        "%20%23NewSelf" +
        "%20%23書籍診断アプリ"; +
        '&url'= + "https://www.google.com/?hl=ja" ;
      //シェアようの画面へ移行
      location.href = shareURL;
    },
  },
};
</script>

```

・テンプレートでボタンを作成し`@click`でイベントが発火する仕組みを作る
・`methods`部分で`twitterShare`イベントを作ります。
・twitterにシェアする場合、`https://twitter.com/intent/tweet`でシェアするページにいけます。
・`https://twitter.com/intent/tweet`の後に追加でコメントをルケたい場合は以下を記述します。

|記述法  |意味  |　　コメント表示|
|:-:|:-:|:-:|
|?text=  |コメント|◯月◯日までに（診断結果で出た本）を読み、感想をツイートします！|
|%20%23 |ハッシュタグ  |#NewSelf、#書籍診断アプリ|
|&url=|URL添付 |https://www.google.com/?hl=ja|

・`location.href = shareURL`でツイート画面へ飛べるようになります。

#動作確認
①Twitterシェアボタンをクリック

![スクリーンショット 2021-12-28 9.26.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/c89fd242-681e-7151-8e65-573afadc1ef3.png)

②ツイート画面へアクセスできたのを確認。コメント、ハッシュタグ、URLの添付も確認。Tweetをクリック。

![スクリーンショット 2021-12-28 9.26.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/a3f53f52-8701-78ed-6b3e-237720cd1244.png)

③無事ツイートされたのを確認

![スクリーンショット 2021-12-28 9.27.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/9bbbadac-74bb-c4f5-3294-68812a641123.png)


#まとめ
今回はTwitterシェアボタンの実装について記事にしました。
かなりシンプルに、わかりやすくコードが書けるので取り入れやすいかなと感じました！
ぜひ参考にしてみていただけるととても嬉しいです！！

今回の記事を読んで質問、間違い等あればコメント等頂けると幸いです。

最後までご愛読ありがとうございました！
CDKの環境構築

## CDKインストール
###前提: Nodeをインストールする。
- Nodeのサイトにいってダウンロード後インストール(https://nodejs.org/ja/)
- MACだったらnodebrew(https://qiita.com/mame_daifuku/items/373daf5f49ee585ea498)
  
### CDKのインストール
- MACだったらbrewを使う(https://formulae.brew.sh/formula/aws-cdk)
  `brew install aws-cdk`
- Windowsだったらnpm環境を構築後以下のコマンドを実行
  `npm install -g aws-cdk`
  
## 動作確認
```
ShiroUz cdk % cdk --version
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!                                                                                  !!
!!  This software has not been tested with node v17.3.0.                            !!
!!  You may to encounter runtime issues, and should switch to a supported release.  !!
!!                                                                                  !!
!!  As of the current release, supported versions of node are:                      !!
!!  - ^12.7.0                                                                       !!
!!  - ^14.5.0                                                                       !!
!!  - ^16.3.0                                                                       !!
!!                                                                                  !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2.3.0 (build beaa5b2)
```
テストはされていないけど、使えると信じています。
ちなみに、2.3.0なので最新版のようです。
DxLib キーが押された瞬間 / 離された瞬間 を取得する

こんにちは。プログラミング初心者ですが、記事を書いてみようと思います。
これよりももっといい感じの方法があるかもです。その場合はご教示お願いします。

---

### 動作

![input.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/9b95fdae-bfd0-9cb0-985b-df3fdb59b6f9.gif)
▲ __DOWN: キーが押された瞬間 / UP: キーが離された瞬間__
(space_cnt: スペースキーが押されているフレーム数)

こんな感じです。

--- 

### しくみ

+ __前のフレームと今のフレームの入力状態を比較__して判定しています。
+ 入力状態は、DxLibの関数 __CheckHitKeyStateAll()__ を使用します。
+ 入力状態の比較は__ビット演算__を活用して判定します。



>+ [ChckHitKeyStateAll()の詳細](https://dxlib.xsrv.jp/function/dxfunc_input.html#R5N28)
>+ [ビット演算について](https://qiita.com/Ingward/items/43acda931c8a62c70d2f)

---

##### ビット演算
・__押された瞬間 = 前フレームが <font color = "red">0</font> + 現フレームが <font color="blue">1</font>__
・__離された瞬間 = 前フレームが <font color="blue">1</font>   + 現フレームが <font color = "red">0</font>__
(入力状態: 押されている状態 = 1 / 離されている状態 = 0)

<br>
●図式化したもの
![key_onoff.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/29a3c07d-61ee-b283-928b-c5f23974d4ab.png)

●表にしたもの
![input_state2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/4f340092-588b-412f-9430-56c650b374f0.png)

表の内容を詳しく説明します。

__前フレームと現フレームのXOR__で、__押された瞬間・離された瞬間__が分かります。 
しかし、__XORのみだと、押された瞬間・離された瞬間を区別できません__。
なので、
① __XORと前フレームのAND__で__押された瞬間__を求める。
② __XORと現フレームのAND__で__離された瞬間__を求める。


<br><br>
###### 要点まとめ
:::note info
<b>
・前フレームと現フレームの比較で押された瞬間・離された瞬間を求める
・比較はビット演算を使う

・押された瞬間 / 離された瞬間はXORを使って求める
・XORのみだと区別できないので、ANDを使ってそれぞれ求める
↓
・押された瞬間・離された瞬間(XOR) = 前フレーム ^ 現フレーム
・押された瞬間 = XOR & 前フレーム
・離された瞬間 = XOR & 現フレーム
</b>
:::

---

### コード

<details><summary>コード(クリックで展開)</summary>
<div>

```key.cpp
#include "DxLib.h"

#define KEY_CNT 256
//----------------------------------------------------------------------------- 
char keybuf[KEY_CNT];		//キーバッファ (現フレーム)
char keybuf_old[KEY_CNT];	//1つ前のキーバッファ(前フレーム) 
char key_down[KEY_CNT];		//押された瞬間 
char key_up[KEY_CNT];		//離された瞬間 
//----------------------------------------------------------------------------- 
void Update_Key(void)		//キーの入力状態 
{ 
	for(i = 0; i < KEY_CNT; i++) 
            { keybuf_old[i] = keybuf[i]; }		//1つ前のキーの状態を保存

	GetHitKeyStateAll(keybuf);	                //全てのキーの状態を取得 

	for(i = 0; i < KEY_CNT; i++) 
	{ 
		int key_xor = keybuf[i] ^ keybuf_old[i];	//前フレームと現フレームのxor 
		key_down[i] = key_xor   & keybuf[i];		//押された瞬間 = (現フレームとkey_xorのAND) 
		key_up[i]   = key_xor   & keybuf_old[i];	//離された瞬間 = (前フレームとkey_xorのAND) 
	} 
} 

```

キーを指定する際は、__DxLibのキーのコードを配列の[]内に記載してください__。
(例: ESCが押された瞬間にbreak  → __if(key_down[KEY_INPUT_ESC]) {break;}__  )

キーコードについてはこちらをどうぞ
[DxLibのキーコード一覧](https://dxlib.xsrv.jp/function/dxfunc_input.html#R5N2)

以下は呼び出し側のコードです

```main.cpp
#include "main.h"
#include "key.h"

/*
    略
*/

while()
{
    Update_Key();

    /*
        略
    */

    //escが押されたら終了
　　if(key_down[KEY_INPUT_ESC]) { break; }
}

```
</div>
</details>
---

### さいごに

最後まで読んで下さり、ありがとうございます。
自分自身が考えたものではなく、学校で教わったものなのですが、便利だと思ったので記事にしました。
DxLibの関数の部分を自分で記述すれば、他の言語でも併用できるかもです。

コードの書き方など、ご指摘がありましたら、ぜひコメントでお願いします！