OmniAICreator/Qiita-1.07M huggingface dataset:
Vtuberの名前をキーワードにtweetの感情分析してみた

#概要
TweetをAPIで取得し、感情分析をしています。
sentimentjaという日本語対応のパッケージもありますが、
日本語を英語に翻訳のうえ、英語対応のパッケージを利用しています。

#参照元
下記のコードを一部変更して実装しています。
https://github.com/DarekarA/TwitterSentimentAnalysis_Public

変更前

```
# Funciton to analyze Sentiment

from textblob import TextBlob
def analyze_sentiment(tweet):
    analysis = TextBlob(tweet)
    if analysis.sentiment.polarity > 0:
        return 'Positive'
    elif analysis.sentiment.polarity == 0:
        return 'Neutral'
    else:
        return 'Negative'
```

変更後

```
# Funciton to analyze Sentiment

from textblob import TextBlob
def analyze_sentiment(tweet):
    analysis = TextBlob(tweet)
    #日本語（各種言語）→英語に翻訳
    analysis = analysis.translate(to='en')
    #print(analysis)
    if analysis.sentiment.polarity > 0:
        return 'Positive'
    elif analysis.sentiment.polarity == 0:
        return 'Neutral'
    else:
        return 'Negative'
```

#テスト1 (2021/6/4)
####兎田ぺこらさん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341706/1adb14a7-9c37-3ef1-f6f7-d1615b13e364.png)

Neutralが少なく、Positiveが多いようです。

####月ノ美兎さん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341706/d35cb0be-9522-2f9d-7c89-2044ab800d0e.png)

兎田ぺこらさんと比較して、Neutralが非常に多いようです。

####名取さなさん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341706/4f341c6f-bfc6-1ff8-f882-4162bf3cefdd.png)

月ノ美兎さんと同じような比率でした。

####さくらみこさん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341706/72a39dc1-f1de-81cd-9ea6-f02a23758747.png)

兎田ぺこらさんに比較的近い比率でした。
もしかすると、ホロライブ所属のvTuberさんは、Positiveが多いと思い

####ときのそらさん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341706/05ef6b4d-2202-f450-388a-f7f4645c88c4.png)

やっぱり、ホロライブのホロライブ所属のvTuberさんは、Positiveが多いようです。

#テスト2 (2021/6/18)
ホロライブがいろいろとあったので、変化を見てみました。

####兎田ぺこらさん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341706/4ed511f5-dbbf-369e-dc61-714f363391f0.png)
さらに、positiveの比率増えています。
####月ノ美兎さん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341706/7737ecc9-634f-ef23-94d4-66ca16ce0724.png)
####さくらみこさん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341706/6e578328-9a0f-65c8-bed9-f244357a78f4.png)
Negativeが増えている
####赤井はあとさん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341706/59b370a7-0589-952c-9370-4c1ea86d20f0.png)
pyplotとpillowの画像を重ねて表示する

何かの濃度分布と粒子の分布を重ねて表示したい場合、粒子をpillow, 濃度分布をpyplotで描画させて、最後に重ねて表示させる。

```python
from PIL import Image, ImageDraw
import numpy as np
import matplotlib.pyplot as plt
```

まず、濃度分布をnumpyの二次元配列で生成する

```python
u = np.random.rand(10,10)
plt.imshow(u)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178269/f13b7433-caf3-6c66-e5df-549ea6b1f22a.png)


次に、粒子の分布を生成する

```python
r = np.random.rand(100,2)*200

im = Image.new("RGB", (200, 200), (128, 128, 128))
draw = ImageDraw.Draw(im)

for i in range(100):
  [x,y] = r[i]
  draw.ellipse((x-3,y-3,x+3,y+3), fill=(0, 0, 255))
from IPython.display import display
display(im)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178269/b190757b-6d1a-ae30-e930-3dea9d095bf1.png)

スケールを合わせるため濃度分布をリサイズし、粒子と重ねて表示する。

```python
imU = Image.fromarray(u)
imU = imU.resize((200,200))

plt.imshow(np.array(imU), alpha = 0.5)
plt.imshow(np.array(im), alpha = 0.5)
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178269/af5ea4d6-b6bc-04e1-b1f8-27a9a7c78eb8.png)
Pythonのloggingで出力したログ内容を変数に格納する

## 概要
Pythonのloggingでログ出力する際、出力したログ内容を変数に格納したい。一度ファイルに書き出してから読み込んでもよいが、直接変数に格納するに越したことはないだろう。

## 実装例

### logging.configなし
もっとも単純な実装方法は、組み込みのStreamHandlerをインスタンス化するときにStringIOを渡すこと。

```sample.py
import io
import logging

# 文字列バッファ
str_io = io.StringIO()

# ロガー
logger = logging.getLogger('sample')
logger.setLevel(logging.INFO)

