OmniAICreator/Qiita-1.07M huggingface dataset:
【Scala】関数の引数にRefined値制約を付ける場合、その引数にリテラル値ではない「変数x」が渡された場合も正常に動作させる方法

Refinedで定義された値制約が付いたオブジェクトは、数値リテラル（1, 175など）や文字列リテラル（"abc"など）を与えると、オブジェクトを初期化宣言させることができます。

他方で、すでに定義済みの変数（x, y, customer_name, sales_volumeなど）で初期化宣言をしようとすると、「リテラル値でないと受付けられません」というエラーメッセージが吐かれてしまいます。

そのため、関数の引数にRefined値制約を付ける場合、その引数にリテラル値ではない「変数x」が渡された場合は、エラーが発生してしまうことになります。

そうした事例が、以下のウェブページで報告されています。

http://ja.uwenku.com/question/p-daphfiiv-gp.html

>```Scala:
>package xxx 
>
>import eu.timepit.refined._ 
>import eu.timepit.refined.api.{Refined, Validate} 
>import eu.timepit.refined.auto._ 
>import eu.timepit.refined.numeric._ 
>import eu.timepit.refined.api.Refined 
>import eu.timepit.refined.numeric.Interval 
>
>object Lala { 
>    type X = Integer Refined Positive 
>    def lala(x: Int): Unit = { 
>    val lala: X = refineV[X](x) 
>    } 
>} 
>```
>
>、私は、このエラーメッセージが表示されます：ポジ型のための検証の実装が欠落しているようだ
>
>```
>Error:(13, 29) could not find implicit value for parameter v: >eu.timepit.refined.api.Validate[Int,xxx.Lala.X] val lala: X = refineVX
>
>Error:(13, 29) not enough arguments for method apply: (implicit v: >eu.timepit.refined.api.Validate[Int,xxx.Lala.X])Either[String,eu.timepit.refined.api.R>efined[Int,xxx.Lala.X]] in class RefinePartiallyApplied. Unspecified value parameter >v. val lala: X = refineVX
>```

この関数は、以下のように定義すると、引数として、リテラル値の整数が渡された場合も、変数に格納（名前束縛）された整数が渡された場合も、値検査を行った上で、正常に動作します。

```Scala:sbtConsole
scala> type X = Integer Refined Positive
type X

scala> 
scala> def lala(x: Int):Unit = {
     |    val lala: X = refineV[Positive](x).right.get
     |    println(x)
     | }
warning: 2 deprecations (since 2.13.0); for details, enable `:setting -deprecation` or `:replay -deprecation`
def lala(x: Int): Unit

scala>
```

```Scala:sbtConsole
scala> lala(3)
3

scala> val sample_number = 7
val sample_number: Int = 7

scala> lala(sample_number)
7

scala>
```

- 値制約条件__*X*__を充足しない整数（0と負整数）が渡された場合は、ちゃんとエラーになります。
- ここは、errorを発生させずに、Either型かOption側で対応させたいところではあります。

```Scala:sbtConsole
scala> lala(-10)
java.util.NoSuchElementException: Either.right.get on Left
  at scala.util.Either$RightProjection.get(Either.scala:696)
  at lala(<console>:2)
  ... 35 elided

scala> val negative_number = -7
val negative_number: Int = -7

scala> lala(negative_number)
java.util.NoSuchElementException: Either.right.get on Left
  at scala.util.Either$RightProjection.get(Either.scala:696)
  at lala(<console>:2)
  ... 35 elided

scala> val zero_number = 0
val zero_number: Int = 0

scala> lala(zero_number)
java.util.NoSuchElementException: Either.right.get on Left
  at scala.util.Either$RightProjection.get(Either.scala:696)
  at lala(<console>:2)
  ... 35 elided

scala> 
```

上記のコードの書き方について、背景は以下の記事で解説しています。

https://qiita.com/electronics_diy721/items/9237247394740a4354fd
powershellでrebootコマンドから再起動できるようにする

## この記事について
WindowsでPowerShellを使っている際、Linuxのように `reboot` でPCの再起動をできるようにした際のメモです。

## 動作確認に利用した環境
Windows 10 Pro
PowerShell 7.2.0


