OmniAICreator/Qiita-1.07M huggingface dataset:
初心者だけど独学でLPIC Level1に合格した


# 1. 試験について

LPIC Level 1 は、Linuxの知識を問う国際資格。

LPIC101、LPIC102の2つの試験に合格することでLPIC Level 1を取得したことになる。

試験の概要は以下。

* 試験時間：90分
* 問題数：60問
* 合格ライン：500/800点
* 受験料：101, 102 各¥15,000+税
* 受験形式：試験センター

受験料は、後述するPing-Tでバウチャーを買うことで安くできる。

# 2. 勉強方法

#### ①[Linux教科書 LPICレベル1 Version5.0対応](https://www.amazon.co.jp/dp/B07P5S98SK/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

通称「あずき本」と呼ばれている参考書を使用。異なる試験バージョンがあるので、購入の際には注意。(2021年4月現在はバージョン5.0)

読み進めながら、コマンドやオプション、設定ファイルのディレクトリやパスなどをノートにまとめて暗記した。

#### ②[Ping-T](https://ping-t.com/:embed:cite)

①で内容を把握した後、セクション毎にPing-Tの問題を解いた。

101は無料ですが、102は有料なので課金して利用。「WEB最強問題集」は全て解きましたが、コマ問は使っていません。

#### ③[スピードマスター](https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC-%E3%83%AC%E3%83%99%E3%83%AB1-%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86-Version5-0%E5%AF%BE%E5%BF%9C-ebook/dp/B07TVTKW2C/ref=sr_1_2)

Ping-Tで問題を解いた後、さらに章ごとにスピードマスター問題集を解いた。

あずき本にもPing-Tにも出てこない内容もあるので、少なくとも正解するため必要な内容については、解説までしっかり読むのがをお勧め。

# 3. 勉強時間

101と102の合計。

* あずき本：約60時間
* Ping-T：約34時間
* スピードマスター：約6時間

<b>合計：約100時間
</b>

101と102でそれぞれ1ヶ月ずつ、合計2ヶ月で取得。


# 4. 結果

101：740/800点 合格

102：680/800点 合格


# 5. 感想

<b>スピードマスターは絶対にやったほうがいい。
</b>

101はスピードマスターの問題と非常に類似した問題が出る。102も、Ping-Tよりスピードマスターの問題に似ている。また、102はオプションなどは少ない分、コマンドの記述問題が多いので、しっかり覚える必要がある。

Ping-Tは内容が細かく、問題数も多いので、どちらかというと不要な気がした。あずき本とスピードマスターだけで十分合格できると思う。
Pythonの国際資格PCEPを取得した

