OmniAICreator/Qiita-1.07M huggingface dataset:
【#1 エンジニア転職学習】HTML/CSS模写コーディング

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

学習内容は昨日投稿した以下の記事を基にしています。


https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
* 模写コーディング
* おうちで学べるデータベースのきほん（本記事投稿後に読書します）

# 模写コーディング
当初は予定になかったのですが、ポートフォリオを作成する際に最低限のWebページ作成能力は必要と考えたので取り組みました。

やり方としては、下記サイトの題材に対してレイアウト説明等を見ながら自分でコーディングしていく流れです。
とはいえ、HTML・CSSはProgateで「とりあえず概要が分かればい」感覚でやった程度です。1回目は完全にソースコードを書き写して復習・初見のタグ等は調べてという状態でした。
2回目で全体をざっくり自力で書けるくらいで模写しました。

個人的には、IDを使用したページ内リンクの仕組みを知って、Webページで一気にスクロールするのはこれが使われているのかと感動してました。

https://code-step.com/profile-layout/

# おわりに
最後までお読みいただきありがとうございました。
明日も模写の続きを軽くして、別の学習に移りたいと思います。
フロントエンドの効率的な学習方法などのアドバイス・ご意見等いただけますと幸いです。
Raspberry pi インジケーターランプ(ACTライト)の意味

## Raspberry pi インジケーターランプの意味
ACTコンポーネントは、RaspberryPiのアクティビティを示します。このコンポーネントの緑色のLEDが常に点滅している場合は、アプリケーションがシステムで実行されていることを示しています。

緑色のライトが点灯したままの場合は、SDカードがまだ接続されていることを示しています。SDカードを挿入しても緑色のライトが表示されない場合は、セットアップに問題があることを示しています。これらの手順に従ってRaspberryPiOSシステムをインストールしてください。ライトがオフの場合は、インストールに問題がある可能性があります。

Raspberry Piを使用すると、緑色のライトが異なる速度で点滅する場合があることに気付くでしょう。ライトが点滅しているパターンは、発生している問題を示しています。
|ライトパターン| 状態 |
|:-----------|:------------|
| 常に点灯      |SDカードが接続されています |
| 一貫して点滅    |コードの読み取りまたは書き込み |
| 一貫して消灯      |OSインストールの失敗|
| 3回点滅       |起動の一般的な失敗 |
| 4回点滅         |	start*.elfが見つかりません |
| 7回点滅       |カーネル画像（kernel.img）が見つかりません |
| 8回点滅    |SDRAMの障害 |
| 9回点滅    |不十分なSDRAM |
| 10回点滅    |HALT状態| 

- ACTコンポーネントの緑色のライトが3回点滅する場合、これは一般的なロードの失敗を示しています。
- 緑色のACTライトが4回点滅する場合は、コード「start.elf」が見つからなかったことを示しています。Start.elfは、ブートフォルダの先頭にある関数です。この機能が見つからない場合、RaspberryPiは起動しません。
- Raspberry PiのACTライトが7回緑色に点滅する場合、これは、ロードする画像が点滅しないことを意味します。
- ACTライトが8回点滅する場合は、SDRAMが認識されておらず、プログラムのハードデータにアクセスできないことを示しています。

# もしよろしければこちらの記事もお願いします。
https://qiita.com/napspans/items/e26e4207ee122a2217fb
ActiveRecord オブジェクトを dup メソッドでコピーする場合は、インスタンス変数もコピーすることに注意する

# バージョン情報

```shell
$ ruby -v
ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [arm64-darwin21]

$ bin/rails -v
Rails 7.0.3
```

# 内容

