OmniAICreator/Qiita-1.07M huggingface dataset:
【ほぼメモ】Scalaの表現力の高さに恐れおののいたJavaエンジニア

トランプを表現するクラスを書いてみた。
こんな書き方できんのかよ...

```scala:Hello.scala
package example

import example.Suits._
import example.ValueHolder._

object Hello {
    def main(args: Array[String]) = {
        println(Ace of Spades)      // すごい
        println(2 of Diamonds)      // とてもすごい
    }
}

sealed trait Suits {
    def emoji: String
}

object Suits {
    object Diamonds extends Suits {
        override def emoji: String = "♦"
    }
    object Clubs extends Suits {
        override def emoji: String = "♣"
    }
    object Hearts extends Suits {
        override def emoji: String = "♥"
    }
    object Spades extends Suits {
        override def emoji: String = "♠"
    }

}

case class Card(
    val suits: Suits,
    val number: Int
) {
    override def toString(): String = {
        val numberString = number match {
            case 1  => "A"
            case 11 => "J"
            case 12 => "Q"
            case 13 => "K"
            case _  => number.toString()
        }
        s"(${suits.emoji},$numberString)"
    }
}

abstract class ValueHolder {
    val value: Int
    def of(suits: Suits): Card = Card(suits, value)
}

object ValueHolder {
    object Ace extends ValueHolder {
        override val value: Int = 1
    }

    implicit class IntValueHolder(override val value: Int)
        extends ValueHolder {}
}
```
```console:出力
(♠,A)
(♦,2)
```

※「ハートの2000」みたいなカードを生成できる点はご愛嬌

## 解説
```scala
abstract class ValueHolder {
    val value: Int
    def of(suits: Suits): Card = Card(suits, value)
}
```
を実装すると以下のように書けるようになる。
```scala
val v: ValueHolder = ??? // なんかうまいこと ValueHolder のインスタンスを生成する
val card = v.of(Spades)
```
Scalaは特定の条件を満たすとメソッド呼び出しの「.」を省略してスペースで代用できる（らしい）し、引数が1つのメソッドは引数を括弧でくくる代わりにスペースで代用できる（らしい）ので、以下のように書ける。
```scala
val card = v of Spades
```

さらに
```scala
implicit class IntValueHolder(override val value: Int)
        extends ValueHolder {}
```
によって、`Int`を`ValueHolder`として扱うことができるようになるので、
```scala
val card = 2 of Diamonds
```
と書ける。
【Swift】文字列を分割して配列にする

# はじめに
Pythonの`split`みたいなことをSwiftでしたいと思った時にやり方がわからなかったので記録しておきます。

# やりかた
### Pyhton
```python
str = "1 2 3 4 5"

print(str.split(" "))

# ["1", "2", "3", "4", "5"]
```

### Swift
```swift
import Foundation

let str = "1 2 3 4 5"

print(str.components(separatedBy: " "))

// ["1", "2", "3", "4", "5"]
```

# おわり
似てるからごっちゃになる！
Vue Routerが動かない、URLは変わってもコンポーネント,表示が切り替わらないときに試すこと

# 環境

Vue.js：2.6.12
Laravel：8.52.0

Laravelのbladeの中で、Vueコンポーネントを表示させている状態です。

# 問題

個人開発でVueを使っているときに気が付いた問題

Vue RouterでのSPAを実装できたと思っていたけど、
URLは正常に変わっても、コンポーネントの表示が切り替わらない・・・
リロードするとコンポーネントは正常に切り替わる。

いままで開発中にデータのやりとりが出来ているかなど確認する際は、
毎回URL直打ちして、毎回リロードしていたのを忘れてました(汗)

# 解決方法

- 変更前

```vue:vue
<template>
　<div>
    <router-view></router-view>
　</div>
</template>
```

- 変更後

keyに一意の値(今回は$route.fullPath)を入れます。
```vue:vue
<router-view :key="$route.fullPath"></router-view>
```

VueRouterが動くたびに、keyで一意の値が識別されることでコンポーネントが再利用されず、切り替わるようになりました。

「SPA動かない」「VueRouter　コンポーネント　変わらない」などのキーワードで
私が調べた際は、beforeRouteUpdate()について紹介してる記事がたくさんありましたが、
このやり方はほとんど見つからなかったので書いてみました。
そもそもなんで再利用されてしまうのか、という根本的な原因までは分かりませんでしたが・・・
ひとまず動いてます🙏🙏


# 参考記事
https://scrapbox.io/nwtgck/vue-router%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%82%92%E5%86%8D%E5%88%A9%E7%94%A8%E3%81%95%E3%81%9B%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%81%AA%E3%82%89%E3%80%8C:key=%22$route.fullPath%22%E3%80%8D%E3%81%8C%E4%BD%BF%E3%81%88%E3%82%8B
AndroidでFirebase + Sign in with Apple 実装

## やること
AndroidでSign in with Appleができるようにする

## 前提
Firebaseプロジェクト作成済のアプリであること

## 概要
1. IdentifierのSign in with Apple をオンにする
2. ServiceId作成
3. プライベートリレー用の設定
4. Sign in with Apple用秘密鍵作成
5. Firebase側の設定
6. コード書こう

## 1. IdentifierのSign in with Apple をオンにする
Apple Developer Consoleにログイン
-> Certificates, Identifiers & Profiles を開く
-> Sign in with Apple を実装したいアプリのIdentifierを選択
-> CapabilitiesタブのSign in with Appleにチェックを入れる
-> Editを押下し、Enable as a primary App IDを選択してSave
-> 右上のSaveを押下

## 2. ServiceIDの作成と設定
Sign in with Apple 用にServiceIDを作成します。
ここで作成したIDをこの後の手順でFirebase側に設定します。

**作成**
Apple Developer Consoleにログイン
-> Certificates, Identifiers & Profiles を開く
-> Identifierを選択し、+ボタンを押下
-> Services IDs を選択してcontinue
-> descriptionとidentifierを入力してcontinue
-> 内容を確認してregister

**設定**
Identifierを選択し、作成したServiceIdを選択
-> Sign in with Apple のConfigureを押下
-> Primary App ID はSign In with Appleを実装するアプリのIDを選択
-> Website URLs の+ボタンを押下
-> Domains and Subdomains に下記を設定
${FIREBASE_PROJECT_ID}.firebaseapp.com 
-> Return URLs に下記を設定
https://${FIREBASE_PROJECT_ID}.firebaseapp.com/__/auth/handler

## 3. プライベートリレー用の設定
ユーザーはAppleIDとして設定しているメールアドレスを非公開にして、ランダムなメールアドレスを生成して使用することができます。そのような設定をしているユーザーとコミュニケーションを取るためのメールアドレスをあらかじめ設定しておく必要があります。

Apple Developer Consoleにログイン
-> Certificates, Identifiers & Profiles を開く
-> Servicesを選択し、Sign in with Apple for Email Communication のconfigureを押下
-> +ボタンを押下
-> Domains and Subdomains　に下記を入力
${FIREBASE_PROJECT_ID}.firebaseapp.com
-> Email Addresses　に下記を入力
noreply@${FIREBASE_PROJECT_ID}.firebaseapp.com
-> Next押下し、内容を確認してRegister押下

## 4. Sign in with Apple用秘密鍵作成
ここで作成した秘密鍵をこの後の手順でFirebase側に設定します。

Apple Developer Consoleにログイン
-> Certificates, Identifiers & Profiles を開く
-> Keysを押下

**Keyを作成してある場合**
既にPush通知利用のためなど、Keyを作成してある場合は、EditでSign in with Appleにもチェックを入れればOK
この時PrimaryIDは何でもOK

**Keyを作成していない場合**
+ボタン押下
-> Key Nameを入力
-> Sign in with Apple にチェックを入れる
-> configureを押下できるようになるので押下
-> PrimaryIDを選択してsave
-> Continue押下し、内容を確認してRegister押下
-> 秘密鍵をダウンロード
この鍵は1度しかダウンロードできない。適切な場所に保管する。

## 5. Firebase側の設定
設定するのはこの４つです。
ServiceID, Apple TeamID, KeyID, 秘密鍵

Firebaseプロジェクトを開く
-> 構築 > Authentication 選択
-> Sign-in methodタブを選択
-> ログインプロバイダにAppleを追加し、有効にする
-> Appleを選択するとサービスIDの入力欄があるので２で作成したServiceIDを入力する
-> サービスID入力欄の下にOAuth コードフローの構成（省略可）とあるので押下する
-> Apple TeamID, 4で作成したKeyIDと秘密鍵を入力する
-> 保存押下

## 6. コード書こう
公式の手順通りの実装すればOK
https://firebase.google.com/docs/auth/android/apple#handle_the_sign-in_flow_with_the_firebase_sdk

## 参考
Apple側設定手順
https://help.apple.com/developer-account/#/devde676e696

Firebase 手順
https://firebase.google.com/docs/auth/android/apple#join-the-apple-developer-program
TerraformでS3バケットポリシーのPrincipalを動的に変更させる

