OmniAICreator/Qiita-1.07M huggingface dataset:
複数のテーブルに一度の入力で保存する方法

【概要】
----------------------------------------
<b>1.結論</b>

<b>2.Formオブジェクトとは</b>

<b>3.使用方法</b>

<b>4.ここから学んだこと</b>



1.結論
----------------------------------------
<b>Formオブジェクト</b>を使う!

<br>
2.Formオブジェクトとは
----------------------------------------
複数のテーブルに１度に保存できる方法です！
本来であれば保存したいテーブル分のコントローラー、モデルmigrateファイルを作らなければなりません。この場合ですと、モデルとある一つのファイルをつくるだけで簡単にできます！

<br>
3.使用方法
----------------------------------------
❶appにformオブジェクト専用のフォルダとその中にファイルをつくります。そして以下のように記述します。今回は購入された情報と住所をDBに反映させたいのでsellitem_addressにします！

```Ruby:app/forms/sell_item_address.rb
class SellitemAddress

 include ActiveModel::Model
 attr_accessor :postal_code, :shipping_orig_id, :city, :address_other, :building_name, 
               :telephone_num, :sell_item_id, :user_id, :buy_item_id

end
```
:user_idは新規登録したユーザー、
:buy_item_idは売られている商品になります。

 include ActiveModel::Modelを記載しincludeすることで、モデルのように扱えてここにバリデーションの記載もできます！

 attr_accessorはメソッド内の記述をメソッド外の時に変更を加えれるようにできるメソッドです！つまりインスタンス変数として扱えるようになり、ゲッターとセッターの内部処理を行っています！



❷使用したいモデルに対して情報を記載します。


 ```Ruby:app/forms/sellitem_address.rb
 def save
    sell_item = SellItem.create(user_id: user_id, buy_item_id: buy_item_id)
    Address.create(postal_code: postal_code, shipping_orig_id: shipping_orig_id, city: city, address_other: address_other, building_name: building_name,telephone_num: telephone_num, sell_item_id: sell_item.id )
  end
```
このようにすることでDBに保存できるカラムの設定を行いました！
user_id buy_item_idとなっているのは
既にuserのidとbuy_itemのidを設定しているのでidごとそのまま抜き取りたい設定をしています！

❸ビューで入力した情報をコントローラーがDBに登録できるように指示を出すように設定します。

```ruby:sell_items_controller
def create
    @sell_item = SellitemAddress.new(sell_item_params)
    if @sell_item.save
      return redirect_to root_path
    else
      render 'sell_items/index'
    end

  private

  def sell_item_params
    params.permit(:postal_code, :shipping_orig_id, :city, :address_other, :building_name, :telephone_num, :user_id, :buy_item_id).merge(user_id: current_user.id)
  end
 end
```
sell_item_paramsメソッドの中では、モデルで設定した情報を記載し、それを保存する際にsell_item_paramsとしてまとめています。こうすることで各カラムがどのテーブルに保存されるかを判断してくれるので非常に便利です！
読み込む記述も少なくなるので動作に負荷を与えずに済みます！

<br>
4.ここから学んだこと
----------------------------------------
本来であれば、コントローラーとモデルとmigrateファイルを保存したいテーブル分作り、viewと連携させて行います。また各コントローラーと連携するのか、各入力部分において各コントローラーに指示ださないといけないです。拡張性の部分でもエラーが発生する可能性は大いにあります。この方法なら保守性・可読性が上がり、各コントローラーに指示を出すより動作に負荷を与えずに済みます！

<br>
データアーキテクチャとは


「データアーキテクチャが30分でわかる本」の一章を読んだのでアウトプットする。
#目次
+ データアーキテクチャとは
+ データアーキテクチャがあるとどうなる？
+ ゴール
+ 手段

#データアーキテクチャとは

データとビジネスの繋がりを書き出した俯瞰図のこと。

#データアーキテクチャがあるとどうなる？
下記の内容がわかる。

+ データがどんなビジネス、どんな業務に貢献しているか
+ 業務内容がどんなデータに依存しているか

##要するに？
**データとビジネスの紐付けが可視化されている状態にする。**

「もうこのデータ使わないから削除してしまおう」という自体を避ける。
アーキテクチャを作成しておくことによって、影響範囲を洗い出せる。

+ 機械学習に使用されていないか
+ 法務観点で一定期間の保存を義務付けられていないか
etc...


#ゴール

+ データが発生してからビジネスに活用されるまでの図が作成されること。
+ アーキテクチャ図がメタデータとして保存されていること。
+ データとビジネスの繋がりを改善する計画が立っていること。

##手段

**①既存のデータアーキテクチャを書き出す**

以下の内容をメタデータとして保存する。

データを生み出している部署：データ入力スタッフ、ソフトウェアエンジニア etc...、
データを使っている部署：アナリスト、マーケティング担当、機械学習エンジニア etc...

ここで抑えるべきポイントは3点ある。

+ **どこからデータを取得しているか**
+ **どこに保存しているか**
+ **どのビジネスに使用しているか**

**②理想の図を大まかに設計する**

不適切なデータの流れを修正する。
二重にデータを作成している部分があったり、古いデータを参照していたり、参照が循環していたりすることがよくある。

どういう流れが理想なのか作図する。

**③理想のアーキテクチャで得られるビジネス価値を書き出す**

データの流れが綺麗になることによって、生み出されるメリットは何かを書き出す。

+ データ保存のコストが抑えられていないか？
+ データセキュリティが向上していないか？
+ 新たなビジネスチャンスが生まれていないか？

等が考えられる。

**③理想と現実のギャップを埋める為の改善アクションを決定する**

ビジネス価値とアーキテクチャ改善によるコストをテラソ合わせ、どこから「あるべきデータの流れ」を作成していくかを決定する。

