OmniAICreator/Qiita-1.07M huggingface dataset:
完全未経験からエンジニアとしてITベンチャーに就職して２ヶ月の気づき

# はじめに

2021年の５月から、大阪のとあるベンチャー企業でエンジニアとして働かせていただいています。
いっときほどの勢いはなくなった印象ですが、いまもエンジニアへの転職を希望されている方は一定数いらっしゃると思います。
そんな「エンジニアを目指している方々」へ向けて、自身の気づきをつらつらと書いていこうと思います。
すこしでも参考になれば幸いです。

# 筆者プロフィール
　
簡単にではありますが、私のプロフィールです。

- 28歳で職歴一切なし（個人事業主のイベント業＆元バンドマン）
- 2020年8月から「RaiseTech」というスクールのJavaコースに通い、プログラミングの学習を開始
- 12月にポートフォリオアプリを作成（記事がありますのでご参考までに…）
- 2月に内定獲得
- 5月からエンジニアとして入社し、業務アプリケーション作成、運用チームに参画（リモートではない）


# 思ったこと、感じたこと

ここからは、実際に業務に入って感じたことなどを項目にあげ、詳細を書いていきます。

## コードずっと読んでる＆全くわからん

個人学習やプログラミング学習って、コードを「書けるようになる」のが目的と思います。
僕も完全にそう思ってました。
良いコードを書ける「書く力」が付けば戦力になれると、大真面目に思ってました。


今現在の状況で自分が至った結論

**「読めるほうがもっともっと大事」**

です。

実際実務に入ると、個人で学習していた頃の数百倍とかのファイルがあります。
そして各それぞれのコードが数千行あったりします。もうほんと、「何じゃいこれ……」という感じ。

これを色んな人が修正し改善していくため、まずは
「どこのどの処理が、どう使われているのか」ということを把握する必要があります。

そして上記を理解した上で、ようやく機能についてのコードを書き始めることができます。

僕の場合ですと、業務に入ったばかりの頃は１日の9.9割ぐらいはコードを読むだけで終わりました。
未経験時から「他人のソースを読み解く」ことに慣れておけば、もっとスピーディーに業務を進められたのかな……

といまでは感じています。
それくらい、僕にとってはカルチャーショックと言わんばかりの衝撃でした。

## 質問、めっちゃ大事

よく言われていることではありますが、**質問超絶大事**です。

前節で述べたように、業務に入ると本当に「何がわからないのかわからん」と「なにこれ？」が無限に出てきます。
これを質問としてまとめて、疑問をひたすら解消する。

基本的にはずっとこの一連の流れです。
そこで求められてくるのが「質問力」だと、実際に業務に入り改めて感じました。

この質問力に関して、自分が「良かったな」と感じたことは、書籍などで文章化能力についての学習をプログラミングとは別で行っていたことです。
この文章化がある程度できるようになっていたため、

1. 疑問をバラバラでも文章にする
1. それをもとに、一度構成をはめて文章化する
1. 口頭で質問する

ということをひたすら行っていました。
そのため、質問の仕方については褒めていただけることがありました。
文章化能力もプログラミングの能力と同等か、それ以上と考えてもらったほうがいいと思います。


## めっちゃ丁寧に教えてもらえる

ありがたいことに、職場の環境はすごくいいです。
コミュニケーションも活発だし、聞いたことには何でも丁寧に教えてもらえます。
ただ、自分なりの答えが全く見えない状態だと「これで調べた？　もうちょっと調べてみようか」とは言われます。

僕は性格的に

**質問が先輩の時間を奪ってしまっている……！**

と感じてしまうんですが、チームとして全体的にみたら質問して解決するなら絶対そのほうがいいです。
仕事なので当然納期もあります。

なので、質問力を鍛えるのは本当におすすめです。

自分自身のスキルアップと、相手の時間への配慮に繋がります。

# 問題点

## 目を痛めた

自分の癖もあるんですが……
考え込むとめちゃくちゃ画面に近づく癖があり、業務でずっとPC見ているうえに、自宅でも２時間ほど学習。
スマホで読書やtwitterなんかを繰り返すうちに強烈に目が痛くなり、眼科に行くと「テクノストレス眼症」と診断されました。

- つい画面に近くなる
- メガネの度が結構強い（目に負荷が大きい）

上記の２点が当てはまる方は注意が必要です。
エンジニアは目が超大事です。いたわっていきましょう。

## 焦りでいろんな勉強しなきゃ……義務っぽくなった

もともと、ITでいろんなことしたいな、楽しそうだな、から勉強をはじめましたが、業務が始まってからは義務のようになってしまって全然能率が上がらないことが多々ありました。
また、いろんなことを一気に覚えなければいけないため、「一つ一つ深く理解しなきゃ」と考えはじめるとちょっと病んできます。
ネットにはすごい人がいっぱいいるので、自分と比べてしまうこともありはじめの1ヶ月は特にきつかったです。


結論として「目標のない勉強」は苦痛になってしまうのかなと考えているので、目標設定をすることをまず考えるようにしました。
今でいうと「業務を爆速でこなせるようになる」を目標設定したので、最近は

業務で使う技術 > 個人で使いたい技術　 > 歴史の勉強（趣味） > 世間でモダンとされている技術

みたいな感じになっています。

今後は根本的にもっと楽しく勉強できるよう、個人開発など積極的に取り組んでいこうかな〜と考えています。


# まとめ

IT業界は僕は「夢のある業界」と思っています。

これからエンジニアを目指される方々が、自分の人生を定めるなにか一つのきっかけに慣れれば幸いです。
僕にとっては今の所エンジニアになって心底良かったと思っていますが、あなたにとってはどうかわかりません。

雑多に飛び交う情報を鵜呑みにせず、これをなんとなく踏まえた上で、自身の夢を叶える一助になれればこれ以上のものはありません。
ここまで見ていただいてありがとうございました！！
業務知識を得るための基礎知識

#0.Intro
ずっと学んでいる機械学習のスキルをどうにか業務に活かしたいとずっと思っていました。でも糸口が全く掴めず。。。
今にして思えば当たり前なのですが、「業務に機械学習を活かしたいならまず業務を知らないといけない」。これに気付くのにとても時間がかかりました。しかも今の職場に入るまで「物を作って売る」という世間的に一番多い業態に身を置いたことが無かったので、所属している企業の業務について全く知りませんでした。周りではいつも聞いたことが無い言葉ばかり飛び交ってて、という状態でした。
普段の業務ならある程度所謂IT技術のみで業務をこなせます。でもデータという事業の中から生まれてくるものを扱う機械学習については、まず業務のこと(ドメイン知識ですね)を備えておかないと話にならない。

でも身を置く業界特有の知識以前の「一般的」な知識をまず押さえてからの方が勉強の仕方としてずっと効率的で且つ効果的。
そんなことに気付いてからせっせと読んだ本。

#1.本紹介