## やりたいこと
- Terraform を使ってS3を作成する
- S3バケットの用途はALBのログ用
- S3のバケットポリシーのPrincipal　をリージョン毎に動的変更したい

## やってみた
- `main.tf`
```
data "aws_caller_identity" "current" {}
data "aws_region" "current" {}

resource "aws_s3_bucket" "awslogs" {
  bucket = "${data.aws_caller_identity.current.account_id}-${var.env}-awslogs"
}

resource "aws_s3_bucket_acl" "awslogs" {
  bucket = aws_s3_bucket.awslogs.id
  acl    = "log-delivery-write"
}

resource "aws_s3_bucket_policy" "awslogs" {
  bucket = aws_s3_bucket.awslogs.id
  policy = templatefile(
    "../../module/s3_logs/files/elblogs_bucket_policy_template.json",
    {
      account_id        = data.aws_caller_identity.current.account_id,
      policy_elb_accout = lookup(var.elb_account_id, data.aws_region.current.name),
      bucket_name       = aws_s3_bucket.awslogs.id
    }
  )
}
```


- `variables.tf`
```
variable "elb_account_id" {
  type = map(any)
  default = {
    us-east-1      = "127311923021"
    us-east-2      = "033677994240"
    us-west-1      = "027434742980"
    us-west-2      = "797873946194"
    ca-central-1   = "985666609251"
    eu-central-1   = "054676820928"
    eu-west-1      = "156460612806"
    eu-west-2      = "652711504416"
    eu-west-3      = "009996457667"
    eu-north-1     = "897822967062"
    ap-east-1      = "754344448648"
    ap-northeast-1 = "582318560864"
    ap-northeast-2 = "600734575887"
    ap-northeast-3 = "383597477331"
    ap-southeast-1 = "114774131450"
    ap-southeast-2 = "783225319266"
    ap-south-1     = "718504428378"
    sa-east-1      = "507241528517"
    us-gov-west-1  = "048591011584"
    us-gov-east-1  = "190560391635"
    cn-north-1     = "638102146993"
    cn-northwest-1 = "037604701340"
  }
}
# 環境名
variable "env" {}
```

- `./files/elblogs_bucket_policy_template.json`

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::${policy_elb_accout}:root"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::${bucket_name}/AWSLogs/${account_id}/*"
        },
        {
            "Sid": "AWSLogDeliveryWrite",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::${bucket_name}/AWSLogs/${account_id}/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        },
        {
            "Sid": "AWSLogDeliveryAclCheck",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::${bucket_name}"
        }
    ]
}
```

## 解説
- main.tf
    - `lookup` を用いて、変数`elb_account_id` より、現在のリージョンに適したAWSアカウントを見つける
    - `templatefile`を用いて、別ファイルに切り出したバケットポリシー（JSONファイル）の変数を置き換える
- variables.tf
    - リージョン名とアカウントのマップを記載
リコリス筆記試験のじゃんけんに必勝する

# リコリス筆記試験
2022年のアニメ「リコリスリコイル」のアイキャッチイラストがもらえるサイトの試験問題が難しいと話題に
[リコリス筆記試験](https://lycoris-recoil.com/special/exam/)
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554244/7ac8abc6-e98a-b358-6216-39dc8bf125a7.png)](https://lycoris-recoil.com/special/exam/)

その方面の界隈では、答えが分かる裏技があるらしいが、
じゃんけん問題には打ち勝てないのであれば**裏技なんぞどうでもいい**
**私はじゃんけんに勝ちたい**

# 難関のじゃんけん問題
第6回の試験の第3問はランダムで回答が変わるため運次第である
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554244/11a33ed1-ab1f-247a-faa9-51752df53a56.png)
そこで、このじゃんけんに必勝することを目標とする

## まず開発者ツールを開きます
開発者ツールを使ってJavascriptを編集し、じゃんけんに勝ちたい
サイトの選択肢の要素はそれぞれ`random_jump()`関数を呼んでリンクを取得している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554244/6e4f48e4-20fc-87ed-8e13-c6cdb89c1c3b.png)

## random_jumpを検索
**見　つ　け　た**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554244/87dc0b22-cfb2-5d94-b012-b5855eb040ff.png)
（リンクは見せないよ）

このことから、random_jumpは配列からリンクをランダムに選んでいることがわかります。
ここにアプローチをかけて勝ちにいきます

## 案1
配列の0番に正解のリンクが入っているので、iに0を代入するようhtmlのコードを書き換え
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554244/fe41183e-a867-604a-bf3c-973bf19eb9ac.png)



**ざ　ん　ね　ん**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554244/41187540-bac6-08bb-1886-b35c152ce08f.png)
要素内のjavascriptはやはり変えられない

## 案2
コンソールで`Math.random`を上書き
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554244/39e84241-2c9d-54a4-6851-76c6b60ee1be.png)
**怒　涛　の　全　問　正　解**
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554244/dc31101b-e0e1-056a-3cc0-eb869cc28916.gif)

## 案3
そもそも直代入でいいじゃん
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554244/ce01534c-c6ee-e25e-da39-1b3acc48ca62.png)
**怒　涛　の　全　問　正　解**
![Videotogif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554244/b1c8510a-481a-1fe1-2e77-8f67a649698d.gif)

## 案4
リンクが入っている配列を`pop`して答えのリンクだけにする
（赤線が失敗リンク）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554244/24b63b8c-4033-a534-c416-806c16a2ef2d.png)
初回だけ勝ち確
ブラウザバックで戻ってくると、mylinkの中身は戻っていた

# じゃんけんの勝敗
コンソールから関数を上書きすることで、ランダムに負けない！じゃんけんに勝てる！千束にも勝てる！
ことができました。
ありがとうございました。

# FAQ
## Q. え、アイキャッチイラストは？
**A.** もらいました
試行錯誤の最中にうっかり勝つこともあったけどブラウザバックしました

## Q. 不正？
**A.** 実力です
筆記試験なのでコードを記述しただけです
少なくともクルミなら認めてくれる
~~ポリスメン呼ばないでクルミ様~~

## Q. 他の問題は？
**A.** 他にプログラミングでどうにかできそうな問題はありませんでしたし
普通に真剣に解きました。難しかったです。

# おわりに
というわけで、リコリス筆記試験のじゃんけんに必勝することができました。
みんなもアニメ **[【Engage Kiss】](https://animestore.docomo.ne.jp/animestore/ci_pc?workId=25610)** 見てくれよな
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554244/40c58f07-ef7f-1559-6174-7adbd00caa53.png)](https://animestore.docomo.ne.jp/animestore/ci_pc?workId=25610)
ITインフラのコストを最適化したいので可視化について考えてみた

# はじめに
- 仕事柄、オンプレミス/クラウドに関わらずITインフラに関わる方々とお話をする機会が多くあります。
- 最近そのような方々のお話を聞いていると、ITインフラのコスト増加が課題となっているケースが多く、中には経営層から現場に対してITコストの改善を求められているといった声も聞こえてきます。
- [前回の記事](https://qiita.com/seijitanabe/items/cba2d58303ce3f0394de)でクラウドコストを最適化するための考え方であるFinOpsについて調べてみると、FinOpsを始めるにはまず「可視化」をしなければならないということがわかりました。そこで、本記事では、「ITインフラのコストを最適化したい」シリーズの第二回として「可視化」について考えてみます。
- ちなみに、本記事は一見ポエミーな記事ですがシリーズの最後に実践編へと続いていくので**実はポエムではないです。（重要）**


# 可視化のゴール：誰が何をどれくらい使っているのか、また使う見込みかを把握すること
- まず、可視化のゴール、どうなれば可視化を達成できたことになるのかを考えていきます。ITインフラのコストを最適化するための最初のフェーズとしての可視化のゴールです。
- コストを最適化するためには、コスト構造を分解して把握する必要があります。パブリッククラウドとオンプレミスとではコスト構造が異なるため、ひとまず分けて考えてみます。

## パブリッククラウドの場合
- パブリッククラウドのコストを分解すると、利用している全リソースの「単価×量（時間）」の足し算になるはずです。つまり、コスト構造を把握するには「何をどれくらい使っているか」を把握しなければなりません。
- そして、それを使っている人やチームがいて、彼らが実際にコスト最適化の取り組みを行う主体となっていくため、「誰が何を使っているのか」ということも把握しなければなりません。
- また、場合によってはリザーブドインスタンスなどのコミット型の割引契約を検討することもあると思います。その場合、先の利用傾向も見据えて契約する必要があるため、今後どれくらい使う見込みがあるのかということも把握する必要があります。
- つまり、パブリッククラウドのコストを最適化するための可視化としては、「誰が何をどれくらい使っているのか、また使う見込みかを把握すること」が達成できればよいと言えます。

## オンプレミスの場合
- オンプレミスであっても、個々のリソース割り当てについて見直して改善すれば環境全体のリソース使用率が最適化され、追加調達、リプレースする際のリソースも最適化することができるため、パブリッククラウドと同様に「誰が何をどれくらい使っているのか」については把握しておく必要があります。
- それに加え、オンプレミスの場合、大抵は5年などの期間で使用するであろうリソースをまとめて調達することが多いと思うので、既存の環境があるのであれば、今現在の環境全体での各リソースの使用率を把握するところからスタートする必要があります。そして、5年後などの次の投資タイミングまでにその使用率がどのようになっていく見込みかというところまで把握しなけれればなりません。
- つまり、オンプレミスのコストを最適化するための可視化としても、パブリッククラウドと同様に「誰が何をどれくらい使っているのか、また使う見込みかを把握すること」が達成できればよいと言えます。

:::note info
コスト最適化という最終目標のためには、何をもってITリソース割り当てなどが適切であるといえるか（無駄がないといえるか）などの定量的な基準を定める必要がありますが、それはFinOpsの次のフェーズである「Optimize（最適化）」で検討する内容になるため、本記事では可視化としてのゴールには含めていません。
:::

# 監視と可視化の違い
- ほとんどのITシステムでリソースの使用率などは何らかの仕組みで監視していると思います。ここで、監視と可視化の違いについて考えてみます。

## 監視とは：リソースやサービスに「異常がないかどうか」を把握する仕組み
- 従来から行われている監視は、リソースの使用率や使用量、レスポンスの速度などに閾値を設定してその値を監視し、「閾値超過＝異常」とみなして通知をするものです。
- つまり、リソースやサービスに「異常がないかどうかを把握する仕組み」と言えます。
- これでは、異常がないかどうかの把握はできますが、無駄遣いしていないかなどの使われ方の適切さまでは把握することはできません。例えば、ほとんど使用されないものに過剰なリソースが割り当てられていたとしても監視の仕組みだけでは気づくことが出来ないということです。
- また、そのリソースを誰が使っているのかということも監視だけでは把握することは難しいと思います。
- コスト最適化のためにはリソースが無駄遣されている箇所を特定する必要があるので、従来の監視では不十分と言えます。

## 可視化とは：リソースやサービスが「どのように使用されているか」を把握する仕組み
- コスト最適化のために実現すべき可視化とは、リソースが「どのように使用されているか」を把握する仕組みと言えます。
- 「常に割り当てられたリソースのギリギリまで使われているのか」、「特定のイベントが発生した時のみ使用率が上がるのか」、「割り当てられたリソースがほとんど使用されていないのか」などのリソースの使われ方は、可視化の仕組みによって把握することが可能になります。
- また、リソースと利用者の紐づけも可視化の仕組みによって実現します。

# まとめ
- 可視化のゴールは、「誰が何をどれくらい使っているのか、また使う見込みかを把握すること」
- コスト最適化のためには、リソースやサービスに「**異常がないかどうか**」を把握する仕組みである監視では不十分
- リソースやサービスが「**どのように使用されているか**」を把握する仕組みである可視化が必要

# 次回予告
- 可視化について考えが深まったところで、次回は実際にツールを使って可視化してみます。
- 次回の記事は[こちら](https://qiita.com/seijitanabe/items/9969d7b9504122e0e4a7)。
GAS×Notion｜NotionAPIとGASでNotionに作ったDBを動かす

# ゴール
[参考記事](https://www.pnkts.net/2021/05/16/gas-notion-api)にしたがって、NotionAPIとGASでNotionに作ったDBを動かす。



# 注意点
おおむね、参考記事通りに作成できたが、以下の部分は要注意。

## ①「インテグレーション」と「コネクト」
[公式ドキュメント](https://www.notion.so/ja-jp/help/create-integrations-with-the-notion-api)で、内部インテグレーションの作成方法について
>左のサイドバーで 設定 に移動し、 インテグレーション タブにアクセスします。

と書いてあるが、「インテグレーション」というタブはなく、「コネクト」という名前に変わっている。
![debe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687068/5903ca34-06a4-e32b-9c4e-9bed1ca7bd9f.png)



## ②インテグレーションをデータベースと連携させる方法
[参考記事](https://www.pnkts.net/2021/05/16/gas-notion-api)では、
> 右上のShareからAdd people, emails, groups, or integrationsをクリックして、先程作成したインテグレーションに共有します。

と書いてるが、仕様が変わっていたので要注意。以下画像の手順でインテグレーションとデータベースは連携させる。

![debe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687068/480615b6-08ea-f5dc-915a-9838f11ef813.png)

# 追加改造
元のコード（以下）はコードに直接`Notionトークン`と`データベースID`を書き込む形になっている。
メンテナンスの面から、コードに直接書き込む形から、スクリプト プロパティに書き込む形に変える。

```js:元々のコード
 var notion_token = '{MY_NOTION_TOKEN}';
 var database_id = '{DATABASE_ID}';
