OmniAICreator/Qiita-1.07M huggingface dataset:
Unity 2019.3.0f3におけるpost processingの利用方法の変更点

タイトル通りです。
Unity [2019.2.17f1] から[2019.3.0f3]へ移行した際にpost processingが動いていませんでした。調べたところ変更点があるようです。共有しておきます。

# 開発環境
- macOS Catalina ver 10.15.2
- Unity 2019.3.0f3

# step 1
Post-process Volumeをremoveして、Volumeスクリプトをアタッチします。
<img width="614" alt="スクリーンショット 2020-01-05 23.01.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191216/df32864c-c40f-80dc-bc49-408a7b2191e8.png">

# step 2
VolumeスクリプトよりProfileを新しく作成
<img width="617" alt="スクリーンショット 2020-01-05 23.01.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191216/74187db5-b6cb-6983-1758-62d4f5acd78e.png">

# step 3
Post-process Layerをremoveして、CameraコンポーネントのRenderingタブ下にあるPost Processingにチェックを入れる
<img width="604" alt="スクリーンショット 2020-01-05 23.05.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191216/05a888b8-d5e1-2ae1-3ff3-e178c7905f87.png">

# step 4
完成
<img width="615" alt="スクリーンショット 2020-01-05 23.05.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191216/fa366bf5-dff8-3f4c-4610-57509a57e635.png">

# 注意点
profileの仕様が変わったため、現段階ではcustom post processing effectを適用できない模様。

