OmniAICreator/Qiita-1.07M huggingface dataset:
clangのオプションで便利に使ってるもの

[clang](https://clang.llvm.org/) で特にリリースビルドではなくてプログラムの間違いを探したいときに使っているコマンドラインオプションです。clang 13で確認。いつかgccで対応する記事を書きたい…

# 一般的オプション
<dl>
<dt>-ftrivial-auto-var-init=pattern</dt>
<dd>未初期化の自動変数や自動配列を変な値で初期化する。これで未初期化関連の誤りをかなり見つけられる</dd>
<dt>-D_FORTIFY_SOURCE=2</dt><dd>glibcのエラーチェックを有効にする</dd>
<dt>-pipe -fuse-ld=lld -fintegrated-as -fintegrated-cc1</dt>
<dd>LLVMリンカーやclang内蔵アセンブラを用いる</dd>
<dt>-Wall -Wextra</dt>
<dd>警告をたくさん出す。-O1以上の最適化を指定しないと未使用変数を教えてもらえない
<dt>-Wtautological-compare -Wsign-compare</dt><dd>変な比較に警告をする</dd>
<dt>-gfull -fstandalone-debug -gdwarf-5 -gz</dt>
<dd>デバッグ情報を目一杯付加する。デバッグ情報をDWARFバージョン５形式で書き出し圧縮する</dd>
<dt>-O3 -mllvm -polly</dt>
<dd>最大限の最適化</dd>
<dt>-march=native または -mcpu=native</dt>
<dd>clangを動作させているCPUに合わせた最適化を行う。インテル系CPUのときはmarchを用いる</dd>
</dl>

#LTO (Link Time Optimization関連)
<dl>
<dt>-flto=full -fwhole-program-vtables -fforce-emit-vtables -fvirtual-function-elimination</dt>
<dd>LTOを使う</dd>
<dt>-ffunction-sections -fdata-sections -Wl,--gc-sections</dt>
<dd>使われていない関数や大域変数を削除する</dd>
<dt>-faddrsig -Wl,--icf=all</dt>
<dd>重複している同一のコードをまとめる。LLVMリンカーでしか使えない</dt>
</dl>

#スタック保護関連
<dl>
<dt>-fstack-protector-all -fstack-clash-protection</dt><dd>stack-clash-protectionはインテルCPUのみ</dd>
<dt>-fsanitize=safe-stack</dt><dd>アドレスサニタイザーとは同時に使えない</dd>
<dt>-fsplit-stack</dt><dd>関数ごとにスタックを分ける。LLVMリンカーでは使えない<dd>
</dl>

#サニタイザー関連
##エラーが起きたときの動作
`-fno-sanitize-recover=all` サニタイザーがエラーを見つけたらプログラムを終了する。
##CFI
`-fsanitize=cfi -fvisibility=hidden` CFIの使用にはLTOが必須
## 未定義動作サニタイザ
`-fsanitize=undefined -fsanitize=integer` 整数型のオーバーフロー・アンダーフローや配列範囲外アクセスを教えてくれる。実行時の環境変数として `UBSAN_OPTIONS="print_stacktrace=1:abort_on_error=0"` を指定するとスタックトレースを表示してくれる
## アドレスサニタイザー
`-fsanitize=address -fsanitize-address-use-after-scope -fsanitize-address-use-after-return=always -fsanitize-address-use-odr-indicator -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-common` ポインタ関連の色々なエラーを実行時に教えてくれる。実行時の環境変数に `ASAN_OPTIONS="detect_leaks=1:strict_init_order=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_string_checks=1:detect_invalid_pointer_pairs=2:use_odr_indicator=1:abort_on_error=0"` を設定するとよりしっかり誤りを探してくれる。[-D_FORTIFY_SOURCE と両立しない](https://github.com/google/sanitizers/issues/247) ため `-U_FORTIFY_SOURCE` を付けたほうがよい

#Linuxにおける実行ファイル生成
<dl>
<dt>-Wl,-z,noexecstack</dt><dd>自動変数や自動配列がある領域をプログラムとして実行できなくする</dd>
<dt>-fPIE -pie -fno-plt -Wl,-z,relro,-z,now</dt><dd><a href="https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E7%A9%BA%E9%96%93%E9%85%8D%E7%BD%AE%E3%81%AE%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E5%8C%96">アドレス空間配置のランダム化</a>を行う。これらのオプションの説明は<a href="https://kubo39.hatenablog.com/entry/2020/05/25/partialRELRO/fullRELRO%E3%80%81%E3%81%82%E3%82%8B%E3%81%84%E3%81%AF-fno-plt%E3%81%AE%E8%A9%B1">partialRELRO/fullRELRO、あるいは-fno-pltの話</a>を参照</dd>
</dl>

# 静的リンク (static link)
`-static -static-libsan -static-pie` を適当なところに付加する。アドレスサニタイザーの静的リンクをしてくれないから、コマンドラインの最後に `-lasan` をつける
競プロ典型90問　003 - Longest Circular Road

#問題
[競プロ典型90問　003 - Longest Circular Road](https://atcoder.jp/contests/typical90/tasks/typical90_c)

#考察


#### スコアの最大値とは
スコアは`2都市間の距離+1`となります。
つまり、スコアの最大値を求めるには2都市間の距離の最大値を求めれば良い。

#### 2都市間の最長の距離を求めるためにどうすれば良いか 
今回、N都市間にN-1本の道路があるので各都市間の行き方は1通りしかありません。よって、
最長距離になる2都市をA<sub>q</sub>,B<sub>q</sub>とすると、任意の都市から最も遠い都市はA<sub>q</sub>,B<sub>q</sub>のどちらかになります。

そこで、A<sub>q</sub>とB<sub>q</sub>の間の距離を求めるために
まず、ある任意の都市から1番遠い都市を求めます。(これがA<sub>q</sub>かB<sub>q</sub>のどちらか)
そこから一番遠い都市との距離を求めればそれが2都市間の最長距離になります。

####ではある都市からの最長距離をどのように求めるか
ここは全然わからなかったのでググりました。
BFS(幅優先探索)やDFS(深さ優先探索)というものがあるらしいです。
幅優先探索は最短距離を調べるのに良いみたいです。とりあえず今回は深さ優先探索を使ってみました。
深さ優先探索は先に行けるところまで探索して行けるところがなくなると一歩戻って探索するというようなアルゴリズムです。

#ソース

都市の番号ごとに繋がる都市を配列に読み込みます。
そして、都市1から一番遠い都市を探し出し、その都市から一番遠い都市との距離を求めます。

~~~python3
import sys
sys.setrecursionlimit(10**7)

N  = int(input())

connect = [[] for i in range (N+1)]

for i in range(N-1):
    A,B = map(int,input().split())
    connect[A].append(B)
    connect[B].append(A)

distance = [0] * (N+1)
def dfs(now,pre,dist):
    distance[now] = dist
    for i in connect[now]:
        if i != pre:
            dfs(i,now,dist+1)
dfs(1,-1,0)
maxdis = max(distance) 
for i in range(len(distance)):
    if distance[i] == maxdis:
        workCity = i
        break

distance = [0] * (N+1)
dfs(workCity,-1,0)

print(max(distance)+1)

~~~

もう少し処理をまとめて、都市の番号だけ渡すような関数を作ったらよかったかなと思いました。

あと、最初の提出で下の処理を

~~~python3
maxdis = max(distance) 
for i in range(len(distance)):
    if distance[i] == maxdis:
        workCity = i
        break
~~~

下のように書いてしまい、TLEをくらいました。
解説読んでも方針合っててDFS使うのも合ってるし、なんでだ？とめちゃくちゃ混乱しました。こういうミスは減らしていかないとですね。


~~~python3
for i in range(len(distance)):
    if distance[i] == max(distance):
        workCity = i
        break
~~~
#最後に

どうやって最長の2都市を探すかという方針は割と早めに立ったのですが、DFS等の探索するアルゴリズムを知らなかったため、ある都市からの距離を求めるという工程の実装にかなり時間がかかってしまいました。
とはいえ、あれこれ考えていたけどとりあえずDFSのコードの例を探してきて同じように書いてみればすぐACすることができたのであれこれ考える前に方針が立ったらコードを書いてみないとなと思いました。

相変わらずアルゴリズムの知識不足と実装力不足が課題ですが、競プロ典型90問をやることで解消していけないかなと思っています。

以上、最後まで読んでいただきありがとうございました。
[Android]プロローグにはコンテンツを指定できません。というエラーを解決する方法について

#はじめに
こんにちは。システムエンジニアのDiavoloです。

最近、仕事でAndroidStudioを触ることが増えてきました。当方、Androidアプリ開発をがっつり経験したことがなく、またテレワークのため、気軽に聞ける相手がいるわけでもない状態です。
そんな感じで、AndroidStudioの操作にも慣れておらず。トホホ・・・。

そんなこんなで、見慣れぬエラーに苦戦するなかで、Google先生にお伺いをたてても、すぐに解決できなかったエラーなどを備忘録として残しておきたいと考えて、この記事を書いております。

このエラーを解決するのに、2時間もかかってしまいました。

#プロローグにはコンテンツを指定できません。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321513/44d5314e-0c65-524d-c1c4-554312c1fc39.png)
ん？むむむ。さっきまで、エラーが出ていなかったのに、急にこんなエラーが出ました。プロローグって一体。rowとかcolとか、これはエクセルか？と汗

#結論。キーボードの誤入力でMainActivity.xmlに余計なsが存在してました
![無題.1png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321513/d407a9e1-4b7b-6f65-6e74-ddf2e6c73c60.png)
<RelativeLayout の先頭に不要な文字 s があることに気付きました。
どうやら、プロジェクトを保存するときに、Alt+Fからのsで保存したつもりが、sを入力していたというオチです。つまらないオチですいません。

ただ、無意識で入力しているので、気付くのに時間がかかりました。

では、また。
CircleCI×CapistranoでEC2へのSSH接続ができない場合の対処法

#前提
・CircleCIでCIを構築済
・ローカルからCapistranoを使ってEC2に自動デプロイができている

#参考にした記事
CircleCIとCapistranoを使った自動デプロイを構築するにあたって以下の記事を参考にさせていただきました。

https://qiita.com/prkrsign890/items/882b70f663f4a80ae770

https://qiita.com/YK0214/items/98bbdf7ce25c557c77a3

筆者の場合は、上記で掲出した記事の内容以外でもSSH接続に関して複数のエラーに遭遇したため、それらのエラーと対処法をまとめていきます。


#CircleCIからEC2へのSSH接続に失敗する①
EC2へのSSH接続の際に、まず下記のようなエラーが起きました。

```
Caused by:
Net::SSH::ConnectionTimeout: Net::SSH::ConnectionTimeout


Caused by:
Errno::ETIMEDOUT: Connection timed out - connect(2) for user [ユーザー名]@[ElasticIP]
```

EC2のセキュリティグループの設定でローカルIPを設定していたことが原因で、CircleCIからの接続を拒否されていました。
[こちら](https://qiita.com/naokit-dev/items/f984d271a850e3156d1c)の記事を参考に解決しました。

#CircleCIからEC2へのSSH接続に失敗する②
①を実行した後、エラー内容が変わりました。

```
Caused by:
Net::SSH::AuthenticationFailed: Authentication failed for user [ユーザー名]@[ElasticIP]
```
CircleCIの`Additional SSH Keys`にもEC2に接続するための正しい秘密鍵を登録しているのに、認証エラーとされています。
ここでどハマりしましたが、1つずつ考えられる原因を潰していきました。
結論、CircleCIにSSH接続しデバックを行うのが近道でした。

##CircleCIにSSH接続をしデバッグを行う
CircleCIの実行経過がわかるページの右上にある``Rerun``の``Rerun job with SSH``をクリックし、実行を待つと``Wait for SSH sessions``に``$ ssh -p [ポート番号] xxx.xxx.xxx.xxx``　と表示されます。
ローカルから下記コマンドを入力するとCiecleCIにSSH接続できます。

```
ssh -p [ポート番号] xxx.xxx.xxx.xxx -i ~/.ssh/[GitHubに接続する際に使用する秘密鍵]
```

[こちら](https://qiita.com/mokuo/items/1f6e35abe3845c82253b)の記事を参考にしました。
※CircleCIを無料プランで使用している場合、複数コンテナを同時にビルドすることはできないため、デバッグが終了したら``Rerun``の``Cancel Job``をクリックしてください。


CircleCIにSSH接続できたら、そこから下記コマンドを入力しEC2に接続できるか確認します。

```
ssh [ユーザー名]@[ElasticIP]
```
筆者はここでEC2への接続が成功したため、``Additional SSH Keys（秘密鍵）``は正しく動作していることが分かりました。

そこで、Capistrano設定ファイルの秘密鍵の指定が間違っているのではないかと推測し、SSH接続しているコンテナ内の秘密鍵を確認したところ（``cd ~/.ssh``→``ls``）、``id_rsa_[Fingerprintの:がない文字列]``が表示され、中身を確認したところCircleCIに登録したEC2へのSSH接続のための秘密鍵と一致しました。
筆者はCapistranoの``set :ssh_options``の``keys``に``[アプリ名]_rsa``を指定していたため、上記で確認した``id_rsa_[Fingerprintの:がない文字列]``に設定し直すことで、無事CircleCIでCapistranoを使ってEC2にSSH接続することができました！！

#まとめ
Capistranoの設定ファイルで指定した``keys``の秘密鍵ファイルが存在しない場合でも、ファイルが見つからないエラーではなく、認証エラーが出ることを学びました。
また、CircleCIに登録する秘密鍵の名前を``[アプリ名]_rsa``にする方法も調べましたが、見つけることができませんでした。
ローカルとCircleCI上では秘密鍵のファイル名が違う状態になっていますが、``keys``に環境変数を用いて秘密鍵を指定することで、ローカルからでもCircleCIからでもCapistranoによるEC2への接続を可能にしました。
金融分野における強化学習のための取引環境「trading_gym_next」の使い方


# はじめに

今日はbacktesting.pyというバックテストツールを活用した取引環境「trading_gym_next」を開発したので、その使い方について解説していきます。金融分野の取引環境をいちから開発するのはなかなか大変ですが、backtesting.pyというライブラリを活用することで、簡単にかつ強力な機能をもつ環境を実装できました。
![スクリーンショット 2021-10-16 20.26.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251551/7ecf9ba1-650b-61e3-e706-2693b296c8a7.png)


GitHubはこちらです: 
[https://github.com/RuiHirano/trading_gym_next](https://github.com/RuiHirano/trading_gym_next)

# Install
インストールは簡単で以下のコマンドでpipから取得できます。

```
pip install trading_gym_next
```

# Quick Start
Exampleとしてデフォルトの環境をそのまま使うもの、環境をカスタマイズしたもの、バックテスト評価を行うものの三つ用意しました。
それぞれ試してみてください。

```
cd examples
python simple_env.py
python custom_env.py
python backtest.py
```

# 解説
基本となるコードについて解説していきます。

```
from backtesting.test import GOOG
import random
from trading_gym_next import EnvParameter, TradingEnv

param = EnvParameter(df=GOOG[:200], mode="sequential", window_size=10)
print(GOOG)
env = TradingEnv(param)

for i in range(20):
    print("episode: ", i)
    obs = env.reset()
    for k in range(10):
        action = random.choice([0,1,2])
        next_obs, reward, done, info = env.step(action, size=1)
        print("obs", obs.tail())
        print("action: ", action)
        print("date: {}, reward: {}, done: {}, timestamp: {}, episode_step: {}, position: {}".format(info["date"], reward, done, info["timestamp"], info["episode_step"], info["position"]))
        print("next_obs", next_obs.tail())
        print("-"*10)
        obs = next_obs
print("finished")
stats = env.stats()
print(stats)
```
基本的にはgym環境をラップしているのでgymを利用したことのある人であればすぐに使えると思います。
env.reset()で環境を初期化し、env.step()でエピソードを進めていきます。

env.step()の引数だけ少し変わっています。actionの値は0,1,2で(何もしない、買い、売り)と指定でき、オプション引数にsize(数量)、limit(上限価格),stop(下限価格),sl(stop loss), tp(take profit)を指定できるようになっています。

またenv.stats()で統計結果、env.plot()で可視化が可能になります。ただ、こちらは最後のエピソードの結果のみを計算するので、backtestモードで使用するのが主になると思います。


# さいごに
そのほかの詳しいオプションについてはGithubのREADMEまたはbacktesting.pyなどを参考にしてください。
金融分野の強化学習に興味を持っている人の助けになれれば幸いです。
動画用L枠（いわゆるbiimシステム）をSVGファイルとImageMagickで作ってみた

# 概要

<a href="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/2308cc52-4475-8345-56d8-a31fae95172d.png">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/2308cc52-4475-8345-56d8-a31fae95172d.png" width="160" height="90">
</a>の PNG 画像を SVG ファイルと ImageMagick で作った。

## なぜ SVG ファイルを使ったか

L枠のサイズを自分で試行錯誤したかった。
ニコニ･コモンズなどで作品はたくさんある。だが、試行錯誤するには探すのが手間だった。
Adobe Illustrator で作成も行った。だが、試行錯誤という点でGUI操作は手間だった。Illustrator の操作に習熟していないのもある。
単純な矩形の組み合わせなので ImageMagick の `convert` コマンドでも画像の作成は可能。だが、枠線など考えると操作が煩雑になりそうだった。

テキストファイルの SVG ファイルがいいのではないかと考えた。

- 参考
  - [タグ検索: biimシステム - ニコニ･コモンズ](https://commons.nicovideo.jp/search/tag/biim%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)

# やったこと

1. SVG ファイルを用意
1. ImageMagick で SVG ファイルを PNG ファイルに変換

## SVG ファイルを用意

1600_900.svg という名前で以下の内容の SVG ファイルを作成。

```xml
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" id="layer1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
	x="0px" y="0px" viewBox="0 0 1920 1080" style="enable-background:new 0 0 1920 1080;"
	xml:space="preserve">
<g>
	<rect x="0" width="1600" height="900" fill="#1e2e4b" stroke="#e0cead" stroke-width="10"/>
</g>
<g>
	<rect x="1600" width="320" height="900" fill="#1e2e4b" stroke="#e0cead" stroke-width="10"/>
</g>
<g>
	<rect x="0" y="900" width="1920" height="180" fill="#1e2e4b" stroke="#e0cead" stroke-width="10"/>
</g>
</svg>
```

ざっくり説明

- svg の viewBox に画像のサイズを指定
- rect 3つで左上、右上、下部の矩形を枠付きで作成


## ImageMagick で SVG ファイルを PNG ファイルに変換

単純な SVG ファイル => PNG ファイル変換は `convert` のみでできた。

```bash
convert 1600_900.svg 1600_900.png
```

これで画像が作成できた。

# 補足など

## 画像のサイズについて

通常利用されるの動画やスライドのアスペクト比は 4:3、16:9 で、今回の画像は 16:9 の解像度
1920x1080 で作成した。
内部枠のサイズは 16:9 の 1600x900 で作成した。

試行錯誤した主なサイズは以下です。

|1280x720|1440x810|1600x900|
|:-:|:-:|:-:|
|![1280_720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/79788041-4711-3b27-3800-a5a06f7870cb.png)|![1440_810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/35a10ac8-0d9a-df51-a283-d50e62e88d08.png)|![1600_900.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63607/c1890eb6-117c-190d-46cf-d3ac4b7e2fb0.png)|


## 色の選択について

色の選択について、白黒だと味気ないから「配色パターン」で検索してみて、いろいろなカラーパレットツールがあると知った。

以下のサイトを利用した。

https://photoshopvip.net/72189

https://jxnblk.github.io/hello-color/

## スクリプト化

SVG ファイル単体だと画像や色を試行錯誤するのがかなり手間だったのでスクリプトの引数で SVG ファイルを作成できるようにした。以下がリポジトリと実行例です。

https://github.com/junjanjon/create-L-frame

```bash
ruby main.rb --input template.svg.erb --main_width 1600 --main_height 900 --background_color "#1e2e4b" --line_color "#e0cead" --output 1600_900.svg
convert 1600_900.svg 1600_900.png
```

当初予定していた試行錯誤がやりやすくなった。

## その他コメント

SVG、テンプレートを作るのに便利そう。
背景画像とかパターンとかを入れることできそう。
ブラウザでできるようにできそう。
AutoHotKeyでウインドを常に最前面に保つ

ソフトに関係なくAutoHotKeyを使ってアクティブなウインドを最前面に保つ方法を見つけたのでメモ。
## 解決したいこと
作業用のガイドや参考資料を常にウインドの最前面に保っておきたい。
## 解決方法
AutoHokeKeyを使って任意のアプリやウインドをスクリプト制御する。

## 手順
https://www.autohotkey.com/download/

1. AutoHotKeyをインストール
2. デスクトップで右クリックから 新規作成 / AutoHotKey Script を選択。
3. 出来たファイルを右クリックから Edit Script で開く(ダブルクリックでは開かない)
4. 開いたファイルの内容を全て削除して下記のスクリプトに置き換える。

    ```
    #Space:: Winset, AlwaysOnTop, Toggle, A
    ```
5. [AlwaysOnTop.ahk]という名前で保存(名前は任意でOK)
6. 保存したファイルを起動する。
7. 最前面に保ちたいウインドをアクティブにして Win + Space (解除も同様)
SQLの比較演算子、論理演算子



今回は、SQLで使用する比較演算子と意味を書きます。

|比較演算子  |意味 |
|-----------|---|
|=          |左右の値が等しい  |
|<          |左辺は右辺より小さい  |
|>          |左辺は右辺より大きい   |
|<=         |左辺は右辺の値以下   | 
|>=         |左辺は右辺の値以上   |
|<>         |左右の値が等しくない   |

こんな感じです。

論理演算子はAND・OR・NOTがあり、NOT>AND>ORの順番で優先度が高く先に評価されます。

SQLは４つの命令　SELECT UPDATE DELETE INSERT でほとんど成り立つみたいですが、やはり覚えるべき箇所は多そうですね！
HTTPie で Kibana を使う

こちらで行っていることを、HTTPie で行いました。
[Kibana でデータ投入からグラフの作成まで](https://qiita.com/ekzemplaro/items/54ce1f8eceb6f99e8d48)

user: scott
password: tiger123
を作成します。

![user_aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/578acfc0-0f32-588d-e89f-77284813b736.png)

Elasticsearch のバージョン確認

```bash:get_version.sh
HOST="http://localhost:9200"
http -a scott:tiger123  ${HOST}
```

index　の作成

```bash:create_index.sh
http -a scott:tiger123 PUT \
	"http://localhost:9200/temperature_humidity?pretty" < index.json
```

```json:index.json
{
 	"mappings" : {
		"properties" : {
			"temperature" : {"type" : "double"},
			"humidity" : {"type" : "double"},
			"timestamp" : {"type" : "date"}
 		}
 	}
}
```

index の確認

```bash:get_index.sh
http -a scott:tiger123 \
	"http://localhost:9200/temperature_humidity?pretty"
```

index の削除

```bash:delete_index.sh
http -a scott:tiger123 DELETE \
	"http://localhost:9200/temperature_humidity?pretty"
```

データの投入

```py:insert_elastic_auth.py
#! /usr/bin/python
#
#	insert_elastic_auth.py
#
#						Oct/16/2021
# -------------------------------------------------------------------------
import datetime
import time
import math
import sys
import json 
import requests
from requests.auth import HTTPBasicAuth
# -------------------------------------------------------------------------
url_base = "http://localhost:9200/temperature_humidity/_doc"
user = 'scott'
password = 'tiger123'
#
for icount in range(72):
	key = str(icount)
	url = url_base + "/" + key
	sys.stderr.write("icount = %d\n" % icount)
	now = datetime.datetime.now()
#	ttx = int(now.timestamp())
	ttx =  '{0:%Y-%m-%d %H:%M}'.format(now)
	print(ttx)

	deg = (icount % 36) * 10
	rad = math.pi * deg / 180.0
	diff_temp = 5.0 * math.sin(rad)
	temperature = 25.0 + diff_temp
	diff_humi = 20.0 * math.sin(rad)
	humidity =  70.0 + diff_humi
	es_body = {
		'timestamp' : ttx,
		'temperture' : temperature,
		'humidity' : humidity,
		'icount' : icount,
		}

	json_str = json.dumps(es_body)
	print(json_str)
#
	headers = {'content-type': 'application/json'}
	rr=requests.put(url,data=json_str,headers=headers,auth=HTTPBasicAuth(user, password))
	print(rr)
#
	time.sleep(1)
	print(es_body)
#
# -------------------------------------------------------------------------
```

データ数のカウント

```bash:go_count.sh
http -a scott:tiger123 'localhost:9200/temperature_humidity/_count?q=*'
```


データの取得

```bash:get_all.sh
http -a scott:tiger123 http://localhost:9200/temperature_humidity/_search | jq .hits.hits
```

データの削除

```bash:go_del.sh
http -a scott:tiger123 DELETE http://localhost:9200/temperature_humidity
```

Index Patterns の作成
Management -> Stack Management -> Kibana -> Index Patterns
![index_pattern_aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/0f532da9-d501-a9c0-160b-c74be3e7e61c.png)

テーブル表示 (Dashboard)
![kibana_discover_aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/683a574b-4973-87cc-9e49-0f76941b75e1.png)

折れ線グラフ表示 (Dashboard)
![kibana_discover_bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/a9ddd222-0f42-8d3f-d17e-40fa6c6718a9.png)
Intellij + Lombok + Gradleでちょっと設定詰まったのでメモ

Intellijというより、Gradleの記述だけのお話という感じがしますけれども。


## エラー内容

```
コンパイル時に「XXX.getId()でシンボルが見つからない」というエラー
```


## 解決した対処

gradleのlombokの記述を以下のようにしました。

```
dependencies {
  compileOnly 'org.projectlombok:lombok'
  annotationProcessor 'org.projectlombok:lombok'
}
```

※compileOnlyじゃなくても良いのかも？このあたり良し悪しあまり理解できていないです。

annotationProcessor 'org.projectlombok:lombok'を記述していませんでした。
でも検索すると
・gradleの記載は「compileOnly 'org.projectlombok:lombok'」
・Intellijのannotationを有効化しましょう

とかしか出てこないんですよね……。
昔はそれだけでよかったのかもです。

ただ私はそんなにできないのでGradleにこう記述するのが当たり前のことなのかもしれません。
私のような困っている人の参考になれば幸いです。
API Gateway + Lambda でリダイレクトする方法（Go言語）

# 目的
API Gateway + Lambda でリダイレクトさせたいときの Go 言語のコードを紹介します。

# リダイレクトさせる Go 言語のコード

APIGatewayProxyResponse は、リクエストに対して API Gateway によって返されるレスポンスを構成します。よって、APIGatewayProxyResponse にリダイレクト（3xx）のステータスコードとリダイレクト先 URL をセットしてあげれば、クライアントにリダイレクトさせることが可能です。

```golang
package main

import (
	"net/http"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
	return events.APIGatewayProxyResponse{
		StatusCode: http.StatusFound, // ステータスコード 302 を指定
		Headers: map[string]string{
			"Location": "https://aws.amazon.com/jp/", // リダイレクト先 URL を指定
		},
	}, nil
}

func main() {
	lambda.Start(handler)
}
```

# APIGatewayProxyResponse の内容について

APIGatewayProxyResponse で指定したリダイレクトのステータススコードの代表的なものとロケーションヘッダーについて簡単に解説します。詳細を知りたい方はリンク先を参照してください。

### 代表的なリダイレクトのステータススコード

ステータスコードは http パッケージの定数を利用しています。以下に、リダイレクトのステータスコードの代表的なものを紹介します。用途にあわせて使い分けてください。

- [**301 Moved Permanently**](https://developer.mozilla.org/ja/docs/Web/HTTP/Status/301)：リクエストされたリソースが Location ヘッダーで示された URL へ完全に移動したことを示します。ブラウザは、301 リダイレクトを受け取ると、古い URL から新しい URL へのリダイレクトをキャッシュに記憶します。もう一度ブラウザで古い URL を表示しようとすると、古い URL にアクセスすることなく新しい URL にアクセスします。

- [**302 Found**](https://developer.mozilla.org/ja/docs/Web/HTTP/Status/302)：リクエストされたリソースが一時的に Location で示された URL へ移動したことを示します。ブラウザが 302 リダイレクトを受け取っても、リダイレクトをキャッシュに記憶することはありません。もう一度ブラウザで古い URL を表示しようとすると、ブラウザは古い URL にアクセスしたあとでリダイレクトします。

- [**303 See Other**](https://developer.mozilla.org/ja/docs/Web/HTTP/Status/303)：リダイレクトが新しくアップロードされたリソースではなく、 (確認ページやアップロード進捗ページのような) 別なページにリンクすることを示します。このレスポンスコードはふつう、 PUT または POST の結果として送り返されます。また、リダイレクトすときは GET メソッドを使用します。

- [**307 Temporary Redirect**](https://developer.mozilla.org/ja/docs/Web/HTTP/Status/307)：リクエストされたリソースが一時的に Location で示された URL へ移動したことを示します。ブラウザが 307 リダイレクトを受け取っても、リダイレクトをキャッシュに記憶することはありません。307 と 302 の唯一の違いは、 307 はリダイレクトされたリクエストが行われるときに、メソッドと本文が変更されないことが保証されることです。 使用されるメソッドを GET に変更したい場合は、代わりに 303 See Other を使用してください。

- [**308 Permanent Redirect**](https://developer.mozilla.org/ja/docs/Web/HTTP/Status/308)：リクエストされたリソースが Location ヘッダーで示された URL へ完全に移動したことを示します。ブラウザは、308 リダイレクトを受け取ると、古い URL から新しい URL へのリダイレクトをキャッシュに記憶します。301 の場合は GET メソッドに変更される可能性があるのに対し、308 の場合はリクエストメソッドと本文が変更されません。

### ロケーションヘッダー

[**ロケーションヘッダー**](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Location) はリダイレクト先の URL を示します。

以上です。
はじめてのLaravel8

#はじめに
今行きつけのアミューズメントカジノでランキングバトルなるものをやっています。
そこのオーナーが成績を紙で記録し手動で計算していたのでVBAで計算を自動化したものを作りました。

これってWeb上で成績をゲストも閲覧できたらいいのでは？と思い、
10年前にWebプログラマをしていた経験を活かしPHPで簡単なランキングを集計閲覧できるものを作ろうと思いました。

規模も小さいのでPHPで1から作ったほうが楽な気がしますが、せっかくなので今流行りのフレームワークを使って開発していきたいと思います。
10年前はCakePHPが主流だったんですが今はLaravelが主流というか勢いがあるんですね。ということでLaravelを使って1から勉強していきます。
その備忘録となります。

#勉強方法
「Laravel 入門」と検索すればいくらでも勉強できるサイトが存在しますが、自分は書籍から入るのが好きなので本を買いました。

+ 「PHPフレームワーク Laravel入門第２版」

書籍ではLaravelのバージョンは6をベースに書かれていますが最新版のバージョン8でやっていきます。
2022年1月にLTSのバージョン9がリリースされるそうなのでリリースされればそちらに移行します。


#開発環境

+ Windows10 Home
+ Composer 2.1.9
+ PHP 8.0.11
+ Laravel Framework 8.64.0
+ XAMPP 8.0.11

バージョン管理はGithub、ある程度形になったら外部公開を「さくらのVPS」にしようと思っています。
JavaScriptのコンテキストについて

#コンテキスト
まずは言葉の定義から説明すると、あるコードが実行される際の文脈や状況のことを実行コンテキストといいます。
例えばブラウザ上でコードを実行した場合は、windowオブジェクトとthisがJavaScriptエンジンによって準備されるのでこれらが実行可能となります。
実行コンテキストには３つの種類があります。
１．　グローバルコンテキスト
２．　関数コンテキスト
３．　evalコンテキスト
しかし、３のeval関数はES6から非推奨になっています。



###グローバルコンテキスト
![スクリーンショット 2021-10-16 17.27.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/edc58bd0-76d9-ad3c-663a-308667a6713a.png)

グローバルコンテキストでは宣言した変数と関数、グローバルオブジェクト、thisの３つが利用できます。
お使いのエディタで適当なindex.htmlとmain.jsを作成した時main.jsの直下に書かれたコードが実行される環境がグローバルコンテキストとなります。

###関数コンテキスト
![スクリーンショット 2021-10-16 17.32.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/cf00e697-0755-1249-fd22-12e6a099e87e.png)

関数コンテキストでは宣言した変数と関数と「arguments」,「super」,[this],[外部変数]の４つがJavaScriptエンジンによって準備され利用できます。

![スクリーンショット 2021-10-16 17.45.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/4d2d13d9-7541-90f8-820f-fb6c9a96946d.png)

実行結果
![スクリーンショット 2021-10-16 17.57.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1265227/56bea488-cab6-be45-c421-9adf6639f67f.png)

this（window）,arguments,a(0)の３つがコンソールに出力されています。

##参考
Udemy： 【JS】ガチで学びたい人のためのJavaScriptメカニズム
Udemy「ネットワークエンジニアを目指す初心者はここから始めよう！「ゼロから学ぶネットワーク基礎」1016

Protocol
・Protocol(プロトコル）は通信規約、手順と訳される。
・標準化された内容を指す。
・たくさんの種類がある。
・複数組み合わさって動作する。

通信モデル概要
・一連の通信の流れ（動作・処理）を定義
・流れは複数に分割
・複数に分割＝複数のプロトコルの組み合わせ
※ブログを開く
①パソコンのブラウザでブログを開くためのプロトコル
②ブログがあるサーバの場所を特定するためのプロトコル
③サーバに向けてデータを送信するためのプロトコル
④電気信号に変換してケーブルを伝わるためのプロトコル

通信モデルのメリット
・処理をシンプルにできる。
・修正や変更が全体に影響を与えない。

①パソコンのブラウザでブログを開く
　　　　　　　⇅
②ブログがあるサーバの場所を特定する
　　　　　　　⇅
③サーバに向けてデータを送信する→④が受け取れるデータを渡すだけでOK
　　　　　　　⇅
④電気信号に変換してケーブルを伝わる→③からデータを渡された後の処理はこちらの自由

通信モデルとは通信の流れを分割、複数のプロトコルとして組み合わせる時にどのような考え方で分割するか？を整理したもの。


OSI　参照モデル概要(1)
・国際標準化機構（ISO)により策定
・Open SYStems Interconnectionの略
・7階層構成

Layer7:アプリケーション層
Layer6:プレゼンテーション層
Layer5:セッション層
Layer4:トランスポート層
Layer3:ネットワーク層
Layer2:データリンク層
Layer1:物理層

OSI　参照モデル概要（２）
・通信先のサーバや途中のネットワーク機器も通信モデルを考える。
・ネットワーク機器は必ずしも７階層全ての処理できる必要はない。


PDUとカプセル化
・送信側でデータにヘッダをつけることをカプセル化
・カプセル化されたデータをProtocol Data Unit(PDU)と呼ぶ。
・受信側でその逆の非カプセル化を行う。


アプリケーション層
・Webブラウザやメールソフトそのものではない。
・Webブラウザやメールソフトが通信を必要とする時に動作するプログラム　　のこと。

プレゼンテーション層
・表現形式を規定する。
・対向と取り決めたプロトコルに一度変換する。
・対向でアプリケーション層が理解できる表現に戻す。

セッション層
・相手アプリケーションとの間でデータのやりとりを管理する。
　（通信の開始はどちらが先？タイミングは合わせる？どのように送る？）
・アプリケーション同士で専用の道を作るので混在しない。

トランスポート層
・送信するデータの品質管理を行う。
　（データは届いたか？壊れてないか？紛失してないか？）
・再送や修復機能、データ送信量の制御（フロー制御）も定義されている。

セッション層とトランスポート層の違い
・データを届ける相手に注目
・セッション層はアプリケーション間での制御
・トランスポート層は機器間でのデータ制御

ネットワーク層
・最終的な目的地までの通信経路を決定する。
・End-to-End 通信の表現
・途中のネットワーク機器でも動作している。

データリンク層
・直接接続された機器までの通信を行う。
・受信したデータが壊れていないかチェックする機能がある。

物理層
・データをビット列（０と１の並び）に変換し、対向を伝える。
・0と１をどのように表現するかを規定する。









TCP/IPモデル
・TCPとIPは個々のプロトコルのこと。
・TCP(Transmission Control Protocol)
・IP(Internet Protocol)
・TCP/IPで他のプロトコルを含む総称として使うこともある。

TCP/IPモデルは４階層

TCP/IPモデル
アプリケーション層→アプリケーション層、プレゼンテーション層、セッション層
トランスポート層→トランスポート層
インターネット層→ネットワーク層
リンク層→データリンク層、物理層

アプリケーション層：HTTP、FTP、SMTP、etc
トランスポート層：TCP、UDP
インターネット層：IP
リンク層:Ethernet、PPP


アプリケーション層
・アプリケーションが通信を必要とする時に動作するプログラムを指す。
・OSI参照モデルのプレゼンテーション層、セッション層も含む。
・代表的なプロトコルにHTTP、FTP、SMTPなどがある。

トランポート層
・送信するデータの品質管理を行う。
（データは届いたか？壊れてないか？紛失してないか？
・TCPは品質重視の通信で利用し、UDPは処理の軽さを重視する。
・セグメント（TCP）、データグラム（UDP）※パケットと呼ぶ人もいる。


インターネット層
・エンドツーエンドの通信を定義する。
・通信相手の特定、通信経路を決定する。
・代表的なプロトコルにIPがある。
※インターネット層のデータはパケットと呼ぶ。

リンク層
・直接接続された機器間の通信を定義する。
・OSI参照モデルのデータリンク層、物理層に相当する。
・代表的なプロトコルにEthernetがある。
※リンク層のデータはフレームと呼ぶ人もいるが、パケットと呼ぶ人もいる。


通信モデルのまとめ
・通信の流れを複数の処理に分割して考える。
・送信側では上位から下位に、受信側では下位から上位にデータが渡され、処理される。
・機器によっては全てのレイヤーを必要としない。
【初学者向け】JavaScriptのsplitについて

今回はJavaScriptのsplitについて初学者の方向けに解説して行こうと思います。

##①splitについて
前回解説した**[join( )](https://qiita.com/yasu-hoshi/items/f1189fd78e86dd402c6c)**とは逆に文字列を区切り文字のところで分割して、それを配列できるメソッドになります

**重要**
**<font color="red">point①</font>文字列→配列に変換**
**<font color="red">point②</font>指定した(任意の)"区切り文字"の箇所でバラバラに**

区切り文字では「:」(コロン)や「-」(ハイフン) や「 」(空文字)なんかがよく使われます。
**☆区切り文字をsplit( )の引数として渡す際は「''」で囲いましょう**

##②コードで解説

(1) 区切り文字に**「-」(ハイフン)**を指定

```javascript
// 本日の日付を文字列で用意
const today = '2021-10-16';

// ハイフンの箇所で分割して配列に
console.log(today.split('-'));    // ["2021", "10", "16"]
```

(2) 区切り文字に**「:」(コロン)**を指定

```javascript
// 今の時間を用意
const t = '17:08:24';

// コロンの箇所で分割して配列に
console.log(t.split(':')); // ["17", "08", "24"]
```
さらに、さらにここで取り出した配列を以前解説した**[分割代入]()で変数に代入**

```javascript
// hour minute second に分割代入
const [hour, minute, second] = t.split(':');

// それぞれ表示
console.log(hour); // 17
console.log(minute); // 08
console.log(second); // 24
```
##まとめ
今回解説したsplit( )は正規表現と組み合わせて使われたり、他のメソッドと組み合わせて使うこともよくあります。今回の解説を通して少しでも理解が深まればいいなと思っております
ローカルでの実行はうまくいくが、コードテストでRuntime Error

#AOJのITP2_1_Bにて問題発生
https://onlinejudge.u-aizu.ac.jp/courses/lesson/8/ITP2/all/ITP2_1_B
を下のコードで実装。

```c++
#include <iostream>
#include <vector>
using namespace std;

const int MAX = 400005;
vector<int> queue(MAX);
int tail = 0,head = 0;


void init(){
    head = 0 , tail = 0;
}

bool isEmpty(){
    return head == tail;
}

bool isFull(){
    return  (tail + 1)%MAX == head ;
}

void push_head(int x){
    if(isFull()){
        cout << "error : queue is full." << endl;
    }
    else{
        queue[head] = x;
        head = (head-1)%MAX;
    }
}

void push_tail(int x){
    if(isFull()){
        cout << "error : queue is full." << endl;
    }
    else{
        tail = (tail + 1)%MAX;
        queue[tail] = x;
    }
}

int randomAccess(int p){
    return queue[(head+p+1)%MAX];
}

void pop(int d){
    if(isEmpty()){
        cout << "error : queue is full." << endl;
    }
    else if(d == 0) head = (head+1)%MAX;
    else tail = (tail - 1)%MAX;
}

//headの挿入: queue[head]に値を入れてからhead <- (head-1)%MAX
//taiilの挿入 : (tail+1)%MAXとしてからqueue[tail]
int main(){
    init();
    int q;
    cin >> q;
    vector<int> query(q),num_1(q,-1);
    vector<int> num_2(q,-1);
    for(int i=0;i<q;i++){
        cin >> query[i];
        if(query[i]==1||query[i]==2) cin >> num_1[i];
        else cin >> num_1[i] >> num_2[i];
    }
    for(int i=0;i<q;i++){
        if(query[i]==0){
            if(num_1[i]==0) push_head(num_2[i]);
            else push_tail(num_2[i]);
        }
        else if(query[i]==1) cout << randomAccess(num_1[i]) << endl;
        else pop(num_1[i]);
    }
    return 0;
}
```
ローカルでの実行はうまくいったが、AOJのジャッジではRuntime Error...
###解決までの道筋
Atcoderのコードテストに通してみると、出力はうまくいくがエラーコード139が出る。
→調べてみると、これは配列の範囲外にアクセスしていることが原因の一つとして考えられるらしい。
→下のコードが怪しい...

```c++
else tail = (tail - 1)%MAX;
```

:::note info
C++では(負の値)%nは負の値を返す!!
:::

これに注意して下のように変更すると、無事ACできました。

```c++
if(tail==0) tail = tail -1 + MAX;
else tail = (tail-1)%MAX;
```
(modintを使うとこのような心配もなくなるかも)
【Vue.js】 Vuetifyのv-data-tableでスクロールの追従をする

## 【Vue.js】 Vuetifyのv-data-tableでスクロールの追従をする

### はじめに
Vue.jsのUIフレームワークとしてVuetityを使用します。  
マテリアルデザインを踏襲したボタンやダイアログなどを手早く実装できます。  
データテーブルについても、[v-data-table]([https://vuetifyjs.com/ja/components/data-tables/)というコンポーネントを用いて実装可能です。  
HTMLのtableタグで実装するよりも効率的に、しかも見栄えよく実装可能です。  
様々なプロパティを付与し、テーブルの加工ができます。


### 行いたいこと
テーブルのヘッダー部分と1列目の部分をスクロール時に追従させるようなデザイン。  
プロパティの中に、```fixed-header```という、ヘッダーを画面上部に追従できるものがあるのですが、今回の要件を満たせないため、データテーブル用のCSSを独自で作成する方針をとります。  

![image-20210407154025664.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2172312/e7fa9105-9b58-a04d-b0ea-ed216412e53b.png)

オレンジ部分をスクロール追従させます。


### ソース
```vue:compornent.vue
<template>
  <div id="list-table">
    <v-data-table
      :headers="dataTableHeaders"
      :items="dataTableItems"
      hide-default-header
      hide-default-footer
      dense
    >
      <template v-slot:header">
        <thead>
          <tr>ヘッダーの各行の内容を記載する</tr>
          <tr>ヘッダーの各行の内容を記載する</tr>
        </thead>
      </template>
      <template v-slot:body="{ items }">
      <tbody>
        <tr>表の各行の内容を記載する</tr>
        <tr>表の各行の内容を記載する</tr>
      </tbody>
      </template>
    </v-data-table>
  </div>
</template>

<style scoped>
/* データテーブルのコンテンツが大きいため、scrollを設定 */
#list-table {
  overflow: scroll;
}
/* データテーブルのヘッダー及び、bodyの1行目にスクロール追従を設定 */
#list-table table thead tr th,
#list-table table tbody tr th:first-child {
  position: -webkit-sticky; /* Safari */
  position: sticky;
  top: 0;
  left: 0;
}

</style>
```

上記ソースでは、スクロールの追従ができませんでした。  
ちなみに、HTMLのtableタグで作成した表に関しては、上記CSSで上手くいったので、v-data-tableが原因だと予想できます。


### 原因
v-data-tableの仕様のようで、overflowが設定されているようでした。  
[こちらの記事]([https://jareklipski.medium.com/sticky-table-header-in-vuetify-js-fab39988dc3)にあるように、v-data-tableで作成されるHTMLのクラスに対して、overflowの設定をunsetすることで解決できました。

```
.v-data-table /deep/ .v-data-table__wrapper {
  overflow: unset;
}
```


### /deep/に関して
```/deep/```は、deep selectorと呼ばれるものです。  
Vue.jsでは、今回のようにstyleタグにscopeをつけることで、styleをそのコンポーネントのみに適用させることができます。（反対にscopeを付けなかった場合、グローバルなstyleとなり、該当コンポーネント以外にも同名のクラスが存在する場合には、styleが適用されてしまいます）  
該当コンポーネントの子コンポーネント（HTMLタグ上では子クラスと同義）にもstyleを適応させたい場合に、deep selectorを用いることで、子コンポーネントにも適用させることができます。
今回に関しては、.v-data-tableが親コンポーネント、.v-data-table__wrapperがその子コンポーネントというように見なされているのだと考えられます。  
ちなみに、```/deep/```については

```
.v-data-table >>> .v-data-table__wrapper {
  overflow: unset;
}
```
のようにも記述できます。


### 最後に
VuetifyはマテリアルUIを踏襲した便利なライブラリですが、
参考資料が少ない部分があるため、
躓いた内容は積極的にアウトプットしていきたいです。
Javascriptの基本からおさらいしてみた

#変数
変数とは繰り返し使う値を格納しておく便利な入れ物です。プログラミングにおいて同じ事を繰り返す行為はバッドケースです。そのようなコードの冗長性を回避するためにも変数は避けては通れません。
変数を定義することを変数を宣言すると言います。変数の宣言方法は下記の３つになります。

```JS:JS
let a = 0;
const b = 1;
var c = 2;
```
現在のES6からはvarの使用は非推奨になっております。
使い分けの詳細は別記事にて紹介します。

#関数
関数とは、複数の処理をひとまとまりにしたものです。メソッドと呼ばれることもあります（後述のオブジェクトにて説明します）。
下記のコードで説明すると、helloという関数を実行すると｛｝の中身が実行されブラウザのログに「hello」という文字列が出力されます。
変数と同様に関数を定義することを関数を宣言すると言います。

```JS:JS
function hello() {
 console.log("hello");
}
```

関数には「引数」というものが設定できます。また関数の呼び出し元に返す値を「戻り値」と言います。

```JS:JS
function ｆｎ(引数) {
 return 戻り値;
}
```

引数を渡して関数を実行する際は関数の末尾に（）をつけ中に引数を
書くことで実行できます。

```JS:JS
function ｆｎ(引数) {
 return 戻り値;
}

fn(引数1);
```

#オブジェクト
オブジェクトとは名前（プロパティーまたはキー）と値（バリュー）を
ペアで管理する便利な入れ物になります。

```JS:JS
let obj = {
 property1: "hello",
 property2: function(){
 },
 property3: {
   d: 'obj in obj'
 },
}
```

オブジェクトは
・　名前　：　値
・　名前　：　関数
・　名前　：　オブジェクト
のように格納することができます。これらのプロパティへのアクセス方法は下記の２つの方法があります。
・　ドット記法

```JS:JS
obj.name
```
・ブラケット記法

```JS:JS
obj['name']
```
また、オブジェクトのプロパティに格納された関数を「メソッド」と表現します。

##参考
Udemy： 【JS】ガチで学びたい人のためのJavaScriptメカニズム
スイッチロール とは

## 勉強前イメージ

AWSのアカウントを楽に切り替える・・・？
言われてみればなんて説明したらいいか難しい

## 調査

### スイッチロール とは

AWSがアカウント管理に使っているIAMの機能で、
複数のアカウントにログインできる権限をロールとして付与し、付与するポリシーによって使えるサービス等を変更することができます。


スイッチロールなしでは以下のように別のAWSアカウントを使用する際は
ログインとログアウトを繰り返さなければいけません。

![12021-10-16 # スイッチロール とは - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/7be81aca-bd77-66bb-5c00-7b5549ef6835.png)


スイッチロールを使用すると、ロールの切り替えのみで、
ログイン・ログアウトをする必要がありません。
また、使用するサービス等をポリシーで変更できると↑で記載しましたが、
各AWSアカウントの管理者も一括にポリシーを変更できます。

![22021-10-16 # スイッチロール とは - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/a3872c85-bc46-cbdd-5285-8ee01f1b2095.png)


### スイッチロールのメリット

- AWSアカウントと管理

AWSアカウントの管理は煩雑で、環境やアカウント、それぞれのIDやユーザ名など管理しないといけません。
また担当者の変更があった際は上記の管理から変更しないといけないので多くの工数が発生します。
ですので、アカウントの管理を簡素化し、各環境にユーザに合った権限で閲覧できるように一元管理を行います。

- AWS利用者の操作

管理者だけでなく、利用者もログイン・ログアウトせずとも他の環境に移行できるので煩わしい操作が減少します。

## 勉強後イメージ

確かにアカウント管理個々のAWSアカウントでやってたらすごいことになりそう・・・

## 参考

- [【AWS】IAMのスイッチロールの設定方法](https://business.ntt-east.co.jp/content/cloudsolution/column-try-25.html)
- [AWSのスイッチロールとは？そのメリットと設定方法を解説！](https://and-engineer.com/articles/YKhyYRIAACEAGuT2)
【Nuxt.js】APIから取得したデータをランダムで表示する

#はじめに
こんにちは。
こちらの記事では、取得したデータをランダムに表示する方法を記しています。
誤っている点がございましたらコメントいただけると幸いです。

##前提

* ヘッドレスCMS（microCMS）からAPIを取得するものとする
* Nuxtの新規プロジェクトの作成が済んでいる
* microCMSのアカウント登録〜コンテンツ作成まで済んでいる

microCMSの導入については、[前回の記事](https://qiita.com/YuStarrr/items/b1e6b16586b9ab8f5a43)で解説しているので先に読んでいただけるとスムーズに進められると思います！

##実装手順
今回はAPIを取得して、ランダムでタイトルを表示させる実装を行います。

###1. APIの取得
Nuxtの新規プロジェクトのpages配下の表示させたいページに以下のように記述する。変数`test`に格納されたデータをコンソールで確認してみると、オブジェクトが返ってくる。
（`asyncData()`は、コンポーネントがインスタンス化される前に呼び出されます。）

```javascript:script
<script>
import axios from "axios";

export default {
  async asyncData() {
    const test = await axios.get(
      'https://サービス名.microcms.io/api/v1/APIのエンドポイント',
      {
        headers: { "X-API-KEY": "APIキーを入力" }
      }
    );
    console.log(test)
  }
}
</script>
```

###2. 各コンテンツのタイトルを取得する
.map( )メソッドを使用して各コンテンツのタイトルを変数`titles`に格納する。
※microCMSで、取得するタイトルのフィールドIDを`title`にしておく。

```javascript:script
<script>
import axios from "axios";

export default {
  async asyncData() {
    const test = await axios.get(
      'https://サービス名.microcms.io/api/v1/APIのエンドポイント',
      {
        headers: { "X-API-KEY": "APIキーを入力" }
      }
    );
    const titles = test.data.contents.map(e => e.title)
    return {titles}
  }
}
</script>
```
`titles`をreturnで返すときに{ }で囲うのは、`titles`の中身が`配列のインデックス:タイトル`という形でオブジェクト形式になっているため。

###3. ランダムにタイトルを表示させる
ライフサイクルフックの`mounted()`で、DOMがマウントされた後に`titles`のインデックスをランダムに処理を実行する。
DOM操作が必要な場合は`mounted()`で、不要な場合は`created()`で使い分けられると良い。

```javascript:script
<script>
import axios from "axios";

export default {
  async asyncData() {
    const test = await axios.get(
      'https://サービス名.microcms.io/api/v1/APIのエンドポイント',
      {
        headers: { "X-API-KEY": "APIキーを入力" }
      }
    );
    const titles = test.data.contents.map(e => e.title)
    return {titles}
  },
  mounted: function(){
    this.randomTitle = this.titles[
      Math.floor( Math.random() * this.titles.length)
      ]
  }
}
</script>
```

```html:template
<template>
  <div>
    {{ randomTitle }} 
  </div>
</template>
```
templateで描画すると、ランダムでタイトルが表示される。

#おわりに
ここまでAPIから取得したデータのタイトルをランダム表示する方法についてまとめました。
コードの記述が多くなってくるほど、可読性を意識して書かないといけないと感じたので、自分でも見直したりレビューを受けながら開発を進めていきます！

以上、最後まで読んでいただきありがとうございました！
ワンライナー年月日取得(python)

巷を探してもいったん変数格納しているまどろっこしいのしか見つからないので、書いてみました。


```python:今日の日付取得
import datetime
print(datetime.datetime.today().strftime('%Y-%m-%d'))
```

昨日の日付を取得するのにも、変数作りまくっているまどろっこしいのしかないですよね。次の式で一発取得です。

```python:昨日の日付取得
import datetime
print((datetime.datetime.today() - datetime.timedelta(days=1)).strftime('%Y-%m-%d'))
```

取得したい日付はtimedeltaの引数を調節すればOKです。
使える引数は以下が参考になります。
https://docs.python.org/ja/3/library/datetime.html

良きワンライナーライフを！
wp-env + VScode で Xdebugを使う

wordpress開発にはXdebugがとても便利だったので紹介。
ブレークポイントを設定して変数の値の変化や、処理の流れを追えるので

```
var_dump($hoge); // スマートじゃない
```

などで、都度検証しなくて良く
開発が非常にやりやすくなる。

普段 wordpressのテーマ開発で使っている「wp-env」には Xdebug がインストールされていて、簡単に使うことが出来た。  
(ちなみにwp-envにはdockerが必要です)

https://ja.wordpress.org/team/handbook/block-editor/reference-guides/packages/packages-env/


# 準備

### 手順1

wp-envをインストール

```
  npm i @wordpress/env
```

### 手順2

PHP Debug エクステンションを Xcodeにインストールする  
https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-debug  

vscodeを再起動する

### 手順3

プロジェクトルートに「.vscode/launch.json」を用意する
「pathMappings」の箇所は独自のものに変更

```

{
  // IntelliSense を使用して利用可能な属性を学べます。
  // 既存の属性の説明をホバーして表示します。
  // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Listen for Xdebug",
      "type": "php",
      "request": "launch",
      "port": 9003,
      "pathMappings": {
          "/var/www/html/wp-content/themes/example_theme": "${workspaceFolder}/wp-content/themes/example_theme" # テーマのディレクトリをコンテナー内とマッピング
      }
    }
  ]
}

```

### 手順4

xdebugオプションをつけて、wp-envを実行する

```

  "scripts": {
    "wp-start": "wp-env start --xdebug",
    "wp-update": "wp-env start --xdebug -- --update",　 //　これじゃないとダメっぽい
  }

// 参照
https://ja.wordpress.org/team/handbook/block-editor/reference-guides/packages/packages-env/

```


# 使い方

①のボタンを押すと
②「Listen for Xdebug」が出てくるので、押す
debugが開始される

![スクリーンショット 2021-10-16 16.19.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30049/acebb62b-796b-2925-58f0-30ca8cc047a7.png)

デバックしたい、ファイルに移動して（今回の場合はfront-page.php）、
検証したい場所にブレイクポイントをつける。

phpの実行。
今回で言うと http://localhost:8888/ にアクセスする。
するとブレークポイントごとに、処理が止まるので、
右のボタン再生？ボタンとそれ以外を駆使して
ブレークポイントごとに検証を開始する。

![スクリーンショット 2021-10-16 16.32.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30049/4a822e01-9cde-e2e1-7594-f93e86de7811.png)

サイドバーに定義した変数の値の変化が出るのと、
デバックコンソールからも、コール出来る。

関係ないけど、wordpressってめっちゃ変数あるんですね。
その辺も可視化出来てGood.


![スクリーンショット 2021-10-16 16.39.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30049/66ca8179-d406-febf-8612-73057362b010.png)

これを使わないのはもったいないので是非お試しあれ。
【ＰＨＰ】PHPでコントロールブレイク

#やりたいこと

同じ名前のレコードのデータがあったら、それぞれデータが異なるので復数欲しい

※名前が昇順である前提

```PHP
<?php
$data = [
    ['name' => '田中',  '国語の点数' => 777],
    ['name' => '渡部',  '国語の点数' => 62],
    ['name' => '品川',  '国語の点数' => 23],
    ['name' => '品川',  '国語の点数' => 4343],
    ['name' => '滝谷',  '国語の点数' => 93],
    ['name' => '川原田','国語の点数' => 55],
    ['name' => '一色',  '国語の点数' => 27],
    ['name' => '一色',  '国語の点数' => 89],
    ['name' => '高橋',  '国語の点数' => 555],
    ['name' => '高橋',  '国語の点数' => 9999],
];



    foreach ($data as $cnt => $row) {
        if($cnt === 0){
            $key = $row['name'];
            $store[] = $row['国語の点数'];
        }
        if($key === $row['name']){
            $key = $row['name'];
            $store[] = $row['国語の点数'];
        }else{
            $result[$key] = implode(',', array_unique($store));
            $key = $row['name'];
            $store = [];
            $store[] = $row['国語の点数'];
        }
    }

    $result[$row['name']] = implode(',', array_unique($store));

var_dump($result);


```

#結果
```
array(7) {
  ["田中"]=>
  string(3) "777"
  ["渡部"]=>
  string(2) "62"
  ["品川"]=>
  string(7) "23,4343"
  ["滝谷"]=>
  string(2) "93"
  ["川原田"]=>
  string(2) "55"
  ["一色"]=>
  string(5) "27,89"
  ["高橋"]=>
  string(8) "555,9999"
}

```
Ubuntu 20.04でpython3をデフォルトに設定

久しぶりにUbuntu 20.04をインストールしたら、Python3をデフォルトにする方法を忘れていたのでメモ。

結論としては以下の実行。

```
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.8 0
```
これだけでpython3がデフォルトになる。

```
$ python --version
Python 3.8.10
```

自分の環境では何故かpython2が入っていなかった（20.04って元々そうでしたっけ？）。


【以下はただの参考情報】
変更するものがないのでupdate-alternativesで--configすると「変更もなにも変更対象のものがない」と言われ、プライオリティをつけずに--installすると「<link> <name> <path> <priority>」と最後にプライオリティのための番号が必要だよと言われた（ので今回は0をつけた）。

```
$ which python
$ which python3
/usr/bin/python3
$ sudo update-alternatives --config python
update-alternatives: error: no alternatives for python
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.8 
update-alternatives: --install needs <link> <name> <path> <priority>
```
Storyboard 上で Attributed Text にカスタムフォントを設定する方法

## これは何？

Xcodeでプロジェクトにフォントを追加しても、UILabel で Attributedにした際にフォントを設定できなかったので、その対策です。
大したことないんですが、備忘録として投稿します。

## 対策
結論からゆうと、この場合プロジェクトに追加するだけでなく、Macのフォントブック（FontBook）にもフォントを追加する必要がありました。

作業としては
フォントブックを開き、フォントファイル（ttf）をドラック＆ドロップするだけ
です。

これで、Attirbuted状態のUILabelのフォント設定する時に表示されるフォント一覧に、追加したフォントが表示されます。
今回は `Noto Sans JP` を追加してます。
![スクリーンショット 2021-10-16 16.29.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36475/0acece34-b0b8-d4ee-4778-ef6b10995798.png)


以上です。

参考:
https://stackoverflow.com/questions/25925914/attributed-string-with-custom-fonts-in-storyboard-does-not-load-correctly
postStart.exec.commandで複数コマンドを実行する方法

- `sh -c`の引数に`>`を書きコマンドを並べていく
- コマンドの区切りは&&でつなげる

```yaml
    spec:
      containers:
        - image: aaa
          name: app
          imagePullPolicy: Always
          ports:
            - containerPort: 80
          lifecycle:
            postStart:
              exec:
                command:
                  - "sh"
                  - "-c"
                  - >
                    echo aaa > /tmp/aaa &&
                    echo bbb > /tmp/bbb
```
Qiita Organizationのメンバーが記事を投稿したらTeamsに通知する

# はじめに
特に社外秘でもない技術的な情報共有をQiitaで行うことで社内への共有を行うとともに社外へのアピールになるのではないかと考えました。そこで、より活発な投稿を行うためにTeamsに通知してお互いにLGTMをすることで記事を書くモチベーションにつながるのではないかということで実践していきたいと思います。
基本的な考え方は[こちら](https://qiita.com/rsuzuki/items/ffc079308d36c3e04d5e)を参考にさせてもらいました。
細かい部分での修正や自分がはまったポイントを重点的に書いていければと思います。

# 概要
ざっくりと処理の概要は下記のように行う予定です。
![Untitled Diagram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524088/3f972aee-0f66-cb29-40a5-e7bf1a82dd46.jpeg)
(フローチャートっぽく書いてますが、別にフローチャートってわけではないのでご理解いただければと…)


# 作成(英語ですが、日本語も同じ場所にあるので読み替えてください)

## 定期実行のフローを選択する
![init.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524088/11f9ae7e-82e2-31c2-e309-b3e31246de24.png)

## RSSフィード取得のステップ追加
RSSフィードの検索ですが「.atom」でorganizationのページを検索して取得しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524088/b9b9ee4a-9031-3665-3438-f6f3b68cfa60.png)

取得した結果をもとに下記に「RSSフィードの取得したパス」を入力します。
例で言えば「https://qiita.com/organizations/offgrid/activities.atom」です
![rss_feeds.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524088/988e88c5-ea6f-781e-e7d3-97cfe68ea056.png)

## 1h前の時間を取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524088/2aaa000a-58ab-522f-5392-6be48278fae3.png)

関数は以下の通り

```
ticks(convertToUtc(substring(getPastTime(1,'Hour'),0,sub(length(getPastTime(1,'Hour')),1)),'Tokyo Standard Time'))
```

## RSSフィードでループ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524088/4cb451fb-e964-ec90-9f00-fdebc478883f.png)


## 1hまでの時間と投稿時間を比較
1h前の時間と投稿時間を比較する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524088/6919cc0f-bbbc-8f19-f2bc-5ec75c81e872.png)
フィードの投稿時間の関数は以下の通り

```
ticks(convertToUtc(substring(items('Apply_to_each')?['publishDate'],0,sub(length(items('Apply_to_each')?['publishDate']),1)),'Tokyo Standard Time'))
```

## teamsへの投稿
条件式でyesの時はteamsで投稿するような処理を書きます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524088/e50b3933-63f0-2693-553b-12f03ba55584.png)

この辺りはよきように変えていただければよいかなと思います。

## 全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524088/bac0076d-151f-344f-5ae1-012606caed79.png)

# 結果の確認
Qiitaの投稿を行った後、1h待ってTeamsを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524088/95860942-6429-1c67-b45c-0e2f47013991.png)

# 終わりに
この記事を書くために結果的にめっちゃQiitaの投稿を頑張りました…
これをきに技術的な情報をどんどん発信できるような文化を作れるとよいなと思います。
Swiftにおける`Actor`とはなにか

# 1. Actorによって解決できること

複数スレッドでの非同期な作業を実装する場合、多くの場合で、キャッシュや結果などの共有の可変状態を参照するケースがあります。

これらは注意深く実装しないと、配列の更新中に別スレッドが配列にアクセスしてしまったり、真偽値の更新に失敗したりするなどの意図せぬ動きをすることがあります。

NSLockなどを注意深く用いることでこの問題を解決できますが、この解決方法はコストが高く、実装ミスなどにより容易に意図せぬ動きを発生させ、結果としてバグの原因となる可能性があります。

この問題を解決するのがActorです。

# 2. Actorの詳細

Actorは自分自身が管理する共有の可変状態への一貫した安全なアクセスを提供します。

このため、Actorの変数などにプログラムの他の要素が並列アクセスすることはありません。

Actorは通常の型と似た振る舞いをします。

Actorの目的は共有の可変状態を管理することのため、Actorはクラスと同じ参照タイプです。

下記のようなシンプルなコードでActorは定義でき、Actor定義であるために、valueへの並列アクセスは発生しません。

```swift
actor Wallet {
	var amountOf1000Yen: Int

	func add1000Yen() -> Int {
		amountOf1000Yen = amountOf1000Yen + 1

		return amountOf1000Yen
	}
}
```

ただしActorのコードはその性質上非同期になるので、呼び出し側は下記のように awiat を付与し非同期であることを表す必要があります

```swift
let counter = Wallet()

Task.detached {
	print(await counter.add1000Yen())
}

Task.detached {
	print(await counter.add1000Yen())
}
```

この問題は、ActorにProtocolに適合させる際に問題となりえます。

例えば、Wallet Actorを拡張し、WalletID型をもたせ、WalletをHashableプロトコルに準拠させてみましょう。

```swift
actor Wallet {
	var id: WalletID
	var amountOf1000Yen: Int

	func add1000Yen() -> Int {
		amountOf1000Yen = amountOf1000Yen + 1

		return amountOf1000Yen
	}
}

extension Wallet: Hashable {
	func hash(into hasher: inout Hasher) {
		hasher.combine(id)
	}
}
```

実際には上記のコードはコンパイルできません。

なぜなら、hash関数の呼び出しは同期で行う必要があり、Actorへの同期呼び出しを許可してしまうと、Actorの内部状態の保護を継続できないからです。

この問題は、`id` を `let` にし、 `hash`関数の頭に `nonisolated` attributeを付与することで解決できます。

```swift
actor Wallet {
	let id: WalletID
	var amountOf1000Yen: Int

	func add1000Yen() -> Int {
		amountOf1000Yen = amountOf1000Yen + 1

		return amountOf1000Yen
	}
}

extension Wallet: Hashable {
	nonisolated func hash(into hasher: inout Hasher) {
		hasher.combine(id)
	}
}
```

`nonisolated` attributeをつけた関数はActorの管理外とみなされるため、varで宣言されたプロパティにアクセスすることはできません。

# 3. 特別なActor

iOSアプリ開発において多くのUI処理は下記コードのようにMain Thread上で行う必要があります。

```swift
let userNameLabel = UILabel()

// 実行スレッドがMainThread以外の場合に備えてUIへの反映をMainThreadで非同期で行うように指定する
DispatchQueue.main.async {
	userNameLabel.text = "h1d3mun3"
	userNameLabel.isHidden = false
	view.addSubView(userNameLabel)
}
```

毎回 `DispatchQueue.main.async` と書くのは面倒くさいですし、何よりコードを書いている最中に実行スレッドの考慮がもれ、バックグラウンドでUIを操作してしまうかもしれません。

Actorのなかでも、処理がMainThread上で行われることが保証されているMainActorというものがあります。

上記のサンプルをMainActorで書き直してみると下記のようになります

```swift
let userNameLabel = UILabel()

@MainActor func updateUserNameLabel(to userName: String?) {
	userNameLabel.isHidden = (userName == nil)
	guard let userName = userName else { return }

	userNameLabel.text = userName
}

await updateUserNameLabel(to: "h1d3mun3")
```

この `@MainActor` Attributeは関数だけではなく下記のようにクラスにも適合させることができます

```swift
@MainActor final class SomeUsefullMainThreaViewController: UIViewController { .... }
```

# 4. おわりに

[同時に発表された `async/await`](https://qiita.com/h1d3mun3/items/3f8627a3fe9b12e69f88) と併用することで非同期処理をよりかんたんに、そしてより安全に記述することができます。

私の関わるプロダクトにおいても、随時検討を進めた上で導入し、より安全なプロダクトにしていきたいと考えています。
Prefix_pathに引数を入れる理由

こんにちは！テックアカデミーのWebアプリコースを受講している駆け出し高校生エンジニアの安田駿介です。

今回は、「Ruby <%= %>内でstyle要素を書く方法」というテーマで解説していきます。

#Prefix_pathに引数を入れる理由
結論を言うと、Prefix_pathで呼び出すURLに、引数の内容を補足するためです。

例えば、
![cc3b604c13ba618ca6b9889defddc205.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1903726/14e5e8ea-80ce-032a-d173-1792c2c89a77.png)
というコードがあったとします。

このコードの意味は、「作成したレコード一覧のページを表示する」です。

これに(current_user)という引数を指定すると、

![eb824e503c0e4a3b5d5f53b53d71903d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1903726/24937847-54af-6f71-8096-d81643c54d10.png)

「ログインしているユーザの作成したレコード一覧」という意味になります。

#開発環境
・Cloud9
・Ruby 3.0.0
・Rails 6.1.3.1
gitとgithubの連携で、sshキーを更新しても上手くいかない時の対処法


####gitとgithubの連携が上手くいかない！

https://miya-system-works.com/blog/detail/128

gitとgithubの連携をする際、
調べた上記記事を見ながらよくわからないまま「ハイハイこんな感じね」と
適当に進めていざ接続したりpushしようとしたりとしたところ、

```
Git: Host key verification failed.
```

と表示され、sshキーを再作成しても上手くいきませんでした。
いろいろ調べたところ、手順はvscodeを使おうが使わまいがほぼ同じ……。

どうやら、コマンド実行時の操作が間違っていたためうまくいかなかったと判明。

↓同じミスをしていたが他にもいらっしゃったようです。

https://teratail.com/questions/234715

https://www.webdevqa.jp.net/ja/git/git%E3%82%A8%E3%83%A9%E3%83%BC%EF%BC%9A%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB-host-key-verification-failed/1070569869/

####解決方法！

```
ssh -T git@github.com
```
上記コマンドなどでssh接続する時、

```
Are you sure you want to continue connecting (yes/no/[fingerprint])?
```

この表示が出た時にEnterキーを押していたため、

git君「何も入力しないってどういうこと！？
　　　　yesかnoか、フィンガープリントで答えてって言ってるじゃん！！」

となって上手くいかなかったったようです。
yesと入力してEnterキーを押したら、普通に上手く行きました。
表示されたメッセージはよく読もう！