# 組み込みのStreamHandlerにStringIOを渡す
handler = logging.StreamHandler(str_io)
handler.setFormatter(logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s'))

# ログ出力（この時点ではバッファに書き込まれるだけ）
logger.info('info')

# ログ内容を変数に格納
log_text = str_io.getvalue()

# 表示
print('log : ' + log_text)
```
上記の例でlogging.config.dictConfigを使う場合は、StreamHandlerのstreamに"est://\_\_main__.str_io"を設定する。ただ、さすがに変数名を設定ファイルに直接記載するのは憚られるので、StringIOを出力対象とする独自Handlerを定義した方がよいだろう。

## logging.configあり
StreamHandlerを継承した独自Handlerを定義する。StringIOインスタンスの配置場所や参照方法はお好みで。

```my_util.py
import io
from logging import StreamHandler

class StringHandler(StreamHandler):
    """ログ出力を変数に格納する独自Handler"""
    str_io = io.StringIO()
    def __init__(self):
        StreamHandler.__init__(self, StringHandler.str_io)
```




```sample2.py
import io
from logging import getLogger, config
from my_util import StringHandler

# ログ設定
config.dictConfig({
    'version': 1,
    'formatters': {
        'simple': {
            'format': '%(asctime)s %(name)s %(levelname)s %(message)s'
        }
    },
    'handlers': {
        'string': {
            'class': 'my_util.StringHandler',
            'formatter': 'simple'
        }
    },
    'loggers': {
        'sample': {
            'level': 'INFO',
            'handlers': ['string']
        }
    }
})

# ロガー
logger = getLogger('sample')

# ログ出力（この時点ではバッファに書き込まれるだけ）
logger.info('info')

# ログ内容を変数に格納
log_text = StringHandler.str_io.getvalue()

# 表示
print('log : ' + log_text)
```
【Laravel】中間テーブルに値を追加・更新する方法


#実現したいこと#
中間テーブルに値を追加・更新する。

タグ機能を作る際に、プロジェクトテーブルとタグーテーブル紐付ける際に
中間テーブルを作り、値を追加・更新することができたので、紹介します。

##テーブル設計##

####タグテーブル

|id  | name |
|---|---|
|1  |Javascript  |
|2  |PHP  |


####プロジェクトテーブル

|id  |title  |
|---|---|
|1  |フロントエンドを学習しよう  |
|2  |バックエンドを学習しよう  |

####中間テーブル(プロジェクトタグテーブル)

|id  |tag_id|project_id|
|--- |---   |---       |
|1   |1     |1         |
|2   |1     |2         |
|3   |2     |2         |


中間テーブルはこのように、テーブ同士が多対多の関係の時に必要になります。

##中間テーブルに値を追加する方法

###中間テーブルに値を入れるためのステップ

1. テーブルのリレーションの設定
2. 中間テーブルにアクセスし、値の追加

##1. テーブルのリレーションの設定

タグのモデルでプロジェクトと紐付けます。belongsToManyは多対多のリレーション
時に使います。これで中間テーブルにアクセスするための準備は完了です。
<pre>
   public function project()
    {
        return $this->belongsToMany(Project::class);
    }
</pre>

##2. 中間テーブルにアクセスし、値の追加
実際に値を追加します。値を追加する場合はattach()を使います。
まず、どのプロジェクトにタグを紐ずけるか、設定します。
今回は、projectのid:1にタグid:1を設定し、attachメソッドで追加します。

<pre>
$project = Project::find(1);
//idが1番のプロジェクトを取得します。
$project->tags()->attach(1);
//プロジェクトid:1にタグid:1を追加します。
</pre>

中間テーブルを確認すると下記のようになります。

|id  |tag_id|project_id|
|--- |---   |---       |
|1   |1     |1         |

このように、中間テーブルに値を追加できます。

##中間テーブルの値を更新する場合

更新したい場合は、syncメソッドを使います。
syncメソッドの仕組みは値の削除、追加を行います。
今回の例なら、project_id:1にtag_id:1が登録されています。
syncを実行することで、tag_id:1を削除します。そして、$project->tags()->sync(2);
としているので、project_id:1のtag_id:に2を追加します。
なので、attachを使わなくても、追加、更新はsyncでできてしまうのです。

<pre>
$project = Project::find(1);
//idが1番のプロジェクトを取得します。
$project->tags()->sync(2);
//中間テーブルのproject_id:1のtag_idを更新
</pre>

中間テーブルを確認すると下記のようになります。

|id  |tag_id|project_id|
|--- |---   |---       |
|1   |2     |1         |


##まとめ
中間テーブルへの値の追加はattach()メソッド、値の更新はsync()メソッド。
attach()を使わなくても、syncメソッドは追加、更新ができる。
StyleGAN2で生成できるものが増えてきたのでメモ

StyleGAN2の学習済みモデルがまた増えてたので， 面白いことが出来そうなモデルをメモ

絵画・浮世絵の画像生成に使ったコード: https://colab.research.google.com/drive/1D_5zvi-ny3ChQ0vG2cKPngeTawoSzhmT?usp=sharing

# 絵画
![painiting_face_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/9cc0b316-7fd8-322c-84e7-85c896d5ab78.png)
![painting_face_interpolate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/13b24957-adaa-fff9-033d-ce2544d4fe95.png)

# 浮世絵
![ukiyoe_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/1a71a275-8205-188f-e8d1-c43c60783cb2.png)
![ukiyoe_interpolate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/19858d68-4af6-d490-0049-a547f559c0b7.png)

# 面白かったこと
絵画のモデルはFFHQの学習済みモデルから転移学習を行なっているらしく、潜在変数空間の分布が転移学習前のものに似ている． なので、以前のモデルで生成していた画像に対応する潜在変数を与えることで似たような顔画像の絵画を生成できる．
左がFFHQで学習済みのモデルで、右が転移学習で絵画を生成できるモデル

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/d6e4c1f7-0a8a-e9cd-2c50-32c4c15c4242.png" width=300><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/179ee7a0-30dc-da10-caec-a24d8c207004.png" width=300>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/270cb479-e945-1e75-e76a-ab80acefaefa.png" width=300><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/30cae41a-4624-c68c-c77d-0c9a20bd35d8.png" width=300>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/2a3f2fa9-bf9a-4bf3-5352-89bc170b9786.png" width=300><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/505926bc-ce05-6d6c-9db7-7f68c2acf76b.png" width=300>

Image2StyleGANを使って特定の画像の再現もできるけど、絵画のデータにはメガネをかけているものは少ない（もしかしたらない？）ので、メガネを再現しようとすると失敗する
左がFFHQで学習済みのモデルで、右が転移学習で絵画を生成できるモデル

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/b58baff3-af15-1b34-e2a0-f8a81e7d73b2.png" width=300><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593087/72dfc619-6b79-6910-c785-fd6e03f0cfc5.png" width=300>
負荷テスト

# 負荷テストとは
初めて負荷テストに入った！
実際行う人は自分ではないが、手順を作りながら気づいたものを整理

* LoadTest時は性能を確認するため、
* 大量のデータを入れて作ったサービスが落ちなくてうまく行くこと
* 将来のため、EC siteだったら、毎日平均注文が10万件の場合、bufferを入れて12万件確認する
    * テストする数値については何等かの理由が必要
    * 結構大量のデータを作るのは工数がかかるので
* 性能テストのため、異常系はなし→つまり、注文したものは全部正常で処理するデータと担保
* なるべく本番と同様なスペック・環境で行う
* 5W1H いつ/なぜ/なにを/どのように 多すぎ忘れた😁😁
* 主にバッチ系/画面もあるが(自動化するツールまたは)/ENDPOINTテスト
* 本番のデータを流用(セキュリティーの問題である程度個人情報はマスキングされている状態)または、真似して作る
    * できれば本番の確認がしたいが、大量のデータにも耐えずにサービスが動くのかを見ることなので、適当(..?)にデータを選ぶ


# linuxほぼ初心者向けのログ確認

```bash
# 1.  system.log ex) TestServiceがあるログを抽出
grep "TestService" /path/system.log
 
# 1-1. TestService抽出時、最初行を取得
grep "TestService" /path/system.log | awk 'NR==1'
 
# 1-2. TestService抽出時、最終行を取得
grep "TestService" /path/system.log | awk 'END{print}'
 
# 2. performance.log TestServiceがあるログの中で、時間帯指定 例は2021-06-04の8時から9時のログ
grep "TestService"  /path/system.log | grep -E '2021-06-04 0(8:|9:)'
 
# 3. performance.log TestServiceがあるログの中で、時間帯指定して、平均処理時間抽出
# 前提条件が行の末尾に処理時間がある...? おそらく？まだawkの動きは。。。わかりません。。。
grep "TestService"  /path/system.log | grep -E '2021-06-04 0(8:|9:)'| awk '{sum+=$(NF-1)} END {print sum/NR}'
 
# 4. performance.log　TestServiceがあるログの中で、時間帯指定して、一番長い実行時間の確認
# sorting and 何行あるか分からないが、30行まで出力 order by ~ descのように 
grep "TestService"  /path/system.log|  grep -E '2021-06-04 0(8:|9:)'| awk '{print $(NF-1)}' | sort -nr | head -30
 
 
#5. line count
grep "TestService" -c /path/system.log
```


grep | <- orと思うが、後ろに書いたらなんか分からないけどandになるようだった。
おそらく最初にgrouping?(sqlのように)された後にgrepされることでandになったかなと思う

*<-これがANDらしいけどうまく行ってなかった
Cross-Origin Resource Policy (CORP)

# Cross-Origin Resource Policy (CORP)
## とは何か
元来Web上のリソースは他のオリジンからのリクエスト（`<script>`, `<img>` etc.）応答に対しオープンなものだったが、  
Webの用途・技術・APIの高度化に伴い、この「オープンさ」がセキュリティリスクを孕むようになった。

Cross-Origin Resource Policy (CORP)は、これらリソースへのリクエストに対し許可する範囲（同一[サイト](https://developer.mozilla.org/ja/docs/Glossary/Site)(`same-site`) or 同一[オリジン](https://developer.mozilla.org/docs/Glossary/Origin)(`same-origin`) or 誰でも(`cross-origin`)）を公開ポリシーとして指定することで、悪意あるサイトによって不正に情報が搾取されるなどのリスクから自サイトとそのユーザを保護できるようにした仕組みのことである。

### Cross-Origin Resource Sharing (CORS)との違い
Cross-Origin Resource Policy (CORP)は、上述の通りリクエストの受け付ける範囲を制限するもの。（これに`same-site`/`same-origin`が設定されると、そもそもクロスオリジンリクエストが成立しない。）
一方[Cross-Origin Resource Sharing (CORS)](https://qiita.com/toshi00ysm/items/d28ed5be3fe264f3b401)は、（クロスオリジンリクエストがCross-Origin Resource Policy (CORP)によって制限されていないことを前提に）クロスオリジンリクエストに対して「どのオリジンから」「どのような」リクエストを許可するかを設定する。

### 設定方法
サーバサイドからHTTPレスポンスヘッダで指定する。

```
Cross-Origin-Resource-Policy: same-site | same-origin | cross-origin
```

指定可能な値は以下（制限が厳しい（i.e. 安全な）順）

- `same-origin`: 同一[オリジン](https://developer.mozilla.org/docs/Glossary/Origin)（http/https、サブドメイン、ポートまで揃える必要がある）
- `same-site`: 同一[サイト](https://developer.mozilla.org/ja/docs/Glossary/Site)
- `cross-origin`: クロス[オリジン](https://developer.mozilla.org/docs/Glossary/Origin)（誰でも）


### 注意点
前述の通り、通信そのものはレスポンスヘッダが付加されただけで
レスポンスの保護自体はWebブラウザがレスポンスデータを受け取ったあと  
レスポンスボディが空だったかのように扱うことで実現される。

したがって、例えばブラウザを利用しないテキストベースのリクエストからであれば普通に中身が見れる。  
（ただ、個人情報などは通常ログインが必要なはずで、であればCookieなどの認証情報が必要となり、そしてその情報はブラウザが暗号化を施した上でローカルに保存しているはずなので、よっぽどのことがない限り大丈夫。）

#### 防げるセキュリティ上の脅威
- （[Spectre](https://qiita.com/toshi00ysm/items/5766ece276d9e05956bf)を含む）サイドチャネル攻撃
-  クロスサイト・スクリプト・インクルージョン(XSSI: Cross-Site Script Inclusion)

## 参照
- [Cross-Origin Resource Policy (CORP) - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Cross-Origin_Resource_Policy_(CORP))
- [Cross-Origin-Resource-Policy - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Cross-Origin-Resource-Policy)
dynamodb のアイテムを CSV にして S3 に吐き出してみた。Lambda で。

ssm.describe_instance_information() で取得したインスタンスID、プラットフォーム名、プラットフォームバージョンが格納されている DynamoDB のテーブルをCSVに吐き出す。

```python:lambda-python3.8
import json
import csv
import boto3

def export_s3():


    # lambda 上に展開する一次ファイルの定義。 /tmp/配下が使えるよ。
    local_path = "/tmp/platform.csv"

    # s3 に保存するファイルの定義。/xxx/plaform.csv のような感じでディレクトリ指定可能
    s3_path = "platform.csv"

    # 吐き出す先の S3 バケットの指定
    bucket_name = "jiro-platform"

    # DynamoDB のテーブル名。今回は事前に作ってある想定。
    table_name = 'platform-information'

    # DynamoDB のクライアントを定義
    ddb_client = boto3.client('dynamodb')    
    
    # scan にて DynamoDB テーブルの中身(Item)を get_data に一旦投入
    get_data = ddb_client.scan(
        TableName=table_name
        )

    # CSV における列を定義。ここでは3列。インスタンスID、プラットフォーム名、プラットフォームバージョン
    fieldnames = ['instanceid', "platform_name", "platform_version"]

    # lambda の /tmp 領域に 一時的な csvファイルを作成・オープンし、get_data から1行ずつ読み出しては csvファイルに書き出し。をfor 文で回す。
    with open(local_path, 'w') as f:
        writer = csv.DictWriter(f, fieldnames = fieldnames)
        writer.writeheader()
        for data in get_data['Items']:
            instanceid = data['instanceid']['S']
            platform_name = data['platform_name']['S']
            platform_version = data['platform_version']['S']
            writer.writerow({"instanceid":instanceid, "platform_name":platform_name, "platform_version": platform_version})

    # s3 クライアント、s3バケット定義
    s3 = boto3.resource('s3')
    bucket = s3.Bucket(bucket_name)

    # /tmp内のローカルファイルを s3 にアップロード
    bucket.upload_file(local_path, s3_path)
```
三文字表記はほどほどに

ソースコードの「変数名が雑」や「無駄な省略」で盛り上がっていたので、以前に職場向けに配信したメルマガの内容を思いだしたので転載します。

[こんなコードは嫌だ、古い書き方のコード駆逐したい（とりあえず９つ）](https://qiita.com/yuu_j/items/d6e6fc4476ab1dc35cdc)


1990年代前半 Windows 95 登場前夜, "**TRF**" というグループ名のダンス・ミュージック・ユニットが登場したときは斬新な名前でした。テレビ番組 "Soliton Side B" にゲスト出演した元**YMO**の坂本龍一が最近の趣味を問われて "**WEB** Browsing" と答えて、超カッケー！と真似をして、テレホーダイで **mil** ドメインにアクセスした時代です。 **WWW** や **PHS**, **NTT** といったアルファベット３文字ネーミングが光り輝いていた時代です。（某証券会社の役員まで務めた私のおじさんがNTT株で大損をして、おばさんが嘆いていたのも、今は昔）

AKB48が登場した2000年代にはちょっと手垢のついた命名ルールでしたが、SKEだ, NMBだ, JKTだと世界展開までして、アルファベット３文字ネーミングが生き残りました。しかし、すでに時代は坂道グループ全盛（ちょっと違った）

2021年4月号のインターフェース誌で特集されている、ナウでヤングな リアルタイムOS "Amazon FreeRTOS" のAPI関数名も、こんなふうにフルスペルです。（接頭辞のハンガリアン・メソッドはイマドキではないですが…）

~~~ c
void vTaskDelay( const TickType_t xTicksToDelay )
~~~


---

## ここからが本題！

### TMP

**temporary** (一時的) なのか **temperature** (温度) なのか、どっちやねん！

### SMP

**sample** なんだろうなと生暖かく見ながら, マルチコア(対称型マルチプロセッシング / Symmetric Multiprocessing)に将来移行したらどうなるんだろう？というおじさんの杞憂。

### COM

MS-DOSでは"**com**munication port（シリアルポート）"の予約語だったけれど, COMファイルは **com**mand に由来するし, ドットコムなんて使いかただと "**com**mercial" の略だし…

### INT

* Initialize : 初期化
* Integer : 整数 &nbsp; (例) int型
* Interrupt : 割込み &nbsp; (例) INT 1Bh (NEC98シリーズのDisk BIOS内部割込命令)
ローカル環境で環境変数を使ったBasic認証が通らない件

タイトルの通りである。*application_controller.rb*にユーザー名とパスワードを直接設定してた時は問題なく動作したんだが、*.zshrc*の中で環境変数を利用して設定した途端に動作しなくなった。クッキーやキャッシュを削除したりブラウザを変えたり訳もなくファイルの中身を編集したりしたんだが決してうまくいかなかった...



# 結論
[こちらの方の記事](https://qiita.com/tech_hack_Rich/items/ee7bd3c0b58660838e41)に全てが書いてありました。もう自分の方で書くことは何もありません...(笑)



# 前提条件
- macOS Catalina ( 10.15.7 )
- Visual Studio Code.app( 1.56.2 )
- Terminal.app ( 2.10 )
- Rails ( 5.2.6 )

※執筆時のバージョン



# 本題
要は、`vim ~/.zshrc`でファイルを編集した後に、`source ~/.zshrc`でリロードして定義した環境変数を使えるようにするのだが、`rails s`でサーバーを起動するターミナルで*.zshrc*が更新されてなけりゃ結局のところそれらは無いに等しい。サーバー起動用のターミナルが既に存在しているという事は、言い換えれば**ログインシェルである『zsh』が既に一度実行された**事を意味する。そのため編集したファイルに環境変数が追加されているのなら、それらを反映させる必要があるので`source`コマンドを使ってもう一度*.zshrc*を実行する必要があるのである。



# 参考記事
- [Basic認証導入の際に起きた症状 - Qiita](https://qiita.com/tech_hack_Rich/items/ee7bd3c0b58660838e41)
Ruby 問題11 文字数を算出するプログラム

#はじめに

paizaの問題もDランクですが解けるようになってきました。

ここでのアウトプットの成果が見える形で現れてきました。

本日もアウトプットしていきます。

#問題
対象となる文字列から特定の文字列の数を算出し、その数を出力するプログラムを実装してください。


* 対象となる文字列の中から,"na"という文字列の数を取得する
* 上記で取得した数を出力する

```.rb
def count_na(str)
  #  処理を記述
end

# 呼び出し例（引数には対象となる文字列を指定します）
count_na('bananaman nanase nanairo')
```

#ヒント
* *scan*メソッドを使用します
　

[公式リファレンス](https://docs.ruby-lang.org/ja/latest/method/String/i/scan.html)

※*scan*メソッドは、対象の要素から引数を指定した文字列を数え、配列として返すメソッド

```.rb
"nanananinunenonani".scan("na")
=> ["na", "na", "na", "na"]

```

#解答

```.rb
def count_na(str)
 puts str.scan("na").length
 
end

count_na('bananaman nanase nanairo')

=> 6
```
count_naメソッドの仮引数に文字列が格納されています。

まずはscanメソッドde"na"という文字列だけ返してみます。

```.rb
def count_na(str)
 puts str.scan("na")
 
end

count_na('bananaman nanase nanairo')

=> na na na na na na
```
"na"の文字列が6個返す事が出来ました。
今回はその数だけを返したいので、*length*メソッドを使いました。

#最後に

正規表現を使う場合がほとんどですが、今回は問題を解くために使いました。
【Go】正規表現で文字列から数字だけを抽出する方法

# 実装例

import文に`"regexp"`を追加
`toInt64()`の引数にチェックしたい文字列を入れることで数字が抜き出されて`int64`型が返ってくる

```
func toInt64(strVal string) int64 {
	rex := regexp.MustCompile("[0-9]+")
	strVal = rex.FindString(strVal)
	intVal, err := strconv.ParseInt(strVal, 10, 64)
	if err != nil {
		fmt.Println(err)
	}
	return intVal
}
```

# 解説
```
rex := regexp.MustCompile("[0-9]+")
```
`MustCompile`は正規表現が間違っていたらエラーを出力する。
ここで`"[0-9]+"`の部分が数字だけを抜き出すための表現。

```
strVal = rex.FindString(strVal)
```
`strVal`(string型)の中に入っている数字だけを抜き出して文字列として`strVal`に再代入している。

もし`strVal`が`"str123and456"`のようになっていて、全ての数字をリストで抜き出したいときには`FindAllString`を使う。

# 複数抜き出したい場合
```
submatchall := rex.FindAllString(str1, -1)
for _, element := range submatchall {
	fmt.Println(element)
}
```

## Output
```
123
456
```

## 参考
- [Regular expression to extract numbers from a string in Golang](https://www.golangprograms.com/regular-expression-to-extract-numbers-from-a-string-in-golang.html)
- [公式ドキュメントから他の仕様も知りたい方](https://golang.org/pkg/regexp/)
Unity 一定時間毎に動作させるコルーチン(Coroutine)の使い方　IEnumeratorとwhileの組み合わせ

##0.0 はじめに
コルーチンはオブジェクトを一定時間毎に動作させるなど便利な使い方ができます。基本的な使い方を備忘録としてここに記します。






##1.0 コルーチンとは
コルーチンは１フレーム内では処理が終わらず、数フレームあるいはそれ以上かけて処理を実行する必要がある場合に用いられます。
イメージは処理を一時停止し、その間に別のプログラムを実行、終わったら処理を再開しているような感じで、処理方法に関係なく規則的に動作するオブジェクトやUIを作るときに役に立ちます。
データ型のIEnumerator(イテレーター)を返り値としてもつメソッドをつくり、そのメソッドをStartCoroutine()で呼び出します。








##2.0 毎フレーム実行
StartCoroutine()で一度Loop()を呼んであげると毎フレームループします。
yield returnのところで次のフレームまで待ちます。

```C#:test.cs
void Start () {
    // コルーチンを設定
    StartCoroutine(Loop());
}

// 毎フレームループします
private IEnumerator Loop() {
    while (true) {
        yield return null;
        Debug.Log("Loop");
    }
}
```








##3.0 指定した回数だけ実行
下記は10フレームだけループするプログラムです。
同じくyield returnのところで次のフレームまで待ちます。

```C#:test.cs
void Start () {
    // コルーチンを設定
    StartCoroutine(Loop(10));
}

// frameで指定したフレームだけループします
private IEnumerator Loop(int frame) {
    while (frame > 0) {
        yield return null;
        Debug.Log("Loop");
        frame--;
    }
}
```








##4.0 秒数を指定して実行
yield return のところをWaitForSecondsにします。引数(float)で秒の指定が出来ます。
指定した秒数だけ待ちます。

```C#:test.cs
void Start () {
    // コルーチンを設定
    StartCoroutine(Loop(10f));
}

// secondで指定した秒数ループします
private IEnumerator Loop(float second) {
    while (true) {
        yield return WaitForSeconds(second);
        Debug.Log("Loop");
    }
}
```
【WordPress】MAMP環境を使ってローカルでWordPressを触ってみる

#はじめに

WordPressを使ってローカルでサイト制作を行う場合、ワードプレスの環境を用意しておく必要があります。
この記事ではMAMP環境を使ってローカルでWordPress触る準備をします。


####目次
１、MAMPの用意とportの設定
２、WordPressをインストール
３、データベース作成
４、WordPressとデータベースを接続


#使うパソコン
Mac




#１、MAMPの用意
まずMAMPをフリーダウンロードします。
https://www.mamp.info/en/windows/

ダウンロードができたらMAMPアプリケーションを立ち上げて、右上のStartを押してスタートさせます。
![スクリーンショット 2021-05-20 6.12.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769854/318b39fd-13c5-3ff7-9370-32bbb9d9328f.png)

この時Document rootが`htdocs`であることを確認してください。でなければPreferencesのsarvesより設定してください。
※僕のはWordPressが入ってますが`htdocs`までで大丈夫です。

![スクリーンショット 2021-05-20 6.11.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769854/f361f99c-25b9-68e6-57d3-6562a2ca640b.png)


###portの設定

prefarancesのPortsからポートを設定します。
![スクリーンショット 2021-05-19 12.31.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769854/81e3a78a-085f-deb5-1cb2-6b68ea66eb99.png)

ブラウザでlocalhost:8888の接続を確認にます。
http://localhost:8888
`Index of /`が表示されば接続成功です。

次に、ローカルのアプリケーション内にMAMPがある事を確認しhtdocsのディレクトリを開く。
`htdocs`ディレクトリの中身が先程開いたブラウザで表示されます。





#２、WordPressのインストール
htdocksにWordPressファイルを置くおきます。
https://ja.wordpress.org/download/
からWordPressファイルをダウンロードします。

次にローカルに展開したWordPressファイルをhtdocsの入れます。
localhost8888のブラウザをリロードするとWordPress確認することができます。

![スクリーンショット 2021-05-19 12.48.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769854/11656e54-0aad-28bf-f405-491b127f6a37.png)

クリックするとWordPressのwelcomeページが表示されます。
![スクリーンショット 2021-05-19 12.50.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769854/66ca52dc-b7fd-5bbe-639b-671e73012118.png)
さぁ、はじめようの前にいくつか用意するものがあります。
1、データベース名
２、データベースのユーザー名
３、データベースのパスワード
４、データベースホスト
５、テーブル接頭辞 (1つのデータベースに複数の WordPress を作動させる場合)

こちらを用意していきます。



#３、データベース作成
データベースをphpmyadminで作成します。
MAMPアプリのWebStartを押し、ブラウザに開いたMAMPスタート画面のメニューから「Tools」を開きます
そして`phpMyAdmin`を開いてください。

開くと下のような管理画面が現れます。
![スクリーンショット 2021-05-19 13.14.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769854/b872c941-fdcd-1951-17ad-4e76c101fe09.png)
左上の矢印からデーターベースツリーを表示させます。
ここに新しくデータベースを作成します。
Newをクリックしてデータベースの名前を入力してcreateすると、データベースが作成されます。



#４、WordPressとデータベースを接続

先程のWebMAMPに戻り下にスクロールするとMySQLがあります。ここの情報をWordPressに入力しデータベースと接続します。
![スクリーンショット 2021-05-19 13.17.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769854/ff33a12a-3006-6e12-be0d-c808292f051d.png)


WordPressに戻り「さぁ、はじめよう」をクリックしてデーターベースの情報を入力してくだいさい。

![スクリーンショット 2021-05-19 13.25.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769854/917464d1-30ef-c0fc-5342-380b9ca026ee.png)
送信をするとデータベースと接続されます。

このあと表示される画面で、必要情報を入力してWordPressをインストールしてください。
この時パスワードを忘れずにどこかに保存しておいてください。
最後WordPressにログインします。
いつもの管理画面が表示されれば成功です！

#最後に
簡単にWebサイトを制作できるWordPressは、デプロイもレンタルサーバーを使えば簡単です。
あらかじめサーバーのにアップした状態で制作していくことが多いのですが、ローカルで作業することもあるので記事にしてみました。
MacでGithubにpushしようとしたらPermission deniedになっちゃった！！

#しようとしたこと
Githubのリモートリポジトリにpushしたかった

#起こった問題
`remote: Permission to user/repository denied to otheruser`
前に使っていたユーザーの接続情報が残っているみたい

#前提条件
`git --global user.name`とかRSAキーチェーンとかは作ってある前提です。

#対処法
Macに残っているキーチェインを削除して再度接続する。

1. アプリケーション>ユーティリティー>キーチェーンアクセス
から`github.com`を削除してあげる。
2. 再度pushしたいローカルリポジトリから
 - `git init`
 - `git add *`
 - `git commit -m 'comment'`
 - `git push origin master`
3. ここでブラウザが開いて再度アカウントと紐づけるかを聞かれるので、画面の指示に従って接続する。

# 最後に
ここまで読んでいただきありがとうございます。
railsのerbファイルでRailsヘルパーにjavascript変数を使う方法。

<h2>何をしたいのか</h2>

```erb
<script>
  Javascriptの変数 = "テスト"
  $('.image-upload-box').append(`<%= f_img.hidden_field :image, value: Javascriptの変数 %>`);
</script>
```

というふうに使いたかったのですが
これではエラーが発生してしまい使用できません。

<h3>解決方法</h3>

```erb
<script>
  Javascriptの変数 = "テスト"
  $('.image-upload-box').append(`<%= f_img.hidden_field :image, value: '${Javascriptの変数}' %>`);
</script>
```

このようにしたらvalueにjavascriptの変数を使うことができました。
PHP use演算子を用いたエイリアス作成で指定クラス名とは別名でエイリアスを作成する（asを使う）個人メモ

# 目的

- use演算子を用いたエイリアス作成時にクラス名とは異なる名前でエイリアスを作成する方法をまとめる

# 情報

- 下記のように記載することでクラスのエイリアスを作成する。

    ```php
    use App\Repositories\UserRepositoryInterface;
    ```

- 上記use演算子が記載されたクラスで作成されたエイリアスのクラスを用いて処理を実行するときは`UserRepositoryInterface`が使用される。

# 方法

- 下記のようにエイリアス作成時に`as`を用いて記載することで実際のクラス名とは別名のエイリアスを作成することができる。

    ```php
    use App\Repositories\UserRepositoryInterface as UserRepository;
    ```
【React】react-routerのhooks

# react-routerのhooksの種類
## useHistory
- ページ遷移させるときに使用するhistoryオブジェクトを取得できる

```.ts
const history = useHistory();

history.push('/');
history.goBack();
```

## useLocation
- 現在のページのURLのpathやqueryなどを取得できる

```.ts
const location = useLocation();

location.path
location.search
```

## useParams
- URLパラメータを取得できる
  - `<Route path="/sample/:name">` と定義したページにアクセスした際に下記の記述で `:name` の値を取得できる

```.ts
const { name } = useParams();
```
【WEB制作についての知識を習得】栁田拓海

# 今週の学習課題
・ WEB制作についての知識の習得
※ フロント業務に興味があったため

# 学習内容・結果
#### 1. WEB制作において知るべきこと
　　-独自ドメイン
　　-サブドメイン
　　-共有サーバーと専用サーバ
　　-WEB上でのルール
　　 etc...
#### 2. WEB制作にあたって行う業務
　　ーコンテンツ企画提案・実施
　　ー進行管理・調整
　　ーサイト制作・更新
　　ーデザイン作成・編集
　　ーUI改善施策
　　ーSEO施策
　　ーテスト
　　　etc...


WEB制作において必要不可欠な、WEB構築の仕組みを理解すること。
WEBの仕組みとWEBサーバーの構造って一体何か？という視点から学習を始めました。

WEBサーバの基本的な動作は「要求されたファイルを返すか、ファイルを実行して結果を返すかの２種類が存在する。」その上で**プロトコル**と呼ばれる通信手段、**IP**が必要になります。

そこで関わってくるのが、今回の学習で気になった**ドメイン**(住所：アドレスにある＠や.マーク以降のことを指す。)です。

**ドメインの場合(例)**
 > https://www. **sample.com**
 > mail@ **sample.com**

**IPアドレスの場合(例)**
>123.456.0.1

IPにもアドレスがあり、表記方法としては数字のため非常に覚えづらいためドメイン名に変換してWEBサイトを示します。
※通信手段はIP以外にも**MQ**や**TCP**などが存在します。

#### 《ドメインの種類》
1. **独自ドメイン**
法人個人に関わらず、自分で好きな文字列を指定して取得することができるドメイン。
更新する限り自分専用のドメインとして会社のHPや個人ブログなどにも使用可。

2. **サブドメイン**
一つのドメインを用途別に分割したい時に使用可。

####《サーバーの種類(レンタルサーバー)》
1.**共有サーバー**
費用が安価で本人以外にも、他の利用者がいる。
※サーバーが混み合い重くなる可能性がある。

2.**専用サーバ**
本人専用のサーバであるため、費用が高価で初期費用も高額にかかってしまう。


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー


その他で、具体的にWEB制作の業務についても調べておりました。
そこで気になったのが**UI改善施策**と**SEO施策**とは何か？です。

#### UI改善施策
そもそも**UI(User Interface)**とはWebサイトをスマートフォンやPCで閲覧する際の文字の大きさやデザイン、レイアウトのことを指します。
UI改善施策ではWEBサイトの機能性を向上させてユーザーの使用感を高めることが重要になります。サイトのデザインが良くとも機能性に優れていなければ、閲覧者は減ってしまいます。
常に各要素の機能面に注意を払う必要があります。

#### SEO施策
**SEO(Search Engine Optimization)**は優良なリンクを収集したり、ユーザーに価値あるコンテンツを提供し、適正に検索エンジンにページ内容を評価されるようになると検索エンジンのキーワードに引っかかるという仕組みです。
SEO施策を生かすことにより、低コストで集客が見込める。（広告と違って無料のため）


# 来週の目標
JavaScriptについて学習を始める
Git・JPAについて(先日面談にて、未認知なことが多かったため)
`X-Frame-Options` ヘッダ

# `X-Frame-Options` ヘッダ
## とは何か
自身が他サイトから、`<frame>`, `<iframe>`, `<embed>`, `<object>`などからの参照（コンテンツの埋め込み）に制限（見られる/見られない）を加えることが出来るHTTPレスポンスヘッダ。  
（制限を加える挙動はWebブラウザ側のため、ユーザが対応ブラウザを使用している必要があるが、現在使われている殆どのブラウザで対応済。~~「IE7が許されるのは平成までだよねー」（※2016年12月 Microsoftによるサポート終了）~~）  

```
Webブラウザ
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┠────────────────────────────────┨
┃                                ┃
┃  他サイト（悪意のあるサイト etc.）      ┃
┃                                ┃
┃ ┌────────────────────────────┐ ┃
┃ │ <iframe> etc.              │ ┃
┃ │                            │ ┃
┃ │  自サイト                    │ ┃
┃ │    with X-Frame-Options    │ ┃
┃ │                            │ ┃
┃ │  ※ここの挙動に制限を           │ ┃
┃ │   課すことが出来る！！           │ ┃
┃ │                            │ ┃
┃ └────────────────────────────┘ ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
```

基本的な考え方としては、たとえば「埋め込みwidget（ex: [Twitterタイムライン](https://help.twitter.com/ja/using-twitter/embed-twitter-feed)）みたいなものを実装する」みたいな要件（「DENYされるまさにその挙動をどうしても実装する必要があります」案件）でもない限り、基本的には`X-Frame-Options: DENY`にしておくのがベター（安全）。  
またその必要がある場合であっても、許可する範囲は最低限にするのが望ましい。（1エンドポイント許可すればいい要件なのに「個別指定めんどいし全体を許可しちゃえw」とかはマジでアカン！）

### 設定方法
サーバサイドからHTTPレスポンスヘッダで指定する。

```
X-Frame-Options: DENY | SAMEORIGIN
```

指定可能な値は以下（制限が厳しい（i.e. 安全な）順）

- `DENY`: 一切の`<iframe>`等によるコンテンツの埋め込みを拒否する（表示できなくなる）
- `SAMEORIGIN`: 同一[オリジン](https://developer.mozilla.org/docs/Glossary/Origin)（http/https、サブドメイン、ポートまで揃える必要がある）でのみコンテンツの埋め込みが許可される
- (※廃止) `ALLOW-FROM uri`: 現在のほとんどブラウザでは動作しない。[`Content-Security-Policy`](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Security-Policy)ヘッダに[`frame-ancestors`](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors)を指定することで同等の制限を加えることが出来る

## 参照
- [X-Frame-Options - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/X-Frame-Options)
EC2でHPPTSサーバーを立ち上げる

こちらの記事を参考に。
https://qiita.com/RubiLeah-com/items/73433eaf6b5d3ed45133

`sudo yum install apache2`ではなく、`sudo yum install httpd`でApacheをインストール。
設定ファイル等も、`/etc/apache2`の中ではなく、`/etc/httpd`の中なので注意。
https://qiita.com/u-bayashi/items/ce3ecb3badda60179fab

このままではSSLモジュールが入っていないので、`sudo yum install mod_ssl`でインストール。
https://qiita.com/jinnai73/items/638dcc1434d47b12e6ba

こちらを参考にSSL証明書を取得。自動更新。
https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-20-04-ja


https://weblabo.oscasierra.net/letsencrypt-2/

https://qiita.com/RubiLeah-com/items/73433eaf6b5d3ed45133
phpMyAdminを使用するときは`sudo yum install php`を忘れずに。
https://stackoverflow.com/questions/23235363/forbidden-you-dont-have-permission-to-access-phpmyadmin-on-this-server


https://qiita.com/100/items/8e9d9540845cc23e6111

こちらで、socketを更新。
https://qiita.com/cathei/items/a9854befd25f0562a0b7

こちらの`/etc/phpmyadmin/config.inc.php`の設定も忘れずに。
https://absg.hatenablog.com/entry/2014/08/21/165707
BastilleBSDのIPv4

jailを作るときにIPv4のアドレスを指定するとそのアドレスがjailに設定されます。外に出るときにはホストのインターフェースがnatしてアクセスします。

![BastilleIPv4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/88c0c6e0-c90a-7a8c-3a7f-f7fd16de92b7.png)

外から直接jailへのアクセスはできません。

BastilleBSDではホストのポートをjailのポートに転送する機能があります。

tftpのポートをホストからjailに転送してみます。

```
% sudo bastille rdr testjail udp 69 69
```

この設定は再起動しても保存されています。

inetdを有効にしてtftpdを使えるようにしてみます。tftpを有効にした/root/inetd.confを用意しておきます。

```
% sudo bastille sysrc testjail inetd_enable="YES"
% sudo bastille sysrc testjail inetd_flags+=" /root/inetd.conf"
% sudo bastille restart testjail
```

大きなファイルを転送すると結構Timeoutが発生しますが、ファイルは正常に転送できます。

ZRouterのイメージのパスをtftpのパスにしておくとu-bootからtftpでファイルが取得できるようになります。

BastilleBSDはVNETを使うこともできて、その場合はより柔軟に設定ができるものと思われますが、複雑になるので試してません。
[SCSS/SASS] 変数でカラー管理をしていたら警告が発生した件の対処方法

## 環境情報
- Nuxt: 2.15.6
- sass: 1.32.13

## 経緯
nuxtでsassのバージョンアップしたらSCSSで警告が出るようになってしまった。

### 警告文
```
You probably don't mean to use the color value white in interpolation here.
It may end up represented as white, which will likely produce invalid CSS.
Always quote color names when using them as strings or map keys (for example, "white").
If you really want to use the color value here, use '"" + $name'.
```


### 修正前ソースコード
よく見かける変数を用いたカラーごとのcssスタイルの定義だが、このソースコードの記述方法が良くないと警告が発生している模様。

```scss
$color-white: #ffffff;
$color-grey: #f5f5f5;

$colors: (
  grey: (
    background-color: #{$color-grey},
  ),
  white: (
    background-color: #{$color-white},
  ),
);

@each $name, $color in $colors {
  .button-#{$name} {
    background-color: map-get($color, background-color);
  }
}
```

### 修正前ソースコード
修正点は1箇所で、変数で利用しているkeyをダブルクォーテーションで囲む必要がある。

```scss
$color-white: #ffffff;
$color-grey: #f5f5f5;