# 参考資料
- [Not working in 2019.3.0f1 #868](https://github.com/Unity-Technologies/PostProcessing/issues/868)
- [Volume instead of Post-Process Volume on LWRP](https://forum.unity.com/threads/volume-instead-of-post-process-volume-on-lwrp.746708/)
CognitoUserPoolの情報をLambda経由でRDSへ連携した

#前書き
勉強用に何かしらのウェブサービスを作ろうと常々考えていたのですが、やはり認証基盤を自分で一から作るのは手間が非常にかかるので足踏みをしていました。
そこでCognitoを使おうと思ったのですがサーバーレス構成もNOSQLも使ったことがないのとNOSQL辛いよというアドバイスを頂いたので、とりあえず作るということを優先して日頃なれているRDBに認証情報を放りこみたかったという感じです。
なお技術スタックとしてLambdaではNode.js、RDSにはPostgreSQLを採用しました。

#流れ
1. CognitoのイベントをLambdaでフックする
2. LambdaでCognitoの認証情報を取得する
3. LambdaからRDSへデータを書き込む

## 1. CognitoのイベントフックをLambdaで行う
Cognitoは`サインアップ前`や`確認後`などそれぞれのイベントに合わせてLambdaでフックすることができます。
今回のユースケースでは`確認後`に行うのが適切でしょうか。今回私は`確認後`で設定しました。
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html

## 2. LambdaでCognitoの認証情報を取得する
Cognitoのイベントフックとして使用した場合、Lambdaの`event`引数に認証情報が渡されます。
以下のJson形式で渡される共通パラメータに加えて、各イベントごとに固有のパラメータが追加されます。
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html#cognito-user-pools-lambda-trigger-event-parameter-shared
`確認後`イベントの場合、event.request.userAttributes以下にユーザープールの属性値が入ってくる形になります。
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/user-pool-lambda-post-confirmation.html#w208aac15c27c23c15b9b1
今回私はuserName情報とemail情報を書き込んだので、event.userNameとevent.request.userAttributes.emailになりますね。

## 3. LambdaからRDSへデータを書き込む
### LambdaからPostgreSQLへ接続する
今回のLambdaのためにNode．jsを初めていじったので全く詳しくないのですが、Node.jsからPostgreSQLへ接続するにはpgパッケージを用いるのが一般的なようです。
ただLambda内でnpm installやyarn addを行うことはできないので、別の環境で用意したnodeModulesをLambdaへアップロードする必要があります。
様々な方法があるようなのですが、今回はローカルで作成したコードを雑にzipで固めてアップロードしました。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-deployment-package-nodejs/

### LambdaからRDSへのアクセス制御
細かい話ですがRDSはVPC内に存在しているのでLambdaからアクセス可能にしておかなければなりません。
今回はRDSとLambdaをデフォルトVPCに所属させることとしました。

#成果物
以下のリポジトリです
https://github.com/inobu/cognito-rds-associate
google drive file streamのキャッシュを外部ドライブに置く

## シンボリックリンクでキャッシュを外部に
google drive file streamのキャッシュを外部ドライブに置く方法を見つけたので自分用の覚書です。 
## Macでのやり方

/Users/username/Library/Application Support/Google/DriveFS にキャッシュが置かれるので，これを外付けドライブ等へのシンボリックリンクにする。

```shell
sudo mkdir /Volumes/extdrive/DriveFS
sudo chown username:staff DriveFS
cd /Users/username/Library/Application\ Support/Google
ln -s /Volumes/extdrive/DriveFS DriveFS
```
でextdrive上に逃がせる。

### 参考
https://eiichiromomma.github.io/2017/10/17/Google-DriveFS/
【React Native】アプリ開発 〜ディレクトリの構造化〜



React Nativeでのアプリ開発をはじめました。
基本ではありますが、ディレクトリ構成についてまとめてみました。
今後たくさん加筆修正するので、どんどんコメントください。

# ディレクトリ構成



小ネタですが、homebrewがすでにある場合はターミナルで

```
$ brew install tree
```

として、

```terminal
$ tree
```

とすると、自分が今いるディレクトリのディレクトリツリー（ディレクトリ構造）が入手できるみたい。
第一階層目だけのツリーを

```terminal
$ tree -a -L 2
```

でみると


```
├── .eslintrc.json
├── .expo
├── .expo-shared
├── .git
├── .gitignore
├── App.js
├── app.json
├── assets
├── babel.config.js
├── node_modules
├── package-lock.json
└── package.json
```
こんな感じ。
.eslintrc.json
は前回作成した構文チェック用のやつなので、なくても問題ない。

これから、この階層にsrcというディレクトリを新規作成して、

```terminal
├── .eslintrc.json
├── .expo
├── .expo-shared
├── .git
├── .gitignore
├── App.js
├── app.json
├── assets
├── babel.config.js
├── node_modules
├── package-lock.json
├── package.json
└── src
```
こうなる。src(source codeの略らしい)のディレクトリに必要なコードを全部格納する。

さらに、srcの中に、

- Elements
- Components
- Screens

の3つのディレクトリを新規作成する。

- Elementsはアプリ内で汎用性・共通性の高い要素（ボタンなど）の.jsファイルを入れる場所。
- ComponentsはElements汎用性のあまり高くない（特定のスクリーンにしか現れない）構成要素の.jsファイルを入れる場所。
- Screensは各々のスクリーンについて記述した.jsファイルを入れる場所。

それぞれに.jsファイルを追加すると、srcのディレクトリツリーはこんな感じ。

```terminal
├── Components
│   ├── AhogeComponent.js
│   ├── BhogeComponent.js
│   └── ChogeComponent.js
├── Elements
│   ├── AhogeElement.js
│   └── BhogeElement.js
└── Screens
    ├── SettingScreen.js
    └── WelcomeScreen.js
```

画面遷移のあるアプリを開発するのであれば、App.jsにたくさん書き込むのはおすすめしない。
これらの.jsファイルをimportしながらアプリケーションを構成していくのが基本。
アプリ開発においてディレクトリの構造化は基本にして超重要。

# それぞれの.jsファイルの書き方

編集中...
AWS Certified Machine Learning – Specialtyに合格しました、一回もAI作ったことないけど

AWS 認定 機械学習 – 専門知識に合格しました

筆者はしがないWebエンジニアですがAWSの試験に合格すると会社から報奨金が出るので受験しました

# 私のスペック
表題の通りAIなど一度も作ったことがない、興味はある
上述の報奨金目当てにAWS資格はSAAなど基礎的なものを2つほど持っている

# テスト概要
[AWS 認定 機械学習 – 専門知識公式サイト](https://aws.amazon.com/jp/certification/certified-machine-learning-specialty/)

機械学習の基礎知識と、機械学習向けのAWSサービスに関する知識が問われる
今のところこれ一冊読んでおけば合格できる、という本が無いのがしんどいところ
他の試験のようにAWSの話だけでなく機械学習全般の話にまで及ぶため、
本として出る期待値は低めですね


テーマとしては

* 機械学習関連
  * 機械学習のアルゴリズム全般に関する知識(目的から最適なアルゴリズムの選択、CNNとRNNの違いなど)
  * データの前処理、不均衡データに関する取り扱い、正則化等
  * 自然言語処理(tr-idf、Word2vec及びその他アルゴリズム、文章データの前処理)
  * Apache Spark、jupyter notebook、TensorFlow等AWS関係ない機械学習のライブラリ、フレームワーク
  * 精度、正確度、特異性、再現率の求め方、目的に応じて何を指標とするか
  * 過学習、学習不足の見極め、対処
 
* AWS関連
  * SageMakerの扱い、および組み込みアルゴリズムの知識
  * Amazon Transcribe、AWS Rekognition等フルマネージドなサービスの知識
  * データのリアルタイム処理(つまりKinesis関連)に関する知識
  * EMR、Glue、Athena等データの取り扱いに関するサービス
  * 機械学習の各目的におけるEC2インスタンスの推奨タイプ
  * セキュアなネットワークでS3と学習モデルを接続する手順
 
などなど、専門領域ながら結構色々問われます

# やったこと
#### ネットサーフィン
* ほかの人の合格体験記、ホワイトペーパー、公式情報を眺める

#### 機械学習関連の本を購入

* [Python機械学習プログラミング 達人データサイエンティストによる理論と実践](https://www.amazon.co.jp/Python%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%81%94%E4%BA%BA%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E3%81%AB%E3%82%88%E3%82%8B%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%B7%B5-impress-top-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B01HGIPIAK )
  * 機械学習に関する知識、数式ゴリゴリ、コードも全部乗ってる
  * パーセプトロンと発展的なアルゴリズム、機械学習のほぼ全てが詰まっている
  * カルピスの原液みたいな本、だがAWS関連は一切出てこない
  * 試験に数式や実際のコードは出ないので(若干AWS SDK for Python (Boto3)の使い方くらいは出るかも)ここまで濃い本は要らないかも
  * 何かゆるめの副読本と一緒に読むか人に教わるのを推奨します(自分は人に教わりつつそれの補足目的で買ったのでこれだけ)
 
* [徹底攻略 ディープラーニングG検定 ジェネラリスト 問題集](https://www.amazon.co.jp/dp/B07NDVCN99/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
  * ソリューションアーキテクトのように模試がついてる書籍が(執筆時点では)ないので渋々購入
  * テストの毛色が違いすぎるのでほぼ役に立たなかった(実用性0の問題も含む試験のための試験といった印象)
  * 買わなくてよかったという意味で共有

#### サンプル問題、模擬試験を解く
説明不要ですがよっぽどの自信がない限り模試は買うべきです、
一回何か試験受かると模試の無料クーポン貰えますし

#### udemyの模試

[AWS Certified Machine Learning Specialty: 3 PRACTICE EXAMS](https://www.udemy.com/course/aws-certified-machine-learning-specialty-full-practice-exams/)
[AWS Certified Machine Learning Specialty: Full Practice Exam](https://www.udemy.com/course/aws-machine-learning-practice-exam/)
渋々G検定の問題集を買う程度に模擬試験がなく苦しんでいたらudemyにあった
日本語版がないのがしんどいですがほぼこれらのおかげで受かったようなものです
churn(解約の意)、ingest等この手の問題で出がちな英単語に慣れることで本試験の翻訳クオリティが低い場合に
原文を読みやすくなるので結果オーライなところもある

## まとめ
機械学習の概要をざっくりと理解したところで
英語から逃げずにudemyに課金するのが今のところ最適解

## 感想
そもそも０からのスタートなので大変、今までの試験で一番勉強しました
漠然とロマンだけ感じてた機械学習の何たるかが完全に理解できた(ジョーク)ので良かったです
仕事でやらせてくれないかな...
CarrierWaveで複数画像をアップロードする[SQLite][Heroku]

## note: 2020.12.29追記
私の書いた記事の中では比較的人気なこの記事なのですが、実は、[このQiita記事](https://qiita.com/jnchito/items/68e91e9bf46f960a79e4)を見つけて以来、自分では参照もしないし、人に紹介もしたりしないようにしています。

個人的には、あまり良い実装ではないように思いますので、よろしければ一度下記の記事をお読みになって、それでも「やってみたい！」と思われた方は参照されてみてください。

[ActiveRecord serialize / store の甘い誘惑を断ち切ろう](https://qiita.com/jnchito/items/68e91e9bf46f960a79e4)

## 何をしたか

CarrierWaveで複数画像をアップロードする機能を作りたいと思います。
Imagesテーブルを別途作って多対多のアソシエーションを結ぼうかとも考えていたのですが、こちらの記事で、CarrierWaveが複数画像のアップロードに対応していることを知り、

[CarrierWave 複数の画像をコード三行で一つのカラムに保存する](https://qiita.com/ggtmtmgg/items/ba5f275c122c83013ea1)

この記事が参照している[公式ドキュメントのMultiple Uploadの項目](https://github.com/carrierwaveuploader/carrierwave#multiple-file-uploads)を元に、実装を進めていきました。

個人的にはかなりつまづいたので、備忘も兼ねてメモします＾＾

# テーブルに画像のカラムを追加する

テーブルに（今回は`works`）画像をアップロードするカラム（今回は`images`）を追加します。**カラム名を複数形にする**のを忘れないでください。

```
rails g migration add_images_to_works images:string
rails db:migrate
```

データベースがjsonのデータ型をサポートしている場合（PostgreSQL, MySQLなど）はデータ型をJSONにし、`images:json`と表記します。

# モデルにmount_uploaderメソッドを記載する

CarrierWaveでは、mount_uploaderというメソッドを使って`images_uploader`とモデルを紐づけるのですが、

（↑この説明がピンとこない人は、拙著ですがこちらの記事をご覧ください。「[HerokuでS3に画像をアップロードした話[Rails][S3][CarrierWave][fog]
Rails](https://qiita.com/tanutanu/items/07e9327c1091280c3f13)」）

今回はモデルに以下のような記述をします。
 
```models/work.rb
class Work < ActiveRecord::Base
  mount_uploaders :images, ImageUploader
  serialize :images, JSON # SQLiteを使っているときはこの列を追記
end
```
`mount_uploaders`と**sがついて複数形になっている**のを見逃さないでください。

`serializs :works, JSON`の部分は、まだ理解が十分でないのですが、複数のデータをハッシュの形にして１カラムに保存するための既述のようです。

# view, controllerを調整する
これらのデータを保存／取り出すために、viewの記載は以下のように変更します。

アップロードする際には、`multiple: true`を記載し、複数ファイルを扱えるようにします。

```haml:file_field
= f.file_field :images, multiple: true
```
imageを取り出す箇所では、何番目のイメージを取り出すか記載します。

```haml:view
= image_tag work.images[0].url
```

また、controllerのparamsは以下のように**空の配列をハッシュの中に記載**します。

```ruby:works_controller.rb
params.require(:work).permit(:name, {images: []}, :description)
```

以上で、複数のimageがアップロードできるようになりました！
なお、本番環境（Heroku）ではデータベースがPostgreSQLなので、そのまま動くか心配でしたが、私の場合、上記の設定でアップロードしても大丈夫でした。

ご意見、修正事項あればいただけましたら嬉しいです＾＾
heteml （レンタルサーバー）で cloudfront 設定すると 403 になる

## 現象
heteml に設置した WordPress を cloudfront から配信したら 403 エラーになった。
しかも昔は特にエラーなかったのに、なぜか発生。

heteml 403 で検索しても WAF のエラーばかりでてきて、少しハマったのでメモ。
https://www.google.com/search?q=heteml+403&oq=heteml+403&aqs=chrome..69i57j69i59l2j35i39j0j69i60j69i61j69i60.4183j0j1&sourceid=chrome&ie=UTF-8

## 原因と解決方法
原因は 「海外アタックガード」が、海外からのアクセス制限をされているの原因でした。
heteml のコントロールパネルから、該当のドメインを OFF にしてあげることで解決しました。
https://heteml.jp/support/manual/attackguard/

2019/06/18  にリリースしてるのでだから昔はエラーでなかったみたい。
https://heteml.jp/info/detail/id/2152
2020新春アドベントカレンダー Tech Connect

あけましておめでとうございます。
この記事は**[リンク情報システム](https://www.lis.co.jp/)**が主催するイベント**2020新春アドベントカレンダー Tech Connect!**のインデックス記事です。

Tech Connect! は**勝手に始めるアドベントカレンダー**として、**engineer.hanzomon** のグループメンバによってリレーされます。
記事は年末年始の貴重な時間を割いて執筆しております。しかも記事に社名を付けてくれるという太っ腹な社内の有志達の記事をお楽しみください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272860/11835cef-d122-4f8b-48c7-7d7639f5c2ff.png)
---

| 日付 | id | タイトル |
|:--:|:--|:------------------|
| 1/6(月) | @mk-takahashi | [お試しマルチコア(Spresense)](https://qiita.com/mk-takahashi/items/9f068eabc999dee16243) |
| 1/7(火) | @Go_in_lis | [30分もいらないLaTeX入門](https://qiita.com/Go_in_lis/items/41688cdf89eab8f15f71) |
| 1/8(水) | @mashed-p | [KORG NTS-1をSonic Piから鳴らす](https://qiita.com/mashed-p/items/e2d75b92fb20f12e2c51) |
| 1/9(木) | @sssc | [30分で試すAzure App ServiceのCI/CD](https://qiita.com/sssc/items/497ffc1d12e39eab3b86) |
| 1/10(金) | @aki0ito | [ディープラーニング G検定 を受けた話](https://qiita.com/aki0ito/items/8f145e765282526fd2e4) |
| 1/14(火) | @mefuku | [Nessusインストールと、基本的な使用方法](https://qiita.com/mefuku/items/d22a2747bcdb6ff19d75) |
| 1/15(水) | @n-tanimoto | [Lambda+DynamoDB+CloudWatchでQiitaのいいね数監視を自動化してみる](https://qiita.com/n-tanimoto/items/a545ad55001d841d8739) |
| 1/16(木) | @h-yamasaki | [はじめてのシェーダーお絵描き](https://qiita.com/h-yamasaki/items/ea0d7ef1c13e4fd3a1a1) |
| 1/17(金) | @p3ngu1n | [Hyper-V・OracleLinux7.3・Oracle12cでDBサーバを構築した話](https://qiita.com/p3ngu1n/items/c07b6d6338a899b7f39e) |
| 1/20(月) | @modest | [シャドバの勝ち負けを画像認識で判定する](https://qiita.com/modest/items/6bf4e65d2482cd40ab5f) |
| 1/21(火) | @rysk001 | [Nginx+Expressパフォーマンス計測](https://qiita.com/rysk001/items/db023425ef56ba9bc02a) |
| 1/22(水) | @jaguti @KIMI-D @takahara-advent | [ローマ字入力以外のキーボード入力ってどんなんか](https://qiita.com/takahara-advent/items/b692a80f311d031f807a) |
| 1/23(木) | @s-hchika | [[Excel]図形内のテキストを検索・置換したい](https://qiita.com/s-hchika/items/dda585fa0bdb829e9713) |
| 1/24(金) | @r-kanai | [令和のプログラミング教育](https://qiita.com/r-kanai/items/a5fd13aaf90653385e3a) |
| 1/27(月) | @t_slash_k | [Arduino電子工作～超簡単に人感センサーを扱う～](https://qiita.com/t_slash_k/items/a0565deb5d0de53697b9) |
| 1/28(火) | @o-chang | [discordのコマンド機能を使ってNumer0nみたいなゲームを作ってみた](https://qiita.com/o-chang/items/51214b667511d435e1f1) |
| 1/29(水) | @shinmo | [テッセラクトを使ってリングフィットアドベンチャーのモチベーションを維持したかった話](https://qiita.com/shinmo/items/9fbb4f444f55c9b0d69a) |
| 1/30(木) | @dgkz | [本当なら君たちは手を挙げなければならない](https://qiita.com/dgkz/items/688883a20cb42023fa79) |
| 1/31(金) | @following_ng | [AIノエル・ギャラガーに新しい名言を言ってもらう](https://qiita.com/following_ng/items/728f3e0a15098774e384) |

---
[リンク情報システム株式会社](https://www.lis.co.jp)では**一緒に働く仲間を[随時募集](https://www.lis.co.jp/employ_top)**しています！
また、**お仕事のご依頼**、**ビジネスパートナー様も募集**しております。[お気軽にご連絡](https://www.lis.co.jp/inquiry)ください。
Facebookは[こちら](https://ja-jp.facebook.com/lis.co.jp/)。
Math.floorとMath.randomの組み合わせで簡易抽選アプリを作ってみる

# Math.floorとMath.randomの組み合わせで簡易抽選アプリを作ってみる
新しく2つのメソッドを覚えたので、そのアウトプット用です。

```html
<!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>Document</title>
  <style>
    body{
        text-align: center;
        font-size:100px;
        background-color: aliceblue;
    }
    </style>
</head>

<body>
    <script>
        let lot = ['1等','2等','3等','4等','5等','6等'];
        let number = Math.floor(Math.random()*lot.length);
        
        
        document.write('抽選の結果、あなたは'+lot[number]+'です');
    </script>
</body>

</html>
```

## メソッドの解説
- Math.floor()メソッドは、小数点以下を切り捨てる。
- Math.random()メソッドは、0以上1未満の値をランダムに返す。

##コードの解説
```js
let lot = ['1等','2等','3等','4等','5等','6等'];
let number = Math.floor(Math.random()*lot.length);
```
では、lotという変数に1等〜６等までの文字列を代入する。
**0から1まででランダムに出た値 × lot.length（文字列の要素数を取得するので、6)から小数点以下を切り捨てた値**をnumberという変数に代入する。

```js
document.write('抽選の結果、あなたは'+lot[number]+'です');
```
lot[number]とすることにより、1等〜6等までの結果をランダムに表示することができる。
<img width="1427" alt="8852a65d14f18add93c52201246db328.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499375/d0f41606-f95e-3aca-2254-93bc0616cc65.png">

何等かによって色分け出来ればもっと見栄えも良くなると思います(^_^;)
C#でDrawReversibleLineの実装


#はじめに
以前書いた[JavaのXORModeと同じことをC#でやろうとした時の格闘記]
(https://qiita.com/kimisyo/items/7f83af14f611817c6b36)で、ControlPaintクラスのDrawReversibleLineメソッドを使ったが欠点があったため、Rectangle等と同様ネイティブメソッドを用いて書き直したメモ。

#ControlPaintクラスのDrawReversibleLineメソッドの問題
以下3点あげられる。
1. 描画速度が遅い
2. 描画の座標がクライアント領域をはみ出した場合でも、描画してしまう。
3. 第3引数で与えた色通りに線が描画されない場合がある。

2は、クライアント領域にはみ出さないよう座標を調整すればいいのだろうが、めんどくさすぎる。

3については、以下URLの説明を参照してほしい。
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.controlpaint.drawreversibleline?view=netframework-4.8

この中に以下の記載がある。
「注釈　backColorパラメーターは、背景に対して常に表示されるように、線の塗りつぶしの色を計算するために使用されます。
このメソッドの結果は、同じ行を再度描画することによって元に戻すことができます。 このメソッドを使用して線を描画することは、画面の領域を反転することと似ています。ただし、より広範な色の方がパフォーマンスが向上する点が異なります。」

意味がよく分からないが、実際に描画される色とは別のようである。
そこでネイティブAPIを用いて、前回参考にしたサイトを元に自分で実装することとした。

#コード
コードは以下のとおりである。

```C#
        internal static void DrawReversibleLine(Graphics g, Point p1, Point p2, Point offset, Color color)
        {
            IntPtr hDC = g.GetHdc();

            IntPtr pen = CreatePen(PS_SOLID, 1, ColorTranslator.ToWin32(color));

            int oldROP = SetROP2(hDC, R2_NOTXORPEN);

            IntPtr oldPen = SelectObject(hDC, pen);
            IntPtr oldBrush = SelectObject(hDC, GetStockObject(NULL_BRUSH));

            SetBkColor(hDC, ColorTranslator.ToWin32(Color.White));

            p1.Offset(offset.X, offset.Y);
            p2.Offset(offset.X, offset.Y);

            MoveToEx(hDC, p1.X, p1.Y, IntPtr.Zero);
            LineTo(hDC, p2.X, p2.Y);

            SelectObject(hDC, oldPen);
            SelectObject(hDC, oldBrush);
            SetROP2(hDC, oldROP);
            DeleteObject(pen);

            g.ReleaseHdc(hDC);
        }
```


なお、ネイティブAPIを呼び出すため、以下の通りインポートを忘れずに。

```
 　　　　[DllImport("gdi32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool MoveToEx(IntPtr hdc, int X, int Y, IntPtr lpPoint);

        [DllImport("gdi32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool LineTo(IntPtr hdc, int nXEnd, int nYEnd);
```

#おわりに
実装したところ、元々の3つの問題は全て解消された。めでたしめでたし。
ディクショナリ＝辞書データをforループで処理する itemsメソッド

```py:1
enemies = {"ザコ":"スライム", "中ボス":"ドラゴン", "ラスボス":"魔王"}

for rank in enemies:
    print(enemies[rank] + 'が現れた!')

```

```:1の実行結果
スライムが現れた!
ドラゴンが現れた!
魔王が現れた!
```

ディクショナリのキーと値をペアで取り出すにはitemsメソッドを使う

```py:キーと値をペアで取り出す
enemies = {"ザコ":"スライム", "中ボス":"ドラゴン", "ラスボス":"魔王"}

for rank, enemy in enemies.items():
    print(rank + 'の' + enemy + 'が現れた!')
```

```:キーと値をペアで取り出すの実行結果
ザコのスライムが現れた!
中ボスのドラゴンが現れた!
ラスボスの魔王が現れた!
```

ここでenemies.items()の中身は何なのか、、、、

```py:2
enemies = {"ザコ":"スライム", "中ボス":"ドラゴン", "ラスボス":"魔王"}
print(enemies.items())
```

```:2の実行結果
dict_items([('ザコ', 'スライム'), ('中ボス', 'ドラゴン'), ('ラスボス', '魔王')])
```
リストの中にキーと値がタプルになって入っている。
Vercel(Zeit Now)でお名前ドットコムで取得したドメインを使う

Vercel(Zeit Now)でお名前ドットコムで取得したドメインを使う手順です。

### Vercel(Zeit Now)の管理画面でやること

こちらの[公式ドキュメント](https://zeit.co/docs/v2/custom-domains/#adding-a-domain)に沿ってStep3まで終わらせます。

そうすると[こちら](https://zeit.co/docs/v2/custom-domains/#apex-domains)のように、Nameservers(Recommended)というタブにIntended Nameservers(a.zeit-world.netなど)が表示されます。

### お名前ドットコム側

お名前ドットコムにログインして、左側のメニューからネームサーバーの変更をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6149/dea895c4-f60b-195d-7226-3abdb42a2090.png)

設定したいドメインにチェックボックスを入れて、他のネームサーバーを利用のタブをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6149/56de738f-1614-0543-035e-92187a7fa245.png)

`ネームサーバー情報を入力`というところにIntended Nameserversに表示されていた`a.zeit-world.net`などを入力して、確認画面に進むを押せば完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6149/332045f5-b159-6811-6a33-81df86558379.png)

少し反映に時間がかかるので30分くらい待ってVercel(Zeit Now)の管理画面をチェックしてみるとよいです。
AnimeTask用のオリジナルのTranslatorを実装する方法（Spriteの透過度を変化させる）

UniTaskを使う上でアニメーションライブラリは [AnimeTask](https://github.com/kyubuns/AnimeTask) を愛用しています。
しかし、DoTweenなどに比べるとデフォルトで用意されている変換が少ないので、自分で作らないといけない場合があります。
例えば、透過度はActionを使って…

```csharp
// 事前に sr = GetComponent<SpriteRenderer>() してSpriteRendererを取得しておく
await Anime.Play(
    Easing.Create<OutCubic>(1.0f, 0.0f,2f),
    TranslateTo.Action<float>(value =>
    {
        Color tmp = sr.color;
        tmp.a = value;
        sr.color = tmp;
    })
);
```

と出来ます。

しかし、他のところでも繰り返し使う場合はいちいちActionを記述するのは面倒です。
そういう時はオリジナル Translator を実装することをおすすめします。

やり方は簡単で `AnimeTask.ITranslator` というインターフェイスを使うだけです。 → [参考](https://github.com/kyubuns/AnimeTask/blob/master/Assets/AnimeTask/Scripts/ITranslator.cs)
`Update` メソッドに更新処理を記載してください。
先ほど紹介した `TranslateTo.Action` を使った透過度を変化させる処理と同じような感じで書けば大丈夫です。

```csharp:SpriteRendererAlpha.cs
using UnityEngine;
using AnimeTask;

namespace AnimeTaskExt
{
    public static class ExtTranslateTo
    {
        public static AlphaTranslator SpriteRendererAlpha(SpriteRenderer sr) => new SpriteRendererAlphaTranslator(sr);
    }
    
    public class  SpriteRendererAlphaTranslator : ITranslator<float>
    {
        private readonly SpriteRenderer sr;

        public SpriteRendererAlphaTranslator(SpriteRenderer sr)
        {
            this.sr = sr;
        }

        public void Update(float value)
        {
            Color tmp = sr.color;
            tmp.a = value;
            sr.color = tmp;
        }
    }
}
```

使う際は

```csharp
using AnimeTask;
using AnimeTaskExt;

// 中略

await Anime.Play(
    Easing.Create<OutCubic>(1.0f, 0.0f,2f),
    ExtTranslateTo.SpriteRendererAlpha(sr)
);
```

のように使うことが出来ます。

現在の値から変化させたい場合は `AnimeTask.IValueTranslator` を使います。

```csharp
    public static class ExtTranslateTo
    {
        public static SpriteRendererAlphaToTranslator SpriteRendererAlphaTo(SpriteRenderer sr) =>
            new SpriteRendererAlphaToTranslator(sr);
    }

    public class SpriteRendererAlphaToTranslator : IValueTranslator<float>
    {
        public float Current => sr.color.a;
        private readonly SpriteRenderer sr;

        public SpriteRendererAlphaToTranslator(SpriteRenderer sr)
        {
            this.sr = sr;
        }
        
        public void Update(float value)
        {
            Color tmp = sr.color;
            tmp.a = value;
            sr.color = tmp;
        }
    }
```

```csharp
await Anime.PlayTo(
    Easing.Create<OutCubic>(0.5f, 2f),
    ExtTranslateTo.SpriteRendererAlphaTo(sr)
);
```
タプルのアンパッキング

```py:1
num_tuple = (10, 20)
print(num_tuple)
```

```:1の実行結果
(10, 20)
```

```py:2
x, y = 10, 20
print(x, y)
```

```:2の実行結果
10 20
```

```py:タプルの展開を使って値の入れ替え
i = 10
j = 20
print(i, j)
i, j = j, i
print(i, j)
```

```:タプルの展開を使って値の入れ替えの実行結果
10 20
20 10
```
個人的に便利だと思うショートカットキーをまとめてみました(Windows 10)


#**始めに**
**「ショートカットキー使えばいいじゃん！」**
**「え？なんで使わないの？」**

新卒で仕事を始めた頃に言われてイラっとした言葉です。

「Ctrl＋C」なんて知ってるよ。
別に右クリックして「コピー」押しても変わらないだろ！

なんて思っていたこともありましたが、
一日に何度も行う操作なんかだとやっぱり便利なんですよね。
キーボード-マウス間の手の移動を減らせる点も魅力的です。
  

現在は、自分が良く行う操作のショートカットキーだけは
覚えておこうと考えを改めました。

本記事が読んでくださった方の参考になるかはわかりませんが、
もし「良く行う」操作があれば是非使ってみてください。
ここでは敢えて、私がよく使用するパターンを一例として
ご紹介していきます。




#個人的に便利なショートカットキー
###**Windows10**
Windowsのショートカットキーです。

|キー操作|概要|
|:--|:--|
|Ctrl＋C|選択した範囲をコピー|
|Ctrl＋X|選択した範囲を切り取り|
|Ctrl＋V|コピー、切り取りした範囲を貼り付け|
|Ctrl＋Z|操作を元に戻す|
|Ctrl＋A|すべて選択|
|Ctrl＋F|検索|

[使用例]
- 誤って文字やファイルを削除してしまったときに
「Ctrl＋Z」で復元
- テキストや過去メールなどを
「Ctrl＋A」で全文選択して「Ctrl＋C」でコピー、
「Ctrl＋V」で貼り付け



|キー操作|概要|
|:--|:--|
|Alt＋Tab|アプリやウインドウの切り替え|
|Alt＋Shift＋Tab|アプリやウインドウの切り替え(逆)|

[使用例]
- 申請書や手順書などのドキュメントを同サイズ、全画面にして
「Alt＋Tab」で切り替えて比較し、変更箇所を確認
 

|キー操作|概要|
|:--|:--|
|Windowsキー＋D|デスクトップを表示|
|Windowsキー＋L|画面をロック|

[使用例]
- アプリやウインドウの作業中に「Windowsキー＋D」を押下して
デスクトップを表示、必要なファイルやドキュメントを開く
- PCから離れるときに「Windowsキー＋L」で端末をロック


***
###**Excel**
Excelはショートカットキーが豊富です。
出来ないと思っていることも案外出来たりするので、
是非一度調べてみてください。
個人的にはかなり作業効率が上がった気がします。

|キー操作|概要|
|:--|:--|
|Ctrl＋;|日付を入力|
|Ctrl＋:|現在時刻を入力|
|F2|セル内のデータを編集|
|Ctrl＋EnterまたはShift|同じデータを選択したセルに入力する|
|Ctrl＋D|上のセルのデータをコピー|
|Ctrl＋R|左のセルのデータをコピー|

[使用例]
- 作業日や時刻などを「Ctrl＋;または:」にて入力
- 「F2」を使用することによって、キーボードオンリーで
セルの値を修正
- コピーしたデータを複数セルに同時に入力したいときに
「Ctrl＋Enter」で選択したセルに一括反映
- 「Ctrl＋D」を押下することで、上のセルデータが反映


***
###**メモ帳**
私はメモ帳を電話などのメモ用、サクラエディタを
作業用として使い分けています。
メモ帳は1ボタンで日付と時間が入るため、
インシデント発生時などにも重宝しています。

|キー操作|概要|
|:--|:--|
|F5|現在時刻の表示|

[使用例]
- 電話が鳴ったらメモ帳を開いて受電
その際に「F5」を押下して開始時刻を記載、
終話時にも「F5」で終了時刻を記載




#**最後に**
私がお世話になっている[ショートカットキーの一覧](https://dekiru.net/article/18619/)が
掲載されている記事を参考資料欄に記載しておりますので
是非チェックしてみてください。

良く行う操作があれば、積極的に使って覚えていくのが
おすすめです。


#**参考資料**
[ショートカットキー一覧［完全版］- パソコン仕事が爆速になるWindows、Office、Googleのキー操作 286選](https://dekiru.net/article/18619/)
Outsystemsで非同期処理を実装する方法(Promiseを使う方法)

[Outsystemsで非同期処理を実装する方法](https://qiita.com/tom-k7/items/d8ef19dccb42891a0698)という記事にいくつかの非同期処理方法が書かれていますが、その別の方法の紹介です。

対象はReactive Web Appです。Mobileでも使えますが、Traditional Webは対象外。

# サンプル
Forgeコンポーネント：https://www.outsystems.com/forge/Component_Overview.aspx?ProjectId=7086
Promise Screenを参照してください。

# 環境
Personal Environment(Version 11.0.606.0)
Service Studio(Version 11.6.18)

# 概要
Promiseを使います。
PromiseはOutSystems独自の概念ではありません。Qiitaに普通のJavaScriptでの紹介がありました。
[今更だけどPromise入門](https://qiita.com/koki_cheese/items/c559da338a3d307c9d88)

OutSystemsにおけるPromiseについてのドキュメント：
[Defining Asynchronous JavaScript Code](https://success.outsystems.com/Documentation/11/Extensibility_and_Integration/JavaScript/Extend_Your_Mobile_and_Reactive_Apps_Using_JavaScript/Defining_Asynchronous_JavaScript_Code)

OutSystemsが標準提供する\$resolve/$rejectをJavaScript Elementに書くことで、そのClient Actionは非同期Actionになります(ブラウザに出力されるJavaScriptコードがPromiseで囲まれる)。

# 非同期Client Actionの例
JavaScript Elementを配置し、JavaScriptの出力をActionの出力パラメータに渡します。
![qAsynchronous1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/8c339cfc-b80d-b7b5-cbc0-f85dac0fe58b.png)

JavaScript Elementの内容：

- 同じModuleに用意したREST APIをJavaScriptの機能で取得
    - REST API内ではForgeのSleepを使って強制的に遅くすることで非同期処理の動きを確認
- JavaScript ElementにOutput Parameter Result(Text型)を設定し、通信終了後に、その内容を設定
- 処理の最後(通信終了後のコールバックの最後)で$resolveを呼ぶのが重要。これで呼び出し側に非同期処理の終了を知らせている

```js
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
    if (xmlHttp.readyState === 4 && xmlHttp.status === 200) {
        $parameters.Result = xmlHttp.responseText;
        $resolve();  // ここをコメントアウトすると、このActionの呼び出しはRESTの終了を待たずに終わる
    }
}
xmlHttp.open("GET", "/HousesoftSampleReactive/rest/Promise/LongRunninAPI", true);
xmlHttp.send(null);
```

# 非同期処理を実際に呼ぶ
Client Actionから非同期処理のClient Actionを呼び出すことができます。
この場合、呼び出されたClient Actionで$resolveを実行したタイミングで呼び出し側に制御が戻ります。

また、JavaScriptを使って非同期処理のClient Actionを呼び出すこともできます。

```js
$actions.LongClientAction().then(function(result) {
  $parameters.Out1 = result.Out1;
  $resolve();  // ここをコメントアウトすると、処理がLongClientActionの終了を待たずに終わる
});
```

$actions.<Client Action名>()の呼び出しで非同期のClient ActionをClient Actionから実行しています。
実行したClient Actionからは、Promiseオブジェクトが返ってくるため、そのオブジェクトに対して、then関数を実行しています。

このthen関数は、コールバック関数を引数にとり、Promiseが返ってきた(呼び出し先で$resolveされた)タイミングでそのコールバック関数が実行されます(コールバック関数の引数オブジェクトには、呼び出し先Client Actionの出力パラメータが設定されている)。

# エラー処理
エラー発生時は、エラー内容をOutput Parameterに詰めて返すか、$resolveの代わりに$rejectを呼ぶようにします。
使い方は、上のリンク先を参照してください。
Python3を始めよう。〜何を主言語として選べばよいか迷っている子猫たちのために〜

Pythonは1991年に開発された言語で、組み込みから、webプログラミングから、アプリ開発から、自然言語処理から、人工知能から、ゲームも作れるし、GUIもあり、広汎に活用されている言語です。リスト処理はできるし、当然、ガベージコレクションもあるし、多倍長演算もできるし、オブジェクト指向としても、手続き型言語としても記述可能だし、初学者にもとっつきやすいし、基本的にクロスプラットフォームでLinux,MacOS,Windowsと使えるし、多彩なモジュール群があり、基本的にインタプリタで、実行速度は遅い部類ですが、コンパイラも用意されており、pythonは、今の、これからの言語と言えそうです。ただ、Python2は2020年に開発が終わるので、これから始めるのには、Python3が良いです。



ここでは、プラットフォームは、Ubuntu18.04LTSを取り上げます。

python3.6.xは、Ubuntu 18.04LTSに元々インストールされています。

python3.7の導入は、以下のページをお読みください。
<a href="https://www.sejuku.net/blog/83204"> Ubuntu18.04にPyhton3.7を導入や設定をしよう！</a>

コンパイラについては以下のページをお読みください。
<a href="https://ja.stackoverflow.com/questions/42597/python-%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E5%AE%9F%E8%A1%8C%E5%8F%AF%E8%83%BD%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%81%AB%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF"> Python のプログラムを実行可能バイナリにコンパイルするには？</a>

モジュールの導入は、pipを使ってやります。aptを使わなければインストールできないモジュールもあるようですが。

pipのインストールは、
`$ sudo apt-get install python3-pip`
と、します。

`$ python3 -m pip install SomePackage`
として、モジュールを導入します。

参考ページ：<a href="https://yutarine.blogspot.com/2018/07/ubuntu-python-apt-pip.html">UbuntuでPythonのモジュールをインストールしたいとき、aptとpipのどちらを使って入れようか？と思った話</a>

GUIの話。
<a href="https://hajipro.com/python/python-gui-best">【わかりやすく解説】PythonのGUIライブラリを比較10選 おすすめはどれ？</a>
<a href="https://qiita.com/SquidSky/items/90eb450310f1697d03e9"> Qiita:Pythonで簡単なGUIを作れる「Tkinter」を使おう</a>



この記事は一度、Qiitaにアップしましたが、誤って消してしまったのでもう一度上げます。
UiPath Terminalアクティビティについて　(第1話)

UiPathを使用するとき、時々検索して調べるも使用方法がいまいちわからないアクティビティが存在します:point_up:
さらにUiPathGo!というアクティビティのストアまでできちゃうし、使い方の幅は広がりました。しかし、実際は一部しか使わなくて、大半は使用しなくなるもの運命でしょうか:popcorn:

今回はWebでも書籍でも不明点が多かったTerminalアクティビティを学習します！

#Terminalアクティビティとは
UiPathが公式に出しているアクティビティのひとつです。
主にオフコン製品を自動化するためのもので、おそらく2018年10月ごろ？に出てきたアクティビティだったかと思います。

>オフコン：金融系でよく見るシステムで、真っ黒な画面にカラフルな文字が書いてあるやつです。主にIBMのAS400(いまは"IBM i"に名称が変わっています)等が有名です。

しかもこのアクティビティはUiPathのアカデミーにも掲載がほとんどなく、使用方法といっても使った経験のある方になかなか遭遇する確率は低いです。
またUiPath関連の書籍は複数ありますが基礎的(レコーディング、OCR、エクセルの扱いとか)な内容になっており、Terminalアクティビティは登場しません。

#Terminalアクティビティの特徴
####・セレクタを取得しない
　Terminal系のシステムはカーソル当ててクリック。。。などのGUIではなく、基本はキー操作となります。
　よく使用するのはFunctionキー、CtrlキーやEnterキーなどです。
　大抵、キー操作に関する案内は画面の随所に登場しますので、そこまで路頭に迷うことはないと思います。
その分、セレクタの問題はなくなるため調整するのは座標位置くらいでしょうか。

####・画面の位置を特定
　Terminal系の肝となるのが、画面の位置番号です。
　これは画面(見えづらいですが)の縦横に移動すると番号が出ます(出ないものもある？)ので、その番号を元に位置を特定します。
このため、文字の位置がどこなのか、メッセージは何文字目から登場するとか、そういう調査を実装の前に行うことが重要となります。

####・おおむねキー操作
現場により異なりますが、キーを送信し、画面遷移等を行います。
多くはFunctionキーやEnter.Ctrlなどかなと思われます。

####・文字取得
書いてある文字を範囲指定を含め取得することができます。
なお、「文字が出るまで待つ」というアクティビティもあります。

#Terminalアクティビティを使いこなす
まずはAS400をもとにわかりやすくブレークスルーした絵を下に出します。
1つ目の図はAS400の一般的な画面です。
半角全角、英数字、漢字、ひらがなもカタカナも認識、取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/f8d424e1-cd47-10d9-ff48-e6b373fdca81.png)
>参考URL：https://www.imagazine.co.jp/wp-content/uploads/2017/12/part1-4_zu01-1.jpg

2つ目はAS400の文字についてどうやって取得しているかわかりやすくしたものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/6a092f34-d172-6ade-45a7-3ab9835ac0e4.png)
>上記の図は筆者が作成
※AS400の場合、縦*横が半角80文字×半角80文字になります。

例えば、9文字×16文字の画面の例だと
この場合"1"がどこにあるかというと(2,4)(行,列)にあるということになります。
この座標情報をもとに文字の取得や文字の貼付を実行します。

#Terminal実装時の注意
###1.画像取得はお勧めしない
　Terminal系のアクティビティで画像取得することは一応可能なのですが、
　読込に時間がかかるなどの理由でお勧めしておりません。
　実際、私のいた現場では画像取得で進める箇所がありましたが、途中でNGとなりました。
　(画像取得なくなってからさくさく動くようになりましたが。。)

###2.カスタムアクティビティには不向き？
　これも経験に基づくもので、環境により変化するかもしれません。
　どうやらカスタムアクティビティではセッション(接続)が切れる現象が発生するようです。
　(オフコンに接続できない)
　この場合、接続ができず「Timeout」のエラーが出るはずです。

　そのため、Terminal系を扱うときは「同じワークフロー内で作る」のが良いと思います。

#Terminalアクティビティの今後
特に金融系の企業では今でのほかのシステムへの切替が容易ではないため、オフコンを使用するところも多いと考えます。置換えもしづらいシステムなので、おそらく今後地味に活躍の幅が広がる気がします。

確かにセレクタはほぼ登場しませんので、実装のしやすさは確かに否めないです。
しかし、自宅ではオフコン環境を構築するのは難しいので練習しづらいですし
Webなどクリック操作がほぼない状態なので慣れには時間がかかるかも知れません。
それでも、できることが増えるならよいのではないでしょうか？
「難しい」とは思わず、まずは「楽しい」と思えるようにしましょう。

最後までご覧いただきありがとうございます。
次回はTerminalアクティビティについて使用方法をご説明しますね。

※下記リンク先の資料ではAS400についてわかりやすく説明したサイトがありますので、合わせてご覧ください。
参考URL：https://www.imagazine.co.jp/imagazine-7071/
S3設定

この記事は初学者が作成した物です。

# 前提知識

AWSのS3を使う際に行うセキュリティー対策。
セキュリティー対策を怠った場合
AWSのID&PWが漏れてしまい膨大な金額を請求される恐れがある。
その為にも、セキュリティー面をしっかりと意識しよう

### セキュリティー対策①
二段階認証

AWSをログインする際にAuthyを利用し
従来のID&PWだけでなく30秒事に変わる数列を作成することができます

###セキュリティー対策②
IAMユーザー

IAMユーザーをは、ルートユーザーから一定の権限を与えられたユーザーです。
たとえハッキングを食らっても余計なことができないようにする為の対策です。

###セキュリティー対策③
Githubにコードを載せない。

git secrets --register-aws --global

上記のコマンドは、git secretsをインストールした際にあらかじめ用意されているコマンドの一つです。
git secrets --register-aws で自力で細かな設定をすることなくAWS向けのcommit検査設定を導入することができます。

また、上記とは別に.gitignoreというのもあります。説明は省きますが、ファイルごと載せない方法です。


# S3設定方法

AWSのS3をという機能を使い本番環境での写真データをS3に保存していきます。

まず、保存先を用意します。
AWSのS3でバケット（保存場所）を作成します、
例：testS3にて作成しました。

その後、セキュリティー対策②のために、IAMと連動させていきます。
S3のバケットポリシーにて
IAMユーザーのARN①とバケット名②を記載し保存して保存先が完了します。

```
--略ーー
            "Sid": "Stmt1544152948221",
            "Effect": "Allow",
            "Principal": {
                "AWS": "************①****************"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::************②**********"
        }
    ]
}
```

これで、保存場所ができたので、保存場所に設定されるように変更していきましょう。

###gemインストール

gem 'carrierwave'
gem 'fog-aws'
gem 'mini_magick'

ターミナルにて、

```
rails g uploader image
```

コマンドを実行して、app/uploadersディレクトリ以下にimage_uploader.rbが作成されます。
ここを編集して、MiniMagick経由で画像のリサイズを行えるようにしましょう。

```
  #ここから記載しています。minimagickを使用し300300に縦横比を維持したまま、縦横を800px以内

  include CarrierWave::MiniMagick
  process resize_to_fit: [800, 800]

  #development.testの場合はfileでそれ以外はfogという書き方をしています。

  if Rails.env.development? || Rails.env.test? 
    storage :file
  else
    storage :fog
  end
```

本来であれば、
storage :file
storage :fog
のどちらかを設定すればいいのですが、今回はIFを使い分岐させております。

##モデルを編集しimage_uploaderをマウントする記述を行います。

```
mount_uploader :image, ImageUploader
```

この記述は、モデルを作成していない為行っておりません。

config/initializers直下にcarrierwave.rbを作成。

こちらも同様に条件分岐を記載していきますが、、、

```
--略--
ここにも本番環境時とローカル時の違いを記載します。

CarrierWave.configure do |config|
  if Rails.env.production? #本番環境の時は、fogになります。
  config.storage = :fog
  config.fog_provider = 'fog/aws'
  config.fog_credentials = {
    provider: 'AWS',
    aws_access_key_id: Rails.application.credentials[:aws][:access_key_id],
    aws_secret_access_key: Rails.application.credentials[:aws][:secret_access_key],
    region: 'ap-northeast-1'
  }

  config.fog_directory  = 'testS3'
  config.asset_host = 'https://s3-ap-northeast-1.amazonaws.com/testS3
  else
    config.storage :file #ローカルに保存
    config.enable_processing = false if Rails.env.test? #処理を無視
  end 
end

```

Rails5.2系から導入されたEncrypted Credentialsという機能を利用する必要があります。

以前ならsecret.ymlを利用していましたが、全てcredentials.yml.encを利用します。

※以下VScodeに限ります。

VScodeにてShellをインストール

credentials.yml.encを変更するために
ターミナルにて

```
EDITOR='code --wait' rails credentials:edit
```

AWSの設定を行う

```
# aws:
#   access_key_id: 123
#   secret_access_key: 345
```

最後に
rails c等で必ず設定できているか確認しましょう。


## デプロイ

作成したアプリケーションをCapistranoを使ってデプロイしても、本番環境のアプリケーションはcredentialsを読み込むことができません。

その為にも本番環境で環境変数を使用するために、/etc/environmentsファイルで設定を行いましょう。
M5Stick Vで「Hello World」を出力するまでの最短ステップ

##概要
M5Stick Vがとっても使いやすかったので、「Hello World」を出力できるまでをまとめました。

##準備

- 使用するPC： MacBook Air 
- M5Stick V本体
- USB Type-Cケーブル

##電源を入れてみる
さっそく、M5Stick Vに付属ケーブルでPCと繋ぎます。
すぐに電源が入り、シャキーン！という起動音ともに起動します。

![IMG_6517.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/80f8990a-1305-5f86-31ca-69e3f7a2ffca.jpeg)

起動プログラムが実行され、カメラが直ぐに動きます。
すごく手軽でいいです。

![IMG_1911.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/d6587023-e2e2-6a64-e7bc-59906cd3c066.jpeg)

しかも、この時点で顔認識までしてくれます。

記事を色々調べてると、最初にファームウェアをダウンロードしなければいけないと書いてあるんですが、何もしなくてもここまでできました。
もし、電源入れるだけではカメラが起動しなかった場合は以下の記事を参考にしファームウェアをダウンロードしてみてください。

[macOSでM5StickVをはじめる(リンク)](https://qiita.com/mayfair/items/d1a4ad360670c61ba0fa)

##ファイルを書き込む

###MaixPy IDEで「Hello World」を出力する
MaixPy IDEをダウンロードします。

こちらからできます↓
[MaicPy IDEのダウンロードURL(リンク)](http://dl.sipeed.com/MAIX/MaixPy/ide/v0.2.3/)
＊2020年1月5日現在では、mac版のIDEはv0.2.3が最新です。

アプリを起動しましたら
**ツール　→　ターミナルを開く　→　新ターミナル**
でシリアルターミナルを開きます。

次に、左下のコネクトアイコンからM5Stick V本体と接続します。
![スクリーンショット 2020-01-05 21.24.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/38d93da9-7bbb-8f2d-4ea4-7d465295a5f8.png)

こちらのアイコンを押します。

![スクリーンショット 2020-01-05 13.43.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/4bac09e1-6a18-c494-a0be-7882b2145414.png)

こちらのポップからシリアルポートを選択し接続します。
ボーレートは「115200」に設定します。


![スクリーンショット 2020-01-05 13.44.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/e02ab246-7d72-cd21-fffd-5fc0e03f7a14.png)
このようにシリアルターミナルに出力結果が表示されるかと思います。


次に、左上のアイコンから新しいファイルを開き、編集します。

以下のサンプルコードを入力し、「hello.py」等とファイル名を編集します。

```
import lcd

lcd.init()
lcd.draw_string(100, 100, "hello world", lcd.RED, lcd.BLACK)
```

##出力結果を確認します

ファイルを編集しましたら、左下の開始アイコンを押します。

![スクリーンショット 2020-01-05 13.47.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/15b08499-6bdd-dafb-b1fe-4bed0b9ff80c.png)

こちらのアイコンを押します。

![IMG_9717.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280415/88fac31a-5636-d712-38b4-192363679b3d.jpeg)

出力されました。
とっても簡単でした。
CSS アニメーション

# CSS アニメーション

時の権力者ってのは傲慢なものです。あるリソースを利用してあたかも所有物のごとく他人を牽制するのがメディア（一部アニメ）を支配するやくざならぬ政府ってものです。質問の形をしたパワハラなんて誘導尋問そのもの。

おまえが作った規格じゃないだろ。

おまえが書いたページじゃないだろ。

おまえの書いたプログラムじゃないだろ。

これを乗っ取って利用する輩を排除したい。これはもう自分で書くしかないですね！ってことで CSS アニメーションの書き方です。

基本はこれですね。

```
#rectangle{
  background:#808080;
  margin:0px auto;
  width:400px;
  height: 200px;
  animation: fadeIn 10s;
}

@keyframes fadeIn {
    0% { opacity:0; }
    100% { opacity:1; }
}
```
このひな形があればあとは応用するだけ。これの一部分を隠して表示、代償を要求などすればやくざですね。これをビジネスなど呼びならわす連中は Google 先生が退治してくれる（はずなわけはないですね）。

こんな感じでCSSアニメーションが書けます。

<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="css,result" data-user="easai" data-slug-hash="dyPJYXr" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Happy New Year 2020">
  <span>See the Pen <a href="https://codepen.io/easai/pen/dyPJYXr">
  Happy New Year 2020</a> by easai (<a href="https://codepen.io/easai">@easai</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
<br />
AWSのAPIGatewayのAPIをXMLHttpRequestでリクエストしたらCORS policyエラーが出てしまう場合

# 問題
APIGatewayのCORSでの設定は「Access-Control-Allow-Origin: *」としているのに
下記エラーが発生してAPIのレスポンスがうまく取得できない
```Access to XMLHttpRequest at 'https://xxx' from origin 'https://xxx' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
```

# 治し方
CORSの設定だけではなく、ajaxの設定等が間違えていないか確認する。
私の場合は「Content-Type」をデフォルトにしていたところを「application/json」にしたところ治りました。

# 参考サイト
どうやらCORSの設定ではなく、APIゲートウェイへのアクセス失敗でも発生するエラーのようです。詳しくは下記Qiita記事へ。この記事に助けていただきました。

[API GatewayでのCORS有効化の注意点](https://qiita.com/matsumatsu20/items/0b7342e93daba150fa50)
シェルスクリプト 標準入力のリダイレクト

#### 標準入力のリダイレクト
シェルスクリプトにおいて "リダイレクト"と聞くと、コマンドの結果をファイルに出力する（標準出力）がイメージされますが、その逆にコマンドの標準入力にリダイレクト（ファイルを入力）しているケースがあります。

```bash
command < file
```

#### （追記）tr コマンド
標準入力のリダイレクトを使ったサンプルです。
tr a-z A-Z は、標準入力から入力したアルファベットの小文字を大文字に変換するコマンドとオプションです。
text.txt から hello という文字列をリダイレクトによって trコマンドへ渡しています。

```
$ cat test.txt
hello
$ tr a-z A-Z < test.txt
HELLO
```

#### cat コマンド

~~標準入力のリダイレクトは普段から意識せずに行われていることかもしれません。~~
例えば、cat コマンドを見てみます。

```bash
# 標準出力をテキストファイル(text.txt)にリダイレクトする
$ echo "hello" > test.txt

# cat コマンドで内容を参照する
$ cat test.txt # hello
```

~~cat コマンドは引数に指定したファイルの内容を標準出力に表示できるコマンドですが、ここで標準入力のリダイレクトが行われているようです。~~
~~"<" が省略はされていますが、標準入力(0) に対してファイルの内容が入力され、それがコマンドに渡されているような形になります。~~

（追記）「多くのケースで結果は同じに見えるとは言え、仕組みは違います。」とコメントをいただきました！

~~"<" を省略せずに書いても、同じ結果が得られます。~~
"<" を付けて実行しても、同じ結果が得られることはある。

```bash
$ cat test.txt # hello
$ cat < test.txt # hello
$ cat 0< test.txt # hello
```

#### wc コマンド
wc コマンドでも同様です。

```bash
$ wc -l 0< test.txt # 1
```

#### ls コマンド

ls コマンドで標準入力(0)にルート "/" を渡してあげることで、ルートディレクトリの内容が表示されるのかもと思いましたが、カレントディレクトリの内容が表示されます。

```bash
$ ls 0< /
# カレントディレクトリの内容が表示される
```

ただ、更にもう一つ引数 "/" を与えることで、ルートディレクトリの内容が表示されました。
標準入力(0)に渡した入力は ls コマンドで出力する対象とは考慮されないようです。

```bash
$ ls 0< / /
# ルートディレクトリの内容が表示される
```

#### while コマンド
ファイルの内容を標準入力へリダイレクトする手法は while コマンドでは明示的に行われていることが多いと思われます。

```bash
cat test2.txt
# line1
# line2
# line3
```

```bash
while read line
do
  echo "$line"
done < test2.txt
# line1
# line2
# line3
```

リダイレクト "<" が明示されており、省略はできない。
もしシェルスクリプト内で exec コマンドを使用して、カレントシェルの標準入力に予めリダイレクトしていた場合、while コマンドの標準入力に対して、改めてリダイレクトする必要はない。

```bash
#/bin/bash
exec < test2.txt

while read line
do
  echo $line
done

exit 0
```
Jetson Nano の 2 つのハードウェア PWM を使用してみた。

Jetson Nano の 2 つのハードウェア PWM を使用できたのでメモに残しておきます。
PCA9685 などの I2C 接続 PWM Servo Driver が不要になります。

※ NVIDIA Developer の元の記事は<A HREF="https://devtalk.nvidia.com/default/topic/1057330/jetson-nano/what-pins-can-be-used-for-pwm-control-except-33-in-samples/post/5386543/#5386543">こちら</A>。
※ 参考にした記事は<A HREF="http://deve.sakura.ne.jp/make_robots/2019/09/25/jetson-nano-%E3%81%A7%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2pwm%E3%82%92%E4%BD%BF%E3%81%86/">こちら</A>。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/66f89b9b-bee4-ab35-3ef8-9856b907e208.jpeg" width="75%">

## 環境
- Jetson Nano
 - JetPack 4.3（r32.3.1）イメージファイル　(nv-jetson-nano-sd-card-image-r32.3.1.zip) 
 - Geekservo (灰色) x 2個

## 手順
最初に root になっておきます。(コマンドプロンプトが $ から # に変わります。)

```bash
$ sudo su
#
```

PWM の状態を確認します。

```bash
# cat /sys/kernel/debug/pwm
platform/70110000.pwm, 1 PWM device
 pwm-0   (pwm-regulator       ): requested enabled period: 2500 ns duty: 0 ns polarity: normal

platform/7000a000.pwm, 4 PWM devices
 pwm-0   ((null)              ): period: 20000000 ns duty: 2000000 ns polarity: normal
 pwm-1   (pwm-regulator       ): requested period: 8000 ns duty: 1440 ns polarity: normal
 pwm-2   ((null)              ): period: 20000000 ns duty: 5000000 ns polarity: normal
 pwm-3   (pwm-fan             ): requested enabled period: 45334 ns duty: 0 ns polarity: normal
```

レジスタに PWM の設定をします。
Pin 32 に PWM0 を割り当てます。

```bash
# busybox devmem 0x700031fc 32 0x45
# busybox devmem 0x6000d504 32 0x2
```

Pin 33 に PWM2 を割り当てます。

```bash
# busybox devmem 0x70003248 32 0x46
# busybox devmem 0x6000d100 32 0x00
```

ディレクトリを移動します。

```bash
# cd /sys/devices/7000a000.pwm/pwm/pwmchip0
```

Pin32 の PWM0 を操作します。(値の単位はns)

```bash
# echo 0 > export
# echo 20000000 > pwm0/period
# echo 2500000 > pwm0/duty_cycle
# echo 1 > pwm0/enable
```

Pin33 の PWM2 を操作します。(値の単位はns)

```bash
# echo 2 > export
# echo 20000000 > pwm2/period
# echo 1500000 > pwm2/duty_cycle
# echo 1 > pwm2/enable
```

PWM の状態を確認します。

```bash
# cat /sys/kernel/debug/pwm
platform/70110000.pwm, 1 PWM device
 pwm-0   (pwm-regulator       ): requested enabled period: 2500 ns duty: 0 ns polarity: normal

platform/7000a000.pwm, 4 PWM devices
 pwm-0   (sysfs               ): requested enabled period: 20000000 ns duty: 2500000 ns polarity: normal
 pwm-1   (pwm-regulator       ): requested period: 8000 ns duty: 3920 ns polarity: normal
 pwm-2   (sysfs               ): requested enabled period: 20000000 ns duty: 1500000 ns polarity: normal
 pwm-3   (pwm-fan             ): requested enabled period: 45334 ns duty: 0 ns polarity: normal
```

一度有効 (enabled) の状態にすれば duty_cycle の値を変更するだけでサーボモーターを動かすことができます。
例として Pin33 の PWM2 を連続操作します。

```bash
# echo 1500000 > pwm2/duty_cycle; sleep 1; echo 2500000 > pwm2/duty_cycle
```

最後に PWM を無効にします。
Pin32 の PWM0 を解除します。

```bash
# echo 0 > unexport
```

Pin33 の PWM2 を解除します。

```bash
# echo 2 > unexport
```
基本情報技術者試験の勉強計画　第12週（1/6週）

## 目標と結果
### 目標
・テストのために勉強を朝方に変える
・そのために早起きを徹底する
### 結果
・夜方が抜けない
・早起きはできる
## 振り返り
### keep
・早起き
・過去問を解く
### problem
・寝る時間が遅い
・計算問題を最近触れていない
### try
・もう一度よく復復習する
Laravel データベースから全テーブル名の一覧を取得する

```
$ php artisan tinker
DB::connection()->getDoctrineSchemaManager()->listTableNames();

=> [
     "migrations",
     "failed_jobs",
     "users",
   ]
```

## 参考

- https://stackoverflow.com/questions/33478988/how-to-fetch-the-tables-list-in-database-in-laravel-5-1
Linuxコマンド

※環境はCentOS7。

# 管理関連
* セッションの切断  
```
kill -9 <PID>
```  

# パッケージ関連
* パッケージをリポジトリ内で検索  
```
yum search <クエリー(パッケージ名)>
```
* パッケージの更新  
```
yum update
```

# デーモン関連(.serviceは省略可)
* デーモンの起動  
```
systemctl start <デーモン名>
```
* デーモンの状態確認  
```
systemctl status <デーモン名>
```  
```
systemctl is-active <デーモン名>
```

# その他
* コマンド(プログラム)のありか  
```
which <コマンド名(プログラム名)>
```
Nuxt × Koa × Socket.io の苦難

# はじめに
この記事に解決法は書かれていないので、お急ぎの方はブラウザバックをおすすめします。

作りたいアプリケーションでリアルタイム通信が必要だったので、
サーバーフレームワークをKoaに設定したNuxtプロジェクトにSocket.ioをインストールしてゴニョゴニョやっていたのですが、
これがなかなかしんどくて、かつ解決が不可能ではないがナンセンスそうだったので負の知見共有です。

Nuxt / Socket 知識不足の部分も多くあると思うので、マサカリ歓迎します。

# 本題
NuxtはAPIサーバーまで1コマンドで立って素晴らしいなあ！！！ と思って (参考: [偉大な先人](https://liginc.co.jp/438249)) 、
これをKoaに対応して、この調子でSocket.ioまで導入しようとしていたのですが、どうしてもconnectionイベントが発火しない！

Nuxtなしの生環境ではKoaの ```app.listen()``` の戻り値 (Serverインスタンス) をSocket.ioに渡して初期化(?)するのですが、NuxtのserverMiddlewareとしてAPIサーバーを立てると、Koaの ```app.listen()``` がないので、Serverインスタンスが取れないのです

> この記事を書きながら、もしかして無意味な ```app.listen()``` を書けばいいのでは！？！？！
と思って試しましたが、ムリでした (^q^)

なので、

```js
const handler = app.callback()
const io = socket.listen(http.createServer(handler))
```

として ```app.callback()``` からServerインスタンスを生成し直して渡すしかなさそうなのですが、
(おそらく) 最終的にexportしている、

```js
module.exports = {
  path: '/api/',
  handler
}
```

このhandlerとServerインスタンスの実体が違うせい(?)で接続が成立しない、 ```/socket.io``` のパスが生成されない(?)、のではと想像しています。

実際に、生環境でも ```app.listen()``` でServerインスタンスを取得した場合と
```http.createServer(app.callback())``` で取得した場合で比較してみると、同様に後者の接続が成立しないことからこの結論に至りました。

<details>
<summary>全ソースコード</summary>
<div>

```js
// ~/api/index.js
const http = require('http')
const Koa = require('koa')
const Router = require('koa-router')
const socket = require('socket.io')

const app = new Koa()
const router = new Router()

router.get('/ping', (ctx) => {
  ctx.body = 'pong'
})

app.use(router.routes())
app.use(router.allowedMethods())

const handler = app.callback()
const io = socket.listen(http.createServer(handler))
io.path('/api')

io.on('connection', (socket) => {
  console.log(socket)
  socket.emit('message', [])
})

module.exports = {
  path: '/api/',
  handler
}

```
</div>
</details>

もうExpressにします！
それでもできる保証はないけど！

---

# 追記
## 2020/01/07
Expressにしても無駄なようです。
接続先を別ポートに立てた別サーバーに向けると接続できたので、APIサーバーとの通信にNuxtが噛んでいるのが(?)原因かもしれません。
api下のパスへのアクセスであっても、serverMiddlewareがレスポンスを返さない場合はNotFoundページに飛ぶ (HTMLが返る) ようなのでSocket.ioの使っている (はずの) ```/api/socket.io``` は通してもらえず、通信が成立しないのでは。

Nuxtでリアルタイム通信をしたいときは、おとなしくAPIサーバーを別に用意した方が賢いでしょう。
ま〜、serverMiddlewareはもともとこうやって使うものじゃなさそうなので仕方ないですね。
gitでの操作を間違ってしまった場合

gitを使用していると誤って操作する事があると思います。
その際に戻す操作をまとめておきます。

####git add の取り消し
```console
# 更新作業をインデックスに追加
$ git add . | git add file_name | git add /folder/

# 追加したファイルやディレクトリを戻す
$ git reset . | git reset file_name | git reset /folder/
```

####git commit の取り消し
```console
# 更新作業をコミット
$ git commit -m"コメント"

# 直前のコミットも含めて全て取り消す
$ git reset --hard HEAD^

# 直前のコミットだけを取り消し更新作業は残す
$ git reset --soft HEAD^

#コミット時のメッセージ変更
$ git commit --amend
```

####git push の取り消し
```console
# マスター（リモート）へプッシュする
$ git push origin master

# プッシュの取り消し(強制）
$ git reset --hard HEAD^
# 強制的にプッシュ
$ git push -f origin master

# プッシュの取り消し（履歴残し）
$ git revert HEAD | git revert HEAD~3
```

####参考サイト
[Git-reset](https://git-scm.com/docs/git-reset)
[Git-revert](https://git-scm.com/docs/git-revert)
PHP 連想配列まとめ

# 目的

- PHPの連想配列の書き方をまとめる

# 書き方の例

- 連想配列は若干難しそうに感じるが、通常の配列の値の順番を示す`[0]`などがキーになっただけである。
- 下記に連想配列の書き方の例を記載する。

```php
$変数A = array(
  "キーA" => "入れる値A",
  "キーB" => "入れる値B",
  "キーC" => "入れる値C"
);

//キーAに格納された値Aを出力
echo $変数A["キーA"];

//キーBに格納された値Bを出力
echo $変数A["キーB"];

//キーCに格納された内容を更新
$変数A["キーC"] = "入れる値D";
```

# PHP 5.4以降の例

- 前述した処理をPHP5.4以降のバージョンでのみ記載できる短縮系で記載する。

```php
$変数A = [
  "キーA" => "入れる値A",
  "キーB" => "入れる値B",
  "キーC" => "入れる値C"
];
```
Cloud9のリモートリポジトリをGitLabからGitHubへ移行

GitHub無料ユーザーも無制限にプライベートリポジトリを使えるようになったので、GitLabから移行してみました。

# やったこと
ざっくりとやったことをまとめます。
1. GitHubでリポジトリ作成
2. GitHubのSSH認証用の鍵作成及び登録
3. リモートにGitHubのリポジトリを追加
4. GitHubに内容全部プッシュ

# 参考にしたサイトのリンクと作業内容
この内容に関してはたくさん記事がありますが、いくつかの記事を参考にしないといけなかったのでそのリンクを貼っていきます。
また、部分的に私が実際に実行したコマンドを書いています。

## GitHubでリポジトリ作成
以下のリンクの4番を行いました。他のコマンドは、後で実行する必要ないです。
ただ、リンクの5番の赤丸部分にあるリポジトリのURLに関しては次の手順で使用するのでコピーしてください。
https://qiita.com/sodaihirai/items/caf8d39d314fa53db4db

## GitHubのSSH認証用の鍵作成及び登録
以下のサイトの「cloud9でssh認証用の公開鍵を作る」と「githubに公開鍵を設定する」を参考に実施しました。
リンクは、「cloud9でssh認証用の公開鍵を作る」の部分のものを貼っています。
https://qiita.com/higu1988/items/3a9c4fe528c2388bdc7f#cloud9%E3%81%A7ssh%E8%AA%8D%E8%A8%BC%E7%94%A8%E3%81%AE%E5%85%AC%E9%96%8B%E9%8D%B5%E3%82%92%E4%BD%9C%E3%82%8B

## リモートにGitHubのリポジトリを追加
以下のリンクの"github"を"gitlab"に変更して行いました。
https://sogaoh.qrunch.io/entries/guMLCOhZw3VCHePL

実際に行ったコマンドは以下の通りです。
`git remote -v`
`git remote rename origin github`
`git remote add origin git@github.com:hoge/fuga.git`
"hoge"と"fuga"の部分は前の手順の赤丸部分をSSHに変更してから、修正してください。

## GitHubに内容全部プッシュ
以下のリンクで記載されている、以下のコマンドを実施し、無事移行することができました。
https://sogaoh.qrunch.io/entries/guMLCOhZw3VCHePL
実際に行ったコマンドは以下の通りです。
`git push -u origin --all `

# 最後に
何か間違っているところがあれば、ご指摘いただけると嬉しいです！