OmniAICreator/Qiita-1.07M huggingface dataset:
【Git】git statusで現在の状態を確認する

#はじめに
今回は、gitのコマンドである`git status`について見ていきます。

#git status
`git status`は、ディレクトリの現在の状態を確認するコマンドです。
以下の①〜③の３つの状態で`git status`を行うと、以下のように表示されます。

###①ワークツリーで変更を加えたファイルがない場合

```git:ターミナル
git status
On branch master
nothing to commit, working tree clean
```
###②ファイルに変更を加えたが、まだ`git add`していない場合

```git:ターミナル
git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   <変更を加えたファイル名>

no changes added to commit (use "git add" and/or "git commit -a")
```

###③ファイルに変更を加えて`git add`したが、まだ`git commit`していない場合

```git:ターミナル
git add <ファイル名>
git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   <ファイル名>
```

#`git status`の使えるオプション
###-s(--short)
名前のとおり、短いフォーマットで表示してくれます。

###-b(--branch)
現在のブランチを表示してくれます。
これは、上記の`-s`と一緒に使います。

```git:ターミナル
git status -sb
```

#おわりに
`git status`を使ってこまめに状態を確認する癖を付けると良いかと思います。
ネットワーク関係で調べた用語メモ

# HTTP



- HTTPリクエストメッセージ
    - httpメソッド
        - 主にGETとPOSTがある．
            - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654294/f0768fc1-3ce7-2bad-4c96-919088347298.png)([1]より)
        - https://qiita.com/Sekky0905/items/dff3d0da059d6f5bfabf


    - http要求ヘッダ
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654294/5942fc64-1f7f-0d1c-6f43-af8fda030a21.png)([1]より)


- httpレスポンスメッセージ
    - httpレスポンスコード
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654294/bd52bf3e-9a1c-0050-5edf-f4489e59c81b.png)([1]より)
    - http応答ヘッダ
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654294/49bd55d6-2202-3fbb-ebae-cbc0fc31e5ac.png)



- http referer
    - 直前にいたページURLのこと．（改ざんされている可能性もあり）
    -  https://wa3.i-3-i.info/word129.html
- httpのバージョン
    - 1.0と1.1がある．
    - httpのメッセージヘッダに書かれている
        - 例：`http/1.0`


# SSL/TLS
- ハンドシェイク
    - https://qiita.com/n-i-e/items/41673fd16d7bd1189a29#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE
    - wiresharkだと以下のように見える
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654294/4e9cccd4-e539-9749-3d02-30a678fcc794.png)



# その他
- セッションID(PHPSSEID)
    - https://qiita.com/Fell/items/f64a32dc1f243a12462e
-  302 Moved Temporarily
    -  http/1.0のリダイレクトのこと．
-  URI,URL,URN
    -  uriは詳細なURL的な感じ
    -  https://webtan.impress.co.jp/e/2010/03/09/7539
-  


