OmniAICreator/Qiita-1.07M huggingface dataset:
【2019】海外カンファレンスAWS re:Inventに参加した話

# ちょっと前の話になるけども
2020年のAWS re:Inventはオフライン開催でした。
AWS公式のゲームをクリアするとAWS公式パーカーが貰えるコンテンツがあり、先日届いていました。
ちょうど最後のオフライン開催に参加した時のメモが出てきたので、せっかくなら記事にしようと思います。
参加前に[AWS 認定 ソリューションアーキテクト – アソシエイト](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)を取得してから行ったのですが、取得者限定のメリットやセッションを聞くのにも役立ちました。

# AWS re:Inventとは
世界中からエンジニアが7万人以上参加する最大級のエンジニアのカンファレンスです。
クラウドプロバイダーであるAWSのカンファレンスであり、keynoteやセッション、ワークショップ、企業ブースなど膨大なコンテンツが展開されます。

# やったこと
## Keynote
1日1本計4本のKeynoteが巨大な会場で開催されました。
セルリアンの地下会場かそれ以上の規模のKeynoteで熱気が凄かったです。
CEOを始めとした重役から直接AWSの思想や取り組んでいることが聞けて刺激的でした。

話と話の間にバンド演奏を挟み、歌った歌詞の内容から次の内容に繋げていくなど、プレゼンテーションとしても圧巻でした。

## ワークショップ参加
serverless、DeepComposerなど。
https://github.com/aws-samples
にワークショップの内容が展開されていて、渡されたAWSアカウントで取り組む形式です。
実際に手を動かして感覚を掴めるのが良いです。
動かすために必要な大半のコードが用意されているため、全体のアーキテクチャのみを意識しながら進められます。

上記githubに手順が順々に説明されているため、興味のあるものは後日触っていこうと思います。

## セッション参加
Angry Birdやマクドナルドの事例紹介や、serverlessの設計などのセッションに参加しました。
機械学習の実用化が既に実例と共にあることや、CI/CDへの高い意識が印象的でした。

あとでyoutubeに上がることは聞いていたので、比重低めです。

## 企業ブース(EXPO)
丸1-2日かけてようやく回れるほどの巨大な企業展示ブースを回りました。
企業ブースが回るのに丸2日かかるほど巨大で、コンサルからSaaSまで幅広く深く広大にAWSの裾野が広がっているのに圧倒されました。
AWSのサービスを踏まえて、どのようにビジネスに活用しているかが見てまわれて良かったです。

## 英語話しかけチャレンジ
折角世界中のエンジニアが来ているので、沢山のエンジニアと話そうと思い、積極的に話しかけてみました。
毎日6-8時に開催される各種懇親会や、企業ブースで話しかけて回りました。

話した人メモ
・タイのアーキテクト（SIer?）
・Alexaの開発エンジニア(次のプロトタイプ触らせてもらった)
・ホテル空き予約サービスの開発エンジニア
・IoTスタートアップのエンジニア
・アメリカのAWSコンサルタント
・IoTデバイスのヘルスケアのエンジニア
・シリコンバレーのセキュリティ系スタートアップ
・AWS serverlessのエンジニア
・AWS cloud9のエンジニア
・JET BRAINのブースのエンジニア(ER図ツールがないことの文句を言いに行った)
・Datadog系のSaaSのエンジニア数人
　→みんなDatadogより優れているって言う
・各ブースのエンジニア

# AWS 認定 ソリューションアーキテクト – アソシエイトを取得してから行って良かったこと
## サービスの概要がなんとなく分かった状態で話を聞けた
ソリューションアーキテクト アソシエイトを合格すると、「それぞれのサービスがどのような役割を担って
いて、どのような特徴があるか」がおおよそ分かる状態になります。
英語でセッションや会話をする中で、共通知識となるAWSのサービスについての知識がある程度担保して話を聞けたのは良かったです。

## AWSからの特典
前年に行った先輩が、「AWSの資格は絶対取った方が良い」と言うほどには特典が多かったです。
### 認定者限定グッズ
会場にて、AWS仕様の
 - ソックス
 - バッチ
 - ウェア
が特典としてもらえました。

### 認定者限定ラウンジ
認定者だけが入れるブースがあり、飲み物や軽食なども用意されていました。
セッション間でちょっと立ち寄って休憩するのに便利でした。

###  認定者限定パーティー
開催期間中に1度認定者だけ入れるパーティが開催されました。
英語話しかけチャレンジで話した何人かのエンジニアはここで話した人だったりします。
![IMG_20191204_203927.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78136/b6e321f8-3abf-38af-2dbc-af35ea718046.jpeg)