#参考
[データマネジメントが30分でわかる本](https://www.amazon.co.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E3%81%8C30%E5%88%86%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B%E6%9C%AC-%E3%82%86%E3%81%9A%E3%81%9F%E3%81%9D-ebook/dp/B085W4YSZJ/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=177SQ1KXGZGBZ&dchild=1&keywords=%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E3%81%8C30%E5%88%86%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B%E6%9C%AC&qid=1599282508&sprefix=%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%2Caps%2C121&sr=8-1)
[データアーキテクチャの策定 株式会社総研](http://www.drinet.co.jp/blog/datamanagement-b/%E3%83%87%E3%83%BC%E3%82%BF%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%AE%E7%AD%96%E5%AE%9A.html)
Dart x Flutter MokuMoku Live Stream 2020/09/05 



Dart と Flutter で 何か作る..

https://youtu.be/cXdW5bpe9TA 
https://youtu.be/PSR6EfcR0KI
もくもく会での作業中のLive Coding 動画です

詳細は追ってまとめます

# Code

https://github.com/kyorohiro/mokumoku01


# 成果物について

![Screen Shot 2020-09-05 at 19.41.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54192/d6183e84-b4db-84a8-ff26-65884f633169.png)


Image を読み込んだら、そのImage から　代表する色を計算して 表示する
アプリを作成した。

対象は Flutter for Webです。

## File 入力
ファイルを入力する部分は自作しました。html.File(extends html.Blob) を、 隠蔽しモジュールがない気がしました。

なら、使いたい機能だけ、このアプリの都合に合わせて、作るのが早いと考えてそうしました。


## Isolate 

Color Code 一覧を取るまではすぐに出来たのですが、クラスタリング処理が
とても時間がかかるのでその部分を isolate 化する必要がありました。

ここまでが、良いのですが、
Flutter for Web では isolate が使えません。
そこで、 Worker を 利用して isolate の変わりをするようにしています。


## 今後の課題
isolate に委託している処理の中断
また worker を利用して別Threaedに処理を分けたとはいえ、色数が増えると
数分で終わらないことも考えられますのでその対応
Android や iOS で動くようにする工夫
ドラッグ & ドロップ対応など..
GitHub Pagesで404エラーが表示された時の対処法

静的ページをGitHub Pagesにデプロイしたが、「404エラー」が表示されてしまった時の対処法をご紹介します。

#1. まずは、URLが正しいか確認
大前提ですが、URLが正しいことを確認しましょう。

Github PagesのURLは、ユーザサイトの場合__「http://username.github.io」__なので、
ユーザー名が正しいかなどを確認しましょう。


#2. しばらく時間をおいて再度アクセス
デプロイしてから静的ページが表示されるまで時間がかかることがあるので、
しばらく放置してから再度アクセスすると、404エラーが解消することがあります。


#3. HTMLファイルの名前が「index.html」であるか確認
僕の場合はこれが原因だったのですが、HTMLファイル名が__「index.html」__になってないと、
上手くページが表示されずエラーが出てしまいます。


#4. フォルダ構造を変えてみる
index.htmlをリポジトリの直下に配置せず、フォルダを作ってその中に入れることで404エラーが解決することがあるようです。

(例)「sample-page」というリポジトリの場合

sample-page/index.html → sample-page/フォルダー/index.html


#5. 再度リポジトリを作成
何をやっても上手くいかない場合は、一度リポジトリを削除し、最初からやり直してみてください。


#Github Pagesにデプロイする方法
そもそもGithub Pagesにデプロイする方法が分からないという方は、TECHACADEMY magazineさんの記事「[無料で使える！GitHub Pagesを使ってWebページを公開する方法](https://techacademy.jp/magazine/6445)」が参考になります。


以上、参考になれば幸いです！
GPT-3でスタートアップのためのアイディアジェネレーター作りました

## はじめに

スタートアップ起業はしたいけどそもそもアイディアがない――そういう絶望的な状況の一助になればと思い作りました。
製作期間は2時間ほどで、すでに似たようなものを作っていたので、主にデザイン面での修正に費やしました。
こちらが前回作ったものです。

[The Zen of Programming | プログラマのための偽箴言集](https://zen-of-programming.netlify.app/)

## 完成
こちらが完成したサイトになります
[GPT-Startup | スタートアップのための人工知能](https://gpt-startup.netlify.app/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294146/86fec309-fd29-bc17-4c1a-70d0d1054cce.png)

### 注意

- リアルタイム出力ではありません。GPT-3に1分ごとに問い合わせて、データの取得をしています。
- すでに実在するスタートアップ企業のアイディアもあります。
- 日英対訳は正確ではないかもしれません。どちらかと言えば英語のほうが構文論的に正確な場合が多いですので、日本語が通らない場合は英文を読んでください。



## 環境

API側はAWS Lambda + TypeScript、DBはDynamoDB
フロントエンドはNuxt(TypeScript)で、ホスティングはNetlifyです。



## プロンプト

参考にしたのは以下のツイートです

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Here&#39;s the GPT-3 idea generator streaming its new ideas live, today I&#39;ll be tweaking/hacking a lot to improve the idea quality by using better seeds/prompts <a href="https://t.co/MeCBLL8WEy">pic.twitter.com/MeCBLL8WEy</a></p>&mdash; ؜ (@levelsio) <a href="https://twitter.com/levelsio/status/1298592733557411840?ref_src=twsrc%5Etfw">August 26, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## プロンプトのコツ

よくGPT-3のデモンストレーションでは、プロンプトとしてリストアップ型、問答表型のものが使われます。

```
Idea: This financial services startup is helping companies make sense of financial transaction data that lives across multiple systems.

Idea: An API for homes and buildings, with a hardware hub meant to help developers build apps that can do things like unlock doors, summon elevators, etc. from different device vendors.
```

このような形式のプロンプトがリストアップ型です。

自分も以前作ったアプリでこういう仕様にしたのですが、これだとGPT-3のレスポンスから正規表現によって文字列抽出をする必要が生まれます。GPT-3もときどきおかしなレスポンスをするときがあり、正直不安。
そのため今回は始めからJSON形式のプロンプトを使用することで、回答の形式が適切かどうか`try...catch`節の中で`JSON.parse()`でチェックするようにしました。

それに加えてTypeScriptで書いているので型チェックすればいいのも楽になります。



```
{"idea":"This financial services startup is helping companies make sense of financial transaction data that lives across multiple systems.","japanese":"この金融サービスのスタートアップは、複数のシステムにまたがる金融取引データの意味を企業が理解できるように支援しています。"}
{"idea":"An API for homes and buildings, with a hardware hub meant to help developers build apps that can do things like unlock doors, summon elevators, etc. from different device vendors.","japanese":"住宅や建物のためのAPIで、異なるデバイスベンダーからドアのロックを解除したり、エレベーターを呼び出したりすることができるアプリを開発者が構築できるようにするためのハードウェアハブを備えています。"}
```

このような形式でプロンプトを与えて、`stop`プロパティには`\n`を与えます。

```
stop: ['\n'],
```

あとはAxiosを使ってOpenAI のGPT-3 APIに要求をしています。

レスポンスは例えば以下のような感じになります。

```
{"idea":"A platform that helps users create and sell digital products, like online courses, e-books, or templates.","japanese":"オンラインコース、電子書籍、テンプレートなどを作成し販売できるプラットフォーム。"}
```

後はこれをパースすればTypeScript/JavaScriptで扱える形式になりました！
JSON形式にしてしまえば、そもそものプロンプトの取り扱いも楽になります！

**GPT-3って本当に賢いですね**



## 終わりに

始めからプロンプトをJSON形式にする方が楽だったという話。GPT-3を使ったアプリケーション開発の一助になればと思います。
[TidalCycles]SuperDirtが起動しない

自分用

TidalCyclesを試してみたい。
じゃあはじめの一歩、SuperDirtのBoot Serverをクリックして...

`ERROR: failed to open UDP socket: address in use.`

`exception in real time: alloc failed, increase server's memory allocation (e.g. via ServerOptions)`

等のエラー。

コピペするの忘れちゃったけど、ポートがすでに使われちゃってますよ〜的なメッセージもあったかも。

# 解決法

ターミナルから

`killall scsynth`

で解決。
VIM: 予約語のsyntaxを定義する

環境
Windows10

vimのインストールフォルダ\vim{バージョン番号}\syntax\
以下に``uwsc.vim``をコピー。

vimのインストールフォルダ\vim{バージョン番号}\filetype.vim
の編集。

``追加``
au BufNewFile,BufRead __*.uws__     self __uwsc__

以上です！

ここの設定ファイルを元にUWSCの設定してみました！
ありがとうございます！！
https://github.com/rmatttu/vim-uwsc/tree/master/syntax

キャメルケースがお好きな方はこちらもどうぞ！
https://github.com/fell-morimo/uwsc-vim_camelCase/tree/main

LGTMお願いします！
モチベーションがあがります！
【Java Bronze】学習メモ（インターフェース,staticメソッド,型変換など ）

Java Bronze学習にあたり、よく間違える箇所のまとめ。

##インターフェース

<b>・フィールドは定数のみ</b>
   フィールドは全て、<b>final static</b>で暗黙的に修飾される。（修飾子は省略可能）
   staticでフィールドを修飾することができる
（※staticで定義された値はインスタンスを作成しなくても実行できるため）

<b>・メソッドは全て、<b>public abstract</b>で暗黙的に修飾される</b>
staticでメソッドを修飾することはできない。
（※staticメソッドはインスタンスを作らなくても実行できてしまうため、抽象的なメソッドを修飾することはできない）


##staticメソッド
<b>staticメソッドから、自クラスに定義されたインスタンスフィールドにアクセスすることはできない。</b>
→コンパイルエラー発生！

staticメソッドはインスタンスを作らなくても実行できる。
インスタンス作成前にstaticメソッドからインスタンスフィールドにアクセスしてしまうのを防ぐためにコンパイルエラーが発生する。

##ダウンキャスト

親クラスのインスタンスを、子クラスの型に代入すること。
キャスト演算子を使うことで、強制的な型変換が可能になる。

コンパイルエラーは起こらない。
ただし！

<b>実際に代入しようとした瞬間、例外が発生（ClassCastException）</b>

##アップキャスト

子クラスのインスタンスを、親クラスの型に代入すること。

親クラスにあって、子クラスに無いメソッドを実行すると<b>コンパイルエラー</b>になる。

##シグニチャ
・メソッド名
・引数の数
・引数の型
・引数の順番

のこと

##変数の初期値

変数は、生成されるときに初期値（default value）で初期化される。

・byte型　	0
・short型　	0
・int型　　	0
・long型　　	0L
・float型　	　0.0f
・double型　	　0.0d
・char型　　　	'\u0000'
・boolean型　　	false
・参照型　　　　	null
pythonで同一ディレクトリ内のファイルのリストを取得する方法


同一ディレクトリ内にあるファイルのリストの取得には、__globモジュール__が便利です。
#glob モジュールの使用例

下記のファイルが保存されているディレクトリで、globを動かしてみます。
　data1.txt, data10.txt, data2.txt, data3.dat, data99.txt, result1.txt, result2.dat

######・ワイルドーカードを用いる
以下の処理で、同一ディレクトリ内にあるすべてのファイルのリストを取得できます。

```python
import glob

filelist=glob.glob('*')
print(filelist)
```
実行結果

```
['data1.txt', 'data10.txt', 'data2.txt', 'data3.dat', 'data99.txt', 'result1.txt', 'result2.dat']
```
ワイルドカード'*'を用いれば、特定の条件を満たすファイル名のみをリストアップできます。以下の例では、ファイル名が'data'ではじまるもの、拡張子が'.txt'であるものをそれぞれリストアップしています。

```python
filelist=glob.glob('data*') #'data'ではじまるファイル名をすべてリストアップ
print(filelist)
filelist=glob.glob('*.txt') #'.txt'で終わるファイル名をすべてリストアップ
print(filelist)
```
実行結果

```
['data1.txt', 'data10.txt', 'data2.txt', 'data3.dat', 'data99.txt']
['data1.txt', 'data10.txt', 'data2.txt', 'data99.txt', 'result1.txt']
```
######・'?'を用いる
ワイルドカード部分の文字数を指定したい場合は、'*'の代わりに'?'を用います。'?'は、指定したい文字数の分だけつなげます。以下の例では、'data'と'.txt'の間に任意の2文字が入っているファイルをリストアップできます。

```python
filelist=glob.glob('data??.txt') #'data'と'.txt'の間に任意の2文字が入るファイルをすべてリストアップ
print(filelist)
```
実行結果

```
['data10.txt', 'data99.txt']
```

######・[ ] を用いる
[ ]を用いることもできます。この場合、[ ]で囲んだ部分が、[ ]内の英数字のどれか1文字に合致するファイルがリストアップされます。

```python
filelist=glob.glob('data[0-9].txt') #[0-9]の部分に0～9のいずれかの数字が入るものをすべてリストアップ
print(filelist)
```
実行結果

```
['data1.txt', 'data2.txt']
```
[mac] Robo 3T 1.4 におけるダークモード視認性悪化バグの修正方法


## 結論
`defaults write com.3tsoftwarelabs.robo3t NSRequiresAquaSystemAppearance -bool yes`
を叩く。

## 再現方法
https://robomongo.org/

mac os の Robo 3T で ダークモードを使った状態で1.4にアップグレードする。

![スクリーンショット 2020-09-05 12.51.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394488/3eb2fcb0-5020-cceb-d9c8-a6931c34b2fa.png)

## 修正方法
https://blog.robomongo.org/robo-3t-1-4/
をみるとコメントがされている

>Hi Daniel, we are very sorry for this problem. It is probably the result of Qt upgrade in this version which was unplanned and we had to do it last minute. We will make sure that dark mode is checked carefully during dev. and QA in future versions.
This seems to a workaround, can you try this:
// Disable dark mode for Robo 3T
defaults write com.3tsoftwarelabs.robo3t NSRequiresAquaSystemAppearance -bool yes
And if it does not fix it, older releases are here:
https://github.com/Studio3T...
Also to reset Robo 3T theme (enable dark mode)

`defaults write com.3tsoftwarelabs.robo3t NSRequiresAquaSystemAppearance -bool yes`
を叩けば良い。
つまり、defaults write コマンドを叩き、アプリケーションのダークモードを強制的に無効にしている
ライトニングトークのススメ（テクニック編）

[ライトニングトークのススメ（意義編）](https://qiita.com/rf_p/items/916535f0c23701efed44)の続きです

# LT発表までの流れ

前回の記事の続きです。

初めてのLT！
と言えど、何を話せばいい？どう構成すればいい？どう喋ればいい？と、テクニックに関する悩みは多いはず。

全体の流れですが、

1. 目的・テーマを決める
2. 話す内容を整理する
3. 資料を作る
4. 練習する
5. 本番

となります。

# 1. 目的・テーマを決める

まず目的を定めます。

* 聴衆は誰か？
* どれくらいの理解度か？

を踏まえ、**誰に何を伝えたいか？** を想像します。
その目的次第で、話すテーマも、伝えるべきメッセージも変わってきます。

例えば会社紹介のプレゼンをするとして、

* 会社説明会で学生に向けてするプレゼン
    * そもそも会社の存在を知らない、知っていても事業内容まで知らない人が多いので、基礎的なところから
* 入社者研修で、新入社員に向けてするプレゼン
    * 理念とかざっくりどんな事業やっているか知っているので、その詳細を伝える
* 同じ事業部の人に、仕事内容を伝えるプレゼン
    * 会社の全体像は知っているので、よりツッコんだ内容を伝える

と、レベル感によって内容が大きく変わります。
そのため、必ず目的を最初に定めましょう。

目的が決まったらテーマを決めます。
まずは、自分の得意分野で、聴衆が興味を持ち、スキルアップに繋がりそうなものにすると良いでしょう。

# 2. 話す内容を整理する

目的とテーマが決まったら、次に話を整理します。

よくやりがちなミスとして、テーマが決まったらいきなりパワポを開いて資料を作りはじめる…というパターンです。
パワポは文字サイズやレイアウト、画像挿入等いろいろ触りだすと時間を消費してしまい、話の全体像が見えづらくなったり、伝えたいメッセージを入れ忘れたりします。

そのため、最初はメモ帳にキーワードをバーっと並べていくか、パワポで作るにしても大枠の流れを書いていき、いきなり内容をガッツリ書こうとしないようにしましょう。

キーワードが揃ってきたら全体の構成を考えます。

よく使われる話の組み立て方として、**PREP法**と**SDS法**があります。

## PREP法

* Point(要点)
    * 例）ライトニングトークは、視聴者のためだけではありません。発表者自身のスキルアップにも繋がります。…
* Reason(理由)
    * 例）なぜなら、人に教えようと伝える工夫をする過程で、トークテーマに対する理解が深まるからです。…
* Example(例)
    * 例）例えば後輩とのペアプロをしている中で、質問に答えられず調べたら新しい知識を得た経験はありませんか？…
* Point(要点)
    * 例）以上のことから、スキルアップをしたいエンジニアにとって、ライトニングトークで発表することに大きな意義があります。…

のように構成するやり方です。
本記事の「1. 目的・テーマを決める」もその流れで構成しています。
これにより、いつまで経っても結論が聞けなくて視聴者のフラストレーションが溜まるようなことなく、スッと理解ができる構成になります。

## SDS法

* Summary(概要)
    * 例）プログラマには、三大美徳と呼ばれる思想があります。それは…
* Details(詳細)
    * 例）1つ目は〜、2つ目は〜、3つ目は〜、…
* Summary(概要)
    * 例）以上のことから、一見ダメなように思える言葉でも、プログラマはこの思想を大切にしています。…

この記事も大枠ではSDS法の構成で、

* 最初のブロックで全体の流れが1. 目的・テーマを決める　〜　5. 発表
* 1.から5.の詳細解説
* 最後に再度まとめ

という流れです。

これにより、全体像見えていない中で延々と話をされるより、全体のどこを喋っているのか理解しやすく、記憶に残りやすい構成となります。

# 3. 資料を作る

パワポで資料を作るはずですが、いくつかアンチパターンを置いておきます。

## 3-1. やたら凝ったパワポテーマを使ったり、いろんな色を使わない

かっこよく見せようとパワポテーマをいろいろ変えるケースが多いですが、素人がやると逆効果です。
単色黒文字とかでOKです。
色も多くて３色。基本フォントカラーと、強調したいところに使う1〜2色程度で。

## 3-2. 小さい文字を使わない

デフォルトのパワポテーマの文字サイズだとやや小さいので、16pt〜をおすすめします。
小さい文字は主張が弱々しく見えるデメリットもありますし、このご時世だとあまり関係ないですがリアルイベントでプロジェクターを使って発表するケースだと、小さい文字は後ろの方の視聴者が全然読めないです。

## 3-3. 話す内容とパワポ内容に大きな乖離を作らない

書いてあることは３行なのに、そこに書いていないことを延々と喋るパターンや、１０行ぐらいびっちり書いてあるのに全く触れないとか、やたらグラフ多くてどこに注目させたいのか分からないとか…
結構やりがちなミスなので、１スライド1メッセージを心がけて、スライドにないことはあまり喋りすぎないようにしましょう。

## 採用しても面白いかもしれないテクニック

* 高橋メソッド
    * 発表形式のフォーマット。日本Rubyの会の高橋さん発祥。スライドにバカでかい文字でセンタリングした1メッセージのみ、図やグラフを使わない

# 4. 練習する

あとは発表練習。
発表練習は怠らないようにしましょう。

原稿用意して読む形式だと台本読んでる感が出て感情が出づらいので、台本なんか無くてもスライド見ながら喋れるぐらいまで練習すると、伝わりやすい発表になります。

また、発表練習は多くの方に聞いてもらうと良いでしょう。
自分では気づけなかった喋りの癖や伝わりづらい点を指摘してもらいやすいです。

特に、「あー」「えー」という『言葉のひげ』を無意識に付けて喋ってしまう人は指摘してもらって矯正していくと良いです。
言葉のひげは集中力を欠く大きな要因となり、せっかく良い内容でも伝わりづらくなります。

# 5. 本番

あとは本番あるのみ。
明るくハキハキと。
また、スライドは戻らず一方通行が良いです。戻ると、これもまた集中を欠く要素になってしまうので。

ライトニングトークは以下の5ステップで準備するということをお伝えしました。

1. 目的・テーマを決める
2. 話す内容を整理する
3. 資料を作る
4. 練習する
5. 本番

是非ライトニングトークに挑戦してみてください。
Semantic segmentation: 空と木を見分けるために

http://sceneparsing.csail.mit.edu

MIT scene parsing論文のまとめです。
画像は全て論文から引っ張ってきました。

Scene Parsing through ADE20K Dataset. B. Zhou, H. Zhao, X. Puig, S. Fidler, A. Barriuso and A. Torralba. Computer Vision and Pattern Recognition (CVPR), 2017. [PDF](http://people.csail.mit.edu/bzhou/publication/scene-parse-camera-ready.pdf)


ある画像を見て、ここは木だここは空だここはソファーだ、と認識させることは極めて難しいことだ。
ましてや、画像を見てラベルやbounding boxを出力するだけでなく、1 pixelごとに1ラベルを出力するsegmentationについて紹介する。

# ユースケース
- ロボットに空間を正しく認識させた上で、操作を行う
- 画像から人/車/etcを自動で消したい場合
- 画像の合成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343755/ce81fbea-81df-73ee-c434-6c9de6ee0c21.png)


# 課題: dataset & annotation
そもそも多様な画像(都市だけじゃない、家の中だけじゃない、etc）を集めたデータセットが貴重である。
また、1 pixelごとに1ラベルを出力するため、annotationは鬼のように面倒である。

- Cityscapes: City scenes only
- Pascal-Context: 20 object classes
- SUN database
- **ADE20K:** 150 object classes (論文で紹介されたデータセット)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343755/aaab80cb-f28d-ce11-6cb4-0194e90b3dd8.png)
論文から抜粋したfigure。めっちゃ細かい。


## annotationがそもそも難しい件

Objectの間にヒエラルキーが存在する (例えばrimはwheelの一部で、ドアノブはドアの一部)が、ADE20Kの場合、3階層までのヒエラルキーを作りアノテーションさせているとか。すごい。

また、壁に絵がかかっている場合はどうラベルを作るか。ADE20KはCascade Segmentation Moduleを使い、今まで無視されてきたオブジェクト間の空間的関係性を踏まえてsegmentationを行なっている。以下の3つの大分類に分けている:

- stuff (sky, road, building, etc)
- foreground objects (car, tree, sofa, etc)
- object parts (car wheels and door, people head and torso, etc)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343755/98f4d3e4-77dd-7f40-ad0f-2a05d39a9ee8.png)

画像のように、3つの大分類に合わせて、3つのsegmentation streamを最終的に合わせる形でやっている。
共有サーバーで動かすsymfony4@heteml

#1,ローカル環境にsymfonyアプリを作成
##フルセットプロジェクト作成
```
#適当なフォルダに移動
cd symfony
composer create-project symfony/website-skeleton my-symfony-app 4.4.*

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703926/fbc5a261-c61d-d84a-4a27-f93d3746f00a.png)

## サーバー起動
```
cd my-symfony-app

# WebServerBundleをインストール
composer req server
php bin/console server:run
```
##確認
http://127.0.0.1:8000/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703926/963115e1-1d74-3114-2131-5bbe5e3a8c49.png)

##Eclipes
Symfony plugin、Twig pluginインストール
>Eclipesにマーケットプレイスがない場合
>https://ex1.m-yabe.com/archives/3919

###プロジェクト作成
ファイル->インポート->PHP->symfony Project->作成したappを選択
※デフォルトのphpのバージョンが低い場合は、バージョン設定。
プロパティ->PHP->検証。

##indexコントローラー作成
```
cd symfony/my-symfony-app
php bin/console make:controller
> IndexController
```
http://127.0.0.1:8000/index

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703926/23935759-0eeb-e85a-b55a-bdf5fecad081.png)

##DB設定
>Mysqlを使用。インストールしてない場合は、以下とか参考に。
>https://weblabo.oscasierra.net/installing-mysql56-windows-1/
>https://qiita.com/ryo-sato/items/bd026f5e627a746f1734
>HeidiSQL便利。
>https://celtislab.net/archives/20130826/heidisql%E3%81%A7mysql%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%B8%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B/
>


###1.データベースとユーザーを作成。
照合順序は公開サーバーと合わせて「utf8mb4_general_ci」とかに。

###2.プロジェクト直下「.env」を編集。

```
DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name?serverVersion=5.6
```

#2,hetemlで動作確認

##phpのパスを通す
```
$ cd ~/

# Linuxにログインすると、ホームディレクトリにある .bash_profile と .bashrc が実行される
# bashrcに書き込む
$ echo "export PATH=\$PATH:/usr/local/php7.4/bin" >> ~/.bashrc

# source：ファイルに書かれたコマンドを現在のシェルで実行する
$ source ~/.bashrc
$ php -v
```
##2,composerのインストール
```
$ curl -sS https://getcomposer.org/installer | php
$ php composer.phar -v

$ mkdir bin
$ mv composer.phar bin/composer
$ echo "export PATH=\$PATH:~/bin" >> ~/.bashrc
$ source ~/.bashrc
$ composer -v
```

##フォルダー毎アップロード
7zipでtar->gzip圧縮しとくと楽。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703926/8ecbbc19-75f2-f0fe-56ea-e1b9dfa867c0.png)

###ドメイン設定
ドメイン設定フォルダを/path/app/publicに。
###.htaccess設置。
```
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !^(.*)\.(gif|png|jpe?g|css|ico|js|svg|map)$ [NC]
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
```
###.env->DB設定を公開サーバーに変更。

```
DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name?serverVersion=5.6
```

##表示確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703926/29d064fc-09d6-e296-5cb9-0eada1c1cdea.png)

##公開モード
.envを修正

```.env
#APP_ENV=dev
APP_ENV=prod
```
#####500エラー発生時はキャッシュ削除してみると良いかも。
```
 php bin/console cache:clear
```
phpの環境変数を通したはずなのにうまく動かない時にやったこと

# やったこと

1. php7.3のインストール
2. 環境変数の設定  
`echo 'export PATH="/usr/local/opt/php@7.2/bin:$PATH"' >> /Users/xxx/.bash_profile`
3. `php -v` で確認

# 起きたこと
```
dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib
  Referenced from: /usr/local/bin/php
  Reason: image not found
```

# 解決

`source ~/.bash_profile`

↑これで設定が再読み込みされる

```
PHP 7.3.21 (cli) (built: Aug  7 2020 18:56:36) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.21, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.21, Copyright (c) 1999-2018, by Zend Technologies
```
以上
【Laravel】シーディング

こちらの記事は以下の書籍を参考にアウトプットとして執筆しました。
[PHPフレームワーク Laravel入門 第2版](https://www.amazon.co.jp/dp/B08625YD7H/ref=sspa_dk_detail_0?psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEzRlJZSkE1SDIyNU5QJmVuY3J5cHRlZElkPUEwMDQyMjIzMUlLUVpUVUxYSlJVJmVuY3J5cHRlZEFkSWQ9QTJRMDhPNUZDUzM2Q08md2lkZ2V0TmFtZT1zcF9kZXRhaWwmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl)

テーブルはマイグレーションで作成されているものとして、シーディングをやっていく

テーブルに適当にデータを登録して、LaravelでのDBの扱いに慣れる練習路する

コレクトクラスの使い方とかスコープwhereとか

#シーディング
手順はこのような流れ

- シーディング用のスクリプトを作成
- スクリプトを変数
- シーディング実行

##シーダファイル作成


```bash
$ php artisan make:seeder シーダファイル名
```
シーダファイルは`database/seeds`ディレクトリに作成される

この中の`DatabaseSeeder.php`にシーダーファイルを登録する

##シーディング処理
作成されたシーダーファイルを見てみると`run`メソッドのみが書かれている

```php5
<?php

use Illuminate\Database\Seeder;

class ArticlesTableSeeder extends Seeder
{
    public function run()
    {
        //
    }
}
```
このrunメソッドにシードを作成する処理を書いていく

###MySQLのカラム一覧の表示
DB(MySQL)でカラム名がわからなくなったときは以下コマンドでカラム一覧を取得できる。

```sql
mysql> show columns from articles;
```

```:出力例
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| created_at | datetime         | NO   |     | NULL    |                |
| content    | varchar(255)     | NO   |     | NULL    |                |
| article_id | int(11)          | NO   |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+
```

##シード作成

```php5
//use Illuminate\Support\Facades\DB;を追加
    public function run()
    {
        $param=[
            'id'=>10,
            'created_at'=>'1923-03-15 14:53:21',
            'content'=>'テストcontent',
            'article_id'=>123,
        ];
        DB::table('articles')->insert($param);
    }
```

##シーダファイル登録
`DatabaseSeeder.php`に登録する。
これはシーディングコマンドで実行されるスクリプト
ここに作ったものを呼び出す処理を書く

```php5:DatabaseSeeder.php
    public function run()
    {
        $this->call(ArticlesTableSeeder::class);
    }
```

##シーディングの実行
```
$ php artisan db:seed
```
mysqlで確認してみると確かにレコードが追加されていた

```sql
mysql> select * from articles;
```

```:出力
+----+---------------------+------------------+------------+
| id | created_at          | content          | article_id |
+----+---------------------+------------------+------------+
| 10 | 1923-03-15 14:53:21 | テストcontent    |        123 |
```

###mysql操作関連
####データを消す
```sql
delete from テーブル名 where 条件式
```
【Go】ビットフラグについて

<font color="red">※注意: この記事ははあくまで個人学習用に整理しただけの記事で、内容としては不完全なものになります。読んでも参考にならない可能性が高いです。</font>

go のサンプルコードを見ていたら以下のようなコードがあった

```golang
logger = log.New(file, "INFO ", log.Ldate|log.Ltime|log.Lshortfile)
```

上記の `|` （記号の名称: 日本語だとパイプまたはパイプライン、英語だと vertical bar）の部分が見慣れなかったので、最初は TypeScript の Union Types みたいな物かなと思ったが、調べてみたら、ビット演算子（bitwise operator）で、ビット論理和 (OR) だった。

普段 JavaScript を書いていて、ビット演算が使用されているコードはたまに見かけることがあったが、自分が書く事はほぼ無く、なぜここでビット論理和をしているのか理解できなかった。

調べたところ、どうやらビットフラグというフラグ制御方法があるらしい。ビットフラグの詳しい説明については以下がわかりやすかった。
[C#で列挙型(enum)をビットフラグとして判定および演算する](https://johobase.com/judge-calculate-enum-csharp/)

`log/log.go` のソースコードには以下のようにコメントがある。

```golang
// These flags define which text to prefix to each log entry generated by the Logger.
// Bits are or'ed together to control what's printed.
// There is no control over the order they appear (the order listed
// here) or the format they present (as described in the comments).
// The prefix is followed by a colon only when Llongfile or Lshortfile
// is specified.
// For example, flags Ldate | Ltime (or LstdFlags) produce,
//	2009/01/23 01:23:23 message
// while flags Ldate | Ltime | Lmicroseconds | Llongfile produce,
//	2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message
const (
	Ldate         = 1 << iota     // the date in the local time zone: 2009/01/23
	Ltime                         // the time in the local time zone: 01:23:23
	Lmicroseconds                 // microsecond resolution: 01:23:23.123123.  assumes Ltime.
	Llongfile                     // full file name and line number: /a/b/c/d.go:23
	Lshortfile                    // final file name element and line number: d.go:23. overrides Llongfile
	LUTC                          // if Ldate or Ltime is set, use UTC rather than the local time zone
	LstdFlags     = Ldate | Ltime // initial values for the standard logger
)
```

上記のコメントを和訳する。

> これらのフラグは、ロガーによって生成された各ログ エントリに接頭辞を付けるテキストを定義します。
ビットは、印刷される内容を制御するために一緒に並べられます。
出てくる順番（ここに記載されている順番）や、提示される形式（コメントに記載されている通り）をコントロールすることはできません。
Llongfile または Lshortfile が指定された場合のみ、接頭辞の後にコロンが続きます。
例えば、フラグLdate｜Ltime（またはLstdFlags）は `2009/01/23 01:23:23 message` を生成し、フラグ Ldate | Ltime | Lmicroseconds | Llongfile は `2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message` を生成します。

なるほど。ログとして出力する日時やファイル名などの付加情報のどれをログとして表示させるかをビットフラグという仕組みで設定することができるようだ。

非常に勉強になった。
PHPの比較演算子

##はじめに
判定には比較演算子がよく使われると思います。
下記簡単にまとめます。

##PHPの比較演算子

```php
//型の相互変換をした後で $aが$bに等しい時にTRUE
$a == $b

//$aが$bに等しく、および同じ型である場合にTRUE 
$a === $b

//型の相互変換をした後で$aが$bに等しくない場合にTRUE
$a != $b

//型の相互変換をした後で$aが$bに等しくない場合にTRUE
$a <> $b

//$aが$bと等しくないか、同じ型でない場合にTRUE 
$a !== $b

//$aが$bより少ない時にTRUE
$a < $b

//$aが$bより多い時にTRUE
$a > $b

//$aが$bより少ないか等しい時にTRUE
$a <= $b

//$aが$bより多いか等しい時にTRUE
$a >= $b

//$aが$bより大きいか、0等しいか、小さい場合に、それぞれ、0より大きいか、0か、0より小さい integer。
//PHP 7 以降で使用可能
$a <=> $b
```

引用：[PHP: 比較演算子 - Manual](https://www.php.net/manual/ja/language.operators.comparison.php)

比較演算子`==`と`===`は似ていますが使い分けるとより正確な実装ができると思います。
型の判定が必要な時は`===`を用いていきましょう。

##おわりに
いかがでしたか。
比較演算子を使いこなして正確な実装をしていきましょう。
UbuntuでQEMUを使ってU-Bootを動かす。

# ■ やること

UbuntuにARMのU-Boot開発環境を作る。

他の機器にU-bootを入れる予定ですが、そもそもU-bootについて知らないことが多いので、
QEMUを使って仮想的なU-bootを実行したいと思います。

# ■　試した環境
2020/09/04
Intel® Core™ i5-4570 CPU @ 3.20GHz × 4 
メモリ　32GB 
Ubuntu 20.04.1 LTS　(64bit)

# ■　注意点
仮想環境上のUbuntuでは動かない場合があります。
実環境を推奨します。

# ■　参考サイト

QEMUでARMのU-bootを動かす
https://qiita.com/eggman/items/948095368ae81834fb4a

ほぼ上記のサイトでかなう話でした。

# ■　環境セットアップ
sudo apt-get install bison
sudo apt-get install flex
sudo apt install qemu-system-arm

# ■　ダウンロード
git clone git://git.denx.de/u-boot.git
cd u-boot

# ■　コンパイル
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_ca9x4_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

# ■　実行
cd ..
qemu-system-arm  -M vexpress-a9 -nographic -kernel u-boot/u-boot


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/a877b557-91e9-9d03-b1cb-e32156a625a2.png)

お、起動した。

# ■　この先

本当は、今回使用するARMコアに設定してコンパイルしたかったんですが、まぁなんか色々問題がありそうなので、とりあえずこの状態でConfigファイルの編集でも試してみます。

# ■ カスタマイズする。
勾配降下法の根本

勾配降下法の根本について、まとめてみた。

noteにかいたので。



https://note.com/jin237/n/n7a1b64475165

![thumbnail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533115/16ff8999-93b0-d939-5cf5-0ab6e8fb40b2.png)
製造物責任法(PL法)の製造物責任

応用情報技術者平成30年春期 午前問78

製造物責任法(PL法)において，製造物責任を問われる事例はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/6b9977af-8c0e-43f7-bc5f-75df6e6f5146.png)


１、製造物責任法(PL法)は、 Product Liability
製造物の欠陥により人の生命、身体または財産に係る被害が生じた際の製造業者の損害賠償の責任について定めることで、被害者を保護することを目的とした法律です。
この法律では製造物を「製造又は加工された動産」と定義しています。

対象：
・欠陥があるプログラムを組み込んだハードウェア(製造物)の使用によって損害が生じた場合は、その動産であるハードウェアに欠陥があるものとして製造物責任法の対象となります。
。。。

対象外：
・サービス、
・不動産、
・未加工のものは、この定義上の製造物には含まれず欠陥があったとしても製造物責任法の対象外
・コンピュータプログラムのような無体物も動産ではないため適用対象外
。。。


参照：
https://www.ap-siken.com/kakomon/30_haru/q78.html
Laravelでstorage/frameworkフォルダ直下にセッションファイル？が生成されている

社内システムのwebアプリがLaravelで動いているのですが、先月くらいから「"/storage/framework\sessions" directory does not exist.」がまれに発生するようになりました。

頻度が低いこともありしばらくほっておいたのですが、

先日時間ができたのでサーバのディレクトリを確認したところstorageフォルダの直下に大量のファイルが。。。。

なんだこれは。。。

ファイル名が「framework\sessions\xbQ0RkHTqeMba6xKZDcmp3Ud6lAcp4IUE0aajcse」なのでセッションファイル？

ファイル名に\が含まれているのでsession.configの設定にゴミが混ざっているのかとあたりをつけてみてみると、

　`'files' => storage_path('framework\sessions')`

開発環境がwindowsなこともありぱっと見では違和感を感じませんでしたが^^;

以下のように修正。

　`'files' => storage_path('framework/sessions/')`

セッションタイムアウト時間の変更作業の時に紛れ込んだのかな？と思いつつ。
[tips]画像をdivで囲み縦横比を指定することで読み込み時のズレを防止する

# 画像の読み込みを制することでイライラをなくす
[自分のwiki](https://itizawa-tech.growi.cloud/5f52f12e3e590d00487e0a7f) の転記です。
## Code
https://github.com/itizawa/loading-spinner

## 環境
[お試しのため create react app を使っている](https://ja.reactjs.org/docs/create-a-new-react-app.html)

```
$ npx create-react-app my-app
$ cd my-app
$ npm start
```

## コード
```js:App.js
import React from 'react';
import './App.css';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <h1>Loading Spinner</h1>
        <img alt="" src="https://penguin-ogp.vercel.app/api/ogp?text=こんにちは人類" />
        <p>イメージを表示します</p>
      </header>
    </div>
  );
}

export default App;
```
表示する画像は https://github.com/itizawa/penguin-ogp で生成したもの。

このコードには読み込み時の問題がある。
読み込みが遅い環境の場合、「イメージを表示します」のメッセージが読み込まれた画像によってその分だけ下にずれる。

![gamen_test1 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394488/e490af41-11f5-ba91-949c-60ed7ca43454.gif)


改善するために、img に height と width を指定しようとするがうまくは行かない

うまく行かない指定
`<img width="100%" height="auto" alt="" src="https://penguin-ogp.vercel.app/api/ogp?text=こんにちは人類" />
`
読み込み後に初めて width と height の情報が得られるため、初めからその画像分の幅を取ることはできない。

## 縦横比を指定して読み込み前に幅を指定する

create react app では sass が使えないため、
`$ yarn add node-sass`
を実行しインストールしておく。

元の画像は、 w1200, h660 なので、高さ 1 に対して横幅は 0.55。
それを踏まえたコードが次のようになる。

### js
```js:App.js
import React from 'react';
import './App.scss';

function App() {
  return (
    <div className="App">
      <div className="App-container">
        <h1>Loading Spinner</h1>
        <div className="fix-aspect-box">
          <img alt="" src="https://penguin-ogp.vercel.app/api/ogp?text=こんにちは人類" />
        </div>
        <p>イメージを表示します</p>
      </div>
    </div>
  );
}

export default App;
```

### scss
```scss:App.scss
.fix-aspect-box {
  position: relative;
  width: 100%;
  padding-top: 55%;

  img {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
  }
}
```

イメージは初めに額縁を用意しておいて、後から届いた画像を収まるように収縮して当てはめるという感じ。

![gamen_test1 (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394488/66abde84-33dc-344e-9e79-b03f337ae18b.gif)


縦横比を指定しているから小さくなっても画像が引き伸ばされたりはしない。

## 最後に spinner を追加する。

先ほどの状態だと、無の空間にいきなり画像が表示される。
想定していないものがいきなり現れるのは気持ちの良いものではない。

そこで読み込み中は spinner を表示する。
https://design.webclips.jp/svg-loading-icon/

public に svg を配置し`background-image`で読み込むことができる。

```scss:App.scss
.fix-aspect-box {
  position: relative;
  width: 100%;
  padding-top: 55%;

  img {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;

    // show spinner
    background-image: url('/spinner.svg');
    background-repeat: no-repeat;
    background-position: center center;
  }
}
```

![gamen_test1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394488/e2bdd267-f08b-fc0b-ab04-59867391fdac.gif)


完成 :tada:

コードはこちら
https://github.com/itizawa/loading-spinner
AWS BeanstalkでASP.NET Core 3.1アプリをデプロイする

## AWS Toolkit for Visual Studioを使う
AWS Toolkit for Visual Studioの機能で、プロジェクトをBeanstalk へ直接デプロイができます。

https://docs.aws.amazon.com/ja_jp/toolkit-for-visual-studio/latest/user-guide/deployment-beanstalk-netcore.html


## .ebextensionsや.platformを使う方法

どちらかというと、こちらが本題です。

Beanstalk へアプリの発行する際に、Beanstalk 環境への設定ファイル(.ebextensionsなど)を含めることができます。
https://docs.aws.amazon.com/ja_jp/toolkit-for-visual-studio/latest/user-guide/deployment-beanstalk-custom-netcore.html

環境変数や、ELB、オートスケール等の設定をファイルとして記述・管理することができるので、Webコンソールからポチポチする手間もありませんんし、できる限りこちらを使っていきたいところです。
デプロイするアプリケーションソースバンドルにも設定ファイルを含める必要があります。

.NET Core上の話ですが、単にプロジェクトの直下に.ebextensionsなどのディレクトリを追加しても、アプリケーションソースバンドルには含まれません。（S3にアップロードされたソースバンドルのZipファイルを見ると、含まれていないことがわかります）
アプリケーションソースバンドルに設定ファイルを含めるには、設定ファイルに対して「出力ディレクトリにコピーする」ように設定が必要です。

ちなみに、AWSの公式ドキュメントでも「project.jsonに記載する」と解説されていますが、これは以前バージョンの.NET Coreを前提としていますので、3.1では設定方法が異なります。

https://docs.microsoft.com/ja-jp/dotnet/core/tools/project-json-to-csproj

Visual Studioのオプションのペインからも設定できますが、.csprojファイルに直接書くならこんな感じになります。

```xml
    <Content Include=".ebextensions\00-environment-variables.conf">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
```

※ AWSの公式ドキュメントも早く新しい.NET Coreのバージョンに対応して欲しいです…
基本情報技術者試験の勉強メモ

#テクノロジ


## システム開発技術
### ソフトウェア構築
#### 命令網羅
・全ての命令を少なくとも１回は実行するテストケースを設計する。
・もっとも網羅性が低い設計方法
#### 条件網羅
・全ての分岐について分岐先の全ての経路を少なくとも１回は実行するようにテストケースを設計する。

## ネットワーク
### HDLC(High-Level Data Link Control)
・OSI基本参照モデルのデータリンク層のプロトコルで高効率・高信頼性を目指した伝送制御手順の一種
・同期制御に任意のビットパターンを連続して送信可能なフラグ同期方式を採用し、パリティでは検出できないバースト誤りも検出可能であるCRC方式を採用している。

### ネットワーク方式
バイト(byte)

1B
↓(1024倍)
1KB = 1024バイト
↓(1024倍)
1MB = 1024KB
↓(1024倍)
1GB = 1024MB
↓(1024倍)
1TB = 1024GB

＊1024は2の10乗であるから


8ビット = 1バイト

##ソフトウェア
###開発ツール
####リンカ
・複数個のコンパイル済みのプログラムや、そのプログラムで使用するライブラリを連結・結合し、１つの実行可能なプログラムファイルとして出力するソフトウェア


##データベース

###データ操作
####カーソル操作
・プログラムでデータベースへの問合せで得た導入表を、表データを直接扱えない手続き型プログラム言語に渡す機能を実現するもの


##コンピュータ構成要素

###プロセッサ
・CPUのこと
・データや命令を処理するハードウェア

CPU⇨「制御」と「演算」の２つの機能を持ってる
「制御」データのある場所を探して、記憶し、演算に伝達する

###フラッシュメモリ
・電源を切ってもデータが消えない半導体メモリ
・ROM(Read Only Memory)に分類されるが書き換え可能
・USBメモリやSDカード


## システム構成要素
###システムの評価指数　稼働率

####直列接続
稼働率がR1，R2である2つの機器の両方が稼働していなければシステムが停止してしまう場合の稼働率
　R1×R2

####並列接続
稼働率がR1，R2である2つの機器の、少なくとも一方が稼働していればシステムとして稼働が継続する場合の稼働率
　1－(1－R1)(1－R2)

####CPUの平均使用率
各月の稼働時間を求める→各月の稼働時間を合計する
↓
稼働時間の合計からCPUの使用時間を引く
↓
CPUの使用時間　÷　稼働時間の合計


#####遊休時間
遊休時間の割合 = (1-使用率)



## セキュリティ

### 情報セキュリティ対策

####SMTP
・電子メールを転送するプロトコルで通信にTCP／25ポートを使用する


####ビヘイビア法
・ウイルスの実際の感染・発病動作を監視して検出する手法。
・感染・発病動作などの動作そのものの異常を検知するだけでなく、それを発端にして起こる環境の様々な変化を察知してウイルスを見出す。
    ・感染・発病動作
　　    →書込み動作、複製動作、破壊動作
####コンペア法
・検査対象と安全な場所に保管してある原本とを比較する。


## ストラテジ系

### システム企画

#### 要件定義
#####非機能要件
・機能要件以外の要件のこと
DockerでDenoを実行する

単純にDocker上でDenoを実行するだけなら、下記のコマンドで実行される。

```
$ docker run hayd/alpine-deno
```
でもそれだけだと、下記のように、denoが起動して終わりである。実行はできているが、屁理屈である。

```
Download https://deno.land/std/examples/welcome.ts
Warning Implicitly using latest version (0.68.0) for https://deno.land/std/examples/welcome.ts
Download https://deno.land/std@0.68.0/examples/welcome.ts
Check https://deno.land/std@0.68.0/examples/welcome.ts
Welcome to Deno 🦕
```

コマンドライン上でコードを書いて実行したい場合は下記でREPLが実行される。

```
$ docker run hayd/alpine-deno repl
```

一見これでよさそうだが、Dockerの中で標準入力を受け付けるだけで、Dockerの外で標準入力を受け付けてくれない。
そこで、下記のように`-t`オプションをつけて、自分の使っているコマンドライン上の標準入力を受け付ける。

```
$ docker run -t hayd/alpine-deno repl
```

これでいけそうであるが、下記のように怒られて、入力できそうなのにできない。

```
Deno 1.3.3
exit using ctrl+d or close()
WARN RS - rustyline:718 - cannot read initial cursor location
>
```

`-i`オプションで標準入力をアタッチしないといけないらしい。正直仕組みはよくわからない。

```
$ docker run -i -t hayd/alpine-deno repl
```

これで、`console.log`などが試せる。

```
Deno 1.3.3
exit using ctrl+d or close()
> console.log('hell word')
hell word
undefined
>
```

main.tsなどのファイルを実行したい場合は、Dockerfileを作ると便利。

```Dockerfile
FROM hayd/alpine-deno
WORKDIR /app
COPY . .
CMD [ "run", "--allow-net", "src/main.ts" ]
```

Dockerfileがあるフォルダの中で`src/main.ts`を作る。

```main.ts
import { serve } from "https://deno.land/std@0.68.0/http/server.ts";
const s = serve({ port: 8080 });
console.log("http://localhost:8080/");
for await (const req of s) {
  req.respond({ body: "<h1>Hell Word</h1>\n" });
}
```

Dockerfileがある場所で下記を実行する。

```
$ docker build -t deno .
```
`-t`で指定することでここではdenoという名前（タグ名）のイメージが作成される。
あとは下記のコマンドでmain.tsを実行できる。

```
$ docker run -p 8080:8080 deno
```

`-p`でDockerの中の8080番ポートを、自分が今使っているローカル環境の8080番ポートに紐づけることで、ローカル環境のブラウザで
http://localhost:8080/
からアクセスできるようになる。
複数のモデルが絡んだ検索条件の作り方

今回は、　itemsテーブルに保存された商品名(name)と商品説明(description)
と一緒に、tagsテーブルに保存されたタグ名（tag _name)の値の中からキーワード
検索ができる機能の実装を作成したい。
（itemsテーブルとtagsテーブルは多対多の関係で中間テーブルを用いてアソシエーションを組んでいる。）

1 itemモデルに自作のメソッドを作り、それぞれのテーブルからの検索条件を定義し変数に代入（@itemと@sescriptionと@tag）
2 空の配列を作成し変数に代入（@items)
3 eachメソッドにかけて一つの要素として取得し、配列に追加していく。（タグは、一つの商品が複数のタグを持ってることもあるので二重でeachかけてます。）
4 uniqメソッドで、重なる要素を削除します。（例：　「りんご」と検索したときに商品名である@itemと商品説明である@description両方に「りんご」というキーワードが入ってる場合、同じ商品が２つも配列@itemsの中に入ってしまっているため）
5最後に明示的に返り値を記述しデータをparamsに送信(@items)

```ruby:item.rb
def self.item_search(search)
    if search != ""
      @item = Item.where('name LIKE(?)', "%#{search}%")
      @description = Item.where('description LIKE(?)', "%#{search}%")
      @tag = Tag.where('tag_name LIKE(?)', "%#{search}%")
      @items = []
       @item.each do |i| 
         @items << i
       end
       @description.each do |d|
        @items << d
       end
      @tag.each do |t|
        t.items.each do |ta|
          @items << ta
        end
      end
      @items = @items.uniq
      return @items

    else
      return nil
    end
  end


end

```

６コントローラーで先ほどモデルで作成した「item_searchメソッド」を呼び出す。

```ruby:items-controller.rb
 def item_search
    @items = Item.item_search(params[:keyword])
  end
```

7 配列@itemsに入っている要素をeachメソッドを使って取り出す。


```ruby:item_search.html
<% @items.each do |i| %>
  <% =i.name%>
[割愛]
<% end %>
WPFでチャートを描くならScottPlotがおすすめ！

# WPFのフリーのチャートライブラリを調べたところ以下くらいしか見当たらず。
- [LiveCharts](https://lvcharts.net/)
- [OxyPlot](https://github.com/oxyplot/oxyplot)
- [ScottPlot](https://github.com/swharden/ScottPlot)

初めはLivechartsがきれいで良いかと思っていたのですが・・・

遅い！遅すぎる！

#５0万点の散布図を描いた時の描画時間比較（体感）
| ライブラリー | 描画時間 |
|:-:|:-:|
| LiveCharts  | 5~6秒  |
| OxyPlot  | 3~4秒  |
| ScottPlot  | 一瞬  |

ScottPlot最強〜。早すぎる。
APIドキュメントみたいなのはないけど、公式のサンプルプログラムとクックブックがかなり詳しいので、
それをみたら大概のことはできそうです。
というわけで、たくさん描画したい時はScottPlotを使いましょう。
SQL:大量のレコードを安全にdeleteしたい

# 背景と状況
他システムに情報を送る際、組み立てた通信伝文を一旦データベースのテーブルに保管してから送信、成功したらレコードに送信済みフラグを立てて完了というやり方をよくします。一定期間を過ぎるとこの送信テーブルのレコードは不要になりますが往々にして消されず残ったままになってることがあります。数年もするとテーブルスペースを圧迫したり、パフォーマンスが落ちる場合があるので古いレコードはdeleteしたいです。
# やりたいこと
送信テーブル(snd_tbl)のレコードを直近2ヶ月分を残してあとは削除したい。要はSQLでdeleteを大量のレコードにしたい。

```:snd_tbl
C:\>db2 select * from snd_tbl

SND_ID               SND_TIMESTAMP              SND_FLG SND_TEXT
-------------------- -------------------------- ------- -----------------
                   1 2017-09-04-18.53.51.992000 1       ddddd
                   2 2018-09-04-18.53.51.992000 1       eeeee
                   3 2019-09-04-18.53.51.992000 1       fffff
                   4 2020-07-01-18.53.51.992000 1       hhhhh
                   5 2020-08-05-18.53.51.992000 1       iiiii
                   6 2020-09-04-18.53.51.998000 0       jjjjj

  6 レコードが選択されました。

C:\>date /t
2020/09/04
```

※IBM Db2 V11.1 Windowsで確認していますが他のDBMSでもできるはずです。
# 制約条件

- テーブルは本番環境で常にアクセスされる
- 本番環境を止めずに作業を行う必要がある
- テーブル設計は変更できない

# 問題点
例は6レコードですが1日100件を送信したとして、5年だと18万2500レコードになります。これを単純に2ヶ月より前のレコードを削除しようとすると最悪の場合、システムが停止します。

```sql:単純に削除するSQL
delete from snd_tbl where date(SND_TIMESTAMP) < current date - 2 month ;
```

原因は大量レコードを1度に削除しようとすると、アクティブログがフルになったり、ロックエスカレーションによりテーブル全体がロックされて、アプリケーションがテーブルにアクセスできなくなるからです。これは更新の場合も同様です。
# 対策
where句で範囲を狭めて削除します。例ですと日ごとにレコードを削除します。

```sql:Where句で範囲を狭めたSQL
delete from snd_tbl where date(SND_TIMESTAMP) = '2017-09-04' ;
```

ただし、5年分もあるとSQLを手書きするのはつらいのでなんとかしたいと思います。
# SQLを作るSQL
送信テーブルのタイムスタンプ列に対してgroup byするSQLを実行してSQLを生成します。

```sql:make_delete_snd_tbl.sql
SELECT 'delete from snd_tbl where date(SND_TIMESTAMP) = ''' 
       || DATE(snd_timestamp) 
       || ''' ;' 
FROM   snd_tbl 
WHERE  DATE(snd_timestamp) < CURRENT DATE - 2 MONTH 
GROUP  BY DATE(snd_timestamp) 
ORDER  BY DATE(snd_timestamp) 
WITH UR; 
```

実行結果を標準出力に出して編集するか、Db2なら以下のコマンドできれいに出力されます。
`db2 -txf make_delete_snd_tbl.sql -z delete_snd_tbl.sql`
以下のSQLが生成されます。

```sql:delete_snd_tbl.sql
delete from snd_tbl where date(SND_TIMESTAMP) = '2017-09-04' ;
delete from snd_tbl where date(SND_TIMESTAMP) = '2018-09-04' ;
delete from snd_tbl where date(SND_TIMESTAMP) = '2019-09-04' ;
delete from snd_tbl where date(SND_TIMESTAMP) = '2020-07-01' ;
```

生成されたSQLを実行することで日ごとにレコードを削除します。

```:実行結果
C:\>db2 -tvf delete_snd_tbl
delete from snd_tbl where date(SND_TIMESTAMP) = '2017-09-04'
DB20000I  SQL コマンドが正常に完了しました。
delete from snd_tbl where date(SND_TIMESTAMP) = '2018-09-04'
DB20000I  SQL コマンドが正常に完了しました。
delete from snd_tbl where date(SND_TIMESTAMP) = '2019-09-04'
DB20000I  SQL コマンドが正常に完了しました。
delete from snd_tbl where date(SND_TIMESTAMP) = '2020-07-01'
DB20000I  SQL コマンドが正常に完了しました。
```

# まとめ
- 大量レコードを削除するときは範囲指定してSQLを複数に分けます
- group by を使ってSQLを生成します
- こんなSQLを流さなくて済むように定期的に自動削除するしくみを作りましょう
Linuxの漫画を読んでみて感想#1

## 感想

Linuxを実務で今まで一番使うようになりましたので、
Amazonで購入してKindleで読んでみました。
漫画なので、内容はあまり具体的に書かれてないかなと思いましたが、
結構実践的な内容が多くてとても良い本でした。
なかなかLinuxの漫画本は興味がある方は是非買ってもよいのではないでしょうか。

## 対象書
LPIC１の受験者
Linuxで基本操作を使用して実務をしたことがある方
※LPIC2、LPIC3の資格を取得された方には、難易度が低いかなと思います。

### 購入した本
まんがでわかるLinux シス管系女子
https://www.amazon.co.jp/dp/4822224961/ref=cm_sw_r_tw_dp_x_KHVuFbZTN3W63 

シリーズものになっているので、上記読んで他も読みたくなったら、いかかでしょうか。
Compatible side by side NDK version was not found.

[Tools] > [SDK Manager] >[SDK Tools] よりNDKにチェックを入れインストール。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700171/293f48b6-fb23-edd3-6bb4-fc4556c47e6e.png)

バージョンが異なっていたみたいなのでインストール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700171/12e03759-8656-0e15-5f70-97d7194ddede.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700171/f4086280-c99c-e358-b678-e3bec85027e0.png)
【AWS SOA】Systems Managerでインスタンスを起動させよう

#はじめに
現在AWS SOA試験対策のため、色々勉強しています。今回はSOAによく出るとされるSystems Managerを取り上げたいと思います。私はSAAはすでに合格しているのですが、SAAにはあまりこちらのサービスは登場しないため、他のサービスと比べて試験対策向けの記事が少ないです。ひとまずSystems Managerでインスタンスを起動させる所まで進めていきたいと思います。

#Systems managerとは？
AWSでインフラストラクチャを可視化し、制御するためのサービス。Systems Managerを使用すると、AWSリソース全体の運用タスクを自動化が可能。Amazon EC2インスタンス、Amazon S3バケット、Amazon RDSインスタンスなどのリソースをアプリケーションごとにグループ化し、運用データを表示できる。

#手順
##SSM Agentを開くため、EC2インスタンスの作成
AMIで「Amazon Linux 2 AMI」を選択。次のステップに進む。
![スクリーンショット 2020-09-05 10.25.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/42b6912c-07b3-5d65-5490-e91f32d540a6.png)
無料利用枠対象の「t2.micro」を選択。次のステップに進む。
![スクリーンショット 2020-09-05 10.29.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/56b7c8d2-f3aa-09c0-a524-4d58708369f4.png)
IAMロールの「新しいIAMロールの作成」を選択する。
![スクリーンショット 2020-09-05 10.31.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/be517901-1188-21a1-26dc-829466af676d.png)
新しいタブでIAMが表示されるので、ロールの作成を選択する。
![スクリーンショット 2020-09-05 10.34.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/c935f862-6a0e-f030-e2f8-d466244b7ce9.png)
EC2を選択して、次のステップを選択する。
![スクリーンショット 2020-09-05 10.37.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/b122b084-e5f5-7a30-62b6-5832170c5322.png)
SSMで検索して、AmazonEC2RoleforSSMを選択して、次のステップを選択する。
![スクリーンショット 2020-09-05 10.38.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/b7cdac89-9758-10ff-2a4f-11cf86d193fa.png)

ロール名に「AmazonEC2RoleForSSM」を入力して、ロールの作成を選択する。
![スクリーンショット 2020-09-05 10.42.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/7a6000cf-3624-0eec-a4dd-6a0a423fdcc2.png)
EC2作成画面に戻りIAMロールで先ほど作成した「AmazonEC2RoleForSSM」を選択する。
![スクリーンショット 2020-09-05 10.44.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/f959e3e4-a45f-fdf8-f666-edd80f0df2ac.png)

デフォルトのままで次のステップを選択する。
![スクリーンショット 2020-09-05 10.46.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/6225fc88-1f22-e3de-aebd-d1053942aed9.png)
タグの追加で何も入力せずに次のステップを選択する。
![スクリーンショット 2020-09-05 10.40.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/d9e1b939-9e2b-d2ca-f1f1-c1e9fde28e10.png)
新しいセキュリティグループを作成するでセキュリティグループ名と説明で「SSHManagedInstance」を入力する。確認と作成を押す。
![スクリーンショット 2020-09-05 10.51.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/3d907d7d-f561-92a3-0faf-51f28eb04a4b.png)
問題ないか確認し、起動を選択する。
![スクリーンショット 2020-09-05 10.53.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/cca6c2a4-dfe6-8706-c708-cd06a2ae6bb6.png)
インスタンスが起動できたことを確認して、Systems Manager>マネージドインスタンスのコンソールに行く。インスタンスができたことを確認する。
![スクリーンショット 2020-09-05 10.55.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/07daa33d-9978-a54c-1946-d00c5e5fcd72.png)



参考
https://www.udemy.com/share/101XFwCEoeeVZSQXo=/
https://aws.amazon.com/jp/systems-manager/
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/what-is-systems-manager.htmlEC2
AndroidStudio の設定しておくと少しだけ便利になること(超小ネタ)


## ワンクリックでファイルを開く
**Projectツリー上部の歯車 >**

* **Open Files with Single Click にチェック (AndroidStudio4系)**
* **Autoscroll to Source にチェック (AndroidStudio3系)**
![スクリーンショット 2020-09-05 10.31.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252462/9ce6736e-d8b9-d263-4eb1-d7a636a33392.png)




Projectツリー(左側に表示されるファイル一覧のツリー)のファイルを開くには2回クリックしないといけないですが、ワンクリックで開くようにできます。

Xcodeがそうですよね。
Xcodeで作業してて、AndroidStudioで作業するとワンクリックで開いたつもりになるやつ…よくやります。


## 開いたファイルをProjectツリーでも開く
**Projectツリー上部の歯車 >**

* **Always Select Opened File にチェック (AndroidStudio4系)**
* **Autoscroll from Source にチェック (AndroidStudio3系)**



#　まとめ
ほんと小ネタも小ネタでした。
他にもこれ設定しておくと作業効率上がるものあったら教えてください。
モダンWebフロント個人的学習ロードマップ #1 - React & JavaScript

# はじめに

今回は、フロントエンドエンジニアがほぼ必須で使うJavaScriptとReactのおすすめの学習ソースをご紹介します。今後の記事では、TypeScriptやGraphQL、環境周りやフロント設計についてもご紹介しようと思います

どの学習においても言えることですが、インプットしたらアウトプットすることが大事です。僕のおすすめはチームを組んで開発することです。Twitterなどで募集したら割と集まると思うので、是非やってみてください

設計、アーキテクチャ、フロントエンド、ブロックチェーンに興味ある方是非Twitter([@show_clements](https://twitter.com/show_clements))フォローしていただけると嬉しいです！

# 幅広く学ぶ JavaScript編

https://www.youtube.com/playlist?list=PLwM1-TnN_NN7-zdRV8YsGUB82VVhfYiWW

https://www.youtube.com/playlist?list=PLwM1-TnN_NN4SV6DEs4OtfA51Up6XzTfB

はじめてプログラミングを始める人にもわかり易く解説されていてイケメンです。元Yahooのフロントエンドエンジニアをされていたみたいです。

次の2つはどちらも量が多めですが基礎を学ぶにはかなり良い教材だと思うので是非やってみてください！既にJavaScriptを学んだことがある方は、目次をパラーっと見て自信がないところだけやるので十分だと思います。

https://jsprimer.net/intro/

https://ja.javascript.info/

# 集中的に学ぶ JavaScript編

DOMについて、もう一度しっかり学んでおきましょう

https://developer.mozilla.org/ja/docs/Web/API/Document_Object_Model/Introduction

ES5でECMAScriptは関数型プログラミングに適したメソッドを導入しました。[この記事](https://www.webprofessional.jp/filtering-and-chaining-in-functional-javascript/)でも書かれているように、関数型プログラミングはテストが書きやすく、簡潔に記述でき、再利用性が大きく高まります。Reactは関数型プログラミングを使いこなしているため、関数型に対する少しの意識があると深く理解することができると思います。ただ、知らなくても使うことはできます。

https://qiita.com/Anders/items/25e55051893b6eaa152c

https://www.webprofessional.jp/filtering-and-chaining-in-functional-javascript/

![jest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479095/89144822-3887-8c96-8699-1a1f57a36252.png)

この時点で深くテストを学ぶ必要は無いと思いますが、一回触れておくと良いでしょう。

https://qiita.com/jintz/items/61af86a12b53b24ef121

# 幅広く学ぶ React編

公式を読みながら、O'reillyのLerning Reactという書籍を読んでみるのが良いと思います。

https://ja.reactjs.org/tutorial/tutorial.html

https://ja.reactjs.org/docs/hello-world.html

https://ja.reactjs.org/docs/accessibility.html

https://www.amazon.co.jp/Learning-React-Patterns-Developing-English-ebook/dp/B08B489X8Q/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=modern+react&qid=1599266424&sr=8-1

# 集中的に学ぶ React編

Hooksやテストについてしっかり学んでおきましょう。

https://ja.reactjs.org/docs/hooks-intro.html

https://ja.reactjs.org/docs/testing.html

https://testing-library.com/docs/example-input-event

以下の3つは学習というよりこれらのライブラリを使うときに、ドキュメントを必要な部分だけ読むという感じになると思います。

https://styled-components.com/

https://reactrouter.com/web/guides/quick-start

https://redux.js.org/

僕は2020年からフロントエンド初めたのですが、その後入ったインターン先が嬉しいことにかなりモダンな技術を扱っている会社でReduxを使ったことがないのですが、必要な方はReduxも学んでおすすめします。必要になったら学ぼうと思っています。

# もっと成長するために

## アウトプット
実際にフロントエンドアプリケーションを開発してみてください。

- Twitterなどで共同開発するメンバーを募集して開発する
- インターンシップに参加して開発する
- 就職して実際に開発する

## イベントへの参加

connpassやMeetUpなどを使って探してみてください。良いイベントがたくさん開催されています。もくもく会などで交流を深めるのも良いと思います。

- [connpass](https://connpass.com/dashboard/)
- [MeetUp](https://www.meetup.com/ja-JP/)

# おわりに

僕もまだまだ勉強中なのでTwitterやコメントなどで色々教えて頂けると嬉しいです！
Twitter: [@show_clements](https://twitter.com/show_clements)