OmniAICreator/Qiita-1.07M huggingface dataset:
RailsでMySQLのviewテーブルをmigrationで管理する

## 概要
Railsでは標準でviewテーブルをmigrationで管理することができない。
そこで、[scenic](https://github.com/scenic-views/scenic)というgemを使って実現する。

ただし、このgemは標準でPostgreSQLにしか対応していないので、[scenic-mysql_adapter](https://github.com/EmpaticoOrg/scenic-mysql_adapter)というgemも使ってMySQLで使えるようにする。

## Installation
### gemをインストール
以下を追記

```rb:Gemfile
gem 'scenic', '~> 1.5', '>= 1.5.4'
gem 'scenic-mysql_adapter', '~> 1.0', '>= 1.0.1'
```

Install

```console
$ bundle install --path vendor/bundle/
```


### scenic.rbの作成
config/initializers/scenic.rbを作成する

```rb:config/initializers/scenic.rb
require 'scenic/mysql_adapter'

Scenic.configure do |config|
  config.database = Scenic::Adapters::MySQL.new
end
```

## Usage
### migrationファイルを生成
以下はsearch_resultsというviewテーブルを作成する例。

```console
$ bundle exec rails generate scenic:view search_results
      create  db/views/search_results_v01.sql
      create  db/migrate/[TIMESTAMP]_create_search_results.rb
```

生成された以下のファイルに、viewテーブルを作成するDDLのcreate文以外の箇所を記載する。

```rb:db/views/search_results_v01.sql
SELECT
  statuses.id AS searchable_id,
  'Status' AS searchable_type,
  comments.body AS term
FROM statuses
JOIN comments ON statuses.id = comments.status_id

UNION

SELECT
  statuses.id AS searchable_id,
  'Status' AS searchable_type,
  statuses.body AS term
FROM statuses
```

### migrate

```console
$ bundle exec rake db:migrate
```

テスト用テーブルの作成も忘れずに

```console
$ bundle exec rake db:test:prepare
```

## Updateする場合
以下を実行するとsearch_results_v02.sqlが作成されるので、新しいDDLを記載し、`rake db:migrate`する。

```console
$ bundle exec rails generate scenic:view search_results
      create  db/views/search_results_v02.sql
      create  db/migrate/[TIMESTAMP]_update_search_results_to_version_2.rb
```

db/schema.rbも変更されるので確認すること。

## ちなみに
scenic-mysql_adapterを導入せずにmigrateすると、テーブルは作成されるが以下のエラーが出る。

```console
$ bundle exec rake db:migrate
rake aborted!
ActiveRecord::StatementInvalid: Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'current_schemas(false))
            ORDER BY c.oid' at line 11:             SELECT
              c.relname as viewname,
              pg_get_viewdef(c.oid) AS definition,
              c.relkind AS kind,
              n.nspname AS namespace
            FROM pg_class c
              LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
            WHERE
              c.relkind IN ('m', 'v')
              AND c.relname NOT IN (SELECT extname FROM pg_extension)
              AND n.nspname = ANY (current_schemas(false))
            ORDER BY c.oid
```

## リンク
- https://github.com/scenic-views/scenic
- https://github.com/EmpaticoOrg/scenic-mysql_adapter
Anacondaでvenvがハマった話[解決済み]

今回はPythonのvenvについて、トラブルがあったので記録として残しておく。

# 環境
OS: Windows10 64bit
Anaconda3-2020.11x86 (Python3.8.4-conda base)
VSCode: x64-1.54.3

# 起こったこと
機械学習を学んでおり、古いWindows10 PCでAnacondaとJupyter notebookを多用していた。しかし老朽化したので新しいWindows10 PCを購入し、環境の移植を行った。

これからアプリケーション上で動くアルゴリズムを構築しようと考えていることもあり、jupyter notebookを卒業してVSCodeに乗り換えることを決意。ちょうどVSCodeがjupyter notebookに対応するようになったことも追い風になった。元々**仮想環境を一切使わない**という素人丸出しな状態だったので、心機一転使い方を勉強することに。

新PCを開き、まずはAnaconda3をインストール。続いてVSCodeをインストール。VSCodeでdropbox内に保管していた作業フォルダを開き、いざ仮想環境を作ろう！となったところで困った。コード自体はすぐに分かった。

```
python -m venv "環境名"
```

しかしターミナルにコードを入力しても、何回やっても新規ディレクトリが全く生成されない！しかもエラーが出ないしprint文は使えるので、どうやらpythonそのものはきちんと動いているらしい。なぜだ。ここから、夜の12時からGoogle検索を2時間ほど続ける羽目になった。（そして風邪を引いた）

# 解決策
結論だけ述べると、**Anacondaが悪さをしていた**。つまり、Anacondaを削除した後でPythonそのものを単体でインストールしたところ、何事もなく仮想環境の構築ができた。昔からpipとcondaの相性の悪さなどは聞いていたが、まさか自分が被害を被るとは・・・

察しのいい方は環境設定で気づかれたかもしれないが、通常のpythonをインストールしないまま、Anaconda同梱のpython.exeに頼っていたのである。これがいけなかった。そんなんわかるわけないやん・・・

# 所感
どうして私がハマったかというと、古いPCでは**Anacondaを入れた状態でも普通にvenvが使えていた**からである。

今思えば通常のpythonとAnacondaを両方インストールしていたので、何事もなく動いてしまったのであろう。また、初めてpythonに触れたのが2018年に受講したpython+機械学習セミナーだったため、Anacondaをインストールするように言われてjupyter notebookを使うのが当たり前だと思い込んでしまっていた。

どんなに検索しても、「venvで仮想環境の構築が簡単にできるよ！」という記事しか出てこない。途中で思わず壁にマウスを投げつけそうになった。解決の糸口になったのは、「Anaconda venv 相性悪い」と検索して出てきた記事だった。それは「Anacondaがとあるライブラリとバッティングしたのでアンインストールした」というものだった。直接venvとは関係ない内容だったが、それを見てハッとした。Anacondaを消せば、いけるんじゃないか。

空から一筋の光が差した気分だった。空から降りてくる蜘蛛の糸を目の当たりにしたカンダタの気持ちもかくや、である。

こういう環境設定のちょっとしたところこそ大きな落とし穴があると思う。教科書には絶対に書いてない（というか書けない）し、初心者が自己診断するにはハードルが高すぎる。下手したらここで挫折して一生トラウマになっていたかもしれない。私のようなひどい目に会う人が一人でも減ることを祈っている。
Yahoo! JAPAN Hack Day 2021 Onlineに参加しました！(初ハッカソン)

初めまして、こーたです。Qittaに記事を投稿するのは初めてです。変な点があればガンガンにアドバイスしてください!
#はじめに
Yahoo! JAPAN Hack Day 2021 Onlineに参加した記事です。僕にとって初めてのハッカソンでした。この記事では開発したものとその過程をまとめてます。



#開発したもの
カメラに映る顔から感情を読み取り、顔文字を出力する顔文字アバタープラグインの開発をしました。
音声認識して、特定のフレーズが入力されると画像が出る機能付きです。

こんな感じのイメージです。
![HackID_62_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503318/f84ea0c5-3d9a-2d24-0965-c567054a0b5b.png)

#チームメンバー
同じ学校の3人のメンバーで出場しました。大会当日はコロナ対策のため、集まらず遠隔でやりました。

役割はこんな感じです。
僕 　 ：顔認識部分
Oくん：音声認識部分
Mくん：パワポづくり

チーム名は"なんかいける気がする"です。

#0日目　案出し
顔文字を使うアイディアが多かったです。僕は顔文字を使ったことがありません。
JCVさんの属性認識SDKを使うことができそうだったんで、今回のアイディアになりました。本当は音声認識部分にヤフーさんのNLU(自然言語理解)を使う方針でしたが開発が間に合わず断念。

#1日目正午12時　開発開始
ご飯食べてたら12時過ぎてました。のんびり開発開始です。Discordで雑談しながら作ってました。
因みに昼ご飯はチャーハンでした。

#午後5時　Zoomの接続確認
プレゼンを行う人が接続確認をしました。Zoomの背景にHackDay用で公式で配布されている画像を使用しましたがなぜか僕のものだけ左右反転しているというトラブルが発生。反転モードみたいなのがONになってました。普段Zoom使ってないから仕方ないよね。

#午後7時　おおまかな部分は完成
属性認識SDKの表情統計がとれるものを利用して表情に合う顔文字がでるようになりました。カメラの顔の位置に合わせて顔文字を出力してました。使う顔文字はほかのメンバーに任せました。このあたりで大まかな機能は完成していました。
これが通常時の顔です。
**(´・ω・`)**
うれしいときはこれ。
**(*^▽^*)**
これが顔の動きに合わせて画面内をうろつきまわります。

因みに夜ご飯はてんぷらでした。

#午後11時　ハックヌードルを食べるか迷う
食べるか寝るかで迷いました。結局食べなかったし3時くらいまで寝ませんでした。
![IMG_2078.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503318/7de294d1-e737-67b6-0f6a-3c7ae08823fd.jpeg)


#2日目午前2時 パワポのお手伝い
パワポで使う資料のお手伝いしてました。あと眼鏡や顔の角度といった機能もちょくちょく足していきました。
   　正面　　　左向いてるとき
**(´・ω・`)**　　**(´・ω・  `)**
空白を入れることで表現しています。ちょっと変化を地味にしすぎたかな？

そういえば、OくんのSpyderが落ちまくってたらしいよ。ウケる。

#午前8時　統合
音声認識の部分と統合しました。まぁ統合って言ってもそれぞれ別のものを同時に動かしてるだけです。
因みに朝ご飯は納豆でした。

#2日目午前11時　完成!
パワポ含めて全部完成しました。
因みに昼ご飯は牛丼でした。

#午後3時　プレゼン発表
少し噛みました。結構練習したんだけどなぁ。

#結果
JCV賞を頂きました！今回は初めてのハッカソンだったこともあって、完成させることが目標だったんで最高の結果でした！
#終わりに
なんか日記みたいな記事になっちゃいました。
本来の目的の開発物の紹介はできなかったけどせっかくなんで投稿します。
作成したものに関しては後日ちゃんと書きます！たぶん

HackDayは最高に楽しかったです！運営してくださった方々に最大の感謝！
PennyLaneで量子機械学習

# 量子機械学習

何らかの意味で量子計算を取り入れた機械学習を　量子機械学習　といいます。
一口に量子機械学習といっても「量子計算をどこに取り入れたか」で様々あります。

- 古典機械学習において、計算が重い部分を量子アルゴリズムで高速計算する  (計算結果は古典と同じ)
- 古典機械学習において、カーネルを、量子状態という高次の空間を用いて定義する（計算結果は古典と異なるが、高速性は不明）
- ブラックボックスモデルをニューラルネットワークからパラメータ付き量子回路へ変更して機械学習を行う（計算結果は古典と異なるが、高速性は不明）
- ブラックボックスであるニューラルネットワークを2つ用意して、固定の量子回路を挟み込み、ニューラルネットワーク部分だけ学習させる（計算結果は古典と異なるが、高速性は不明）

などなど。
量子機械学習は古典機械学習と量子計算の両方を使うので、プログラミングが結構大変です。
ライブラリが使いたいですよね。
そんなあなたにPennyLane！

# PennyLaneとは？

 PennyLaneは、光量子コンピューターの大家であるXANADU社が開発しているオープンソースのpython SDKです。
古典機械学習ユーザーでも使えるように、Tensor flow およびその抽象化であるKerasをベースにしています。
 PennyLaneは連続量量子計算（光量子）でも離散量量子計算（超電導やイオントラップ）でも扱えますし、
実行させるバックエンドとしてもIBMQやIonQなど一通り指定できるようです。
すごいですね。
連続量のほうはStrawberry field, 離散量のほうはCirqが裏で動いているぽいです。

チュートリアルは、日本語版はないですが、アプリケーション毎に最先端のものが公開されています。
(https://pennylane.ai)


## PennyLaneでの量子機械学習


ニューラルネットワーク部分だけ学習させるタイプのデモがあります。
https://pennylane.ai/qml/demos/tutorial_qnn_module_tf.html

ここでは分類問題ですが、改造すれば色々出来ると思います。
ちなみに量子回路学習とは違って、全量子ビットを測定し、それを後段の古典NNで処理して値を1つ取り出す形になっていますね。

量子回路学習的なやつ（ブラックボックスモデルとして量子回路を使う）は、以下のようです。
https://pennylane.ai/qml/demos/quantum_neural_net.html
連続量量子の変分回路で書かれてますが、たぶん離散量の量子に書き換えるのはそれほど大変ではないです。


PennyLaneのすごいところとして、まだqiskitも対応していない「量子勾配による勾配降下」が既に入っています。

https://pennylane.ai/qml/demos/tutorial_stochastic_parameter_shift.html#the-parameter-shift-rule

勾配計算の方法も色々あるようです。

- parameter shift rule に基づくもの。パラメータの数値微分に似た方法。
- back propagation に類似の方法を使うもの。

parameter shift ruleのほうは、コスト関数の計算をパラメータ数程度繰り返す必要があることがネックです。
back propagation類似のほうは、コスト関数の計算は1度だけでよいですが、”中間状態を測定”する必要があるので、実機では使えません。
（中間状態を測定すると量子状態は破壊されて、計算結果が変わるため）

## PennyLaneの難点？

- そもそも量子計算が最低限わかってないと無理。（基礎があまり説明ない）
- 連続量量子と離散量量子がデモによって混ざっていて、もどかしい。
- 全部英語。
- 日本では、マニアック。（そもそも"PennyLane"タグでのQiita記事は、本記事が初めてである）

まぁ、qiskitのtutorialが読めるレベルであれば、全く問題なく使えます。


# まとめ

量子機械学習がやりたいKerasユーザーはPennyLaneがいいかも。
(Tensor flow Quantum でも良いと思うけど）
LXCコンテナでPX-S1UDを使って録画サーバを作るメモ

LXCで録画サーバを最終的に作りたくて地デジ1chでテストのメモ

* HW
    * ハコ: NUC6i5SYK
    * メモリ: 16+8GiB
    * ディスク: SSD 4TB
        * 実はNVMEをPCIeに変換して6口SATAのPCIeインタフェースカードをつけてる
        * SATA電源はMBのSATA 5Pinを分岐。手持ちディスク4本すべて電源足りた。SATA 5Pinの電源経路がMB経由ではなくACアダプタ直結のパワーブロックから供給されていて65Wまでなんぼでもイケてしまうのかも？
    * USB
        * PX-S1UD
        * ACR39-NTTCom

* SW
    * ホストのOS: Proxmox VE 6.3
    * LXCコンテナ: Ubuntu 20.04 (特権)
    * mirakurun + MySQL(MariaDB) + EPG Station

やること

1. proxmoxでの作業
    1. コンテナのAppArmarを無効化してしまうために以下を追記
        * 無効化しないほうがよいので本番を作るときは自分頑張ってほしい

        ```proxmox_/etc/pve/lxc/XXX.conf
lxc.apparmor.profile: unconfined
```
    1. USBデバイスをコンテナに見せるために以下も追記
        * 追記する内容を調べる

        ```proxmox.
$ lsusb
Bus 001 Device 003: ID 072f:b100 Advanced Card Systems, Ltd ACR39U
Bus 001 Device 002: ID 3275:0080 VidzMedia Pte Ltd 
$ ls -l /dev/bus/usb/001/00{2,3} 
crw-rw-r-- 1 root root 189, 1 Mar 31 22:50 /dev/bus/usb/001/002
crw-rw-r-- 1 root root 189, 2 Mar 31 22:50 /dev/bus/usb/001/003
```
        * 上記をもとに以下を追記する

        ```proxmox_/etc/pve/lxc/XXX.conf
lxc.cgroup.devices.allow: c 189:* rwm
lxc.mount.entry: /dev/bus/usb/001 dev/bus/usb/001 none bind,optional,create=dir
```
    1. DVBデバイスをコンテナに見せるために以下も追記
        * 追記する内容を調べる

        ```proxmox.
$ ls -l /dev/dvb/adapter0/
crw-rw---- 1 root video 212, 0 Mar 31 22:50 demux0
crw-rw---- 1 root video 212, 1 Mar 31 22:50 dvr0
crw-rw---- 1 root video 212, 2 Mar 31 22:50 frontend0
```
        * 上記をもとに以下を追記する

        ```proxmox_/etc/pve/lxc/XXX.conf
lxc.cgroup.devices.allow: c 212:* rwm
lxc.mount.entry: /dev/dvb dev/dvb none bind,optional,create=dir
```
        * ドライバを自分で入れる系のチューナーはちょっと内容変わるはず

1. LXCコンテナでの作業
    * dockerでmirakurun+EPG Station。先人に感謝 :pray:
    * うちはテレビと同じ線で分岐してつなげようとするとエラーエラーで悩んだ
        * ケーブルが問題ないこと
        * テレビを外して問題ないこと
        * pcsc_scanできていること
        * 別マシンでUSBチューナーが問題ないこと

確認の部分の記載・・・ちからつきた。観られて満足。
TopCoder SRM802 Div.1East DisjointDiceValues 確率: さいころをn回降ってr種類出る数、a回とb回振って目の重複のない

https://community.topcoder.com/stat?c=problem_statement&pm=16815&rd=18537

2007 神戸大・文理（後)
> さいころを n 回投げたとき、出た目の数が3種類になる確率を求めよ。

の強化です。クーポンコレクター問題の親戚。


# 題意
- Aさんがa個のさいころとBさんがb個のさいころを振ったとき, AさんとBさんで1つも同じ目が出る確率を求めよ
    - 例えば[1,1,3]と[2,3,4]なら3が出ているのでOK。[1,2,3]と[6,6,6]なら同じ目がないのでNG
 
# こう考えた
記事の下のリンクを読みます。$n$回さいころを振って$r$種類の目出る確率$f(n,r)$は以下のように示せます。
(頭に紹介した大学の入試ではr=3の時のみ問っていました)
$$ f(n,r) = \frac{{}_6 C_r}{6^n} \cdot \sum _{i=1} ^{r} (-1)^{r-i} \cdot i^n \cdot {}_n C _{r} $$
このとき、求める確率$p$は以下のようになります。
$$ p = f(a,5) \cdot (1 - (\frac{1}{6})^b) +  \\\
f(a,4) \cdot (1 - (\frac{2}{6})^b) + ... \\\
f(a,1) \cdot (1 - (\frac{5}{6})^b)
$$


```Python
class DisjointDiceValues:
    def getProbability(self, a,b):
        # 組み合わせ
        def nCr(n, r):
            import math
            # nCrのr>nは組み合わせが存在しないので0を返す
            # raiseすべきのこともあるかも
            if r > n:
                return 0
            return math.factorial(n) // ((math.factorial(n - r) * math.factorial(r)))
        def do(n, r):  # n回降ってr種類出る数
            res = (1.0 / 6.0 ** (n*1.0)) * nCr(6.0, r)
            tmp = 0
            for i in range(r + 1):
                tmp += ((-1) ** (r - i)) * float(nCr(r, i)) * float((i ** n))
            return res * tmp
        res = 0
        res += (do(a, 6)) * (1 - (0 / 6.0) ** b)
        res += (do(a, 5)) * (1 - (1 / 6.0) ** b)
        res += (do(a, 4)) * (1 - (2 / 6.0) ** b)
        res += (do(a, 3)) * (1 - (3 / 6.0) ** b)
        res += (do(a, 2)) * (1 - (4 / 6.0) ** b)
        res += (do(a, 1)) * (1 - (5 / 6.0) ** b)
        res += (do(a, 0)) * (1 - (6 / 6.0) ** b)

        print(res)
        return(res)
```

# link

https://izu-mix.com/math/?p=173
> サイコロの目が3種類になる確率

http://ynomura.dip.jp/archives/2011/06/nk.html
> n個のサイコロの目がk種類になる確率
マイクロサービスにおけるE2Eテストはどうするべきか？

# 概要
* マイクロサービスにおける問題と感じるものの中にマイクロサービスにおけるE2Eテストがあります。
* 今回は、この問題と解決策の１つを記事にしていきます。

# マイクロサービスにおけるE2Eテスト
## 問題点
* なぜマイクロサービスにおけるE2Eテストが問題なのかというと、それは**テストスコープがかなり大きい点**にあります。

### なぜテストスコープが大きくなるの？
その理由は、下記の２つにあります。

* 1つ目にマイクロサービスでは、複数のサービスにまたがりテストを実行しなければいけない
* 2つ目にテスト時に全てのサービスをデプロイし、テストのシナリオを全てのサービス揃えないといけない

## 解決策

* この場合の解決策として、**コンシューマ駆動契約**を利用する方法があります。

### コンシューマ駆動契約(Consummer Driven Contracts - CDC)とは？

* サービスの利用側/提供側で**「サービスの振る舞い(動作の期待値や使用)」**を**契約**と定義し、サービス利用側(コンシューマ)が契約を結ぶことを**責務**とし、その契約を壊していないことを利用側/提供側双方でテストをする方法です。

#### メリット

* サービス利用者側(コンシューマ)の視点から定義されてるので、予期せぬ**契約**を拾い上げることができます。
* また、サービス利用者側(コンシューマ)の視点の要求も理解できるので、今後の改善の指標にも使えます。

#### デメリット

* 契約が破壊された時にマイクロサービスを所有するチーム間でのコミュニケーション(例えば問題点の検出など)が必須
* 契約された内容(主にI/F)のみしか保証されない

# まとめ
* 今回は、マイクロサービスにおける問題であるE2Eテストとその解決策としてのコンシューマ駆動契約についてまとめていきました。

# 参考文献
* [小さなサービスも契約する時代](https://www.slideshare.net/RyoMitoma/ss-120901867)
* [モノリスからマイクロサービスへ
――モノリスを進化させる実践移行ガイド](https://www.oreilly.co.jp/books/9784873119311/)
Stimulusでbuttonを再現する

これまでの記事で入門と、よりよい実装方法について説明しました。
* [Stimulusをはじめよう](https://qiita.com/nazomikan/items/4dabc63b883aa71ce83c)
* [Stimulusの実装の勘所 - primitive controller -](https://qiita.com/nazomikan/items/a5f0813ddc63bc5a2708)

今回からはより実践的なControllerを作っていきたいと思います。

今回はButtonを再現するコントローラを作ります。

## ButtonとButtonの振る舞い

```JavaScript
<button type="button">button</button>
```

なんてことはありません。　普通のbutton要素です。

通常はこのbutton要素を使って、ユーザーアクションを受けつければよいのですが、ごく稀にやむにやまない事情でbutton要素以外をButtonとして使わざるをいけないケースがあったりします。

そんな時、求められる要件は以下の通りになるかと思います。

* フォーカス可能である
* role=buttonが付与されている
* キーボード操作(space, enterでクリック)可能であること

上二つはHTMLだけで完結しますが、最後の部分に関してはbutton要素以外で再現するにはJavaScriptが必要になります。

## Buttonの振る舞いを提供するcontroller

非常に簡単です

```JavaScript
app.register('button', class extends Controller {
  keyboardClick(event) {
    if ([ "Enter", " " ].includes(event.key)) {
      event.preventDefault()
      event.stopPropagation()

      this.element.click()
    }
  }
})
```

event.keyをみてenterかスペースだったらイベントの伝播とデフォルトの挙動をとめてclickイベントを発火します。
これでその要素はbuttonのように振る舞うでしょう。

プラスして前述のroleの指定, focus可能があればほぼButtonです。

HTMLはこんな感じで用意すればよいでしょう

```HTML
<div role="button"
  class="button"
  tabindex="0"
  data-controller="button test"
  data-action="keydown->button#keyboardClick click->test#notify"
>ボタンもどき</div>
```

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="nazomikan" data-slug-hash="RwKKaxL" 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="QIITA_STIMULUS_BUTTON">
  <span>See the Pen <a href="https://codepen.io/nazomikan/pen/RwKKaxL">
  QIITA_STIMULUS_BUTTON</a> by nazomikan (<a href="https://codepen.io/nazomikan">@nazomikan</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

正確にはkeydownではないとか色々あるかもしれませんが、キーボード操作可能な偽Buttonができました。

やむにやまない事情でButtonを別の要素で再現するときはこういった実装が結構役に立ったりします。
picoCTF 2021  Some Assembly Required 2

できなかった問題をwriteup等を参考に勉強した記録を残す。

# Some Assembly Required 2

http://mercury.picoctf.net:61778/index.html

1に続いて，またwasm
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/43bd2108-58cd-d967-e86f-5db80ed3a85c.png)
1でフラグがあった場所に暗号化したような文字列がある

```
xakgK\5cNs((j:l9<mimk?:k;9;8=8?=0?>jnn:j=lu
```

CyberChefのMagicに頼んでみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/6c50970e-9ae1-576f-8014-1347fe44b2f1.png)
0x08とxorして
picoCT=kF{  b2d14eaec72c31305075876bff2b5d}
=k とか { の後ろにスペースがある。

=k と { の後ろのスペースを除去して
picoCTF{b2d14eaec72c31305075876bff2b5d}を答えに突っ込んでみる
だめ

まんまの
picoCT=kF{  b2d14eaec72c31305075876bff2b5d}は？
だめ

=kだけ除去
picoCTF{  b2d14eaec72c31305075876bff2b5d}は？
正解
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/565766b1-5049-96c4-38f0-a0697abf98eb.png)

picoCT=kFとなったのが気になったのでpython2.7でやってみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/a7efd6d1-4037-87ff-ee85-18bdf5afb824.png)
同じだ。

何でだろ？
Rails, Docker コンテナが起動しないトラブルに遭遇

#【Rails, Docker コンテナが起動しないトラブルに遭遇】

Railsが起動しないトラブルが発生しました。
なんとか解決したので備忘録として残します。

この記事に関しまして、何か問題がございましたらコメント頂けますと幸いです。

##トラブル内容

$docker-compose up を実行してもRailsが起動しない。
（これまでは、普通にRailsが起動できていた。）

```:エラー内容
web_1  | => Booting Puma
web_1  | => Rails 6.1.3 application starting in development
web_1  | => Run `bin/rails server --help` for more startup options
web_1  | A server is already running. Check /app/tmp/pids/server.pid.
web_1  | Exiting
rails-product_web_1 exited with code 1
```

##Google翻訳でエラーコードを理解してみる。

```
web_1 | =>ブートプーマ
web_1 | =>開発を開始するRails6.1.3アプリケーション
web_1 | =>その他の起動オプションについては、 `bin / rails server--help`を実行してください
web_1 | サーバーはすでに実行されています。 /app/tmp/pids/server.pidを確認してください。
web_1 | 終了
rails-product_web_1がコード1で終了しました
```
サーバーはすでに実行されています。となっている。
　→　だから、Railsは起動してくれない？そして、最終的に終了した？

##app/tmp/pids/server.pidを確認

**/app/tmp/pids/server.pidを確認してください。**となっている。
　→　$code tmp/pids/server.pid で中身を見てみた。

ここに原因があるのか。

```:server.pid
1
```
となっていた。

意味がわからなかった。。

##エラー解決へのヒント

[logicoffee プログラム勉強日記 【Rails, Docker】コンテナが起動後すぐに落ちてしまうトラブルの原因とその対処法](https://logicoffee.hatenablog.com/entry/2018/06/26/195502)

上記の記事に、

tmp/pids/server.pidというファイルです. 中身を見てみましょう.
$ cat tmp/pids/server.pid
1
ひとつだけ書かれた数字はRails ServerのPIDです. 
Linuxでは各プロセスにIDをつけて管理しています. またDockerでは, プロセスIDが1であるプロセスが終了した場合, コンテナも終了するようになっています.

と書かれています。
一部、抜粋させていただきました。
とても助かりました。

原因は、やはりこの**1**で間違いなさそうです。

##解決策

tmp/pids/server.pidの**1**を消して更新しました。

```:server.pid

```
その結果、無事にRailsはこれまで通りに起動してくれました！

##このエラーがなぜ起こったのか。

$docker-compose up を実行し、終了する際に、
$docker-compose down で終了しなかったことが考えられる。
（無意識のうちに強制終了してしまっていたのかも。。）

これによって、
$docker-compose down で終了した場合に、自動で消去してくれるはずの一時的な情報が消去されずに残ったから**1**となっていた？
　→　そのため、Railsは起動中と判断されていた。

##おわりに

自分のような経験の浅い人間でも既に過去に同じエラーに遭遇している先輩方の記事が解決策を提示してくだっさっていることがよくあるので、Googleで調べることでエラーを解決することが可能になっている。

今後もエラーコードをよく読み、立ち向かう癖をつけていこうと思う。
【Oracle DB】最大値をもつレコードの値以外の列だけ取得したい

# テーマ：最大値をもつレコードの値以外の列だけ取得したい
おこづかいを一番たくさん貰っている人の名前だけを抽出したい。
クエリ寄りの言い方をすると、テーブル[おこづかい]から列[きんがく]の最大値をもつレコードについて、列[なまえ]の値だけ取得したい。

▼テーブル[おこづかい]

なまえ | きんがく
--- | ---
さとう | 1000
たなか | 2500
やまだ | 5000
びるげいつ | 1000000

```SQL:SQL
SELECT なまえ
FROM おこづかい
WHERE おこづかい = (
       SELECT MAX(きんがく)
       FROM おこづかい
      )
```
```SQL:結果

| おこづかい   |
—----------——-
| びるげいつ   |
```

びるげいつ君が一番おこづかいをもらっていることがわかったよ！
やったね！

# おまけ
最大値をもつレコードの名称だけ取得したいのに、
MAX(きんがく)はSELECT句でしか使えないので、どうやって抽出条件に加えようか迷っていた。
実際のPJで使ったクエリはWHERE句にキー値を指定したり、もう少し煩雑。
副問い合わせを使って最大値をWHERE句の条件に指定する、という備忘のため投稿。
Stimulusでdisclosureを作る

これまでの記事で入門と、よりよい実装方法について説明しました。
* [Stimulusをはじめよう](https://qiita.com/nazomikan/items/4dabc63b883aa71ce83c)
* [Stimulusの実装の勘所 - primitive controller -](https://qiita.com/nazomikan/items/a5f0813ddc63bc5a2708)

今回からはより実践的なControllerを作っていきたいと思います。

手始めにDisclosureを作りましょう。

## Disclosureとは

details-summary要素のように折りたたみ可能なUIのことです。

[ソシオメディア](https://www.sociomedia.co.jp/1682)さんで詳細に説明がされています

## Disclosureに求められる要件

* トリガー要素をクリックするとディスクロージャーが開き、再度クリックすると閉じる
* 開いてるかどうかをaria-expandedでスクリーンリーダー等に知らせる

## HTMLを書いてみる

```HTML
<div class="Note Note--close">
  <button type="button"
     class="Note__trigger"
     aria-controls="note__contents"
     aria-expanded="false"
  >年末年始の営業について</button>
  <div class="Note__content" id="note__contents">
    <p>12月28日から翌年1月6日まで休みます。</p>
    <p>尚、その間はネット販売も休止しておりますのでご了承ください</p>
  </div>
</div>
```

trigger要素に使役する要素をaria-controlsで指定し、開閉状態をaria-expandedで説明します。

次はこれにStimulusで振る舞いをアタッチしていきましょう。

## Disclosure Controllerを書く

button要素にdata-actionで振る舞いをもたせ、.Note--hideクラスの付け替えとbutton要素のaria-expandedの更新を行うだけです。

```JavaScript
app.register('disclosure', class extends Controller {
  static targets = ['trigger'];
  static classes = ['hide'];
  
  toggle(evt) {
    let isClose = this.element.classList.toggle(this.hideClass)
    this.triggerTarget.setAttribute('aria-expanded', String(!isClose));
  }
})
```

最低限、こんな感じの実装でよいでしょう。

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="css,result" data-user="nazomikan" data-slug-hash="YzNNwqm" 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="QIITA_STIMULUS_DISCLOSURE">
  <span>See the Pen <a href="https://codepen.io/nazomikan/pen/YzNNwqm">
  QIITA_STIMULUS_DISCLOSURE</a> by nazomikan (<a href="https://codepen.io/nazomikan">@nazomikan</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

details要素のopen属性のように状態をHTMLのattributeに持たせるのもよいかもしれません。

その場合はvalues apiを用いるとよいでしょう。

ここで作られたControllerはDOMの情報を密にもっていないため、非常に再利用性の高いパーツとして使えます。

違うclassで開閉を制御してる場合も、HTML側の`data-disclosure-hide-class`の値をそのclassに指定すればJavaScriptコードはそのまま再利用可能になります。
Nuxt.jsでよくありがちなタブメニューを作ろう！

#概要
タブ分けのメニューを作っていきます！
完成図
![スクリーンショット 2021-03-31 22.58.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/825833/9d37dc60-a3f7-eaab-1463-ea55e5a551ff.png)

よくあるタブメニューですね。
今回はマイページをタブ分けすることを想定して実装していきます。

こちらをNuxt.jsで作成していきます！。

##セットアップ

```
npx create-nuxt-app tab
```
今回はJavaScriptを使用していきます。

##早速やってみる

```pages/index.vue
<template>
  <div>
    <h1>マイページ</h1>
    <ul>
      <li :class="{ clickBtn: tab === 1 }" @click="tab = 1">お気に入り</li>
      <li :class="{ clickBtn: tab === 2 }" @click="tab = 2">設定</li>
      <li :class="{ clickBtn: tab === 3 }" @click="tab = 3">サブスク</li>
      <li :class="{ clickBtn: tab === 4 }" @click="tab = 4">履歴</li>
    </ul>
    <div class="content">
      <div v-show="tab === 1" class="content-item">
        <p>お気に入りのコンテンツです</p>
      </div>
      <div v-show="tab === 2" class="content-item">
        <p>設定の画面です</p>
      </div>
      <div v-show="tab === 3" class="content-item">
        <p>サブスクのコンテンツです</p>
      </div>
      <div v-show="tab === 4" class="content-item">
        <p>視聴履歴です</p>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data: () => {
    return {
      tab: 1,
    }
  },
}
</script>

<style scoped>
ul {
  list-style: none;
  display: flex;
  text-align: center;
}
li {
  background-color: gray;
  color: white;
  width: 140px;
  height: 50px;
  border: 1px solid white;
  padding: 10px;
}
.content {
  margin-left: 40px;
  width: 560px;
  height: 200px;
  background-color: rgb(218, 218, 218);
}
.clickBtn {
  background-color: rgb(168, 168, 168);
}
</style>
```

これでもう実装は完了です笑
説明するとまずリストでボタンを簡単に作成しています。
デフォルトのdataでtabを1に設定しておきます。

```
@click="tab = 番号"
```
こちらでクリックするとタブの番号を変更するように実装します。
:classでタブの番号がクリックされている場合は背景色をかえるよう設定してあります。

:classはv-vind:classの省略記法です。

```
もしBならばAのクラスを追加する
:class="{Aのクラス: B}"
```
といった意味です。

あとは番号に合わせて下にコンテンツをだします。
v-showはdisplay: none;に要素をすることができます。

このように要素の切り替わりが早いものに関してはv-ifではなくv-showを使っていきましょう！！！

![スクリーンショット 2021-03-31 23.20.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/825833/8791de58-26ad-bcd3-4368-f53fe8d42b8b.png)
![スクリーンショット 2021-03-31 23.20.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/825833/6148f487-52ee-800a-7cde-1d02e38c21fe.png)

いい感じに切り替わってますね！！
お疲れ様でした！
ESP32-WROOM-32にプログラムを転送するときのArduino IDEの設定

最近esp32を使ってよく実験するので、プログラム転送のための手順をメモとして書いておきます。


## 前提

- Arduino IDEがダウンロードされていること
- esp32-wroom-32を持っていること　（[開発ボード](https://akizukidenshi.com/catalog/g/gM-11819/)）

使用したOSはMacOS Catalinaです。

Arduino IDEにesp32の設定などを読み込まないといけません。espressifのgithubページの指示にしたがってダウンロードしましょう。

https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/boards_manager.md

## プログラムを転送するためのArduino IDEの設定

流れとしてはボード、通信速度、そしてポートを選べばプログラムを簡単に転送できるようになります。

ESP32 の Dev Boardを選びます。

![Screen Shot 2021-03-31 at 22.49.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/28cbb8ae-668b-70a7-50f2-140e7772e00a.png)

プログラムの転送速度ですが、ブレイクアウトボードを使っているなら最速でいいと思います。それ以外の場合で不安定な場合は115200あたりの一番遅いのがいいかもしれません。

![Screen Shot 2021-03-31 at 22.51.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/60d18b47-3045-a0fd-7813-3d55eacc5061.png)

ポートを選びましょう。今回はUARTですが、type-cなどを使って転送する場合はかわりにtype-cのポートを選びましょう。

![Screen Shot 2021-03-31 at 22.53.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/541d6d9e-40d1-4f0c-02c3-de0c6bdfed2c.png)

これでプログラムを転送する準備ができました！

## プログラムを転送してみる

今回はBLEで遊んでみたいので、ESP32のためのライブラリをダウンロードしてみました。

![Screen Shot 2021-03-31 at 23.04.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/1d7c892c-5ac0-c9e7-c163-a1e3f1614436.png)

BLE Writeというプログラムはスマホとesp32がBLE経由で通信できるようになるプログラムです。

![Screen Shot 2021-03-31 at 23.06.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/60419010-a574-5a98-7988-8d07cd7732b9.png)

このプログラムをesp32に転送します。今回は一番遅い転送速度なので、だいぶゆっくりです。

![Screen Shot 2021-03-31 at 23.09.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/85fa9621-6bb1-c183-36cc-bc0730476a99.png)

最後に終わるとこんな感じになります。

![Screen Shot 2021-03-31 at 23.10.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396623/d4e14df3-1e03-6f6a-a0ae-ac9c4efbadd3.png)
tableViewのセクションヘッダーをカスタマイズしたい

```swift
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
}
```

このfuncを使いましょう。

```swift
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let headerView = UIView()
        headerView.backgroundColor = .systemPink
        headerView.frame = CGRect(x: 0, y: 0, width: tableView.frame.width, height: 34)
        
        let title = UILabel()
        title.text = headerTitle[section]
        title.font = UIFont.systemFont(ofSize: 17, weight: .semibold)
        title.textColor = .white
        title.frame = CGRect(x: 0, y: 0, width: 0, height: 0)
        title.sizeToFit()
        headerView.addSubview(title)
        
        title.translatesAutoresizingMaskIntoConstraints = false
        title.centerYAnchor.constraint(equalTo: headerView.centerYAnchor).isActive = true
        title.leadingAnchor.constraint(equalTo: headerView.leadingAnchor, constant: 20).isActive = true
        
        return headerView
    }
}
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666875/f2415b6e-8bad-20b8-646e-d1e4df772c09.png" width="375">


色が変わりました。
ヘッダータイトルのfontやcolorなども変えられます。

高さはこのfuncで変えられます。

```swift
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 100
    }
```
Maven依存ライブラリの設定に関するメモ

Mavenプロジェクトの依存ライブラリについて、依存ライブラリの参照方法は、以下があります。
・ Mavenのセントラルリポジトリ（公開）
・ プライベートリポジトリ（非公開）
・ ローカルリポジトリ

## Mavenのセントラルリポジトリ
既に公開しているライブラリをPOMファイルに設定すれば、ビルドする際、Mavenのセントラルリポジトリから自動的にダウンロードできます。

```
<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.12</version>
   <scope>test</scope>
</dependency>
```
`mvn install` を実行すると、自動ダウンロードをします。
![sampleForJenkins_—_-bash_—_179×48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154911/a5b9bcaf-f92e-ae20-1844-5220c83f08d3.png)

## プライベートリポジトリ
何らかの理由でセントラルリポジトリにライブラリを公開したくない場合、自分でリポジトリを用意して利用できます。
ファイルサーバにプライベートリポジトリを置いて、そのURLを指定すれば、参照可能です。

```
<repository>
  <id>my-repo1</id>
  <name>your custom repo</name>
  <url>http://jarsm2.dyndns.dk</url>
</repository>
```

## ローカルリポジトリ
以下の方法でローカルリポジトリを指定することが可能です。

### ローカルリポジトリ指定方法①
POMファイルに直接依存ライブラリのパスを指定します。

```
# ojdbc6.jarの場合
<dependency>
  <groupId>com.oracle</groupId>
  <artifactId>ojdbc6</artifactId>
  <version>11.2.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/lib/ojdbc6.jar</systemPath>
</dependency>
```

### ローカルリポジトリ指定方法②
依存しているリポジトリは、ローカルに存在してあれば、以下のコマンドを実行することで、`C:\Users\ユーザー\.m2\repository`配下にjarを作成されます。
それから、生成されたjarファイルを参照可能になります。

```
mvn clean install
```
Nuxt.js + TypeScript で injectを利用した関数の呼び出しを定義する

Nuxt.jsでは [inject](https://ja.nuxtjs.org/docs/2.x/directory-structure/plugins/#root-%E3%81%A8%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E6%8C%BF%E5%85%A5) を利用することで、コンポーネント間などで共通で使用できる関数を定義することができます。
参考： [Nuxt.jsで異なるコンポーネントから共通で利用できる関数を定義する（inject編）](https://qiita.com/itouuuuuuuuu/items/bcad408842c7723e7ca3)

Javascriptでは、下記のように定義した関数（ 例：`$hoge()` ）を呼び出すことが可能です。

```vue:pages/index.vue
<script>
export default {
  methods: {
    hoge() {
      return this.$hoge();  // ここで呼び出し
    }
  }
}
</script>
```

しかし、Nuxt.js + TypeScript の環境では、そのまま `this.$hoge()` のように呼び出すことはできません。
`(this as any).$hoge()` というように `this` の型を `any` とするなどの方法がありますが、これはやりたくないですね。

TypeScriptでも `this.$hoge()` のように呼び出せるようにする方法をまとめておきます。

# 型定義ファイルを作成

今回は、injectを利用した `$hoge()` という関数を定義済みと想定します。
方法は下記を参考にしてください。
参考： [Nuxt.jsで異なるコンポーネントから共通で利用できる関数を定義する（inject編）](https://qiita.com/itouuuuuuuuu/items/bcad408842c7723e7ca3)

まず、プロジェクトのルートに `types` というディレクトリを作成し、その中に下記のような `vue.d.ts` というファイルを作成します（ディレクトリとファイル名は例です）。

```ts:types/vue.d.ts
import Vue from 'vue';

declare module 'vue/types/vue' {
  interface Vue {
    $hoge(): void  // ここに ＄hoge を定義
  }
}
```
ここでは例として `$hoge(): void` としていますが、引数や戻り値によって `$hoge(arg: string): string` など型を適宜定義します。

# 型定義ファイルの読み込み

先程作成した型定義ファイル（`types/vue.d.ts`）を読み込むように、`tsconfig.json` に追記します。

```json:tsconfig.json
{
  "compilerOptions": {
    "typeRoots" : [
      "./types"
    ]
  },
}
```

設定はこれだけです。

以上で、Nuxt.js + TypeScript の環境でも `this.$hoge()` のように関数を呼び出すことが出来ます。
Ubuntu 20.04にPython 3.7をソースからビルドしてインストールする

Ubuntu 20.04のPythonのバージョンは3.8です。
事情があってPython 3.7が必要だったので、ソースからビルドしてインストールしてみました。

# 準備

```console
sudo apt install build-essential  -y
sudo apt install libssl-dev zlib1g-dev libncurses5-dev libncursesw5-dev libreadline-dev libsqlite3-dev -y
sudo apt install libgdbm-dev libdb5.3-dev libbz2-dev libexpat1-dev liblzma-dev libffi-dev uuid-dev -y
```

```console
wget https://www.python.org/ftp/python/3.7.10/Python-3.7.10.tgz
tar zxvf Python-3.7.10.tgz 
cd Python-3.7.10/
./configure --enable-optimizations
make -j4
sudo make altinstall
```
[Python]* , ** （可変長引数と展開）

## * , \*\* （可変長引数と展開）
\*argsや\*\*kwargsといった形で引数を定義すると、
任意の数の引数を受け取る事ができる。

##### \* と \*\* は引数の受け取り方が違う
1. \*args     => Non-Keyword引数...タプル型で受け取る
1. \*\*kwargs => Keyword引数...dict型で受け取る
httpsの環境をngrokを使って最速で構築する方法

#概要

タイトルどおりなのですが、最近httpsで通信を行える環境を構築する必要があり、いくつかのの方法を思いつきました。ざっとカテゴライズすると以下のような感じ。

・レンタルサーバーを使う
・ローカルに環境を作る（仮想環境を使う）
・それ以外

調べてみるとngrokなるものがあったので今回はそちらを使うことにしました。

#環境
Mac Os catalina 10.15.7

#内容
Qiitaにngrokの記事があったのでそれを参考に環境を構築
https://qiita.com/Esfahan/items/74e71edfe17d9935d47e

コマンドでは動作しなかったので実際にngrokのサイトからインストーラーを使ってインストールするとうまく動作しました。
https://ngrok.com/

cakeコマンドを使ってインストールする記事が多かったがうまくいかず時間がかかってしまったが、単純にこのコマンドだけでhttpsで外部公開できてしまうのは凄いです。

一時的なURLを発行するので基本的にはアクセスされないと思うのですが、気になる方はBASIC認証をするなどしましょう。

ちゃんとまとまっているサイトを見つけたのでリンクをはります。
https://yuis-programming.com/?p=2227#ngrok-5
kittyでfcitx5を有効にする

## はじめに
swayとkittyのために設定したメモです。
wayland要素はないのでXでも違いはないと思います。

## 環境
- Arch Linux
- sway v1.5.1
- Waybar v0.9.5
- fcitx5 v5.0.7
- kitty v0.19.3

## インストール
mozcやskkをお好みでインストールします。

``` bash
sudo pacman -S fcitx5-im fcitx5-mozc fcitx5-skk
```

## 環境変数
kittyのために`GLFW_IM_MODULE`を追加で設定します。
`ibus`になっていますが動くようです（下記issueを参照）。

``` bash:.bashrc
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
export GLFW_IM_MODULE=ibus
```

## 起動
今回はSwayなので設定ファイル(`~/.config/sway/config`)の最後に追記します。

``` :config
exec fcitx5
```

起動すると、Waybarのトレイに勝手に出てきます。

## 設定
トレイ右クリックの設定から`Available input Method:`下の検索窓にskk(or mozc)と入力すると候補が出てくるのでダブルクリックで有効にします。
これで日本語が打てるようになります。

## 問題
kitty上でpreeditが有効になっていると、スペースで変換後に確定をせずに文字を打つ（暗黙の確定をする）と変換した文字が入力されません。
mozcでもskkでも同じです。
ブラウザ等では問題ないため、kitty上ではpreeditを無効にする（デフォルトでは`Ctrl+Alt+P`でトグル）かeskk.vimを使いましょう。

## 参考
- https://wiki.archlinux.org/index.php/Fcitx5
- https://github.com/kovidgoyal/kitty/issues/469
【備忘録】【エラー解決】rails sの結果ActionController::RoutingError (uninitialized constant StaticPagesController)」と返ってくる


Railsチュートリアルに沿ってローカル環境でアプリ開発を進めており、
第3章の「静的なページを生成する」ところで躓いてしまったため、
忘れないように残しておきます。

generateスクリプトを実行。

```
$ rails generate controller StaticPages home help
```

上記コマンドによってStaticPagesコントローラを生成すると、config/routes.rbファイルが自動的に更新されました。


```ruby:config/routes.rbファイル（更新前）
Rails.application.routes.draw do
  root 'application#hello'
end

```

```ruby:config/routes.rbファイル（更新後）
Rails.application.routes.draw do
  get 'static_pages/home'（追加）
  get 'static_pages/help'（追加）
　root 'application#hello'
end
```
$ rails sを実行し、試しに
http://localhost:3000/static_pages/home
にアクセスしてみましたが、
このような画面になってしまいました。
![スクリーンショット 2021-03-30 23.59.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985164/9164ee89-8429-b7f9-6285-f23c65b4e2ce.png)


この原因は、「ファイル名がアンダーバー区切りになっていないこと」でした・・・！！！
つまり、
$ rails generate controller StaticPages home help
ではなくて
$ rails generate controller Static_Pages home help
としなければならなかったのです。。。
（念の為さらに私は小文字に直して、$ rails generate controller static_pages home helpで実行しました）

一度、

```
$ rails d controller StaticPages home help
```
でさっき作ってしまったものを削除し、今度こそアンダーバーに気をつけながら・・・

```
$ rails generate controller static_pages home help
```
を実行し、

```
$ rails s
```
の結果・・・・・
![スクリーンショット 2021-03-31 22.48.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985164/ebe62269-04ab-a8c4-1237-77bd721b9db2.png)
成功しましたー！！
JSPファイルを作成してlocalhost環境で動かしてみた日記。

自宅の趣味用PCで**JSPファイルを作成してlocalhost環境で動かす**というのをやってみたくなったのでやってみた。
※この記事は私の自分用の日記みたいなものですので、読む価値があるかどうかはアレです。

# Javaをインストール
Javaをインストールした。超簡単に書くと下記のような流れ。

・ネット上から **jdk-15.0.2_windows-x64_bin.exe** を入手してきてインストール
・ユーザー環境変数のPATHに`C:\Program Files\Java\jdk-15.0.2\bin`を追加
・システム環境変数のJAVA_HOMEに`C:\Program Files\Java\jdk-15.0.2`を追加
・念のためコマンドプロンプトで`java -version`して結果を確認

# tomcatをインストール
こちらの解説サイトの通りに作業した感じ。
https://eng-entrance.com/java-servlet-tomcat-install

今回は`C:\apache-tomcat-9.0.44`に置くことにしたので、
tomcat開始バッチは`C:\apache-tomcat-9.0.44\bin\startup.bat`で、
tomcat終了バッチは`C:\apache-tomcat-9.0.44\bin\shutdown.bat`である。

解説サイトにも書いてあるけど、正しくインストールできたかどうかは下記手順で確認できる。
１．開始バッチを実行
２．http://localhost:8080/manager/html にアクセス
３．ユーザー名とパスワードを問われるので、自分で決めて`C:\apache-tomcat-9.0.44\conf\tomcat-users.xml`に書いておいたやつを入力
４．**Tomcat Webアプリケーションマネージャ**の画面がちゃんと表示されることを確認
５．終了バッチを実行

# コンテキストファイルとJSPファイルを作成
こちらの解説サイトの通りに作業した感じ。
https://www.javadrive.jp/servlet/jsp/index2.html

・作成したコンテキストファイル
`C:\apache-tomcat-9.0.44\conf\Catalina\localhost\hellojsp.xml`

```:hellojsp.xml
<Context path="/hellojsp"
docBase="C:/Projects/jsp-sample/hellojsp"/>
```

・作成したJSPファイル
`C:\Projects\jsp-sample\hellojsp\hellojsp.jsp`

```:hellojsp.jsp
<html>
	<head>
		<title>Hello World!</title>
	</head>
	<body>
	Hello
	<%
	out.println(" World!");
	%>
	</body>
</html>
```

# いよいよ動確
１．開始バッチを実行
２．http://localhost:8080/hellojsp/hellojsp.jsp にアクセス！
３．終了バッチを実行

無事に表示されたよ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600213/9d6449d5-fac8-9edf-39ed-17684ac62296.png)

とりあえずこれで、当初の目的である**JSPファイルを作成してlocalhost環境で動かす**というのは達成した。
今後はいろいろ動かしつつ理解を深めていきたいところ。
(モータードライバー入門)ESP32でモータを動作させる（L9110S）

ESP32を使ってモータを動作させます。今回は格安ドライバーも合わせて使ってみます。

###機材
・ESP32 DevkitC
・DCモータ
・モータドライバーL9110S

今回はAmazonで格安のドライバーL9110Sを使います。5個で880円でした。
これ１個でモータを２個制御することができ、モータの接続線はネジ部で固定できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342722/ecd3fbdd-13fe-ba6a-79a2-3efd548cbdc0.png" width=50%>

###なぜドライバーが必要なのか？

ざっくりですがドライバーには3つの効果があります。
・モータ駆動・制御に必要な部品が集約されている⇨部品点数が少ない
・モータ駆動のための制御ソフト、配線を省力化⇨手間がない
・保護回路がある⇨安全

乾電池だけでもモータは動作しますが、それだけだと制御ができません。
マイコンのピン出力だけでは電力が足りずに動作しません。

マイコン⇨ドライバー⇨モータ
　　　　　　↑
　　　　乾電池（電源）

「**外部電源とマイコンをうまいこと取り持ってくれるモジュール**」だと個人的には解釈しています。
電気屋さんや機械屋さんにはリレーみたいな部品だよ！って言った方が早いですね。（私は機械設計士ですので特に・・・）

もっと知りたい方はこちら
[ここが分かると面白くなる！エレクトロニクスの豆知識
](https://deviceplus.jp/hobby/tidbits-of-electronics-02/)

###結線
L9110Sは２つのモータを制御できます。下記表はモータ1個のみの場合です。
GPIOピンはどこでも問題ありません。
モータの接続線はドライバーのMotorAのネジ部に固定してください。

|ドライバ|ESP32|乾電池
|:---|:---|:----
|Vcc||＋電源|
|GND||-電源|
|A-1|GPIO12※||
|A-2|GPIO14※||


###コード
```java
void setup() {
  // put your setup code here, to run once:
  pinMode(12, OUTPUT);
  pinMode(14, OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(12,HIGH); //12番ピンの出力をHIGH
  digitalWrite(14,LOW); //11番ピンの出力をLOW

}
```

今回は動作確認だけですが、制御はまた今度！
c言語で階乗プログラミング

C言語で階乗を計算するプログラムを書いてみた。

練習、某所のパクリで不満が残る。ループ版と再帰版の二つを作成してみた。

```c:factorial.c
#include<stdio.h>

unsigned int factorial(unsigned int n)
{
	unsigned int result = 1;
	while( n != 0 ) result *= n, --n;
	return result;
}

unsigned int fact_rec(unsigned int n)
{
	return n == 0 ? 1 : n * fact_rec(n-1);
}

int main(void)
{
	int n;
	printf("nを入力");
	scanf("%d",&n);
	printf("%dの階乗は%d\n",n,fact_rec(n));
	return 0;
}
```
【At Corder】【初心者】ABC081A - Placing Marbles をRuby で解いてみた



#はじめに
[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～ - Qiita](https://qiita.com/drken/items/fd4e5e3630d0f5859067)

こちらの記事を参考に初心者がAt corderに挑戦します。
目的としては、就職活動でのコーディングテスト対策です。
毎日１問を目標としてコツコツやってきます:thinking:

わからないことは調べる精神です。ちょっとでもわからないなぁ、と思ったことは調べて解説と参考文献を載せますので、同じ内容でわからない人がいれば参考にししてください:baby:


https://atcoder.jp/home

#問題 ABC081A - Placing Marbles
1,2,3の番号がついた３つのマスがあり、それぞれ0か1が書かれている。
マスiにはs_iが書かれている。1が書かれたマスにビー玉を置く。ビー玉が置かれるマスがいくつあるか求めよ。
#制約

s1,s2,s3s1,s2,s3は1あるいは0

#入力　出力

```ruby
s1s2s3
```

出力
答えを出力せよ

入力例

```ruby
101
```

出力例

```ruby
2
```

#回答

```rb
array = []
array = gets.chomp.split("").map(&:to_i)
p array.count(1)

```

#解説
まずarrayを宣言して、その後入力を受ける。
今回は一文字ずつ代入するのでsplit("")とする。
mapメソッドを使って、配列として代入する

```rb
配列.map{|変数|変数に対する処理}
```
一つ一つの要素に対して処理をしてから代入してくれる。今回は変数ではないので&にしておくのかな？

参考文献より一文で書ける様子

```rb
p gets.chomp.split("").map(&:to_i).count(1)
```

かっこいい、、

#感想
配列の場合、どのように入力すればいいのかわからなかった。今回は配列を宣言してから=gets.chomp~としてみた。

配列に代入するとき、必ずしも事前に用意する必要はないみたい。

```rb
array = gets.chomp.split("").map(&:to_i)
```

宣言しなくても、いきなり配列として代入することができる。

```rb
array = array.push(1)
```

これはNG。nilに対してメソッドは使えない。

```rb
array = []
array = array.push(1)
```

これだとOK。
配列に直接メソッドを使う場合は前もって定義しておく必要がある。


<a id="#reference"></a>
# 参考文献
[[Atcoder]ABC081A - Placing Marbles[Ruby]](https://cloraordinary.com/abc081a-placing-marbles)

[【Ruby】標準入力と出力のまとめ - Qiita](https://qiita.com/Sobue-Yuki/items/93638169e8a8a0c4b3d5)
NestJSにswaggerを入れてみた

ネタ的に今更かもですが、仕事でこのswaggerのやつ見て、すげーっ！てなったので、自分の持ってたnest環境に適用した内容を書きました。

やった事は公式ほぼ丸パクリですw 
下に参考リンク貼っていくので、そちら見ればできます。


## 前提
nestjs 環境あり

## 構築
### パッケージインストール
```
npm install --save @nestjs/swagger swagger-ui-express
```

※swagger-ui-express
ソース見て、なくても良いんじゃない？と思って入れなかったら見事にエラー。
内部的に使ってたので必要でした。（書いているんで当然か。。）

### ソース修正

#### ファイル追加 （公式書いる初期設定を外部ファイル化しただけです）
lib/SwaggerUtil.ts

```
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';

export class SwaggerUtil {
  async setup(app) {
    const config = new DocumentBuilder()
      .setTitle('API')
      .setDescription('The API description')
      .setVersion('1.0')
      .addTag('api')
      .build();
    const document = SwaggerModule.createDocument(app, config);
    SwaggerModule.setup('api', app, document);
  }
}
```

#### main.tsにswagger設定を追加

```
  const app = await NestFactory.create(AppModule);
  const swaggerUtil = new SwaggerUtil();
  await swaggerUtil.setup(app);
  await app.listen(3000);
```

## 確認
```
nest start
```

http://localhost:3000/api


## まとめ
ライブラリ入れて、ちょっとソース追加でドキュメントができるのすごい！

コメントとか細かい設定とかは別途って話ですが、これだけで、Controllerに書いている、@GETや@POSTのfunctionがapiドキュメントになってしまうってのは非常にお手軽で良いです。

難点は起動の最初がほんの少し重いかも、、でもそこは許容してでも導入するメリットは高いかなと個人的な考えです。

## 参考
https://docs.nestjs.com/openapi/introduction
First Commit前にgit reset する場合の対処

#概要
初めてのコミット前にgit resetしおうと思ったらできなかったので、その時の対処法をメモします。


#方法

##失敗した方法

```
git reset HEAD
```

```
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
```

普段はこちらでgit add をresetできますが、コミットを一度もしたことない場合できませんでした。

##成功した方法

```
git reset HEAD -- .
```
ライトゲーマーには最適のRadeon RX5500XT

#安かったRadeon RX5500XT
去年夏に自作したPC [RYZEN7＋RADEONでPC組んでみた](https://qiita.com/susumu_taka/items/06a1f26f6f75d7c9d3c0) で採用した、ASRock製「AMD Radeon RX 5500 XT Challenger D 8G OC」を半年使い込んでみた。

#PC環境のおさらい

　CPU:Ryzen 7 3700X
　マザーボード：B550 Steel Legend
　メモリー：Trident Z RGB F4-3200C16D-16GTZRX
　グラフィックカード：Radeon RX 5500 XT Challenger D 8G OC
　SSD：FireCuda520SSD 500GB
　電源：SST-ST75F-GS V3
　ケース：H510 CA-H510B-W1 （マットホワイト）
![20210329_005811009_iOS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100025/bfc946d7-eb99-fc96-b65d-df806779854e.jpeg)

#何故このグラフィックカードを選んだのか？
元々開発で使用するPCなので、グラフィックはそこまで強くなくてもよい。
とは言いながらも、Youtubeチャンネルの動画を編集したり、ライトなゲームもしたりする。
Gen4の恩恵もあるし、Radeonのグラフィックカードを選択した。
あと、当時とてもコスパが良かった（23,976円）

#ミドルレンジと侮るなかれ・・・
半年使用したグラフィックカードのベンチマークを取ってみた
1080pであれば大体のゲームは60FPS以上で動くし、1440pでも概ね60FPS近くは出る。

あと、Challenger Tweakを使用してクロック数を調整する場合、「OC Mode」と「Sillent Mode」に大きな差が出ないので、基本「Sillent Mode」で十分運用できる。
「Sillent Mode」でも1800MHZは普通に出るので（しかも静か）さほど困る必要もない。

〇ASRock Challenger Tweakの設定は基本サイレント
![サイレント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100025/ea659c31-9a8d-f471-b1ed-bd3817e67144.png)

〇TIME SPYのベンチマーク結果
![ベンチ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100025/a3499a42-9efa-6d71-2933-7b838aa501a1.png)

〇ベンチマーク中の温度
![温度.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100025/69531d9a-3487-d0a7-ee1f-d90547727544.png)

ちなみに、こんな使い方も出来る
Challenger Tweakの動作モードを「User Mode」に変え、パラメーターをMAXに全振りすると。。。
更に引き上げる事が出来る
![5500_user2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100025/1f461dea-843c-15e9-4d2b-74d972f7d444.png)

#今後の予定
Radeonの6000番台にそろそろ乗り換えたいですねぇ
在庫も復活しつつあるので、あとは値段が落ち着けば・・・
[SwiftUI]UserDefaultsとDatePickerを使用して残り日数をカウントする方法

## はじめに
今回作成したもの
![画面収録 2021-03-31 21.47.40.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517666/f5e72116-3a3e-64c8-2847-298ebb954171.gif)
今回はDatePickerを使って目的の日付を選択すると、今日から目的日までの日数を計算して表示してくれるものを作りました。
ファイルは一番下にGitのリンクを貼っておきますので良ければご活用ください！

## 環境
・ /macOS Big Sur 11.3
・ SwiftUI : 2.0
・ Xcode : 12.0
## 作り方
UswrDefaultについては下記の記事を見て頂くと理解しやすいと思いますので掲載しておきます。

https://capibara1969.com/2539/


## 作り方
まずはUserDefaultsの準備をします。

```swift
import SwiftUI
class DateLog: ObservableObject {
    
    @Published var endDate: Date {
        didSet {
            UserDefaults.standard.set(endDate, forKey: "endDate")
        }
    }
    
    init() {
        endDate = UserDefaults.standard.object(forKey: "endDate") as? Date ?? Date()
    }
}
 
```

続いてContentView

## 実装
```swift
import SwiftUI

struct ContentView: View {
    @EnvironmentObject var dateLog: DateLog
    //残り日数の処理
    var dateFormatter: DateFormatter {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy.MM.dd"
        return dateFormatter
    }
    var body: some View {
        ZStack{
            let firstDateReset = resetTime(date: dateLog.endDate)
            let secondDateReset: Date = resetTime(date: Date())
            Text("試験日まで残り\(Int(firstDateReset.timeIntervalSince(secondDateReset)/86400))日")
            
        DatePicker("試験日⇨",
                   selection: $dateLog.endDate,
                   in: Date()...,
                   displayedComponents: [.date])
            .foregroundColor(.clear)
            .opacity(0.1)
            .background(Color.clear)
            .opacity(0.1)
            .font(.title3)
        }.frame(width: 250, height: 60, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .environmentObject(DateLog())
    }
}


//残り日数計算function
func resetTime(date: Date) -> Date {
    let calendar: Calendar = Calendar(identifier: .gregorian)
    var components = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date)
    
    components.hour = 0
    components.minute = 0
    components.second = 0
    
    return calendar.date(from: components)!
}

```

以上で出来上がりです。

## Tips
以外とどこにも無かった事で工夫した点はDatePicker表示を消して、残り日数だけを表示させた点です。
普通にDatePickerを使用するとUIが以下のように確定してしまいます。（イメージ図）
![スクリーンショット 2021-03-31 21.38.45.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517666/b4c6f7fe-250d-4053-0c82-885eb5e65392.jpeg)

これだと自由度がなく味気ないので今回は残りの日数のみを表示させようと思いDatePickerを消しました！
消し方はDatePickerに対して
.foregroundColor(.clear)
            .opacity(0.1)
            .background(Color.clear)
            .opacity(0.1)
を追加するだけです。SwiftUIではほとんどこの”Clear”と”Opacity”のコンボで消せます。
是非オリジナリティなUIを設計する際は使用してみてください！

## まとめ

今回作成したファイル

https://github.com/yuujioka/DateCount.git
Ruby　ループ処理をまとめてみた

Rubyのループの処理は配列やハッシュのメソッドまで含めると多くの種類があります。
この記事では、配列やハッシュのループについて**基礎的ループ**を8つと、**発展的なループ**で「next」「redo」「break」などの制御構造や、配列、ハッシュのループメソッドを解説していきます。


#for

for文は基本的に指定した範囲オブジェクトの範囲分同じ処理を繰り返したり、配列の要素を順番に取得したい場合に使用します。

```
for number in 1..5 do
  p number
end

=>  [1, 2, 3, 4, 5]
```

また、配列の中身を順番に出力したい時は以下のように記述します。

```
for number in [1,3,5,9] do
  p number
end

=> [1, 3, 5, 9]
```

#each

先ほど解説したfor文は、実は配列のループではあまり使われません。
よく使用されるのは**「eachメソッド」**です。
eachメソッドは配列や範囲オブジェクトで使用できるメソッドで、**オブジェクトに含まれる要素を順番に取得**することができます。

```
[1,3,5,9].each do |number|
  p number
end

=> [1, 3, 5, 9]
```

```
{ dog:"犬", cat:"猫", monkey:"猿" }.each do |k,v|
  p "#{k}はkey、#{v}はvalue"
end

=> "dogはkey、犬はvalue"
=> "catはkey、猫はvalue"
=> "monkeyはkey、猿はvalue"
```

#while

whileでは**指定した条件式の値が真である間**ループします。
for文は指定した要素分繰り返し処理を行うのに対して、while文は**条件式が偽になるまで処理を繰り返し行います**。

```
number = 0

while number <= 12 do
  p number
  number += 3
end

=> [0, 3, 6, 9, 12]
```

上記の例ようにnumberに値をループのたびに加算し、 num<=12がfalse になったときにループが終了するようにしています。
また、doは省略することも可能。

#until

untilでは指定した条件がfalseである間ループします。
whileが条件がtrueの間繰り返すのに対して、こちらは**falseの間繰り返すメソッドになります**。

```
number = 16
until number <=12 do
  p number
  number -=1
end

=> [16, 15, 14, 13]
```

#loop

loopを使えば、**breakでループを終了させない限りループし続ける処理を実装できます**。

```
number = 0
loop do
  p number
  number += 3
  if number >= 12
    break
   end
end

=> [0, 3, 6, 9]
```

#times

任意の回数ループさせるときに便利。**指定した回数分だけループさせることができます**。

```
3.times do |number|
  p number
end

=> [0, 1, 2]
```
```
5.times do
  p "ループしてます。"
end

=> ["ループしてます。","ループしてます。","ループしてます。","ループしてます。","ループしてます。"]
```

#upto

uptoは指定した数に到達するまでループで、**その間にブロックパラメーターが1ずつ増加します。**

```
1.upto(3) do |number|
  p number
end

=> [1, 2, 3]
```

#downto

downtoはuptoの反対で、**指定した数に到達するループ間に、変数が1ずつ減少します**。

```
3.downto(1) do |num|
  p num
end

=> [3, 2, 1]
```

#step

さきほど解説したtimesでは、実は任意の整数しか指定できませんでしたが、**stepを使えば少数も扱えます**。

```
3.6.step(6.0,1.2) do |number|
  p number
end

=> [3.6, 4.8, 6.0]
```

#prime

**任意の数までの素数を出力したい場合**にはPrimeが便利です。

```
require 'prime'
Prime.each(11) do |number|
  p number
end

=> [2, 3, 5, 7, 11]
```


#発展的なループ

##next

nextを使えば、**それ以降の処理を飛ばしてループを続けられます**。

```
[1,2,3,4].each do |number|
  next if number == 1
  p number
end

=> [2, 3, 4]
```
このように1の時はnext以降の「p number」が飛ばされて、1が出力されないことを確認できます。

##redo

redoを使えば、**もう一度そのループの始め方処理を繰り返すことができます**。

```
[0,1,2,3,4].each do |number|
  number += 1
  p number
  redo if number == 1
end

=> [1, 2, 2, 3, 4, 5]
```

このように2が2回繰り返されています。
これはnum==1 のときにredoが働いてもう一度そのループを始めから読み込んだからです。


##break
breakを使えば、ループを任意のタイミングで抜け出すことができます。

```
[1,2,3,4].each do |number|
  break if number == 3
  p number
end

=> [1, 2]
```