OmniAICreator/Qiita-1.07M huggingface dataset:
ラビットチャレンジ - 深層学習 Day3 Section6 Word2vec

# 0．概要
本記事は日本ディープラーニング協会認定の講座プログラムである「ラビット・チャレンジ」が提供している科目の1つである深層学習のレポートである。
記事タイトルに記載のとおり、Day3 Section6 Word2vecについて以下にまとめる。

# 1．単語分散表現
one^hotベクトルと違い、単語を低次元の実数値ベクトルで表すこと。
one-hotベクトルでは単語間の関連性を得られないため分散表現にする必要がある(one-hotベクトル同士の内積は0になるため)。

単語分散表現ベクトルとすることで単語の意味に基づいたような計算もできるようになる。
> King - Man + Woman = Queen

# 2．分布仮説
「単語の意味はその近傍の単語によって決定される」という考え方。

例えば以下のような文があったとき、Tokyoを知らなくてもliveから地名だろうと分かる。
つまり、liveがTokyoという単語の意味を地名であると決めるのに役立っていると言える。

> I live in Tokyo.

# 3．Word2vec
分布仮説から単語を固定長のベクトル化(単語分散表現ベクトル)するソフトウェア(モデルではない)。
学習データからボキャブラリーを作成し、各単語をone-hotベクトルにして入力して単語分散表現を得る。

ボキャブラリー数×単語ベクトルの次元数だけの重みの計算量となる。

以下に示すモデルいずれも教師あり学習である。

参考：
https://ledge.ai/word2vec/
https://qiita.com/g-k/items/69afa87c73654af49d36

## 3.1．Skip-gram
入力層、隠れ層、出力層の3つの層で構成されるニューラルネットワークであり、入力層と隠れ層の間の重みが単語分散表現となる。
学習させるタスクは「ある入力の単語の周辺に出現しやすい単語を予測する」こと。
周辺単語いくつまで周辺語として考慮するかをウィンドウサイズと呼ぶ。

CBOWより性能が良いことが多いが計算は遅い。
計算を高速にするための手法としてポジティブサンプル(ありえる単語の組み合わせ)、ネガティブサンプル(ありえない単語の組み合わせ)がある。
ポジティブサンプルは確率が高くなるよう学習させ、ネガティブサンプルは低くなるよう学習させる。

## 3.2．CBOW
Skip-gramとは逆で「周辺語からある単語を予測する」

Skip-gramより計算が高速。

Skip-gramは「機械学習・深層学習による自然言語処理」である程度目を通しているので概要は理解しているつもりだがCBOWは取り上げられていなかったのであまり…
性能面で劣るため積極的に使われない？から？

# 4．確認テスト
確認テストはSection 7 Attention Mechanismの方で実施。

# X．ラビットチャレンジとは
ラビットチャレンジとは、日本ディープラーニング協会認定の講座プログラムの1つ。
E資格を受験するためにはこのラビットチャレンジ等、いずれかの講座プログラムを修了しなければならない。

ラビットチャレンジの特徴は「現場で潰しが効くディープラーニング講座」の通学講座録画ビデオを編集した教材を使用した自習スタイルであるという点。
サポートは他の講座より少なく、受け身ではなく自主的に学んでいく姿勢でなければ進められないが、その分、他の講座に比べると安価であり、手が出しやすい。
ある程度知識がある人、自力で頑張るぞというガッツのある人向けではないかと感じる。

![bnr_jdla.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389699/bce66671-a2f5-a7f9-de6f-3f87e15c253b.png)
メールサーバの設定とiPhoneで送受信可能にする方法


##ドメインがあるのでメールサーバーを持ちたい
しょうもない発想でこの記事を書きます。

本来は、RoundCubeMailをCentOSに入れてみた　という記事にしたかったのですが、
書いている余裕が無く、締め切りまで24時間切っていたので
メールサーバーを追加してiPhoneから送受信できるようにしてみた

にします。


##ひつようなもの
既にドメインを持っている事とこのはを利用している事
メールサーバー　500円/月額
iPhone（他のスマホでも良いですが、手元にあったのがiPhone）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212894/623e3e94-84c1-4a8e-e75c-8fe515d6e997.png)

日頃から大容量のメールを使わないので10GBを選択しています。

##このはの設定
ドメインの登録

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212894/ef8f6d33-e52f-87ad-0923-15eac947f316.png)
<hr>

ドメインリストに登録されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212894/1fe0a25d-ed8e-70db-8f66-76730670e433.png)

<hr>
メールアドレスリストよりメールアドレスを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212894/cf04620c-a4d0-6bec-8178-2a0996e05d41.png)

<hr>

メールアドレスが完成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212894/4629740f-1667-c7d8-affe-396d198847b7.png)

<hr>
##iPhoneでの設定

設定>メール>アカウント>

「アカウントを追加」＞「その他」を選択？＞「メールアカウントを追加」＞「新規アカウント」
　名前：わかりやすい表示名
　メール：作成したメールアドレス
　パスワード：作成したパスワード
　説明：必要に応じて設定

　IMAPを選択
　受信メールサーバー
　　ホスト名：imap.\*\*\*.conoha.io
　　ユーザー名：作成したメールアドレス
　　パスワード：作成したパスワード
　
　送信メールサーバー
　　ホスト名：smtp.\*\*\*.conoha.io
　　ユーザー名：作成したメールアドレス
　　パスワード：作成したパスワード


設定したメールアドレスを選択
　アカウント＞SMTP＞プライマリサーバー＞
　　基本的にはSSLを使用になっているはずで、ポートが587で有ることを確認する。

　アカウント＞詳細＞
　　受信設定にてSSLを使用が選択されていることを確認し、ポートが993で有ることを確認する。


##注意
私が試した限り、iPhoneでPOPサーバーを指定すると、やたらアラートが表示し受信が難しくなります。

##個人的な要望
メールサーバー登録は、基本一人一つだけだと思いますが、複数のドメインを持つとメールサーバーも複数持ちたいです。
サブドメインを複数使いたいのでメールサーバーを複数持ちたい時がたまにあるのですが、申請をする必要があるようなので、その辺簡素化してほしいです。
あと、Webmailアプリケーションサーバーが選択肢に欲しい！


##最後に
M365も利用していますが、メールだけはM365連携をせずこのはを使ってます。
容量をあまり使わないという方には、メールサーバーだけはこのは　という利用、割とおすすめかもしれないです。
次回は、RoundCubeMail導入記事を書きたい。
Railsのログについて

標準出力とログがある

- ログレベルは`config.log_level = :error`で調節
- `rails s`した時はログファイルに書いたことを標準出力にも自動で書き出しているっぽい
- putsは、ログファイルには書き込まず、標準出力だけする
- `config.logger = Logger.new(STDOUT)`を設定すれば、ログの書き出しはログファイルではなく標準出力になるっぽい
    - 本番環境では、RAILS_LOG_TO_STD_OUTが何かしら設定されていたら、ログの書き出しはログファイルではなく標準出力になる。これは、以下が`/config/environments/production.rb`に記されているから


```
  if ENV["RAILS_LOG_TO_STDOUT"].present?
    logger           = ActiveSupport::Logger.new(STDOUT)
    logger.formatter = config.log_formatter
    config.logger    = ActiveSupport::TaggedLogging.new(logger)
  end
```
Herokuを使用した自動デプロイ設定のやり方でハマったこと

# はじめに
　とても基本的な事、備忘録のために
　
# 環境
MacBook Pro
Python 3.9.0

# ハマったこと
Githubの準備が出来て、いざコミットしてみたらHeroku側でビルドエラーになっていた。

# エラー内容
+ No default language could be detected for this app.
![スクリーンショット 2020-12-04 0.57.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543411/d0acb4cb-e1d7-11ad-bb30-744e0933f50d.png)

# 解決方法
+ Heroku側でBuildPackを指定すれば解決する
![スクリーンショット 2020-12-04 0.52.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543411/c091b8e2-1a70-8cd6-25bc-821cb6e22534.png)

# 出来た
BuildPackの設定をすることで、自動デプロイが出来るようになった。
マイコンでちょこっと遊びたい人向けの導入

マイコンを使ってみたいと思ったときに，Arduino等ではほぼ基盤しかなくLEDを光らせる以上のことをしようとすると追加でセンサーや液晶ディスプレイを購入する必要があり，ちょっと遊びたい人には高めかなと思います．
そんな方には，M5StickCから始めることをお勧めします．

M5StickCは，ESP32というWiFi/Bluetoothが使えるボードを載せたプロトタイプ作成用のIoT開発基盤です．
非常に安く，2000円程度で購入可能です．
https://www.switch-science.com/catalog/6350/

6軸IMUやLED，バッテリー，小型液晶ディスプレイ，IRトランスミッタ，ボタンが搭載されているため，Lチカ後もある程度単体で遊べるものになっています．
例えば，Bluetooth接続のマウスや簡単な姿勢推定，リモコンなどを作れます．
下記のブログで作成しているものなどは，M5StickC単体で作れるものになっています．
- https://lang-ship.com/blog/work/m5stickc-tester/
- https://lang-ship.com/blog/work/m5stickc-bluetooth-keyboard/
- https://blog.obniz.com/make/notification-doorbell-made-with-m5stickc/

開発はArduino IDE + C言語風のArduino言語の組み合わせ以外にUIFlowでのブロックプログラミングやMicroPythonで行うこともできます．UIFlowでのブロックプログラミングか，C言語が得意ならArduino IDEで開発するのがおすすめです．
ただ，Arduino IDEのサンプルスケッチを動かすことでも十分楽しめると思います．

もし，マイコンに関心がある場合は1つ購入して試してみるとよいと思います．
ios13から導入されたSceneDelegateの概要を３分でさっとおさらい

# ScreenDelegateとは？

Xcode11から、新しくプロジェクトを作ると、SceneDelegate.swiftという新しい設定ファイルが作成されるようになった。

