OmniAICreator/Qiita-1.07M huggingface dataset:
ゲーム開発あれこれ（駄文）

#高橋名人の16連射
という話が大流行したのはもう30年以上も前だろうか。
入力検知はだいたい毎フレーム先頭で見るので判定回数は60回/秒。
ただしON/OFFの変化を検出するには２フレーム必要なので30回/秒。
16連射はON/OFFを毎秒16回なので理論上は実現可能。ただし。
60フレームを16連射、ON/OFFの32回で割ると1.875フレーム。
1フレームは16.66666msなので、実に31.2msでONまたはOFFの入力。
実際に秒間16発撃てていたかは微妙なところだ。
蛇足ながらシューティング全盛期に１フレームを見切る人はいた。
#コマンド入力型ゲーム
ある時まではボタンはただ連打するもので、レバー＋ボタン程度だった。
1987年に登場したストリートファイターはコマンド入力の概念を導入。
（波動拳３発でKO、ガード不可というクソバランスだった）
波動拳、昇竜拳、竜巻旋風脚は３入力なので最短50ms。
その後の格闘ブームでコマンドは一気に複雑化、最短入力時間は伸びた。
記憶している限りボタンボタンレバーボタンボタンの技があった。
それぞれON/OFFで２フレームかかるので10フレーム166.666msかかる。
ここまで長いと人間にも認識できるが、バランス上問題なかったのか？
#ラスタースクロール
1993年まではゲームマシンはラインバッファアーキテクチャであった。
ラインバッファとは、画面の１ライン分のバッファを用意するという意味。
少量のバッファでBGとスプライトを重ね合わせできたので低コストだった。
このラインバッファにBGの１ラインをコピーしてからスプライトを重ねる。
この時、コピー開始アドレスにオフセットをつけると描画位置がずれる。
これを利用して１ラインずつオフセットしていけばラスターがゆらゆら。
これがラスタースクロールの原理である。
ちなみにフレームバッファアーキテクチャのPlayStationでは無理。
だがラスタースクロールは実現していたので力技だったと思う。
セガサターンはラインバッファアーキテクチャである。
回転拡縮BGと変形スプライトで3Dっぽく見せていたが苦しかった。
#PlayStationとセガサターンの比較
PlayStationはメインRAM2MB、VRAM1MBとCPU/GPU/GTE/SPU。
極めてシンプル。それぞれの役割分担が明確で、さらには自社製造。
メインRAMはEDOでVRAMはSGRAMと、性能にも配慮していた。
カラーテーブルもVRAMに置くのでパレット数の制限も緩かった。
対するセガサターンは
SH-2が2個、CD制御のSH-1、サウンド制御68000、VDP1、VDP2、SPU
という、数え上げるだけでめんどくさいハードウェア構成だった。
メインRAM2MB、VDP2のVRAMに1MB、VDP1のVRAMに0.5MB。
余裕があるように見えるが、性能に寄与することはなかった。
これが後々セガの首を少しずつ絞めていくことになる。
#セガサターンの敗因
直接的にはFF11が取れなかったせい、というのが世間の通説である。
だがFF参入発表当時まではいい戦いをしており、その勢いは続いた。
負けた原因はいくつかあるが、FF以外で言うならこうだ。
###ハードのコスト高
**大嘘を書いていたのでこのパートは書き直し。**
セガサターンの敗因、というよりPlayStationの勝因は部品点数と構成だ。
[プレイステーション歴代モデルの基板から見えてくるPS進化ヒストリー](https://mitok.info/?p=977)
を見ればわかるのだが、PlayStationは効率を追求した構成だった。
CPU+GTEをはじめ、ほとんどのLSIが自社製。社外IPのチップが少なかった。
プロセスルールの進歩により部品点数と実装面積が劇的に進歩した。
世代を追うごとに部品点数の減少と実装面積の縮小がはっきりわかる。
対するセガサターンは
SH-2(x2)とSH-1、68000が社外IP。RAMが多いことも一見有利に見えるが
フレームバッファではないセガサターンでは有利にならなかった。
性能の割に部品点数が多い効率の悪さが部品コストと実装コストに響いた。
後期にはSH-2x2を１パッケージにしたり効率化を試みたが、そのころには
シェアにおける勝負がほぼついていた。
###描画品質の低さ
PlayStationはフレームバッファアーキテクチャで極めてシンプルだ。
毎フレーム全部消して全部描く。カラーテーブルもVRAM上にあった。
現在で言うGeForceやRADEONの基礎を実現していた。
そのため合理的で、描画品質も（当時としては）高かった。
対するセガサターンは変形スプライトで3Dっぽく見える2Dマシンだ。
スプライトをセル板に見立てて、対角線をもって曲げるイメージだ。
これでポリゴンっぽく見せることはできるが、曲げるのでゆがむ。
テクスチャゆがみが強く出るのでどうしても汚く見える。
映像クオリティで勝負になるとは言えなかった。
###処理能力の低さ
PlayStationはCPUを純粋にコントローラにすることを狙っていた。
座標変換はGTE、描画はGPU、専用チップへの分散処理で性能を出した。
対するセガサターンは疑似ポリゴンなのでVDP1の性能に律速される。
スプライト描画としては高性能だがポリゴン表現には向かなかった。
SH-2の28MHzを２個搭載していたが、ボトルネックはそこではない。
バーチャファイター２は30fps、デイトナUSAは24fpsだと記憶している。
PlayStationの勝利はバランスの勝利なのだ。
後継のDreamCastではSH-4搭載のベクトル演算器で座標変換を行い
PowerVR2で描画することで完全な3Dマシンに設計された。
だがPlayStation互換のPS2を凌駕するには至らなかった。
#シンプルな設計は強い
ハードウェアでもソフトウェアでもシンプルな設計は強い。
小さいものは美しい・・・と昔の偉い人が言ったとか言わないとか。
Unixなんかも、単機能のプロセスを連結して目的を達成する。
ハードウェアは役割分担をはっきりと決め、専用チップの連携が強い。
できるだけ自社IPの（コントロールできる）回路が重要だ。
将来的な高集積化で、他社IPだから無理、ではコストは下がらない。
#だが時は２１世紀（マルスはいない）
PlayStation5が生まれ、競合ハードウェアを寄せ付けない状況である。
だが中身はほとんどゲーミングPCそのものだ。コストダウンしただけ。
プラットフォームという枠組みに価値があるという状態である。
正直ゲームコンソールはすでに斜陽の産業に入りつつある。
ハードウェアコスト以上にソフトウェアの開発コストが高騰しすぎた。
開発は大規模化、開発ツールは高価な3Dモデラーを多数使う。
プロジェクトの費用は跳ね上がった。その分の売り上げは見込めるか？
スマホゲームでも作ったほうが儲かるはずだがそれもあと何年もつか。
リリースまでの開発費と回収見込みのバランスは今や最重要である。
スマホの世界ではリリース１年以内に閉じるタイトルも少なくない。
やはり最後もバランスなのである。
VS CodeにおけるSpring開発環境 -拡張機能-

# VS CodeにおけるSpring開発環境 -拡張機能-

# 概要
VS Codeにて、Spring開発を行うにあたり、
必要な拡張機能をまとめる

# 目次
1. 最低限の拡張
2. 筆者の環境と拡張機能

# 1.最低限の拡張
- Debugger for Java
- Language Support for Java(TM) by Red Hat
- Japanese Language Pack for Visual Studio Code
- Spring Boot Tools

最低限上記の拡張機能をインストールすれば、とりあえずは開発は始めれるかと。  

# 2.筆者の環境と拡張機能
### ■筆者の開発環境
- Springを用いてWebアプリを作成
- フロントは「HTML」
- DBは「OracleDB」
- 複数人で行なっていたので開発環境を合わせるべく「Docker」を使用
　→Macユーザー、Widowsユーザーの両方が混在していた

### ■導入した拡張機能
- Bracket Pair Colorizer  
 →どの { ｝なのか見やすくなる
- Cloudfoundry Manifest YML Support  
 →ymlファイルにて、設定を書き込める
- Debugger for Java  
 →Javaのデバッグ
- Draw.io Integration  
 →DB設計に役立つ
- HTML Snippets  
 →ざっくり言えば予測変換
- Japanese Language Pack for Visual Studio Code  
 →日本語化
- Lombok Annotations Support for VS Code  
 →Lombokの導入(便利すぎる。。)
- Language Support for Java(TM) by Red Hat  
 →MavenやらGradleやらのサポート
- Oracle Developer Tools for VS Code  
 →DBをOracleにしてる兼ね合い
- Remote - Containers  
 →Dockerを導入しないならいらない  
 →Dockerのリモートのコンテナに入れる
- Spring Boot Tools  
 →SpringBootの使用

とりあえず並べました。
Dockerとか使わなければ、不要なものもありますが、  
何か参考になれば幸いです。
Parallels上のWindows10で左右Cmdキーを使ったIME切り替えをする

# はじめに
この記事は次のような非常にニッチな設定をしている人向けです．

- WindowsをParallelsで動かしている
  - US配列のキーボードを使っており，[karabiner-elements](https://karabiner-elements.pqrs.org)で左右のCmdキーをIMEのオンオフに割り当てている（下図参照）
![Screen Shot 2021-06-03 at 18.19.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187328/be0806e6-7de2-2b39-8b93-c20ed8993868.png)
  - Windowsでも同様にIMEのオンオフがしたい

従来はWindows側のレジストリを書き換えることで，Scancodeのマッピングを変更し対応していました[(例)](https://tepp91.github.io/contents/misc/remap-keyboard-with-scancode-map.html)．具体的には，左CmdをF13，右CmdをF14に割り当て，それらをIMEの設定でIMEオフ/オンに対応づけるという方法をとっていました（似た方法 [^1] [^2]）．

[^1]: https://qiita.com/yktakaha4/items/8f320bf69c76090e93e7
[^2]: https://iicebar.hatenadiary.org/entry/20140915/1410800172

しかし，最近になってMicrosoft IMEがアップデートされ，_自由なキーコンフィグができなくなりました．_
https://www.atmarkit.co.jp/ait/articles/2011/13/news012.html
そこで，根本から設定を見直す必要に駆られたので，設定のメモです．

# 使用ツール
- [microsoft/PowerToys](https://github.com/microsoft/PowerToys)

# 手順
1. [microsoft/PowerToys](https://github.com/microsoft/PowerToys)をインストール
1. PowerToysのKeyboard Managerでキーの再マップを設定
![Screen Shot 2021-06-03 at 18.18.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187328/28daed3c-2781-985e-dbb8-c38f44bba5ef.png)
  (a) このとき，キーマップの変更先はそれぞれ左Cmdが"IME Non-Convert"，右Cmdが"IME Convert"になります
1. Microsoft IMEの設定を以下の画像の通りにする
![Screen Shot 2021-06-03 at 18.22.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187328/c1a24c1c-6cdf-b857-0aeb-296e8923e919.png)

**手順は以上です．**

# なぜこんな回りくどいことをしないといけないのか
私の認識が合っている自信はないので，以下はあまり参考になさらないでください．mac日本語キーボードに存在する英数，かなキーはとんでもない仮想キーコードを発出するため，回りくどい方法で実現する必要があるようです．

まずmacの日本語キーボードにおけるParallelsやBootCampでの扱いを確認します．手元に実機がないため不明ですが，どうやらCapsLockキーを半角／全角キーに割り当てることで対応しているようです[^3]．
[^3]: https://mac-windows-pc.com/eisuu-kana

では，Karabiner-Elementsによるキーバインドの上書きはどうなっているでしょうか．コンフィグファイルを確認すると，"japanese_eisuu"および"japanese_kana"の記述が見つかります．これらは日本語キーボードに存在する英数キー，かなキーのキーコードを示しているものと思われます．ここで上段での確認をふまえると，そもそも日本語キーボードであってもこれらのキーはWindows側で使えない状態ですので，独自の設定をする必要があるわけです．

さて，そうするとmac日本語キーボードの英数，かなキーの仮想キーコードが気になります．手順に載せたPowerToysのスクリーンショットから明らかなように，英数キーはVK 235（0xEB）です．一方で，かなキーはUndefinedとなっています．私の試行錯誤から得られたかなキーのキーコードは255（0xFF）でした．
これらからスキャンコードを得られれば，スキャンコードの再マップをレジストリ書き換えで行えるのですが，情報を見つけられませんでした．代わりに，実機WindowsでのUSキーボードを用いた事例[^4]が見つかったので，これを参考にPowerToysで再マップをしたところうまく行ったところです．

[^4]: https://qiita.com/SogoK/items/7e0ea37c3e958c39608c

Parallelsで英数，かなキーを無変換，変換キーに再マップしてくれる機能があれば，このような回りくどいことをしなくても良いのになぁと思いました．
laravelの備忘録

自分が忘れた時に備えて書いておく記事です。

公式から必要な事だけを引っ張ってきた事。

>環境
2010/06/02の時
OS：Windows8.1
laravel：8.44.0

##・composerを使ったlaravelのインストール

```
composer create-project laravel/laravel project-name --prefer-dist
```

project-nameの所を任意の名前に変える

##・サーバーの停止
ctrl＋C
アプリケーションでも使える

##・バージョン確認

```
  php artisan -version
```

または

```
  php artisan -v
```

こちらでもバージョンを確認できるが、オプションも表示される


##・モデルとマイグレーションとコントローラーの作成
データベースにデータの保存をするテーブルの型作成

```
  php artisan migrate:make [任意のテーブル名] --create
```
存在するテーブルにカラムを追加するマイグレーションを作る場合

```
php artisan migrate:make [任意のテーブル名] --table=追加するテーブル名
```


##・マイグレーションの実行

```
   php artisan migrate
```

※ミスるとテーブルが作られたままになるのでテーブルを削除するか他の方法で元に戻す
※公式ではロールバック方法が掛かれているがまだ試してない
ロールバックコマンド

```
   migrate:rollback
```
※コントローラーを作らないとデータベースからデータを取り出せない

###・メンテナンスモード
メンテナンスにする

```
   php artisan down
```

メンテナンスを解除する

```
   php artisan up
```

※メンテナンスモードしてると503にされるからコードを間違えたかと勘違いするので注意！！(気づかないで何時間もコードとにらめっこしてしまった・・・)

###·　APIのURLを変更したい
APIのURLの/apiをなくしたり自由にAPIのURLを自由に変えたい時があると思います、そういう時は
app\ProvidersのフォルダにあるRouteServiceProvider.phpのBoot関数の所でやっています。


###·　laravelAdmin
管理画面導入ライブラリ

公式サイト：http://laravel.jp/
docker-composeで躓いたところ

dockerで非常に躓いたので、備忘録として残します。

# Dockerfileで躓いたところ
### 使うdocker-imageをFROMで指定する
当たり前ですが、imageをFROMで指定しないと何を書いても動きません。

```Dockerfile:FROM
FROM centos:7
```

※centos7はサポートが結構間近なので気をつけましょう

https://qiita.com/yamada-hakase/items/1629d511ab4199d253b4


# docker-compose.ymlで躓いたところ
### volumsでカレントディレクトリを指定して、docker側のrootディレクトリに送るとホットリロードになる

神機能なのでみなさん使いましょう。
また、特に設定をしてない場合はrootユーザーで入るので、ホームディレクトリがrootとなります。
ホームディレクトリに移動させたいファイルやディレクトリを指定しましょう。

```yaml:docker-compose
    volumes:
      - .:/root
```

### docker-compose.ymlに使うimageを書けばDockerfileが要らない
ケースバイケースだとは思いますが、Dockerfileで何かごにょごにょと処理をしない場合には、管理がしやすいのでdocker-compose.ymlに書きましょう

```yaml:docker-compose.yml
version: "3"
services:
  db:
    image: mysql:5.7 #imageにdocker-imageを指定する
    container_name: mysql 
```

### dockerが起動した瞬間すぐ落ちる時
`tty: true`を付けましょう。永続的に起動します。

```yaml:docker-compose.yml
version: "3"
services:
  db:
    image: mysql:5.7
    container_name: mysql
    tty: true #永続的に起動させたいコンテナに付ける
```

# 悪魔のコード
dockerの全てを破壊します。
最終手段で使いましょう。

```terminal:dockerのimageやらネットワークやらを削除する
docker image prune #可動していないdocker-imageを削除します
docker container stop $(docker ps -aq) #可動している全てのdockerを停止します
docker image rm $(docker images ls) #docker-imageを全て削除します
```

また、dockerのコマンドは新しく(3年前に)なったそうです。こちらで確認しておきましょう。

https://qiita.com/zembutsu/items/6e1ad18f0d548ce6c266
Ruby 問題⑩ 配列を利用したrubyプログラム作成

#はじめに

毎日投稿（土日除く）を始めて早1ヶ月。
少しづつ身になっている事を感じてきました。

本日も問題を解いていきます。

#問題
以下の配列から任意の数字を探して何番目に含まれているかという結果を返すsearchメソッドを、each_with_indexを用いて作成して下さい。

```
input = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 30, 40, 50, 60, 70 ,80]
```

```.rb
def search(target_num, input)
  # 記述
end

input = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 30, 40, 50, 60, 70 ,80]

# 例
search(11, input)
```

#ヒント

*each_with_index*メソッドを使う

※*each_with_index*とはrubyに標準に組み込まれているメソッドの1つです。

eachメソッドでは繰り返し処理をするのに使われていましたが、処理された要素は何番目に処理されたかは分かりません。そこでこのメソッドを使います。

```.rb
配列名.each_with_index  do |item, i|

end
```

```.rb
fruits = ["りんご", "スイカ", "ぶどう"]

fruits.each_with_index do |item, i|
 puts "#{i}番目のフルーツは、#{item}です。"
end

# => 0番目のフルーツは、りんごです。
# => 1番目のフルーツは、スイカです。
# => 2番目のフルーツは、ぶどうです。
```

#解答

```.rb
def search(target_num, input)
  input.each_with_index do |num, index|
    if num == target_num
        puts "#{i + 1}番目にあります"
    end
  end
  puts "その数は含まれません"
end

input = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 30, 40, 50, 60, 70 ,80]

search(3, input)
```
配列inputを定義し、searchメソッドに実引数をしてセットします。
呼び出されたsearchメソッドでは、仮引数としてtarget_numとinputとして受け取リます。

```.rb
#今回はtarget_numに3が入り、inputには配列が入っています
def search(target_num, input)

end

input = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 30, 40, 50, 60, 70 ,80]

search(3, input)
```

searthメソッド内の処理で*input.each_with_index*を使い、inputに格納されている要素を*num*として取り出し、要素毎に割り当てられた添字をindexとして取得します。

```.rb
#numには配列に格納された要素
def search(target_num, input)
  input.each_with_index do |num, index|
   puts num
  end
end

input = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 30, 40, 50, 60, 70 ,80]

search(3, input)

# =>
2
4
6
8
10
12
14
16
18
20
30
40
50
60
70
80
```

```.rb
#indexには添字
def search(target_num, input)
  input.each_with_index do |num, index|
   puts index
  end
end

input = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 30, 40, 50, 60, 70 ,80]

search(3, input)

# =>
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
```

target_numとnumの配列に一緒の要素が出た時に出力したいのでifを使います。

```.rb
 if num == target_num
  puts "#{i + 1}番目にあります"
 end
  puts "その数は含まれません"
```

*#{i + 1}*としているのは配列は0番目から始まるので+1をしました。
Selenide(Java)で新規に開くwindowにフォーカスを切り替える

## はじめに
E2Eテスト自動化をした際に、新規windowが開くようなサイトで新規windowにフォーカスが移らずエラーになる事が何度かあったので、その際に安定化させるためにやった事を備忘録として残しておく。

- java : 8以上

## 新規に開くwindowにフォーカスを切り替える
```java:SwitchWindowSample.java
public HogePage openWindow(){
   Set<String> beforeHandles = WebDriverRunner.getWebDriver().getHandles();

   Selenide.$("#btn").click();
   Selenide.sleep(500); // 安定させるためにどうしても明示的にsleepを入れたりしないとダメな事もある

   Set<String> afterHandles = WebDriverRunner.getWebDriver().getHandles();
   
   afterHandles.removeAll(beforeHandles); // Setの中身から新規windowのhandleを取得するために被っているhandleは削除
   String handle = afterHandles.stream().findFirst().get();
   Selenide.switchTo().window(handle); // ここで明示的にwindowを切り替える

   return Selenide.open(HogePage.class);
}
```

※上記ではわざと`Selenide.`としているが普通は`import`で書いてきれいにするのがいいと思われる。

## 参考文献
https://selenide.org/javadoc/current/com/codeborne/selenide/Selenide.html
AWS LambdaにC#プロジェクトをデプロイする

#概要
AWS LambdaにC#プロジェクトをデプロイする場合、
Windows版のVisual StudioであればGUIからボタンぽちぽちで完了するので良いのですが(要AWS Toolkit for Visual Studio)、
Visual Studio for Macの場合はできません。
そのため、Macの場合はCUIからデプロイする必要があるので、本記事でその方法についてまとめておきます。

#事前準備

●AWS CLIをインストール

```
brew install awscli
```


●Amazon.Lambda.Tools .NET Core Global Tool 
.NETアプリケーションをAWS Lambdaへデプロイするために必要です。

```
dotnet tool install -g Amazon.Lambda.Tools
```

●プロファイル作成
ローカルPCからAWSへCLIで操作を行う場合、都度「プロファイル」を指定して接続する形になります。
※あらかじめAWSでCLIで使用するためのIAMを設定し、AccessKey及びSecretAcccessKeyを取得しておきます。


```
aws configure --profile {プロファイル名}
# 例: aws configure --profile user1

AWS Access Key ID: {設定したIAMから払い出されたキーをコピー}
AWS Secret Access Key: {同上}
Default region name: {東京の場合は ap-northeast-1 を指定}
Default output format: JSON
```

#C#プロジェクトの準備
●設定ファイル
デプロイコマンドを実行する前に、C#プロジェクトに
「どのリージョン」に「どのプロファイル」を使用して、「どのLambda関数」にデプロイする、等といった設定ファイルをJSON形式で用意しておく必要があります。

ファイル名: aws-lambda-tools-defaults.json
階層: 「.csproj」ファイルと同階層に配置

```json
{
  "Information": [
    "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.",
    "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.",
    "dotnet lambda help",
    "All the command line options for the Lambda command can be specified in this file."
  ],
  "configuration": "Release",
  "framework": "netcoreapp3.1",
  "profile": "default", // AWS CLI プロフィール
  "region": "ap-northeast-1", // AWSリージョン指定
  "function-runtime": "dotnetcore3.1", // Lambbda実行ランタイム
  "function-memory-size": 512, // Lambdaメモリ(MB)
  "function-timeout": 30, // Lambdaタイムアウト時間(seconds)
  "function-handler": "SearchConnpassLineBot::SearchConnpassLineBot.Function::FunctionHandler", // Lambda実行時にコールするメソッドを指定
  "function-name": "SearchConnpassLineBot", // Lambda名称
  "function-role": "arn:aws:iam::000000000000:role/MyLambdaRole" // AWSロール名
}
```

#デプロイ方法

●デプロイコマンド
簡単です。
デプロイしたい「.csproj」ファイルがある改装で以下コマンドを実行します。

```
dotnet lambda deploy-function
```

以上でデプロイ完了です！
お疲れ様でした！
JSONってなに？

連想配列の文字列。
javascriptのデータが連想配列で扱われるので、それに近い形になっているJSON。
ブラウザのデバッグモードで見るとわかる。
javascriptで受け取ってそのまま使える。
だから
JAVAスクリプトのオブジェクトの表記。


JAVAスクリプトはネットスケープナビゲータから生まれた言語で、
HTMLを動的にするので、文字列を扱う言語。
数値とかを扱うときにこまるので、仕様にしたのが、ECMAScript。

XMLは、タグに属性を設定できるので、値に対して、型やその属性を設定できる。
JSONは、ブラウザにデータを送るとそのまま使用できる。
CSVは、カンマ区切りにしたデータで、仕様を決めてやり取りする。
propertyは、javaでは設定ファイルで使用。

使用目的がそもそも違う。
Time Zone of Cloud Functions for Firebase Scheduler does not change

# Time Zone of Cloud Functions for Firebase Scheduler does not change

## Problem
I am currently creating and deploying a function to be executed periodically in the Cloud Functions for Firebase scheduler as shown below. The key point is that I want it to be executed every day at 0:05 Japan time as .timeZone('Asia/Tokyo').

The deploy itself is working fine, but when I look at the content in GCP's Cloud Scheduler, the Time Zone is set to (America/LosAngeles) as shown in the image below, and the actual execution time is off from Japan time.

I manually changed the time zone to Japan time in the Cloud Scheduler function management screen and confirmed that the desired behavior was achieved, but when I deploy the function again, it is still set to (America/LosAngeles).

```
exports.XXX = functions.pubsub
.schedule('every day 0:05')
.timeZone('Asia/Tokyo')
.onRun((context) => {
    /// Codes
});
```

## Solution
It is reported as a bug of `firebase-tools`v9.12.0.
https://github.com/firebase/firebase-tools/issues/3425

At the time this issue was reported, the solution was to downgrade to firebase-tools version 9.11.0.
However, 9.12.1 has now been released, and I have confirmed that using the latest 9.12.1 with Node.js version v16(with nvm) solves the above problem.

If you don't know this and deploy the functions, the Time Zone in the scheduler will be set to America, and the app will start running at an unintended time.
This will cause the app to fire at an unintended time, so be careful.
Error: EISDIR: illegal operation on a directory, read

## はじめに
発生したエラーに対していくらコードを見直しても原因がわからず苦戦したため、メモ

## 発生したエラー
Error: EISDIR: illegal operation on a directory, readh
（詳細省略）

## 原因
ディレクトリーに対してファイル読み取り`fs.readFileSync`を行っていたことが原因

本来ファイルのみ存在しているディレクトリに、サブディレクトリを作っていたのが原因。いくらコードを見直しても解決できないのは当然ですね・・
【iOS】Metal Best Practicesの解説（１） 基本的な概念

何回か分けて、[Metal Best Practices](https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/MTLBestPracticesGuide/index.html#//apple_ref/doc/uid/TP40016642-CH27-SW1)を解説していきたいと思います。
（途中でやめたらごめんなさい。というか１回目で終わったらごめんなさい）

[Metal Best Practices](https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/MTLBestPracticesGuide/index.html#//apple_ref/doc/uid/TP40016642-CH27-SW1)は、iOS／MacOS／tvOSのAPIであるMetalを用いた設計のベストプラクティスガイドです。

本稿では、何回かに分けてこのガイドを読み解き、コード上での実験を交えて解説していきたいと思います。

読んでそのまま理解できそうなところは飛ばしますので、原文を読みながら原文のガイドとしてご利用下さい。

**記事一覧**

https://qiita.com/TokyoYoshida/items/521619d6d8dd8d8ef9e4

https://qiita.com/TokyoYoshida/items/42afb0bf89442ae55c7c

https://qiita.com/TokyoYoshida/items/fd1b6ec49c1a67e12002

https://qiita.com/TokyoYoshida/items/3c39f8dc9403349eed5a

https://qiita.com/TokyoYoshida/items/4aacaecbaca9f794974a

https://qiita.com/TokyoYoshida/items/354a442bf9765fff5774

https://qiita.com/TokyoYoshida/items/5e882abc1cb028228d5d

https://qiita.com/TokyoYoshida/items/493194825460c3b1d6b2

https://qiita.com/TokyoYoshida/items/01becb5530fc65cb27a4

https://qiita.com/TokyoYoshida/items/29420837d251252357af

https://qiita.com/TokyoYoshida/items/6bfd688171155acb696f

https://qiita.com/TokyoYoshida/items/abe180229ee22b61103b

https://qiita.com/TokyoYoshida/items/e86fd9ca0c6c4fcfe5cb

https://qiita.com/TokyoYoshida/items/3217f8498300e5cc96e2

### [Fundamental Concepts (基本的な概念)](https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/MTLBestPracticesGuide/index.html#//apple_ref/doc/uid/TP40016642-CH27-SW1)

Metalを利用してグラフィックや計算をするのは、おそらく高いパフォーマンスを実現したいからだと思います。そして、効率的なMetalアプリでを作るためには次の点を考慮する必要があります。

- CPUのオーバーヘッドが低いこと
- GPUパフォーマンスを最適化すること
- CPUとGPUの並列処理を最大化すること
- 効率的なリソース管理をすること

これらを実現するためにはMetal APIを推奨した方法にしたがって使用する必要があります。

（短いですが1回目はここまでです。）

### 最後に

iOSを使ったARやML、音声処理などの作品やサンプル、技術情報を発信しています。
作品ができたらTwitterで発信していきますのでフォローをお願いします🙏

Twitterは作品や記事のリンクを貼っています。
https://twitter.com/jugemjugemjugem

Qiitaは、iOS開発、とくにARや機械学習、グラフィックス処理、音声処理について発信しています。
https://qiita.com/TokyoYoshida

Noteでは、連載記事を書いています。
https://note.com/tokyoyoshida

Zennは機械学習が多めです。
https://zenn.dev/tokyoyoshida
【シェアハウス🏠ハック】洗濯機が稼働しているかわかるサーバレスなWebシステムを作ってみた【IoT AWS Lambda APIGateway DynamoDB】

#はじめに  
こんちには！今、シェアハウスに住んでいるのですが、 
共用で使っている洗濯機を使おうとすると もう誰かが使っていて使えないことがあります、、 
わざわざ洗濯機を使っているか確認しに行くのもめんどい、、 
ということで洗濯機が稼働しているかどうかがわかるWebシステムを作ってみました！

#作ったもの
* urlを叩くとシェアハウスの洗濯機が稼働しているかわかる  

使っているとき
![スクリーンショット 2021-05-22 20.14.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634021/baade6b7-ec9d-6803-384d-91a0965da1a3.png)



使っていないとき
![スクリーンショット 2021-05-21 20.45.31（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634021/a65c9d98-0d64-5f08-00f2-feb3972f0f7f.png)

#システム構成 
電流データを取得 → 洗濯機とコンセントに下記のIoT機器(スマートプラグ)を設置電流データを取得する 
![5C8E6626-89A6-47E8-BC58-C43436C38F88.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634021/5261ffba-9007-3587-0090-0db8efc9f3e3.jpeg)
あとはこの電流データを公開しているAPIをフロント側から叩いてその結果をもとに洗濯機を使っているか否かを表示すればOK！簡単じゃんと思っていたが、、

  * IoTデバイスのスマートプラグのAPIの使用しすぎは、APIシステムへの課金がされてしまう
  * 洗濯機を使っていても、脱水時は電流データが0になるタイミングがある

という状況に対応するため

* AWSのLambda(Node.js)でIoTデバイスが提供しているAPIは5分に1回だけ取得するようにしデータをAWSのDynamoDBに保存する
* 保存されたDynamoDBから電流データを取得し、使っているかどうかを判定(最新電流データから過去3回分中、電流仕様が2/3だったら使用中とする)し、APIで返すAPIサーバーをLambdaとAPIGatewayで作成
* 上記のAPIを叩くフロント側(S3)を作成し、シャアハウス住民のれとるときゃりー(@retoruto_carry)が作成したデジタルサイネージシステムに乗せて2分間に1回ぐらい定期的に表示する(もちろん直接url叩いても見れます！)

というサーバレスなシステムにしました。 

システム構成図はこんな感じ！
![geekHouseLundurySystem.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634021/83c5c07d-9752-9067-60e3-006c4cbe7ca8.png)

# 開発の流れ
① アーキテクチャ設計、言語設定  
  とりあえず安価なことを含め、環境構築が不要なサーバーレスでアーキテクチャを組むことに、 
  最初は、GCPとAWS組み合わせて作ろかと模索していましたが、それぞれの相性を考慮して 
  AWSに統一してLambda、APIGateway、DynamoDBで構築することに！ 
  Lambdaで使った言語ですが、日頃、業務ではRubyを使用しているのですが、Nodeに興味があったのでNode.jsで書くことにしました。
  また、ローカルでvimを使って開発したいのと、githubでソースコードを管理したかったので、AWS cliを使って開発しました！

最初はシェアハウスの同居人とあーだこーだいいながらアーキテクチャを考えました  
![IMG_0594.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634021/bda25ffc-26fb-fc8c-6889-7bd5f0995aa8.jpeg)

業務で使っていないNode.jsと触ったことがなかったLambda ApiGeteway DynamoDBに苦戦する日々  
![スクリーンショット 2021-05-22 20.26.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634021/b5c7a375-aa79-01c2-fa67-2995c15f532b.png)



② 熱海で開発合宿  
熱海のゲストハウスでシェアハウス同居人の@retoruto_carry、@wamisnet、@ryosk7に参加して、要件定義、アーキテクチャ設計の見直し、そして、ひたすら開発する。 
業務では主にRubyを使っているので、Node.jsで書くのにいろいろと苦労しました、、その分勉強になった！
お酒や熱海のうまい海鮮料理、温泉に寄り道しすぎてここでの開発進捗は30％ぐらい、、
最後はお互いに成果を発表しました！
![PXL_20201115_140611619_Original.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634021/cd7557d6-da0b-1de4-8f2e-2cdc7433ee1a.jpeg)

③ 業務が休みの日にひたすら開発 
AWSのAPIGateway、Dynamoを構築するのが大変だった、、とくにDynamoDBは、初めて使ったので、特に苦労した、、 
時間をかけながらも、ひたすら開発した。ちゃんと動いたときは、嬉しかったですね！

#まとめ
- AWSのLambda、APIGateway、DynamoDBの連携が楽で快適。コストも低く、このサーバレスシステムは5分に一回24時間稼働していますが、ほぼ0円です。
- 誰かのためになるシステム開発は、やりがいがある！
- IoTで電流がとれるデータが取れるものなら、いろんなことで家🏠をハックできそう！
 
# 終わりに 
ここまで読んでいただきありがとうございます！
まだまだ、色んなものを作って成長していきたいと思っています！SNSでのシェアやLGTMしてくださると
今後の開発の励みになります！
Twitterもやってます！([@tanayu7777](https://twitter.com/tanayu7777))よかったらフォローしてくださいね！
ビジネスプロセスモデリング

BPMN (Business Process Model and Notation)

OMG (Object Management Group)が管理する、ビジネスのプロセスを表現する記法

https://www.omg.org/bpmn/

参考になった記事

https://qiita.com/kenjiwilkins/items/616747d506576113acd7

https://qiita.com/kenji-yokoi/items/8b577dbcd94f4a5902f6

いつもわかりやすい記事ありがとうございます。
【ExcelVBA×Outlook】ExcelからOutlookメールを送信する


```
Function outlook_send_mail(ByVal meAddress As String, ByVal toAddress As String, ByVal ccAddress As String, ByVal bccAddress As String, ByVal subject As String, ByVal body As String) As Variant

    Dim outlookObj As Outlook.Application
    Dim mailItemObj As Outlook.mailItem
    
    Dim i As Long
    
    Set outlookObj = CreateObject("Outlook.Application")
    Set mailItemObj = outlookObj.CreateItem(olMailItem)
    mailItemObj.BodyFormat = 3      'リッチテキストに変更
    mailItemObj.SentOnBehalfOfName = meAddress
    mailItemObj.To = toAddress
    mailItemObj.cc = ccAddress
    mailItemObj.BCC = bccAddress
    mailItemObj.subject = subject
    mailItemObj.body = body

    mailItemObj.Send

    Set outlookObj = Nothing
    Set mailItemObj = Nothing

End Function
Function outlook_display_mail(ByVal meAddress As String, ByVal toAddress As String, ByVal ccAddress As String, ByVal bccAddress As String, ByVal subject As String, ByVal body As String) As Variant

    Dim outlookObj As Outlook.Application
    Dim mailItemObj As Outlook.mailItem
    
    Dim i As Long
    
    Set outlookObj = CreateObject("Outlook.Application")
    Set mailItemObj = outlookObj.CreateItem(olMailItem)
    mailItemObj.BodyFormat = 3      'リッチテキストに変更
    mailItemObj.SentOnBehalfOfName = meAddress
    mailItemObj.To = toAddress
    mailItemObj.cc = ccAddress
    mailItemObj.BCC = bccAddress
    mailItemObj.subject = subject
    mailItemObj.body = body

    mailItemObj.Display

    Set outlookObj = Nothing
    Set mailItemObj = Nothing

End Function
```
Bash on ubuntu が立ち上がらない

忘備録みたいものです。

# なにが起こった？
タイトルの通り

#経緯

なんやかんやあってWINDOWSを再起動した
 → スタートメニューから Bash on ubuntu が立ち上がらない → ／^o^＼ ﾅﾆｺﾚ

# 結果から言うと

**コマンドプロンプト** が**レガシ コンソール**になっていたのが原因でした

# なぜわかったのか

参考にさせていただきました
https://qiita.com/koooge/items/ef7c0d64bdb7dda40f64

コマンドプロンプトからBashを起動してみる

```
user>bash
Unsupported console settings. In order to use this feature, the legacy console must be disabled.
```

**`レガシーコンソールを無効化しろ`**って書いてあるので
`コマンドプロンプト- 既定値 > オプション ` から
`レガシ コンソールを使用する` のチェックを外したら動いた。

さておき、WSL2に移行せねば。。
Python3からMySQLのテーブルデータを取得してみた。


勉強中。
すぐ忘れるのでノートとしてのQiita便利じゃない？

https://qiita.com/murasakisou03/private/728dd0d4d6afd69df937

の続き。
データベースの接続まで出来たので、実行したいのもを書いていく。

![python.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1472363/948955d5-d5c7-8ddd-a17c-1e885493ac26.png)

上記の画像、カーソルってなんやねんの答え　↓

https://qiita.com/nkojima/items/c073f977c4c0097bec53

**平たく言えば、「検索条件に合致するレコードを、1件ずつ取り出すための仕組み」となります。**

だそうです。

前回と同様に

https://www.sejuku.net/blog/82657

このページを見ていく。

いろいろテーブルを初期化したり作成したりしてるが
私がやりたいのはもうすでに作られてるテーブルの取得のみ。

なので

```py
#!/usr/bin/env python3

import MySQLdb

connection = MySQLdb.connect(
        host='localhost',
        user='root',
        passwd='MySQLで設定したPW',
        db='school',
        charset='utf8')　　#日本語を取り扱うために記入
cursor = connection.cursor()　　 #カーソルの生成

#一覧を表示
cursor.execute("SELECT * FROM students") #studentsテーブルを表示したい

for row in cursor:
    print(row)

# 接続を閉じる
connection.close()

```

内容としてはこんな感じに記入した。

https://www.sejuku.net/blog/82657
Androidでgoogle-services.jsonを置かずにFCMからのPushの受信

FCM(Firebase Cloud Messaging)をつかったPush通知の際、
通常、google-services.jsonをappフォルダ以下に配置して実装しているかと思います。

google-services.jsonはFCMのアカウント(およびプロジェクト)に紐づくjsonファイルとなっており、
基本的に1つのFCMアカウントからのメッセージしか受診できません。

同じアプリでユーザーによって送信元のFCMのアカウントを切りかえたいという話があったので
その調査のメモ書きになります。

##前提事項

前提事項として、google-services.jsonを配置した状態でFCMのPush通知が届いている環境であることを想定しています。

Push通知が届かない場合の問題の切り分けとして、単純に設定不足なのか
今回の設定が効かなかったのかを区別するため上記前提となっております。
なので、google-services.jsonありの状態との差分の説明になります。

###google-services pluginのコメントアウト
google-services.jsonを探しにいくgoogle-servicesのpluginの読み込みを止めます。
こちらがあるままだと、google-services.jsonを取り除くと
google-services.jsonが見つからない旨のエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645739/45ff11a1-5bcd-a3c0-b051-3027239770cf.png)

###google-services.jsonから必要な情報を取得
後でgoogle-services pluginが行っているgoogle-services.jsonファイルの取得の代わりを実装しますので
google-services.jsonから[プロジェクトID]、[アプリケーションID]、[APIキー]をコピーするなりして保存しておいてください。
後で使います。

```json:google-services.json
{
  "project_info": {
    "project_number": "XXX",
    "project_id": "[プロジェクトID]",
    "storage_bucket": "XXX"
  },
  "client": [
    {
      "client_info": {
        "mobilesdk_app_id": "[アプリケーションID]",
        "android_client_info": {
          "package_name": "XXX"
        }
      },
      "oauth_client": [
        {
          "client_id": "XXX",
          "client_type": 3
        }
      ],
      "api_key": [
        {
          "current_key": "[APIキー]"
        }
      ],
      "services": {
        "appinvite_service": {
          "other_platform_oauth_client": [
            {
              "client_id": "XXX",
              "client_type": 3
            }
          ]
        }
      }
    }
  ],
  "configuration_version": "1"
}
```

###google-services.jsonの削除
google-services.jsonを探しに行く仕組みを止めて必要な情報を取得したので、
google-services.jsonファイルをapp以下から取り除きます。
appフォルダ以下にあるgoogle-services.jsonをフォルダを開いて削除します。

###FireBaseの初期化の実装
```kotlin:FireBaseの初期化
var options = FirebaseOptions.Builder()
    .setProjectId("[プロジェクトID]")
    .setApplicationId("[アプリケーションID]")
    .setApiKey("[APIキー]")
    .build()
FirebaseApp.initializeApp(this, options)
```
(ソースはkotlinのプログラムになってます。)
上記を最初に起動するActivityのonCreateなどに実装すればpushが届くかと思います。
状況に合わせて[プロジェクトID]、[アプリケーションID]、[APIキー]を変えれば、
FCMのアカウントの切替などができるかと思います。
※アプリ内の操作をトリガーに上記を呼び出して切り替えをすると、
　消したはずのFCMアカウントからもPushが届いたりするので
　初回インストール時点での切替にした用が良さげです。

###余談
```FirebaseApp.initializeApp(this, options)```は呼ばないでおくと
起動後しばらくしてExceptionが発生するようです。
操作後にFCMの初期化をしたい場合は、
最初に
```FirebaseApp.initializeApp(this)```
を呼び出しておくとExceptionは回避できました。

##参考
下記Firebaseのドキュメントを元に試した内容になります。

https://firebase.google.com/docs/projects/multiprojects?hl=ja
【Rails】データ保存時にrollbackされて原因がわからない時

Railsで開発している時に、データ保存をしたはずなのに、rollebackされてその原因が分からないことがあるかと思います。
私の場合、createメソッドでsaveしている状況ですが、パラメータは正しく渡っており、エラーメッセージも表示されていないのにデータベースには保存されていませんでした。

結論としては、save!と入力することでエラーの原因が分かります。
やり方としては、現在のcreateアクションに記載されているsaveに!を付けるだけです。

```ruby:item_controller.rb
  def create
    @item = Item.new(items_params)
    if @item.save
      flash[:success] = "商品を登録しました"
      redirect_to items_path
    else
      flash.now[:danger] = "登録に失敗しました"
      render("admin/items/new")
     end
  end    
```
上記は新規商品を登録するための記述です。このsaveの部分をsave!と変更すればOKです。
save!とした状態で実際に何か商品を登録しようとすると、ターミナル上にエラーメッセージが表示されます。
私の場合は、以下のメッセージが表示され、メーカー名が空白になっていたのでエラーになっていたと分かりました。

```:ターミナル
ActiveRecord::RecordInvalid: Validation failed: Content can't be blank, Maker can't be blank
```

エラーメッセージは表示されないのにsaveできない時は、save!としてみてエラー内容を表示させて原因を突き止めてみることが大切ですね。
講義プリント[PDF]をテスト持ち込み用に分割して再PDF化した

# まえがき
今回，ある講義でテストは講義プリント持ち込み可であり，
講義プリントは100枚を超えそのまま印刷すると1000円程度の費用が掛かってしまう。
これは，大学生のお財布事情的に厳しいので1枚に分割してまとめ，PDFにしようと思った。

つまりお財布にも環境にも優しい私になるため。

# PDFをJPGに変換
PDFファイルはバイナリデータであり、仕様に従ってバイト列を読み取ることで構造を取り出し，表示させている（最近知った）のでWordなどで開くと位置がおかしい場合がある。
なので，画像データに変換してからWordで読み込む

以下のサイトからPDFからJPGに変換したzipファイルをダウンロード
[I Love PDF](https://www.ilovepdf.com/ja/download/hq3p2rscwAy4ccrt081ggf04d2Avkdqnvh1jnflp14svjlwpAl7x2A7r9cgq0vj87mpfy1ctl8nnt4h8s6lfvx6fnmx2kxgnrpwgryz83zzzzf5c39d58613w01b59tlmgg6fxvdAsct1zqdjf46lsq74xwqj4yq1cfmzqkh1g5tfrqhbr9q/37)




# Wordの設定

環境設定 > 編集 > 図を挿入/ペーストする形式：「行内」へ
**通常は背面に設定している方が作業しやすい**
![スクリーンショット 2021-06-03 16.37.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/29486ca3-25db-66cb-de8f-583fa91119a4.png)
![スクリーンショット 2021-06-03 16.37.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/5178b6ef-5c63-e185-c6a3-1930214d34d4.png)



# ペースト

画像をまとめてWordにドラッグ＆ドロップ
![スクリーンショット 2021-06-03 16.59.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/098d47bf-919f-a0f7-cf8b-cb6d25a0da34.png)


# PDF化

ファイル > プリント　
![スクリーンショット 2021-06-03 17.00.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/633ab749-3d5d-b0fd-40ee-543523e6d39e.png)


印刷部数と印刷ページ > レイアウト
![スクリーンショット 2021-06-03 17.01.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/beba50c5-603d-fd49-718c-07d1675de2ac.png)
![スクリーンショット 2021-06-03 17.02.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/bfc82c6a-6c7b-8a3d-6d38-9b21470358a1.png)



左下の「PDF」から「PDFとして保存」

すると，この様に分割してPDF化することができた
![スクリーンショット 2021-06-03 17.05.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/89493512-8ff3-4d4d-684c-a2338acab57e.png)

これで印刷するとお財布にも環境にも優しいあなたになります

# あとがき
テスト頑張る
Couchbaseとは何か？（この名前をはじめて耳にする人へ）

### Couchbaseについて

"Couchbase"という名称で名指される技術には、大きくいって、次の二つがあります。つまり、Couchbase ServerとCouchbase Mobileです。

Couchbase Serverは、分散JSONドキュメントデータベース（distributed JSON document database）です。

Couchbase Mobileは、Couchbase LiteとSync Gatewayという二つの技術を包含する呼称です。Couchbase Liteは、モバイル端末および組み込みデバイス用のネイティブドキュメントデータベース（native document database for mobile and embedded devices）です。Sync Gatewayは、Couchbase MobileのデータをCouchbase Serverと同期するために使うことができるコンポーネント（components to sync to Couchbase Server）です。

Couchbase Liteは、組み込み用ネイティブデータベースとして、プラットフォーム毎に設計・開発されています。Couchbase Serverと、Couchbase Liteは、「Couchbase」という名前が共有されていますが、技術的観点からは本質的に異なるものです。

（括弧内の英文の引用は、[Open Source Projects from Couchbase](https://developer.couchbase.com/open-source-projects/)から）

### 関連データベース技術

Couchbase Serverについて適切に理解するための前提知識として、以下の用語について把握しておく必要があります。

#### ドキュメントデータベース

ドキュメント指向データベース、ドキュメントストアとも呼ばれます。

[Document-oriented database](https://en.wikipedia.org/wiki/Document-oriented_database)

#### キーバリューストア

キーバリューデータベースとも呼ばれ、またKVSのような略称も広く流通しています。

[Key–value database](https://en.wikipedia.org/wiki/Key%E2%80%93value_database)

#### インメモリデータベース

メモリ内でデータを管理することによって、高速な応答性能を実現するデータベース。一般に、データベースが、データ永続化装置（ハードディスク等）を用いた永続性と、一貫性を保証しているのに対して、インメモリデータベースを利用する際には、永続化の要件は、必要に応じ、インメモリデータベースの外部で実現される。あらかじめ永続化されているデータの純粋なキャッシュとして用いるのではなく、動的に更新されるデータベースとして、インメモリデータベースを用いる際には、メモリ上のキューを用いて、事後的な一貫性を実現することによって、永続化装置の性能に影響されない、応答性能との両立を実現する場合がある。

[In-memory database](https://en.wikipedia.org/wiki/In-memory_database)

#### リレーショナルデータベース

日本語では、関係データベース、と呼ばれます。関係モデル（リレーショナルデータモデル）に基づいて、データを扱います。

[Relational database](https://en.wikipedia.org/wiki/Relational_database)

#### クエリ

データベースにおけるクエリは、データベースへの問合せ（Query）として、普通名詞化されています。関連して、データベースに対するクエリの構文を定めたクエリ言語があります。クエリ言語を用いたデータベースへのクエリは、情報検索（データの抽出・集計）のみではなく、追加、削除、更新を含むリクエストを含んでいます。

[Query](https://en.wikipedia.org/wiki/Query)

#### トランザクション

データベースにおけるトランザクションは、原子性、一貫性、分離性、永続性を備えたデータへの一連の操作を言います。

[Database transaction](https://en.wikipedia.org/wiki/Database_transaction)

###  さらに理解を深めるために

下記記事の中で、Couchbaseに関連する記事を整理しています。
[NoSQL/JSONデータベースCouchbase理解・活用へのロードマップ](https://qiita.com/yoshiyuki_kono/items/4c9cd1115efc5807b49f)
初心者が作るSumerianを使った簡単なVR


![スクリーンショット 2021-06-02 0.22.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501141/ba61c27f-603f-7633-edb2-d9dabd6e7d72.png)



#Sumerianとは？
Amazon Sumerian(以下Sumerian)とは、Amazonが提供する
 > [ブラウザベースの 3D、拡張現実 (AR)、仮想現実 (VR) アプリケーションを簡単に作成し実行](https://aws.amazon.com/jp/sumerian/)

できるサービスです。 ⇨ [公式](https://aws.amazon.com/jp/sumerian/)

今回はこちらのSumerianで簡単なデモを制作しました。

###  [Qiita用デモ](https://ap-northeast-1.sumerian.aws/be2df49ee2184485ba1e391af43a1f3e.scene)　
*右下のアイコンから音声をONにしてください。矢印キーで視点を動かすことができ、hostをクリックすると挨拶をしてくれます。

# 達成

- Sumerian Hostがお出迎えの挨拶をしてくれる
- 通路を作る
- 道路を歩き、壁にぶつかる





## Sumerian Hostがお出迎えの挨拶をしてくれる

こちらに関しては、[参考書](https://www.amazon.co.jp/dp/B0923NH6ST/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)に載っているをそのまま参考にしています。
Cognitoを設定する必要があるのでちょっと手間ですが、難しいことはありませんでした。

参考書で書かれている(私が参考にした)方法とは異なるのですが、公式のチュートリアルを参考に載せたいと思います。こちらはCloudFormationを利用した方法が紹介されています。
[Sumerian Host Course](https://docs.sumerian.amazonaws.com/courses/host-course/)

こちらCognito Identity Pool IDの設定方についての参考になります。
[Amazon Sumerian で作成したシーンに AWS リソースへのアクセス許可を与える](https://dev.classmethod.jp/articles/0707-provide-authinfo-sumerian/)

Cognitoを使えばSumerianとAWS各種サービスを連携させることができます。

## 通路を作る

![スクリーンショット 2021-06-03 16.35.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501141/64c3259e-5074-a812-83da-2aef5a740b53.png)


平面を繋いで箱を作り、それぞれに画像をインポートしています。
こちらのチュートリアルを参考にしています。
[Crash Course: Creating a Industrial Machinery Training Application (Amazon Sumerian)](https://www.youtube.com/watch?v=hAxhwJwbrkc&t=950s)


<br>
## 道路を歩き、壁にぶつかる

![スクリーンショット 2021-06-03 16.38.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501141/e141e2c6-fd24-afb2-e273-c3747fe15496.png)


移動する・壁にぶつかる(衝突判定)は下記を参考にしています。
[Amazon SumerianでRoll a Ballを作ってみた](https://qiita.com/mechamogera/items/ce4cb2181340b5f36c76)

参考として私のオブジェクト、ステートマシンの設定を載せたいと思います。

### オブジェクト

- Camera
    - Collider : 衝突判定のため必要。
    - Rigid Body： 重力を加える。
<br>
<br>


    - ステートマシン：CameraMove(仮称)
![_2021-05-27_16.28.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501141/8a494539-45f4-a520-1e8a-344460749825.png)



    ```
Key Down & Key Up：　キー(今回は矢印キー)にステートアクション(Apply force on rigid body)を紐付ける。
    Apply force on rigid body：　物理エネルギーを対象に与えて動かす。
```

    ### ⇨矢印キーでキャラクターを動かす(前後の動き、左右へ振り向き)
<br>   
- 通路出口


   - Collider：壁や障害物となるよう通路壁面に追加(衝突判定)。

# 課題
- ピタッと動きを止めることができない(ステートマシンApply force on rigid body使用時)
- 例えば「ゴール地点からスタート地点へワープ」するように、「AからBへ移動する」ことができない(スクリプトを使ってアップデートすると、その地点で固定されてしまう)。


# 感想

今はまだ資料も少なく、発展途上のサービスだと思います。
しかし、ゆくゆくはリアルな店舗をVRと連動されるなど、発展次第では「サマーウォーズ」の「OZ」のようなサービスを現実の世界にもたらしてくれる可能性があります。
天下のAmazonが提供するサービスですから、そんな期待もアリではないでしょうか。


<br>
<br>
mysqlのPDOで接続するとstring型になってしまう理由と対策


###参考サイト

https://unskilled.site/%E3%81%AA%E3%82%93%E3%81%A7php%E3%81%AFmysql%E3%81%8B%E3%82%89%E3%81%AE%E3%83%AA%E3%82%B6%E3%83%AB%E3%83%88%E3%81%8Cint%E5%9E%8B%E3%81%AE%E3%81%AF%E3%81%9A%E3%81%AA%E3%81%AE%E3%81%ABstring%E5%9E%8B/


デフォルトモードのPDOでMySQLに接続している場合、int型でも（他の型でも）string型で返ってくるという挙動があり、これは仕様のようです。

###解決法１
フェッチした後にキャストすることで対処はできる。



https://techacademy.jp/magazine/19679


###　解決法２
PDO::ATTR_EMULATE_PREPARES属性をfalseにすることで型変換を回避する
BH3シャットダウンシーケンスの停止・起動手順 

BH3のシャットダウンシーケンスは下記の手順で停止・起動の設定をすることができます。
再起動後も設定は保持されます。
（デフォルトはイネーブルです）

■停止手順：
% sudo systemctl daemon-reload
% sudo systemctl disable shutdown-sensor.service

■起動手順：
% sudo systemctl daemon-reload
% sudo systemctl enble shutdown-sensor.service
PHP　配列と条件


#配列

```
$a = [];　←配列の記述
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
例
<?php
$week_name = ['日','月','火','水','木','金','土'];  ←配列の中身が曜日
print($week_name[1]);
print($week_name[date('w')]);
?>
→月
→入力したその日の曜日が出る

上記のdate('w')は
dateのフォーマットがあり、そこから日にちを持ってきている！！
```
https://www.php.net/manual/ja/function.date.php


#連想配列　foreach文

```
$a = ['key_1'=>'value_1','key_2'=>'value_2'];  連想配列

foreach(配列の変数　as 配列の引数){
  処理したい中身を記述
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
例
<?php
$fruits = [
  'apple'=>'りんご',
  'grape'=>'ぶどう',
  'lemon'=>'レモン',
  'tomato'=>'トマト',
  'peach'=>'もも'
];
foreach($fruits as $english => $japan){
  print($english. ':'. $japan. "\n");
}
?>
→apple:りんご
→grape:ぶどう
省略
```

#if構文

```
if(出力の条件){
　　条件にあった出力
}else{
　　条件以外の出力
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
例
<?php
if(date('G') < 9) {
print('営業時間です');
}else{
  print('営業時間外です');
}
?>
→時間帯により出力が変わりif文

```
#小数点

```
<?php print(100/3000*100). "\n"; ?>
<?php print(floor(100/3000*100)); ?>  floor小数点切り捨て
<?php print(ceil(100/3000*100). "\n"); ?>　ceil小数点切り上げ
<?php print(round(100/3000*100, ３)); ?>　　round四捨五入,少数の位置を指定
→3.3333333333333
→3 
→4
→3.333
```
制作会社でコードレビューしてもらったのでメモ

#アクセシビリティーの理解
### アクセシビリティーとは
***「ユーザーが快適にWebを使えるようにすること。」***
マウスの故障でキーボード操作でページの閲覧をしている方、視覚障害などで音声ブラウザを使用している方など、色んなユーザーにとって優しいサイトである必要があります。
意識することで結果的に綺麗なコードになり、seo的にも役に立ちます。

###今回指摘されたポイント

・role属性の必要性
`<a>`タグでボタンを実装した場合はrole属性で役割を明示してあげる必要があります。

```
<a class="btn btn-primary" href="#" role="button">Link</a>
```

<br>
・`<button>`タグにはtypeも指定する必要がある
初期値がsubmitの為フォームで使用しない場合は、typeを指定してあげた方がいい

```
<button type="button" class="btn btn-primary">Primary</button>
```
<br>
・読み上げが必要ない部分にはarea-hiddenを使用
``aria-hidden="true"``
を使用することによって読み上げをスキップできます。
``style='display:none'``
を指定している部分に使ってあげるみたいです。


# jsのプレフィックスは必ず必要
jsで操作する場合jsを接頭辞につける必要があります。

```
$('.hoge').toggleClass('hogehoge')
```
こういった部分は必ず、``.js-hoge``で指定してあげた方がいいみたいです。


#タグの使い方

・空の要素にbackgroundなどでデザインをつけるもはよくない。もし必要なら`<span>`タグで行う。
・文字として意味を持たないものはタグで囲んで使うのではなく擬似要素などで表現する。

```
<p>テキストテキスト<span>＞</span></p>
```
こういう場合 ＞　は擬似要素で表現する。

#細かいメモ
・reset.cssは触らない
・font-sizeをremで指定したら余白もremを使用しないと意味がない。
・alt属性や英語を大文字で指定すると読み上げソフトを使う際、変な読み上げになる。小文字で記載してcssなどで調整する(一文字目は大文字でも問題なし)
・`<tr>`で囲んでいる場合`<th>`が一番上。テキスト上`<th>`にしたくない場合は、cssで変更する。

初めてコードレビューしていただいて独学だと気にしない点が多々ああたのでいい気づきになりました。
GSAP の ScrollTrigger を fullpage.js みたいに使うメモ

## ホイールの動きにすぐ反応してほしい
[GSAP](https://greensock.com/) の [ScrollTriggr](https://greensock.com/scrolltrigger/) で [fullpage.js](https://alvarotrigo.com/fullPage/) みたいに全画面でセクションごとに一気にスクロールさせるには `snap`を使う方法がありますが、 ScrollTriggr だと画面半分までスクロールしないと次セクションまでのスクロールが発動しないので、 fullpage.js のようにマウスのホイールを少し動かしただけで次セクションまでのスクロールが発動するようにする方法のメモです。

```html:HTML
<section  class="panel">
 <p>Panel1</p>
</section>
<section  class="panel">
 <p>Panel2</p>
</section>
<section  class="panel">
 <p>Panel3</p>
</section>
<section  class="panel">
 <p>Panel4</p>
</section>

```

```scss:SCSS
.panel{
  display: block;
  height: 100vh;
  width:  100%;
}
```
```js:JavaScript
	import gsap from "gsap";
	import { ScrollTrigger, ScrollToPlugin } from "gsap/all";
	gsap.registerPlugin(ScrollTrigger, ScrollToPlugin);


    const panels = document.querySelectorAll(".panel");

    function goToPanel(panel) {
      gsap.to(window, {
        scrollTo: { y: panel, autoKill: false },
        duration: 1.5,
      });
    }
    panels.forEach((panel) => {
      ScrollTrigger.create({
        trigger: panel,
        end: "bottom top+=1",
        markers: 1,
        onEnter: () => goToPanel(panel),
        onEnterBack: () => goToPanel(panel),
      });
    });
    ScrollTrigger.addEventListener("scrollEnd", () => console.log("scrollEnd"));

```

## 実装デモ
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="TaroTsujimoto" data-slug-hash="rNyoRbN" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="rNyoRbN">
  <span>See the Pen <a href="https://codepen.io/TaroTsujimoto/pen/rNyoRbN">
  rNyoRbN</a> by Taro (<a href="https://codepen.io/TaroTsujimoto">@TaroTsujimoto</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
【Kotlin】イベントリスナ

#■イベントとイベントハンドラとリスナ
タップ処理などユーザーの操作に対して何か処理をする時に必要なもの

###■イベント
ユーザーが画面に対して何か操作を行う事

イメージ：タップ

###■イベントハンドラ
イベントに対して行う処理の事

イメージ：なになにする。
###■リスナ
イベントの検出を行っているもの

イメージ：タップされるか見張ってる。

###■リスナーインターフェイス
それぞれのイベントに対応したリスナーインターフェイスが用意されている。
ほとんどはViewクラスのメンバーインターフェイスとして定義されている。
適切なインターフェイスを実装したクラスをリスナクラスと言う。

#■Androidでリスナを設定する手順

###1
それぞれのイベントに対応したリスナクラスを作成する。
■タップイベントに対してリスナクラスを作るには
リスナインターフェイスの
View.OnClickListenerを実装する。
View.OnClickListenerを使用するには
import android.view.Viewが必要。


``` kotlin
import android.view.View  

//Privateインナークラスで定義したとする。
Private inner class Hoge: View.OnclickListener {

}
```

###2
イベントハンドラを用意中に行いたい処理を書く
イベントハンドラはリスナーインターフェイスView.OnclickListenerのメソッドにあたる。

``` kotlin
import android.view.View  

//Privateインナークラスで定義したとする。
Private inner class Hoge: View.OnclickListener {
   override fun onClick(v: View?) {
            
   }
}
```

###3

onClickメソッドに行いたい処理を書く

``` kotlin

import android.view.View  

//Privateインナークラスで定義したとする。
Private inner class Hoge: View.OnclickListener {
   override fun onClick(v: View?) {
       val text1 = findViewById<TextView>(R.id.textView)
       text1.text = "おおきに"     
   }
}
 
```

###4

リスナクラスのインスタンスを作成してリスナ設定メソッドの引数として渡す。
タップするとリスナクラスの処理が発動する。

``` kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

    //ここから
   val btn = findViewById<Button>(R.id.Click)
   val hoge = Hoge()
   btn.setOnClickListener(hoge)
    }
```
スクリプトのディレクトリは暗黙的にsys.pathに追加される(スクリプトとしての実行でなくpython -mとしての実行だと追加されない)

```sh
$ cat test_0.py 
import sys
print(sys.path)
```

```
pytest -s test_0.py

['/usr/local/bin', (snip)]
```

```
python -m pytest -s test_0.py

['', (snip)]
```

/usr/local/bin 内の.pyを(ここではtest_0.py内で)暗黙的にimportすることは、`python -m`だとできませんので注意。

私がこれで2時間ほどはまったので。。
Ruby, railsでハマった罠集(随時更新)

# 2次元配列の初期化

###ダメな書き方
```
dp = Array.new(N+1, Array.new(M+1, 0))
```

`dp[1][0]` を更新すると `dp[0][0]`も更新されちゃうやつ(object_idが一緒)

###正しい書き方
```
dp = Array.new(N+1) {Array.new(M+1, 0)}
```

###参考

https://simanman.hatenablog.com/entry/2013/06/20/161437


# 全角スペース

###まずみてください

```ruby:test.rb
if false
    puts 'A'
else 
    puts 'C'
end
```

何も出力されません. エラーも出ません.
実は, elseの後に全角スペースが入ってます.

**エラー出してくれ・・・**


# file_field_tagでファイル名しか送れない

### ダメな書き方

```ruby:app/views/コントローラ名/ほにゃ.html.erb
<%= form_tag(controller: コントローラ名, action:"ほにゃ", multipart: true) do%>
    <%= file_field_tag("file")%>
    <%= submit_tag%>
<% end %>
```

```ruby:app/controller/コントローラ名_controller.rb
.
.
.

  p params[:file].class

.
.
.
```

これだとstring型だと言われ, 内容はfile名です.
URLをよく見ると, 最後に?multipart=trueみたいになってたので
あぁここの書き方がよくなさそうみたいな見当はつきました

### ただしい書き方
<%= form_tag({controller: コントローラ名, action:"ほにゃ"}, multipart: true) do%>
    <%= file_field_tag("file")%>
    <%= submit_tag%>
<% end %>


結局どうしてだめだったのかあんまりわかってない

```ruby:ドキュメント
form_tag(リンク先 [オプション or HTML属性 or イベント属性]) do
end
```
らしいので, リンク先というのが一つのハッシュになってないといけないのかなぁ
って思ったけど

```ruby
<%= form_tag(controller:hoge, action:fuga)%>
```

でも許されるんだよなぁ

ってきもちでわからない。

### 参考

https://source.hatenadiary.jp/entry/2014/03/21/143914

https://www.c-and-d.org/controller_file_upload/

https://railsdoc.com/page/form_tag


# 配列の複製1
これは, 書く前にどうせそうだろうなぁ〜って思って調べたのでハマってはないけど。
### ダメな書き方(=で代入)
```ruby
A = [1,2,3]
B = A
B[0] = 0

p A
p B
p (A.object_id == B.object_id)
```

```:実行結果
[0, 2, 3]
[0, 2, 3]
true
```

Aの中身も変わっちゃってます。
object_idも同じなので, そういうことです。

### 正しい書き方(clone, dup)

```ruby
A = [1,2,3]
B = A.dup
B[0] = 0

p A
p B
p (A.object_id == B.object_id)

C = [1,2,3]
D = C.clone
D[0] = 0

p C
p D
p (C.object_id == D.object_id)
```

```実行結果
[1, 2, 3]
[0, 2, 3]
false
[1, 2, 3]
[0, 2, 3]
false

```

> dup はオブジェクトの内容, taint 情報をコピーし、 clone はそれに加えて freeze, 特異メソッドなどの情報も含めた完全な複製を作成します。


###参考

https://qiita.com/ricoirico/items/5cfcac1b8e67184641f1

https://docs.ruby-lang.org/ja/latest/method/Object/i/clone.html


# 配列複製2(浅いコピーと深いコピー)
上の続き。

###だめな書き方
```ruby
A = [[1,1],[2,2],[3,3]]
B = A.dup

B[1] = [3,3] #これはいいけど
B[0][0] = 0 #これはだめ
p A
p B
p A.object_id == B.object_id
```

```:実行結果
[[0, 1], [2, 2], [3, 3]]
[[0, 1], [3, 3], [3, 3]]
false
```

object_idは違うけど, 浅いコピーになってる。

>clone や dup は浅い(shallow)コピーであることに注意してください。

###ただしい書き方

```ruby
A = [[1,1],[2,2],[3,3]]
B = Marshal.load(Marshal.dump(A))

B[0][0] = 0 
p A
p B
p A.object_id == B.object_id
```

```:実行結果
[[1, 1], [2, 2], [3, 3]]
[[0, 1], [2, 2], [3, 3]]
false
```



###参考

https://qiita.com/ricoirico/items/5cfcac1b8e67184641f1

https://docs.ruby-lang.org/ja/latest/method/Object/i/clone.html




#モデル名
###だめなこと
モデルの名前をrecordにする

railsで使ってるものと名前が被ってしまうらしくて, Record.newとかできなくなる.
拡張ユークリッドの互除法を理解する

拡張ユークリッドの互除法とは？
===
${\rm gcd}(a,b)$ を求めるついでに $xa + yb = {\rm gcd}(a,b)$ の解 $(x, y)$ もついでに求めるアルゴリズムです

ユークリッドの互除法復習
===
とりあえず147と60のgcdを求めてみましょう

```math
\begin{alignat}{2}
& & & & 147 \\
& & & & 60 \\
147 & \quad \% \quad & 60 \quad = \quad & & 27 \\
60 & \quad \% \quad & 27 \quad = \quad & & 6 \\
27 & \quad \% \quad & 6 \quad = \quad & & 3 \\
6 & \quad \% \quad & 3 \quad = \quad & & 0 \\
\end{alignat}
```

よって ${\rm gcd}(147,60) = 3$ です
見ての通り $z_0 = 147, z_1 = 60, z_i = z_{i-2} \% z_{i-1}$ という隣接2項間漸化式ですね
フィボナッチ数列みたいな感じです

これを素直に実装するとすれば以下のような感じでしょうか

```c++
int gcd(int a, int b){
    int z[1000] = { a, b };
    for(int i = 2; ; ++i){
        int q = z[i-2] / z[i-1];
        z[i] = z[i-2] - z[i-1] * q;
        if(z[i] == 0) return z[i-1];
    }
}
```

後の説明が楽になるようにmod演算ではなく除算と引き算を使って実装しました

拡張ユークリッドの互除法
===
ここで $z_i = z_{i-2} - z_{i-1} * q_i, \quad q_i = {\rm floor}(z_{i-2} / z_{i-1})$ という処理を
$xa + yb = z$ という形の数式に対して実行してみましょう

```math
\begin{alignat}{5}
1 & \quad \times \quad & 147 & \quad + \quad & 0 & \quad \times \quad & 60 & \quad = \quad & 147 & \qquad (1) \\
0 & \quad \times \quad & 147 & \quad + \quad & 1 & \quad \times \quad & 60 & \quad = \quad & 60 & \qquad (2) \\
1 & \quad \times \quad & 147 & \quad + \quad & (-2) & \quad \times \quad & 60 & \quad = \quad & 27 & \qquad (3) = (1) - 2 \times (2) \\
(-2) & \quad \times \quad & 147 & \quad + \quad & 5 & \quad \times \quad & 60 & \quad = \quad & 6 & \qquad (4) = (2) - 2 \times (3) \\
9 & \quad \times \quad & 147 & \quad + \quad & (-22) & \quad \times \quad & 60 & \quad = \quad & 3 & \qquad (5) = (3) - 4 \times (4) \\
& & & \quad \text{(略)} &  &  &  & \quad = \quad & 0 & \qquad (6) = (7) - 2 \times (8) \\
\end{alignat}
```

ということで
${\rm gcd}(147,60) = 3$ を求めるついでに $xa + yb = {\rm gcd}(147,60) = 3$ の解 $(x, y) = (9, -22)$ が求まりました。

先ほどと同じように実装するとこんな感じでしょうか？

```c++
struct eq {
    int x,y,z;
    eq operator*(int q)const{ return { x*q, y*q, z*q }; }
    eq operator-(const eq &b)const{ return { x-b.x, y-b.y, z-b.z }; }
};
eq extgcd(int a, int b){
    eq e[1000] = { {1,0,a}, {0,1,b} };
    for(int i = 2; ; ++i){
        int q = e[i-2].z / e[i-1].z;
        e[i] = e[i-2] - e[i-1] * q;
        if(e[i].z == 0) return e[i-1];
    }
}
```

フィボナッチ数列を求める時と同じように過去2回分まで結果を持っておけば十分なので整理すると

```c++
std::tuple<int,int,int> extgcd(int a, int b){
    int x=1,y=0;
    int u=0,v=1;
    while(b){
        int q = a / b;
        x -= u * q;
        y -= v * q;
        a %= b;
        std::swap(x, u);
        std::swap(y, v);
        std::swap(a, b);
    }
    return {x,y,a};
}
```
docker チート

#チートリスト

##Dockerコンテナ一覧表示

```bash:
$ docker ps -a
```

##Dockerコンテナの削除

```bash:
$ docker rm [コンテナID]
$ docker rm -f [コンテナID] //消えない場合
```

##Dockerイメージ一覧表示

```bash:
$ docker images
```

##Dockerイメージの削除

```bash:
$ docker rmi [イメージID]
$ docker rm -f [コンテナID] //消えない場合
```


##Docker Hubからイメージの取得
- docker pull [OPTIONS] NAME[:TAG|@DIGEST]

```bash:apacheイメージの取得
$ docker pull httpd
```

##Dockerイメージからコンテナの作成・起動・停止
- docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

```bash:
$ docker run -d -p 8080:80 httpd
```

```bash:ポートがLISTENしているか確認
$ sudo lsof -i -P | grep "LISTEN"
```

```bash:コンテナの停止
$ docker stop [コンテナID]
```

```bash:コンテナの起動
$ docker start [コンテナID]
```

##Dockerコンテナにシェルで入る
```bash:
$ docker exec -i -t [コンテナID] /bin/bash
```

##ボリュームのマウントオプション(永続化)
docker run -v "マウント元(ゲストOS):マウント先(コンテナ)"

```bash:
$ docker run -d -p 80:80 -v "/home/developer/docker/htdocs/:/usr/local/apache2/htdocs/" httpd
```


#リファレンス

##Apache
- [Docker Hub - httpd](https://hub.docker.com/_/httpd)
- [Docker 公式 httpd イメージを利用して Docker を体験してみよう](https://weblabo.oscasierra.net/docker-httpd-usage/)
- []()