# AWS 認定 ソリューションアーキテクト – アソシエイトを取得するために勉強したこと
Udemyの[Ultimate AWS Certified Solutions Architect Associate 2021](https://www.udemy.com/course/aws-certified-solutions-architect-associate-saa-c02/)でざっと学習して、問題集を解いて試験に臨みました。

今見たらコースの名前が2021にアップデートされており、2年前にあったコースなのにしっかりアップデートされているのに驚きました。

# AWS re:Inventで感じたこと/やったこと
## 英語圏で急速に進む、技術のビジネス転用と汎用化
AWSによるサービスの規模と物量が凄かったのはもちろんのこと、企業ブースが回るのに丸2日かかるほど巨大で、コンサルからSaaSまで幅広く深く広大にAWSの裾野が広がっているのに圧倒されました。
AWSによって技術は進み汎用化され、ビジネスに転用する助けとなるコンサルやSaaSが周辺に展開され、企業も積極的に取り入れて事業・組織を革新(re:Invent)する大きな流れを節々から感じました。

これらの流れはほぼ英語でやり取りし前に進んでおり、日本語で出回り日本で事例がで始めるのはまだ先になりそうだと焦りを感じると共に、自分達の事業を前に進めるヒントが既に沢山存在していることにワクワクしました。

## 英語圏の市場の大きさ
カバー範囲の狭いビジネスソリューションでも羽振り良く出店しているのを見て、英語圏の市場規模も実感しました。
日本を中心にコンテンツ配信をしつつも、常に世界の市場を見据える必要を感じました。
FirebaseのアプリでSendGridを使ったメール配信機能を実現する

サービス開発をしているとユーザのアクションによってメールを送信することはよくあると思います。
今回はバックエンドにFirebaseを使っているときに登録会員にメール送信をする方法をまとめました。

※ 今回はSendGridを利用します。
※ Amazon SES や Mailgun を利用する場合はメール送信部分を書き換えてください。

## 目次

- 全体の流れ
- Firestoreへのデータ登録時にCloud Functions を実行する
- Cloud Functions でメールサーバーにリクエストを送る
- Firestoreのデータをもとにメールの内容を構築する
- Firebase Authentication から会員情報を取得する

## 全体の流れ

![メール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33499/a8d0be77-32a5-e8c0-b05e-8d3feea9065f.png)


## Firestoreの登録イベント時にCloud Functionsを実行する

Firestoreへのデータ登録時にCloud Functionsを起動するにはindex.jsを以下のようにしてデプロイすると実現できます。

```js
import * as functions from 'firebase-functions';

export const sendInquiryMail = functions.firestore
  .document('examples/{id}')
  .onCreate(async (snap, context) => {
    // 処理を記述
  }
```

firebaseの初期設定は割愛しています。

```bash
firebase deploy
```

## Cloud Functions でメールサーバーにリクエストを送る

SendGridを使う場合はAPI Keyを使う必要があります。
API KeyはSendGridの管理者画面で作成できます。

API Keyは環境ごとに切り替えたいことや、カード管理したくないためFirebaseの環境データに保存しましょう。

```bash
firebase functions:config:set sendgrid.apikey="xxxx"
```

設定した環境データをもとにSendGridのAPIを呼び出します。

```js
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(functions.config().sendgrid.apikey); // 設定した環境データを取得

// メール送信
const msg = {
  to: 'to@example.com',
  from: 'from@example.com',
  subject: 'example subject',
  text: 'example body',
};
await sgMail.send(msg);
```

これでメール送信処理を実現できました。

## Firestoreのデータをもとにメールの内容を構築する

メール送信するときには、関連するデータをもとにメールの内容を作ることがあります。

FirebaseのAdminSDKを使って登録データ以外のデータを取得することができます。

```js
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();
const colRef = db.collection('other');
const snapshots = await colRef
  .where('id', '==', 'xxxx')
  .limit(1)
  .get();
const other = snapshots.docs[0].data();
```

## Firebase Authentication から会員情報を取得する

```js
await admin
  .auth()
  .getUser('xxxx')
```

最終的に以下のようなコードでメール送信を実現できました。

```js

import * as functions from 'firebase-functions';

export const sendInquiryMail = functions.firestore
  .document('examples/{id}')
  .onCreate(async (snap, context) => {
    const admin = require('firebase-admin');
    admin.initializeApp();
    const db = admin.firestore();

    const data = snap.data();

    const user await admin
      .auth()
      .getUser(data.user_id)

    const colRef = db.collection('other');
    const snapshots = await colRef
      .where('id', '==', data.other_id)
      .limit(1)
      .get();
    const other = snapshots.docs[0].data();
    const sgMail = require('@sendgrid/mail');
    sgMail.setApiKey(functions.config().sendgrid.apikey);
    const msg = {
      to: user.email,
      from: 'from@example.com',
      subject: 'example subject',
      text: `example body. ${other.body}`,
    };
    await sgMail.send(msg);
  });
```
bulma エレメント編


# 注意書き
自分用のメモなのでかなり雑です。初めてbulma使うので<a href="https://bulma.io/documentation/overview/">公式サイト</a>を適当にまとめとく。英語は大嫌いなので超ガバ翻訳です。間違えてたら教えてください。

## viewごとにレイアウトを分ける。今回はnewアクションだけ指定(自分用)
layout 'sample', only: :new 
これでapplication.html.erbではなくnewメソッドだけsample.html.erbが適用


## bulmaの紹介
<dl>
<dt><a href="https://bulma.io/documentation/elements/block/">class="block"</a>
<dd><em>MThe block element is a simple spacer tool. It allows sibling HTML elements to have a consistent margin between them:</em><br>
class="block"同士を並べると間にスペースをつけていい感じに文章を並べれる。(上下にスペース)

<dt><a href="https://bulma.io/documentation/elements/box/">class="box"</a>
<dd><em>The box element is a simple container with a white background, some padding, and a box shadow.</em><br>
なんかシンプルな白い容器でいい感じに空白つけつつ外側に影もつける。普通の白よりもより白い白になる。

<dt><a href="https://bulma.io/documentation/elements/button/">class="button"</a>
<dd>その名の通りボタンをつける。urlに飛ぶとaタグとかinoutタグとかbuttonタグにclassとしてつけれるよみたいなことが書いてある。

<dt><a href="https://bulma.io/documentation/elements/content/">class="content"</a>
<dd><em>When you can't use the CSS classes you want, or when you just want to directly use HTML tags, use content as container. It can handle almost any HTML tag.</em><br>
なんかよくわからんけどどんなタグでも大丈夫だぜ。とりあえず俺使っとけみたいな汎用性あるぜみたいな感じか？英文がよくわからんけど使うと両サイドをいい感じに空けてくれる

<dt><a href="https://bulma.io/documentation/elements/delete/">class="delete"</a>
<dd>×ボタン。</strike>urlに飛ぶと通知とかメッセージにつけとくといいぜって書いてある。

<dt><a href="https://bulma.io/documentation/elements/icon/">class="icon"</a>
<dd>その名のアイコンをつける。と思いきや違うぽい。Font Awesomeとかでアイコンを使うときこれで囲っとくとサイズ調整とか楽にできたりラグでアイコンが表示されるまで時間かかぅたときその空間はあけとくぜ(レイアウトが崩れるのを防ぐ)みたいな感じ多分

<dt><a href="https://bulma.io/documentation/elements/image/">class="image"</a>
<dd>iconのimageバージョン。Font Awesomeではなく画像バージョン

<dt><a href="https://bulma.io/documentation/elements/notification/">class="notification"</a>
<dd>その名の通り通知。中にdeleteもいれろよって公式に書いてある。

<dt><a href="https://bulma.io/documentation/elements/progress/">class="progress"</a>
<dd>初学者の自分には使い方がよんでもよくわかならかぅた。データとかダウンロードした時の進捗状況を表すバーをつけれるらしい。

<dt><a href="https://bulma.io/documentation/elements/table/">class="table"</a>
<dd>これは公式見たほうが速そう。。tableタグにclassとしてつけてねってあとは公式から好きなの選ぶ

<dt><a href="https://bulma.io/documentation/elements/tag/">class="tag"</a>
<dd>タグをつけれる

<dt><a href="https://bulma.io/documentation/elements/title/">class="title"</a>
<dd>bulmaはh1とかつけても大きさが変わらないようになってるのでtitle及びsubtitleのclassを使う。titleとsubtitleは組み合わせると距離を近づけてくれる。また組み合わせて使うときはなんとなくサイズ差が2になると見栄えが良いよとアドバイスも書いてあった。例えばtitle is-1とsubtitle is-3



　　
</dl>
[GitHub] gitでpushしたくないファイルを外す (git  ignore)

#git ignore とは
gitの管理下に置きたくないファイル（パスワードなどのセキュリティー上、共有したくないファイルなど）を `git ignore` という機能を使って、gitの管理外に置くファイルを設定することができます。

#git ignore の使用方法
例えば `sample` というディレクトリ内で、gitの管理下に置きたくない `sample.html` というファイルを作成したとします。
sampleディレクトリ内に `.gitignore` というファイルを作成し、`.gitignore` ファイルの中にgitの管理下に置きたくないファイル（今回の場合は `sample.html` ）を指定していきます。

#gibo を使って.gitignoreを作成する
##gibo とは
`.gitignore` を自動で作成してくれる機能です。
##インストール

```
$ brew install gibo
```

例えばRailsで作成するとします。
`.gitignore` を作成したいディレクトリに移動して以下のコマンドを実行します。
（Railsの `.gitignore` の中身を作成して、それを .gitignore に入れ込むコマンドです。）

```
$ gibo Rails

$ gibo Rails >> .gitignore
```

Rails以外の言語でも作成可能です。↓

```
$ gibo list

Actionscript		Anjuta			Jekyll
Ada			Ansible			JENKINS_HOME
Agda			Archives		Joomla
Android			Backup			Julia
AppceleratorTitanium	Bazaar			KiCad
AppEngine		BricxCC			Kohana
ArchLinuxPackages	Calabash		Kotlin
Autotools		Cloud9			LabVIEW
C++			CodeKit			Laravel
C			CVS			Leiningen
CakePHP			DartEditor		LemonStand
CFWheels		Diff			Lilypond
ChefCookbook		Dreamweaver		Lithium
Clojure			Dropbox			Lua
CMake			Eclipse			Magento
CodeIgniter		EiffelStudio		Maven
CommonLisp		Emacs			Mercury
SAM			Ensime			MetaProgrammingSystem
Bazel			Espresso		Nanoc
InforCMS		FlexBuilder		Nim
Kentico			GPG			Node
Phoenix			Images			Objective-C
AtmelStudio		JDeveloper		OCaml
esp-idf			JEnv			Opa
IAR_EWARM		JetBrains		OpenCart
Exercism		Kate			OracleForms
GNOMEShellExtension	KDevelop4		Packer
Hugo			Lazarus			Perl
JBoss4			LibreOffice		Phalcon
JBoss6			Linux			PlayFramework
Cordova			LyX			Plone
Meteor			macOS			Prestashop
NWjs			MATLAB			Processing
Vue			Mercurial		PureScript
Snap			Metals			Python
Logtalk			MicrosoftOffice		Qooxdoo
OpenSSL			ModelSim		Qt
Bitrix			Momentics		R
CodeSniffer		MonoDevelop		Rails
Drupal7			NetBeans		Raku
Jigsaw			Ninja			RhodesRhomobile
Magento1		NotepadPP		ROS
Magento2		Octave			Ruby
Pimcore			Otto			Rust
ThinkPHP		Patch			Sass
Puppet			PSoCCreator		Scala
JupyterNotebooks	PuTTY			Scheme
Nikola			Redcar			SCons
Racket			Redis			Scrivener
Red			SBT			Sdcc
Splunk			SlickEdit		SeamGen
Xilinx			Stata			SketchUp
Composer		SublimeText		Smalltalk
Concrete5		SVN			Stella
Coq			SynopsysVCS		SugarCRM
CraftCMS		Tags			Swift
CUDA			TextMate		Symfony
D			TortoiseGit		SymphonyCMS
Dart			Vagrant			Terraform
Delphi			Vim			TeX
DM			VirtualEnv		Textpattern
Drupal			Virtuoso		TurboGears2
Eagle			VisualStudioCode	Typo3
Elisp			WebMethods		Umbraco
Elixir			Windows			Unity
Elm			Xcode			UnrealEngine
EPiServer		XilinxISE		VisualStudio
Erlang			Go			VVVV
ExpressionEngine	Godot			Waf
ExtJs			Gradle			WordPress
Fancy			Grails			Xojo
Finale			GWT			Yeoman
ForceDotCom		Haskell			Yii
Fortran			Idris			ZendFramework
FuelPHP			IGORPro			Zephir
Gcov			Java
GitBook			JBoss
```
永続Volumeのメモ

#PersistenVolumeとPersistentVolumeClaimを使って永続化
k8sでpvとpvcを勉強したのでメモ。
流れ的にはpvとpvc作ってpodで指定。
#PersistentVolume
```pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 100M
  accessModes: 
    - ReadWriteOnce
  storageClassName: "manual"
  hostPath: 
    path: /pvc-volume
```

・```volumeMode: Filesystem```はデフォルトだから省略可能
・accessModesは```ReadWriteOnce, ReadOnlyMany, ReadWriteMany```がある
・```hostPath.path```ではnode上のパスを指定する

#PersistentVolumeClaim
```pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10M
```
・storageClassNameはpvと揃える
・accessModesもpvと揃える
・```resources.requests.storage```でpvに要求ができる
#Podで要求
```pod.yaml
apiVersion: v1
kind: Pod
metadata: 
  name: mypod
spec:
  containers:
    - name: my-nginx
      image: nginx
      volumeMounts:
      - mountPath: "/var/www/html"
        name: myvolume
  volumes:
    - name: myvolume
      persistentVolumeClaim:
        claimName: myclaim
```
・```spec.containers[volumeMounts[mountPath]]```でpod上のパスを指定
・```spec.volumes[persistentVolumeClaim.claimName]```は作ったpvcの名前をいれる

誰かの参考になれば幸いです。
【GAS】スプレッドシートのカスタムメニューでアイテム毎に関数を動的（？）に割り当てる

# 概要
https://teratail.com/questions/319565?sip=n0070000_019&uid=188085

これに回答したので。
カスタムメニューって便利なんだけど、関数指定が文字列だけだったり、関数に引数が渡せなくていやんな感じなので、それを打開したい！

# 結論からいうと！
カスタムメニューアイテム毎に別々の関数を定義する事で、引数が無くても何とかなるように作れた。
今回のサンプルだとシート数が変わった時に、スプレッドシートをリロードしないと正常に動かないので動的に割り当てというと若干語弊があるかも。。。

# 出来上がったもののプレビュー
メニューからシート名を選択すると、選んだシート名をアクティブにするよ。

![gas.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92447/b5dd02ad-08b5-3332-576d-05ca92f5dfac.gif)


# ソースと解説

## ソース全文

```js
const APP_ACTIVE = SpreadsheetApp.getActive();
const SHEETS = APP_ACTIVE.getSheets();
const ITEM_FUNCTIONS = (function() {
  let result = {};
  for (let i = 0; i < SHEETS.length; i++) {
    // 各メニューアイテムに紐づける関数
    result['_moveTo' + i] = function() {
      SHEETS[i].activate();
      APP_ACTIVE.toast(SHEETS[i].getSheetName() + ' に切り替えた！', 'カスタムメニューさん');
    };
  }
  return result;
})();

/**
 * スプレッドシートを開いた時のハンドラ
 */
function onOpen() {
  let userMenu = [];

  // メニューと動的関数を生成する
  for (let i = 0; i < SHEETS.length; i++) {
    const customFunctionName = 'ITEM_FUNCTIONS._moveTo' + i;

    // カスタムメニューを追加
    userMenu.push({
      name: SHEETS[i].getSheetName(),
      functionName: customFunctionName,
    });
  }
  SpreadsheetApp.getActiveSpreadsheet().addMenu('シート名一覧', userMenu);
}
```

## 解説や注意点
掲載したソースや実装に当たっての注意点について書く。

### カスタムメニューで指定する関数名がグローバルスコープから辿れる事
辿れれば良いのでこんな感じの関数であれば…

```js
// 宣言
const hoge = {
  fuga: function() { Browser.msgBox('hello'); };
};
```

こんな感じにドットで繋いでメニューアイテムを入れれば、オブジェクト配下に入れた関数も呼び出せる。

```js
// 呼び出しメニューアイテム
SpreadsheetApp.getActiveSpreadsheet().addMenu('シート名一覧', {[
  name: 'fugaを呼べ',
  functionName: 'hoge.fuga'
]});
```

一応、`globalThis`が使えるのでこういう書き方も出来た。まあお好みで。

```js
// 宣言
globalThis['piyo'] = function() { Browser.msgBox('piyoさんだよ！'); };
```

```js
// 呼び出しメニューアイテム
SpreadsheetApp.getActiveSpreadsheet().addMenu('シート名一覧', {[
  name: 'piyoを呼べ',
  functionName: 'piyo'
]});
```


### 動的追加関数は、初期化タイミングで追加しておく必要がある
私が検証した範疇ではonOpenより前。
onOpen後は、globalThis等に関数を追加してもメニューからは呼び出せませんでした。
下のようなコードで関数が定義されているかどうかをチェックしてたんですが、
追加処理をした関数内では生きているが、処理を抜けてしまうとglobalThisから消えてしまっていた。

```js
let msg = '';
Object.keys(globalThis).filter(key => typeof(globalThis[key] === 'function').forEach(key => {
  if (msg) {
    msg += '\\n';
  }
  msg += 'key: ' + key + ', funcName: ' + globalThis[key]?.name;
});
Browser.msgBox(msg);
```

```js
// こんな感じに書いても、「はーい、testさんだよ！」とは言ってくれずに眠ったまま。
const funcs = {
  'test': function() {
    Browser.msgBox('…zzZ');
  }
};

function onOpen() {
  funcs['test'] = function() {
    Browser.msgBox('はーい、testさんだよ！');
  };
  let userMenu = [{
    name: 'test関数を実行！',
    functionName= 'funcs.test'
  }];
  SpreadsheetApp.getActiveSpreadsheet().addMenu('カスタムメニュー', userMenu);
}

```


# 参考
- Class Spreadsheet - Google App Sxript
    - https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#addMenu(String,Object)
- オブジェクト初期化子 - MDN
    - https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer
Salesforce Classic での Pardot を使用した対ビジネスマーケティングの自動化 ⇒ Pardot の基本 (Salesforce Classic) ⇒ Pardot の操作方法について

１．Pardot のメニューナビゲーションを構成する 4 つのカテゴリは何ですか?
２．[作成されたプロスペクト] テーブルに表示されるのはどのようなプロスペクトですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/2ce42271-df72-ba66-68b0-ea538fc141b0.png)
初心者のAWS資格勉強