[ITエンジニアのための【業務知識】がわかる本 第5版](http://www.amazon.co.jp/exec/obidos/ASIN/4798157384/jinkakushouga-22/)
もう改定も止まっている感じがありますが、それでも僕みたいにゼロベースな人は今からでも一通り目を通す価値あると思います。僕もこの本(僕が持っていたのは10年ぐらい前の版w)を読む前と読んだ後では会社での会話の入り方が全然違いました。
経営企画→商品企画→調達→製造→出荷というようなフロー。経理の仕事、人事の仕事、等世間一般での会社の機能みたいなものを掴めます。


[この1冊ですべてわかる SCMの基本](http://www.amazon.co.jp/exec/obidos/ASIN/4534051689/jinkakushouga-22/)

[この1冊ですべてわかる　在庫マネジメントの基本](http://www.amazon.co.jp/exec/obidos/ASIN/4534051689/jinkakushouga-22/)

物流・生産は普通の生活してたらまるで縁が無い。でも会社データって会計と並んで物流・生産に関わるデータの比率がとても高い。避けては通れない部分です。この二冊はとても助かりました。

[エンジニアが学ぶ生産管理システムの「知識」と「技術」](http://www.amazon.co.jp/exec/obidos/ASIN/4798162671/jinkakushouga-22/)

[エンジニアが学ぶ物流システムの「知識」と「技術」](http://www.amazon.co.jp/exec/obidos/ASIN/4798155446/jinkakushouga-22/)

上記二冊と同じ著者。この人の本はいいですね。回し者では無いですが、ご本人がシステム導入の経験が豊富とのことでシステム屋が知りたいこと、システム屋の視点から来た現場、というものが見えてきます。とてもよいです。

[需要予測の基礎](http://www.amazon.co.jp/exec/obidos/ASIN/4534055617/jinkakushouga-22/)
AIなんて言葉で機械学習を名指されるときは大抵ついてくる「予測」というキーワード。
この本の著者は「需要予測は属人的な仕事である」と言い切ってます。つまりは自動化は無理で、それは世に言われるAIには(まだ)無理と言っているのでしょう。著者の信念が端々に散りばめられている力作です。かなり研究者肌の方なんでしょうね、かなりの知識量が伝わってきます。
書かれている内容は移動平均法から始まって、非常に基本的且つ手堅い方法と実務の上で留意すべき点などの説明。全体としてとても硬派です。時系列解析周りの言葉やその他のテクニカルタームが何の説明も無く出てくるのである程度予備知識がないと理解出来ないところが出てくるかも知れません。

[データサイエンスの基礎 (データサイエンス入門シリーズ)](http://www.amazon.co.jp/exec/obidos/ASIN/4065170001/jinkakushouga-22/)
業務知識とかとは関係無いですが､この本地味に良かったです。統計やEDAや、その他テクニック的なことは色々勉強しましたが、やはり根底のところを押さえた教科書的な本ってやっぱり重要なんだなぁと思いました。
「そもそもデータサイエンスとは？」的ところって意外としっかり書いた本って少ないんですよね。

#2.終わりに

以上、業務知識を身につけるための知識を得るために読んだ本でした。

お陰様で今は会社のデータを大分読み解けるようになり、試しに商品データをクラスタリングし、それらの売り上げランキングとどういう関係にあるかという分析をしてやってみたりできました(たったこれだけのことなのにデータの探し方すらわからず苦労してましたw)。これからも実データで試していきたいです。

業務アプリ、ERP導入などに身を置いてこなかった(僕みたいな)エンジニアも割と多いと思います。そういう人は､出来れば早い段階で、2,3ヶ月ぐらい投資してこの手知識を身につけておくことはとてもいいことだと思います。世間の流れは早いしビジネスの変化も早いとのことですが、それでもこの手の話しが根底から変わることはこの記事に目を通して下さる方が少なくとも現役でいる間に通用しなくなるほどに変わることは無いと思います。
それに例え業務でこれらの知識を使うことが無かったとしても世間で飛び交っている話題を理解出来るし、マーケティングの話しなどは読み物としても面白い。
かなり費用対効果の良い勉強だと思います。
M1 Mac でXQuartz(Xwindow)の設定方法

#はじめに
Dockerから，windowをXで下ろしてきたかったのですが，少し設定に手こずりました．
M1(Arm)だから出来なかった訳ではないと思いますが，
XQuartzの設定を忘れてしまったので，設定方法を備忘録として残します．

#インストール

```
brew install xquartz
```

#権限の設定

```
$ sudo su
```

(rootになる必要はないかもしれません)

```
$ xhost +
```

#動かないいくつかの原因

以下の記事に記載されている.

https://qiita.com/kawaz/items/6cf04f923ebfac45a997#%E6%B3%A8%E6%84%8F%E7%82%B9

私は，上記の記事の通り，".Xauthority"を消去しました．

```
$ ls -ld ~/.Xauthority*
-rw-------  1 yasu  staff  400 Jun 23 13:45 /Users/yasu/.Xauthority
```

```
$ rm -rf ~/.Xauthority
```

そして，消去後にXQuartzを再起動したら，以下のようにちゃんとディレクトリができていました．
再起動は必須です．

```
$ ls -ld ~/.Xauthority*
drwxr-xr-x   2 yasu  staff     64 Jun 23 13:57 .Xauthority/
```

#テスト実行

```
$ docker run --rm \
    -e DISPLAY=$(hostname):0 \
    -v ~/.Xauthority:/root/.Xauthority \
    test
```

かわいい目が追っかけてくれたら成功です．
M1 MacでTensorFlow(Keras),OpenCVを動かすようにする(Miniforge)

#はじめに

M1を搭載したMacbook Airを導入して2ヶ月くらいが経ちました．
日頃はローカルで開発は，ほぼしないのですが，
Macのカメラを使って，OpenCVやTensorFlowを動かさないといけなくなったので，
環境構築してみました．

しかし，M1(Arm)だけあって，環境構築にかなり苦労したので，
備忘録として残しておきます．
（2021年7月8日現在）

##どうしても動かしたいもの
・OpenCV
・Keras(TensorFlowに付随するKeras)

基本的には，OpenCVでカスケードファイルを用いて，Face Detectionと
VGG16を用いたPredictionを動けば合格です．

一応，M1 Macでいろいろ環境構築を試したので，メモしておきます．
（動かなかったことを詳しくメモしても...と思ったので大雑把です．）

####試したこと
- Docker + pyenv
    - Armモードでビルド(なんか動かない)
    - AMDモードでビルド（なんか動かない+すごく重い)  
    （```pyenv --help```のコマンドですら，重い）

- Anaconda(Homebrewで入れてRossetaで起動)
動かない：```Illegal hardware instruction python```やgccがないやら，いろんなエラーに巻き込まれました．

⭐️ Miniforge(参考記事:https://kazumaxneo.hatenablog.com/entry/2021/05/07/073418)
Anacondaより小容量かつArm(M1)にネイティブ対応しているので，
高速かつ安定的に動かせるのでは...と思い，brewでインストールしました．
結果的には，うまくいきました．
（以下の方法は，[Appleの公式](https://developer.apple.com/metal/tensorflow-plugin/)に書いてあります．）

##①まず，brewでminiforgeを入れます．
(参考：[シェルスクリプトを使ってインストールする方法](https://tech-diary.net/install-python-on-m1-mac/))

```
brew install miniforge
```

##②仮想環境を作り，activateします．
・ターミナル等の再起動をして，プロンプトに(base)と出てきていることを確認してください．M1 Macに対応した
・TensorFlowはPython 3.8だと，うまく動きました．

```
conda create -n python38 python=3.8
conda activate python38
```

##③TensorFlowとOpenCVをインストール
<font color="red">!</font> ②で仮想環境の中に入ってることを確認してください．<font color="red">!</font>

```
conda install -c apple tensorflow-deps
python -m pip install tensorflow-macos
python -m pip install tensorflow-metal

conda install opencv
```

##さいごに
以上で，環境構築は完了です．

[ベンチマークが出てました](https://ainow.ai/2021/03/02/252780/)が，
確かにIntelのMacよりも早いです．

余談ですが，VGG16などでPredictionをしている時に，GPUのリソースを確認したところ，フルで使ってくれていました！
（```リースモニター```->```ウィンドウ```(メニューバー)->```GPUの履歴```）

参考になれば幸いです．

##追記（2021/10/5）
```python -m pip install tensorflow-macos```のインストールができない事象があるみたいなので，一度成功しているenvironment.ymlを公開します．

https://gist.github.com/yasu-kun/30b57b85e8116c8bfff545f706a60b9a
このymlファイルを用いて，仮想環境を作成することができます．

```
conda env create --file=environment.yml --name m1_mac_tensorflow
```
【Vue.js】遅延ローディングとvue-cli3のprefetchの仕組み

## はじめに
仕事で使う事になったので1からVue.jsについて学んだ。
ちゃんと覚えておかないとまずそうな事を備忘録として1つ1つ残しておく。

## 遅延ローディングとvue-cli3のprefetchの仕組み
### 遅延ローディング
SPAのパフォーマンスを向上させるために、あるコンポーネントが必要になった時にそれをロードするようにする事。

### 何で遅延ローディングの仕組みがあるか？
routerで定義しているコンポーネントが増えていき、実際には特定の操作をする時のみしか使わないコンポーネントも出てくる。
その時、デフォルトのvue-routerでは、SPAのコンポーネント全てをロードする仕組みになっており、折角ロードしてもそれを使わない事もあるという状況になる。
すると、パフォーマンスとして非効率な状態になる。。。
→（だったら）必要な時に、必要なコンポーネントだけをロードすればいい！という考え方

### 遅延ローディングの実装
遅延ローディングの実装はWebpackの機能を使って以下のように実装する。

```js:router.js
import Vue from "vue";
import Router from "vue-router";

// 普通のimport
// import Home from "./views/Home.vue";
// import Users from "./views/User.vue";
// import UserPosts from "./views/UsersPosts.vue";
// import UsersProfile from "./views/UsersProfile.vue";
// import HeaderHome from "./views/HeaderHome.vue";
// import HeaderUsers from "./views/HeaderUsers.vue";

// 遅延ローディングのimport
const Home = () => import(/* webpackChunkName: "Home" */ "./views/Home.vue");
const Users = () => import(/* webpackChunkName: "Users" */ "./views/User.vue");
const UserPosts = () => import(/* webpackChunkName: "UserPosts" */ "./views/UsersPosts.vue");
const UsersProfile = () => import(/* webpackChunkName: "UsersProfile" */ "./views/UsersProfile.vue");
const HeaderHome = () => import(/* webpackChunkName: "HeaderHome" */ "./views/HeaderHome.vue");
const HeaderUsers = () => import(/* webpackChunkName: "HeaderUsers" */ "./views/HeaderUsers.vue");
```

### vue-cli3を使っている時の遅延ローディングの特徴的な挙動
`vue-cli3`を使ている場合、`prefetch`という仕組みが自動的に機能するようになっている。

- `prefetch`<br>今後必要になるコンポーネントのリストを全てHTMLの`head`に`link`として定義し、ユーザ操作などがない時に裏で自動的にそれらのコンポーネントをロードする仕組み<br>裏で持ってきたコンポーネント(JavaScriptファイル)は`prefetch cache`に保持され、実際に必要になったらそのcacheから読み込むようになっている。

このprefetchが生まれた経緯としては、

- （元々SPAでは）ページ遷移時にコンポーネントなどのHTML・JavaScriptなどを取得する必要がないので高速に動く
- が、遅延ローディングをすると、ページ遷移時にコンポーネントをロードするのでその分遅くなってしまう
- かといって最初に全部持ってくるわけにもいかない・・・
- それならば、今後必要になるコンポーネントを暇な時に自動的に持ってきて、それをキャッシュしておけばいい

という感じ。

どのような挙動になるか、実際に見てみると以下の動画の通りで、`prefetch cache`となっているのがcacheから持ってきている部分。
![ezgif.com-gif-maker (34).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/1fbf5406-75df-ab63-fdc8-0c20383c558a.gif)
※今回は"/"にアクセスした後、コンピュータ上は暇と見なせる時間があり、その時に全てのJSファイルがロードされているのでNetworkで全部JSファイルがロードされているのが表示されている。

動画のソースコード全体は以下。

https://github.com/yuta-katayama-23/intro-vuecli/commit/5ea78dcd67bc78357545de00653711154f69ec93

## Vue.jsの勉強メモ一覧記事へのリンク
Vue.jsについて勉強した際に書いた勉強メモ記事のリンクを集約した記事。

https://qiita.com/yuta-katayama-23/items/dabefb59d16a83f1a1d4
「一から始める数学⑩＞余弦定理」を参考にSymPyでやってみた。

(オリジナルポスト)

https://qiita.com/tkmktdm/items/51b98c8178f320293ac0



# Pycharmで（加法定理の証明？)
半径1の円に点A（cosα、sinα）、点B（cosβ、sinβ）
A,B二点間の距離は.....

コーディングしていて、「鶏が先か、卵が先か」のような気もします。

```python
from sympy import *
var('α β')
var('b c A x')
var('ca sa cb sb')
myLAB=(cos(α)-cos(β))**2+(sin(α)-sin(β))**2
myLYO=(b**2+c**2-2*b*c*cos(α-β)).subs({b:1,c:1})
print("#myLAB=",myLAB)
print("#myLYO=",myLYO)
myGosa=expand(myLAB-myLYO)
myGosa=myGosa.subs({sin(α)**2+cos(α)**2:1,sin(β)**2 + cos(β)**2:1})
myGosa=myGosa.subs({cos(α):ca,sin(α):sa,cos(β):cb,sin(β):sb})
myGosa=solve(myGosa,cos(α-β))[0]
myGosa=myGosa.subs({ca:cos(α),sa:sin(α),cb:cos(β),sb:sin(β)})
print("#cos(α-β)=",myGosa)
#myLAB= (sin(α) - sin(β))**2 + (cos(α) - cos(β))**2
#myLYO= 2 - 2*cos(α - β)
#cos(α-β)= sin(α)*sin(β) + cos(α)*cos(β)
```


# Pycharmで(加法定理です。) 

```python
from sympy import *
var('α β')
myAB=expand_trig(cos(α-β))
print("#",myAB)
print("#",trigsimp(myAB))
# sin(α)*sin(β) + cos(α)*cos(β)
# cos(α - β)
```

#SymPy Liveで エラーがでます。
```
    myAB=expand_trig(cos(α-β))
                         ^
SyntaxError: invalid syntax
```

#SymPy Liveで(英小文字にしました。)
以下のソースコードを貼り付けて、Evaluateです。

https://live.sympy.org/

```python
from sympy import *
var('a b')
myAB=expand_trig(cos(a-b))
print("#",myAB)
print("#",trigsimp(myAB))
# ('#', sin(a)*sin(b) + cos(a)*cos(b))
# ('#', cos(a - b))
```

# 参考

https://manabitimes.jp/math/1021


＞東大でも出題された

https://mathexamtest.web.fc2.com/1999/199910261/1999102610100mj.html

http://server-test.net/math/php.php?name=tokyo&v1=0&v2=1999&v3=1&v4=1&y=1999&n=1



https://qiita.com/mrrclb48z/items/cf5fc264e2be3346f93a
DjangoでMAMPのMySQLへ接続

#はじめに
Djangoのデータベースを標準のsqliteから、MAMPのMySQLへ変更する手順を記載します。

##1.データベースの作成
ターミナルで以下コマンドを実行し、binディレクトリへ移動

```
cd /Applications/MAMP/Library/bin/
```

MySQLのサーバーを起動し、データベースへ接続
※パスワードは初期設定の場合、 root

```
mysql.server restart
./mysql -u root -p
```


データベースを作成（今回、データベース名はtest)
作成がされているか確認。

```
mysql> create database test;
Query OK, 1 row affected (0.06 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| sys                |
+--------------------+

```

##2.作成したアプリ(Django)で`pymysql`をインストール

```
$ pip install pymysql
```

##3.`manage.py`の修正

```manage.py
import pymysql

pymysql.install_as_MySQLdb()
```

##4.settings.pyの修正
```settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test', #作成したDB名
        'USER': 'root', #ユーザ名
        'PASSWORD': ,#パスワード
        'HOST': '/Applications/MAMP/tmp/mysql/mysql.sock',
        'PORT': '8889'  # MAMPのため,
    }
}
```

##5.マイグレーションを実行
python manage.py migrate　でマイグレーションを実行し、データベースにテーブルを追加

```
$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, api, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying api.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK

```

##6.テーブルの確認
無事に作成できていることを確認

```
mysql> use test;
Database changed
mysql> show tables;
+----------------------------+
| Tables_in_test             |
+----------------------------+
| api_category               |
| api_profile                |
| api_task                   |
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
```
【Parcel】型定義だけほしいときの対処法

# 環境

```bash
$ npx parcel --version
1.12.5
$ npx tsc --version
Version 4.3.5
```

# 事象

TypeScriptを使ってちょっとしたツールを書いていた。
始めは`tsc`を使ってコンパイルを行なっていたのだが、出力を１つにまとめたいと思い[`parcel`](https://github.com/parcel-bundler/parcel)を用いてバンドルを行なった。  
parcelはtsconfig.jsonを見てTypeScriptからのコンパイルからバンドリングまでよしなにやってくれる便利なツールであるが、型定義の出力はサポートしてくれないようである[^1]。
Issueに言われているようにparcelに[プラグイン](https://github.com/fathyb/parcel-plugin-typescript)をかませばできたようだが開発が止まっているようだ。

[^1]: [Why parcel doesn't make declaration .d.ts file ・ Issue #2321](https://github.com/parcel-bundler/parcel/issues/2321)

# 解決策

`parcel`によるビルドとは別に`tsc`を動かし型定義を得ることにした。


```json:package.json
	"scripts": {
		"build": "parcel build src/main.ts",
		"build:types": "tsc --declaration --emitDeclarationOnly --outdir './types'"
	},
```

`tsc`を使って型定義を出力するには`tsconfig.json`ファイルで`"declaration": true`とすればよい。

さらに`"emitDeclarationOnly": true`と指定すると、型定義のみを出力することができる[^2]。

[^2]: [TypeScript Documentation: Creating .d.ts Files from .js files](https://www.typescriptlang.org/docs/handbook/declaration-files/dts-from-js.html)

parcelは`tsconfig.json`を読んではいるが、これらのオプションに関しては無視するようである。だから`tsconfig.json`にこれらを書いてしまっても構わないのだが、それは少し気持ち悪い。
そこで、次のように`tsc`コマンドのオプション引数として指定してやることにした。  


```bash
npx tsc --declaration --emitDeclarationOnly

# --outDirオプションは本来生成物の出力先を指定するものだが、
# これらと組み合わせると、型定義のみを特定のディレクトリに保存するような使い方ができる
npx tsc --declaration --emitDeclarationOnly --outDir './types'
```

# 参考リンク

- [https://qiita.com/akameco/items/bf2a837af4a79834672d](https://qiita.com/akameco/items/bf2a837af4a79834672d)
- [https://github.com/parcel-bundler/parcel/issues/3162](https://github.com/parcel-bundler/parcel/issues/3162)
[Rails] renderで他のコントローラーのアクションを引っ張ってくる

##はじめに
Railsのコントローラーの話でして、例えばある入力フォームで送信した場合に、if文を使って登録を失敗したら、```render :new ```とかで再度そのページを表示させたりしますよね。

私の場合もし失敗したら、違うコントローラーのshowアクションを呼び出したくて苦戦していました。
なんとかうまくいったので記事に残しておきます。

##よく使うcreateアクションのコード
```ruby
  def create    
    @progress = Progress.new(progress_params)
    if @progress.save
      redirect_to students_textbook_path(@textbook)
    else
      render :new
    end
  end
```
これは今まで私がよく活用していたcreateアクションのコードです。

createアクションを実行する（送信ボタンを押す）直前のページはnewアクションでそれに対応しているnewのビューで、入力フォームとなっています。
なので、もし保存に失敗したら、```render :new```でnewアクションをルーティングを介さずに、実行するようにしています。

しかし今回は、newアクションは存在せず、違うコントローラーのshowアクションに対応したビューにフォームが存在しているので、違うコントローラーのshowアクションをrenderしたいのです。

##renderで違うコントローラを呼び出す
createアクションが記述されているのはprogressesコントローラーですが、renderで呼び出したいのはtextbooksコントローラのshowアクションです。

その場合下記のような記述で呼び出せます。

```ruby
  def create    
    @progress = Progress.new(progress_params)
    if @progress.save
      redirect_to students_textbook_path(@textbook)
    else
      render template: "students/textbooks/show"
    end
  end
```

私の場合、コントローラのフォルダの中にstudentsというフォルダも存在しているのでこのような記述になります。
**「renderでコントローラフォルダのstudents配下のtextbooksコントローラのshowアクションをtemplateとして使ってください。」**
ということです。

##注意点
もしそのshowアクションで呼び出したビューの中に、textbooksコントローラで定義されている変数がなければいいのですが、大体定義されていますよね。

なのでrenderの前にビューで必要な変数は定義してあげましょう。
私の場合↓

```ruby
  def create    
    @progress = Progress.new(progress_params)
    if @progress.save
      redirect_to students_textbook_path(@textbook)
    else
      @students_textbook = StudentsTextbook.where(student_id: current_student.id).find_by(textbook_id: @textbook.id)  
      @progress = Progress.new
      @progresses = Progress.where(students_textbook_id: @students_textbook.id).order('created_at DESC')
      render template: "students/textbooks/show"
    end
  end
```

完全に私が作成中のアプリから抜粋したものですのであまり細かいところ気にしないでください 笑
伝えたいことはビューで使う変数はこっちでもちゃんと定義してあげなければいけませんということです。

##最後に
自分で書いときながら、renderで違うコントローラのアクションをを引っ張ってくるとか、呼び出すとか、なんかちょっと表現が違う気がします。。。
どうでしょう？

すごい良いエラーが出た！と思ってとりあえずまとめてみただけなので、まだまだ理解が浅い分、間違った理解や表現をしているかもしれません。
もしご指摘ありましたら、お願いします。
CSSで背景画像を暗くするときは、擬似要素 ::beforeではなく、background-image:linear gradientを使ったほうが便利！

## background-image: linear gradient

CSSで背景画像を暗くするとき、ネット上では擬似要素 ::before を使って背景を暗くする実装をよく見かける。

```html
<div class="banner">
</div>
```
上記のようなHTMLがあった場合に、

```css
.banner {
  width: 100%;
  height: 100vh;
  background:url(img/background.png);
  background-size: cover;
  background-position: center;
  position: relative;
}

.banner::before{
  background-color: rgba(0,0,0,0.85);
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  content: ' ';
}
```

banner要素に背景画像を指定し、
擬似要素 ::before で透過した黒を上から重ねるようにする。
これがよくネットで見かける背景画像を暗くしてその上に文字を載せる実装である。

今回は、擬似要素を使わずに `background-image:linear gradient`
を使って、以下のような実装にしてみた

```css
.banner {
  width: 100%;
  height: 100vh;
  background-image: linear-gradient(rgba(0,0,0,0.85),rgba(0,0,0,0.85)),url(img/background.png);
  background-size: cover;
  background-position: center;
  position: relative;
}
```


擬似要素 ::berofeを使った場合の背景画像
![FireShot Capture 001 - Text Slide - 127.0.0.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109578/c41ff900-0adf-ff6b-5c78-cf137b3bec0b.png)
background-imageプロパティに linear-gradient を設定したとき
![FireShot Capture 002 - Text Slide - 127.0.0.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109578/d31eb617-4338-c6d1-e535-fa0149c1a71c.png)

透過率はともに 0.85とした。同じような画像が得られた。

## linear-gradientを使ったほうがよいメリット
文字を表示させるときに手間がかからない。

```html
<div class="banner">
    <h1> Example Test </h1>
</div>
```

というように背景画像に対して文字を表示した状況の場合。

擬似要素を使った場合、文字を表示させるには、
`position:absolute` を指定しなければいけない

```css
.banner h1{
  color: #fff;
  position: absolute;
}
```

ただ、擬似要素を使っていない時は

```css
.banner h1{
  color: #fff;
}
```

positionプロパティを設定しなくても構わないのでソースコードを削減できる。

### 感想

[MDN](https://developer.mozilla.org/ja/docs/Web/CSS/background-image) でもbackground-imageに linear-gradientを
使う実装が紹介されていたので、もっとMDNを読み込むべき。

<br>
<br>
each_consの使い方

# each_consとは
##　使い方
```
each_cons(n) -> Enumerator
each_cons(n) {|list| ... } -> nil
```

要素を重複ありで n 要素ずつに区切り、ブロックに渡して繰り返します。
ブロックを省略した場合は重複ありで n 要素ずつ繰り返す Enumerator を返します。

```
(1..10).each_cons(3){|v| p v }
# => [1, 2, 3]
#    [2, 3, 4]
#    [3, 4, 5]
#    [4, 5, 6]
#    [5, 6, 7]
#    [6, 7, 8]
#    [7, 8, 9]
#    [8, 9, 10]
```
クロージャーをざっくり理解するための記事

クロージャーってよく聞くけどなに？
--
定数、変数をスコープ内に閉じ込めるためのデータ構造のことをクロージャーという。（名前のない関数）


なんのためにあるの
---
通常であればfuncを使って定義するが、クロージャー式でも定義できる。（関数を使わずにインスタンス化できる）のでコードを簡略化することをメインに使用されうる。
何度も使わない関数はクロージャーで使ったほうがよい。
要は、名前が不要で型推論も充実しているから簡略化にめっちゃなるよね！！というもの

書き方
--

```swift:closure.swift
//基本の形
{ (引数名:引数の型) -> 戻り値の型 in
    // 処理の実行
}
//具体例

let closure = { () ->Void in print("クロージャー")}
//省略形
let closure２ = { () ->　　（）　in print("クロージャー")}
//引数指定
let closure3 :((Int,Int)->Int)
closure3 = { (num1: Int,num2:Int)->Int in return num1 + num2 }


```
戻り値しかない場合は暗黙的な```return```になる。
また、クロージャーの場合は省略の仕方がたくさんできて簡略化できるが、初学者には理解しづらい部分がある

なのでクロージャーかな？ってなったら下記５つを検討してみると全体像が見えてくるはず。

①returnが省略されているかどうか（戻り値しかないと暗黙的に省略される）
②戻り値の型指定が省略されている。もしくは（）に置き換わっている。
③引数が一つの場合、カッコが省略されている可能性がある。（括弧を省略のパターン）
④引数を省略するパターン（　（）のみになる）
⑤引数と戻り値がない場合は```()-> () in```を省略して```{}```内だけで記述されている。

また、クロージャーの引数には利用可能なものとそうでないものがある。（ドキュメントより）
通常の関数の場合
外部機数名　○
デフォルト引数　○
inout引数　○
可変長引数　○
簡略引数名　✗

クロージャー式
外部機数名　✗
デフォルト引数　✗
inout引数　○
可変長引数　○
簡略引数名　○

＊外部機数名　関数を呼び出す際に引数に名前を必ず付ける方法。外部引数は関数を呼び出したときに使用され関数の中には入れない。まぁわかりやすく引数に名前をつけるみたいなイメージ
＊引数にデフォルトとしてデータを入れること
＊　参照渡しをするための予約語。引数に```(inout sansyo: String)```こんな感じで入れる。その後、呼び出す関数の引数に＆を入れて使用される
（関数内の処理が変数に影響を与える。副作用要注意）
＊```func 関数名（引数:型...)```の形でかく。引数をいくつでも受け取れるようにする関数の定義をしてくれる
＊引数に＄をつけたもの。＄（インデックス数）で指定するすることができる。可読性が下がるの長い処理をする関数には向いていない。


キャプチャや引数としてのクロージャー等まだまだ奥が深いっぽいので随時記事にしていきます！
macOS(BigSur)でUnity+iOSビルド時に「iOS framework addition failed due to a CocoaPods installation failure. This will will likel〜」


### 環境
MacOS Big Sur(v11.4)
xcode 12.4
Unity2019.2.12f1


### 事象

UnityでiOSビルド時に下記エラーに遭遇。

```
iOS framework addition failed due to a CocoaPods installation failure. This will will likely result in an non-functional Xcode project.

After the failure, "pod repo update" was executed and succeeded. "pod install" was then attempted again, and still failed. This may be due to a broken CocoaPods installation. See: https://guides.cocoapods.org/using/troubleshooting.html for potential solutions.

pod install output:

Analyzing dependencies
[!] CocoaPods could not find compatible versions for pod "FirebaseCore":
  In Podfile:
    Firebase/Analytics (= 6.24.0) was resolved to 6.24.0, which depends on
      Firebase/Core (= 6.24.0) was resolved to 6.24.0, which depends on
        Firebase/CoreOnly (= 6.24.0) was resolved to 6.24.0, which depends on
          FirebaseCore (= 6.7.0)

```

あれ、CocoaPodsが動かなくなったかなと思ってみたら、
MacOSを先程 Catalinaから Big Surにアップデートしたタイミングで、
CocoaPodsが動かなくなっていました。

## 改善した方法

CocoaPodsのインストールや、インストールし直しはここが大変参考になりました。🙇
https://qiita.com/noprops/items/f997a438fabb64c15f10

次に、
で、MacOSアップグレードしたばかりだと、Unityで実行ボタンおすとこのようなエラーがでる場合は、
事前に許可しておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/a6a0f8b1-322d-d72c-9743-dd48c89d9875.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/9049005c-1950-fc10-4681-b9702723f3b5.png)

その後、iOSビルドしたら、無事エラーはなくっていました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37406/170911dd-fd21-ea08-9063-66c8f856e79d.png)
Power AutomateでTeamsの特定のスレッドに定期リマインダーを送る

サブ業務チームのスクラムマスターのススメでデイリーレトロスペクティブはじめました。
同期的に集まらずMiroのボードに各自Keep&Problemを書き出すようにしているんですが、
忘れそうな自分とリマインド楽にしたいスクラムマスターに天啓💡が来たのでやってみた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89911/a07d3459-009f-edb0-3a7a-fbd59e59fa6d.png)

## 作成

Office365のアプリからPower Automateを選択してPower Automateの画面に移る。
左のタブに「作成」というのがあるので、そこをクリックして「スケジュール済みクラウドフロー」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89911/d5cc14ee-b130-bf2c-898b-1d68fd8342c9.png)

そうすると、フロー名と定期スケジューリングが出てくるので設定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89911/cccfc000-943d-ee96-0e81-fa9a88663c71.png)

先程設定したRecurrence（スケジューラー）が表示されているのでそれに対して、新しいアクションを追加。
Teamsを選択して色々出来るアクションを眺めてみる。色々できそうだな～。
毎回新しい投稿は嫌で、1チャンネル内の1スレッドに限定したかったので「返信」で検索して出てきた、
「メッセージへの返信の投稿」をアクションとして追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89911/45145299-50b4-a3d2-95dc-da01999fd63e.png)

チームやチャネルはプルダウンから選べるので簡単なんですが、メッセージIDは出てこなかった……
ので調べてみたところ、Teams上でリンクをコピーし、`parentMessageId`という部分があるのでここをコピー。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89911/a88b5a3e-25a5-b534-cc1c-d30018a6f54e.png)

```
https://teams.microsoft.com/l/message/19:569d476a0cc2413XXXXXXXXXXXXXXXXX@thread.skype/1625719198403?tenantId=XXXXXXXX-XXXX-459a-XXXX-53598c4aa511&groupId=83dc7fff-XXXX-XXXX-XXXX-534b5a425d13&parentMessageId=99999999999&teamName=DT%E6%9C%AC%E9%83%A8&channelName=81-%E5%A7%94%E5%93%A1%E4%BC%9A-%E9%83%A8%E4%BC%9A&createdTime=1625719198403
```

そこで得たparentMessageIdをメッセージのとこに設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89911/834091ea-bd10-4593-effb-693388ceabde.png)

できた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89911/53edcd55-29bb-7eb1-ed47-d46b5b87da6a.png)

ちなみに特定のグループをタグでメンション出来るようにTeams側で設定してるんですが、
2021年7月時点だとタグのメンションをPower Automateから飛ばす方法は見つかりませんでした……
2021年4月の情報ですがフォーラムでも機能無いよってなってたので要望として出すしかなさそう。

[Is there a way to use the @ mention with a TAG in teams adaptative card via power automate?](
https://powerusers.microsoft.com/t5/Building-Flows/Is-there-a-way-to-use-the-mention-with-a-TAG-in-teams-adaptative/m-p/531696#M68615)

## 感想

Power Automate初めて使いましたがめっちゃ簡単で感動しました。
似たツールで言えばZapierの方が多くのWebアプリと連携はできそうだけど、
O365契約しててO365アプリ周りで色々やりたいなら手軽さは最強かも？
これは使いこなせるようになりたい……社内で勉強会やってくれてるので参加しようと思いました。
ArduinoUNOとMCP9701で温度を128x32 OLEDに出力 (Arduino)


x MCP9701-E/TO 販売コード 103199

x あまり正確では、ない
x たまにOLEDのリセットに失敗する　全体の電源を数回入れ直す
x U8glibとU8g2があるから各自、確認の事

目的
秋月で売っている安価なMCP9701(約25円)を使って温度を出力する。

構成
MCP9701-E/TO I-03199
AL12832AWWB-H-U02 P-14686

説明
説明すると長くなるので「めんどい」ので各自勝手に調べて
ヒント　MCP9701 AL12832AWWB
配線は、間違っているかもしれないので各自データシートで確認して
ヒント　リセットは、10kΩ介して3.3V

![i2c_oled_9701_uno_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fe08a735-e09c-e612-d33a-670e69dda72d.jpeg)

![i2c_oled_9701_uno_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a72ce215-88f0-aa3d-97b3-5f5716621b93.jpeg)




ArduinoUNOと温度センサーMCP9701で温度をシリアル出力 (Arduino)

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

ARDUINO UNOとOLED、AL12832AWWB-H-U02でHello Worldを表示(U8g2lib)

https://qiita.com/caa45040/items/84b29799a6a23ee77768







```c++

#include <Arduino.h>
#include <U8x8lib.h>

//#ifdef U8X8_HAVE_HW_SPI
//#include <SPI.h>
//#endif

U8X8_SSD1306_128X32_UNIVISION_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);   // Adafruit ESP8266/32u4/ARM Boards + FeatherWing OLED

int     cursor1;      //カーソルの位置
char    data_read[8]; //i2cバッファー

void i2c_oled_w(char *s)
{
            //文字の表示
            u8x8.drawString(
            ((cursor1-0) & 0x07  )*2, // x
            (cursor1>>3)*2,           // y
            s);
            
            while(s[0] != 0) {
              s++;
              cursor1++;
            }
            
            //cursor1=cursor1 + 3; 
} //i2c_oled_w

//初期化
void setup(void) {

  delay(2000); //oledのリセット時間

  u8x8.begin();

  u8x8.setFont(u8x8_font_px437wyse700a_2x2_r);

  //スタートロゴ
  cursor1 = 0;
  i2c_oled_w("START");
  delay(500);

  //画面の初期化
  u8x8.drawString( 0,0,"        ");
  u8x8.drawString( 0,2,"        ");
  cursor1 = 0;

} //setup

int s;                //ADCの値
int n0;               //温度　小数点以上
int nt[] = {0,2,5,7}; //温度

void loop(void) {

//  //画面の初期化
//  u8x8.drawString( 0,0,"        ");
//  u8x8.drawString( 0,2,"        ");
  //カーソルのクリア
  cursor1 = 0;

  //センサーの値を読み込む
  s = analogRead(A0); // UNO

  //s = (40<<2)+2; //debug

  //小数点以上と小数点以下を分ける
  n0  = (s >> 2) - 20;   // 小数点以上
  s   = nt[s & 0x3];     // 小数点以下

  //n0=20; //debug
  //s = 3; //debug
  
  //画面に表示
  i2c_oled_w("TMP=");
  data_read[0] = '0' + n0/10;;
  data_read[1] = '0' + (  n0-(  (n0/10)  *10)  );
  data_read[2] = '.';
  data_read[3] = '0' + s;
  data_read[4] = 0; 
  i2c_oled_w(data_read);

  //1秒待つ
  delay(1000);
} //loop



```
ベトナムにおけるオフショア開発サービス＆カオピーズ

日本では、コロナ過で緊急事態宣言が発出されてから、身の回りの生活様式が激変してきました。テレワークの拡大、巣ごもり需要などで、従来にも増して業務のデジタル化が進み、デジタル技術を活用した新業態もたくさん出現しています。

ただし、デジタル技術の活用拡大の一方で、デジタル化を支える日本人のITエンジニアの不足はますます深刻になっています。そこで、最近、システム開発を検討している日本企業はよく「[**オフショア開発**](https://kaopiz.com/ja-news-what-is-offshore-development/)」という言葉は耳にするでしょう。オフショア開発チームは海外にありますが、テクノロジーのおかげで、彼らはリモートで仮想的に作業し、コスト削減で製品を構築するのを支援することができます。

オフショア開発の始まりは、人件費が安くITに強い人材が多いインドに開発業務を委託したのが始まりです。そのほか、同じく人件費が日本よりも安く、関わりの多い中国もオフショア開発のポピュラーな委託先でした。しかし、現在は人件費の高騰から、インドや中国よりも人件費の安い東南アジアの国が注目を集めています。 特に、コロナ過の影響で、2021年からオフショア開発ではもっとコスト削減という**[最新動向](https://kaopiz.com/ja-news-offshore-development-trends-2021/)**があります。オフショア開発の委託先として人気なのが、ベトナムです。**[ベトナムはほかの東南アジアの国にはない魅力があり、その魅力が委託先としての人気を集めている](https://kaopiz.com/ja-news-why-vietnam-for-offshore-development/)**のです。

弊社、株式会社カオピーズは東京とベトナム・ハノイに拠点を持つオフショア開発サービスを提供している会社です。2014年に設立され、現在の従業員は約240人で、ほとんどがベトナムにおける一流のITに関する大学の卒業生です。弊社の特徴をまとめますと**「コスト」「スピード」「品質」を成し遂げるシステム開発サービス**です。

**[カオピーズ](https://kaopiz.com/)**は最新技術を駆使してコストとスピードを両立させながら、ウェブ、アプリ、業務基幹システム、ゲームなどの高品質なシステムを開発しております。今まで、80社を超える企業様とお取引させていただき開発実績は300件以上ございます。

オフショア開発を通してベトナムの優秀なIT人材を確保できることもオフショア開発のメリットです。ベトナムは国を挙げて優秀なIT人材を生み出す政策をとっています。理系大学出身者や学生を中心に、ITエンジニアとしての就職をサポートしています。

**[カオピーズが強い3つの理由](https://kaopiz.com/ja-news-offshore-kaihatsu-success-at-kaopiz-2020/)**は次のようにご紹介します：
１．世界クラスの技術力
２．対応領域の制限なし
３．しっかりとした品質・情報セキュリティの管理

カオピーズは、ベトナム ハノイと東京に開発拠点を置き、日本企業様向けにオフショア開発、**[AI・画像認識エンジン開発](https://kaopiz.com/ja-ai-image-recognition/)**、**[AWS導入支援](https://kaopiz.com/ja-news-kaopiz-aws-consulting-partner-2021/)**を中心としたサービスを提供し、お客様の**[DX推進](https://kaopiz.com/ja-news-about-digital-transformation-promotion-2021/)**をサポートしています。オフショア開発にご興味をお持ちの方は、ぜひカオピーズにご相談くださいませ。カオピーズは、豊富なアプリ開発の実績があり、ベトナムで開発業務を行うことで、コストを抑えながら柔軟にあなたのアイディアを実現します。
週刊Transformer（画像認識向け）5号

凄まじい勢いで増殖中のTransformer論文＋αにとりあえず、目を通しつつコメントを残していく。内容があっている保証はない。

[Global Filter Networks for Image Classification](https://arxiv.org/pdf/2107.00645.pdf)
精華大学論文。ViTのAttentionをFFTでfrequency domainでやる。ViTやMLP-mixerに比べて効率的。

[Rethinking Token-Mixing MLP for MLP-based Vision Backbone](https://arxiv.org/pdf/2106.14882v1.pdf)
百度論文。spatial invariantなToken mixingを考えた。FFTを使う。

[AutoFormer: Searching Transformers for Visual Recognition](https://arxiv.org/pdf/2107.00651.pdf)
ViT向け、One-ShotのNASで圧縮。

[The Lottery Tickets Hypothesis for Supervised and Self-supervised Pre-training in Computer Vision Models](https://arxiv.org/pdf/2012.06908.pdf)
いろんなタスク向けのsimCLRとMoCoが作ったpre-trained modelsに対してもくじ引きモデルは使える。

[Efficient Vision Transformers via Fine-Grained Manifold Distillation](https://arxiv.org/pdf/2107.01378.pdf)
ViTのDistillationをイメージレベルじゃなくて、パッチレベルでやって小さくする。

[VISION XFORMERS: EFFICIENT ATTENTION FOR IMAGE CLASSIFICATION](https://arxiv.org/pdf/2107.02239.pdf)
NLPでTransformerを速くしたいろんな手法をViTに導入して速くした。

---

[Augmented Shortcuts for Vision Transformers](https://arxiv.org/pdf/2106.15941.pdf)
ViTにaugmented shortcutsというのを入れてfeature collapseを止めてSOTA。

[Focal Self-attention for Local-Global Interactions in Vision Transformers](https://arxiv.org/pdf/2107.00641.pdf)
ViTで、近くは細かく見て、遠くはざっくり見ることにしてSOTA。

[CSWin Transformer: A General Vision Transformer Backbone with Cross-Shaped Windows](https://arxiv.org/pdf/2107.00652.pdf)
ViTで、縦方向と横方向のウィンドウを並列で見ることでSOTA。

[GLiT: Neural Architecture Search for Global and Local Image Transformer](https://arxiv.org/pdf/2107.02960.pdf)
ViT用のNAS。

[Learned Token Pruning for Transformers](https://arxiv.org/pdf/2107.00910.pdf)
NLP向け。Attentionのスコアが低いTokenをPruningする手法。

[What Makes for Hierarchical Vision Transformer?](https://arxiv.org/pdf/2107.02174.pdf)
ViTからの[Swin transformer](https://arxiv.org/abs/2103.14030)のMHSAブロックを交換。
[SAA資格勉強]１発目不合格でも2回目で合格するまで

#はじめに
エンジニア1年目のSuYuです。

今月（2021年7月）にAWS認定ソリューションアーキテクト-アソシエイト-(SAA-C02)に__743点__で合格しました。

そこで合格までにやったことを書いていこうと思います。

##受けたときの私の現状
・AWSの業務経験はなし
・Lambda
・DynamoDB
・APIGateway
・S3
・EC2などを研修で触った程度
・IT業界へ転職して7か月
・プログラミングを始めて1年2か月
・勉強期間：4か月

##一度不合格になった
勉強を始めて３か月で受けましたが、680点で不合格でした。（合格点：720点以上）

そこから2か月再度勉強して、合格することができました。

#使った教材
__・Udemy__
[これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）](https://www.udemy.com/course/aws-associate/)
[【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)
[AWS認定ソリューションアーキテクト アソシエイト試験：短期突破講座（300問の演習問題）](https://www.udemy.com/course/aws-uoyc/)

__・その他__
[aws WEB問題集で学習しよう](https://aws.koiwaclub.com/)

##使った感想
Udemyの教材は３つ購入してやりました。

__１．これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）__

こちらは、AWS機能の基本的な解説やハンズオンによる操作確認、模擬試験などあり、最初から勉強するにはとても助かる教材になります。

__２．【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）__

この模擬試験問題集は6回分あります。

6回分ありますが、2～6回目のテストはとても難易度が高いです。

正直50％も取れてない状態で合格しました。

こういう難しい問題もあるんだなと思ってもらえれば良いと思います。

__３．AWS認定ソリューションアーキテクト アソシエイト試験：短期突破講座（300問の演習問題）__

この短期突破講座は、演習問題を解くために購入しました。

上記の「これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）」をギュッと短縮したようなものです。

AWSの経験者やインフラの構築等に自身のある方はこれだけでも良いかもしれません。

__４．aws WEB問題集で学習しよう__

この問題集はとてもよかったと思います。

不合格になってからこちらで問題を何回も解き、合格することができました。

7問ずつの構成になっているので、解いてからすぐに解説を見て理解することができます。

私は3周ほどやりました。

#意識したこと
ソリューションアーキテクトを受験する中で意識したことは、


__1.問題文で何が求められているのか汲み取る__

__2.問題で操作できるものは、コンソール画面でやってみる。__

__3.何回も問題を解く。__

の3つです。

##1.何が求められているか汲み取る
これは当たり前のことだと思います。しかしAWS試験の解答文で、実際にはあり得るが、条件に適さないものなどがあり、どっちを選べばよいのか迷うときがあります。

その際は問題文をよく読み、どういう条件なのかしっかり把握した上で解くことが肝心だと思いました。

##2.問題で操作できるものは、コンソール画面でやってみる。
これは2回目の試験勉強の際に心掛けました。

なぜやった方が良いかというと、やってみると記憶の定着が違うからです。

例えば、問題を解いていく中で「S3にこんな機能あるっけ？」なんてこともあります。

実際操作して覚えると、これはできる、できないが結構判別できます。

コンソール画面を写真のようにインプットしているので、どんな機能があったのかわかるときがあるので、やってみた方が良いです。

##3.何回も問題を解く。
これは資格試験で当然だと思います。

とにかく問題に慣れましょう！

#テスト本番
私はピアソンVUEで受験しました。

##持ち物
・受験票（メール）
・身分証明書を2点（私は免許証とクレジットカード）

受験票は万が一と思い持っていきました。（いらなかったかも。。。）

また会場には余裕を持って15分前につきましょう！

##テスト後

合格判定は、テスト終了後にすぐ確認できます。

点数などの詳細は12時間後くらいに出てきます。

また合格特典として次回のAWS認定テスト50％割引や模擬試験の無料券やAWS認定の合格者だけが買うことができるショップにアクセスできます。

#おわりに
ソリューションアーキテクト自体が、AWSの幅広く浅い知識を求めていると感じました。

可用性、耐久性、コスト最適化、負荷分散などソリューションアーキテクトにおいては基本的な箇所が問われます。

やってみて良かったのは、AWSの機能を覚えることができたことと、アーキテクチャを構成する際に気を付ける点などを理解することができたことです。

皆さんもAWSの資格にトライしてみてください。
デザイン備忘録

#はじめに
この記事は、自分が「なるほどデザイン」という本を読んで大事なところのみをまとめた備忘録です。ホームページ作成時などの手助けになれば幸いです。

#デザインの基礎
まず、デザインには決まった正解というものがなく、時と場合によっていいデザインの基準が異なります。
その基準というのは「どんな人に」「何を」「なぜ」「いつ、どこで」伝えたいのか等によって決まります。
例えば、同じ料理本でも「料理初心者が、朝食の作り方を、迷わないために、長く使ってもらいたい」本と、「料理好きな人が、朝食のバリエーションを、楽しんでもらう、月に複数回発行される」雑誌とではデザインの正解は大きく異なります。
では、それぞれの場合でどのようなデザインが求められるのかを考えてみましょう。
１つ目の条件でのデザインは、初心者に興味を持ってもらうために

* できるだけシンプルに
* 文字を少なく
* 完成写真を大きく
* 癖のない書体

ということを意識することで手にとってもらいやすくなります。

2つ目の条件では料理が好きな人に興味を持ってもらうために

* 説明は必要最低限に
* にぎやかな印象で
* 写真のメリハリを大切に
* 工夫を凝らした書体

などを意識すると良いです。
このように、デザインを作る際にいきなり始めるのではなく、どういった趣旨で作るのかと言うのを考えてから作ることで、より質の高いデザインができます。

#デザイン作成の流れ

では、実際にデザインを作る際にどのような手順で作っていけばよいのでしょうか。ここでは、一つの例を示します。デザイン作成の大まかな流れは以下の通りです。

* 図解とラフ
* 方向性の確認
* 骨格の作成
* キャラを立たせる
* 足し算引き算
* 微調整

それぞれ解説していきます。
###図解とラフ
この段階ではどのようなデザインにするのか、どういったパーツがあるのかというのを確認して、紙などに大まかなデザインを書きます。細かく作る必要はありません。

<img width="400" alt="捨てる_page-0001.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1524076/03a1ab67-4b83-487f-4baf-76882de25928.jpeg">

めちゃくちゃ適当だけどまあ、こんな感じ笑

###方向性の確認
この段階ではデザインの表現と構造の方向性を決めます。
例えば、「かっちり」よりも「にぎやか」にすると決めたら、

* 写真に動きを出す
* 色を多めに使ってカラフルに
* 切り抜き写真を活用してにぎやかに

などといったことを書き出します。
実際にいくつかラフも作ってみて方向性を決定します。

###骨格を作る

この段階では写真やテキストを実際に配置します。
全体のバランスなどを見ながら調整していきます。

###キャラを立たせる

ここではそれぞれの写真、テキストに適切な個性をもたせるように書体や字間、行間や配置を変更します。
注意しなければならないのは、あれこれ追加しすぎないことです。一つ一つの要素の意味を考え個性をもたせることで十分印象は変わります。

###足し算引き算
ここまでくればあと少しです。
デザインを眺めてみてなくても困らないところを引き算して、狙った印象を与えられていないと感じれば色をつけたり図形を加えたりして足し算します。
ここでも、楽しくなって足しすぎないように気をつけてください。

###微調整
最後に、微調整です。デザインの意図がちゃんと伝わるか最終チェックしましょう。

#ヒント

最後に、デザインを作成する際のヒントをお伝えします。
デザインが思いつかず、作業が進まないとき、作るデザインのテーマに沿った言葉を思いつく限り書き出して見ましょう。思いついた言葉に合うような写真や色、雰囲気や感覚などを並べていき、眺めることでイメージが湧きやすくなり、デザインを作りやすくなるはずです。

以上！

参考にした本

http://naruhodo-design.com/

この記事は自分がこの本を読んでためになった部分を抜き出しています。ほかにもこの本には様々なためになる知識が載っているため、デザイン初心者、中級者ともにおすすめできます。
ADFSサーバーでCSPヘッターの設定

#はじめに
Windows ServerのADFSサービスですが、セキュリティ攻撃のターゲットになることが多く、セキュリティを管理している部門から各種設定を追加するようにといった要求が来ることがあります。
ここでは、Contents-Security-Policy(CSP)ヘッタ(以下 CSPヘッタ)の設定方法を記載します。

#事前確認
実行前に、ADFSサーバーアクセスした際にCSPヘッタが設定されていないことを確認します。
ブラウザ（chromeなど）を開き、F12キーをクリック、ネットワークのタブを選択します。続いて、ADFSのURLを開きます。

https://<adfsのurl.com>/adfs/ls/IdpInitiatedSignon.aspx

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526427/3bd742ff-79bd-1fe0-d7d1-70907535cf7d.png)

Response Headers に 「Contents-Security-Policy」が無いことを確認します。

#設定
ADFSサーバー（複数台ある場合プライマリサーバー）にログインします。サーバー上で、PowerShellを管理者モードで起動します。
下記のコマンドを実行します。

```
Set-AdfsResponseHeaders -SetHeaderName "Content-Security-Policy" -SetHeaderValue "default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self';"
Set-AdfsResponseHeaders -EnableResponseHeaders $true
```

設定後下記コマンドで設定内容を確認できます。

```
PS C:\windows\system32> Get-AdfsResponseHeaders | fl

ResponseHeaders : {[X-Frame-Options, DENY], [Content-Security-Policy, default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self';]}
ResponseHeadersEnabled : True
```

#確認
設定が正しく反映しているか確認します。確認の項目と同様にブラウザ（chromeなど）を開き、F12キーをクリック、ネットワークのタブを選択します。続いて、ADFSのURLを開きます。

![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526427/58e3c205-662e-c445-c0c8-eaa1484a2549.png)

Response Headersに「Content-Security-Policy」が増えて設定が追加されていることを確認します。

##参考資料
[AD FS 2019 で HTTP セキュリティ応答ヘッダーをカスタマイズする][link-1]
[link-1]:https://docs.microsoft.com/ja-jp/windows-server/identity/ad-fs/operations/customize-http-security-headers-ad-fs
Railsで架空のCafeのHPを作ってみよう!【2日目】

#概要
基本Railsの記法に則り書いていきます！
１から全ての説明ではなく
その中であれ？どうやるの？と
疑問に思った点や実装に困った箇所を
ピックアップして紹介していきます♩

#設定と準備
・Rails
・HTML
・CSS
・Javascript(jQuery)

↑上記の言語とフレームワークを使い
架空(自分で考えたテキトーなもの)のCafeの
HPを作っていこうと思います！

#2日目の作業内容:round_pushpin:
・トップページのレイアウトとCSS

#2日目の躓いた箇所:zap:
z-indexで要素の順番を指定しようとしたが
うまく指定した順番になってくれない！

```index.html.erb

<body>

  <div class="a">
    <div class="b">sample</div>
  </div>

</body>

```

```index.css

.b {
  z-index: 1;
}

```

この状態で要素aより要素bを浮かせようと思っても全然できなかった。

#結論
z-indexは同じ階層の中でなければいけなかった。

```index.html.erb

<body>

  <div class="a">sample</div>

  <div class="b">sample</div>
  
</body>

```

```index.css
 
.b {
  z-index: 1;
}

```
このようにすることで
要素aよりも要素bの方が浮いて表示される。
Dynamixelモータ(Protocol2.0)のセットアップ

# はじめに
DynamixelモータをROSで動かすための準備としてIDの振り分けの仕方についてまとめました。
IDの振り分けをしないとモータを識別できないので必ず最初に行いましょう。

# 前提
通信プロトコルが2.0のDynamixelモータであること

# 準備
**用意するもの**

- 設定するDynamixelモータ
- 給電用ケーブル
- MicroUSB(MicroB-USB A)ケーブル
- PC
- 電源(12V)
- U2D2
- DXSharingBoard(RS485)
- Robot Cable-X4P（U2D2, Dynamixelモータに付属のケーブル）


|<img width="200" alt="U2D2.png (196.8 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2021/02/27/98977/9673328b-b746-40aa-ae52-4cfc71d2388c.png">|<img width="250" alt="DXSharingBoard.png (156.9 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2021/04/23/98977/2c724063-abc7-4841-b076-6b553b9446fa.png">|<img width="200" alt="Robot_Cable-X4P_240mm__82872.1464715557.webp (36.7 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2021/04/23/98977/0c23607e-8bdf-42c5-a5f5-88236b3d1de4.webp">|
|:--:|:--:|:--:|
|[U2D2](https://emanual.robotis.com/docs/en/parts/interface/u2d2/)|[DXSharingBoard(RS485)](https://www.besttechnology.co.jp/modules/onlineshop/index.php?fct=photo&p=196)|[Robot Cable-X4P](https://www.robotis.us/robot-cable-x4p-240mm-10pcs/)|



# インストール
DynamixelモータをGUIで操作できるDYNAMIXEL Wizardをインストールします。
[公式サイト](https://emanual.robotis.com/docs/en/software/dynamixel/dynamixel_wizard2/#software-installation)からOSに合うインストーラをダウンロードし、記載されている手順通りに進めます。
　
# セットアップ
インストールが完了したらDYNAMIXEL Wizardを使ってモータのセットアップをしていきます。
制御するにはモータ毎にIDを振り分ける必要があるので、そのやり方を見ていきましょう。
それでは、下の画像を参考に用意したものを配線してPCに接続し、電源を入れ、インストールしたDYNAMIXEL Wizardを起動しましょう。
※画像では複数のモータを接続していますが、セットアップの際に接続するモータは必ず一つにしてください

<img width="600" alt="dynamixel配線図.png (143.7 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2021/04/23/98977/5ab5905d-8765-4086-b01a-4c5e8e27194c.png">


　
## Scanの準備
接続したモータを検出するためにまずは左上のOptionsを選択
Scanのタブを選択し、上から順に

- Protocol2.0のみをチェック
- Select Allをチェック
- 57600 bpsをチェック（モータによっては異なる可能性あり）
<img width="500" alt="options.png (34.3 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2021/03/30/98977/1355cb8c-1f07-481b-a9c0-713868291b15.png">

画像のように選択したらOKを選択
ホーム画面に戻ったらScanを選択して検出を開始します。
左に接続したモータの型番が表示されればOK！
※検出ができない場合は電源の入れ忘れ、Optionsのbpsが合っていないなどの原因が考えられます。
　Ubuntu環境ならUSBのパーミッションの変更し忘れも考えられます。

## IDの振り分け
では、IDを振っていきましょう。
真ん中のAddress：7、 Item：IDの欄を選択します。
右下にIDを選択する欄が表示されるので指定する番号を選択し、SaveでIDの振り分けが完了します。画像のようになればOK！ 

<img width="1500" alt="IDの変更.png (156.6 kB)" src="https://img.esa.io/uploads/production/attachments/17340/2021/03/30/98977/e27f08f6-0276-46cc-8ae8-88ba1be651ad.png">

IDの振り分けが完了したモータはDisconnectで接続を解除し、電源をOFFにしてモータを切断しましょう。
以上がIDの振り分けでした。 :tada:

## セットアップのまとめ
まとめると

1. モータを接続
1. 電源ON
1. Scan開始
1. IDを振る
1. Disconnect
1. 電源OFF
1. モータを切断

となります。モータが複数ある場合は、一つずつ接続し、1～7を繰り返してIDを振りましょう。
mapメソッドの使い方

# mapメソッドとは
mapは、配列やハッシュの要素に対して１つずつ処理したいときに使います。

## mapメソッドの記述方法
```
オブジェクト.map { |変数|
  # 実行したい処理
}
```
配列やハッシュオブジェクトの要素が一つずつ取り出されて、変数に代入されていきます。

## ハッシュに対して使うときは注意
ハッシュに対してmapを使うと、その返り値はハッシュではなく配列になるので注意が必要です。また、map!メソッドはハッシュに対しては使用できません。

##　配列にmapを適用する
```
a1 = [100, 200, 300]
a2 = a1.map { |x| x * 2 }
p a2 # [200, 400, 600]
```
上記では結果を別の変数に入れてますが、結果さえ得られれば元のデータは必要ない場合もあります。そんなときは、map!を使えば新しく変数を用意する必要がありません。

```
a = [100, 200, 300]
p a.map! { |x| x * 2 } # [200, 400, 600]
```

## ハッシュにmapを適用する
配列だけでなくハッシュにもmapを適用することができます。

```
h = { "apple" => 100, "orange" => 200, "grape" => 300 }
p h.map { |key, value| [key, value * 2] } # [["apple", 200], ["orange", 400], ["apple", 600]]
```
上記で、戻り値が配列であることに注意してください。

また、to_hメソッドを利用することで戻り値の配列をハッシュに変換できます。

```
h = { "apple" => 100, "orange" => 200, "grape" => 300 }
p h.map { |key, value| [key, value * 2] }.to_h # {"apple"=>200, "orange"=>400, "grape"=>600}
```
ただし、to_h メソッドは Ruby 2.1 以降でしか使用できないので注意してください。

## mapの&とメソッドを使用した省略記法
```
オブジェクト.map(&:メソッド名)

a = ["APPLE", "ORANGE", "GRAPE"]
p a.map(&:downcase) # ["apple", "orange", "grape"]
```

# 参考にしたサイト
https://uxmilk.jp/21695
ndarrayでmatplotlibをしようと思ってどうでも良いところで躓いた記録

#初めに
　matplotlibはすごく便利です。numpyもすごく便利です。つまりpythonは便利ということです。以上です。

#プログラム
機械学習のデータとしてsin波を用意したため、それをとりあえず何となく可視化しようとしたのが以下のプログラムです。

```python
import numpy as np
import matplotlib.pyplot as plt
# -4.0 ~ 4.0
xs = np.arange(-400,400)*0.01
# shuffle
np.random.shuffle(xs)
splitPoint = int(len(xs)*0.9)
# training and test inputs
xsTrain = xs[:splitPoint]
xsTest = xs[splitPoint:]
# trainin and test golds
tsTrain = np.sin(xsTrain)
tsTest = np.sin(xsTest)
#plot
plt.plot(xsTrain,tsTrain)
plt.show()
```
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1045854/4a8c51e4-1bc8-e4f0-2eb2-f839d61cdeb6.png)
　なんか綺麗なのが出てきてしまった。しかしsin波ではないので、プロット取り直して再走しましょう。
　というか、どうしてこんな風になってるんだ…？
###因みに
　xsTrainとtsTrainがどんなデータかということですが

```python
print(xsTrain)
[ 3.01  2.54  1.99  2.91 -3.93  3.08  1.19 -1.92  1.68  2.42  2.43  1.16

......

 -2.06 -3.37  3.38  1.39 -1.83 -0.76  0.17 -3.16  3.78  2.28 -2.29  2.74]

print(tsTrain)
[ 0.13121319  0.56595623  0.91341336  0.22952795  0.70923139  0.06155372

......

  0.16918235  0.01840631 -0.59591722  0.75888071 -0.75233058  0.39088478]

print(type(xsTrain))
<class numpy.ndarray>
print(type(tsTrain))
<class numpy.ndarray>

print(len(xsTrain))
720
print(len(tsTrain))
720
```

　結構大きいので「....」で省略させてもらってます。

#簡単な解決策
　先程の画像をよく見てみれば、sin波自体は出ているみたいです。sin波があるかな？と見てみれば分かるでしょう。つまり、考えれる可能性は線のとり方が下手だったということでしょう。
　sin波のデータとして参考にしようとしたサイトでは、シャッフルしていたので、シャッフルをしたままプロットしているわけですが、プロットするにはソートしておく必要があるみたいです。
　つまりとりあえずの解決策としては、シャッフルをしないということでしょうか。

```python
import numpy as np
import matplotlib.pyplot as plt
# -4.0 ~ 4.0
xs = np.arange(-400,400)*0.01
splitPoint = int(len(xs)*0.9)
# training and test inputs
xsTrain = xs[:splitPoint]
xsTest = xs[splitPoint:]
# trainin and test golds
tsTrain = np.sin(xsTrain)
tsTest = np.sin(xsTest)
#plot
plt.plot(xsTrain,tsTrain)
plt.show()
```

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1045854/d42c3c35-1f6b-cdd3-e53b-acdf593074de.png)

#もっと完璧な解決策
　線を書くのが不味いのであれば、線を書かず点だけをプロットするようなメソッドを使えばいいではないですか。というわけで調べてみれば、さすがmatplotlib、普通にあるみたいです。
###scatterというメソッド

```python
import numpy as np
import matplotlib.pyplot as plt
# -4.0 ~ 4.0
xs = np.arange(-400,400)*0.01
# shuffle
np.random.shuffle(xs)
splitPoint = int(len(xs)*0.9)
# training and test inputs
xsTrain = xs[:splitPoint]
xsTest = xs[splitPoint:]
# trainin and test golds
tsTrain = np.sin(xsTrain)
tsTest = np.sin(xsTest)
#plot
plt.scatter(xsTrain,tsTrain)
plt.show()
```

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1045854/35248eda-d622-c68e-9e85-92ddfb9d5b95.png)
　点の描画であるため太めの線のように見えますね。たしか線の太さとか点の太さとかを変えることも出来たな、と思い出しましたがめんどくさいのでとりあえずこのままです。

#最後に
　今回オレが学ぶべき教訓は、matplotlibは用意された要素が点を作り、その順番ごとに線が生成されるということだろう。
　ちょっと備忘録でした〜。
EC2にmyアプリをクローンする

<h2>なんでこれ、作ったの？</h2>
<li>せっかくEC2に、Gitでマイアプリをクローンしてくる方法を知ったので、忘れないようにメモに残しておこうと投稿。</li>

```ruby:④Gitをインストールする
sudo yum install git
```


```ruby:GithubとSSH通信する鍵を作る
cd ~/.ssh
ssh-keygen -t rsa
```
<br>
`鍵の名前とパスワードを入力する. 名前はgithub、パスワードを二回入力`
![スクリーンショット 2021-06-12 21.41.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/7092f550-2952-1ea9-59db-12c8828b8e1b.png)

```ruby:鍵の中身をコピーするために、このコマンドを入力
cat github.pub
```

Githubの自分のアプリが置いてあるリポジトリに移動する
![スクリーンショット 2021-06-12 21.47.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/7a47fbd3-00bf-c2dd-d96e-8463ac92d9c8.png)
<br>
`Settingを開き、Deploy Keysを選択`
![スクリーンショット 2021-06-12 21.55.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/1d7af730-abd9-4dba-bb99-48d20136735d.png)

`Add deploy keyをクリック`
![スクリーンショット 2021-06-12 21.59.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/986c313d-990b-b5cb-600d-e7d21a3cbbfb.png)

ターミナルのキーをコピーし、Keyに貼り付ける
Titleに名前を入れる
Allow write accessにチェックを入れる
入力できたら、Add Keyを押す
![スクリーンショット 2021-06-12 22.01.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/4711d2a1-4979-de91-bef4-1941bdb94f53.png)


EC2のターミナルに戻り、

```
eval `ssh-agent`
ssh-add ~/.ssh/github
chmod 600 ~/.ssh/github
```

```ruby:configファイルを編集する
vim ~/.ssh/config
```

```ruby:configファイルにこう書く
Host github
HostName github.com
User git
IdentityFile ~/.ssh/github

Host *
ServerAliveInterval 60
TCPKeepAlive yes
```

```ruby:githubに接続できるか確認する
chmod 600 config
ssh github
ssh -T git@github.com
```
<br>
この画面が出たら、接続できているということ
![スクリーンショット 2021-06-13 14.13.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/9d21fd1f-28d7-3225-ab7a-dd9765293236.png)

```ruby:自分のリポジトリからssh接続でクローンする
git clone git@github.com:Githubのアカウント名/リポジトリ名.git:
```
`クローンがうまくいかなければ、
eval `ssh-agent`
ssh-add ~/.ssh/github・鍵を作り直すことを繰り返す`


```ruby:クローンしたファイル名を確認する
ls
```

<br>
ファイル名が表示されれば、クローンが成功している
![スクリーンショット 2021-06-13 14.42.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/7edfe44a-3a2d-9f35-b604-72f7e80e1bbb.png)

参考文献
https://poppotennis.com/posts/ec2-laravel
https://entsukablog.com/aws-laravel-deploy-github/