```

```js:改造後のコード
//スクリプトプロパティのオブジェクトを取得
const prop = PropertiesService.getScriptProperties().getProperties();

//スクリプトプロパティのオブジェクトを挿入
 var notion_token = prop.MY_NOTION_TOKEN;
 var database_id = prop.DATABASE_ID;
```
スクリプトプロパティ
![notion_GAS_-_プロジェクトの設定_-_Apps_Script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687068/8a10e295-7961-3e9d-bd8c-9562a3d044fd.png)

# コード全文
上記の通り、参考記事のコードに、一部改造を加えている。

```js:
function notion(text) {
  var url = 'https://api.notion.com/v1/pages';

  //スクリプトプロパティのオブジェクトを取得
  const prop = PropertiesService.getScriptProperties().getProperties();

  //スクリプトプロパティのオブジェクトを挿入
  var notion_token = prop.MY_NOTION_TOKEN;
  var database_id = prop.DATABASE_ID;
  var headers = {
    'Content-Type' : 'application/json; charset=UTF-8',
    'Authorization': 'Bearer ' + notion_token,
    'Notion-Version': '2021-05-13',
  };

  var post_data = {
    'parent': {'database_id': database_id},
    'properties': {
      'Name': {
        'title': [
          {
            'text': {
              'content': text,
            }
          }
        ]
      }
    }
  };

  var options = {
    "method" : "post",
    "headers" : headers,
    "payload" : JSON.stringify(post_data)
  };

  return UrlFetchApp.fetch(url, options);  
}

function notionTest() {
  var result = notion('ポンコツエンジニアはごじゃっぺ');
  console.log(result)
}
```
# 感想
ここには記載し忘れたが、作成中にエラーがでて連携がうまくいかなかった。エラーの詳細はわからなかったが、NotionでDBを作り直したら解決。エラーが出たら、やり直すのが一番かも。

この技術をもとに、LINE・GAS・Notionを連携させて、「LINEで日記を記載→Notion上に蓄積」という形をつくりたい。

# 参考
https://www.pnkts.net/2021/05/16/gas-notion-api

https://www.notion.so/ja-jp/help/create-integrations-with-the-notion-api
Lucene の Tokenizer で 「数字%」や「文字列&文字列」を許容する

備忘録

https://mikolajkania.com/2017/08/27/How-to-change-standard-tokenizer-rules/

を参考にしました。

コードは、

https://github.com/YmBIgo/JFlex_Test/blob/master/lucene_tokenizer.flex.java

と

https://github.com/YmBIgo/JFlex_Test/blob/master/Sample_Lucene.java

にあります。

## StandardTokenizer

Lucene の `StandartAnalyzer` では、`StandardTokenizer` という 絵文字など１文字なのに３バイト以上で認識されてしまうものを修正するなどの機能があります。つまり、Lucene で全文検索をする際の最初の前処理をしているところと言ってもいいでしょう。

この StandardTokeniser の初期の設定で、Lucene で 「20%」など「数字%」や「A&E」など「文字列&文字列」が弾かれてしまう仕様になっています。ここでは、これらの「%」や「&」に対する、ミニパッチを紹介します。

ミニパッチを適用するには、Lucene の [StandardTokenizerがある場所](https://github.com/apache/lucene/tree/44b4602776a63d93896d887e5000c9e3ca7c3119/lucene/core/src/java/org/apache/lucene/analysis/standard) から [StandardTokenizerImpl.jflex](https://github.com/apache/lucene/blob/44b4602776a63d93896d887e5000c9e3ca7c3119/lucene/core/src/java/org/apache/lucene/analysis/standard/StandardTokenizerImpl.jflex) を探します。この JFlex ファイルで、トークナイズのルールが書いてあります。

今回ミニパッチを当てるのは、数字と文字列の部分になるので、その該当箇所は、数字の方は [216行目](https://github.com/apache/lucene/blob/44b4602776a63d93896d887e5000c9e3ca7c3119/lucene/core/src/java/org/apache/lucene/analysis/standard/StandardTokenizerImpl.jflex#L216) の部分で、 文字列の方は [238行目から](https://github.com/apache/lucene/blob/44b4602776a63d93896d887e5000c9e3ca7c3119/lucene/core/src/java/org/apache/lucene/analysis/standard/StandardTokenizerImpl.jflex#L238)と[244行目から](https://github.com/apache/lucene/blob/44b4602776a63d93896d887e5000c9e3ca7c3119/lucene/core/src/java/org/apache/lucene/analysis/standard/StandardTokenizerImpl.jflex#L244)の文字列 になります。

結果だけ載せます。

数字の方は、後ろに `\%*` を加えているだけです。

```java: StandardTokenizerImpl.jflex 216, 217行目
{ExtendNumLetEx}* {NumericEx} ( ( {ExtendNumLetEx}* | {MidNumericEx} ) {NumericEx} )* {ExtendNumLetEx}* \%*
  { return NUMERIC_TYPE; }
