OmniAICreator/Qiita-1.07M huggingface dataset:
C++のstd::unordered_mapのキーにstd::pairを使いたい

# はじめに
Qiitaにいくつか同じ内容の記事があるのは知っていますが, 満足できる内容ではなかったため書きました.

# 実装
ハッシュ値の結合は[こちらを参考にしました(PDF注意).](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3876.pdf)

```cpp
#include <cstdint>
#include <unordered_map>
#include <functional>
#include <algorithm>
#include <string>
#include <iostream>

template<class T>
T hash_combine(T h0, T h1)
{}

template<>
uint32_t hash_combine<uint32_t>(uint32_t h0, uint32_t h1)
{
    return h1 ^ (h0 + 0x9E3779B9U + (h1<<6) + (h1>>2));
}

template<>
uint64_t hash_combine<uint64_t>(uint64_t h0, uint64_t h1)
{
    return h1 ^ (h0 + 0x9E3779B97F4A7C15ULL + (h1<<12) + (h1>>4));
}

struct pair_hash
{
    using key_type = std::pair<uint32_t, std::string>;
    using first_type = key_type::first_type;
    using second_type = key_type::second_type;

    size_t operator()(const key_type& key) const
    {
        size_t h0 = std::hash<first_type>{}(key.first);
        size_t h1 = std::hash<second_type>{}(key.second);
        return hash_combine(h0, h1);
    }
};

int main(void)
{
    using map_type = std::unordered_map<std::pair<uint32_t, std::string>, uint32_t, pair_hash>;
    map_type map = {
        {{0, "0"}, 0},
        {{0, "1"}, 1},
        {{1, "0"}, 2},
        {{1, "1"}, 3},
    };
    for_each(map.begin(), map.end(), [](const map_type::value_type& x){ std::cout << "(" << x.first.first << "," << x.first.second << ")=>" << x.second << std::endl;});
    return 0;
}
```

# まとめ
`std::to_string`で文字列にしてしまうと, 速度の問題以前にロケールの影響を受けます. 実用上ほとんどの場合問題になることはないとはいえ, 問題になるケースを踏んでしまうと発見が困難と予想されるため, 日曜プログラミング以外では使わない方がいいでしょう.
Laravelのデバック方法

## Logを使ったデバック方法
```php
//変数の場合
\Log::debug($debug);

//配列やオブジェクトの場合
\Log::debug(print_r($debug, ture));
```
こうすればLogファイルに出力されます！

useを使うパターンだと、
```php
use Illuminate\Support\Facades\Log;
```
これをしてあげれば`\`が先頭にいらなくなります！

## SQLのクエリログを確認したい時
`\DB::enableQueryLog();`と`\Log::debug(\DB::getQueryLog());`を実行前後に挟んであげると確認できます！
```php
$post = new Post;

\DB::enableQueryLog();
$post = $post->where('title', 'Laravel')->get();
\Log::debug(\DB::getQueryLog());

//ddでも出来ます
\DB::enableQueryLog();
$post = $post->where('title', 'Laravel')->get();
dd(\DB::getQueryLog());
```

デバックする時にはぜひ使ってみてください！
Power Automateによる「検温報告」の仕組み(1)

# 概要
コロナ対策で、毎日の検温を義務付けている会社さんも多いのではないでしょうか。
この記事では、LINE WORKSのBotで検温報告を依頼し、報告された結果をSharePointに保存されたExcelシートに記録するまでを、Microsoft Power Automateで行っています。

Power Automateによる「検温報告」の仕組み(1)
[Power Automateによる「検温報告」の仕組み(2) - 検温報告を求めるフロー](https://qiita.com/mitou/items/06d7e4191408a27483ec)
[Power Automateによる「検温報告」の仕組み(3) - 検温報告を受けるフロー](https://qiita.com/mitou/items/82928c1be99e1dab8b87)
## 質問内容
以下の５つの質問をBotで投稿し、LINE WORKSのQuick Replyによって回答してもらいます。

- Q1：検温結果
- Q2：咳や息苦しさ
- Q3：鼻水や鼻詰まり
- Q4：においや味の感じ方
- Q5：その他自覚症状

上から１つずつ表示され、１つ返答すると次の質問が来るようになっています。
![2022-04-24_17h00_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244231/089b9e5a-d623-406a-a74b-b36badabed5b.png)

## 作成するフロー
以下の２つのフローを作成します。
1. 検温報告を求めるフロー（毎日20時にスケジュール実行）
1. 検温報告を受けるフロー（BotからのCallbackを受け取ったら実行）

「検温報告を求めるフロー」で全員に一斉にメッセージを飛ばし、ユーザーが回答したら「検温報告を受けるフロー」で回答を処理します。

## 回答記録シート
回答はSharePointに保存されたExcelシートに記録されます。
![2022-04-24_17h28_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244231/0c321a4d-e3fb-452f-4958-3dd0bf6f0382.png)

# まとめ
今回は概要のみで、次回以降それぞれのフローを紹介します。
なお、Power AutomateにはLINE WORKSのコネクタは用意されてないので、HTTPアクションで直接APIを叩いています。
そのため、Microsoft 365のプランに含まれているライセンスでは実行できません。
1日１企業紹介　株式会社ALBERT

１日１企業を紹介していく。

やる気がある限りは続ける。

株式会社ALBERT（あるべると、英文社名：ALBERT Inc.）

昔、AI系の会社に転職しようかと考えているときに
エージェントから紹介された会社

2005年より創業

従業員数	163人

従業員の半分以上が修士号を取得している。（博士号取得者と合わせると全体の70%近くまで及ぶ）
この手のAIを主としている会社はAIに特化した人材しか入れなそう。。

そういえばこの前のパーシャを調べているときも思ったけど
この手の入る人間が限られている会社（AI特価人材）の年収って
思ったほどよくなくてかわいそうだなと感じる。（600～700の間が平均年収のイメージ）

事業内容は以下（これだけじゃなんもわからん。。）	
データソリューション事業
AI活用コンサルティング
ビッグデータ分析
AIアルゴリズム構築とシステム開発・運用
AIを用いた独自プロダクトの提供
データサイエンティストの育成支援

いろいろと調べて思ったのは、ここは
パーシャや澪標と違いアルゴリズムライセンスを提供するというよりは
実際に顧客の課題に対して一気通貫でアウトプットまで
分析するといたようなイメージを受けた
（ブレインパッドとか近いかも）

まあ、実際に仕事もしたことないし、知り合いもいないので
どんなビジネススキームなのかは正直いまいちわからなかった。

が、この会社の良いところはコンサルチックな一面がある反面
確かなデータサイエンス力があるように感じた。
（E資格を取って喜んでいる私では足元にも及ばなそうなイメージを受けた）

なのでデータサイエンティストとしての業務を
どこかに特化することなくまんべんなくやっている企業なのかなとも思った。
（言いたいことよ伝われ）


以下参考までに転職する際に必要とされる力っぽいもの
【プログラミング言語】
　Python、SQL（ほぼ全ての案件でいずれかを使用）
　C++、.NET系、JavaScript（全体の10%程度の案件でいずれかを使用）
【フレームワーク】
　Flask、Spark、React/Redux
【実行環境】
　AWS、Azure、GCP
【管理ツール】
　Slack、GitHub、Backlog、Redmine、Wrike、Docker
記憶管理

復習回数1
## 記憶管理
<b><font color = blue>プログラム記憶方式</font>は、プログラムを主記憶に読み込んでおき、CPUが順次読み出しする方式。

### 主記憶の解放
磁気ディスクなどの補助記憶に保存されているプログラムなどは実行時には主記憶上に配置し、実行が終われば主記憶上から消去される

## 実記憶管理
主記憶そのものを効率よく管理するための方式
### 区画方式
主記憶をいくつかの区画に分割し、プログラムに割り当てる方式。
<b><font color = blue>固定区画方式 - あらかじめ決められた大きさの区画に分割する。
可変区画方式 - プログラムが必要とする大きさの区画を割り当てる

### フラグメンテーション
<b>OSが主記憶の領域の獲得と解放を繰り返すと細切れの未使用領域が発生する現象

### メモリコンパクション
細切れの未使用領域を連続した一つの領域にまとめ、再利用可能にするもの。

### スワッピング方式
<b>実行中のプログラムのうち優先度の低いプログラムを一時中断して磁気ディスクに退避(<font color = blue>スワップアウト</font>)し、優先度が高いプログラムを主記憶に配置する(<font color = blue>スワップイン</font>)方式。

### オーバーレイ方式
<b>あらかじめプログラムを同時に実行しない排他的な幾つかの単位（<font color = blue>セグメント</font>）に分割し、実行時に必要な部分だけを主記憶に配置して実行する方式。

### メモリリーク
<b>使用可能な主記憶の容量が現象すること
### ガーベジコレクション
<b>不要になった領域を解放すること

## 仮想記憶方式
<b>プログラムを仮想記憶空間に格納しておき、実行時に必要なプログラムやデータを動的に実記憶に配置し、実行すること。これにより、主記憶の容量よりも大きなメモリを必要とするプログラムも実行できる。

<b>プログラムは仮想記憶空間に格納されている。実行する為に、仮想記憶上の番地(<font color = blue>仮想アドレス</font>)を主記憶上の番地（実アドレス）に変換する必要がある。この変換を、<font color = blue>動的アドレス変換機構(DAT)</font>と呼ばれるハードウェアで行われる。

### ページング方式
<b>主記憶プログラムを固定長（<font color = blue>ページ</font>）に分割し、ページ単位で管理する方式。
具体的に、実行するページが主記憶にない時、<font color = blue>ページフォルト</font>と呼ばれる割込みが発生。そして、不要なページを実記憶から補助記憶に追い出し（<font color = blue>ページアウト</font>）、必要なページを補助記憶から主記憶に配置する(<font color = blue>ページイン</font>)。
### スラッシング
<b><font color = blue>ページフォルト</font>が多発すると処理効率が激落する現象。

### ページ置換えアルゴリズム
ページング方式で、不要ページを決定する方法
<b><font color = blue>FIFO方式</font> - 最も古くから主記憶に存在するページを置き換え
<font color = blue>LRU方式</font> - 最後に参照されてから最も経過時間が長いページを置き換え
<font color = blue>LFU方式</font> - 参照回数が最も少ないページを置き換える</b>

参考文献：イメージ&クレバー方式でよくわかる 栢木先生の基本情報技術者教室
あなたは、光派、音派、距離センサーまとめリンク集





●I2Cじゃ配線距離が足りない


STM32G031 赤外線距離センサー　


https://qiita.com/caa45040/items/cb7c7c38607417bfa5ba


STM32G031 超音波距離センサー


https://qiita.com/caa45040/items/997cc305737a092b1e37


STM32L010 赤外線距離センサー　


https://qiita.com/caa45040/items/56db8e0f0fcefd672738


STM32L010 超音波距離センサー


https://qiita.com/caa45040/items/787bc4ed3d3555ce591e





●I2C超音波距離センサーで移動平均したい


https://qiita.com/caa45040/items/fa1214443fd77570b45f



https://qiita.com/caa45040/items/2c622ec24b126644966d



https://qiita.com/caa45040/items/1f5b59f9121f8b672ad7








●とりあえずI2Cがいい

STM32G031 赤外線距離センサー2

https://qiita.com/caa45040/items/1032f5e8c121da303001

STM32G031 超音波距離センサー2

https://qiita.com/caa45040/items/f5b33feb2de61f5d0a3a

STM32G031 赤外線距離センサー　


https://qiita.com/caa45040/items/105c943b470d230d2cf7


STM32G031 超音波距離センサー


https://qiita.com/caa45040/items/b74c0e26e768fdf750a3


STM32L010 赤外線距離センサー　


https://qiita.com/caa45040/items/a692c7edb6856c96abf0


STM32L010 超音波距離センサー


https://qiita.com/caa45040/items/9dedb7f78715184f0ebc


●とりあえず試したい　ソフトウェアシリアル出力



STM32G031 赤外線距離センサー　


https://qiita.com/caa45040/items/7e0bcf87b07cb1929c3a



STM32G031 超音波距離センサー


https://qiita.com/caa45040/items/b0dd7e3bcdeca7ced638


STM32L010 赤外線距離センサー　


https://qiita.com/caa45040/items/9d403a5cb08cc3901aeb



STM32L010 超音波距離センサー


https://qiita.com/caa45040/items/e998a4e93e63eff1a8a7
Laravelのリファクタリング例

## throw_if
before
```php
if ($boolean) {
    throw new CustomException();
}
```
after
```php
throw_if ($boolean, CustomException::class);
```

## abort_if
before
```php
if ($boolean) {
    abort(403);
}
```
after
```php
abort_if ($boolean, 403);
```

## @continue 
```php
@foreach ($results as $result)
    @if ($result->type === 1)
        @continue 
    @endif
    ...
