OmniAICreator/Qiita-1.07M huggingface dataset:
tableの要素取得と計算結果の表示

JavaScriptを使って、tableの値の取得と表示を勉強したのでまとめました。
以下の表を例に、｢値段｣×｢個数｣の値を｢合計金額｣の欄に埋めていきます。
<html>
<table>
<tr>
<td>品物</td><td>値段</td><td>個数</td><td>合計金額</td></tr>
<tr><td>りんご</td><td>100</td><td>3</td><td></td></tr>
<tr><td>みかん</td><td>120</td><td>4</td><td></td></tr>
<tr><td>ぶどう</td><td>150</td><td>2</td><td></td></tr>
</table>
</html>

```HTML
<!--ソース-->
<html>
<table>
<tr>
<td>品物</td><td>値段</td><td>個数</td><td>合計金額</td>
</tr>
<tr>
<td>りんご</td><td>100</td><td>3</td><td></td>
</tr>
<tr>
<td>みかん</td><td>120</td><td>4</td><td></td>
</tr>
<tr>
<td>ぶどう</td><td>150</td><td>2</td><td></td>
</tr>
</table>
</html>
```
HTML内のタグの要素の取得は

```JavaScript
document.getElementsByTagName("タグ名")[番号].textContent; //番号は0始まり
```
を使います。
例えば、りんごの値段100円を取得する場合は、0始まりで5番目のtdタグなので

```JavaScript
var value = document.getElementsByTagName("td")[5].textContent;     //変数valueに格納
```
となります。
同様にりんごの個数の取得は

```JavaScript
var n = document.getElementsByTagName("td")[6].textContent;         //変数nに格納
```
valueとnを数値変換し、value*nをりんごの合計金額の欄に代入します。

```JavaScript
document.getElementsByTagName("td")[7].textContent = Number(value)*Number(n);
```

<html>
<table>
<tr><td>品物</td><td>値段</td><td>個数</td><td>合計金額</td></tr>
<tr><td>りんご</td><td>100</td><td>3</td><td>300</td></tr>
<tr><td>みかん</td><td>120</td><td>4</td><td></td></tr>
<tr><td>ぶどう</td><td>150</td><td>2</td><td></td></tr>
</table>
<script type="text/javascript">// <![CDATA[
var value = document.getElementsByTagName("td")[5].textContent;     //変数valueに格納
var n = document.getElementsByTagName("td")[6].textContent;         //変数nに格納
document.getElementsByTagName("td")[7].textContent = Number(value)*Number(n);
// ]]></script>
</html>

for文を使って複数行の計算をすると

```JavaScript
var value;
var n;
for(var i =0; i<3; i++){
    value = document.getElementsByTagName("td")[4*i + 5].textContent;
    n = document.getElementsByTagName("td")[4*i + 6].textContent;
    document.getElementsByTagName("td")[4*i + 7].textContent = Number(value)*Number(n);
}
```

<html>
<table>
<tr><td>品物</td><td>値段</td><td>個数</td><td>合計金額</td></tr>
<tr><td>りんご</td><td>100</td><td>3</td><td>300</td></tr>
<tr><td>みかん</td><td>120</td><td>4</td><td>480</td></tr>
<tr><td>ぶどう</td><td>150</td><td>2</td><td>300</td></tr>
</table>
</html>
ありがとうございました。


参考:https://developer.mozilla.org/ja/docs/Web/API/Document/getElementsByTagName
シンボリックリンクとハードリンクの違いって？

シンボリックリンクとハードリンクの違いや使い分けについてご存知でしょうか？
自分はよく知らなかったので、関連する記事をいろいろ探してみました。

図として直感的にわかりやすかったのはこちらの記事。
それぞれの特徴についてもわかりやすく書かれています。
https://eng-entrance.com/linux-permission-link

# シンボリックリンク

シンボリックリンクはショートカットというイメージがわかりやすいのではないでしょうか？
`original_fname`というファイルを参照するシンボリックリンク`symkink_fname`を作成することを考えてみましょう。

./original_fname
./symlink_fname

ここで

```bash
cat ./symlink_fname
```

を実行すると

```bash
cat ./original_fname
```

と同等の操作を意味するはずです。
つまり、

```bash
rm ./symlink_fname
```

は

```bash

rm ./original_fname
```
と同等になってしまい、元のファイル`original_fname`を削除することになってしまいます。

これに関して、シンボリックリンク削除時の注意点が例えばこの記事に書かれています。
https://mimirswell.ggnet.co.jp/blog-165
要は`rm`コマンドでもリンクを削除できるけど、危ないから`unlink`を使おうね、という話です。

# ハードリンク

これに対し、ハードリンクはどうでしょうか。

./original_fname
./hardlink_fname

それぞれのパスは同じ実体ファイルを指し示すことになります。
この状態で

```bash

open ./hardkink_fname
```

を実行すると、

```bash
open <実体ファイル>
```

の意味になります。
面白いのは、実体ファイルへの参照カウンタのようなものがあり、

```bash
rm ./hardkink_fname
```

を実行すると、`./hardkink_fname`というパスは削除されてしまいますが、実体ファイルは削除されません。

なぜなら、今考えている状況だと元々
./original_fname
./hardlink_fname
の２つの「参照」が存在していたため、「参照」を１つ削除してもまだ１つ残っているからです。

そして、「参照」の数が０になると、実体も削除されるらしいです。

# inodeと実体ファイル

今までイメージを掴むために「実体」や「参照」という言葉を使ってきましたが、きちんと説明するにはinodeに触れる必要があります。

わかりやすいのはこちらの記事でしょうか。
https://qiita.com/katsuo5/items/fc57eaa9330d318ee342

# ハードリンクの使い道

一般的に使われるのはシンボリックリンクの方らしいですね。
では逆に、ハードリンクはいつ使われるのでしょうか？

こちらの質問に対する回答を読むと、なるほど！と思えます。
https://q.hatena.ne.jp/1265361495

IMAPサーバで、送信先が複数人のメールを参照するのに使われているとのこと。
コピーせずに済む＆適切に削除が行われる、ということですね。


...勉強になりました！
【bash】Gitのブランチ名を「$」前に表示させる

## はじめに
Gitを使っていて毎回ブランチを確認する際に

```
$ git branch
```

を使っていましたが、割とこのコマンドを使うことが多く、もっと楽に確認できる方法がないかなと探していた際にブランチ名を常に表示させておく方法があるとのことで、今回はその設定方法について書いています。

<br>

```
xcodeを使って入れたGitのバージョン

$ git --version
git version 2.20.1 (Apple Git-117)
```

<br>

他の記事（Homebrewを使ってインストールした記事）では、HomebrewでインストールしたGitを参照しているようですが、自分の実行コマンドのパスはxcodeをインストールした際のGitを参照しています。


```
Homebrewでインストールした場合のパス

$ which git
/usr/local/bin/git
```

```
xcodeでインストールした際のパス

$ which git
/usr/bin/git
```

<br>

Homebrewでインストールした場合は、`/usr/local/etc/bash_completion.d/`のフォルダ内に`git-completion.bash`と`git-prompt.sh`の2つのファイルが存在するらしいんだけど、xcodeでインストールしてそのままの場合は、そのようなファイルはなかった。

```
$ ls /usr/local/etc/bash_completion.d/
brew		brew-services	npm		tmux
```

### やったこと

#### ①以下のコマンドからHomebrewでインストールしたパッケージを表示しても`git`は見当たらないことを確認。

```
$ brew list
```

#### ②Homebrewを使ってGitを上書き

```
$ brew install git 
　
$ which git
/usr/local/bin/git

$ ls /usr/local/etc/bash_completion.d/
brew			git-completion.bash	npm
brew-services		git-prompt.sh		tmux
```

無事二つのファイルが追加されています。

#### ③.bash_profileに以下を記述

```
$ vim ~/.bashrc
```

```
source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true

export PS1='\[\e[30;47m\] \t \[\e[37;46m\]\[\e[30m\] \W \[\e[36;49m\]$(__git_ps1 "\[\e[37;102m\] \[\e[30m\] %s \[\e[0;92m\]")\[\e[49m\]\[\e[m\] \$ '
```


パスを通して完了！

```
$ source ~/.bash_profile
```

![スクリーンショット 2020-04-05 17.18.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298333/8b1e52c6-96a9-8a15-3298-5ec9dcb84c9c.png) 