// keyのgrey, whiteに対してダブルクォーテーションで囲む必要がある！
$colors: (
  "grey": (
    background-color: #{$color-grey},
  ),
  "white": (
    background-color: #{$color-white},
  ),
);

// ここは修正なし
@each $name, $color in $colors {
  .button-#{$name} {
    background-color: map-get($color, background-color);
  }
}
```

## 参考
https://stackoverflow.com/questions/57455245/how-to-i-solve-this-sass-interpolation-issue

## 最後に
警告は無視せずに必ずチェックしましょう！
Postman を Mac OS にインストールする

# はじめに
Postman のインストール方法について、メモを残しておきます。

# やったこと
## 1. Postman のサイトにログイン
はじめに Postman にアカウントを登録する必要があります。
必要な情報は以下の通り

 - アカウント名
 - パスワード
 - メールアドレス

アカウントを登録したら、メールボックスに Postman からメールが届くため確認しておきます。

## 2. Postman のクライアントのインストール

[Postman](https://www.postman.com/) にアクセスします。
サイトの下部に Get Postman の項目があり、そのなかの [Download App](https://www.postman.com/downloads/) をクリックします。

![スクリーンショット 2021-06-04 18.10.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54900/6ddd3440-cac2-ff71-77ac-e76f7931b6d9.png)

ダウンロードに下記のアイコンが表示されます。
![スクリーンショット 2021-06-04 18.12.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54900/56450e47-dd24-d99b-ef92-7e4cb6989d53.png)

アイコンをアプリケーションにドロップしたらインストール完了です。

![スクリーンショット 2021-06-04 18.14.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54900/29e76180-8964-274c-e914-1f71e62a0a14.png)

Sign In をクリックするとデフォルトブラウザで Postman のページが表示され、登録したアカウントをクリックすると Postman Client がつかる状態になります。

![スクリーンショット 2021-06-04 18.17.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54900/caa8de0e-d08b-3988-0a52-33f184ab037c.png)

# 終わりに
特段難しいことはしてないので、ドヤれないですが、Postmanのアプリケーションの場所がわからなかったため、備忘録として記載しておきます。
VisualStudio for mac ショートカット一覧

## ショートカットの確認、編集
「ツール」　→　「キーバインドの追加」

## 編集
|キー  |内容 |
|---|---|
|⌘ + / |コメント切り替え  |
|Ctrl + シフト + k|行削除* |
|Ctrl + 矢印|行末、行頭に移動 |
|⌘ + 矢印|隣の単語に移動* |
*カスタム設定
Spectre

# Spectre
## とは何か
2018年1月3日に発表された、マイクロプロセッサ（≒CPU）の一般的最適化手法である「投機的実行」などを悪用したハードウェアレベルの脆弱性。
（上述の通りハードウェアアーキテクチャに由来する脆弱性であり、修復が困難なことから、「相当のあいだ幽霊（Spectre）のように我々に取り憑くだろう」と[説明されて](https://spectreattack.com/#faq-why-spectre)いる）

この脆弱性の種別は、「サイドチャネル攻撃」に分類され、
具体的な脅威としては、正当な権限のないメモリの領域（ex: 他のアプリケーションやカーネルのメモリ領域）にアクセスすることが可能になる、という重篤度の高いもの。

このSpectreと同時期に発見され、かつ類似性・関連性の高い脆弱性として、Meltdownがある。
（なお、Meltdownの脆弱性種別は「権限昇格攻撃」に分類される）

## フロントエンド（Web界隈）からみたSpectre騒動
これらの脆弱性による騒動においてフロントエンド上特筆すべき事項としては、

- JavaScriptのJITエンジンに発見された（2つ発行されたCVE番号のうちの1つ：CVE-2017-5753）ことから、フロントエンドとの関連性が強く認識・意識されている脆弱性であること
- マイクロプロセッサにおけるハードウェアレベルの脆弱性であるため、まずはOS側やブラウザなどのアプリケーション側で回避策が取られつつあること
- それらと並行してWeb標準側でも「cross-origin isolation」として対策の提案・啓発が進められていること
- ブラウザベンダ（Chrome, Firefox, Safari）による対症療法として、以下の対応が取られたこと
  - `performance.now()`が返すタイムスタンプの解像度を下げる
      - サイドチャネル攻撃における、キャッシュヒットを推測するためのタイムスタンプ用途としての当該APIの可用性を下げるため
  - [SharedArrayBuffer](https://qiita.com/toshi00ysm/items/ec118ee9457e5e141ef8)のデフォルト無効化
    - [ある手法](https://github.com/tc39/ecmascript_sharedmem/issues/1)により、高解像度（nanosecond級）のタイマを実装することで`performance.now()`を代替可能なため
      - ある手法：ざっくり解説すると、[SharedArrayBuffer](https://qiita.com/toshi00ysm/items/ec118ee9457e5e141ef8)の「スレッド間で値を相互参照できる」という特性と、Workerによるマルチスレッド処理、その処理スレッド内無限ループでのインクリメント処理を組み合わせて高解像度のタイムスタンプを生成・利用できる、みたいな感じ。
    - 現在では、Chrome, Firefoxにおいて[`cross-origin isolationed`](https://www.google.com/search?q=cross-origin+isolationed)であることを条件に再有効化されている

などが挙げられる。

## 参照
- [Meltdown and Spectre](https://spectreattack.com/)
- [Spectre - Wikipedia](https://ja.wikipedia.org/wiki/Spectre)
- [Post-Spectre Web Development](https://www.w3.org/TR/2021/WD-post-spectre-webdev-20210316/)
- [Cross-Origin Resource Policy (CORP) - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Cross-Origin_Resource_Policy_(CORP))
- [Security consideration: Multi-threading helps cache-based side channel attacks · Issue #1 · tc39/ecmascript_sharedmem · GitHub](https://github.com/tc39/ecmascript_sharedmem/issues/1)
unittestで動的にmock responseを帰る

#はじめに
unittest.mockのpatchメソッドではmockのresponseを送信することはみなん知っていると思いますが、しかし、請求URLなどより動的にmock responseを作ることはどう実現できるでしょうか？この記事ではそれを実現するための方法を紹介します。

#return_valueとside_effect
簡単にまとめる、こんな感じ：

* モックを呼び出したときに（毎回同じ）返り値を返してほしい場合はreturn_value属性を設定する。
* モックを呼び出すたびに異なる返り値を返してほしい場合はside_effect属性に渡す。

今回は可変な返り値を返してほしいのでside_effect属性を利用します。

#コード例

```
import json
from unittest.mock import patch
from requests import Response