@endforeach
```
after
```php
@foreach ($results as $result)
    @continue  ($result->type === 1)
    ...
@endforeach
```
## @break
```php
@foreach ($results as $result)
    @if ($result->status === 1)
        @break 
    @endif
    ...
@endforeach
```
after
```php
@foreach ($results as $result)
    @break  ($result->status === 1)
    ...
@endforeach
```
## includeWhen
```php
if ($boolean) {
    include('view.name')
}
```
after
```php
includeWhen($boolean, 'view.name');
```
BLEUを計算できるページを作ってみた

機械翻訳等で用いられる **BLEUスコア** をフロントエンドで計算するページを作ってみました。

https://s2terminal.github.io/nlp-auto-eval-react/

BLEUスコアは本来コーパスに対して適用するものであり、実際の場面で単体の文に対して計算をするのはあまり意味が無いと思いますが、これは理解を助けるためのものです。自分でちょっと仕組みを確認したいと思ったので作ってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50391/5679519d-de98-df54-a3a3-add5eb30b9a2.png)

## BLEUとは
以下のような計算式で表されるものです。

$$
\\text{BLEU}=\text{BP}(\prod_{i=1}^{N}precision_i)^{1/N}
$$

$$
\text{BP}=min(1, e^{1-\frac{reference-length}{hypothesis-length}})
$$

計算式の解説は下記のようなページを参照してください。

- [モデルの評価  \|  AutoML Translation のドキュメント  \|  Google Cloud](https://cloud.google.com/translate/automl/docs/evaluate?hl=ja#bleu)
- [テキスト生成の自動評価指標について \- Qiita](https://qiita.com/amtsyh/items/a926b79b90dfabe895e9)
- [Smoothly BLEU \- Qiita](https://qiita.com/taxio/items/ccf1ddba2214b759e636#fn5)

概要だけを示すと、文章をn-gramで区切った時にどれだけ一致するか個数を計算したものです。0～1の値をとり、大きいほど一致している語が多いということになります。正解データとして用意した参照文と、機械的に生成した生成文とを比べて、どれくらいの語が一致しているかを数えて、一致している語が多いほど生成したものの精度が良い、とする指標です。

たとえば「This is a pen .」「This is an apple .」は、1-gramでは5件中3件一致、2-gramでは4件中1件一致している、といった具合です。

token1|token2|token3|token4|token5
--|--|--|--|--
This|is|a|pen|.
This|is|an|apple|.

指標|値
--|--
Precision 1|3/5
Precision 2|1/4

この「n-gramがいくつ一致しているか」というのを見れるようにしたのが、今回作ったものです。

BLEUスコアは機械翻訳の評価指標としてよく用いられるものです。仕組みとしては大雑把な指標になりますが人手での評価と一定の相関があることが知られていること、比較的容易に利用できることなどから、よく用いられているようです。
その性質上、機械翻訳でなくても正解となる文章が用意できる生成系タスクにおいて自動評価指標として用いられることもあります。

## 使用技術
[CodeSandboxでざっくり動くものを作って検証した](https://codesandbox.io/s/bleu-score-690dnt?file=/src/App.tsx)あと、React+Next.js+TypeScriptで作ってGitHub Pagesに載せました。スタイルは[Water\.css](https://watercss.kognise.dev/)を当てました。

入力に対して、半角スペースで区切られた範囲を1tokenとする処理を行っています。入力が英文なら特に問題は無いと思いますが、日本語を入力する場合は予め形態素解析等を行って半角スペースで区切られた文章を入力する必要があります。

実際のソースコードは下記です。

https://github.com/s2terminal/nlp-auto-eval-react

開発時はJestでテストをしています。Pythonの[NLTK](https://www.nltk.org/)の結果と突き合わせてテストをしました。
NLTKにはSmoothingの処理などもありますが、それらは使わない初期設定の結果を使っています。

```python
import nltk
from nltk import word_tokenize
from nltk import bleu_score

nltk.download('punkt')

hyp = word_tokenize("A NASA rover is fighting a massive storm on Mars .")
ref = word_tokenize("The NASA Opportunity rover is battling a massive dust storm on Mars .")

bleu_score.sentence_bleu([ref], hyp)
#=> 0.27221791225495623
```

## 参考文献
- [自然言語処理〔改訂版〕 (放送大学教材) | 黒橋 禎夫](https://www.amazon.co.jp/dp/4595319584/357-7323402-7938532)
- [機械学習・深層学習による自然言語処理入門 (Compass Booksシリーズ) | 中山 光樹](https://book.mynavi.jp/ec/products/detail/id=113274)
動的型付け言語Pythonの型合わせの処理速度

# はじめに
Pythonを使っているとint型とfloat型の計算などを何気無く書いていることがよくある。例えば
```Python:Python
a = 1
b = 1.5
c = a + b
print(type(a))  # <class 'int'>
print(type(b))  # <class 'float'>
print(type(c))  # <class 'float'>
```
は、問題なく実行できる。これはPythonが``c``を計算するときに、自動で``a``をfloat型として扱ってくれているからである。

このように、Pythonのような**変数などのデータ型の宣言を必要としない言語**は動的型付け言語と呼ばれる。一方、Javaのような変数などのデータ型の宣言を必要とする言語は、静的型付け言語と呼ばれ、これらの言語的違いや歴史については、

https://qiita.com/tonluqclml/items/24f5506f8fbb49bf3663

https://webpia.jp/dynamic-static/

を参照されたい。

本記事では、上のコードのように``a``を**自動**でfloat型として扱い``c``を計算するときの、この**自動**にかかる処理速度を計測する。

# 処理速度の比較方法
それぞれ4種類の方法についてGoogle Colabを用いて1億回処理したときの平均処理時間を比較する。
実装したGoogle Colabのコードは[こちら](https://colab.research.google.com/drive/1yqXamwmFiJeCMpOgFqVnBZhKbF8wLZfJ?usp=sharing)にあります。

```Python:処理1（aはint型で足す）
%%timeit -r 1 -n 100000000
a = 1
b = 1.5
c = a + b
```

```Python:処理2（aはfloat型で型を揃えて足す）
%%timeit -r 1 -n 100000000
a = 1.
b = 1.5
c = a + b
```

```Python:処理3（aは組み込み関数でfloat型にして足す）
%%timeit -r 1 -n 100000000
a = float(1)
b = 1.5
c = a + b
```
```Python:処理4（aはcの計算時に組み込み関数でfloat型にして足す）
%%timeit -r 1 -n 100000000
a = 1
b = 1.5
c = float(a) + b
```

# 結果
|処理名            |1億回の平均処理時間 (ns per loop)|
|:-----------------|------------------:|
|処理1（aはint型で足す）|83|
|処理2（aはfloat型で型を揃えて足す）|**57**|
|処理3（aは組み込み関数でfloat型にして足す）|142|
|処理4（aはcの計算時に組み込み関数でfloat型にして足す）|146|

やはり、``a = 1``ではなく``a = 1.``のようにfloat型で変数を書いた処理2が一番高速な結果となった。
面白いことに、処理3、4のように組み込み関数でfloat型にするのは時間がかかり、結果的に処理1のように自動で型合わせした方が速い結果となった。

# まとめ
このように、型を適切に指定することで処理速度向上につながる。
また、自動で型を合わせてくれる機能は便利ではあるが、このような処理にも**時間（負担）がかかる**ので、型を意識したコーディングはPythonにおいても重要なのかもしれない。

# 参考資料
https://qiita.com/tonluqclml/items/24f5506f8fbb49bf3663

https://webpia.jp/dynamic-static/
[ARKit] ARWorldMapとは

## ARWorldMap
AR1.0までAR体験ができてもそれを永続化することができなかった。
こういった弱点を克服するためにARWorldMapは導入され、データの永続化と共有ができるようになった。

具体的にはARSessionでトラッキングした実世界の情報とARアンカーの情報が入っている。

実際なプロパティ
```swift
// ワールドマップで検知されたARアンカーたち
var anchors: [ARAnchor] { get set }