```

文字列の方は、途中に `\&*` を加えています。

```java: StandardTokenizerImpl.jflex 238 〜 252行目
{ExtendNumLetEx}*  ( {KatakanaEx}          ( {ExtendNumLetEx}*   {KatakanaEx}                        )*
                   | ( {HebrewLetterEx}    ( {SingleQuoteEx}     | {DoubleQuoteEx}  {HebrewLetterEx} )
                     | {NumericEx}         ( ( {ExtendNumLetEx}* | {MidNumericEx} ) {NumericEx}      )*
                     | {AHLetterEx}        ( ( {ExtendNumLetEx}* | {MidLetterEx} | \&* ) {AHLetterEx}     )*
                     )+
                   )
({ExtendNumLetEx}+ ( {KatakanaEx}          ( {ExtendNumLetEx}*   {KatakanaEx}                        )*
                   | ( {HebrewLetterEx}    ( {SingleQuoteEx}     | {DoubleQuoteEx}  {HebrewLetterEx} )
                     | {NumericEx}         ( ( {ExtendNumLetEx}* | {MidNumericEx} ) {NumericEx}      )*
                     | {AHLetterEx}        ( ( {ExtendNumLetEx}* | {MidLetterEx} | \&* ) {AHLetterEx}     )*
                     )+
                   )
)*
{ExtendNumLetEx}* 
  { return WORD_TYPE; }
```

StandardTokenizer で直っただけのですが、その後の前処理は試していないので、動かなかったらすみません。
【Laravel×Homestead】npm installをしたらエラーが出た話

laravel/uiをインストールし、``php artisan ui bootstrap --auth``にて、ui機能を使ってbootstrapの認証機能のひな形ファイルを作成。
その後、必要なパッケージ管理機能を使えるように``npm install``を実行すると、symlinkエラーが発生しました。

# 環境
- OS : windows11 pro
- VirtualBox (5.2.44)
- vagrant (2.2.5)
- Laravel8×Homestead

# symlinkエラー
```
npm WARN deprecated stable@0.1.8: Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility
npm WARN deprecated querystring@0.2.0: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
npm ERR! code EPROTO
npm ERR! syscall symlink
npm ERR! path ../@babel/parser/bin/babel-parser.js
npm ERR! dest /home/vagrant/code/physical_health_record/node_modules/.bin/parser
npm ERR! errno -71
npm ERR! EPROTO: protocol error, symlink '../@babel/parser/bin/babel-parser.js' -> '/home/vagrant/code/physical_health_record/node_modules/.bin/parser'

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/vagrant/.npm/_logs/2022-09-30T00_44_03_829Z-debug-0.log
```
# 解決方法
原因は分かりませんが、VirtualBoxを管理者で先に起動させ、``npm install``を実行するとうまくいきました。

つまり、**vagrant upは管理者権限で起動したCMDで実行**しないとダメらしい・・・
ややこしいが、成功して良かったです。
JavaScriptでブラウザゲーム作ろう！

JavaScriptでゲーム作ります。
ブログに書いてもCodePenに投稿しても全然見てもらえないのでここにまとめます。

## ゲームエンジン
ゲームエンジン的なものはPixiJSで作っています。
シーンの切り替えや音の再生もばっちりできます。

<p class="codepen" data-height="300" data-default-tab="js" data-slug-hash="LYmjmGY" data-user="inwan78" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/inwan78/pen/LYmjmGY">
  pixi.jsで作ったゲームエンジン(p94e.js)</a> by いんわん (<a href="https://codepen.io/inwan78">@inwan78</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

### サンプル
上のゲームエンジンを使って作った簡単なゲームがこちら。
<p class="codepen" data-height="300" data-default-tab="js,result" data-slug-hash="abGwZro" data-user="inwan78" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/inwan78/pen/abGwZro">
  pixi.jsで作った糸通し風ゲーム</a> by いんわん (<a href="https://codepen.io/inwan78">@inwan78</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## 操作の管理
キーボード、ゲームパッド、さらにスマホでのバーチャルパッドまで全部管理してくれるプログラムです。
これは素のJavaScriptで作っています。
<p class="codepen" data-height="300" data-default-tab="js" data-slug-hash="WNJEKeQ" data-user="inwan78" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/inwan78/pen/WNJEKeQ">
  JavaScrip操作入力管理プログラム</a> by いんわん (<a href="https://codepen.io/inwan78">@inwan78</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

### 操作のサンプル
上のプログラムを使ったサンプルです。
バーチャルパッドはスマホ、または開発ツールでスマホ状態にすると表示されます。
<p class="codepen" data-height="300" data-default-tab="js,result" data-slug-hash="yLjoqyg" data-user="inwan78" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/inwan78/pen/yLjoqyg">
  JavaScriptの操作入力のサンプル</a> by いんわん (<a href="https://codepen.io/inwan78">@inwan78</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## 他にもあります

サンプルは他にもあります ▷ [JavaScriptでゲーム作ろう！](https://javascript-game.com/)
解説もそっちにあるので気になる方は見てください('ω')ノ
Visual Studio でグローバルなインクルード/ライブラリパスを変更する

# 概要
昔っから Visual Studio を使っていれば、インクルードなどのパス指定はオプションのディレクトリ タブにあったはずだ。
![vc98.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/a9515ab5-ec39-fe50-efb0-407e02a0f0fd.png)


でも Visual Studio 2015 くらいからなくなっちゃったんよね、コレ。
![vs2017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/b30551ab-d3f1-d4a2-980e-7f211eb2d626.png)

まぁ、プロジェクトごとの設定で指定すればいいんだけど、これも面倒くさい。
![vcdir.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/ea321d80-8445-88fc-9ba9-b04b1a30fb09.png)

非推奨上等で大元を書き換えてみる。

## やりかた
基本的にMicrosoft.Cpp.Common.props を編集すれば良い。

## どこにある?
Visual Studio のバージョンによって異なる。
Microsoft の [C++ プロジェクトの MSBuild の内部](https://learn.microsoft.com/ja-jp/cpp/build/reference/msbuild-visual-cpp-overview) のページを見よう。

## Visual Studio 2017
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.Cpp.Common.props を書き換える。
色々条件分岐しているが VC_IncludePath を書き換えてしまう。

ちゃんとバックアップを取ってから作業しよう。
あと C:\Program Files (x86) なので管理者権限も必要。

~~~diff:VC_IncludePath
- <VC_IncludePath>$(VC_VC_IncludePath);$(VC_ATLMFC_IncludePath);$(VC_VS_IncludePath);$(UniversalCRT_IncludePath);</VC_IncludePath>
+ <VC_IncludePath>$(VC_VC_IncludePath);$(VC_ATLMFC_IncludePath);$(VC_VS_IncludePath);$(UniversalCRT_IncludePath);d:\usr\include;</VC_IncludePath>
~~~

VC_LibraryPathも同様に

~~~diff:VC_LibraryPath
- <VC_LibraryPath_x86>$(VC_LibraryPath_VC_x86);$(VC_LibraryPath_ATL_x86);$(VC_VS_LibraryPath_VC_VS_x86);$(UniversalCRT_LibraryPath_x86);</VC_LibraryPath_x86>
+ <VC_LibraryPath_x86>$(VC_LibraryPath_VC_x86);$(VC_LibraryPath_ATL_x86);$(VC_VS_LibraryPath_VC_VS_x86);$(UniversalCRT_LibraryPath_x86);d:\usr\lib\x86;</VC_LibraryPath_x86>
- <VC_LibraryPath_x64>$(VC_LibraryPath_VC_x64);$(VC_LibraryPath_ATL_x64);$(VC_VS_LibraryPath_VC_VS_x64);$(UniversalCRT_LibraryPath_x64);</VC_LibraryPath_x64>
+ <VC_LibraryPath_x64>$(VC_LibraryPath_VC_x64);$(VC_LibraryPath_ATL_x64);$(VC_VS_LibraryPath_VC_VS_x64);$(UniversalCRT_LibraryPath_x64);d:\usr\lib\x64;</VC_LibraryPath_x64>
~~~

これで面倒から解放された。。。
2022年10月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2022年10月3日の検索結果 (リスティング広告)

![20221003_AIOps_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/8e41f0f3-ed71-ceeb-67c8-ebb8c98b1a90.png)


* IBM
* Splunk
* ServiceNow
* Dynatrace

先月と顔ぶれは変わりませんが、2位と3位が入れ替わってます。

先月の結果はこちら --> [2022年9月 AIOps 定点観測](https://qiita.com/mkodera/items/1d0783043d847a893199)

# 2022年10月3日の検索結果 (広告以外)

![20221003_AIOps_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/5fc7db7d-7ec4-f74a-a770-9903adb2b2a8.png)


* Splunk
* JBSVC
* ITmedia
* ServiceNow

広告以外だと、上位1～4位の顔ぶれは先月と変わりませんが、3位と4位が入れ替わってます。

先月の結果はこちら --> [2022年9月 AIOps 定点観測](https://qiita.com/mkodera/items/1d0783043d847a893199)
【Java】覚えた用語一覧集　２　データ型

## データ型　使用頻度の高いもの
|種類|型名 |内容|
|:--|:--|:--|
|整数型	|int|-2147483648 ～ 2147483647 までの整数を取り扱える箱|
|文字列クラス|String|	"java"、"勉強"、"Mac" などの複数の文字を扱える箱|

## 
|種類|型名|内容|
|:--|:--|:--|
|整数型|	byte|	-128 ～ 127 までの整数を取り扱える箱|
|整数型|	short|	-32768 ～ 32767 までの整数を取り扱える箱|
整数型|	long|	-92223372036854775808 ～ 9223372036854775807 までの整数を取り扱える箱|
|浮動小数点型|	float|	± 3.4 × 1039 ～ ± 1.4 × 10 - 45 細かい数字を扱える箱|
|浮動小数点型|	double|	± 1.8 × 10308 ～ ± 3.4 × 10 - 324 さらに細かい数字を扱える箱|
|論理型|	boolean	true| ( 真 ) or false ( 偽 ) 真偽を測る箱|
|文字型|	char|	"あ" 、 "虹" などの一文字を扱える箱|

## 整数型の種類について
- 整数型の種類が多いのは、取り扱う整数が多いとビット数が増え処理が重くなる
- しかしながら現在のパソコンならさほど問題がないため整数型は　int型　を使用することが多い
## 補足
- 数値は整数型になるが文字列クラスのStringを使用することもできる
【UNIXコマンド】覚えた用語一覧集

## 概要
- Javaの学習中に覚えた用語について、自分なりの理解を残す備忘録

## ターミナルで使用するUNIXコマンド
|コマンド|意味|
|:--|:--|
|pwd|現在ディレクトリのフルパス表示|
|cd|ホームディレクトリへ移動|
|cd(dir名)	|指定ディレクトリへ移動|
|mkdir (dir名)|新規ディレクトリを作成|
|rmdir (dir名)|空のディレクトリを削除|
|rm -r (dir名)|指定ディレクトリを中のファイルごと削除|
|cp -r (dirA) (dirB)|ディレクトリAをディレクトリBにコピー|
|mv (dir名)	|ファイルをディレクトリへ移動|
|ls	|現在ディレクトリのファイル一覧表示|
|ls (dir名)|指定ディレクトリのファイル一覧表示|
|cd -|直前のディレクトリへ移動(1つまでしか戻れない)|
|javac(dir名)|機械語に変換する|
|java（dir名）|変換した機械語を動かす|
## ターミナルでよく使うショートカット
- Tabを押すと使用したコマンドを遡れる
- ディレクトリ名の頭文字を入れてTabを押すと該当するディレクトリを表示してくれる　ただし同じ頭文字がある場合は違うところまで入力しないと使用できない
【Java】覚えた用語一覧集　１

## 用語集

|用語|意味|
|:--|:--|
|クラス|データと処理のかたまりのことをクラスと呼ぶ|
|フィールド|クラス内でどのような情報を扱うかのデータのこと|
|メソッド|クラス内に書かれた処理のこと|
|引数|メソットを処理する際に設定できる条件　イメージは材料|
|戻り値|引数を渡して処理を実行した際に戻ってくる結果|
|インスタンス（化）|クラスから作られたオブジェクト、設計図　イメージはレシピ|
|コンストラクタ|インスタンスを呼び出すタイミングで呼び出される特別なメソットのこと|
【HTML】リンクの貼り方

## HTMLにおけるリンクの貼り方
それに関連するプラスアルファの作業

リンクの貼り方
HTMLにaタグを使用する
```html
 <a href="https://qiita.com/galves>
