OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeのcode runnerでファイル分割されたC/C++ファイルをコンパイル&実行

## 環境
- MacOS Big Sur
- Visual Studio Code (以下,VSCode) 

# 実現したいこと
VSCodeの拡張機能である`Code Runner`を用いてファイル分割したC/C++の実行をショートカットでできるように設定したい.

## code runnerのインストールと設定

次の記事を参考にインストールしてください.

https://murabitoleg.com/vscode-runner/#CodeRunner

## デフォルトの設定の問題点

デフォルトの設定では次のような単一ファイルのみを`code runner`でコンパイル＆実行することができる.

```c:hello.c
#include <stdio.h>

int main(void)
{
    printf("hello\n"); // => hello
    return 0;
}
```

同階層のディレクトリに`hello`という実行ファイルが作成されて,コンソールに`hello`と出力される.
よって,ここまでは意図した通りに正しく実行できる.

しかし,デフォルトの設定では次のようなケースでは正しくコンパイルできない.

次のようにファイル分割することを考える.

```c:hello.c
#include <stdio.h>

void hello(void)
{
    printf("hello\n");
}
```

```c:hello.h
#ifndef _HELLO_H_
#define _HELLO_H_

void hello();

#endif //_HELLO_H_
```

```c:main.c
#include "hello.h"

int main(void)
{
    hello(); // => hello
    return 0;
}
```

ここではファイルの内容に関して詳しく議論しない.

問題となる点はこれがデフォルトの設定では意図したようにコンパイル＆実行されないことである.

デフォルトの設定では次のようにコンパイル時のエラーが出力される.
![スクリーンショット 2021-04-11 7.45.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1262857/8d56de72-fbfa-c23b-5a28-42a352b199f6.png)

要するに,`hello`という関数が定義されてないからどうしたらいいのかわからないといったところである.

### 問題の本質
> 分割した`hello.c`がリンクされていないこと

よって,`code runner`を実行した時のコンパイルの仕方を変更する必要性がある.


## 設定の変更

1. VSCodeの拡張機能からインストールした`code runner`を検索する.
![スクリーンショット 2021-04-11 7.46.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1262857/70e7711b-9785-f62f-f25a-ea85b59600b1.png)

1. `code runner`の`json`ファイルを開く.
![スクリーンショット 2021-04-11 7.55.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1262857/a4ca69e7-178a-5d45-6d64-71ecf0778a6e.png)
1. C/C++の設定を探すとデフォルトでは次の画像のようになっている.
![スクリーンショット 2021-04-11 7.46.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1262857/96d94ad0-e3e0-409a-ad06-fce14d271be0.png)
1. `gcc $filename`の部分を`*.c`に変更する.ついでに,cppも同様に`g++ $filename`を`*.cpp`に変更する.
つまり,次のように変更する.

```json:settings.json
      "c": "cd $dir && gcc *.c -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
      "cpp": "cd $dir && g++ *.cpp -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
```

これでファイル分割したC/C++でも`code runner`で`hello.c`もリンクされ正しく実行できる.

### 注意
> ここでの設定は`main.c`を実行しているディレクトリにある`.c`ファイルしかリンクされない.

よってサブディレクトリにある`.c`ファイルはリンクされないので当然ながらコンパイルエラーが出力されるだろう.
もしサブディレクトリに存在するファイルもリンクしたいのなら,
`find . -name "*.cpp" -type f | xargs g++ ...`
などに変更することで無理矢理実行することはできるかもしれないが,これをしたがために意図しない余計なファイルも同時にリンクされ,実行ファイルのサイズが大きくなったり,関数のバッティングが起こってしまうかもしれない.

なので,この方法はあまりおすすめしない.
どうしても楽に実行することを考えるなら,大人しく`Makefile`などを書くことを推していきたい.


おそらく`Windows`でも設定方法はほとんど同じであろう.
mocha + chai + SeleniumによるE2Eテスト メモ

* mocha + chai + SeleniumによるE2Eテスト方法についてメモする。

## e2eテストとは

* End to Endテストの略称。
* システム全体が正しく動作することを確認するテスト。
  * Webサービスの場合：ユーザと同様にブラウザ操作を行い、サービスが期待通りの挙動をしているか確認する。

### mocha

* テスティングフレームワーク
  * テストを記述する関数群を提供し、それらの関数を使って書かれたテストの結果を判定、集計した上で結果を表示する機能を持つフレームワーク。
  * 以下の記述方法に対応している。
    * **TDD（テスト駆動開発）**: メソッド動作をテストで表現しながら設計していく考え方
    * **BDD（振る舞い駆動開発）**: 振る舞い（要求仕様）をテストで表現しながら設計していく考え方
  * アサーションツールはバンドルされていない。

### chai

* アサーションツール
  * テストの実行結果を判定する。

## selenium

* Web ブラウザの操作を自動化するためのフレームワーク。
* テスト以外にもタスクの自動化や Web サイトのクローリングなど様々な用途で利用される。
* Selenium を使ってブラウザを自動で操作するには以下をインストールする必要がある。
  - Web ブラウザ
    - Google Chrome, Firefox,  など
  - WebDriver
    - ブラウザを操作するための API を公開するモジュール
  - Selenium
    - WebDriver と通信しプログラムからブラウザを操作するライブラリ

## 事前準備

* node.jsインストール
* ライブラリインストール

```shell
npm install -D selenium-webdriver mocha chai chromedriver@89.0.0
```

※chromedriverバージョンは使用中のGoogle Chromeバージョンに合わせる。



## テストコード

* test/test.js
  1. 表示ページの`title`要素検証
  2. 検索ボックス入力によるページ遷移検証。

  ```javascript
  const { Builder, By, Key } = require("selenium-webdriver");
  var chai = require('chai');
  var assert = chai.assert;
  let driver;
  
  // テスト対象の宣言
  describe("BDD Test", () => {
    // describeの前に実行される前提条件を記述。
    // Google Chrome起動 
    before(() => {
      driver = new Builder().forBrowser("chrome").build();
    });
  
    // describeの後に実行される後処理を記述。
    // Google Chrome終了
    after(() => {
      return driver.quit();
    });
  
    // 検証内容を記述。
    // 1. 表示ページの`title`要素検証
    it("正常系 Qiitaページタイトル検証", async () => {
      // 指定したURLへ遷移
      await driver.get("https://qiita.com");
  
      // title要素を取得する。
      const title = await driver.getTitle();
  
      // 検証
      assert.strictEqual(title, "Qiita");
    });
    // 2. 検索ボックス入力によるページ遷移検証。
    it("正常系_Qiita検索ページ遷移検証", async () => {
      // 指定したURLへ遷移
      await driver.get("https://qiita.com");
  
      // 検索ボックスに「selenium」を入力し、検索。
      await driver.findElement(By.xpath('/html/body/div[1]/div[1]/div/div/div/div[1]/form[1]/input')).sendKeys("selenium", Key.RETURN);
  
      // URLを取得
      const currentUrl = await driver.getCurrentUrl();
  
      // 検証
      assert.strictEqual(currentUrl, "https://qiita.com/search?q=selenium");
  
    });
  });
  ```

  

## テスト実行

* `package.json`にmochaでテスト実行をする`npm script`を追加する。

  ```json
  "scripts": {
      "test": "mocha test/test.js  --timeout 20000"
  }
  ```

* 以下のコマンドを実行する。

  ```shell
  npm run test
  ```



## 参考情報