// ワールドマップの特徴点
var rawFeaturePoints: ARPointCloud { get }

// ワールドマップの空間のサイズ
var extent: simd_float3 { get }

var center: simd_float3
// ワールドマップの中心点
```

これらのデータを使用してARSessionを復元する。

#### ARWorldMapを取得する
ARSessionの下記メソッドを使用して非同期に取得する。

 ```swift
func getCurrentWorldMap(completionHandler: @escaping (ARWorldMap?, Error?)
-> Void)
```

実際に取得してみる
```swift
let session = ARSession()
session.getCurrentWorldMap { worldMap, error in
       guard let worldMap = worldMap else { fatalError() }
}
```

実際に保存するにはNSKeyedArchiverクラスからarchivedDataメソッドでData型に変換し、
data.write(to: url)を呼び出す。

```swift
func writeWorldMap(_ worldMap: ARWorldMap, to url: URL) throws {

    let data = try NSKeyedArchiver.archivedData(withRootObject: worldMap, requiringSecureCoding: true)
    try data.write(to: url)
}
```

実際に ARWorldMapを取り出すためにはNSKeyedArchiverからunarchviedObjectを呼び出す。

```swift
func loadWorldMap(from url: URL) throws -> ARWorldMap {
    let mapData = try Data(contentsOf: url)
    guard let worldMap = try NSKeyedUnarchiver.unarchivedObject(ofClass: ARWorldMap.self, from: mapData)
        else { throw ARError(.invalidWorldMap) }
    return worldMap
}
```

### ワールドマップからセッションを復元してみる
ARWorldTrackingConfigurationには下記のプロパティが存在する

```swift
var initialWorldMap: ARWorldMap? { get set }
```

ここに Data型から復元したARWorldMapオブジェクトをセットしてrunすることでできる。

```swift
let configuration = ARWorldTrackingConfiguration()
configuration.initialWorldMap = worldMap
sceneView.session.run(configuration)
```

これを応用すれば保存したDataを何処かに保存しといて、他の誰かと共有することができる。

### ワールドマップをゲットできるタイミング

ARFrameに worldMappingStatusという ARFrame.WorldMap
pingStatus型のプロパティが存在し、ワールドマップを取得するのに良いタイミングかどうかを判断する

```swift
var worldMappingStatus: ARFrame.WorldMappingStatus { get }
```

ARFrame.WorldMappingStatusは enum 型で、次の caseが定義されています。

```swift
enum WorldMappingStatus {
 case notAvailable
 //ワールドマッピングができない
 case limited 
// ワールドマッピング可能だが、機能制限が出てきてしまう
 case extending 
// ユーザーの操作によってマッピングが拡大中
 case　mapped 
//見えているエリアのマッピング完了した状態
}
```

他のステータスではユーザーに行動の指針を示す、といったことが可能になります。
オブジェクトが停止しなければフレームごとに呼ばれる。
そこで保存ボタンなどを

```swift
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
// オブジェクトが更新されるたびにARFrameオブジェクトを取り出す。
   guard let frame = sceneView.session.currentFrame else { return }
   DispatchQueue.main.async {
  // ワールドマッピングステータスが mapped のときだけ保存ボタンを有効にする
  if frame.worldMappingStatus == .mapped {
    ここで保存を実行するボタンをアクティブとかにしてみる。
  }
 }
}
```

参考

https://developer.apple.com/documentation/arkit/arworldmap
各言語のORMあれこれメモ

### Ruby
  - ActiveRecordほぼ一択
  - MySQLとPostgresとSQLiteを横断して使えるし、実際にきれいに横断して使われてる

### PHP
- mysql_ 関数を直でいじる長い歴史
- PDOを直で触る長い歴史
- Eloquent ORM (Laravel同梱のORM)
- CakePHP ORM
- Zend DB

### Python
  - Django ORM （Webフレームワークではこっちがメジャー）
  - SQLAlchemy （ORM単品ではこっちがメジャー）
  - そもそもデータ分析では一旦DataFrameにして列指向で集計すると行単位で操作するRDBの世界とは離れる

### Java
  - JDBC直書きの長い歴史（& Oracle依存のSQL使いまくり）
  - Spring JDBC
  - JPA
  - S2JDBC(Seasar2のORM)

大事なポイントは、「言うほど一つのプロジェクトでDBMSを変えることなどない」というところ。

PHPはMySQLべったりなコードは多い。Java（というか業務系の現場）ではOracleべったりなコードは多い。
当然のことながらちょっとしたラッパーは作るから「独自ORM」というのが正確か。
べったりというと「移植性が悪い」というマイナスポイントはあるが、DBの性能を最大限に活かそうとするとそうなる。

例えば、MySQL専用で書くなら以下の機能が便利。
- limitで絞ってもヒットした全体の件数を返す機能（FOUND_ROWS）
- SQLでoffsetしなくてもseekで移動する機能

Oracleでは以下の機能が便利だったりする
- ROWIDを使った最速のキーダイレクトなアクセス
- シーケンスを使った採番
- NULLと空文字列を同一扱いできちゃう

DBMSが持つ機能をフルに活かす（もしくは意識せず使っちゃう）ことで、DBMSの依存ってのは起こりうる。

逆にRailsがかなり特殊。

- お勉強フェーズではSQLite
- 本家はPostgres
- 実際にはMySQLに繋げてる人もかなり多い

と見事にDBMSに依存せずに書いてる。

その代わりDMBS側でやってほしいことをフレームワーク側で肩代わりしてる。

- 絶対に主キーは必要（ROWIDに依存したくないから）
- デフォルトでは主キーはオートインクリメント
- デフォルトのページングはoffsetではなくidのカーソルベースでのページング
- そんな制約もあって複合主キーは認めない
- lock_versionというカラムを作っておくと勝手に楽観的ロックしてくれる

DBSMなんてただのデータ置き場だというくらいの扱い。

一方で「ORMは所詮はSQLビルダー。要らない！」という思想もある。
ORMが吐くSQLが「想像できない」からパフォーマンスが悪いSQLが吐かれていても分かりにくい。

ActiveRecordはログ出力機能ONにしておけば、すべてのSQLをきれいに表示してくれるので「想像しにくい」のは心外なのだが、開発スタイルとしてログを見る習慣が少ない人もいるのも事実。実行せずともソースだけをみるだけでどんなSQLが流れるかを想像できるほうがいいという理屈もわかる。
よくわからないリモートやらローカルやら追跡やらブランチについて

参考にしたサイト
- [１【Gitをしっかり理解】追跡ブランチとリモートブランチは別物！](https://shinmedia20.com/git-remote-tracking)
- [２リモート追跡ブランチ・追跡ブランチ・リモートブランチの違い](https://chaingng.github.io/post/git_branch/)
- [３Git のブランチ機能 - リモートブランチ](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81)

## はじめに

今回はなんだか分かりにくいブランチの名前と種類についてメモ（浅学なので説明とは言わない）します

あと、参考にしたサイトの１番目は先に見ることをお勧めします

改修と画像も今後載せていきます

## ブランチは主に３つある
- リモートブランチ
- リモート追跡ブランチ
- 追跡ブランチ

## ブランチが存在する場所は２ヶ所

- リモート（ネットワーク上、オンライン上）
  - リモートリポジトリともいう
- ローカル（自分のPC上）
  - ローカルリポジトリともいう

## 組み合わせると
- リモート（オンライン上）
  - リモートブランチ
    - origin/ブランチ名
- ローカル（自分のPC上）
  - リモート追跡ブランチ
    - remotes/origin/ブランチ名ってついている所
  - 追跡ブランチ
    - ブランチ名のみ

※ ここでまたややこしいのがoriginという部分
- リモートの場所のこと
- originはデフォルトでつく名前
- 当然変更もできるけど基本そのまま行くのでコマンドの説明でもoriginが当たり前に出てきてしまう弊害がある（リモートリポジトリの場所を指定しているシーンで）


> [リポジトリとは？：保管場所](https://wa3.i-3-i.info/word15664.html)

> [ローカルリポジトリとリモートリポジトリ](https://techacademy.jp/magazine/6235)

ブランチが３つあるのに対して
存在する場所は２ヶ所

## 個人的意訳をすると
- リモートブランチ
  - GitHub上にある
  - オンライン上にある
  - GitHub上でブランチを切るとここが増える
  - git branch -aで表示されない
  - git branch -vvで表示される
  - ここのデフォルトブランチがだいたいは最新の開発が反映されているブランチ
    - devやdevelopと付けがち
    - origin/HEADとつくところ
  - GitHubでリポジトリを作成するとmainブランチが初期設定ではデフォルトになる
    - （安定したプロジェクトを置くためにここからデフォルトブランチをdevelopにするととも多い）
- リモート追跡ブランチ
  - 個人的に理解をややこしくしてる元凶のブランチと思う
  - 超重要：ここをリモートブランチと書いている記事が非常に多い(そして間違ってるわけではないと思われるので厄介)
  - リモートブランチをcheckoutすると自動で作成される
  - ローカルの状態を参照していることもあればリモートの状態を参照していることもある
  - ローカルにある（大事）
  - リモートブランチとローカルブランチの橋渡しをしている
  - ここで作業することはできない
  - git branch -aで表示される
  - git branch -vvで表示されない
  - 追跡ブランチからpushする時にここを通ってリモートブランチに反映される
- 追跡ブランチ
  - 普段自分がPCで作業するブランチ
  - 一般的にはローカルブランチって言われるところ
  - git branch -aで表示される
  - git branch -vvで表示される
  - ローカルでリモートブランチに紐付けないでcheckoutした時はリモート追跡ブランチもリモートブランチも作成されない

徐々に増やしていきます
また、間違っていれば指摘いただけると幸いです
ジョブ管理とタスク管理

復習回数1
## ジョブとタスク
### ジョブ
<b>利用者から見た仕事の単位。一連のプログラム群の事
### タスク
<b>OSから見た仕事の単位。</b>


OSはジョブやタスクを効率よく管理する機能がある

## ジョブ管理
<b>ジョブのスケジューリングがあり、ジョブの入力と出力を管理する。
投入されたジョブは<font color = blue>入力待ち行列</font>に登録される。処理された後は<font color = blue>出力待ち行列</font>に登録される。
上記の行列はキュー構造である。

## タスク管理
<b>タスクの生成から消滅までを、<font color = blue>実行可能状態・実行状態・待ち状態</font>で管理する。

実行可能状態 - CPUの使用権が割り当てられるのを待っている状態。この状態のタスクが複数存在する場合は待ち行列を形成。
実行状態 - CPUの使用権が割り当てられ、実行している状態。
待ち状態 - 他の入出力処理が完了するのを待っている状態。

### タスクのスケジューリング
<b>どのCPUに使用権を割り当てるかを決める方式
<font color = blue>到着順方式</font> - 実行可能待ち行列の先頭から順に
<font color = blue>処理時間順方式</font> - 処理予定時間が最も短いタスクから順
<font color = blue>優先度順方式</font> - 優先度の高いタスクから順に
<font color = blue>ラウンドロビン方式</font> - 実行可能待ち行列の先頭から順に、割り当てる。
一定時間（<font color = blue>タイムスライス</font>）経過した場合実行を中断し、実行可能待ち行列の最後尾に加える。

### マルチタスク
<b>複数のタスクにCPUの処理時間を順番に割り当てることで、タスクが同時に実行されているように見せる方式<font color = blue>マルチプログラミング</font>


I/O処理を行なっている間CPUは利用されていない。このような時間を<b><font color = blue>遊休時間（アイドルタイム）</font></b>

## タスクの実行方式
### ノンプリエンプティブ方式
<b>OSがCPUを管理プログラムに任せる
### プリエンプティブ方式
<b>OSがCPUを管理する

## 並行処理
### マルチスレッド
<b>一つのプレグラムの中で並行処理が可能な部分を、複数の処理単位(<font color = blue>スレッド</font>)に分解して、それらを並行して処理するOSの機能

## 割り込み処理
<b><font color = blue>割込み</font>は、実行中のプログラムを一時中断し、制御プログラムに制御を移して、必要とする別の処理に切り替えること。
### 割込みの種類
#### -内部割込み
<b>実行中のプログラムが原因

<b>・内部割込みの種類
<font color = blue>-プログラム割込み
-SVC割込み</font>

#### -外部割込み
<b>実行中のプログラム以外が原因</b>
<b>・外部割込みの種類
<font color = blue>-機械チェック割込み
-入出力割込み
-タイマ割込み
-コンソール割込み
</font>


参考文献：イメージ&クレバー方式でよくわかる 栢木先生の基本情報技術者教室
Google Apps Script(GAS)で翻訳API作成【Google Translate】

```javascript
function doGet(e) {
  const text = LanguageApp.translate(e.parameter.text, e.parameter.src, e.parameter.dest || 'ja')
  return ContentService.createTextOutput(text)
}
```

[新しいプロジェクト](https://script.google.com/home/projects/create)を作成し、URLを作成することで[AdvancedなAPI](https://cloud.google.com/translate/docs/editions?hl=ja)を作成できます。
[https://script.google.com/macros/s/AKfycbxEpEZ3PNmT8fRE4ZnksmNV1Q5Hgs3QCJ7lWC4LUcWKKhScotN9OPxVDbMKdCLWU8NT/exec?text=This is a cat.](https://script.google.com/macros/s/AKfycbxEpEZ3PNmT8fRE4ZnksmNV1Q5Hgs3QCJ7lWC4LUcWKKhScotN9OPxVDbMKdCLWU8NT/exec?text=This%20is%20a%20cat.)



<details><summary>curl</summary>

```bash
curl -L https://script.google.com/macros/s/AKfycbxEpEZ3PNmT8fRE4ZnksmNV1Q5Hgs3QCJ7lWC4LUcWKKhScotN9OPxVDbMKdCLWU8NT/exec?text=apple
```
</details>

<details><summary>Python</summary>

```python
import requests

