OmniAICreator/Qiita-1.07M huggingface dataset:
Salesforce App bulider：Salesforce Identity

###Salesforce Identityとは
SAML や OpenID Connect、OAuth、SCIM などのオープンスタンダードに準拠したアイデンティティソリューションです。
・使用すれば、1 回のログインで多くの接続アプリケーションにアクセスできます。
####シングルサインオン
シングルサインオン (SSO) を使用すると、ユーザは 1 回ログインすれば、再びログインすることなく他のアプリケーションやサービスにアクセスできます。
　※[私のドメイン] が必要です
####ソーシャルサインオン
ソーシャルサインオンを使用すると、ユーザはGoogleなどのソーシャルアカウントで確立されたログイン情報を使用してアプリケーションにログインできます。そのアプリケーションはGoogleログイン情報を受け入れ、ユーザは別のアカウントとパスワードを作成する必要がありません。

Customer 360 Identity
ソーシャルサインオンで、お客様はどこでも、どの設備でもアクセス可能になります。

組織またはサイトのユーザ登録をカスタマイズする場合に重要な考慮事項
　登録をサポートする他のビジネスプロセスを立ち上げつこと。
SAMLプロトコル（協議）：シングルサインオンを可能にする協議、XMLベース、
SAMLアサーション（主張）：
　　サービスプロバイダから請求⇒
　　「アクセス可能でしょうか？（XMLフォーマット）」⇒
　　ID プロバイダで検証（チェック）⇒
　　可能の場合「はい」の答えをサービスプロバイダに返却する
　　<font color="Red">※Google Account別のウェブサイトを利用して、自動アカウント作成の場合、Gmailの登録承認確認アクションみたい</font>
OAuth2.0プロトコル：アプリケーション間のセキュアなデータ共有を可能にするために使用するオープンプロトコルです。
OpenID Connectプロトコル：OAuth 2.0 上に認証レイヤを追加して、ユーザ情報を安全に交換できるようにします。

###SSOのSAMLフロー
1.ユーザが Salesforce にアクセスしようとします。
2.Salesforce が SSO 要求を認識し、SAML 要求を生成します。
3.Salesforce が SAML 要求を元のブラウザにリダイレクトします。
4.ブラウザが SAML 要求を外部 ID プロバイダにリダイレクトします。
5.ID プロバイダがユーザの ID を検証し、ユーザ認証を含む SAML アサーションをパッケージ化します。
6.ID プロバイダが SAML アサーションをブラウザに送信します。
7.ブラウザがアサーションを Salesforce にリダイレクトします。
8.Salesforce がアサーションを検証します。
9.ユーザがサインインされて、Salesforce にアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424429/921278f4-4f5d-bbd3-12be-980e432dfe87.png)
Ruby case文についてまとめてみた

##case文とは？

「if」文では複数の条件式を組み合わせて複雑な分岐を行う事ができますが、一つの値に対して複数の候補の中で一致するものを探すような場合には「case」文を使用すると便利です。

下記は
ハイフン付きの電話番号が与えられたとき、その電話番号を入力し終えるまでに「ダイヤルが回る必要のある総距離を計算するプログラム」となってます。
例えば、 9315-35-7398 という電話番号であれば、 9 を入力するために 11+11=22 、 次に 3 を入力するために 5+5=10 、 ... となり合計で距離 22+10+...=146 だけダイヤルが回ります。

![スクリーンショット 2021-04-02 9.25.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918117/b74b72dd-4909-ac0f-af29-d7943fa1f254.png)

```rb

number = [9315-35-7398]
number1 = number.delete("-").chars.map(&:to_i)
total = 0

number1.each do |n|
  case n
      when 0
        n = 12
      when 1
        n = 3
      when 2
        n = 4
      when 3
        n = 5
      when 4
        n = 6
      when 5
        n = 7
      when 6
        n = 8
      when 7
        n = 9
      when 8
        n = 10
      when 9
        n = 11
      else
      end
 total += n * 2
end

puts total


=> 146
```


caseに指定した「対象」がwhenに指定した条件のどれかに当てはまる場合、それにあてはまった処理を実行します。
もしどれにも当てはまらない場合は、elseにある処理が実行される流れとなります。
Jestでテストを書こう

フロントのテスト本当に難しいですよね、しっかり書いている人を見ると尊敬します。

最近新規のサービスを開発していて、フロントはNuxtで作っているので、storeやcomponentのテストを書いてはいるものの、Nuxtの知見やフロントのテストコードを書くことがあまりなかったので悪戦苦闘しています。

新規というところもあって自由に設計できるので、自動化できる部分は自動化して楽をしたいと思い、CI/CDを行っています。

## CI/CDのアーキテクチャ
![CICD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525769/3ab8b7d8-8347-9c81-5133-3294849433c8.png)

## テストコードの進捗
カバレッジ100を目指しテストコードを書いていますが、進捗はなかなか厳しいです。

### stores
Tests:       8 skipped, 630 passed, 638 total
![スクリーンショット 2021-03-26 23.28.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525769/14758eac-b8b4-9ad1-4cc7-cb251946624c.png)
Branchの数値が悪いけど、630 個テスト書いて、まあまあかなと思っています。

### components
Tests:       303 skipped, 417 passed, 720 total
![スクリーンショット 2021-03-26 23.33.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525769/50c5378d-353f-70ae-616f-192fd33e22c6.png)
componentのテストが思った以上に難しくて進捗が悪いです。417/720 道のりはまだ長い、もっと頑張らないと日々思う

## 最後
まだまだ課題が多いいフロントのテストですが、デブレやバグを無くすため、日々頑張っています
Kubernetes OpenID Connect Helperまとめ(RBAC)

KubernetesはOpenID Connectを使用したユーザのアクセス制御が行える．