私は全くの初心者の状態からAWSの資格勉強を行ったので、今回はそのことについて紹介したいと思います。

①これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）
https://www.udemy.com/course/aws-associate/

②この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）
https://www.udemy.com/course/aws-4260/

上記の2つのudemyの講座と市販の参考書を一冊を元に資格勉強を行いました。
ソリューションアーキテクトアソシエイトの資格取得を見据えて勉強を始めたので、これらの講座を受講しました。
そのためにまず、一番AWSの簡単な資格としてクラウドプラクティショナーから私は勉強を始めました。
勉強を始めた時の私はIT企業での就業経験はなく、予備知識は０の状態でしたが、この入門資格では一日3時間ほどの勉強で2週間で合格することが出来ました。
クラウドプラクティショナーは用語の理解を問うものが多く、予備知識はない方はここから勉強することをお勧めします。

その一つ上のAWS資格として位置付けられるソリューションアーキテクトアソシエイトに関しては実際の運用も想定したことが問われるので、ある程度ネットワーク、サーバーといったインフラの予備知識がない方にはいきなりは厳しいかと思います。

参考までに私はクラウドプラクティショナー取得から半年後にある程度インフラの就業経験を経た後にソリューションアーキテクトアソシエイトを取得しました。

もちろん、AWSを用いた就業経験はないけれど、インフラ関連の予備知識がある方はこれらの資格勉強はより容易かと思われます。

私の勉強法としてはまずUdemyの上記①の講座のハンズオンの動画を見ました。
動画で実際に動いているものを見た方がイメージしやすいと感じたからです。
こちらは動画が32時間と大ボリュームで、内容もAWSの使用の更新に合わせて日々アップデートもされるとてもお勧めの講座です。
Udemyのセールは頻繁に行っているので、タイミングを狙えば2000円程度で買えてかなりお買い得だと思います！
こちらの動画はサーバーやネットワークの知識がない人にもOSI参照モデルやTeratermの基礎的な使い方など解説があるので、初心者の人にも最初の勉強の導入にちょうどいいかなとは思います。

ソリューションアーキテクトアソシエイトの内容をクラウドプラクティショナーは含むのでここはこの動画で網羅的に理解することをお勧めします。
私がクラウドプラクティショナー対策の勉強をした時はハンズオンの詳しい説明を飛ばしたり、倍速で再生したりと始めは流しで視聴しました。
32時間と長丁場の講座なので、そこは適宜選択して視聴する形で良いかなと思います。

私はまず一度この動画をみた後に市販のクラウドプラクティショナーの参考書を一冊読みました。
動画で見た内容の復習と体型的に知識の確認の意味も兼ねて読みました。
こちらは何でもいいかと思いますが、参考までに私が読んだ本のurlを貼ります。
https://www.sbcr.jp/product/4797397406/
この本の感想としてはこれだけだとクラウドプラクティショナーの合格は難しいと思います。
ただ、クラウドプラクティショナーの試験範囲の確認や実際の試験のイメージをつけるには良いかと思います。

そして、ここで実際の過去問を上記②のUdemyのクラウドプラクティショナーの模擬講座を解きまくりました。
間違えたら問題の解説を読んだり、参考書を読み直すなどして知識を補完していきました。
これを繰り返し解いて9割取れるようになればほぼ合格のレベルに達していると思います。
実際の試験も似たような問題が出ます。

その後のソリューションアーキテクトアソシエイトの試験勉強に関しては①の講座のハンズオンを実際に手を動かして実施しました。
この時は32時間を欠かさず視聴しました。
また、この講座にはソリューションアーキテクトアソシエイトの模擬試験も含まれているので、特に参考書は買わずにこれだけで対策しました。