print(requests.get('https://script.google.com/macros/s/AKfycbxEpEZ3PNmT8fRE4ZnksmNV1Q5Hgs3QCJ7lWC4LUcWKKhScotN9OPxVDbMKdCLWU8NT/exec', {'text': 'This is a cat.'}).text)
```
</details>

# URLを作成する
## `新しいデプロイ`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/1cca7300-c3ad-4d6b-3387-46925890a6c1.png)
## `ウェブアプリ`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/c080bb55-17e8-61eb-1201-7b54da2766fd.png)
## `全員`を選択し、デプロイ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/ef3d073c-7b56-1b03-df8d-da95e586da16.png)
## URLをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208363/bada0459-5a63-1ab7-aa83-0f4071311b30.png)

# デモ
<p class="codepen" data-height="256" data-default-tab="result" data-slug-hash="NWXVxXe" data-user="04" style="height: 256px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/04/pen/NWXVxXe">
  Google 翻訳</a> by John Doe (<a href="https://codepen.io/04">@04</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 参考

https://qiita.com/a_eau_/items/92430bc9d749fb9c330a
WindowsでNodeのバージョンを切り替えて実行できるnvmをインストール

# はじめに
https://fumidzuki.com/knowledge/4533/#toc2

の方がまとめていただいている内容を端折っているだけのもの

# 環境
- Windows10 (21H2)

# 手順
1. インストーラーのダウンロード＆実行

    https://github.com/coreybutler/nvm-windows/releases

    から、nvm-setup.zip をダウンロード＆解凍して実行

1. Nodeとしてインストールできるバージョンの一覧取得＆インストール
※`コマンドは管理者実行で実行しないとＮＧ`

- 使用可能バージョンの一覧取得
```shell
nvm list available
# availableを抜くと、インストールしているバージョンと、現在設定しているバージョンが閲覧可能
```

- 指定バージョンのインストール
```shell
nvm install [バージョン]
# nvm install 16.14.2 とか、上記で表示されたバージョンを指定
```

- 使うバージョンの指定
```shell
nvm use [使うバージョン]
# nvm use 16.14.2 とか実行
# 複数の場合は毎回指定して切り替える
```

- Nodeの認識確認
```shell
node -v
# v16.14.2 とか表示される
```

# さいごに
安定稼働で動いてほしいけど、どうなんでしょうかね、、
シェルスクリプトで２つのCSVファイルを１つにする処理の備忘録

シェルスクリプトで２つのCSVファイルを１つにする処理の備忘録

以下の２つのファイルがあるとする。

```csvs:test1.csv
key1,str11
key2,str12
key3,str13
```

```csvs:test2.csv
key1,str21
key2,str22
key3,str23
```

以下のスクリプトにより１つにする

```sh:test.sh
#!/bin/bash

TEST1="test1.csv"
TEST2="test2.csv"
OUT="out.csv"
TMP_LIST=()
KEY_LIST=()

# keyを取得する
STR=`cat test1.csv | cut -d, -f1`
TMP_LIST+=(${STR})
STR=`cat test2.csv | cut -d, -f1`
TMP_LIST+=(${STR})

# 重複を削除する
i=0
while read -r x; do
  KEY_LIST[i++]="$x"
done < <(printf '%s\n' "${TMP_LIST[@]}" | sort -u)

#echo ${KEY_LIST[@]}
echo -n "" > ${OUT}
for key in ${KEY_LIST[@]}
do
    KEY1=`grep ${key} ${TEST1} | cut -d, -f2`
    KEY2=`grep ${key} ${TEST2} | cut -d, -f2`
    echo "${key},${KEY1},${KEY2}" >> ${OUT}
done