def mocked_request_get(*args, **kwargs):
    response_content = None
    request_url = kwargs.get('url')
    if request_url == 'aurl':
        response_content = json.dumps('a response')
    elif request_url == 'burl':
        response_content = json.dumps('b response')
    elif request_url == 'curl':
        response_content = json.dumps('c response')
    response = Response()
    response.status_code = 200
    response.content = str.encode(response_content)
    return response

@patch('requests.get', side_effect=mocked_requests_get)
```

ここに注意すべきなのはkwargs.get('url')のところ請求requestによりコードを変わる必要があります。以上のようなmocked_request_getで請求requestより違うresponseを作成し、patchメソッドのside_effect属性を利用して、mockのresponseを作ることができます。
【JavaScript】export function とはなんぞや


## はじめに

先に言っておくと**「export function」なんてありません！**

この記事はただ自分の痴態を晒しているだけで、自分への戒めとして、あとは気軽にQiitaに投稿するきっかけになればいいなくらいの思いでこの記事を書き始めました。

## きっかけ！

jQueryは普段触っていますが、モダンと言われるような(今では当たり前？)ES2015以降のJavaScriptにしっかりと触れていなかったので触れたいと思い、とりあえずやってみれば出来るだろうと軽い気持ちで[Next.jsのチュートリアル](https://nextjs.org/learn/basics/create-nextjs-app)に手を出して模写してみました。

しかし、モダンな環境に慣れていない私にはfunctionは分かってもみなさんご存知のようにexport functionなんて早速書かれても、functionの頭になんでexportなんてついちゃったの！？！？

ってな感じで困ってしまい、最初からわかんないのまま進むのは良くないなと思い、「export function」について調べ出しました。（この時までは本当に「export function」なんて構文があると思っていたんです...。）

## ググってみた！

こんな内容なんてググればすぐに出てくるだろうと思い「js export function」で早速調べてみたのですが、見出しを見てみる限りJavaScriptのexportについての記事ばかりです。

勝手に検索結果に出てくると思っていた「export function」についてのサイトが出てこないので泣きそうになりました。しかし天下のGoogleを信じてサイト上位のサイトを見てみることに。

・・・

ふむふむ...ふむ？...ん〜なるほど、よくわからんぞ！！

ただ、分からないなりにも分かったこともありましたよ。



## export functionとは！（まとめ）

- ##### **「export function」なんて構文はない！**

  - 自分の思い込みで勝手に作った構文でした...
  - 「export」と「function」は別々の構文で知らなかったことは「export」についてだった！

- 「export」で指定した処理を使うときは「import」で利用するよ！

- 「export」はモジュールやクラスとして扱うために使用されているみたい！

- モダンな環境に慣れていない人（自分）には「import」と「export」がわかるとNext.jsのソースが読み方がわかるようになった！



## 参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/export

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Modules
4つの数字の組み合わせの和から最大値を求める[Ruby]

## 問題

```
 1 から 9 までの数字の中から4つの数字を選択する。
