OmniAICreator/Qiita-1.07M huggingface dataset:
Githubブラウザ上で出来る新機能

Githubのブラウザ上でVScodeの様なエディタを開けて
そこで作業ができる新機能が増えたらしいので試しに触ってみた！！

自分のリポジトリページに移動
![スクリーンショット 2021-08-12 20.29.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1724474/491f73f5-501e-6607-4b3d-8233bd2eef59.png)


このページでキーボードの
***『ドットを押す』***
.   ← これ！！

そうすると

![スクリーンショット 2021-08-12 20.30.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1724474/8bffcacd-fec5-076d-ab99-79b723e02c71.png)


VScodeみたいなエディター出てきた....!!!!!

ファイルを開くと
![スクリーンショット 2021-08-12 20.31.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1724474/666a9552-39f1-6140-a2c1-ce9467ae8fac.png)


ここからコードも書けちゃう？？

gitもここからいじれるっぽい？？？
今度試してみよ！！！！！

試してみた感想ありましたらコメントで教えてください😏！
よろしくお願いします！！
IBMの量子コンピューターで４倍のスピードで計算した

### 量子コンピューターのcomposerで４倍のスピードで計算
素人なりに量子コンピューターを触ってきました。
[IBMの量子コンピューターでシュレディンガーの猫と同じ気分になりたい。](https://qiita.com/motoyuki1963/items/d15f4b0ebe6b5505073e)
[IBMの量子コンピューターで1+1=2を計算してみた](https://qiita.com/motoyuki1963/items/e9ecd51f00bd749174a8)
赤い服を着ると３倍のスピードで仕事ができるようになると言われていますが、この量子コンピューターでどんな速い計算ができるのでしょうか？

### 足し算にアダマールゲートを入れてみると。。
1+1=2で作った足し算の量子コンポーザーの最初のところに、アダマールゲートを置きます。アダマールゲートは、0と1が絡み合った状態ですので、$ q[1]q[0] $は両方とも $|0⟩|1⟩$が重なった状態です。

### 量子コンピューターの計算過程を見るためには
メニューにINSPECTというのがあります。そこをクリックすると、一つずつ動かして確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/6a695de4-5b4a-43c1-ad8c-c6d7814b0b96.png)

まず、最初のアダマールゲートです。下のProbabilitiesが $q[3]q[2]q[1]q[0]$ の順番になっているのを思い出しながら一つずつ見ていきましょう。
最初は、$q[0]$ が $|0⟩|1⟩$ の状態になっているのがわかります。二つの状態になっているので確率は50%ずつです。

次は、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/780b37cc-dcdf-f72e-8f11-fb6744c11f20.png)

2つ目のアダマールゲートに進むと、$ q[1]q[0] $は両方とも $|0⟩|1⟩$の状態ですので、次の状態が考えられます。
$ q[1]q[0] $----> $|0⟩|0⟩$
$ q[1]q[0] $----> $|0⟩|1⟩$
$ q[1]q[0] $----> ​$|1⟩|0⟩$
$ q[1]q[0] $----> ​$|1⟩|1⟩$
それぞれが25%ずつの状態で、確率に表されました。

この状態で、一度に足し算がされます。つまり、0+0,0+1,1+0,1+1が同時に計算されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336017/c4228032-5ec8-de09-b3fe-62df0e0f05ae.png)

足し算の最後まで進めると、計算結果が出ます。
0000 ----> 0+0=0
0101 ----> 1+0=1
0110 ----> 0+1=1
1011 ----> 1+1=2
の結果が等しく２５％ずつですと確率に出ています。

すごい量子を絡み合わせて計算すると、４つの計算が一度に計算が可能です。

これを４倍のスピードと言うかどうかは、プロの物理学者に任せます。

私の夏休みの量子コンピューター入門はこれで終了です。
コンピュータ制御

#自動制御

###シーケンス制御
あらかじめ定められた順序に従って、制御の各段階を逐次進めていく。

PLC(Programable Logic Controller)と呼ばれるリレー回路の代替装置が利用されている。

PLCはパソコン上でprogrammingできる装置で「ラダー図」という言語で記述する。

※ラダー図は言語名であり図ではない。


###フィードバック制御
検出機器やセンサから得られた測定値と目標値を比べながら運転。

サーミスタ：温度の変化
ジャイロセンサ：角速度センサ。傾きや振動も検出
ひずみゲージ：変形を感知
ウェアラブル生体センサ；ウェアラブルデバイスに取り付けられる生体センサ。
gRPCのEnumを必須チェックしたい

人の欲は尽きない。

# やりたいこと
gRPCのリクエストでEnum型のフィールドが送られてきたかどうか、必須チェック(Nullチェック)したい。

# 前提
Enumのfield number 0番は、Nullとして弾く。
⇒なぜなら、リクエスト内部でNull/未設定の場合に初期値として0番が入ってくるので、0番にプログラム上の意味を持たせると、0番が明示的に送られてきたのか空だったのか区別がつかないから。

# 準備
Enum値を持ったAPIを用意します。

```Sample.proto
syntax = "proto3";

package sample;
option java_package = "jp.co.your.project"
option java_outer_classname = "SampleProto"

import "google/protobuf/empty.proto";

service SampleService {
  rpc getType (SampleRequest) returns (google.protobuf.Empty) {}
}

message SampleRequest {
  SampleType sample_type = 1;
}

enum SampleType {
  UNKNOWN_VALUE = 0; // これが送られてきたらNull扱い
  TYPE_A = 1;
  TYPE_B = 2;
}
```

```Sample.xml
<constraint-mappings xmlns="http://xmlns.jcp.org/xml/ns/validation/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/validation/mapping http://xmlns.jcp.org/xml/ns/validation/mapping/validation-mapping-2.0.xsd" version="2.0">
<default-package>jp.co.your.project</default-package>
  <bean class="SampleRequest">
    <field name="sampleType_">
      <constraint annotation="javax.validation.constraints.Min">
        <message>${javax.validation.constraints.NotNull.message}</message>
        <groups>
          <value>org.lognet.springboot.grpc.validation.group.RequestMessage</value>
        </groups>
        <element name="value">1</element>
      </constraint>
    </field>
  </bean>
</constraint-mappings>
```

# 動作確認
`{"sample_type":"TYPE_A"}` を送ると、正常応答（上記なら空応答）が返ってくると思います。
`{}` を送ると、異常応答（ `「 Message: sampleType_: $null は許可されていません」` ）が返ってくると思います。

# ここがポイント
`<constraint>` で指定したのは `NotNull` ではなく `Min(value=1)` です。

### gRPCは原則Nullを扱わない
前提で0番は弾く、といった理由です。Enumの初期値は0番なので、Nullを送っても0番として受け取ります。
`NotNull` では弾けません。

### `Min` の `value` は `1` とする
自動生成される `SampleRequest.java` の中身を確認していただくと、

```SampleRequest.java
  private int sampleType_;
```
という記述が見つかるかと思います。実はEnumの中身はJavaのint型です。
なのでMinが使えます。

そして、初期値である0では困るので、1以上、とすれば必須チェックの完成です。

最近、ちょっと夜更かしするとすぐ日が昇ってきていやですね。。

よいgRPCライフを！
SlackWebAPIでJSONが利用できなかった話

SlackのWebAPIを使ってメッセージを投稿しようとしたときに、JSONで送るとなぜかエラーで送れないという話を聞いたので調査しました。

# 状況確認