ActiveRecord オブジェクトの属性 (attributes) を引き継いだ別のオブジェクトを作成し、データベースに保存したい場合に [ActiveRecord::Core#dup](https://api.rubyonrails.org/classes/ActiveRecord/Core.html#method-i-dup) を使用することがある。この場合、たしかに属性は引き継がれるが、同時に [Object#dup](https://docs.ruby-lang.org/en/3.1/Object.html#method-i-dup) の振る舞いにより**インスタンス変数の値も引き継ぐ**。

https://docs.ruby-lang.org/en/3.1/Object.html#method-i-dup より

> Produces a shallow copy of obj—the instance variables of obj are copied, but not the objects they reference.

そのため、例えば以下のようにインスタンス変数を使って特定の値をメモ化している場合、コピー先にもその値を意図せず引き継ぐ場合があるので注意が必要だ。

```rb:app/models/monster.rb
class Monster < ApplicationRecord
  def monster_itself
    @monster_itself ||= self
  end
end
```

```rb
monster = Monster.find_by!(name: 'リオレウス')
#=> #<Monster:0x00000001098be980 id: 1, name: "リオレウス", category: "飛竜種", habitat: "森丘", created_at: ...>
monster.monster_itself.name
#=> "リオレウス"

subsp_monster = monster.dup
#=> #<Monster:0x000000010b0af508 id: nil, name: "リオレウス", category: "飛竜種", habitat: "森丘", created_at: nil, updated_at: nil>
subsp_monster.assign_attributes(name: 'リオレウス亜種')
subsp_monster.name
#=> "リオレウス亜種"
subsp_monster.monster_itself.name # あれ？ 🤔
#=> "リオレウス"

# subsp_monster.monster_itself が自分自身ではなく、コピー元のオブジェクトを返す 🤔
subsp_monster.monster_itself == monster
#=> true
subsp_monster.monster_itself == subsp_monster
#=> false
```

これを防ぐには、dup メソッドを使用せずにコピー元のオブジェクトの属性を使用して新しいオブジェクトを作成するようにする。

```rb
monster = Monster.find_by!(name: 'リオレウス')
monster.monster_itself.name
#=> "リオレウス"

attributes = monster.attributes.symbolize_keys.except(:id, :created_at, :updated_at)
#=> {:name=>"リオレウス", :category=>"飛竜種", :habitat=>"森丘"}
subsp_monster = Monster.new(attributes.merge(name: 'リオレウス亜種'))
#=> #<Monster:0x00000001073bb408 id: nil, name: "リオレウス亜種", category: "飛竜種", habitat: "森丘", created_at: nil, updated_at: nil>
subsp_monster.name
#=> "リオレウス亜種"
subsp_monster.monster_itself.name
#=> "リオレウス亜種"

# subsp_monster.monster_itself が自分自身を返すようになった 😉
subsp_monster.monster_itself == monster
#=> false
subsp_monster.monster_itself == subsp_monster
#=> true
```

# 参考

- [Object#dup](https://docs.ruby-lang.org/en/3.1/Object.html#method-i-dup)
- [ActiveRecord::Core#dup](https://api.rubyonrails.org/classes/ActiveRecord/Core.html#method-i-dup)
  - [ActiveRecord::Core#initialize_dup の実装](https://github.com/rails/rails/blob/3872bc0e54d32e8bf3a6299b0bfe173d94b072fc/activerecord/lib/active_record/core.rb#L529-L551)
    - initialize_dup メソッドは dup メソッドの内部で呼び出されるフックメソッド。dup の振る舞いを独自に定義したい場合にオーバーライドする目的で定義されている。
RTK-gnss(GPS)をROS2に入れ込む（備忘録）

備忘録
## おおまかな構成
f9p
ubuntu
ros2 galactic

## 参考
https://github.com/KumarRobotics/ublox

## git clone
```
cd
cd ros2/src
```
(自分のwsはros2)
```
git clone -b galactic-devel https://github.com/KumarRobotics/ublox.git
```
-b以降のブランチは自分の環境に合わせて設定（自分はROS2 galactic)
ブランチ一覧の見方：https://qiita.com/sunstripe2011/items/30f46a7bf451c1a85c2b
ブランチ指定：https://backlog.com/ja/git-tutorial/stepup/08/

## ビルド
ros2のワークスペース(ws)にディレクトリを変更(自分のwsはros2)
```
cd
cd ros2
```
ビルド
```
colcon build 
```
## 設定変更
①/ros2/ublox/ublox_gps/config/zed_f9p.yamlの中身の該当行のみ下記に変更
```
debug :4
device : /dev/ttyACM0
```
deviceは実際のデバイスに合わせる
（参考）：https://qiita.com/m2_labo/items/7823fb26197fa5f5ff23

②/ros2/ublox/ublox_gps/launch/ublox_gps_node-launch.pyの中身の該当行のみ下記に変更
```
params = os.path.join(config_directory, 'zed_f9p.yaml')
```

## 再度ビルド
```
cd
cd ros2
```
```
colcon build
source install/setup.bash
```

## 実行
ubloxのGPSノード起動
```
ros2 launch ublox_gps ublox_gps_node-launch.py
```

別ターミナルでrtk起動
```
cd RTKLIB/app/consapp/str2str/gcc
./str2str -in ntrip://アイディ:パスワード@ユーアールエル:ポート/マウント#rtcm3 -out serial://ttyACM0:115200#1111
``` 
ttyACM0のシリアルポートは自分の接続したシリアルポートに合わせてください。
起動しない場合はrtklibの実装してください
参考：https://qiita.com/m2_labo/items/4af7a5da91addeb93a15

## 確認
```
ros2 topic echo /fix
```

~~教えてほしい
別途navsat_transform_nodeをたちあげてもsensor_msgs/NavSatFix message on the /gps/filtered がpublishされない。設定等ご存じのかた教えて頂きたい。~~
↑
### 解決できた↓↓
https://qiita.com/m2_labo/items/201836440cd846e754fa
https://qiita.com/m2_labo/items/6eab3202289220aadd5f
インフラ構成について復習と予備知識

## 目的
ポートフォリオを作成して、サーバー構築してデプロイを行いました。
サーバーの構築についての自分用の備忘録です。
また、モダンなサーバー構築の技術について調べました。
誰かの参考になれば幸いです。

## 目次
**・インフラ構成図
・NGINXについて
・PUMAについて
・Dockerについて**

## インフラ構成図
![PFサーバー構成 drawio](https://user-images.githubusercontent.com/80334879/173719854-53c3c1bb-5e72-4fc1-ba76-480f3a831e4f.png)

## NGINXについて
参考記事：[ApacheとNginxを比較！](https://www.geekly.co.jp/column/cat-technology/1903_096/)
**役割**
①WEBサーバー
静的コンテンツはそのままレスポンス、動的コンテンツについてはapplicationサーバーへリクエストを送る
②リバースプロキシ
目的のサーバーに中継する

**得られる恩恵**
**→ 表示速度が向上する！安定したサービス提供が行える！**
①大量の同時接続数に耐える
①早い速度でコンテンツを提供
②負荷分散を行える
②セキュリティの向上

**類似サービス**
・Apache

**類似サービスとの違い**
①同時処理数の負荷に強い
②メモリの使用量が少ない

## PUMAについて
**役割**
applicationサーバー
webサーバーから受け取ったHTTPリクエストをRailsなどのアプリケーションへ中継する。
Railsから静的コンテンツに変換されたものを受け取り、webサーバーへ返答する。

**得られる恩恵**
**→ 表示速度が向上する！安定したサービス提供が行える！
→運用が楽になる！**
・分散処理によるパフォーマンス向上
・メンテナンス、トラブルシュートが容易
・セキュリティの向上


**類似サービス**
・Unicorn

**類似サービスとの違い**
・マルチスレッドのため、処理速度が速い


## Dockerについて（予備知識）
使用するOS（MACなど）上で仮想環境を構築し、上記で挙げたサーバーなどをコンテナの中のイメージとして扱える。

**メリット**
**→円滑にチーム開発を行うことができる！**
・コンテナ上で仮想環境を作成し、立ち上げると軽量で、速度が早い
・誰のパソコンでも平等な環境
・イメージなどを他へ配布しやすい

## まとめ
目的とそれを使用すると受けられる恩恵などを調べることで、使用する経緯を理解することができました。
Visual Studioで、代入式の左辺と右辺を簡単に置換する方法

# やりたい事

プログラムを書いていると時折
大量にある代入式の左辺と右辺を一括で置き換えたくなる時があります。

みなさんも思い当たる事あると思います。

例えば、とあるエンティティクラスの中身を、GUIに展開するとして、
ユーザーの操作を経て、GUIの値を、エンティティクラスに戻したい・・・
みたいな時。
(MVVMとかデータバインドとか使ってりゃ、大体解決するって話は置いといて)

前書きを長くかいてもしょうがない事なので、余談は後述するとして。
# 解決方法
Visual Studioには、「Ctrl+F」で呼び出せる検索・置き換え機能があり、そこで正規表現が使えます。
その正規表現を活用する事で、解決できる事が(今更)わかりました。
あの右上に出るやつです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464438/51a4c1a4-4904-a084-3598-59faa15a0ed1.png)



環境は以下の通りです。
Windows 10 Pro 64bit 21H1
Microsoft Visual Studio Community 2022

## C#の場合
```:C#
検索: \b(.*)(\s=\s)(.*)(;)
置換: $3$2$1$4
```

## VisualBasicの場合
```:VB
検索: \b(.*)(\s=\s)(.*)(?!\n)
置換: $3$2$1
```

これだけです。画像で示した正規表現を使うアイコンをクリックし、有効化した状態で
この魔法の呪文のようなものを入れると、左辺と右辺を置き換える事ができます。

複数行でも、しっかり置換が機能しますので、
間違っても、ソリューション全体に対し全て置換なんて事、やってはいけません。
用法用量を守って正しくお使いください。

~~正規表現で何をしているのか、解説を載せようと考えていましたが、僕自身が何書いてるかよくわかんねぇからやめときます。~~

ポイントとなるのは、使う言語で若干指定が異なる部分でしょうか。
C#の場合、末尾にセミコロンを入れるため、セミコロンまで適切に扱うように書かないと
なんか上手くいきませんでした。

VBの場合は、末尾というか、大抵の場合改行が入ってると思いますので、改行をあえて否定させる事で
改行を含まない形で、置換が出来るようになっています。

当然、コードの書き方によっては、うまくいかない場合もあるかと思うので、
各々で磨きに磨きかかったご自慢の正規表現スキルを発揮して頂ければと思います。
僕は今回改めて、正規表現超むずーいって思いました。
# 余談というか
この正規表現を使った置換アプローチ。
存在こそ知ってはいたのですが、実際に使った事は無かったため、
正規表現のおさらいも兼ねて、取り組んでみました。
もっと良い書き方や、方法論があれば是非コメント頂けるとありがたいです。

今思えば、長い開発人生において、僕は左辺右辺の置換は、ほぼ手打していました。
若いころは、少しでも効率よく記述したいとの思いから、Excel関数を駆使するだとか色々やってたんですが
僕自身キーボードの入力速度が割と早いので、いちいちExcel開いてコピペして関数書いてみたいなのが
最終的にはめんどくさくなり、気付いたらゴリゴリとゼロから打つようになってました。
コピペすらしないという。

今回取り組んでみたきっかけは、昔書いたアプリのコードが、大分レガシーな感じだった為
コードの見直しをしてた折に、大量の代入式左辺右辺の置換を行いたくなったのがきっかけでした。

というか、左辺右辺の置換って、絶対に需要あると思うんだよなぁ。
MSはショートカットキーとかで実装してくれないものだろうか。
僕が知らないだけで、実は拡張機能とかであったりして・・・。

この記事がみなさんの役に立てば幸いです。
【yocto】レイヤ一覧を確認する方法

# はじめに
- レイヤ(meta-xxx)の優先度とかを確認したい人向け

# 方法
~~~
bitbake-layers show-layers
~~~

# 例
- bitbake前準備
~~~
takeshi@X250:~/yocto/poky$ source oe-init-build-env 
(略)
~~~

- レイヤを確認する
    - 認識しているレイヤは3つ
    - 優先度は全て同じ。
        - この場合、上から順にレイヤが適用されていくイメージ。
        - つまり、実質的な優先度は一番下が一番高い。
    - conf/bblayers.confに記述している順で表示されている
~~~
takeshi@X250:~/yocto/poky/build$ bitbake-layers show-layers
NOTE: Starting bitbake server...
layer                 path                                      priority
==========================================================================
meta                  /home/takeshi/yocto/poky/meta             5
meta-poky             /home/takeshi/yocto/poky/meta-poky        5
meta-yocto-bsp        /home/takeshi/yocto/poky/meta-yocto-bsp   5
~~~
TECH CAMP 10日目　~テストコード~

# 学習内容
- テストコード
`visit`指定したビューファイルに遷移できるメソッド
`fill_in`入力フォームに指定の値を入力することができるメソッド
`have_content()`()に書いた文字列があるかどうかを判断するマッチャ
`have_no_content()`（）に書いた文字列が存在しないことを確かめるマッチャ
`hover`特定の要素にカーソルをあわせたときの動作を再現できる
`find().click`（）内のリンクに実際にクリックができる
`change`expect{ 何かしらの動作 }.to change { モデル名.count }.by(1)と記述することによって、モデルのレコードの数がいくつ変動するのかを確認できる
`current_path`現在いるページのパス
IDLでテキストファイルを読み込み、配列に格納する方法

テキストファイルから読み取り、配列に格納する。
https://www.l3harrisgeospatial.com/docs/read.html
上記のサイトを参考に進める。
## OPENR
まず、ファイルのパスを取得する。
```idlang
file=dialog_pickfile(filter='*.txt')
```
上記を実行するとダイアログが表示され、選択したファイルのパスを`file`に格納する。
`OPENR,UNIT,FILE`
* UNIT：識別子のようなもので自由に設定してよい
* FILE：ファイルのパス
また下記のように記述するとファイルを選択した状態を維持できる。
```idlang
OPENR,UNIT,FILE,/GETLUN
```
また終了する際は次のように記述する。
```idlang
FREE_LUN,UNIT
```
## READF
s
```idlang
READF,UNIT,var
```
* UNIT：`OPENR`で指定した識別子
* var：格納する変数
## テキストファイルを行単位で配列に格納してみる
```idlang
pro art_sum_0614,probe,times
; Select a text file and open for reading
  file = DIALOG_PICKFILE(FILTER='*.txt')
  OPENR, lun, file, /GET_LUN
  ; Read one line at a time, saving the result into array
  array = ''
  line = ''
  WHILE NOT EOF(lun) DO BEGIN & $
    READF, lun, line & $
    array = [array, line] & $
  ENDWHILE
  ; Close the file and free the file unit
  FREE_LUN, lun
end
```
Blender見失った画像の一覧を書き出す

Blenderに限ったことではないですが
複数人でファイルを受け渡しながら作業をしていると
テクスチャ画像等、ファイルのリンクが切れたりすることがあります

見失ったファイルの一覧は　ファイルメニューの外部データ＞パスが壊れているファイルの報告
または　 bpy.ops.file.report_missing_files()　を実行することで
で、システムコンソールや情報エディタに表示できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/f5404e60-a5a0-4d7f-ecfa-05a17c8cb2e3.png)
ただ、重複して同じ画像を利用している場合には重複表示されたり
システムコンソールでは文字化けすることがあったりと使い勝手が良くありません

見つけられない画像ファイルの一覧を取得する簡単なスクリプトを作成してみました

```missing_img.py
import bpy, os
missigfiles = []
for img in bpy.data.images:
    if img.filepath:
        ipath = bpy.path.abspath(img.filepath)
        # 相対パスに変換できない場合ファイルがない
        if not os.path.exists(ipath) and not(ipath  in missigfiles):
            missigfiles.append(ipath)
# テキストをクリップボードに
bpy.context.window_manager.clipboard = "\n".join(missigfiles)
```
.blend内に記録されてるファイルパスでファイル毎に改行されたテキストとしてクリップボードにコピーされます
【意外と知らない】スプレッドシート - Tips（条件付き書式編）

# はじめに
スプレッドシートって便利な機能たっぷりですが、
機能が多くて知られてないことが多いなと感じるシーンが多々‥　ﾀﾀﾀ♪

と、いうことで。
私的オススメ機能を備忘録がてら残してゆきます。

今日は、「表の中に特定のフレーズが出現したら行を塗りつぶす方法」です。
手作業で塗りつぶしてる人をたまーに見かけますが、条件付き書式で一発で解決できます🙌

# アウトプットイメージ
投稿状況が「投稿済」の行はグレーアウトしたい。
<img width="600" alt="画像の説明" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/0b598945-9124-1d57-2779-0ab9f229904a.png">

# やりかた

##### 1. まず、メニューバーの `表示形式` から `条件付き書式`を開きます。

<img width="600" alt="画像の説明" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/6e63e307-53ce-0baa-f7a4-2bbda8d1fe5d.png">

##### 2. 色を塗りつぶしたい範囲を書式設定の対象範囲として選択します

<img width="600" alt="画像の説明" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/d73a6b83-67d3-004b-c77a-76da2cf0691e.png">

##### 3. 細かな書式設定を行います
- 書式ルールは `カスタム数式` を選び、条件式を入力します。
- あとはスタイルを好きに設定すれば完成！
<img width="600" alt="画像の説明" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/f5429dc0-45e1-4a14-27f5-ae94a01c5658.png">

# 条件式のセルの指定方法
- 判定したい列 / 行の一番上もしくは左のセルを指定します #ややこしい
    - 特定の列の中から判定したい場合は、一番上のセルを指定
    - 特定の行の中から判定したい場合は、一番左のセルを指定
- セルを指定する際は、列記号もしくは行番号に **「$」** マークを付ける必要があります
    - 行を塗りつぶしたい場合は、列記号に＄を付ける（例：`=$D3="投稿済"`）
    - 列を塗りつぶしたい場合は、行番号に＄を付ける（例：`=D$3="投稿済"`）

行列反対バージョンを作ってみました。
特定の行の中で判定して、列を塗りつぶしたい場合はこんな感じ。
<img width="600" alt="画像の説明" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/54f47c46-8703-ec07-e425-406a02a0a224.png">

# おまけ
条件式は色々な関数を使用することが可能です。

例えば今日の日付を塗りつぶす場合は、today関数を使うことができます。
`=$C3=TODAY()` と入力すると、
<img width="600" alt="画像の説明" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/13f95a8c-3ed4-3a5e-9a5e-38cc775c21dd.png">


OR関数を使って複数条件でヒットするようにもできます。
`=OR($D3="下書き",$D3="未着手")` と入力すると、
<img width="600" alt="画像の説明" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/415030b3-f86d-65ce-ad38-0b1f043d5ad6.png">

色々できるんだね～

# さいごに
関数とか記法を覚えるのは面倒ですので、毎回ググるかストック推奨です。
（今回のは、覚えれるかも‥‥？）
Webに好きにリンクを追加するクロム拡張がPDF対応しました

# ツールの特徴
- Web上のHTML/ **PDF(New)** の好きな場所にノートを張り付けられる
- 同じノートを複数の場所に貼り付けることもできる
- ノートを介してWeb上の複数の場所を相互リンクできる

Web上での勉強や調査で、高機能なブックマークやハブとして活用できます。

https://largetownsky.wixsite.com/worth-hole

![chromeShopDescJa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1747214/cc4a742f-adfa-ea35-6b47-84599f128131.png)

# 関連記事
- [前バージョン紹介](https://qiita.com/largetownsky/items/b7826f63b0cf7d8626b3)
- [PDFを閲覧＋αするクロム拡張の楽な作り方](https://qiita.com/largetownsky/items/1cb016598824b7ea1b1e)

# PDFjs活用についての小ネタ
## PDFファイルの転送の仕方
関連記事では、WebRequestBlockingの後継であるDeclarativeNetRequest機能を使いましたが、これだと拡張子などURL文字列でしか判断できません。一旦HTMLとして読み始めて、

```
if (document.contentType === "application/pdf") {
    location.replace("転送先URL");
}
```
の方が、中身の形式で判断できる分、確実性が高そうです。

## PDFビューアとの連携について
PDFビューア独自のイベントは、
```
const viewer = (window as any)["PDFViewerApplication"];
const eventBus = viewer.eventBus as EventBus;
```
のイベントバスへのリスナー登録で取れます。
イベントの種類は、PDFjsのソースをgrepするとか、以下の様にデベロッパーツールで覗くとかすると概要把握できると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1747214/86739b3b-a02d-514b-b385-a8b1f7e27977.png)
数値から文字列への変換

# 概要

いくつかのプログラミング言語における、数値から文字列に変換する方法について記しました。

数値の変数名は```fVal```、文字列の変数名は```sVal```、として記載しました。
可能な場合、小数点以下8桁を残した文字列にしています。

文字列の初期化については次にまとめました。

https://qiita.com/dzonesasaki/items/6c7df2429f91efcefcb9


随時編集する可能性があります。
コメント下さっているみなさまに感謝いたします！

# 数値から文字列へと変換するコードのスニペット

## C
```c
char *sVal;
size_t l = snprintf(NULL, 0, "%.8f", fVal)+1;
if ((sVal = malloc(l)) != NULL) 
    snprintf(sVal, l, "%.8f", fVal);
```

厳密には、様々なフェールセーフを組み込む必要があります。このコードは1例ですが、利用シーンに応じた、変更が必要になります。


## Arduino
```arduino
sVal = String(fVal);
```


## MATLAB / Octave
```matlab
sVal = num2str(fVal,"%1.8f");
```
```matlab
sVal = sprintf("%1.8f",fVal);
```
```matlab
sVal = string(fVal); % MATLAB only
```


## Python 3
```python
sVal = str(fVal)
```
```python
sVal = '{:01.8f}'.format(fVal)
```
```python
sVal = f'{fVal:01.8f}'
```


## JavaScript
```javascript
sVal = String(fVal);
```
```javascript
sVal = fVal.toFixed(8);
```
```javascript
sVal = fVal.toString(10);
```
```javascript
sVal = fVal + '';
```
```javascript
sVal = `${fVal}`;
```


## C#
```c#
sVal = fVal.ToString("F8");
```

## C++
```c++
sVal = to_string(fVal);
```

## Kotlin
```kotlin
sVal = String.format("%1.8f",fVal)
```

## Java
```java
sVal = fval.toString();
```
```java
sVal = String.valueOf(fval);
```


## Swift
```swift
sVal = String(format:"01.8f",fVal)
```
```swift
sVal = String(fVal)
```

## なでしこv1
```
sVal = fValを文字列変換
```
```
sVal = fValを「%1.8f」で形式指定
```

## Perl
```pl
$sVal = sprintf("%.8f", $fVal);
```

## PHP
```php
$sVal = sprintf("%.8f", $fVal);
```

## Ruby
```ruby
sVal = sprintf("%.8f", fVal)
```

## AWK
```awk
sVal = sprintf("%.8f", fVal)
```

## Visual Basic .NET
```pl
sVal = fVal.ToString("F8")
```
文字列の初期化集

# 概要

いくつかのプログラミング言語における、文字列の定義と初期化の方法を記しました。
変数名は```sVal```に統一しています。

随時編集する可能性あります。

# 文字列の定義と初期化例

## C
```c
char *sVal;
```


## arduino
```arduino
String sVal;
```


## matlab /octave
```matlab
sVal = ''
```

## python3
```python
sVal = ''
```


## javascript
```javascript
var sVal = String();
```


## c#
```c#
string sVal = string.Empty;
```
```c#
string? sVal = null; //nullable
```

## c++
```c++
string sVal;
```

## kotlin
```kotlin
var sVal : String
```
```kotlin
var sVal : String? = null //nullable
```

## java
```java
String sVal = new String();
```


## Swift
```swift
var sVal : String
```
```swift
var sVal : String? //optional
```

## なでしこv1
```
sValは文字列
```
基本情報（CPUの命令実行手順とレジスタ）

改めてCPUの意味を調べました。
CPUはCentral Processing Unitの意味で計算処理や制御を行うパソコンの頭脳となる部分です。

CPUの性能が高いほど、処理するスピードが早くなります。
処理する流れは

補助記憶装置から主記憶装置へと読み込まれたプログラム
を以下の流れで取り出し、実行します。

①命令の取り出し
②命令の解読
③対象データの読み出し
④命令実行

CPUが命令を実行するために取り出した情報は**レジスタ**と呼ばれるCPU内部の記憶装置に保持します。

それぞれ詳しく見ていきます。

**レジスタの種類と役割**

レジスタ言うても、たくさんあるっぽいです。

|  名称   |  役割   | 
| :---: | :---| 
|   プログラムカウンタ  |  次に実行するべき命令が入っているアドレスを記憶するレジスタ  |  
|   命令レジスタ  | 　取り出した命令を一時的に記憶するためのレジスタ  | 
|   インデックス（指標）レジスタ  |  アドレス修飾に用いるためのレジスタで、プログラムの先頭アドレスを保持する。  | 
|   ベースレジスタ  |  アドレス修飾に用いるためのレジスタで、プログラムの先頭アドレスを保持する  |  
|   アキュムレータ  |  演算の対象となる数や、演算結果を記憶するレジスタ  |  
|   汎用レジスタ  |  特に機能を限定していないレジスタ。一時的な値の保持や、アキュムレータなどの代用に使ったりする。  |  

あるレジスタが別のレジスタを代用したりしているケースもあるため、上の表のレジスタがCPU内部に全てあるわけではないようです。

プログラムもそうですがパソコンも精密にできていますね。
先人が発明したものを、一般化して使用できるってのは非常にありがたいことですね。

命令の手順を深く見ていきます。

## ①命令の取り出し（フェッチ）
まずは一番最初に命令の取り出し（フェッチ）を行います。

fetchの英語の意味を検索してみると
> 取ってくる、呼んでくる、(行って)取ってくる、連れてくる、出てこさせる、引き出す、誘い出す、吐く、漏らす、出す

のようです。JavaScriptでFetch APIがありますね。

命令レジスタとプログラムカウンタを使用します。
例えばプログラムカウンタ0004があったとします。

プログラムカウンタ0004を命令レジスタに記憶させます。

取り出し終わったら、次の命令に向けてプログラムカウンタの値を
0004から0005に増加させます。

## ②命令の解読
命令レジスタに取り出した命令は次の構成でできています。
```
命令レジスタ
|        命令部           |        オペランド部          |
実行させたい                            処理対象となるデータを納めた
命令の種類を示すコード番号が入っている        メモリアドレスなどが入っている
```

「オペランド」の意味は「オペレート（操作）する対象」という意味の言葉らしいです。

プログラミングでも1+2　の1が左オペランドで2が右オペランドと言いますね。

命令部の中身が命令デコーダへと送られます。
命令デコーダは命令部のコードを解読して、必要な装置に「おい出番だ」と
制御信号を飛ばします。

デコードは「エンコードされたデータを元の形式へ戻すこと」ですね。

## ③対象データ（オペランド）読み出し
命令が加算などの演算処理とすると、その演算の元となる数値が必要となります。
それが先ほどのオペランド部をみると、ありかがわかるようになっています。

オペランド部を参照して、対象データを読み出し、それを汎用レジスタなどに
記憶させます。

## ④命令実行
最後に、命令を実行するだけとなります。
汎用レジスタから処理対象のデータを取り出して演算を行います。
演算を行った後に演算結果を書き戻して終了です。

## まとめ
覚えるのは大変ですが、細かく見ていくのは重要ですね。
AtCoder ABC255 D - ±1 Operation 2をイベントソートで解くO((N+Q)log(N+Q))

イベントソートで解きます。計算量は$O( (N+Q) log (N+Q))$です。

説明では、$a=[-3, -1, -1, 2]$とします。


この問題を以下のように考えます。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/9e20687b-bec3-2219-f641-ea9c6bde3893.png width=50%>
まず、入力aの各要素を○印で表し、クエリが１つで$x=-1$だとした時にその位置をオレンジの線で示しました。赤線はオレンジに対してどれだけ$+$方向に離れているか？青線は、$-$方向に離れているか？を示します。この時、この問題で求めたい値は、図中の赤線と青線の合計です。

これを複数のクエリについて考えることにします。今回は、クエリ$X=[-4,-2,-1,5]$だとします。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30938/d51b1bd4-be8e-5e82-f1f2-7f8a63b5cf15.png width=50%>
$X$のクエリを考える前に十分に小さい数$-(10^{12})$がクエリとして与えられた時を考えます。これを図中の紫の１で示します。$0 \leq a_i \leq 10^9$であることに注意すると各$a_i$からは青い線のみで1に到達します。また、この際の青い線の合計は、$a_i - (-1e12)$の和で求めることができます。この和は$val$とし、$val=\sum^{N}_{i=1} a_i + 1e12$です。

今、全ての$a_i$は今のクエリの値より上にいることは明らかです。これを数直線の右(マイナス側)と左(プラス側)で考え、$cntl, cntr = 0, N$と表現します。

この値を求めた上で、図をじっと睨んで、$a_i$や$x_i$を下から順に見ていきます。この時便宜上、$a_i$や$x_i$の事をindexと呼びます。今、ある値に到達した時、次のように考えます。
- まず、前のindexを$pind$, 今のindexを$cind$とし、前の値を$pval$とします。
- この時、今の値$cval$は$cval = pval - (rcnt * (cind-pind)) + (lcnt * (cind-pind))$です。前の値から、水色である部分を引き、(下から見ていっているので)赤い部分は足します。$rcnt$は$pind$からみて上にいる$a_i$の数だったので、前の位置から今の位置までの分の$rcnt$個を引きます。これで、水色分を引いたことになります。$lcnt$は$pind$から見て下(あるいは同じ場所)にいる$a_i$の数だったので、前の位置から今の位置までの分の$lcnt$個を足します。
- この時、今処理したのがクエリならその値を表示します。
- 数字を通過したのであれば、$rcnt--; lcnt++;$します。その値は水色($rcnt$)には寄与せず、赤色($lcnt$)に寄与するためです。

実装を考えます。これはイベントソートとして考えられます。最初に初期値と$rcnt, lcnt$を計算したのち、$(index, イベントの種別)$のイベントを昇順にソートして見ていけばよいです。

時間計算量はイベントのソートがネックとなり、$O( (N+Q) log (N+Q))$です。Extraな空間計算量はイベントソート用の配列を持つ必要があり、$O(N+Q)$です。


<details><summary>実装(Python)</summary><div>

```Python
n, q = map(int, input().split())
dat = list(map(int, input().split()))
querys = [] # 元のクエリの順番
event = [] # イベント
buf = {} # 答えを覚えておく
for _ in range(q): # "数字"を覚えておく
    x = int(input())
    event.append( (x, 1) )
    querys.append(x)
for x in dat: event.append( (x, 0) ) # クエリとして格納
event.sort()
pval = 0
prev = -(10**12) # 一番左端を作る
for x in dat: pval += x + 10**12 # 左端の値の計算
lcnt, rcnt = 0, n # 今のindより右にある数、左にある数
for ind, e in event: # イベントを処理
    diff = ind - prev # 前の処理との差
    # この位置までのコストの計算
    cval = pval - (rcnt * diff) + (lcnt * diff)
    if e == 0: # 数字がある場合、L,Rの数を直す
        rcnt -= 1
        lcnt += 1
    elif e == 1:
        # クエリがあるなら、その地点のものを記憶
        buf[ind] = cval
    prev = ind
    pval = cval
ans = []
for x in querys: print(buf[x])
```
</div></details>

https://atcoder.jp/contests/abc255/submissions/32480263
Lambdaでデータベースプロキシが勝手に付与されるので調査してみた

## 概要
Lambdaでデータベースプロキシが勝手に付与される現象が発生したので、調査してみました。

## 結論
Lambdaの実行ロールにRDSプロキシ関連のポリシーが含まれていると、勝手に付与されるようです。

## 検証内容

### 1. 準備
#### RDSプロキシ
事前にRDSプロキシを作成しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882682/e815c6d3-58da-27ae-1cb6-1b4866184b9f.png)

作成時にIAMロールを作成するように設定をします。
RDSプロキシ作成後にIAMロールが自動で作成されます。

#### Lambda
適当にLambdaを新規作成します。

### 2. 検証結果

#### Lambdaの実行ロールにRDSプロキシ関連のポリシーが含まれている場合

RDSプロキシ関連のポリシーが含まれている実行ロールに変更してみます。
![test-rds-proxy-2 - Lambda - Google Chrome 2022-06--.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882682/f34c5df1-af9a-b3cb-c824-07f657ee3ab0.png)

ロールにRDSプロキシ関連のポリシーがあることが分かります。
![test-rds-proxy-role.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882682/80eaef36-92dd-5bda-a668-5b991efc5812.png)

この場合、勝手にLambdaにデータベースプロキシが付与されます。
![test-rds-proxy-2 - Lambda - Google Chrome 2022-06---.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882682/34a312cb-453a-fa58-254a-2fdae3c86903.png)

#### Lambdaの実行ロールにRDSプロキシ関連のポリシーが含まれない場合

RDSプロキシ関連のポリシーが含まれていない実行ロールに変更してみます。
![test-rds-proxy-2 - Lambda - Google Chrome 2022-06-.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882682/5a4507e2-d5f3-d996-6145-0d9d23f90546.png)

ポリシーにデータベースプロキシ関連のポリシーが含まれていないことが分かります。
![test-role.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882682/21d4ce74-9c8a-149c-a573-6cf3a1c17884.png)

この場合、先ほど付与されたLambdaのデータベースプロキシの設定が外れていることを確認しました。
![test-rds-proxy-2 - Lambda - Google Chrome 2022-06-.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882682/32d812c3-179b-91c8-e444-da754fee96ab.png)

## まとめ

Lambdaでデータベースプロキシが勝手に付与される現象が発生したので、調査しました。
公式のドキュメントなどで確認はできませんでしたが、アクセス権限にデータベースプロキシ関連のポリシーが含まれる場合に勝手に付与されるようでした。

色々なワードでググっても出てこなかったので、同じような事象が発生した人に参考になれば幸いです。
容量大きいファイル(10GB+)を暗号化するメモ

## 背景

* CG データとか機械学習データを社外とやりとりしたい
* end-to-end 暗号化したい

## 情報

https://jemurai.com/2019/04/23/encrypting-large-files/


## 方法

RSA だと大きいファイルは暗号化できません.
鍵長は 4096 にしておくのが無難でしょうか.

リンクにあるように, PGP でもいいかもですが, 内部的には openssl で処理している?

openssl で AES256(`aes-256-cbc`?) を使う場合

```
openssl smime -encrypt -aes256 -in file -binary -outform DEM -out file.enc your.publickey.pem
```

CBC は暗号強度やや落ちるっぽい?ようです(要検証)

## 分割する

あとはファイルを分割して暗号化という手もあります. Linux で `split` コマンドでいけます.

Windows だとファイルの結合は `type` でできます.

Windows でファイル分割の場合は PowerShell のスクリプトを使うことになるでしょうか.

https://www.powershellgallery.com/packages/FileSplitter/1.3/Content/Split-File.ps1

## その他

エンコードとデコードはそこそこ時間かかります.

zstd 圧縮は CG や機械学習などのバイナリに有効かどうかは状況によるでしょう(PNG テクスチャだとあまり効果ない)
MySQLの "The server quit without updating PID file" エラーの対処法

以前rails sをしようとしたときに、The server quit without updating PID file　のエラーにハマったので対処法を紹介します。
自分の場合は、mysqlを再インストールし、パスワードを設定したら無事に解消できました。
## 1.mysqlを再インストール
再インストールについては、下記の記事を参考にしました。
https://gonzaemon.site/posts/2019/10/04/_2.html

基本的には、
```
brew uninstall mysql
brew install mysql
which mysql
```
すれば、再インストールできます。
そして、再インストールしたらいけるかと思いきや
```
'Access denied for user 'root'@'localhost'
```
と言うエラーが出てしまいました。
この対処法としては、パスワードを設定すれば解消できると思います。

## 2.パスワードを設定

自分の場合は、この記事を参考にしました。
https://webkaru.net/mysql/mysql-root-password/
手順としては、
```
mysql -u root
mysql> update mysql.user set password=password('password') where user = 'root';
mysql> flush privileges; ← 変更を反映
mysql> exit;
```
とすれば、ログインができて解決できると思います。
railsのmysqlで詰まった方がいれば是非参考にしてください！
inodeってなに？

## 勉強前イメージ

よくみてるけど全然しらんパターン
データの情報的なやつだとおもってる

## 調査

### inode とは

index nodeの略で、Linuxなどのファイルシステムで使用されているファイルなどについての情報を記した管理データのことを指します。
inodeはファイルやディレクトリごとに作成されて、それぞれファイルやディレクトリの作成時に一意のinode番号が割り当てられます。
inodeで記録されている情報は、パーミッションや所有者、ファイルサイズなどがあります。

inodeはファイルシステム作成時に最大数を決定するので
inodeが枯渇するとディスクに空き容量があってもファイルが作成できなくなる可能性があります。

### inode番号を見てみる

- ls -ali

lsコマンドの `-i` オプションで確認できます。
一番左に表示される、 「17425057」 や 「17425059」 がinode番号になります。

```
[root@localhost test]# ls -ali
合計 4
17425056 drwxr-xr-x.  2 root root   45  6月 15 19:04 .
 8409153 dr-xr-x---. 20 root root 4096  6月 15 19:04 ..
17425057 -rw-r--r--.  1 root root    0  6月 15 19:04 a.txt
17425059 -rw-r--r--.  1 root root    0  6月 15 19:04 b.txt
17425060 -rw-r--r--.  1 root root    0  6月 15 19:04 c.txt
```

- inodeの情報を見てみる

`stat` コマンドを使用して、inodeの情報を見ることができます。

```
[root@localhost test]# stat a.txt 
  File: `a.txt'
  Size: 0               Blocks: 0          IO Block: 4096   通常の空ファイル
Device: fd00h/64768d    Inode: 17425057    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2022-06-15 19:04:26.702135577 +0900
Modify: 2022-06-15 19:04:26.702135577 +0900
Change: 2022-06-15 19:04:26.702135577 +0900
 Birth: -
```

## 勉強後イメージ

そもそもなんでinodeなんてあるんだろうね？？？

## 参考

- [inode 【iノード】](https://e-words.jp/w/inode.html)
- [Linuxの「inode」とは？概要や確認方法をご紹介](https://rainbow-engine.com/linux-inode-intro/)
Python勉強③　素因数分解　2022/06/15

「アルゴリズム×数学」が基礎からしっかり身につく本　でAtcoderデビューしたいNorthです。

今日は素因数分解について勉強しました。

①平方根までの約数を使う
②素数を使う

2種類の方法を学び、②の方が難しいですが計算速度は早くなることを学びました。

まず①平方根までの約数を使い素因数分解を書き出す方法です。

~~~
def Factorization(N):
    list = []
    for i in range(2, int(N ** 0.5)):　#平方根までの約数
        while N % i == 0:　#割り切れるなら
            list.append(i)　#リストに追加
            N = N / i　#素因数分解を継続
    if N != 1:　#そのものが素数のとき
        list.append(int(N))
    return list
 
list = Factorization(int(input()))
print(*list)
~~~
知らなかったのですがlistに*をつけることで中の要素を展開してくれるんですね。

②素数を使う方法

これはWikipediaの試し割り法のページと他のページも参考にしました。

~~~
n = int(input())

def Factorization(n):
  a = []
  while n%2 == 0:
    a.append(2)
    n //= 2
  f = 3
  while f*f <= n:　
    if n % f == 0:
      a.append(f)
      n //= f
    else:
      f += 2
  if n != 1:
    a.append(n)
  return a 

Factorization(n) 
~~~

2で割る素因数分解を行った後、奇数でわり、最後に素数でわる、というイメージでしょうか。

二つ目の方が確かに無駄がないですね。
【Qiita】Qiita自分の投稿した記事を検索

# 使用例
```
user:yamada title:echo
```
# アカウント名
```
user:自分のユーザ名(@は除く)

※例
user:yamada
```
# タイトル名
```
title:探したいタイトル

※例
user:yamada title:echo
```
# 本文
```
body:本文の単語

※例
user:yamada body:echo
```

# タグ
```
tag:含まれてるタグ

※例
user:yamada tag:PHP
```

# 参考

https://help.qiita.com/ja/articles/qiita-search-options
Railsの絞り込みルーティング検索

### 「rails routes」のキーワード検索方法

`rails routes`を実行したときに、目当てのルーティングを見つけるのにいつも時間がかかっていました。
が、下記のコマンドを実行するとキーワードで絞り込み検索できるということを知りました！！

```
$rails routes | grep users

#「users」部分は好きなキーワードに変えてください！
```

ちなみに、grepは検索するときに使うLinuxコマンドらしいです！
usleep()の誤差が予想以上に大きくなる

### 0. 概要
Cygwinなど、発生する環境は限られている可能性は高いが一応注意として記載。

諸事情でusleep(1000)(==1msec待ち)*1000回による1秒待ちのロジックを組んだ所、思った以上にずれた。
後述の環境で、1秒待ちが、17-18秒待ちとなった。
usleep(1000000)*1回では、概ね1秒で復帰するので、関数呼び出しコストで誤差が大きくなるようである。


※ usleep(1000000)をエラーとするシステムもあるので注意
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/usleep.3.html

### 1. 検証ロジック
```c
int main(int argc, char **argv)
{
	int i = 0;
	struct timeval startTime;
	struct timeval endTime;
	int interval = atoi(argv[1]);
	int waitcnt = atoi(argv[2]);

	gettimeofday(&startTime, NULL);
	for(i = 0; i < waitcnt; i++) {
		usleep(interval);
	}
	gettimeofday(&endTime, NULL);

	printf("Time - from gettimeofday...\n");
	printf("[START]\n");
	printf(" sec  : %ld\n", startTime.tv_sec);
	printf(" usec : %ld\n", startTime.tv_usec);

	printf("[END]\n");
	printf(" sec  : %ld\n", endTime.tv_sec);
	printf(" usec : %ld\n", endTime.tv_usec);

	printf("[DIFF(about)]\n");
	printf(" sec  : %ld\n", (endTime.tv_sec + endTime.tv_usec/1000000) - (startTime.tv_sec + startTime.tv_usec/1000000));
	printf(" usec : %ld\n", (endTime.tv_sec*1000000 + endTime.tv_usec) - (startTime.tv_sec*1000000 + startTime.tv_usec));
	printf(" msec : %ld\n", (endTime.tv_sec*1000 + endTime.tv_usec/1000) - (startTime.tv_sec*1000 + startTime.tv_usec/1000));

	return 0;
}
```
### 2. 検証結果

usleep(1000)*1000
||sec|msec|usec|
|----|----|----|----|
|1|18|17556|17556441|
|2|17|17004|17004605|
|3|17|16920|16919761|
|4|17|17053|17053231|
|5|17|16935|16934642|

usleep(1000000)*1
||sec|msec|usec|
|----|----|----|----|
|1|1|1008|1008031|
|2|1|999|998874|
|3|1|1004|1003806|
|4|1|1014|1014538|
|5|1|1008|1008308|


### 3. 検証環境
OS  : Windows 10
CPU : 11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz
RAM : 16.0 GB
Cygwin 64bit 上
※ その他、libcのバージョン等も影響する可能性はある。
※ ほぼ同等スペックの別PCでも概ね同じ結果だった。

### 補足:usleep()以外にかかる時間
usleep()以外にかかる時間は、usec以下の様子なので誤差として無視した。
[備忘録] Overleaf 上で latexdiff を使用する方法

# 述べる内容

オンライン $\LaTeX$ エディタ [Overleaf](https://www.overleaf.com) 上で2つのtexファイルの差分をPDF生成時に強調表示してくれるTeX用パーサー latexdiff を使う方法

# 方法

1. プロジェクト内に`.latexmkrc`ファイルを作成
1. `.latexmkrc`内に以下のコマンドを追加（コンパイラを`LaTeX`に設定した場合）：
    ```
    $latex = "latexdiff main.tex main2.tex > maindiff.tex; uplatex %O  maindiff";
    ```
    ここで，`main.tex`が改訂前のTeXソースファイル，`main2.tex`を改定後のTeXソースファイルとする
1. `main2.tex`を選択してコンパイルすると，コンパイル後のPDFは`main.tex`との差分を表示してくれている

# 注意：SyncTeXには非対応

上記のコマンドラインを見てわかるようにリダイレクトを通して，`maindiff.tex`というファイルを生成して，それをuplatexでコンパイルしている．しかし，生成された`maindiff.tex`はプロジェクト内に直接生成されることはなく，差分のソースファイル見ることはできない．

したがって，生成されたPDFファイルと`main2.tex`の間で同期されていないため，PDFファイルをダブルクリックしてもその場所にエディタのカーソルがジャンプしてくれない．
素人なりに考えたGithubでのチーム開発運用法

どうも、@infoengine1337です。つい一か月ほど前に、Gitを使った開発を始めました。それ以前はGitもGithubもあまり使ったことがなく放置だったのですが、ついにです。しかしそれを用いた開発を進めていくうえでいろいろ運用方法を見直していかないといけないと思ったことがあり、それの備忘録と他人にそれをチェックしてもらいたいという心でこの記事を執筆します。

### ※注意点
この記事はGitを使い始めて一か月の素人が執筆しています。間違ったことやよろしくないことがあった場合はマイルドなマサカリを投げてくださるとうれしいです。

### 追記
コメントで「それはGitFlowそのものではないか？」というご指摘をいただきました。個人的にはmasterやdevelopなどの変更を集約するブランチは長命に(Git-Flow的な思想)、変更を積み重ねていくブランチは短命に(Github-Flow的な思想)という使い分けをしていたつもりだったのですが、実際Git-Flowとそれほど変わっていなかったのかもしれません(?)
まだ理解がうっすらとしているので、ご指摘大歓迎です。:pray:
## まず結論から
### ブランチを二種類に分ける
チーム開発をするうえで必要なブランチを「コアブランチ」と「部門ブランチ」という二種類の概念に分けて管理。
#### コアブランチ
- master
- develop
- releases
ブランチなどといった、主に統合ブランチを担うもの。マージされる側で、基本的にはこのブランチでマージコミット以外のコミットを積み重ねることのないようにする。

#### 部門ブランチ
- features/**
- hotfix/**
ブランチといった、主に特有の機能やバグ修正といった細かい一部門の変更を施すもの。基本的に変更したい内容ごとにfeaturesやhotfix下にネストを作成してそこにコミットを積み上げ、それをコアブランチ(developが好ましい)にマージすることを目標とする。
思想として、その一部門毎にブランチを作っては投げ、作っては投げなので、
短期間で機能を作ってpush、あとはブランチを削除する…という流れが一番好ましい。
短命なブランチとも呼ぶべきか。

### コアブランチ・部門ブランチ別の運用方法

### コアブランチ
- ブランチの作成は必ずGithub上(リモート)で行う
- ローカル環境でコアブランチへの部門ブランチのマージは絶対にしない
- つまり、コアブランチにマージしてpushすることは厳禁
- 常に最新が好ましく、ローカルブランチは時間が経ったらfetch & 追跡ブランチからmergeすること(要するにpullすること)

### 部門ブランチ
- 部門ブランチの作成はローカルで行って良い
- 部門ブランチの内容をローカルでコアブランチにマージすることは厳禁
- あくまでもそのブランチをそのままpushすること
- 短命であるため、masterの内容をmergeしてくることは基本的には避けるべき
- 前述のとおり、用が済んだら削除される、短命なブランチであるということを忘れずに。
- 要するに、masterの最新の姿を見る間もなくmasterにマージされ、消えていく

部門ブランチの内容が完成したらまずはローカルでマージはせずにそのままpush。
そしてそれがGithub(リモート環境)であがり、それをプルリクエストする。
それがマージされたのを確認して管理者がちゃんとブランチを削除する。
そしてプルリクを投げた(部門ブランチを作った人)も部門ブランチをローカルから削除する。
コンフリクトが発生したときは、その場で解消してマージ。コンフリクトが発生する→そのブランチが派生した時点でのコアブランチと現在のコアブランチにラグが生じているということ(だと個人的に解釈している)なので、この場で最適解となるようにコンフリクトを解消してしまう。部門ブランチは削除されるため、今後気にする必要はない。

### 何故この方法を考えたのか

うまく言語化できない点をご了承いただきたい。
- チーム開発をするにあたって無視できない点として、「自分がブランチを切って開発をしている最中に、ほかのチームメイトがどんどんマージしてコミットを進めてしまう」といった点があるように感じたから
- 一つのブランチを更新しながら使用し続ける運用方法にヒヤヒヤしたものを感じたから
- 後、ブランチのマージ方法について確固とした運用方法が共有されていないのではないか？と感じたから

以下ポエム
自分が例えばmasterからブランチを切って開発しているときにほかの開発者がmasterにコミットをマージしてどんどん開発を進めていたなら、自分が切ったブランチをpushするときにmasterのマージが必要になる・もしくはmasterへのPRをmergeするときにコンフリクトが生じて、その場でコンフリクトしないような修正を迫られるだろう。リモートでコンフリクトを修正してmergeしたとしても、今後そのブランチをローカルで使い続けていくとすればブランチは古いままで、masterに施された開発は一向に反映されない。また、masterをpullしてその開発ブランチにmergeするとなるとマージコミットが発生してしまい、その結果Gitログが汚くなるといった点もあるような気がする(要検証)。最新のmasterを取り入れたいという目的があるがためにマージコミットというジョイントのようなコミットをチェーンに取り入れ、その状態でpushをしていくのは少し危なっかしいのではないか？？と思ったりした。それぞれの部門を別ブランチにして毎度生やしたほうが綺麗な運用になるのでは？と思ったところもある。それより新陳代謝を活発化するかのごとく、新しいブランチをどんどん生やし、古い用済みのブランチをどんどん棄てていってしまえば？？との発想。まあリベースマージという選択肢もあるのかもしれないが、その場合もっと悲惨なことになりかねないのでは？？とかも考えた。
また機能を増やす点ではブランチを細分化して堅牢さよりも作業の高速化を図るが、コアブランチではまったく態度を逆にし、しっかりとした運用が必要なのではないか？との考えに達した。他のブランチからのマージは完全にリモートのみで行い、ちゃんと実態の可視化ができるようにするべきで、ローカルでブランチを弄くるとろくなことにならないという印象があり。サイトの解説によってはコアブランチ達をローカルのGitコマンドやGitクライアントで弄ったりしているが(ローカルでトピックブランチの内容をmergeしてmasterをpushしてるサイトもあった)、そういう事をしないためにもちゃんとブランチはリモートにもっていき、リモートでmergeしよう、というような考え方がいいんじゃないかなと思っている。何かもっと深い意味があったような気がするが忘れた…すいません！！！

## 終わりに
「コアブランチ」「部門ブランチ」というのは完全な自分の造語です。また、ブランチの命名はGit-Flowを参考にしました。いろいろ考えて疲れました。もし意見や批評などありましたら、やさしくマサカリをください。Gitのシステムを完全に理解しきれていないので、Gitの裏で起きていることの勉強も頑張ります。よく考えるとGitの管理方法とブロックチェーンって少し似てる部分ありませんか？？みたいなことを思ってます。
【Selenium】Dockerコンテナ内でSeleniumを実行すると起きるエラーの解決: Selenium::WebDriver::Error::UnknownError【ruby】


ソースコード
-
だいぶはしょってますが、クロールするための、Crawlerクラスです。

```ruby
require 'selenium-webdriver'

class Crawler
  def execute
    driver.navigate.to start_url
    driver.find_elements(:xpath, '//*[@id="tabular-buybox"]/div[1]/div[4]/div/span/a')
    # 以下略
  end
    
  private

  def driver
    @driver ||= begin
      options = Selenium::WebDriver::Chrome::Options.new
      options.add_argument('--headless')
      Selenium::WebDriver.for(:chrome , options: options).tap do |driver|
        driver.manage.timeouts.implicit_wait = 2
      end
    end
  end
end
```


問題
-
Dockerコンテナ内で、上記を動かすと以下のエラーが発生

```
Selenium::WebDriver::Error::UnknownError
"unknown error: Chrome failed to start: exited abnormally.\n  (unknown error: DevToolsActivePort file doesn't exist)\n  (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)"
```

解決策
-
`--no-sandbox`と、`--disable-dev-shm-usage`オプションを追加しましょう！

```ruby
  def driver
    @driver ||= begin
      options = Selenium::WebDriver::Chrome::Options.new
      options.add_argument('--headless')
      options.add_argument('--no-sandbox') # 追加
      options.add_argument('--disable-dev-shm-usage') # 追加
      Selenium::WebDriver.for(:chrome , options: options).tap do |driver|
        driver.manage.timeouts.implicit_wait = 2
      end
    end
  end
```
Ruby で開発する時に、少し助けになる（かも知れない）小ネタ

はじめまして。
Qiita は読み専だったのですが、アウトプットも行いたいと思い、投稿をすることにしました。
よろしくお願いいたします。

# 概要
Ruby でより良いコードを書くための話題**では無いです。**（すみません）

開発時、特に動作確認（不具合修正を含む）を行う時に実施すると
**少しだけ作業に掛かるコストが低減される**
というお話しです。

### 1. デバッグ目的の出力処理などは行頭に書くと良い（理由：あとで探しやすいから）
（これは Ruby に限った話しではありませんが）
簡単な動作確認のために、中身を見たいオブジェクトの内容を
出力させて目視する、という手段は一般的かと思います。
そのような（最終製品には含まれない）目的で使うコードは行頭から書くと良いです。
このような感じです：
```rb
def hoge(arg)
  if arg.class != Hash
print "arg の class は？ : "; pp arg.class
  end
  ...
end
```
このように書いておくと、後で（必要なくなってから）削除する時に
`^p(p|rint|uts)`
という（正規表現による）検索一つで、一括削除できます。


### 2. 同様に exit も行頭に書くと良い
動作を確認する時に、処理の途中で中断したい時は exit を使う事もあると思います。（自分はそうしています）
その時も行の先頭に書くと良いです。
理由は上記 1. と同じで、どこで強制終了させているのかが探しやすいからです。

### 3. それ専用の exit を用意する
単純に exit を書くだけだと、コンソール出力上は問題なく終了したように見えてしまう、という問題が起きることがあります。
そのため、このように：
```rb
  def 自分が作成したクラス.exit_force()
    puts  # 以下で出力している情報を見やすくするため、最初に改行する
    puts "<<< 強制的に exit() しています >>>" # 何をしているかをユーザに表明しておく
    puts "呼び出し履歴 :"
    pp caller() # 呼び出し情報を表示する。一番近いところだけなら caller()[0] を表示すれば良いです
    exit
  end
```
自前で専用メソッドを作成／使用する事で、確実に
「意図して中断している」
事が分かるようになります。
また上記コード例のように
`caller()`
も出力することで、「どこで」中断しているかという情報も確認できます。



以上です。
これだけの事ですが、やってみると割と役に立ちます（実体験）。
Oracle Enterprise Database Service の ストレージ容量をスケールする手順

# 実施したいこと
Oracle Enterprise Database Service (旧DBCS EE)のストレージ容量をスケールする。

参照元は下記記事です。

Oracle Cloud Infrastructure Documentation
[DBシステムのスケーリング](https://docs.oracle.com/en-us/iaas/dbcs/doc/scale-db-system.html "DBシステムのスケーリング")
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/ea72a447-5b48-f1d7-fd6d-b4e279a1b2db.png)

# 手順
1. ナビゲーションメニューを開きます。「OracleDatabase 」をクリックしてから、「Bare Metal、VM、およびExadata」をクリックします。
2. コンパートメントを選択してください。データベースシステムのリストが表示されます。
3. DBシステムのリストで、スケールアップするシステムを見つけて、強調表示された名前をクリックします。システムの詳細が表示されます。
4. [ストレージのスケールアップ]をクリックします。
5. [ストレージのスケールアップ]パネルで、必要に応じてストレージをスケールアップします。
6. [更新]をクリックします。

# 1. ナビゲーションメニューを開きます。「OracleDatabase 」をクリックしてから、「Bare Metal、VM、およびExadata」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/04d67964-7b5a-206f-1d2e-f76d6e757253.png)

# 2. コンパートメントを選択してください。データベースシステムのリストが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/9a256359-6202-b181-e6a0-c9525f008ae1.png)

Oracle Enterprise Database Service を作成したコンパートメントを選択してください。
ルートコンパートメントにOracle Enterprise Database Service がある場合は、この操作は不要です。

**コンパートメント選択後**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/d02881a1-1c2d-8715-08d9-dcaff06fd1ab.png)



# 3. DBシステムのリストで、スケールアップするシステムを見つけて、強調表示された名前をクリックします。システムの詳細が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/fb35cbf9-dee3-8760-badc-e42d898e7783.png)

**クリック後**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/5f1649fe-0547-ff11-328e-7b622cf9c246.png)

# 4. [ストレージのスケールアップ]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/fa49e41b-3b40-c932-a31f-9b3b30296d7b.png)

**クリック後**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/9955c8b6-597b-166c-3ad0-b74da4d0ffd8.png)
画面右にスライドしてポップアップで表示されます。

# 5. [ストレージのスケールアップ]パネルで、必要に応じてストレージをスケールアップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/6b239f34-3dd0-b890-5027-fc6e12ea99ec.png)


今回は、データストレージを1,024GBとしてみました。
使用可能なデータ・ストレージを1,024GB以上にすると、「リカバリ(RECO)記憶域は、合計記憶域の20%以上を維持することをお薦めします。」とおすすめされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/2af27a67-8ce7-a977-5cd6-11a3c16936a5.png)

そこで、リカバリ(RECO)記憶域が合計記憶域の20%以上となるように選択します。
今回は、512GBに設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/87f8122d-03b6-ecba-d43b-0929109dfa78.png)


# 6. [更新]をクリックします。

更新をクリックすると、アイコンが更新中に変わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/8c804d6b-88e6-edbe-f4f5-676a15ce8b7e.png)

更新後、システムの詳細画面で、設定したストレージ容量になっていれば成功です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/3dfab29a-3e93-c8b7-2a8c-30268a9cde06.png)
gcpdiagのススメ


gcpdiagをご存知でしょうか？
Google CloudのProjectに対し、静的解析をかけてリスクのある設定を警告してくれる優れものです。

特別な準備は不要で、お手軽に利用できます。
もっとも簡単なのは、Cloud Consoleから自身のProjectに対して実施する方法です。ユーザー側で何もすることなく、１行コマンドを叩くだけです。

さらに、無料で利用可能です！

こちらは、手元にあったProjectでかけてみた結果です。
```
$ gcpdiag lint --project=my-project  --within-days=365
gcpdiag 🩺  0.55

Starting lint inspection (project: my-project)...

🔎  gcs/BP/2022_001: Buckets are using uniform access
   - my-project/artifacts.my-project.appspot.com  [ FAIL ]
     it is recommend to use uniform access on your bucket
   - my-project/my-project_cloudbuild             [FAIL]
     it is recommend to use uniform access on your bucket
   - my-project/hoge                            [ OK ]
   - my-project/fuga                              [ OK ]

   Google recommends using uniform access for a Cloud Storage bucket IAM policy
   https://cloud.google.com/storage/docs/access-
   control#choose_between_uniform_and_fine-grained_access

   https://gcpdiag.dev/rules/gcs/BP/2022_001

🔎  iam/SEC/2021_001: No service accounts have the Owner role
   - my-project                                               [ OK ]

Rules summary: 65 skipped, 1 ok, 1 failed
```

# gcpdiagとは？
オープンソースのGoogle Cloudに対するテストスイートです。

今のところlint(linter...静的解析)しかコマンドはありませんが、今後、拡張されるのでは？と思っています。
```
$ gcpdiag help
gcpdiag 🩺 - Diagnostics for Google Cloud Platform

Usage:
        gcpdiag COMMAND [OPTIONS]

Commands:
        help     Print this help text.
        lint     Run diagnostics on GCP projects.
        version  Print gcpdiag version.
```

## 対象のサービス群
コードから、現時点では以下のサービスを対象にしているようです。
- apigee
- bigquery
- cloudsql
- composer
- dataproc
- gae
- gcb
- gce
- gcf
- gcs
- gke
- iam
- vpc

## まとめ
もっともありそうな使い方としては、インフラレイヤーの構築完了や、リリース前などのマイルストーンごとでの確認が考えられます。
また、定期的に実行することも望まれます。IaC環境が整っているProjectではCI/CDパイプラインに組み込んでリスクのある設定変更をすぐさまロールバックするようなことも可能です。

非常に簡単に使えるツールですので、積極的なご利用を！

# リンク
https://gcpdiag.dev/
https://github.com/GoogleCloudPlatform/gcpdiag
【Linux EC2】PIDではなく、プロセス名で kill するコマンド

# プロセスをPIDではなく名前で kill する
結論こちらで可能（Amazon Linuxで動くよ！）

```bash: プロセス名を指定して kill できます
pgrep -f 'プロセス名' | { read v ;kill -9  $v; }
```

## 使い方
まずはこちらで殺したいプロセスの名前を調べましょう。

```
ps aux | grep プロセス名
```

railsで unicorn のプロセスを殺したい場合はこんな感じ。

```bash
ps aux | grep unicorn
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/e3fe22ea-b407-1b86-cb96-f2c9d59f47af.png)

## 時間の右に書いてあるのがプロセス名
今回の場合は `unicorn_rails` になるのですが。
`unicorn_rails` で絞るとその下にある worker[0]~[3] も引っかかってしまいます。

なので一意になるように `unicorn_rails master` で検索します（スペースが入る場合は文字列にしてね！
grep で絞る感じです

```bash: unicorn_rails のプロセスを名指しで kill したい場合。
pgrep -f ' unicorn_rails master' | { read v ;kill -9  $v; }
```


## restartコマンドが用意されていないプロセスを再起動するコマンドを作る
function を使うとメソッドを定義でき一連の処理を自動化できます。
例えば rails の unicorn プロセスを再起動させたい場合はこんな感じで作れます。

```bash: unicorn restart
function unicorn_restart(){
    pgrep -f 'unicorn_rails master' | { read v ;kill -9  $v; }
    bundle exec unicorn_rails -c /var/www/www.hoge.net/current/config/unicorn/production.rb -E production -D
}
```

unicorn_rails には再起動コマンドは用意されていないので、自作すると非常に便利ですね


いちいちプロセスIDを調べて kill -9 で ID しなくてよいので
本番環境でのバグ調査などで非常に役立ちます（バグ調査するときは別でサーバ立ててね！）

```bash:手動で頑張る場合
ps aux | grep unicorn
kill -9 12345
```
GASスクレイピングに挑戦してみた！

皆さんこんにちは！
都内の大学に通う大学生です！

今回は、長期インターンシップで仕事の一環として行ったGAS（Google Apps Script）というものについて、紹介します！
GASとは、Googleのスプレッドシート上で使用できるサイト上から情報を一気に取得できる「スクレイピング」と呼ばれるツールです！

現在、私は大学3年生でぼちぼち就活も始めなければ、、ということでWebマーケティング支援を行っている都内の企業に採用していただいて、長期インターンシップを始めました！
そんな中、文系の僕に「GAS？」というプログラミングのようなものをやってみよう！
という指示が、、（笑）
よくわからなかったので、とりあえず「GAS　スクレイピング」で検索してみました！

すると、最上位項目に株式会社LIGという企業の記事があったので、それをポチッ！
https://liginc.co.jp/551446

この記事では、GASとは？という基本的な説明から、実際にコードを書き込むところまで、
丁寧に書かれています！
「ほうほう、なるほど」と、とりあえず読み進めてみました。

実際の記事はこんな感じです！
![使うやつ１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710089/b87a41ea-4f0d-270f-b439-375e0a344267.png)
![使うやつ２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710089/6a7f0d20-d7ea-2dad-ff05-f003ae5d009f.png)
引用元：https://liginc.co.jp/551446

ライブラリというところに「cheerio」という関数を入れます！
この「ライブラリ」というのが僕もよくわからなかったので、調べてみると、
「GASでは、作成した関数を他のプロジェクトから利用できる」そうで、「cheerio」
というのもその一種だそうです！
ちなみに僕は別の「Parser」というものを使いました！

何もわからなかった僕は、記事に書いてある通りにコードを書き進めていきましたが、、

![使うやつ３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710089/8073d80b-b01f-a63d-e154-777c10ee9b44.png)
ここの「class, id」の指定で断念。。
やはり、基礎知識なく文面からいきなり理解するのは難しいですね（笑）

そこで…
実際に人が説明している動画を見るのがいいと考え、、
https://youtu.be/fvqSOkI7dBI
この動画にたどり着きました！

こちらの動画では、先ほどのブログ記事と同じく、一から手順を説明してくれています！

実際に書いてみたのがこんな感じです！
![使うやつ４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710089/da0a5371-b676-689f-a700-71d594194641.png)
![使うやつ５.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710089/2d7ceb8d-d034-f60f-f338-c0e4067c15f1.png)
引用元：https://youtu.be/fvqSOkI7dBI

まあ、難しいですね（笑）
ただ、こうやって一つ一つ照らし合わせて、意味を理解しながらやっていくと、少しずつわかってきます！
企業リストを作成していたのですが、最終的に僕も企業名の羅列までは成功しました！

今回は、GASというツールを使って、スクレイピングに取り組んでみましたが、
やはり勉強して一つ分かって、次の日にはまた一つ分かって、
というのがとても楽しいですね！

リストを作成する際に、「ページネーション（複数のページをまたいで、情報を取得する）」というもののやり方が分からなかったので、もしご存じの方がいらっしゃったら、教えてくださると嬉しいです！
6.3 (標準) 十分統計量2

## 方針

6.2と同じ．十分統計量が標本平均の形になっていることから平均，分散も求めることができる．

## 答案

![6. 2周目-9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/9d74b50b-daf3-7841-45cd-2482c2dc1323.jpeg)
![6. 2周目-10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/81278ff4-66a9-c8c4-b1ab-40112f4ef74c.jpeg)



## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
MySQL:データベースの中身を確認 - Docker -

##### コンテナの中に入ります
dbのコンテナ名は　$ docker psで確認!

```
$ docker exec -it [コンテナの名前] bash
```
##### dockerの中に入れたら、MySQLにログイン

```
$ mysql -u [MySQLのユーザー名] -p
```
パスワードを聞かれるので入力します

次にデータベース一覧を見てみます！
```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| myapp_development  |
| myapp_test         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.07 sec)
```
確認したいdatabaseを選択するには USE [データベース名];
```
USE myapp_development;
```

```
mysql> show tables;
+-----------------------------+
| Tables_in_myapp_development |
+-----------------------------+
| ar_internal_metadata        |
| posts                       |
| schema_migrations           |
| users                       |
+-----------------------------+
4 rows in set (0.01 sec)
```
次に確認したいテーブルを選択！
```
SELECT * FROM [テーブル名];
```

以上のステップでテーブルの中身を確認できます:)
APIで取得したJSONをdiffコマンドで差分比較する

# はじめに
業務で複数の類似システムの設定値をAPIで取得し、差分比較で設定の一致をまとめて確かめた際の手順を示します。

# 環境
Ubuntu 20.04

# 必要コマンドのインストール
本記事ではcurl,diff,jqコマンドを使用します。
インストールされていない場合はインストールします。

```console
$ curl --version
curl 7.68.0 (x86_64-pc-linux-gnu) libcurl/7.68.0 OpenSSL/1.1.1f zlib/1.2.11 brotli/1.0.7 libidn2/2.2.0 libpsl/0.21.0 (+libidn2/2.2.0) libssh/0.9.3/openssl/zlib nghttp2/1.40.0 librtmp/2.3
Release-Date: 2020-01-08
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS brotli GSS-API HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets


$ diff --version 
diff (GNU diffutils) 3.7
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

作者 Paul Eggert、 Mike Haertel、 David Hayes、
Richard Stallman、および Len Tower。

$ jq --version
jq-1.6

```

# APIでJSONを取得
利用するAPIは何でも構いませんが、今回は[郵便番号検索API](http://zipcloud.ibsnet.co.jp/doc/api)を利用してみたいと思います。
```console
# パラメータの郵便番号に対応する住所が返される
$ curl "https://zipcloud.ibsnet.co.jp/api/search?zipcode=1080014"
{
	"message": null,
	"results": [
		{
			"address1": "東京都",
			"address2": "港区",
			"address3": "芝",
			"kana1": "ﾄｳｷｮｳﾄ",
			"kana2": "ﾐﾅﾄｸ",
			"kana3": "ｼﾊﾞ",
			"prefcode": "13",
			"zipcode": "1080014"
		}
	],
	"status": 200
}
```
比較するための適当な2地点のJSONをファイルに出力します。
今回は近い二地点の物を利用します。

```
$ curl "https://zipcloud.ibsnet.co.jp/api/search?zipcode=1080014 > shiba"
$ curl "https://zipcloud.ibsnet.co.jp/api/search?zipcode=1050003 > nishishimbashi"

# address3,kana3,zipcodeが違う
$ cat shiba 
{
	"message": null,
	"results": [
		{
			"address1": "東京都",
			"address2": "港区",
			"address3": "芝",
			"kana1": "ﾄｳｷｮｳﾄ",
			"kana2": "ﾐﾅﾄｸ",
			"kana3": "ｼﾊﾞ",
			"prefcode": "13",
			"zipcode": "1080014"
		}
	],
	"status": 200
}
$ cat nishishimbashi 
{
	"message": null,
	"results": [
		{
			"address1": "東京都",
			"address2": "港区",
			"address3": "西新橋",
			"kana1": "ﾄｳｷｮｳﾄ",
			"kana2": "ﾐﾅﾄｸ",
			"kana3": "ﾆｼｼﾝﾊﾞｼ",
			"prefcode": "13",
			"zipcode": "1050003"
		}
	],
	"status": 200
}
```
この後diffコマンドで差分比較をし、一致部分の確認をしますが、この時APIで取得したJSONが整形されていないことがあります。

そのような場合はjqコマンドを使用します。
`cat xxx | jq .`のように使用することで、JSONを成形することが出来ます。
```console
$ echo '{"name": "Tom", "class" : 1}' > tom
$ echo '{"name": "Bob", "class" : 1}' > bob

# 整形されていないと一致しない1行としてみなされてしまう
$ diff tom bob 
1c1
< {"name": "Tom", "class" : 1}
---
> {"name": "Bob", "class" : 1}

# 整形
$ cat tom | jq .
{
  "name": "Tom",
  "class": 1
}

cat tom | jq . > tomjq
cat bob | jq . > bobjq

$ diff tomjq bobjq
2c2
<   "name": "Tom",
---
>   "name": "Bob",
```
整形されたJSONをdiffコマンドで差分比較します。
`diff ファイル1 ファイル2`のように使用します。
```
$ diff shiba nishishimbashi 
7c7
< 			"address3": "芝",
---
> 			"address3": "西新橋",
10c10
< 			"kana3": "ｼﾊﾞ",
---
> 			"kana3": "ﾆｼｼﾝﾊﾞｼ",
12c12
< 			"zipcode": "1080014"
---
> 			"zipcode": "1050003"
```
差分だけ比較することが出来ました。