[認証 | Kubernetes](https://kubernetes.io/ja/docs/reference/access-authn-authz/authentication/)

これを実現するために，Kubernetes OpenID Connect Helper(以下，Helper)とよばれるソフトウェアが使われる．Helperは，OIDC Providerとのやり取りや，`$HOME/.kube/config` の更新や作成を簡単にする．

以下では，OSSのHelper実装を紹介する．

# kubelogin

調べた範囲では，最も使われているPluginだった．HTTPサーバを起動するので，認証後の作業が不要で簡単に使える．

| 項目 | 値 |
| --- | --- |
| Star | 508 |
| 認証後の作業 | 不要(HTTPサーバが代理) | 

[int128/kubelogin: kubectl plugin for Kubernetes OpenID Connect authentication (kubectl oidc-login)](https://github.com/int128/kubelogin)

# k8s-oidc-helper

CLIの操作が必要なので，手間がかかる．GoogleをOIDC Providerにするとjsonファイルを渡すだけで `.kube/config` が生成されるのは便利だった．

| 項目 | 値 |
| --- | --- |
| Star | 189|
| 認証後の作業 | 必要(WebブラウザのコードをCLIに貼り付け) | 

[micahhausler/k8s-oidc-helper: Helper tool for authenticating to Kubernetes using Google's OpenID Connect](https://github.com/micahhausler/k8s-oidc-helper)

# dexter

kubeloginと同じアプローチを採用している．kubeloginでもGitHubをOIDC Providerとするときは，dexterを組み合わせることを推奨していた．

| 項目 | 値 |
| --- | --- |
| Star | 108 |
| 認証後の作業 | 不要(HTTPサーバが代理) | 

[gini/dexter: dexter is a Kubernetes OIDC helper with as much automation as possible](https://github.com/gini/dexter)
[Python]デフォルト引数の順序制限

関数にデフォルト引数を持たせる場合、
左側の引数（a）にのみデフォルト引数を持たせることはできない。


```Python:Python
# SyntaxError
def foo(a=1, b):
    return a + b
```
```Python
SyntaxError: non-default argument follows default argument 
```
このような場合は、
**デフォルト引数を右にずらす**

```Python:Python
def foo(b, a=1):
    return a + b
```
```Python
>>> foo(2)
3
```

また、下の方法も使える。

```Python:Python
def foo(*, a=1, b):
    return a + b
```

ただし、呼び出し時に変数指定が必要

```Python
>>> foo(b=2)
3
>>> foo(2)
TypeError: ...
```

参考：
https://qiita.com/scapegoat_11_/items/fafea1a0c7daaf43849e
https://docs.python.org/ja/3.6/reference/compound_stmts.html#index-21
AWS CodeBuildのビルド成果物をCodeArtifactにMavenで登録する

# 目的

CodeCommit上のJavaソースをCodeBuildでビルドして生成されたjarをCodeArtifactに登録します。CodeCommit、CodeBuildおよびCodeArtifactは設定済とします。

# ソース

```
buildspec.yml
pom.xml
settings.xml
src
```

## buildspec.yml

```
version: 0.2

phases:
  install: {}
  pre_build:
    commands:
    - export CODEARTIFACT_TOKEN=$(aws codeartifact get-authorization-token --domain ${CODEARTIFACT_DOMAIN} --domain-owner ${CODEARTIFACT_DOMAIN_OWNER} --query authorizationToken --output text)
  build:
    commands:
    - cp settings.xml ~/.m2/
    - mvn deploy
  post_build: {}
```

## pom.xml

```
  <distributionManagement>
    <repository>
      <id>codeartifact</id>
      <url>${env.CODEARTIFACT_URL}</url>
    </repository>
  </distributionManagement>
```

## settings.xml

```
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
  <servers>
    <server>
      <id>codeartifact</id>
        <username>aws</username>
        <password>${env.CODEARTIFACT_TOKEN}</password>
      </server>
    </servers>
</settings>
```

# CodeBuild

環境変数をビルドプロジェクトに設定します。

変数|値
---|---
CODEARTIFACT_DOMAIN|CodeArtifactリポジトリ名
CODEARTIFACT_DOMAIN_OWNER|CodeArtifactドメインオーナー
CODEARTIFACT_URL|CodeArtifactリポジトリURL

これでビルドを実行するとCodeArtifactに登録されます。
PHP Laravel 環境構築してみた【Mac OS】

#はじめに

今回は会社の勉強会のためにLaravelで開発を行うことになりました。
これからLaravelの環境構築をしていく方の参考になれば幸いです。

#開発環境

・MacOS　Catalina バージョン10：15：5



#手順
#Homebrewのダウンロード
というわけで早速ダウンロード
・・・・の前に一度確認

```
$ brew -v
Homebrew 2.4.5
```

インストールされているとこの様にバージョンが出ます。
自分のPCで環境構築したことある人なら基本的に入ってます！

ない場合は以下のコマンドでインストール

```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

インストールしたら先ほどのコマンドでダウンロードできているか確認

```
$ brew -v
Homebrew 2.4.5
```
これでHomebrewはOK！


#Composerのダウンロード
ComposerはPHPのパッケージ管理ツールと呼ばれるもので、必要なライブラリを一括でインストールできるものです。Rubyだとgemですね！
では下記コマンドでインストール

```:ターミナル
$ brew install composer
```

インストールできたら下記コマンドで確認

```:ターミナル
$ composer -v
```
こんな感じに出力されます。

```:ターミナル
$ composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
```

インストールしたら確認するクセをつけておきましょう！

#PHPのインストール
MacにはPHPが標準で入っているので飛ばしてOK

#Laravelのインストール

ではではメインディッシュのLaravelをインストールしていきます。

```:ターミナル
$ composer create-project "laravel/laravel=6.*" sample_project
```
composer create-project –prefer-dist laravel/laravel= <バージョン> <プロジェクト名>でLaravelのインストールしています。

しばらく待機・・・・・・・・

完了したら確認しましょう！

ですがこのままでは確認できません。

```:ターミナル
$ laravel -v
zsh: command not found: laravel
```


作成したディレクトリへ移動
僕の場合は/Applications/sample_project
ここで下記コマンド

```:sample_project
$ php artisan -V
Laravel Framework 6.20.2
```
これでインストールは完了です！

#ローカルで確認
では早速ローカルで確認していきましょう。
下記コマンドを実施

```:sample_project
$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>
```

ブラウザで
http://127.0.0.1:8000
にアクセスします。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3338313830382f34346338623861332d333930302d323561332d316165662d6238313839633633396336382e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1263774/81ae0402-937d-1920-00ad-b8837f2d355a.png)

おなじみの画面が登場。
お洒落で結構好きですww


以上になります！
ガンガン開発を進めていきましょー！！
バスケット分析(アソシエーション分析)ので使う値(特にリフト値)に関する備忘録

バスケット分析で使われる用語については[ここ](https://qiita.com/atabo/items/7e07bcbff4d2fc023ffe)に非常によくまとまっていて非常に重宝した。

ただ、それぞれの値（特にリフト値）について実感を持って理解できなかったので、実数を使ってこれらの言葉がすっと頭に入ってくるように備忘録をまとめる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356023/55e8a7af-3358-5af4-8dc6-e92b66a6e439.png)
ただ単にセットになることが多い組み合わせではなく、
セットであるがゆえに買われやすさが上がるものがリフト値でわかる。

例にあるように
クミンは買う人は少ないけど、カレーとセットになると買われることが上がると言える。
逆にカレー＆豚肉は数としては多いけど、クミンと比べるとカレーだから豚肉が買われるというわけではない、と言える。
KotlinでViewを動的に動かす

<h1>KotlinでViewを定義する

```kotlin
val button: Button     =   Button(this)
//  変数名  Viewの種類      左と同じ
```
これによりxmlファイルでボタンを設置したときのようにActivity上にButtonを置く準備ができた
<h1>xmlファイルでLainerLauputを定義する

```xml
<LinearLayout
            android:id="@+id/linerlayout_parent"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" />
```
これは、普通にXMLファイルでViewをドラッグアンドドロップするだけでよい
この時初期状態では、LinerLaoutにidがついていないので、コードか、GUI上で好きなidを設定しましょう

<h1>addViewでlinerlayoutにViewを追加する

```kotlin
linerlayout_parent.addView(button)
//自分でつけたid            Viewの変数名
```
これでlilnerlayoutにbuttonが追加される

<h1>buttonの背景の設定方法

```kotlin
button.setBackgroundResource(R.drawable.group10)//バックグラウンドに画像をセット
//                           drawableフォルダーにセットした画像を選択
```

<h1>buttonにテキストを追加する

```kotlin
button.text = "サンプル"
```


```kotlin
val string :String = "サンプル"
button.text = string
```
どちらでもできるが、文字列を変数として扱ったほうが、動的にテキストを変えやすい

<h1>文字列の一部の文字の大きさを変える

```kotlin
string.setSpan(RelativeSizeSpan(1.9f),       8, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)//文字列の一部の大きさを変える
//                              文字の大きさ 大きさを変える文字のスタート位置と終了位置を何文字目かで指定
```

<h1>文字列の一部の色を変える

```kotlin
string.setSpan(ForegroundColorSpan(Color.RED), 57, 74, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)//文字列の一部の色変更
```

<h1>Viewの高さ、幅を指定する

```kotlin
button.layoutParams.height = 100//高さを指定
button.layoutParams.width  = 100//幅を指定
```
パッケージとアクセス制御

無名パッケージに属するクラスは、同じ無名パッケージに属するクラスからしかアクセスできない。
例えば、下記の2つのクラスは同じパッケージ（無名パッケージ）に属しているためOfficeクラスからPersonクラスを使う事ができる。

```java
class Person{}

public class Office{
    Person p;
}

```

しかし、下記のように仕様を変更し明示的にパッケージ宣言したクラスから、無名パッケージに属するクラスにアクセスしようとするとコンパイルエラーになる。

```java
class Person{}

```

```java
package ex4; //明示的にパッケージを宣言する

public class Main{
    public static void main(String[] args) {
        Office office = new Office();
    }
 }
```
aws cli s3 syncした時の課金について（AWSサポート回答の共有）

# 背景

- S3上に大量のファイル（画像やログ）を配置しています。
- このファイルを定期的にAWS以外のサーバにバックアップしています。
    - S3は堅牢（イレブン・ナイン）なのは認識していますが、プログラムミスや誤操作による削除への備えです。
- バックアップは`aws cli`の`s3 sync`コマンドを使っています。

# この記事は何?

上述した「`sync`コマンドを使ったAWS外サーバへのバックアップにより発生する課金(基準）」についてAWSサポートに問合せした結果を共有しています。

# 質問

```
上記操作に伴う課金は以下の認識であってるでしょうか?

Q1.差分ファイルのデータOUT（初回はファイル数分、それ以降は追加されたもののみ）
Q2. s3 syncリクエストは内部的には、listリクエスト1回分?
```

# 回答

スッキリしました。1000オブジェクトごとにLIST APIが1回カウントされるんですね。

```
下記の4点が上記操作に伴って発生し、課金対象となります。

1. バケットに含まれる1000オブジェクト毎に、1 LIST APIリクエスト
2. コピーされるオブジェクト毎に、1以上のS3 GET APIリクエスト
3. S3 標準 - 低頻度アクセス、S3 1 ゾーン - 低頻度アクセス、S3 Glacier、S3 Glacier Deep Archive ストレージにオブジェクトが保管されている場合は、データの取り出し
4. Amazon S3 からインターネットへのデータ転送（アウト）

データ転送（アウト）の料金はご認識の通り、差分ファイルのみに対して発生いたします。
また、各リクエストやデータ取り出し、データ転送料の具体的な課金体系については、下記ドキュメントにて詳細ご確認いただけますと幸いです。

▼Amazon S3 の料金
https://aws.amazon.com/jp/s3/pricing/?nc1=h_ls
```
[JS] IntersectionObserver


IntersectionObserver
---
Intersectionは物体の交差
Observerは監視するもの
を意味します

・ある要素が画面上に見えたとき、アニメーションを開始する

【要素の交差】と【要素の監視】の役割を果たします

---
new IntersectionObserverにcallback関数を渡してあげて、初期化処理を行います


```
const child = document.querySelector('.child');
const io = new IntersectionObserver(cb);
io.observe(child);
```

ioに、監視したい対象のDOMを登録することによって、監視をスタートします
（io.observe(　) ＋　要素）


対象の要素が画面内に入ったとき、画面外に出て行くときに
IntersectionObserverの監視によって、cbというcallback関数が毎回呼び出されます

---

```
const child = document.querySelector('.child');
const cb = function(entries, observer) {
  entries.forEach(entry => {
    if(entry.isIntersecting) {
      console.log('inview');
      observer.unobserve(entry.target);
    } else {
      console.log('out view');
    }
  });
}
const io = new IntersectionObserver(cb);
io.observe(child);
```

isIntersectingがtrueのときは、指定の要素が画面内に入ったときを指します
[![Image from Gyazo](https://i.gyazo.com/40f98692ca3764db99f4a763dc2d1460.png)](https://gyazo.com/40f98692ca3764db99f4a763dc2d1460)
画面をスクロールすると、指定の要素が画面に入った時と出た時に処理が行われます

---
observer.unobserve(entry.target);とすると、読み込んだタイミングで監視をストップします
[![Image from Gyazo](https://i.gyazo.com/e99b545f7e8bcc7ab57765c05442932c.png)](https://gyazo.com/e99b545f7e8bcc7ab57765c05442932c)
１度observer.unobserve(entry.target);が読み込まれたタイミングでout viewもinviewも付かなくなります

---
entry.targetに対してinviewというclassを、画面内に入ってきたときは付与し、
画面外に出たときは削除するロジックを書きます

```
const child = document.querySelector('.child');
const cb = function(entries, observer) {
  entries.forEach(entry => {
    if(entry.isIntersecting) {
      entry.target.classList.add('inview');
    } else {
      entry.target.classList.remove('inview');
    }
  });
}

const io = new IntersectionObserver(cb);
io.observe(child);
```

先程のコードは、あくまでconsole.log(　)で出力していただけなので、
こちらの書き方を使うことが多いでしょう

---

画面内に入ってきたとき
[![Image from Gyazo](https://i.gyazo.com/b17665db1742a64338ce88da51137a4f.png)](https://gyazo.com/b17665db1742a64338ce88da51137a4f)

画面外に出たとき
[![Image from Gyazo](https://i.gyazo.com/a3e06a19c5d349055b6f2701effbec0b.png)](https://gyazo.com/a3e06a19c5d349055b6f2701effbec0b)

よく使うオプション
---
まず、オプションをテンプレートリテラルで定義してあげて、
optionsをIntersectionObserverの第２引数に格納します

```
const options = {
  root: null,
  rootMargin: "-500px 0px 0px 0px",
};

const io = new IntersectionObserver(cb, options);
io.observe(child);
```

####root
rootというプロパティには、交差対象としたい親の要素を設定することができます

####rootMargin
rootMarginというプロパティは、"-500px 0px 0px 0px"としてやると、対象の交差ポイントから下に500px下がったところが交差ポイントになります
marginと同じ要領で、デフォルト値は0pxです
値は、pxである必要があります、px以外はconsoleでエラーになるので注意しましょう

---
rootMarginの-300pxを下でも定義すると、

```
const options = {
  root: null,
  rootMargin: "-300px 0px",
  threshold: 0
};

const io = new IntersectionObserver(cb, options);
io.observe(child);
```

[![Image from Gyazo](https://i.gyazo.com/e2ef194df5128d13dccbb5c7fd2ef0bb.gif)](https://gyazo.com/e2ef194df5128d13dccbb5c7fd2ef0bb)
上から下に300pxの位置、下から上に300pxの位置で交差できるようになります

####threshold
thresholdは「敷居」という意味です
デフォルト値は0です

※意味は理解できないのでパスします
【Python】try文がcatchされず正常終了されたのかをtry-elseで判定する方法（備忘録）

try文がcatchされたのか、catchされず（Exceptionが発生せず）正常終了されたのかを判定する方法。
他の言語のクセでbool型で判定しがちだったけどこれは便利。

# try-else
```python
hoge = 1

try:
    hoge = hoge / 10
except Exception as e:
    print('エラーだよ Exception:', e)
else:
    print('正常終了したよ')
finally:
    print('try文が終了したよ')
```

```
正常終了したよ
try文が終了したよ
```

ちなみに`hoge = 'hoge'`だと

```
エラーだよ Exception: unsupported operand type(s) for /: 'str' and 'int'
try文が終了したよ
```

# bool型での判定
よく書きがちだった方法

```python
isError = False
hoge = 1

try:
    hoge = hoge / 10
except Exception as e:
    isError = True
    print('エラーだよ Exception:', e)
finally:
    if not isError:
        print('正常終了したよ')
    print('try文が終了したよ')
```

以上
イベントリスナーを削除する方法【javascript】

### 設定したイベントを削除するには

```
要素.removeEventListener('イベント名', 関数名);
```
上記のように記述することで設定したイベントリスナーを削除できる。

### removeEventListenerが反映されない
useCaptureの値が違う時は、removeEventListenerが効かないとのこと。
参考にさせて頂いたサイト：https://pisuke-code.com/js-not-work-removeeventlistener/
　　　
useCaptureとは、removeEventListenerの第三引数にあたる値のこと。
書き方としては、trueかfalseを記述するそうですが、何も書かなかった場合はデフォルトでfalseが設定されるとのことでした。

これがtrueの時は、windowからイベントが発生した要素に行きつくまでのイベント通知が有効になり、falseの時はイベントが発生した要素から、windowに行きつくまでのイベント通知が有効になるそう。

参考にさせて頂いたサイト：https://note.affi-sapo-sv.com/js-addeventlistener-usecapture.php#title2

useCaptureのことを調べてみましたが、理解ができないところが多かったので深堀りをして改めて補足させて頂くかもしれません。
SpringFoxでデフォルトのパラメータを追加

たとえば、contollerには定義しないがアプリケーション固有のheaderを渡す必要があり、それをswagger-uiで表示したい場合、```Docket#globalRequestParameters```を使用する。

```gradle:build.gradle
plugins {
  id 'org.springframework.boot' version '2.4.4'
  id 'io.spring.dependency-management' version '1.0.11.RELEASE'
  id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
  compileOnly {
    extendsFrom annotationProcessor
  }
}

repositories {
  mavenCentral()
}

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-web'
  compileOnly 'org.projectlombok:lombok'
  developmentOnly 'org.springframework.boot:spring-boot-devtools'
  annotationProcessor 'org.projectlombok:lombok'
  testImplementation 'org.springframework.boot:spring-boot-starter-test'
  
  implementation 'io.springfox:springfox-boot-starter:3.0.0'
}

test {
  useJUnitPlatform()
}
```

```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import springfox.documentation.builders.ExampleBuilder;
import springfox.documentation.service.ParameterSpecification;
import springfox.documentation.service.ParameterType;
import springfox.documentation.service.RequestParameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

@RestController
@SpringBootApplication
public class Application {
	@GetMapping("/hoge/{id}")
	public String hoge(@PathVariable String id) {
		return "hoge";
	}

	@PostMapping("/foo")
	public Foo foo(@RequestBody Foo foo) {
		return new Foo();
	}

	@Bean
	public Docket docket() {
		Docket docket = new Docket(DocumentationType.OAS_30);

		List<RequestParameter> parameters = new ArrayList<>();
		parameters.add(new RequestParameter(
				"name",
				ParameterType.HEADER,
				"description",
				false,
				false,
				false,
				new ParameterSpecification(null, null),
				new ExampleBuilder().id("id").build(),
				Collections.emptyList(),
				0,
				Collections.emptyList(),
				0));
		docket.globalRequestParameters(parameters);

		return docket;
	}

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}
```

上記のような```Docket```のbeanを作成すると以下のような画面表示になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31934/99652a6a-8ee5-16d6-70ef-10e334c9baee.png)
輪読会：第4回 Javaで学び直すオブジェクト指向プログラミング

こんにちは。
株式会社アクシスのヤマウチです！
弊社の福岡オフィスでは、木金の昼休みの時間を利用して輪読会を行っています。
現在は[Software Design 2021年3月号](https://www.fujisan.co.jp/product/1535/b/2076902/)の「Javaで学び直すオブジェクト指向プログラミング」を読んでいます。

今回は第4回の記事になります。
第4回は第1章 オブジェクト指向プログラミングのメリットから第1章の最後まで読みました。

※以下、オブジェクト指向プログラミングをOOPと略します

## オブジェクト指向プログラミングのメリット

ここでは「再利用性」という言葉が出てきました。
そこがこの節の議論ポイントで色々話したので、それについて書いていこうと思います。

まず結論として、再利用性は**汎用性が高い**とニアリーイコールで、汎用性が高いからこそ、再利用が可能となる。というような感じの結論になりました。
個人的な感想としては、「再利用性」ってワードはOOPの中では聞いたことがなかったので、今回、僕らが出した結論である汎用性の方がしっくりくるなぁと言う感じですが、もしかするとこの章を書かれた「谷本心さん」の意図を、汲み取りきれてない可能性もあるかもしれません。
ただ、この章に関してはOOPのかなり基礎的な部分を説明しているので、対象読者を考えた時に、汎用性というワードよりも「再利用性」というワードの方がわかりやすいかもな、とも思わなくはないです。
OOPを今以上に、全然知らなかった頃の気持ちを思い出せないので、わかりませんが。。。w

あと思うのは、再利用性っていうのを真に受けすぎて、超絶抽象的なクラスになってしまうのはクラスの役割がぼんやりしてしまうので、役割は明確でありつつも再利用性が高いクラスを作る必要はあるかと思います。

言うは易く行うは難し、ですが。。。汗

## なぜオブジェクト指向プログラミングを学ばなくてはならないのですか？

話し合いの中で出てきたのは、「OOPを学ぶことで、よりフレームワークを正しく使える」「業務仕様に特化したものを作る際に、知識がないと拡張がしづらい」というような話が出てきました。
何が正解で、何が間違っているということはないかなぁと思いつつも、結局のところは**今後のため**だと思います（個人の見解です）。
むちゃくちゃ曖昧なことを言いましたが、ここでいう今後というのはエンジニア個人の今後ではなく、そのプログラムで作成したアプリケーションなどの話です。
いわゆる保守性というやつですかね。

OOPをより理解した方と、そうではない方の作ったアプリでは、全く同じ動きを実現していたとしても、その中身であるコードは全然違ったものになっていると思います。
そのアプリが将来に渡って、拡張などが行われないことが確約されているのであればそれで問題ないと思いますが、たいていのアプリには今後も拡張や、仕様変更などがあると思います。
そういったものが積み重なるごとに、保守性という観点では大きな開きが出てくると思います。

そういったこともあり、OOPに限らずさまざまな設計手法を学ぶことで、技術的負債を極力減らしていく必要があると思います。
それが「なぜオブジェクト指向プログラミングを学ばなくてはならないのですか？」の答えかなぁと、個人的に思います。

## 犬や猫とオブジェクト指向

これはコラムですが、これについても少し話し合ったので、書いていこうと思います。
[https://togetter.com/li/1462076](https://togetter.com/li/1462076)
こちらでも色々書かれていますが、超ざっくりと見た感じ「わかりづらい」という感想が多いですね。
弊社の研修中の社員も「わかりづらい」って言ってましたね。

元も子もないことを言うと、業務などで実際に使ってみないと理解できないと思いますw
その前段としてどうするかって話だと思いますが、
「・・・」
浮かんでないですね。

話し合いの中で出た教育方法？としては、
まずは犬猫などの簡単な例でざっくり概要を理解してもらった上で、自分の好きなものを使って抽象化してみてもらう。
おそらくどうすれば良いかわからないところが出てくるので、そういった部分を一緒に考えていく。
というアイディアも出ました。

結局のところ訓練しようぜ！って話ですよ。
訓練。

今日一、どうでもいい話ですが、6年弱自衛官をしていたので訓練というワードは、まあまあ好きです(￣ー￣)ｂ

## おわりに

この輪読会の議論の時間では、
結構メインぎみにしゃべらせて貰ってて、何か間違いや補足があれば先輩がフォローしてくれる。
という様な感じでやらせて貰ってます（そうしていこうって決めたわけではないですが）。
普段、自分が学んだことをアウトプットする時間というのは、そこまで多くはないので、非常にいい会だなと思っています（自分本位）。

弊社 @fumiya-uehara の「[輪読会をやってみて](https://qiita.com/fumiya-uehara/items/2a0e521b725ef0a48e19)」という記事にもありますが、読み進めることよりも理解することに重きを置いています。
極論、「前回のこの部分、もう一回教えて欲しいんですけど」で話しあいが始まって、それだけで輪読会の時間が終わっちゃうっていうのもありだと思っています。
今後もどんどん議論して、理解を深めて行けたらいいなぁと思っています。

以上！
新人プログラマが実践した５つの習慣

#はじめに
もうすぐ新社会人として（あるいは異業種からの転職で）プログラマやSEになられる方、あるいは、今現在インターンされている方向けに少し経験談をお話ししたいと思います。

アドバイスができるほど、経験豊富ではありませんが、新人SEから抜けた今だからこそ、新人の頃を振り返って記録として残そうと思いました。

上記の方々には、こういう考え方もアリだよ！程度の参考にしていただければと思います。

#新人になる前にやったこと

### 【プログラムの流れを理解する】

ロジックを考えるにあたって、**プログラムの流れ**は重要な要素だと思います。

そしてそのロジックは、業務上プログラムを書く上でもっとも大事な部分になります。

このロジックが適切な流れで書かれていないと、データ不整合・速度低下の原因になったり、
そもそも実現したい内容が上手くできなかったりします。

なので、プログラムの流れを理解するという勉強は基礎として最初に学びました。

いわゆる「フローチャート」で学んだ知識が今につながっています。

新人になってプログラムの流れは、すでに組まれているシステムのコードを見て学びました。

他人のコード（特に金銭が発生しているシステムのコード）はとても有益です。

学生時代に書かれていたコードは参考にはなりますが、経験にはなりません（でした）。

なので、アルバイトやインターンで働いている方は、その勤務先で書かれているコードを色々見てみてください。

勉強になりますよ。

---

### 【一つの言語に慣れる】

学生時代、アルバイト時代、新人時代、現在、趣味。

ここまで色んな言語に触れてきました。（COBOL・C・Java・C#・Ruby・Swift　etc...）

その中で僕は、Android開発をしていることもあり、Javaに深く慣れることを努力しました。

一つの言語を極めなくても、**慣れる**ことが大事です。

慣れると何がいいかというと、

- どの言語でも基本的なものは変わらないので可読性が上がる。
  - 仕組みや使い方が違っても、言語間の根本的なものは何も変わりません。なので、何がしたいのかが理解しやすくなります。
  - 例えば、If文やFor文とかは、書き方が違うだけでやることは一緒ですね
  - Web言語も例外ではないです。やることは同じです。

- デバッグ時に何が原因でエラーが起きているのかを理解する速度が速くなる。
  - 何がダメなのかは直感的に分かるようになります。（またこのミス、、、と思うこともしばしば）


ちなみに、PHPも業務上触れる機会があったので触れましたが、知見が無いので書くことは現時点ではできませんが読むことはできます。（この部分はどうしたいんだな～という感じです。）
なので、追記したり、修正することは多少できます。

---

### 【コードを見ない日を作らない】

これは正直どちらでもいいのですが、基本、毎日コードを見たり書いたりしてます。

仕事柄、見ない日はないのですが、仕事とは別に趣味の範囲でコードを書いたり、

調べ物をしたりしています。

前述した通り、他人のコードでも参考にはなるので見るのもオススメです。


別にコードと友達になる！というわけではありませんが、見ない日を作ると、

コード勘が薄れそうで怖いから、習慣でやっているだけです。

---

### 【なんでも良いので何か作る】

これはとても大事です。

何かアプリでもシステムでも良いので、自分で仕様定義して、

DBリレーションを考えたり、UIを考えたりするというのは、この仕事にとってとても大事な感性になります。

この感性が足りないと、仕事でも、これで何を実現したいのか、使用する上で何が都合悪いのか、

このUIで本当にお客様に使いやすいのか、無駄なデータ関係を作っていないか etc...

いろんな物事が実際の仕事の「フィードバック」に繋がってきます。

「フィードバック」はとても大事です。これが浅いと自分の評価がはっきりと言って落ちます。

まずは、あなたが今欲しい・必要なものを**自分で**作って見ましょう。

公開しなくてもいいし、ただ単純に自分が作りたいものを作るだけです。

それが最終的に「アイデア」に繋がります。

因みに今から僕たちが考えるアイデアは大抵あります。存在します。誰かが実現しています。

それでも自分なりにそのアイデアをアレンジして組み上げていくのは大いにアリだと思います。

なので、まずは「制作」しましょう。

---

### 【プログラミングテストをひたすら受ける】

Paizaなどがオススメです。ランクAは試験時間が長いので、ランクB辺りを周回する方が経験になります。

---
### 番外編

- 資格を取る
  - 国家資格を取るのが一番良いです。国家資格という看板が分かりやすいし、何より試験金額が安い。
      -  他のベンチャー試験は、大抵、５桁いきます。（学生さんは例外かもしれません。）
      -  社会人になってからはかなりコツコツにどうしてもなるので、学生の間に取っておいた方がベストです。 
  - 基本情報　→　応用情報　の流れがオススメです。
  - ITパスポートはあまり意味がないかも。（それくらいはわかってて欲しいと思われる）

- 英語を理解する
  - ドキュメントが英語ってことはザラにあるので、覚えておくことに越したことはない。
  - 大抵のトラブル解決方法は、「Qiita」か「StackOverFlow」である程度解決するので、覚えておいて損はない。
  - 後々を考えてわかるようになった方がいい。いやマジで。


# 終わりに

経験豊富ではないので、自分なりに今までやってきたことを踏まえて、
身になったと思ったものをピックアップしてみました。

あくまで一例なので、自分達なりのやり方で切り開いていくことが大事ですが、

僕たちの時代には、今ほど情報が流通していたわけではなく、自分達なりにやるしかありませんでした。

そうできたのは、家族の支えなどがあったからでしたが、この記事がそっと支えになってくれるような記事になってくれれば嬉しいです。

自分自身が嫌になることが多い職業ですが、それでも何かを作り上げるのはとても楽しい職業なので、是非、頑張って行きましょう！

長文失礼しました。これから色々OutPutしていきます。（サボり癖が治らない、、、）
[自分メモ] 直前のディレクトリに移動する方法

#概要
macのターミナルからディレクトリ移動する場合は`cdコマンド`を利用しますが、直前までいたディレクトリに移動する方法があることを知ったので自分用にメモします。

#方法
-いれるだけ

```
cd -
```

```terminal
Users kke1229$ cd kke1229/Desktop/hogehoge
hogehoge kke1229$ cd -
~ kke1229$ pwd
/Users
```
【Azure】AKSにおける kubectl 更新手順【AKS】

## はじめに
Azure Kubernetes Service の利用を開始する際、公式ドキュメントのチュートリアルに従えば、kubectl のインストールは ```az aks install-cli``` で行う。しかし、バージョンを指定せずにこのコマンドを実行すると、サポートされない kubectl のバージョンを使うことになる可能性がある。AKSのサポートポリシーは、以下となっている。

> kube-apiserver バージョンに対して 1 つ新しいまたは古い kubectl のマイナー バージョンを使用します。これは、kubectl の Kubernetes サポート ポリシーに一致しています。
> https://docs.microsoft.com/ja-jp/azure/aks/supported-kubernetes-versions#supported-kubectl-versions


本記事では、AKSでの kubectl バージョン更新方法を紹介する。


## 手順

まずは、kubectl と Kube-apiserver のバージョンを確認する。

```sh
kubectl version
```

以下に上記コマンドの出力例を示す。

> $ kubectl version
> Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.1", GitCommit:"c4d752765b3bbac2237bf87cf0b1c2e307844666", GitTreeState:"clean", BuildDate:"2020-12-18T12:09:25Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
> Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.10", GitCommit:"62876fc6d93e891aa7fbe19771e6a6c03773b0f7", GitTreeState:"clean", BuildDate:"2020-10-16T20:43:34Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}

__Client Version__ が kubectl のバージョン、 __Server Version__ が Kube-apiserver のバージョンである。この例では、kubectl のマイナーバージョンが kube-apiserver のマイナーバージョンと 2 以上乖離しているため、サポート対象外の組み合わせとなっている。 ```az aks install-cli``` をバージョン指定せずに実行すると、最新の kubectl バージョンがインストールされるため、このようなことが起こりがちである。

以下のコマンドで、クライアント端末の kubectl バージョンを更新する。

```sh
az aks install-cli --client-version 1.18.10
```

既存の kubectl を削除しておくなどの事前作業は不要である。
権限が足りないというエラーが出る場合は、```sudo``` を付けて実行する。

> $ kubectl version
> Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.10", GitCommit:"62876fc6d93e891aa7fbe19771e6a6c03773b0f7", GitTreeState:"clean", BuildDate:"2020-10-15T01:52:24Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}
> Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.10", GitCommit:"62876fc6d93e891aa7fbe19771e6a6c03773b0f7", GitTreeState:"clean", BuildDate:"2020-10-16T20:43:34Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}

基本的には上記コマンドだけで kubectl のバージョンを更新することができる。しかし ```sudo``` をつけた場合の kubectl バージョンが更新されていない場合がある。その場合は、/bin/kubectl を確認する。 /bin/kubectl が存在し、更新日時が古い場合は、/usr/local/bin/kubectl を /bin/kubectl にコピーする

```sh
ls -l /usr/local/bin
ls -l /bin/ | grep kube
# /bin/kubectl が存在し、更新日時が古い場合は、/usr/local/bin からコピーする
sudo cp /usr/local/bin/kubectl /bin/kubectl
sudo kubectl version
```


## 参考
1. [Azure Kubernetes Service (AKS) でサポートされている Kubernetes のバージョン](https://docs.microsoft.com/ja-jp/azure/aks/supported-kubernetes-versions)

1. [Kubernetes version and version skew support policy](https://kubernetes.io/docs/setup/release/version-skew-policy/)

1. [az aks install-cli](https://docs.microsoft.com/ja-jp/cli/azure/aks?view=azure-cli-latest#az_aks_install_cli)
【初心者でもわかる】cssが効かない時に試したい10の事

#どうも7noteです。cssが効かないと思ったときに試したい10の事

プログラミングはトライアンドエラーが大事だとよく聞きますが、プログラミング言語でなくスタイルシート言語である**cssもトライアンドエラーを繰り返す事がとても大事です。**

でも分からないものはやっぱりわからない。そんな**cssが効かなくて困った時に試せるような事をまとめましたので、お試しあれ。**

誰かの役に立てればと、思います。

## 1.サーバーにファイルはあがっているかチェック

もしサーバー上に構築しているのであれば、**cssファイルをちゃんとサーバーにアップロードしましたか？**
上がってないファイルは読み込めないので効きません。

## 2.誤字脱字をチェック

プロパティは正しく書けていますか？**1文字でも誤字や脱字があると効きません**。コロン（ : ）だとおもったらセミコロン（ ; ）を描いていたりはよくあることです。逆もしかり。見直してみましょう。

## 3.要素名・クラス名・id名が正しいか確認する

HTMLを見直すのがめんどくさくて**クラス名を手打ちすると間違える原因になりやすい**です。クラス名やid名はできるだけHTMLからコピペするようにしましょう。


## 4.タグの入れ子構造と、cssの入れ子構造が違ってないか確認

よく見ると**HTMLとcssで入れ子構造(ネスト)がズレてる**ことは、そこそこの経験者でもたまにやってしまうことがあります。
もう一度よく見直してみましょう。

## 5.そのcssは本当に効くものなのかチェック

中には**インライン要素にしか効かないcss、ブロック要素にしか効かないcssがあります。**
「プロパティ名」で検索して、解説サイトを見てみましょう。

## 6.そもそもcssが読み込めているか確認する

どんなに書いても**cssファイルを読み込んでなければ反映されません。**ブラウザで右クリックして「ページのソースを表示」から、cssを読み込んでいる場所から読みたいcssが読み込めているか確認しましょう。


## 7.重複して指定していないか確認する

**cssには優先順位があります。**同じ要素に対してcssを指定していたとしても、指定の仕方で優先されるcssがあります。
もし同じ要素に同じプロパティを指定していた場合、優先順位が高い方が反映されます。

CSSの優先順位参考記事：https://qiita.com/tatane616/items/22d86d89307cb08bffc5

## 8.ウィンドウサイズによって切り分けていないか確認する。

レスポンシブサイトを作る際にスマホ専用などのcssを書く場合があります。もし触っていた箇所がスマホ用のcssが書かれているところなら、どんなに触ってもpc表示の時には反映されません。**`@media screen and ()`を指定しているところを触ってないか**、確認してみましょう。

## 9.ないと思うけど、コメントアウトしてる？

いや、ないとは思うけどね。でも、たまに**コメントアウト外し忘れてたり**するので。

## 10.とりあえず色をつけてみる

**要素がどっかいったら、背景色や文字にわかりやすい色をつけてみましょう。**borderでも構いません。大きさが指定されてないかもしれないし、思ってもないところに表示されるかもしれません。色をつけて要素がどこにあるか、また**そもそもCSSが効いているかチェックしてみましょう。**

## まとめ

cssをやる上で、効かないなんてことはしょっちゅうあるものです。とくに始めたての頃はcssのルールやクセを覚えるのにかなり時間がかかるものですし、経験しないとなかなか覚えられない事も多いです。

ゴリゴリcssかけますってひとも、昔は何度もトライアンドエラーで挑戦してcssをマスターしているはずです。
何度もトライして、ゆっくり1つずつ覚えていきましょう。

**それでもわからなかったら、他の人に聞いてみましょう。**独学でやってる人も、質問箱的なところで聞けば優しく教えてくれるので怖がらずにどんどん質問してみましょう。
私も人に聞いてるときに説明しながら頭の中で整理されて「あ、わかった。」と勝手に自己解決することもあります。人に話すって大切ですね。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
PhpStormからAthenaに接続するための設定方法

# はじめに
PhpStormのDBクライアントからAthenaに接続するための設定方法についてまとめました

# 環境
PhpStorm 2020.3.3
Build #PS-203.7717.64, built on March 16, 2021

# 設定方法
大まかに以下のステップで設定します
1. Drivers に Athena のドライバーを追加します
2. 1で追加したドライバーを Data Sources に設定します

## 1. Drivers に Athena のドライバーを追加します

＋ボタン、Driverの順で選択します
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103774/582ec8ab-bbac-dbe0-99dd-b693884c2f85.png)

Nameに名称を指定します。Athenaのドライバーなので、 Athenaにしています
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103774/be8c5278-15cc-b5a8-5e2a-794209db85f3.png)

+ボタン、Provided Driver、Athena、Latest stable の順で選択します
最後は Latest stable でなくても問題ないです
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103774/ea77755c-8fe6-3d86-1700-710d3135a4d5.png)

Switch to ver. 2.0.16 をクリックします
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103774/2005116d-c7a9-326a-fce8-877de6b45272.png)

`com.simba.athena.jdbc.Driver` を選択して、Apply もしくは OKボタンをクリックします
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103774/3d6fba74-2898-82e7-6b69-fa9cceedaf3c.png)

以上で Athenaドライバーの設定が完了です
続いて、Data Sources で設定します

## 2. 1で追加したドライバーを Data Sources に設定します
Databaseを表示し、+ボタン、 Data Source、 Athenaの順で選択します
※ Athenaは1で追加したドライバーとなります
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103774/17dcaae6-e720-761e-83ad-361f8f796e72.png)