echo "result ---"
cat ${OUT}
```

実行結果

```shell
$ bash test.sh
result ---
key1,str11,str21
key2,str12,str22
key3,str13,str23
```
[planetscale][Next.js] serverless-mysqlを通してplanetscale接続


今までNext.jsのapi内で、
「serverless-mysql→レンタルVPS内のDBサーバーと接続」
としていたのですが、
昨今流行りの「planetscale」を使ってみたくなりました。

https://planetscale.com/

https://www.npmjs.com/package/serverless-mysql

接続にあたって今までと方法が少し異なっていて、数時間悩んだので、
誰かの為に書き残しておきます。

↓今までの接続方法
```
const db = mysql({
    config: {
        host: process.env.MYSQL_HOST,
        database: process.env.MYSQL_DATABASE,
        user: process.env.MYSQL_USER,
        password: process.env.MYSQL_PASSWORD,
    },
});
```

planetscaleのDB内のconnectというところを押して、以下のような情報を確認します。

```
database: ************
username: ************
host: ************
password: ************
```

「まぁここ書き換えただけで上手くいくだろう」と高を括っていましたが、
うまくいきませんでした。


理由がよく分からなかったので、「DBクライアントからなら繋がるのか？？」と思い、
DBeaverから試してみますが、こちらも繋がらず。
ただ、エラーメッセージとして、
```
server does not allow insecure connections, client must use SSL/TLS
```
こんなメッセージが出ました。
ということで、DBeaverのSSLタブの設定等をごちゃごちゃ触っていたのですが、結論としては、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2206754/bdfac096-36b8-af27-5b7d-a8e3f940cd62.png)
ここのsslModeという項目を許可してあげると接続できました。

ここから着想を得まして、serverless-mysql側も、

```
const db = mysql({
    config: {
        host: process.env.PS_HOST,
        database: process.env.PS_DATABASE,
        user: process.env.PS_USER,
        password: process.env.PS_PASSWORD,
        ssl: true,
    },
});
```
「ssl: true」としてあげることで上手く接続することができました。

通信系の知識強い人はこういうの迷わないんですかね。。
つよくなりたい。。！
シェルスクリプトで配列の重複を消す際の備忘録

シェルスクリプトで配列の重複を消す際の備忘録です

以下のように`sort -u(--unique	)`を使用すればOK

```test.sh
array=(foo bar foo baz bar foo)
array2=()
i=0
while read -r x; do
  array2[i++]="$x"
done < <(printf '%s\n' "${array[@]}" | sort -u)

echo "array --->"
echo "${array[@]}"
echo "array2 --->"
echo "${array2[@]}"
```

実行結果

```sh
$ bash test.sh
array --->
foo bar foo baz bar foo
array2 --->
bar baz foo
```

# 参考

https://ja.stackoverflow.com/questions/32597/シェルスクリプトで重複するデータのない配列を作る方法
新規アプリケーション作成からdeviseを導入するまで

めちゃくちゃ基礎ですけど、今カリキュラム見ながら一個一個やってるので纏めときます。（今後も使うので）

# ターミナルからrails newでアプリを新規作成
```ruby
% cd ~/projects
% rails _6.0.0_ new "アプリ名" -d mysql
% cd "アプリ名"
```

# データベースを作成

config/database.yml
```ruby
default: &default
  adapter: mysql2
  encoding: utf8 #mb4を消す！
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock
```

ターミナル
```
% rails db:create
```

ここで　rails sしてサーバー再起動しておく

↓以下deviseの導入なり

Gemfile
```ruby
gem 'devise'
```
ターミナル
```
% bundle install
```

rails sでサーバー再起動。

```
% rails g devise:install
% rails g devise user
```

マイグレーションファイル編集

db/migrate/20XXXXXXXXX_devise_create_users.rb
```ruby
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
 def change
   create_table :users do |t|
     ## Database authenticatable
     t.string :email,              null: false, default: ""
     t.string :encrypted_password, null: false, default: ""
#→ここに追加したいカラムを書く
     ## 以下略
```

ターミナル
```
% rails db:migrate
```

rails sでサーバー再起動

# deviseのビューファイルを作成

ターミナル
```
% rails g devise:views
```

あとは細かいビューの編集してくだせぇ。


# まとめ。

脳死で上のやつかコピペしたら、ログイン画面とユーザー登録ができる。
rails最高か？devise優秀か？

あらした。
openmimを使ったMMDetectionのconfigファイルとcheckpointsファイルのダウンロード方法

# はじめに
MMDetectionでのcheckpointをdownloadするのにwgetを使っていたのですが、`mim`コマンドを使うことで楽に持ってくることができたので共有します。(documentに書いてありますが。。。)

# 筆者環境
* WSL2 on windows11
* Ubuntu 20.24
* docker
* pytorch1.11.0+cu113
* MMDetection2.23.0
* cuda11.3
* GCC7.3

# wgetを用いたダウンロード方法
MMDetectionのチュートリアルでは以下のようにしています。
``` bash
mkdir checkpoints
wget -c https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth \
     -O checkpoints/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth
```

上記のコマンドで`mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py`のcheckpointをダウンロードできます。
しかし、この場合configはデフォルトの`mmdetection/config`にあり、探すのが少し手間です。

# mimを用いたダウンロード方法
## mim とは
`mim(openmim)`はOpenMMLab関連のファイルのダウンロードやインストールを行ってくれるライブラリです。
MMDetectionのインストール時に使用したかもしれません。
これを用いることでcheckpointとconfigをまとめてダウンロードすることができます。
``` bash
pip install openmim #openmimをインストール
mim download mmdet --config mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco --dest ./checkpoints/
```
### 引数説明
* --config：所望のモデル
* --dest：configとcheckpointの保存先

上記のコマンドにより`./checkpoints`に`mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco.py`のconfigとcheckpointsファイルがダウンロードされます。
また、`wget`の場合と違いgithubのリンクを探す手間も省けます。

# まとめ
`mim`を用いて楽にcheckpointsをダウンロードする手法についてまとめました。
MMDetectionに関する日本語記事は少ないので、今後も少しずつ書いていこうと思います。
Swift用Twitterライブラリを作った

# はじめに
[Twifter](https://github.com/SNQ-2001/Twifter)のドキュメント的な記事になります。

# Twifterとは
![Twifter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/0eaf2e6c-84bc-0743-ff92-b212d5f37e21.png)
普通はTwitterAPIを操作しようとすると開発者アカウントが必要になってきます。
しかし、Twifterは開発者アカウントなしでTwitterAPIを操作することができます。

なぜこんな事ができるのか

Twitterには[twitter.com/explore](https://twitter.com/explore)というログインなしでツイートを検索できるページがあります。
こちらではアクセスしたユーザーに対してゲストトークンを付与しています。
このゲストトークンを使用することで非ログイン状態でもTwitterAPIを使用する事が可能になります。

ただ欠点もあります。
当たり前なのですが、ゲスト(非ログイン状態)としてのAPIなので読み取り専用になります。
「ツイートをする、DMを送信する」といった書き込みに関するAPIは使用できません。

# 必要要件
||iOS|macOS|tvOS|watchOS|
|-|-|-|-|-|
|最小OS|iOS15|macOS10.10|tvOS9|watchOS2|

# 使い方
人気のありそうなAPIからいくつか抜粋して紹介します
### ユーザー情報を取得する
```Swift
Task {
    let user_info = try await TwifterClient().user_show(screen_name: "_SNQ")
    print(user_info)
}
```
### ツイート情報を取得する
```Swift
Task {
    let tweet_info = try await TwifterClient().statuses_show(id: 1488101267243429889)
    print(tweet_info)
}
```
### ユーザーのツイートを複数取得する
```Swift
Task {
    let user_timeline = try await TwifterClient().statuses_user_timeline(screen_name: "_SNQ")
    print(user_timeline)
}
```
### ツイートを検索する
```Swift
Task {
    let search_tweets = try await TwifterClient().search_tweets(q: "Swift")
    print(search_tweets)
}
```

こんな感じです

# おわり
https://github.com/SNQ-2001/Twifter

現在はTwitterAPI v1.1のみ対応してます。
今後、TwitterAPI v2やプライベートAPIにも対応する予定です。

質問があれば[@_SNQ](https://twitter.com/_SNQ)にDMください！
OAuthについて

# OAuthについて

ローカルサーバー立ち上げる時のhttp://localhost:3000/
の代わりにhttps://145d-126-3-4-68.ngrok.io
で世界中に公開し、みんな見れるようにしている。

OAuthはアプリではなく、自分で認証することができる。
以下のリダイレクトURLは、「そのURLは認証しているから使える」という意味。
![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248903/a38ffd28-96a2-538f-711b-d37b20567374.png)
【Nuxt】spec.tsでVueのMethod内の関数にアクセスする

# 初めに

通常、vueファイルのmethod内の関数を直接実行する場合は
mountしたVueInstanceに`vm`でアクセスしてさらに、関数名で参照します
``` js: hoge.spec.js
const wrapper =  mount(Index);

// method内のhoge関数にアクセス
wrapper.vm.hoge()
```

上記のコードをTypeScriptで書く場合には`hoge`という関数は`@types`には当然定義されていないので　　
コンパイルエラーとなります

一応、vmをanyにアサーションすることによりコンパイルエラーを回避することができますが  
anyは存在することがよくないので、
mount()の返り値であるvmを拡張して関数を定義して対応しました

# 環境について

テストを書く上でか関わってきそうなパッケージのバージョンは以下の通り

- Nuxt: 2.x
- Vuetify: 2.x
- Jest: 27.0
- TypeScript: 4.3.5

# spec.tsでVueのMethod内の関数にアクセスする

最初に記載した通り、アクセスするために
mount()の返り値であるvmがVueプロパティを持っているため、
このvueを拡張し、関数を定義して対応しました

``` ts
import { mount, Wrapper } from "@vue/test-utils";