### 参考にした記事

 - [macOSのgitをXcode Command Line Tools版からHomebrew版に乗り換えてみた](https://qiita.com/306_san/items/3cab1882e3035c646a65)
 - [ターミナルの表示内容(プロンプト)の変更・カスタマイズ方法まとめ](https://qiita.com/hmmrjn/items/60d2a64c9e5bf7c0fe60)
 - [bashでgitのブランチ名を表示させる。](https://qiita.com/kuniatsu/items/e2de0d37cdb63b77fbd4)
C言語　ALDS1_4_A　Linear Search

##問題

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_4_A&lang=jp

##コード
```c
#include <stdio.h>

int search(int A[], int N, int key)
{
    int i = 0;
    A[N] = key;

    while (A[i] != key)
        i++;
    return (i != N);
}

int main(void)
{
    int N, Q, i, key;
    int S[10000 + 1];
    int count = 0;

    scanf("%d", &N);
    for (i = 0; i < N; i++)
        scanf("%d", &S[i]);

    scanf("%d", &Q);
    for (i = 0; i < Q; i++)
    {
        scanf("%d", &key);
        if (search(S, N, key))
            count++;
    }
    printf("%d\n", count);

    return 0;
}
```

##ポイント
- 番兵を使った線形探索

##所感
- 時間かけすぎた

所要時間：40分
Stripeでcurlとnodeで本人認証させる

## やりたいこと

コネクトユーザーの支払いを許可させたい。本人認証させる必要ある。それをやる。

## 実装

下記を実行すると、帰ってきたオブジェクトの中に、idとして `file_1GUっfSf0BQn020fejfnjefはじゃあPvW2l9Z`　がある。これが、stripeへアップされた画像

```
curl https://files.stripe.com/v1/files \
  -u sk_test_xAaibYPLIWdjへ于fへhふぇB: \
  -F file="@/Users/img-user/Desktop/img.jpg" \
  -F purpose=identity_document

```


で、そのidを用いて画像を確認するには下記


```
curl https://files.stripe.com/v1/files/file_1GUっfSf0BQn020fejfnjefはじゃあPvW2l9Z \
  -u sk_test_xAaibYPLIWdjへ于fへhふぇB:

```

で、その画像を本人確認の画像にするにはこんな感じ `acct_1GUSフォエフェおf` がコネクトのユーザーね。


```
  stripe.accounts.update(
    'acct_1GUSフォエフェおf',
    {
      legal_entity: {
      type: 'individual', 
      verification:{document:{front: 'file_1GUっfSf0BQn020fejfnjefはじゃあPvW2l9Z' } }, 
```
Qiita投稿の流れ

#はじめに
2020年4月時点の情報です。

#背景
プログラミング学習を記録するツールとして利用していくつもりです。
現在は統計解析学習のためにPythonを学んでいるところです。
ド初心者です。お手柔らかにお願いします。

#投稿の流れ
###アカウント作成
・Qiitaヘッダーから**新規登録**を選択する
・アカウントを作成する。
　Github, Google, Twitterアカウントと連携して作成できる。
・登録アドレスに認証メールが届くので**24時間以内**に認証を完了する。

###アカウントの設定
・アカウントの公開設定、通知設定を行う。

###投稿内容を編集する
・ヘッダーから**投稿する**を選択する。
・"タイトル"、"タグ"をつける。
　タイトル：内容が伝わりやすいように書く。
　タグ：関連する言語、環境など5つまでタグ付けできる。
・本文を編集する。
　本文：Markdownを使って編集する。
　　　　[参考：Markdownの書き方](https://www.asobou.co.jp/blog/bussiness/markdown)
　内容：以下リンク先が参考になりました。投稿前の確認にも利用できます。
　　　　[参考：Qiita規約](https://help.qiita.com/ja/articles/qiita-community-guideline)
　　　 　[参考：良い記事の書き方](https://help.qiita.com/ja/articles/qiita-article-guideline)

###投稿
・フッターの**Qiitaに投稿**から記事を投稿する。

#参考記事
こちらの[Qiita記事](https://qiita.com/kanineshi/items/1204d4a4f6342c144117)を参考にさせていただきました。

#最後に
Markdownは不慣れでしたが、一回書くとそんなに苦もなく使えるようです。
むしろ書きたい内容の項目化・階層化の方が、今後課題になりそうな気がしました。
これまでのアウトプット不足を少しでも解消すべく、頑張って記録をつけていきたいと思います。
お見苦しい文章になっているかとも思いますが、読んでくださった方がおられましたらお礼を申し上げます。
DockerのUbuntuを通常のUbuntuに戻す

#これはなに
DockerでインストールしたUbuntuは、最小限のパッケージしかインストールされていないので、コマンドを叩くと大半が```command not found```と怒られます。
これを通常のUbuntuに戻したいです。

#解決策
コンテナ内で、

```
$ unminimize
```

と入力すると、プリインストールのパッケージがほとんどインストールされます。

#Dockerfile

Dockerfileに

```Dockerfile
FROM ubuntu
RUN unminimize
```

と記述すると

```
The command '/bin/sh -c unminimize' returned a non-zero code: 1
```

と怒られてしまいました。
代わりに、

```Dockerfile
FROM ubuntu
RUN yes | unminimize
```

とすることでパッケージがインストールされます。
【AppleScript】MacからeGPUと外付けHDDを一気に取り外す

## やりたいこと
家でeGPUや外付けHDDを繋いで使っているMacを持ち出す際、そのままケーブルを引っこ抜くと警告が出るので、ちゃんと取り外しの操作をしてからケーブルを抜きたい。

## 方法
```applescript
on run
	tell the application "Finder" to eject (every disk whose ejectable is true)
	do shell script "/usr/bin/SafeEjectGPU Eject"
end run
```
2行目でHDD類の取り外し、3行目でeGPUの取り外しを行っています。
あとはそのまま.app化（ファイル-書き出す でファイルフォーマットにアプリケーションを選択）するなり、Automatorでサービス化してショートカットキーを割り当てるなり、ご自由に。

## 参考
[簡単にMacから全てのディスクを取り外す](https://qiita.com/hsylife/items/063722ec489d8e407426)
[Proper way to disconnect eGPU through scripting \|Apple Developer Forums](https://forums.developer.apple.com/thread/104762)
Flutter環境構築 - 2（Xcode・iOSシミュレーターセットアップ編）

#はじめに
今回はFlutter環境構築第2弾 「Xcode・iOSシミュレーターセットアップ編」です！
Flutter SDKのインストール・Flutterコマンドのセットアップがお済みでない方は、
先に「[Flutter SDKインストール編](https://qiita.com/naru_chan__/items/359fcdfb8aa092e9a44e)」をご覧ください。

**Flutter環境構築シリーズ**
・[Flutter環境構築 - 1（Flutter SDKインストール編）](https://qiita.com/naru_chan__/items/359fcdfb8aa092e9a44e)
・[Flutter環境構築 - 3（Android Studio・Androidエミュレータセットアップ編）](https://qiita.com/naru_chan__/items/94e8e2f85bd1803feddd)
・[Flutter環境構築 - 4（VSCodeセットアップ編）](https://qiita.com/naru_chan__/items/1cf6f3d43beb97698592)


#「iOSシミュレーター実行編」でやること
本編では以下の項目を行います。

- Xcodeのインストール
- iOSシミュレーターのセットアップ
- Flutterアプリを作成し実行する

では次項目より実際に作業していきます。

#Xcodeをインストールする
#### 1.App StoreよりXcodeをインストール
App StoreにてXcodeを検索し、インストールします。

すでにインストールされている方はアップデートがないかを確認し、
最新バージョンでなければアップデートする方が吉だと思います。
 ※ Flutter公式サイトより引用 ※
[ 最新の安定バージョンより古いバージョンでも動作する可能性がありますが、Flutter開発にはお勧めできません。古いバージョンのXcodeを使用してビットコードをターゲットにすることはサポートされておらず、機能しない可能性があります。 ]
<img width="718" alt="スクリーンショット 2020-03-30 8.43.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/f420ab4c-6a95-5882-61b1-11344624e3b4.png">

#### 2.最新Ver.のXcodeを使用するようにXcodeコマンドラインツールを構成
ターミナルにて以下を実行します。
パスワードを求められるので入力します。

```
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
sudo xcodebuild -runFirstLaunch
```

#### 3.Xcodeライセンスの確認
以下を実行し内容を確認します。
**spaceキー**で下にスクロールすることができます。
**qキー**でページを抜けることができます。

```
sudo xcodebuild -license
```
ページを抜けた後、以下を入力することでライセンスに同意します。

```
agree
```

#iOSシミュレーターのセットアップ

#### 1.iOSシミュレーターを実行
ターミナルにて以下を実行します。

```
open -a Simulator
```

するとiOSシミュレーターが立ち上がります。
<img width="348" alt="スクリーンショット 2020-04-05 16.51.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/d47bf06c-4767-28b4-e429-a970f0a638bf.png">


#Flutterアプリを作成し実行する
シンプルなFlutterアプリを作成し、実行していきます。

#### 1.ディレクトリ作成
今回のサンプルアプリ用にディレクトリを作成します。
各々好きな名前で構いません。

```
mkdir 好きな名前
```

#### 2.作成したディレクトリへ移動

```
cd 先ほど作成したディレクトリ名
```

#### 3.Flutterアプリ作成
以下コマンドを入力すると、
先ほど作成したディレクトリの中に
my_appというサンプルのFlutterアプリが作成されます。

```
flutter create my_app
```

#### 4.作成したmy_appへ移動

```
cd my_app
```

#### 5.iOSシミュレーターでmy_appを実行
iOSシミュレーターを起動した状態で以下を実行します。

```
flutter run
```

するとiOSシミュレーター内でmy_appが実行されます。
右下の**＋ボタン**を押すと数字がカウントアップされます。
ターミナルで**qキー**を入力するとアプリを終了できます。
<img width="348" alt="スクリーンショット 2020-04-05 17.23.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/c412abe3-a9c3-0694-1481-304b72d2332d.png">
これでシンプルなFlutterアプリの作成・実行ができました！

#最後に
以上で「Xcode・iOSシミュレーターセットアップ編」は終了となります。お疲れさまでした。
実機にてアプリの確認をしたい場合は[Flutter公式サイト](https://flutter.dev/docs/get-started/install/macos)の
「Deploy to iOS devices」欄を参考にしてみてください。

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

**Flutter環境構築シリーズ**
・[Flutter環境構築 - 1（Flutter SDKインストール編）](https://qiita.com/naru_chan__/items/359fcdfb8aa092e9a44e)
・[Flutter環境構築 - 3（Android Studio・Androidエミュレータセットアップ編）](https://qiita.com/naru_chan__/items/94e8e2f85bd1803feddd)
・[Flutter環境構築 - 4（VSCodeセットアップ編）](https://qiita.com/naru_chan__/items/1cf6f3d43beb97698592)

参考サイト[[Flutter公式サイト](https://flutter.dev/)]
TECH CAMP(旧TECH::EXPERT)のプログラミング学習10週間を終えた感想

#TECH CAMP(旧TECH::EXPERT)70期として卒業した感想

2019年12月末日に前職を退職し、2020年1月20日にプログラミングスクールの**TECH CAMP**短期転職コースに入学しました。
ご存知の方も多いかもしれませんが、TECH CAMPは某ビジネス系YOUTUBERの社長が経営している**プログラミング界のライザップ的なスクール**です。
10週間毎日10時間教室でみっちり勉強して、個人アプリ開発とチーム開発ができるようなレベルまで到達出来ます。

とはいえ実際のところどうなの？本当にやり切れるの？:expressionless:と思う方もいらっしゃると思うので、そこも含めて良かった点と悪かった点含めた感想を述べます。

##良かった点

・基礎カリキュラム（最初の2週間）はオフラインでメンターに質問し放題
・応用カリキュラム（基礎が終わった後の3週間でチャットアプリを作る期間）中にもオンラインで質問できる
・同期の仲間が40人くらいいるので、**一緒に勉強しよう！とモチベーションを高め合える**
・メンターに聞く以外にも、同期で教えあって理解を深めていくことができる
・教室にいくことで、**否が応でも勉強する環境を利用できる**

##悪かった点

・ライフコーチ(技術面以外でサポートしてくれる人)のサポートについては、ほとんど利用する機会がない。向こうからの連絡もほぼないので正直恩恵を感じられなかった
・**オンラインの質問の待機時間が長く、一番長い時で30分近く待ったことも**
・メンターの理解度に個人差があるので、すぐに解決出来なかったりする。態度がイマイチな人もいる（ほとんどの方はすごくいい人です）
・チーム開発の際、受講生一人一人の技術力やモチベーションにバラつきがあるため、**チームによっては非常に苦労する**

##個人的な感想

私個人としてはスクールに通って良かった！！！と満足しております。(まだ就職先は決まっていませんが)
オンラインだと絶対に挫折すると思い、オフラインで学習するこちらのスクールを選びました。そのおかげで10週間走りきることが出来たと思います:runner:

しかし、ライフコーチがサポートするから**絶対に挫折させない！というのは正直期待ハズレ**でした。一人につき一人ライフコーチがついてメンタルのサポート・やりきる計画を立ててくれるとのことでしたが、ライフコーチはたくさんの受講生を担当しているのでこちらから連絡しない限りサポートは受けられません。（人気スクールで人員不足のためではないかと思います）進捗が遅れている人には連絡をして来るのでしょうが、結局挫折していく人は結構います。実際、私の同期も最初の人数の1/3くらいは辞めていったので少しショックでした。夜間コースはもっと辞めていく人の割合が高いようです。

なんか不満のほうが多くない？と思われたかもしれませんが、同期に素晴らしい方が多かったのでとても楽しく学習でき、トータルでは満足の方が大きかったです！これが一番の達成できた要因と言ってもいいですね:grinning:
個人アプリ、チームでのフリマアプリ開発ではメンターに頼ることはほとんどできません。それゆえ同期で教えあって解決していくことがとても重要になってきます。**皆で頑張っていこうよという雰囲気が自然と生まれ、一人で学習するよりも楽しく学習することができました！**こういった環境もスクールあってのものなので、そこはすばらしい点だと思います。
独学でモチベーションが保てず辛いと感じている人、エラーが解決できなくて先に進めない・・・って方にはスクールを検討することをお勧めします:thumbsup_tone2:

###就職活動について

今私は就職活動中なのですが、途中経過の感想も書かせて頂きます。
TECH CAMPでは卒業する前から一人につき一人キャリアアドバイザーと呼ばれる人がつき、就職のサポートをしてくれます。
今はコロナの影響もあって求人数が少なく、結構苦戦しています。
スクールからの応募も、**応募者が多い場合はまずスクール受講生の中で選考されてふるいにかけられて、応募すらできない場合があります**。（私は実際すでにスクールの社内選考で2回見送られています:joy:）
そのため、現状はスクール経由以外での応募も積極的にしていかないといけないです。wantedlyの応募も返事がきているのは今の所6/20社で、そのうち4社は未経験のためお祈りされました。
この厳しい状況の中、自分の気になる企業に内定をもらえるのか・・・就活での経験も後々発信していけたらと思います。

##総括

最後になりますが、スクールは独学に比べて挫折しにくいと思います。ただ、それも本人の覚悟によるところが大きいと思っています。私がTECH CAMPに通うことを決めた理由は、オフラインでみっちり勉強できる環境の他に、60万(当時の価格)払うということもありました。

**安いお金で勉強できる方がいいじゃん、何言ってんの？**と思う方もいるかもしれません。ですが、私は**60万という大金を払って通うことで自分を追い込むことができた**と思います。というのも、私はAmazonPrime会員ですが、月に1回PrimeVideo観るかどうかくらいしか使っていません。Prime会員の年会費は4900円なので、一月500円もかかりません。なので、まあ観なくてもいいや！500円だし！という思考になります。でも、60万だとそうはいきません。60万も払ったんだからと覚悟を決めて必死になって勉強し、辞めたいという気持ちに負けずに踏ん張ることができました。

なので、スクール費用で悩んでる方には、**自分を追い込み自分を変えるための費用**だと考えてもらえたらと思います（もちろん金銭的にかなり厳しい場合は、無料スクールを利用するべきです）。実際、私はスクールに通う前は土日は寝っ転がってスマホをいじる一日を過ごしていましたが、今は習慣を身につけて朝からカフェで勉強できるようになりました。
**私は自分の人生を変えるために、身銭を切って覚悟を決めて良かったと心から感じています！**

スクールのこともっと知りたい！という方がいらっしゃいましたら、お気軽にご質問ください:kissing_smiling_eyes:私も通う前はめちゃめちゃ不安だったので・・・
ここまで読んでいただき、ありがとうございました！！！
Azure Kinect DK：Body Tracking SDKの実行環境をBootCampで構築する

# はじめに
BootCamp + eGPUでAzure Kinect Body Trackingを実行する環境を構築しました。
構築から実行までの方法について紹介します。

※ Appleによると、BootCampでのeGPU利用は公式では認めておらずサポートされていません。（2020/4/5現在）
<font color="Red">構築される方は自己責任でお願いします。</font>

# 背景
* Azure Kinect Body Trackingを”まともに”利用するには、CUDAが実行可能なNVIDIA製のGPUが必要
* 自分はMacしか持っておらず、現時点でiGPUはAMDかIntelの内臓チップしか選べない
* Body TrackingはCPUだけでも動きますが、私の環境ではFPSが出ず使い物にならない

ということで、eGPUを使って解決する！

# 環境
* MacBook Pro
    * 10.13.16（High Sierra) 
* BootCamp
    * Windows 10 Pro バージョン1909
* eGPU
    * [MANTIZ MZ-02](https://mymantiz.com/products/mz-02-venus)
    * [NVIDIA Geforce GTX1050 Ti](https://www.kuroutoshikou.com/product/graphics_bord/nvidia/gf-gtx1050ti-e4gb_sf_p/)
* [AZURE Kinect DK](https://azure.microsoft.com/ja-jp/services/kinect-dk/)
* 外部ディスプレイ
    * HDMI

# eGPU（NVIDIA） + BootCampの環境を構築する
## 環境構築
### 準備
Macに外部機器が接続されている場合、全て外しておいてください。
何かしら接続されていると、<font color="Red">この後の工程でクラッシュする</font>場合があります。

### eGPUを接続して、NVIDIAのドライバをインストール
1. eGPUを接続せずに、Windowsを起動します
2. Windows起動後、サインインしてデスクトップを表示します
3. eGPUをMacに接続します。<font color="Red">（MacとeGPUとの接続は、Thunderbolt3ケーブルを使用します）</font>
4. ドライバーインストールのダイアログが表示されるので、指示に従いドライバをインストールします
![IMG_4840.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60152/09436b47-1de5-a79e-2c2b-f4bb44828d31.jpeg)
5. ドライバインストール後、デバイスマネージャを開き、インストールしたばかりの「NVIDIA Geforce GTX1050 Ti」を**無効**にします<font color="Red">（警告バッチがついている場合がありますが、気にしない...）</font>
6. Windows 10をシャットダウンします。

### 正しく認識されるか確認する
1. eGPUと外部ディスプレイ、eGPUとMacを接続する
2. Macの電源を入れて、Windows10を起動する
3. デバイスマネージャを開き、「NVIDIA Geforce GTX1050 Ti」を**有効**にすると、外部ディスプレイにデスクトップが表示されます
![キャプチャ8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60152/f5ed3668-d713-db28-f811-96a867d74fb1.png)
無事、表示されました。

### Windowsをシャットダウンする場合
eGPUは**使用するときは有効**に、**使用しないときは無効に**すると、安全な気がします。
なので、自分はデバイスマネージャの「NVIDIA Geforce GTX1050 Ti」を**無効**にしてから、Windowsをシャットダウンするようにしています。

## Azure Kinect DKを接続して、Body Trackingの実行確認
### Body Tracking SDKをインストール
1. [MSのサイト](https://docs.microsoft.com/ja-jp/azure/Kinect-dk/body-sdk-download)よりSDKをダウンロードします。
2. SDKをインストールします。

### Azure Kinect Body Tracking Viewerを実行
1. Azure Kinect DKをeGPU側のUSBポートに接続
2. Azure Kinect Body Tracking Viewerを実行します
<font color="Red">（CUDAの実行環境が正しく構成されていない場合は、Viewerは起動しません）</font>

```
$ <SDK Installation Path>\tools\k4abt_simple_3d_viewer.exe
```

![IMG_3705EC5C122B-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60152/337bbc36-3593-8ea6-f220-5b094c742479.jpeg)
動きました！
FPSも出てますね。

# 気づいた点・注意点など
* 参考にしたサイトではiGPUを無効にする必要があるとなってましたが、自分の環境では必要ありませんでした
* 外部機器がUSB経由でMacに接続された状態でセットアップすると、クラッシュや強制再起動などが多発しました
* 関係があるかわかりませんが、、、MacBookのThunderboltポートの場所によってはうまくいかないこともあるようです （自分は左側のポートを使っています）
iterm2をいい感じにしたい。

# ガイダンス
この記事は筆者がiterm2を弄ってそれっぽくなったので忘備録として手順を記述していきます。

環境:zsh,iterm2

**やること**

- starshipのインストール
- iterm2の配色設定
- サジェスト機能の追加

# 先にお披露目
こんな感じになりました　・。・
![ezgif-2-19eda1f191b2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565068/5e253897-4e26-12ba-b81c-9f5ad9d920b9.gif)

サジェスト機能はエモいですね！

# starshipのインストール手順

[starship公式](https://starship.rs/ja-jp/guide/#%F0%9F%9A%80-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)にアクセスして手順を見ながら頑張る。

フォントは[FiraCode](https://github.com/tonsky/FiraCode)でTTFをダウンロードしてきてインストールします。
<img width="1440" alt="スクリーンショット 2020-04-05 16.41.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565068/8cfd1250-7163-f397-c6e6-ec0bbca9c5d2.png">

```brew install starship```が一番手っ取り早いと思います。

vimで~/.zshrcに下記のコードを記述します。

```~/.zshrc
 eval "$(starship init zsh)"
```

これでstarshipは使えるようになったはずです。

# iterm2の配色設定

iterm2を開いて ⌘ + ,キーで設定を開きます。
<img width="1440" alt="スクリーンショット 2020-04-05 16.59.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565068/0feb3988-c6d0-b37d-6a97-dbc793427a11.png">

ここで色々弄れます。（画像参照）
[てらの設定ファイル](https://drive.google.com/file/d/1P-kLDxaazl200Xv0sXxnVqwc4KOYoZHg/view?usp=sharing)

# サジェスト機能の追加

下記のコマンドを実行(インストール)

```
git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions
```

iterm2で下記のコマンドを実行し設定を開く

```
vi ~/.zshrc
```

開いたら下記のコードを追記（インストールした奴を使用するよと言う設定）

```~/.zshrc
source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh
```

iterm2で下記のコマンドを実行（設定を読み込み直す）or再起動でも可。

```
source ~/.zshrc
```
Cloudtrailのログを、awsマネージドではないsparkのmetastoreに登録する方法

# はじめに
awsマネージドなSpark/hive環境であれば、 `com.amazon.emr.hive.serde.CloudTrailSerde` あたりを利用してmetastoreにテーブルを登録することができます。
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/cloudtrail-logs.html
しかし、 `com.amazon.emr.hive.serde.CloudTrailSerde` はawsマネージドではないSpark/hiveでは利用できません。

本記事では、databricksなどの **awsマネージドではないSpark環境** において、cloudtrailのログをmetastoreに登録する方法を説明します。

## 注意
* region/year/month/dayのpartitionが利用可能なようにcreate tableしています。
  * partitionは手動で追加する必要があります。手順参照。  
* hive上では、本手順では動きません。
  * とはいえ、ちょっとした変更で動くと思う

# 手順
## tableの定義
以下のqueryで `CREATE TABLE` をします。 `{}` 内は適宜書き換えてください。
`{table_path}` は、一般的に `s3a://{CloudTrail_bucket_name}/AWSLogs/{Account_ID}/CloudTrail/` の形式になります。

列名/objectのkey名は大文字小文字を適切に指定しないと読み込まないので注意（ **本日の落とし穴** ）。

```sql:sparksql
CREATE TABLE {db}.{table}
(
  Records ARRAY<
    STRUCT<
      additionalEventData:MAP<STRING,STRING>, -- valueがmapでもintでもstringとして読んでくれるので、後で使う側に適当に処理してもらう
      awsRegion:STRING,
      errorCode:STRING,
      errorMessage:STRING,
      eventID:STRING,
      eventName:STRING,
      eventSource:STRING,
      eventTime:STRING,
      eventType:STRING,
      eventVersion:STRING,
      readOnly:STRING,
      recipientAccountId:STRING,
      requestID:STRING,
      requestParameters:MAP<STRING,STRING>,
      resources:ARRAY<MAP<STRING,STRING>>,
      responseElements:MAP<STRING,STRING>,
      serviceEventDetails:STRING,
      sharedEventID:STRING,
      sourceIPAddress:STRING,
      userAgent:STRING,
      userIdentity:MAP<STRING,STRING>,
      vpcEndpointId:STRING
    >
  >,
  region STRING,
  year STRING,
  month STRING,
  day STRING
)
USING json
PARTITIONED BY (region, year, month, day)
LOCATION '{table_path}'
;
```

## viewの定義
logを直接覗くとわかるのですが、Cloudtrailのlogは以下のようなjsonになっています：

```json
{"Records":[
  {"eventVersion":"1.05",...},
  {"eventVersion":"1.05",...},
]}
```

これは、Records内にすべての行と列が内包されており、扱いが面倒です。

そこで、この問題を解決するviewを予め定義しましょう。
以下のqueryで `CREATE VIEW` をします。


```sql:sparksql
CREATE OR REPLACE VIEW {db}.{view}
AS
  SELECT 
    Record.*,
    region,
    year,
    month,
    day
  FROM
    (
      SELECT
        explode(Records) AS Record,
        region,
        year,
        month,
        day
      FROM
        {db}.{table}
    )
;
```

## partitionの追加
ディレクトリ（prefix）が `{partition_key}={partiton_val}` の形式ではないため、 `MSCK REPAIR TABLE` を利用できません。
そのため、`ALTER TABLE ADD PARTITION` を使用します。
`{partition_path}` は、一般的に `s3a://{CloudTrail_bucket_name}/AWSLogs/{Account_ID}/CloudTrail/{region}/{year}/{month}/{day}/` の形式になります。


```sql
ALTER TABLE {db}.{table} ADD IF NOT EXISTS
  PARTITION (region='{region}', year='{year}', month='{month}', day='{day}')
  LOCATION '{partition_path}';
```
Excel VBA PasteSpecial で出るエラーの回避方法

# 事の発端
ExcelからWordにグラフをコピーしたかった。(１回だけではなく50回くらい色んなグラフをコピー処理をする)
PasteSpecialでコピーは出来るが、数回に一回はエラーがでることが分かった。
さて、どうしよう・・・。

## 環境
Windows 10
Excel 2019
Word 2019

# 自己評価
ExcelからWordにグラフを貼り付けるマクロを使う場合は、このページのサンプルコード参考にした方が絶対にいいです。

# PasteSpecial で出るエラーについて
PasteSpecialとは、クリップボードにコピーされた情報をペーストする関数です。
webで検索すると、DoEventを使えば、エラーが回避されるという情報もあります。

```
DoEvents
Sleep 75
DoEvents
```
上のようにすれば解決するとWebでは出てきますが、自分は解決しませんでした。

# 自分が考えた解決方法
・Excelに「Sheet1」という名前のWorksheetを作り、その中に「1」という名前のグラフを作っているものとした上で、以下のマクロを動作させます。

``` vb
Sub main()
    Dim wsh As Worksheet
    Set wsh = ThisWorkbook.Worksheets("Sheet1")
    
    '参照設定で、Microsoft Word 16.0 Object Libraryにチェックを入れる
    Dim wdApp As Word.Application
    Set wdApp = CreateObject("Word.Application")
    wdApp.Visible = True
    wdApp.Activate
    
    Dim wdDoc As Word.Document
    Set wdDoc = wdApp.Documents.Add
    wdApp.Selection.TypeParagraph

    Dim count As Long
    count = 0
    
    Dim i As Long
    For i = 0 To 100
        Call myCopy(wdApp, wsh.ChartObjects("1"))
    Next
    MsgBox "正常に処理を完了しました。"
End Sub

Sub myCopy(wdApp As Word.Application, obj As Variant)
    Dim msg As String
    Dim count As Long
    count = 0
    On Error GoTo myError
    obj.Copy
    wdApp.Selection.PasteSpecial Placement:=wdInLine, DataType:=wdPasteMetafilePicture
    wdApp.Selection.ParagraphFormat.Alignment = wdAlignParagraphLeft
    Exit Sub
myError:
    count = count + 1
    Sleep 100
    DoEvents
    If count = 10 Then
        msg = "回数:" & count & vbCrLf
        msg = "エラー番号：" & Err.Number & vbCrLf
        msg = msg & "エラーの種類:" & Err.Description
        MsgBox msg, vbExclamation
        End
    End If
    Resume
End Sub
```
・これで何度実行してもエラーは出ません。自分以外の環境でもエラーは出ないと思います。
・PasteSpecialでエラーが出ても、出来るまで繰り返せばいいんじゃないか？という強引な発想でしたが、これが正しい解決方法だと思います。Resume Nextで回避するのではなく、Resumeで繰り返しトライしています。
・myCopyの中の処理が重要です。参考にしてください。
・Web上のどこにもこのような解決方法は書かれていないので、このエラーで悩んだ人は、たくさんいただろうなと思います。
GCPの鍵管理

# 前置き

サービスから他のサービスへ接続するための鍵情報はどこに置くべきでしょうか？
コード中に書く、というのが一番ラクではあるのですがセキュリティ的にはよろしくないですね。

GCPだと鍵のようなシークレット管理サービスとしてsecret managerがあります。
[GCP secret manager 概要](https://cloud.google.com/solutions/secrets-management?hl=ja)

# 基本の使い方

鍵を保存、取得してくること自体は割と簡単です。
基本的にはWeb UIから鍵を設定して、アプリ中で呼び出す、という形になるはずです。
[GCP secret manager quick start](https://cloud.google.com/secret-manager/docs/quickstart?hl=ja#secretmanager-quickstart-web)

## 鍵の登録

まずsecret manager APIを有効にしておきます。
GCP consoleの[secret manager設定画面](https://console.cloud.google.com/security/secret-manager)に行きます。
この画面から鍵の登録が出来ます。

## 鍵へのアクセス

pythonだと以下のようなスクリプトでアクセス可能です。

```python
from google.cloud import secretmanager

client = secretmanager.SecretManagerServiceClient()

# ここでプロジェクト名(project_id)、鍵の名前(secret_id)、バージョン(version_id)を指定します。
# 基本は最新バージョンを使うはずですが、その場合はversion_id="latest" でアクセス可能です。
name = client.secret_version_path(project_id, secret_id, version_id)
response = client.access_secret_version(name)
# これで登録していた鍵情報が表示できれば成功です。
payload = response.payload.data.decode('UTF-8')
print('Plaintext: {}'.format(payload))
```

簡単ですね！基本はこのようなスクリプトをパクれば動くはずです。
しかし権限と環境によってアクセス出来たり出来なかったりするので注意が必要です。

# 権限と環境

「Secret Manager のシークレットアクセサー」(roles/secretmanager.secretAccessor)の権限が無いとsecret managerで管理している情報は見ることができません。
ちゃんとIAMの設定をしないとローカルだとうまくいくのにプロジェクト上では動かない、みたいなパターンが起こりえます。

## ローカル環境

オーナー権限(owner)だとsecret managerにアクセス出来ますが、編集者権限(editor)だとアクセスは不可です。
あなたが「編集者」でローカルでの開発が必要なら権限を付与してもらいましょう。

## ステージング、本番環境

もちろんアプリからはアクセスするでしょうからサービスアカウントにも忘れず付与しましょう。
ステージングだと設定してたのに本番のプロジェクトだと忘れてた……となってしまう可能性もあるので気をつけて。

## テスト環境

CIのテストが通らない！というパターンもありえます。ここに関してはCIのエージェントに付与する、というよりはテストではsecret managerにアクセスせずにダミーの鍵で成功するようにしたほうが良いかもしれません。鍵は機密情報ですからできるだけアクセスできる範囲を狭めるべきです。
また実行環境のプロジェクトがステージング、本番と異なるのでそもそもアクセス出来ないというケースもありえます。上記スクリプトは内部でGCPに対してAPIを叩いており、そのURI中でプロジェクト名を指定しているため（引数で指定しているproject_idとは別）仮に実行元のプロジェクトが異なる場合は403エラーが返ってくるはずです。

アクセス時に上手くいかない場合はログにエラー原因や実際に叩かれていたURIが示されてるはずなので、それを頼りにコードやGCPの設定を修正しましょう。

# 鍵の更新

鍵を変更するぞ、となったとき、version_id="latest"にしていればコードの変更無しに、新しいバージョンを追加すればすぐ更新できます。ただアプリ側に反映されてるかは要確認です。おおよそアプリ起動時に鍵情報をconfigとして設定し、それ以降は更新しない、という実装が普通ではないでしょうか。そのためインスタンスが再起動されないと古い鍵情報のままという危険性があります。仮にアプリに新しい鍵情報が反映されてないようなら再起動が必要かもしれません。オートスケールならほっといても再起動されてるかもですが、トラフィックを切り替えてみるとかでも良いです。

# 最後に

実装自体は比較的簡単ですがIAMの設定に失敗するとサービスがロクに動かず大惨事……ってなことになるのでしっかり動作確認をしましょう。
もっともsecret managerに置いてるから絶対大丈夫！ってものでも無いですが、最低限機密情報をコードとは別枠で管理するように変えましょう。
Output of "What is Scala?"

## 参考書籍
[実践scala入門](https://gihyo.jp/book/2018/978-4-297-10141-1)を読んで学んだことをアウトプットしていきます。
前回記事：[scalaのあれこれ](https://qiita.com/eve1224/items/7fa6f7d088bd7e9818d0)

## スケーラブルな言語
scalaの名前の由来はScalable Languageの頭文字。
Scalaの利用者と一緒に成長していくことができるという意味がある。
1行で済むスクリプトで済む仕事からミッションクリティカルま仕事まで幅広く使用できる。
Jvavaと比べて堅苦しくない簡潔な記述ができる。
コンパイル時点で多くのミスを発見することができる。
マルチパラダイムであることから拡張性(スケーラビリティ)に優れている。

## オブジェクト指向
全ての値はオブジェクトであり、それぞれのオブジェクトが持つ操作はメソッドとして定義される。
クラスとトレイトによる高度なコンポーネントアーキテクチャをサポートしている。
暗黙クラス(implicit class)を用いることでScalaだけでなくJavaクラスに対しても新しい処理を追加することができる。

## 関数型
段階的に関数型プログラミングに移行していくことができる。
スタイルに合わせて関数型プログラミングを行なっていくことができる。

## シームレスなJavaとの相互運用性
Javaのクラスを継承したり、Javaのインターフェースを実装したりすることは問題なくできる。
同じプロジェクトでも、別のプロジェクト内出会っても可能。
既存のJavaライブラリを使用できる。
JVM上で動作する。
近年ではJavaコミュニティにもscalaが影響してきており、scalaのAPIだけでなくJavaのAPIも提供している。

## 関数はオブジェクトである
scalaでは関数をオブジェクト指向でいうところのオブジェクトとしてとらえる。関数の型は通常のクラスで、代表的なデータ型はクラス階層として表現され、パターンマッチは任意のクラスに対して可能である。

## Futureへの対応
scala2.10から標準ライブラリにscala.concurrent.Futureをはじめとする非同期処理のためのモジュールが追加された。
これはマルチコアCPUを効率的に使う並行処理を活用したスケーラビリティが求められるサーバーアプリケーションの構築において大きな威力を発揮する。Javaと比べるとマルチスプレッド処理は非常に安全で効率的な実装を記述することが簡単になる。
2.12ではアクターモデルは標準ライブラリに含まれていない。デファクトスタンダードとしてAkkaが使用される。

## 楽しさ
Odersky氏はscalaプログラミングが楽しいということがもっとも重要としている。
ボイラープレートコードの少なさ、スムーズなフィードバックループでの開発が可能であると同時に、強い静的型による安全さを備えている。
実際の現場でも「scalaはより少ないコードでスピーディに機能を開発、提供することを可能とし、チームの再活性化させてくれた」との意見がある。

ボイラープレートコードとはJavaのアクセサ自動生成のような定期的で冗長なコードのこと
windows10 homeのwsl2でdocker

#　ご報告
　windows 10 homeでdockerでredmineを動かしました。
　すんばらしいですねえ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60225/9b6b5551-9541-4b8d-6319-bbeae63c9b1f.png)

ただ、これを行うと、vmwareの起動に抑止がかかる設定が追加されるので、vmwareをメインで使っている人は要注意だ。

# 内容
 windows10 2004というのが、これから(2020/4以降)リリースされる予定で、そこでは「本物のubuntu」が動くようです。
 私の場合は、「windows insider preview」から持ってきて、やっていますが、安定しているかどうかはわからないので、今はwindows updateを少し待った方がいいでしょうねえ。私はFASTを選んでしまったので、
「Version 10.0.19592.1001」まで進んでしまった(2020/4/4現在)ので、多分Slowで十分なんじゃないでしょうかね？（インストールのための必須条件は「Windows 10 ビルド18917以降」)なんで、無謀に進んでしまってますね。

# wsl2の魅力
　wsl(windows subsystem linux)ってのは、要するに、半分以上windowsをlinuxにする仕組みで、windows10には、「拡張インストール」でインストールできます。
　前のwslはdockerを動かすのに、windows 10 proが必要とかで、困ってたんですけど、今回のosバージョンアップで無事、homeで最新のdockerを動かせました。
　これには、なんとkubernetesの設定まで動くようになっていて、windowsでサーバになっちゃうなあという感じです。

　今まで、vmwareでubuntuを動かしてたんですけど、ちょっとこれでvmwareの出番がすくなくなりますねえ。

# vmwareとの比較
　wsl内には私はubuntuを入れましたが、「bash」と入力するだけで、ubunntuに切り替わるというwindowsをやっていると、自然にlinuxになるという変な状況です。
　当然同じファイルシステムは見れるので、curlやwgetをwindowsにインストールする手間もなくなります。成程、こういうことなのか・・という感じです。

　ubuntuの起動は、2,3秒でvmwareと比較するのは問題外です。メモリも全然使いません。ただ、guiはデフォルトでは入っていないので、これも別に起動するとなると、けっこう同じようになるのかもしれないですが、まあ、ubuntuでguiが必要なのって、gimpぐらいなもんですかねえ？

　そういうわけでけっこう満足してます。本当にもう、仮想からdockerに移行してるんですねえという話でした。以上終わり。
COVID-19（新型コロナウィルス）の人口当たりの死者数を国別に集計してみた

# 目的
COVID-19の人口当たりの死者数を国別に計算する。感染者数で比べるのは人口も検査数も国ごとに違うのでナンセンス。調べてもなかなか出てこなかったり、日付が古かったりしたので自作しました。

# データソース
国別に感染者数、死者数、2018年の人口がまとめられている[データ](https://www.ecdc.europa.eu/en/publications-data/download-todays-data-geographic-distribution-covid-19-cases-worldwide)がありました。2020年4月4日現在のデータだったので「data20200404.csv」として保存しました。


# ソースコード
はじめてpandasを使ってみました。便利。

```python
import pandas as pd
import matplotlib.pyplot as plt
import datetime as dt

coutry_for_analysis = [
    'United_States_of_America', 'United_Kingdom', 'France', 'Germany', 'Japan',
    'Italy', 'China', 'South_Korea', 'Spain'
]

data = pd.read_csv('data20200404.csv')
data['dateRep'] = pd.to_datetime(data['dateRep'], format="%d/%m/%Y")

fig = plt.figure(figsize=(12, 8))

plt.rcParams['font.family'] = 'Arial'
plt.rcParams['font.size'] = 18
plt.rcParams['xtick.major.width'] = 2.0
plt.rcParams['ytick.major.width'] = 2.0
ax = fig.add_subplot(111)
ax.set_xlabel('Date')
ax.set_ylabel('Cumulative # of Death per population (%)')
ax.spines['top'].set_linewidth(0)
ax.spines['bottom'].set_linewidth(2.0)
ax.spines['left'].set_linewidth(2.0)
ax.spines['right'].set_linewidth(0)
ax.tick_params(axis='x', rotation=45)
ax.set_xlim([dt.date(2020, 3, 1), dt.date(2020, 4, 5)])

for key, grp in data.groupby('countriesAndTerritories'):
    if key in coutry_for_analysis:
        grp = grp.sort_values('dateRep')
        ax.plot(
            grp['dateRep'],
            100.0 * grp['deaths'].cumsum() / grp['popData2018'],
            label=key,
            linewidth=2.0,
            marker='o',
            markersize=6)

ax.legend(ncol=3, bbox_to_anchor=(0., 1.02, 1., 0.102), loc=3, fontsize=18)

plt.savefig('figure.svg', bbox_inches='tight', pad_inches=0.5)
```

# プロット
何を思うかはあなた次第。
![figure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23570/fd71ea6f-4ee4-590e-411f-14ea696e5b98.png)
【Swift】BitriseでSwiftformatが失敗し、それを成功させるまで

# 概要
SwiftFormatを導入したは良いけど、ローカルでは成功するがBitriseでなかなか成功してくれなかった話。

# エラー内容
`error: File not found at /Users/vagrant/git/modified:.`

# まず、SwiftFormatをどの様に導入したか
Cocoapodsでインストールし、 `Build Phases` の `Dependencies` の直後にSwiftFormatを以下の様に設定しました。

```:SwiftFormat_before.sh
Pods/SwiftFormat/CommandLineTool/swiftformat `git status | egrep 'new file|modified'` [options...]
```

# 解決策
```:SwiftFormat_after.sh
for file in $(git diff --name-status | cut -f 2 | grep 'swift'); do
  Pods/SwiftFormat/CommandLineTool/swiftformat $file [options...]
done
```

# 残っている問題点
`git diff` だと新規追加ファイルが対象にならないのでこれを解決する方法を考えないとです。

# 色々
`git status` の出力は

```
$ git status
modified:       aaa/bbb/ccc.swift
```

となります。
この空白で区切られた二つの文字列がswiftformatコマンドの引数として渡ってしまい、 `modified:` なんてないよと怒られてました。
解決策としては、対象ファイル検索コマンドを正しく実行し、その内容を引数として渡す様にしてやればうまく行きました。
よくよく考えれば当たり前や。。。

# 備考
とはいえ、CIでSwiftFormatを実行する必要はないので、CIでは実行しないみたいに出来ればもっと良いなぁと思ったり。
そんな方法を知ってる方がいたらコメントなどで教えていただけると嬉しいです。

誰かのお役に立てば。

# 参考にしたサイト
https://pod.hatenablog.com/entry/2019/09/04/081801
https://www.yoheim.net/blog.php?q=20160302
nginxでwebdav環境を作成する。

# 目的
社内のnugetサーバーを作りたい

# 実行環境の構築
Vagrantでubuntu18.04を使用する。自分の開発環境で以下を使用する。
https://github.com/kaepa3/develop_environment

初期化のシェルなんかは今回いらない、単純にVagrant up からのssh で充分。


# インストール
以下を叩く

```shell
sudo apt install nginx nginx-extras
```

[この記事](https://qiita.com/staatsschreiber/items/73b5ca164a3aae9bba1f)を参考にしました。
すいません、結果これの補足記事になりました。

# nginxの設定
先ほどの記事同様以下のファイルを編集する。

```
/etc/nginx/sites-available/default 
```
※sudoで実行する必要がある。

serverディレクティブの中に以下を追加する。
既にlocationが一つあるが消す必要はない

``` /etc/nginx/sites-available/default
location /dav/ {
    client_body_temp_path /var/www/temp;
    dav_methods PUT DELETE MKCOL COPY MOVE;
    dav_ext_methods PROPFIND OPTIONS;
    create_full_put_path on;
    dav_access user:rw group:rw all:rw;
    autoindex on;
    allow all;
}
```

なお本ファイルは以下の繋がりで読み込まれている。
nginx.conf->sites-enabled/default->sites-available/default

本番環境としてはconf.dの中に入れるなどなんか作法があるのだと思う。
↓がkindle unlimitedだったのでサクッと読んでみたが、該当の情報は拾えなかった。
[nginx実践ガイド impress top gearシリーズ](https://www.amazon.co.jp/nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%B8%A1%E8%BE%BA%E9%AB%98%E5%BF%97-ebook/dp/B01N183E3H/ref=pd_aw_sbs_351_1/356-6288176-4135521?_encoding=UTF8&pd_rd_i=B01N183E3H&pd_rd_r=6b030bb5-c104-4d48-b4a3-da2e2553361e&pd_rd_w=PKe6s&pd_rd_wg=WIwTG&pf_rd_p=1893a417-ba87-4709-ab4f-0dece788c310&pf_rd_r=WW9Z68PTT1SK464KB49Q&psc=1&refRID=WW9Z68PTT1SK464KB49Q)

# ディレクトリの作成
以下のディレクトリを作成する。

```
sudo mkdir /var/www/temp /var/www/html/dav
sudo chown www-data:www-data /var/www/temp/var/www/html/dav
```
midirの前者はclient_body_temp_path用、後者はURLの解決のために作る。
chownはwebdavの外部からの操作権限に必要になる」。

# nginxの再起動
```
sudo nginx -s reload
```
以下にアクセスすると以下のようにフォルダの参照が可能になる。
※Vagrantの設定でクライアント80portのアクセスをホストの8080にフォワードしている。

```
http://localhost:8080/dav/
```

<img width="836" alt="screen.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51009/f922b230-0c46-2ce4-55ce-b8a2f7a09282.png">

# 参照限定のサーバに変更

``` /etc/nginx/sites-available/default
location /dav/ {
    client_body_temp_path /var/www/temp;
    dav_ext_methods PROPFIND OPTIONS;
    create_full_put_path on;
    dav_access user:rw group:rw all:r;
    autoindex on;
    allow all;
}
```
* dav_methodsを消す。
* dav_accessのallをrに変更

dav_accessの設定については公式見ましたが検証しないと分からない。
多分、認証等でログイン指定した時にもう少しきめ細かく設定するためだろうが
面倒なので今回は検証しない。

あと、nugetのサーバなら普通のウェブサイトでも良いみたいな情報があったら誰か教えて欲しいです。
【Swift】Index out of rangeを回避

## はじめに
業務でIndex out of rangeにならないように安全に要素を取得してあげたい!と思い、いろいろ調べた結果行きついたものを備忘録として残します。(ファイル名はてきとうです。。。)

```swift:Array.swift
var hoge = ["a", "b", "c", "d"]

hoge[3] //結果: d
hoge[4] //結果: Index out of range
```

これをどうやって防ぐのかというと、Arrayのsubscriptメソッドのsafeって言うのを使います。

```swift:ArraySubscriptSafe.swift
var hoge = ["a", "b", "c", "d"]

extension Array {
    subscript (safe index: Index) -> Element? {
        //indexが配列内なら要素を返し、配列外ならnilを返す（三項演算子）
        return indices.contains(index) ? self[index] : nil
    }
}

hoge[safe: 3] //結果: d
hoge[safe: 4] //結果: nil
```

## まとめ
他にもやり方はいろいろとあると思うので、その度に更新していければと思います。
間違いなどがありましたら指摘お願いします。
### 参照
- https://qiita.com/shtnkgm/items/f02553cb6bb16a59d8fe#comments
Jenkinsのタイムゾーンを変更

Helm Values でタイムゾーンを指定する

helm-values.yml を準備

```
$ vi helm-values.yml
```
```
master:
  javaOpts: >-
    -Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Tokyo
```

適用

```
$ helm upgrade jenkins stable/jenkins -f helm-values.yml
```
初心者がKaggle用にGCP+Dockerで環境構築して大変だった話

#背景
kaggleにはkernelというjupyter-notebookみたいな環境が用意されていてそれなりに便利なのですが、やはり制約も結構あったりでガッツリやるには専用の環境を用意したほうがいいなと思い色々と調べてGCPとDockerで環境構築をしようと思い立ちやってみました。

#概要
kaggle用の環境をGCP+Dockerで構築しようしたけど色々と詰まったのでつまずきポイントを備忘録としてまとめました。
基本的には下記記事を参考に進めていましたが、いくつかつまずいたところがあったのでその部分の説明をメインにしています。
http://scitaku.hatenablog.com/entry/2019/06/09/005657

ちなみに自分はGCPもDockerも今まで触ったこともない初心者ですのであしからず。

#つまずきポイント①
GCPでVMインスタンスを作成するのですが、いざ作成してみると何故か失敗してしまいます。
下記のような通知が出るのですが、選択したゾーンのリソースが不足しているようで作成が出来ませんとのことです。取り敢えず別のゾーン選択したら作成出来ました。ただ別の日に再度同じゾーンで作成したら問題なく出来たのでどうしても東京を選択したい！という思いがあるのであれば別日時を試してみると良いです。

The zone 'projects/kaggle-272812/zones/asia-northeast1-b' does not have enough resources available to fulfill the request. Try a different zone, or try again later.


#つまずきポイント②
VM作成時にkaggle公式のDocker Imageを導入してくれる設定があるのですが、これがなかなかDLされませんでした。
参考にした記事にもしばらく待ってくださいとあったので1時間ほど待ったのですがだめでした。
色々と調べたところkaggleのDockerのイメージが24GBくらいだそうで、私が作成したVMのストレージが10GBだったのでそれが原因かなと思い再度VMを作り直ししてストレージも100GB(参考にしたサイトも100GBだったので)にしたところ無事導入出来ました。
ただ、やり直した時もすぐにDLされたわけではなく、一旦諦めて自分で導入するかと色々と弄っている時にふと見たらあったので結構時間はかかりそうです。まあ24GBあるので当たり前かもしれませんが。

#つまずきポイント③
コンテナも無事作成できてあと少しというところでしたが最後にもう一つ問題が発生しました。
コンテナに入って
`jupyter notebook --ip=0.0.0.0 --allow-root`
と打つとjupyter notebookが起動してtokenが表示されるまでは良いのですがVMにsshしている状態だとsdkのshellが操作出来ません。
なのでVMに入る段階で
`gcloud compute ssh "インスタンス名" -- -L 8888:localhost:8888`
にしておくと良いです。
あとはローカルPCのブラウザで http://localhost:8888 に繋げばリモートホスト側のJupyter Notebookにアクセスできるようになります。

ちなみ
`gcloud compute ssh "インスタンス名" -- -L 8888:localhost:8888`
の意味としては localhost:8888 に繋げばリモートホストの 8888 にポートフォワードするよということらしです。
ポートフォワードせずにSSHでログインすると http://localhost:8888 に繋げた時にローカル側にアクセスしてしまうので、ポートフォワードによりリモートホスト側の8888に転送してあげる必要があるようです。
https://kuune.org/text/2017/05/14/use-jupyter-notebook-on-server-through-ssh-port-forwarding/
https://blog.mosuke.tech/entry/2014/12/31/170545/

#最後に
なんとか環境構築が出来てひとまず安心しました。
と言ってもまだ本命のkaggleには手を出せていないのでやっとスタートラインに立てたところですが。。。
ただ、今回の構築でGCPとかDockerとか流行りのものに触れてみたりできてい色々と勉強になりました。
あと個人的にはSSHのポートフォワードについて知っているようで全然しらなかったので、その点の理解が深まったのがよかったです。
取り敢えず環境構築は完了したのkaggleでばしばし機械学習していきたいです。
[Rails][data-vocabulary.org スキーマのサポートは終了します。]gem Gretelをschema.orgに対応させる方法。

# data-vocabulary.org スキーマのサポートは終了します。
![スクリーンショット 2020-03-10 11.47.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/814/7f746d33-36d2-7077-afe1-d38d0fcb76b1.png)

2020年4月6日からGoogleで「data-vocabulary.org」を利用した構造化データがリッチリザルトとしてサポートされなくなるので、引き続きリッチリザルトを利用したい場合は「schema.org」を利用した構造化データに移行する必要があります。

>
パンくずリスト  |  Google 検索デベロッパー ガイド  |  Google Developers 
https://developers.google.com/search/docs/data-types/breadcrumb?hl=ja


# Gem Gretelとは
Gretel( https://rubygems.org/gems/gretel/versions/3.0.7 )は設定ファイルを書くことで、簡単にパンクズリストを出力することができるようになるGemです。
パンクズの出力のオプションで`semantic: true`をつけることによりリッチリザルトにも対応していました(data-vocabulary.org)。

しかし、このGemはメンテナンスが長いこと止まっており、Googleの「schema.org」を利用するにはパッチを当てる必要がります。
自分で検索した所同じような対応をしている人が散見されたので、僕の方法を示して行こうと思います。

※ 本来は別のGemなどに移行することをオススメしますが、昔から使っている人がお手軽に対応できる方法を本記事にしています。

# モンキーパッチを当てる
Gretel Gemを使っているRailsプロジェクトで `config/initializers/gretel.rb` を作成して

```:ruby
# frozen_string_literal: true

module Gretel
  module ViewHelpers
    delegate :breadcrumbs_json_ld, to: :gretel_renderer
  end

  class Renderer
    # rubocop:disable Rails/OutputSafety
    def breadcrumbs_json_ld
      {
        "@context": 'http://schema.org/',
        "@type": 'BreadcrumbList',
        "itemListElement": links.map.with_index do |link, i|
          {
            '@type': 'ListItem',
            'position': i + 1,
            'item': {
              '@id': "#{root_url.chop}#{link}",
              'name': link.text
            }
          }
        end
      }.to_json.html_safe
    end
    # rubocop:enable Rails/OutputSafety
  end
end
```
> Yamitake gist gretel.rb https://gist.github.com/yamitake/3659b9d87404ad975f8a881b05971e33

### 使い方
`breadcrumbs_json_ld`を宣言したので、viewファイル側で下記のように宣言することにより、schema.orgに対応したjsonLDが出力されます。

```
.breadcrumbs
  == breadcrumbs
  = tag.script(breadcrumbs_json_ld, type: 'application/ld+json')
```

## おわりに
今までGretelで開発してきた人が暫定対応としては上記の方法でお手軽に対応できますが、gretelはメンテナンスが長いことされていないので別のGemを探すか自前でパンクズの実装をした方がいいと思います。
トランザクション分離レベル 2020/4/5版

**トランザクション分離レベル（2020/4/5時点の最新バージョン）**
◎デフォルト設定値　〇設定可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325048/764f2200-df2a-b1f9-1a80-c281ad538642.png)





（注1）バージョン 9.7 で導入されたcurrently committed セマンティクスでは、 今までのようにコミットされたデータのみが返されますが、読み取り側は更新側が行ロックを解除するまで待機しなくなりました。 代わりに読み取り側は、現在コミット済みのバージョンに基づくデータ、つまり書き込み操作の開始前のデータを返します。

（注2）PostgreSQLでは、4つの標準トランザクション分離レベルを全て要求することができます。 しかし、内部的には3つの分離レベルしか実装されていません。つまり、PostgreSQLのリードアンコミッティドモードは、リードコミッティドのように動作します。これは、PostgreSQLの多版型同時実行制御という仕組みに標準の分離レベルを関連付ける実際的な方法がこれしかないからです。

（注3）innodbが前提

（注4）READ_COMMITTED_SNAPSHOT が OFF (SQL Server での既定値) に設定されている場合、データベース エンジンでは共有ロックが使用され、現在のトランザクションでの読み取り操作中に他のトランザクションによって行が変更されるのを防ぐことができます。また、ステートメントが他のトランザクションで変更された行を読み取ろうとしても、そのトランザクションが完了するまでステートメントはブロックされます。いつ解放されるかは、共有ロックの種類によって決まります。 行ロックは、次の行が処理される前に解放されます。ページ ロックは次のページの読み取り時に解放され、テーブル ロックはステートメントの終了時に解放されます。
READ_COMMITTED_SNAPSHOT が ON (SQL Azure データベースでの既定値) に設定されている場合、データベース エンジンでは行のバージョン管理が使用され、各ステートメントでは、トランザクション全体で一貫性のあるデータのスナップショットが使用されます。このスナップショットは、ステートメント開始時点に存在したデータのスナップショットです。ただし、ロックは、他のトランザクションがデータを更新するのを防ぐために使用されることはありません。


**【参考URL】**
https://docs.oracle.com/cd/F19136_01/cncpt/data-concurrency-and-consistency.html#GUID-E8CBA9C5-58E3-460F-A82A-850E0152E95C
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.5.0/com.ibm.db2.luw.admin.perf.doc/doc/c0004121.html
https://www.postgresql.jp/document/11/html/transaction-iso.html
https://dev.mysql.com/doc/refman/8.0/en/set-transaction.html
https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html
https://docs.microsoft.com/ja-jp/sql/t-sql/statements/set-transaction-isolation-level-transact-sql?view=sql-server-ver15
https://docs.teradata.com/reader/RknaJAFX_2CtUAZfB4_rTA/L~tp~CBW4iGAkt3nQN3elQ
https://teradata-docs.s3.amazonaws.com/doc/connectivity/jdbc/reference/current/jdbcugjp/jdbcug_chapter_6.html
https://www.ibm.com/support/knowledgecenter/ja/SSULQD_7.1.0/com.ibm.nz.dbu.doc/r_dbuser_ntz_func_cat_tc_iso_level.html
https://docs.aws.amazon.com/redshift/latest/dg/r_BEGIN.html
Ruby で Google Spreadsheets を機械が読み書き

# TL; DR

 - Google Spreadsheets の表を Ruby プログラムを使って無人操作する方法を書きました。
 - ほぼ [先日書いた Python の記事](https://qiita.com/yagshi/items/3ab2a03b5e55181ec300) の Ruby 版です。
 - [公式 Quick Start](https://developers.google.com/sheets/api/quickstart/ruby) は人間が介在する OAuth2 のやり方だけど、ようはこれの無人版です。
 - サービスアカウントというものを作って、それに必要な権限を与え、そのアカウントの秘密鍵を使ってアクセスします。

# スプレッドシートの準備

これは何も特別なことはありません。Google Drive に適当なシートを作成して、ファイルの ID だけ控えておいてください。

# プロジェクトとサービスアカウント

各種ドキュメントを操作するには当然権限が必要です。プログラムから操作する場合は、大雑把に言って2とおりの権限獲得の手法があります。

 - 一時的に人間の許可を得て、その人間のアカウントで操作
 - 権限を与えられた **機械ようのアカウント** で操作
 
ざっくり言うと前者はインタラクティヴなソフトで使う方法で、後者は自動化システムで使う方法です。今回は後者の方法を使います。ここで「機械ようのアカウント」を [**サービスアカウント**](https://cloud.google.com/iam/docs/service-accounts?hl=ja)と言います。つまり、まずはサービスアカウントを作り、必要な権限を与える必要がります。だいたい以下の手順です。

 1. [GCPのコンソール](https://console.cloud.google.com) に行って、プロジェクトを作ります。
 2. GCPの左上のハンバーガーメニュー > [IAMと管理](https://console.cloud.google.com/iam-admin) > サービスアカウント > サービスアカウントを作成
 3. 入力は必須項目だけで良いと思います。`name@project.iam.gserviceaccount.com` というアカウントができます。
 4. アカウントを作ると秘密鍵 (private key) をダウンロードできると思います。JSON形式でダウンロードしてください。
 5. **このアカウントに対して**、操作したいファイル(スプレッドシート)の操作権限を与えてください(=共有してください)。与え方は通常の人間向けの権限操作といっしょです。
 6. ハンバーガーメニュー > APIとサービス > ダッシュボード > +APIとサービスを有効化 と進み、`Google Sheets API` を有効化してください。

# パッケージのインストール

たぶんこれだけでいいはず。

```shell
$ gem install google-api-client
```

# コード

シートの 1 行目を読み出し、最終行に `don't`, `panic`, `42` と追記するコードです。

```ruby
require "google/apis/sheets_v4"

Sheet_id = "*******"  # スプレッドシートの(ファイルの)ID

service = Google::Apis::SheetsV4::SheetsService.new
service.authorization = Google::Auth::ServiceAccountCredentials.make_creds(
  json_key_io: File.open("ダウンロードした秘密鍵.json"),
  scope: Google::Apis::SheetsV4::AUTH_SPREADSHEETS
)

# データの読み出し例
resp = service.get_spreadsheet_values(Sheet_id, "シート1!a1:z1")
p resp.values

# 行の追記例
service.append_spreadsheet_value(
  Sheet_id, "シート1!a:c",
  {"values": [["don't", "panic", 42]]},
  value_input_option: "RAW"      # 式を入れたいときは "USER_ENTERED"
)
```

# 終わりに
`append_spreadsheet_value` はIoT機器ぽいものでログ等をどんどん追記する用途には便利だと思います。
Go言語によるWebアプリケーション開発　チャットアプリのその後

# 本記事について
[Go言語によるWebアプリケーション開発](https://www.oreilly.co.jp/books/9784873117522/)のチャットアプリでちょっと遊んでみます
チャットアプリを外部公開する方法と、なりすましについての説明があります。
後者は手元のサーバ以外に実施すると、法に触れる可能性があります。**悪用厳禁です**

## 外部公開
`ngrok`を使用し、指定したポートを外部に公開することができます。
(画像にある通り、セッションは8時間で途切れてしまうみたいなので。実用的ではないですね)

```
$ ngrok http 8080
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542535/696c807d-f354-5a55-f740-39016b4de18f.png)
実行すると、URLなどの情報がでてきます。後でhttpの方を使用します。

本の手順でgoogle developer consoleを設定したら、
認証情報の**OAuth 2.0 クライアント ID**というところを以下の画像のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542535/102c813c-77a7-aca6-0ba0-b007d379b800.png)
ここで、2つのURIはngrokで表示されていたものを使用しています。再現する場合は適宜置き換えてください

OAuth 2.0 クライアント IDの画面の右上の方に**クライアント ID**、**クライアント シークレット**の情報があるので
その情報と**ngrokのURL**を使用し、`main.go`の53行目、`google.New()`の中身を書き換えます。

```go:main.go
google.New("[クライアントID]", "[クライアントシークレット]", "http://94150776.ngrok.io/auth/callbackgoogle"),
```
これで準備完了です。ビルドし、実行します。

```
$ go build
$ ./chat
2020/04/05 16:10:17 Webサーバーを開始します。ポート :8080
```

`http://94150776.ngrok.io/login`をブラウザで開くと、ログイン画面が表示されます。
googleアカウントを使用してログインすると、チャットができるようになっています。
複数タブでアカウントを変えたり、友達を招待したりして遊べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542535/389d8ce8-5bb4-a256-bc7b-d1f5cf2b6633.png)

## 遊ぶ
このチャットアプリ、名前や画像が自己申告制なので簡単に**なりすまし**ができてしまいます。
**※ 手元のサーバでも、他のユーザがいる状態で実行すると混乱を招く可能性があります。悪用厳禁です**

やってみましょう。

デベロッパーツールのコンソールでcookieを確認します。

```
> console.log(document.cookie)
auth=[cookieの値]
```
cookieの値はbase64された文字列なので、複合します。
`{"avatar_url":"[画像のURL]","name":"[名前]","userid":"[ユーザID]"}`
アバターのURLや名前などのデータが入っています。値を書き換えてみます。
`{"avatar_url":"https://help.qiita.com/images/qiitan-button.png","name":"きーたん","userid":""}`
base64エンコードして、コンソールでcookieを書き換えます。

```
> document.cookie="auth=eyJhdmF0YXJfdXJsIjoiaHR0cHM6Ly9oZWxwLnFpaXRhLmNvbS9pbWFnZXMvcWlpdGFuLWJ1dHRvbi5wbmciLCJuYW1lIjoi44GN44O844Gf44KTIiwidXNlcmlkIjoiIn0="
```
ブラウザを更新し、発言してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542535/5ae56244-51b5-4613-86a7-6947c0dd765a.png)

任意のユーザになりますことができた。

## 最後に
大事な事なので3回書きます。**悪用厳禁です**。

最後まで読んでくださり、ありがとうございました。
Laravel で $_SERVER['QUERY_STRING'] を取得するいくつかの方法

`$_SERVER['QUERY_STRING']` が欲しかったのです。

たとえば、URL が `http://example.com/hoge?piyo=1&piyo=2` であれば、

であれば `piyo=1&piyo=2` 部分を取得したいのです。

結論以下のように書きました。

```php
$request->getQueryString();
```



これは、laravel の内部で使っている symfony が用意しているメソッドです。

[laravel 該当コード](https://github.com/laravel/framework/blob/a6146be7ab47050a9594672f3b8d409e91c65ee4/src/Illuminate/Http/Request.php#L114)


[symfony 該当コード](https://github.com/symfony/symfony/blob/3987914982e8c7dbec7a85e533b849ece89ac885/src/Symfony/Component/HttpFoundation/Request.php#L1117)

他には、以下のようにもかけます。

```php
str_replace($request->url(), '', $request->fullUrl());

http_build_query($request->query());
```

# 違い

$_SERVER と getQueryString ではエンコードに少し違いがあります。

```php
'?a=A&b="B"&c;alert(1);&d=あ'

request()->getQueryString()
=> "a=A&b=%22B%22&c%3Balert%281%29%3B=&d=%E3%81%82"

$_SERVER['QUERY_STRING'];
=> "a=A&b=%22B%22&c;alert(1);&d=%E3%81%82"
```

それと、Laravel の feature テストとかだと `$_SERVER` の方は `Undefined index: QUERY_STRING` になっちゃう。
【Unity初心者】チュートリアルを終えた人が知るべきこと3つ



#対象の方
なんらかのUnityチュートリアルを終えて制作の雰囲気がわかっている方　


#知るべきこと3つ
他の記事を見る際に以下の点に注意して読むと内容が分かりやすくなるはずです。
次の３つが私がUnityを学ぶうえで、徐々につかんでいった内容になります。



**1.変数宣言の型にはUnity独自のものがある**
変数宣言の型といったらint、float、stringを最初に学習すると思います。
Unityでは、それらも使用しますが、
Unity上で登場する次のものも宣言する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/8be55a7f-bab0-2a1f-b6c9-49587bb56f6a.png)
型の種類はまだまだあります。
変数宣言の型にはUnity独自のものがたくさんあることを覚えておくだけでOKです。



**2.メソッドには2種類ある**

・C#やUnity側であらかじめ用意されているメソッド
・自分で処理内容を定義するメソッド

私は最初、全てのメソッドは用意されたものだと思っていました。
メソッドは作れる！！

あらかじめ用意されているメソッドは今後紹介していきます。

　


**3.初期スクリプトの中身**
初期スクリプト全体 ＆ それぞれざっくりの説明
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613985/40708004-fd05-d550-16cb-176b3eb65109.png)


①名前空間
　必要な時に随時追加する必要があります。
　詳しくは「れー＠DKRevel」さんの記事を参考にして下さい。
　https://dkrevel.com/makegame-beginner/namespace

②クラス宣言
　スクリプトの名前が「TEST_script」ってことがわかればOK

③スタート関数
　「変数の初期値」、「初回に一度きりの処理」を書きます。

④アップデート関数
　連続的な処理を書きます。
　1フレームの時間間隔はPCごとに変わるようです。
　(一定の秒数などで処理したい時は、Time.deltatimeでフレーム間の時間を取得する。 詳細割愛)

以上、私が最初に教えてほしかった内容でしたー。