4つの数字は同じ数値が重複する事もある。

4つの数字をあらゆる並べ方を試し、和の最大値（最大スコア）を求めます。

例えば、 1 の 2, 9, 3, 8 の 4 枚を使う場合、
以下の 12 通りの和の 175 が最大となる。

4つの数値の並べ方は 4! = 24 通り存在しますが、足し算は順序に依存しないため、12 通りのみ考慮すればよいことに注意してください。
たとえば、9, 2, 3, 8 の順で並べた場合のスコアは 92 + 38 = 130 となります。

例
・92 + 38 = 130
・92 + 83 = 175
・93 + 28 = 121
・93 + 82 = 175
・98 + 23 = 121
・98 + 32 = 130
・39 + 28 = 67
・38 + 29 = 67
・82 + 39 = 121
・89 + 23 = 112
・89 + 32 = 121
・83 + 29 = 112
```

## 条件

```
1 ≦ a, b, c, d ≦ 9
```

## 例

```
入力例1
2 9 3 8
出力例1
175

入力例2
7 8 7 7
出力例2
164
```

## 回答

```ruby
input_line = gets.split(" ").sort { |a,b| a.to_i <=> b.to_i }.reverse
puts  "#{input_line[0]}#{input_line[2]}".to_i + "#{input_line[1]}#{input_line[3]}".to_i
```

## 回答(refactoring)

```ruby
input_line = gets.split(" ").sort { |a,b| a.to_i <=> b.to_i }.reverse
puts  [input_line[0], input_line[2]].join.to_i + [input_line[1], input_line[3]].join.to_i
```

## 学び

### sortメソッド / sort_byメソッド

```ruby
a = [2,3,1,4,5,1]
p a.sort
#=> [1, 1, 2, 3, 4, 5]