あと、実際の試験を受ける時の注意点は、AWSの試験は自宅で受けることは可能ですが、こちらは家のネット環境や、使用するPCのセキュリティの設定や身分証の容易、部屋の整理など諸々気をつけることが必要です。
自宅で受験する際に、以前は外国人の試験官と英語でのコミュニケーションと身分証はパスポートを表示など制約がありましたが、現在は日程が限定されますが、日本語で運転免許証など日本語の身分証を受け付けるオプションも出てきたので、試験を申し込む際はそれらを利用することが出来ます。
もちろん、最寄りのテストセンターで受験する場合はいずれの日程も日本語で大丈夫です。

それらが心配な人は最寄りのテストセンターで受けることをお勧めします。
試験を受けるためにはAWSのアカウントの登録なども必要なので、そこもAWSのHPの案内を参考に注意深く行ってください。
私は、この受験申し込みに少々手こずりました。

試験の日程は自宅でもテストセンターでも日時は幅広く直近の日程でも容易されているのでそこは柔軟に選べると思います。

その他、注意点としてはAWSの資格の有効期間は3年であり、AWSのサービスは日進月歩でアップデートされているので、資格勉強を終えた後もAWSを扱うためには継続して勉強は必要です。
私も未だAWSの勉強の最中です。常に意識を高く持ってお互いに精進していきましょう。
[PostgreSQL] PostgreSQLの使い方

#[PostgreSQL] PostgreSQLの使い方

PostgreSQLの使い方について、少し復習してみます。

データベースを作成する

```
CREATE DATABASE mydb_name
```

データベース一覧を表示

```
¥l
```

データベースへ接続する

```
¥c mydb_name
```

テーブル一覧を表示

```
¥dt
```

##実際にデータベースを作成してみる

![027a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/897250/7f1cd497-ccea-e50b-8d72-7b288468c220.png)

上の図のように、mydb_iwashi というデータベースを作成してみました！
【django】管理画面のパスワードを忘れた時の対処

## はじめに
Djangoの管理画面にアクセスしたら、ユーザ名、パスワードを忘れてしまって
ログイン出来なくて困ったので、その時の対処法について

## 解決方法
シンプルに再設定で解決出来ました。
※使用しているデータベースがデフォルトの場合
　PostgreSQLとかデフォルト以外のデータベースの場合は、
　気が向いたら、調べて追記か記事にします。

## 手順

### ユーザ名の確認
db.sqlite3ファイルにユーザ情報が格納されているので、
db.sqlite3ファイルが格納されているディレクトリで以下のコマンドを実行

```
$ sqlite3 db.sqlite3    // SQLiteを起動
```
SQLiteを起動が起動したら以下を実行
ユーザ名を確認

```bash
sqlite> select username from auth_user; 
sqlite> .q  // ユーザ名を確認したら、SQLiteから抜けます
```

### パスワードの再設定
ユーザ名が確認出来たら、パスワードの再設定を行う

```
$ python manage.py changepassword "ユーザ名"
```

確認したユーザ名、再設定したパスワードで、
ログイン出来るようになるはずっ

## おわりに
ログイン出来ず少し焦ったけど、助かったので
似た人の参考になればと思いました。