```
## aタグを使って、別タブ表示を実現するときの書き方
target="_blank"  と rel="noopener noreferrer" をつける
```html
 <a href="https://qiita.com/galves"  target="_blank" rel="noopener noreferrer">
```

## リンクのアンダーラインを消す方法
aタグにCSSでtext-decoration:noneを記載する
```css
.a {
  text-decoration: none;
}
ABC 271 回答メモ

0.はじめに
　Cは、初見簡単に解けそうに感じたけど
　意外とてこずりました。

1.A - 484558
　最近2進数を扱う問題があったので、その時のソースを参考に
　簡単に解けました。
　
```
H=str(hex(N))[2:]
```
　文字列にして、3文字目から参照するのは2進数と変わらずでした。

　https://atcoder.jp/contests/abc271/submissions/35275984

2.B - Maintain Multiple Sequences
　2次元数列を格納して
　指定アドレスを抽出するだけの簡単なお仕事。
　行は指定数マイナス１にして、列は、1列目が列数なので
　そのまま使えるというのがみそでした。

　https://atcoder.jp/contests/abc271/submissions/35281480

3.C - Manga
　考え方１）
　　(1)一番うまくいってもN巻まで読めるのが最高
　　(2)N巻までの数列Lを作って、リストAを頭からチェックし
　　　 持っている巻は数列Lの該当アドレスを1に変更。
　　　　N以上の巻や、すでにチェックがついている巻があったら
　　　　売却候補に1プラス
　　(3)数列Lを1から見ていき、空いている感があれば売却候補から２を
　　　　引いて次の巻へ。
　　　　売却候補が足りなければ、数列Lを後ろから見ていき、後ろの本の
　　　　アドレスが1の者があったら0にして売却候補に1可算・・・

　　　という仕組みで、例題は通ったが、予想通りTLE

　→いろいろ高速化を試すもNG・・・
　　と、している間に、数列Lさえ作ってしまえば、最初のN巻をもとに
　　計算できることに気づく。

　考え方２）
　　(1)一番うまくいってもN巻まで読めるのが最高
　　(2)N巻までの数列Lを作って、リストAを頭からチェックし
　　　 持っている巻は数列Lの該当アドレスを1に変更。
　　　　N以上の巻や、すでにチェックがついている巻があったら
　　　　売却候補に1プラス
　　(3)数列Lを1から見ていき、フラグが立っていれば、Nから1を引く
　　　　フラグが立っていなければ、Nから2を引く
　　　　Nが0になったら、該当アドレスが答え。
　　　　Nが-１になったら、該当アドレス-１が答え

　　若干不格好なPGとなりましたが、クリアできました。

　https://atcoder.jp/contests/abc271/submissions/35301920
　　　　
4.D - Flip and Adjust
　これはDP！と思いましたが、解法はわからず・・・。
　いつかDPマスタしようと思いつつはや半年・・・。
【HTML/CSS】ホームページ著作権マークをサイト下部に固定する

## 概要
Footerタグを利用して中間の要素がスカスカでも常の画面の最下部にFooterが表示されるようにする方法

もし中間の要素がたくさんあった場合はページの最下部Footerが表示されるようにする

```css
#header {
  background-color: black;
  color: white;
  height: 7vh;
  display: flex;
  align-items: center;

#main {
  min-height: 88vh;
  display: flex;
  flex-wrap: wrap;
}

#footer {
  background-color: #ccc;
  color: #333;
  height: 5vh;
  text-align: center;
}
```

## ポイント
vh (viewport height)
ビューポートの高さに対する割合を使用する

上記CSSでは
header 7vh (7%)
main   88vh(88%)
footer 5vh (5%)
と設定して全体の表示の割合を１００％にしている
なお中途半端な数値になっているのはバランスを取るため

ちなみにmainで使用している
min-heightは領域内における最小値を指定するプロパティでmainで最低でも８８％画面を使用すると指定している
【MySQL】SQL基本４構文（DML）

## 概要
SQL基本４構文について
DMLとはData Manipulation Language の略
データベースにおいてデータの検索・新規登録・更新・削除を行うための言語である。要するに、定義済みのテーブルの中のデータをいじるコマンドです。

- SELECT セレクト文（テーブルからデータを取得する）
- INSERT インサート文（テーブルにデータを追加する）
- UPDATE アップデート文（テーブルのデータを更新・修正する）
- DELETE デリート文（テーブルのデータを削除する）

SELECT
```sql
SELECT * FROM テーブル名 WHERE 検索条件;
-- WHERE 句がないと、全データを取得する
```

INSERT

カラム名を指定しない場合（カラムのデータ入力を省略しない代わりに、カラム名の指定を省略する）
```sql
INSERT INTO テーブル名 VALUES ('1', '山田太郎', 29, '2000/07/05' ,'東京');
```