s = ["aaaaa","b","cc"]
p s.sort_by {|array| array.size}
#=> ["b", "cc", "aaaaa"]
```

### joinメソッド

配列の要素を連結して文字列を返すjoinメソッド

```ruby
array = ["1", "5", "4"]
p array.join
# => "154"

p array.join("-")
# => "1-5-4"
```

## おわりに

最終的な出力の際に

```ruby
puts  [input_line[0], input_line[2]].join.to_i + [input_line[1], input_line[3]].join.to_i
```

としているが、`[input_line[0], input_line[2]]`この部分は、もう少しスマートに書ける気がする。

配列の中から指定したindexの要素を取り出し新たな配列を作り出すメソッドがあれば、もっとスマートに書けるようになるのではないか、見つからなかったけど,,,
IKSのクラスターをkubectlで操作するための手順メモ

# はじめに
自分用メモです。
IKSのクラスターをkubectlで操作するための手順の説明です。

# 環境
- Windows 10
- IBM Cloud CLI導入済み
    - 導入はこちら参照：https://cloud.ibm.com/docs/cli?topic=cli-getting-started

# 手順

１． IBM CloudのIKSの画面でクラスターIDを確認する

（ここから先はコマンドプロンプトでの作業）

２. ibmcloudにログイン

```
ibmcloud login
```

接続先のリージョンなどを選択する

３．手順１で取得したクラスターIDに接続する

```
ibmcloud ks cluster config --cluster <クラスターID>
```

以上

# おまけ

## ツールチェーンでデプロイしたアプリのPod一覧を取得
 **※名前空間を指定する必要ある点に注意**
（アプリは名前空間：`prod`にデプロイされる）

```
kubectl get pods -n prod