以下の項目を入力して、 Test Connectionボタンをクリックして接続できることを確認します

- Name: Data Sourceの名称を入力します
- User: AWSのIAMユーザーの `Access key ID` を入力します
- Password: AWSのIAMユーザーの `Secret access key` を入力します
- URL: jdbc:awsathena://athena.<REGION>.amazonaws.com:443
    - リージョンが `ap-northeast-1` の場合、 `jdbc:awsathena://athena.ap-northeast-1.amazonaws.com:443` と入力しています

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103774/ebcf11da-462b-0f62-2d08-1b744aaf0026.png)

Advancedタブをクリックして、以下のNameとValueを追加してOKボタンをクリックします

- Name: S3OutPutLocation
- Value: s3://【S3のクエリ結果を格納しているバケット】/
    - バケット名が s3-backet の場合、 `s3://s3-backet/` となります

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103774/b5017909-b8e3-5fd6-293c-17f6fe4c0c74.png)


# まとめ
DataGrip や Intellij IDEAから Athena に接続する方法はありましたが、PhpStormからは見つけることができず、ここでまとめてみました。
DataGrip や Intellij IDEAは参考リンクにまとめていますので、参考にしてみてください

# 参考

- [AthenaにIntellij IDEAから接続してみる](https://dev.classmethod.jp/articles/connect-to-athena-with-intellij-idea/)
- [DataGripからJDBC経由でAthenaを利用する](https://qiita.com/teriyakisan/items/e88c8107835a11378a28)
おそらく史上最速のFlutter環境構築(10行で終了)

#はじめに
Flutter2.0がリリースされたので、環境構築から、サンプルコード実行までわずか10行で完成です。

なおIntellijでFlutterが使いたい方は、こちら↓
https://qiita.com/maccadoo/items/a4acfdcd94c47104b02c

|Soft          |Ver    |
|:-:           |:-:    |
|Ubuntu        |20.04.1|
|Flutter       |2.0.3 |
|Dart         |2.12.2 |
|VScode       |1.55.0 |

#環境構築
Flutter,Dart,VScode&日本語化が、6行で完了。

```
sudo snap install flutter --classic
sudo snap install code --classic
code --install-extension ms-ceintl.vscode-language-pack-ja
code --install-extension dart-code.flutter
flutter config -enable-linux-desktop
flutter upgrade
```

#サンプルコード実行
こいつも4行で終了。

```
mkdir counter
cd counter
flutter create .
flutter run -d linux
```

![Screenshot from 2021-04-01 22-43-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253664/fb5286cf-2b64-414e-b0af-625cd9a7c7a6.png)


#おわりに
コピペすれば、ダウンロードも含めてカップヌードルと競えるくらいになったか?
【Androidを使い熟す！】Androidとは？

#####※Android技術者認定にも役に立ちます！

#Androidとは
<details><summary>こいつがAndroidだ！</summary><div>
![Qiita](https://msp.c.yimg.jp/images/v2/FUTi93tXq405grZVGgDqG7eSqeg-yzVL6oYhcIKEU_4MMwLG2bL0DIm8EP1iCM-fNSdlxbTXsBHyH_NmNqBiXDGqMn7PFtj0i_Lv2boOsxGbJzqCcaJajk8ZrT7Dlys97M8wm2RDU82vmIFN1Pv4Rcwa8ZjOw_YW7Vso_ni05XF_K4C6sxtZA4hTpt_tUSJhUQFCneLWqUcV653DMsdtPHsQGSLGNV5Ux3O-7Umb37BdOtwazenZL28lcbZ0mtCzhCMMART10XB2GlT736NDkA==/35601f35ec07e588c4eac862244536a6.jpg?errorImage=false "Qiita")
</div></details>
<details><summary>説明</summary><div>
携帯端末用のプラットフォーム
</div></details>
#プラットフォーム（Platform）
<details><summary>説明</summary><div>
動かすための環境、土台
※環境を持ったスマホとか開発に必要な機能ツールとかSDKなど
</div></details>
ライセンス選びに困ったらこのサイトを見よう！

本記事は[ChooseALicense.com](https://choosealicense.com/)をもとに、ライセンスの選び方を紹介するものです。一部をかいつまんで翻訳しています。

[ChooseALicense.com](https://choosealicense.com/)はオープンソースのプロジェクトです。正確で、偏見を排除した、簡単に理解できるオープンソースライセンスに関する情報を提供します。

[Githubへのリンクはこちらです。](https://github.com/github/choosealicense.com)

## 既存のプロジェクトに貢献したり、プロジェクトを拡張したりする場合

この場合、コミュニティに推奨されるライセンスを選びます。もしライセンスが存在しないなら、既存のプロジェクトの管理者にライセンスのつけるようお願いしましょう。

## シンプルにしたい、かつみんなに使ってもらいたい場合

MIT Licenseを選びます。MIT Licenseでは著作権の保護とライセンス表示を義務付けるだけです。MIT Licenseが付与されたプログラムに変更を加えたり、商用利用したり、それを別のライセンスの下で頒布することも可能です。

Babel、.Net Core、RailsなどがMIT Licenseを利用しています。

## プログラムの改善を主な目的としたい場合

GNU General Public License v3.0(GNU GPLv3)を選びます。GNU GPLv3はMIT Licenseよりも強い制限をかけています。

ソースコードや、プログラムの変更箇所の公開を義務付けたり、同一ライセンス(GNU GPLv3)での公開を義務付けたり、著作権保護やライセンス表示を義務付けたりしています。

これらのハードルを越えることで、変更や頒布、商用利用などが可能になります。

Ansible、Bash、GIMPなどがGNU GPLv3を利用しています。

## 日本語の資料

以下の資料は日本語で書かれており、ライセンスの選択の参考になると思います。

https://coliss.com/articles/build-websites/operation/work/choose-a-license-by-github.html

https://qiita.com/tukiyo3/items/58b8b3f51e9dc8e96886

## [ChooseALicense.com](https://choosealicense.com/)がいい理由

いくつかのサイトでライセンスについて勉強していたのですが、[ChooseALicense.com](https://choosealicense.com/)は他サイトよりも正確な表現を使っていると感じました。

例えばサブライセンスについて詳しく言及するサイトは少ないです。しかし本サイトはサブライセンスに関する説明が明確でした。

一般的に「GNU General Public License v3.0(GNU GPLv3)はサブライセンスを禁止している」という表現が使われることがあります。これは正しいのですが、[本文](https://www.gnu.org/licenses/gpl-3.0.en.html)とズレがあります。

より正しく表現すると、「GNU GPLv3ライセンスで公開されたプログラムに変更を加えた場合、そのプログラムはGNU GPLv3のライセンスの下公開される必要がある」ということを記述しています。

[ChooseALicense.com](https://choosealicense.com/)は法律やライセンスについて詳しくない人がまず参照するべきサイトだと感じました。

## あとがき

ライセンスについて調べていくうちに[ChooseALicense.com](https://choosealicense.com/)が最も分かりやすいと思い、ここに紹介させていただきました。内容に不正確な部分がありましたらご指摘お願いいたします。

[ChooseALicense.com](https://choosealicense.com/)にはより多くの解説が掲載されています。他のライセンスの解説や、ソフトウェア以外のライセンスについての解説、ライセンスを設定しないとどのような不利益があるのかなどについて記事が書かれています。

より詳しい情報については是非元のサイトをご覧ください。
Qiita APIを使って取得した投稿記事の履歴をkintoneに読み込んで集計してみた

Qiita APIをシェルスクリプトからCSV出力して、kintoneアプリに読み込み集計してみました。

# 環境

* mac OS
* Bash
* curl
* jq
* awk
* kintone

# 試して分かったこと

* Qiitaの記事作成日時のフォーマットはkintoneの日時フィールドにそのまま読み込みできます。

# Qiitaの記事をCSVに出力する方法
シェルスクリプトをいくつか組み合わせて実装しました。

ソースは下記リポジトリに上げています。
https://github.com/sy250/getqiitaitems

簡単に説明

$ tree -a -L 1
.
├── .env　# Qiita APIで利用するアクセストークンを記述した設定ファイル
├── get_authenticated_user.sh　# ユーザー情報取得用スクリプト
├── get_authenticated_user_items.sh # 投稿記事取得用スクリプト
└── get_qiita_items.sh　# 起点となるシェルスクリプト

.envファイルには、Qiitaのユーザー設定から取得できるアクセストークンを記述します。

```
ACCESSTOKEN='your qiita access token'
```

実行はプログラムの起点となるget_qiita_items.shを実行するだけです。
実行が成功するとCSV形式で標準出力に表示されるので、ファイルにリダイレクトするなりして保存します。

# kintoneによる集計
アプリを作成して、前段で出力したCSVファイルをアプリに読み込みします。
アプリに読み込みしたら、グラフで集計します。

## kintoneアプリ

![スクリーンショット 2021-04-01 20.20.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/683c3e93-e353-8215-ad64-d60669bc4ca2.png)

## 集計グラフ 1
![スクリーンショット 2021-04-01 20.21.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/39a0068a-5c68-a895-99ad-ffb29ef13f9a.png)

## 集計グラフ 2
![スクリーンショット 2021-04-01 20.22.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/c9ad14de-000a-be1c-6853-9f949fb8d6d0.png)

# ダッシュボード風の表示

作成したグラフをダッシュボード風に表示させます。
![スクリーンショット 2021-04-01 20.19.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/468217bb-750f-1c85-c6b2-0f9206a39e70.png)

## 設定方法

### 1 スペーススレッド本文の設定
![スクリーンショット 2021-04-01 20.18.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/2a903a5f-80f4-e0e1-6149-a1d9b09811e8.png)

### 2 アプリの貼り付け
スレッド本文の設定にて、アプリ貼り付けを選択します。
![スクリーンショット 2021-04-01 20.18.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/e0833e02-ab27-1ad9-d44e-047b833a3520.png)

貼り付けるアプリから作成したグラフを選びます。
![スクリーンショット 2021-04-01 20.19.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/e8f5be0f-2d59-e5ba-c91a-4f0c2168735d.png)

振り返ると、2020年後半〜記事が書けてないですね。。。2021年は2020年ぐらいは投稿したい。

# 参考

https://qiita.com/sy250f/items/c35aa4b1e8324c2bf21e

https://jp.cybozu.help/k/ja/user/app_settings/report/set_report.html

https://jp.cybozu.help/k/ja/user/space/using_space/paste_app.html
【Python】row(column)_dimensions.groupメソッドを使って行や列をグループ化する。

pythonを使用してExcelファイルの操作を勉強しています。
本日の気づき(復習)は、グループ化に関してです。
pythonでExcelを操作するため、openpyxlというパッケージを使用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/336c75db-69d4-161a-a5f7-2edb0dec6981.png)

上記のようなブック「表」を、集計結果だけの

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/2762c7da-bd4d-8538-6189-dfc604c4c751.png)

- D列のグループ化
- 5～18、20～35行をグループ化

された表に変更したいです。

# row(column)_dimensions.groupメソッド

```python:行のグループ化
ws.row_dimensions.group(開始行, 終了行,
                        outline_level=グループ化の改装,
                        hidden=折りたたむ場合はTrue)
```

```python:列のグループ化
ws.column_dimensions.group(開始列, 終了列,
                           outline_level=グループ化の改装,
                           hidden=折りたたむ場合はTrue)
```

行(列)のグループ化を行うには
Worksheetのrow(column)_dimensions.groupメソッドを使います。

# 最終的なコード

```python
from openpyxl import load_workbook

wb = load_workbook('表.xlsx')
ws = wb.active

for row_no in [(5, 18), (20, 35) ]:
    ws.row_dimensions.group(*row_no, outline_level=1, hidden=True)

ws.column_dimensions.group('D', outline_level=1, hidden=True)

wb.save('表_グループ.xlsx')
```

今回、行のグループ化は二か所行いたかったので
for分で繰り返し処理をしています。
プログラム入門者向け練習問題

# はじめに

この記事は、初期研修を終えて現場に配属された新人たちに課している練習問題を紹介するものです。
主に研修で学んだプログラミング言語への理解度の確認とそれに伴うフォローや、プログラミングへの取組み姿勢、クセの把握等を目的に行っているものですが、毎年なかなか好評なのでおすすめしても良いかなと思いました。

各問題の出題意図、回答例(C#)を別記事に起こしました。
問題自体は特定のプログラミング言語に限定したものではありませんが、私が主にC#の開発に携わっていますので回答例はC#のみのご紹介となります。

https://qiita.com/haruka_kotani/items/72b4845e8185f1baf3a7

## 想定回答者

* プログラミング研修を修了した新人プログラマ
* 新しい言語を学ぶプログラミング経験者

# 問題

以下の課題を指定のプログラミング言語を用いて回答せよ。
記載が無い事項は自由に判断して良い(ただし、意図を問われた場合に説明できること)。

注意）全体を通して4時間程度で終了するように着手すること(時間をかけすぎない)

## 1. Fizz Buzz 問題
1 から 100 までの数について、**Fizz Buzz 問題** を解くプログラムを作成せよ。
ただし、以下の2通りの方針でそれぞれ作成すること。

(1)　可能な限り、少ない行数となるように工夫すること。
(2)　可能な限り、操作ごとにメソッドを分割し、適切な名称を付与すること。

※ **Fizz Buzz 問題** : 以下の通り

* 1 から順に番号を出力する
* ただし、3 の倍数 の場合は "Fizz"、5 の倍数 の場合は "Buzz"、両者の公倍数の場合は "Fizz Buzz" を数字の代わりに出力する


## 2. 選択問題
(1) ～ (4) のうち、2つ以上作成せよ。

(1)　1 から 100 までの数のうち、**素数**のみ出力するプログラムを作成せよ。

※ **素数** : 1 より大きく、正の約数が 1 と 自身 のみである 自然数


(2)　引数で与えられた 年 が **うるう年** であるか判定するプログラムを作成せよ。
　ただし、引数に 負数 を与えた場合はエラーとする。

※ **うるう年** : 以下の通り判定すること

* 西暦年 が 4 で割り切れる場合、うるう年とする
* ただし、西暦年が 100 で割り切れる場合、うるう年では無い
* ただし、西暦年が 400 で割り切れる場合、うるう年とする


(3)　以下の要件を満たすプログラムを作成せよ。

* 01 ～ 43 までの 43個の数字 から 異なる6個 を選択し、出力する


(4)　引数で与えられた **元金**、**年数**、**年利率** を元に **支払総額**、**月ごとの支払額** を出力するプログラムを作成せよ。
　ただし、以下の条件に従うこと(簡単にするため、支払による元金の減少は考慮しない)。

* 1年ごとに **元金** に **年利率** をかけた金額を **利息** として算出し、**元金** と **利息** の合計を 1円単位に四捨五入した金額 を **翌年の元金** とする(複利法)
* 最終的な元金と利息の合計を 年数 × 12ヶ月 で割り、1円単位に四捨五入した金額 を **月ごとの支払額** とする
* **月ごとの支払額** を 年数 × 12ヶ月 でかけた金額を **支払総額** とする
* 全ての計算は10進数で行い、不要な丸め誤差が発生しないようにすること


## 3. 一行掲示板
以下の要件を満たす「一行掲示板」を作成せよ。

1. コマンドラインアプリとする。
2. 実行時に引数を与えなかった場合、投稿された書き込みを全てコンソールに出力する。
3. 実行時に引数を 1つ 与えた場合、その内容を 投稿文 として登録する。<br />
   登録後、投稿された書き込みを全て出力する。
4. 実行時に引数を 2つ以上 与えた場合、エラーとする。
5. 投稿された書き込みは、以下の書式でコンソールに出力する("△" は半角スペース)。<br />
   `投稿日時("YYYY/MM/DD HH:MM:SS"形式)△投稿文`
6. 投稿された書き込みは、投稿日時の降順でコンソールに出力する(新しい書き込みが上にくるようにする)。
7. 投稿された書き込みは、投稿日時 と 投稿文 をCSVファイルとして保存する。
8. 投稿された書き込みは、投稿の都度CSVファイルの末尾に追記する。
9. プログラムは適宜クラス、メソッドの分割を行い、それぞれに適切な名称を付与すること。


以上
【Rails】herokuへのデプロイ

# 完成したアプリをherokuへデプロイするまで
Railsアプリが完成したので、herokuへデプロイして公開したいと思います。
問題なくデプロイできるよう、こちらの[参考記事](https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39#%E6%9C%AC%E7%95%AA%E7%92%B0%E5%A2%83heroku%E3%81%A7%E3%81%AE%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)をもとに細かく記録していきます！

## Railsアプリの準備
### config/routes.rbの設定
config/routes.rbにて、トップページを設定しておく必要があります。

```config/routes.rb
Rails.application.routes.draw do
  get '/top', to: 'home#top'
  resources :posts
  root to: 'home#top' #トップページをhomeコントローラのtopアクションに設定
end
```

### Gemfile,config/datebase.ymlの設定
まず、herokuの本番環境(production)にPostgreSQL(pg)がインストールされているので、その環境に合わせましょう。
Gemfileのgem 'sqlite3'と、書いてある箇所をコメントアウトします。
…ところが、見当たりません！

どうやら、アプリ作成時に

```
$rails new アプリ名 -d postgresql
```

を入力していたことにより、DBがデフォルトでpostgresqlになっていたことが原因だったようです。

今回は問題がありませんでしたが、私の事例に当てはまらない方は[参考記事](https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39#%E6%9C%AC%E7%95%AA%E7%92%B0%E5%A2%83heroku%E3%81%A7%E3%81%AE%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)を参照してください。

### config/environments/production.rbの設定
Railsは本番環境での動的な画像の表示がデフォルトでオフになっています。
画像を表示するために以下の記述をfalseからtrueに変更します。
この記述により、assets以下のフォルダから動的にコンパイルしながらページを読み込みます。

```config/environments/production.rb
  config.assets.compile = true
```

### bin以下のフォルダの設定
rbenvを使用していない方は、binというフォルダの中の全てのファイルの一番上の記述を確認します。ruby 以降にバージョンの数字がある場合は削除し、以下のようにします。

```
#!/usr/bin/env ruby
```

これでRails側の準備は完了です！

## herokuの準備
### 会員登録とCLIのインストール
herokuに会員登録し、CLI(Herokuをコマンドライン上から操作するためのツール)をインストールします。
Macの場合CLIはインストーラを使わず、Homebrewを使いましょう。

```
$brew tap heroku/brew && brew install heroku
```

バージョンが確認できればCLIのインストールは完了です。

```
$heroku --version
heroku/7.51.0 darwin-x64 node-v12.21.0
```

### Railsアプリとherokuの紐づけ
ターミナルからherokuにログインします。

```
$heroku login -i
```

コマンドライン上でログインを求められますので、アカウント作成時のメールアドレスとパスワードを入力してください。
iオプションを付けない場合、ブラウザ上ですすめることになります。

```
Enter your Heroku credentials:
Email: ~~~~~@example.com
Password: **********
Logged in as ~~~~~@example.com
```

ログインしたら、cdコマンドでアプリのフォルダに移動します。そして、次のコマンドを入力します。

```
$heroku create 任意のアプリ名 (文字列はurlになる,何も入れないとランダムな名前になる)
```

なお、このコマンドはherokuとアプリを紐づけるコマンドなので、アプリごとに最初の一回だけ入力すればOKです。

### herokuへのデプロイ
以下のコマンドでherokuへデプロイします。

```
$git push heroku master
```

私の場合、2~3分待たされました（不安になるからﾔﾒﾃ）。
うまくいくと最終部に以下のような記述が。

```
remote:        https://***.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy... done.
To https://git.heroku.com/***.git
 * [new branch]      master -> master
```

このURLが、自分のアプリのURLになります。

### 本番環境(heroku)でのマイグレーション
URLを入力する前に、最後の作業として本番環境でのDBのマイグレーションを行うためのコマンドを打ち込みます。

```
heroku run rails db:migrate
```

ローカル環境で記録されたデータは本番環境とは異なるため、「データが消えた！」とビックリしないように！

これで全て完了しました！お疲れ様でございました！

# 参考
[【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】](https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39#%E6%9C%AC%E7%95%AA%E7%92%B0%E5%A2%83heroku%E3%81%A7%E3%81%AE%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)
[【超入門】基礎から始めるHerokuの使い方（初心者向け）](https://tech-blog.rakus.co.jp/entry/20200813/heroku)
shell scriptの変数と配列

shellscriptを勉強したのでまとめます。
#変数

$n : n番目の引数を格納する。 引数は```.shファイル arg1 ...```のように渡す。

$0 : 自身のパスを格納している。(相対・絶対パスによって値が異なる)。

$@ : 全ての変数が格納されている。

$? : 直前に実行したコマンドの結果(0か0以外)を返す。

$# : 引数の個数を格納。

例えばファイルの中身が以下のようなものだとして、

```variable.sh
#!/bin/bash
echo $2
echo $0
echo $@
echo $#
```
```./variable.sh arg1 arg2```を実行したら、

```
arg2
./variable.sh
arg1 arg2
2
```
となる。
###$?について
```exec.sh
#!/bin/bash
./variable.sh

echo $? 
```
上のようなファイルを作り、```./exec.sh```を実行すると、

```
./variable.sh
0
```
直前に実行したコマンド```./variable.sh```が正常に実行できたので 0 が帰ってくる。
(引数は指定していないから表示はされない)
#配列
作成 : array=('value1' 'value2' ...)
追加 : array[n]='valeu'
削除 : unset array[n]

```array.sh
#!/bin/bash
name=('Taro' 'Jiro' 'Hanako')
name[3]='Saburo'
name[1]='James'
unset name[0]
```
このファイルを実行した場合、
Taro, Jiro, Hanakoが定義される→Saburoが追加される
→JamesがJiroの位置に挿入される→0番目であるTaroが消える。
ということは配列の中身は```James Hanako Saburo```となる。

さらに、

```array.sh
~~ ~~ ~~

echo ${array[@]}  #全ての要素を表示
echo ${!array[@]} #各要素のindex番号を表示
echo ${#array[@]} #配列の個数を表示
```
これを実行すると、

```
James Hanako Saburo
0 1 2 3
4
```
と出力される。

**基本的なものだけまとめました。**
お役にたったら幸いです。
google nest hubで自作レシピを読み上げてくれるようにする

最近、コロナで飲みに行けないので、ホームパーティをよくします。

ホームパーティをするときに料理を作るのですが、料理をしていると手が汚れてしまって、スマホとかパソコンとかでレシピを見たいときに直ぐに見れないですよね。
ちょうど、google nest hubを買ったので、手を使わずに声でレシピを開いたり読み上げてもらったりしたいと思ってやってみました。

# クックパッドにレシピを登録
簡単です。アカウント作ってレシピを書くだけです。
本家のチュートリアルをどうぞ
https://cookpad.com/helps/group/34#help_group_397

# マイレシピに追加
google nest hubで使っているアカウントで、google nest hubではないパソコンかスマホで自分のレシピを検索します。
下の画像のように、"レシピ"のところで自作のレシピが出てくるように検索ワードを工夫します。
出てきたら、矢印が示しているマークのところをクリック。これでマイレシピに登録されます。
※ クックパッドに登録してすぐには出てこなかったです。何日か経たないと出てこない気がします。

![レシピに追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849198/8135452c-24c5-c288-c6cd-58530adbdb63.png)

# マイレシピを呼び出す
google nest hubに向かって、「おーけー、ぐーぐる、マイレシピを開いて」というと、登録されたマイレシピが出てきます。
あとは、読み上げてとか、言えば読み上げてくれます。

私のレシピへのリンクを貼っておきます（笑）
https://cookpad.com/recipe/list/38955459


-------
2021年3月から始めたスマートホーム化はこちらに一覧化しています（2021年5月時点）

https://qiita.com/tosshie/private/738a85184d6cdaf20b3e
VSCode Remote WSL環境をリセットする



# 結論
`~/.vscode-server/`を削除することでRemote WSL環境をリセットできます。
拡張機能や設定はどこかに控えておくと良いです。

```
# とりあえずディレクトリ名だけ変更して控える場合
mv ~/.vscode-server/ ~/.vscode-server2/

# 削除
rm -rf ~/.vscode-server/
```

[こちらの記事](https://selfnote.work/20200824/programming/happens-remotessh-error/)が参考になりました。


# 経緯
VSCodeが壊れた。
正確にはRemote WSLの環境だけGitを認識しなくなりました。
「ソース管理プロバイダーが登録されていません。」と表示されてファイル差分が全く表示されない状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531073/6130bd98-b3d9-d2af-3601-c4736a0853a4.png)

ビルトインの拡張機能を再度有効にすることで解決するらしいという情報を得たが、`@builtin git`で開いても有効化できない！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531073/ec4d0dc0-c404-e283-3509-4782e40acf0c.png)

色々調べた結果VSCodeを初期化するしか無いとなりましたが、VSCodeそのものを再インストールしてもRemote WSL環境は初期化されない！

Remote WSLといっているんだからWSL上になんかしらのファイルがあるだろうと推測してホームで`ls -a`を何気なく叩いてみたら`.vscode-server`というとてもそれっぽい名前のディレクトリを発見

`.vscode-server`について調べたらたしかにVSCodeのRemote設定らしいということで削除したら無事解決しました