## PowerShellでの再起動コマンド
- [コンピューターの状態を変更する - Microsoft Docs](https://docs.microsoft.com/ja-jp/powershell/scripting/samples/changing-computer-state?view=powershell-7.2)

上記に書かれているように、以下コマンドのいずれかで再起動できます。

```
Restart-Computer
Restart-Computer -Force
```

今回は `Force` オプションを付けたものにエイリアスを設定していきます。

## rebootのエイリアス設定

設定を永続化させるためにPowerShellのプロファイルに記入します。
プロファイルの場所については、[こちら](https://docs.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.2)に詳しく記述されています。

プロファイルが存在しない場合は、PowerShellで以下コマンドで実行ポリシーの変更と作成を行います。

```powershell
Set-ExecutionPolicy RemoteSigned -Force
New-Item –type file –force $profile
```

次に、プロファイルの編集を行います。

```powershell
notepad $profile
```

メモ帳が開いたら、以下の内容を記述します。

```powershell
# reboot
function reboot() {
  Restart-Computer -Force
}
```

PowerShellを再起動すると、  `reboot` でPCの再起動ができるようになります。


## 参考
- [コンピューターの状態を変更する - Microsoft Docs](https://docs.microsoft.com/ja-jp/powershell/scripting/samples/changing-computer-state?view=powershell-7.2)
- [PowerShellメモ　シャットダウン、再起動、スリープ - Qiita](https://qiita.com/Kosen-amai/items/4b773c077a588f2a2fb5)
- [about_Profiles - Microsoft Docs](https://qiita.com/drafts/9f4e97cbb08c118271dd/edit)
- [Windows Power Shell でエイリアス (Set-Alias, function)](https://tks2.co.jp/2020/04/05/power-shell/)
プログラミングを始めて4ヶ月でG検定を受けて合格した時のメモ

この記事は「IT資格取得をテーマに学びをシェアしよう！【PR】Udemy」アドベントカレンダーその2の5日目の記事です。よろしくお願いします。
https://qiita.com/advent-calendar/2021/udemy

1ヶ月前になりますが11/6（土）実施の`G検定2021#3`に無事合格できたので、学習方法などの紹介になります。

G検定受けようかなと思っている人の参考になれば。

# はじめに自己紹介・バックグラウンド

2021年の6月末で2年半務めた学習塾を辞め、7月より転職先で機械学習エンジニアとして研修を3ヶ月受けたのち、11月から画像データを扱うディープラーニングの実務案件に携わっております。
数学は好きな方ですが、経済学部なので文系の人間です。大学の講義で統計学やRは勉強してましたが、2年半も経つとほぼ知識ゼロ状態からのスタートで研修期間初期は辛かったです。

一応ざっくりと学習してきたことを紹介すると

##### 7月〜8月
python基礎、統計基礎、数学基礎、SQL基礎

##### 8月〜9月
機械学習基礎、深層学習基礎（TensorFlow)、画像分類アプリ作成

##### 9月〜10月
GAN、超解像、Pytorchの勉強

##### 10月〜11月
超解像コンペ、Vue+Flaskのアプリ作成、ViT, YOLO

という感じです。

ここまで勉強してきた成果チェックの意味合いでG検定を受けました。

# 結果


総受験者数　7,399名
合格者数　　4,769名

■シラバス分野別得点率（小数点以下切り捨て）
１．人工知能とは.  人工知能をめぐる動向. 人工知能分野の問題：100%
２．機械学習の具体的手法：90%
３．ディープラーニングの概要：81%
４．ディープラーニングの手法：87%
５．ディープラーニングの社会実装に向けて：75%
６．数理・統計：83%
７．法律・倫理・社会問題：71%

合格率64%くらいですね。


# 勉強方法

参考書は公式の白テキストしか使ってません。

[![JDLA_books_01-2.jpg-1440x2048.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890361/47bcda39-4ec8-4b33-85ec-5ffb62405fc4.jpeg)
](https://www.amazon.co.jp/dp/4798165948)

G検定受けようと決め、申し込んだのが10/8でその日のうちにkindle版を買いました。
絶対kindle版がいいです。理由は後述。

参考書の使い方は簡単。とりあえず読む！
風呂や寝る前、電車内、待ち時間、空き時間...

冊子だとこんな気軽に読み進められないのでkindleの電子書籍が絶対良いです。

櫻坂ツアー大阪の時はライブ前まで暇なので1時間くらい読んでましたし、会場内に入ってもスマホでちょくちょく読み進めてました。

暇さえあれば、1ページでも読むみたいな感じです。

大体11月に入る前までに2周読み終えました。

後の一週間弱で[コチラ](https://deeplearning.sakura.ne.jp/general/index.cgi)の毎日10問を解いて形式を掴んでました。

自分がG検定の勉強のためにやったのは本当にこれくらいです。

そもそも研修期間で一通りのことは学んでたので、新しく勉強するところが人工知能の歴史・動向くらいだった気がします。

# 本番で気をつけたこと

よく言われるチートシートは作ってないですし、参考にしてません。
Google検索とkindleの本自体をググり対象としました。

この時も電子書籍だと楽ですね。

とりあえず問題数がめちゃ多いので、ぱっと見検索に時間がかかる(法律、条文系)・知識が曖昧（自分の場合音声データや自然言語処理、強化学習）はチェックをつけて飛ばして、調べるのが楽（人工知能の歴史系）、確実に自信持って答えられる知識がある分野だけ回答していきました。

この時点で飛ばした問題が40問くらいで、残り時間が40分くらいだったので、知識が曖昧なものを調べて確実に回答していき、残った時間で法律や条文系を回答しました。

と調べることを多用するのでマルチディスプレイ、ないしはタブレットなどがあると非常に便利です。

所感ですが、今回はモデル名や法律関係、人工知能の歴史関係の問題が多かった気がします。
セグメンテーションや自然言語、画像分類などの有名なモデルは一通り押さえておいた方が良いと思います。

# まとめ

正直ある程度、一通り学習した人なら簡単に合格できると思います。
AIや深層学習の一通りの知識が身につくので試験を受ける受けないに関わらず、勉強しておいて損はないと思います。

特にIT業界の営業の方など非エンジニアの人は持ってると話のタネになる気がします。
せや！結局は`streamlink`で`ffmpeg`を使えばええ！

# 準備
`ffmpeg`（`streamlink`が依存してる）と`streamlink`を`brew`で入れる

https://formulae.brew.sh/formula/ffmpeg

https://formulae.brew.sh/formula/streamlink

```zsh
brew install ffmpeg

brew install streamlink
```

以下の通り環境変数`PATH`に`ffmpeg`がないと死なので確認する

```zsh
man streamlink
...
 FFmpeg options

       --ffmpeg-ffmpeg FILENAME
              FFMPEG is used to access or mux separate video and audio streams. You can specify the location of the
              ffmpeg executable if it is not in your PATH.

              Example: "/usr/local/bin/ffmpeg"
...
```


# 使い方

**hlsでも非hlsでも大丈夫**

1. 対象のwebサービスに行って動画を再生して
1. 「webインスベクタ」を表示，「ネットワーク」を表示
1. 頑張って拡張子が`.m3u8`か`.mp4`のファイルを検索
  + 前者がhls，後者が非hls
1. そのファイルを落とした時のcURLをコピー
1. cURLから標準urlだけを抽出
1. `streamlink '[url]' best -o temp`
1. `ffmpeg -i tmp -c copy file.mp4`

## 何が起きてるか
streaming系サービスでのhttp通信をうまいこと管理して，hls処理ができる`ffmpeg`に渡してくれてる<br>
`ffmpeg`に不足してるhttp管理機能と`curl`に不足してるhls処理機能を両立してくれてこれは…ありがたい

## 細かいオプション

https://ffmpeg.org/ffmpeg.html

https://streamlink.github.io/cli.html

ニコ動のオプション機能でログイン可能とかセッションID持ち込みとかあったりするらしいな


# 利点！
独立してセッションを構築してくれるからクッソ楽<br>
もしそれができない事情があるなら適宜にhttpのヘッダ情報を引数で渡せば良いので問題はない

# 欠点？
処理をせず`.m3u8`+`.ts`の形式に落とすのは想定外の動作<br>
hlsだと`.mp4`になったりならなかったりするのでもっかい`ffmpeg`をかける習慣をつけよう<br>
まぁ変換前の形式で落とす必要性もなさそうだし，なんなら**hlsへの変換**もやれるっぽいし（今回はそこには触れないけど）
実務で使うGitコマンドメモ

11月より実務でコードを書いています。

1つのプロジェクトリポジトリをブランチ分けて開発していくスタイル。


# リモートリポジトリからローカルリポジトリに落としてくる

```shell
git clone <リモートリポジトリのURL>
```
社内サーバーだとプロキシを設定していたりするので結構詰まりました。

```config:.gitconfig
[https]
	proxy = https://<proxy>:8080
[http]
	proxy = http://<proxy>:8080
```

のように設定してあげたらcloneできました。

# ブランチの確認

```shell
git branch -a
```

-aをつけることでローカル、リモート全てのブランチを確認できます。
今いる自分のブランチがハイライトされます。

# ブランチの作成・移動

```shell
git checkout -b <新しいブランチ名> <派生先ブランチ名>
```

-bをつけることで作成と移動が同時にできます。
例えば`model/test`というブランチを新しく、`remotes/origin`から派生させた作成したい場合は

```shell
git checkout -b model/test remotes/origin
```
上記コマンドを打てばokです。

# コミット対象を追加
ローカル上で追加・編集したファイルは

```shell
git add <ファイル名>
```
でコミットの対象にできます。いちいち指定しているとめんどくさいので`.gitignore`ファイルを設定して

```shell
git add .
```

でカレントディレクトリ以下のファイルを全てコミット対象にできます。

# コミット

```shell
git commit -m 'コメント'
```

上記コマンドでコミットできます。

# プッシュ

```shell
git push origin <ブランチ名>
```

一旦ここまで。
必要なものが出てきたら追加します。
Ruby:クラスの概念を整理してみた

#そもそもクラスとは
###ー設計図ー
正直ピンと来そうで来ないです・・・・　　　もう少し細分化していきます。

まず設計図に必要な情報は・・・・
・どのような情報を持っているのか(初期設定）・・・・・インスタンス変数
・どんなことができるのか（メソッド）・・・・・・インスタンスメソッド

#####インスタンスとは??
・インスタンスが付く時は必ずクラス内で定義されている
・newアクションで生成された実体である(設計図だけでは実体はない)


#まず日本語で記述してみる(今回はカップを設計してみます）
```
class　　カップ　　　　
　　　　　有無や容量を全てのメソッドで使えるようにする
 def 初期設定 (有無,容量）
　　　　- 取っ手があるかないか
　　　　- カップの容量
　　end

 def カップのできること　（投入量,消費量)
　　　　　- 飲み物を保管する
　　　　　- 飲み物を取り出す
　　　　　  →条件分岐　　投入量が多すぎる時
　　　　　　　　　　　　　　→条件分岐　　消費量が多すぎる時 
　　end
end

カップ１　= カップ.new(取ってあり,200mｌ)  #初期値の情報を代入してカップ１を生成
カップ２　= カップ.new(取って無し,１００ｍｌ)　　#上記に同じくカップ２を生成

カップ１.カップのできること(投入量,消費量)　　　#上記で生成した変数にメッソドを当てる
カップ２.カップのできること(投入量,消費量)　　　#上記で生成した変数にメッソドを当てる


```
#実際に記述してみる

```
class Cap
    attr_accessor :handle, :capacity
  def initialize(handle,capacity)
   @handle = handle
   @capacity = capacity
  end

  def change(input,remove)
    if input > @capacity
        puts "キャパオーバーです。"
    else
        input -= remove
            if input < 0
                puts "飲みすぎです"
            else
               input 
            end
    end
  end
end

cup_1 = Cap.new(true,500)
cup_2 = Cap.new(false,300)

puts cup_1.change(1000,100)
puts cup_2.change(200,50)
```
###上記の記述の出力結果
[![Image from Gyazo](https://i.gyazo.com/e91e91c3bea4e0a1ef28d49b28daff56.gif)](https://gyazo.com/e91e91c3bea4e0a1ef28d49b28daff56)

```
キャパオーバーです。

150
```

#上記の内容からのまとめ
・クラスをつくることによってカップ１やカップ２のような同じ機能を持った実体を簡単に複製できる。
・クラスの中で定義された変数やメソッドをインスタンス変数やインスタンスメソッドと呼ぶ
・クラス（設計図）はnewで実体（インスタンス）を生成する
・生成されたインスタンスは個別の情報を持っている
・共通の情報をもつ時はクラス変数を使う"@@クラス名"

一旦ここまで整理しました。
言葉足らずや認識違いがある時はご指摘頂けますと幸いです。

#教えてくれたエンジニア
<iframe width="560" height="315" src="https://www.youtube.com/embed/9cnafOQmnAY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
for文使って配列をファイルに保存

##概要
https://qiita.com/naozoh/items/317c7647bc6eead2233a

上記事では複数のテキストフォームの内容をファイルに保存した。
今回は配列データをfor文使ってファイルに保存する。

```php5
<?php
    //ファイルに書き込むデータ作成
    $string = array("test0","test1","test2","test3","test4","test5","test6","test7","test8","test9");

    $file_name="data.txt"; //ファイル名
    $file = fopen($file_name,"w");  //ファイルオープン
    flock($file, LOCK_EX);  //ファイルロック

    //データを書き込む
    for($i=0; $i<10; $i++){
      fputs($file, $string[$i]);
      fputs($file, "\n");
    }

    flock($file, LOCK_UN);  //ファイルロック解除
    fclose($file);  //ファイルクローズ
?>
```

##参考文献
・PHPによるWebアプリケーションスーパーサンプル第２版
・速攻!図解プログラミングPHP+MySQL
【RSpec】リクエストテストupdateで値が更新されないとき

##環境
Ruby 3.0.2
Rails 6.1.4.1


reloadでDBの値を更新するとテストが通る。


```spec.rb
context '記事を編集する際、正しい値の場合' do
  let!(:post) { create(:post) }
  let!(:post_params) { attributes_for(:post, title: 'other') }
  it '記事を編集できること' do
    expect { subject }.not_to change(Post, :count)
    expect(response).to have_http_status(302)
    expect(post.reload.title).to eq 'other'
  end
end
```
Redisのどうでもいい話

Redisを使っていくうちにわかったどうでもいい話です。

#ディスク消費量は50%を超えてはいけない
Redis は毎分ごとに全データをディスクに書き込む仕様になっています。
その時の方法は既存のデータとは別に新しいデータファイルを作り、そこにメモリの内容のスナップショットを一気に書き込み、書き込みが完了したら新しいデータで古いデータを上書きします。そのため、新しい内容を書き終えた瞬間には古いデータと新しいデータの2つがディスク上に共存することになり、それはつまり現在保持しているデータ量の倍のデータが瞬間的に消費されるということになります。
Redis単体で稼働しているサーバ上でディスク消費量が50%を超えると容量が足りず保存処理が失敗します。保存処理が失敗すると再度成功するまでRedisは書き込みを拒否するようになりますので実質サービスダウンとなります。実際のところこの制限に触れてしまうケースはあまりないかとは思います。

#メモリ消費量は50%を超えてはいけない
データ保存をするためにはある瞬間のメモリのスナップショットを取る必要があります。そのためにRedisはプロセスを fork し、子プロセスの内容をそれ以上変更されないようにした上でこの子プロセスのデータをディスクに保存します。
このとき copy on write の恩恵によりfork直後は子プロセスのためにメモリを追加で確保する必要はありません。しかし、もし親プロセスでデータの書き込みが行われるとその部分はダーティとなりコピーが発生します。

まあでも書き込みはそんなにたくさんしてないからせいぜい数%のコピーしか発生しないと思うかもしれませんが、意外とそんなことはありません。まずダーティ判定はページ単位で行われます。Linuxにおいてはページのデフォルトサイズは4KBなのでたった1バイトしか書き込んで無いつもりでも4KB分のコピーが発生します。またRedisのデータ構造は巨大なハッシュのようなものなので、データは分散されて保存されています。なので例えば全体のキーの1%しか書き込んで無いと思っても、ページサイズとの組み合わせにより大部分のメモリがダーティとなる可能性があります。また、データ量が増えるに連れて保存が完了するための時間がよりかかるようになります。これはつまりその保存の間にダーティとなる割合がデータ量に比例して大きくなるということです。つまりデータ量x書き込みデータの割合というペースで消費メモリ量が最初は増えていくことになります。サービス開始後は余裕だったのに、ということは少なくないと思います。

というわけで、メモリ消費量が50%を超えていると保存処理時にメモリが不足してしまう可能性があります。メモリが不足すると保存失敗となり、再度保存に成功するまで Redis は書き込みを拒否します。平常時でのメモリ消費量が50%を超えないようにモニタリングするか、Redisのログを監視したほうがよいでしょう。

#Redisのデータがある程度大きくなるようなら他のサービスと同居させてはいけない
Redis は最初データ量が少ないうちはなんのオーバーヘッドも感じない小さなサービスという感じなのでカジュアルに他のサービスと同居させてしまうかもしれませんが、データ量が増えてくるとサーバへの書き込み負荷は線形に伸びていきます。

特に1分ごとに全データを保存する仕様なので、10GB級のメモリを消費している場合は常時ディスクへの大量書き込みが起きているという認識でいたほうがよいです。インメモリDBではありますが、おそらく他のどのデータベースより書き込み量の多いDBだと思います。少ししかデータが書き換わってないのに全データを書き出す必要があるためです。

この書き込みは通常線形アクセスなので高速なのですが、もしほかのプロセス(例えば他の種類のデータベース)が頻繁に書き込みをしているようだと実質ランダムアクセスとなり Redis 自体の保存処理にも時間がかかるようになります。時間がかかると copy on write の量も余計に増えるので嬉しくありません。

# まとめ
ということで、データ量の小さい Redis とデータ量の大きな Redis とでは子猫とベヒーモスくらいの差があるという認識でいましょう。
Macのターミナルでよく使うコマンド一覧 ディレクトリ操作編

## 現在のディレクトリの表示 pwd(print working directory)

現在、どの階層にいるかを表示するコマンド。

**pwd**

**書式例**

```shell:pwd
pwd
```

## ディレクトリの変更 cd(change directory)

cdコマンドは現在いるディレクトリを変更するコマンド。移動先のディレクトリを指定。ディレクトリを指定しない場合はホームディレクトリに移動。

**cd ディレクトリ名**  

**書式例**

```shell:cd
cd abc
```

## ディレクトリの作成 mkdir(make directory)

mkdirコマンドはディレクトリを作成するコマンド。

**mkdir ディレクトリ名**

**書式例**

```shell:mkdir
mkdir abc
```

**オプション**

```shell:-p
mkdir -p abc1/abc2/abc3 # 指定されたディレクトリの上位ディレクトリも一気に作成
```

## ディレクトリの削除 rmdir(remove directory)

ディレクトリを削除する際に使用するコマンド。ただし、対象のディレクトリはからである必要がある。
空ではないディレクトリを削除する場合、rmコマンドに-rオプションを付けて実行する。
しかし、このコマンドは実行すると警告なく指定したディレクトリ以下のディレクトリ、ファイルを削除する為、注意が必要。

**rmdir ディレクトリ名**

**書式例**

```shell:rm
rmdir abc/
```

**オプション**

```shell:-p
rmdir -p abc # 指定した階層までのディレクトリを一括で削除
```
<Java学習中>エスケープシーケンス

前回はHelloWorldまでの流れで、mainメソッドとは何なのかと文字列の表示について簡単に学びました。


今回はその続きで、表示させる文字列に改行させたりできる特別な文字「エスケープシーケンス」を学びました。

主要なエスケープシーケンスとして、

\n 　は改行
\t 　は水平タブ（一定の文字数分空白が入力される）
\\ 　は\マークが文末に入力される
\" 　はダブルクォーテーションが文末に入力される
\' 　はシングルクォーテーションが文末に入力される

の５つがあります。

まずは改行のエスケープシーケンスから実際にやってみると

```java
public class Main {
    public static void main(String[] args) {
        
        System.out.print("GoodMorning\n"); //ダブルクォーテーション内に入力
        System.out.print("GoodEvening\n");
        System.out.print("GoodAfternoon\n");
    }
```
```text:実行結果
GoodMorning
GoodEvening
GoodAfternoon
```
前回のprintlnとprintの違いで改行させるか否かとありましたが、\n のおかげでprintでも改行をすることが出来るようになりました。printとエスケープシーケンスの併用は小回りが利いて便利そうです。

続いては　　\t
上のサンプルコードを流用して実行すると

```text:実行結果
GoodMorning	GoodEvening	GoodAfternoon	
```
各文字列の間にTabキーを押したように一定の間隔が空いています。

次は　　\\\

```text:実行結果
GoodMorning\GoodEvening\GoodAfternoon\
```
バックスラッシュが入りました。
これ要る？と思いましたが、どうやら環境によって"\"か"￥"のどちらかしか入らない場合があるとのこと。文字自体は違いますが役割は同じという事ですね。visualstudioを導入してみて同じキーを押すと、\ の代わりに￥マークが入りました。
もし￥マークのあとにnが入るような場合、改行として扱われてしまうため￥マークをただの文字として入れるためのコマンドみたいです。

次は　　\"

```text:実行結果
GoodMorning"GoodEvening"GoodAfternoon"
```
各文字列の文末にダブルクォーテーションが付きました。
各文字列の文頭にも付けて改行すれば見やすそうですね → System.out.print("\"GoodMorning\"\n");

次は  　 \'
これはダブルクォーテーションがシングルクォーテーションになっただけでしたので割愛。


続いてテキストブロックというダブルクォーテーションを３つ並ばせて改行を含めた文字列を扱う方法です。

```java
public class Main {
    public static void main(String[] args) {
        
        System.out.print("""
        Good Morning
        Good Evening
        Good Afternoon
        """);
    }
}
```
```text:実行結果
Good Morning
Good Evening
Good Afternoon
```
エスケープシーケンス「\n」を使わなくても改行を含めた文字列の表示が出来ました。都度\nと入力しなくてもよいので見やすい編集が出来そうですね。


まだ他にも８進数や１６進数の文字コード入力することで対応する文字を表示させるやり方がありますが、この記事では割愛します。裏で調べて使ってみようと思っています。

今回はここまでです。ありがとうございました！
何かありましたら、ツッコミよろしくお願いします！
プルエラーが発生しました

原因
「feature」ブランチと「FEATURE/XXX」ブランチをローカルに落とす際、
同じ名前のフォルダ・ファイルは共存できないためエラーとなっているようです。
対策（リモート：消す）
クローン先の「xxx/.git/logs/refs/remotes/origin」配下にある「feature」ファイルを消すこと
対策（ローカル：プル）
(1) TortoiseGit → Pull
(2) Prune のチェックを■からチェック有り (レ) に変更
初心者が使うGit コマンド（備忘録）

Linux上で使うよく使うgitコマンドを記載します。
これがQiita初投稿です。

# 初期化
$ git init 
このコマンドでGitリポジトリを初期化できる。

# 集結
$ git add -A
このコマンドで指定したファイルをステージング状態（コミットの手前）にする。

# ディレクトリに追加
$ git commit -m "ブランチ名"
このコマンドディレクトリに保存

# 切り替え
$ git checkout "ブランチ名"
作業ブランチの切り替え

# リモートリポジトリに追加
$ git merge "ブランチの小タイトル"

# リモートリポジトリのブランチの更新
$ git push

# コードを最新版ものに更新する
$ git pull

# リポジトリごとダウンロードする
$ git clone "GithubのリポジトリURL"
[Ruby] paizaで頻出するメソッドまとめ

#はじめに

paizaラーニング(Cランク)をやっていく上で必要不可欠なメソッドをまとめてみました。
ぜひ参考にしてください。

# 入力メソッド

```ruby
/文字列(string型) 改行あり /
input = gets

/文字列(string型)　改行なし/
input = gets.chomp

/数値（integer型） 改行あり/
input = gets.to_i

/数値(integer型) 改行なし/
input = gets.chomp.to_i
```

# 配列メソッド


###※string型

```ruby

/入力値を配列に格納　/
input = gets.split(" ")

/入力値を分割して配列に格納/　
a,b,c = gets.split(" ")

/入力値を順番に格納/
a = readlines.map 

```

###※integer型 

```ruby
/入力値を配列に格納　/
input = gets.split.map(&:to_i)

/分割して配列に格納/
a,b,c = gets.split(" ").map &:to_i

/入力値を順番に格納/
a = readlines.map &:to_i

```

# timesメソッド　＋　配列

```ruby
/繰り返し回数/
n = 5

/配列の設定/
sample = []

/繰り返し回数分、配列に格納 /
n.times do
  sample.push(gets.chomp.split(" ").map &:to_i)
end
```

#timesメソッド　＋　配列 2
記述が少なくて個人的に好きです。

```
入力例
4
3
5
7
9
```


```ruby 
/繰り返し回数/
N = gets.to_i

/繰り返し回数分、配列に格納/
M = N.times.map { gets.to_i }. #入力例１の3,5,7,9が入る。
```


#　おわりに

まだプログラムを書き始めて二ヶ月半です。
これからも覚えたことを書き出していくので、よろしくお願いいたします。
（積分で曲線の長さ）「2021年度 京都大・理系数学問4」をsympyとwolframalphaでやってみたい。

???いい方法を教えて下さい。
sympyのCurveで上手くいきませんでした。wolframalpha(作図あり)ですかね。

オリジナルポスト

https://www.densu.jp/kyoto/21kyotospass.pdf#page=4

# 問題

https://mathexamtest.web.fc2.com/2021/202110541/2021105410100mj.html#top-0111


# sympyで

```python
from sympy import *
var('x')
print("#docs.sympy.org          ",Curve((x, log(1+cos(x) )),(x, 0, pi/2)).length)
print("#www.wolframalpha.com    ",integrate(sqrt(sec(x/2)**2)                  ,(x, 0, pi/2)))
print("#www.densu.jp            ",integrate(sqrt(1+diff(log(1+cos(x)))**2)     ,(x, 0, pi/2)))
print("#manabitimes.jp          ",integrate(sqrt(1+(-sin(x)/(1+cos(x))**2))    ,(x, 0, pi/2)))
print("#sokuho.yozemi.ac.jp     ",integrate(cos(x)/(1+sin(x))+cos(x)/(1-sin(x)),(x, 0, pi/4)))
print("#kaisoku.kawai-juku.ac.jp",integrate(1/cos(x/2)                         ,(x, 0, pi/2)))
print("")
print("#docs.sympy.org          ","Integral(sqrt(sin(x)**2 + cos(x)**2 + 2*cos(x) + 1)/Abs(cos(x) + 1), (x, 0, pi/2))")
print("#www.wolframalpha.com    ","2*tanh^(-1)(1/sqrt(2)),1.7627")
print("#www.densu.jp            ",log(3+2*sqrt(2)),float(log(3+2*sqrt(2))),simplify(log(3+2*sqrt(2))))
print("#manabitimes.jp          ",2*log(sqrt(2)+1),float(2*log(sqrt(2)+1)),simplify(2*log(sqrt(2)+1)))
print("#sokuho.yozemi.ac.jp     ",2*log(sqrt(2)+1),float(2*log(sqrt(2)+1)),simplify(2*log(sqrt(2)+1)))
print("#kaisoku.kawai-juku.ac.jp",2*log(sqrt(2)+1),float(2*log(sqrt(2)+1)),simplify(2*log(sqrt(2)+1)))
#docs.sympy.org           Integral(sqrt(sin(x)**2 + cos(x)**2 + 2*cos(x) + 1)/Abs(cos(x) + 1), (x, 0, pi/2))
#www.wolframalpha.com     log(sqrt(2)/2 + 1) - log(1 - sqrt(2)/2)
#www.densu.jp             Integral(sqrt(sin(x)**2 + cos(x)**2 + 2*cos(x) + 1)/Abs(cos(x) + 1), (x, 0, pi/2))
#manabitimes.jp           Integral(sqrt(1 - sin(x)/(cos(x) + 1)**2), (x, 0, pi/2))
#sokuho.yozemi.ac.jp      log(sqrt(2)/2 + 1) - log(1 - sqrt(2)/2)
#kaisoku.kawai-juku.ac.jp log(sqrt(2)/2 + 1) - log(1 - sqrt(2)/2)

#docs.sympy.org           Integral(sqrt(sin(x)**2 + cos(x)**2 + 2*cos(x) + 1)/Abs(cos(x) + 1), (x, 0, pi/2))
#www.wolframalpha.com     2*tanh^(-1)(1/sqrt(2)),1.7627
#www.densu.jp             log(2*sqrt(2) + 3) 1.762747174039086 log(2*sqrt(2) + 3)
#manabitimes.jp           2*log(1 + sqrt(2)) 1.762747174039086 2*log(1 + sqrt(2))
#sokuho.yozemi.ac.jp      2*log(1 + sqrt(2)) 1.762747174039086 2*log(1 + sqrt(2))
#kaisoku.kawai-juku.ac.jp 2*log(1 + sqrt(2)) 1.762747174039086 2*log(1 + sqrt(2))
```

# 参考

https://docs.sympy.org/latest/modules/geometry/curves.html#sympy.geometry.curve.Curve.length

https://www.wolframalpha.com/input/?i=plot%5Blog%281%2Bcos%5Bx%5D+%29%2C%7Bx%2C0%2Cpi%2F2%7D%5D&lang=ja

https://www.densu.jp/kyoto/21kyotospass.pdf#page=10

https://manabitimes.jp/math/1685

https://sokuho.yozemi.ac.jp/sokuho/k_mondaitokaitou/2/kaitou/kaitou/1331507_5346.html

https://kaisoku.kawai-juku.ac.jp/nyushi/honshi/21/k01-21a.pdf#page=4
ハッカソン初心者に贈る体験レポート

# ハッカソン初心者がやるべきことをまとめてみた

## はじめに
JPHACKSというハッカソンに参加してきました。
期間は１週間、メンバーは個人参加で全員初対面です。
フルリモートで実施され、主な連絡手段はSlackとDiscordでした。

一般的なハッカソンが１日〜１週間程度の期間を設けられていることから、比較的長期のハッカソンでした。

## 対象者
この記事は下記のような人を対象にしています。

- ハッカソン１回目に挑戦する方
- 以前のハッカソンが失敗に終わってしまった方

## 結論
ハッカソンの極意は３つだけです。

- アイデア出しが全て
- 目標は「モノづくり」であって技術のお披露目会ではない
- チーム内の雰囲気作りやミーティングの生産性がとても重要

それでは本文をどうぞ。

## 本文

### 生産性のあるミーティングを小時間で
ハッカソンは短い時間制限の中でユニークさを求められる。
ディスカッションや開発以外の時間は最低限に留める必要がある。
#### 時間制限とアジェンダを設定する
    - 生産性のない時間を作らない
    - 作業とミーティングのマルチタスクをしないよう、サクサク進める
#### ミーティング内で困りごとの報連相・解消を行う
    - タスクのボトルネックを解消する
    - チーム内の心理的安全性の確保を図る

### タスク管理の徹底
タスクの視覚化は私が最も取り入れるべきだと感じたツールである。
個人開発しか行なったことがない人にとっては必要性が感じられにくいツールの１つだろう。
#### タスクの切り出し・細分化
    - 機能
    - ページ
    - フロントorバック
#### タスクの優先度を決める
    - アジャイルな開発方法を設定する
    - 最低限の機能をつけた後にブラッシュアップを図る
#### タスクの視覚化
    - 手が空いている人員を作らない
    - タスクの被りを無くす
    - 進捗管理を全員で行い、ヘルプを出し合う

### 何を用いるかではなく、何を作ったか
私たちは３日間バックエンドの言語と格闘し、残り２日になった時点でfirebaseを取り入れてローコードな開発に着手した。
最大の反省点は、制作物ではなく技術に固執したところであったように思う。
#### 難しいことをする必要はない
    - 短い時間で課題解決するのに難しい技術を詰め込むことはできない
    - シンプルな実装ができればそれが最良
#### アイディア出しが成功の全て
    - ハッカソン成功の秘訣は優れたアイデアを生み出すこと
    - フレームワークを最大限活用すべき
        - デザインシンキング
        - ペルソナ
#### 言語選択に時間を取られるな
    - とりあえず課題が解決できて動けばOK
    - モノを作るのが目標。技術力の勝負ではない。

## おわりに
ハッカソン初心者がやりがちなことについてまとめました。
個人的にインターンと同じぐらいハッカソンの経験も重要な気がします。あと楽しい。

本文にもう一つ付け足すとすれば<b>徹夜は生産性サイアク</b>ということでしょうか。
計画的な開発スケジュールと体調には気をつけてください。

最後までご覧いただきましてありがとうございました。

## 参考記事
[プログラミング初心者のためのQiita記事投稿テンプレート](https://qiita.com/YutaManaka/items/611069745ff0f68af879)
論文メモ：Human pose estimation using deep consensus voting

# 論文
**論文名**
*Human pose estimation using deep consensus voting*

**著者**
*Ita Lifshitz, Ethan Fetaya, and Shimon Ullman*

**学会**
*ECCV2016*

https://arxiv.org/abs/1603.08212

# 概要
　人物姿勢推定に興味があることは変わりないが、画像内で人物と評価された領域での各位置がキーポイントらしいところに投票をするという新しい手法。このアプローチは画像全体からの情報を用いることができ、画像依存のキーポイント結合確率を得る。複数のデータセットにおいて競争力のある精度を示す。

結合確率：同時確率
コンセンサス投票：？？

# 貢献
- キーポイント’投票’に対して深層畳み込みニューラルネットワークを適用
- キーポイント投票法という画像依存により複数のキーポイントに寄与することができる信頼度の高いアプローチを提案
- 複数のデータセットにおいて最先端手法に匹敵する精度達成
- キーポイントのローカライズにL2損失を用いるのではなくlog-polar binsを用いる（？）
- 複数の投票を高速に集約するための畳込み適用（？）

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/06313c06-bac4-28ce-bac4-2d1d8ccb86b9.png', width=500>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/7900aa9d-aeb2-ea96-e126-7f7e24a8f5bb.png', width=500>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/802eef79-a06f-c9c0-58c9-eaa663016b4f.png', width=500>
> Ita Lifshitz, Ethan Fetaya, and Shimon Ullman. Human pose estimation using deep consensus voting. In ECCV, pages 246–260, 2016.

log-polar：？？
# 評価
- MPⅡデータセットにおいて、最先端手法と張り合えている
- LSPデータセットにおいて、最先端手法と張り合えている

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/14ee7827-5872-a011-60d6-61198a8a2a29.png', width=500>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/30be3d47-938d-d8dc-ee4f-9418ae66a8df.png', width=500>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/b62d5486-4acc-7247-9603-3b3c0c310012.png', width=500>
> Ita Lifshitz, Ethan Fetaya, and Shimon Ullman. Human pose estimation using deep consensus voting. In ECCV, pages 246–260, 2016.

LSP：様々なスポーツをしている人の画像2000枚、訓練1000枚、テスト1000枚。14個のキーポイント。
PCP：四肢の検出を測定する指標。四肢の予測座標と正解座標のユークリッド距離が四肢の長さの半分以内であれば検出成功とみなす。値は検出率（であろう）。
zapierでアクションの発生時間を取得する方法

## 概要
zapierで「アクションがあった時間をスプレッドシートにデータとして入れたい！」ってなった時のメモ。
[ここ](https://zapier.com/help/create/customize/insert-the-time-your-zap-runs-into-a-field)に全て書いてあった。

## やり方
`{{zap_meta_human_now}}`と書くと、アクションがあった日にちを入れることが可能。
タイムゾーンは右側の`Setting`から設定できる。
![スクリーンショット 2021-11-09 19.11.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182163/16453f1a-ca9d-0c80-4893-eb8399d85a92.png)
linux unzip

tar.gz
圧縮
tar -zcvf xxxx.tar.gz directory
解凍
tar -zxvf xxxx.tar.gz

tar.bz2
圧縮
tar -jcvf xxxx.tar.bz2 directory
解凍
tar -jxvf xxxx.tar.bz2

tar.xz
圧縮
tar -Jcvf xxxx.tar.xz directory
解凍
tar -Jxvf xxxx.tar.xz

tar
圧縮
tar -cvf xxxx.tar directory
解凍
tar -xvf xxxx.tar

zip
圧縮
zip -r xxxx.zip directory
解凍
unzip xxxx.zip
お菓子辞典（改）～お菓子様降臨しました～ #HTML #WebSpeechAPI 

#お菓子様を降臨させたい
LINE Botから続くお菓子プロジェクトの第三弾として、ついにお菓子様を画面上に呼びたいと思います:lollipop::angel_tone1:
ただ単純にお菓子をピックアップするだけでなく、ピックアップしたお菓子を読み上げられたら、文字が読めない小さい子供も楽しめるはず！
また、前回より機能をWebアプリに変更しているため、PCもスマホも楽しめる仕様にしました。

＜前回記事＞

https://qiita.com/ikumi623/items/be75e4e7ae24f24c7835

#お菓子辞典（改）のご紹介
https://twitter.com/momoiku3/status/1458003273005223938


https://lucid-pike-7bf1cd.netlify.app/


#作り方
##環境
・CodePen
・Netlify
・[背景](https://tipsy.github.io/bubbly-bg/)
　  [→使い方](https://www.webcreatorbox.com/tech/javascript-particles)
・[お菓子の虜API](https://sysbird.jp/toriko/webapi/)
・[Web Speech API](https://developer.mozilla.org/ja/docs/Web/API/Web_Speech_API/Using_the_Web_Speech_API)  ←New
・[qrcode](https://www.npmjs.com/package/qrcode)　←New

##プログラム

###プログラム全体
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="gOxzyaR" data-user="ishikawaikumi" style="height: 300px; 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/ishikawaikumi/pen/gOxzyaR">
  お菓子音声版作業用</a> by IshikawaIkumi (<a href="https://codepen.io/ishikawaikumi">@ishikawaikumi</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

###ボタンを押したら画面上の文字を読ませたい
スナックをサンプルとして掲載しています。
読ませたい値をsay関数にセットして呼び出しています。
＜JavaScript側＞

```javascript
//スナック用  ボタンを押したときの処理
    //商品名を発話用関数に渡す。
    let sayData = sweetsData.item.name;
    sayData= "今回のお菓子は・・・" + sayData + "・・・です。これはおいしそうだね！";
    console.log(sayData);
    
    say(sayData);

```

```javascript
//渡された値を元に喋らせる所

// ここでSpeech APIの準備をします。
let speech = null;

window.addEventListener('DOMContentLoaded', async function() {
  console.log('DOMの構築が完了しました');
  // 発話の準備
  speech = new window.SpeechSynthesisUtterance();
  speech.lang = 'ja-JP';
  // または、ブラウザが対応している言語のうちja-JPな最初のボイスを使う
  window.speechSynthesis.onvoiceschanged = () => {
    const voices = window.speechSynthesis.getVoices();
    speech.voice = voices.find(voice => voice.lang == 'ja-JP');
    console.log(speech.voice);
  };
})

//引数で受け取った内容を喋らせる
async function say(text) {  
  return new Promise((res) => {
    speech.text = text;
    speech.onend = () => res();
    speechSynthesis.speak(speech);
  });
}

```

###簡単にスマホでサイトを開きたい
ボタンでURLを画面上に表示するように設定しました。

＜HTML側＞
画面下部に表示されるよう、一番最後に記述しています。

```html
<p>
  <button onclick="generateQR()">スマホでも楽しめる</button>
  <br>
    <canvas id="gen" width="30" height="30"></canvas>
</p>
```

＜JavaScript側＞

```javascript
// ボタンクリックでQRコード生成
function generateQR() {
  // 生成先のcanvas要素
  const canvas = document.getElementById('gen');
  // もととなる文字列データをとってくる
 const data = "https://lucid-pike-7bf1cd.netlify.app/"
  // QRコード生成する
  QRCode.toCanvas(canvas, data, (error) => {
    if (error) console.error('生成時エラー発生:', error);
    console.log(`「${data}」をQRコード化しました`);
  });
}
```

###スマホのブラウザのサイズに合わせたい
タブのサイズをピクセル指定だと、スマホで表示すると横にスクロールしないと見えなくなってしまったので、パーセント指定として、画面サイズの何パーセント表示という形にしました。
＜CSS＞

```css
$tabwidth:95%;
```

#いつかチャレンジしてみたい
ARの技術を使って、お菓子を手の上に載せたい
例えば、マカロンを手の上に載せて愛でたい:relaxed:
LACP とは

## 勉強前イメージ

なんだっけ・・・忘れた
けどなんかのプロトコルだった気がする

## 調査

### LACP とは

Link Aggregation Control Protocol の略で、リンクアグリゲーションで使われるプロトコルです。
元々ciscoでは `EtherChannel` という用語で同様のことを行われており、IEEE802.3ad で標準化されています。

### そもそも リンクアグリゲーション とは

複数の物理ポートを束ねて、一つの論理ポートとして扱う技術で
例えばSWの `Gi1/0/1` と `Gi1/0/2` を束ねて使用すると、どちらも1Gbpsのポートなので
2Gbpsの帯域幅になるイメージです。

また、2台のSW間では最大8本の物理ポートを1つの論理ポートとして扱えます。
ポートに関してもFastEthnetでもGigabitEthernetでも可能です。
複数の物理ポートに障害が発生しても他のポートで通信ができるので耐障害性が高まります。
SW間だけでなく サーバとSW間 でも可能です。

### リンクアグリゲーション の気をつける点

いくつか気をつける点があり、以下になります。

- 全二重通信に対応している
- VLAN使用時は同じVLANを使用しないといけない
- アグリゲーションにできるのは同じ速度のポート同士のみ

なので、半二重通信の設定のNICは出来なかったり
100Mスイッチと1Gスイッチでのリンクアグリゲーションは多分使えないのではないかと思います。

## 勉強後イメージ

そもそもリンクアグリゲーション設定したことあるけどあんまり知らなかった話。
気をつけることはいくつかあるけど、まぁ基本的には同じようなSW・ポートで括ろうねってことかな。

## 参考

- [Link Aggregation](https://www.infraexpert.com/study/etherchannel.html)
- [LACP 【Link Aggregation Control Protocol】 IEEE 802.3ad](https://e-words.jp/w/LACP.html)
【Bootstrap】長文を「...」を使って省略する方法

#はじめに
今回は、テキストを全て表示せずに省略したいなってときに使える方法についてまとめます。
といっても、Bootstrapを使ったら一瞬なのですが、、、

#text-truncate

```php:index.blade.php
<div class="row">
   <div class="col-6">
       ---省略---
   </div
   <div class="col-6">
       <h3>{{ $menu_name }}</h3>
       <p class="text-truncate" style="max-width:200px;">{{ $ing }}</p>
   </div>
</div>
```

このように、`text-truncate`を使うと、指定した幅で文章が切られ、その代わりに`...`が表示されることになります。
`max-width`を指定しなくても、要素の幅で切られるので問題なく動作します。

![スクリーンショット 2021-11-09 18.07.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1697283/31cffa70-930f-5665-997a-fc070154dc71.png)

インラインレベルでの動作は未確認ですが、`d-inline-block`クラスを追加したり、`max-width`を指定したりする必要があるようです。

#引用
https://getbootstrap.jp/docs/5.0/helpers/text-truncation/
【忘備録】ライブラリの依存関係を表示する（特定ライブラリを外す）


ライブラリの依存関係を表示する

./gradlew :app:dependencies

こんな感じで依存関係が表示される

```
+--- com.google.firebase:firebase-config:21.0.1
|    +--- com.google.android.gms:play-services-tasks:17.0.2 -> 17.2.0 (*)
|    +--- com.google.firebase:firebase-abt:21.0.0
|    |    +--- com.google.android.gms:play-services-basement:17.0.0 -> 17.5.0 (*)
|    |    +--- com.google.firebase:firebase-common:20.0.0 (*)
|    |    +--- com.google.firebase:firebase-components:17.0.0 (*)
|    |    \--- com.google.firebase:firebase-measurement-connector:18.0.0 -> 19.0.0 (*)
|    +--- com.google.firebase:firebase-common:20.0.0 (*)
|    +--- com.google.firebase:firebase-components:17.0.0 (*)
|    +--- com.google.firebase:firebase-installations:17.0.0 (*)
|    +--- com.google.firebase:firebase-installations-interop:17.0.0 (*)
|    \--- com.google.firebase:firebase-measurement-connector:18.0.0 -> 19.0.0 (*)
```


特定のライブラリから除外する場合

```
implementation ("com.google.firebase:firebase-config:1.0.0")　{
    exclude group: 'com.google.android.gms', module: 'play-services-tasks'
}
```

or

```
implementation ("com.google.firebase:firebase-config:1.0.0")　{
    exclude group: 'com.google.android.gms'
}
```
Bat 繰り返し処理での遅延環境変数

Batファイル作成でFor文中でif文の条件分岐を行おうとしたときの備忘録です

For文で繰り返し処理を行う必要があったのですが、For文内で代入した値が更新されませんでした。
コマンドプロントでは、if/forなどのブロックを実行する際、ブロック実行前にブロックの読み取り、変数を値に展開、実行という順番で実行されるためこのような現象が起きます。

調べたところ<b>環境遅延変数</b>を使用するよいとのことでした。
遅延環境変数は名前の通り変数から値への展開が遅れて実行される変数のことです。

例えばFor文の中で条件によってCopy先を変更する場合、以下のように記述すると'dest'に正しく値が代入されず、Desktopに移動してしまいます。

```Error.bat
@echo off
Set org="Org"
Set dest=
cd C:\Users\XXXXX\Desktop\%org%

for %%a in (*) do (
	if exist ..\Dest1 (
		set dest="Dest1"
	) else (
		set dest="Dest2"
	)
	move %%a ..\%dest%
)
```

遅延環境変数を使用する場合はfor/ifブロック内部で変数読み取り時に`!dest!`のように記述し、ファイル先頭に`Setlocal enabledelayedexpansion`を追記します。変数読み取り時に代入した値が反映され、目的のフォルダにファイルを移動させることができました。

```modified.bat
@echo off

setlocal enabledelayedexpansion

rem File Copy
Set org=Org
cd C:\Users\XXXXX\Desktop\%org%
for %%a in (*) do (
	Set dest=
	if exist ..\Dest1 (
		set dest="Dest1"	
	) else (
		set dest="Dest2"
	)
	move %%a ..\!dest!
)
```

```:Result
        1 個のファイルを移動しました。
        1 個のファイルを移動しました。
        1 個のファイルを移動しました。
        1 個のファイルを移動しました。
```
Xcode のSimulator に旧iOS のイメージを追加する[Big Sur]

<!-- wp:paragraph -->
<p>Xcode のSimulator を使って，iPad OS 14 を動かしたかったのだけど，Xcode インストール時には最新のiOS 15 しか用意されていなかった．</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ネット上の情報とはUI とか色々変わっていて，古いOS の追加方法が分からなかったのでメモ．</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>前提</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>使用しているMacBook Pro のOS はBig Sur 11.5.2, インストールしたXcode はVersion 13.1 です．</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>結論</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>旧OS の一覧がネット上でよく見る情報と異なっていました．</p>
<!-- /wp:paragraph -->

<!-- wp:list {"ordered":true} -->
<ol><li>Xcode を開き，メニューからXcode > Preferences を選択</li><li>Components タブを選択</li></ol>
<!-- /wp:list -->
![Screen Shot 2021-11-09 at 17.49.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532781/2be029b7-cd17-7e88-1f80-2a851d03f4f5.png)

<!-- wp:paragraph -->
<p>するとOS イメージの一覧が表示されます．</p>
<!-- /wp:paragraph -->
![Screen Shot 2021-11-09 at 17.43.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532781/ffe9d986-21f4-dcf7-5687-5c41b48a59dc.png)

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>OS名の左にある矢印アイコンからダウンロードできます．</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p></p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>余談</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>どうでもいいけどXcode 12GB って果てしなく容量食いますね．これのインストールで半日潰れました．</p>
<!-- /wp:paragraph -->
特性関数ってなに？〜性質だけは知ろう〜

# 特性関数ってなに？

統計学が専門でなくとも使い所がありそうな特性関数の出番を２つ紹介します。

## まず定義
> Def.(特性関数)
> 確率変数$X$に対し,
> $$\phi(t) = E[e^{itX}]\ (t\in \mathbb{R})$$
> を**特性関数(characteristic function)**と呼ぶ。

（補足）

1. $X$の密度関数$f(x)$が存在するときは$\phi(t) = \int e^{itx}f(x)dx$で計算できる.
1. 意味的には元の密度関数$f(x)$の（逆）Fourier変換.
1. ちゃんと書くと$\phi(t) = E[\cos{tX}]+iE[\sin{tX}]$. $\cos$も$\sin$も可積分なので**期待値はいつもちゃんと存在する**. これはデカい.
1. $X$が$\mathcal{H}$-valuedでも同様に拡張できる. すなわち$\phi(t) = E[e^{i<t,X>}]\ (t \in \mathcal{H})$.
1. 特性関数と分布は1対1対応. これもありがたい. （証明はFourier変換の一意性とかで)

## 性質① k次モーメントの計算
$$\phi^{(k)}(0) = i^k E[X^k], (k)は連続微分回数 $$

```
（ポイント）微分と期待値（積分）の交換を使っている. そのための条件として可積分な関数で導関数が一様に上から抑えられることが必要. そこで$|X|^k$の可積分性は仮定しておく.
```

モーメントが楽に計算できるから, 平均とか分散とか歪度とか尖度とか・・・も楽々計算できますね.

<details><summary>(例)正規分布$N(\mu,\sigma^2)$の特性関数の導出</summary><div>
確率密度函数は$f(x;\mu,\sigma^2) = \frac{1}{\sqrt{2\pi \sigma^2}}\exp{-\frac{(x-\mu)^2}{2\sigma^2}}$. 定義どおり計算して
$\phi(t) 
= \int_{-\infty}^\infty e^{itx}\frac{1}{\sqrt{2\pi \sigma^2}}\exp{\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)} dx 
= \frac{1}{\sqrt{2\pi \sigma^2}}\int dx \exp{\left(-\frac{x^2-2\sigma^2 itx-2\mu x+\mu^2}{2\sigma^2}\right)} 
= \frac{1}{\sqrt{2\pi \sigma^2}}\exp{(it\mu -\frac{\sigma^2t^2}{2})}\int dx \exp{\left(-\frac{(x-(\mu+\sigma^2it))^2}{2\sigma^2}\right)} 
= \frac{1}{\sqrt{2\pi \sigma^2}}\exp{(it\mu -\frac{\sigma^2t^2}{2})}\times \sqrt{\frac{\pi}{1/2\sigma^2}}
= \exp{(it\mu -\frac{\sigma^2t^2}{2})} 
$
（ガウス積分を用いる）
</div></details>

## 性質② 独立な確率変数の和
$S_n=X_1+X_2+\cdots+X_n$の特性関数は
$$\phi(t) = E[e^{itS_n}] = \Pi_{i=t}^n \phi_i(t)$$
のようにそれぞれの特性関数の積となる.

### よくある間違え
Xの分布がP, Yの分布がQであるとき
- (×) X+Yの分布はP+Qにしたがう.
- (○) X+Yの分布は P＊Q（**畳み込み分布**）にしたがう.

畳み込み分布の積分計算は若干大変なので、こういうときに特性関数が役に立ちます. 積を計算すればよいので.
AfterEffects セルパターン

■セルパターン
新規コンポジション
新規->平面ホワイト
セルパターンをつける。(エフェクト)

![スクリーンショット 2021-11-09 17.18.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/4ed4fbcc-e986-361c-a4fc-c8545e8d783e.png)

▼セルパターンをプレートに変更
![スクリーンショット 2021-11-09 17.19.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/8cda146b-56f7-3cb8-ed94-658219d38936.png)

![スクリーンショット 2021-11-09 17.19.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/45df0fb4-4218-5a09-dcaa-66a196567437.png)

▼分散を0に

![スクリーンショット 2021-11-09 17.21.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/72667cf5-f99a-5c32-5828-2dfb0eaf64af.png)

▼サイズ180に

![スクリーンショット 2021-11-09 17.22.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/576c0e5b-de2b-274c-c42f-d50a425888df.png)

▼展開のエクスプレッションにtime*3000
これでモザイクのようなチカチカしたアニメーションになる。
![ちかちか.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/a0b5c51e-7494-d1fb-4cc5-f7a2f7eb648c.gif)

#■レベル補正
ヒストグラムをいじり始まりを白にキーフレームを打つ
![スクリーンショット 2021-11-09 17.30.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/a21bee6a-1072-4f13-11a9-853c959abcbf.png)

上のバーの▼を全体的に左に


1秒後ぐらいで逆に黒にする。キーフレームを打つ。
![スクリーンショット 2021-11-09 17.30.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/236b141d-6530-c3f7-1abe-10241aaed29a.png)

すると下記のようなアニメーションになる。

![ちかちか暗く.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/122d0aec-4443-995d-ecf0-c363d0dc6c59.gif)


後はアニメーションを使いたいアイテムを下につけトラックマットをルミナンス反転マットにする。
サイズの調整。

![ちかちか丸.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1558142/9f03f5d4-5252-435a-e142-44927369751c.gif)


■参考Youtube
https://www.youtube.com/watch?v=M8kH_rb2GM0
ターミナルでのawsコマンドを入れるのに困った

tips的な記事。

awsの学習をする際にCLI（command line interface: アクセスキーで保護）を使おうと思ったのですが、

そもそもAWS初学者であるためターミナルから[aws]コマンドのパスが通ってないので、調べました。
（いわゆる　zsh: command not found: awsのやつ）
# やったこと
## 手順1
最新版でいいや！っ思ったので、

```
pip3 install awscli --upgrade --user
```
を実行

これでおけぃ！ったなりましたが、
`aws --version` は普通にエラーでました（公式チュートリアルの意向に従ったのに。。）

## 手順2
PATHを通さないと行けないのですが、

```
export PATH=~/.local/bin:$PATH
```
で行けました

### エラーでハマったこと
記事の中には

```
export PATH=/Users/ユーザーのなまえ/Library/Python/3.7/bin:$PATH 
```
でいけるパターンもあるそうですが、自分はうまくいかなかったです


# 参考記事
[aws 実行時に「command not found (コマンドが見つかりません)」というエラーが表示される](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-troubleshooting.html#tshoot-command-not-found)
[macOS コマンドラインパスへの AWS CLI バージョン 1 の実行可能ファイルの追加](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-macos.html#awscli-install-osx-path)
[zsh: command not found: aws-mfa code example](https://newbedev.com/shell-zsh-command-not-found-aws-mfa-code-example)
BigQueryで連続した月次の日付テーブルを作成する方法

# 背景
　SQLを書いていると「月次で集計したいけど、元となる日付のテーブル日付のテーブルがない！」といったケースに当たることは多いかと思われます。ネットで調べると「任意の巨大テーブルを使って...」と言った記事もあったのですが、今回関数だけで作る方法を見つけたのでメモ的に残しておこうと思います。

# 作りたいもの
　以下のような日付が月次で並んでいるもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198985/fdaccac3-af78-f807-cb0f-fb69226cf592.png)

# SQL

```sql
WITH
  month AS (
  SELECT
    d
  FROM
    UNNEST(GENERATE_DATE_ARRAY(DATE_ADD(DATE_TRUNC(CURRENT_DATE, month), INTERVAL -5 MONTH),DATE_TRUNC(CURRENT_DATE, month), INTERVAL 1 MONTH)) AS d)
SELECT
  *
FROM
  month
```

# 感想
　何かしらテーブルをもとに作成する方法は気持ち悪さがあったので、関数のみで作成することができ気持ち悪さを除くことができました。UNNESTは使うことはあまりないですがこういうケースで便利ですね！

# 参考リンク

- [BigQueryで連続した日付のデータを生成して集計データと突き合わせる](https://swfz.hatenablog.com/entry/2021/03/08/194805)
【Nuxt.js】404エラーとその他エラーで表示させるメッセージを変える方法

#はじめに
こんにちは。
こちらの記事では、エラーが発生した際のメッセージを分ける方法を記しています。
誤っている点がございましたらコメントいただけると幸いです。

##実装手順

###1. エラーページの作成
プロジェクト直下の`layouts`ディレクトリに、オリジナルのエラーページを作成できる`error.vue`ファイルを作成する。エラーが発生すると、ここで設定したページが表示される。

>参考記事：https://nuxtjs.org/ja/docs/directory-structure/layouts

```html:layouts/error.vue
<template>
  <div id="error">
    <div>
      <p>エラーが発生しました。</p>
      <nuxt-link to="/">ホームへ戻る</nuxt-link>
    </div>
  </div>
</template>
```

これで、エラーが発生した際はこのページを表示させるのですが、`404エラー`のときだけ表示を変更したいので、次のように実装します。

###2. エラーメッセージの取得
propsを用いてエラー情報を受け取り、オブジェクトとして設定します。また、算出プロパティでエラーコードを`status`で呼び出せるようにしておきます。


```javascript:layouts/error.vue
<script>
export default {
  props: {
    error: {
      type: Object,
      default: null
    }
  },
  computed: {
    status() {
      return this.error.statusCode;
    }
  }
};
</script>
```
エラーオブジェクトの中には、以下の値が含まれています。

| 値 | 説明 |
|:-:|:-:|
|  statusCode |  エラーコードを取得（404 , 500など） |
|  message | エラーメッセージを取得  |
| path  |  エラーが発生したページのパスを取得 |


###3. エラーメッセージの使い分け
404エラーとその他エラーで表示させるメッセージを変えらるよう、`v-if`と`v-else`を使用します。propsで取得したエラーコードも、マスタッシュ構文を使って表示させます。

```html:layouts/error.vue
<template>
  <div id="error">
    <div>
      <p v-if="status === 404">URLにお間違いがないかご確認ください。</p>
      <p v-else>恐れ入りますが再度お試しください。</p>
      <p>{{ status }}エラー</p>
      <nuxt-link to="/">ホームへ戻る</nuxt-link>
    </div>
  </div>
</template>
```

<img width=“200” src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966101/d7ea1f34-0241-5ee4-53c1-bf6cea3acdea.png">

このように、エラーコードによって表示させるメッセージを変えることができました。
（CSSは個別に設定してください）

>参考記事：https://hafilog.com/nuxt-error-page


<br>


#おわりに
ここまでエラーが発生した際のメッセージを分ける方法についてまとめました。
以上、最後まで読んでいただきありがとうございました！
よければLGTMを押してくれると嬉しいです！
【AWS】踏み台サーバの構築方法について(SSH転送)

#踏み台サーバとは
踏み台サーバとは、SSH接続を利用し特定ポートの転送をすることで、目的のサーバにアクセスする技術。(SSHポートフォワーディングとも)
AWSなどクラウド環境ではよく利用する技術。

#流れ

1.EC2インスタンスを作成する。
2.セキュリティグループを設定する。
3.接続確認

※VPC作成等については別に記載する。

以上、非常に簡単。

#具体的な手順

①インスタンス生成
とりあえず、Linuxで作成する。
一例としてCentOS
※最小構成でよい

②作成したEC2のセキュリティの編集
接続させるポートのインバウンドを編集する

③接続出来たら完成

接続に失敗してる場合はクライアントツールなどの設定を見直すと解決する。
Reactでeslintの初期設定をする方法（設定メモ


## React サンプルアプリケーションを作成

```sh
$ npx create-react-app sample-app
$ cd sample-app
```

## eslintのインストールと初期設定

```sh
$ npm i --save-dev eslint
$ npm i --save-dev eslint prettier eslint-config-prettier
$ npx eslint --init
✔ How would you like to use ESLint? · style
✔ What type of modules does your project use? · esm
✔ Which framework does your project use? · react
✔ Does your project use TypeScript? · No / Yes
✔ Where does your code run? · browser
✔ How would you like to define a style for your project? · guide # Use a populer style guide.
✔ Which style guide do you want to follow? · airbnb
✔ What format do you want your config file to be in? · JSON
Checking peerDependencies of eslint-config-airbnb@latest
The config that you've selected requires the following dependencies:

eslint-plugin-react@^7.21.5 eslint-config-airbnb@latest eslint@^5.16.0 || ^6.8.0 || ^7.2.0 eslint-plugin-import@^2.22.1 eslint-plugin-jsx-a11y@^6.4.1 eslint-plugin-react-hooks@^4 || ^3 || ^2.3.0 || ^1.7.0
? Would you like to install them now with npm? › No / Yes
```

## 設定ファイル

ルールに以下を追加する。

```js:.eslintrc.json
{
    "rules": {
        // 関数を呼び出し元よりも前に書くルールを無効化する。
        "no-use-before-define": 0,
        // js, jsxどちらでも利用できるようにする。
        "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }]
    }
}
```

## VS Code の設定

### プラグインをインストールする。

#### ESLint
https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint

ESLintのプラグインは、ESLint と VS Code を連携させてリアルタイムでエラー検出ができるようになります。

#### Prettier - Code formatter
https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode

Prettier プラグインには prettier 本体がバンドルされており、プラグイン単体でもコード整形機能がある。（npmでのインストールが必須ではない）
ただ、npm で prettier がローカルインストールされている場合は、そちらを優先して使用するようになっているようです。

### 保存時に自動でフォーマットする。


設定時は「user」タブではなく「workspaces」を選択して設定すること。
「user」を選択した状態で設定するとvscode全体の設定になってしまいます。

設定の検索欄から「onsave」を検索。
「Format On Save」という項目にチェックを入れる。

設定の検索欄から「format」を検索。
「Default Formatter」という項目に「Prettier - Code formatter」を選択する。

vscodeのsettings.jsonが以下のようになっていることを確認。

```json:.vscode/settings.json
{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode"
}
```
ツリー図記号

| 読み方            | 記号              |
|:--------------------|:--------------------|
| たて        | │
| たてひだり  | ┤
| たてみぎ    | ├
| ひだりうえ  | ┌
| ひだりした  | └
| ふとわく    | ┏┳━┓┗┻━┛
| ほそわく    | ┌┬─┐└┴─┘
| まんなか    | ┼
| みぎうえ    | ┐
| みぎした    | ┘
| よこ        | ─
| よこうえ    | ┴
| よこした    | ┬
論文メモ：PoseFix: Model-agnostic General Human Pose Refinement Network

# 論文
**論文名**
*PoseFix: Model-agnostic General Human Pose Refinement Network*

**著者**
*Gyeongsik Moon, Ju Yong Chang, and Kyoung Mu Lee*

**学会**
*CVPR2019*

https://openaccess.thecvf.com/content_CVPR_2019/html/Moon_PoseFix_Model-Agnostic_General_Human_Pose_Refinement_Network_CVPR_2019_paper.html


# 概要
　入力画像と他モデルのポーズ推定出力を入力とすることによってポーズ推定をリファインメントするネットワークPoseFix。エンドツーエンドの２D人物姿勢推定モデルは効率的ではあるが慎重な設計が必要不可欠である。そこで、最先端の２D人物姿勢推定モデルが似通った誤差分布を所持ていることに着目し、それを事前情報として活用する構造になっている。結果として、最先端のポーズ推定手法の性能を一貫して向上させることに成功。
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/d59896a1-06ab-dd66-ad03-961200bc3c52.png', width=500>
> Gyeongsik Moon, Ju Yong Chang, and Kyoung Mu Lee. Posefix: Model-agnostic general human pose refinement network. In CVPR, pages 7773–7781, 2019.

Model-agnostic：モデル非依存。要するに、根幹は機械学習手法と切り離されているからどんな手法にも適用できますよってこと？柔軟性が高い？（https://hacarus.github.io/interpretable-ml-book-ja/agnostic.html）
リファインメント：精製、精練、洗練、上品、高尚、優雅、改善(個所)、改良(点)。要するにより良くするということかな。

# 貢献
- ポーズ推定モデルとは独立に学習されるPoseFixは誤差統計に基づいており、ポーズリファインメントが可能
- 任意のポーズ推定モデルの出力を入力として受け取ることができる柔軟性とアクセス性
- ポーズリファインメントを成功させるためのcoarse-to-fine pipelineの重要性の提示
- 従来の最先端手法の性能を一貫して向上

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/dcd7eafe-3bdc-c949-20d2-5a68bb5a7396.png', width=500>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/c0d3fae9-4096-7ee3-fd3d-8193ae9b5d8c.png', width=800>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/e5a6c239-b9f5-6c68-fc33-b127fa2d8f32.png', width=500>

>Gyeongsik Moon, Ju Yong Chang, and Kyoung Mu Lee. Posefix: Model-agnostic general human pose refinement network. In CVPR, pages 7773–7781, 2019.

coarse-to-fine：coarseは粗いという意味で、それをfineにするのだからあえて粗いものを入力することによってよりリファインメントされるということをこの研究においては示している（のだと思う）。事実、図にあるように他ポーズ推定手法からあえて誤差を加える？ことによって粗い入力を作成しているように思う。ググるとそれなりにこの方法に着目した研究は存在する。

# 評価
- COCOでの評価
- 従来のポーズ推定手法が固定のリファインメントモデルよりも成功
- 検証セットにおいてcoarse-to-fine pipelineが最も有効であることを確認。当時最先端手法のCPNをベースラインとしてリファインメント成功か否かをチェック
- 特にOKSが入力時に低かったものは改善されており、大きな変位誤差（データ拡張？？）もより補正する
- 挙げられている従来手法はほぼ完ぺきにリファインメント成功

<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/45b56cd6-6bc6-fbaa-90d5-17c415c74cf7.png', width=500>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/fd1f402c-9beb-d364-b2c7-d60aa32c9b2c.png', width=500>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246925/5b7cf6fa-faf5-c129-581e-d0717d1b5122.png', width=700>
>Gyeongsik Moon, Ju Yong Chang, and Kyoung Mu Lee. Posefix: Model-agnostic general human pose refinement network. In CVPR, pages 7773–7781, 2019.

OKS：Object Keypoint Similarity。アノテーションされている関節点についての推定座標と正解座標の類似度の平均を表す値（https://engineer.dena.com/posts/2019.11/cv-papers-19-2d-human-pose-estimation/）。
ReactでHello worldを表示してみる

①コマンドプロンプトでcreate-react-app helloworld を実行し、プロジェクトを作成する。
→プロジェクト名は全て小文字でないとエラーが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266054/9b9fc3ee-2cb2-bbea-93b5-5b31aeec79de.png)

②先ほど作成したhelloworldというプロジェクトに移動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266054/2f57467f-a049-1d71-d9de-b26e60645f1e.png)


③src配下のApp.jsを以下のように書き換え保存する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266054/38f93835-fdcd-7b80-e6f9-a520074e4d86.png)


④コマンドプロンプトでhelloworldというプロジェクトに移動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266054/61e4aa14-64c7-ad89-25fa-e83e4188e04f.png)

⑤yarn start を実行し、プロジェクトを開始する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266054/07e6c456-33ea-2e32-efab-4ecb277b7173.png)

⑥ブラウザにHello Worldが表示されているか確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266054/9439bfc7-495c-2d49-7e4b-43610689c0b9.png)