カラム名を指定する場合（一部のカラムの入力を省略できる）
```sql
INSERT INTO テーブル名 (id, name, birthday)
VALUES ('1', '山田太郎', '2000/07/05');
```


UPDATE
```sql
UPDATE テーブル名 SET カラム名A = 更新値, カラム名B = 更新値 WHERE （更新対象を指定する）条件;
-- WHERE 句がないと、全データの該当カラムの値を更新しちゃう
```

DELETE
```sql
DELETE FROM テーブル名 WHERE （削除対象を指定する）条件;
-- WHERE 句がないと、全データを削除しちゃう（TRUNCATE文とほぼ同じ）
```

おまけ
```sql
-- TRUNCATE トランケート（テーブルを空っぽにしちゃう）
TRUNCATE TABLE テーブル名;
【Git】.gitignore で指定してもファイルが作業ツリーに上がってきてしまうときの対処法

途中で .gitignore に追加した（すでにそのファイルをコミットしてしまっている）場合は，あとから.gitignore しても無視できない（ことがある？）．

ignoreしたいファイルを一度別の場所に移してからコミットし，再度戻してからコミットしなおすとignoreできました．
paizaラーニング レベルアップ問題集 巡回セールスマン問題メニュー JavaScript 巡回路長の計算

巡回路長の計算 (paizaランク C 相当)

https://paiza.jp/works/mondai/tsp_problems/tsp_problems__tour_distance

# 解答例
巡回路の長さを求めるには、ユークリッド距離を用いて、各都市間の距離を求め、その距離の和を求めればよいです。最後の都市からスタートの都市に戻ってくる距離も足すことに注意します。

```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

//ユークリッド距離の計算式を、関数定義
const dist = (a, b) => {
  return Math.sqrt(Math.pow(a[0] - b[0], 2) + Math.pow(a[1] - b[1], 2));    
}; 

//都市の個数 n
const n = Number(lines[0]);
//都市 i の座標 (x_i, y_i) 
const cities = lines.slice(1, n + 1).map(line => line.split(" ").map(Number));

//都市番号の順列で表された巡回路
const p = lines[n + 1].split(" ").map(v => Number(v) - 1);//インデックスで扱うので-1

let l = 0;//巡回路長
for (let i = 0; i <= n - 1; i++) {
  //最後以外
  if (i < n - 1) {
    l += dist(cities[p[i]], cities[p[i + 1]]);
  //最後  
  } else if (i === n - 1) {
    l += dist(cities[p[i]], cities[p[0]]);//最初に戻る  
  }
}
console.log(l);
```
# 解答例(Python3の場合参考)
最初に戻る時の場合分けを、%を使ってひとまとめにできます。すなわち、`(i + 1) % n`とすれば、最後のi=n-1のとき、`(i + 1) % n　= 0`となり、p[0]で最初の都市に戻ります。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

//ユークリッド距離の計算式を、関数定義
const dist = (a, b) => {
  return Math.sqrt(Math.pow(a[0] - b[0], 2) + Math.pow(a[1] - b[1], 2));    
}; 

//都市の個数 n
const n = Number(lines[0]);
//都市 i の座標 (x_i, y_i) 
const cities = lines.slice(1, n + 1).map(line => line.split(" ").map(Number));

//都市番号の順列で表された巡回路
const p = lines[n + 1].split(" ").map(v => Number(v) - 1);//インデックスで扱うので-1

let l = 0;//巡回路長
for (let i = 0; i <= n - 1; i++) {
  l += dist(cities[p[i]], cities[p[(i + 1) % n]]);//最初に戻るので%  
}
console.log(l);
```
# 解答例(C++の場合参考)
都市 i の座標 (x_i, y_i) の配列citiesや、
都市番号の順列で表された巡回路pは、
forループを使って以下のようにも書けます。
```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

//ユークリッド距離の計算式を、関数定義
const dist = (a, b) => {
  return Math.sqrt(Math.pow(a[0] - b[0], 2) + Math.pow(a[1] - b[1], 2));    
}; 

//都市の個数 n
const n = Number(lines[0]);
//都市 i の座標 (x_i, y_i) 
const cities = Array(n);
for (let i = 0; i < n; i++) {
  cities[i] = lines[i + 1].split(" ").map(Number);
}

//都市番号の順列で表された巡回路
const p = Array(n);
for (let i = 0; i < n; i++) {
  p[i] = lines[n + 1].split(" ").map(Number)[i];
  p[i]--;
} 

let l = 0;//巡回路長
for (let i = 0; i <= n - 1; i++) {
  l += dist(cities[p[i]], cities[p[(i + 1) % n]]);//最初に戻るので%  
}
console.log(l);
```
【MySQL】テーブル作成

##　概要
MySQL備忘録
テーブル作成方法

テーブル作成
```
CREATE TABLE test_db.テーブル名 (id int, name varchar(100), memo varchar(100));
```

テーブルの中身を一覧表示
```
SELECT * FROM テーブル名;
```
データを挿入する
```
INSERT INTO テーブル名 (id, name, memo) VALUES
```

|id |name  |memo  |
|---|---|---|
|1  |ソードアートオンライン  |  |
|2  |ウマ娘  |ライスシャワーかわいい  |
|3  |はたらく魔王さま |俺もマックでバイトする |



後から主キーを設定する
```
ALTER TABLE テーブル名 ADD PRIMARY KEY(id);
```
SQL, PL/pgSQLの違い

# 要点
- PL/pgSQLを理解するには、PL/SQLを理解する
- PL/SQL, PL/pgSQLは、SQL（非手続き型言語）に加えて、繰り返し処理、条件分岐、配列、例外処理、トリガーなどといった便利な機能を備えたもの
- 各RDBMSに特化して拡張されたSQLという認識でok
- PLは、Procedural Language（手続き型言語）の略
- 繰り返し処理、条件分岐などの処理のことを手続き処理という

# SQLとは
- RDBMSにおいて、データを操作するためのデータベース言語。クエリ言語とも呼ばれる。プログラミング言語とは区別される。
    - データベース言語はDBMSに命令を出すためのもので、基本的にそれ以外の用途に使用することができない。
    - ソフトウェア開発に使用されるプログラミング言語とは異なり、シンプルな構成になっているため、文法や使い方も独特なものとなっている
- 標準化されているため、様々なRDBMSで利用することができる
    - 具体例）Oracle Database、MySQL、PostgreSQL、SQLiteなど

# PL/SQL
- Oracle Databaseでデータを管理するためにSQLを拡張して開発されたプログラミング言語。
- SQLではできない、繰り返し処理や条件分岐などの処理を使用することができる
- PL/SQLで記述された関数はSQLから呼び出すことやトリガーによって実行することもできる
- Oracle Database：Oracle社が提供するRDBMS

# PL/pgSQL
- PostgreSQLでデータを管理するためにSQLを拡張して開発されたプログラミング言語。
- PL/SQLの拡張であるため、文法など似ているところがある
- 機能については、PostgreSQLに特化したものになっているがPL/SQLのPostgreSQL版に拡張しているという認識でok

# PL/SQL, PL/pgSQLを使うことのメリット
- 繰り返し処理、条件分岐などを使用することができる
- パフォーマンスが向上する
    - SQLを含めたプログラム全体をまとめてRDBMSに送信することができる
    - PL/SQL, PL/pgSQL以外のプログラミング言語（C, Javaなど）では、プログラムに含まれるSQLが文単位でRDBMSに送信される
    - 両者の最終的に得られる結果は同じだが、効率に大きな差がある
- **SQLで定義する関数に比べて、制御文、条件分岐を使った関数を作成することができる**
    - SQLでも関数を定義することは可能


# その他（PL/python, PL/Perl）
- PostgreSQLでは、標準でPL/python, PL/Perlなどを配布しているためインストールして使用することができる
- PL/pythonをインストールして使用する場合、関数定義などをpythonで記述することができる
【MySQL】コマンド（DB）

## 概要
MySQLのコマンド備忘録
今回はDB操作

データベース一覧
```
show databases;
```

テーブル一覧
```
show tables;
```
データベースを選択する
```
use データベース名;
```
データベースを新規作成
```
CREATE DATABASE データベース名;
```
【MySQL】コマンド（一部）

## MySQLで使用するコマンド一覧（一部抜粋）

## コマンド一覧

サービス起動
```
mysql.server start
```

サービス終了
```
mysql.server stop
```

サービス自動起動の有効化
```
brew services start mysql
```

サービス自動起動の無効化
```
brew services stop mysql
```