interface VueExtend extends Vue {
  hoge: Function;
}

interface WrapperExtend extends Wrapper<Vue, Element> {
  vm: VueExtend;
}

describe("test", () => {
  test("hogehoge'", () => {  
    const wrapper =  mount(Index);
    wrapper.vm.hoge()

  });
})
```

## 参照
[Wrapper の型定義(Github)](https://github.com/vuejs/vue-test-utils/blob/dev/packages/test-utils/types/index.d.ts#L78)

今回は、拡張して対応しましたが、上記に挙げた対処法はベストプラクティスとは思っておらず、  
まだまだ、改善の余地がありそうです

また、今回の記事はNuxt×TypeScript環境にJest×TypeScriptを導入するのに対応した一部です
そのほかにも導入するための対応については[ブログ](https://blog.fumyserv.com/entry/20220424/1650781359)で書いています
MAiX Qube 奮闘記05 本体のRGB LEDを点灯させる。

今回は下記にあった本体のRGB LEDを点灯させる。デモプログラムに取り組みます。
基本的に"/flash/config.json"ファイルが正しく定義されていればそのまま問題なく動作しました。
定義不十分のconfig.jsonファイルが有る場合は一旦このファイルを消してから
ターミナルを起動し
os.remove('/flash/config.json')
など。

https://qiita.com/SOYOKAZE-S/items/af5a2522f4e126abdd24
にある定義プログラムを実行すると良いです。

https://github.com/sipeed/MaixPy_scripts/blob/8407d0eb96fd076f606f6db62cc766135a7c8416/hardware/demo_gpio_led.py


```python:demo_gpio_led.py

import time
from Maix import GPIO
from fpioa_manager import fm
from board import board_info

# see board/readme.md to config your sipeed's hardware.
print(board_info.LED_R)
print(board_info.LED_G)
print(board_info.LED_B)

fm.register(board_info.LED_R, fm.fpioa.GPIO0, force=True)
fm.register(board_info.LED_G, fm.fpioa.GPIOHS0, force=True)
fm.register(board_info.LED_B, fm.fpioa.GPIO2, force=True)
fm.register(board_info.BOOT_KEY, fm.fpioa.GPIO3, force=True)

led_r = GPIO(GPIO.GPIO0, GPIO.OUT)
led_g = GPIO(GPIO.GPIOHS0, GPIO.OUT)
led_b = GPIO(GPIO.GPIO2, GPIO.OUT)
key_input = GPIO(GPIO.GPIO3, GPIO.IN)

status = 0
for i in range(0, 20):
    led_r.value(status)
    time.sleep_ms(300)
    led_g.value(status)
    time.sleep_ms(300)
    led_b.value(status)
    time.sleep_ms(300)
    status = 0 if (status == 1) else 1
    time.sleep_ms(300)
    print("LED RGB(%d,%d,%d)" % (led_r.value(), led_g.value(), led_b.value()))
    time.sleep_ms(100)
    print("key_input:", key_input.value())

fm.unregister(board_info.LED_R)
fm.unregister(board_info.LED_G)
fm.unregister(board_info.LED_B)
fm.unregister(board_info.BOOT_KEY)
```


液晶画面の下にある２か所のＬＥＤ色が変化するプログラムです。
![IMG_0015.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606106/ce81e18e-670d-b57b-2098-5a001de1b8d4.jpeg)
駆け出しエンジニアが海外の起業家のドキュメンタリーから学んだこと〜私はBBQソースの男〜

こんにちは、リッキーです。私事ですが、受託開発系の企業様から内定をいただき、晴れてITエンジニアとして働くことが決まりました。駆け出しエンジニアとして、まだまだ勉強しなければならないことは山のようにありますが、先日、Youtubeで覆面ビリオネアという動画を見つけました。

> 💵 覆面ビリオネアとは… 💵 
わずか100ドルの資金を元手に90日間で100万ドルの価値がある会社を作り上げることはできるのか？億万長者で起業家のグレン・スターンズが自らの素性を隠して挑戦する新シリーズ！縁もゆかりもない土地に降り立ち、ゼロから出発するグレン。アイデア出し、市場調査、チーム編成、起業資金集め、業界研究…。やるべきことは山ほどあるが、あまりにも時間が足りない。しかし自らの知識と経験、アイデアを武器に、徐々に道を切り開いていく。彼のもとに集まったチームメンバーも大きな力となる。果たして次々と訪れる危機を乗り越え、目標を達成することはできるのか。そしてアメリカンドリームはまだ生きているのだろうか。ビジネスで成功するためのヒントと心得が凝縮された、前代未聞の挑戦を追う！

https://www.youtube.com/watch?v=GPFCqo9oZfM

(4月24日現在、Ep.3まで公開されています）

IT業界は他の業界と比較して起業しやすいという特徴があると思います。起業なんて考えは、今の自分にはまだありません。しかし、いつかは起業してみたいなという気持ちもあります。そんな時に備えて、参考になればいいなと思い興味本位で見てみたら、出演者のグレン・スターンズの行動に驚きました。
彼のチャレンジがフェアかどうかなどの意見もあるようですが、何もないところから事業を創る過程はめちゃくちゃ勉強になりました。確かに彼ならば成功した実業家であるはずだと納得できました。私とは、言葉・行動・思考の全てが違っていたのです。

私は彼の動画に感銘を受けましたが、それが一途の感情の起伏で終わってしまっては勿体ないです。彼の動画から学んだことをまとめていこうと思います。

彼のすごいところ

1. フットワークが軽い
チャレンジ開始時点で、彼は１００ドルしか持っていません。この中から食費なども出さなくてはいけないため、まずはチャレンジ期間の生活費を稼ぐことに奔走します。スクラップを探して転売、犬用おもちゃの営業、Tシャツの売り子、自動車の転売などです。さまざまな仕事を通じて、彼は見知らぬ街のことを知り、ビジネスのヒントを得ていきます。また、徐々に人脈を築いていきます。さまざまな分野の専門家を集め、チームをまとめ上げます。

2. 事業へのスピード感　&　締め切りを意識する
彼は最初、クラフトビール作りに目をつけますが、ビールを作るための許可証の申請に時間がかかることを知り、クラフトビール作りは諦めます。彼は軌道修正し、いろいろなビールとBBQを提供するレストランの経営、そしてBBQソースやスパイスなどのネット販売を計画します。思い通りにいかないことがあっても、すぐに計画を立て直します。また、妥協できる点は妥協していきます。90日間という制限時間の中で事業を創るため、彼はどんどん仕事を進め、前に進んでいきます。

その中で、Ep.3に印象に残る場面がありました。

メンバーの中の一人が、BBQソースについて調べるようにグレンに指示されていました。しかし彼は、SNSで「美味しいBBQソースの情報を教えてほしい」と投稿しただけで、他に何もアクションを起こしませんでした。その結果、締め切りが迫っている（時間を大切にしている）グレンからはもっと積極的に行動しろと怒られてしまいます。一方で、あるメンバーは、グレンからの指示がなくとも、グレンの考えを先回りして成果を出し、それをグレンに報告し、彼の信頼を勝ち得ていました。この対比から、BBQソースの彼は仕事のできない人間に映っていました。ですが同時に、私も同じ立場にいれば、彼のような仕事をしてしまうだろうと想像しました。
「仕事を進めるとき、何か問題が起こると立ち止まってしまう人間」
彼の仕事は、最高のBBQソースを作ることにありました。BBQソースについて調べるのはそのための作業でしかありません。私は視聴者なので、彼の良くない面に気づくことができました。ですが本人がそれに気づくことが出来るかはわかりません。実際、私の人生でもあのような場面は何度も起こっていたんだと思います。私はきちんと気付けていたのでしょうか？自信がありません。
グレンは優れた人物です。グレンは彼のモチベーションまで上げようと行動を起こします。メンバー数人でミーティングを開き、彼に自分の立場（他のメンバーは仕事をどんどんこなしていき、自分だけ仕事が遅れているという現実）を理解させようとします。厳しいところでは、このようなフォローアップなしで、いきなり使えないやつの烙印押されておしまい、なんてこともあるのかと思います。



ITエンジニアは、マネジメントができる人間が不足していると言われています。グレンはきっとIT業界でも素晴らしいマネージャーになれるなと感じました。IT業界でキャリアを積んでいく時に、将来マネジメント的な経験を積んでいくか選択する時がくると思います。私はどちらかといえば性格も内向的、チームの中でリーダーシップをとった経験もありません。それでもマネジメントをやっていくとしたら、今のうちから自分に出来ることは何かなと考えています。



また、起業に関しても、冒頭でいつか挑戦してみたいと書きましたが、そんないつかは来ないかもしれません。1年ほど勉強し、簡単なアプリであれば作れるようになりました。プログラミングという武器は身につけました。しかし何もしていない。ただ、売れそうなアプリのネタはないかなと、ネタ探しにネットサーフィンをする程度です。今の私は、BBQソースの彼と同じです。

4月24日の現在、Ep.3までが公開されています。グレンの激励を受け、BBQソースの彼が仕事の仕方を改めるかどうかはまだ分かりません。それまでに私も、やろうとして結局手をつけていない、Youtubeで駆け出しのエンジニアチャンネルでも始めてみようかなと思います。
Oracle 表領域およびデータファイルの管理


# 表領域の種類
- 永続表領域
    - SYSTEM表領域
    - SYSAUX表領域
- UNDO表領域
- 一時表領域

# 主なビュー
- データディクショナリビュー（OPEN状態のみ、データディクショナリから情報を取得）
    - DBA_TABLESPACES ： 表領域の情報
    - DBA_DATA_FILES ： データファイルの情報
    - DBA_FREE_SPACE ： データファイルの空き容量
- パフォーマンスビュー（MOUNT状態から、制御ファイルから情報を取得）
    - V$TABLESPACE ： 表領域の情報
    - V$DATAFILE ： データファイルの情報



||ローカル管理|ディクショナリ管理|
|:--:|:--:|:--:|
|エクステント管理方式|それぞれの表領域の管理用ブロックで<BR>エクステントを管理（高速）|SYSTEM表領域のデータディクショナリで<BR>エクステントを管理（低速）|
|エクステントのサイズの決定|自動|手動|
|空き領域の断片化|発生しにくい|発生しやすい|

※ディクショナリ管理方式は下位互換のためだけに存在している


### データファイルを新しいストレージに移動することとなった場合
ALTER DATABASE RENAME FILE文を実行し、データベースをオープンすれば良い。
lima+dockerでVScode環境設定

### 背景

[前回の記事](https://qiita.com/nyaao/items/5ca99d28842bb0331d63)でlima+dockerの環境構築をしました。今回はVScodeとの連携についてまとめておきます。参考記事は前回と同じです。
VScodeはインストール済みで、lima+dockerの環境は構築できているものとします。

### VScodeの準備

拡張機能として以下をインストールしておきます
* [Docker](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker)
* [Remote-Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers)

### 設定

VScodeで`Shift+command+p`から`open settings`でsettins.jsonを開きます。そこに以下を追記。

```
"docker.host": "unix:///Users/<ユーザー名>/.lima/lima/sock/docker.sock"
```

これでVScode拡張機能のDockerはlima上のdockerデーモンを認識するようになります。あとはリモート拡張機能でホスト上にあるdockerと同じように使用することができます。念のため、再起動とかした方がいいかも。

### Reactコンテナでホットリロードが効かない

Reactコンテナを構築したのですが、ホットリロードが効いていません。VScodeでリモートコンテナを使用すれば都度コンパイルをしてくれていますが、ブラウザ側で検知できていない様子です。下記の記事を見つけたので、いずれ試してみる予定です。

https://zenn.dev/mkazutaka/articles/215042ae6e95fc

### あとがき

macを使用していてもやはりVScodeは使いやすいと思ってしまいます。。最近はraspberry piでも使えるとか。エディタはVScode一択かもしれません

### 2023.06.25追記

さらに簡単に環境構築できるようになったようですね。

https://dev.classmethod.jp/articles/lima-using-docker-on-macos-without-docker-rancher-desktop-app/
Scalaの勉強はじめました 11 〜関数型プログラミング編 〜

## はじめに
N予備校で「Scala応用」コースを受講しています。

## ストリーム
:::note warn
`Stream`は `2.13`以降のバージョンでは非推奨になってい流ので、`LazyList`を使うこと。
:::

https://qiita.com/ka2kama/items/86275caef6ba8e197319


先頭の要素　`head` と その後ろの要素 `tail` で構成されるコンスで表現される。
```scala
val s = 1 #:: 2 #:: 3 #:: 4 #:: Stream.empty
// => Stream(1, ?)
```

:::note
最初の値は判明しているが、その後ろに何が入っているかはわからない。添字でのアクセスは可能。
:::

### 無限ストリーム
```scala
val eights: Stream[Int] = 8 #:: eights
```

再帰的に 8 を延々と追加する。
添字でどこを取り出しても 8 が返る。

### 等差数列
```scala
val s = Stream.iterate(1){
  n =>
    println("Calculate! 3 + " + n)
    3 + n
}
// s(1) => 1
// s(2) => 4
// s(3) => 7
```

実際に評価することで そこまでの再帰呼び出しのデータを生成する仕組みを「余再帰」という。
```
// 1回目の呼び出し
s(10) => 3 + 1, 3 + 4,......
// 2回目以降
s(10) => 31
```
途中の計算結果も含め全ての計算結果がストリームの中で保持されている。

### lazyキーワード
一度値が評価取得されると、二度目は前の結果を使い回す。

https://outputable.com/post/scala-lazy-val/

実際の使い所は迷いそう。

## implicit キーワード
:::note
同じスコープの別の場所で宣言をしておけば コードの実行箇所では宣言しなくても、型変換や引数への代入処理を 自動的に行ってくれる。
:::

```scala
import scala.language.implicitConversions

