OmniAICreator/Qiita-1.07M huggingface dataset:
G検定合格しました！レポートです！

こんにちは。

本日 _JDLA Deep Learning for GENERAL 2020#1_ の結果が発表されましたね。

![G検定合格メール.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289506/5a5c7378-00f9-8d97-2ac5-f43097910f4e.png)


合格通知を以って私も合格者の立場から発信できるわけですが、早速実際に勉強して受験してわかったことについて書きます。

まずは勉強を始める前の私のレベルについて。次に、実際に取り組んだことについて。
最後に、合格するために必要だと思う事項と更にワンステップ先に行けると思うものについて自分の考えを書こうと思います。

### 勉強前の僕
- なんとなく知ってる単語はこんな感じ
   + 教師あり学習/教師なし学習
   + ランダムフォレスト等王道のアルゴリズム名（実装経験はなし
   + F値周り
   + 交差検証
- ゼロから作るDeep Learning１と２を斜め読み済み
- 数学Ⅲ・Cまでの知識（ウン年と昔の話ですが高校で理系進学コースだったので）

教師あり、教師なしあたりを知ってたおかげですっと理解できた項目は多かったと思います。

### 実際に読んだ本、した勉強
#### 事前に読んでいたもの

- ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装  
  去年読んだ。今度写経する。
- ゼロから作るDeep Learning ❷ ―自然言語処理編  
  去年読んだ。今度写経する。

#### 今回読んだもの

- 人工知能は人間を超えるか ディープラーニングの先にあるもの  
  5年前の本っていうのは少し気になりますが、GDLAの推薦書でもあったので読みました。5時間  
- 深層学習教科書 ディープラーニング G検定(ジェネラリスト) 公式テキスト  
  いわゆる白本。読んで、ノートにまとめて、暇なときに更に読んだ。25時間（ノートにじっくりまとめ過ぎた）  
- 徹底攻略 ディープラーニングG検定 ジェネラリスト問題集  
  いわゆる黒本。2週やった。解説が勉強になる。20時間  
- 深層学習 (機械学習プロフェッショナルシリーズ)  
  最近あまり見ないが一昔前よく進められてた本。数式の理解を諦め、サラッと読んだ。4時間  
- AI白書 2019  
  1周読んだ。