MySQLに接続（ログイン）する時のコマンド
「-uユーザ名、-pパスワード」をスペースを入れずに打ち込む
```
mysql -uroot -proot
```
接続しているMySQLから抜け出すコマンド
```
quit
「-uユーザ名、-pパスワード」をスペースを入れずに打ち込む
apache nextjs リバースプロキシ　設定方法

=================================
apache + nextjs + リバースプロキシで設定する
=================================

１，下記のモジュールが入っていることを確認する。
httpd -M

proxy_module (shared)
lbmethod_byrequests_module (shared)
proxy_balancer_module (shared)
proxy_http_module (shared)

２．サブドメインを一個追加
cd /etc/httpd/conf/httpd.confに追加

<VirtualHost *:80>
  ServerName dev.xxx.jp
  DocumentRoot /home/htdocs/dev.xxx.jp
</VirtualHost>

３．ssl証明書を追加
/usr/bin/certbot

４．reverse proxyになるように修正
<VirtualHost *:443>
	ProxyRequests Off
	ProxyPass         /   http://localhost:3000
	ProxyPassReverse  /   http://localhost:3000
</VirtualHost>

３．再起動
apachectl configtest
systemctl restart httpd

これで、nextjsを起動するとreverseProxyされていました。
nextjsの運用方針が問題だわ・・・
【Linux初心者】プロセスまとめ

## _【Linux初心者】プロセスまとめ_
プロセス確認/削除する方法を自分なりにまとめてみた…

## プロセスとは？
プログラムが要求に応じて実行される場合の実行単位をプロセスという
[Weblio辞書参照](https://www.weblio.jp/content/%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9)

## プロセス関連コマンド
- 「ps」コマンドで確認
    - 他のコマンドのようにオプションの前に-や--が付与されず、アルファベット１文字だけのオプションも数多く存在する
 
~~~
ps aux
~~~

- 「kill」コマンドで終了
~~~
kill プロセス番号
~~~

### カラムと概要(`ps aux`の詳細)
| カラム | 概要 |
| :---: |  :---: |
|USER|プロセスの所有ユーザー
|PID|プロセス番号
|&CPU|CPUの占有率
|&MEM|実メモリでの占有率
|SIZE|仮想分も含めた使用サイズ(Kバイト)
|RSS|実メモリ上の使用サイズ(Kバイト)
|TTY|端末名
|STAT|プロセスの状態
|START|プロセスの開始時刻
|TIME	|プロセスの総実行時間
|COMMAND	|実行コマンド名とパス（シェル表記の場合もあり）

| STATステータス | 概要 |
| :---: |  :---: |
|R|稼動中
|S|一時停止中
|D|停止不可能で一時停止
|T|終了処理中
|Z|ゾンビプロセス（すでに実体は無い）
|W|実メモリ上に無くて，スワップアウトしている
|N|nice値

## どんな時に使う？
- 動作しているか確認
- 自分が利用しているプロセス確認
- ゾンビプロセスを削除するとき
- 動作が重い時何が原因かを調べる


参考サイト
[「ps aux」コマンドで表示される項目の意味を知りたい](https://www.itmedia.co.jp/help/tips/linux/l0158.html)
[運用で使えるpsコマンドの便利な使い方](https://beyondjapan.com/blog/2017/08/pscmd/)
【UiPath Orchestrator】ミドルウェアの設計もちゃんとしようね、って話

UiPath Orchestratorでは主な前提ミドルウェアとして、**IIS**と**SQL Server**を必要とします。
テナントやロボットの設計ばかりに目が行きがちですが、ミドルウェアの設計もちゃんとしないと障害を引き起こす要因となるため、今回はその話をしようとおもいます。

# ある日のできごと・・・

むか～しむかしでもないとある日、AさんはOrchestratorにログインしようとしましたが、エラーでログインができませんでした。
びっくりしたAさんはロボット側の状態を確認しました。
そうすると、ステータスが `オフライン` となっていて、UiPathが停止していることがわかりましたとさ。

## 原因と対処

なんとAさんはSQLServerの設定などを特にせず、デフォルトのままで運用していました。
そのためSQL Serverのトランザクションログがディスク容量の限界まで溜まり、SQL Serverが停止したことでUiPathも停止しました。
データベースは毎日夜間にバックアップを取得していること、夜間のRPA実行予定はないことから、トランザクションログをすべて切り捨てることで復旧させたようです。

稼働監視もいろいろ組み込んではいたのですが、それはまた別の話で。

# ミドルウェアの設計

UiPathのナレッジベースには、こんな素敵な資料が用意されています。
・[Orchestrator管理者のための ミドルウェア運用設定ガイド Ⅰ ～ IIS, SQL Server 編 ～](https://www.uipath.com/ja/resources/knowledge-base/middleware-config-maintenance-guide)

この資料では、IISとSQL Serverでやっておいたほうが良いことが、優先度とともに書かれています。
少なくとも<font color="red">**優先度＝高**</font>のものは、UiPathの稼働停止につながる可能性もあるため、対応しておいたほうが良いでしょう。

なお、ロボットの台数など規模や環境によっては、優先度＝高でも対応不要だったり、逆に優先度＝低でも対応しておいたほうが良いものもありますので、対応要否については実際の稼働状況に合わせて取捨選択してください。

# おわりに

ほかにも、ElasticSearchやRedisなどについてのガイドも提供されています。
・[Orchestrator管理者のためのミドルウェア運用設定ガイド Ⅱ ～Elastic Stack, HAA/Redis, Load Balancer 編～](https://www.uipath.com/ja/resources/knowledge-base/middleware-config-maintenance-guide-vol2)

[UiPathのナレッジベース](https://www.uipath.com/ja/resources/knowledge-base)には、この他にも有用な情報がたくさん載っているので、一度見てみるとよいかもしれません。
CloudFunctionsをデプロイしたらTypeError: Cannot read properties of undefined (reading 'service')というエラーに遭遇したときの対処法

こんにちは。[virapture株式会社](https://virapture.com)でCEOしながら[ラグナロク株式会社](https://ragna-rock.com)でもCKOとして働いている[@mogmet](https://twitter.com/mogmet)です。

本日はfirebaseのデプロイ時に遭遇した問題のトラブルシュート記事になります。

## 問題

`firebae deploy`を行うと下記のようなエラーでデプロイに失敗しました。

> CloudRunServiceNotFound","message":"Cloud Run service projects/project-name/locations/us-central1/services/functionname for the function was not found. The function will not work correctly. Please redeploy.
> TypeError: Cannot read properties of undefined (reading 'service')

デプロイに失敗したゴミCloudFunctionsが残っていると上記のようなエラーになるようです。

## 対策

こちらに答えがありました。

https://github.com/firebase/firebase-tools/issues/4800

下記サイトにアクセスし、不要になったCloudFunctionsを削除してからもう一度デプロイすることで無事にデプロイできました。

https://console.cloud.google.com/functions/list

※ちなみにデプロイこけていたのはpackage.jsonにライブラリが追加されてないことが原因でした。

## まとめ

デプロイに失敗してしまったら[functions/list](https://console.cloud.google.com/functions/list)にアクセスしてCFを削除しよう！


最後に、[ワンナイト人狼オンライン](https://online.1nite-jinro.com/link/blog)というゲームを作ってます！よかったら遊んでね！

https://online.1nite-jinro.com/link/blog

他にも[Camecon](https://camecon.me/)や[Offcha](https://offcha.com/)、問い合わせ対応が簡単にできる[CSmart](https://csmart.jp/lp)、フリーランスのコミュニティの[NextFreelance](https://next-freelance.net/)といったサービスも作ってるのでよかったら使ってね！

https://camecon.me/

https://offcha.com/

https://csmart.jp/lp

Next Freelanceというフリーランス

また、チームビルディングや技術顧問、Firebaseの設計やアドバイスといったお話も受け付けてますので御用の方は弊社までお問い合わせください。

https://virapture.com/

ラグナロクでもエンジニアやデザイナーのメンバーを募集しています！！楽しくぶち上げたい人はぜひお話ししましょう！！

https://ragna-rock.com
ACアダプタを改造して正負電源を作った

USB Audioのオペアンプ駆動用に正負電源が必要なのですが、ネットを検索すると以下のケースがあります。(単電源のオペアンプもあり、この場合は正電源のみで動作します）

* トランスを使いプラスマイナスのレギュレータで作る
* トランスを使いディスクリートで作る(LED電源など)
* 単電源をオペアンプで半分ずつにする
* 単電源からDC-DCコンバーターでマイナスを作る

これまでは「須津技術研究所」さんが解説されているオペアンプを使った回路を使ってきました。

しかしオペアンプを使った回路では出力が小さく、すこし大きなものがほしくなりました。

たまたま使ってない16V 1Aのトランスがありセンタータップも出ています。手元に7805と7905もあるので、これで回路を作ろうと考えていました。

昔はオペアンプというと±15Vとか使っていましたが、昨今は±5Vでも十分だったりします。

しかしオペアンプ駆動に1Aも必要なく、なかなかよい作り方が思い付きません。

いろいろ調べているうちに、使ってないトランスを使ったACアダプタを使う方法を思いつきました。

ちょうど良いものが見つかり、定格9V 600mAでACアダプタでテスターで当たると12Vくらい出ています。ケーブルが断線したかなにかで、殻割りしてありました。

もともとの回路はこのようになっています。

![AC1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/1aa4494c-565c-952a-454f-8b13cd24a96a.png)

ダイオードは1N4001が使われていて平滑用のコンデンサーを外して1N4001を２本追加してブリッジにして、三本を引き出して、そこに正負の定圧回路を付けます。

![AC2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/c3f63262-e428-d784-89bb-9320a1b4078b.png)

トランスの出力はAC 9Vくらいで、コンデンサーで平滑化して1.4倍のDC 12Vくらいになりレギュレータに入っています。

レギュレーターは1Aも必要ないので100mAの78L05と79L05にしました。79L05は何かの基板からはがしたものでSTのSOPです。78L05もジャンクでメーカ不明でなんだか妙に細長いです。

![写真（2022-10-03 13.44）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/f50ed82f-2596-fedf-6529-daefee60dac1.jpeg)

昔はRubyconは水色のコンデンサーを作っていました。

隠れて見えませんが、おまじないに0.1uFのセラコンもつけました。

プラス側の出力の前にジャンパーを入れて、外して電流を測れるようにしてみました。

ACアダプタはトランスであってもセンタータップが出てないケースがあり、その場合は、このような事はできません。

100Vを使った電子工作は感電したり、火災を起こす可能性もあり、十分に注意してください。

最初はいまいちかと思ったのですが、しばらく使ってたらなんだか良いような気がしてきました。

ネットで検索するとトロイダルコアなトランスを使った製作例もありますが、こちらは廃物利用のPoor Audioです。
asciidoctor-pdfでのテーマファイルの指定

# asciidoctor-pdf でのテーマファイル指定の引数
asciidoctor-pdf 2.0あたりからテーマファイルを指定するための引数名が変わったようで（asciidoctor-pdf1.0系列を使っていないので古い事情はわからない）、[asciidoctor-pdfでかっこいいPDFを作る(1)](https://qiita.com/kuboaki/items/67774c5ebd41467b83e2)などで紹介されているやり方ではまくいかない。といってそれほど難しい話ではない。
```
-a pdf-style=mystyle-theme.yml
```
としてテーマファイルを指定していたのを下のようにすればよい。
```
-a pdf-theme=mystyle-theme.yml
```
`pdf-style`が`pdf-theme`に変わった。なお、関連する引数も変わっているので、[Apply a Theme](https://docs.asciidoctor.org/pdf-converter/latest/theme/apply-theme/)をざっとながめるのがよかろうかと思う。
引数の問題さえなければ、[asciidoctor-pdfでかっこいいPDFを作る(1)](https://qiita.com/kuboaki/items/67774c5ebd41467b83e2)の内容は十分に役に立つものである。
Qiitaでもasciidoctorのタグが付いた記事を見ると`pdf-theme`を使ってテーマを指定している記事も見つかる。
わざわざこの内容で1つのトピックにする必要があるのだろうか？とも思うが、`pdf-style`でテーマを指定している記事も検索でかなり引っかかるので、存在する意義はあるかもしれないと考え記載した。
自分は`pdf-style`が使えないことに気づくまでに時間がかかったので、そういう人が少しでも減ると良いかと思う。
タスク管理ツール Stockをちょっと使ってみた

Slackを利用してメンバーと会話していくうちに、このタスクをメモしておきたいな、と思い、都合のいいものがないか探して

使ってみたのが「Stock」というツールです。

タスク管理ツールとして、Plannerを個人やプロジェクトで利用したことはあるのですが、使いにくさを感じることもあったので…

Plannerで使いにくいと感じた点がいくつかありましたが、Stockを使ってみて、それぞれいい具合に使いやすくなりました。

Plannerの使いにくいと感じた点

P:タスクが増え続けると、タスクの箱がそれなりに大きいため、下にスクロールする距離が長くなり、またバケットの横スペースも短いため、視認性が悪い。（同じくバケットを増やすと横にもスクロールが必要で全体的に見づらい。）
P:タスクの内容が変わって今のタスクにメモを残したい、となったときに、ポップアップで開くためメモ欄や画像・資料の添付がやりづらい
P:Slackとの連携ができないので、ログからタスクを作るのが面倒
Stockで１～３を考えると↓

S：タスク一覧のページが横長で画面全体になるので見やすい。かつタスクの検索もできる。
S:タスクのさらに上のくくりとして、ノートというものがあり、そこにはドラッグアンドドロップで資料が添付できたり、自由度の高いメモが書き込めたり、PDFにできたりとタスクに対しての補足等々が自由。ノートはタスクがなくても作れるので、単純にOnenote的な使い方もOK。
 S:Slackとの連携が可能で、SlackのメッセージのメニューからStockへそのままメッセージを乗せたノートを作成可能。（タスクは直接作れない）


ただし、Plannerはバケットを利用して細かい単位でタスク管理が可能ですが、Stockのタスクには任意のタグがつけられず（ノートには任意のタグがつけられる）、対応中/完了でしか管理できないのが残念でした。

上に書いたもの以外は大きく差はないように見えました。

使い方次第だと思いますが、細かい進捗を管理するのであれば、Plannerの方が良いかもしれません。
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その042

こんにちは。本橋孝昭です。

Salesforce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: データと自動化
データ管理と分析管理の演習

にある練習問題10問目をご紹介します

本日の問題はこちらです

今回の内容は動画でも紹介しています

https://www.youtube.com/watch?v=vyypCeCrX-M

<iframe width="560" height="315" src="https://www.youtube.com/embed/vyypCeCrX-M" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-security-and-data-management/review-data-management?trail_id=administrator-certification-prep

![入力規則.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b587c964-94e6-c6c5-eab1-75bf92914114.png)


正解はAの入力規則ですね


特定の条件に特定の項目の入力を必須に設定をするには入力規則で可能です


入力規則はこのような数式です

AND (
ISPICKVAL(StageName, "Closed Won"),
ISBLANK(Delivery_Date__c)
)

https://help.salesforce.com/s/articleView?id=sf.fields_useful_validation_formulas_oppty_mgmt.htm&type=5

ページレイアウトについて
ページレイアウトで設定すれば項目入力を必須にすることは可能ですが、特定の条件で項目入力を促すことは出来ないです。

項目についてもそうです


https://qiita.com/Takaa/items/16fc656ae27eb12aaca7
/lost+found,sync,VFS,/proc/filesystems

●/lost+foundディレクトリ
参照できなくなったファイルを保管するディレクトリ

参照できなくなったファイルが /lost+foundディレクトリに保管されるタイミングはfsckやそのファイルシステム用のチェックツールを使って修復作業を行ったとき。

また、/lost+foundディレクトリに保管されるファイルにはiノードを基に仮の名前が付けられます。仮の名前は元のデータを類推することができるものではないため、復元時には個々のファイルの中身を確認する必要がある。

●syncコマンド
ディスクバッファの内容をすべて確実にディスクに書き込むコマンド。

ディスクアクセスはメモリに比べると遅いため、書き込み命令があった場合にはいったんメモリ上に内容を保存し（ディスクバッファ）、書き込み内容が溜まったらディスクバッファからディスクへ書き込みを行う、という二段階の転送が行われています。
これによりパフォーマンスを向上させているが、ディスクバッファ上にデータが保持されている状態で突然電源が落ちたとすると、そのデータが失われ、ファイルシステムに不整合が発生してしまうことがある。

●VFS （Virtual File System）
Linux で異なるファイルシステムの違いを吸収する為に用いられる仕組み。

VFS が仲介を行なってくれるので、個別のプログラムはファイルシステムの違いを意識する必要がなく、ファイルやディレクトリといった単位で操作を行うことができる。


● /proc/filesystems 
サポートしているファイルシステムの種類の一覧を得ることができるファイル。
ext2、ext3、tmpfs など、実際に /etc/fstab や mount コマンドの指定として記述する名前が一覧
startコマンドの代わりにexplorer.exeを使うといいよ！

## 結論

Windows上でURLを指定して規定のブラウザで開くときには、昔の方法では

```
start https://www.yahoo.co.jp/
```
と書いていましたが、

```
 explorer.exe https://www.yahoo.co.jp/
```

と書くのが今風です。

## 理由

startコマンドはWSLからは呼び出せませんが、explorer.exeはWSLからも呼び出せます(当然PowerShellからも呼べますのでstartコマンドのことは忘れてもいいくらいです)。

## 背景

WSL2にはUbuntu上のGUIで動くChromeもインストールは可能ではあるので、Linux上に入れたChromeを「google-chrome https://www.yahoo.co.jp/ 」で開くことも可能ですが、さすがにフォントがガビガビしていて、WSL2上のchromeを使うという人はいないでしょう。

そうなると、「WSL2からWindows上のGUIアプリを呼び出す」必要があり、explorer.exe経由でWindows側でのデフォルトブラウザを開いています。

## 応用編

WSL上（正確にはWSLに接続したWindowsターミナル」から以下のコマンドを開くことで、今いるフォルダをWindows側のフォルダとして開くこともできます。

```
explorer.exe .
```

Ubuntu上で作ったファイルをSlackにえい！とドラッグ＆ドロップで添付したいときなどは、上記のコマンドはよく使いますね。