NAME                                                     READY   STATUS             RESTARTS   AGE
hello-app-cc9df5878-9rrsr                                1/1     Running            0          25h
hello-app-cc9df5878-jt2jc                                1/1     Running            0          25h
kube-toolchain-20210603060920654-78f4d556d8-ssc58        0/1     CrashLoopBackOff   299        25h
xxxxxxxxxxxxxxxxxxxxxx-app-deployment-5dfb8ddc54-jwv6g   1/1     Running            0          21h
xxxxxxxxxxxxxxxxxxxxxx-app-deployment-5dfb8ddc54-vrbzc   1/1     Running            0          21h
```

## podに出力されるログを取得

 **同様に名前空間を指定する**

```
kubectl logs xxxxxxxxxxxxxxxxxxxxxx-app-deployment-5dfb8ddc54-jwv6g -n prod
```
fetch(PDO::FETCH_ASSOC) でvar_dumpしたらNotice: Array to string conversionがでた

###fetch(PDO::FETCH_ASSOC) でvar_dumpしたらNotice: Array to string conversionがでた際の対処の記録



```php
$result = $res3->fetch(PDO::FETCH_ASSOC);
var_dump("sqlの結果：".$result);
```


```
PHP Notice:  Array to string conversion
```
var_dumpの結果



```
'sqlの結果：array'
```

###Notice: Array to string conversionとは

`Notice: Array to string conversion`　は「配列が文字列に変換」されてしまうという趣旨の警告メッセージ。
原因別に異なる対処が必要となる。

今回は`implode`を使用して配列を展開した。


```php
var_dump("sqlの結果：".implode(',',$result));

```
結果

```
 'sqlの結果：7' (length=16)
```

###参考サイト

https://se-log.blogspot.com/2020/01/php-notice-array-to-string-conversion.html


https://marycore.jp/prog/php/notice-array-to-string-conversion/

https://www.sejuku.net/blog/50774
ROSの勉強　第41弾：LiDAR（YDLIDAR）

# #プログラミング ROS< LiDAR（YDLIDAR） >

## はじめに
ROS(Robot Operating System)をさらに扱えるようになることが目的である．その第41弾として，「LiDAR（YDLIDAR）」を扱う．

## 環境
##### コンピュータ
|||
|:-:|:--|
|デバイス|raspberry pi 4 Model B|
|メモリ|3.7 GiB|
|Graphics|V3D 4.2|
|OS|Ubuntu|

##### Ubuntu
|||
|:-:|:--|
|リリース|20.04.2 LTS (Focal Fossa) 64ビット|
|カーネル|Linux 5.4.0-1035-raspi aarch64|
|MATE|1.24.0|

##### ROS
|||
|:-:|:--|
|Distribution|noetic|

##### LiDAR
|||
|:-:|:--|
|メーカー|YDLIDAR|
|シリーズ|X2|

## LiDARとは
LiDARはLight Detection And Ranging（光による検知と測距）の略称．対象物に光を照射し，その反射光を光センサでとらえ距離を測定するリモートセンシングの方式をいう．
また，Laser Imaging Detection And Ranging（レーザー画像検出と測距）ともいわれ，多くは近赤外レーザー光をパルス状に照射し，対象物に当たって跳ね返ってくるまでの時間差を計測する．
参考

https://www.rohm.co.jp/electronics-basics/laser-diodes/ld_what10

これらの呼び方によりLiDARであったりLIDARであったりするのかなと思う．今回用いるものは，後者のようだ．

## 環境構築
北陽のLiDARであれば，``urg_node``というようなパッケージだが，YDLIDAR X2では使えなかった．どうやら，YDLIDARがgithubでそれ用のパッケージを用意してくれていたみたいである

https://github.com/YDLIDAR/ydlidar_ros
### 手順
#### ①ワークスペースのsrcディレクトリへ移動
```
cd catkin_ws/src
```
#### ②gitを使ってクローン作成
```
git clone https://github.com/YDLIDAR/ydlidar_ros 
```
#### ③修正するlaunchファイルがあるlaunchフォルダへ移動
```
cd ydlidar_ros/launch
```
#### ④vimなどを用いて修正対象のファイルを編集する 
```
vim X2L.launch
```
ここで，デフォルトのUSBポート（/dev/ydlidar）を今のUSBポート（/dev/ttyUSB0）に変更
#### ⑤vimなどを用いて修正対象のファイルを編集する 
```
vim lidar_view.launch
```
ここで，includeの部分（lidar.launch）を（X2L.launch）に変更 
#### ⑥変更内容を更新 
```
cd ~/catkin_ws && catkin_make
```
これで，YDLIDAR X2が使えるようになる．

## 実行
```
roslaunch ydlidar_ros lidar_view.launch 
```
これは，Rviz上でYDLIDAR X2で取得したレーザトピックを表示してくれる設定で，YDLIDARの起動とRvizの起動をしてくれる．その時の様子を動画像で，下に示す．
<iframe width="560" height="315" src="https://www.youtube.com/embed/ELFFmQqmubE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
このとき，YDLIDARを適当に部屋の中で持って動かしてみた．うまく，測定データを取得でき，反映できていることが確認できる．

## 感想
とりあえず，ROSでのLiDARの扱い方について学ぶことができた．これにより，ROS上で現実世界の距離情報を取得できるようになった．これにgmappingなどを適用することで，現実世界の地図構築が可能になる．前回に引き続き，現実世界とつながってくると，ますます楽しくなってくる．

##参考文献
ROHM SEMICONDUCTOR; Home> エレクトロニクス豆知識> レーザーダイオードとは？> LiDARとは？
（https://www.rohm.co.jp/electronics-basics/laser-diodes/ld_what10）2021/06/04

実用ロボット開発のためのROSプログラミング
　　　　　　　　西田 健，森田 賢，岡田 浩之，原 祥尭，
　　　　　　　　山崎 公俊，田向 権，垣内 洋平，大川 一也，
　　　　　　　　斎藤 功，田中 良道，有田 裕太，石田 祐太郎 共著
　　　　　　　　　　　　　　　　　　　　 森北出版株式会社　発行
Power Automate ：「動的なコンテンツ」を「式」で表現する

## 先に結論
**「動的なコンテンツ」は「式」で書くことが可能です。**

## Formsのアクションから取得できる動的なコンテンツの変換例


トリガー：「新しい応答が送信されるとき」から得られる「動的なコンテンツ」の変換

| 動的なコンテンツ | 式 |
|:-|:-|
| body | triggerOutputs()?['body'] |
| resourceData | triggerOutputs()?['body/resourceData'] |
| 応答ID | triggerOutputs()?['body/resourceData/responseId'] |

アクション：「応答の詳細を取得する」から得られる「動的なコンテンツ」の変換

| 動的なコンテンツ | 式 |
|:-|:-|
| Responders' Email | outputs('応答の詳細を取得する')?['body/responder'] |
| Submission time | outputs('応答の詳細を取得する')?['body/submitDate'] |
| resourceData | triggerOutputs()?['body/resourceData'] |


## 「動的なコンテンツ」を「式」にする方法
現状、「式」タブのテキストエリアに図のような"()"などを入力して、
再度「動的なコンテンツ」タブに戻り、変換したい「動的なコンテンツ」をクリックして変換してます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482157/92f723f4-e5e4-a70a-e26a-e4baa21d1461.png)
「body」をクリックした状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482157/63a97932-adae-6051-4a3a-652bc7a169ee.png)

また、いくつか変換してみることで、予測して作成することも可能かと思います。


##　ハンズオン
**「Formsの回答をトリガーとしたフロー作成」**を通して説明します。
今回は、送信するだけのアンケートを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482157/fe03b045-9e6d-eff0-ccec-86c26c499a2a.png)

まずは通常通りフロー作成
アンケートの回答者のTeamsに、ありがとうメッセージを送信するフローです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482157/757c6b22-2106-4f2e-c229-0902476f8f14.png)

応答IDやRecipientに動的なコンテンツ「応答ID」や「Responders' Email」を使用しています。
上記フローを保存することで、「テスト」アンケート回答者にTeamsのメッセージが自動配信されるようになるわけです。

**では、本題に移ります。**
先ほどのフローの「動的なコンテンツ」を「式」で書き換えてみます。※このページの最初の表を参照
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482157/d6d6945e-d9cc-e48c-aeff-21476c492174.png)

保存して「テスト」アンケートに回答すると、先ほどと同様にTeamsのメッセージが自動配信されることを確認できます。





## まとめ
今回は、氷山の一角を紹介しました。
これを応用したフローを近々作成し、ご紹介したいと考えています。


以上
定型メール作成を GAS で自動化すると業務がちょい捗る

# はじめに
\_s\_\_o\_ です。

定型メール、作成していますでしょうか。日報、週報、進捗報告、etc etc...。色々あると思います。月次程度ならまだ手動で何とかなるかもしれませんが、週次・日次となると地味に時間がかかります。

Thunderbird などであれば「このメールをもとに新しいメールを作成」的な機能で、メールを複製可能です。しかし、残念ながら Gmail ではそのような機能は備えていません。そのため、毎回 To や Cc や本文などをせっせとコピペする必要があります。こういった作業は単純に時間を要するだけでなく、手作業によるミスを誘発します。特にメール宛先に関しては、メール誤送信の温床になり得ます。

上記のような背景から、作業時間短縮 & 作業品質向上の目的で、定型メール作成を GAS で自動化したいと思います。

# 入出力イメージ
## 入力 (スプレッドシート)

定型文をスプレッドシートで作成します。可変内容 (日にちなど) に関しては、関数で自動更新されるようにします。
![01_input.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46216/87e13ed4-0efb-e755-15e9-6614373060e2.png)

## 出力 (Gmail 下書き)

出力は下書きまでに留めます。最終的に送信するか否かは、人間が中身をしっかりとチェックして、判断する必要があります。
![02_output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46216/a69f1da0-9b2e-8bcf-f4b4-6ea25cf0c661.png)

# コード
## 全文
とりあえず手動実行前提のため、非常にシンプルです。
```
function createDraft() {
  const values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
  const to = values[0][2];
  const cc = values[1][2];
  const bcc = values[2][2];
  const subject = values[3][2];
  let body = '';
  body += values[4][2] + '\n\n';
  body += values[5][2] + '\n\n';
  body += values[6][2] + '\n\n';
  body += values[7][2];

  GmailApp.createDraft(to, subject, body, {
    cc : cc,
    bcc : bcc
  });
}