[リファレンス](https://api.slack.com/web#slack-web-api__basics__post-bodies__json-encoded-bodies)を見ると、確かに、JSONで送れると書いてあります。
そして下記に従う必要があるそうです。

> There are some ground rules:
> 
> - You must explicitly set the `Content-type` HTTP header to `application/json`. We won't interpret your POST body as such without it.
> - You must transmit your `token` as a bearer token in the `Authorization` HTTP header.
> - You cannot send your token as part of the query string or as an attribute in your posted JSON.
> - Do not mix arguments between query string, URL-encoded POST body, and JSON attributes. Choose one approach per request.
> - Providing an explicitly `null` value for an attribute will result in whichever default behavior is assigned to it.

これに合うメッセージ送信処理をJavaScriptで書いてみます。

```js:JSONでメッセージ送信
const request = new XMLHttpRequest();
request.open('POST', 'https://slack.com/api/chat.postMessage', true);
request.setRequestHeader('Content-Type', 'application/json');
request.setRequestHeader('Authorization', `Bearer ${token}`);

let data = {};
data['channel'] = '投稿先のチャンネルID';
data['text'] = '送信メッセージ';
request.send(JSON.stringify(data));
```

ボタンをクリックしたら上記処理が実行されるようなWebページを作って試してみたところ、こんなエラーが表示されました。

:::note alert
クロスオリジン要求をブロックしました:  
同一生成元ポリシーにより、https://slack.com/api/chat.postMessage にあるリモートソースの読み込みは拒否されます  
(理由: CORS プリフライト応答からのヘッダー 'Access-Control-Allow-Headers' によりヘッダー 'authorization' が許可されていない)。
:::

CORSのプリフライトでエラーとなっていますね。
CORSについては [こちら](https://developer.mozilla.org/ja/docs/Web/HTTP/CORS)を参考にして下さい。

`Authorization` ヘッダーが許可されていないということですが、上記のSlackのマニュアルにはTokenは`Authorization` ヘッダーに書けって書いてあるしどうしろと。。。

ではどんなヘッダーなら許可されているのか、プリフライトのレスポンスの内容を見てみました。
![スクリーンショット 2021-07-17 18.21.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1605307/b99b7bfe-ca6c-c62b-852d-c2cc34581976.png)

うーん、なんだかこれ、外部からアクセスされることを想定していない設定のような…。

と、ここで一つの疑惑が。

:::note
application/json に対応しました（ブラウザからの実行に対応したとは言っていない）
:::

ということなのではないかと。


# 検証

ではブラウザを使わずに実行してみましょう。

Node.jsを使ってターミナルから同じ処理を実行しました。
送れた！

ということで黒です。


# 対処法

ブラウザから送る場合はJSONは諦めて、 `Content-Type` には `application/x-www-form-urlencoded` を設定することになります。

```js:URLエンコードでメッセージ送信
const request = new XMLHttpRequest();
request.open('POST', 'https://slack.com/api/chat.postMessage', true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

const channelID = '投稿先のチャンネルID';
const message = '送信メッセージ';
request.send(`token=${token}&channel=${channelID}&text=${message}`);
```

この仕様、Slack WebAPIのマニュアルには全く見当たりません。
フロントエンドから直接呼ばれるような使い方はあまり想定していないなのでしょうか。
低消費電力LSIの設計技術

#ダイナミック電力を低減する
ダイナミック電力とは、回路ブロックの動作（スイッチング動作）に伴って消費される電力。
電源電圧の二乗と周波数の席に比例するため、どちらかを減らしたいが、電源電圧を下げると性能そのものが低下する。

この問題を解決しつつ低減できるのガマルチＶＤＤや動的制御技術（ＤＶＳ，ＤＶＦＳ）。

<b>マルチＶDD</b>：さほど早い動作が必要でないカイロブロックには低い電源電圧を使う。

<b>DVS,DVFS</b>：仕事量が少ない時にはＬＳＩを高い正の腕動作させなくても良い。



#スタティック電力の低減
スタティック電力とは、動作の有無にかかわらず漏れだすリーク電流のことで、リーク電力とも呼ばれる。

このリーク電力の低減技術として、<b>パワーげ―ディング</b>がある。
これは、動作をする必要がないカイロブロックへの電源供給を遮断する。
pythonでusbの有無判定

#pythonのwith構文を使用してusbの有無判定を行う

環境
Mac Big Sur 11.4
vs code 1.58.2
python 3.9.2

pythonでusbが刺さっている時と刺さっていない時で挙動を分けたいと思い、適当な方法で実装しました読んでくれている方の役に立てば幸いです。

##使用するusbを設定する
使用するusbの名前をTESTに変更します。尚usbの名前が違うと期待した動作をしないのでそれぞれ環境に合わせてコードも変更してください。この例ではTESTとつけて貰えば動きます。
Windowsを使用している方はファイルパスの指定方法を適宜変更してください

usb内にtest.csvというファイルを作成しておく中身は数値でも適当な文字列でもなんでも構いません



##with構文を利用してファイルをreadモードで開く


```python:verification.py
import csv


def verification():
    try:
        with open('/Volumes/TEST/test.csv','r+',encoding='utf-8') as f:
            reader = csv.reader(f)
            get_data = [i for i in reader]
            return True
    except:
        return False

if verification():
    print('usb有')
else:
    print('usb無')
```


関数verificationはwith構文でusb内のtest.csvというファイルを読み取れるかを確認して読み取り可能ならTrue、読み取り不可能ならwith構文は例外を起こしFalseを戻り値として返す関数です。
if文に関数を渡してあげて戻り値でusbの有無を判定しているだけなのでcsvファイルでなくとも良いのですが自分の用途ではcsvファイルを利用したかったのでこのようにしています。


pc内とusbないでデータを分割して保管してusbが刺さっている時のみコードを動作させる簡単な方法を探している時に思いついたものです。
もっと良い方法をご存知の方がいらしたら是非コメントでご教授願います
Herokuで月一回のバッチ処理を実装する方法


はじめに
---
月1回バッチ処理で、テーブルの特定カラムを更新したいと思い、gem「whenever」を使用して、バッチ処理を実装しようとしたものの、Herokuでは使用できなかったため、Heroku　Schedulerを使用して、月一回のバッチ処理を実装しました。実装するにあたり、情報が少なかったため、同様の悩みをお持ちの方のお役に立てばと思い、記載いたします。

開発環境
---
- Mac
- Ruby 2.7.2
- Rails 6.1.3.1
- PostgreSQL 13.2

タスクの定義
---
Schedulerで実行したいタスクを定義します。`rails g task タスク名`コマンドでタスクを定義します。今回はタスク名を「reset_eat_day_month」としました。

```:ターミナル
rails g task reset_eat_day_month
```

成功すると、`lib/tasks`下にタスクが作成されます。私の場合、usersテーブルのeat_day_monthというカラムを０に更新したかったため、以下のタスクを定義致しました。


```ruby:lib/tasks/reset_eat_day_month.rake
# 名前空間
namespace :reset_eat_day_month do
  # タスクの説明
  desc "usersテーブルのeat_day_monthをリセットする"
  # タスクの名前
  task reset_eat_day: :environment do
    begin
      user = User.all
      user.update(eat_day_month: 0)
      puts "リセット完了"
    rescue StandardError => e
      # 例外が発生した場合の処理
      # リセットできなかった場合の例外処理
      puts "#{e.class}: #{e.message}"
      puts "-------------------------"
      puts e.backtrace # 例外が発生した位置情報
      puts "-------------------------"
      puts "リセットに失敗"
    end
  end
end
```

定義したタスクがきちんと表示されるか確認。

```:ターミナル
bundle exec rake -T
```

以下のように定義したタスクが出力されていることを確認。

```:ターミナル
rake reset_eat_day_month:reset_eat_day  # usersテーブルのeat_day_monthをリセットする
```

タスクが定義されていることを確認後、以下のコマンドを実行して、タスクが想定通り動くかを確認。

```:ターミナル
bundle exec rake reset_eat_day_month:reset_eat_day
```

想定通りにusersテーブルのeat_day_monthというカラムが０になっていることをPosticoにてSQLを発行して確認。
![demo](https://gyazo.com/74a122ac136fac65123cce16bc460578/raw)


Herokuのアドオンをインストールする
---
Heroku　Schedulerを使うためには、スケジューラのアドオンをインストールする必要があります。以下コマンドで、アドオンをインストールします。

```:ターミナル
heroku addons:add scheduler:standard 
```

スケジューラを設定する
---
定義したタスクをスケジューラに登録します。以下コマンドで、Heroku　Scheduler画面を開きます。

```:ターミナル
heroku addons:open scheduler
```

以下の画面で「Add job」ボタンを押す。

![demo](https://gyazo.com/6ce8084d782304a66a3c5485ce955bef/raw)

以下の画面のように「Every day at...」を選択して、毎日1回バッチ処理が動くようにします。
今回は月初に1回バッチ処理を動かしたいのですが、デフォルトの選択肢には、毎日１回か1時間に1回、１０分ごとに1回しかないです。
そのため、毎日１回バッチ処理を動かし、Run Commandの中で、日付が01だったら、タスクを稼働させるというコマンドを入力することで、月初に1回処理が稼働します。
ジョブが稼働する時間はUTC(協定世界時)のため、JST(日本時間)にするにはUTCに＋９時間することで、求められます。
以下のように入力が完了したら、「Save Job」ボタンを押す。

<img src="https://gyazo.com/888b1ca2acb74b6114727337bb47f9f4/raw" width=70%>

以下の画面のように追加したスケジュールが追加されていることを確認します。

![demo](https://gyazo.com/00a65378f05d04680a3b0a2c67c0181c/raw)

 まとめ
---
- Heroku Schedulerのデフォルトスケジュールに月1回がなかったですが、諦めずに他にやり方はないのか？を考えることが大切だと思いました。
- 実装は一気にせずに、少しずつ実装して、実装できたらこまめにプログラムを稼働させて確認することで、想定外のことが起きても原因のスコープが狭いため、原因を特定しやすいと思いました。


参考資料
---

- [heroku schedulerの使い方](https://qiita.com/kyohei8/items/5a7d7db3838728a04140)
- [Herokuでスケジューラ（cron）を設定する方法](https://reasonable-code.com/heroku-cron/)
- [Heroku Scheduler で月一回だけ実行したい](https://qiita.com/ysaito8015@github/items/578f7ebd6bfe3fb00d4e)
ダイクストラ法

#ダイクストラ法とは

グラフの辺に値を持たせたグラフを<b>重みつきグラフ</b>と呼ぶ。そして、そのスタート地点から目的点までの最短経路を求める問題を最短経路問題と言います。最短経路を求める代表的なアルゴリズムがダイクストラ法です。

ダイクストラ法は、各頂点への最短距離をスタート地点の隣接点から一つずつ確定する。
<img src="https://th.bing.com/th/id/R.504473c85fe8bcdda41fd797fb00102d?rik=2qMQ%2b0kBJNjRSQ&riu=http%3a%2f%2fcdn-ak.f.st-hatena.com%2fimages%2ffotolife%2fk%2fkuuso1%2f20151213%2f20151213071247.png&ehk=9kk6XwNGg6NsXDn%2fq288Ocyygs3vpMZnmcZ6d6356ao%3d&risl=&pid=ImgRaw&r=0">
「.」で起動するgithub.devとGithub Codespacesの違い

　昨日、Github Codespacesの使い方記事を書いたのですが、本日同じくオープンしたgithub.dev（どうやら VS Code Webと呼ぶらしい）について混同しやすいので、記事にまとめてみました。

https://qiita.com/ku_suke/items/55676049940c234e49b5

https://twitter.com/github/status/1425505817827151872

# 結論：実行環境込みか、エディタのみかの違い

最初に結論を書くと、Github CodespacesはVS Code Serverを搭載した仮想マシンがついてくる完全な開発環境です。

github.devは、Codespaceのうちエディタ部分だけを切り出した、ブラウザのみで動くVSCodeエディタです。そのためいくつかの制限があります。

そうそう、github.devは無料、Codespacesはインスタンスのスペックに応じて時間課金される点も違いですね。

## 制限：devではターミナルが使えない

github.devでは、マシンインスタンスがついてこないので、当然ながらターミナルは使えません。もちろんコンパイルなどマシンパワーが必要な処理もできません。開発用サーバも起動しません。

![スクリーンショット 2021-08-12 19.43.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8727/750dd999-0f82-9f6a-859d-0b54cda9dc64.png)

## 拡張も一部のみ対応

つまり、github.devはhotfixやちょっとした修正を以前あったブラウザ上のファイル単位のテキストエディタよりもより高度に行うことができるという位置付けになります。拡張もオンメモリ＆JSで処理可能なもの（シンタックスハイライトやJSで）に限られるようです。

![スクリーンショット 2021-08-12 19.44.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8727/cc856ffd-9904-570d-e5cd-48c1610e684f.png)

ここには`not available in VS Code Web.`とあるので、github.devの正式名称は「VS Code Web」のようですね。

## Pushしていないファイルはブラウザ内に保存？

こちらはざっと挙動を見ただけで自信がないのですが、ブラウザAでgithub.devをひらき、`newfile.txt`を作成後に、コミットせずにブラウザBでgithub.devを同じユーザで開いても **ファイルは存在していませんでした** マシンインスタンスがついてこないので、当然ながらストレージも用意されていないわけですね。

しかし、ブラウザAをリロードしても当該ファイルは残っていました。おそらくServiceWorkerによってオフラインキャッシュしているようですね。

## それ以上はローカルかCodespacesに移動！

それ以上のことが必要になったら、ローカルのVS CodeにCloneするか、Codespacesにうつって続きの作業をしましょう。

いずれにしても、リポジトリ全体をブラウザ上で編集してPushできるので、Github Actionsと組み合わせることで、完全無料かつブラウザのみでHugoやJekyllみたいな静的サイトジェネレータでサイトを構築するくらいまではできるということですね！

Codespacesの使い方に関してはこちらの記事を参考にしてみてください。

https://qiita.com/ku_suke/items/55676049940c234e49b5

本記事はQiitaエンジニアフェスタ2021参加記事です。

https://qiita.com/official-campaigns/engineer-festa/2021
【リスト】データの追加と削除の処理量の違い

HeadとTailを持つ単方向リストにおいて、データの先頭と最後尾でのデータの追加・削除を行う場合の処理を考える。
<img src="https://th.bing.com/th/id/R.a023c396a9784a39bfecc012371c9b80?rik=lK7oC%2fbrXB5Z4Q&riu=http%3a%2f%2fwww.ns.kogakuin.ac.jp%2f%7ecu40887%2fprog4%2fimages%2flinked_list.png&ehk=dgtwqFWlxSeK3yIMWq3G9aVN9K2QZbjhGiuZHAygMkA%3d&risl=&pid=ImgRaw&r=0">

#データの追加
データの追加に関しては、リストの先頭で行っても最後尾で行っても処理量は同じ。

#データの削除
先頭から順にたどるため、最後尾の方が処理量が多い。
Cannot find module 'next/dist/next-server/lib/router-context'の解決方法

## 概要

Next.jsでビルド時に以下のエラーが出て困ったので、解決方法を残しておきます。

```
Type error: Cannot find module 'next/dist/next-server/lib/router-context' or its corresponding type declarations.
```

## 結論

`RouterContext`のimportパスを`next/dist/shared/lib/router-context`に変更します。

```js
// good
import { RouterContext } from "next/dist/shared/lib/router-context";
// bad
import { RouterContext } from "next/dist/next-server/lib/router-context"; 
```

自分はこれでエラーがなくなりました。

## なぜ起こったか

Next.js@11.1で`router-context`の置き場所が変わったようです。


Storybookのドキュメントにも以下のように書いてあります。

```js
import { RouterContext } from "next/dist/shared/lib/router-context"; // next 11.2
import { RouterContext } from "next/dist/next-server/lib/router-context"; // next < 11.2


export const parameters = {
  nextRouter: {
    Provider: RouterContext.Provider,
  },
}
```
ここには`next < 11.2`と書いてありますが、Next.js公式は`11.1`でパスが変わったよ！と言ってるので、`11.1`でもパスを変更しましょう。

依存アップデートしたらエラーが出た！という人の参考になれば幸いです。

## 参考
- [Breaking change on 11.1.0 refactor of shared folder · Issue #28011 · vercel/next.js · GitHub](https://github.com/vercel/next.js/issues/28011)
- [[Next@11.0.2-canary23] Cannot find module 'next/dist/next-server/lib/router-context' or its corresponding type declarations. · Issue #27572 · vercel/next.js · GitHub](https://github.com/vercel/next.js/issues/27572)
- [Next.js router Addon | Storybook](https://storybook.js.org/addons/storybook-addon-next-router)
フォールトレランス

#フォールトトレランス
故障の発生が前提で、発生してもシステム全体で必要な機能を維持しようとする考え方。
　・フェールソフト：機能低下させて運転。機能が低下した状態で処理を続行することを<b>フォールバック</b>と呼ぶ。
　・フェールオーバー：他のシステムに引き継ぎ、影響を感じさせない。回復した時に元のシステムに戻すことを<b>フェールバック</b>と呼ぶ。

cf.フォールトアボイダンス
なるべく故障や障害が生じないようにする。
→信頼性の高い部品や材料の採用、試験や検証の徹底、高品質な個体の選別、人員の教育・訓練の充実など
Google Colabで　Google Drive から kaggle Datasetを作る

#0.Intro
Colabで学習させたモデルの重みをCode Competitionで使いたいですよね(そのための学習!!)
でも重みを保存したGoogle Driveのデータをダウンロード→datasetにUploadは大変時間がかかります。
いろいろ探ったら昔は共有リンクをいじったらRemote Fileとして読み込めた(もしくはUpload)出来たらしいですが仕様変更で今では出来なさそうです。
ですので直接送れる方法はないかと探りました。
結果はシンプル、Kagle APIを使うでした。
このことを書いているところ、意外となかったので個人的にメモを兼ねて記事にしておきます。


#1.方法
1. ColaboにGoogle Driveをマウント

2. /root/.kaggle/kaggle.jsonを配置

3. データセットのメタファイル(dataset-meta.json)を作成

```
kaggle datasets init -p /path/to/dataset
```
を実行するとひな形が作成されます。
パスはデータがあるフォルダです。

```
{
	"licenses":[
	　{
		"name":"CC0-1.0"
	　}
	],
	"id":"(username)/INSERT_SLUG_HERE",
	"title":"INSERT_TITLE_HERE"
}
```

というようなファイルが出来ます。

4.dataset-meta.jsonを編集
編集するのは
・id
・title
だけで十分です。個人的ハマったのはidにアンダーバーが使えないことです
※*アンダーバーを使うとアップロードの後に 400 Bad Requestになります*

既存のデータセットのIDとタイトルを参考に適当につけましょう。

5.dataset作成

```
kaggle datasets create -p /path/to/dataset
```
を実行。パスはもちろんデータがあるフォルダです。
成功したら「**Upload successful**」と表示されます。

#2.以上です
最初は惑いますがやってみると非常に簡単です。これで学習→サブミットの時間が短縮できてぐっと効率よくなりますね!!

#3.参考
[Kaggle/kaggle-api](https://github.com/Kaggle/kaggle-api)
JavaScriptの関数をRubyっぽくする

##したいこと
- 引数をオブジェクトで渡す
- 引数のデフォルト値を定める
- 関数側でキーを変数として定める

##Ruby
関数を定義するときrubyだと

````ruby
def func(a: 1, b: 2)
 p a, b
end

func(a: 2) #=> [2, 2]
````
みたいにできて便利

##JavaScript
これと同じことをJSでやろうとすると

````js
let func = (options) => {
  let a = options.a === undefined ? 1 : options.a;
  let b = options.b === undefined ? 2 : options.b;
  console.log(a, b);
}

func({a: 2}) //> 2, 2
````
のようになり冗長。

##結論
これをDRYにすると

@shiracamusさんからコメントいただきました。普通に同じキーを後に付け加えれば上書きできるんですね。その発想はなかったです。ありがとうございます。

````js
let func = (options) => {
//  let {a, b} = Object.assign({
//    a: 1,
//    b: 2
//  }, options)
  let {a, b} = {a: 1, b: 2, ...options}
  console.log(a, b)
}

func({a: 2}) //> 2, 2
````
AWS上にサーバーを作る（その03-02：Amazon VPCの設定）

VPCウィザードではなく、手動で作成することもできます。

前回の投稿
[AWS上にサーバーを作る（その03：VPCウィザードによるAmazon VPCの設定）](https://qiita.com/aa_ha1uhik0/items/f89bca832fdbec663f7c "AWS上にサーバーを作る（その03：VPCウィザードによるAmazon VPCの設定）")


# VPC を作成
VPCの項目に「VPCを作成」ボタンがあります。
サービス > VPC > VPCダッシュボード > [VPC](https://ap-northeast-1.console.aws.amazon.com/vpc/home?region=ap-northeast-1#vpcs:)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520646/ecfd7ad4-098d-b6fa-b63f-f7de84aacd12.png)


## VPCの項目設定入力
それぞれの項目について入力していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520646/ae518c79-6f98-5542-94c7-f706d3f6010f.png)

各項目について、オフィシャルの情報を引用しました。
### 名前タグ
> 「Name」というキーと、指定した値を使用してタグを作成します。

### IPv4 CIDR ブロック
> VPC の IPv4 アドレス範囲を指定する必要があります。IPv4 アドレス範囲をクラスレスドメイン間ルーティング (CIDR) ブロックとして指定します (例: 10.0.0.0/16)。CIDR ブロックサイズは、/16 ネットマスクと /28 ネットマスクの間である必要があります。

### IPv6 CIDR ブロック
> Amazon 提供の IPv6 CIDR ブロックを VPC に関連付けることができます。Amazon は固定サイズ (/56) の IPv6 CIDR ブロックを提供しているため、IPv6 アドレスの範囲をお客様ご自身で選択することはできません。代わりに、お客様ご自身の IPv6 CIDR を AWS にインポートした場合、アドレスプールから IPv6 CIDR ブロックを指定できます。

「IPv6 CIDR ブロックなし」を選択した。

### テナンシー
> インスタンスは、シングルテナントの専用ハードウェアの VPC で実行できます。起動時に指定されたテナンシー属性にかかわらず、この VPC で起動されたインスタンスが専有テナントインスタンスであるようにするには、[専有] を選択します。この VPC で起動されたインスタンスが起動時に指定されたテナンシー属性を使用するようにするには、[デフォルト] を選択します。

「デフォルト」を選択した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520646/16abd4e3-f415-aea9-a874-5e14a87829dd.png)

「VPC を作成」ボタンをクリック

自動でルートテーブル、ネットワーク ACL、DHCP オプションセットも作成されます。
Reactの復習といい教材

##背景

フロントエンドのエンジニアを目指すにあたってReactを勉強し、アプリを作っている最中でパフォーマンスなどを意識せずに書いているため、それを改善したいと思い改めて復習してみます。

##目標

1. Reactを振り返ることで自分の知識の向上。
2. 自分が作っているアプリの効率化。
3. 教材を通して学んだことをまとめる（日本語の練習とアウトプット）。

##復習の仕方
関数コンポーネント、ReactフックやReactの効率化などの復習と勉強をしたいため、https://kentcdodds.com/ で取り扱っているワークショップとブログサイトを参考に勉強し、学んだことなどを記事にまとめて知識のアウトプットと整理を試みる。また自分のアプリに応用できるところは取り入れてみる。

##教材
ワークショップの内容としては基礎からReactのコードパターンまで、最終的にはその応用でブックシェルフアプリの作成まであります。以下公開されているワークショップのリストとなります。

1. https://github.com/kentcdodds/react-fundamentals 
2. https://github.com/kentcdodds/react-hooks　 
3. https://github.com/kentcdodds/advanced-react-hooks 
4. https://github.com/kentcdodds/advanced-react-patterns 
5. https://github.com/kentcdodds/react-performance
6. https://github.com/kentcdodds/testing-react-apps
7. https://github.com/kentcdodds/react-suspense
8. https://github.com/kentcdodds/bookshelf    

受講する方法としては、githubからダウンロードし、ローカル環境でnpm startで始められます。立ち上がった画面より受講したいレッスンを選び、ダウンロードしたフォルダーのsrc/exercise/ より各レッスンを行っていき、回答はsrc/final/　に入っています。

もしテストを行いたい場合、該当するレッスンのテストがあれば、　src/\_\_tests\_\_/ に入っています。注意点としては最初は該当するレッスンのfinalのファイルがimportされているため、exerciseのファイルをimportするように書き換えないとテストはいつまでも通ってしまいます。

例：　

```javascript:src/__tests__/01.js
import App from '../final/01'
// import App from '../exercise/01'
```
import を変えましょう！

```javascript:src/__tests__/01.js
// import App from '../final/01'
import App from '../exercise/01'
```

必要な環境としては以下となります。

git v2.13 以上
NodeJS 12 || 14 || 15 || 16
npm v6 以上

個人的には ワークショップの2,3,4,5,6 に興味があります！

##最後に

ReactしかまだSPAのライブラリーに触れたことないですが、stateを変更するだけで画面が変わるっていうのがすごいと勝手に思っています。簡単に動的になるからこそ、気づかずパフォーマンス的には良くないコードを最初は書いてしまったので今回改めて勉強頑張ります。💪💪
MySQLのクエリ内で更新するかどうかを制御する

Golangの勉強がてら趣味のシステムを作ってる時の話。
一発目のシステムは、gormのORMを使わずに生SQLで書いてます。

で、管理側の機能の一つとして「画像を登録可能（無くてもok）」というものがあり、登録画像はmediumblobでMySQLに保存してます。
この前提でめんどいことが一点。

- 新規登録時<br>
画像がPOSTされた場合 = 更新<br>
画像がPOSTされなかった場合 = 更新
- 更新時<br>
画像がPOSTされた場合 = 更新<br>
画像がPOSTされなかった場合 = **更新しない**

上記の「更新しない」を実現するためには
クエリの更新対象カラムを動的に変更する必要があります。

ORMならそのまんま設定したりしなかったりするだけですが、
生SQLの場合はSQL文の変更が必要です。これがめんどい。

で、ちょっとググったら「なるほど！」と思えるものがあったのでメモ。

参考：https://stackoverflow.com/questions/14893355/mysql-update-a-field-only-if-condition-is-met

```golang
query := `
	UPDATE
		material
	SET
		name = ?,
		image = CASE WHEN ? = 0 THEN image ELSE ? END,
		description = ?,
	WHERE
		id = ?
	;`

statement, err := mysql.DBH().Prepare(query)
if err != nil {
	log.Println(err)
	return err
}

statement.Exec(
	param.Name,
	len(param.Image),
	param.Image,
	param.Description,
	param.ID,
)
```

- CASEを使うのは1カラムだけ
- 管理サイトなので基本低負荷、レイテンシ要求もシビアではない
- 厳密には更新してる？（既存データで上書きしてる、explain未チェック）けど気にしない

という前提ですが、ポイントで使う分には便利だなーと思いました。
（特にオチなし）
Undefined symbol: _OBJC_CLASS_$_ARGeoAnchor, Unity ARFoundation



## Undefined symbol: _OBJC_CLASS_$_ARGeoAnchor

Unityでビルド後、Xcodeで以下の2つのコンパイルエラーが出る。

```
Undefined symbol: _OBJC_CLASS_$_ARGeoAnchor
Undefined symbol: _OBJC_CLASS_$_ARGeoTrackingConfiguration
```


## ARFoundation samplesとの差分を見る

[Unity公式のarfoundation-samples](https://github.com/Unity-Technologies/arfoundation-samples)を参考に設定などを自分のプロジェクトと比較しました。Package関連は完全に同じでも、Player settingsやARKitが若干違ったので、Edit -> Project Settings...` から以下のように設定しました。


### 1. Plug-in ProvidersのARKitをオンにする

今回の問題はおそらくここが問題で、チェックを入れてビルドすれば、問題は解決しました！！

![ARKitOn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/5a1617c3-1ba0-2f0b-1520-e2b73c21b8d9.png)

### （2. Face trackingをオンにする）

多分ここはなくても問題ないですが、[Unity公式のarfoundation-samples](https://github.com/Unity-Technologies/arfoundation-samples)に合わせました。

![ARKitCheck.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/c87c1b25-2d2d-4896-8b6d-d877b8be2ad3.png)

### （3. Symbolsを設定する。）

ここも2と同様必要ではないと思いますが、一応設定しました。

![Symbols.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/be51ca0d-076f-d0ba-9663-a581fe233fcb.png)


## 最後に

M1チップ対応で結構つまづくかと思いますが、[Unity公式のarfoundation-samples](https://github.com/Unity-Technologies/arfoundation-samples) を見ながら地道に進めていきましょう！

- [Twitterアカウント](https://twitter.com/supertask_jp)
- [YouTubeアカウント](https://www.youtube.com/c/TasukuTAKAHASHI)
【C#】.NET Frameworkの標準エラーダイアログをカスタマイズして表示させる


# エラー発生時に表示させるダイアログをユーザーフレンドリーにする

うまく例外をキャッチできない場合に.NET Frameworkの不格好な標準のエラーダイアログが表示されるのが嫌だったのでこれをうまいこと例外をキャッチしてダイアログをユーザーフレンドリーにカスタマイズする。
（あとついでに表示させたダイアログを自動的に閉じるようにもする）

# サンプルコード

以下のサイトを大いに参考にさせてもらいましたm(_ _)m
つ [適切に処理されなかった例外をキャッチするには？：.NET TIPS - ＠IT](https://atmarkit.itmedia.co.jp/ait/articles/0507/01/news134.html)

```cs

using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;

namespace TestApp
{
    public class Test
    {
		[STAThread]
		static void Main()
		{
			// ThreadExceptionイベント・ハンドラの登録
			Application.ThreadException += new
				ThreadExceptionEventHandler(ApplicationThreadException);

			// ほかの処理

		}
			
		// 未処理例外をキャッチするイベント・ハンドラ
        public static void ApplicationThreadException(object sender, ThreadExceptionEventArgs e)
        {
			// 第二引数にエラーメッセージ
            ShowErrorMessage(e.Exception, "ApplicationThreadException");
        }

        // ユーザー・フレンドリなダイアログを表示するメソッド
        public static void ShowErrorMessage(Exception ex, string extraMessage)
        {
			// ダイアログを自動的に閉じるようにしたいので以下の処理を追記
            var w = new Form() { Size = new Size(0, 0) };
			// ここでは約5秒後に閉じるように設定
            Task.Delay(TimeSpan.FromSeconds(5))
                .ContinueWith((t) => w.Close(), TaskScheduler.FromCurrentSynchronizationContext());

			// ダイアログに表示させるメッセージを記述
            MessageBox.Show(w
                , "エラーが発生しました。約5秒後にアプリケーションの再起動を行います。\n\nしばらくお待ちください。\n\n\n"
                , "Error : " + extraMessage);

            // エラーダイアログが閉じた後に実行する処理（アプリの終了処理を書いたり）
            Application.Exit();
        }
	}
}
```

# 参考URL
- [適切に処理されなかった例外をキャッチするには？：.NET TIPS - ＠IT](https://atmarkit.itmedia.co.jp/ait/articles/0507/01/news134.html)
- [c# - Close a MessageBox after several seconds - Stack Overflow](https://stackoverflow.com/questions/14522540/close-a-messagebox-after-several-seconds/20098381)
【Dart/Flutter】 utfの代替パッケージ

アプリでUnicodeを扱うために[utfパッケージ](https://pub.dev/packages/utf)を使用していたのだが、これがけっこう前からディスコンになっていて、代替も見付からないので、どうしたものかと思っていたところ、[charsetパッケージ](https://pub.dev/packages/charset)を見つけました。

* [utf](https://pub.dev/packages/utf)
* [fast_gbk](https://pub.dev/packages/fast_gbk)
* [euc](https://pub.dev/packages/euc)

を取り込んで、 ’dart:convert’のような感じに綺麗にまとめてくれています。非常に有難い。
treeコマンドもどき用のジェネレータを作ってみた

# はじめに
- Pythonでコマンドプロンプトのtreeっぽいことをやりたくなった。
- 見た目の調整部分は文字幅調整などが面倒そうなので放っておいてとりあえずフォルダやファイルの名前と深さ、ファイルかフォルダのどちらかの情報を返すジェネレータとして作ってみた。
- GUIで出力するときも階層と名前だけの出力があれば使えるので応用すれば他にも使えそうなものができた。

## できたもののコード
```python
from pathlib import Path
from collections.abc import Generator


def tree(path: Path, nameonly: bool = True, root_nameonly: bool = True) -> Generator[tuple[int, str, bool], None, None]:
    if nameonly or root_nameonly:
        yield len(path.parents), path.name, path.is_dir()
    else:
        yield len(path.parents), str(path), path.is_dir()
    for p in sorted(path.iterdir(), key=Path.is_file):
        if p.is_dir():
            yield from tree(p, nameonly=nameonly, root_nameonly=True)
        else:
            yield len(p.parents), p.name if nameonly else str(p), p.is_dir()


for depth, path, is_dir in tree(Path()):
    print(f"{'  ' * depth}{path}[{'D' if is_dir else 'F'}]")
```

### 引数の説明
今回作成したtree関数はフォルダをpathlib.Pathとして受け取り、そこを起点に探索を行うジェネレータ関数。
引数のnameonlyはyieldで戻ってくるものを最初に与えたpathからの名前だけにするかを決める。
root_nameonlyは最初に与えたpathだけを名前だけにするかを決める。
フルパスを与えて、一番最初に表示するときはフルパス、以降は名前だけということもできる。

### 戻り値の説明
戻り値は深さ(int)、パスまたは名前(str)、フォルダかどうか(bool)の3要素からなるタプル。
深さはlen(path.parents)を使って取得しているので最初に与えたフォルダが1となる。
深さを * でインデント用のスペースでかけるだけでもインデントで分けられたツリーっぽいものが簡単に作れる。
フォルダかどうかの情報もあるので、ファイルとフォルダで見た目になにか工夫を加えたい場合はそこを使うことができる。

※アノテーションを付けるとき、collections.abcのGeneratorをアノテーションに使えないバージョンではtypingの方を使用する。

### 実装について
全体的にpathlib.Pathの機能を使っているだけなので思った以上にシンプルに作れている。
地味にやってよかったと思っているのはsortedを使ったところ。
path.iterdir()をするときにsortedを挟むことで最初にフォルダが来るようにしている。
上のコードではkeyに渡す関数にpathlib.Pathクラスのis_fileを渡している。
クラスの普通のメソッドでもクラスから直接取ると第一引数にそのクラスのインスタンスを要求する形になるので、path.iterdir()でやってくるpathlib.Pathのインスタンスに対して正しく動いてくれる。
無名関数を使って.is_file()をする下のような形でも同じ動きをしてくれる。

```python
# どっちを使っても同じ動きになる
sorted(path.iterdir(), key=Path.is_file)
sorted(path.iterdir(), key=lambda p: p.is_file())
```

判定にis_fileを使っているので、フォルダだった場合False(0)が返るのでデフォルトの昇順でソートされればフォルダ一番最初に来るようになる。

最初に引数として渡されたフォルダの親までの数と、パスか名前、フォルダかどうかの真偽値をまとめてyieldで返す。
あとは巡回した要素がフォルダかファイルかを判定して、フォルダならyield fromで再帰する。
ファイルの場合は親までの数と、パスか名前、フォルダかどうかの真偽値をまとめてyieldで返す。

## 終わりに
pathlibがとにかく使いやすい。
strを噛ませないと引数として渡せないことがたまにあるが、それを差し引いてもパス関連は全てこれで済むというところがわかりやすい。
内部の処理も元となるフォルダをどうするかと、その中身を巡回して各要素に対してそれぞれどうするかというシンプルな構造で作ることができた。
GitHub Actions で submodule チェックアウトを GitHub Apps にお願いする

# はじめに

PersonalAccessToken(PAT) や SSH 接続による submodule チェックアウトではなく、
ここでは GitHub Apps で認証しチェックアウトします。

## 事前準備

手順は割愛します。

- GitHub Appを作成する
    - `Contents` の `Read-only` Permission を付与する
- GitHub Actions secretsに以下２つの値を登録する
    - APP_ID (GitHub App のApp ID)
    - APP_PRIVATE_KEY (GitHub App の Private Key)

## ワークフローの定義

早速完成版です。

```yml
name: git submodule
on:
  workflow_dispatch:
jobs:
  pre:
    name: pre
    runs-on: ubuntu-20.04
    steps:
      - name: github-app-access-token
        id: get-github-app
        uses: getsentry/action-github-app-token@v1
        with:
          app_id: ${{ secrets.APP_ID }}
          private_key: ${{ secrets.APP_PRIVATE_KEY }}
      - name: Checkout
        uses: actions/checkout@v2
        with:
          submodules: recursive
          token: ${{ steps.get-github-app.outputs.token }}
      - name: print
        run: |
          ls -la
          ls -la example-github-actions-sub
```

### アクセストークンを取得する

GitHub Appのアクセストークンを取得するActionはMarketplaceにいくつかありますが、こちらでは以下を使いました。

https://github.com/marketplace/actions/action-github-app-token

GitHub Actions secrets から `App ID` と `Private Key` をセットし、トークンを取得します。
取得されたトークンは出力パラメータで後続で受け取ります。

### チェックアウト

`submodule` を `recursive` に設定し、再起的にサブモジュールをチェックアウトします。
また、 `token` に先行処理で取得したトークンをセットします。

### 結果

最後にチェックアウトされたことを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228453/52b5db37-c965-2545-37af-af4b378dfdb9.png)
プログラムでPetalマップの場所情報を検索する方法

次のソースコードを使えば、Petalマップで特定な場所の情報を検索できます。


```kotlin
val uriString = "petalmaps://poidetail?center={検索場所}&marker={検索場所}"

Uri.parse(uriString)?.let { uri ->
    Intent(Intent.ACTION_VIEW, uri).let { intent ->
        if (intent.resolveActivity(requireContext().packageManager) != null) {
            startActivity(intent)
        }
    }
}
```

# GitHub
Petal Map Sample : https://github.com/Rei2020GitHub/MyPublicProject/tree/master/PetalMapSample
Reactでfacebookログインを実装

## 0. 開発者用facebookアカウントの用意
facebookアカウントでのログイン実装には、開発者用のFacebookアカウントが必要なのでご準備を！

https://www.sakurasaku-labo.jp/blogs/facebook-developer


## 1. moduleのインストール
moduleを使わない方法も検討しましたが、なんだかややこしそうだったので素直にmoduleを使った実装を採用しました。

```
yarn add react-facebook-login
```
or

```
npm install react-facebook-login
```

## 2. moduleのimport
ログインボタンを設置したいコンポーネント(hook)でimport！

```
import FacebookLogin from 'react-facebook-login';
```

## 3. ボタンの宣言

```jsx
<FacebookLogin
  appId="Facebookから取得した固有のID"
  autoLoad={true}
  fields="name,email,picture"
  scope="public_profile,user_friends"
  callback={responseFacebook}
  cssClass="お好みのClas名"
  icon="fa-facebook" />
```
その他、カスタマイズする際のオプションリストみたいなのは下記のページのしたの方でまとまってましたのでご参考まで。

https://www.npmjs.com/package/react-facebook-login


## 4. レスポンスが返ってきた時の処理
設置したボタンをタップすると、勝手にfacebookのウィンドウが開いて情報入力などするわけですが、
その後アプリ側に返ってきた時に呼ばれる関数を用意しておく必要があります。
実は、ボタン宣言時に```"callback={responseFacebook}"```というパラメータを渡しておいたので同じ名前の関数を宣言するだけでOK！

```js
const responseFacebook = (response) => {
    console.log(response);
}
```

あとはとってきたログイン情報（名前、メアド、プロフ画像等）を必要な場所で活用していくだけ◎


最後は.. 
## ローカル環境で試したいよね
httpsのURLじゃないと、Facebook側のフィルターにかかって認証を開始することすらできない。
→ ngrock を使ってみた。
↓使い方↓

https://qiita.com/Marusoccer/items/7033c1bb9c85bf6789bd

注意： localhostではなく、IPアドレスを使って実行している場合、下のエラーが発生。

![スクリーンショット 2021-08-12 18.16.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296025/2105ce05-79ce-6a72-e4d7-9decf6ef037b.png)

このエラーは、こちらのコマンドで解決しました。

```
ngrok http --host-header=rewrite IPアドレス:3000
```
参考: https://qiita.com/T-Com/items/7f1468167f80df00a87d

しかしfacebookアカウントの開発モードでできることには制限があるので要注意です。
（審査に通るまで結構時間かかるみたいなので早めのご準備を~~）
プログラムでPetalマップのルート検索機能を使う方法

次のソースコードを使えば、Petalマップでルート検索ができます。

出発地：場所名または経緯度（Longitude,Latitude）
到着地：場所名または経緯度（Longitude,Latitude）
移動手段：drive、walk、bicycle、bus

```kotlin
val uriString = "petalmaps://route?saddr={出発地}&daddr={到着地}&type={移動手段}"

Uri.parse(uriString)?.let { uri ->
    Intent(Intent.ACTION_VIEW, uri).let { intent ->
        if (intent.resolveActivity(requireContext().packageManager) != null) {
            startActivity(intent)
        }
    }
}
```

# GitHub
Petal Map Sample : https://github.com/Rei2020GitHub/MyPublicProject/tree/master/PetalMapSample
OwaspZapでログイン認証でInvalidAuthenticityTokenとなってしまう

# はじめに

やっとFireFoxでlocalhostにアクセスできるようになり、いざ作成しているサイトにログインしようとしたらなぜかエラーになりました。

しらべてみるとプロキシが大きく関係していそう。
記事に見当たらなかったので今回はまとめていきます。

# 問題

ログイン認証をしたときに以下のエラーが発生する。
![1628748494.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/82f3510d-8ea9-1608-97ba-edf5e0255a67.png)
また、パラメータはしっかりと送られていることを確認できた。

```
 {"authenticity_token"=>"***********", "user"=>{.....
```

プロキシ設定を解除するとログインが通るので、プロキシが悪さをしているようだった。

# 原因

Dockerのログを確認したところ以下のようなログが出力されていた。

```
HTTP Origin header (https://localhost:3000) didn't match request.base_url (http://l
```

HTTPでしか受け取れないのに、HTTPSのヘッダーで送っているよとのこと。
Dockerは`http`でアクセスしているが、FireFoxでアクセスしたときは`http://`でアクセスしても`https://`に変わってしまう。なぜか`http`にはアクセスができなかった。

プロキシの設定で`https`にはプロキシを用いない設定をしてみた。

![1628748842.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/0bcec6fe-42a0-66de-2a4c-9bf48636e109.png)

`このプロキシーをHTTPSでも使用する`のチェックを外してみたが、やはり`https`にリダイレクトされる。。

# 解決方法

https://qiita.com/zackey2/items/11a206e73dae5bd8c794

この記事に解決方法が載っていました。

![1628748641.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/b261b7ac-41a2-f572-82f0-b0b70b8392cd.png)


ツール→オプション→HUDをクリック

![1628748662.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/0b0f653e-2fd9-c83d-f065-1c5872129343.png)

`Enable when using the ZAP Desktop`のチェックを外すことで`hhtp`にアクセスできるようになります。


この機能は、サイト上でテストができるツールで最近導入されたようです。
このツールを使うには`https`からつなげる必要があります。

![1628748759.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/9f621135-46c7-7de9-4f07-7433c0fc9b0e.png)

また、先ほどFireFoxのプロキシ設定で`HTTP`をプロキシ設定から外したので戻しました。
これを忘れていて、なぜかHTTPSのサーバーにアクセスできない事象が発生して時間を使ってしまいました。

# おわりに

いまは動的チェックのログイン周りでよくわからずに困っています。
はやく仲良くなりたいものです。

# 参考

- [OWASP ZAP 2.8.0経由でHTTPのサイト閲覧したいのに勝手にHTTPSになって困った](https://qiita.com/zackey2/items/11a206e73dae5bd8c794)
【DB Mysql】 学習まとめ

自己学習アウトプット用です。

---
|名前|略称|命令|内容|
|:---:|:---:|:---:|:---:|
|データ定義言語|DDL|CREATE|データベース・テーブルの生成|
| | |ALTER|テーブルの変更|
| | |DROP|データベース・テーブルの削除|
|データ操作言語|DML|INSERT|レコードの追加|
| | |DELETE|レコードの削除|
| | |UPDATE|レコードの更新|
| | |SELET|レコードの取得|
|データ制御言語|DCL|COMMIT|更新処理の確定|
| | |ROLLBACK|更新処理の放棄|
| | |SAVEPOINT|セーブポイントの設定|
---

#用語

* カラム
たて縦

* レコード
よこ横

* テーブル
全体のそのDBの名称

* クエリ
命令文、 select * など

* トランザクション
クエリ後の反映

* リレーショナルデータベース
関連があるデータベース

* DB項目
主キー、フィールド名、データ型

* サブクエリ
クエリの結果からさらにクエリをする条件の中からさらに条件を絞り抽出するもの

* ASC
昇順
* DESC
降順

* Select
縦、カラム名を抽出

* Insert
レコードの追加コマンド

* From
テーブルから抽出

* DB削除
Drop

* レコード削除
Delete

* Where
テーブル内のデータ抽出、※検索文字列とデータ文字列が同一でないとエラーになる※
$ Where <カラム名> = “<抽出したいデータ名>”
例)Where  state “神奈川”とすると「神奈川に住んでいる」データが抽出される

* Like
~のようなという意味のクエリ分、含まれていれば抽出される
$ Where name Like <文字列>;
これでnameというカラムから文字列が含まれたデータが抽出される
→プリンと焼きプリンがあった場合、where “プリン”だと焼きプリンが抽出されないので
Like “%プリン%”とすると焼きプリンも抽出される
→Like の中では % がワイルドカード

* Order by <ASC or DESC>
表示順番を昇順か降順にする

```php:ターミナル
Select * From <テーブル名> order by <カラム名(表示したい列)> <ASC or DESC>
```

* Group by
同じ関連のあるデータをひとまとめにして抽出する

![GROUP BY.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581998/481e7a1f-1e6d-c85b-bf30-70e33a1a8614.png)


#Access
####Accessとは
マイクロソフトがMicrosoft Windows 向けに販売しているデータベース管理システムのソフトウェア

* Accessには2つの作業項目がある

>* デザインビュー
* データシートビュー

「表示」→「三角ボタン」
ここからデザインを編集するかデータを編集するかを選び作業する

#### データシートビュー 

データ入力する際の作業項目


Excelからインポート：「外部データ」→「新しいデータソース」→「ファイルから」→「Excel」
ExcelシートをそのままAccessシートに作成することもできる→
「上記と一緒でExcelから」→「現在のDBのテーブルに新しいソースデータをインストールする」

####Access のクエリ
コード打たなくてもドラッグしてデータ抽出ができる
__「作成」__→__「クエリデザイン」__
抽出して表示したいようにフィールドとテーブルをドラッグして編集し最後に__「実行」__

####Accessでは基本直接データ入力をしない
__「フォーム」__という項目から提出表みたいな画面になり、そこで詳細を記載し
保存することでDB上に反映される流れ

####リレーションシップ設定
2つのテーブルを関連づけて情報を表示するためにリレーションシップ設定をする
「リレーションシップ」→「関連づけたいテーブル名を選択して作成」→
画面上に1対1のような関連性の画面が表示される
→反映されるために一度閉じて再表示→知りたい部分に + ボタンが表示されリレーション設定がされている




￼

##データを入力するまで

```php:ターミナル
＞CREATEでDBを作成する：Create database <DB名>
＞USEで作成したDBを使用する：use <DB名>
＞CREATE TABLEにてテーブルを作成：create table <テーブル名> (
	id int primary key,
	name varchar(128)
	);
	→int primary が主キー
	→カンマで区切るのを忘れない、最後にセミコロン
＞insert intoにてデータを入力する：insert into <テーブル名> (カラム1,カラム2) values (カラム1に対するデータ,カラム2に対するデータ)
```

##「id name score」といった「student」というテーブルがある場合

```php:ターミナル
$SELECT id,name,count(name) FROM student GROUP BY name ORDER BY id ASC;

→selectの後にid,name,count(name)と並べることで出力を3行で表示する、何行でもカンマの後にコードを書くだけで
抽出することができる、例)SUM(score)やAVG(score)、COUNT(name)などといったように
→fromの後は表示の細かい設定のようなもの
GROUP BYでnameにある被った名前をグループごとに表示させるようにして(下の図のように)
 ORDER BY id ASC にて表示方法を昇順にしている感じ
```
![GROUP BY_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581998/b01255b6-e3f5-83ab-6c04-25687cfcaa40.png)

￼
##内部結合
AテーブルとBテーブルの中に共通である「カラム」をがっちゃんこして表示する
→A：id name class
→B：class price
classが一緒なのでそれを合わせて表示させる

```php:ターミナル
$select * from <テーブルA>  inner join <テーブルB> on <テーブルA.共通のカラム名> = <テーブルB.共通のカラム名>
→$ select * from A inner join B on A.class = B.class

これで表示がでる、classだけがっちゃんこして両方のデータテーブルが表示される

(※Mac mysql DB名：”text” テーブル名：“code ” “class”参照すべし※、classが共通であります)
```

---
ターミナルでたまに空のDB作成して操作するとより覚えることができました。
大きなデータ量のDBは触れたことがないので、コマンドを打つ際も慎重に操作する意識をつけていきたいです。
Chia 純正Pool対応

https://github.com/Chia-Network/chia-blockchain/wiki/Pooling-User-Guide

従来のプロット（OG plot）は新しいポータブルプールプロットには対応していません。
純正プールに参加するためには新たにプロットをする必要があります。
同じPCで引き続きOGとPPプロットは使用できます。


#Step 1: Wallet の右上の表示が”Synced”になっている事　

同じニーモニックキーを複数のPCで使用する場合、それらのPCをいずれも1.2+ のバージョンにアップデートする事。
この問題の解消には２代目のコンピューターのアプリを停止して、
~/.chia/wallet/db
の中のファイルを全て削除する。


#Step 2:XCHの受け取り
プールの開始のために最初にウオレットに少量のChiaを入手する必要があります。
友人に頼んでもらうか https://faucet.chia.net/で、利用するウオレットにもらってください。
受け取り用のアドレスはいくつも作成できます。　そして、それらは同じウオレットに属します。

Step 3:Plot NFTの作成

chia plotnft freate -s local

#2. プールとの接続：

chia plotnft create -s pool -u https://bar.examplepool.org

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167640/cdade328-ee38-c529-173e-43a448657634.png)
プログラムでPetalマップの場所検索機能を使う方法

次のソースコードを使えば、Petalマップで場所検索ができます。

```kotlin
val uriString = "petalmaps://textSearch?text={場所検索のキーワード}"

Uri.parse(uriString)?.let { uri ->
    Intent(Intent.ACTION_VIEW, uri).let { intent ->
        if (intent.resolveActivity(requireContext().packageManager) != null) {
            startActivity(intent)
        }
    }
}
```

# GitHub
Petal Map Sample : https://github.com/Rei2020GitHub/MyPublicProject/tree/master/PetalMapSample
プログラムでPetalマップの近辺情報を検索する方法

Nearby Place Searchはユーザーの位置に基づく場所検索機能です。
次のソースコードのように、キーワードを渡せば検索できます。

```kotlin
val uriString = "petalmaps://nearbySearch?text={Nearby Place Searchのキーワード}"

Uri.parse(uriString)?.let { uri ->
    Intent(Intent.ACTION_VIEW, uri).let { intent ->
        if (intent.resolveActivity(requireContext().packageManager) != null) {
            startActivity(intent)
        }
    }
}
```

# GitHub
Petal Map Sample : https://github.com/Rei2020GitHub/MyPublicProject/tree/master/PetalMapSample
[SQL] SELECT文の基本構文

##はじめに
最近SQLを勉強していて、四大命令と言われるSELECT, UPDATE, DELETE, INSERTを使いこなせるようになりたいと思っています。

それぞれの基本構文を記事にしてアウトプットしていこうと思います。


##SELECT文
SQLのSELECT文はテーブルから指定したデータを取得するために使われます。

```sql:SELECT基本構文
SELECT 列名
  FROM テーブル名
```

基本は上記のような形になります。FROMの後に WHEREを使って修飾することもできます。
修飾する系はまた、記事にまとめます。

1行目のSELECTの後に取り出したいデータの列名（カラム名）を指定します。
そしてFROMの後にどのテーブルから取り出すのか指定します。

私的には、初めてSQL触ったときは、かなり英語っぽいなあと、思いました。

例えば下記のような「家計簿」テーブルがあったとします

| 日付 | 費目 | メモ | 入金額 | 出金額 |
| --- | --- | ---- | ----- | ---- |
| 2021-08-02 | 食費 | パンを購入 | 0 | 300 | 
| 2021-08-03 | 食費 | 晩ご飯材料 | 0 | 1000 |
| 2021-08-08 | 交通費 | 電車代 | 0 | 520 |
| 2021-08-13 | 給料 | 7月分給料 | 250,000 | 0 |
| 2021-08-13 | 食費 | 外食 | 0 | 7000 |

この家計簿テーブルから、費目、入金額、出金額を取り出したい場合、下記のようなSQLになります。

```sql
SELECT 費目, 入金額, 出金額
  FROM 家計簿
```

結果としては下記のように取り出せます。

| 費目 | 入金額 | 出金額 |
| --- | ----- | ---- |
| 食費 | 0 | 300 | 
| 食費 | 0 | 1000 |
| 交通費 | 0 | 520 |
| 給料 | 250,000 | 0 |
| 食費 | 0 | 7000 |


また「AS + 任意のカラム名」を指定すれば、任意のカラム名に変更できます。

```sql
SELECT 費目 AS ITEM, 入金額 AS RECEIVE, 出金額 AS PAY
  FROM 家計簿 AS MONEYBOOK
 WHERE 費目 = '交通費'
```

上記のように書くとASの左にあるカラム名がASの右側のカラム名に置き換えられて表示されます。
結果は下記のようになります。

| ITEM | RECEIVE | PAY |
| --- | ----- | ---- |
| 交通費 | 0 | 520 |


参考: スッキリわかるSQL入門
node.js超入門ノート1(Dockerでの環境構築編)

# 初めに
node.jsの勉強の備忘録のため投稿します。
間違い、アドバイス等ありましたらコメント頂けると幸いです。

# 目標
node.jsの基本を学びExprassを使いWeb開発の基本的な設計を学ぶ。

# 前提条件
自分のPCの環境を汚さずに勉強を進める為、Dockerコンテナ内で作業します。
ローカル環境で行う際はこの記事はスキップしてください。
※VScodeを使います。

# ファイル構造
node-app/
　├ src/
　└ docker-compose.yml 
　└ Dockerfile

# ソースコード
```Dockerfile:Dockerfile
# ベースイメージを指定
FROM node:14.2.0

# node.js の環境変数を定義する
# 本番環境では production
ENV NODE_ENV=development

# 雛形を生成するのに必要なパッケージのインストール
RUN npm install -g express-generator@4.16.1

# ディレクトリを移動する
WORKDIR /src

# ポート3000番を開放する
EXPOSE 3000
```

```yml:docker-compose.yml
version: '3'
services:
  webserver:
    build: node
    image: node-express-dev:1.0
    tty: true
    volumes:
      - ./src:/src
    ports:
      - "3000:3000"
```

# コマンド
```
docker-compose up   #コンテナ立ち上げ
```

Ctrl+Cでサーバーを止めてVScodeのプラグイン、Remote Containerでコンテナ内に入ります。


ひとまず環境構築は終わったので次回からはnode.jsに入っていきます。

https://qiita.com/Glider2355/items/b3e1ee82b96898e67c8f
Chapter 1 - §02 計算・コメント

#　Pythonで計算してみよう
今回から、開発環境を使って作っていきたいと思います。
自分は Pycharm を使いますが、VSCode などご自分が使われているものであればかまいません。
文字列以外は<font color="Red">**すべて**</font>半角小文字です。

##　簡単な計算
`1 + 1 = 2` を計算してみましょう。

```python:1+1
print(1 + 1)
```
を入れて実行すると、

```python:1+1
2
```

と出てきます。
↓ このようになれば成功です。
![6edfec388c1719b3a55ed472207399ca.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1581903/a68078c7-f34f-ff1e-136a-a613dc1c7e0b.png)

掛け算・割り算・累乗（羃乗）などの複雑な計算もできます。

```python
print(6 - 4)
print(2 * 5)
print(10 / 2)
print(2 ** 3) # 累乗（累乗）は**で表せます。
print(50 / (5 ** 2))
print((50 / 5) ** 2)
```
結果は

```python
2
10
5.0
8
2.0
100.0
```
となります。割り算が入っているとき、結果が整数の時は小数第1位まで表されます。

#　変数を使った計算
##　変数とは
変数とは数字や文字などを一時的に保管しておくための箱のようなものです。
変数の大きな役割は、ある値を入れてもその中身を自由に変えられる点です。

##　変数を使った計算
aに2、bに6を入れて足してみましょう。

```python
a = 2
b = 6
sum = a + b
print(sum)
```

答えは

```python
8
```
となります。
変数は、後からでも変更できます。

```python
a = 2
b = 6
sum = a + b
print(sum)

a = 4
sum = a + b
print(sum)
```
この実行結果は、

```python
8
10
```
となります。
どうしてこうなるかというと、

1. a = 2, b = 6
1. a + b = 2 + 6 = 8
1. ここで a = 4 に上書きする。
1. a + b = 4 + 6 = 10

の順にプログラムは実行します。

#　コードの書き方
##　・文の改行
例えば、

```python
print(1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20)
```

と書きたくても、長すぎてみるのが大変になることもありそうです。
こういう時に改行すると分かりやすいと思います。

改行する時は、`\` (バックスラッシュ)を付けます。

```python
print(1 + 2 + 3 + 4 + 5 \
      + 6 + 7 + 8 + 9 + 10 \
      + 11 + 12 + 13 + 14 + 15 \
      + 16 + 17 + 18 + 19 + 20)
```
これでも同じ結果が得られます。

##　コメント
プログラムを書いているときに、途中から何を書いているのか分からなくなる時もあると思います。
そういうときのために、 コメント という機能があります。

使い方：文の初めに `#` を置くだけです。
また、2行を超える場合、`""`を使って囲うことで、複数行のコメントをすることができます。

```python
print(1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10) #これは1~10までの合計を求める。

print(1 + 2 + 3 + 4 + 5 \
      + 6 + 7 + 8 + 9 + 10 \
      + 11 + 12 + 13 + 14 + 15 \
      + 16 + 17 + 18 + 19 + 20)
"""
これは、
1~20までを
足している。
"""
```
ちなみに、`\` の後ろにも、`#` で始まるコメントを書くことができます。

今回はこれで以上です。


　　前回：[Python3の準備](https://qiita.com/confrict/items/e1e5c53dd89b79485799)
　　次回：[文字列・演算子](https://qiita.com/confrict/items/798edb2cac9792caecd3)


間違いなどのご指摘がございましたら、修正依頼を出していただけたら幸いです。

<head>
    <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4386565414956285"
     crossorigin="anonymous"></script>
</head>
Railsにおける生成と巻き戻し（引用：Railsチュートリアル第3章）

##背景と具体例

どんなに気を配っていてもRailsアプリ開発中に何か失敗をすることは往々にしてある。Railsではそのような失敗をカバーする機能がいくつもあるので、まとめておく。

一般的なシナリオの1つとして、生成したコードを元に戻したい場合がある。例えばコントローラを生成した後で、もっといいコントローラ名を思い付き、生成したコードを削除したくなった、あるいは綴りを間違えたために修正したいといった場合がそれに当たる。

Railsはコントローラ以外にも関連ファイルを大量に生成するため、生成されたコントローラファイルを削除するだけでは十分ではない。自動生成されたコードを元に戻すためには、新規作成されたファイルを削除するだけでなく、既存のファイルに挿入されたコードも削除する必要がある。（`rails generate`を実行するとルーティングの`routes.rb`ファイルも自動的に変更される）

このようなとき、「generate」という言葉に因んで、`rails destroy`というコマンドを実行することで元に戻すことが可能。下記はその例。

###コントローラの場合

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

###モデルの場合
次のように`モデル`を自動生成、自動巻き戻しする方法も紹介。

```
$ rails generate model User name:string email:string
$ rails destroy model User
```

（上のコマンドからも分かるように、モデルを`destroy`する場合はモデル名以外の引数は不要。詳細理由はRailsチュートリアル[第６章](https://railstutorial.jp/chapters/modeling_users?version=6.0#cha-modeling_users)参照）

###マイグレーションの場合
また、マイグレーションの変更を元に戻す方法も用意されている。

```
$ rails db:migrate
$ rails db:rollback
```

最初の状態に戻したいときは、`VERSION=0`オプションを使用。

```
 $ rails db:migrate VERSION=0
```

マイグレーションは逐次的に実行され、それぞれのマイグレーションに対してバージョン番号が付与される。したがって、上記の0を別の数字に置き換えることによって、指定したバージョンの状態に戻すことが可能。

開発中に袋小路に迷い込んでしまった場合でも、これらの機能を使えば元の状態を復元できるため焦る必要はない。
未経験からインフラエンジニアになった話！IT担当/ECサイト事業から転職した方法

## はじめに
こんにちは、日本リック エンジニア採用チームです。

今回は日本リックのインフラエンジニアIさんの転職エピソードを紹介します。

Iさんの前職はコールセンター内のIT担当や、フリーランスでのECサイト事業。
その後、技術や資格を持って仕事をしたいと思いインフラエンジニアを目指すことになりました。

今回はそんなIさんが未経験からインフラエンジニアを目指すためにした勉強方法や転職活動のこと、その他インフラエンジニアのあれこれを紹介します。


## 私のプロフィール（30代前半 男子）
### 現在の職種・仕事内容
某大手通信キャリアの情報システム部のネットワークエンジニアとして構築案件に携わっています。
### 前職は?
前職はコールセンター内のIT担当に従事したり、フリーランスでECサイトの事業をしたりしていました。

### インフラエンジニアを目指そうと思った理由
・何か技術や資格を持っての仕事をしたかったからです。
・ネットワークについて、通信が繋がっていく仕組みに触れることが面白そうだったからです。

## 未経験からインフラエンジニアになるためにした勉強
未経験からでも受講料無料でIT企業への転職を支援してくれるスクールをインターネットで見つけたので、そこへ入校しました。
そこでCISCO社のベンダー資格試験の勉強をし、無事合格しました。

## 未経験からインフラエンジニアになるためにした転職活動方法
スクールのご協力をいただきながら転職活動を行いました。
転職活動の流れとしては、まずスクールが私の経歴書を基に、現在求人をしているIT企業へ紹介の連絡をいたします。

その後、返信のあった会社へ私が面接に行くというものです。
全部で5社ほど受けたと思います。

中にはサーバーやセキュリティなどの案件を持つ会社もありましたが、ネットワークに携われそうな会社を選びました。

## 未経験からインフラエンジニアを目指すメリット
・資格を持っていればIT未経験の方でも就職・転職がしやすいと思います。
・手に職がつけられ、努力次第でステップアップができる業界だと思います。

## 未経験からインフラエンジニアになって思う厳しさ・辛さ
会社や職場ごとに知っておかなくてはいけない知識が異なることが多い為、幅広く知識を得る必要があると実感します。

## 目指しているインフラエンジニア像・キャリアパス
ネットワークだけでなく、サーバやセキュリティなど、幅広い知識を持ち合わせると共に、教育やマネジメントも出来るようなエンジニアになりたいと考えております。

## インフラエンジニアとしてスキルアップしていくためにしていること
最近ではネスペ(ネットワークスペシャリスト)やCCNPの資格の勉強をしています。
ネスペR1(技術評論社)を読んだり、[Ping-t](https://ping-t.com/)で問題解いたりしています。

## さいごに：インフラエンジニアを目指している人へのアドバイス
「インフラエンジニア」と一言で言っても、多種多様なので一概には言えないですが、どこの会社に行くことになっても、知識の習得・コミュニケーション能力・ビジネスマナーは必要になってくると思います。

また、例えば学生の人だったら自分がどの方向のエンジニアになりたいのかを仮決めでも良いので、まずは見据えること、それからそれに向けた勉強や資格はどういったものが必要かを調べたりすると良いと思います。

更に付け足しとして、スクールの力を借りるのもいいかなと思います。
[Rails]実務を通しての実装ノウハウ集


# 1. チェック対象値が指定の範囲に含まれるか(数値・時間)

```
(【開始値】..【終了値】).cover?(【チェック対象値】)
```

補足: 
- 【開始値】 <= 【チェック対象の値】 <= 【終了値】になっているかをチェックする
- **数値的な範囲、日時的な範囲のチェック** に使える
- **日時のチェックに使う場合**
  -  【開始値】、【終了値】のいずれかがnilである場合は、**十分に過去の日時 or 未来の日時** として扱われる
  - 類似の実装として``【チェック対象の値】.between?(【開始値】, 【終了値】)``ということもできるが、こちらは **【開始値】、【終了値】どちらかがnilである場合エラーとなってしまう**

# 2. 配列要素の重複チェック
**2.1. どの要素が重複しているかわからなくてもいい場合**
```
 # true:重複あり, false:重複なし
 【配列】.size != 【配列】.uniq.size
```

**2.2. どの要素が重複しているか知りたい場合**
```
# dup_valuesは重複値の配列
dup_values = 【配列】.group_by{ |elem| elem }.reject{ |_k, v| v.one? }.keys

if dup_values.present?
  p "重複値: #{dup_values}"
end
```

参考: 

https://kiyotakakubo.hatenablog.com/entry/20110801/1312196444

# 3. レシーバとメソッドの存在を考慮したnilガードでの実装
**3.1. クラスの場合**

```
# レシーバが存在しない場合nilメソッドが存在しない場合エラー
# (&.はtry!でもOK)
【レシーバ】&.【メソッド】


# レシーバが存在しない場合もしくはキーが存在しない場合nil
# (tryには&.の効果に加え、対象のメソッドが存在しないならばnilを返すという効果がある。
#  &.の場合は対象のメソッドが存在していない場合エラーになる)
【レシーバ】&.try(:【メソッド】)
```

**3.2. ハッシュの場合**

```
# ハッシュのインスタンスが存在しない場合nil、キーが存在しない場合エラー
【ハッシュ】&.fetch(:【キー】)

# ハッシュのインスタンスもしくはキーが存在しない場合nil
# (tryと使おうとすると、&.try(:fetch, :【キー】, nil)になるので、こちらの方がシンプル)
【ハッシュ】&.fetch(:【キー】, nil)
```

# 4. DBに存在するテーブル名を確認
Rails Consoleで実行する想定

**4.1. 一覧表示**  
```
ActiveRecord::Base.connection.execute('show tables').map { |a| p a.first }
```

**4.2. 特定のテーブル名がDBに存在するか**  
```
ActiveRecord::Base.connection.execute('show tables').map { |a| p a.first }.select { |table| table.in?(["【存在確認したいテーブル名1】", ..., "【存在確認したいテーブル名N】"]) }
```

# 5. ループ処理
**5.1. .allのループ**
```
【モデル名】.find_each { |record| 【処理】 } |
```

補足: 
``【モデル名】.all.each { 【処理】 }`` としたくなるが、レコード数多い場合は、それをすべてメモリ上に展開するため、負荷が高くなる。find_eachを使うべきとのこと 

参考: 

https://zenn.dev/nakasan/articles/45e60d2804b1bb

**5.2. 全ての配列要素の組み合わせ(自身同士を除く)のループ**

※他言語でいうところの
```
for(i = 0; i <= 【maxなインデックス値】 - 1; i++) {
  for(j = i + 1; i <= 【maxなインデックス値】; j++) {
    < 【配列】[i], 【配列】[j]を使った処理 >
  }
}
```
という処理。

rubyでは、以下のように書ける。

```
【配列】.combination(2).each { |elem1, elem2| 【elem1, elem2を利用した処理】 } 

# 例えば、【配列】 = [【要素1】,...,【要素4】]だった場合は
# (要素1,要素2),(要素1,要素3),(要素1,要素4),(要素2,要素3),(要素2,要素4),(要素3,要素4) という組み合わせ順で処理が進む。
```

**5.2. 前後の配列要素の組み合わせのループ**

```
【配列】.each_cons(2).each { |elem1, elem2| 【elem1, elem2を利用した処理】 }

# 例えば、【配列】 = [【要素1】,...,【要素4】]だった場合は
# (要素1,要素2),(要素2,要素3),(要素3,要素4)という組み合わせ順で処理が進む。
```