implicit def intToBoolean(arg: Int): Boolean = arg != 0
```

数値型をBoolean型に暗黙的に変換する。

```scala
if(1) println("1はTrueだよ")
```

:::note
implicit def メソッド名(引数名: 引数の型): 返り値の型 = 本体
:::

このメソッドの引数の型の式が現れた時に、 返り値の型を暗黙の候補として登録できる。


文字列の最後に`:-)`を追加するメソッド

```scala
class RichString(val src: String) {
  def smile: String = src + ":-)"
}

implicit def enrichString(arg: String): RichString = new RichString(arg)

// 呼び出し
"Hi, ".smile
// => Hi, :-)
```

既存のクラスを拡張したように見せかけることができる。

### 引数の省略
```scala
object HTTTravel {
  class Travel {
    def AzuCat(HTT: String): Unit = println(s"${HTT}、アズキャットいて。")
  }

  def member(name: String)(implicit travel: Travel): Unit = travel.AzuCat(name)  
}

// 呼び出し
implicit val HTT = new HTTTravel.Travel
HTTTravel.member("あずにゃん")
```

なんかもっとうまい例が書けたらよかった


## まとめ
`lazy`や`implicit`について、言いたいことはわかるけれどいざ書けって言われるとちょっと自信がない。
MacBookへDockerインストールする

初めてMacBookにDockerを使う環境をセットアップしたのでメモ。

# 前提
* 作業環境はMacBook Pro(Monterey 12.1)
* Homebrew は　[Homebrew インストール](https://qiita.com/nyanco/items/fe72307c2de8c730d836#homebrew-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB "Homebrew インストール") で書いた通りにインストール済み

# MacbookにDockerインストール

Homebrew が既にインストールされていれば、下記実行でOK。
```% brew install --cask docker```
（略）
```🍺  docker was successfully installed!```


# インストール完了後、アプリの Docker Desktopを起動してみる。

![Docker_icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155583/2c58f296-c04c-ba41-e4e7-c544fa11d383.png)

# Dockerアプリを起動させた状態で、ターミナルから

```
% docker version
Error response from daemon: dial unix /Users/nyanco/Library/Containers/com.docker.docker/Data/docker.raw.sock: connect: no such file or directory
Client:
 Cloud integration: v1.0.23
 Version:           20.10.14
 API version:       1.41
 Go version:        go1.16.15
 Git commit:        a224086
 Built:             Thu Mar 24 01:49:20 2022
 OS/Arch:           darwin/amd64
 Context:           default
 Experimental:      true
%
```
【初心者応援】初心者Androiderに贈る、学習時に使用できるコンテンツ３選

# はじめに

[新人プログラマ応援 - みんなで新人を育てよう！](https://qiita.com/official-events/3f21c92121aa125807b4)
ということで、今月から社会人となり、エンジニアになる方も多いのではないでしょうか？
今月は上記イベントに合わせて初心者応援をキーワードとして記事を書いていこうと思います。

今回は初心者応援記事第５弾、Android学習時に使用できるコンテンツを3つほどご紹介したいと思います。

# 1.GoogleDeveloperトレーニングコース

https://developer.android.com/courses

1つ目にご紹介するコンテンツは、Googleが公式に出している、学習コンテンツです。
初心者から経験者まで幅広くコンテンツを提供しており、基本的にCodelabベースの学習システムです。

Kotlin、Androidの基礎中の基礎から、比較的新しい技術であるComposeにフォーカスを当てた講座など、それぞれにあったレベル間で学習できるのが強みとなっています。

今後Androidをメインで開発されていく方は是非一度一通り目を通してみるのが良いかと思います。
もちろん料金はかからず無料で受ける事ができます。

# 2.Udacity:Kotlinを使用したAndroidアプリの開発

https://www.udacity.com/course/developing-android-apps-with-kotlin--ud9012

2つ目ですが、Udacityにて無料で提供している、Androidアプリ開発の学習コンテンツです。
こちらのコンテンツはKotlinの公式ドキュメント内でも紹介されており、初心者から中級者まで幅広く学習できる内容となっています。
コンテンツに記載されているとおり、中級者向けとなっておりますが、レイアウトの基本からアーキテクチャーの基本まで学ぶことができ、より実践的な内容を学ぶことができます。

一通り学習した後にどのコンテンツから吸収したら良いかお困りの方は是非ご活用いただけると良いかと思います。

# 3.kotlinlang Tutorial

https://kotlinlang.org/

3つ目ですが、Web上でKotlinをコーディング、実行まで試せるkotlinlangです。
こちらでは、コーディング可能なだけではなく、基本から応用まで学ぶ事ができるカリキュラムを提供しています。
実際にWeb上で動きを試しながら学ぶ事ができるので、非常に効率よく学ぶ事ができます。
また、Android向けだけではなく、サーバー側やJS向けなどに向けたKotlinなど広い範囲で学ぶ事ができるので、今後のスキルワークに合わせて学習可能です。

ご紹介した中ではこちらが最も初心者向けかと思いますので、学習するコンテンツの1つ目を悩んでいる方に是非おすすめ致します。

# さいごに
今回は3つほどピックアップしてご紹介しました。
他にも学習に使用できるコンテンツは複数ありますので、もし需要があるようでしたら改めてご紹介したいと思います。
Blender 4.2で虹を作る

## 概要

Blenderで虹を作る方法を紹介します。
ポイントは、カラーランプのカラーモードをHSLにすると2色で十分というところです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/37a047e1-0a3b-6112-7e63-44ed7e4ca2f1.jpeg" width="400">

## 作成方法

細かい手順を説明するよりPythonで実行した方が簡単で間違いもないので、Pythonで作成します。
下記をコピペして実行してください。

```py
"""
Make Rainbow
"""
import bpy