iOS13未満では、AppDelegateがアプリのエントリーポイントだった。
ライフサイクル＋セットアップ＋画面の表示の全てのコード存在し、AppDelegateは肥大化しやすかった。
しかし、iOS13からは、これが解決する。
AppDelegateに、ライフサイクル＋セットアップ。SceneDelegateに、画面のライフサイクル。
と、今までのAppledegateの処理を２ファイルに分割し、コードのスパゲッティ化を防ぐ

## 詳細な説明
### AppDelegate
アプリのエントリーポイント。
アプリレベルのライフサイクルが呼ばれる。
デフォルトでは３種のメソッドが存在
1. func application(_:didFinishLaunchingWithOptions:) -> Bool
2. func application(_:configurationForConnecting:options:) -> UISceneConfiguration
3. func application(_:didDiscardSceneSessions:)

### SceneDelegate
UIWinndow＋UIScreenの処理を担当
画面のライフサイクルを担当（画面の生成、消滅、再生成など）
デフォルトでは以下６つのメソッドが存在
1. scene(_:willConnectTo:options:)
2. sceneDidDisconnect(_:)
3. sceneDidBecomeActive(_:)
4. sceneWillResignActive(_:)
5. sceneWillEnterForeground(_:)
6. sceneDidEnterBackground(_:)

大体名前からどのライフサイクルのどの時点で発火するか分かるぐらい良い命名だ。

## 参考
この記事は、以下の英記事を荒く要約した物です。
https://medium.com/@kalyan.parise/understanding-scene-delegate-app-delegate-7503d48c5445
[Python]斜めに情報を引き継ぐ