- Study-AIの模擬問題( http://study-ai.com/jdla/)  
  1回やった。3時間

あと機械学習図鑑も面白そうだから買いました。

参考程度に、黒本とStudyAIの模試の成績はこんな感じです。
![黒本成績.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289506/ec33366b-1955-49b9-a6a9-760e43a4a01b.png)


上記50時間超勉強して自己採点ですが199/214でした。  
事前のゼロからとかAI白書入れたら100時間くらいかもしれない...

### 合格するために  
　では、会社からとれと言われたとかそういったなんとしても合格はしなきゃいけない人はどうすれば良いのか。色々なサイトを見てみると"白本","黒本","StudyAI"で勉強して合格というレポートが多いです。  実際この3点セットを勉強したら合格できると思います。あと松尾先生の"人工知能は人間を超えるか"も入れて4点セットですね。

　白と黒にない問題が出た。使い物にならなかったというレビューも見られます。実際に初見の問題も出ます。しかし、選択肢を絞ることはできるし、解ける問題ももちろんあり、StudyAIの模試もやっておけば合格する力はつくと思います。

StudyAIの模試はかなり評判はいいですけど、解説が少なかったり、回答が選択肢になかったりクオリティーはなかなか残念です。無料でサービスを受けてるのに文句を言うのもあれですが、E資格のための有料講座等も用意してるのでそっちの講座のコンテンツは大丈夫なのか？と思ってしまうので、無料でこそ力を入れたコンテンツにしてほしいなと思います。

　最後に、合格ラインがはっきりしてないので合格できる保証はしません。

### 身につけるためには
　合格だけじゃなくてしっかり今後に活かせる力をつけたい場合は"ゼロから作る"を読むのが良いと思います。まさに名著です。"物理のエッセンス"くらい名著です。  
　AI白書は一番情報量が多いので根気がある人は取り組むといいでしょう。私は読んだけど正直情報量多すぎて挫折しました。

　あとは最新の情報をtwitterとかで調べておくと良いと思います。実際に取り組むときは最新技術使いたいですよね。

例えば、ReLUよりいい活性化関数が見つかっていたり、  
『ついに誕生！期待の新しい活性化関数「Mish」解説』  
[https://ai-scholar.tech/articles/treatise/mish-ai-374](https://ai-scholar.tech/articles/treatise/mish-ai-374)

Google翻訳を超える？翻訳サービスが独ベンチャーが公開した  
『「DeepL翻訳」が日本語対応、「自然な訳文」と話題に　独ベンチャーが開発』  
[https://www.itmedia.co.jp/news/articles/2003/23/news093.html](https://www.itmedia.co.jp/news/articles/2003/23/news093.html)

こういった記事はなかなか本を読むだけでは見つからなかったりします。  
AIの歴史系統は試験用の本で勉強して、技術の深い理解は"ゼロから～"で抑えて、最新情報をインターネットで学べば隙なしとおもいます。

### まとめ  
- 合格するだけなら白本・黒本・StudyAIの模試
- 深層学習の細かい技術まで理解したい人は"ゼロから"　これは名著

### 余談  
たまに紹介されてるのですが、AI将棋ソフトで初めて将棋の名人を倒した山本さんの著書
"人工知能はどのようにして 「名人」を超えたのか?"は結構面白いのでおすすめ

最後に、最近出たもう一冊のG検定用テキストちょっと気になる
SDRAMのお勉強

### SDRAMの種類
|種類      |プリフェッチ  |データレートの例|Bank数      |VDD                |
|----------|-------------|------------------|------------|-------------------|
|SDRAM     |なし         |133 MT/s/pin       |4 Bank      |3.3 V              |
|DDR SDRAM |2 プリフェッチ|400 MT/s/pin      |4 Bank      |2.5 V               |
|DDR2 SDRAM|4 プリフェッチ|800 MT/s/pin      |4 or 8 Bank|1.8 V <br>(DDR2L 1.5 V) |
|DDR3 SDRAM|8 プリフェッチ|1600 MT/s/pin      |8 Bank     |1.5 V <br>(DDR3L 1.35 V)|

### DDRとは
クロックの立上がり，立下がりでデータ読み書き.
SDRAMは，CLKの立ち上がりでデータ読み書きするが，
DDR SDRAM以降，データはDQSとともに送信され、読込み時はDQSのエッジ位置で、書込み時はDQSのセンターで取り込む．
バスクロックの2倍でデータをやり取りできる．
DQSはデータと一緒に伝送されるので，CLK基準でデータやり取りするより，タイミングマージンを確保しやすい．

### ワードとは
メモリチップのデータバス幅(x8, x16, ...)単位で1ワードと呼ぶ．
容量256Mbitのメモリチップなら，
x8:  256Mbit = 8 bit/ワード * 32M ワード
x16: 256Mbit = 16 bit/ワード * 16M ワード
...

### プリフェッチとは

- リードラッチに，データバス幅のプリフェッチ数倍のデータを読んでおき，データバスに出力．
- ライトFIFOに，データバス幅のプリフェッチ数倍のデータを詰めておき，メモリにまとめ書き．

DDR3のx16品なら，

- 8ワード(128bit)ラッチしておき，MUXで各ワード(16bit)を切り替えてDQに出力．
- DQから1ワード(16bit)ずつFIFOに詰めておき，8ワード(128bit)をまとめて書き込み．

メモリクロックのプリフェッチ数倍でデータをやり取りできる．
[Micron; tn4719_form_function_ddr2](https://www.micron.com/-/media/client/global/documents/products/technical-note/dram/tn4719_form_function_ddr2.pdf)

### データレートの例
データレート = [非DDR=1 or DDR=2] * バスクロック = [プリフェッチ数] * メモリクロック  

- SDRAM  
133 MT/s/pin = 133 MHz = 133 MHz
- DDR SDRAM  
400 MT/s/pin = 2*200 MHz = 4*100 Hz
- DDR3 SDRAM  
1600 MT/s/pin = 2*800 MHz = 8*200 MHz

※標準モジュールは64 bit幅のデータバスなので，
DDR3-1600標準モジュールのデータレートは，
1600 (MT/s/pin) * 64 (pin) / 8 (Byte/bit) = 12.8 (GB/s)

### BankとRowとColumn
[Micron; 256Mb SDRAMデータシート](https://www.micron.com/-/media/documents/products/data%20sheet/dram/256mb_sdr.pdf)
SDRAM 16Mb x16品を例にとると，

- BankセレクトBA[1:0] -> 2^2 = 4 Banks
- RowアドレスA[12:0] -> 2^13 = 8192 Rows
- ColumnアドレスA[8:0] -> 2^9 = 512 Columns

(Bank, Row, Column)の組み合わせで1つのワード(16bit)が選択されるから，
4 * 8192 * 512 * 16 = 2^28 = 256 Mbit

### 操作
Rowをアクティブ(1行まとめてメモリセルからラッチ)にして，
読み書きした後，プリチャージ(ラッチからメモリセルに書き戻し．DRAMは読み出すとデータ破壊される)する．

- READ  
(Bank, Row)選んでアクティブコマンド発行
→ [tRCD後，指定Rowの16 bit * 512 Columnsがセンスアンプで読まれラッチ(=「活性化」)]
→ Column選んでリードコマンド発行
→ [CASレイテンシ(CL)後のクロックから，指定Columnから順繰り※1に16 bitデータ出力]
→ プリチャージコマンド発行※2
→ [tRP後，プリチャージ完了]
  
- WRITE  
(Bank, Row)選んでアクティブコマンド発行
→ [tRCD後，指定Rowの16 bit * 512 Columnsがセンスアンプで読まれラッチ(=「活性化」)]
→ Column選んで，データ入れて，ライトコマンド発行
→ [クロック毎に順繰り※1に16 bitデータ入力，最後のデータからtWR待つ]
→ プリチャージコマンド発行※2
→ [tRP後，プリチャージ完了]

※1 シーケンシャル，インタリーブで順番のつけ方変わる
※2 リードorライトコマンド発行時，A10=H(オートプリチャージ有効)なら，プリチャージコマンド発行不要

### Command Rate(CR)
コマンド受付に何クロックかけるか．1T, 2T, ...が使われる．
「Column選んで，データ入れて，ライトコマンド発行」では，
1Tでは，コマンド信号入れた1CLK目で，アドレスバス，データバスを読み取り，コマンド受け付けるが，
2Tでは，コマンド信号入れてから2CLK目で，コマンド受け付ける．タイミングマージンが確保しやすい．

### Rank
データバスDQをいくつのメモリチップで共有するか．
シングルランクなら，メモリコントローラとメモリチップで1対1接続だが，
デュアルランクなら，1対2接続となる．#CSで有効とするメモリチップを選択してアクセスする．
無効にしたメモリチップに繋がるDQはスタブになるので，信号品質は劣化する．
MySQLへの接続、SQL文の実行

今日は、**MySQLへの接続**と**SQL文の実行**コマンドを紹介していきます！
ターミナルでコマンドを実行してみましょう＾＾

1. mysqlへ接続する

```
mysql -u root
```

ターミナルに以下のように表示されていれば、正常に接続できています

```
mysql>
```


2. データベース一覧を表示する

```
SHOW DATABASES;
```

**＊SQL文は必ず、終わりにセミコロンをつける必要があります！**
もし；(セミコロン)を忘れて入力してしまった場合は、以下のようになります

```
mysql> SHOW DATABASES
         -> 
```

セミコロンを忘れて実行すると、SQLがまだ続くとみなされてしまいます
こうなった場合は、セミコロンのみを入力してエンターキーを押すと、正常に実行されます＾＾

実行後は、これまで作ってきたデータベースが一覧になって表示されます！

```
mysql> SHOW DATABASEs;
+-------------------------------------+
| Database                            |
+-------------------------------------+
| information_schema                  |
| DataBaseDesignSample_development    |
| DataBaseDesignSample_test           |
| chat-space_development              |
| chat-space_test                     |
| comment-box_development             |
| comment-box_test                    |
| drill_app_development               |
| drill_app_test                      |
| effective_model_sample_development  |
| effective_model_sample_test         |
| exception_sample_development        |
| exception_sample_test               |
| exp-exam-pictweet_development       |
| exp-exam-pictweet_test              |
| exp-html-exam_development           |
| exp-html-exam_test                  |
| freemarket_sample_68a_development   |
| freemarket_sample_68a_test          |
| git-app_development                 |
| git-app_test                        |
| mini_sns_development                |
| mini_sns_test                       |
| mysql                               |
| our_blog_development                |
| our_blog_test                       |
| ourblog_exam1_development           |
| ourblog_exam1_test                  |
| ourblog_exam3_development           |
| ourblog_exam3_test                  |
| performance_schema                  |
| pictweet4_development               |
| pictweet4_test                      |
| pictweet_development                |
| pictweet_exam1_development          |
| pictweet_exam1_test                 |
| pictweet_exam2_development          |
| pictweet_exem_retest_development    |
| pictweet_exem_retest_test           |
| pictweet_test                       |
| pictweet_workshop_exam_development  |
| pictweet_workshop_exam_test         |
| practice-exam-pictweet2_development |
| practice-exam-pictweet2_test        |
| reverse-app_development             |
| reverse-app_test                    |
| search_pictweet_development         |
| search_pictweet_test                |
| sql_curriculum_development          |
| sql_curriculum_test                 |
| sqltest                             |
| test                                |
| todo_app_development                |
| todo_app_test                       |
| view_drill_development              |
| view_drill_test                     |
+-------------------------------------+
56 rows in set (0.03 sec)
```

これでどんなデータベースがあるのか確認することができましたね！
次回は、**データベースを作成する**ためのコマンドを紹介したいと思います＾＾
Nuxt.js で layout を(ページ読み込み後に)動的に変える

# やりたいこと


```js
layout(context) {
  return context.app.hogehoge? 'hogehoge': 'default'
}
```

page コンポーネントで layout を contextに応じて出し分けることはできるが
これが動くのはページ読み込み時のみ。。。

読み込みが終わったあとにレイアウトを変えたい！

# やり方
```js
$nuxt.setLayout('layoutName')
// もしくは
$root.setLayout('layoutName')
```
setLayoutの引数に文字列でレイアウトの名前を渡して実行します

## 使い方サンプル
自分はbreakpointに応じてレイアウト変えたりするのに使いました↓

```js

watch: {
  // width に応じて xs ~ xl までの文字列が返ってくる
  // watch しやすかったのでこれを使用した
  // watch 対象は width でもなんでも良い
  '$vuetify.breakpoint.name'(breakpoint) {
     // xs の時だけ mobile レイアウトにしたい
     const layoutName = this.$vuetify.breakpoint.xsOnly ? 'mobile': 'default'
     this.$nuxt.setLayout(layoutName)
  }
}
```

# あとがき

やりそうなのに公式ドキュメントのlayout解説してる部分になかったのでシェア

NuxtChildからlayout変えようとしてハマったこともあります
Layout便利！これもできないかな？って思うとハマる部分だと思います・・・
[漏洞通告]Apache Shiro权限绕过漏洞

### 漏洞描述
近日,亚信安全网络攻防实验室监测到`Apache Shiro`官方发布安全更新,修复了一个权限绕过漏洞.攻击者利用该漏洞可以绕过验证访问到后台功能.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/9c4253f2-ab8f-1c9d-b921-556bda0e3301.png)

### 漏洞编号
暂无

### 漏洞威胁等级
高危

### 受影响范围
Apache Shiro < 1.5.2

### 修复建议
更新到最新版本

### 时间轴
[0] 2020/03/26 亚信安全网络攻防实验室发布漏洞通告

### Reference
https://seclists.org/oss-sec/2020/q1/120
https://github.com/apache/shiro/releases
[漏洞通告]jackson-2662/2664/2666/jackson-databind JNDI注入导致远程代码执行

### 漏洞描述
近日,亚信安全网络攻防实验室跟踪到jackson-databind更新了4个jndi注入的黑名单类.如果在项目包中存在该类的jar包且JDK版本满足注入版本,则可以使用JNDI注入的方式导致远程代码执行.类名如下:

```
org.aoju.bus.proxy.provider.RmiProvider
org.aoju.bus.proxy.provider.remoting.RmiProvider
org.apache.activemq.jms.pool.XaPooledConnectionFactory
org.apache.commons.proxy.provider.remoting.RmiProvider
```

### 漏洞编号
Jackson内部编号2662
Jackson内部编号2664
Jackson内部编号2666

### 漏洞威胁等级
中危

### 不受影响范围
jackson-databind > 2.11.0.rc1

### 漏洞验证
使用jackson-databind 2.11.0.rc1验证
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/778605d6-768b-5a1a-70a7-e599d2415290.png)
老邻居fastjson 1.2.67(最新版)版本在开启autotype的情况下受影响
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/2f4bd68e-b619-1c93-89af-a9c9699257f6.png)

### 修复建议
1.更新到最新版本
2.使用高版本JDK

### 时间轴
[0] 2020/03/26 FasterXML官方修复该漏洞
[1] 2020/03/26 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告

### Reference
https://github.com/FasterXML/jackson-databind/issues/2662
https://github.com/FasterXML/jackson-databind/issues/2664
https://github.com/FasterXML/jackson-databind/issues/2666
テスト中にエラーが発生

こんなエラーが発生
vendorのadobeFontMetrics.phpの中でこれがダメだと

```
$tree = $kern["tree"];
```

結果的にlaravelのvendorのエラーだったぽい。
上記を削除して、下記を追加すれば良い。


```
$tree = is_array($kern) ? $kern["tree"] : null;
```

参考↓
https://github.com/PhenX/php-font-lib/pull/76/files
Vue.js+Vuetify.jsを使ったWEBアプリケーション構築 ～サンプルアプリケーションの構成～

# はじめに
前回投稿した記事「[Vue.js+Vuetify.jsを使ったWEBアプリケーション構築](https://qiita.com/pmtech-masayuki-miyata/items/e884eb3c7608cc266226)」で、Vueのサンプルアプリケーションを触ってみて頂いたと思いますので、今回はこのサンプルアプリケーションの構成について説明したいと思います。
今回の記事でサンプルアプリケーションを参考にすればVueで独自のアプリケーションを構築できそうというイメージを持って頂けたら幸いです。

# アプリケーションの全体図
サンプルアプリケーションは、Vueの単一ファイルコンポーネントの機能を使って構築しています。
全体図としてコンポーネント図を描いてみました。
※アプリケーションの主要なコンポーネントだけ記載しています。
![画面コンポーネント図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517349/f78f5aed-fd59-fcaa-d53b-e8fe56096f03.png)



# 説明
上記の「アプリケーションの全体図」を基に説明します。
各コンポーネントに色がついていますが、それぞれの役割は以下の通りです。

| コンポーネントの色 | 役割 |
|:-----------|:------------|
|緑|SPA（シングルページアプリケーション）の根幹部分|
|白|各種外部ライブラリの設定|
|青|画面
|黄色|画面部品（画面の構成要素）|
|グレー|基礎部品（共通的に利用できる部品）|

## 緑のコンポーネント
緑のコンポーネントがSPAの根幹部分で「index.html」から「main.js」を読み込み「App.vue」で画面を作成します。シングルページなので、ブラウザからアクセスされるのは「index.html」のみです。
では、どのようにして画面を切り替えているのか？
Vue Routerの出番です。Vue Routerについては以下の「白のコンポーネント」で説明します。

## 白のコンポーネント
画面の切り替えを行うにはVue Routerを使ってURLと画面の紐付けを行います。サンプルアプリケーションでは「router.js」で行っています。
**例）「/【表示言語】/ichiran」というURLは「Ichiran」というコンポーネントを表示**

```javascript:router.js
// ・・・
import Ichiran from './components/screen/Ichiran';
// ・・・

let routes = [
//　・・・
// PATH_PREFIXにはjaやenなどの表示言語が入る。
  {
    path: PATH_PREFIX + '/ichiran',
    name: 'ichiran',
    component: Ichiran
  },
//  ・・・
];
```

このように白のコンポーネントは外部ライブラリの設定など、アプリケーション全体の動作を定義するコンポーネントとなっています。

各コンポーネントと外部ライブラリの対応は以下の通りです。Vueを全く知らない人向けに外部ライブラリの超概要も記載しておきます。

| コンポーネント | 外部ライブラリ名 | 超概要 |
|:-----------|:------------|:------------|
|axiosObj.js|Axios|非同期のHTTP通信|
|i18n.js|Vue I18n|多言語対応|
|router.js|Vue Router|画面遷移|
|store/index.js|Vuex|アプリケーション内のデータ共有|
|vee-validate.js|VeeValidate|入力値検証|
|vuetify.js|Vuetify|マテリアルデザインを取り入れた単一ファイルコンポーネントやCSSなど|

## 青、黄色、グレーのコンポーネント
青、黄色、グレーのコンポーネントはいずれもVueの単一ファイルコンポーネントで、画面を構成するコンポーネントです。コンポーネントの情報整理として、それぞれ画面（青）、画面部品（黄色）、基礎部品（グレー）というグループに分けました。
サンプルアプリケーションでは以下のルールを設けています。

- 青のコンポーネントは画面として公開するため、Vue RouterでURLを割り当てます。
- 青のコンポーネントは必ずBaseLayoutを利用します。
- 黄色のコンポーネントは青のコンポーネントから参照されます。
- グレーのコンポーネントはどのコンポーネントからも利用できるものとします。

サンプルアプリケーションの一覧画面を例に各コンポーネントの関係性を表すと以下のようになります。
![画面レイアウト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517349/5f2f5ae5-1c45-392e-aa40-d4488c84790c.png)


また、各画面の実装でVuetifyを利用することで、独自のCSSはほとんど定義せずにリッチな画面を作成できることが、ソースコードを見て頂ければわかっていただけると思います。

# おわりに
全体的な動作を変えなくて良いのであれば、サンプルアプリケーションをベースに青（画面）と黄色（画面部品）のコンポーネントを独自に作成するだけで、アプリケーションは容易に作成できると思います。（URLの紐づけは必要になりますが。）
サンプルアプリケーションは、ビルドの設定や単体テストの設定なども行っています。これからVueでアプリケーションの構築を考えている方の参考になれば幸いです。
[漏洞通告]CVE-2020-7961/Liferay Portal JSON Web Service存在未授权反序列化远程代码执行漏洞

### 漏洞描述
近日,`Code White`公开了在`Liferay Portal`中发现的JSON反序列化高危漏洞,未授权的攻击者可以通过精心构造的恶意数据对API接口发起远程代码执行的攻击.
Liferay是一个开源的Portal产品,提供对多个独立系统的内容集成,为企业信息、流程等的整合提供了一套完整的解决方案,和其他商业产品相比,Liferay有着很多优良的特性,而且免费,在全球都有较多用户.

### 漏洞编号
CVE-2020-7961
LPS-88051/LPE-165981

### 漏洞威胁等级
高危

### 影响范围
Liferay Portal 6.1.X
Liferay Portal 6.2.X
Liferay Portal 7.0.X
Liferay Portal 7.1.X
Liferay Portal 7.2.X

### 漏洞验证
漏洞回显效果如下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/36387def-04f3-7598-0c0f-a39cf289ea15.png)


### 修复建议
升级到最新版本

### 时间轴
[0] 2020/03/20 CodeWhite公开漏洞细节
[1] 2020/03/26 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告

### Reference
https://codewhitesec.blogspot.com/2020/03/liferay-portal-json-vulns.html
https://portal.liferay.dev/learn/security/known-vulnerabilities/-/asset_publisher/HbL5mxmVrnXW/content/id/117954271
Python、辞書型についてメモ

#python辞書型についてメモ

```py
dic = {"みかん":2,"りんご":10,"いちご":2}
```

keyを取り出す

```py
dic.keys()
```

```py
dict_keys(['みかん', 'りんご', 'いちご', 'メロン'])
```

値を取り出す

```py
dic.values()
```

```py
dict_values([2, 10, 2, 44])
```

キーと値の両方を取り出す

```py
dic.items()
```

```py
dict_items([('みかん', 2), ('りんご', 10), ('いちご', 2), ('メロン', 44)])
```

for文でキーと値の両方を取り出す

```py
for i,k in dic.items():
    print(i,k)
```

```
みかん 2
りんご 10
いちご 2
メロン 44
```

新たなキーと値を追加する。

```py
dic['ぶどう'] = 10
dic.items()
```

```py
dict_items([('みかん', 2), ('りんご', 10), ('いちご', 2), ('メロン', 44), ('ぶどう', 10)])
```
WebサイトをHerokuでデプロイしようとしたら、エラーで躓いた話。

###はじめに
制作したWebサイトを取り敢えずHerokuにあげて確認してみたかったのでデプロイしようとしたのですが、
エラーにかなり悩まされたので、同じところで詰まっている方の手助けになれば幸いです。

#WebサイトをHerokuでデプロイ
GitHubでコード管理を行っていたので
HerokuとGitHubを連携してHerokuサイトからデプロイしようとしていたところ、

<img width="846" alt="スクリーンショット 2020-03-26 9.49.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/1d3a45f8-e861-03d1-3975-9cafbf896475.png">

上記画像のようなエラーが出てしまいました。

#エラーの原因
調べてみたところ、
今回エラーが発生したざっくりとした理由としては
**HTMLベースのサイトだとHerokuがアプリとして認識してくれない為でした。**

〜〜〜〜〜〜〜〜〜〜〜〜
以下少し詳しく解説します。

まずエラーで何を言われているのかというと、

```No default language could be detected for this app.
このアプリではデフォルトの言語を検出できませんでした。```

```HINT: This occurs when Heroku cannot detect the buildpack to use for this application automatically.
ヒント： これは、Herokuがこのアプリケーションで使用するビルドパックを自動的に検出できない場合に発生します。```

とのことです。

ビルドパックは使用するプログラミング言語(PHPやRuby等)に応じて、
実行する前にデプロイされたコードを変換する役割を果たします。
これらのビルドパックは、使用言語に基づいてデプロイされたリポジトリ内で検索されます。
しかし、HTML、CSS、JavaScriptでは検出されません。その為このようなエラーが出たということです。

#解決策

```php:index.php
<?php header('Location: /index.html'); ?>
```
上記画像のように
index.phpファイルを作り、中のコードも同じように記述することで解決しました。
<img width="825" alt="スクリーンショット 2020-03-26 12.03.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/f302aefa-34fb-6188-4fb2-b7c30cec9208.png">

↑デプロイ完了後のHeroku画面

〜〜〜〜〜〜〜〜
以下解説します。

今回なぜPHPファイルを作成したのかというと、
WebサイトをPHPアプリとして認識させる為です。

index.phpファイル内の
header関数は、
HTTPヘッダを送信する機能を持っています。

header関数では、
Locationの後ろに
飛び先のファイル名やURLを記述することで
その記述した場所へ移動することが出来ます。

今回はindex.htmlのページに飛ばしたかったので
上記のように記述しました。

#まとめ
話をまとめると

今回のエラーの原因は、
**HTMLベースのサイトの為アプリ認識してくれなかったこと。**
解決策は、
**phpファイルを作りアプリ認識してもらえるようにすること。**

最後に、
参考にさせていただいたサイトのURLを下記に紹介します。

[Herokuを使って簡単にウェブページをインターネットで公開する方法]
https://qiita.com/reoring/items/bca12aaa5f94b190a488

[単純なHTML/CSS/JSをHerokuにデプロイする時つまずいたこと]
https://qiita.com/hozukikancho/items/b8d475e67a147cd54453

[How to Run a Simple HTML/CSS/Javascript Application on Heroku]
https://medium.com/@winnieliang/how-to-run-a-simple-html-css-javascript-application-on-heroku-4e664c541b0b

[PHPのheader関数でリダイレクト処理を行う方法【初心者向け】]
https://techacademy.jp/magazine/11609

以上です。
最後までご覧くださり、ありがとうございました。
ウェビナー実施時に利用するツールについて

# ウェビナー実施時に利用するツールについて

本資料にて、ウェビナー実施時に利用するツールの環境構築・利用方法を記載します。



## 想定環境について

ノートPCを作業領域として用いて、サブディスプレイとする液晶ペンタブレットを画面共有する環境を構築します。
発表中に補足をおこなう場合を想定して、資料を液晶ペンタブレット上で手書きで加筆できるようにします。また、雑音低減を目的としてマイクとオーディオインターフェースにより集音をおこないます。

![image-20200325083922628.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f14a3393-43bc-e642-09fb-3e1dab3b2116.png)






## 利用するツールについて

| 利用ツール                   | 役割                                       | ソフトウェア・機器                                     | 関連記事                                                     |
| ---------------------------- | ------------------------------------------ | ------------------------------------------------------ | ------------------------------------------------------------ |
| 液晶ペンタブレット           | 説明時に物理的にメモを記載するための機器   | Huion Kamvas GT-191 V2                                 | [液晶ペンタブレットにおける利用環境構築](https://qiita.com/ryoma-nagata/items/0b803935b6f6a4f3b875) |
| デスクトップ画面メモ記載機能 | デスクトップ画面にメモを記載するための機器 | gInk（無料）  <br />Epic Pen（有料）                   | [デスクトップ画面メモ記載機能における利用環境構築](https://qiita.com/ryoma-nagata/items/db03f96aae2ff26afbe8) |
| 音声録音ツール               | 音声を収集し録音するツール                 | マイクとオーディオインターフェース（Yamaha Steinberg） | [音声録音ツールにおける利用環境構築](https://qiita.com/ryoma-nagata/items/f6e19c05ba67a7a08c09) |
| デスクトップ録画共有機能     | 操作画面・音声を録画するツール             | Bandicam（有料）<br />Microsoft Teams（有料）          | [デスクトップ録画機能における利用環境構築](https://qiita.com/ryoma-nagata/items/2aa09396a04f737c17a0) |
xdotoolで自動ページ送り（左矢印繰り返し）

# 概要
ハンズフリーに書籍を読むためのコマンドを見出したので置いときますね。

# 環境
Ubuntu 18.04

# コマンド
左矢印キーを100回、20秒感覚で打つコマンドです。

```
xdotool key --repeat 100 --repeat-delay 20000 Left
```

実行後、Alt+Tabで書籍ブラウザなどに移れば自動でページが流れます。
【JavaScript】numberのビットを見る【IEEE754】

#はじめに
JavaScriptの数値がどのようにビットが立っているか知りたくなりました。
そこでFloat64Arrayをを使って表示してみました。
<a href="https://tools.m-bsys.com/calculators/ieee754.php">こちらの浮動小数点シミュレーター</a>で比較したり、toString(2)で比較して一致しているのを確認しているので、numberでもメモリ上はFloat64Arrayと同じなのかな？って思っています。

#IEEE754について簡単に説明

IEEE754の64bitは以下のようになっております。
符号部(1bit) | 指数部(11bit) | 仮数部(52bit)
仮数部は先頭の1を省略するので、実質53bitです。
詳しくはググってください。 
<a href="https://dangerous-animal141.hatenablog.com/entry/2014/05/10/000000">ここ</a>が分かりやすいと思います。

#プログラム
```js
const float64 = new Float64Array(1);
float64[0] = 0.1; // ここで値を変更してください。
console.log(float64[0]);
const uint8 = new Uint8Array(float64.buffer);
const str = uint8.reduce((p, c) => ('00000000' + c.toString(2)).slice(-8) + p, '');
console.log(str);
```

#プログラム実行して比較
0.1と0.2でプログラムを実行して、
<a href="https://tools.m-bsys.com/calculators/ieee754.php">こちらの浮動小数点シミュレーター</a>で比較したり、toString(2)で比較してみます。

###0.1をプログラム実行

![01pg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/f94d882c-3bc3-aaa2-8ebd-0f15a5ce3746.png)

###0.1を浮動小数点シミュレーターで実行
一致しています。
![01pg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/7f3e6245-ace8-e482-e309-ef773dbf048f.png)

###0.1をtoString(2)
2番目の1から比較すると、仮数部が一致しています。
![01_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/6ce9edc8-d245-4ab2-29bc-85a1d3e2e493.png)


###0.2をプログラム実行
![02pg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/e903c0a3-fc4b-3cf8-a7cd-44d1a621426c.png)

###0.2を浮動小数点シミュレーターで実行
一致しています。
![02simu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/4d3182d2-2f98-a3a7-4bff-cf3378680cc0.png)

###0.2をtoString(2)
2番目の1から比較すると、仮数部が一致しています。
![02_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/ef5a9217-0ef9-ea17-e1e0-80266a904755.png)
初めてpygameでゲームを作ろうとしている人に参考になるサイトや学習手順まとめ

## 概要
初めてpygameでゲームを作ろうとしている人に参考になるサイトや学習手順をまとめてみました。

## 対象
森 巧尚さんの「Python１年生」（翔泳社）を一通り学んだ方

## 手順
### pygameのインストール
[Pythonでゲーム製作：pygameをインストールしよう](https://kaede-pgstudio.net/blog/2018/04/18/post-789/)

### pygameを動かす
#### 1. pygameのリファレンスを参考にする
これ以下の学習を進める上で何度もお世話になるだろうリファレンスを押さえておきます。学習を進めていて、どんなメソッドなのかを知りたかったり、自分で何かを付け加えたり、変更したりするためにはみる必要があります。最初は見なくてもいいですが、学習を進めていくと必要になってくると思います。※公式ページを見たのですが、現在は休止しているので、日本語の関連ページのみ載せておきました。

[Python用のゲームライブラリ「Pygame」のリファレンスを翻訳したページ](http://westplain.sakuraweb.com/translate/pygame/)

#### 2. 少しずつpygameに慣れていく
初めて学習を進める上では、大きなプログラムを作ろうとすると挫折の原因になったり、エラーの処理がわけ分からなくなったりします。ちょっとずつ慣れるためには以下のサイトが役に立つと思います。
また、動きを確かめるだけならコピーすることも良いですが、自分でゲームを作るためにはサイトを見ながら、ソースコードをそのまま打つことが良いでしょう。

[【Pygame入門】ゲームプログラミング【Python】](https://algorithm.joho.info/programming/python/pygame/?fbclid=IwAR2I6_Rn_-JBDeVTyuOInmQynq6FMoZM-IuiWnCxCTxOuLINY5Rc74iH8O4)

#### 3. ジャンルごとで参考になりそうなソースコードを探して動かす
pygameの使い方をだんだんと分かってきたら、自分が作りたいジャンルのゲームで参考になりそうなソースコードが載っているサイトを探します。以下には代表的なジャンルのゲームを載せておきましたが、無ければ自分で探してみてください。

[Pythonでゲーム作りますが何か？](http://aidiary.hatenablog.com/entry/20080507/1269694935)
インストールからゲーム作成まで、かなり細かく解説してあります。ブロック崩し／シューティング／RPGについて載せてあります。

[Pythonの学習とPygameを使ったミニアクションゲーム作成](https://kunisan.jp/kuni/guest_view.cgi?PAGE=1370)

[【Pygame】ブロック崩しの作り方（効果音付き）](https://algorithm.joho.info/programming/python/pygame-blockout/)

[砂漠シューティングゲーム（pygame）](https://woraise.com/2019/03/21/desert-shooting/)


### 自分のオリジナルのゲームを作る
最終的には、自分のオリジナルのゲームを作ることが目標だと思います。今までの知識や技術を生かしてぜひ頑張ってください！
ただ、オリジナルのゲームを作ろうとすると、分からないことがたくさん出てきます。その際は、様々な情報を調べつつ、分からない部分を質問すると良いでしょう。以下に質問サイトを載せておきました。それによって解決する部分もあれば、解決しない部分もあると思います。だけど、諦めずに進めていくと自分自身に大きな力を得ることができると思います。再度言います。頑張って！！
　
[teratail【テラテイル】](https://teratail.com/)
【完全初心者】Web系エンジニアを目指す ～LP模写に挑戦(随時更新)～ 


出産後は赤ちゃんの傍で
在宅Webプログラマーとして働きたいので
これからWeb系エンジニアになるための勉強を始めます
~~(出産まであと1ヵ月切ったけど…笑)~~

とりあえず、かなりご無沙汰であったHTML,CSSの復習からスタート！


###◆目標 
「LP案件」をバンバン取れるようになりたい。

###◆(2020.3.25) 力試しのために、手探りでやったこと
・Photoshop無料期間登録
・[Photoshopデータからコーディングする方法の動画記事](https://guuten.net/photoshop-coding/)を見る
**・HTML,CSSの基本知識がほぼぶっ飛んでることに気づき焦る**

###◆(2020.3.26) まずは環境構築から
・テキストエディタでHTML,CSSの動画を見ながら手を動かす
・作業効率化のために無償のVisualStudioCodeダウンロード
・[拡張機能などはこちら](https://qiita.com/C3REVE/items/273646ad028e98758e70)と
・[こちら](https://ics.media/entry/18544/)のサイトを参考にした
・VisualStudioCodeで動かしてデバッグしてみた
・GoogleCromeで模写参考サイトを覗く
・[模写参考に使用したサイトたち](https://isara.life/)
・GoogleCrome上で模写参考サイトの検証ページからデバッグしてみた
・**有能なおまとめがあったので、[こちら](https://qiita.com/Y_ASAMOTO/items/d5f33ecf5bfbb7f028a5)と、[こちらも](https://qiita.com/C3REVE/items/273646ad028e98758e70)参考にさせてもらった**

###◆(2020.3.27～3.28) ネット記事の無料の範囲でWebページの製作について調べた
・bodyタグ内の大まかな構造理解から組み立てスタート
・[こちらのサイト](https://www.webcreatorbox.com/tech/html-css-coding-steps)を参考にした

###◆(2020.3.29～1week)　気分を入れ替えるために、部屋改造・掃除に励んだweek(お勉強お休み)
そもそものHTML・CSSコーディングもだが、Webページの構成などで
作り方につまずいた。。。結構難しいかも～。。。！


###◆(2020.4.5～1week 本で手を動かす)
思い切って、googpe play booksでオンライン本購入
・**[HTML・CSSコーディングとWebページの作り方の本](https://www.amazon.co.jp/1%E5%86%8A%E3%81%A7%E3%81%99%E3%81%B9%E3%81%A6%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8FHTML-CSS%E3%81%A8Web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7-Mana/dp/4797398892/ref=pd_sbs_14_t_0/357-5939076-7521414?_encoding=UTF8&pd_rd_i=4797398892&pd_rd_r=b223f5bd-e863-4988-8b9a-aca0f7db0637&pd_rd_w=Pe66E&pd_rd_wg=F7xJg&pf_rd_p=12ccc166-d38a-46fc-ac62-0d9d20b0afd0&pf_rd_r=3VV3CSCW7093RFK2MX2D&psc=1&refRID=3VV3CSCW7093RFK2MX2D)を一周(約一週間)**
Webページの構成、作り方がとても詳しく載っていて、
手を動かしながら理解することができた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433296/50fe4b7d-4032-fa49-9df8-f0eef4262351.png)


###◆(2020.4.12～1week)ここから、やっとLP模写に入る

####一回目のLP模写に関する記事は[こちら](https://qiita.com/akari_n/items/6bc8d2bae38521529c81)####
Laravel7でのRoute Model Bindingの新機能を使ってみた

#Route Model Bindingとは
自分は暗黙の結合やルートモデル結合と良く言っています
今までのLaravelでのルートモデル結合では`id`を指定する感じでした
下記のような感じです

ルートでこのように定義して
```web.php
Route::get('/user/{user}', 'UserController@index');
```

コントローラーでこんな感じ

```UserController.php
public function index(User $user)
{
    //
}
```

これでブラウザから`/user/1`などど叩くとUserモデルのidが1のモデルと勝手に結合してくれるものでした
これかLaravel7では新しくid以外のものを指定してできるようになってました

ルートモデル結合について詳しくはこちらをご覧ください→[こちら](https://qiita.com/Kyu-Taro/items/07326cd2146d5cd1cb2b)

#id以外のフィールドを指定する
id以外のフィールドを指定してルートモデル結合するにはこんな感じで書きます

```web.php
Route::get('/user/{user:name}', 'UserController@index');
```
これで`/user/{任意の名前}`でURLを叩くことで
その`{任意の名前}`と一致するUserが結合して所得することができるようになっています

実際にサンプルを作ってみました

#サンプルを作成する
まずはモデル、コントローラー、シーダ、マイグレーションを作成します

```
$ php artisan make:model Person --all
```

次にコントローラーですがリソースコントローラーが作成されていますが今回は使わず
別でコントローラーを作成します

```
$ php artisan make:controller PersonController
```

シーダファイルを編集します

```PersonSeeder.php
<?php

use Illuminate\Database\Seeder;

class PersonSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $param = [
            'name' => '太郎'
        ];

        DB::table('people')->insert($param);

        $param = [
            'name' => '花子'
        ];

        DB::table('people')->insert($param);

        $param = [
            'name' => '次郎'
        ];

        DB::table('people')->insert($param);
    }
}
```

マイグレーションの編集をします

```create_people_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePeopleTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('people', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('people');
    }
}
```

マイグレーション実行とシーダの実行をします

```
$ php artisan migrate
```

```
$ php artisan db:seed
```

これでDBとダミーデータの用意ができました
次にbladeファイルを作成します

`resources`に`main`フォルダを作成して`index.blade.php`を作成してください
`index.blade.php`を下記のように編集しておきます

```index.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>ユーザー表示</title>
</head>
<body>
    {{ $person->name }}
</body>
</html>
```

`web.php`を編集します
下記を追加

```web.php
Route::get('/{person:name}', 'MainController@index');
```

コントローラーを変更します
`MainController.php`に下記のアクションを追加してください

```MainController.php
    public function index(Person $person)
    {
        return view('main.index', compact('person'));
    }
```

完了です

これでブラウザから`/太郎`としてみてください
ブラウザに`太郎`と表示されていると思います

今回はnameフィールドでバインドするように指定しているので
Personモデルに一致するnameをURLに指定してアクセスすると
一致したPersonの情報が所得できています

今までのように`id`のみでなく
ルート定義の際にあんなに簡単にフィールドを指定してルートモデル結合できるのは
とても便利ですね

色々な使い方ができるなと思いました
使い方考えながら遊んでみようと思います
[前編]人狼知能をDokcerで動かしたかった

# 0. はじめに

Dockerの知識がほぼ0の私が，思いつきで進めた内容の記録です．
この記事は前後編に分かれています．この記事は**前編**です．
後編は[コチラ](https://qiita.com/PaSeRi/private/6a0d62dc34f699a10fb8)

# 1. 人狼ゲーム

人狼ゲームとは，アメリカのゲームメーカ[Looney Labs](https://www.looneylabs.com/)が発売した「[Are you a Werewolf?](https://www.looneylabs.com/games/werewolf)(汝は人狼なりや?)」の通称，及びその派生ゲームの総称です．
一言で説明するなら，対話によって村の中に紛れ込んだ人狼を見つけ出していくゲームです．チェスや将棋などのような現在の状態に至るまでの全ての情報がわかるゲームを**完全情報ゲーム**というのに対し，人狼のようなゲームを**不完全情報ゲーム**といいます．

# 2. 人狼知能プロジェクト

>人狼知能プロジェクトは，こうした不完全情報ゲームである人狼ゲームを人工知能にプレイさせることを目的としたプロジェクトです．
（※[人狼知能で学ぶAIプログラミング](https://book.mynavi.jp/ec/products/detail/id=73009)より引用）

人狼知能プロジェクトの公式サイトは[コチラ](http://aiwolf.org/)から

同プロジェクトは，開発言語として***Java, Python, C#*** の3つを公式にサポートしており，これらの言語に対しては開発用のドキュメントやライブラリの提供をしています．

また，作成した人狼知能(以降，人狼知能プロジェクトと混同しないように**エージェント**と呼ぶ)を，ローカルで他のエージェントと戦わせたり，動作テストをするための環境として，人狼知能プラットフォームが提供されています．正確には，Javaでエージェントを作成する際のライブラリの一部として入っています．なお，説明の便宜上，人狼知能サーバと呼ばせていただきます．

# 3. 人狼知能サーバ

人狼知能サーバは

- aiwolf-client.jar
- aiwolf-common.jar
- aiwolf-server.jar
- aiwolf-viewer.jar
- jsonic-1.3.10.jar
- AutoStarter.ini
- SampleSetting.cfg

から成り立っています．下２つは設定ファイルなので，名前はこの限りではありません．ゲームに参加させるエージェントのクラスパスやファイルのフルパス・プラットフォームの設定などをAutoStarter.iniに，ゲームルールなどをSampleSetting.cfgに書き込みます．
その上で

```
java -cp aiwolf-server.jar:aiwolf-common.jar:aiwolf-client.jar:aiwolf-viewer.jar:jsonic-1.3.10.jar org.aiwolf.ui.bin.AutoStarter AutoStarter.ini
```

でゲームが実行されます．

なお，サーバに必要な環境は

- 適当なOSの乗ったPC・仮想マシン他
    - Javaのサーバとエージェント，Python・C#のエージェントのためOS依存はない
- Java8・Python3.6.5・.NetCore2.2がインストールされていること
    - 年に数回行われる公式大会のサーバにできるだけ似せた環境にする
    - Pythonに関しては，anaconda上に仮想環境を構築し，必要なパッケージ類もインストールしておく

といった感じです．

# 4. 言語の壁

公式にサポートされている言語であれば，どれを使うのも自由です．しかし，ローカルでゲームを実行するには人狼知能サーバのためにJavaが必要になります．自分が開発に使用した言語以外のエージェントを動かそうと思えば，その言語の導入が必要になります．Pythonに至ってはライブラリの導入も必要です．学習のために並列してサーバを実行したい場合もあるかもしれません．その度に，全言語対応させるのは手間であったりもします．

# 5. Dockerを使ってみよう

後編に続きます．
技術書典応援際に参加しています。

技術書典(WEB版)にて

・WebRTCでビデオ会議システムを作る方法
・ngrokの使用方法
・HEROKUへのホスティング

を解説した電子書籍を販売しております。

<img width="400" alt="表紙_FIT.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477820/cea413cf-a444-f499-8c5f-bd40a0ba9bcc.png">


初めての出版なので、至らぬ点も多々あるかと思いますがどうかよろしくお願い致します。


（追記）
どなたでも動かせるWebビデオ通話アプリのデモを作ってみました！
複数のタブ間で同じ部屋名を入れてJoinするとビデオ会話する様子をお試しいただけます。
http://bit.ly/2v61L8m

この技術書を一通り行うと、同様のWEBアプリが誰でも作れるようになります。
http://bit.ly/2TP6mEm

1000円・PayPal





#技術書展（応援祭）
Ubuntu 18.04 のメモ

雑多な忘備録。


### `sudo apt upgrade` が失敗する。

```console
$ sudo apt upgrade
E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
```

裏で何か回っているようで、しばらく（数分）待ってから実行すれば動いた。
ニューラルネットワーク


## 形式・人工ニューロン
人間の神経を模したもの。
>ある入力に対して必ず0か1を返すと仮定する。その判定基準のことを閾値を呼ぶ。よくθの記号が用いられる。入力xに対して重みと呼ばれる定数wをかけてたものと閾値を比べる。
`y = f(x)=wx-θ`>=0なら1、<0なら0を返す。

##単相パーセプトロン
>神経細胞が複数あるとして、入力が複数あるときを考える。
>2つの場合、`w_1 * x_1 + w_2 * x_2 - θ`が0以上のとき1を返す。0未満のとき0を返すようにする。入力が増えても同じようにできる。

# ニューラルネットワーク
>重みなどの値を人間が決めるのではなく機械で自動計算させたい。
>3層のデーターからなり、入力層と呼ばれる0層、中間層と呼ばれる1層、出力層と呼ばれる2層を作る。入力値に対して、中間層で計算し、出力層を推定し、誤差を求めて最適化していく。これを逆伝搬(バックプロパゲーション)という。

>単相パーセプトロンは1の時信号を出力する。脳の場合は電流が走る。これを発火するという。`w_1 * x_1 + w_2 * x_2 + θ`だけだと、0、1の範囲に収まらない可能性があるため、関数y = h(x)を用いて値を補正する。
`y = h(w_1 * x_1 + w_2 * x_2 + θ)`
>これが0以上のとき1を返し、0未満のとき1を返す。この関数h(x)のことを活性化関数という。活性化関数にはステップ関数、シグモイド関数、Reluなどが用いられる。
中まで全部775/664とか777/666とか755/644とか

`chmod` には便利な `-R` オプションがあります。`chmod -R 775 [dir]` とすると、[dir]の中にあるファイル・子ディレクトリ・その中のファイル・・・と全て `chmod 775` してくれます。
便利なのですが、ディレクトリとファイルは別のパーミッションにしたいのに全部775になって不便なので、そうならないようにするコマンドです。

#ディレクトリは775/ファイルは664
`chmod` が必要な状況として１番あるあるかと思います。
たとえばこういうディレクトリの状況だとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57626/a76c971e-27bf-50c7-30ce-3bf3f6c05261.png)
ディレクトリを775、ファイルを664にしたいときは、これを叩きます。

```775/664.chmod
chmod -R "=r,u+w,g+w,+X" [dir]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57626/8c5771e4-7adc-8541-613c-50f981124c3e.png)
**ディレクトリが775、ファイルが664**になりました。

#ディレクトリは777/ファイルは666
あんまりやる機会が無いかもしれませんが、引き継ぎの際に事故らないように取り敢えず・・・ということもあるかと思います。
777/666にするやり方はこうです。

```777/666.chmod
chmod -R "=r,u+w,g+w,o+w,+X" [dir]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57626/98c43932-7880-492c-53b5-67047dd79aa4.png)
**ディレクトリが777、ファイルが666**になりました。

#ディレクトリは755/ファイルは644
いわゆる普通の状態にしたいときです。

```755/644.chmod
chmod -R "=r,u+w,+X" [dir]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57626/f3cfdc48-dcb5-3875-93a2-fc0ae96a7709.png)
**ディレクトリが755、ファイルが644**になりました。

#備考
画像の`ls`コマンドは`exa`を使っています。 `l -T`は `exa -la -T` のエイリアスになっています。
カラフルな `ls` ができる `exa` コマンドの詳細はこちらの記事などをご覧ください。。

>ls よりも exa を使おう！モダンな Linux コマンド達を紹介 - Qiita
>https://qiita.com/navitime_tech/items/c249269a3b47666c784b
Flask 画像の送受信

# 概要

画像の送受信処理についての日本語の処理が少なかったので、まとめる。

# サンプルコード

ここでは、画像のエコーバックのサンプルコードを示します。

```python:送信／受信
@app.route("/echo_back", methods=['POST'])
def test():
    img_bin = io.BytesIO(request.data).getvalue() # 受信
    response = make_response(img_bin) # レスポンスに画像を設定
    response.headers.set('Content-Type', request.content_type) # ヘッダ設定
    
    return response
```

ポイントを以下に示します。
- 「request.data」の中に画像情報が格納されています。これをio.ByteIO型とすると、画像情報のみ取得できます。今回はエコーバックさせるので、getvalue()を用いてすぐにbytes型に変換しています。
- make_response()に画像情報を格納するとき、bytes型でないといけないようです。そのため、上記のようにgetvalue()にてbytes型としています。
- 最後に、headerに「Content-type」を設定しています。

途中に画像処理をする場合は適宜型を変換します。opencvであればnumpy配列でしょうかね。PILの場合はImage.open(io.BytesIO(request.data))みたいにすると良いんですかね。

# テスト方法

自分は「POST MAN」を使用しています。ここでは、「POST MAN」を利用した場合の設定について説明します。

- 通信は「POST」（今回はPOSTのみ許可しているので）
- Headerに「Content-Type」を追加し、画像ファイルのファイルフォーマットに合わせて「Value」を設定
- Bodyを「binary」に設定し、画像ファイルを選択

基本的には以上の設定としてください。これにより、送信したファイルがそのまま返信されることを確認できます。
scrollMagicを利用してアニメーション

scrollMagicを利用してアニメーションさせたけど、
CDNとかじゃなくてyarnでインストールしてimportした故にちょっとめんどくさかった話です。


## TweenMaxとscrollMagicを組み合わせて、指定した要素をアニメーションさせたい。
jsはwebpackでバンドルしているので、importする。
yarnを利用してscrollmagicを追加。

```
yarn add scrollmagic
yarn add gsap //これはTweenMax
```

scrollMagicを使いたい所に以下のように記述。
ついでにTweenMaxも入れておく。

```js
import scrollMagic from 'scrollmagic'
import {TweenMax} from 'gsap'

const controller = new ScrollMagic.Controller()
new ScrollMagic.Scene({
      triggerElement: tigger,
      triggerHook: hook
    })
     .setTween(TweenMax.from(
	// ～ここにアニメーション～
     ))
     .addTo(controller)

```
という風にしたがエラーが出た。

scrollMagicのissueなどを見て、その中にあるanimation.gsap.jsを使ってみたり（失敗）imports-loader入れてみたり（失敗）…
解決には至らずだった。

## なんとか解決（？）
他色々と記事を読んでいくうちに、最終的には↓で動くようになった。

```
yarn add scrollmagic-plugin-gsap
```


```js
import * as ScrollMagic from 'scrollmagic'
import { ScrollMagicPluginGsap } from 'scrollmagic-plugin-gsap'
import {TweenMax} from 'gsap'

ScrollMagicPluginGsap(ScrollMagic, TweenMax)

const controller = new ScrollMagic.Controller()
new ScrollMagic.Scene({
      triggerElement: tigger,
      triggerHook: hook
    })
     .setTween(TweenMax.from(
	// ～ここにアニメーション～
     ))
     .addTo(controller)

```

scrollMagicとTweenMaxを使ってアニメーションをしたいとき、
もしかするとまた引っ掛かるかもしれないので覚えメモ
***
### ★補足
scrollMagicの中にあるanimation.gsap.jsプラグインはES6モジュールとの互換性がないために、問題が結構発生しているらしい。
（参考元）
・scrollmagic-plugin-gsap
https://www.npmjs.com/package/scrollmagic-plugin-gsap

・scrollMagicのissue内
https://github.com/janpaepke/ScrollMagic/issues/842#issuecomment-573303518
【jQuery】（基礎）復習

jqueryについて理解が浅いので基礎から復習〜

#####JQuery導入
Google Hosted Libraries
https://developers.google.com/speed/libraries/#jquery

 jQuery 3.x snippet　から　以下をコピーして、htmlのheadに貼り付ける
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

```checkbox/index.html


<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
    <script src="./script.js"></script>
    <title>jQuery Checkbox Practice</title>
  </head>
  <body>
    <form>
      <h1>好きな果物を選んでね</h1>
      <div>
        <span>好きな数だけ選べます</span>
      </div>
      <label>
        <input type="checkbox" value="りんご">
        りんご
      </label>
      <label>
        <input type="checkbox" value="バナナ">
        バナナ
      </label>
      <label>
        <input type="checkbox" value="みかん">
        みかん
      </label>
      <div>
        <input type="submit" value="送信">
      </div>
    </form>
  </body>
</html>

```

#####HTML読み込み

javascript:

```javascript
window.addEventListener("load", function() {
  // 処理
});
```

jQuery:

```jQuery
$(function()  {
   // 処理
}
```


```checkbox/script.js
$(function(){
  // formが送信されたときにイベント発生
  $("form").on("submit", function(e){
    let output = '';
    // type属性にcheckboxがついているものを配列で取得
    let checkboxes = $(this).find('input[type="checkbox"]');
    // チェックボックスの各要素について
    checkboxes.each(function(i, checkbox){
      checkbox = $(checkboxes[i]);
      // プロパティ「check」を取得がついているものを取り出す
      if (checkbox.prop('checked')){
        // 配列outputに、値を入れていく
        output += checkbox.attr('value') + '\n';
      }
    });
    // console.log(checkboxes);
    // console.log("送信ボタンが押されました");
    e.preventDefault();
    alert('あなたが選んだ果物:\n' + output);
  });
});
```

#####preventDefault()
ブラウザのデフォルトアクションをキャンセルする。

#####find("セレクタ")
引数にセレクタを指定して、合致するセレクタを全て取得する。

#####prop('値')
引数に指定した値となっているか、状態をboolean型で返す。

#####attr('値')
引数の値がある場合は、値を返す。
F#のコンピューテーション式を理解するために

#F#のコンピューテーション式を理解するために・・・

なかなかF#のコンピューテーション式が理解できなかったので、いろいろ調べながら、いろいろと実験してみました。

この記事の中にあったプログラムを参考にさせて頂きました。
勉強になりました。ありがとうございます。
[F# と遊ぼう！ パイプライン・シーケンス・コンピュテーション式](https://qiita.com/dsudo/items/39867b9d0df896fb2701)

##実行順序

実行順序を調べるために、上の記事にあるプログラムを以下のように変えて実行結果を見ました。

```FSharp:Program.fs
type ScriptBuilder() =
    member this.Bind(p, rest) =
        printf "Bindから\n"
        rest p

    member this.Delay(f) =
        printf "Delayから\n"
        fun (s) ->  printfn "%s" s
                    f()

    member this.Return(x) =
        printf "Returnから\n"
        x + 4

[<EntryPoint>]
let main argv =
    //printfn "%A" argv
    let script = new ScriptBuilder()
    printf "exp束縛前\n"
    let exp = script {
        printf "expから\n"
        let x = 3
        let! y = 4
        return x + y
        }
    printf "exp束縛後\n"

    printf "exp実行前\n"
    let i=exp("Delay関数のラムダから");
    printf "exp実行後\n"

    printfn "%d" i

    0
```

実行結果は

```
exp束縛前
Delayから
exp束縛後
exp実行前
Delay関数のラムダから
expから
Bindから
Returnから
exp実行後
11
```

次に`exp`に引数を渡せるようにすると、実行順序が変わりました。
`main`関数のみ載せます。

```FSharp:Program.fs
[<EntryPoint>]
let main argv =
    //printfn "%A" argv
    let script = new ScriptBuilder()
    printf "exp束縛前\n"
    let exp a = script {
        printf "expから\n"
        let x = 3
        let! y = 4
        return x + y + a
        }
    printf "exp束縛後\n"

    printf "exp実行前\n"
    let i=exp 5 ("Delay関数のラムダから");
    printf "exp実行後\n"

    printfn "%d" i

    0
```

実行結果は以下の通りです。

```
exp束縛前
exp束縛後
exp実行前
Delayから
Delay関数のラムダから
expから
Bindから
Returnから
exp実行後
16
```

`exp`を実行時に`Delay`が呼び出されています。

###なぜ実行順が変わったのか？

なぜ実行順が変わったのか？と考えていると、「関数型の未知の世界」を見ているような気がしました・・・。とてつもない機能を見たような・・・そんな感覚・・・

しかし、いろいろ考えて見たら、ごく当たり前のことなのかもしれません。
確信はできませんが、
`exp a`と、引数が加わったことにより、`exp束縛前`と`exp束縛後`の間ではコンピュテーション式そのものが束縛されたわけではないからだと思います。
まず、`exp 5`が実行され、そのときに初めてコンピューテーション式が表に出てきて（`Delay`関数実行）、その結果返された関数の引数に`("Delay関数のラムダから")`を渡している。

多分・・・

##とにかく分からないところがあれば、簡単なプログラムを作って試す

結局、このコンピューテーション式はどう記述すればよいかは分かっても、何に使えばいいのかはよく分かりませんでした。
今後も、さらに、調査（学習）を続けます！
【UE4】連続で同じアニメーションを再生させる方法 アニメーションモンタージュ【UnrealEngine】

アニメーションブループリントで別のステートに出ない限り同じアニメーションを連続で再生させる方法が見つからなかったのでアニメーション、モンタージュという機能を使用し連続で同じアニメーションを指定した時間から生成させる方法を紹介します
(攻撃が多段ヒットした時のダメージモーションなどを表現したい)

ただ事前にアニメーションブループリントの扱い方をある程度一通り触れるほどの知識が必要です。

実装手順
-------------------

1.アニメーションモンタージュを作る
-------------------
![AnimationMontage.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/a962625c-ba66-5a06-e885-5ba3ec9bf04c.gif)



2.再生を開始する位置、セクションを作る
-------------------
![AnimationMontage2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/9580a18c-2f34-de7d-d1e9-09c3de11a794.gif)
アニメーションモンタージュのウィンドウで再生させるアニメーションにセクションを追加します
#####セクションはモンタージュの再生を始める際に開始する再生位置を指定することが出来る機能です。

3.スロットアニメーションを設定
----------------------------
![montage.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/7fd50eff-ea61-f7df-f701-b34f740f9c84.png)
#####スロットアニメーションは複数のアニメーションをブレンドして再生する機能です。
#####アニメーションモンタージュの再生はスロットアニメーションとしてアニメーションブループリントで呼ぶ必要があるので先に設定しておきます。


4.アニメーションブループリントに適応したスロットを挟む
------------------------
![montage2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/96c7f21f-8406-1b5b-b72c-e8f60f3721f4.png)


5.最後に作ったアニメーションモンタージュを再生させる関数を呼ぶ
------------------------
![montage3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/25b87937-d568-e466-53f9-555cd96e061f.png)

######StartingSectionの項目が先ほど作ったセレクションの名前を入力するとそこから再生されます。

アニメーションブループリントを所有しているキャラのTickで一定間隔でモンタージュを再生する関数を呼んでみました。


結果
----
![Damage.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/f86fbb71-a767-e578-853c-e58b5eeaefb6.gif)

モーションが連続で再生されています。

後は全ステートでスロットを使用するのではなく個別のステートにスロットを使ったり、攻撃したタイミングでモンタージュを呼ぶなどすれば面白いことが出来そうです。

-----------------------------------

参考にしたサイト　http://unrealengine.hatenablog.com/entry/2015/02/19/210749
【21卒就活】福岡オンライン合同説明会に参加してきました！ #福岡オンライン合説

先日開催された #福岡オンライン合同説明会 に参加してきましたのでそのレポートをお送りします。
僕自身、初めての合同説明会でした。

# 自己紹介
まず自己紹介。
- 北九州出身
- T筑高校卒業後、上京
- 東京在住
- 物理学科所属
- 21卒としてエンジニアを目指して就活中
- 福岡で就職をしたいと思っています

こんな僕がお送りします。

# 福岡オンライン合同説明会とは？
> 新型コロナウイルスの影響で、３月開催予定だった新卒対象の合同企業説明会は、 福岡県でも軒並み中止となっていることを受け、急遽、福岡の人事コミュニティFukuokaHRとして、 福岡で働ける企業を対象にした、企業・学生ともに参加無料のオンライン合同説明会を企画しました！ 是非、福岡の学生だけなく、全国の学生に福岡の魅力的な企業を見て頂ければと思います！(HPより引用)

FukuokaHRのジョニーさん(@jony_fj)が、企画して数日のうちに実現したようです。

# 感想・良かった点
最初に、**参加してめちゃくちゃ良かったです！**

 1. 移動せずに会社説明・質疑ができる（お金がかからない）
 これが一番大きかったです。
僕の場合、東京に住んでいて実家が北九州にあるので「東京⇄北九州⇄福岡」という移動が必要になります。
飛行機代はもちろん、「北九州⇄福岡」の移動も¥3000ほどかかってしまいます。それが発生しないのはありがたかったです。
また、本来現地に行かなければ聞くことができなかった会社説明を遠隔地でも聞くことができたのでよかったです。
 
 2. 質問が気軽にできる
ひとつの会社に20分割り当てられていて、前半が会社説明、後半が質疑応答という形で進行していきました。
質疑に関して、zoomのチャットを通して気軽にできたのでとても質問しやすかったです。
僕は本名で参加していましたが、匿名OKなど名前に関しては自由だったので質問のハードルは低かったと感じました。
説明の途中であっても、質問を投げられたので会社説明で疑問に思った点をその場で解決することができました。

 3. メモも気にせずに取れる
僕自身、スーツを着てデカい会場に行く、というようないわゆる「合同説明会」に行ったことがなかったのでこの点はズレがあるかもしれませんが。
個人的には、PCでメモを取りながら聞くことができて良かったです。
 
 4. 進行が上手い
僕はAルームとDルームで参加しました。
特にAルームの男性が声が良く、採用担当の方と学生の間に立って間を繋いだり、質問の意味をきちんと汲み取って採用担当者に投げてくれたり、と学生の僕からしてもとてもありがたい存在でした。

#僕が参加した企業の簡易メモ
以下のメモが誰かの役に立つのかはわかりませんが、同じくエンジニア職を目指してる人の参考になれば。
Twitterでも同じものを流しているので「#福岡オンライン合説」で検索してみてください。
別に隠しておく必要もないので公開しておきます。

## [株式会社ヌーラボ](https://nulab.com/ja/)
・通年採用
・基本エンジニア採用
・新卒の場合勤務地は福岡or東京
・研修は特になく、業務に入ってから
・英語に関しては、入社時は問わないが入社後勉強する意欲が必要

ヌーラボさんはwebだと新卒採用しているのかわからなかったので話を聞けて良かったです。
「通年採用」であることが知れただけでもよかった。

## [株式会社クアンド](https://www.wantedly.com/companies/quando)
- 経営者が北九州出身
- 北九州と福岡に拠点あり
- [レベニューシェア]ひびき信用金庫と提携して、不正取引検知を行うAIシステムを開発中
- エンジニアインターンが6名
- フルフレックスを採用
- web開発,機械学習などなど
- ビジネス職も採用
- [選考]コーディングテスト→面接
- インターン→採用

こちらも気になっていた企業さんでした。
選考フローや事業内容を知ることができて良かったです。

## [株式会社Fusic](https://recruit.fusic.co.jp/)
- 20卒で8名入社
- 設立17年目
- 宇宙（やりたい）
- AWSに注力
- エンジニアメインの会社
- エンジニアフレンドリー(個人の所感)
- 社内ノウハウが溜まっている(4000記事)
- フルフレックス採用
- リモートOK,推奨はしてないができる
- 社員の成長を惜しまない（社長談）

Fusicは社長自らが説明をしてくださいました。
とても熱い方でした。
エンジニアフレンドリーな会社なんだなと思いました。

## [GMOペパボ](https://recruit.pepabo.com/)
- パートナー数374
- 男女比6:4
- エンジニア3割
- コロナ対策として基本在宅勤務
- [mission]インターネットを使って可能性を広げる
- 選考の段階でプログラミング選考あり

会社説明から、自由で楽しそうな会社だなと思いました。

## [カラビナテクノロジー](https://karabiner.tech/recruit/requirements/)
- Oisixが親会社
- あだな文化
- エンジニアとデザイナー9割
- 有給取りやすい
- php,laravelを採択
- 自由な社風
- ECシステム開発
- 新卒に対して研修は特になし
- プログラミング経験あった方が良い
- 積極性のある人が求められる

Oisixが親会社ということを初めて知りました。
主催のジョニーさんもこちらの所属のようでした。
カラビナさんもとても自由な社風だなと感じました。

# 運営さんへの個人的要望
参加してみて、運営さんへの要望というか改善点というか。
「もっとこうしてくれたら嬉しいかも」的なことです。
**企業別の会社説明をみたい！**
zoomで各部屋の様子を録画してあったみたいです。
それを企業別にyoutubeで限定公開などの形で申し込みのあった学生だけに公開してもらえると、同時間帯で行われていた別企業の説明も聞けるのでいいかなぁと。
企業別にカットするのも面倒だと思うので、youtubeの概要欄・コメント欄に時間を明記しておけばジャンプできるのでコストもかからないかなと思います。
```20:00~：企業名
30:00~:企業名```

# おわりに
改めて、今回は参加してみてよかったです。
登壇いただいた企業のみなさん、運営のみなさん、ありがとうございました！
エンジニア組織で大事にしていること

# 始めに

WEB開発の仕事にかれこれ１6年関わってきました。
ここ１０年弱は手を動かして開発する側ではなく、マネジメントする側の役割がほとんどとなりました。
開発組織の構築、採用、チーム規模拡大ようなことを経験してきたので
これまでエンジニア組織で大事にしてきたことをポエムします。


## 仲間意識を大事にする
特にエンジニアという職種に多いと思うのですが、あるあるネタが共通してることが多いと思います。
「徹夜でコーディングした」とか「急な仕様変更でブチギレた」とか「リリースの日に外部サービスに障害発生」とか。。。

中途社員やフリーランスの人など複数社経験してきた人ならすぐに仲間意識が生まれるので、
その結束力を開発業務にも生かせるよう大事にしています。
（困ったら誰かがすぐ助けるみたいな）

## 自己組織化を促す
スプリントを完成させるのはチームとしての責任。
メンバーが自己管理して開発進めるけど、全ての業務はチーム全体の
アプトプットになることを意識してもらうようにしています。
システムに障害やバグが発生してもチーム全員の責任。

そのために自分は指示型ではなく支援型でサポートするよう意識し、
開発するのに障害があれば取り除けるようルール作りしたり、
つまらない作業は自分がやるようにして、開発に集中してもらうよう環境作りをしてきました。
道路を作って、交通整理するみたいな。

## ここに居たらスキルアップできそう✖︎プライベートも楽しい
選り好みしなければ、エンジニアの転職先はいくらでもあるご時世ですが、
現状採用している技術よりも、近い将来新しい技術を採用する計画イメージを示すことで、
ここにいると継続的にスキルアップできると思ってもらえるようにしています。

また、（自分がやりたいからですが）スプラトゥーン大会を開催したり、飲み会したり
ランチはみんなで一緒にいって雑談するなども大事にしています。

## 何を作るのかではなく、何でつくるのかを伝える
自己組織化して開発進めるためには、何をどのように作るかではなく、
何で作るのかを伝えられるようにしています。
何で作るかを理解していれば、壮大な要件定義書は不要だし
手掛ける開発に責任感が生まれるので業務知識が増える。
どんどん開発効率がよくなると信じています。
（ただし小さく作るためにアジャイルである前提）
Lambdaに[/tmp]を利用してpythonライブラリをインストール

#問題
Lambdaのデプロイパッケージのサイズ制限で、250 MB を超えることはできません。
#解決方法
Lambda Layerを作成
Lambdaの[/tmp]フォルダー（512M）を利用してライブラリをインストール
今回は２の方法を説明します。
#requirements.txtファイルを作成
```text:requirements-lambda.txt
numpy==1.16.3
```
```sh:create.sh
#!/bin/bash

if [ -d "deploy" ]; then rm -Rf deploy; fi
mkdir deploy
pip install -r requirements-lambda.txt -t deploy/requirements-lambda/
cd deploy/requirements-lambda
rm -r PIL
rm -r Pillow*
zip -9 -r ../lambda-requirements.zip .
cd ..
rm -r requirements-lambda
```
#LambdaにhandleプログラムにUnzip（サイズは50MB未満）
```python:handle.py
import os
import sys
import zipfile

pkgdir = '/tmp/requirements'
zip_requirements = 'lambda-requirements.zip'

if os.environ.get("AWS_EXECUTION_ENV") is not None:
    if not os.path.exists(pkgdir):

        root = os.environ.get('LAMBDA_TASK_ROOT', os.getcwd())
        zip_requirements = os.path.join(root, zip_requirements)
        zipfile.ZipFile(zip_requirements, 'r').extractall(pkgdir)

        sys.path.append(pkgdir)
```
#S3からダウンロードしてUnzip（サイズは50MB以上）
```python:handle.py
import boto3
import os
import sys
import zipfile

REQUIREMENTS_BUCKET_NAME = ''
REQUIREMENTS_KEY = ''

pkgdir = '/tmp/requirements'
zip_requirements = '/tmp/lambda-requirements.zip'

sys.path.append(pkgdir)

if os.environ.get("AWS_EXECUTION_ENV") is not None:
    if not os.path.exists(pkgdir):

        s3 = boto3.resource('s3')
        bucket = s3.Bucket(REQUIREMENTS_BUCKET_NAME)
        bucket.download_file(REQUIREMENTS_KEY, zip_requirements)

        zipfile.ZipFile(zip_requirements, 'r').extractall(pkgdir)
        os.remove('zip_requirements')

        sys.path.append(pkgdir)

```
custom OpenWrt on Raspberry 3B+

https://openwrt.org/toh/raspberry_pi_foundation/raspberry_pi

https://elinux.org/RPi_Hub

https://www.cnx-software.com/2020/01/12/build-customize-openwrt-for-raspberry-pi/

## Setup Build Environment
```sh

sudo apt-get update 
sudo apt-get install git-core subversion mercurial build-essential libssl-dev libncurses5-dev unzip gawk zlib1g-dev
```
## Fetch the source tree from Openwrt git repo
```
git clone https://github.com/openwrt/openwrt.git
cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig
```