bpy.ops.mesh.primitive_circle_add(
    fill_type='NGON', rotation=(1.5708, -1.5708, 0))
obj = bpy.context.object
mat = bpy.data.materials.new(name="rainbow")
obj.active_material = mat
mat.use_nodes = True
mat.blend_method = "BLEND"
ndtc = mat.node_tree.nodes.new("ShaderNodeTexCoord")
ndtc.location = -800, 250
ndmp = mat.node_tree.nodes.new("ShaderNodeMapping")
ndmp.location = -630, 250
ndmp.inputs[1].default_value = -0.5, -0.5, 0
ndtw = mat.node_tree.nodes.new("ShaderNodeTexWave")
ndtw.location = -450, 250
ndtw.wave_type = "RINGS"
ndtw.rings_direction = "Z"
ndtw.inputs[1].default_value = 0.31
ndgr = mat.node_tree.nodes.new("ShaderNodeTexGradient")
ndgr.location = -450, -80
ndvr = mat.node_tree.nodes.new("ShaderNodeValToRGB")
ndvr.location = -260, 250
ndvr.color_ramp.elements[0].position = 0.949
ndvr.color_ramp.elements[0].color = 0, 0, 0, 0
p1 = ndvr.color_ramp.elements.new(position=0.95)
p1.color = 0.333, 0, 1, 1
ndvr.color_ramp.elements[2].color = 1, 0, 0, 1
ndvr.color_ramp.color_mode = "HSL"
ndvr.color_ramp.hue_interpolation = "FAR"
ndmv = mat.node_tree.nodes.new("ShaderNodeMath")
ndmv.location = -250, -110
ndmv.operation = "MULTIPLY"
ndpb = mat.node_tree.nodes["Principled BSDF"]
ndpb.inputs[0].default_value = 0, 0, 0, 1
ndpb.inputs[2].default_value = 1
ndpb.inputs[27].default_value = 1
mat.node_tree.links.new(ndtc.outputs[0], ndmp.inputs[0])
mat.node_tree.links.new(ndmp.outputs[0], ndtw.inputs[0])
mat.node_tree.links.new(ndmp.outputs[0], ndgr.inputs[0])
mat.node_tree.links.new(ndtw.outputs[1], ndvr.inputs[0])
mat.node_tree.links.new(ndgr.outputs[1], ndmv.inputs[1])
mat.node_tree.links.new(ndvr.outputs[0], ndpb.inputs[26])
mat.node_tree.links.new(ndvr.outputs[1], ndmv.inputs[0])
mat.node_tree.links.new(ndmv.outputs[0], ndpb.inputs[4])
```

参考：[BlenderでPythonを実行する方法](https://qiita.com/SaitoTsutomu/items/cec67381a8789b40e377)

円のオブジェクトの上半分だけ表示しています。

作成した虹のマテリアルは、下記のようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/c9344652-6cb6-f05c-f175-8e529dd583ec.jpeg" width="800">

以上
Gitを使ってデータを外付けHDDで管理及び持ち運びメモ【MAC/Win10】

# はじめに
Git初歩の時は「Git Hub」や「souce tree」+「Bitbucket」のプライベートリポジトリを使い在宅と出社でPCを切り替えて基本ワンオペで作業をしてきましたが、Gitに少しずつ慣れてきたので、改めて管理方法を考えた結果外付けHDD（ポータブルHDD）を使って持ち運び管理することに決めました。

【外付けHDDを選んだ理由】
デバイスは切り替わるが基本ワンオペ作業がメイン
ssh接続ができ、外部接続可能なサーバー（レンタルサーバー）を会社が導入してない
windows10及びmacどちらでも利用可能である
ネット環境なくてもGit使える

# 概要
外付けHDDを設定
外付けHDDの任意の場所にベアリポジトリ（リモートリポジトリ）生成
ローカル環境のプロジェクトディレクトリにノンベアリポジトリ（リポジトリ）を生成
ローカル環境のプロジェクトディレクトリからリモートリポジトリ先にpush及びpullする

# 外付けHDDの設定

今回外付けHDDとしてバッファロー1TBのポータブルHDDを利用しました。
macとwindows10を利用しているので、下記に書いてあるとおりフォーマットは**exFAT**に設定しました

https://www.buffalo.jp/support/faq/detail/1116.html

:::note alert
MAC OS Ventura(13.0) にした場合exFATフォーマットを使用している場合
フォルダ階層が確認できない（ターミナルからは確認可能）不具合が出ますので注意してください
:::

# 外付けHDDの任意の場所にベアリポジトリ（リモートリポジトリ）生成
外付けHDDを接続したらターミナルから外付けHDDの中に移動します
```:ターミナル
cd /Volumes/HDDName
```

:::note
ターミナルを起動後HDDアイコンをドラッグ＆ドロップすればそのパスが自動的に入力されます
:::

移動できたら任意の場所にプロジェクト用のベアリポジトリを作ります。
作ったらそのディレクトリの中に移動しgitコマンドを使ってベアリポジトリを生成します
※拡張子に「.git」をつけることを忘れずに
```:ターミナル
//ベアリポジトリ用のディレクトリを作る
mkdir project.git

//移動
cd project.git

//gitコマンドでベアリポジトリを生成
git init --bare --shared
```
:::note 
ベアリポジトリとは？
ベアリポジトリとは更新情報のみを持つリポジトリです
[--sheared]をコマンドでつけることで複数のユーザー（デバイス？）で使用できるようにしてます
:::

# ローカル環境のプロジェクトディレクトリにノンベアリポジトリ（リポジトリ）を生成
git管理する作業用ディレクトリに移動してノンベアリポジトリを生成し、
コミットしておきます
※今回はprojectディレクトリとしています
※projectディレクトリには予めtest.txtを用意してある状態です
```:project/
//ノンベアリポジトリ生成
git init
//変更をステージする
git add test.txt
//変更をコミットする
git commit -m 'first commit'
```
これで作業用リポジトリの用意完了

# ローカル環境からリモートリポジトリ先にプッシュ及びプルする
projectディレクトリ内で下記コマンドを入力してリモートリポジトリを設定します
```:project/
//リモートリポジトリ先を設定
git remote add origin '/Volumes/HDDName/project.git'
//設定できたか確認
git remote -v

origin  /Volumes/HDDName/project.git (fetch)
origin  /Volumes/HDDName/project.git (push)
```
こんな感じで設定ができました。
あとはプッシュしたりプルしたりして、いつも通り操作するだけです
```:project/
//プッシュ
git push origin master
//またはプル
git pull origin master

//他の環境からHDD接続してクローンする
git clone /Volumes/HDDName/project.git
```
このやり方でgit Hubとか使わずに
社内のオンプレミスサーバーにノンベアリポジトリ作って他の人にデータ共有もできるので（同一ネットワーク上に限りますが）、勉強になりました

# 参考にしたサイト
https://qiita.com/devzooiiooz/items/56a02342d9d65d79f6c3

https://normalblog.net/system/initial_commit/

https://qiita.com/belre/items/3839161d2702817fea1f
JetsonAGXレポート(GW)

2022年のゴールデンウィーク中(10日間)でやりたい事

●目次
　◎JetsonAGX
　・セットアップと開発の仕方まとめる。
　・ベンチマーク計測の方法まとめる
　・HumanPoseとAI診断まとめる
　・Dronと画像認識
 ◎RasPiサーバー
　・動画管理
　・テロップ付与クラウドサービス
　◎ESP32 FreeRTOS

● セットアップと開発の仕方まとめる。
　◎参考資料
　　http://www1.meijo-u.ac.jp/~kohara/cms/technicalreport/nvidia-agx-xavier-setup

　　https://ja.jf-balio.pt/nvidia-s-new-jetson-agx-xavier-module-will-help-autonomous-robots-get-smarter


●ベンチマーク計測の方法まとめる
　
　◎参考資料
　　https://robotstart.info/2019/03/04/jetson-xavier-review-02.html
　

●HumanPoseとAI診断まとめる

　◎参考資料
　　https://www.atpress.ne.jp/news/219181
　　
　　https://www.next-system.com/topics/release/post=7477

https://wisteriahill.sakura.ne.jp/CMS/WordPress/2021/03/06/jetson-nano-pose-estimation-resnet-18/
　　

●Dronと画像認識
　
　◎参考資料
https://developer.nvidia.com/embedded/community/jetson-projects#hermes_wildfire_detection
Nuxt.jsでバリデーション

# バリデーションとは？
ざっくりと、あらかじめ規定を設定しておいて、入/出力データに対してそのあらかじめ用意した規定を用いて検証すること。
例えば、APIから{num: 1}とか受け取ったときこのnumは絶対に数値型じゃないといけない場合などに利用する。

# Nuxtでバリデーション
Nuxtでバリデーションを利用するときはvalidateメソッドを利用する。
正規表現が使える。
````nuxt.js
export default {
  validate ({ params }) {
    // 数値でなければならない
    return /^\d+$/.test(params.num)
  }
}
````
nuxtは他にもバリデーションのやり方が様々あるので、公式ドキュメントを参照すると良いです


[引用](https://develop365.gitlab.io/nuxtjs-2.8.X-doc/ja/api/pages-validate/)