// 関数を実行するメニューを追加
function onOpen() {
  var ui = SpreadsheetApp.getUi();
  var menu = ui.createMenu('マクロ実行');
  menu.addItem('メール下書き作成', 'createDraft');
  menu.addToUi();
}
```
## 解説
```
function createDraft()
```
メール下書き作成用の関数です。単純に、アクティブシートの特定セル値を取得しているだけです。最後に「GmailApp.createDraft()」で、取得した値をもとにメール下書きを作成しています。

```
function onOpen()
```
手動実行用の関数です。この関数を仕込んでおくと、スプレッドシートを開いたタイミングで、メニューバーにアイテムが追加されます。このアイテムを選択して、上記の「createDraft()」を手動実行します。メニューバーに追加されているイメージは、下記の通りです。
![03_手動実行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46216/bb7a9350-107b-4624-4396-38227d09ec95.png)

# まとめ
以上、簡単ですが、定型メール作成を GAS で自動化する方法でした。

今回は手動実行前提の方法でしたが、GAS の実行トリガーとうまく組み合わせれば、日次・週次でメール下書きを自動作成させることも可能かと思います。
【Kotlin研修3日目】アクティビティのライフサイクルとログレベル

# アクティビティのライフサイクル
[出典・参考: アクティビティのライフサイクル](https://developer.android.com/guide/components/activities/activity-lifecycle?hl=ja)
アクティビティのライフサイクルを示す図は以下の通り。
![アクティビティのライフサイクル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/673880/e4188b84-7946-0c82-d69b-2775f4c2649c.png)

## ライフサイクル
`アクティビティ`の`起動`から`終了`までの、`アクティビティ`の状態遷移。

## ライフサイクルコールバックメソッド
`アクティビティ`の画面状態に応じて呼び出される`メソッド`。

## ライフサイクルの流れ
### アプリ起動時

|ライフサイクル|処理|
|:--|:--|
|[`Main`] `onCreate()`|初回起動時の`バックグラウンド処理`|
|[`Main`] `onStart()`|`アクティビティ`(=画面)の起動|
|[`Main`] `onResume()`|ユーザによる`操作入力`が可能<br>=`アクティビティ`**表示**の直前|

### 画面遷移時(Main→Sub)

|ライフサイクル|処理|
|:--|:--|
|[`Main`] `onPause()`|`アクティビティ`の一時的な停止<br>=`アクティビティ`**非表示**の直前|
|[`Sub`] `onCreate()`|初回起動時の`バックグラウンド処理`|
|[`Sub`] `onStart()`|`アクティビティ`の起動|
|[`Sub`] `onResume()`|ユーザによる`操作入力`が可能<br>=`アクティビティ`**表示**の直前|
|[`Main`] `onStop()`|`アクティビティ`の停止|

### 画面遷移時(Sub→Main)
|ライフサイクル|処理|
|:--|:--|
|[`Sub`] `onPause()`|`アクティビティ`の一時的な停止<br>=`アクティビティ`**非表示**の直前|
|[`Main`] `onRestart()`|`アクティビティ`の再開|
|[`Main`] `onStart()`|`アクティビティ`の起動|
|[`Main`] `onResume()`|ユーザによる`操作入力`が可能<br>=`アクティビティ`**表示**の直前|
|[`Sub`] `onStop()`|`アクティビティ`の停止|
|[`Sub`] `onDestroy()`|`アクティビティ`の終了|

### マルチタスクボタンのタップ時(Main)
`Sub`画面での実行時は`Main`→`Sub`に置き換わる。

|ライフサイクル|処理|
|:--|:--|
|[`Main`] `onPause()`|`アクティビティ`の一時的な停止<br>=`アクティビティ`**非表示**の直前|
|[`Main`] `onStop()`|`アクティビティ`の停止|

### マルチタスク画面によるアプリの終了時(Main)
`Sub`画面での実行時は`Main`→`Sub`に置き換わる。
※**`Main`画面の`onDestroy()`は実行されない**

|ライフサイクル|処理|
|:--|:--|
|[`Main`] `onDestroy()`|`アクティビティ`の終了|

### 「戻る」ボタンによるアプリの終了時

|ライフサイクル|処理|
|:--|:--|
|[`Main`] `onPause()`|`アクティビティ`の一時的な停止|
|[`Main`] `onStop()`|`アクティビティ`の停止|
|[`Main`] `onDestroy()`|`アクティビティ`の終了|

***

# Androidのログレベル
`Logcat`に表示される、`Android OS`またはその`アプリ`が発するログメッセージの深刻度。
各`ログレベル`に対応するメソッドは、`Log`クラスで用意される。

|ログレベル|内容|対応メソッド|
|:--|:--|:--|
|`Assert`|重大なエラー|wtf()|
|`Error`|エラーを引き起こした問題|e()|
|`Warn`|エラーとはいえない潜在的な問題|w()|
|`Info`|通常の使用で発生するログメッセージ|i()|
|`Debug`|製品版アプリでも出力されるデバッグログメッセージ|d()|
|`Verbose`|製品版アプリでは出力されないデバッグログメッセージ|v()|

## Logクラス
`ログ`の出力を`Logcat`に送信するAPI。