* [JavaScript(Node.js)でSeleniumを使って自動UIテストをする方法](https://saikeblog.com/2020/01/27/javascriptnode-js%E3%81%A7selenium%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E8%87%AA%E5%8B%95ui%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)
* [Node.jsとSeleniumでWebアプリのUIテストを自動化（2018年版）](https://ics.media/entry/5759/)
* [mocha / chai チートシート](https://qiita.com/morrr/items/e4e24accf25a8e46d490)
* [Mochaを使ってJavaScriptのテストをブラウザで実行してみよう](https://codezine.jp/article/detail/7367)
* [mochaとchaiの最も基本的な使い方](https://numb86-tech.hatenablog.com/entry/2016/06/08/155834)
Object-oriented programming（日本人は「オブジェクト指向」を勘違いしてるのかもしれない）

受験英語では、"Object"は、「物」とか「目的」のような意味であると学んだ。
プログラムにおける「オブジェクト指向」を学んだときは、クラスとかインスタンスとか継承などの概念を学んだ。

「オブジェクト指向」を学んだとき、私の頭の中には"Object"=「物」という考えしかなかった。

当時は、「目的」という意味を失念していたけど、英語を話す人々が、"Object-oriented programming (OOP)"と聞いた時、「目的意識を持ったプログラミング」「目的指向のプログラミング」のような概念が頭の片隅に浮かんでいるのだろうか。

オブジェクト指向プログラミングの裏には、
>-「目的意識を持ったプログラミング」
>-「目的指向のプログラミング」
>-「Goalを意識したプログラミング」
>-「効率を意識したプログラミング」

という概念が隠れているのだろうか。 :-)

もしそうだどすると、日本人は「オブジェクト指向」を勘違いしてるのかもしれない。
BLOG記事からAPIを叩きたい

最近とあるブログ記事を書いた。

https://motochan1969.hatenablog.com/entry/20210411/1618098387
https://motochan1969.hatenablog.com/entry/20210410/1618016031


しかしながら、クロスブラウザ仕様になっておらず、
そもそもスマホからは、表示できない
→　ちなみにスマホは、XIAOMIでブラウザも中華性・・・

# 音読API

そんなわけで、HTMLからGoogleのテキストスピーチをコールしたいが
HTMLソースにAPIトークンを書かなければならなくなる。
（余計なユーザー認証などは、一切噛ましたくはない・・・）

# 選択肢

いろいろ考えてはみたが、ソースが見れない状態にするには、
デバッグができないように、バックエンドで処理するしかない・・・

かと言って、わざわざ

* HEROKUなんかのサービスを覚えてまでもやりたくないし（いや、スキルがないし）
* WORDPRESSなんか立ち上げて、PHPまで覚えたくない（いや、やりかけて放置してるし）

# 模索中

可能性を考えたが、単にGOOGLE翻訳に文章をいれて、REDIRECTしたらええんじゃないか？
と思った。

＜システム＞
普通のスクレイビングの要領である

* HTML上にWEBブラウザのフォームを立ち上げる
* URLをGOOGLE翻訳にする
* INPUT要素に、読みたいテキストを書き込む
* 翻訳ボタンを押す

しかしながら、一点の懸念としては

* クロスオリジンに引っかかる・・・

そう、いま作っている、１０か国語の辞書アプリも、これが原因でHTMLの音声を使わざる得なくなっている。（もしくは、いったんバックエンドでPOSTを受けて、APIサーバーにKICKするしかない）　　
https://qiita.com/EasyCording/items/502769016329571db520

やはり、HTMLアプリにはいろんな限界があるなあと思う。

そもそもスマホ対応で、全ブラウザのチェックするのも大変だし・・・

いったいフロントエンドの開発って、どうやっているんだろうか？
転売のための商品大量購入防止アプリとしてTenba×IyaというWebアプリを作りました。

転売のための商品大量購入防止アプリとしてTenba×IyaというWebアプリを作りました。
なぜアプリを作ったかについて、転売問題の背景などと共に、僕の考えを説明します。


アプリの説明ページ
https://tenba-iya.hatenablog.com/entry/about



アプリへのリンク
https://tenba-iya.herokuapp.com/





#転売問題の背景について



現状起こっていること



####①PS5や任天堂スイッチのゲームにおいて、転売目的の商品の買い占めが起こっており、買い占められた商品が、メルカリなどのサービスで高額転売されている。
そのせいで、消費者が適正な価格で商品を購入できない。
ゲーム制作会社としては、本体は売れるが、買い占めにより、広く商品が流通しないため、ソフトが売れにくい状況が発生している。



PS5の転売についてのリンク
https://www.itmedia.co.jp/news/articles/2101/26/news063.html



####②日本酒の獺祭が転売目的で買い占められ、本来の価格で購入しにくくなっている。
獺祭の製造会社も新聞に、転売商品を買わないように新聞で呼びかけているが、効果が薄い。



獺祭の記事についてリンク
https://www.tokyo-sports.co.jp/social/856267/



####③コンサートチケットが転売目的で購入され、高額で転売されている。
ファンは高くてもコンサートをみたいため、転売商品を購入してしまっている。
対策としては顔認証システムの導入などが進められてきているので、今後は改善されるかもしれない。



####④コロナ渦でマスクが買い占められ、一箱1万程度まで値上がりした。
必要な人が購入できなくなり、問題となった。



マスク買い占め記事のリンク
https://www.tokyo-np.co.jp/article/14221



#転売の問題点と対策



####①消費者が本来の価格で購入できなくなる
→転売の商品を買わないようにすればいいが、どうしても必要な場合や、お金に余裕がある人は買ってしまう。



####②消費者は本来より高い価格で買わなければならなくなり、不利益を被る。転売屋は利益を得る。メルカリなどのプラットフォーム側も手数料で利益を得る。商品の元の販売者は利益は増えず、商品が売れにくくなる可能性がある。また、広く商品を届けたいときに届けれない事態となる。
→メルカリなどのプラットフォームは利益があるため、抜本的な対策を強要することは困難。
商品の元の販売者も、転売されない価格まで値段をあげればよいが、消費者に適切な価格で商品を届けたい思い（特にコンサートのチケットなどはファンを大切にしたいらしい）などから、難しい。



####③一部の人に商品が買い占められてしまい、必要な人に商品が届かない。
→同じ商品を一部の人に売らないように対策できると良いが、小売店舗ごとに誰がどの商品を買ったかを把握することは難しい。



#以上の問題などについての解決策として、Webアプリを考えた。
特に上記の③の問題(一部の人に買い占められる問題)にフォーカスしてアプリのアイデアを考えた。
 


アプリのコンセプトなどもろもろについては以下のとおりです。



####①販売者、購入者共に手軽に使えるようにする。
レジの待ち時間や、アプリを使う手間が大きいと導入が難しいと思うので、なるべく簡単な方法とした。
具体的には、
●購入者が電話番号を記入して、SMSでチケットを発行する方法とした。
ユーザー登録やパスワードの記入などはなくした。
アプリの存在を購入者が知らなくても、店側が電話番号を聞けば、運用できるような方法とした。
また、余計な登録がないので、個人情報なども漏れにくいと思います。
電話番号は、入力時以外は全部は見れないようにしています。
例：012-1234-1234の場合、入力時以外は＊＊＊-＊＊＊＊-＊＊34と表示される。
●Webアプリとすることで、スマホのアプリなど専用の物をインストールしなくて良いようにした。



####②購入者が店舗を変えると、今までにいくつ商品を買ったかわからなくなるので、店舗が変わってもわかるような仕組みを考えてみた。
商品毎にチケットを発行して、電話番号毎のそれぞれの商品購入数が判れば、対策が取れると考えて、みた。
例えば電話番号123-1234-1234でA店舗でマスクを1つ買った場合、このアプリを使えば、一つ買ったと記録が残ります。
次にB店舗に移動した場合も、登録する電話番号が同じならば、2つめを買っていることがわかります。
電話番号を変えた場合は、どうしようも有りませんが、そんなに電話番号を変えられるとは思っていません。
また、チケットにはチケット発行日、チケット使用日、当日、当月、総計の購入数がかいてあるので、どの程度同じ商品を買っているかがわかります。
販売者側は以上の情報をみて、販売するかどうかをその場で決める、もしくは、予め決めておけばいいなと考えています。



####③アプリの構成上として、商品の販売者側（生産者や小売店舗）が購入者側にアプリを使ってくださいというような、構成とした。
したがって、世間一般にアプリを広めるというより、企業側にアプリの存在を認識してもらうようなアプローチを今後しないといけないと考えています。



####④そもそも購入者（特に転売目的の購入者）はアプリを使うメリットは全くないので、企業側が使うようにお願いしないといけない。
ただ、転売目的でない、購入者はこのアプリが広まることで転売が少なくなるのならば、広める意味があるのかもしれない？



####⑤そもそも、電話番号で登録すれば、重複した購入は制限できるのか？
僕は電話番号をたくさん持っている人はあまり知らないので、できると思っている。



####⑥アプリが広まってくれば、消費者側が予めチケットを用意して、レジでチケットあるよ。チケット使用済みにするよと、提示すれば、そこまで手間がかからずに運用できると思っています。
あくまで、このアプリが広まればですが。。。



####⑦一応ネット販売でも対応できるように、チケットIDを検索して、チケットを使えるような仕組みも用意しています。
使い方としては、購入者が電話番号でチケットを登録→チケットIDを販売者に連絡→販売者がチケットIDを検索してチケットを使用済みにする。です。
Attention関連。論文『Attention in Natural Language Processing』は、役立つかも。

#概要
Attentionに関して、調べていて、以下の論文に出会った。
<font color="orange">**役立つかもしれない**</font>:tada:ので、記事にする。

https://arxiv.org/abs/1902.02181

**Attention in Natural Language Processing**

Galassi, Andrea, Marco Lippi, and Paolo Torroni. "Attention in natural language processing." IEEE Transactions on Neural Networks and Learning Systems (<font color="orange">**2020**</font>).

# 論文の概要

論文( https://arxiv.org/abs/1902.02181 )より引用
>Attention is an increasingly popular mechanism used in a wide range of neural architectures. The mechanism itself has been realized in a variety of formats. However, because of the fast-paced advances in this domain, a systematic overview of attention is still missing. In this article, we deﬁne a uniﬁed model for attention architectures in natural language processing, with a focus on those designed to work with vector representations of the textual data. We propose a taxonomy of attention models according to four dimensions:therepresentation of the input, the compatibility function, the distribution function, and the multiplicity of the input and/or output. We present the examples of how prior information can be exploited in attention models and discuss ongoing research efforts and open challenges in the area, providing the ﬁrst extensive categorization of the vast body of literature in this exciting domain.

DeepL訳（ママ）
>注目は、様々なニューラルアーキテクチャで使用されるメカニズムとして、ますます普及しています。このメカニズム自体も様々な形式で実現されている。しかし、この分野では急速な進歩を遂げているため、注意についての体系的な概要はまだ明らかになっていない。この論文では、テキストデータのベクトル表現を扱うように設計されたものに焦点を当てて、自然言語処理における注意アーキテクチャのための統一モデルを定義する。本論文では、自然言語処理における注意アーキテクチャの統一モデルを提案する。事前情報がどのように注意モデルに利用されるかの例を示し、現在進行中の研究努力と未解決の課題について議論し、<font color="orange">**このエキサイティングな分野の膨大な文献を初めて広範に分類した。**</font>


# General Attention Model

「<font color="orange">**General Attention Model**</font>」というのが提案されていた。
(似てる、しかし、少し違うような、意味ある違いかなにかわからないような、そんなモデルが沢山あるので、このようなモデルの提示はGoodだと思う。）



（図は、論文より引用）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/eb6bf67e-afe5-4391-7f39-e29bad3aaae2.png)


# まとめ
特にありません。
コメントなどあれば、お願いします。:candy:

# 関連記事（本人）
この論文は、以下の記事の13番目の記事（※記事でなくて論文ですが、、）として、提示しています。

[自己注意Self-Attention の解説でわかりやすいと思った記事N選　(N＝13）](https://qiita.com/enoughspacefor/items/c9810d1065741a7f461c)
補数について


https://leetcode.com/problems/sum-of-two-integers/solution/ で登場したのでざっとまとめる。
いや、ただ箇条書きで垂れ流す。


## 常識


- 32bit整数において、「負の数である」 <=> 「1ビット目が1」
- 基数 = n進数のn
- 基数の補数(complement) = ある自然数を2進数（2進法）で表現した時に、足し合わせるとちょうど2のべき乗となる最小の数（一桁増えて先頭が1、残りが0となる数）
- 減基数の補数 = 基数の補数 - 1 = ギリギリ桁の上がらない最大の数 = 元の数のbit反転


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/4d264be9-54ac-295f-2462-f000ccce79e0.png)
(https://unskilled.site/%E3%80%90%EF%BC%91%E3%81%AE%E8%A3%9C%E6%95%B0%E3%81%A8%E3%81%8B%E3%80%91%E8%A3%9C%E6%95%B0%E3%82%92%E7%90%86%E8%A7%A3%E3%81%97%E3%81%9F%E3%81%84%E3%81%A7%E3%81%99%E3%80%90%EF%BC%92%E3%81%AE%E8%A3%9C/ より)


## 肝心なとこ

ある正の数xについて、-xは、xの基数の補数である

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/c907b868-434d-1ec9-a809-e3472fe4c1da.png)

つまり、負の数-xのbit配列を求めるには、「xの基数を求める」= 「xをbit反転し、最小位に1を加える」という方法で求める必要がある。

このような負の数のbit配列の決め方は、コンピュータが引き算を(簡単に?)実行できるようにするための工夫である。(具体的な方法は、See: https://unskilled.site/%E3%80%90%EF%BC%91%E3%81%AE%E8%A3%9C%E6%95%B0%E3%81%A8%E3%81%8B%E3%80%91%E8%A3%9C%E6%95%B0%E3%82%92%E7%90%86%E8%A7%A3%E3%81%97%E3%81%9F%E3%81%84%E3%81%A7%E3%81%99%E3%80%90%EF%BC%92%E3%81%AE%E8%A3%9C/)



## Ref

以下がわかりやすかった。


- https://unskilled.site/%E3%80%90%EF%BC%91%E3%81%AE%E8%A3%9C%E6%95%B0%E3%81%A8%E3%81%8B%E3%80%91%E8%A3%9C%E6%95%B0%E3%82%92%E7%90%86%E8%A7%A3%E3%81%97%E3%81%9F%E3%81%84%E3%81%A7%E3%81%99%E3%80%90%EF%BC%92%E3%81%AE%E8%A3%9C/
- https://www.youtube.com/watch?v=4ly0dPogeXY
IBM Cloud VPCの仮想サーバをIBM Cloud Satelliteのホストにするときの注意点

# 経緯

IBM Cloud SatelliteではSatelliteロケーションを作成した後にホストを追加しますが、IBM Cloud VPCの仮想サーバをホストとして使用する場合、いくつか設定前に注意が要ります。

注）通常はぜわざわざIBM Cloud VPCでSatelliteを使うことはないと思いますので、あくまでテスト目的で利用する場合を想定しています。

# 注意点

## インターネット接続

ホストはパブリックゲートウェイまたはフローティングIPでインターネット接続できる必要があります。

## yumリポジトリの有効化

VPCのRHEL7では必要なリポジトリがいくつか有効になっていないので事前に有効化する必要があります。公式ドキュメントにも記載されています。

> https://cloud.ibm.com/docs/satellite?topic=satellite-host-registration-script-fails

```
$ {
subscription-manager repos --enable rhel-server-rhscl-7-rpms
subscription-manager repos --enable rhel-7-server-optional-rpms
subscription-manager repos --enable rhel-7-server-rh-common-rpms
subscription-manager repos --enable rhel-7-server-supplementary-rpms
subscription-manager repos --enable rhel-7-server-extras-rpms
}
```

## /tmpのnoexec属性を除去

仮想サーバでは/tmpのマウントオプションでnoexecがついているため、ホスト追加中にダウンロードされたスクリプトの実行に失敗します。/tmpからnoexecを除去して再マウントする必要があります。

```
$ sed -i -e "s/,noexec//" /etc/fstab
$ mount -o remount /tmp
```
【就活用】面接での質問は一問一答形式の"点"で答えるのでなく、ストーリー性のある"線"で答える

#はじめに
私はプログラミング未経験から転職活動を行い、自社開発企業から内定をいただくことができました。
活動経歴等は以下URLよりご覧になれます。

https://qiita.com/narimiya/items/b59db099b923b0b88330

面接の質問を答える際に最も大切にしていたことが、**一貫性、ストーリー性のある回答**をするよう心掛けたことでした。

本記事では一貫した回答ができるようにするための心構えや方法について紹介したいと思います。

#そもそもなぜ一貫した線が必要か
質問に対しての回答が一問一答形式の点であれば散在しており、その人がどんな人か分からずに面接が終わってしまったり、嘘をついている人なのかという採用する上でマイナスな印象を与えてしまうからです。

**自身が面接官で採用する立場**であれば、面接する相手がどんな人かをまず知りたいと思うと思います。
しかし、相手が脈絡が見えにくい回答をしていると、採用する側としては採用したくてもできないです。

予め定めている採用マニュアルが存在したり、カルチャーマッチする人を採用する、もしくはこの人と働きたいと思える人を採用するといった**企業によって採用基準**が必ずあります。

その基準に合わせるためにもまず**自分がどんな人間かを面接官に知ってもらう必要**かあります。
そのため「面接での質問は一問一答形式の"点"で答えるのでなく、ストーリー性のある"線"で答える」必要性があります。

#心構え
嘘をつかないことと、どのように自分を魅せていくかを予め決めることが、質問に対しての一貫した回答ができるようにするための心構えとなります。

##嘘をつかないこと
嘘をついて話を盛ってしまうと、深掘りされるとどこかで軸がぶれてしまいます。
軸がぶれてしまうと疑問に思われますし、分からない相手だと採用するにも採用できません。

なので正直に話すことをお勧めします。

ただ嘘をつくことと魅せるのは異なります。
表現に創意工夫を行い自分を魅せて自己アピールをしていきましょう。

##魅せ方を予め設定すること
人と比べると自己憐憫の陥りやすくなりますが、他の方と差別化する点を魅せることは重要かと思います。

というのも、企業が内定を出すということは、面接にかけるコスト、時間、労力をかけてまでも、未来の投資となる人材を探しているわけですから、それに見合う魅力的な人材を求めていることかと思います。

私の場合は、
・Qiitaで毎日技術のアウトプットを行っていることとTwitterで技術的マインドについて、継続的に発信し積極的に色々な人からレビューをいただき、日々自己研鑽を行っている　等
を面接の中でアピールしていました。
→自走力や継続力などのアピールになるかと思います。

#一貫性を出す方法
最終面接官に自分をどう思わせたいかを仮定することが重要です。

私の場合、「この人なら仕事をませても遂行してくれるであろう、信頼できる人材」ということ思っていただくことを仮定しました。

嘘をついてはならないことの矛盾になるのではないかと考えられるかもしれませんが、これは魅せることがと思います。
なぜなら、自分は正直にいてあとは表現で仮定通り思わせるよう工夫するからです。

結果的に判断するのは面接官ですので、そう思ってくださる企業様を私は探していました。

さらに具体的な方法としては

##過去のことは実績で答える
数値で答えることには嘘も偽りもありません。

前職や大学での成果を実績ベースで答えて、その根拠として仮説検証のPDCA、ロジカルシンキングを魅せるようにしていました。

嘘偽りもなく、定量的に物事を考察できることをアピールもできますし、また優秀な人材であることをアピールできます。

（私は優秀ではありませんが、前職過去実績等は機密の観点から述べることはできないです。）


##一貫性を持たせるには過去の実績には自己分析、未来の展望には企業分析が必要
一貫した回答をしていくには散在した点を線にしていくことを自分でしていく必要があるので、分析が必要です。

過去から未来を一直線にする必要があり、そのために自己分析と企業分析が必要となります。

##誰からかレビューもらう
自身が考えたことは主観的ですので、可能であれば誰かに聞いてもらい、客観的な意見をもらいましょう。
友人やキャリアアドバイザー等に聞いてみましょう。

それ以外には面接で聞くこともありです。

面接で感触を確かめ、良さそうかどうかを分析します。

可能であれば企業から面接後や合否後にフィードバックをもらって確認しましょう、

#まとめ
面接で、ストーリー性、一貫性のある魅力的な回答するには、心構えと方法があります。
**心構え**
・嘘をつかないこと
・魅せ方を予め設定すること

**一貫性を出す方法**
面接官に自分をどう思わせたいかを仮定することが重要
・過去のことは実績で答える
・自己分析、企業分析をする
・レビューをもらう

以上です。
UnityとGitHubActionsを使って自動テストを行う

# はじめに

最終的に仕上がったものは以下のリポジトリで公開してあります。
分からないことがあったときは参考にしてください。

https://github.com/mackysoft/Unity-GitHubActions-AutomaticTest-Example

# 手順

以下、UnityとGitHub Actionsを使って自動テストを行う手順です。


## 1. プロジェクトを用意する

適当にテストが含まれるプロジェクトのリポジトリを用意します。


## 2. ULFファイルを入手する

UnityライセンスをアクティベートするためのULFファイルを入手します。

この手順に関しては別の記事として書かせてもらいました。（GUIのみで簡単にできます）

https://qiita.com/makihiro_dev/items/61f004e5481cef54b5a7


## 3. ULFファイルをSecretsに登録する

1. プロジェクトリポジトリの`Settings > Secrets`メニューを選択する。
2. `New repository secret`ボタンをクリックする。
3. Nameに`"UNITY_LICENSE"`と入力し、ValueにULFファイルの中身をコピペする。
4. `Add secret`ボタンをクリックする。

これでULFファイルの中身は非公開のまま、環境変数として扱うことができます。


## 4. テストを走らせるためのYAMLファイルを記述する

`.github/workflows/`フォルダ下（[例](https://github.com/mackysoft/Unity-GitHubActions-AutomaticTest/tree/main/.github/workflows)）に`Test.yaml`ファイル（名前は何でもいい）を作成し、そこにテストを走らせるための処理を記述します。

```yaml:Test.yaml
name: Test

on: [push, pull_request]

jobs:
  test:
    name: ${{ matrix.testMode }} on ${{ matrix.unityVersion }}
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        projectPath:
          - .
        unityVersion:
          - 2020.3.1f1 # Secretsに登録したULFのUnityバージョンを記入
        testMode:
          - playmode
          - editmode
    steps:
      # Checkout
      - uses: actions/checkout@v2
        with:
          lfs: true

      # Cache
      - uses: actions/cache@v2
        with:
          path: ${{ matrix.projectPath }}/Library
          key: Library-${{ matrix.projectPath }}
          restore-keys: |
            Library-

      # Test
      - uses: game-ci/unity-test-runner@v2
        id: tests
        env:
          UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
        with:
          projectPath: ${{ matrix.projectPath }}
          unityVersion: ${{ matrix.unityVersion }}
          testMode: ${{ matrix.testMode }}
          artifactsPath: ${{ matrix.testMode }}-artifacts
          checkName: ${{ matrix.testMode }} Test Results

      # Upload Artifact
      - uses: actions/upload-artifact@v2
        if: always()
        with:
          name: Test results for ${{ matrix.testMode }}
          path: ${{ steps.tests.outputs.artifactsPath }}
```


## 5. GitHub Actionsでテストを走らせる

上記の`Test.yaml`の場合だと、PushまたはPull RequestをするたびにGitHub Actionsでテストが実行されます。

以下の画像のように✔マークがついていれば成功です。
![TestResult.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605701/0f6c6ada-18f6-f8ee-ca0a-294512ec2b27.jpeg)


# さいごに

最終的に仕上がったリポジトリです。詰まったときは参考にしてみてください。

https://github.com/mackysoft/Unity-GitHubActions-AutomaticTest-Example

CIは初めてであまり詳しくないので、間違えているところがあれば教えてもらえると幸いです。


# 参考

- [【Unity】GitHub Actions v2でUnity Test Runnerを走らせて、結果をSlackに報告する【入門】](https://qiita.com/pCYSl5EDgo/items/690dd56ffb0fcf64e70b) 
- [GitHub Actions を使った Unity の自動テスト](https://qiita.com/kumaS-kumachan/items/d5d44b04b5631154d11a)
- [UnityとGithubActionsを使って自動テストをセットアップする手順の備忘録](https://qiita.com/kyourikey/items/df43b751b0ef7a681a42)
GitHubActionsでUnityライセンスのアクティベーションを行うためのULFファイルを入手するツールを作った【GUI操作のみ】

# はじめに

GitHubActionsでUnityTestRunnerを走らせる際に何度もUnityライセンスのアクティベーションを行う必要があったので、その作業を簡略化しました。


# 手順

UnityライセンスをアクティベートするためのALF及びULFファイルの入手の手順です。

## 1. ALFファイル生成用リポジトリをForkする

GitHubActionsを介してALFファイルの生成を行うため、以下のリポジトリをForkします。
ALFファイルを生成するためのワークフローが含まれます。

https://github.com/mackysoft/Unity-ManualActivation


## 2. `Acquire activation file with GUI`ページを開く

Forkして作成されたリポジトリのActionsタブから`Acquire activation file with GUI`ページを開きます。

![OpenGitHubActionPage](https://user-images.githubusercontent.com/13536348/114270217-255a5f80-9a46-11eb-9555-febf8f20ae4e.jpg)


## 3. ALFファイルを生成する

1. `Run workflow`ドロップダウンをクリックします
2. ALFファイルを取得したいUnityのバージョン（例：`2019.4.0f1`）を指定します。
3. `Run workflow`ボタンをクリックします。
3. ワークフローが完了するまで待ちます。

![RunWorkflow](https://user-images.githubusercontent.com/13536348/114270225-28555000-9a46-11eb-8589-9b225d819082.jpg)


## 4. ALFファイルを取得する

1. 完成したワークフローページのアーティファクトから`Unity_v20XX.X.XfX.alf`ファイルを取得します。
2. 取得したzipファイルを解凍します。

![AcquireALF](https://user-images.githubusercontent.com/13536348/114270233-2db29a80-9a46-11eb-86d5-9d2ba52056d1.jpg)


## 5. ULFファイルを取得する

1. Unityの手動アクティベーションページを開きます。（https://license.unity3d.com/manual）
2. 取得した`Unity_v20XX.X.XfX.alf`ファイルを使用してアクティベーションします。
3. `Download license file`ボタンをクリックしてULFファイルをダウンロードします。

---

以上の手順でULFファイルを取得できます。
もしうまくいかなかった場合は、以下のドキュメントを参考にしてみてください。

https://game.ci/docs/github/activation
Ubuntuでタッチパッドの2本指スクロールができない

## はじめに
UbuntuをPCにインストールした後すぐに2本指でのスクロールが行えなかった．これができないといろいろ不便だったので，設定を開いて「マウスとタッチパッド」のところから，2本指スクロールを有効化させようとしたが，そもそもその選択画面がなかった．いろいろ試行錯誤を行った結果，問題の解決はできたので，それについて書いてみようと思う．

自分がうまく行った解決方法は記事にするほどの内容ではなかったので，そのときに自分が試したネット上に転がっていた解決法とあわせて紹介する．自分の場合でうまく行った方法は最後に記す．

### 解決法1
ターミナル上で以下を実行する．

```
sudo modprobe -r psmouse
sudo modprobe psmouse
```

### 解決法2
/etc/default/grubの名前のファイルを開き，

```
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
```
となっている部分を

```
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash psmouse.synaptics_intertouch=0"
```
に変更し，ターミナル上で

```
sudo update-grub
```

と実行後，再起動する．


### 解決法3
/etc/modprobe.d/blacklist.confの

```
blacklist i2c_i801
```
と書いてある行をコメントアウトするか，削除する．もしくは

```
sudo modprobe -r i2c-i801
sudo modprobe i2c-i801
```
とターミナル上で実行しても同じことができるらしい．

### 解決法4
自分の場合はこれで解決した．

**ソフトウェアのアップデートをインストールする**

単純にタッチパッドを扱う上で必要なソフトウェアがインストールされていなかったっぽい．あほらしい．


## おわりに
結局パソコンのトラブルの解決するには再起動とかソフトウェアの更新とか単純なことが一番ってことなんですかね．
文系・AWS実務未経験がクラウドプラクティショナーを取得するまで

#・AWSクラウドプラクティショナーの資格とは？
100種類以上に及ぶAWSクラウドサービスの全般的な理解を証明する資格で、
専門知識認定を受けるための前提条件となる資格です。

ベストな学習方法や学習期間は個人で異なりますが、書籍を読む、模擬問題を繰り返し解いて知識を定着させていくのがベターです。

学習と試験を通じて感じたのは、AWSのサービスはかゆい所に手が届くサービス群である事です。オンプレミスから移行の検討や、扱うデータの種類に適した複数のデータベースの提供もしているので、個人法人を問わずニーズを満たせる筈です。

**※一例**
**・使用量は従量制なので、固定費を削減できるかも**
**・データベースは正確な処理向きや、大量のデータを処理するのに適したものもある**
**・障害を想定した設計なので、セキュリティや耐久性が強く、復旧までの時間も早い**

#・資格取得にあたり真っ先に行うべき事
**学習開始前に試験日程を必ず予約しておきましょう！**

英語が得意、平日でも受講できる方は問題ないですが、
**土日試験を希望、日本語に対応している試験官を希望する**場合、試験枠が少なく早く埋まってしまいます。知識がなくて不安だからと申し込みを先延ばしにすると、試験枠が空いてなくて試験が暫くお預けとなりかねません。**((((；ﾟДﾟ)))))))⇦実際にそうなった**

#・試験申し込み
AWS試験申し込みは下記サイトから可能です。
アカウントを作成し、申し込みましょう。

https://aws.amazon.com/certification/

**詳細な参考記事は下記が分かり易いです。**
[AWS認定資格試験の申し込み～受験の方法を徹底解説【2020年版】](https://hackers-high.com/aws/how-to-take-aws-certification-exam/#AWS)

オンライン受験できる試験の実施会社を２社から選択しますが、PSI社とピアソン社では**ピアソン社のUIが直感的で見やすい**ので、そちらがオススメです。

#・受験前の知識レベル
・EC2インスタンス （仮想サーバーを作るぞ）
・S3 （写真とか保存するストレージだよ）
・Route53 (独自ドメインを登録できるぞ)
**AWSには１００種類以上のサービスが存在する中で、学習前の知識はこのレベルでした。((((；ﾟДﾟ)))))****

#・学習期間
・約２週間
**AWSを使用した業務経験６ヶ月ほどが推奨されていますが、なくても受かります。**
実際に学習期間３日で受かった、１週間で受かった事例は聞きます。
学習前の知識や経験は個人差があるので、学習期間の差は誤差と感じます。
**それよりも先に試験日を先に確定させる事が重要です((((；ﾟДﾟ)))))))**
**さもないと学習期間だけが増えてしまうぞ？**


#・受講費用
¥12,100（税込）
**※クレジットカードが必要です。**

#・学習に使用したもの
①[AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2DUFZQF6EU1JS&dchild=1&keywords=aws+%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC&qid=1618069348&sprefix=AWS%2Caps%2C267&sr=8-1)
AWSの細かい情報が載っていますが、触りだけ載っている部分もあるので、この本だけで受かるのは個人的には難しいと感じました。また、3年ほど前に出版されているので現在のAWSでサービス名が異なっているものもあるので、注意が必要です。

![IMG_955B255C9A6C-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638561/f22d204e-0ce6-3257-5942-24f02c94a739.jpeg)

**[②udemy この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集](https://www.udemy.com/course/aws-4260/)**
動画教材でなく選択式の問題集です。AWSが公認しており、現在も更新が続いているので、私はひたすら模擬問題を解き続けました。udemyのセール通知をオンにしておいて、セール時に購入できるとコスパが良いです。

あとは問題の中で見知らぬ単語がわんさか出てくるので、それを都度ググります。
それで段々出てくる単語の意味が結びついていくので、イメージが湧きやすくなってきます。
そうなってくれば知識としての定着率も上がってきます。

![udemy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638561/529ea80f-6212-75cd-65ed-ebf5bd24d2c3.png)


#試験が終わると？
試験の合否は終わった時点で発表されますが、スコアレポートで実際の点数や分野別のに強弱を確認できるようになったのは約1日後でした。合格ラインは７割なので、結果を確認して復習するのも良いでしょう。

また合格すると複数の特典の申請が可能になります。
**・次に受ける試験の割引**
**・AWSが認定するグローバルLinkedInコミュニティに参加できる**
他にも複数の特典があります。

#資格の価値は？

IT業界のエンジニア職種において、
**「資格だけを持っていても意味はない」**
**「資格は実際の業務での再現性が低いから評価されない」**
という声は聞きます。

が、学びたいと思って学習するなら無意味ではないと考えます。
知識がある証明になるので、理想の案件に参画するキッカケにして実務経験を積んだり、より上位の資格を取得するかは個人の自由と思います。
AWSでWebアプリをデプロイする方法(Java)⑧

#Javaのインストール
JavaをインストールすることでJavaを動かせる環境を整えます

###利用環境
OS:MacOS
ブラウザ:Chrome

###前提条件
Apacheがインストールできている状態
まだ、Apacheがインストールできていない方は[こちら]
(https://qiita.com/kunrenyouAcount/items/d10fb9a73e911d7f4937)

##Javaをインストールする

###接続する
下記のsshコマンドを入力して接続します
※キーペアのファイルのパスと、ec2-user@以降は、変更して使用してください

```
ssh -i "/Users/koyamatakumi/Documents/Development/practice/aws/myserverkey.pem" ec2-user@13.115.141.44
```

###接続確認
下記のように表示されていれば、接続完了です
![スクリーンショット 2021-04-07 0.34.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1066052/f1c21fd0-8be0-ab0e-ebdf-c9592fa0a8d7.png)

##SSHでの操作とrootユーザーへの切り替え
###rootユーザーのサインイン
ソフトウェアのインストールはrootユーザーで行います
下記コマンドを入力し、rootユーザーへサインインします

```
sudo -i
```

![スクリーンショット 2021-04-07 0.37.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1066052/f9b00b1e-975d-f282-6cbe-6088f256bf3e.png)

###ダウンロード

```
wget https://d3pxv6yz143wms.cloudfront.net/11.0.2.9.3/java-11-amazon-corretto-devel-11.0.2.9-3.x86_64.rpm
```

下記の画面になればダウンロード完了


###インストール
```
sudo yum localinstall java-11-amazon-corretto-devel-11.0.2.9-3.x86_64.rpm
```

###確認

```
java -version
```

下記の画面になれば成功


#AWSでWebアプリをデプロイする方法⑨
[Tomcatのインストール](https://qiita.com/kunrenyouAcount/items/3b17275e9b1f9de8d990)
「skl_hd_dsp_generic skl_hda_dsp_generic: ASoC: failed to init link iDisp1: -517」の解決法

## 症状
新調したノートPCにUbuntu 20.04.2をインストールした後の再起動後．一向にログイン画面に到達する気配がなかった．よく見ると起動時の黒い画面上に

```
[64.714001] skl_hd_dsp_generic skl_hda_dsp_generic: ASoC: failed to init link iDisp1: -517
```
みたいな感じのメッセージが最後に出力されたきり，その画面でずっと処理が止まっている様子だった．

## 解決法
調べてみたところ，どうやらNVidiaやAMDグラフィックカードを搭載しているPCで，グラフィックカードのドライバがない状態で起こる症状らしい．多分，OSのインストール時にネットワークに接続してなかったから，そのときにインストールしてくれなかったのかな？

解決法としてはまず，デュアルブートのOSの選択画面で「e」を押し，なにかしらの編集画面に行く．そこで，出てくる記述の

```
hoge~ quiet splash $vt_handoff
```
となっている部分を

```
hoge~ nomodeset $vt_handoff
```
に書き換える．書き換えたら指示に従いCtrl+xを押し，再起動するとログイン画面にたどり着けるようになる．あとはログインしてドライバをインストールすれば次回からは普通に起動できるようになる．ドライバのインストールはソフトウェアのアップデートとかをしていれば，インストールされると思う．

## あとがき
調べてもあまり出てこなかったということは，この症状に出くわす人がそもそも少ない可能性はある．実はこれ以外にもタッチパッドの2本指操作が認識されないみたいな問題もあったが，ソフトウェアのインストールを行ったらちゃんとできるようになったので，ちゃんとインストールしよう．

デュアルブート時のAdvanced Modeのから選択できるrecovery modeからも入れたので，それでもいいかも．

## 参考資料
https://askubuntu.com/questions/162075/my-computer-boots-to-a-black-screen-what-options-do-i-have-to-fix-it
オープンソースなスマートウォッチの現在の動向(2021/4)

# はじめに
オープンソースなスマートウォッチに興味がありましたが、3つほどメジャーなプロジェクトがあり混乱したため、特徴をまとめました。
# 各種スマートウォッチ
メジャーなものに触れていきます。

1. PineTime
1. Watchy
1. Open-SmartWatch
    1. 2021/4現在、仕様が現在進行形で変化しているので、最新のディスカッションを知りたい場合は[Discordサーバー](https://discord.gg/9DK5JY6)に参加することをお勧めします。

# 比較
まとめるのに数時間はかかりました。STORAGEに関しては必ずしも正確でないかもしれません。

||[PineTime]|[Watchy]|[Open-SmartWatch(Light ver.)]|
|-|-|-|-|
|SoC|nRF52832|[ESP32-PICO-D4]|[TTGO Micro-32]|
|CPU|[ARM Cortex-M4]|[Tensilica Xtensa LX6]|[Tensilica Xtensa LX6]|
|MIPS[^1]|48.66|70.62|70.62|
|OS|0.5MB|448KB|448KB|
|STORAGE|512KB(FLASH)+4MB(FLASH)+64KB(DRAM)|4MB(FLASH)+520KB(SRAM)|4MB(FLASH)+8MB(PSRAM)|
|液晶|[ST7789]|[GDEH0154D67]|[GC9A01]|
|形状|四角形|四角形|円形|
|サイズ|1.3"|1.54″|1.28"|
|表示形式|IPS|e-paper|TFT|
|解像度|240x240|200x200|240x240|
|ビット|18|1|18|
|色|RGB|白黒|RGB|
|タッチスクリーン|容量式|なし|なし|
|バッテリー|180mAh|200mAh|450mAh|
|ボタン数|1|4|4|
|加速度計|BMA421|BMA423|BMA400|
|バイブレーション|あり|あり|なし(協議中)|
|重さ|38g|13g|?|
|サイズ|37.5x40x11mm|46.0x35.5x9.5mm|?|
|端子|2-pin USB|Micro USB|Micro USB|
|値段(JPY)|2760[^2]|6460[^3]|4050[^4]|
|ライセンス|?|MIT|GPL 3.0|

[PineTime]: https://www.pine64.org/pinetime/
[Watchy]: https://www.electronics-lab.com/watchy-the-open-source-e-paper-watch/
[Open-SmartWatch(Light ver.)]: https://open-smartwatch.github.io/
[TTGO Micro-32]: https://github.com/LilyGO/TTGO-Micro32-V2.0
[ESP32-PICO-D4]: https://www.espressif.com/sites/default/files/documentation/esp32-pico-d4_datasheet_en.pdf
[ARM Cortex-M4]: https://developer.arm.com/-/media/Arm%20Developer%20Community/PDF/Processor%20Datasheets/Arm%20Cortex-M4%20Processor%20Datasheet.pdf?revision=904a9fc1-9c66-4816-80bf-ff8c76420e5a&la=en&hash=854DC03108CBAE964E37A15A715418F1AB04E293
[Tensilica Xtensa LX6]:https://www.espressif.com/sites/default/files/documentation/esp32-pico-d4_datasheet_en.pdf
[ST7789]: https://www.buydisplay.com/download/ic/ST7789.pdf
[GDEH0154D67]: https://www.e-paper-display.com/products_detail/productId=455.html
[GC9A01]: https://www.buydisplay.com/download/ic/GC9A01A.pdf

[^1]: https://qiita.com/infinite1oop/items/4b658d9eded09c360b6b
[^2]: https://pine64.com/product/pinetime-dev-kit/?v=0446c16e2e66
[^3]: https://www.crowdsupply.com/sqfmi/watchy
[^4]: https://www.makerfabs.com/open-smartwatch.html
～ 優先度付きキュー ～ チートシート

#目次
**まずは使用するライブラリをインポート** `import heapq`

[リストを優先度付きキューに変換](#リストを優先度付きキューに変換)　`heapq.heapify(mat)`
[優先度付きキューから最小値を取り出す](#優先度付きキューから最小値を取り出す)　`heapq.heappop(mat)`
[要素を優先度付きキューに追加](#要素を優先度付きキューに追加)　`heapq.heappush(mat, num)`

[最大値を扱う場合](#最大値を扱う場合)

#はじめに

チートシートの扱いついては[ここ](https://qiita.com/ysys_Ba/items/d27282b888abbd1f43e7#%E3%83%81%E3%83%BC%E3%83%88%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)を読んでください

#リストを優先度付きキューに変換

```python:queue.py
import heapq

mat = [1, 1, 4, 5, 1, 4]

heapq.heapify(mat)
print(mat)
```

```python:mat
>>> [1, 1, 4, 5, 1, 4]
```

優先度付きキュー（二分木）はソートされた配列とは異なるが、最も優先度の高い要素（配列の1つ目の要素）が配列内で最小となる
配列の最小値を頻繁に求める場合、ソートよりも計算量を落とすことが可能
リストを優先度付きキューに変換するには、最初に `heapq.heapify()` する

#優先度付きキューから最小値を取り出す

```python:queue.py
import heapq

mat = [1, 2, 3, 4, 5]

print(heapq.heappop(mat))
print(mat)
```

```python:mat
>>> 1
>>> [2, 4, 3, 5]
```

`heapq.heappop()` は配列の最小値を取り除き、その値を返す
最小値を取り除きたくない場合は `mat[0]`

#要素を優先度付きキューに追加

```python:queue.py
import heapq

mat = [1, 2, 3, 4, 5]

heapq.heappush(mat, 0)
print(mat)
```

```python:mat
>>> [0, 2, 1, 4, 5, 3]
```

`heapq.heappush()` で配列に要素を追加できる
追加した値が配列内で最小値だった場合には１番最初の要素になる

#最大値を扱う場合

要素の**符号を反転**させて配列に格納し、取り出したら符号を元に戻す
NAS(TS-453D)を購入した。

QNAPのNAS(TS-453D)を購入したので、セットアップの記録。

# NAS導入の目的

* 冗長性のあるファイルサーバ
* レコーダーで録画した番組の退避先
  * 兼 メディアサーバ
* 運用サーバのホスティング

あと、いろいろ~~遊ぶ~~ 使いこむ予定


# NASの選定

**結論： [TS-453D](https://www.qnap.com/ja-jp/product/ts-453d) に決めた。**

目的を満たすだけならもっとお安いNASでも十分だけど、仮想マシンが運用できるという特徴に魅かれた。


## TS-453Dの魅力

* 4ベイ ⇒ RAID6が可能
* PCIe拡張 ⇒ M.2 SSD を接続すればSSDキャッシュが可能
* Intel入ってる (Celeron) ⇒ 仮想化マシン、コンテナレベルの仮想化が可能
* メモリは最大8Gまで拡張可能 ⇒ 仮想化環境でできることが増えそう
  * 噂では8G×2で16Gもいけたとか・・・
* 2つの2.5GbEポート ⇒ VLANレスで2つのセグメントに接続可能
* HDMI出力 ⇒ TV直結で動画再生が可能 (録画番組は見れない？らしい)
* 拡張エンクロージャ ⇒ ベイ数を増強可能
  * でもお高い・・・
* DTCP-IP対応 ⇒ レコーダで録画した番組を退避可能
  * ただし追加ライセンス(1,000円)が必要っぽい


# セットアップ

別記事で書く予定。

1. 管理画面にブラウザからアクセスできるようにする　(準備中)
1. ネットワークを設定する　(準備中)
1. 診断する　(準備中)
1. ファイルサーバを設定する　(準備中)
1. 録画番組を退避できるように設定する　(準備中)
1. メディアサーバを設定する　(準備中)
[備忘録]APIのレスポンスなどの非同期処理が早過ぎる場合でも、ローディングを1秒間は表示する方法

# APIレスポンスが早すぎてローディングが一瞬しか出ない問題
APIのレスポンスに限らず、Promiseの処理が一瞬で終わってしまい、ローディングがほとんど表示されないため、正常に処理が終了したのかわかりにくい場合があると思う。
その際に、いい感じに書く方法をメモっておく。


# ReactNativeのRefreshControlの例
重要なのは、```const promise = refreshFunc()```と```setTimeout```の部分。
ここで、refreshFunc()は非同期処理である。
非同期処理のPromiseオブジェクトを変数に入れておくことで、非同期処理の実行は先に行うが、
どんなに早く非同期処理が終了しても、setTimeoutの時間が経過した後でしか結果をチェックしないようにする。

```jsx
export const ScrollViewWithRefresh = ({refreshFunc, children, ...props}) => {
  const [isRefreshing, setIsRefreshing] = useState(false)

  return (
    <ScrollView
      refreshControl={
        <RefreshControl
          refreshing={isRefreshing}
          colors={[primary]}
          tintColor={primary}
          onRefresh={async () => {
            setIsRefreshing(true)
            const promise = refreshFunc()
            setTimeout(() => {
              promise.then(() => setIsRefreshing(false))
            }, 1000) // 最短でも1秒間はローディングを表示する
          }}
        />
      }
      {...props}
    >
      {children}
    </ScrollView>
  )
}
```

ググる力がなさすぎて、いい方法が見つからなかったので、どうにか自分で書いてみた。
もっといい方法があれば教えて下さい。。。
Laravel API備忘録クエリ編(その③ リレーションシップ)

#One to One
AddressテーブルとUserテーブルにOne to Oneのリレーションを作る

```php:AddressModel
    public function user(){
        return $this->belongsTo("App\User","user_id","id");
//2つ目と3つ目の引数は省略可
    }
```
2つ目と3つ目は入れなくても、Laravelの規約上、
``WHERE addresses.user_id = users.id``みたいなWHERE句を
作ってくれるようだ。
でもってUserモデルにも追加。

```php:UserModel
    public function address(){
        return $this->hasOne("App\Address","user_id","id");
//
    }
```
こっちは``hasOne()``を使い、第二引数は``user_id``にする。
でもってマイグレーションにも追加。

```php
$table->unsignedBigInteger("user_id");
$table->foreign("user_id")->references("id")
      ->on("users")->onDelete("cascade");
//どれが外部キーか、その外部キーはどのカラムを参照するか、
//どのテーブルを参照するか、デリート時にどうなるかを記述
```
ちなみにone to oneリレーションのseedingにはちょっとしたコツが要る。

```php:userSeeder
        factory(App\User::class, 3)->create()
        ->each(function($user){
            $user->address()
            ->save(factory(App\Address::class)->make());
        });
```
こうすればUserとAddressの関係がone to oneのシーディングを
行ってくれる。
VS Codeで一行を最速でコメントアウトする方法

Visual Studio Codeをコメントアウトする際に便利なショートカットキーを忘れないようにまとめます。

#htmlのコメントアウト
htmlでコメントアウトするときは`<!-- -->`でコードを挟めばいいのですが、コードの先頭と末尾に移動して入力するのは面倒ですよね。これをサクッとすぐできないのかなと思い調べてみました。

#VSCodeのコメントアウト
VScodeで1行をコメントアウトのショートカットは、
Windowsでは`Crtl + /`、Macでは`Command + /`です。
カーソルがコードのどこにいてもコメントアウトできるので便利ですね。
『Linuxのしくみ』の4章のグラフを自分でつくる（Python、matplotlib）


[［試して理解］Linuxのしくみ](https://gihyo.jp/book/2018/978-4-7741-9607-7)の第4章プロセススケジューラで、以下のようなグラフが出てくる。
![time_and_process.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115524/f5a171ec-52f5-9597-47cb-a93c00eb9f5f.png)
![time_and_progress.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115524/407043a3-6748-c7f4-1169-dbbbc2006c3d.png)


データを採取するスクリプトは本に載っているが、グラフの作り方は載っていない。はじめはスプレッドシートで作ろうと思ったがなかなかうまく行かず、Pythonで作成したほうが楽だったので、その方法を紹介する。

```python
import matplotlib.pyplot as plt


def create_time_and_process_graph():
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)

    with open("./data.txt") as f:
        for line in f:
            line = line.rstrip()
            p1, p2, p3 = map(int, line.split())
            # print(p1, p2, p3)
            ax.scatter(p2, p1, c=p3)

    fig.savefig('./time_and_process')


def create_time_and_progress_graph():
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)

    with open("./data.txt") as f:
        for line in f:
            line = line.rstrip()
            p1, p2, p3 = map(int, line.split())
            # print(p1, p2, p3)
            ax.scatter(p2, p3, c=['red', 'blue', 'yellow', 'green'][p1])

    fig.savefig('./time_and_progress')


if __name__ == '__main__':
    create_time_and_process_graph()
    create_time_and_progress_graph()

```

このスクリプトを実行すると、time_and_process.pngとtime_and_progress.pngという画像ファイルが作成される。

おしまい。
SQL によるデータ操作

SQLのデータ操作を学習したので、忘れないように自分用の備忘録。

●データの追加
  INSERT INTO テーブル名(カラム名1 , カラム名2) VALUES(データ1 , データ2);
　　``INSERT処理
　　　　INSERT INTO User(name , age)VALUES("John" , 19);
```

●データの更新
UPDATE テーブル名 SET カラム名1 = データ1 , カラム名2 = データ2 WHERE [条件];
  　　``UPDATE処理
　　　　UPDATE User SET name = "Bob",age = 41 WHERE id = 6;
```
※条件を指定しなければ、全てのレコードが更新されてしまう。


●データの削除
DELETE FROM テーブル名 where [条件];
　　``DELETE処理
　　　　DELETE FROM User where id = 2;
``
※条件を指定しなければ、全てのレコードが削除されてしまう。
検索ワードの人気からみる C# と VB.net 

C#とVB.netといえば同じ.NET(Framework)で動き、相互変換できるので
兄弟のような言語です。

ビルドすると、どちらもDLLという実行ファイルになったり
プロジェクトの中にC#とVB.netが混在できたりと
非常に密接な関係になってます。

VB.netは独特な機能や文法ゆえに、C#と比べると大変不評ですが、、

#Googleトレンドで比較#

##Googleトレンドとは##
Googleトレンド　って何や？　という人向けに簡単に説明すると

Google先生でどのくらい検索されているかが見れる、Googleが提供しているサービスです。

期間とか地域とかで色々見れちゃいます！

##過去1年を比較##
###全世界###
青がC#、赤がvb.net
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100934/77b4248e-fd63-ced4-5ac1-ac2448652242.png)
**平均：C# = 87, VB.net = 6**

あ、あれ( ;ﾟдﾟ)　こんなに差があるのか、、
平均値で見ると、C#はVB.netの14.5倍の人気という結果に

これは全世界なので、日本だけにしてみます。

###日本###
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100934/4e47f781-64c2-1283-6532-ee24ae74b087.png)
**平均：C# = 78, VB.net = 9**

全世界よりも少しだけグラフが近づいて、平均でC#が8.6倍となりましたね
世界よりも日本はVB.netの人気があるのかもしれません

お隣の最大人口を誇る国家も見てみます。

###中国###
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100934/63946ee4-5907-34e3-3036-e33d06a07abe.png)
**平均：C# = 59, VB.net = 1**

中国でVB.netはほぼ使われてないみたいです 笑

###アメリカ###
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100934/11bbeeb5-f32b-6561-0927-9e447b662b9b.png)
**平均：C# = 83, VB.net = 5**

アメリカさんは世界のトレンドとほぼ変わらないようですね。
さすがはアメリカです。

##過去17年を比較##
過去1年だと正直良く分からん！　ということで
一番古いデータの2004年から現在までを見てみます。
###全世界###
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100934/63b6eabd-d18c-d28e-cce1-9acc3f82e542.png)
**平均：C# = 62, VB.net = 14**

正直17年間の平均とかあまり意味がない気がしますが
上で書いた手前一応書いてます。

どちらも人気が下降していて、2004~2005付近が一番人気が高かったようです。

2004~2005と現在を比べてみると
C#は 1/3
VB.netは 1/15

程下がっていて、VB.netの下降具合は顕著でした。

###日本###
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100934/e25499cc-fd72-e908-d573-761ed9a4db7f.png)
**平均：C# = 55, VB.net = 11**

先程の全世界比較すると、日本では下降し始めるのが遅いですね。

C#は2006~2009、VB.netは2005~2009付近が高かったようです。

高かった時期と現在だと
C#は 1/3近く
VB.netは 1/6 ~ 1/7 

程度は下がっていますね。

やはり、日本はC#とVB.netの差が世界よりは少ないです。

#感想#
予想通りというか当然というか
圧倒的C#が人気でしたね。

VB.netとC#両方書いている身としては、C#の方が読みやすくて使いやすいので
C#を推していきたいです。
IntelephenseでPHAR版のPHPUnitのコード補完を効かせる

私はPHPUnitを依存関係に組み込むのが嫌なので、PHPUnitのインストールはComposerを使わずにPHIVEを使ってPHARをダウンロードすることで行っています。

PHIVEの基本的なことについては下記の記事を読むとわかると思います。

https://qiita.com/okonomi/items/0ea4594c95e3cd79e616

## PHAR版のPHPUnitの困ること
PHAR版のPHPUnitを使うと依存関係を汚さなくて済むのですが、困ることもあります。
それはテストコードを書く際にIntelephenseで`assertEquals`等のメソッドがエラーになったり、コード補完が効かなかったりすることです。
これらはIntelephenseがPHARファイルを読み込んでくれないことに起因します。

`assertEquals`メソッドが存在しないというエラーが出ます。
![スクリーンショット 2021-04-11 000255.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9588/ac8b4878-aff5-8abc-d8ee-8cc308fa43d3.png)

コード補完も効きません。
![スクリーンショット 2021-04-11 000818.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9588/0bfb50c0-caf0-e8df-fa06-77f2b8951335.png)

## 解決方法
解決方法は至極単純で、PHARを展開して中に含まれるPHPファイルを取り出すことです。
PHARを展開してプロジェクトディレクトリ配下のどこかに置けば、それをIntelephenseが読み込んでくれるようになり、エラーが消えてコード補完も効くようになります。

下記のようなコードを書いて実行すればPHARを展開できます。

```php
<?php

$phar = new Phar('.phive/phars/phpunit-9.5.4.phar');
$phar->extractTo('tools-src');
```

上記のコードではPHPUnitのPHARを`tools-src`ディレクトリに展開しています。

展開後にテストコードを開くと`assertEquals`メソッドのエラーが消えました。
![スクリーンショット 2021-04-11 000524.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9588/174c01ef-4f3d-dbd3-5e10-d13ee19e1add.png)
コード補完も効くようになりました。
![スクリーンショット 2021-04-11 000737.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9588/aad31feb-da2f-69e9-4e6a-ce2b12b22b96.png)

## おまけ
PHARを展開するためのコマンドを作って公開しています。

https://github.com/ngmy/phar-extractor

特定のPHARを展開するだけでなく、ディレクトリに含まれるPHARを一括で展開したり、PHIVEの`phars.xml`に記載されているPHARを一括で展開したりできます。
【Linux】trコマンド使ってみた【trコマンド】

#初めに
実務で使ったコマンドの使い方を備忘録的にまとめます。
基本的な使い方は色んな方が書かれているので簡単に、
使っていて気付いた部分を重視して記述します。
実際の動きを見た推測等を含むため、仕様的に間違いがありましたら教えていただけると幸いです。

#trコマンドとは
文字を置換したり、削除したりできるコマンドです。

#置換してみる
```
$ echo lion | tr lion bear
bear
```
echoコマンドで出力される「lion」が「bear」に置換されています。
trコマンドの特徴は、文字自体を指定しているという点です。
文字自体を置き換えているので、今回の場合では、
l　i　o　n
↓　↓　↓　↓
b　e　a　r
というように文字一つ一つが置き換わっています。
ですので、重複している文字があると期待した結果が得られないかもしれません。

```
$ echo deer | tr deer lion
loon
```
出力結果を見て分かる通り、「lion」に置換されていません。
今回の場合ですと、
「d」を「l」に
「e」を「i」に
「e」を「o」に
「r」を「n」に
という順番で認識され、途中で「e」の置換内容が書き換わってしまってしまうためこのような結果になります。
このことから、どの文字を何に変換するか先に全部決めてから、置換が走るようなプロセスになっていると思われます。
d　e　e　r
↓　↓　↓　↓
l　o　o　n

#削除してみる
文字を削除する場合はオプションの「-d」を指定します。

```
$ echo l-i-o-n | tr -d '-'
lion
```
しっかり「-」が削除されています。

削除する文字を複数指定することもできます。

```
$ echo l-i-o-n | tr -d 'oi-'
ln
```

#ここが書きたかった！！
コマンドの備忘録ということで基本的な動きの確認は必要でしたが、本当に書きたかったのはここからです。
実はこの記事は以前に書いたprintfコマンドの続きです。
[【Linux】ハイフンをいっぱい出したかっただけなのに【printfコマンド】](https://qiita.com/nagisa_O/items/78ddc0f03e6c5005197f)

一時期ハイフンを量産したり消したりを執拗に迫られていてその時に気付いたのですが、
先述したtrコマンドで文字を複数消す場合に、例えばこんな感じ

```
$ echo l-i-o-n | tr -d "-oi"
tr: invalid option -- 'o'
```
ハイフンを一番前にしてしまうと、「""」で囲んでもオプションとして認識されエラーになってしまいます。
他の文字とともにハイフンを扱う場合は、指定文字の最後にハイフンをつけるのがお作法なのでしょうか。

printfコマンドの記事でも記述しましたが、ハイフンをエスケープしてあげることでエラーを回避することができます。

```
$ echo l-i-o-n | tr -d -- "-oi"
ln
```
エラーも出ず、一安心ですね。

ハイフンを真ん中に入れてみると。。。？

```
$ echo l-i-o-n | tr -d -- "o-i"
tr: range-endpoints of 'o-i' are in reverse collating sequence order
```
怒られてしまいました。そんなレンジはないとのことです。

どういうことかというと、trコマンドは範囲でも文字の指定をできます。
つまりこの場合、アルファベットの範囲を指定したことになりますが、「o」は「i」より順番が後ろですのでこのような範囲指定はできないようです。
同様に、数字の範囲を指定する場合も「0-9」ではなく、「9-0」と指定するとエラーが出ます。

では正しい使い方で指定すると

```
$ echo l-i-o-n | tr -d -- "i-o"
---
```
「l」も「n」も「i-o」の間にあるので、しっかりアルファベットの範囲で「i-o」の文字が削除されているのが確認できます。

ここで注意してもらいたいのが、ハイフンをエスケープしても範囲指定のハイフンが優先されていることです。
先頭に付けるとエスケープしなければオプションと間違えられ、
真ん中に付けると範囲指定として認識される。
やはり他の文字とハイフンを併用する場合は、ハイフンは最後に付けるのがお作法としてよさそうです。

#まとめ
trコマンドを色々動かしてみました。
ただ動きを確認するだけだったのに、たまたまハイフンを使ったせいで大変な目にあいました。
M1 macにwindows10(ARM)をインストール

M1 Macを買いましたがあまり触っておらず以下の記事が出たのをみて
windows10をインストールしてみようと試してみました
https://ascii.jp/elem/000/004/050/4050689/

# Parallelsのインストール
https://b2b.parallels.com/apple-silicon/

アカウントが無い場合は登録してください。
インストーラーダウンロード後に必要なファイルをダウンロードしてインストールしますが
基本的にはぽちぽちするだけ

# windows10 ARM のインストール
https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewARM64

こちらもアカウントのない場合は登録してください
vhdxファイル。約9.1GBあります。

# windows１０のインストール
parallelsのインストールが終わって起動すると利用するディスクイメージを自動的に検索してくれます。
![スクリーンショット 2021-04-11 0.48.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518862/4530ff2c-cddc-13c7-2154-bb41559cf129.png)

利用用途の選択が出てきますが設定するメモリ等の違いだと思います。
私はあとでsteamの検証もしようかと思うのでゲーム用を選択
![スクリーンショット 2021-04-11 0.50.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518862/0597cf69-78c6-f376-acfe-24ae44309773.png)

名前とインストールする場所を適当に設定して完了。
インストールは２分ほどで完了しました。

初回起動にさらに6分ほど。
![スクリーンショット 2021-04-11 0.52.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518862/11addf6b-f9cd-7733-46df-1d327e182c79.png)

無事起動しました。
![スクリーンショット 2021-04-11 0.57.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518862/7c3eeb75-36e8-c4f3-9217-592b8e988eac.png)

parallelsのログイン後とプレビュー版のアクティベーションキーを求められるので
ダウンロードページに書いてあったものを入力してアクティベート
![スクリーンショット 2021-04-11 0.59.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518862/9baec1ff-31d5-4244-a277-108833c7c474.png)

![スクリーンショット 2021-04-11 1.02.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518862/f5990d09-8dff-8816-65eb-8ccb1dab4aba.png)

無事起動しました。
![スクリーンショット 2021-04-11 1.03.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518862/d4763710-76f9-bf28-cba6-d832f6a1131b.png)

全部で２０分もあればここまで完了します。
どの程度動くのかは適当に触ってみてためします。

終わり。
Django

#参考
https://djangobrothers.com/blogs/



#Library

##django-environ
環境変数の管理

##social-auth-app-django
Google、Twitter、GitHub、Facebookなど様々なプロバイダを使って認証機能を作成
https://djangobrothers.com/blogs/social-auth-app-django-line/

##django-debug-toolbar
デバック効率UP
Pythonのunittestモジュールでモックに返り値を設定する（return_value, side_effect）

## 環境

- macOS
- Python 3.9.4

※IMO＝In my opinion（コメントがあればぜひお願いします）

## IMO: ざっくり整理

- モックを呼び出したときに（毎回**同じ**）**返り値**を返してほしい場合は`return_value`属性を設定する
- モックを呼び出すたびに**異なる返り値**を返してほしい場合は`side_effect`属性に[イテラブル](https://docs.python.org/ja/3/glossary.html#term-iterable)を渡す

## 実行例

```python
>>> from unittest.mock import Mock
>>> m1 = Mock()
>>> m1.return_value = 108
>>> m1()
108
>>> m1()
108
>>> m2 = Mock()
>>> m2.side_effect = [1, 2, 3]
>>> m2()
1
>>> m2()
2
>>> m2()
3
>>> # m2()  # raise StopIteration
```

## 利用シーンのイメージ

IMO：モックの`return_value`や`side_effect`は、`patch`でモジュールに当てたモックについてよく設定します。

ref: https://docs.python.org/ja/3/library/unittest.mock.html#unittest.mock.patch

### `return_value`

```python
import random
from unittest.mock import patch

with patch("random.choice") as mock_choice:
    mock_choice.return_value = 2  # withブロックの中では2しか返らなくなります
    for i in range(5):
        print(random.choice([1, 2, 3, 4, 5]))
```

上のスクリプトを実行したときのコマンドライン

```
2
2
2
2
2
```

### `side_effect`

```python
import random
from unittest.mock import patch

with patch("random.choice") as mock_choice:
    mock_choice.side_effect = (1, 1, 2, 3, 5)
    for i in range(5):
        print(random.choice([1, 2, 3, 4, 5]))
```

上のスクリプトを実行したときのコマンドライン

```
1
1
2
3
5
```

例えば`for`文で繰り返す処理の中のモックの`side_effect`を使って、`for`文が回ったあとの値を設定できます。

## 補足事項

### モック生成時にも設定可能

```python
>>> m1 = Mock(return_value = 108)
>>> m2 = Mock(side_effect = [1, 2, 3])

```

ref: https://docs.python.org/ja/3/library/unittest.mock.html#unittest.mock.Mock.return_value

### `side_effect`は関数や例外も設定できる

https://docs.python.org/ja/3/library/unittest.mock.html#unittest.mock.Mock.side_effect
>このモックが呼ばれた際に呼び出される関数、イテラブル、もしくは発生させる例外 (クラスまたはインスタンス) を設定できます。

イテラブルの設定は、1つの使い方に過ぎません。

### モックを呼び出した返り値はreturn_value属性と一致

```python
>>> from unittest.mock import Mock
>>> m = Mock()
>>> m()  # doctest: +ELLIPSIS
<Mock name='mock()' id=...>
>>> m.return_value  # doctest: +ELLIPSIS
<Mock name='mock()' id=...>
>>> m() is m.return_value
True

```

`is`が`True`（idが同じ）なので、**同一**のオブジェクトです。

IMO：使い分け方針

- モックを呼び出したときの返り値が具体的でなくてもよい場合、`m.return_value`を使う
- **具体的な返り値が必要**な場合は`m.return_value = ...`と設定

## 参考資料

- 「[unittest.mockを使ってテストを書こう](https://speakerdeck.com/mizzsugar/unittest-dot-mockwoshi-tutetesutowoshu-kou)」（PyCon JP 2020）
- 私がモックに慣れる際にとても助けられました：[まだmockで消耗してるの？mockを理解するための3つのポイント](http://note.crohaco.net/2015/python-mock/)
- 公式ドキュメント https://docs.python.org/ja/3/library/unittest.mock.html
非相対パスでimportした

## 何をしたのか
https://ospfolio.com/two-way-to-make-absolute-import-path-in-react-native/

これを参考に非相対パス(~/*)の形でimportをできるように設定した。

### モジュール解決とは何か
importが何を参照するのかを解決するために、コンパイラを利用するプロセス

### 相対importと非相対import
相対importは `/` や `./` や `../` などで始まるやつ

```ts
import {} from "../foo"
import {} from "./bar"
```

非相対importは基本的にこれ以外のやつ

```ts
import React from "react"
import Sute from "hage"
```
### めっちゃざっくり非相対importはどのように解決されるか
大きく2つの方法がある。それはNodeとクラシックである。デフォルトはNode。

tsconfigの"module"や"moduleResolution"で設定可能。

非相対importの場合は基本的にまずそのディレクトリの `node_modules` を探してその中にあるパッケージを探す。
そして見つからなかったら、ディレクトリチェーン上(現在のディレクトリの1つ上、そのまた上...)から `node_modules` を見つけようとする。

### TypeScriptだとどうなるか
TSも基本的には同じ。ただ、TS特有のファイルがあったりするので若干違う。省略。
そして、設定によっても若干変わるところがある。

### baseUrl
tsconfigで設定できる。
baseUrlはコンパイラにモジュールの入手先を教える。
tsでの非相対importはbaseUrlからの相対的であると仮定する。
相対importに対しての影響はない。

### paths
tsconfigで設定できる。
パスをマッピングしてくれる。
相対importだと深くなってしまうところを、非相対importでbaseUrlから相対的な設定をすることができる。


```tsconfig.json
{
  "baseUrl": "./src"
  "paths": {
      "~/*": ["*"]
    }
}
```

```ts
import モジュール from "~/src直下のディレクトリやファイル/..."
```

参照

https://www.typescriptlang.org/docs/handbook/module-resolution.html

http://js.studio-kingdom.com/typescript/handbook/module_resolution
【AWS】AWS VPCとは何か・VPCのメリット

#プログラミング勉強日記
2021年4月11日

#AWS VPCとは
　VPCは Virtual Private Cloudの頭文字をとったもので、ユーザ専用のプライベートなクラウド環境・設定を提供するサービスのこと。AWSを利用する場合は、必ずVPCでクラウド環境をコントロールしている。
　VPCを設定すると、AWSのサービスの間の連携やインターネットに接続しないプライベートなネットワークの構築などを設定することができる。ネットワーク設定を簡単にカスタマイズできるのがVPCの強み。

　AWSは基本的にVPCが必須であるが、すぐに使えるVPCとしてDefault VPCが用意されている。AWS VPCはデフォルトのままでも使用できるが、設定を抽象化したコンポーネントを使用して細かく設定することで、様々な環境構築が可能になる。

#AWS VPCの用途
　AWS VPCは用途によって外部ネットワークとの組み合わせが変わってくる。
　用途としては、インターネット向けシステムやオンプレ向けシステム、インターネットとオンプレミス向けのシステムがある。

　インターネット向けシステムは、その名の通りインターネットを経由するシステムを提供する用途で使われる。オンプレミスは、サーバーやソフトウェアなどの情報システムを管理して運用する従来のサーバー運用形態を指す。インターネット向けとオンプレミス向けシステムの両方の接続をVPCに設定する構成がインターネットとオンプレミス向けシステムである。

#AWS VPCのメリット
　クラウド上で仮想ネットワークを簡単に構築できること、インターネットを使わない通信もできること、便利なコンポーネントが多くカスタマイズ性が高いことがメリットとしてあげられる。

　AWS VPCを使用するとAWSの仮想サーバーやデータベースといったAWSのクラウドサービスで構築されるネットワークを構築することができるので、時間やコストをかけることなく仮想上のネットワーク構築ができる。
　AWS VPCは専用のネットワークの中に複数のサブネットワークを作ることができる。サブネットワークはインターネットに接続することも接続しないこともできる。なので外部からアクセスする必要のないシステムのセキュリティを高めることもできる。
　コンポーネントを組み合わせることで、簡単にネットワークの構築が可能である。ただ、構築する環境によってもコンポーネントが変わるので、様々な環境のネットワークを構築する場合はデメリットにもなり得る。

#参考文献
[【AWS】VPCとは？特徴や利用するメリット・デメリットを紹介](https://www.sejuku.net/blog/127104)
[AWSのVPCって何？メリットや使えるシーンなど徹底解説！](https://techplay.jp/column/541)