## 参考
> [Djangoの管理画面のパスワードを忘れたを解決。ただそれだけ。](https://creepfablic.site/2019/11/17/django-password-reset/)
スライスに要素を詰めていく時のお話

#はじめに
スライスに要素を詰めていく時に、記述の仕方でどれくらいパフォーマンス変わってくるかベンチマークで検証。
パフォーマンスチューニングにて活かしたい。

#appendを使う場合
要素数分capacityを確保しておくと良い。
例えば要素数が10であるときはcapacityで10を指定しておく。

```Go
func makeSlice() {
	s := make([]int, 0, 10)

	for i:=0; i<10; i++ {
		s = append(s, i)
	}
}
```

```
BenchmarkMakeSlice-4    83859099                13.5 ns/op
PASS
ok      awesomeProject2 1.157s
```

確保できていない場合、例えばcapacityを５とした時、

```Go
func makeSlice() {
	s := make([]int, 0, 5)

	for i:=0; i<10; i++ {
		s = append(s, i)
	}
}
```

```
BenchmarkMakeSlice-4    17901537                61.9 ns/op
PASS
ok      awesomeProject2 1.187s
```

capacityを3とした時、

```
BenchmarkMakeSlice-4    10131793               118 ns/op
PASS
ok      awesomeProject2 1.327s
```

以下の場合、

```Go
func makeSlice() {
	var s []int

	for i:=0; i<10; i++ {
		s = append(s, i)
	}
}
```

```
BenchmarkMakeSlice-4     4877806               246 ns/op
PASS
ok      awesomeProject2 1.468s
```

#事前に要素数がわかっている場合はインデックスを活用

事前に要素数がわかっている場合は、インデックスを活用して代入していく方がappendを用いるよりも速くなる。

```Go
func makeSlice() {
	s := make([]int, 10)

	for i:=0; i<10; i++ {
		s[i]=i
	}
}
```

```
BenchmarkMakeSlice-4    184096501                6.39 ns/op
PASS
ok      awesomeProject2 1.844s
```
VRchat  プレイヤーの入場位置とワールドでジャンプをする設定

#1. この記事は

VRchatで、プレイヤーの入場位置とアバターがジャンプしたときに飛び上がる高さを調整します。


#2.どうやってやるのか？

- 前提条件 SDK3でワールドが制作されていること

HierarchyでVRCWorldを選択-> BOXが表示されるのでプレイヤーの入場位置にボックスを移動させる。ボックスの青い軸(z軸)の向いている方向が入場時にプレイヤーが向いている方向になります。

![171.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/050a1b31-9241-fdc6-2f1b-b7205332cc7f.jpeg)



HierarchyでVRCWorldを選択 -> Public Variables -> jumpImpulseの数字を調整します。数字を大きくするほどジャンプしたときにアバターが高く飛び跳ねます。

![55.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/439f1bdd-593d-db05-aac4-34ffa83a7001.jpeg)
Intel MacでeGPUを使いtensorflow-macosとPlaidMLを比較してみた

# はじめに
tensorflow-macosのリリースに伴い, macでも深層学習を始めるハードルがとても下がったと思います. ただ実際のところどの程度パフォーマンスはどうなのか? はたまたeGPUを使った場合どうなるのか? すでにmacで深層学習をやっている方はPlaidMLと比較してどうなのか？など, 不明なところが多いかと思います. 
基本ROM専な私ですが, なかなかベンチマーク結果が出てこないこともあり, 今回初投稿しました. 

@tomoyaeibuさんがm1 macでtensorflow-macosを実行した記事を上げているので,
勝手ながらそれと同様の条件で比較できるように, パフォーマンスを測定しました. 
https://qiita.com/tomoyaeibu/items/46f2f3384a370df71d5e

私はeGPU利用の結果を中心に投稿したいと思います. 

# tensorflow-macos, PlaidML, eGPUについて
## tensorflow-macos, PlaidML
いずれもMacでGPUを使った深層学習を行えるフレームワーク.
いずれもいろんな方が記事にしているので, ググってみてください. 

## eGPUについて
簡単に言うと外付けGPU. ノートPCのような拡張不可能な端末において, (お金があれば)容易にGPUをアップグレードすることができる.  macOS High Sierra 10.13.4以降で使えるようになりました. 詳しくはググってみてください. m1 macには残念ながら現在のところ未対応らしいです.
今回, thunderbolt2なmacでeGPUを利用するため, purge-wrangler.shを使いました. 

## 環境 
### ハードウェア
* MacBook Pro (Retina, 13-inch, Late2013)
    * プロセッサ 2.4GHz デュアルコア Intel Core i5
    * メモリ 8GB 1600MHz DDR3
* Razer Core X (eGPU)
    * Radeon RX580 (8GB)
    * Thunderbolt3-2変換ケーブル利用
    
### ソフトウェア
* Mac OS Big Sur 11.1
* tensorflow-macos 0.1-alpha1
* PlaidML 0.7.0
* purge-wrangler.sh (Thunderbolt2なMacでeGPUを使えるようにするため)


# 実験設定
## 実験コード
https://qiita.com/tomoyaeibu/items/46f2f3384a370df71d5e
こちらの記事のLeNetライクなConvolution層によるmnistの分類コードを使いました. 
PlaidMLはkerasでコードを記述可能であるため, ほぼ同様のコードを使い計測しております.
(バッチサイズのデフォルト値が異なるので, tensorflow-macosのデフォルト値にそろえて測定しております.) よって実行結果は, アルゴリズムに差はなく, 各フレームワークの実行効率の良さや, ハードウェアの性能にほぼ依存するかと思います. 

## 評価方法
3回実行し実行時間の平均値で評価します. 

# 実行結果
|  | MacBook Pro Late 2013 with Radeon RX580 eGPU(tensorflow-macos) | MacBook Pro Late 2013 with Radeon RX580 eGPU(PlaidML) | 
| :--- | :---: | :---: |
|5epochにかかった時間 | 771.53s| 1251.12s | 

tensorflow-macosとPlaidMLを比較した場合, 今回の環境下においてtensorflow-macosが1.62倍高速に動作することがわかりました. 
また, (フェアな比較ではないですが) @tomoyaeibuさんのm1 mac book airの結果と比較しても, 3.40倍高速に動作することがわかります. 
m1チップのGPUも高速ですが, やはりRadeon等のGPUのほうが強力で, eGPU環境下でも十分高速に動作することがわかりました.  


# 最後に
今回, Intel MacによるeGPUを使った深層学習のパフォーマンス計測を実施しました. 
ある特定のニューラルネットワークの学習にtensorflow-macosとPlaidMLを利用し, tensorflow-macosが高速に動作することがわかりました. 
また, m1チップとeGPU(Radeon RX580)とを比較し, eGPUで十分高速に深層学習できることがわかりました. ただこの比較は, コスパを考えた場合フェアな比較ではないと思っており, 参考程度の情報と考えております.

他のニューラルネットワークの構造(VGGやResNet)に対しても同様の結果が得られるか不明なため, また気が向いた際に追加で調査したいと思います. 
今回, eGPUのデータ転送にThunderbolt2を利用しております. これがボトルネックになっているかどうかが気になっております.
streamlinkをjupyterで実行する場合に躓いたこと

streamlinkをコマンドから実行する場合は例えばこのように書きます。

```
streamlink --username=xxxx --password=xxx https://crunchyroll.com/a-crunchyroll-episode-link"
```

同様のことをjupyterで実行する場合へのパラメータの渡し方は上のような簡便なやり方がわからなかったため、迂遠なやり方を書いておきます。

```py
from streamlink import Streamlink

st=Streamlink()
plugin = st.resolve_url("https://crunchyroll.com/a-crunchyroll-episode-link")

params={"username":"xxxx","password":"xxx"}
plugin.options.update(params)
stream_streamlink =plugin.streams()
```

resolve_urlはplugin クラスを返すのですが、そこにoptionパラメータを渡してくれる方法が分からなかったのでstreams()を実行する前にupdate(params)をしています。

```py
import streamlink
stream_url = streamlink.streams("https://crunchyroll.com/a-crunchyroll-episode-link")

```

optionがいらない場合は上記のような書き方で大丈夫です。

```py
import urllib.request
import ffmpeg

stream_url = stream_streamlink['best'].url

try:
    urllib.request.urlretrieve(stream_url ,'vod.mp4')
except Exception as e:
    print(e)

stream = (
    ffmpeg.input('vod.mp4')
    .output(stream, r'C:\\path\\to\\save\\file.avi' )
)

try:
    ffmpeg.run(stream,capture_stdout=True, capture_stderr=True) 
except ffmpeg.Error as e:
    print('stdout:', e.stdout.decode('utf8'))
    print('stderr:', e.stderr.decode('utf8'))
    raise e
```

そして上記のようにffmpeg等を使うと好きな形式で保存できます。ちなみにpythonのffmpegはいくつか種類があるようですが、pip install ffmpeg-pythonでないとエラーが起きる場合がありました。
ところでexceptの使い方が良くないと指摘されていたサンプルを用いているのですが、元のページを忘れてしまったため修正していません。
また、['best']は時々取得できないときがあるようなので、stream_streamlinkをprintなどで確認して['720p']のように指定してください。
djangoを使って新しくTODOアプリを作る２


##始めに
前回の記事で書き忘れたので、今回書かせていただきます。
2020年に無職になり、何かしようとおもい2020年夏よりpythonを学習し始めました。プログラミングに関しては経験はほとんどありません。いろんな初学者用の本をやっていて、経験者からUDEMYを使うとよりわかりやすくコスパよく学べるということを教えていただき
今回の講座<a href="https://www.udemy.com/course/django-3app/">【徹底的に解説！】Djangoの基礎をマスターして、3つのアプリを作ろう！（Django2版 / 3版を同時公開中です）</a>を受講させていただきました。
##今回の記事でやること

###1.modelの設定
今回は、下記のようなモデルでいきたいと考えています。(というかmodelってどのタイミングで作るのがいいんでしょうか）

```python:models.py
from django.db import models
class todoModel(models.Model):
   title = models.CharField(max_length=50)
   content = models.textField()
   author = models.CharField(max_length=50)
   dateline = models.DateField()←（締切設定ってこれでいいのでしょうか・・・？）
   now date = models.DateField.auto_now()（投稿日）
   doit = ?(選択肢を入れる　後で調べる)

```

###2.urls.pyの設定
イメージとしては５画面あるホームページ
サインインページ、ユーザー作成ページ、todolist一覧ページ、詳細ページ、投稿ページ
signup, newuser, list, detail, task という名前で作っていこうとおもいます
それではコードを書いていきます。
プロジェクト側ではなく、アプリ側にurls.pyを作成し、書いていきます。
path("URL名",関数名,name="呼び出し名（？）")みたいな形で書いていきます。

```python:models.py
from django.urls import path , include
from .views import signupfunc, newuserfunc, listfunc, detailfunc, taskfunc 

urlpatterns = [
    path("signup/", signupfunc, name="signup" ),
    path("newuser/", newuserfunc, name="newuser"),
    path("list/", listfunc , name="list"),
    path("detail/", detailfunc , name="detail"),
    path("task/", taskfunc , name="task"),
]

```

こんな感じでとりあえず描きました。
urlも書いたので次はhtmlを書いていきます。

##ホームページのイメージ

ログイン画面のイメージはBOOTSTRAPのサンプルから流用します。
![kirinuki.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764631/2b0eaa44-c06e-d7df-4f62-5dfc41f8acca.png)
https://getbootstrap.jp/docs/5.0/examples/sign-in/
こんな感じでいきたいとおもいます。

リスト画面は次のようにしていきます。
![kirinuki2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/764631/f669e9c3-5240-0944-65a6-f448671b271d.png)

https://getbootstrap.jp/docs/5.0/examples/album/


では、共通のフレームのhtmlファイル（今回の名前はbase.html）から作っていきます

```html:base.html
<!doctype html>
<html lang="ja">

<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->

    {% block customcss %}
    {% endblock customcss %}

    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css"
        integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">

    <title>Hello, world!</title>
</head>

{% block header %}
{% endblock header %}

{% block content %}
{% endblock content %}

</html>
```

イメージとしては、共通事項はbase.htmlにかいて、
block　〇〇のところにそれぞれの要素を書いていくイメージです。
その３ではそれぞれのhtmlとviews.py、model.pyの疑問点を調べて書いていきたいとおもいます
Laravel8.xでユーザー認証付きの新規プロジェクトを作る方法

Laravel8.xでjetstreamが入った新規プロジェクトを立ち上げるのにとてもハマりましたので、各ハマりポイントの解消方法と合わせて書きます。
#この記事の対象読者
超初心者でlaravelを使って何か作りたい人。
#開発環境
MacBook Pro
MacOS Big Sur ver.11.1
Laravel Framework 8.24.0
mysql  Ver 8.0.23 for osx10.16 on x86_64 (Homebrew)

#完成イメージ
いきなりユーザー認証機能がついててめっちゃ便利です。
見にくいですが最初から右上にLoginとRegisterがついています。
![スクリーンショット 2021-01-23 1.06.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718462/7433d10f-b717-51be-0cce-4a09b657d150.png)
ログイン画面
![スクリーンショット 2021-01-23 1.06.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718462/c32f5e16-ca22-4cee-898d-d772fbf5d63b.png)
レジスター画面
![スクリーンショット 2021-01-23 1.06.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718462/55d94310-e20c-d5c0-3994-b265e1b94c5c.png)

立ち上げるだけでこんな機能がついてるとか最高です。ただlaravel8.xで新規プロジェクトを作るのは初めてでつまづきまくりました。同じような初心者の人のためにハマったポイントをあわせて書きます。

#新規プロジェクトの作成
まずこれに従い新規プロジェクトを作成。
https://kawax.biz/laravel8-create-project/

#DBの接続
mySQLでテーブルを作りlaravelに接続。->mySQL8.0はlaravelにそのままでは繋げられない
認証方式を変える必要がある。
以下の記事参照
https://qiita.com/kim_kou/items/11420f1aa885638865fb
```php artisan migrate```
を実行。これが通ればDBはok。

#npm run devをする
npm install
を実行。
で自分の開発環境ではエラーが出ました。XCodeのエラーなんちゃらって出てたので調べたところ、
この記事にしたがってXCodeをインストールしたら解決しました。インストールにはめっちゃ時間かかります。
https://www.it-swarm-ja.tech/ja/xcode/xcodeselect%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E9%96%8B%E7%99%BA%E8%80%85%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%A8%E3%83%A9%E3%83%BC/1040649559/
インストールできたらzipを開いて(これもめちゃ時間かかる)XCode.appを/Applications以下に配置します。

これでnpm installが通ったがnpm run devはまだエラーが出ました。
こんなエラー。

```
Invalid regular expression: /(\p{Uppercase_Letter}+|\p{Lowercase_Letter}|\d)(\p{Uppercase_Letter}+)/: Invalid escape
```
原因はnode v8.11.4で行っていた為でした。
nodeのバージョンを最新版にしたらnpm run devが通って無事構築できました。
LambdaとAPI Gatewayを利用してS3のファイルをローカルPCにダウンロードする

ファイルが存在していること前提です。

```DownloadFile.py
# Create instances.
s3 = boto3.resource('s3')
bucket = s3.Bucket(S3Bucket)
S3KeyPrefix = "{your/download/file}"

try:
    # file selected.
    basename = os.path.basename(S3KeyPrefix)
    ext = ""
    if (len(basename) > 0) and ('.' in basename):
        ext = basename.split('.')[-1]
    if (ext != ""):
        try:
            contentType = "application/octet-stream"
            if ext in ("jpg", "jpeg"):
                contentType = "image/jpeg"
            elif ext == "pdf":
                contentType = "application/pdf"
            elif ext == "mp3":
                contentType = "audio/mpeg"
            elif ext == "mp4":
                contentType = "video/mp4"

            tmpPath = "/tmp/" + basename
            bucket.download_file(Filename = tmpPath, Key = S3KeyPrefix)

            res = {
                "statusCode": 200,
                "headers": {
                    "Content-Type": contentType
                },
                "body": base64.b64encode(open(tmpPath, 'rb').read()).decode('utf-8'),
                "isBase64Encoded": True,
            }
            return res
            
        except Exception as e:
            print(e)
            return {
                'statusCode': 404,
                'body': str(e)
            }
```

API Gatewayの29秒問題とLambdaの15分問題の対策はしていません。

##追記
なんてことはない、Lambdaでダウンロードさせることはない。証明書付きURLを発行して、それを踏ませればいい。

```DownloadFile.py
import json
import boto3

def lambda_handler(event, context):
    S3Bucket = "{your-bucket}"
    try:
        path = event['queryStringParameters']['path']
        
        # Create instances.
        s3 = boto3.client('s3')

        ret = s3.generate_presigned_url(
            ClientMethod = 'get_object',
            Params = {'Bucket': S3Bucket, 'Key': path},
            ExpiresIn = 1 * 60 * 60,
            HttpMethod = 'GET')
        
        location = "window.location.href='" + ret + "'"
        html = "<html><head><meta charset='utf-8' /></head>"
        html += "<body onLoad=setTimeout(\"" + location + "\",1000)>"
        html += "<a href = '" + ret + "'>ダウンロード</a>"
        html += "</body></html>"
    except Exception as e:
        print(e)
        return {
            'statusCode': 403,
            'body': 'File Not Found or url expired.'
        }
    return {
        'statusCode': 200,
        'headers': {
            'Content-Type': 'text/html',
            'charset': 'utf-8'
        },
        'body': html
    }
```
日報を230本書いてわかったこと_テンプレあり


エンジニアになって11ヶ月たったので、稼働日は毎日書いている日報は230本となりました
学びを加速させる良いツールだと思っているので、ここでまとめておきたいと思います


# どんな人が書いていますか？
エンジニア11ヶ月目の人です
とはいえ、社会人歴は10年以上あります
専門職系ではないビジネス職でした

#  どんなツールをつかって書いていますか？
[Notion](https://www.notion.so/)です


# テンプレ
[こちらです](https://www.notion.so/25a88b2b26294f22bdf84d5c744ae525)

# よかったこと、効果をかんじたことは？
- 日々のリズムができる
- 忘れがちだけど意識したいことを思い出させてくれる(たとえば自分の場合だとライトな指摘を減らすという課題があるが、そのために具体的に何をしたのか記すセクションを日報に設けているので、毎日なにかしら課題に通じる行動をとることができる)
- 悩んでいる風だったら誰かがコメントをくれる
- 脳内の棚卸しができる
- 棚卸しができることによって、自分はなにがわかっていないのかわりとクリアにできている（と思う）
- 課題がありすぎて凹むが、そんな自分のこともお見通しなので、よかったことをカウントするセクションをもうけてテンションをあげられている



# なぜ日報を書き始めたのですか？
はじめはメンターの先輩に書いてください、といわれたからです


# なんのために日報を書いていますか？
はじめのうちは、先輩がつくってくださったテンプレートに書いていましたが、数ヶ月に一度アップデートしてどんどん自分仕様にしていき、オリジナル性の強いものになってきました
現在は個人[OKR](https://www.kaonavi.jp/dictionary/okr/)のトラッキングと、毎日やりたいことのチェックをしています


# 書く時に意識していることはありますか？
あまり見返す前提では書いていません
はじめは、学んだことをストックするつもりで書いていましたが、会社でナレッジベースをたくさんストックしていこうという動きがあるので、説明書や作業記録はそちらに残すようにしています

反省ばかり書かないようにしています
反省ばかりしてしまいがちなので、明日の活力にするため、持続可能なメンタルを保つためにも、ひとつでもよかったことを数えようとこころがけています

また、1日1日の単位を意識して、プロジェクトとしては途中であっても、1日で出し切る練習をしているつもりです
細分化したタスクを終わらせることであったり、自分の中で不明な点をその日に解消するようにしています

以前は教えていただいたことをすべて日報にメモしていて超大作になっていたのですが、見返すことはあまりないので、自分の次に入ってきた人にも必要な知見であれば会社のナレッジベースにまとめるように方向転換しました


# 書く時のモチベーションはなんですか？
誰かがみてくれていることです
CTOは必ず目を通してくれています
次にメンターの先輩
たまに他の人もみてくれています

日記だと毎日つけられないのに、日報だと毎日つけられるのは、必ず誰かがみてくれる、ゆるーい監視があるからだとおもいます
監視というとキツイ言葉ですが、程よく人の目を意識することにより、アップデートやより意義のあるものにしよう、というメリハリがつくという意味で、必要なものだと思います


# 毎日続けるコツ
- テンプレートをつくる
- 日々の学びをアウトプットできるようなテンプレにしておく
- 疲れていたら雑に書く
- 書かないセクションがあっても良い
- 毎日のリズムとして始業するときに日報を作成しTODOsを書きながら仕事をする
- なるほどとおもったメモも日報にのこす
- 時間をかけない



まだまだ改善の余地はあるけど、とりあえずこんなかんじです
rollup-plugin-vue でビルドしたコンポーネントを Vue2 アプリで使用する場合は、rollup-plugin-vue v5 系を使う必要がある

## 結論

```diff
-   yarn add -D rollup-plugin-vue
+   yarn add -D rollup-plugin-vue@v5.0.0
```

## 背景

2021 年 1 月現在、[rollup-plugin-vue の最新は v6.0.0](https://www.npmjs.com/package/rollup-plugin-vue)だが、これは`rollup-plugin-vue@next`と銘打ってある通り、Vue 3 にしか対応していない。

そのため、`rollup-plugin-vue` でビルドしたコンポーネントを Vue2 アプリで使用する場合は、`rollup-plugin-vue`の v5 系を使用し、ビルドして上げる必要がある。

## エラー内容

Vue で`rollup-plugin-vue`の v6 を使うと、ビルド時は特にエラーが出ない。
しかし、バンドルされたファイルを Vue2 のアプリにインストールすると、以下のようなエラーが発生する。

```log
my-component.esm.js?4799:8 Uncaught TypeError: Object(...) is not a function
    at Module.eval (my-component.esm.js?4799:8)
    at eval (my-component.esm.js:52)
    at Module../node_modules/v2-app/dist/my-component.esm.js (chunk-vendors.js:1223)
    at __webpack_require__ (app.js:849)
    at fn (app.js:151)
    at eval (MyComponent.vue?a75f:9)
    at Module../node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/ts-loader/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/components/MyComponent.vue?vue&type=script&lang=ts& (app.js:950)
    at __webpack_require__ (app.js:849)
    at fn (app.js:151)
    at eval (MyComponent.vue?1254:1)
```

`resolveComponent`, `createVNode`, `createBlock` のような Vue3 にしか存在しないメソッドをバンドルファイル内で使用している模様。

参考: <https://github.com/vuejs/rollup-plugin-vue/issues/363>

## 最後に

~~リポジトリ分けるか、オプションで切り替えられるようにした欲しかった。~~
職業訓練校に通い始めたけどJavaってわけわからないと思っている人のためのUdemy講座

こんにちは。
私は普段はゲームを作っています。

先日、職業訓練校でJavaを学びました。
その際に、プログラミングってなんぞやということから始まったのですが、
副教材として動画の講座を使うのがよかったので紹介します。

こちらです。
【 5日でできる】はじめての Java プログラミング入門
https://www.udemy.com/course/10daysjava/

訓練校にもよると思うのですが、かなりの内容が訓練校と被ってくるので、理解の足りなかったところは動画で捕捉するやり方がよかったです。
訓練校の講師に質問するのもいいのですが、ずっと質問できるわけではないので自宅での復習は必須かと思います。

その際、書籍よりも、受動的でも続けられるのが疲れて帰ってきた状態にもよかったです。
さらに、自宅でやる際にはEclipse（Javaを動かせるアプリ）の導入に困る部分が出ているかと思いますが、それもこちらの動画でフォローしてくれています。
もちろん、文法の基礎から、オブジェクト指向までカバーしてくれているので訓練校の最初から最後までお世話になります。

最終的にはアプリを開発するところまで学べるのでかなりコスパが良いと思います。
おかげで先日、無事に一日も休むことなく卒業することができました。
ありがとうございました。
この場を借りてお礼申し上げます。

・職業訓練校でプログラミングを学び始めた方向けの記事ということでこちらの講座も紹介しておきます。
ピーコックアンダーソンのプログラマー仕事の流儀
https://www.udemy.com/course/jobstyle/
この講師の方はC#の講座を持っていますが、上記の講座ではプログラマーの心構えを教えてくれています。

よかったらどうぞ。
2021/01/31
SymPyの行列を要素ごと定義したい



PythonのSymPyで行列の微分をしようと思い、行列の変数を用意していたのは良いものの、思った以上にめんどくさかったので関数を用意しました。
折角なのでここに置いておきます。
#関数

```python:
import sympy as sym

def queue(name:str,rows:int,cols:int)->sym.Matrix:
    a=[]
    for r in range(rows):
        b=[]
        for c in range(cols):
            b.append(sym.Symbol(name+str(r+1)+str(c+1)))
        a.append(b)
    return(sym.Matrix(a))
```

#使用例

```python:
print(queue('w',5,3))
```

#結果

```
Matrix([[w11, w12, w13], [w21, w22, w23], [w31, w32, w33], [w41, w42, w43], [w51, w52, w53]])
```

以上です。

#追記
SymPyのホームページをみていたら、専用のメソッドがあったので記載

```python:
from sympy import MatrixSymbol,Matrix
X = MatrixSymbol('X',3,3)
Matrix(X)
```

>https://docs.sympy.org/latest/modules/matrices/expressions.html
apt update時に起きた様々なエラー対策

`apt-get update`時に起きた様々なエラー対策、解決方法の備忘録です

## `公開鍵を利用できないため、以下の署名は検証できませんでした`

```
$ sudo apt update
（省略）
...
エラー:8 https://pkg.jenkins.io/debian-stable binary/ Release.gpg
  公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY FCEF32E745F2C3D5
```

以下を実施

```
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys FCEF32E745F2C3D5
```

その後、`sudo apt update`で解決していることを確認

## `ハッシュサムが適合しません`

```
sudo apt-get update -y
...
ハッシュサムが適合しません
```

以下を実施

```
sudo rm -r /var/lib/apt/lists/*
```

その後、`sudo apt update`で解決していることを確認

## `sudo dpkg --configure -a `を実行したところ，`Setting up accountsservice`から進まない

```
$ sudo dpkg --configure -a 
...
Setting up accountsservice (0.6.40-2ubuntu11.6) ...
```

別ターミナルで以下を実行して解決

```
sudo systemctl restart accounts-daemon
```

[accountsservice-hangs-with-installation](https://askubuntu.com/questions/1291090/accountsservice-hangs-with-installation)
[Ubuntuに関する質問 » dpkg --configure -a](https://forums.ubuntulinux.jp/viewtopic.php?pid=122538)

## `gpg: failed to start agent '/usr/bin/gpg-agent': No such file or directory`

```
gpg: failed to start agent '/usr/bin/gpg-agent': No such file or directory
```

以下で解決

```
apt install gpg-agent
```

# 参考
[Ubuntuのapt-get updateで「ハッシュサムが適合しません」と出た時の対処法](https://www.nemotos.net/?p=1428)
[[Ubuntu] apt update時に「公開鍵を利用できないため、以下の署名は検証できませんでした」](https://www.ninton.co.jp/archives/5315)
[ubuntu-18-04-add-gpg-key-failed-with-gpg-agent-not-found-error](https://stackoverflow.com/questions/50318825/ubuntu-18-04-add-gpg-key-failed-with-gpg-agent-not-found-error)
PHPで画像と一言コメントの更新

##### 前提条件：PHP 7.1.29

## ①更新処理を書く前に...

### 1. 送信されてきたファイルを判定
```php
if (!empty($_FILES['image']['name']) && !(exif_imagetype($_FILES['image']['tmp_name']))) {
省略
//送信されてきたファイルが画像ファイルかどうかの判定
```
### 2. 画像ファイル及び一言コメントの存在確認
```php
} elseif (empty($_FILES['image']['name']) && empty($_POST['quick_comment'])) {
省略
//画像ファイルおよび一言コメントの存在確認
```

##②更新処理を書く
```php
} else {
			$sql2 = 'UPDATE users SET image_name = :image_name, quick_comment = :quick_comment WHERE id = :id';
			$stmt2 = $dbh->prepare($sql2);

			//プロフィール画像バリデーション
			if (empty($_FILES['image']['name'])) {
				$image_name = $result['image_name'];
			} else {
				$image_type = exif_imagetype($_FILES['image']['tmp_name']);
				switch ($image_type) { //拡張子取得
					case IMAGETYPE_GIF:
						$type = '.gif';
						break;
					case IMAGETYPE_JPEG:
						$type = '.jpg';
						break;
					case IMAGETYPE_PNG:
						$type = '.png';
						break;
				}
				$dir = './images/';
				if (!empty($result['image_name'])) {//ディレクトリ内の画像削除
					unlink($dir . $result['image_name']);
				}
				$image = uniqid(mt_rand(), true);
				move_uploaded_file($_FILES['image']['tmp_name'], './images/' . $image . $type);//ファイルアップロード
				$image_name = $image . $type;
			}

			//一言コメントバリデーション
			if (empty($_POST['quick_comment'])) {
				$quick_comment = $result['quick_comment'];
			} else {
				$quick_comment = $_POST['quick_comment'];
			}

			$stmt2->bindValue('image_name', $image_name);
			$stmt2->bindValue('quick_comment', $quick_comment);
			$stmt2->bindValue(':id', $_GET['user_id']);
			$stmt2->execute();
			$message = 'アップロードが完了しました。';
		}
```

## ③今回の処理を実装する時に工夫したこと
一つのファイル内で画像と一言コメントの更新処理をしようとした時に
ユーザー側からpostされるものとして考えられる`パターンが3つ`ある。
1.`画像のみ更新`
2.`一言コメントのみ更新`
3.`両方更新`
この3つのパターンそれぞれにSQL文を書いて更新処理を走らせると`コード量が増え`、`可読性が落ちる`うえに何度もSQLを実行することになるため`負担が大きくなる`。
それを防ぐために更新処理を走らせるコードを1つにまとめた方が`コード量が減り`、`可読性も上がる`。
そのためのバリデーションを模索した結果、上記のようなコードとなった。

※初投稿でまだ慣れていない部分もありますが、温かい気持ちで見ていただけますと幸いです☺️
【Udemy紹介】スマホアプリ開発のとっかかりとして

## はじめに
IT業界に携わっているがスマホアプリ開発をしたことがなかったので、
開発してみたいと思いました。
今回は__Udemy__を活用して学習し、とても理解しやすかったので紹介いたします。

## 講座概要
私が受講したものは以下となります。
「React Native入門：ニュースアプリを作りながら覚えよう/Hooks対応版」
https://www.udemy.com/course/react-native-first-step/
(受講時間は約６時間)

名前の通り「React Native」を使って、ニュースアプリを作成することができます。
アプリを作る際は「react-native」で主に開発をしていきます。

開発を通して以下のようなことが学べます。
・スマホアプリ開発のための環境構築〜ストアに公開するまで
・開発で使用するツールや言語についての知識
   ・React Native
   ・React Hooks
   ・Reduxによる状態管理
   ・expo
　　（iOS、Android、Webアプリを開発、ビルド、デプロイするための便利なフレームワーク。）
・API経由でデータを取得する方法
など

## 対象者
【受講サイトに記載されていること】
・Webの開発経験はあるけどアプリの経験はない人
・エンジニア入門者
・React Nativeでの開発を経験してみたい人

【個人的に学ぶ前にしておいた方がいいと思うこと】
・JavaScriptの基礎文法
・ES6での書き方
・Reactの公式チュートリアル（Reactの概要を知っていることでより理解が深まります）
https://ja.reactjs.org/tutorial/tutorial.html
　
## 最後に
初めてモバイルアプリに挑戦してみたい、学んでいきたいという人には最適な内容だったと感じました。
解説者の方もわかりやすく丁寧な印象を受けました。
またUdemyは個人的に「随時セールが行われる」「何度も振り返ることが可能」「他の受講者のQAが確認できる」
「受講する前に講座の評価が確認できる」等の理由からよく利用させていただいております。

学んだことをベースに公式ドキュメント等を通して、個人のアプリ開発をしていきたいですね〜
【JavaScript】reverseメソッドの使い方

#プログラミング勉強日記
2021年1月31日
[昨日の記事](https://qiita.com/mzmz__02/items/d8ae06b84c3368e3147e)でJavaScriptのsortメソッドの使い方についてまとめたが、今日はreverseメソッドを知ったのでreverseメソッドについて簡単にまとめる。


#reverseメソッドとは
　名前の通り、配列の要素を逆順に並び替える。対象となる配列そのものの要素が逆順に並び替えるので、戻り値としても並び替え終わった配列が返される。

```:使い方
配列名.reverse();
```

#使い方

```js
let str = ["baseball", "soccer", "tennis", "swimming", "basketball"];
str.reverse();
 
console.log(str);
```

```:実行結果
["basketball", "swimming", "tennis", "soccer", "baseball"]
```

#注意点
　sortメソッド同様、元の配列を変更してしまう破壊的メソッドである。元の配列を残しておきたい場合には、sliceメソッドで配列のコピーを作成しておくといい。

```js
let str = ["baseball", "soccer", "tennis", "swimming", "basketball"];
let str_copy = str.slice();
str.reverse();

console.log(str);
console.log(str_copy);
```


```:実行結果
["basketball", "swimming", "tennis", "soccer", "baseball"]
["baseball", "soccer", "tennis", "swimming", "basketball"]
```
HerokuへPushする際に「Failed to install gems via Bundler.」エラーが発生

https://devcenter.heroku.com/ja/articles/getting-started-with-rails6

をやっている時に「Heroku push」でつまづいたのでメモ。
![スクリーンショット 2021-01-31 18.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1070382/12c5d844-ab66-1705-e4af-2049a1e85608.png)

https://qiita.com/JFCheval/items/91ba766b63878ff80d23
こちらを試しましたが、エラーがなおらず、、

エラーを見るとHerokuのBundlerのバージョンが2.1.4だったのでローカルのバージョンも合わせてみることに。

バージョンの下げ方はこちらを参照しました↓
https://yumishin.com/heroku-push-error/

```
$ gem uninstall bundler #ローカルのbundlerをアンインストール
Gem bundler-2.2.3 cannot be uninstalled because it is a default gem

$ gem install bundler --version '2.1.4' #Herokuと同じversionのbundlerをローカルにインストール
Fetching bundler-2.1.4.gem/Successfully installed bundler-2.1.4
Parsing documentation for bundler-2.1.4
Installing ri documentation for bundler-2.1.4
Done installing documentation for bundler after 5 seconds
1 gem installed

$ bundler -v #bundlerのバージョンを確認、何故か変わりません。
Bundler version 2.2.3

$ gem list bundler #ローカルにインストールされているbundlerのversionリストを表示
bundler (default: 2.2.3, 2.1.4)

$ rm Gemfile.lock　＃ローカルに入っているbundler(2.2.3)を削除しbundler(2.1.4)で作り直す。

$ bundle _2.1.4_ install
Warning: the running version of Bundler (2.1.4) is older than the version that created the lockfile (2.2.3). We suggest you to upgrade to the version that created the lockfile by running `gem install bundler:2.2.3`.
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for x86_64-darwin-20, ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
以下割愛

$ bundle _2.1.4_ install --without production

$ git add . 
$ git commit -m 'aaa'
$ git push heroku master
$ heroku open
```
でうまくいきました。ご参考までに。
MicrosoftのRPA - Power Automate Desktop 2021年1月アップデートについて

皆さんこんにちは、マイクロソフトの川端です。新年明けて早速ですが2021年1月のPower Automate Desktopのアップデート情報を紹介していきます。

#1. はじめに
元の情報（英語）はこちらになります。
https://flow.microsoft.com/de-de/blog/power-automate-desktop-january-2021-update/

本内容はUIフローのインストールの際に確認できる下記バージョン(2.3.45.21021)での動作内容となります。
https://docs.microsoft.com/ja-jp/power-automate/ui-flows/setup
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/f43a93ad-9b59-765a-b87a-ea128af03e3b.png)


既にPower Automate Desktopを導入済みの場合には、一度Power Automate Desktopを端末からアンインストールし、最新版のインストーラーでお試しいただければと思います。

#2. Power Automate Desktop(一般公開)の2021年1月アップデート情報
###より詳細にフローデザイナーで変数の値を見ることが可能に
こちらのようにフロー実行中や実行後に変数に対応する値を一覧で詳細に参照することが可能となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/6b246824-d3ac-25c8-4bd9-42addacf78ad.png)

フロー変数上でダブルクリックか右クリックすることによって呼び出すことが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/8e825248-3f7c-0a1d-72d9-b0943f8e381f.png)


###[SQL接続を開く]のアクションからデータリンクプロパティを直接呼ぶことができるようになりました。
以前はPower Automate Desktopから直接呼び出すことができなかったSQL接続先の設定(データリンクプロパティ）が直接開けるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/5461674d-d338-b024-d027-2ee8a0f860c2.png)


###Power Automate Desktopの性能向上
リソース最適化（CPU、メモリ使用量）がなされ、フローデザインをより快適に利用することができるようになりました。

###インターネットエクスプローラー上で保護モードの解除が不要になりました。
「保護モードを有効にする」のチェックを行ったままPower Automate Desktopからインターネットエクスプローラーへ動作させることが可能となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/808554/64545ad5-4077-bee7-42e8-42c445aa0bf8.png)

#3. まとめ
月に１～２回のアップデートがありどんどん高機能化しているPower Automate Desktopですが、今後も更なる機能追加をご期待ください！
Power Automate Desktopの[無料トライアルはこちら]
[無料トライアルはこちら]:https://flow.microsoft.com/ja-jp/robotic-process-automation/
AWSのコスト管理に使えるサービスざっくりまとめ

## Cost Explorer
利用料の推移をグラフでいい感じに表示してくれる
![ 2021-01-25 16.47.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244893/f1b235ac-b6e7-377f-dfb3-593b8ff55539.png)


## AWS Budgets
予算のしきい値を超えたとき（または、超えると予測されたとき）に、アラートを発信できる

## Trusted Advisor
推奨事項を教えてくれる

- 使用率の低いEC2インスタンスがある
- 利用頻度の低いEBSボリュームがある
- 未使用のEIPがある
- セキュリティグループにおいて、外部からの無制限アクセスを許可してしまっている

など

## Pricing Calculator
どのサービスをどれくらい使うといくらになるのか、計算できる。
https://calculator.aws/
Nuxt.jsでpluginを快適に運用する（ 型定義ファイルの実装）

Nuxt with jsで開発しているとき、例えば下記のような `~/plugins/api.js` を実装したい。

```~/plugins/api.js
export default function ({ }, inject) {
  const api = new API()

  inject('api', api)
}

class API {
  executeSomething() {
    return 'Hello world!'
  }
}

```

このAPIプラグインを `~/nuxt.config.js` に登録し、

```~/nuxt.config.js

// 中略
  plugins: [
    { src: './plugins/api.js' }
  ]

```

pagesとかで使おうとすると...補完が効かない。

![スクリーンショット 2021-01-31 19.18.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172185/38255689-3c66-e861-0635-84951dd09564.png)

## 対応策

1. `~/plugins/api.d.ts` を作成

```~/plugins/api.d.ts
export declare interface api {
  executeSomething(): String
}
```

2. プロジェクトrootに `index.d.ts`を作成

```~/index.d.ts
import Vue from 'vue'
import { api } from './plugins/api'

declare module 'vue/types/vue' {
  interface Vue {
    $api: api
  }
}
```

わーい🙌

![スクリーンショット 2021-01-31 19.21.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172185/d808f6e5-3e14-71f6-08ed-1393bfab7fac.png)
自分で音楽を作りたいゲームクリエイターのためのUdemy講座

こんにちは。
普段はゲームを作っています。

ゲームを作りたい個人ゲームクリエイターの皆さん！今日もゲーム作ってますか！
私は作ってません！お休み中です！！

それはともかく、そろそろFree音源に飽きましたよね？
自分には音楽なんて作れるわけがないと思っていたのですが、こちらのUdemy講座の教えに従い、音楽制作の一歩を踏み出すことができました。
メロディの作り方〜あなたのメロディが歌になる〜
https://www.udemy.com/course/melody-writing/#instructor-1

マッカートニー先生にも勇気をいただきました。
「マッカートニー教授」の音楽授業
https://www.bing.com/videos/search?q=%e5%ad%90%e4%be%9b%e9%81%94%e3%81%ab%e9%9f%b3%e6%a5%bd%e3%82%92%e6%95%99%e3%81%88%e3%82%8b%e3%81%ab%e3%81%af%e3%81%a9%e3%81%86%e3%81%97%e3%81%9f%e3%82%89%e3%82%88%e3%81%84%e3%81%8b&&view=detail&mid=B837A0E33F9DC23247C9B837A0E33F9DC23247C9&&FORM=VDRVSR

※Wikiより
ポール・マッカートニーとは、
イギリスのミュージシャン。
『ギネス世界記録』に「ポピュラー音楽史上最も成功した作曲家」として掲載。
「イエスタデイ」「ヘイ・ジュード」「レット・イット・ビー」など、ビートルズの代表曲を数多く作詞・作曲している。

StudioOneを使用すれば無料で音楽を作れます。
https://www.mi7.co.jp/products/presonus/studioone/prime/

■講座で学んだこと。

・コードについて
"コード"とは白い鍵盤を一個飛ばしで合わせて三つ以上を鳴らすことを言うようです。
例　ド　ミ　ソ　を同時押し

・メロディについて
基本は三種類（五種類）
1　一定の音
2　上げていく音
3　下げていく音
そして、この上げ下げに
一個コードを飛ばして下げるか、上げるか、でプラス二種類

→
つまり、このコードというのを上げ下げしたりして、良い感じにするのを作曲というらしいです。

これを聞くと簡単に思えませんか？
マッカートニー教授が言っていたのもこんな感じでした。

今回紹介した講師の方は他にも良い感じの講座を出しています。
私も今度購入予定です。
もちろん、Free音源もいいですが、気分を変えて音楽制作してみるのもいいと思います。

よいゲーム制作ライフを！