Pythonの国際資格である[PCEP – Certified Entry-Level Python Programmer Certification](https://pythoninstitute.org/certification/pcep-certification-entry-level/)を取得しました。

日本語での情報が殆どなかったため、体験記として公開しておこうと思います。

# 1. PCEPとは

Pythonの国際資格。
日本でメジャーな[Python3エンジニア認定基礎試験](https://www.pythonic-exam.com/exam/basic)と範囲や難易度は同じくらいだと思われる。

試験の概要は以下。

* 試験時間：45分
* 問題数：30問
* 問題形式：選択問題、並べ替え問題、記述問題
* 合格ライン：70%
* 言語：英語
* 受験料：USD 59
* 受験形式：オンライン(24時間受験可能)


# 2. 勉強方法

#### ①Pythonのテキストを一周する
Pythonどころかプログラミング言語を扱うのががほぼ初めてだったため、[初学者向けにわかりやすく書かれているもの](https://www.amazon.co.jp/Python%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF-%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88-%E8%BE%BB-%E7%9C%9F%E5%90%BE/dp/4774196436/ref=sr_1_1:embed:cite)を選んだ。
テキストに記載されているコードを実際に自分でも書いてみながら読み進めた。



#### ②公式学習リソースで学習する




[PCEPの公式無料学習コース](https://edube.org/study/pe1:embed:cite)を一通り。自分のペースで進められる。

PART1とPART2があるが、PCEPの出題範囲はPART1に当たる。


Pythonの概念やコードの書き方の解説のあとに、各セクションやモジュール毎にミニテストがある。
このミニテストが試験の出題内容や形式と同じなので、このテストが解けるようになると合格できると思って問題ないはず。

筆者はコースの最後にある総まとめテストで80%以上取れるようになった状態で受験した。


# 3. 勉強時間

テキストが約12時間、公式学習コースが約24時間の計36時間。


# 4. 結果

80%で合格。


# 5. メリットとデメリット

#### メリット

* 国際資格である
* Python3エンジニア認定試験と比べて受験料が安い
* 出題範囲と出題形式に沿った無料の公式学習コースがある
* オンラインで24時間受験できる

#### デメリット

* 全て英語
* 試験に関する情報が少ない
* 公式学習コースの問題の解説がない
* 試験の知名度が低い


# 6. 感想
学習リソース、試験ともに英語なので、英語に抵抗がなければ受験を検討しても良いと思う。

公式学習コースだけでも十分合格できる内容。まずは公式学習コースをやってみて、わかりにくいと思えば他のテキストを検討してみると良いかも。
node.js の require と import について調べなおす

node.js の require(CommonJS) と import(ESModule) について、理解が曖昧だったため、調べ直してみました。

※2022年2月の 最新バージョン [v17.6.0](https://nodejs.org/dist/latest-v17.x/docs/api/) のドキュメントをもとに記述しています。あらかじめご了承ください。

## require と import の違い

簡単にいうと、nodeモジュールの読み込み形式の違い。

require　は [「CommonJS」](https://nodejs.org/api/modules.html) 形式によるモジュールの読み込み方法。
import は [「ECMAScript」](https://nodejs.org/api/esm.html) 形式によるモジュールの読み込み方法。

requireを定めたCommonJSは [2009年に始まったプロジェクト](https://ja.wikipedia.org/wiki/CommonJS) で、歴史が長い。nodeの公式ドキュメントを見ると、[2011年の記事に利用方法の記載が行われている](https://nodejs.org/en/knowledge/getting-started/what-is-require/)。

importによるモジュール読み込みが定義されたのは ES2015(ES6) から。 このため、import形式の方が新しい読み込み方法となる。

GitHub で node.js のコードを眺めていると、「ESM」とか「ESModule」という略語を目にすることがある。これは「ECMAScript Module」の略称を指す。



## require を利用したモジュールの読み込み

require形式で、外部のJSファイルを読み込む。

```javascript
const foo = require('bar.js')
```

## import を利用したモジュールの読み込み

import形式で、外部のJSファイルを読み込む。

```javascript
import { bar } from 'bar.js'
```

## require, import を使ったサンプル

サンプルコードを利用して違いを見てみる。仕様は以下の通り。

- 指定した値に「2」を加算する関数ファイル「addTwo」
- addTwo をロードして、再利用するJSファイル「index」

の2つを準備する。

### require(CommonJS) のサンプル

まずは require形式。ファイル構成は以下の通り。
 
```bash
.
├── addTwo.js
└── index.js
```

addTwo.js

```javascript
module.exports = function addTwo(num) {
  return num + 2;
}
```

index.js

```javascript
const addTwo = require("./addTwo.js");

console.log(addTwo(4));
// 「6」が表示される
```

### import(ESModule) のサンプル

続いてimportを利用したサンプル。

構成は以下のとおり。


```bash
.
├── addTwo.mjs
└── index.mjs
```

addTwo.mjs のコード

```javascript
function addTwo(num) {
  return num + 2;
}
export { addTwo };
```

index.mjs

```javascript
import { addTwo } from './addTwo.mjs';

console.log(addTwo(4));
// 「6」が表示される
```

## CommonJS (require) の有効化

以下の場合、CommonJSモジュールを利用するものとして扱われる。

- 拡張子が　.cjsのファイル
-  package.json のフィールド "type" に "commonjs" という値を含んでおり、拡張子 .js を持つファイル
-  package.json にフィールド "type" が存在しない場合、拡張子が .js のファイル

何も宣言をしないで node.js のコードを書くと、暗黙的にCommonJSを利用する。

## ESModule (import) の有効化

以下の場合、ESModuleを利用するものとして扱われる。

- 拡張子が.mjsのファイル
- package.json ファイルの "type" フィールドに "module" という値を含んでおり、拡張子が .js のファイル
- evalの引数として渡された文字列、またはSTDIN経由でnodeにパイプされた文字列で、 --input-type=moduleのフラグがあるもの

ESModuleの利用を前提とする場合、package.json もしくは拡張子に設定を加える必要がある。


## 参考文献

node.js のドキュメント各種および Wikipediaう, MDN を参照しました。

https://nodejs.org/dist/latest-v17.x/docs/api/modules.html

https://nodejs.org/dist/latest-v17.x/docs/api/esm.html

https://ja.wikipedia.org/wiki/CommonJS

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/import
ひと言学習メモ１：printとprintlnの活用（P.S．return文についても）

ひと言：
print()は改行なし、println()は改行付き。
returnは結果を戻す、上記2種は出力するのみ。

自己流解釈：
〇print：
コンソールに一行で連続出力したい時に使う。

〇println；
改行したい時に使う。

〇return：
return(a)はSystem.out.println(a)は、コンソールでの出力結果が同じように見える時もあるが、本質的に違う。
voidメソッドで簡単判断するのもあり。

0313更新：return文は値を戻すだけでなく、メソッドの終了も行うというのを勉強したので追記しておく。

ここ最近経験した標準入出力問題について、自分のコードをメモします。

        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        for (int i = 0; i < N; i++) {
            String token1 = sc.next();
            System.out.print(token1+" ");
            int token2 = sc.nextInt();
            System.out.println(token2+1);
           } 


中文版：
一句话总结：
print()只是输出，不会改行，println()会自动换行。
return()目的在于提供返回值，而上面两种只是输出结果。因此即便在控制台出现的结果是一样的，本质上依然不同。可以通过有无void来简单判断。
includeしたレイアウトに対してConstraintLayoutの制約を適応する方法


今回は知らない方がいたので、ConstraintLayoutを使用している時に共通のレイアウトなどをincludeして表示する際にConstraintLayoutの制約を適応する方法を残しておこうと思います。

# includeしたレイアウトに対してConstraintLayoutの制約の適応方法

```
 <include
        android:id="@+id/include_view"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        layout="@layout/include_view" />
```

``android:layout_width="match_parent"``
``android:layout_height="56dp"``
android:layout_widthとandroid:layout_heightをincludeの設定に追加すると制約が効くようになります！
タイムアウトがある場合にチェックすること。随時更新。

学習サイトなどでのスキルチェック時に、アウトプットの正解率だけではなくて、処理時間まで見られている。
そのためタイムアウトになった際にどのような点を見直すべきか、どのようなアクションを取るべきかを箇条書きで記載していく。

・条件分岐で無駄な条件が入っていないか。(特に配列を含む条件の場合)
・配列と辞書でのデータの持ち方。
・ロジック自体を見直す。
・in演算子を多発していないか。(特にlistでのin演算子)
AWS 使用できるアベイラビリティゾーンを5秒で調べる

## TL;DR

AWS CLIの下記を実行すると、使用できるゾーンが分かる。
```
aws ec2 describe-instance-type-offerings --location-type availability-zone --filters Name=instance-type,Values=t2.micro --region ap-northeast-1 --output table
```

結果
※ 使用しているAWSアカウントによって結果が異なります
```
$ aws ec2 describe-instance-type-offerings --location-type availability-zone --filters Name=instance-type,Values=t2.micro --region ap-northeast-1 --output table
------------------------------------------------------------
|               DescribeInstanceTypeOfferings              |
+----------------------------------------------------------+
||                  InstanceTypeOfferings                 ||
|+--------------+-------------------+---------------------+|
|| InstanceType |     Location      |    LocationType     ||
|+--------------+-------------------+---------------------+|
||  t2.micro    |  ap-northeast-1d  |  availability-zone  ||
||  t2.micro    |  ap-northeast-1c  |  availability-zone  ||
||  t2.micro    |  ap-northeast-1a  |  availability-zone  ||
|+--------------+-------------------+---------------------+|

```


## 経緯

Terraform にて　availability_zone　を指定する必要があった。

下記AWS CLIのコマンドで AWSの東京リージョン(ap-northeast-1)には4つのアベイラビリティゾーンが分かった。

```
$ aws ec2 describe-availability-zones --region ap-northeast-1 | jq -r '.AvailabilityZones[].ZoneName'
ap-northeast-1a
ap-northeast-1b
ap-northeast-1c
ap-northeast-1d
``` 

試してみると、ap-northeast-1b だけは新規にインスタンスを作ることができなかった。

上記により、本題のコマンドで使用できるアベイラビリティゾーンを調べたので共有。

## 補足

ap-northeast-1b が使用できないと書いたが、これはアカウントによって異なる。
そのため、アカウントにて本題のコマンドを実行する必要がある。


## 参考文献

https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-instance-type-not-supported-az-error/

https://zenn.dev/rubiconlink/articles/673a1f6fc9a195
Instagram（インスタ）で1万人を超えたアカウントのフォロアー数、フォロー数を知るためには"?__a=1"を付与する

# はじめに

Instagram（以降、インスタ）のフォロアー数、フォロアーの数が1万人を超えると端数が省略されて表示されるようになります。

例として芸能人で最もフォロアー数が多い「渡辺直美」さんの画面ショットを貼ります。

https://www.instagram.com/watanabenaomi703/

![スクリーンショット_2022-02-27_17_21_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6280/3f7c0733-c83a-5139-a8df-cc50f469b645.png)

ただ細かい数字が必要という場面で簡単に確認する方法が分かったので、やり方を共有します。

# 結論
インスタのURLに`?__a=1`を付与するとフォロー数、フォロアー数の細かい数を知ることが可能です。

今回の「渡辺直美」さんのアカウントを例にすると以下のように知ることが可能です。
※ 現在のフォロアー数は「9,662,980」人のようですね！

```
% curl "https://www.instagram.com/watanabenaomi703/?__a=1" | jq .
・・・略・・・
{
  "graphql": {
    "user": {
・・・略・・・
      "edge_followed_by": {
        "count": 9662980
      },
      "fbid": "17841400317520134",
      "followed_by_viewer": false,
      "edge_follow": {
        "count": 757
      },
```

`curl`[^curl]と`jq`[^jq]コマンドが使える状態であればフォロアー数を知りたい場合は以下で取得可能です。

```
% curl "https://www.instagram.com/watanabenaomi703/?__a=1" | jq '.graphql.user.edge_followed_by'
{
  "count": 9663001
}
```

# 余談
このやり方を[Facebook for Developers](https://developers.facebook.com/)で検索したのですが、検索には引っかからなかったので、公式のやり方ではなく途中で使えなくなる可能性あるかもしれません。
その点についてはご留意頂ければと思います。

[^curl]: https://curl.se/
[^jq]: https://stedolan.github.io/jq/
Twilio Conferenceの参加者情報が取得できるようになってた！

### 以前Conferenceの参加者についてこのような記事を書きましたが…
https://qiita.com/sst_2b/items/222e195e2fab471021d7

Conferenceの参加者情報をAPIで取得するには会議中にしかできません。
という話だったのですが、

別件でTwilio Changelogを見ていると、なんとConference Insight APIというものがリリースされており

https://www.twilio.com/changelog/conference-insights-rest-api

## Conference終了後に参加者情報が取得できるようになってました！

この機能の詳細についてはTwilioの中の人（高橋さん）の記事がわかりやすいですので、こちらを参照頂ければと

https://qiita.com/mobilebiz/items/f0ab75d28205740aa6c2

## 実際に使ってみた

ではドキュメントを見つつ使ってみます。
もちろんすでに会議通話は終わっている過去のデータです。

https://www.twilio.com/docs/voice/insights/conference/api


※API Testerを使用しています。
```
https://insights.twilio.com/v1/Conferences/CFXXXXXXXXXX/Participants
```

えいやー！

```json
{
    "participants":[
        {"metrics":{"inbound":{"latency":{"max": 0.76, "avg": 0.76…},
        {"metrics":{"inbound":{"latency":{"max": 0.9, "avg": 0.85…},
        {"metrics":{"inbound":{"latency":{"max": 0.0, "avg": 0.0…}
    ],
    "meta":{
        "page": 0,
        "page_size": 25,
        "first_page_url": "https://insights.twilio.com/v1/Conferences/CFXXXXXXXXXXXXXXXX/Participants?PageSize=25&Page=0",
        "previous_page_url": null,
        "url": "https://insights.twilio.com/v1/Conferences/CFXXXXXXXXXXXXXXXX/Participants?PageSize=25&Page=0",
        "next_page_url": null,
        "key": "participants"
    }
}
```
※長いので一部省略

**participantsのデータが入ってる～～:grinning:**


## 取れたデータに欲しい情報があるのか

とりあえず取れてよかったですが、私の以前の記事では
参加者それぞれのCallSidを取得するというものでしたので、Participants内にそれがあるか見てみます。

```json
{
  "call_status": "completed",
  "join_time": "2022-02-02T06:31:19Z",
  "from": "+0000000000",
  "to": "client:xxxx_2Dxxx_40xxxx_2Exx_2Exx",
  "leave_time": "2022-02-02T06:32:22Z",
  "processing_state": "complete",
  "conference_region": "jp1",
  "participant_sid": "CPXXXXXXXXXXXXXXX",
  "call_type": "client",
  "conference_sid": "CFXXXXXXXXXXXXXXX",
  "call_direction": "outbound",
  "participant_region": "jp1",
  "call_sid": "CAXXXXXXXXXXXXXXX",
  ...
}
```
※これも長いので省略しています。必要な項目のみ抜粋

**call_sid**が無事取得できますのでこれで参加者のCallを取得できます。

**call_type**や、**from**、**to**の項目で電話をかけてきた人か、電話を取った担当者かがわかります。

**join_time**の時間順で、最初に電話を取った担当者や最後に通話を切った担当者等の情報もある程度判断できそうです。

#### オッケー！！👌


## twilio-nodeの場合

こちらはまだバージョンの関係で確認できておりませんが、
3.74.0以降であればInsightのConferenceAPIを使用できるようです。
※記事投稿時点での最新は3.75.0

```
"twilio": "^3.74.0"
```

## まとめ

Conferenceの参加者情報を取得するのに四苦八苦していましたが、
公式でAPIが用意されて簡単に取得できるようになって良かったです:smiley:
【演算子と判定構造の使用①】論理演算子(&&、||)、同一性（==）、同値性(equals)

## はじめに
オラクル認定資格教科書 Javaプログラマ Silver SE８
第一章　Javaの基本　
第二章　Javaのデータ型の操作
第三章　演算子と判定構造の使用←　ｲﾏｺｺ！！
第四章　配列の作成と使用
第五章　ループ構造の使用
第六章　メソッドとカプセル化の操作
第七章　継承の操作
第八章　例外の処理
第九章　Java APIの主要なクラスの操作

## 倫理演算子について
| 演算子| 使用例 | 意味 | 
|:--|:--|:--|
| & | a & b | aとbの両方がtrueであればtrue |
| && | a && b | aとbの両方がtrueであればtrue |
| I | a I b | aもしくはbのどちらかがtrueであればtrue |
| II | a II b | aもしくはbのどちらかがtrueであればtrue |
| ! | a! | trueであればfalse、falseであればtrue |

### & と &&、| と ||の違い
**&** と **&&**、**|** と **||** の違いは、左オペランドの結果で右オペランドを評価するか、評価しないかである。
**&** と **|** は左オペランドの結果にかかわらず、右オペランドの評価も行う。
一方で、**&&** と **||** は「ショートサーキット演算子」とも呼ばれ、左オペランドで結果がわかれば、右オペランドの評価は行わない。
```java
例
int a = 10;
int b = 10;
if (10 < a && 10 < ++b) {
//左オペランドでfalseが確定するため、右オペランドは実行されず、bは10のままである
  a++;
}
System.out.println(a + b);
//20
```

## 同一性（ == ）
完全に同じであるかを評価する。
同じ値でも、参照先が違っていればfalseとなる。
```java
public class Sample {
  private int num;
  public Sample(int num) {
    this.num = num;
  }
}  
------------------------------
public class Main {
  public static void main(String[] args) {
    Sample a = new Sample(10);
    Sample b = new Sample(10);
    System.out.println(a == b);//false
    // aとｂの値は共に１０ではあるが、参照先のインスタンスが異なるため、同一性が認められない
}
```

## 同値性（equals）
同値性を確認する場合は、Stringクラスのequalsメソッドを利用する。
大元であるObjectクラスに定義されているequalsメソッドは同一性を確認するため要注意。
Objectクラスのequalsメソッドで同値性を確認する場合は、オーバーロードして値を比較するよう実装する必要がある。
```java
//Objectクラスでの同一性を確認する実装のequalsメソッド
public boolean equals(Object obj) {
  return (this == obj)
}
----------------------------------------------
//オーバーライドして、同値性を確認するよう実装する
public boolean equals(Object obj) {
  if (obj == null) {
    return false;
  }
  if (obj instanceof Sample) {
    Sample s = (Sample) obj;
    return s.num == this.num;//num(値)だけ比較するよう指定
  }
  return false;
}

----------------------------------------------
//Stringクラスのequalsメソッドを使用
public static void main(String[] args) {
  String a = new String("Sample");
  String b = "Sample";
  System.out.println(a.equals(b));//true
}
```

## リンク集
[【Javaの基本①】クラスの構造](https://qiita.com/vitamin_b12/items/3f920cd223fd3cc1ceae)
[【Javaの基本②】パッケージとインポート](https://qiita.com/vitamin_b12/items/be766c8c3ef2366d9fea)
[【継承の操作②】インターフェース](https://qiita.com/vitamin_b12/items/cdc76298d7f6a494dff2)
[【Javaのデータ型の操作①】プリミティブ型のデータ・参照型](https://qiita.com/vitamin_b12/items/f922ab56e4d8b6580f49)
[【演算子と判定構造の使用①】論理演算子(&&、||)、同一性（==）、同値性(equals)](https://qiita.com/vitamin_b12/items/9feb89e8fb1bc67a8d6d)
[【演算子と判定構造の使用②】分岐処理(if、swich)](https://qiita.com/vitamin_b12/items/523467908e683474eac7)
[【配列の作成と使用】](https://qiita.com/vitamin_b12/items/2fc45588640c479e1f4d)
[【ループ構造の使用】while文、do-while文、for文、拡張for文](https://qiita.com/vitamin_b12/items/23d853dda9baf727e4ac)
[【メソッドとカプセル化の操作①】メソッドの概要](https://qiita.com/vitamin_b12/items/215ad731221c2691c441)
[【メソッドとカプセル化の操作②】オーバーロード、コンストラクタ](https://qiita.com/vitamin_b12/items/e4fd3d51a35bb6a5566c)
[【継承の操作①】クラスの継承](https://qiita.com/vitamin_b12/items/19f8ad6f9801ac8f6a8f)
[【例外の処理】](https://qiita.com/vitamin_b12/items/f7ebf2c1106a7dcbdb41)
[【Java APIの主要なクラスの操作】](https://qiita.com/vitamin_b12/items/dcd3edfe2273e5a09231)
AnsiblePlaybookでssh-agentを使ってPrivateRepositoryをCloneする

# やりたいこと
- リモート側でGithubに登録しているキーペアを使ってGit Cloneしたい
- 単純に公開鍵をリモートへコピーするのでもよいが、セキュリティ的にあまりよろしくない
- ssh-agentを使うことでssh接続をしているときにのみキーペアがセットされるのでファイルをそのままコピーするよりも良いかなと思う

## ssh-agentをセットアップ
### ssh-agentのPIDを表示

```
ssh-agent -s 
```

### 環境変数に入れ込む
```
export SSH_AUTH_SOCK=/tmp/ssh-I990nFpElTyM/agent.17453; export SSH_AUTH_SOCK;
export SSH_AGENT_PID=17454; export SSH_AGENT_PID;
```

### 登録している公開鍵を登録する
```bash
ssh-add ~/.ssh/id_rsa.pub
```

### 登録されているか確認する
```
ssh-add -l
```

出力例

```
3072 SHA256:exB9cunVDbSGaugRw0ePcpWohJQATGI8FiOd56QJ81s yuta@DESKTOP-T85N4KS (RSA)
```

## ansible側のセットアップ

### ansible.cfgにssh系の設定を書いておく
- ` -o ForwardAgent=yes`をつけることで、ローカルの公開鍵をリモート側で使うことができるようにする

```ansible.cfg
[defaults]
host_key_checking = False
private_key_file=~/.ssh/id_rsa
transport = ssh

[ssh_connection]
ssh_args = -o ForwardAgent=yes
```

### gitモジュールを使う
- `become_flags: '-E'`が必要みたい
    - sudoしたときに環境変数を引き継ぐ設定

```main.yaml
- name: Clone a private repository into folder.
  git:
    repo: "git@github.com:test/test.git"
    version: "master"
    dest: "/tmp/test"
    accept_hostkey: yes
    clone: yes
  become_flags: '-E'
  with_items: "{{ services }}"
```
DispatchQueue.global(qos: )の種類を改めて調べてみた

なんとなく使っていたDispatchQueue.global(qos:  )の使い方を改めて調べてみました。
<h1>DispatchQueue.global(qos:  )とは</h1>
タスクの優先順位を指定できるもの

```swift
DispatchQueue.global(qos: ここで指定する).async {
     処理
}
```
[公式ドキュメント](https://developer.apple.com/documentation/dispatch/dispatchqos/qosclass)
<h1>種類</h1>
<h2>userInteractive</h2>
アニメーション、イベント処理、アプリのユーザーインターフェースの更新など、ユーザーとの対話を必要とするタスク
<h2>userInitiated</h2>
ユーザーがアプリを積極的に使用できないようにするタスク

ユーザーの入力を受けて実行されるタスク
<h2>default</h2>
明示的にしていない時に適用
<h2>utility</h2>
ユーザーがアクティブに追跡しないタスク

ダウンロード等の「画面は更新するが、結果を即時要求しない処理」に適用
<h2>background</h2>
メンテナンスまたはクリーンアップタスク等の見えないところで実行される処理に適用
<h2>unspecified</h2>
指定なし
<h1>実行優先順位</h1>

1.userInteractive
2.userInitiated
3.default
4.utility
5.background
6.unspecified


<h1>参考記事</h1>

[GCDを使った非同期処理について改めて調べてみた](https://dev.classmethod.jp/articles/gcd_swift)
[Swiftでの非同期処理GDP｜ディスパッチキューの解説｜DispatchQueue.globalとmain](https://ticklecode.com/swfitgdp/#%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E3%82%AD%E3%83%A5%E3%83%BC%EF%BC%88global_queue%EF%BC%89)
コスチュームと音「こども向けのSnap!かいせつ」

スプライトの見た目を変えるためには、新しい「コスチューム」を書くか、読みこみます。
コスチュームを書くには、スクリプトエリアの上にあるコスチュームタブを押して、ペイントボタンを押してください。ペイントエディタが出てきます。

コスチュームを読みこむには、３つの方法があります。
一つ目はファイルボタンから「コスチューム」を選んで、そこに出てくる絵から選ぶ方法です。
二つ目は自分のコンピューターからコスチュームを送る方法です。ファイルボタンを押して、「よみこみ」を選びます。画像のファイル（PNGやJPEGなど）を選びます。
三番目の方法は、自分のコンピューターからスクリプトエリアに、ファイルをドラッグ＆ドロップする方法です。

スクリプトエリアには３つのタブがあります。スクリプト、コスチューム、おとです。コスチュームタブには、スプライトのコスチュームを集めたワードローブがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/d7be1dac-2a44-050d-0744-01170dd7e253.png)
このワードローブの中のコスチュームは、「コスチュームを［］にする」ブロックで変えることができます。また「つぎのコスチュームにする」ブロックを使うと、ワードローブの上から下にコスチュームが変わっていきます。「コスチュームのばんごう」ブロックを使うと、今何番目のコスチュームになっているかを調べることもできます。
また、「コスチュームを［］にする」ブロックにはコスチュームの何番目に変えるかを数字で選ぶこともできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/d505bbd8-6abe-ab09-10ec-089358ddf90b.png)

コスチュームのようにスプライトは「おと」を使うこともできます。おとタブの中身はジュークボックスと呼ばれます。ここには、音声ファイルを自分のコンピューターから読み込むことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/9571375c-b83a-f2ea-ea38-6e5f5b197942.png)
コスチュームと同じように、「［］のおとをならす」ブロックで音をならすことができます。また、「おわるまで［］のおとをならす」ブロックを使うと、音がなり終わってから次のブロックに進むスクリプトが作れます。

<a href="https://qiita.com/wordplugin/items/6f6644aaa46acd54e7ed">戻る</a>
[Blender]トゥーン調のアウトライン表示

Blenderでトゥーン調のアウトライン表示をします。
この記事は[YouTubeチャンネル「BlenderSecrets」さんの動画](https://www.youtube.com/watch?v=913lbud30xc)を元に、Blenderバージョン3.0表記に合わせてまとめたものです。

![outlineByFreestyle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/897b2453-0387-1325-19d5-5cfc74ccb51b.png)


最初から用意されているCubeを使います。
表示されていない人はShift+Aキーを押してMesh > Cubeで用意してください。
![スクリーンショット 2022-02-27 16.28.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/155262fe-dd80-8285-3156-bb8ab2125619.png)
箱本体の色（緑）を設定して表示のモードをRenderedに切り替えます
![スクリーンショット 2022-02-27 16.33.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/4d60374b-5275-5651-cc69-5da299b311d4.png)
2つ目のマテリアル(アウトライン用)を追加、設定します
![スクリーンショット 2022-02-27 16.39.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/48cce02e-0bf6-4194-ac26-b400b6d137cc.png)
SolidifyModifierを追加して設定します
![スクリーンショット 2022-02-27 16.47.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/454457fa-0962-13a9-cb0f-f95669ffc012.png)
※ 他にもアウトライン用マテリアルのShadowModeをNoneにしたり、SolidifyModifierのEvenThicknessにチェックを入れたり（オブジェクトのLocation,Rotation,ScaleをApplyしておく？）すると綺麗になる事があります。
TypeScript: typeof, keyof [アウトプット全くしてこなかったのでアウトプットする002]

あんまりわかっていないので調べました。

## typeof
> TypeScriptの"typeofは変数から型を抽出する型演算子です"。次は、変数pointにtypeof演算子を用いて、Point型を定義する例です。

```ts
const point = { x: 135, y: 35 };
type Point = typeof point;
// このPoint型は次のような型になります。

type Point = {
  x: number;
  y: number;
};
```

## keyof

> keyofは"オブジェクト型からプロパティ名を型として返す型演算子"です。たとえば、nameプロパティを持つ型に対して、keyofを使うと文字列リテラル型の"name"が得られます。

```ts
type Person = {
  name: string;
};
type PersonKey = keyof Person;
// 上は次と同じ意味です
type PersonKey = "name";
```


**keyofは型に対して行う**

```ts
type Colors = {
  red: 'red',
  blue: 'blue'
}

type ColorsKey = keyof Colors;
```

**typeofは値に対して行う**

```ts
const colors = {
  red: 'red',
  blue: 'blue'
}

type Colors = typeof colors;
```

**keyof typeofをするとユニオンタイプになる**

```ts
const colors = {
  red: 'red',
  blue: 'blue'
}
type Colors = keyof typeof colors;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660329/c362d163-18fb-48be-2203-e6ee7bfc4208.png)

ただColors.と打った時にサジェストが出てこない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660329/d774c19d-cd1f-b714-f5f2-27b74a2145fd.png)

以下のようにするとサジェスト出てくる

```ts
const Colors = {
  red: 'red',
  blue: 'blue'
} as const;
type Colors = typeof Colors[keyof typeof Colors];
Colors.red
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660329/0169135b-a81a-09c4-86ce-9ba7a5b018cb.png)

強くなりたい!!!!!!

参考

https://typescriptbook.jp/reference/type-reuse/keyof-type-operator

https://www.wakuwakubank.com/posts/756-typescript-in-typeof-keyof/

https://www.kabuku.co.jp/developers/good-bye-typescript-enum
【Jenkins】Gitリポジトリ内の特定フォルダのみをチェックアウトする方法

# はじめに
Github上のリポジトリ内にある特定のフォルダだけを取得したいと考え、実現した方法を残します。  

# 前提条件  
JenkinsのPipeline: SCM Stepプラグインをインストールしてあること。
https://plugins.jenkins.io/workflow-scm-step/

# 方法  
以下は`git clone`操作をしている箇所の抜粋です。
クローンしたいフォルダ名を以下の`<特定フォルダ名>`箇所に置換します。


```.groovy
stage('Clone specific folder') {
           steps {
                script {
                    echo "Clone specific folder"
                    // リモートリポジトリ内の特定フォルダをローカルにクローンする
                    dir(path: "${env.WORKSPACE}\\<リモートリポジトリ名>"){
                    try {
                        checkout([$class: 'GitSCM', 
                                    branches: [[name: "<ブランチ名>"]], 
                                    doGenerateSubmoduleConfigurations: false, 
                                    extensions: [
                                        [$class: 'SparseCheckoutPaths',  
                                        sparseCheckoutPaths:[[$class:'SparseCheckoutPath', 
                                        path:'<特定フォルダ名>/']]]
                                                ],
                                    submoduleCfg: [],
                                    userRemoteConfigs: [
                                        [credentialsId: "<Jenkinsで設定した認証情報>", 
                                        url: "<リモートリポジトリURL>"
                                        ]
                                    ]
                                ])
                        } catch (Exception  e) {
                            printMessage(e)
                            currentBuild.result = 'FAILURE'
                        }
                    }
                }
            }
        }
```


# 結果  
特定フォルダのみクローンされる。
※このとき、特定フォルダまでのパスも同時にクローンされるイメージ。  

## 動作上で気を付ける点
対象のリモートリポジトリURL内に特定フォルダ名が複数存在する場合、全てがクローン対象となること
※特定フォルダ名だけを取得するという動作としては認識通りですが、使用する際は注意が必要かも。

# 参考サイト
https://stackoverflow.com/questions/43293334/sparsecheckout-in-jenkinsfile-pipeline
UnityのButtonクラスのOnClickのFunctionの引数にEnumを設定する方法

UnityのButtonクラスのOnClickのFunctionの引数にEnumを設定する方法についてのメモです。
通常、UnityのButtonクラスのOnClickのFunctionの引数には、boolやint、stringなどは使えますが、enumを使用する事はできません。
これが不便だったので解決方法を考えました。

他にも方法はあると思うのですが、ひとまずシンプルな方法で解決したので備忘録としてメモしておきます。

Unityエディターの右クリックメニューから「UI」→「Button」を選択し、ボタンを作り、そのオブジェクトに下にあるEnumOnClickクラスのスクリプトをAddComponentし、ヒエラルキー上からstateを選択して設定をします。
ButtonクラスのOnClickの個所は「List is Empty」の状態のままで大丈夫です。

起動後にButtonのOnClickを確認しても「List is Empty」のままになっており、AddListenerに失敗しているように見えますが、クリックすると正常に動きます。
検証していませんが、起動時の情報しか反映されないのかもしれません。

```EnumOnClick.cs
using UnityEngine;
using UnityEngine.UI;

public class EnumOnClick : MonoBehaviour
{
    //この値をインスペクター上から設定します
    [SerializeField] private State state;
    private Button button;

    public enum State
    {
        NONE,
        GAME_START,
        OPTION,
        EXIT,
    }

    private void Awake()
    {
        button = GetComponent<Button>();
        button.onClick.AddListener(OnClickButton);
    }

    public void OnClickButton()
    {
        if (state != State.NONE)
        {
            //stateに応じた処理
            switch (state)
            {
                case State.GAME_START:
                    break;

                case State.OPTION:
                    break;

                case State.EXIT:
                    break;
            }
        }
    }
}
```
AWS無料利用期間が終了したのでコスト確認

# 目次
[1.はじめに](#はじめに)
[2.請求書](#請求書)
[3.costexplorer](#costexplorer)
[4.budgets](#budgets)
[5.まとめ](#まとめ)

# はじめに
個人で使用していたAWSアカウントの無料利用枠(12ヶ月間)が終了し、月額コストが増加したため、コスト内訳などを確認、整理してみました。尚、アカウントで利用しているAWSサービスは以下の通りです。
![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/a8b52ff4-17ff-885b-63f8-fd192bb3581a.png)

# 請求書
無料利用枠期間の前後でコストを比較すると、EC2/ELB/RDSの各々でコストが増加していることが分かります。
また、プルダウンを開くと各サービスにおいて、単位時間あたりのコストなども記載されています。
## 無料利用枠期間
![スクリーンショット 2022-02-27 12.05.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/5efdd7c8-cbf0-3b5e-bb78-a6b3a05e3fe5.png)

## 期間終了後
![スクリーンショット 2022-02-27 12.11.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/4cb675fd-10e3-2e7f-5065-0b2f130c856d.png)

# costexplorer
次にCost Explorerで詳細をみていきます。
以下は月別2021年11月〜12月の範囲、サービス毎の表示でフィルターしたものです。
このようにCost Explorerではコストをグラフで確認することができ、無料利用枠前後でコストが増加していることや、RDSのコスト割合が高いことが視覚的に分かります。
![スクリーンショット 2022-02-27 15.40.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/ccc211eb-57df-1b29-3cab-4b34fcf5395f.png)

以下は2021年12月の日別でフィルターしたもので、CSVをダウンロードすることも可能です。![スクリーンショット 2022-02-27 15.48.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/92d43485-a06d-7f29-90e1-2472e1525ec9.png)
■CSVデータ
![スクリーンショット 2022-02-27 12.30.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/c2f8a4c8-af5d-3992-7066-c590f13bc814.png)

ここでコスト配分の高いEC2/ELB/RDSの各々について見ていきます。　
※リージョン：アジアパシフィック(東京)

## EC2インスタンス
- AMI：　Amazon Linux 2
- インスタンスタイプ：　t2.micro
- 単位時間あたりのコスト：　0.0152USD
- 1日(24h)稼働した際のコスト
→ 0.0152USD　× 24 = **0.3648 USD**
- 1ヶ月(24h × 31)稼働した際のコスト
→ 0.0152USD　× 24 × 31 = **11.3088 USD**

## EC2 - その他 -
- EBS：　汎用SSD(gp2) 8GiB
- 1か月にプロビジョニングされたストレージ1GBあたりのコスト: 0.12USD
- 1日(24h)稼働した際のコスト
→ 0.12USD　× 8 ÷ 31 = **0.03096 USD**
- 1ヶ月(24h × 31)稼働した際のコスト
→ 0.12USD　× 8 = **0.96 USD**

※上記CSVで計算額を若干上回っている分は、一時的なEBSの増設、EIPのデタッチなどによるものと思われる。

## ELB
- 種類： ALB
- 単位時間あたりのALBコスト：　0.0243USD
- LCU時間あたりのコスト： 0.008USD
→今回の範囲では、LCU分のコストは0USDであった。
- 1日(24h)稼働した際のコスト
→ 0.0243USD　× 24 = **0.5832 USD**
- 1ヶ月(24h × 31)稼働した際のコスト
→ 0.0243USD × 24 × 31 = **18.0792 USD**

## RDS
- データベースエンジン： MySQL
- インスタンスタイプ： db.t2.micro
- 単位時間あたりのRDSコスト：　0.026USD 
- ストレージタイプ：　汎用 SSD (gp2)
- ストレージ容量：　 20GiB
- 1か月にプロビジョニングされたストレージ1GBあたりのコスト: 0.138USD 
- 1日(24h)稼働した際のコスト
→ 0.026USD 　× 24　＋ 0.138USD × 20 ÷ 31 = **0.713 USD**
- 1ヶ月(24h × 31)稼働した際のコスト
→ 0.713USD × 31 = **22.104 USD**

# budgets
無料利用期間も終了してしまったので、今後はbudgetsで予算管理、請求アラート設定をしていきます。

- 予算タイプを選択
![スクリーンショット 2022-02-27 16.15.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/64ae0b20-fda9-8100-7c0c-292c3ced479f.png)

- 予算の設定
![スクリーンショット 2022-02-27 16.20.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/960adf0a-f172-b85b-c9ee-36ef8cd047b2.png)

- アラートの閾値と通知設定
70%の閾値でEメールに送信するように設定しました。
![スクリーンショット 2022-02-27 16.22.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/02e1a259-92f4-93b2-9e79-b1b28e3e92c5.png)

# まとめ
RDS、EC2のコストが高いので、今後は夜間の自動停止などを検討してみたいと思います。

以上、最後まで読んで頂きありがとうございました！
dockerのmysqlのコンテナのビルドで失敗した際の解決方法

先日、新しいプロジェクトにも手を付けることになったので環境構築を行なっていたところ、mysqlのdockerコンテナのビルドに失敗したので、その解決方法です。
プロジェクトの中身を見てみたところ、ローカル環境でサーバを起動するとかそんなお話だったので、Macで環境構築するのもめんどくさいし、docker環境でも整備しようとして起きたエラーがこちらになります。
```
=> ERROR [2/3] RUN apt update                                                                                    5.1s
------                                                                                                                 
 > [2/3] RUN apt update:                                                                                               
#6 0.335                                                                                                               
#6 0.335 WARNING: apt does not have a stable CLI interface. Use with caution in scripts.                               
#6 0.335                                                                                                               
#6 0.562 Get:1 http://security.debian.org/debian-security stretch/updates InRelease [53.0 kB]
#6 0.571 Ign:2 http://deb.debian.org/debian stretch InRelease
#6 0.595 Get:3 http://repo.mysql.com/apt/debian stretch InRelease [21.6 kB]
#6 0.639 Get:4 http://deb.debian.org/debian stretch-updates InRelease [93.6 kB]
#6 0.765 Get:5 http://deb.debian.org/debian stretch Release [118 kB]
#6 0.801 Get:6 http://security.debian.org/debian-security stretch/updates/main amd64 Packages [771 kB]
#6 0.846 Get:7 http://deb.debian.org/debian stretch Release.gpg [3177 B]
#6 0.866 Err:3 http://repo.mysql.com/apt/debian stretch InRelease
#6 0.866   The following signatures were invalid: EXPKEYSIG 8C718D3B5072E1F5 MySQL Release Engineering <mysql-build@oss.oracle.com>
#6 1.246 Get:8 http://deb.debian.org/debian stretch/main amd64 Packages [7080 kB]
#6 4.370 Reading package lists...
#6 4.990 W: GPG error: http://repo.mysql.com/apt/debian stretch InRelease: The following signatures were invalid: EXPKEYSIG 8C718D3B5072E1F5 MySQL Release Engineering <mysql-build@oss.oracle.com>
#6 4.990 E: The repository 'http://repo.mysql.com/apt/debian stretch InRelease' is not signed.
------
failed to solve: rpc error: code = Unknown desc = executor failed running [/bin/sh -c apt update]: exit code: 100
```


Dockerfileの中身はこんな感じです。
```Dockerfile
FROM mysql:5.6

RUN apt update
RUN apt install -y openssh-server vim
```

調べてみると、証明書が切れてるとのことでした。

証明書を更新してもいいのですが、dockerファイルにいちいち記載したりするのもやだし、必ずしも他の人の環境でも起きることでもないなと考えて、aptではなくapt-getを使うことにしました。

修正したDockerfileはこんな感じです。
```Dockerfile
FROM mysql:5.6

RUN apt-get update
RUN apt-get install -y openssh-server vim
```
こんな感じでやったら無事に立ち上がりました。

[元の記事](https://snow-cat.net/?p=1349)
見るだけのガントチャートを作ってみた

# 作った背景
タイトルはガントチャートだけど、実は簡単なタスクリストのシステムを作りたくて、その表現方法をどうしようか迷ってた。
具体的に言うと、会社で、アンケートやら研修やらを〇日～〇日でやってください！という期間が長すぎて、言われた瞬間にやったのか、後回しにしたのか忘れてしまっているのを、覚えておくシステムがほしかった。ほかの人もその問題は持っているようなので、会社全体として、タスクリストがあるといいなぁと思ってる。

そんなときにたまたま、ガントチャートを目にして、上記のシステムの表現方法はガントチャートがいいなぁと思いついた。

そこで次はガントチャートのJavaScriptのライブラリを探してみたところ、たくさんあるけど、高機能だったり、ドラッグで調整できたり、有料だったり、私にとってはオーバースペックなものしかなかった。

なので、作るかと思った次第。

# 作ったもの
## スクリーンショット
![gantt_viewer.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/cadf17c7-f0c4-0fd6-716f-89f6aaacbcac.png)

## ソース
https://github.com/yo16/gantt_viewer


# 使い方
- GitHubのexampleを見てもらえばすぐわかると思いますが。

(1) d3.jsとgantt-viewer.jsを読み込む
```html
<head>
    <script type="text/javascript" src="./js/d3.min.js"></script>
  	<script type="text/javascript" src="./js/gantt-viewer.js"></script>
</head>
```
  - jsファイルの置き場所は適当にどうぞ


(2) JavaScriptでJson形式のデータを準備する
```javascript
    let gantt_datas = [
        {
            "title":"タスク1あいうえおかきくけこ", 
            "detail":"細かいことはいろいろありますがタスク１です。", 
            "start_dt":"2022/2/1", 
            "end_dt":"2022/2/25"
        },
        {
            "title":"task2abcdefg", 
            "detail":"細かいことはいろいろありますがタスク２です。", 
            "start_dt":"2022/2/7", 
            "end_dt":"2022/2/10"
        },
        {
            "title":"タスク3", 
            "detail":"細かいことはいろいろありますがタスク３です。", 
            "start_dt":"2022/2/14", 
            "end_dt":"2022/2/18"
        },
        {
            "title":"タスク4", 
            "detail":"細かいことはいろいろありますがタスク４です。", 
            "start_dt":"2022/2/21", 
            "end_dt":"2022/2/25", 
            "color":"#f00"
        },
        {
            "title":"タスク5", 
            "detail":"細かいことはいろいろありますがタスク５です。", 
            "start_dt":"2022/2/28", 
            "end_dt":"2022/2/28", 
            "color":"#0f0"
        },
    ];
```
  - 無駄に長くてすみません。大した内容はないです。

(3) 呼び出す
```javascript
let gv = new GanttViewer("#gantt1");
gv.data(gantt_datas, day=new Date(2022,1,16));	// monthは0スタート
```
  - 日付の省略時は"今日"です。


# あとがき
私のやりたいような複数人で見るだけの要望だと、これくらいでいいんじゃないかなーと思った。そしてその機会は多いんじゃないかなぁ。ガントチャートは書く人より見る人の方が多そう。
d3.jsは初めて使ってみて、意外と簡単だった。SVG使いたいときには使おう。

ライブラリに関するご要望はGitHubへお願いします。あと、うち専用にカスタマイズして！作って！というご要望等があったらここのコメントにでもお願いします。お手伝いできるかもしれません。

# Next
見た目のツールができたので、元々やりたかったタスクリストの方も着手する。そっちは出来上がったら、サービス化して一般的にも使える形にしようと思ってる。誰か、このアイデアをパクって作っていただいても、まったく構いません。無料だと嬉しい。
【記念すべき1回目！LT発表を振り返る】

こんにちは。
入社2年目の文系出身エンジニアです。
今回の内容は、エンジニア勉強会(ココカラ勉強会)に参加し、
LT発表の前後を振り返っていきたいと思います。
なので、記事としては短いと思います。。

### LT発表前
まず何をしゃべろうかなぁって悩みました。
プログラミングはまだ始めて少ししか経っていないし、
自分の理解が追い付いていないことも多々あるので、
今回は、去年携わったRPAのことについて話していこうと思いました。
ココカラ勉強会は何度か参加したことがあるのですが、
一人ずつ話を聞くと、皆さんRPAを身近に触ったことがないという方が非常に多かったです。そこが決め手の一つになりました！

### LT発表途中
緊張しました。
入念に準備していたのですが、人前で話すのはいつでも緊張します。
私の前にLT発表している方もいらっしゃって、
その内容が全く(でもないですが笑)頭に入らなかったです。
それより、自分が作成したプレゼン資料を見て、
「ここ合っているかなぁ」「もっと違うこと調べた方が良かったかなぁ」
など、発表始まってもないのに一人反省会をしています笑
発表する前は基本そうなってしまいます。。
あと原稿がないと発表できなくなるのも悩みです。
頭が真っ白になって何も考えられなくなってしまうんですよね。。
OJT研修の講師や同期に聞くと原稿を見ずに発表する方が多く、
びっくりしました。
確かにそっちの方が説得力あるのですが、
発表が苦手な方にとってはハードルが高いのかなと。。
数をこなしまくるしかないのかなぁと改めて思いました。

### LT発表後
発表が終わったと同時にホッとしました！
私が思った以上にRPAに興味深々になってくれて嬉しかったです。
質問もたくさん頂きました。ありがとうございます。
と同時にはっきり答えられない質問もあったので、
もっと勉強しないとなぁと聞く側より伝える側の方がより強くモチベーションに繋がりました。

### LTしてみて良かったこと
##### ①モチベーションが上がる
勉強する意欲があがりました！
先ほどお伝えしたように、聞く側より伝える側の方が勉強する範囲を広げて、
相手に伝えられるようになりたいなぁって強く思います。
##### ②課題がたくさん見えてくる
私の場合、話すスキル、間の取り方、発表の工夫が主に挙げられました。
##### ③感想がたくさんもらえる(勉強会の種類により、ある所ない所がある？)
これが一番うれしかったです。
人からもらう感想は大事であると同時にこんなことに興味あったんだなぁと、
違った視点をもらえることでより励みになりました。

### 最後に
ここまで読んでくださり、ありがとうございました！
毎月、勉強会に参加しているのですが、本当にいつも参加してよかったとつくづく思います。
悩み＆知識の共有の場みたいな感じで行くととても安心します。
機会があれば、勉強会に足を運んでみてください！
信頼区間、信頼係数の算出

# はじめに

標準正規分布の信頼区間、信頼係数（信頼度）の算出処理を実装した際のまとめになります。

# 用語解説

https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83

https://ja.wikipedia.org/wiki/%E4%BF%A1%E9%A0%BC%E5%8C%BA%E9%96%93

https://makitani.net/shimauma/confidence-coefficient

![StandardNormalDistribution0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675901/431b48f0-7c73-7bd3-9b60-5bf28a503e38.png)

# 使用したD言語の標準ライブラリ関数

[normalDistribution](https://dlang.org/phobos/std_mathspecial.html#.normalDistribution)関数、[normalDistributionInverse](https://dlang.org/phobos/std_mathspecial.html#.normalDistributionInverse)関数を使用しました。

`normalDistribution`関数は、$normalDistribution(x)=\frac{1}{\sqrt{2 \pi}} \int_{-\infty}^{x} \exp(-{\frac{t^2}{2}})dt $ です。
下のグラフでの横軸の値`x`を引数とした場合に、水色部分の面積が`normalDistribution(x)`になります。

![StandardNormalDistribution1x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675901/752db662-963e-ac9d-33c4-f7a51babf7eb.png)

`normalDistributionInverse`関数は、`normalDistribution`関数とは逆に、水色部分の面積を`x`とした場合の横軸の値を返します。

![StandardNormalDistribution2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675901/32a02261-4097-0eef-2c8b-76f091559b7d.png)

# ソースコード

標準正規分布の信頼区間、信頼係数（信頼度）の算出処理を実装しました。
[normalDistribution](https://dlang.org/phobos/std_mathspecial.html#.normalDistribution)関数、[normalDistributionInverse](https://dlang.org/phobos/std_mathspecial.html#.normalDistributionInverse)関数を使用しました。

``` d:sample1.d
import std.stdio;
import std.mathspecial;

real getConfidenceCoefficient(real ci)
in ( ci >= 0.0 )				// Confidence interval
{
	auto y = normalDistribution(ci);
	return ( y * 2.0 - 1.0 );
}

real getConfidenceInterval(real cc)
in ( cc >= 0.0 && cc <= 1.0 )	// Confidence coefficient
{
	auto y = cc / 2.0 + 0.5;
	return ( normalDistributionInverse(y) );
}

void main()
{
	for ( auto ci = 1; ci <= 3; ci++ ){
		writefln("%.2f : %.4f", cast(real)ci, getConfidenceCoefficient(ci));
	}
	writeln();
	
	auto arr = [0.85, 0.90, 0.95];
	foreach ( cc; arr ){
		writefln("%.2f : %.4f", cc, getConfidenceInterval(cc));
	}
}
```

## getConfidenceCoefficient

`getConfidenceCoefficient`関数は、横軸の値`x`に対する水色部分の面積を算出します。
言い換えると、信頼区間から、信頼係数（信頼度）を算出することができます。

![StandardNormalDistribution1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675901/d7c20d04-80b2-7411-8eaf-2a643e629674.png)

## getConfidenceInterval

`getConfidenceCoefficient`関数は、水色部分の面積`x`に対する横軸の値を算出します。
言い換えると、信頼係数（信頼度）から、信頼区間を算出することができます。

![StandardNormalDistribution2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675901/07757812-92c4-397d-8b9b-b0e591b609ce.png)

# コンパイル、実行結果

実行結果は、以下について算出しています。

* 信頼区間を-1.0～1.0、-2.0～2.0、-3.0～3.0とした場合の信頼係数はいくらか。
* 信頼係数が、85%(0.85)、90%(0.90)、95%(0.95)となる信頼区間の上限はいくらか。

``` text:コマンドプロンプト
D:\Dev> dmd sample1.d

D:\Dev> sample1
1.00 : 0.6827
2.00 : 0.9545
3.00 : 0.9973

0.85 : 1.4395
0.90 : 1.6449
0.95 : 1.9600
```
laravel backgroud 非同期処理

laravelで非同期処理をしたい。

:::note alert
非同期処理は、なぜか動かなかったり、止まったりするので、
使わない方が良い。
ということで、以下非推奨
:::


2つのテーブル作成

```jobs.sql
CREATE TABLE `jobs` (
  `id` bigint(20) NOT NULL,
  `queue` varchar(255) DEFAULT NULL,
  `payload` longtext DEFAULT NULL,
  `attempts` tinyint(4) UNSIGNED DEFAULT NULL,
  `reserved_at` int(11) DEFAULT NULL,
  `available_at` int(11) DEFAULT NULL,
  `created_at` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```

```failed_jobs.sql
CREATE TABLE `failed_jobs` (
  `id` bigint(20) NOT NULL,
  `uuid` varchar(255) NOT NULL,
  `connection` text NOT NULL,
  `queue` text NOT NULL,
  `payload` longtext DEFAULT NULL,
  `exception` longtext NOT NULL,
  `failed_at` timestamp NOT NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```

```/app/Jobs/Background.php
<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Log;

class Background implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    protected $data;
    public $tries = 2;//2回までリトライ

    /**
     * Create a new job instance
     *
     * @return void
     */
    public function __construct($data)
    {
        //
    }

    /**
     * Execute the job.
     * @return void
     */
    public function handle()
    {
        //

        sleep(3);
        Log::debug("ひどうきおけ".time());
        return true;
    }
}


```

```HogesController.php

use App\Jobs\Background;

class HogesController extends Controller
{
    public static function test(request $request)
    {

        $user = [];
        Background::dispatch($user);
        Background::dispatch($user)->delay(now()->addMinutes(3));//3分後に処理してね

//略

```

しかし、まだこれでは非同期になっていない。
sync ってのを database に変更

```.env

QUEUE_CONNECTION=database

```

これでとりあえず非同期処理完了。

まずは、/hoges/testにアクセスしてjobsテーブルにjobが貯まるか確認。

確認したら

`php artisan queue:work`

で ちゃんと処理されていくか確認

処理されるのであればバックグラウンド処理をしよう。

:::note alert
注意
cron に登録するとサーバーパンクするのでcronにしてはいけない。
:::



# 常駐させる

```
nohup php artisan queue:work --daemon &
//ログを残したい場合
//nohup php artisan queue:work --daemon > ./storage/logs/laravel.log & 
```

`nohup: ignoring input and appending output to 'nohup.out'`と表示されても問題ないのでOK

# 常駐削除

```
ps -ef |grep artisan
//username 20423 17965  0 12:01 pts/0    00:00:00 php artisan queue:work --daemon

kill 20423
```

`OK`

キャッシュが残って全然反映されないので

```
php artisan cache:clear
php artisan queue:work --daemon 再度やる

//デバッグ完了後
nohup php artisan queue:work --daemon &

```

って感じでしっかりやったほうが良い。
常駐されぱなっしで background 処理を更新しても反映されないので一度止める必要がある。


# おまけ
作られるテーブル名がわからん場合は

テーブル名がわからない場合は
`databasee / migrations` 以下を見ればなんとなくテーブル構造がわかる。

を見ればなんとなくわかるよ。

nohup: ignoring input and appending output to ‘nohup.out’
と出てもエラーじゃないので無視すればOK
【Athena】failed to satisfy constraint: Member must have length less than or equal to 262144 というエラーメッセージ

## Athenaにはクエリの長さの制限がある

Athenaでクエリ実行時に

```
failed to satisfy constraint: Member must have length less than or equal to 262144
```

というエラーメッセージが発生しました。これはエラーメッセージそのままなんですが、SQLの長さが262144文字以下である必要があるからです
参考：[Amazon Athena でクエリ文字列の最大長を大きくするにはどうすればよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/athena-query-string-length/)

この制限はサービスクォータで緩和することもできないため、何かしら対処する必要があります。
ギリギリ超えたのであれば、スペースや改行を減らすだけでも対応可能です。
あとはリンクにある通り、サブクエリなどをviewにすることでも対応できます。

## 自分の場合は
ちょっとしたクエリを、UNION ALLしまくっていた結果発生しました。
本来であればUNION ALLしなくてもいいSQLにも改善できたのですが横着した結果発生しました。
よっぽどのことがない限りひっからない制限だと思います。
【 Javaの条件式について 】

現在Javaを独学で学習中のため、自分への刷り込みを目的としての投稿になります。

## 条件式では「 = 」ではなく「 == 」
初心者が陥りやすいところで、条件式を書くときは「 == 」を使用する。
例：
```java
○ initial == "田中"
✖️ initial = "田中"
``` 

## 文字列を比較する時の書き方
Javaでは、条件式のなかでString型の変数や文字列を比較する場合特別な書き方をする。
```java
○ if (str.equals("夕日")){....}
✖️ if (　str == "夕日"){....}
```

⚠︎仮に == を使用してもコンパイルエラーにはならず、時々変な動きをするというタチの悪い動きをする。

## Javaの賢い話(短絡評価)
```java
if (age >= 18 && age == 5){...}
```
という条件式があり、ageの内容が1の場合、
上の条件式の左辺のみ評価した時点でfalseが確定するので、右辺は無視する。
このようなJavaのふるまいを`短絡評価`という。



以上本日の刷り込みでした。
WindowsでXAMPPを使っていてMySQL WorkbenchをインストールするとMySQLが起動できなくなった

# イントロダクション
以前まで、サーバーサービスはエックスサーバーを利用することが多かったのですが、最近ではAWSのLightsailを利用することが多くなってきました。

LightsailではMySQLを使用する → UIが必要になってくるので、下記のマニュアルに従って「MySQL Workbench」をインストールすることに。
https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-connecting-to-your-mysql-database

すると、、、

# XAMPPのMySQLが起動しなくなった
下記のような表示が出てきてMySQLが起動しなくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532969/05978e39-5305-d278-e772-9374b9d30872.png)

さて、どうしようか。。

# 試してみてダメだったこと

・MySQLの再起動
・パソコンの再起動
・XAMPPのMySQLのポートを「3306」などに変えてみる（一応できたけど、関連するプログラムの全ての設定を変えないといけないのでできれば避けたい。）

いろいろなサイトを参考にしながら、いろいろ試してみたけど、どうやら主な原因は「ポートの競合」らしい。

# 結論

合計3時間ほど格闘しましたが、結論としては「MySQL Workbench」をインストールした際に、同時に「MySQL Server」をインストールしたことが原因でした。

いや、より正確にいうと、インストール時に「3306ポートはすでに使われているので他のポート番号してください」というエラーが出て先に進めなかったので、わざわざXAMPPのMySQLを停止して、何も分からず「3306」設定で無理やり「MySQL Workbench」をインストールしたことが原因でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532969/a85bf80d-50be-0ef0-bc0c-7967a08e0245.png)

この「MySQL Server」はしかも、パソコン起動時にも同時に起動するそうなので、XAMPPでMySQLを開くことができなかったんですね～。

# 直すには

MySQLを利用するローカルサーバーを、今までどおりXAMPPで利用するならば、「MySQL Server」をアンインストールしてしまいましょう。

手順は以下のサイトが分かりやすかったです。

[Windows11](https://www.fmworld.net/cs/azbyclub/qanavi/jsp/qacontents.jsp?PID=4611-3131&rid=282#:~:text=%E3%80%8C%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%80%8D%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E5%8F%B3%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF,%E6%A9%9F%E8%83%BD%E3%80%8D%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82&text=%E3%80%8D%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97%E3%80%81%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C,%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%80%8D%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97%E3%81%BE%E3%81%99%E3%80%82 "Windows11")
[Windows10](https://askpc.panasonic.co.jp/beginner/guide/ten07/7018.html "Windows10")

それか、諸事情があれば「MySQL Server」を停止しましょう。

停止の手順は「Windows プログラム 停止」などで調べると出てくるので、調べてみてくださいね。

この記事でサクッと解決していただければ幸いです。
vimで.tsファイルを開いた時に'redrawtime' exceeded, syntax highlighting disabledが出たときの対処

## 概要

vimで .ts のファイルを開いて作業をしていると
`'redrawtime' exceeded, syntax highlighting disabled`
と表示されてvimが固まってしまうことがあります。

syntax　を off にすると現象は発生しなくなるのですが、
それはそれで困るので解決方法を調査しました。

## 解決策

.vimrcに

```
set re=0
```

を記載することで解決。
いくつか同じ悩みを抱える人がいるので、解決しないこともあるかもですが、
一旦は自分は上記で解決しました。
AWS CLI 「us-east-1」で s3api CreateBucketできない（Udemy SysOps問題集① ラボ試験問題2 / 質問72）

Udemy SysOps問題集① ラボ試験問題2 / 質問72にてS3バケットのレプリケーション先を作成する問題があるのですが、解答のコマンドが通りませんでした。この記事ではその原因を追求していきます。

## 該当コマンド

```
aws s3api create-bucket --bucket 【バケット名】 --region us-east-1 --create-bucket-configuration LocationConstraint=us-east-1
```

**エラー**

An error occurred (InvalidLocationConstraint) when calling the CreateBucket operation: **The specified location-constraint is not valid**

そんなリージョンないよ！的なことがかかれてます...

## 検証
①us-east-1以外のリージョン（ap-northeast-1）で作ってみる→できた
②マネコンからus-east-1にバケット作って見る→できた

これらからs3apiコマンド限定で、
**us-east-1**が通っていないということがわかりました。

## 調査
ちょっと調べてるみると良記事を発見。
https://jpcodeqa.com/q/ba30fc10a5c454acda2fae5eee2198fc

検証で作ったバケットに対してそれぞれリージョンを取得してみると...

**ap-northeast-1**のバケット
```
$ aws s3api get-bucket-location --bucket 【バケット名】
{
    "LocationConstraint": "ap-northeast-1"
}
```

ほうほう　そうだよね

**us-east-1**のバケット
```
aws s3api get-bucket-location --bucket 【バケット名】
{
    "LocationConstraint": null
}
```

なるほど...
LocationConstraint では取得できないみたいですね。

公式ドキュメントにも記載がありました。
>As shown above, the value of the LocationConstraint member in the output JSON is the expected region of the bucket, eu-central-1. **Note that for buckets created in the US Standard region, us-east-1, the value of LocationConstraint will be null.** As a quick reference to how location constraints correspond to regions, refer to the AWS Regions and Endpoints Guide.

https://aws.amazon.com/fr/blogs/developer/leveraging-the-s3-and-s3api-commands/

ラボ試験の問題はハンズオンする人多いだろうから、
通らないコマンドが解答のこの問題はちょっと不親切かもしれないですね...
MessagingAPI LINE絵文字を使ってみよう！

# はじめに
MessagingAPIでLINEbotを作る過程でLINE絵文字の使い方について記録します。

# 実装

```javascript
const TOKEN = "自分のアクセストークン";
const LINE_PUSH_ENDPOINT = "https://api.line.me/v2/bot/message/push";

const HEADERS = {
  "Content-Type": "application/json; chrset=UTF-8",
  "Authorization": "Bearer " + TOKEN //Bearerの後ろの半角スペースを忘れずに！
}

//pushメッセージ用処理
function postMessage() {
  const postData = {
    "to": "自分のuserId",
    "messages": [{
      "type": "text",
      "text": "送信するメッセージ $", //$の部分に絵文字が適用される
      "emojis": [
        {
          "index": "10", //textの先頭からプレースホルダーのindex　今回の場合10
          "productId": "5ac21e6c040ab15980c9b444", //絵文字のproductId
          "emojiId": "002" //絵文字のId
        }
      ]
    }]
  }

  const params = {
    "methods": "POST",
    "headers": HEADERS,
    "payload": JSON.stringify(postData)
  };

  UrlFetchApp.fetch(LINE_PUSH_ENDPOINT, params);
}
```

`emojis.productId`は、のプロダクトIDを、`emojis.emojiId`は絵文字下にある番号を記載します。

![スクリーンショット 2022-02-27 15.43.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381376/ec298c06-ed93-64d0-3306-6ca9f9eac99c.png)
こちらから使用可能な絵文字を確認できます。

https://developers.line.biz/ja/docs/messaging-api/emoji-list/#line-emoji-definitions


`emojis.index`は、`text`プロパティに記載したプレースホルダー`$`のindex番号を記載します。テキストの先頭を0とするため、今回の例でいうと10となります。
※プレースホルダーとindexの数値が一致しない場合`404 Bad request`となるようです。


複数の絵文字を使いたい場合は、使用する数だけプレースホルダーと絵文字用のオブジェクトを用意すればできます（最大個数：20個）。

使ってみるとこんな感じになります。
![絵文字使用例.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381376/6c18d9f5-9599-9885-805d-64d698230418.jpeg)

# まとめ
今回はMessagingAPIでLINE絵文字の使い方についてまとめました。
文字だけでもいいですが、絵文字があると雰囲気も変わるのでぜひ使っていきたいと思います。


# 参考
https://developers.line.biz/ja/reference/messaging-api/#text-message

https://developers.line.biz/ja/docs/messaging-api/emoji-list/#line-emoji-definitions