# 概要
[ABC183 E - Queen on Grid](https://atcoder.jp/contests/abc183/tasks/abc183_e) で、右下へ移動する方法の数の累積和を記録する必要があった。
直前と現在の 2 つの配列を用意し、直前の値を参照して現在の値を更新する方法もあるが、1 つの配列を使って書くこともできる。

# 2 つの配列で引き継ぐ

右上の値を 10 倍するサンプル。

```python
import numpy as np

h, w = 3, 4
A = np.zeros((h, w), int)
prev = [0, 1, 2, 3]

for y in range(h):
    A[y] = prev
    cur = [0]*w
    for x in range(w):
        cur[x] = w+y if x == w-1 else 10*prev[x+1]
    prev = cur
    
print(A)

# 結果
# [[  0   1   2   3]
#  [ 10  20  30   4]
#  [200 300  40   5]]
```

配列の境界や初期条件を与える実装がやや複雑になる。

# 1 つの配列で引き継ぐ

先ほどと同じ、右上の値を 10 倍するサンプル。

```python
import numpy as np

h, w = 3, 4
A = np.zeros((h, w), int)
cur = [i for i in range(w+h-1)]

for y in range(h):
    for x in range(w):
        k = x+y
        A[y, x] = cur[k]
        cur[k] *= 10 
print(A)

# 結果
# [[  0   1   2   3]
#  [ 10  20  30   4]
#  [200 300  40   5]]
```
少し慣れが必要だが、配列の境界を意識せずに書ける。また、初期条件を一か所に定義できることにも利点がある。

同様に、左上の値を 10 倍するサンプル。

```python
import numpy as np

h, w = 3, 4
A = np.zeros((h, w), int)
cur = [i for i in range(w+h-1)]

for y in range(h):
    for x in range(w):
        k = x-w-y
        A[y, x] = cur[k]
        cur[k] *= 10

print(A)

# 結果
# [[  2   3   4   5]
#  [  1  20  30  40]
#  [  0  10 200 300]]
```
人気アーティストの公開楽曲の閲覧数から人のネットアクセス時間のパターンを推測してみた

# 動機 
日頃から、ネットアクセス時間の密度はどうなっているのか興味があった。ま、調ればいくらでも出てくるとは思うのだが。ある日、国内で絶大な人気を誇るアーティストがYouTubeで楽曲を公開するというのを知って、これを使って、閲覧数のカウントの変化、ひいては人のネットへのアクセス時間のパターンを推測しようと思いついた。

# Matlab コード
正直、コードと言えるほど高尚なものではないのですが、記します。

まず、YouTube 動画から views の数をとってくるのがこれ。

```matlab:YTview.m
function num=YTview(url)
    tmp = webread(url);
    startvalue1=strfind(tmp,'"videoViewCountRenderer":{"viewCount":{"simpleText":"');
    startvalue2=strfind(tmp,'回');
    num=tmp(startvalue1+53:startvalue2-2);
end
```

それから、views数をとってくる時間を決めるメインのがこれ。

```matlab:Timer.m
t = timer('TimerFcn', 'stat=false; disp(''Timer!'')',... 
                  'StartDelay',60);　% 1分間隔の場合
for i = 1:2880 % サンプリング回数 
start(t)
while(stat==true)
    disp('.')
    pause(10)
end
stop(t)
num{i}=YTview('U R Lを指定')
date{i}=datetime
end
```

どうも、開始から時間が経つと（あるいは時間あたりのViewsが減ってくると）、YTの方のViewsの更新が変わってくるみたいで、実際使った数字とは少し変わってます。

あとは加工のみ。そのほか、今回、新しかったのは、

```matlab:
erase(num{I},'回')　% 文字列からある文字を消去
% と
[yy(i) mm(i) dd(i) hh(i) mm(i) ss(i)]=datevec(Time{i});　%日付時間をベクトルに変更
```
でした。

# グラフ
![TimeViewsNumber.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237763/a54b102c-a9ef-3242-9fc6-d980e3327a26.png)


横の時間は公開されてからの時間。左図はViews数をプロット（青）と、それの時間差分（1分あたり）を計算したプロット（赤）。最初の45分とその後とを分けてプロットしたのが、中図と右図。

不覚にもコンピュータをスリープさせてしまってデータが取れなかったところ、回線がうまく繋がらなくてエラーになってしまい、データが取れなかったところあり。

# 考察　
1. 人気アーティストの公開楽曲の閲覧数から人のネットアクセス時間のパターンを推測してみた
2. 夜中の3時頃から朝の9時頃は、あまりネットアクセスしない。
3. 夕方、6時頃から9時頃のアクセスが集中。
4. 午前中の10時頃にアクセスが上がる。
5. 昼休憩ピークというのはわからなかった。
6. 最初の45分を細かく見ると、どうやら楽曲は３回ほど連続して見る人がある割合でいるようだ。
7. YouTube は公開から最初の数分間、アクセスが集中する時には秒単位で数を更新しているよう。
8. アクセスが落ち着いてからは1分あるいは5分に一度ほどの更新に切り替わる。あるいは、もっと細かな調整をしているか。
9. 何故か、一箇所に時間経過でViews数が減ることがあった。理由は不明。

# おしまいに
楽曲、聞いてみました。人気あるのがよくわかりました。ありがとう、KG。
機会があれば、コンピュータのスリープ解除を忘れずに、もう一度試してみたい。
DependabotをAndroidプロジェクトで使う方法

[Dependabot](https://dependabot.com/)は、依存しているライブラリのアップデートをチェックし、自動でPRを作ってくれる便利なbotです。

Androidプロジェクトでも、GitHub上からポチポチするだけで簡単にセットアップすることができたので、手順をご紹介したいと思います。

※ 個人のプライベートなAndroidプロジェクトで試しました。 `app` モジュールのみのオーソドックスなAndroidプロジェクトです。

#手順

- リポジトリを開きます。 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/20b724fe-5d38-0e85-12d2-1e145b8dec9e.png" width=500 />

- タブにある **Insights** を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/255fbf4d-fa3c-1a5f-cf45-76066f99dc66.png" width=500 />

- **Dependabot** を選択し、Dependabotを有効化します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/c52eae6b-a733-8593-58c0-7a2eadbea32a.png" width=500 />

- 有効化した後は、configファイルを作成します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/d9da305d-3820-ddc7-b723-c5184d96f4a0.png" width=500 />

- ymlのconfigファイル作成画面になります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/6a157f78-0046-b30a-9106-07a89e851f62.png" width=500 />

- 色々と設定を記述することもできますが、一旦無視して **package-ecosystem** のところに 「**gradle**」 を記述します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/dfd938b6-2b09-ebd3-aa79-f45b6be65ddb.png" width=500 />

- コミットします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/a85fa836-d5ec-7ac2-cc29-ffdccac3a563.png" width=500 />

- dependabot.ymlが作成されました。設定としては以上です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/dc145e3d-0625-3f91-4756-76d16ca2ca5e.png" width=500 />

- **Insights** に戻ると **gradle** のマークがあり、 **Checking now** と表示されています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/9916eef7-1df6-dd09-3918-75cee76b31e1.png" width=500 />

- プロジェクトの大きさにもよるかもしれませんが、30秒もかからずにPRが作成されていました！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/7a7b277e-3b6a-ff2e-2396-d9a9afccb0f1.png" width=500 />

- PRの差分を見てみると、バージョンのところだけ綺麗にアップデートされているのがわかります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/f2841bfb-42d4-e0bd-4ec1-b8c4f4206cac.png" width=500 />

- ちなみに、変数を用いてバージョンを共通して書くやり方をしている箇所でも、うまいこと変数のところだけアップデートされるようでした。（賢い！）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/06b8cdd2-a0ca-1782-141c-6e2f4db39e47.png" width=500 />

# まとめ
DependabotをAndroidプロジェクトで使う方法をご紹介しました。
ポチポチするだけで設定できるので、かなり簡単に導入することができるなぁと感じました。

自動でPRを出してくれるのも非常に便利です。

ただ、ライブラリのアップデートのPRは出してくれますが、機械的なアップデートなため、アプリの機能が動かなくなったり、レイアウトが崩れたりなどの問題が起こる可能性もあるので、PR起点のCIでテストを回したり、PRをpullして手元で確認したりなどは必要なのかなと思いました。

Dependabotのドキュメントは [こちら](https://docs.github.com/ja/free-pro-team@latest/github/administering-a-repository/keeping-your-dependencies-updated-automatically) を御覧ください。
デーモンってなに？ init.d配下の確認

## 勉強前イメージ

よく聞くけど、実はあんまりちゃんと分かってない。
serviceコマンドで起動・停止が出来る？
http"d" とか mysql"d" の "d" はデーモンのdだったような気がする...

## 調査

### デーモンとは

UNIX系OSにおける常駐プログラムのことを指します
裏(バックグラウンド)で常に起動していて、要求があれば応答するようなものです。
起動時はRedhat系であれば/etc/rc.d/init.d配下にコントロールするファイルがある

### デーモンの設定(現在はsystemdに管理されているので、あまり表示されない)

デーモンはランレベルに応じて起動したり停止したりします。
ランレベルの説明は [こちら](https://qiita.com/miyuki_samitani/items/bb2505209a81cfdee274)
スクリプトは `/etc/init.d` に置かれているのが自動起動設定されているものです(systemdに設定されているもの以外)

```
[root@localhost ~]# ll /etc/init.d/
合計 40
-rw-r--r--. 1 root root  1160  8月  7 02:30 README
-rw-r--r--. 1 root root 18281  8月 19  2019 functions
-rwxr-xr-x. 1 root root  4569  8月 19  2019 netconsole
-rwxr-xr-x. 1 root root  7928  8月 19  2019 network
```

その設定は `/etc/rc?.d` の配下にあります。
0-6まであります。

```
[root@localhost rc3.d]# ll /etc/rc*
lrwxrwxrwx.  1 root root  13  8月 31 11:26 /etc/rc.local -> rc.d/rc.local
lrwxrwxrwx.  1 root root  10  8月 31 11:26 /etc/rc0.d -> rc.d/rc0.d
lrwxrwxrwx.  1 root root  10  8月 31 11:26 /etc/rc1.d -> rc.d/rc1.d
lrwxrwxrwx.  1 root root  10  8月 31 11:26 /etc/rc2.d -> rc.d/rc2.d
lrwxrwxrwx.  1 root root  10  8月 31 11:26 /etc/rc3.d -> rc.d/rc3.d
lrwxrwxrwx.  1 root root  10  8月 31 11:26 /etc/rc4.d -> rc.d/rc4.d
lrwxrwxrwx.  1 root root  10  8月 31 11:26 /etc/rc5.d -> rc.d/rc5.d
lrwxrwxrwx.  1 root root  10  8月 31 11:26 /etc/rc6.d -> rc.d/rc6.d
```

実際に `/etc/rc3.d` を見てみると....

```
[root@localhost ~]# ll /etc/rc3.d/
合計 0
lrwxrwxrwx. 1 root root 20  8月 28 16:46 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17  8月 28 16:46 S10network -> ../init.d/network
```

`S10network` と `K50netconsole` があります。

[S/K][数字][スクリプト名] という順番で、

- [S/K]

S : 起動する(start)
K : 停止する(kill)

- [数字]

優先度を表し、数字が小さいほど優先度が高く先に実行されます。
上記の例で行くと、 `S10network` → `K50netconsole` の順番です。

- [スクリプト名]

apacheなどサービスの名称が入ってきます。

## 勉強後イメージ

今回は短いけど、結構面白かった。
ほぼsystemdに移行しちゃってたからあんまり見えなかったけど...
数日前に出した、ランレベルとの話もあったし点と点が線になった気がする
mysqldもsshdもすべてデーモンで、バックグラウンドでずっと待機しててくれる子。

## 参考

- [デーモンの仕組み](http://nw.tsuda.ac.jp/~nitta/lec/daemon/)
- [(UNIX系) デーモンとは](https://hara-chan.com/it/infrastructure/daemon/)
git log を1行表示にする+日付を表示する

git log を1行表示にするには、以下のコマンドで実行できる。

```bash
git log --pretty=oneline
```

結果：

```bash
c00ebdb099430502f90718b4e2d15f51fc351e27 (HEAD -> develop, origin/develop, origin/HEAD) Merge branch 'xxxxx' into 'develop'
```

しかし、この表示方法だと、日時が表示できない。そこで、`--pretty=format` 使うことで、日付も併せて表示させることができる。

```bash
git log --pretty=format:'%H (%ai) %s'
```

結果：

```bash
c00ebdb099430502f90718b4e2d15f51fc351e27 (2020-11-12 13:13:23 +0900) Merge branch 'xxxxx' into 'develop'
```

## フォーマットの種類

[公式ページ](https://git-scm.com/docs/git-log)に一覧が載っているが、いくつか自分が使いそうなものをピックアップしておく。

フォーマット | 意味
--- | ---
%H | コミットID
%h | コミットIDの短縮版
%ai | 日時表示。日時表示にも色々種類があり、このフォーマットの場合、表示は「2020-11-26 09:16:07 +0800」となる。
%an | コミットした人の名前
%ae | コミットした人のメールアドレス
%s | コミットメッセージ（タイトル）。Bodyを表示させるには %b を使える。

# 参考

- [git - Gitログの問題:onelineオプションが使用されているときに日付が表示されない](https://python5.com/q/plvrjamn)
[Rails]ダブルレンダリングと言われる

下記のエラーが出て解決に小一時間かかったので共有します。

```
Render and/or redirect were called multiple times in this action. 
Please note that you may only call render OR redirect, and at most once per action.
Also note that neither redirect nor render terminate execution of the action, 
so if you want to exit an action after redirecting, 
you need to do something like "redirect_to(...) and return".
```

コントローラーの中でredirect_toを用いてレンダリングしようと思ったら起こりました。

```
class HomeController < ApplicationController
  def top
    @posts = Post.all.order(created_at: :desc)
    byebug
    @map = Map.all         
    @arr=[]                
    @map.each do |m|        
      @arr.push({lat: m.latitude, lng: m.longitude })
    if user_signed_in?
      #こいつでダブルレンダリングと言われる
      redirect_to posts_path and return
    end
    end
  end
```
他にリダイレクト処理していないのになんでー
#結論
each文の中に入れ子になっていたため。

each do |m|　〜　end　の〜部分はブロック引数です。
引数の中でレンダリング処理が行われ、httpレスポンスを受け取り、
webサーバーに対して受け取ったURIを要求する。
しかし当のwebサーバーはeach処理の結果も返しつつ、レンダリング結果も返さなくならなきゃいけなくなった為エラーが起こったのでしょう。

▼参考
[Rails Guide -ダブルレンダリングエラーの回避-][1]
[修正方法 'このアクションでレンダリングおよび/またはリダイレクトが複数回呼び出されました'][2]


#Deviseコントローラーで似たエラーが出る場合は
こちらの記事にあるようにdeviseコントローラー内では遷移処理にredirect_toを使わなくて言いそうです。
https://qiita.com/yo_instead_what/items/582cc071b3e0a8a2b583

[1]:https://guides.rubyonrails.org/layouts_and_rendering.html#avoiding-double-render-errors
[2]:https://stackoverflow.com/questions/56555783/how-to-fix-render-and-or-redirect-were-called-multiple-times-in-this-action
よさげな動画配信プラットフォームOSS「Streama」を紹介します

# Streamaとは

https://github.com/streamaserver/streama

>Ever had a huge bookshelf full of shows and movies? Ever wanted to digitalize them, but didn't have a good way of organizing the files? Worry no more! Streama is your own personal Netflix for just such a purpose!

>ショーや映画の巨大な本棚を持っていたことはありますか？今までそれらをデジタル化したいと思ったが、ファイルを整理する良い方法を持っていませんでしたか？もう心配しないでください! Streamaはちょうどそのような目的のためのあなた自身の個人的なNetflixです!
※DeepLによる翻訳

_**つまり、NetFlix風の動画配信プラットフォーム!!**_

### デモ環境

[こちら](https://streama.demo-version.net/)から
以下のユーザー名とパスワードを入力して利用してください
`credentials: username: demoUser | password: demoUser`


# 想定される利用者 

* 個人が所有する動画を管理、閲覧したい方
* 組織で利用する動画を管理、配信したい方
* 動画配信プラットフォームとして商用利用したい方

※2020/12/04時点では商用利用可と記載されている

# 推奨実行環境

https://docs.streama-project.com/getting-started/installing/

公式より以下

* Ubuntu (バージョン指定無し)
    * Ubuntuを推奨
    * Linuxであれば問題無いとのこと
* Java8
    * Java7とJava10だと動かない可能性がある

ですが、公式が`docker-compose.yml`を用意してくれているので、
そちらを利用することも可能です

# 構築手順

1. 公式リポジトリをクローンする

    ```
    $ git clone https://github.com/streamaserver/streama
    ```

2. クローンしたディレクトリから`/streama/docker`へ移動する

    ```
    $ cd ./streama/docker
    ```

3. コンテナを立ち上げる

    ```
    $ docker-compose up -d
    ```

4. [http://localhost](http://localhost)へブラウザからアクセスする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142140/de74a422-e794-20a8-9716-102e5a476fda.png)

# 所感

このStreamaの細かい仕様は[公式HP](https://github.com/streamaserver/streama)よりご確認ください

これまでは

* [PHPTube](https://www.youphptube.com/)
* [Kaltura](https://corp.kaltura.com/ja/)

上記の選択肢が有名であったが

* 導入がヘビー
* 高機能すぎる

などの障壁を感じていた

しかし、Streamaは簡易なカスタマイズも簡単そうな印象がある

日本ではほぼ無名のアプリケーションではあるが
リモートや非同期の情報共有が多い時代になってきたので
この手のアプリケーションの需要も高まっているはず

今後の発展と普及を期待しつつ
今後も経過を見ていきたい

# 編集後記

今回たまたま、幼稚園や学校のイベントの動画共有の相談を受け調べてみたところStreamaを見つけた

数年前だとPHPTubeが本命かと思ったがアンテナ高くしておくと良いものと巡り合う機会も増えるなーと思ったところです

今後も便利そうなOSSを紹介できればと思います
Shamirの秘密分散法を学ぼう！

みなさまお疲れ様です、ゆうぴっぴ([@_yu_pippi_](https://twitter.com/_yu_pippi_))です
2020アドベントカレンダー2日目に秘密分散について書いたので、今回はそれに関連したことを書こうと思います

# そもそも秘密分散って？
みんなで秘密情報を管理して、リスクを減らそうという考えに基づく技術です
詳しくは自分が以前書いた記事や、Wikipediaなどを参考にしていただけると幸いです

[秘密分散と触れ合おうの話](https://qiita.com/Yuu-taremayu/items/a3ad3221636afeff038c)
[秘密分散 -Wikipedia](https://ja.wikipedia.org/wiki/%E7%A7%98%E5%AF%86%E5%88%86%E6%95%A3#:~:text=%E7%A7%98%E5%AF%86%E5%88%86%E6%95%A3%E3%81%A8%E3%81%AF%E6%9A%97%E5%8F%B7,%E6%83%85%E5%A0%B1%E3%81%8C%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E6%B8%A1%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82)

# 事前知識
今回必要となる事前知識について軽く説明を行います

### 多項式補間
多項式補間とは、与えられたデータ点からその点全てを通る多項式を求めることをいいます
具体的にいうとある2点が与えられたとき、一次式

```math
y={a_1}x+{a_0}
```
の係数を求めることが出来ますね！しかし、1点だけでは求めることは出来ません。
同様に、3点が与えられたときには二次式が求められますが、2点からは求めることは出来ません
一般に、n点が与えられたときn-1次の多項式

```math
y={a_n}x^{n-1}+{a_{n-1}}x^{n-2}+{\cdots}+a_1x+a_0
```

が定まりますが、n-1点からは求めることが出来ません(厳密な証明は省きます)

今回はそのうちのラグランジュ補間という方法を使います
x座標の異なるn個のデータ点に対してn-1次式が以下の式から求められます

```math
L(x)={\sum_{i=0}^{n}}f(x_i)l_i(x) \\
l_i(x)={\prod_{j=1,j{\neq}i}^{n}}{\frac{x-{x_j}}{{x_i}-{x_j}}}
```

### 有限体
これは説明しようとするとだいぶ長くなってしまう(めちゃくちゃ数学)ので簡単に説明しますと加減乗除ができる有限の数の集合のことです(絶対怒られる)
modの計算を思い浮かべてもらうとわかりやすいかもしれません
今回使うGF(p)(pは素数)は整数をpで割ったあまりの数を集めた集合のことを指します

# Shamirの秘密分散(法)
それでは本題に入りましょう！

加法的秘密分散が(n,n)しきい値法と呼ばれるのに対してこの方法は(k,n)しきい値法とも呼ばれ、n個のシェアのうちk個が集まれば秘密情報の復元ができます
まず以下を定義します

```math
S:秘密情報 \\
k:秘密情報を復元できるシェアの個数(しきい値) \\
n:生成するシェアの個数
```

## 分散(シェア生成)
まずS<pかつn<pを満たす素数pを選びます
次にディーラーは秘密情報を定数項とするk-1次式を生成します
ただし、多項式の係数はGF(p)の中から選びます

```math
f(x)={a_{k-1}}x^{k-1}+{a_{k-2}}x^{k-2}+{\cdots}+a_1x+a_0 \\
a_0=S
```

次に互いに異なるx座標(これもGF(p)の中から選ぶ)を用いてシェア

```math
(x_1,f(x_1)),(x_2,f(x_2)),{\cdots},(x_n,f(x_n))
```

を生成しn人の参加者に配布します
このときもf(x)はGF(p)上で選びます
ただし、1 <= k <= nとなるように生成します

## 再構築(復元)
しきい値以上の数のシェアを集め、生成した多項式にシェアの値を代入して連立方程式を立てます
その連立方程式を解くことで多項式の定数項、すなわち秘密情報が得られます
このときも有限体上で計算しますのでmod計算をしますね！

定数項ということはx座標が0のときの関数の値ですので
前述したラグランジュ補間とx=0という情報を用いると定数項がわかります(このためにラグランジュ補間の話をしました)
また、1 <= k <= nとなるように生成したので、必ず補間がうまくいきます

---

~~実装例は[こちら]~~
2021/4/26追記
自分の研究リポジトリ以下に置いていたので非公開にさせていただきました...
ただ、そこまで難しい実装ではないので式をソースコードに落とし込められればなんとかなります！(多分)

質問等あればTwitterなどで連絡いただければ答えられる範囲でお答えします
なかなか端折った説明となってしまいましたが読んでいただきありがとうございました
[Jupyter]経過時間をリアルタイムに表示するライブラリを作った

# [Jupyter]経過時間をリアルタイムに表示するライブラリを作った

[📓⏱️📓⏱️ `jupyter-autotime` というライブラリを作りました 📓⏱️📓⏱️](https://github.com/takelushi/jupyter-autotime)

## 🍟 作ったもの

↓説明するより動画をみたほうがはやいと思うのでみてください↓
![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115815/80b1e9eb-050a-16e4-6df4-3cf2d058305d.gif)

* features
   * 自動で `%time` の上位互換のようなことをやってくれます。
   * 経過時間がリアルタイムに分かります。
   * セルの開始時刻が分かります。終了後は終了時刻も分かります。

## 🛣️ 背景

* Jupyter で作業していたら、「このセルの実行にどれくらいかかったんだっけ 🥱」って思うことがよくあります。
* これは `%time` という magic command をセルの先頭に書いておくと解決します。
* しかし、 `%time` は、実行終了時に出力されるので、実行中のセルに**どれだけ時間がかかっているか**が分かりません。
* ほかにも「もっとこうだったらいいのに」っていうのがあったりします。

## 💪 `%time` の改善点

 * 実行中、**経過時間がわからない**
   * 実行中に経過時間を表示してほしい！
 * 時間を計りたいときに都度書かなきゃならないのは面倒
   * 書き忘れることもある。毎回勝手に計ってほしい！
 * いつ実行したセルなのかが分かるとありがたい（個人的に）
   * 何時から何時に実行したものか知りたい！

## 🥀 使い方

Notebook の最初に以下を書くだけで動作します。

```python
!pip install -U jupyter-autotime
%load_ext autotime
```

## 👽 実装について

### 出力内容を上書きすることで、1 行で見やすくスッキリと

ひたすらに時間を print してしまうと行数が増えて邪魔で使い物にならないでしょう。
1 度作成した DisplayHandle を更新していくことで、1 行で済むようにしています。

```py
from IPython.display import display
# DisplayHandle 作成
out = display('Initialize', display_id=True)

# 描画を更新
out.update('Update')
```

### 文字列を描画する際のシングルクォートをなくす

HTML として表示することで、シングルクォートで囲まれなくなります。

```py
from IPython.display import display, HTML

out = display(display_id=True)
# JupyterLab の場合は不要
out.display('')

text = '表示したいテキスト'
out.update(HTML(f'<pre>{text}</pre>'))
```

### 開始・終了時刻は ISO 8601 に準拠

* [ISO 8601 Time Interval](https://en.wikipedia.org/wiki/ISO_8601#Time_intervals)
* `YYYY-mm-ddTHH:MM:SS/YYYY-mm-ddTHH:MM:SS` で開始/終了を表します。

## 📎 リンク

* [takelushi/jupyter-autotime](https://github.com/takelushi/jupyter-autotime)
* [PyPI jupyter-autotime](https://pypi.org/project/jupyter-autotime/)

## 😂 不具合

2020/12/6 現在、ノートブックを再度開くと経過時間が2重に表示される不具合があります 😇😇😇
いずれなおします
→2020/12/10 なおりました
最近やったことのメモ（MVVM, asyncとdefer）

#MVVM
Webサービスの設計思想（ソフトウェアアーキテクチャ）
MはModel、VはView、VMはViewModelのこと

View -> View Model -> Model の順

役割でいうと、
表示　→　表示するために値の取得と加工　→　値　　こんな感じ？

View Modelが値と表示の間を取り持ってくれます。超優秀ですね☆


#asyncとdefer
JavaScriptファイルの非同期での読み込み
```<script async src="/abc.js"></script>
<script defer src="/xyz.js"></script>```

asyncとdeferどちらもドキュメントのパース中にスクリプトをダウンロード実行。

async・・・パースが完了前に実行。asyncスクリプトの実行は必ずしも順番通りではない。
defer・・・パース完了後に実行。deferスクリプトの実行は順番に行われる。

スクリプトが独立　<b>→　async</b>
スクリプトが依存　<b>→　defer</b>

#今日の名言
Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.
（付け足すものがなくなったときでなく、取り除くものがなくなったとき、それが完璧になるということだ）
-アントワーヌ・ド・サン＝テグジュペリ（作家）
文言（wenyan-lang）で乱数を得る

# はじめに
※ この記事は [文言 / wenyan‑lang Advent Calendar 2020](https://qiita.com/advent-calendar/2020/wenyan-lang) 4日目 の記事です。

はじめまして、@Mopepe51です。初めて文言関係の記事を書きます。
普段は[そういう用途ではない言語などで競プロをやってみた記事](https://qiita.com/Mopepe51/items/19ebc7c2171536580ee4)を書いたりしています。

文言で乱数を得るためのライブラリは公式に提供されているのですが、公式WikiのCheatsheetに用法が記載されておらず、使用のあたっての注意点もいろいろあるので記事にまとめてみました。

# 「易經」ライブラリによる乱数生成
文言で最も簡単に乱数を得る方法は易經ライブラリを使用することです。

```
吾嘗觀『易經』之書。方悟「占」之義。
施「占」。書之。
```

これで0以上1未満の乱数が出力されます。
`吾嘗觀『易經』之書。方悟「占」之義。`[^quote]で`易經`ライブラリの`占`関数をインポートし、
`施「占」`で乱数を得ます。

[^quote]: 文言の文字列は`「「 」」`でクオートしますが、代わりに`『 』`でも構いません。こっちのほうが格好がいいので好きです。

ただし、この方法だとシード値が固定されている（※ [余談:乱数のシード](#余談乱数のシード)）ため、`占`の実行の度には値が変わるものの、何度実行しても毎回

```
二分二釐一毫九絲三忽六微五纖零五塵九埃八渺六漠
八分六釐七毫零七忽四微一纖九沙五塵二埃九渺六漠
四分五釐六毫六絲二忽四微一纖六沙九塵一埃三渺五漠
……
```

という数列が得られます[^senkei]。

[^senkei]: わかる人向けの解説ですが、乱数生成には線形合同法が使用されており、$A=22695477$,$B=1$,$M=2^{32}$です。なぜこのパラメーター……？

実行ごとにランダムな結果を得たい、というときはこれでは困るのでシード値を実行の度に変化する数値に指定してやる必要があります。一番ポピュラーなのが現在時刻です。
`易經`と同様、時刻を取得するライブラリ`曆法`の`今何紀元時`で現在時刻のタイムスタンプを秒に変換したものが得られるのでこれを1000倍してミリ秒に戻したものをシード値に与えます。（`取底`は切り捨ての関数。）

```
吾嘗觀『易經』之書。方悟「運」「占」之義。
吾嘗觀『曆法』之書。方悟「今何紀元時」之義。
吾嘗觀『算經』之書。方悟「取底」之義。

吾有一術。名之曰「隨機播放」。是術曰。
	施「今何紀元時」。乘其以千。取一以施「取底」。取一以施「運」。噫。
是謂「隨機播放」之術也。

施「隨機播放」。噫。

施「占」。書之。
```

`隨機播放`を実行すると[^oku]シード値がシャッフルされるので、これで今度こそ0以上1未満の乱数が得られます。

[^oku]: `噫`は変数スタックをリセットする制御構文です。関数の戻り値はすべて一旦スタックに積まれ、`取一以施`などで関数に適用されます。適宜開放しないと使用されていない無名変数は`書之`ですべて出力されることになります。

0以上10未満の乱整数がほしければ

```
……

施「占」。乘其以一十。取一以施「取底」。書之。
```

とすればよいです。

# JavaScriptのrandom関数で乱数を得る
文言は変数名や関数名がJavaScriptのコードに直接展開されるためJavaScriptの関数を直接呼び出すことができます。
実質コードインジェクションですが公式のオンラインエディタで動くのでいいでしょう。（ただし、こういうことをすると当然PythonやRubyなど他の言語にトランスパイルした際に動かなくなるなど環境依存性が高くなるということに注意が必要です。）

```
夫「Math.random()」。取一以書之。
```

または

```
施「(() => Math.random())」。書之。
```

で乱数が出力できます[^roma]。
これだと自動で現在時刻にシードを設定してくれるので楽です。
Box-Muller法で正規乱数を発生させたりするのも1行で書けますね。

```
施「(() => Math.sqrt(-2 * Math.log(1 - Math.random())) * Math.cos(2 * Math.PI * Math.random()))」。書之。
```

ただし漢文レンダリングをすると悲しいことになります。半角英数字が縦書きに致命的に合わない……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121120/02afe614-16f4-e5fb-0cec-eea83a78048a.png)


JSの`Math.random()`も線形合同法を使っているらしく、乱数としての品質は高くないので注意が必要です。

[^roma]: えっ？漢数字だと読みにくい？仕方がないですね。~~`施「(() => Math.random())」。取一以施「(銜 => console.log(銜.toString()))」。`でローマ数字のまま出力されます。~~コンパイラオプションに`--no-outputHanzi`をつけましょう。

# 余談:乱数のシード
コンピューターにおける乱数とは殆どの場合[^random]疑似乱数であり、ある値を入れると一定の決まった値を返す関数です。
普通の言語ではこの値（シード値）に現在時刻などを入力して予測がつきづらい乱数を発生させています。
とはいえ決定的な計算なので予測をつけることは可能なことが多いです。これを避けるために暗号論的擬似乱数というものも存在します。ただし、本当に暗号的に予測がつかない乱数を生成するアルゴリズムは重いので、セキュリティが重要視されない場面では線形合同法でいい感じのパラメータを選ぶかメルセンヌツイスタを使用していることが多いようです。

[^random]: 疑似ではない真の乱数を取得するには熱雑音を観測したり放射性物質の崩壊を観測するなどの専用のハードウェアが使用されます。
nodeアプリケーションを実行可能ファイルにして出力する

## 結論
こちらを使っていきます
https://github.com/nexe/nexe

Nexe is a command-line utility that compiles your Node.js application into a single executable file.
(NexeはNode.jsアプリケーションを実行可能ファイルにコンパイルするためのコマンドラインツールです。）

## プログラム
せっかくなのでそれっぽくするために、Qiitaの情報をスクレイピングしてくるプログラムを作成します
＊chromedriverが入っている必要あり

``` qiita.js
const {Builder, By, Capabilities, Key, until} = require('selenium-webdriver');
const capabilities = Capabilities.chrome()

capabilities.set('chromeOptions', {
  args: [
    // '--headless',
    '--disable-gpu',
    '--window-size=1024,768'
  ],
})

const search = async () => {
    let driver = await new Builder()
        .withCapabilities(capabilities)
        .build();

    try {
        await driver.get('https://qiita.com/');

        const q = await driver.findElement(By.name('q'));
        q.sendKeys('クリスマス', Key.RETURN)

        const searchResult_itemTitles =  await driver
            .wait(until.elementsLocated(By.className('searchResult_itemTitle')))

        for ([index, searchResult_itemTitle] of searchResult_itemTitles.entries()) {
            console.log((index + 1) + '. ' + await searchResult_itemTitle.getText())
        }
    } catch (err) {
        console.log(err);
    } finally {
        await driver.quit();
    }
}

search()
```

``` package.json
{
  "name": "qiita-scrapor",
  "version": "1.0.0",
  "description": "testing selenium webdriver",
  "main": "qiita.js",
  "dependencies": {
    "selenium-webdriver": "^4.0.0-alpha.7"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Takuma Hanaya",
  "license": "ISC"
}
```

`npm i` で必要なライブラリを入れた後 `node qiita.js` でテストし動いたら準備OK。

```
hanayatakuma@MacBook-Pro-2:~/S/qiita-scrapor
➤ node qiita.js
1. Processingでクリスマス
2. クリスマスなのでケーキをえらびます
3. enebularでクリスマスイルミネーション
4. クリスマスといえばxsnow
5. クリスマス イルミネーションもどき
6. hikari と過ごすクリスマス
7. ﾀﾞｧ ｼｴﾘｲｪｽなクリスマス
8. iBeaconでクリスマスに備えよう！
9. クリスマスはIonicでゲームを作ろうぜ！
10. 聖夜の夜にGazeboでクリスマス
```

## Nexe

nexeを入れていきます

```
npm i -g nexe
```

以下のコマンドで実行可能ファイルにnodejsアプリケーションをパッケージングします

```
nexe qiita.js --output qiita-mac-x64 --target mac-x64-10.10.0
```

パッケージ可能なnodeのバージョン/OSリストは以下
https://github.com/nexe/nexe/releases/tag/v3.3.3

上のコマンドでは `qiita-mac-x64` というファイルができているので実行します

```
hanayatakuma@MacBook-Pro-2:~/S/qiita-scrapor
➤ qiita-mac-x64
1. Processingでクリスマス
2. クリスマスなのでケーキをえらびます
3. enebularでクリスマスイルミネーション
4. クリスマスといえばxsnow
5. クリスマス イルミネーションもどき
6. hikari と過ごすクリスマス
7. ﾀﾞｧ ｼｴﾘｲｪｽなクリスマス
8. iBeaconでクリスマスに備えよう！
9. クリスマスはIonicでゲームを作ろうぜ！
10. 聖夜の夜にGazeboでクリスマス
```
GitHubのコマンドをまとめてみた(ローカル編)

# 最初に
プログラミングの勉強を始めて3ヶ月程経ったので学んだことのメモをアウトプットとして記事に残します。
これからプログラミングの世界に入る人の手助けになれたら嬉しい限りです。
間違っていたり、言葉が違っていたり、表現が誤解されるような言葉があったら教えて下さい^^
言葉を長々と読みづらかったら申し訳ありません。少しずつなれてがんばります。

#GitHubのコマンドをまとめてみた(ローカル編)

### `$ git init`
ローカルでGitHubを使えるようにする！
これを一番最初に行わないと何も始まらない

###`$ git status`
今の状態を確認するのに使います。
新規作成したものや変更したもの、削除したものなどが分かります。
変更履歴にあるないもわかります。

###`$ git add`
変更履歴を残す準備をする
ワーキングディレクトリからインデックス追加する準備を行う
オプションも色々あります

###`$ git commit`
準備したもの（＝addしたもの）を変更履歴として残します。
こちらもオプションが色々あります。



###`$ git diff`
ワーキングディレクトリとインデックスで差がないか？をチェックする時に使います。
例えば全てをaddしてcommitをした場合
ワーキングディレクトリとインデックスとの間には違いがないので何も出力されないです。
ワーキングディレクトリで何かを変更した場合はその変更がインデックスには無いのでない部分が表示されます

###`$ git log`
コミットの履歴を確認することが出来ます。

###`$ git reset`
履歴から過去の状態に戻したい時に使います。
でも、これはローカルリポジトリの履歴を戻すものであって、手元で作業したファイルとかがもとに戻るわけではないので注意してください。


##最後
まだあるかもしれ無いですし、紹介したものには+オプションというのがあり更に便利にしてくれるものがあります。
学んでいた作業した中でとりあえずこれは押さえておいたほうが良いかもです！ダメなのはわかっていますが、後半3つは私もまだ使いこなせてないです^^;
`$ git init`や`$ git add`や`$ git commit`はものすごく使います。これは絶対に押さえておくのとオプションもついでに調べてみるとより作業効率が上がると思います！
今年を振り返ったポエム

年の瀬なので今年を振り返ります。

さっそく余談ですが、しばらく前まで日記をつけていました。
その時その時に思ったことを書いておいて、振り返るとそんなことあったなーってほっこりします。
最近は忙しくて書けなくなりましたが、年が明けたらまた始めようかな。
あと、日々起こった小さなことでも感謝するような日記をつけると幸福度が増すらしいです。
何かの心理学の本で読みました。

では本題です。

# 内部用のPythonライブラリーを作成した

PJ内部の分析環境をもとに、よく使うツールと連携するPythonライブラリーを書きました。
pipは[リポジトリを直接指定してインストールできる](https://pip.pypa.io/en/stable/reference/pip_install/#vcs-support)ので便利ですね。
インストール時にブランチやタグも指定できるので、タグでバージョンを作成するようになりました。
また、ツールの動作確認をするのにいちいち別環境でインストールするのも面倒で、テストとかも書きました。
改めてTDDって重要だと思いました。
[pandasにはtestingの機能もある](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.testing.assert_frame_equal.html)のでデータフレームごと比較できて便利です。
いろいろ勉強になりました。

# Udacity Data Engineer Nano Degree取った
[UdacityのData Engineerコース](https://www.udacity.com/course/data-engineer-nanodegree--nd027)です。
略してdend、最初見たときはなんやと思いました。

5ヶ月のコースですが、2ヶ月で割と簡単に終わったので、月額払いがいいです。
私の場合は、[会社が補助を出してくれます](https://www.brainpad.co.jp/recruit/culture/)が、定価はちょっと高すぎ...。
定期的に半額とかになっているので、その時にとるのがおすすめです。
ちょうど今だと、ブラックフライデーで75%オフですね。

新卒3年以内の人とか、エンジニアがデータ分野に手を出すとか、それくらいなら勉強になりますが、そうでないと表記は intermediate ですが、ちょっと簡単かもしれません。
ただ、内容はCassandra使ったり、AWSのEMRでSpark使ったり、Airflow使ったりして、それ自体はとても参考になりました。
触らない時は本当に触らないモノだったりしますし。
大学の授業みたいに、最終課題がセルフプロジェクトで世のオープンデータにも詳しくなれて良かったです。

私のリポジトリは[こちら](https://github.com/ieiriyuki/ud_data_engineer)です。

# 4月から在宅勤務になった
コロナの影響で在宅勤務になりました。
IT企業だし、デスクワークのみなので、働き方の選択肢が増えたのは良いです。
個人的にも在宅勤務自体はプラスです。
確かにコミュニケーションは難しくなりましたが、ツールでなんとかなると思っています。
新メンバーの受け入れとかは気をつけるようになりました。

飲み会とかなくても大丈夫なタイプなのですが、会社のボドゲ会とかできなくて寂しいです。

# 社内向けオンラインの案件紹介プロジェクトをやった
私はオンサイトでの業務も結構ある (あった) のですが、以前ならば本社に顔を出したときや、懇親会などで仕事の話を明に暗に情報交換できましたが、コロナでそれも難しくなりました。
そこで、私が担当しているクライアントのいくつかのチームに関して、オンラインで紹介するプロジェクトを実施しました。
ある程度、新卒や中途入社の方には参考になったようです。
最近は、在宅勤務環境での交流についても、個々人レベルでノウハウが溜まってきているようなので、組織レベルでまとめたいですね。

# Agileを勉強し始めた
[はなだてさんのブログ](https://note.com/87date/n/n0bd89605971c)で紹介されていたり、個人的にも仕事をする中で、「あれをこう変えたい」、「ここはこうしたい」などの要望も受けたりして、ある程度PJをイタレーティブに進める方がいいなと感じていました。

**余談**
まあ、そんなん言うなら最初からRFPちゃんと書けよとか、そこらへん詰めてからアナリストにまわしてよとか、コンサル専門スタッフ用意しなよ、とか思ったりします ^^;

知識ベースだけでもアジャイルな進め方を学んでおきたいなと思って、マイク・コーンやジェフ・サザーランドの本を読んでいます。
ただうまく日々の業務の中に取り込むのは難しいですね。
もちろん、アジャイルなやり方の一部は既にあるのですが、もうちょっと自覚的に導入したい気がします。
MTGはいいのですが、タスク作成やイテレーション、リリースの概念は分析PJでは扱いにくいです。

# Kaggleに参加したい1年だった
オンゴーイングコンペ参加したかった。
M5も登録はしたのですが、仕事が忙しく全然時間割けませんでした。
世のカグラーは本当に尊敬します。

# Google Cloud Professional Data Engineerを更新した。
10月31日に受験して合格しました。
最初は新鮮で良かったですが、更新となるとアップデートがあるにしても、モチベの維持が難しかったです。
SpannerとFirestoreが個人的にはアップデート入った部分でした。
詳細は[こちら](https://qiita.com/ieiringoo/items/9b3b8861798c48aca80c)です。

# Adobe Maxに一応参加した。
[Adobe Max 2020](https://maxjapan.adobe.com/)
どこかでAdobeも結構機械学習やっているよね、という話を聞いて、デザインとかも興味あるので、参加しました。
コロナじゃなかったら現地に行ってみたかったですね。
フォトショやライトルームで画像編集ができるんですが、色味やテクスチャの感じを変更したり、オブジェクトを除いたりする機能を機械学習で実装していました。
[Adobe Sensei](https://www.adobe.com/jp/sensei.html)がバックエンドなんですが、画像や動画の編集で、アレしたい、コレしたいを機械学習の能力で解決していて、すごかったです (小並感)。

Adobeは、ソフトの切り売りから、SAAS型のビジネスモデルにうまく切り替えて成功した企業ですし、開発や戦略も上手だなーと改めて感じました。

---

現場からは以上です。
来年は本とか書いてみたいですね。
それでは皆様良いクリスマスと新年を。
Node.jsについて調べたことまとめ

#Node.jsとは

**サーバーサイドのJavascript実行環境である。**

PHP、Ruby、Python、Java等の言語と同様に、サーバー側で動作するJavaScript。

Google Chromeに搭載されたJSエンジンV8をサーバーで実行できるようにしたというイメージ。

V8の処理は、他のPHP/Perl/Ruby/Pythonなどのスクリプト言語の処理エンジンよりも速い。

# Node.jsでできること

- サーバーサイドアプリケーション 
  - Webアプリ
  - Node.js + Express




- クライアントサイドアプリケーション 
  - Visual Studio Code
  - GitHub Decktop
  - Slack   

  
  などが利用例である。
  Node.js + Electron

- IoT
  - Node.js + Raspberry Pi  



# Node.jsの特徴
- シングルスレッド

- ノンブロッキングI/O（非同期処理）
- イベントループ

###シングルスレッド
プログラムの処理単位を表す用語。
一連の処理を一つずつ順番に行う。

他にマルチスレッドがある。
複数の処理を並行して行う。

### ノンブロッキングI/O
シングルスレッドで複数の処理を捌く為の仕組みがノンブロッキングI/Oである。
データの送受信(I/O)を待たず(ノンブロック)並行して処理を行う。

マルチスレッドでも並行処理が可能だが、この場合リクエストの度にThreadという処理が発生する。
Threadにはメモリを消費する為、限界を超える大量のリクエストを捌き切れなくなってしまう。

このことを**C10K問題(クライアント1万台問題)**という

### イベントループ

リクエストやコールバックをイベントとして扱い、
そのイベントに関する処理が終わった際に次のイベントを処理する仕組みのこと。

他にスレッドモデルがある。
スレッドモデルはスレッドが増えるほどメモリを消費するが。
イベントループはシングルスレッドの為、メモリの消費は少ない。

# Node.jsのメリット

- サーバーからクライアントまで1言語で記述できる
  - 学習コストが低い


- C10K問題に対応できる

- 活発なコミュニティーサポート

- ライブラリが豊富

### Node.jsのデメリット

 - Node.jsとフロントエンドのJavaScriptには、同じJavaScriptでも処理上の互換性がない。
 - Node.jsに対応しているサーバが少ない（VPS（仮想プライベートサーバ）などを利用してインストールする必要がある）


# まとめ

- Node.jsはノンブロッキングI/O、イベントループの仕組みにより軽量で効率的に多くの処理を捌くことができる。

- サーバーサイドからクライアントサイドまでJavascriptのみでサービスを作れる。
参考にした記事の記録

#Qiita
マークダウンチートシート
https://qiita.com/Qiita/items/c686397e4a0f4f11683d

#Windows
SYSTEM権限で物事を実行する方法
https://neos21.hatenablog.com/entry/2017/02/07/075752

##WMI
Win32_Process
http://www.wmifun.net/library/win32_process.html

##サービス
サービス削除
https://plaza.rakuten.co.jp/mscrtf/diary/201209240000/

##プリフェッチ
http://sectanlab.sblo.jp/article/115076023.html

#LDAP
検索フィルタ
https://software.fujitsu.com/jp/manual/manualfiles/M050000/B1WN4911/01/idmgr07/idmgr447.htm


#PKI
PKI関連のファイルフォーマットの概要
https://qiita.com/kunichiko/items/12cbccaadcbf41c72735#comments

#プロジェクト
システム開発工程
https://qiita.com/on-vegetable/items/fad5ddcb77bf356f58fc

#興味が湧いたもの
ローカルプロキシ（認証対応）
https://qiita.com/Nuits/items/1bd84b45b0b092527d8d
30代からのプログラミング勉強　9日目【HTML/CSS編】

イヤホンが壊れてしまい学習に影響が…急ぎ買い換えなくては！

##学習内容
###HTML
```HTML:画像
<img src="画像の指定">
```
画像を貼り付ける事が出来る。

```HTML:
<img src="画像の場所" alt="何の画像か"
```
基本的にはこの様にaltを書き込む。視覚的な変化はないが読み上げ機能を使った時などにこの画像が何なのかを示してくれる。

```HTML:リスト
<ol>
   <li>任意の内容</li>
   <li>任意の内容</li>
   …
</ol>

```
liの内側に書いた内容が
1.〜
2.〜
の様に番号が振られリスト化される。
開始番号を変更したりアルファベットにしたり逆順に番号を振るも可能。

```HTML:リンク
<a href="URL">リンク</a>
```
URLリンク。CSSで色を固定にしたりよくある下線を消したり出来る。

```HTML:実体参照
&copy; ©︎
&quot; "
&amp; &
&apos; '
&lt; <
&gt; >
&reg ®︎
```
環境依存文字の入力に使用する。

###CSS

```CSS:回り込ませる
float: left;
```

厳密にはコマンドの通り浮かせる事が出来るCSS。上記の書き方だと左側に浮く。

```CSS:回り込みを解除する
clear: left;
```
floatを解除する事が出来る。

```CSS:
.clearfix:after{
    content: " ";
    display: table;
    clear: both;
}
```
floatを使用してはみ出してしまった場合に背景を合わせてくれる記述。技術的な話は現時点では難しいので講座内では割愛となった。やり方は複数あるらしい…？

```CSS:フォント
font-family: 
```
指定したフォントを使用できる。Google Fontsを用いる事でインストールされていないフォントを表示させる事ができる。ただし開いた時に読み込んでくるので全文に使用したりするとページ読み込みに時間がかかりナンセンス。

Webフォントを使用する場合は@importでフォントについての記述を行った上でfont-familyで指定する。

##所感
…ではないがイヤホンの音が出せず復習がしにくいので後ほど再トライして追記予定。せっかく楽しくなってきた所だというのに…ッ

追記完了。
Rails6.0にjQueryを導入したい

# はじめに
RailsアプリにjQueryを導入したいときにどの手順で行えばいいのか。
今回はその課題解決を図る目的でアウトプットしていきたいと思います。

# この記事のゴール

* Railsアプリに**jQuery**を導入できるようにする

# 目次
[1.管理ツールとjQueryの導入手順](#1-管理ツールとjQueryの導入手順)
[2.JSファイルの管理場所](#2-JSファイルの管理場所)

## 1. 管理ツール
Rails5.2まではJavascriptJavascriptをSprocketsをで管理していました。
しかし、Rails6.0からは**Webpacker**を使ったJavascriptの管理がデフォルトに変更されました。

###1-1. Webpackerとは
WebpackerはwebpackをRailsから使いやすくするためのラッパーです。
webpackとは、JSをなどの様々な形式のファイルを一括でまとめるモジュールです。
今後のフロントエンド開発にとってはスタンダートなツールになるのでなるべく最新の管理方法でjQueryを導入しましょう。

###1-2. jQueryの導入手順
では早速、jQueryを導入していきましょう！
WebpackerではパッケージマネージャーとしてYarnを採用しているため、このyarnコマンドを使用します。
旧来のやり方だとgem 'jquery-rails'というGemをインストールするのですが、今回は別の方法で行います。

```php:terminal
% yarn add jquery #ターミナルからコマンドを入力
```

次にenvironment.jsファイルを編集します

```php:config/webpack/environmant.js
const { environment } = require('@rails/webpacker')

// ↓ 追記部分
const webpack = require('webpack')
environment.plugins.prepend('Provide',
    new webpack.ProvidePlugin({
        $: 'jquery/src/jquery',
        jQuery: 'jquery/src/jquery'
    })
)
// ↑ ここまで

module.exports = environment
```

次にapplication.jsファイルを編集します

```php:app/javascript/packs/application.js
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")

// ↓ 追記
require('jquery')
```

ここまででjQueryの導入が完了しました。

続いてjQueryを書き込みたいファイルをjavascript以下に作成します。

## 2. JSファイルの管理場所
app/javascript以下にファイルを作成します。
今回は「test.js」という名前のファイルを作成します。
![スクリーンショット 2020-12-03 23.21.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772095/3c95d8c9-4a5d-e46d-e772-a51e5c34160a.png)

先ほど作成したファイル(test.js)が読み込まれるよう「application.js」に「require(‘test.js’)」の記述を追記しましょう。

```php:app/javascript/packs/application.js
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
require('jquery')

// 以下の1行を追記
require('test.js')
 ```

必要な手順はすべて行いました。
あとは実際にjQueryが読み込まれているか挙動を確認します。

```PHP:test.js
$(function() {
  console.log("OK");
});
```
下の図のようにOKと表示されていれば、無事jQueryが夜もいこまれています。
![スクリーンショット 2020-12-03 23.32.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/772095/12af3e53-e60f-ace7-bbbb-0ec6aa68e811.png)

## おわりに
最後まで読んでいただきありがとうございました！
お疲れさまでした。。

## 参考文献

・[Rails6】Webpackerを用いてjQueryをインストールする手順を簡単にまとめてみた](https://techtechmedia.com/jquery-webpacker-rails/)
・[パーフェクトRuby on Rails](https://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88-Ruby-Rails-%E3%80%90%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88%E3%80%91-Perfect/dp/4297114623/ref=asc_df_4297114623/?tag=jpgo-22&linkCode=df0&hvadid=342520995287&hvpos=&hvnetw=g&hvrand=11223555980507829642&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009343&hvtargid=pla-918633009109&psc=1&th=1&psc=1&tag=&ref=&adgrpid=69995157558&hvpone=&hvptwo=&hvadid=342520995287&hvpos=&hvnetw=g&hvrand=11223555980507829642&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009343&hvtargid=pla-918633009109)
VSCodeの環境をSettings Syncをつかって複数端末で共有する

##Settings Syncとは
Setting SyncとはVSCodeの設定同期機能のことです。2020年11月現在はプレビュー版という扱いではあるものの、一応安定版という形でリリースされています。
##前提
 - GitHubまたはMicrosoftのアカウントを保有していること
 - VSCodeが最新版にアップデートされていること
 - 拡張機能のsetting Syncはアンインストールまたは無効化

##設定方法
###1. Settings Syncをオンにする
左下の歯車マークをクリックして「設定同期をオンにする...」を選択します。　※起動直後だと表示されない場合があるようなので注意
![スクリーンショット 2020-11-27 14.12.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636551/ac0c6d50-d9be-5228-1134-676ea1a34168.png)
すると、確認ダイアログがでてくるので**しっかりとドキュメントを読んでから**「オンにする」をクリックします。
![スクリーンショット 2020-11-27 14.12.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636551/3102e232-632b-2cff-4545-909d9c0c66be.png)
したのようなダイアログが表示された場合は、同期項目を選択し「サインインしてオンにする」を押下してGitHubかMicrosoftアカウントにログインします。
![スクリーンショット 2020-12-03 22.56.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636551/4060d091-4042-63ed-1ae6-3e6c94d8cf43.png)
画面左下の歯車マークを押して、画像赤枠部分が「設定の同期がオン」になっていれば設定は完了です。![スクリーンショット 2020-12-03 23.09.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636551/87de6cf0-6b7a-0f61-d8c7-ff7cd7f2fe5b.png)
##設定の同期
環境を統一したい端末それぞれにここまでと同様の設定をします。
保存する情報のデフォルトの値を指定する

#はじめに
　最近はパソコンに向かう時間が短すぎてアウトプットが思うように進まない…


##モデルに情報をを保存するときにデフォルトの値を設定しておく

```ruby:db
t.string :admin, null: false, default: admin
```

`default`によって、情報を更新する形で入力しなければ、defaultの値が保存される。
入力フォームにカラムを入力するところを作らなければ、勝手にデフォルトの値を入力できるのでは！？
転職で使えるソフトウェアテスト

こちらは[ソフトウェアテストの小ネタ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/software-testing-koneta)の6日目の記事です。

私はこれまで3回転職を経験して、最近は今年の5月に転職活動をしていました。当時はコロナ発生直後で転職活動も様変わりしどうなるものかと心配していましたが、結果的に転職活動が全てオンライン上で完結してIT業界便利だなーと業界メリットに感謝したのと、オンライン面接でその月の通信量が70GBを超えて追加料金が必要になったのが印象深い思い出です。

今回紹介するのは転職活動において**「自分のスキルが応募先の企業にとってどう役に立つか。」**をテストエンジニアの流儀で上手く伝える方法です。

要約はこちらです。これでピンと来た人は後は読まなくても大丈夫です。

+ **プロの受け入れテストエンジニアとして、企業研究も兼ねて面接先のWebサービスをテストする**
+ **受け入れテストテストで検出した不具合や改善案を面接時に伝える**
+ **ソフトウェアテストの同人誌頒布など分かりやすいアピールポイントを履歴書に盛り込んでおく**

###■プロの受け入れテストエンジニアとして、企業研究も兼ねて面接先のWebサービスをテストする
転職活動する上で応募先の企業研究は実施すると思いますが、その企業が一般向けにWebサービスを提供しているならプロの受け入れテストエンジニアとしてテストを実施しておきましょう。受け入れテストを実施するメリットや応募先の企業に提供できる価値は以下になります。

+ **そのWebサービスを初めて触るユーザの感想は、日頃そのWebサービスに触れている企業内のエンジニアにとって新鮮で貴重なものになる**
+ **テストエンジニアなら一般的なユーザと比べて品質特性などを用いて多種多様なチェックが可能であり、かつチェックした結果を相手の要求に合わせて適切に伝えることができる**
+ **品質に課題を感じてテストエンジニアを募集してるくらいだから、Webサービスを一通り触ればどこかに不具合や改善点が存在する**
+ **Webサービスを触る過程でサービスの設計思想や企業の考え方や開発エンジニアの姿などが透けて見えるので、自分と企業との相性も見えてくる**

私がWebサービスをテストする際は主に探索的テストの知見を活用しています。例えば申し込み等の一連の操作がスムーズに行えるか、検索画面で比較がしやすいか、入力ミス等があった場合にミスの内容や修正箇所が分かりやすいか、等々テストチャータをザックリと決めてテストを開始します。テスト中は各操作に対するWebサービスの反応とその際に違和感が生じていないか自分の内面を注意深く観察します。違和感の正体は何らかの期待に対する現実の反応との差異なので、それを逃さずキャッチし言語化出来れば不具合や改善点も見えてきます。

###■受け入れテストテストで出てきた不具合や改善案を面接時に伝える
これはそのまま面接時のアピールポイントの話に繋げられます。また伝える際のポイントは以下になります。

+ **その場で確認可能な不具合を伝える**
+ **面接官がエンジニアでなくても分かりやすい不具合を伝える**
+ **不具合を伝える際はユーザへの影響度および改善提案もセットで伝える**

面接相手に「あ、この人社内のテストエンジニアが見逃した不具合を見つけ出せてる。」と思わせられれば大成功です。また面接の話を進めていく中で面接官の関心も見えてくると思うので、それに合わせた不具合情報や改善案を提供できるとなお良いでしょう。

不具合情報を伝える際の注意点としては、相手にネガティブな印象を与えないように言葉を選ぶことです。例えば太めな人に「デ〇ですね。」と伝えても相手を怒らせるだけです。一緒に品質を改善していく姿勢を崩さないようにしましょう。

###■ソフトウェアテストの同人誌頒布など分かりやすいアピールポイントを履歴書に盛り込んでおく
オフライン面接の時代は面接中に同人誌の話題へ必ず誘導していました。実物の本を紹介して興味を持ってもらいながら自分の得意分野で話ができるので盛り上がりやすいですし、相手が抱えている品質課題に対して本の記事を紹介しながら改善案を提案できれば信頼度も大幅アップします。面接と言う真剣勝負の場において、相手への直接攻撃が可能な自分専用の武器（物理）を持ち込めるのってワクワクしませんか？

余談ですが転職活動中や転職先で「社外イベントで発表しているのを見かけました。」とか「同人誌持ってます。」等と声を掛けられたことが何度もあります。ポートフォリオに同人誌の情報を載せたら購入してくださった方もいました。社外活動をしていると誰かの目に止まりますし、その内容を勉強会などの形で日々の業務にも活かせるのでお勧めです。

では、転職を考えている方にとってこの記事が一助になれば幸いです。
[TypeScript] Jestでユニットテストを書こうとしたら、'cannot find name jest' と表示された時に確認する箇所 

## 概要
TypeScriptを利用しているプロジェクトでJestを導入して、ユニットテストを書こうとしたら、`cannot find name jest`と表示され少しつまづいたので、対応した内容を記載します

## 実行環境
Node.js: v12.18.3
@babel/core: 7.10.1
@babel/preset-env: 7.10.1
@babel/preset-typescript: 7.12.1
babel-jest: 26.6.0

## インストール時にやったこと
[Jest公式のインストール手順](https://jestjs.io/docs/en/getting-started)に沿って、下記の手順でインストールを進めました。
(すでにプロジェクトには、babel, babel.comnfig.js, TypeScriptの設定は存在していている前提です。) 

1. `yarn add --dev jest` でJestをインストール
2. `yarn add --dev babel-jest`で devDependenciesに `babel`用のJestのモジュールを追加

## エラー発生時の状況
外部リソース(ここではS3)を利用したメソッドをテストするために、Mockを作ろうとしたタイミングでエディターに`cannot find name jest`と表示されました。

``` s3Operation.test.ts
jest.mock(aws) // ここで cannot find name jest のエラー

import{ S3 } from 'aws-sdk';
```

## 対応した内容
`yarn add --dev @types/jest` で jestの型をdevDependenciesに追加することで解決できました。

完全に自分のミスなのですが、Jest公式のページの下記の記載を読んだ時に、`@types/jest` は入れなくても動作すると勘違いしていたのがよくなかったです。

他にもstackoverflow などで同じようにつまづいている人もいたので、もう少しわかりやすい記載だとありがたかったかなという印象です。

>You may also want to install the @types/jest module for the version of Jest you're using. This will help provide full typing when writing your tests with TypeScript. 

## 参考
* [Jest公式のインストール手順(Getting Started)](https://jestjs.io/docs/en/getting-started)
* [stackoverflow: cannot find name it in jest typescript](https://stackoverflow.com/questions/56595053/cannot-find-name-it-in-jest-typescript)
* ["Cannot find name 'jest'" Typescript error](https://intellij-support.jetbrains.com/hc/en-us/community/posts/360000368020--Cannot-find-name-jest-Typescript-error?sort_by=created_at)
カクヨムにファイルで投稿する機能がないので作ってみた

## TL; DR

1. ログイン時、ヘッダにX-requested-With:XMLHttpRequestつける
1. 投稿時は、csrf_tokenなので、GETでトークンを手に入れる
1. csrf_tokenとtitle(話のタイトル)とbody(本文)をPOSTする

## [動機]ファイルアップロードしたい

ローカルで書いてる人にとったら、コピペ面倒ですよね。
~~こちとら、markdownで書いて、pandocでわざわざplain-textにしてるんじゃい。~~
どうせPOSTかPUTで投げたらいいんちゃうの？
というわけで、流行りの(?)httpieを使ってやってみます。

## ログイン

しかし、Webセキュリティの基本にして、自動化の敵、CSRF対策が立ちふさがります。
ログイン画面は、ヘッダにX-requested-With:XMLHttpRequestつけるタイプです。

login.sh

```bash
#!/bin/bash
read -p "email:" email
read -sp "password:" pw

echo $emailでログイン

http --session kakuyomu \
     -f	https://kakuyomu.jp/login \
       	email_address=$email password=$pw \
	X-requested-With:XMLHttpRequest
```

とりあえず、--sessionオプションをつけて、一旦ログインすることでセッションIDを保存します。

## 投稿

投稿画面も同じ感じかと思ったら、こっちのフォームには、csrf_tokenが隠れています。
そのため、一度GETでフォーム画面を標準出力に流し、grepやらsedやら使ってトークンを取ります。
(マッチした文字列だけ取る方法をもうちょっとスマートに書きたいんだけど......)

投稿で投げる必要のあるパラメータは、

* title : 話のタイトル
* body : 本文
* csrf_token : トークン

です。

第一引数に投稿したいファイルを指定
new_story.sh [file]

```bash
echo "追加したい小説のIDは以下のアドレスの****の部分です"
echo "https://kakuyomu.jp/my/works/*******************/"
echo "本文に半角ダブルクォートがあると死にます"
read -p "小説ID:" novel

url="https://kakuyomu.jp/my/works/${novel}/episodes/new"

#とりあえずcsrf_tokenとってくる
token=$(http --session kakuyomu $url \
	| grep csrf_token \
	| sed -r 's/^.*value="(.*?)".*$/\1/')
#タイトルの第○話を残す場合
title_no=$(http --session kakuyomu $url \
	| grep "name=\"title\"" \
	| sed -r 's/^.*value="([^"]*?)".*$/\1/')

infile=$1

title=$(cat $infile | grep "^#" | head -n1 |  sed -r 's/^\s*#+?(.*).*?$/\1/')
title="$title_no $title"

#タイトル行を除いた部分
body=$(cat $infile | grep -v "^#")

#echo $token
echo "--------------------------------"
echo $title
echo "--------------------------------"
#echo $body

http --session kakuyomu \
       -f $url \
       title="$title" \
       status=draft \
       edit_reservation=0 \
       keep_editing=0 \
       body="$body"
```


~~ただし、試してないけどダブルクォートがtitleとかbodyにあると死ぬかも。~~
~~bashマスターの人、解決方法求ム。~~
「Unity」使ってゲームを作る！

この記事は [いえらぶGROUP Advent Calendar 2020](https://qiita.com/advent-calendar/2020/ielove-group) 3日目担当KURIeIGHTが担当します！

今回はゲーム開発ツールの「**Unity**」を使い開発をしてみました。
学生時代illustratorやPhotoshopをバンバン使ってきた身(Unityと繋がりあるのか？)としてUnityはずっと使ってみたかったので長年の夢が叶いました！！

##What is Unity？
Unity（Unity3D）は、IDEを内蔵するゲームエンジンである。 2005年にMac OS Xに対応したゲーム開発ツールとして誕生した。100万人以上の開発者が利用している[4]。開発はユニティ・テクノロジーズ（英語版）。日本法人はユニティテクノロジーズジャパン合同会社。 クロスプラットフォームに対応しており、モバイルゲームやパソコンゲーム、ブラウザゲームなどの製作に用いる。 ゲームエンジン自体はC言語/C++で書かれており、開発者はC#を用いたプログラミングが可能である。

2015年10月にリリースされたバージョン5.2.2現在、iOS、Android、Tizen、Android TV、Windows、Windows Phone 8、Windowsストアアプリ、macOS、Linux、ウェブブラウザ (WebGL)、PlayStation 3、PlayStation 4、PlayStation Vita、Xbox 360、Xbox One、Wii UそしてVR/AR向けの開発に対応している[5]。また、2016年1月8日からは、パチンコ・パチスロを含む日本国内の遊技機およびアーケードゲーム機開発用ライセンス「Unity for 遊技機」の販売も開始された。
【引用：[wikipedia](https://ja.wikipedia.org/wiki/Unity_(%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3))】

##Unityで迷路を作る？
環境
Unity：2019.4.15f1

手順
①スタート位置とゴール位置を迷路の正解経路を立方体オブジェクトで簡単に作る
② ①で設置した立方体をもとに壁を作成
③簡単なプレイヤーオブジェクトをスタート位置に置く
④プレイヤーオブジェクトを十字キーで動かすコードを「C#」で記載

**①迷路コース**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596047/e98b0841-bee9-983d-b9dc-4af74f5bede5.png)

**④のコード**

```c#：Player.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.position += new Vector3(0,0,-0.1f);
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.position += new Vector3(0,0,0.1f);
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.position += new Vector3(-0.1f,0,0);
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.position += new Vector3(0.1f,0,0);
        }
}
```

##まとめ
・クラス名とファイル名が合ってないと動かない。大文字小文字も区別する。（PHPにもあった気がする）
・Unityの操作ムズイ！！いままで教わってきたY軸とZ軸が逆？
　→オブジェクトが３Dなので柔軟な発想が大事。
・PHPしか触ってきてなかったけど、ほかの言語を触ることによって、似てるところ全く違うところが多々あって楽しい！
・Unityだけでゲームを完成させるツールではなく、プロトタイプを作るのにぴったりだと思う。自分のイメージをすぐ形にしやすい。