# 参考
1. [Wiresharkではじめるパケット解析入門 HTTP(Hypertext Transfer Protocol)](http://pcap.it-mem.info/%E5%AE%9F%E8%B7%B5%E3%83%91%E3%82%B1%E3%83%83%E3%83%88%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3/httphypertext-transfer-protocol/)
個人開発でマッチングアプリをリリースした話

# はじめに
人生初の個人開発したiOSアプリをリリースすることができました！
開発期間は約1年半かかってしまいました。。。
原因として、仕事に余裕がある時は平日にも開発したりしてましたが基本的には、やる気がある週末に集中して作業してたりしてたので時間がかかりました。
途中、やる気が0になり実装中断時期もあったことを踏まえるとよく持ち直したという感じです。

# リリースしたアプリ
アプリ名Clan(クラン)というゲームユーザーを探すためのマッチングアプリを作りました。

https://apps.apple.com/jp/app/clan-%E3%82%AF%E3%83%A9%E3%83%B3/id1570006169

## UI
画面はざっくりと以下のような感じです。

|左からユーザー一覧画面 <-> プロフィール画面 <-> メッセージ画面|
|-|
|![スクリーンショット 2021-09-26 13.25.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506410/7e983cde-01e3-d3db-ed85-96f41b8e8358.png)
| 

# きっかけ
 作り始めたきっかけとして、弊社に社内勉強会があるのですが、そのネタ作りのために作り始めました。
UIを作り終える前に私の発表日を迎え、その時の勉強会ではUIの紹介くらいしか発表できませんでした。。。
しかし、勉強会発表後も`リリースまではやり遂げよう`ということだけをモチベーションに開発し続けて、この度リリースしました🎉🎉

 そして `ゲームユーザーを探すためのSNS`というテーマにはこだわりがありません。なんならゲームも普段しません(笑)。
ただ、`人と人をマッチングさせるサービスを作りたい`という思いはありましたので、このテーマに落ち着きました。

# 使用した言語、ライブラリ
せっかくの個人開発アプリなので、自分が好きな技術、学びたい技術に拘りました。
(休みの時間を使うのだから好きな技術にしたい！)

## フロントエンド

- SwiftUI
=> 仕事ではiOS案件自体に携わったことがなかったのですが、アプリを作り始めた頃にSwiftUIが発表されて宣言的UIに魅力を感じたので採用しました。

- Kotlin Multiplatform Moblie
=> 弊社でKMMを採用していた事例もあり、興味があったので採用しました。
正直なところ、後からプロジェクトにKMMを追加したこともあってAPIクライアント、モデルくらいしかKotlinで書けていません。。。
(サーバーサイドもKotlinで書いたのでAPIレスポンスのdata classなどを使いませたのでほんの少しは恩恵があったかもしれない。今後に期待。)

- Firebase(FireStore、Crashlytics、FirebaseUI、Storage)
=> 工数を削るため && 使ってみたかったライブラリを採用しました。

## バックエンド

- サーバーサイドKotlin(Ktor/exposed)
=> Ruby on Railsは仕事を通じて実装経験があったのですが、Ruby以外の言語でサーバーサイドを実装してみたいという興味本位でKotlinにしました。

- AWS
=> AWS/GCP/Azure等どれでもよかったのですが、仕事で触れる機会が多いAWSを採用しました。無料利用枠を前提にデプロイしているので一年後が怖いです😇

- Firebase(Authentication)
=> 認証周りで使用するため採用しました。

# 辛かったこと
### 1. 本当は男女をマッチングさせるマッチングアプリを作りたかった


今年ぐらいまではPairsのようなアプリを予定して作っていたのですが、途中で的身分証明書による本人確認を実装することが必須なことを知り、断念しました。異性を紹介するサービスは調べれば調べるほど個人レベルでは厳しいという知見を得ました。

### 2. アプリのテーマに興味が持てなかった
`ゲームユーザーを探すためのSNSアプリ`というテーマに興味がなかったためモチベーション維持が辛かったです。
個人開発は自分に近いテーマを選ぶことの大切さを実感しました。

### 3. 使い慣れた技術以外で開発したため学習コストが高かった
学習コスト分開発期間が伸びてしまいましたが、個人開発なのでオールOKです(笑)。
実装以外の、App Store申請フローは仕事だと触れる機会が少なく無知だったため腰が重かったのですが学べてよかったです。

### 4. iOS開発時に私物2015年製macbookのファンが鳴り止まないこと
Xcodeのpreviewのせいかファンがうるさいことがストレスでした。早く新型のmacbook発表されないかな〜。

# おわりに
大変自己満足なアプリに仕上がってしまったのですが、技術的には、興味があったものを中心に採用できたので自己成長へと繋げられたのでよかったです。
今後の展望として、自己満足を満たすためだけにApple Developer Programへ１万円弱を払ったのが悔しいのでもう少しアップデートしていけたらと思ってます。
ABC220 C - Long Sequence を解いた

https://atcoder.jp/contests/abc220/tasks/abc220_c

![abc220_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/dac32ce0-6e4e-8a70-2306-4de46e3993a3.png)
![abc220_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/f154f3da-41c5-1bc7-831d-4a0e3df3611d.png)
![abc220_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/bc135106-6041-e51f-f887-7958dcb930ef.png)
![abc220_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737344/ee837321-2b61-c7f1-c855-89ffe9ed62ae.png)

一応、以下で通った。

```LongSequence.py
from sys import exit
N = int(input())
A = list(map(int,input().split()))
X = int(input())

B = sum(A)
base = X//B
rest = X%B

if rest == 0:
    print(base*N+1)#<= ココ1
    exit()
else:
    cnt = 0
    ans = 0
    for i in range(N):
        cnt += A[i]
        if cnt > rest:#<=ココ2
            ans = i+1
            break

print(base*N+ans)
```

問題文には **超えるのは何項目？**っと聞いている。
最初はココ1 and ココ2 を見逃していて、以下のような記述でWAだった。

```LongSequence.py
from sys import exit
N = int(input())
A = list(map(int,input().split()))
X = int(input())

B = sum(A)
base = X//B
rest = X%B

if rest == 0:
    print(base*N)#<= ココ1
    exit()
else:
    cnt = 0
    ans = 0
    for i in range(N):
        cnt += A[i]
        if cnt >= rest:#<=ココ2
            ans = i+1
            break

print(base*N+ans)
```

シャキッと一発で通せるようになりたい。。
サーバー構成

#はじめに

ネットワークの構成が決まれば、各ネットワークに配置するサーバーの構成の検討が必要になる。
今回簡単にまとめていくっ！

#ロードバランサー
ロードバランサーは負荷分散装置と呼び、外部からの通信を複数のサーバーに分散する仕組みを提供する装置。
この仕組みにより、Webサイトへのアクセス集中やサーバー故障などの場合でも、アクセス中の利用者に安定したサービス提供を継続可能になります。ロードバランサーはWebサーバーよりインターネット寄りに配置し、配下にWebサービスを認識させる。

#ロードバランサーの役割

__システムダウンを防ぐ__
ロードバランサーは負荷分散をして過剰なアクセス集中を防ぎ、システムダウンを抑制します。また、故障が疑われるサーバーの切り分けを自動的に行うため、ユーザーはアクセス不能になったサーバーを利用することがなくなります。

__速度低下を最小限に抑える__
ロードバランサーはサーバーの負荷を均等に分け合うので、CPUやメモリなどリソースの効率的な活用が可能になる。
1台あたりの負荷を下げるので処理が高速になり、ページの表示速度の低下を防ぐ。

#ロードバランサーのメリット

__振り分けの方法を選べる__

ロードバランサーは、さまざまな振り分けのタイプがあります。
なかでもよく使用されているのは、アクセスのリクエストをすべてのサーバーに等しく分散する「ラウンドロビン」と、その時点で一番接続数が少ないサーバーに送信する「リーストコネクション」の2種類です。

ほかにも、サーバーにかかっている負荷の比率、CPUやメモリの使用率、一定時間内のコネクション数の平均値などの条件で割り振ることもできます。

__同一のセッションを維持できる__

ECサイトなどのHTTP通信では、商品を選んでから決済を完了するまで、同一のセッションを維持しなければなりません。途中で別のサーバーに切り替わると、意図していないのに異なるサーバーにそれぞれ商品リストを持つことになってしまいます。

しかし、ロードバランサーを使うと1人の利用者は同じサーバーに割り振るため、途中でセッションが途切れることはない。


#ロードバランサーのデメリット

__導入費用が高額になる__
ロードバランサーは機器を設置する必要があるため、導入費用が高額になりやすくなる。

#配属先のネットワーク
サーバー機器はDMZもしくは内部ネットワークに配置する。セキュリティを高めるために基本的にインターネットの通信が通信が発生しないサーバー機器は全て内部ネットワークに配置し、インターネットとの通信が必要となる。
N+1問題

<h2>データ一個でも1+Nである事を教えてくれる　gem 'bullet'</h2>
<p>gemを入れる。これ入れればデータ一個でも1+Nを教えてくれる</p>
<p>それがわからず、データを作りまくりました...(でもログが出なかったのでそこは問題にならない。)</p>
<p>コメント機能などのアソシエーションがかかっていたり、関係があるデータを持ってくるとなると発生する</p>
```:gem
 group :development do
     gem 'bullet'
 end
```
```:ターミナル
bundle install
```
<p>config/enviroments/develop.rbに設定を書く、カスタマイズできる</p>
<p>デプロイ後に,
デプロイ自動化する「GitHub Actions」というGitHubのサービスをやったので、if ENV["CI"] != trueを追加した</p>

```config/enviroments/develop.rb
Rails.application.configure do

 if ENV["CI"] != true

　＃GitHub Actionsを追加していない場合は以下のみでOK
   config.after_initialize do
    Bullet.enable = true
    Bullet.alert = true
    Bullet.bullet_logger = true
    Bullet.console = true
    Bullet.rails_logger = true
    Bullet.add_footer = true
   end

 end
end
```
<p>N+1問題が出るページにいくとログに</p>
```:コンソール
user: ec2-user
GET /staff/ostomies/show/2/6
USE eager loading detected
  Comment => [:staff]
  Add to your query: .includes([:staff])
Call stack
  /home/ec2-user/environment/stoma/app/views/staff/ostomies/show.html.erb:50:in `block in _app_views_staff_ostomies_show_html_erb_'
  /home/ec2-user/environment/stoma/app/views/staff/ostomies/show.html.erb:49:in `_app_views_staff_ostomies_show_html_erb_'


^C- Gracefully stopping, waiting for requests to finish
```
<p>該当行を確認</p>
```html:views/staff/ostomies/show.html.erb
 47       <th>スタッフからのコメント</th>
 48        <td id="staff_comment">
 49         <% @ostomy.comments.each do |comment| %>
 50         <%= comment.staff.name %>
 51         <%= comment.created_at.strftime('%Y/%m/%d') %>
 52         <%= comment.comment %>
 53         <% end %>
 54       </td>
```
````html:views/staff/ostomies/show.html.erb
 47       <th>スタッフからのコメント</th>includes([:staff]).
 48        <td id="staff_comment">  ↓↓↓↓↓↓#追加
 49         <% @ostomy.comments.includes([:staff]).each do |comment| %>　=>>>>ここでデータを全て取りにいく
 50         <%= comment.staff.name %>
 51         <%= comment.created_at.strftime('%Y/%m/%d') %>
 52         <%= comment.comment %>
 53         <% end %>
 54       </td>
```

<h2>N+1　　includesがよくわからなかった</h2>
<p>@ostomy.comments.each do |comment|でコメント取りに行く→投稿した人のデータ取り行くを繰り返すのでデータ取りに行く回数が増える</p>
<p>includes([:staff])を入れることでまとめて取れるのでスムーズになる</p>
```html:
 47       <th>スタッフからのコメント</th>　　=>>>>ここでデータ取りいく
 48        <td id="staff_comment">  #追加前
 49         <% @ostomy.comments.each do |comment| %>
 50         <%= comment.staff.name %>　　　=>>>>ここで[さらに]staffデータ取りいくロスタイム
 51         <%= comment.created_at.strftime('%Y/%m/%d') %>
 52         <%= comment.comment %>
 53         <% end %>
 54       </td>
```
IBM Cloud Technical Advocate v3 受験体験記

# IBM Cloud Technical Advocate v3について
IBM Cloud Technical Advocate v3は、2021年8月から提供を開始したIBM Cloudの初級レベルの認定試験です。
同じく初級レベルの認定試験であるIBM Cloud Advocate v1とは違い、こちらは1年未満のクラウドに関する基礎的な知識と経験を持つエンジニアを試験対象者としています。

正直Technical Advocate v3は、元々受験するつもりはなかったのですが、Advocate v1の勉強中に興味本位でサンプル問題などを眺めていたところ、Advocate v1とそんなに難易度変わらないのでは？？と思ったため、急遽こちらにも挑戦してみました。

Advocate v1の受験体験記も別途掲載していますので、ご興味がある方はこちらもご参照ください。

https://qiita.com/yukinocist/items/e337931dbd8920ba6ebf

# IBM Cloud Technical Advocate v3の試験概要

https://www.ibm.com/training/certification/C0002202


# 筆者の前提スペック
- IBM Cloudは普段の業務で使っている
- KubernetesやOpenshiftは普段からちょこちょこ使っている
- 先日Advocate v1を取得しており、IBM Cloudが提供しているサービスについてもある程度理解している（つもり）
- AWSやAzureの資格もいくつか保持しており、クラウドの基礎はわかっている（つもり）
    - AWS Certified Cloud Practitioner
    - AWS Certified Solutions Architect - Associate
    - Microsoft Certified: Azure Fundamentals
- 英語はあまり得意ではない

# 学習方法
IBM Cloud Advocate v1と同様に、ラーニングパスが公開されており、こちらに沿って学習をしていけば、問題なく合格できると思います。

https://www.ibm.com/training/path/ibmcloudtechnicaladvocate

なお、「Introduction to the Cloud」と「IBM Cloud Essentials」についてはAdvocate v1の受験体験記で紹介していますので、こちらでは割愛します。

## Pre-Assessment
有料の模擬試験です。試験勉強前に腕試しも兼ねて受験したところ、実際はAdvocate v1より難易度が少し高く、ギリギリ合格でした。
試験終了後にスコアと合わせて、各出題分野における正答率が表示されるため、自分が理解できていない分野を把握するのにもちょうどよいのではないかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134250/d6fc1544-6eea-c9af-52da-acb0843161d3.png)

## Building Cloud Native and Multicloud Applications
<img width="170" height="170" src="https://images.credly.com/size/340x340/images/60cc2ff2-e79e-441b-9d9c-4d6fedf81193/Building_Cloud-Native_and_Multicloud_Apps.png">

画像出典: https://www.credly.com/org/ibm/badge/building-cloud-native-and-multicloud-applications

アプリケーション・モダナイゼーションの基礎や、クラウドネイティブなアプリケーションとは？といった部分について学習することができるE-Learningコンテンツです。模擬試験の結果で、「Building Cloud Native and Multicloud Solutions」の得点がなぜかイマイチだったので、復習の意味も込めて、こちらについては一通り取り組みました。

## Containers and Kubernetes Essentials
<img width="170" height="170" src="https://images.credly.com/size/340x340/images/b3fc56fe-3146-428d-b379-68a3490d259f/Containers___Kubernetes_Essentials.png">

画像出典: https://www.credly.com/org/ibm/badge/containers-kubernetes-essentials

コンテナをはじめとして、Kubernetesとは？Openshiftとは？また、それらの違いとは？といった部分について学習することができるE-Learningコンテンツです。KubernetesとOpenshiftについては普段から使っており、内容についてもある程度は理解できてるかな…と思ったので、こちらについては各章末のクイズにのみ取り組みました。

## Additional Cloud Technical Advocate Concepts Study Guide
（2021年12月18日 追記） いつの間にか社外からも参照できるようになったので追記しました。

Technical Advocate v3の範囲について一通り解説したガイドになります。
細かい問題など、このガイドからほぼそのまま出題されたような問題もありましたので、一度は目を通しておくことをおすすめします。

https://ibm.ent.box.com/s/vdwbj5gl9thbcu0288pely6y86ckr68u/file/853388960647

# 試験結果
オンラインで受験し、こちらも無事に合格することができました（模擬試験と同じくギリギリでしたが）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134250/a690afca-df1e-df25-56fd-d4f86ae754bf.png)

試験規約により、具体的な問題文を示すことができませんが、IBM Cloud Satelliteなど、比較的新しめのサービスについても、それなりに細かい部分を問われたという印象でした。ただ、Service系は結構範囲が広いため、Service系についてはある程度は捨てて、IaaS系など他の範囲で得点を稼ぐというやり方の方がよいかもしれません。

# 参考文献
* IBM Cloudの新認定試験IBM Cloud Technical Advocate v3を受けてみた

https://qiita.com/teruq/items/c1086dd52bd427aec224
dApps初心者でもおさえておきたいNFT関連コントラクトの仕組み３選

最近いろいろ調べていて、NFT関連のdAppsは作りやすそうかなーと思ってきました。
DEX系だと処理が大変。。あと、使ってもらえるためにはUIも作り込まないと行けないですしね...
というわけで、私が気になってる＆後で勉強用に中身を解析したいと思ってるコントラクトを3つご紹介します♪
みなさん、私の代わりにコードの分析して記事にまとめたら是非教えて下さいね！（他力本願

# ネットに繋がっていれば無料でソースコードを見て勉強できる

どのブロックチェーンにも大体チェーン内のアカウント情報ややりとりが全て閲覧できるサイトがあります。
Ethereumだと、etherscanとかですね。複数ある場合もあります。

https://etherscan.io/

それぞれのプロジェクトのコントラクトアドレス(プログラムを設置しているアドレス)がわかればソースコードを見ることができるので、実際のサイトの動きを見つつ、「こんな機能が必要」とか「この機能はこう実装すればいいんや！」とかソースコードを真似することができます。


# ① Loot for adventure (Ethereum/Solidity/ERC-721)

https://etherscan.io/address/0xff9c1b15b16263c61d017ee9f65c50e4ae0113d7#code

皆さんご存知のLoot!
もう配布済みだしこんなん今から調べたところで意味ないやんー
と思われるかもしれませんが、
「NFTを作って配布」「NFTの詳細を表示」「オーナーを参照」など
基本的な仕組みを学ぶには非常にシンプルなものを触るのが一番！

すでに類似のコントラクトを作ってらっしゃる方は世界中にたくさんいるので、
あれこれ見てみたいたいなーと思います＾＾

この方はソースコードも公開して、Mediumで解説もされてます↓

https://github.com/ryan-foo/gear-for-cypherpunks

あと、Polygonでもプロジェクトが出てるので、
Ethereumとの違いとかもチェックしたいなーと思っています！

https://polygonscan.com/address/0xbcf3a2d0ec7f39a346490e7c30163ddf6de6a268

# ② CryptoPunks（Ethereum/Solidity/ERC-721）

https://etherscan.io/token/0xb47e3cd837ddf8e4c57f05d70ab865de6e193bbb

NFTを買うには何千万もかかるCryptoPunks。
ソースコード自体はLootと同じく閲覧できるので、
プロジェクトをまるパクリしようと思えばできます♪

https://github.com/larvalabs/cryptopunks

Lootに比べ、NFTをセール状態にしたりするなど、少し複雑な機能が含まれています。
しかし、Lootを先に勉強しておけば、それほど違いはないように思えるので、
第２ステップとしては良い塩梅ではないかと思います＾＾

# ③ OpenSeaCreature（Ethereum/Solidity/ERC-721,1155）

NFT販売所のOpenSeaのNFT制作・販売チュートリアルプロジェクトです。
テストネット,メインネットでのデプロイ方法など解説されています。

https://docs.opensea.io/docs/getting-started

https://testnets.opensea.io/collection/opensea-creature?collectionSlug=opensea-creature&locale=ja

CryptoPunksもそうですが、オープンソースにしてくださってるとことがいいですよね！！

ERC-1155のチュートリアルもあります。
個人的にはこっちの規格の方が気になってるので、
段階的に勉強していきたいです♪

https://github.com/ProjectOpenSea/opensea-erc1155

ERC-1155についての詳細はこちら。

https://ja.enjin.io/blog/erc-1155-token-standard-ethereum

# パくれるからこそオリジナリティが大事！

改めて見てみると、これぐらいなら一人で運用できそう！
あたい、やれる気がする！！
Webの世界は基本真似がしやすいので、
真似されないアイデアだったり、独自性ってのが人々を惹きつけるのかなーと思います。
早く今の時流にあった何かおもしろいdAppsを作ってみたいなぁと思う今日この頃でした♪
Pythonのimport方法まとめ

## 1. 概要
長年PHPを使用してきた私には、Pythonではパッケージのimportに毎回悩まされます。
なので、importの方法とコールの方法をまとめました。

## 2. 原則
1. importできるのはパッケージ、モジュール、クラス、関数、変数 (メソッドはimportできない)
1. importした名前でコールする ⇒ "import" の右側に書いた名前がコールする時の修飾子になる


## 3. 例

### 1. 関数 os.path.join()を使いたい場合
os.pathパッケージはposixpath.py (Windowsの場合はngpath.py) に関数群が定義されている

```Python
import os
# 修飾子はos、path.joinがコールする関数名
path = os.path.join("/", "var", "opt")
```
```Python
import os.path
# os.pathが修飾子、joinがコールする関数名
path = os.path.join("/", "var", "opt")
```
```Python
import os.path.join
# これはimportできない!!
# パッケージ名・モジュール名 + クラス名・関数名・変数名の形式ではimportできない！？
```
```Python
from os import path
# pathが修飾子、joinがコールする関数名
path = path.join("/", "var", "opt")
```
```Python
from os.path import join
# join関数をimportしているので、修飾子はなし、joinがコールする関数名
path = join("/", "var", "opt")
```

### 2. メソッドdatetime.datetime.today()を使いたい場合
datetimeパッケージはdatetime.pyにクラス群が定義されている

```Python
import datetime
# 修飾子はdatetime、datetime.today()がコールするメソッド名
print(datetime.datetime.today())
```
```Python
import datetime.datetime
# これはimportできない!!
# パッケージ名・モジュール名 + クラス名・関数名・変数名の形式ではimportできない！？
```
```Python
from datetime import datetime
# 修飾子はdatetime、datetime.today()がコールするメソッド名
print(datetime.today())
```

## 4. まとめ
```Python
import MODULE
from PACKAGE import MODULE
from PACKAGE.MODULE import CLASS(FUNC or VARIABLE)

```
pandasのデータフレームで特定の値を抜き出す方法

完全にメモです、忘れがちな書式なので。

```python
df_english = df[df['language'] == 'english']
```

単刀直入に以上になります。
データフレームの鍵括弧でTrueになるものが絞り込まれて代入されます。
私が書く時はよく中のdfを忘れがちでつまずいていますw

余談ですが、queryメソッドを使った書き方もあります。

```python
df_english = df.query('language == "english"')
```

上の例だとまぁどっちでもいいやってなりますが、
下のように

```python
df_JHSchool_student = df.query('12 <= age <= 15')
```

例えば中学生であろう年齢の12 ~ 15歳だけ絞り込みたいなぁなんて時はageを挟んでスッキリと書けますね。
よく見るのはqueryを使わない書き方です。

読んでくださった皆様、ここまで付き合って下さりありがとうございました。
Azure DevOpsにおけるAzure Repos（git）にてmainブランチにプッシュやコミットを直接されないようにする方法

## 内容
Azure DevOpsにおけるAzure Repos（git）にてmainブランチにプッシュやコミットを直接されないようにする方法を共有します。

Azure Data FactoryやAzure Databricksでは、Azure Reposと連携できるようになったのですが、間違ってmainブランチにプッシュやコミットされてしまうことへの対応方法を検討する必要がでてきました。ブランチ ポリシーを設定することで対応ができるようです。

## 対応方法

### 1. Azure DevOpsにて、`Repos` --> `Branches` --> `...` --> `Branch policies` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/673a1ca4-2d06-82ff-7cb3-96b71a2d49c0.png)

### 2. `Require a minimum number of reviewers`を`ON`に設定して、下記の設定を実施

- `Minimum number of reviewers`　:　`1`
- `Allow requestors to approve their own changes`　:　`✔`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9890f949-5a04-7338-25ce-eaef7788e64c.png)

### 3. mainブランチにcommitできないことを確認

> Pushes to this branch are not permitted; you must use a pull request to update this branch.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c822e3bd-b0bf-9779-329d-6e9bfcec4aec.png)


## 参考リンク

- [ポリシーを使用して Git ブランチを保護する - Azure Repos | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/devops/repos/git/branch-policies?view=azure-devops)
[Python]関数/Function

## 概要

Pythonのtutorialで学んだ事を記します。

# Pythonにおける関数とは

特定の処理を実行したり、又は値を返したりする名前付きセクションです。
[公式](https://python.land/introduction-to-python/functions)でセクションと書かれているけど、セクションって表現当たってるのか？
> Function
A Python function is a named section of a program that performs a specific task and, optionally, returns a value

## 関数を利用する利点

1. 一度定義すると何度でも利用可能です。
2. コードを短く、簡潔に、読みやすくするのに優れた方法です。
3. 関数に適切な命名をすると、その関数が何をするのかがわかり、コードがより読みやすくなります。
4. 他の人や、自分が後になってコードを見返した時に、適切に関数が使われていると、コードが読みやすい。

## パラメータ(仮引数)

関数はパラメータを定義できます。

このパラメータを使って、関数からの返り値を返ることができます。

## 返り値(return)

関数は値を返すことが出来ます。

関数の中に定義してある処理に基づいて生成した値を返すのが一般的な使い方です。

# ビルドイン関数

ビルドイン関数とは、Pythonに元から組み込まれている関数のことです。自分で定義しなくても使用することが出来ます。

print関数やlen関数などが良い例です。

```python
>>> print("Hello World")
# Hello World
>>> len("Hello World")
# 11
```

# 関数を定義しよう！

関数を定義するには下記のように記述します。

```python
# 定義
def show_hello():
    print("Hello")

# 実行
>>> show_hello()
Hello
```

1. `def` で関数を定義する事を宣言
2. `関数名` を記入し、 `()` 、 `:` を記述する。
3. インデントで `def` より後に処理内容を記述していく。他の言語と比べてインデントが重要な役割を持っているのが特徴です。

## インデント

Pythonではインデントを使用して、ブロックを区別しています。

したがって、 `def`のブロックに記述したいなら、インデントを使用して、 `def` より後ろに処理内容を記述する必要があります。

## パラメータと引数

関数にパラメータを定義して、引数に値を渡すことでprintされる文字列を変えることが出来ます。

パラメータ・・・関数内で定義された変数

引数・・・関数を実行する時にパラメータを介して渡す値

```python
>>> def show_hello(name):
...			user_name = name	
...     print("Hello" + user_name)
... 
>>> show_hello("Kenta")
HelloKenta
```

## スコープ

スコープとは、変数や関数が宣言された場所のこと。

先ほどの関数を例にすると、関数内では変数 `user_name` は使用できましたが、関数外でprintしようとするとエラーになります。

これは、関数内で定義された変数は定義されたスコープ（今回だとshow_hello関数内）でしか使用できないからです。

なので、関数外でも使用したい変数は関数外で定義しましょう。

```python
>>> def show_hello(name):
...			user_name = name	
...     print("Hello" + user_name)
... 
>>> show_hello("Kenta")
HelloKenta

>>> print(user_name)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'user_name' is not defined
```

## 複数の引数

関数で使用できる引数は一つだけではなく、複数指定することが可能です。

下記のように２つパラメータを定義すると、2つの引数を指定できるようになります。

左から、第一引数、第二引数、、、と数えます。

```python
>>> def full_name(first_name = "Tanaka",second_name = "Masasi"):
...     print(first_name + " " + second_name)
... 
>>> full_name("Tanaka","Masasi")
Tanaka Masasi
```

## デフォルト値と名前付きパラメータ

パラメータにはデフォルト値を設定する事が出来ます。

下記のように `パラメータ = デフォルト値` とすると、引数で値を渡さなくても、デフォルト値が表示されます。

```python
>>> def full_name(first_name = "Tanaka",second_name = "Masasi"):
...     print(first_name + " " + second_name)
... 
>>> full_name()
Tanaka Masasi
```

第一引数はデフォルト値で、第二引数だけ値を渡したい時は、名前付きパラメータを使用できます。

下記のように引数に値を渡す時に、パラメータを指定して、値を渡してあげることで特定のパラメータに値を渡す事が出来ます。

```python
>>> full_name(second_name = "Yujirou")
Tanaka Yujirou
```
個人的に覚えておきたい集 curlコマンド

curlコマンドについての使い方が曖昧だったので、今回はcurlコマンドのオプション等をいくつかまとめました。

#基本書式
curlの書式は以下の通りとなっています。
オプションに何も指定しない場合、接続先のHTTPリクエストをそのまま標準出力します。

```
curl [オプション] [接続先URL]
```

#アクセス先のファイルをダウンロードする
ダウンロードする方法はいくつかありますが、基本は`-O`オプションとなります。
保存するファイル名を指定する場合は`-o`オプションを使用します。

```
curl -O [接続先URL]
curl -o [保存先パス/ファイル名] [接続先URL]
```

#ファイルをアップロードする
`-T`オプションを使用すると、ファイルのアップロードを行えます。
通常あまり使用する機会はないかもしれませんが、Artifactory等のサーバーにファイルをアップロードするとき等に使用されます。
アップロード対象ファイルがカレントディレクトリ内に無い場合も対象ファイルへのパスを指定することでアップロードができます。

```
curl -T [パス/ファイル名] [接続先URL]
```

#ユーザー認証を求められる場合
`-u`オプションを追加することで接続先のユーザー認証をコマンド上で追加することができます。
スクリプト等でユーザー認証からその後の処理までワンラインで実行できます。
なお、`-U`オプションの場合は、プロキシ認証となります。

```
curl -u [ユーザー名]:[パスワード] [接続先URL]
```

#コマンド実行結果を表示させない
コマンド実行時のメッセージを非表示にするには`-s`オプションを使います。
さらに`-S`を追加するとエラーメッセージのみ表示できます。

```
curl -s [接続先URL]
```

#リダイレクト先にアクセスしたい場合
接続先のURLがリダイレクトされている場合、`-L`オプションを使用することでリダイレクト先へアクセスするようになります。

```
curl -L [接続先URL]
```
【React】徐々に組み上がっていく背景イメージを実装する

<!-- =========================================================== -->
# 概要
<!-- =========================================================== -->
**アニメーションで徐々に組み上がっていく背景イメージ**を実装します。
`JS Animation`とありますが、使用するのは**CSS Animation**です。

![output(video-cutter-js.com) (7).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358498/6530ebc4-cda0-a864-8e25-936f0fc05269.gif)

:::note info
本記事は、以下の動画を<strong>React</strong>で実装したものです。
:::

https://www.youtube.com/watch?v=abo0x86sQb4

:::note info
スタイリングには、<strong>emotion/css</strong>（CSS in JS）を使用しています。
:::

https://emotion.sh/docs/@emotion/css

https://qiita.com/nemutas/items/dac73aa645f27cde92cd

<!-- =========================================================== -->
# 実装
<!-- =========================================================== -->
```.tsx
import React, { VFC } from 'react';
import { css, keyframes } from '@emotion/css';

export const AnimatedBackgroundImage: VFC = () => {
	const bloks = 400

	return (
		<div className={styles.container}>
			<h2 className={styles.title}>JS Animation</h2>
			<div className={styles.banner}>
				{[...Array(bloks)].map((_, i) => (
					<div key={i} className={styles.block(i * 0.05)}></div>
				))}
			</div>
		</div>
	)
}

const animations = {
	animate: keyframes`
    0% {
      opacity: 0;
      transform: scale(0) translateY(1000px);
    }
    50% {
      opacity: 1;
      background: url('/assets/bg.jpg');
      background-position: center;
      background-attachment: fixed;
    }
    100% {
      opacity: 1;
      transform: scale(1) translateY(0);
      background: url('/assets/bg.jpg');
      background-position: center;
      background-attachment: fixed;
    }
  `
}

const styles = {
	container: css`
		position: relative;
		width: 100vw;
		height: 100vh;
		background-color: #333;
		display: flex;
		justify-content: center;
		align-items: center;
	`,
	title: css`
		position: absolute;
		font-size: 10vw;
		color: #fff;
		font-weight: 700;
	`,
	banner: css`
		position: absolute;
		top: 0;
		left: 0;
		width: 100%;
		height: 100%;
		overflow: hidden;
		display: flex;
		flex-wrap: wrap;
	`,
	block: (delay: number) => css`
		position: relative;
		display: block;
		width: 5vw;
		height: 5vh;
		animation: ${animations.animate} 0.75s ease-in-out ${delay}s forwards;

		&:nth-child(even) {
			animation-duration: 1s;
		}
		&:nth-child(7n + 3) {
			animation-duration: 2.5s;
		}
		&:nth-child(7n + 7) {
			animation-duration: 1.5s;
		}
	`
}
```
* アニメーション実行時に、イメージを固定しておくのがポイントです。

```.tsx
background-position: center;
background-attachment: fixed;
```

https://developer.mozilla.org/ja/docs/Web/CSS/background-position

https://developer.mozilla.org/ja/docs/Web/CSS/background-attachment
Pythonのクラスを習得した記念にゲームを作る

# はじめに
### 初学者を脱しつつある者を襲う贅沢な悩み

クラスについて学ぼうと多くの解説サイトを訪れたが、ほとんどの解説サイトは私を満足させなかった。
[Flaskの学習](https://qiita.com/mo256man/items/2e9310dc41de657d069e)をしたときも同様だった。Pythonを一から学ぶ人向けの教材ならともかくFlaskやクラスを学ぼうとしている人にHello worldレベルのプログラムを見せられても物足りなさを感じてしまうのは当然のことだ。
何とかしっくり来たのはこちらの個人サイトだった。

https://snowtree-injune.com/2019/02/11/python-class-necessity/

### クラスの利便性に気付く
夏休みの自由研究としてディープラーニングを駆使したアプリを作った。仕様を充実させていくにつれ関数に送る引数がどんどん増えていき、収拾がつかなくなってしまった。複数の変数を一つの辞書に登録することも考えたが、どうも違う。こんなとき先達たちはどうしていただろうか。

そう考えて思い出したのがクラスだった。

九割方できていたコードをほとんど見直すことになってしまいそちらの完成は延期となった。そのかわりクラスを意識したちょっとしたプログラムをゼロから作った。

# クラスの実装と改良
作ったゲームはこんな感じ。なぜこんなのを作ったかは今となってはわからない。
最初は「ちょっとしたプログラム」だから隕石なんて赤丸でいいじゃんと思っていたのだが、[スプライト関数](https://qiita.com/mo256man/items/d89c53a39c8e82b9c889)を自作しておいてそれを使わないなんてとんでもない！とどんどん凝っていってしまった。

![game_anim.gif](http://www.ric.hi-ho.ne.jp/momo256/game_anim.gif)

### 改善前
最初はスコープの扱いがよくわからず、次のようなグローバル変数頼みのコードを書いていた。

```Python:before
class Game():
    def __init__(self):
        BeamとMeteorを扱うのでクラス内でグローバル変数beamとmeteorsが使われている 

class Beam():
    def __init__(self):
        GameとMeteorを扱うのでクラス内でグローバル変数gameとmeteorsが使われている

class Meteor():
    def __init__(self):
        Gameを扱うのでクラス内でグローバル変数gameが使われている

def main():
    ループ内で
        meteors.append(Meteor())
        など

# ここ、グローバル
game = Game()
beam = Beam()
meteors = []

if __name__ == "__main__":
    main()
```

### 改善後
だが、それでは駄目だと考え直し、次のように作り直した。これによりグローバル変数を使うことなく、またクラス間の主従関係（？）もわかりやすくなった。
ここに至るまでに4～5回は全体的なコードを書き直している。これもまた経験だ。

```Python:after
class Game():
    def __init__(self):
        self.meteors = []
        self.beam = Beam(self)
    
class Beam():
    def __init__(self, game):
        略

class Meteor():
    def __init__(self, game):
        略

def main():
    game = Game()
    ループ内で
        game.meteors.append(Meteor(game))
        など

if __name__ == "__main__":
    main()

```

# もう一つの課題
きれいなコードを書きGitHubに公開することも夏休みの課題の一つだった。だから今回はいろいろがんばったのだが、肝心のGitHubへのコミットがうまくいかなかった。もう一度一から勉強しなおさなくては。
無理やっこアップロードしたのがこちら。

https://github.com/mo256man/meteor_shooting

# 終わりに
「ちょっとしたプログラム」に1か月以上かかってしまった。夏休みに作っていたメインの作品の完成はいつになるのだろう。
C/C++のランダムな浮動小数点数

# はじめに
IEEE 754に従って, 一様分布な[0, 1)の浮動小数点数を作るにはこれしかないのではないか, というはなし.

# ランダムな浮動小数点数
ランダムな[0, 1)を作ろうとすると次のようになると思われます. このような無茶苦茶な？型変換ができない言語でも結果的にこんな感じになっていると思われます. 応用すると, (-1, 1)の範囲なども簡単に実現できます.

```cpp
float frand01(uint32_t x)
{
    static const uint32_t m0 = 0x3F800000U;
    static const uint32_t m1 = 0x007FFFFFU;
    x = m0|(x&m1);
    return std::bit_cast<float, uint32_t>(x) - 1.000000000f;
}
```

# まとめ
~~完全かと言われると, そうなるわけがないです. 浮動小数点数が表現できる数の分布が偏っているので, どうやっても不可能です. 固定小数点数を使うべきです.~~

頑張ればできるのかな？私は頭が悪いので効率的な方法を思いつかないです.

# 追記
浮動小数点数のはなしなのに、固定小数点数を使えって何を言っているのか.

## 制限
制限を書いてないのは不公平でした.
 
- 結果に関わる計算に, 結果より高精度の演算を使わない
- 速いと嬉しい
    - 今時, 割り算でも大した速度差ない気がしますけど

(-1, 1)の. @fujitanozomuさんの方法だと精度が上がって, 0.999999940fが上限になるので引き算する定数も変わります.
手で演算をまとめると3.0の方が近いので結果が異なります.

```cpp
float frand11(uint32_t x)
{
    static const uint32_t m0 = 0x40000000U;
    static const uint32_t m1 = 0x007FFFFFU;
    x = m0|(x&m1);
    return std::bit_cast<float, uint32_t>(x) - 2.0f - 0.999999881f;
}
```

STLは大体こんな感じだった気がします. 

```cpp
float frand01()
{
    while(true){
        uint32_t x = (一様乱数);
        float result = x * (浮動小数点数の表現できる最大整数値)/(乱数の最大値);
        if(result<1.0f){
            return result;
        }
    }
}
```
AZ-400:Designing and Implementing Microsoft DevOps Solutions試験対策サイトまとめ

## はじめに

本記事では、Designing and Implementing Microsoft DevOps Solutionsを受験された方の体験談を元に模擬試験など試験対策に利用できるサイトをまとめました。

AZ-400はAzureの認定試験の中では上級(Expert)に分類されるが、DevOpsやInfrastructure as Codeなどのキーワードに予備知識があるエンジアであれば、合格はそれほど難しくないので、
AZ-104, AZ-400など中級資格に合格された方は積極的に受験してみてはいかがでしょうか。

## 無料サイト

紹介させていただいたサイトが所謂ダンプサイト(受験者が試験内容を流出させているサイト)に該当する可能性があるため、MSの試験ポリシー違反になる可能性があるので、打消し線にさせていただきました。

* <del> EXAMTOPICS (英語) </del>
https://www.examtopics.com/exams

* <del> vceguide (英語) </del>
https://vceguide.com

---

## 有料サイト

* Whizlabs (英語)
https://www.whizlabs.com
[Whizlabs紹介記事](https://ohina.work/post/whizlabs/)

* Skillcertpro (英語)
https://skillcertpro.com

---

## 合格者の学習ノートや体験談

https://ravikirans.com/az-400-azure-exam-study-guide/

https://zenn.dev/ohina/books/a094e5e8177aa0e48408
M5Stickcを搭載したBugc（虫型ロボット）をBlynkを使ってスマホから操作してみた

# 概要
[M5StickC](https://www.switch-science.com/catalog/5517/)をベースとした虫型ロボット[Bugc](https://www.switch-science.com/catalog/6208/)をBlynkのスマホアプリで操作するプログラムを作成しました。BlynkのFront/Back/Left/Rightのボタンを押すとその方向に進み、スライドバーで速度が指定できる。Bugcの特性上Frontを押してもきれにまっすぐに進まないが、それらしき方向には進む。子供が結構喜ぶ（クラウド経由で操作してるんだぞといっても理解はされないが）。
![スクリーンショット 2021-09-26 19.08.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512829/96b416b2-b0aa-4492-8798-9194186c51b5.png)

# Github リポジトリ
https://github.com/takurot/m5stickcBugcBlynk

## コード修正点
以下①②のコード修正が必要

①Blynkから入手できるTemplateIDとDeviceNameとAuthTokenを入れる。

```
#define BLYNK_TEMPLATE_ID           "yourTemplateId"
#define BLYNK_DEVICE_NAME           "Quickstart Device"
#define BLYNK_AUTH_TOKEN            "yourAuthToken"
```

②WiFiのSSIDとパスワードを入れる。

```
char ssid[] = "yourssid";
char pass[] = "yourpasswd";
```

# 開発環境
Arduino IDE（M5Stickcのボード設定やライブラリインストールが別途必要）

# 動作例
GitHubnに動画があるのでそちらを参照。以下は画像。
![iOS の画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512829/10cb3153-e80f-9b2c-d0fe-0511707dd45b.jpeg)

# 必要なファイル
以下のBugcのサンプルコードリポジトリにある bugC.cpp とbugC.h が必要。
https://github.com/m5stack/M5StickC/tree/master/examples/Hat/BUGC

# Blynkについて
- [Blynk](https://blynk.io/)が何たるかは割愛（Qiita検索してください）。簡単に言うとArduinoやESP32マイコンベースのエッジデバイスを簡単にスマホアプリと連携することができるフレームワーク。無料版でかなりのことができる。
- Blynkのアプリ側はLegacyではなく最新版（2021.09.26時点）を使う（Bの右上にNewの文字があるアプリ）。最新版はAuth Tokenがアプリではなくblynk.cloudのクラウドコンソールから入手する使用になっているので注意が必要。
- Blynkに登録したあとのTutorialを始めるたあと来るメールにBlynk Example Browserへのリンクがあり、それを参照するとBlynkを使うときのエッジ側のコードの作り方が大体わかる。
- Blynkのダッシュボードとデータストリームはの設定は以下参照。

## Blynkのダッシュボード設定
ダッシュボードにはボタンが４つとスライダーが１つを作成し、ボタンはOn/Offでスライダーは速度設定（0~100）に使う。画像はblynk.cloud上に作成できるWebダッシュボードで、スマホアプリ上も構成は同じ。
![スクリーンショット 2021-09-26 18 47 49](https://user-images.githubusercontent.com/40074491/134803243-d159114d-6c0a-4a0f-83ea-b75905800d82.png)

## Blynkのデータストリーム設定
データストリームはテンプレートで設定する。データストリーム上のピン番号（V0~V4）が、エッジ側のコード上のピン番号と対応する。すべてInt型だが、スライダーのみMax値が100になっている。
![スクリーンショット 2021-09-26 19 03 23](https://user-images.githubusercontent.com/40074491/134803300-71884cdd-407a-477c-acf1-25278c40c7a4.png)

# 参照
[Blynkを使ってスマホとM5StickCでコミュニケーション](https://qiita.com/moritakuya/items/66822c39bee77b2f8617)
[Blynk Cloud](https://blynk.cloud)
[Blynk Example Browser](https://examples.blynk.cc)
プログラミング未経験でも2か月でTwitterアプリを作れた話

はじめまして!Masakingと申します！
今回は株式会社[Hajimari](https://www.hajimari.inc/)さんが運営するスキルアップ型就活支援サービス、「intee」でのプログラミング学習を通して、Railsを使ったTwitterアプリをチームで開発したのでそちらを紹介したいと思います！

#完成したアプリ
![SharedScreenshot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2035851/d2dcc11d-7fee-5c27-1a06-01dfcbf04da1.jpeg)

[https://myapp-usagisann-ri.herokuapp.com/](https://myapp-usagisann-ri.herokuapp.com/)
じゃじゃーん！

こちらがホームページになります。
デザインが可愛いらしい、、、
3人チームで開発を行ったのですが、チーム名が「うさぎさん」ということもあってうさぎっぽい色合いのデザインになりました笑

#機能
機能としてはTwitterにある機能+自分たちで考えた追加機能があります。

既存機能
・新規登録・ログイン
・ツイート
・フォロー
・いいね

追加機能
・リマインド

既存機能は皆さんご存知だと思います。
私たちのチームはそちらに加えてリマインドという機能を考えました！

そして、この新機能の追加を私が担当したので、ご紹介したいと思います。

#リマインド機能
まずこの機能はTwitterでの投稿をメモ代わりに使えないかという着想から生まれました。

例えば、

「今日の夜９時から新ドラマの第一話放送！好きな俳優出るから観るの楽しみだなー」

このようなツイートを朝に投稿したとします。
そして投稿後どんどん時間が過ぎてゆき、実際による９時になってみたら、、、
新ドラマのことは忘れてスマホゲームに没頭！笑

こんな時に、もしTwitterアプリに投稿した内容が夜９時の時点で通知されれば、楽しみにしてた新ドラマの視聴を見逃すことはないですよね？？

こういった場合を想像し、投稿者にツイートを思い出させる機能、リマインド機能を作ろうと決めました。

ここからは実際にどう使われるかをお見せします！
#実際の使い方
先に言っておきます、実は上で述べたような機能
#####できていません！

は？と思われた方々
今回は未経験から初めてのアプリ開発だったので大目に見てください:pray:
ただ上記で述べた機能と似たようなものは実装したのでご覧ください

![2021-09-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2035851/3a0ebab4-b317-f6d9-cf12-6cb65211e9ac.png)
まず投稿したい内容を入力します。

その後remind time欄というものがあるので、ツイートをリマインドしたい場合はこちらのカレンダーからリマインド日時を選択します。

リマインド日時を選択後投稿します。

![SharedScreenshot2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2035851/42d7481e-2559-064d-dd22-77bf75ad5c9b.jpeg)
リマインド日時を選択して投稿されたツイートはツイート欄ともう一つ、
Remind Tweetという欄に表示されます。

この欄にはリマインドされたツイート、なおかつリマインド日時が現在時刻よりあとのツイートを表示させ、リマインドされたツイートは画像の通りアプリ内で目に留まりやすくなります。

また、次にお見せするように、リマインド時間が現在時刻を過ぎたツイートはRemind Tweet欄には表示されず、通常のツイート欄に表示されます。

![SharedScreenshot4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2035851/7275c99e-337b-d191-bf0c-a4ab37755afd.jpeg)
![SharedScreenshot3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2035851/3ec989a9-4554-4dcc-29d6-ee8ea0e4cadd.jpeg)

（ツイート時の日時　2021-9-25 23:57）
こうすることでリマインドする必要性がなくなったツイートをRemind Tweet欄からなくし、リマインド時間まで目立たせておきたいツイートだけを表示することができます。

#まとめ
今回はTwitterアプリに追加したリマインド機能について紹介しました。

どうでしょうか、
一応こんな機能だけでも、楽しみにしてた新ドラマの視聴を見逃す回数は減りますかね？笑

また、私はタイトルにもあるとおりプログラミング未経験から２か月でこのTwitterアプリを完成させました。

このようなアプリ開発の経験ができたのも、毎回のゼミで親切に教えてくださった講師陣の方々、意欲が高く自身の役割をしっかりとを果たしてくれたチームメンバーのおかげです。

本当にありがとうございました！

これからはプログラミングスキルを向上させつつ、自身が作りたいサービスを探してゆきたいと思っています。

最後まで読んでいただきありがとうございました！
【Windows】ブラウザからRstudioを利用する【Docker】

## 背景
RStudioのデスクトップアプリは各種OSに対応していますが、OS固有の問題（Windowsだと文字コード周りでエラーが出やすいなど）があります。また、どの端末からも同じ環境で使用できると便利です。
RStudio Serverを利用すればWebブラウザからRStudioを使用することができます。さらにDockerを使用すればサーバーを準備する必要もありません。ここではDockerを用いてWindowsでRStudio Serverを立て、WebブラウザからRstudioを利用してみます。

#### 参考
[RStudio Serverのインストール](https://k-metrics.github.io/cabinet/env_install_svr.html)
[Using the rocker/rstudio container](https://github.com/rocker-org/rocker-versioned/blob/master/rstudio/README.md)

## 環境
OS: windows10 Pro (19043.1237)
Docker Desktop: 2.3.0.2

## 方法
#### 1. Dockerのインストール
下記の記事などを参考にDocker Desktop for Windowsをインストールします。
[WindowsでDocker環境を試してみる](https://qiita.com/fkooo/items/d2fddef9091b906675ca)
#### 2. rockerイメージの取得
rockerはRstudio Serverを含むDebianベースのDockerイメージです。[docker hub](https://hub.docker.com/u/rocker/)で検索すると複数のレポジトリがヒットします。最小構成のrocker/rstudioをインストールしても良いですが、ここでは使用頻度の高いライブラリがインストール済のrocker/tidyverseをインストールします。
![rocker.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/9e4a5743-b958-1290-c6ad-dbe79f1746a5.png)
Windows PowerShellを起動し、下記のコマンドを実行します。

```sh
docker pull rocker/tidyverse
```

#### 3. rockerの起動
Windows PowerShellで下記コマンドを実行します。

```sh
docker run -p 8787:8787 -v C:¥Users¥yourname¥Documents¥rstudio:/home/rstudio -e PASSWORD=yourpassword rocker/tidyverse
```
Rstudio Server上で作成したファイルをホスト（windows）側からも取得したいので、Documentsフォルダに直下に「rstudio」フォルダ作成し、-vオプションでrockerのホームディレクトリ（/home/rstudio）にマウントさせています。また「-e PASSWORD=」で任意のパスワードを設定する必要があります。ポートはrockerの[README](https://github.com/rocker-org/rocker-versioned/blob/master/rstudio/README.md)に従って8787を指定しています。

#### 4. ブラウザでRStudio Serverにアクセスする
ブラウザを起動してアドレスバーに「localhost:8787/」と入力します。
ユーザー名とパスワードが求められます。ユーザー名はデフォルトで「rstudio」、パスワードはコンテナを立ち上げるときに設定したものになります。
![rstudio_login.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/775214b3-25c0-1e80-cf93-8143750bd6b9.png)

## 結果
デスクトップアプリとほぼ同じ外観でブラウザからRstudioを使用できます。
※ログイン時点ではSourceパネルが表示されていません。Tools→Global options→Pane LayoutでSourceパネルを表示できます。

![rstudio_session5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/a53fbcf9-8b7f-a0f0-c09e-282fd858759a.png)

散布図をggplot2で作図し、png形式で保存してみます。

```r
library(tidyverse)

x <- rnorm(100)
y <- rnorm(100)
dt <- data.frame(x, y)
ggplot(dt, aes(x = x, y = y)) + 
  geom_point()

png("test.png")
ggplot(dt, aes(x = x, y = y)) + 
  geom_point()
dev.off()
```
ホスト側のフォルダにもきちんと反映されています。
![rstudio_folder.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/4155bddc-ba7c-6a1d-4f7f-88e1d4b9e677.png)
GitHub projects（kanban）をCSV形式で出力するコマンド

# GitHub Projects (kanban) をCSV形式で出力するコマンド

## Developer toolで実行してください。

```javascript
const csvArray = ['column,title,type,state,url']
const data = [...document.querySelectorAll('.project-column')]
  .map(element => {return {
    id: element.dataset.id ,
    title: element.querySelectorAll('.js-project-column-name')[0].innerText,
    cards: [...document.getElementById(`column-cards-${element.dataset.id}`).children].map(child => child.dataset)
  }})
  .forEach(column => column.cards.forEach(card => {
    csvArray.push([
      column.title,
      JSON.parse(card.cardTitle).join(' '),
      JSON.parse(card.cardType).join(' '),
      JSON.parse(card.cardState).join(' '),
      card.url,
    ].join(','))
  }))
console.log(csvArray.join('\n'))
```

これを参考に、加工して必要な要素を抽出してください。
画像処理エンジニア検定 ベーシックに合格したので色々まとめてみた

画像処理エンジニア検定 ベーシックの合格発表から1ヶ月以上経過していますが、勉強にしようした教材と今後(エキスパート)の受験に向けて色々まとめておこうと思います。

![cgbasic.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/f86408cd-1948-d629-374b-531f8b3bedbc.jpeg)

# 試験の詳細
試験の範囲や申し込み方法は以下の公式ページを参照。

https://www.cgarts.or.jp/kentei/about/img_engineer/index.html

# 使用した教材
今回使用したテキストを紹介します。テキストを1通り読み込んで、公式問題集の練習問題を解いて試験に臨みました。(リンク及び画像はAmazon.comより)

公式テキストです。ベーシック用ということもあってか、難しい内容の解説は省略されている傾向が有ります。加えてCGエンジニア検定のベーシックと共通になっているため、浅くかなり広い内容を扱っています。

https://www.amazon.co.jp/dp/4903474577/

![text](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/f63b690d-910f-80bd-41ce-8fc52501080f.png)

https://www.amazon.co.jp/dp/4903474658/

![kakomon](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469079/952d9dae-c64f-65cb-27b8-3c08534cd270.png)

# 今後に向けて
画像処理技術への理解を深めるために受験した画像処理エンジニア検定ですが、ベーシックのテキストは技術的な詳細の説明を省いている傾向が強く、疑問点が増えてしまった様な気がします。(詳細はエキスパート用テキストを参照せよとのこと)近いうちにエキスパートを受験しようと思います。
データサイエンティスト検定受けてみた

# データサイエンティスト検定（DS検定）とは

データサイエンス力、データエンジニアリング力、ビジネス力の基礎レベルが問われる「データサイエンティスト検定™ リテラシーレベル」の検定という位置づけのようです。

公式サイトによると受験対象者としては次のように説明されています。
> 本検定の受験対象者は以下のような方を想定しています。
> ・データサイエンティスト初学者
> ・これからデータサイエンティストを目指すビジネスパーソン
> ・データサイエンティストに興味を持つ大学生や専門学校生など

個人的には、中堅エンジニア、エンジニア達の管理職してる人、教育側の人、社内勉強会してる人などが受けたら良いかなっと思います。

また、出題範囲は次のように説明されています。かなり広範囲ですね。
> スキルチェックリストの3カテゴリ（データサイエンス力、データエンジニアリング力、ビジネス力）の★１（見習いレベル）相当と数理・データサイエンス・AI（リテラシーレベル）におけるモデルカリキュラムを総合した範囲
> ※詳細は「データサイエンティスト検定™の試験範囲」を参照

詳しい情報は公式サイトをご覧ください。
https://www.datascientist.or.jp/dskentei/

#受けようと思ったきっかけ
　その1. 以前より勉強でお世話になっているVRアカデミアのAIcia Solid（アイシア=ソリッド）ちゃんのYoutube動画で、DS検定を初めて知りました。この方がDS検定をすごい推していたので受験してみようと思いました。もっと知りたい人はYoutubeチャンネルをご参照ください。
　その2. 体系的にデータサイエンスを学び直したかった。IT系の仕事はしていたけどデータサイエンスの一部の知識しか使ってこなかったので全体的に知りたいと常々思っていました。
　その3. G検定、E検定を受けたいなっと思いながら、もう何年も見て見ぬ振りをしていましたが、今回DS検定を受験するに当たり、G検定の勉強（というよりリハビリ）がてら、勉強してました。
　その4. こういう流行りの検定は受けて損はない。先見の明。自分のバリューを高めていこう（啓蒙）。

#私のスペック
* 元エンジニア
* ML/DLの論文読んだり、実装したりできる人
* 数学は苦手分野。統計学、確率論も苦手

#教材
* 公式の動画（約11時間）
公式テキストとして無料の[動画講座](https://www.skillupai.com/ds/)があります。体系的にまとまっていて出題範囲はカバーしていますので、初学者はこの動画を見て、まずは基礎知識をしっかり身につけましょう。私は早送りで2週しました。

* 公式の書籍
検定対策本として[最短突破 データサイエンティスト検定（リテラシーレベル）公式リファレンスブック](https://gihyo.jp/book/2021/978-4-297-12261-4)が発売されています。私は利用していません。

* 公式アプリ
[検定対策アプリ](https://www.skillupai.com/ds-app/)もあります。問題集のようですね。私は利用していません。


* G検定の対策本
DS検定とG検定の出題範囲は似ています。[最短突破 ディープラーニングG検定（ジェネラリスト）問題集](https://gihyo.jp/book/2020/978-4-297-11609-5)を購入し、問題を解く練習をしました。

* Youtube
読書での勉強も良いですが、最近は教育系の動画コンテンツがとても充実しています。[ヨビノリさん](https://www.youtube.com/c/yobinori/playlists)や[アイシアちゃん](https://www.youtube.com/channel/UC2lJYodMaAfFeFQrGUwhlaQ/playlists)をオススメします。私は利用してませんがUdemyやドットインストール系の学習サイトも良いかもしれませんね。

* コーディング
初学者の方は参加無料の[スキルアップAIキャンプ](https://www.skillupai.com/skillupai-camp/)くらいから始めてみてはいかがでしょうか。DS検定では、プログラミング、SQL、データ分析の経験がない人は不利になりますよ。

探せば他にも色々あると思いますがこの辺で✋

# まとめ
第1回目の開催ということでDS検定を受験してみました。
試験時間90分で90問程度。60分で解き終わり、30分見直し。
試験後に正答率が確認できます。
たぶん合格ライン！
ありがとう、アイシアちゃん。
[Ruby] できるだけ負荷をかけない処理を意識するのは大事だなと思いました

##はじめに
AtCoderの過去問を解いている中で、タイトルのようなことを感じたので記事にします。

そのとき解いていたのはこちらの問題です。↓

https://atcoder.jp/contests/abc134/tasks/abc134_c

C問題にしては割と難易度は低い気がしましたが、すごく良問だなと感じました。


##C - Exception Handling
この問題の解き方としては、まず入力値のAの部分を配列として受け取り、その中で一番大きい数字と二番目に大きい数字（一番目と重複していたら、それが二番目とする）を取り出します。

そして配列から一つずつ要素を取り出して一番大きい数字と比べ、同じだったら、二番目を出力(取り出した数字は比較対象から外れるため）。
それ以外だったら一番目を出力すればOKです。

最初に僕が提出して失敗したコードはこちらです。（厳密には実際とは違いますが、説明しやすくするため少し変更しています。失敗した原因は同じです）

```ruby
n = gets.to_i
a = readlines.map(&:to_i)
 
a.each do |i|
  if i == a.max(2).max
    puts a.max(2).min
  else
    puts a.max(2).max
  end
end
```

上記のコードでは時間がかかりすぎて不正解となりました。
```a.max(2).max```が配列の中で一番大きい数字ですね。
```a.max(2).min```が配列の中で二番目に大きい数字です。

なんとなく、負荷がいっぱいかかっているから不正解なわけで、軽くしたらいけるんじゃね？っと下記のコードに書き換えると通りました。

```ruby
n = gets.to_i
a = readlines.map(&:to_i)

no1 = a.max(2).max
no2 = a.max(2).min

a.each do |i|
  if i == no1
    puts no2
  else
    puts no1
  end
end
```

一番大きい数字を変数no1に代入、同じように二番目の数字をno2に代入した後に、先ほどのeach文を回しました。
最初のコードだとmaxメソッドとminメソッドをa回分使っているので処理が重かったのだと思います。

これだけで処理が通ったのでこういうの大切なのだなと思いました。
[Android] Android Studio で Android Emulator を直接実行してみよう！！

# お知らせ
最新のバージョンだとデフォルトでなっているっぽい？
Android Studio Chipmunk | 2021.2.1 のときになった？

https://developer.android.com/studio/releases/past-releases#embedded-emulator

# 初めに
最新のAndroidStudio　（Arctic Fox | 2020.3.1）　のバージョンアップによりEmulatorをAndroidStudioでそのまま実行できるようになりました。
別ウインドウで表示されなくなるため、ウィンドウがごちゃつかず、完結した画面で行うことができます。

また、自分だけの話ですが、PCの電源を消すときにエミュレーターをつけっぱなしにして何度もエミュレーターをぶっこわしたということを防ぐこともできます！！(^▽^)/!

![emulator-tool-window.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1209385/7984ba64-68b4-0a8c-b95d-690a01202f49.gif)
参考:「Android Emulator 上でアプリを実行する #Android Studio で Android Emulator を直接実行する」　
https://developer.android.com/studio/run/emulator?hl=ja#run-emulator-studio

# やり方
１．[File] > [Settings] > [Tools] > [Emulator]（または macOS では [Android Studio] > [Preferences] > [Tools] > [Emulator]）をクリックし、ツール ウィンドウで [Launch] を選択して、[OK] をクリックします。

![s-キャプチャ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1209385/64a5caad-bdf0-2abf-c850-7a52a798120c.jpeg)
資料１
![s-キャプチャ1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1209385/cd393674-4b5c-24ed-3d01-6028f222395b.jpeg)
資料２
![s-キャプチャ2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1209385/10466c75-8997-7c4e-c26d-55d47cc56b2d.jpeg)
資料３

２．あとは通常通りエミュレーターを起動させると、右側に表示されます。

#参考資料

https://developer.android.com/studio/run/emulator?hl=ja
OnenoteのデータをEvernoteに移してDevonthinkに移行する

DevonthinkはそのままApple memo、Evernoteは取り込めますが、Onenoteは取り込めませんでした。

先達が「[Evernote や OneNote の代わりに DEVONthink](https://qiita.com/shigeya/items/e77b3cfeb9bb7ce9d446)」に簡単にできるよ、と書いてくれていたのですが、お金をかけるのがどうしてもいやで、気がついたら半日が過ぎ・・・。

結局、上に書かれた通りやれば良い、ということに・・・。

やってみたら、容量が少なければお金もかからない、ということで、本当に簡単にできましたのでメモしておきます。

### 手順とも言えないなにか↓

Devonthinkで取り込めるのは[Legacy Evernote](https://help.evernote.com/hc/ja/articles/360052560314-以前のバージョンの-Evernote-をインストールする)からのみになります。
また、Evernoteの取り込みができるのはWindows版のみになります。仮想環境なり、別マシンなりWindowsが必要です。

つづいて、[デスクトップ版Onenote](https://www.onenote.com/)が必要になります。
こちらはオフィシャルページからダウンロードできるものであれば大丈夫でした。
Evernoteからストア版をいれるとOffice2007を入れるように警告が出ますが、デスクトップ版であれば警告は出ませんでした。（これでまた時間を無駄に・・・）

あとはOnenoteで同期を取り、データを取り込んだ後、Evernoteでインポートを実行します。
この時に「ファイル」→「インポート」のところでOnenoteが選択肢にない場合、新しいアプリを使っている、OSが違う、等なにか間違っているかと思います。再度、上記をチェックしましょう。

私は以下のバージョンで大丈夫でした。

Windows版 Legacy Evernote : 6.25.2.9198 (309198) Public (CE Build ce-62.6.10954)
Windows版 Onenote : 16001.13801.20534.0
Mac版 Legacy Evernote : バージョン 7.14.1 (458325 Direct)

あとはDevonthinkからインポートをするだけです。
Evernoteの方は、個別に指定しないといけないので面倒ですが、Devonthinkのほうはワンクリックです。

Evernoteに取り込む容量が大きくなる場合、なんどか削除して繰り返すか、一時的に有料プランを契約するしかないかとおもいます。


以上、忘れないうちにメモでした！
AWS：EC2インスタンスを使う

# 概要
EC2インスタンスを立てて、ログインします

## キーペアを作る
キーペアはEC2で立てたインスタンスにアクセスするために必要になります。要は秘密鍵ですね。
作成しないでEC2を立てても起動直前に作成できますが、場当たり的に用意すると管理的に良くないので項目を分けました。

AWSマネジメントコンソールから`EC2`を選択
![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1206561/15add66f-dae6-5bd5-eb21-2d3c08d830cf.png)

左側メニューから`ネットワーク & セキュリティ`->`キーペア`を選択して右上の`キーペアを作成`をクリック
![03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1206561/4496fc43-452e-3404-3af4-81916c4def06.png)

下記を入力して右下の`キーペアを作成`をクリック
・キーペアの名前(任意)
・キーペアのタイプ(どっちでもいいです)

作成と同時に鍵がダウンロードされます。
絶対に失くさないように管理してください。

## インスタンスを立てる
インスタンスは仮想サーバ的なものです。
とりあえず作ってみましょう。

### インスタンスの作成
AWSマネジメントコンソールから`EC2`を選択
左側メニューから`インスタンス`->`インスタンス`を選択して右上の`インスタンスを起動`をクリック
![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1206561/8fe0cc3a-e0e2-aec9-1ac7-ba5bfa3e9e84.png)

OSは`Amazon Linux 2`を選択
インスタンスタイプは`t2.micro`を選択して右下の`確認と作成`をクリック
![04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1206561/280a183b-ddd6-8605-4607-a7fb2a3d9db4.png)

ほぼデフォルト構成ですので、確認画面を一瞥して右下の`起動`をクリック
するとキーペアの選択を要求されます。先ほど作成したキーペアを選択し、その下の記述に同意の上チェックボックスにチェックを入れてインスタンスを作成してください。
![05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1206561/5942a97d-5c75-1e41-1837-cd259e796fea.png)

ここで選択したキーペアを紛失した場合、再発行できない為に以後そのEC2にキーペアを用いたログインは出来なくなります。

インスタンスの一覧にて、ステータスチェックが`2/2 のチェックに合格しました`なればokです。

## ログインする
さっそくログインして見ましょう。
インスタンス一覧にて作成したEC2をクリックすると上部の`接続`ボタンが選択できます。
クリックして`SSHクライアント`のタブを選択するとSSH接続する方法が記載されています。


```
yamanashi@DESKTOP-9KCV2CQ:~/studymyself$ ls
study_ec2.pem
yamanashi@DESKTOP-9KCV2CQ:~/studymyself$ ssh -i "study_ec2.pem" ec2-user@ec2-3-112-245-8.ap-northeast-1.compute.amazonaws.com
The authenticity of host 'ec2-3-112-245-8.ap-northeast-1.compute.amazonaws.com (3.112.245.8)' can't be established.
ECDSA key fingerprint is SHA256:o7LlehPGMWPrHxCzcHDEqWcvUf3/WpS7vyKAOz7SrzI.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'ec2-3-112-245-8.ap-northeast-1.compute.amazonaws.com,3.112.245.8' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
11 package(s) needed for security, out of 35 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-36-124 ~]$
[ec2-user@ip-172-31-36-124 ~]$
```

はい、ログインできました。このEC2はインターネットにも出れますので何でもできます。

### 補足
この最小手順で作成したインスタンスはAWSアカウントを作成した際にdefaultで用意されているVPCに作成されています。
このdefaultのVPCにはあらかじめインターネットゲートウェイ(IGW)へのルートテーブルも設定されており、自動作成されるセキュリティグループ(SG)はアウトバウンドで`全てのトラフィック`を`0.0.0.0/0`に向けるのを許可しているためにインターネットに出れるわけです。
Unity Webglでシェーダーがない場合の解決策。


### webglはshaderを限定して組み込むらしい。
Edit->ProjectSettings->Graphics-> Always Include Shadersになければ加える。

https://answers.unity.com/questions/978398/issue-with-shaders-and-webgl.html

ちなみに``Transparent/Diffuse``はなかった。
【Rails sが起動しない】ターミナルを起動したまま閉じたり、どこで起動したか不明の場合の解決法

# エラー内容

$ rails s
=> Booting Puma
=> Rails 6.1.4.1 application starting in development 
=> Run `bin/rails server --help` for more startup options
A server is already running. Check /home/ubuntu/〇〇
Exiting

# 解決法
今のターミナルで killall ruby を実行してから rails s を実行する。