OmniAICreator/Qiita-1.07M huggingface dataset:
PythonによるExcel操作【第一弾】

### はじめに
業務効率化をVBAで行っていますが、更なる作業の高速化＆効率を考え、Pythonを利用したExcel操作を行えるようにしたく、学習履歴と忘備録として自分用にメモしようと思います。

また、私と同じくPython初学者の参考になればいいかと思いますが、私自身が初学者の為、誤った事を記述してるかもしれません。
間違っている点などありましたらご指摘頂けると幸いです。

使用した環境は、Windows10 /Python3.8.8 /Anaconda4.10.1 /Jupyter1.0.0 /pandas1.2.4 /openpyxl3.0.7
動作確認環境はJupyterNotebookを使用しました。

---
### ライブラリのチュートリアル

まずは、下記ドキュメントを参照しどのような仕様なのかを理解するといいと思います。

[Openpyxl]("https://openpyxl.readthedocs.io/en/stable/tutorial.html")
[Pandas]("https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html")

分からない事や発生したエラーに関しては、その都度ググりました。
有用なブログの記事などがたくさんありますが、環境によってはうまく動作しない場合もありました。

---
### ライブラリのインポート

```
import os
import pandas as pd
import openpyxl as pyxl
from glob import glob
from openpyxl import load_workbook
```
---
### CSVファイルのデータをDataFrameに確認し、データの確認を行う

---
#### CSV file path の取得
(カレントディレクトリに複数のファイルが格納されており、ファイル番号を指定してpathを取得する事を想定しています。)


```
filepaths = glob(r'C:\Users\UserName\Desktop\notebook\Excel_py\*.csv')
filepaths
# ディレクトリ内にあるファイル名が表示される
```
#### ファイル番号を指定して、Pathを取得する
```
filepath = filepaths[0]
filepath
# 指定したファイルの絶対パスが表示されます
```
#### ファイルの読み込み
```
_df = pd.read_csv(filepath)
_df
# ファイルのデータが表示される
```
#### データの確認
メソッドはかなりの数がありますので、参考の為に一例を記載しておきます。
```
# DataFrame からデータを部分抽出する（4行目の1～4列目を抽出）
columns = _df.iloc[4,[0,1,2,3]]
columns

# 指定した行の抽出（1行目～3行目）
_df[0:3]

# 3行目の抽出
_df.loc[3]

# 特定条件での抽出
_df.query('col7 == "now temp:-100"')
```
---

#### 読み込んだCSVファイルのデータをExcelファイルに転記する

```
# csvファイルを新規作成したExcelファイルに転記する
_df.to_excel(r"C:\Users\UserName\Desktop\notebook\Excel_py\test.xlsx")

# Excelファイルを開いて内容を確認する
```
to_excel メソッドは、第一引数にPATHを指定すると、ファイルが存在しな場合は新規作成され
ファイルが存在する場合は、上書きする。

#### 追記モード
```
# 追記モードで書き込む
with pd.ExcelWriter(r"C:\Users\UserName\Desktop\notebook\Excel_py\test.xlsx",engine="openpyxl" ,mode='a') as writer:
    _df.to_excel(writer, sheet_name='sheet2')
```

※一先ず簡単にファイル操作を行うことができました。
学習したことは、随時追加していきたいと思います。
C++でHTTP通信 HTTPヘッダを追加する<Visual Studio 2022>

C++でサクッとHTTP通信にヘッダーを追加する。
いろんな記事を見たけど・・・
コレ！っていうサンプルが無かった！

~~~cpp:
bool Session::UpdateStatus() {
    Windows::Web::Http::HttpClient httpClient;
	Windows::Web::Http::HttpResponseMessage httpResponseMessage;
	std::wstring httpResponseBody;
    Uri requestUri{ L"<uri>"};

    //★★ここでヘッダー項目を追加している★★
    httpClient.DefaultRequestHeaders().TryAppendWithoutValidation(L"Authorization", L"<認証用文字列>" );

    //POSTデータ
    HttpStringContent content( L"{ \"data\" : 2 }", UnicodeEncoding::Utf8, L"application/json" );
    
    try {
        httpResponseMessage = httpClient.PostAsync(requestUri, content).get();
        if( !httpResponseMessage.IsSuccessStatusCode() ) {
            return false;
        }
    }catch( winrt::hresult_error const& ex ) {
        return false;
    }

	return true;
}
~~~

■参考記事

https://www.web-dev-qa-db-ja.com/ja/c%23/httpclient%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%ABcontenttype%E3%83%98%E3%83%83%E3%83%80%E3%83%BC%E3%82%92%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F/1066841790/
htmlとJavascriptを分割するときの注意点

# htmlとJavascriptを分割のときの注意点

こんにちは、今回も少量ですが投稿しようと思う。
FlaskでWEBアプリケーションを作っている。ただ、使いやすさ追求のためにJavascriptを使っていて、ファイル分割のところでつまずいたので投稿する。
＊かなり初心者向けになっています
### 問題
下記の様にflaskアプリの基本構造を参考にしていた（私の上記のとりあえず作った基本構造は真似しないように）。
また、外部ファイルの方がセキュリティやみやすさを兼ね備えているために、外部ファイルの構造にしようと思い、htmlとjavascriptを分離させた。
[【JavaScript入門】外部JSファイルを読み込んでみよう]("https://www.sejuku.net/blog/62452")

ファイル構造は以下に示す
~~~
main.py
│
　appフォルダ
　│
　├ templatesフォルダ
　　　├ index.html
　　　 ∟ form.html
　├ staticフォルダ
　　　├index.css
　　　├form.css
　　　 ∟form.js
　├init.py
　├form.py
　 ∟views.py
~~~

しかし、Javascriptが動かない。反応しない。だから次のようにした。
### 解決策
~~~
main.py
│
　appフォルダ
　│
　├ templatesフォルダ
　　　├ index.html
　　　 ∟ form.html
　├ staticフォルダ
      ∟css
　　　  　├index.css
　　　  　∟form.css
　　　 ∟js
         ∟form.js
　├init.py
　├form.py
　 ∟views.py
~~~

こうしてtemplatesフォルダを **/css** と **/js** のフォルダに分割し、そこにファイルを入れるとうまくいけた。
templatesのフォルダにcssファイルや、Javascriptファイルをごちゃまぜにするのは良くないらしい。
躓いたら試してみてね。
AWS Certified SAP on AWS - Specialty(PAS-C01) を取得しました

# はじめに
AWS認定コンプリートを目指すべく、PAS-C01を取得しました。

# AWS Certified SAP on AWS - Specialty(PAS-C01) とは
[この辺](https://aws.amazon.com/jp/certification/certified-sap-on-aws-specialty/)を参照ください。

# 教材
1. [SAP on AWS (Technical) (Japanese) (日本語字幕版)](https://explore.skillbuilder.aws/learn/course/12875/sap-on-aws-technical-japanese-ri-ben-yu-zi-mu-ban)
    - 公式の講義+問題集です。
    - 問題集は章毎に数問、最後に28問です。本来の試験よりも難易度は低いです。
1. [AWS Certified: SAP on AWS - Specialty Official Practice Question Set (PAS-C01- Japanese)](https://explore.skillbuilder.aws/learn/course/12528/play/50751/aws-certified-sap-on-aws-specialty-official-practice-question-set-pas-c01-japanese)
    - 公式の模擬試験で、20問です。
1. [試験問題サンプル](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sap-on-aws-specialty/SAP-on-AWS-Specialty_Sample-Questions.pdf)
    - 公式の試験問題サンプルです。10問です。
1. [SAP on AWS 技術文書](https://aws.amazon.com/jp/sap/docs/?pas=sec&sec=prep)
    - 公式のドキュメントです。
1. [SAP Lens AWS Well-Architected Framework](https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/sap-lens/sap-lens.html)
    - AWS Well-Architected FrameworkのSAP版です。
1. [TechHarmony PRESENTED BY SCSK / AWS SAP on AWS Speciality 受験対策](https://blog.usize-tech.com/aws-sap-on-aws-speciality-study1/)
    - SCSK株式会社さんが運営するエンジニアブログです。
    - SAP on AWSに関することが纏まっています。
1. [AWS BlogのSAPに関する投稿]
    - 全部は見ていません。上記各種資料からリンクされているもののみ確認しました。

# 結果
一周するのに110分、見直しに30分費やしました。
HANAが主で、移行・可用性に関する内容が大半を占めていました。Oracle DBが結構な割合で出題していました。AWSサービスからSAP製品に関することまで満遍なく出題していたと思います。
公式問題を理解していれば解けるも問題もそれなりにありました。
Specialtyらしく、即答できる問題は若干で、大半はじっくり考えた上で回答する必要がありました。
日本語訳がおかしいところが数か所あり、理解できない文章の場合は、英語にしていました。

# 感想
- SAP経験は全く無く「HANAって何？」の状態から学習を開始しました。
- Udemyで問題集が提供されておらず、地道にドキュメントを読み込みました。2週はしています。
- これでAWS認定はコンプリートしました！
今後は、今まで取得したものが失効しないように更新していきたいと思います。
Xcode  CLTはインストール済みだが、bundle installに落ちる場合の対処法



## 状況

[この記事](https://k-koh.hatenablog.com/entry/2022/09/01/114030)と同じ状況で、pumaを5.6.5に上げてbundle installをしたらエラーが出てinstallに失敗してしまった。

xcode CommandLineTools(CLT) がインストールされてるか確認してみたが、

```shell
$ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
```

と、すでにインストールされていた。


## 解決した方法

xcodeを開く。
以上。

xcodeを開くと自動でアップデートが走って直りました。
一人タスクの素晴らしさを伝えたい

## はじめに

みなさんこんにちは。プログラミング歴5ヶ月の新米エンジニアです。
この5ヶ月で、ソロ(一人でプログラムを書くスタイル)・ペア・モブ全ての開発手法を経験してきました。
そこでこの記事では、「**初学者の私視点で**」これらの手法について好き勝手に語っていきたいと思います。
大いに主観的な内容となっていることを承知の上で読んでいただけると幸いです。

## ペアプロ・モブプロ（幸福度★）

この人たち、どうも苦手なんですよね。笑
理由はなんと言っても、一人で熟考する余地がないことです。
これには私の性格もある程度関係しています。
大前提として、私は問題にぶつかった時まずは一人で考えたいタイプ。
ペアやモブの場合、分からないことがあったらすぐに質問して解決することができますよね。
これはペアモブの大きなメリットだと思いますが、まず自分で考えたい私にとっては逆にデメリットに感じてしまうわけです。
しかもこれらの質問の中には、瞬時には答えを導き出せないけれども少し考えれば分かる問題がたくさんあるように思います。
もちろん一人では絶対に解決できなかったであろう問題も多々あります。
しかし私としては、そういう問題にもまずは一人で向き合いたいんですね。
「漠然と」分からない状態で質問することにものすごい抵抗を感じてしまうわけです。

そしてこれは同時に、自分で考えたコードではないけれどもそのコードの意味は分かる、という状況をつくり出します。これがものすごく違和感。
これは、受験時代のこんな経験に似ています。
先に問題の解答を見て、「はいはいこうやるのね〜」と分かった気になる。
しかしいざ同じような問題に再びぶち当たると、「うわーこれなんだっけーー」と全く解法が思い浮かばない。
プログラミングでも同じです。
分かった気になっただけで結局何も身についていない感じがどうしても付きまとってくるのです。

もちろん、簡単な処理であればこれらのような感情を抱くことはありません。
しかし、ペアやモブでごくごく簡単なタスクに取り組むことはあまりありませんよね。
ある程度の難易度であることが多いような気がします。
従ってペアやモブをする時は全体的にモヤモヤした気持ちを抱えながら進めることが多くなり、結果的に苦手意識が生まれてしまいました。
私のレベルが周りのみんなに追いつけば、議論も弾んで楽しいんだろうなあとは思いますが。

## ソロプロ（幸福度★★★★★）

ソロの場合、上で述べたようなモヤモヤ感を抱くことはありません。
問題にぶつかればとりあえず自分で考えますし、書いたコードは全て自分が考えたものです。
もちろん質問することもありますが、「自分なりに考え抜いた上で」分からない状態なので、説明してもらった時の理解度や納得感が段違いに大きいです。
そのあとで実際にコードを書く時は、説明してもらった内容をもう一度自分で確かめながら書き進めるので、曖昧な理解に留まることはありません。

ただ質問する時にはペアやモブと違って誰かに作業を中断してもらう必要があるため、ききづらいという意見もあると思います。
確かにこれはペアモブにはないデメリットです。
しかし、そんなことを気にしていてはこちらの仕事も進みません。
ここは心を鬼にするしかないのです。
先輩たちも、無理矢理中断させて質問するなんてことがない限り、快く対応してくれるはず(と信じたい)です。
また全てを教えてもらわなくとも、ヒントだけ与えてもらってあとは自分で考えるという手もありますよね。

兎にも角にも、ペアモブよりも自分の頭で考えることが必然的に多くなることで、しっかり理解した上でタスクを進めることができるわけです。
とっても魅力的だと思います。

初心者の場合はソロの方がペアやモブより時間はかかりますが、タスクを終える頃には内容をしっかり身につけることができています。
このように、タスクに取り組んでいる過程での心持ちも、タスクを終えた後の「モノにできた感」も、ペアやモブより圧倒的に上だと感じています。
質問することが憚られるというデメリットを加味しても、私はソロを推したいと思います。

## 余談

この記事を書き終わった後で、先輩エンジニアが「ペアやモブをすると分かっている時は、事前に自分で全部コードを書いてから取り掛かる」と言っているのを小耳に挟みました。
これなら上述したような事態にはならない可能性が高いのでは？
ということで、次機会があったら試してみることにします。

## 終わりに

プログラミング歴5ヶ月の**超初学者**が各開発手法について一丁前に語らせていただきました。
「君、分かってないよ」みたいな意見がありましたらどしどしコメントください。
最後まで読んでいただきありがとうございました。
後ろ側にある要素をクリック・タップさせる css pointer-event z-index

>後ろ側にある要素をクリック・タップさせる
```
pointer-event: none;
```

https://techblog.yahoo.co.jp/advent-calendar-2016/css_pointer_events/

なんと…知らなかった…
めっちゃ便利。

今まで、「透明なdiv」を画面いっぱいに広げて、z-indexを調整して
押せなくしたりなどしてたんですが、
これで色々調整が楽に…！
VSCodeでESLintとPrettierを用いてPythonファイルをリアルタイムでフォーマットするメモ

<h4>Pythonファイルを保存時にリアルタイムで自動フォーマットさせるためのメモ

1.拡張機能で`ESLint`と`Prettier`をインストール。
2.`python.formatting.provider`を`autopep8`に設定。
3.settingsで検索欄に`format`と入力し`Editor: Format On Save`にチェックを入れる。
Dart JSONでMapをencode/decode

## はい、今回[Freezedとjson_serializable](https://qiita.com/ume-bar/items/d8f14f702ae1a82660f0)でかなり端折ってしまった部分があったので、Flutterにデフォルトで入っている`dart:convertパッケージ`を利用してJSONを使ってMapを変換する仕組みをまとめてみました。


```main.dart
import 'package:flutter/material.dart';
import 'dart:convert' as convert;

void main() {
  final map = {"firstName": "ume", "lastName": "taro", "age": 20};
  
　　　　// まずはMapをJSONの文字列にしてみます(エンコード)
  final json = convert.json.encode(map); 
  print(json); // {"firstName": "ume", "lastName": "taro", "age": 20}

  // つぎにJSON文字列からMapに変換（デコード）
  final mapNew = convert.json.decode(json) as Map<String, dynamic>;
  print(mapNew); // {firstName: ume, lastName: taro, age: 20}

  // Map型をJSON文字列に変換(エンコード)　この時、keyの部分は必ずStringにしないとエラーになります。
  final Map<String, dynamic> encodableMap = {
    "firstName": "ume",
    "lastName": "jiro",
    "age": 18
  };
  final String encodedMap = convert.json.encode(encodableMap);
  print(encodedMap); // {"firstName":"ume","lastName":"jiro","age":18}

　　　　// main()の外にPerson(カスタムクラス)を作ってエンコード
  Person p = new Person("ume", "saburo", 16);
  print("Person:${convert.json.encode(p)}"); // Person:{"firstName":"ume","lastName":"saburo","age":16}

  // 変換不可能なオブジェクトが渡されたときの対処
  Object unencodable = new Object();
  try {
    print(convert.json.encode(unencodable, toEncodable: (e) => e.toString()));
  } on convert.JsonUnsupportedObjectError {
    print("Error");　// "Instance of 'Object'"
  }

  runApp(const ProviderScope(
    child: MyApp(),
  ));
}

// カスタムクラスを変換する場合、クラスにtoJsonメソッドを実装
class Person {
  String firstName;
  String lastName;
  int age;
  Person(this.firstName, this.lastName, this.age);

  // toJsonメソッドを使用することでencode時にJSON文字列へ変換可能なMap型オブジェクトを返す
  dynamic toJson() =>
      {"firstName": firstName, "lastName": lastName, "age": age};
}
```
以上見やすくまとめてみました。`main.dart`をデバッグしてみるとログがでてきて確認できるかと、![スクリーンショット 2022-09-26 15.47.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/b7f5d277-285f-8426-741e-f262be6a5cb6.png)
他にもデコード時の挙動を操作できるパラメータなどもあって、また実装で使うことがあれば記事にしたいと思います。
ESXIで仮想マシンの状態とシャットダウンをする方法

仮想マシンの一覧
vim-cmd vmsvc/getallvms|egrep "\.vmx|Vmid"
IDを確認

仮想マシンの状態【例】
vim-cmd vmsvc/power.getstate 3

仮想マシンのシャットダウン
vim-cmd vmsvc/power.shutdown 3
【保存版】Vue.jsの基礎、テンプレート構文 v-bind、v-on

# Vue.jsの基礎を思いだす
備忘録をかねて視覚的にわかりやすいようにVue.jsの動きをまとめていきたいと思います。

今回はMDNを使用しています。
```
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.6/dist/vue.js"></script>
```

## 対象読者様
・Vue.jsを学び始める方
・Vue.jsを学んでいるけど、「あれここどうなってたっけ？」気分の方
・Vue.jsを学んだが、忘れてしまったので、即思い出したい方。


## htmlとjs間のデータの受け渡しに関して

## v-bind

aタグのhref属性をVueインスタンスのdataから引っ張りたい時

```html
    <div id="app">
        <a v-bind:href="url">Google</a>
    </div>

    省略記法
    <a :href="url">Google</a>
   
```

js側
```javascript

new Vue({
	el:'#app',
	data: {
        url: 'https://google.com',
  },
})

```

## v-bind応用(オブジェクトを渡す)

以下のように書きます。

```html

    <div id="app">
        <a v-bind="{ href: 'https://google.com',id: 32}">Google</a>
    </div>

```
こんな風に色々渡したい時はVueインスタンスのデータにオブジェクトごと保持して簡潔にかけます。

```javascript
new Vue({
	el:'#app',
	data: {
        googoleObj: { //これを渡したい場合
            href: 'https://google.com',
            id: 32,
        },
  },
})

```

html
```html

    <div id="app">
        <a v-bind="googoleObj">Google</a>
    </div>



```


## v-onとイベントオブジェクト

マウスカーソルに合わせてマウスの位置を表示させるようなコードを書いてみようと思います。

```html
    <div id="app">
        <p v-on:mousemove="mousePosition">マウスを乗せてください</p>
        <p>X: {{x}} Y:{{y}}</p> //表示領域 {{}}内はJavascript構文が適用できることに注意(着目)
    </div>

    mousePositionメソッドをjs側で作ります


```

```javascript
new Vue({
	el:'#app',
	data: {
        x:0,
        y:0,
  },
  methods: {
    mousePosition(event) {
        console.log(event)//ここでeventオブジェクトの様々なプロパティをコンソールで確認できます。
        //自インスタンスのデータにアクセスするにはthisを使います    
        this.x = event.clientX
        this.y = event.clientY
        //clientXYというのは下記のコンソール画面に見られるようなeventオブジェクトのプロパティの一つです
    }
  }
})


```

![スクリーンショット 2022-09-26 15.31.14（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2420377/70724088-b872-21a0-9208-25558706b6f1.png)


## v-onでeventオブジェクトの他に引数を渡したい時の表現方法

x, yを割り算してその値を出力したい！といった場合の記述方法を紹介します

html側に特徴があります。 「$event」というものを使って、あとは好きな引数をポンポン入れていきます。

```html
    <div id="app">
        <p v-on:mousemove="mousePosition($event, 10)">マウスを乗せてください</p>
        <p>X: {{x}} Y:{{y}}</p>
    </div>
```

```javascript
new Vue({
	el:'#app',
	data: {
        x:0,
        y:0,
  },
  methods: {
    mousePosition(event, divide) { //ここに新たな引数追加。
        console.log(event, divide) 
        this.x = event.clientX / divide
        this.y = event.clientY / divide
    }
  }
})

```

## 終わりに

続きます(笑)
【Rust入門以前】RustでHello Worldする4ステップ

この投稿ではRustをインストールし、Hello Worldするまでの手順をステップバイステップで解説します。Rust入門以前の「とりあえず、Rust触ってみよう！」系の記事です。

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

下記のコマンドを実行して、Rustをインストールします。

```shell
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```

これを実行してしばらくすると、次のようなインストール方法の選択肢が出てきます。

```
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
```

1を選択すると、Rustの実行ファイルなどが配置されたり、Rustツールのパスが`$PATH`に追加されたりして、すぐにRustが使えるようになります。

ちゃんとインストールできたかを確認するために、`rustc`コマンドでバージョンを出してみましょう。

```
rustc --version
```

次のようにバージョン番号が表示されれば、Rustのインストールは成功です。

```
rustc 1.64.0 (a55dd71d5 2022-09-19)
```

## RustでHello Worldを書く

次のRustコードで`hello.rs`というファイルを作ります。

```rs:hello.rs
fn main() {
    println!("Hello, world!");
}
```

## コンパイルする

Rustで書いたコードを実行するは、基本的に一度コンパイルする必要があります。

コンパイルするには`rustc`をコマンドを使います。`rustc`の第一引数にコンパイルしたいファイルを渡して実行します。

```shell
rustc hello.rs
```

コンパイルが成功すると、`hello`というファイルが生成されます。

## Rustで書いたプログラムを実行する

生成された実行ファイルを実行すると、上の`hello.rs`で書いた処理が実行されます。

```shell
$ ./hello
Hello, world!
```

上のように「Hello, world!」が表示されれば成功です。
docker-composeでコンテナビルド時のapt updateに失敗する

## 結論
  - 最初に`docker-compose up`じゃなくて`docker-compose build`を叩きましょう

## どんな状況？
  - docker-composeで**新規に**コンテナ群を作る状況を想定
  - コンテナAの構築のためのDockerfile内で ubuntuイメージを持ってきて`apt update`するケース
    - これに対して`docker-compose up`を叩くとコンテナビルドの途中、上記`apt update`の箇所でエラー
    - エラーメッセージは「**ubuntu.comなんて見つからないよ？**」みたいな**名前解決エラーの気配**
      ```dockerfile
      FROM ubuntu:20.04
      RUN apt-get -y update && apt-get -y upgrade
      ```

## 解決方法
  - 初めに書いた通り、`docker-compose build`を実行する
    - これで上記`apt update`の箇所の名前解決も通るようになる

## 愚痴
  - コンテナ未構築状態で`docker-compose up`を実行しても普通にコンテナのビルドが走る
    - Dockerfileの内容次第では平和にコンテナ構築が完了する
  - **エラー内容を見てDNS周りを探りに行くとドハマりする**
    - 「コンテナ無いから`up`の前に`build`してくれ」みたいなメッセージが出てくれれば…
    - `/etc/resolv.conf`の修正で解決しているような情報もネット上に溢れているので余計にそうなる
      - 彼らは`docker-compose build`を実行した際に名前解決エラーになっているパターンと考える
    - 補足として実行環境がUbuntu on WSL2である場合、`/etc/resolv.conf`の編集は不要
バッチ処理でファイル転送を行う【Windows10】

サーバからファイルをlocalにコピーする時に、FTPクライアントソフトを使用している方は、結構いるのではないかと思います。
私自身もその一人で、ソフトを起動してはファイルを転送しています。

私は、製造業に従事しており、装置が吐き出すlogファイルを確認したり、logファイルをもとに資料作成したりします。
この作業（ファイルの転送作業）が何気にめんどくさく、効率化できないかと色々調べているといい記事にたどり着きました。

[FTPで自動でアップロード・ダウンロードするバッチファイルの作り方](https://dsstation.sakura.ne.jp/report/misc/ftps.html)

---

### やりたいこと

- linux server にUploadされるファイルを任意のディレクトリにコピーする
- コピーされた任意のファイルをlocal環境にコピーする

---

### ShellScriptとBatchファイルの作成

#### shellscript(test.sh)

```
#!/bin/bash

cd ファイルがUploadされるPATHを記述する

cp ファイルをCopyするPATHを記述する
```

shellscriptはcronで定期実行できるようなのですが、我社のserverではコマンドは使用できなかった為、shellの実行は手動で行います。

※cronコマンドがユーザ側で使用できてしまうと、Serverに負荷がかかる？ため使用できなくしているのかもしれませんね。
よくわからない、知らないことはやらないほうがいいと思っています。
どうしてもやりたいなら、有識者に確認ですね。

どなたかcronに詳しい方いらっしゃれば、教えて下さい。

### バッチ処理

#### Batchファイル（test.bat）

```
echo 'FTP start...'

pause

ftp -s:ftp_test.txt

pause
```

#### バッチ処理で読み込むファイル（ftp_test.txt）

```
open server url
login ID
password

bin
prompt

cd ShellScriptに記述したファイルをコピーしたPathを記述

get FileName.拡張子 コピーしたいlocalのPath + FileName.拡張子を記述する
bye
```

詳しい記述方法に関しては、参考記事を参照して下さい。

尚、バッチ処理の定期実行（自動化）はタスクスケジューラで実行可能だったと思いますが、そこまで使用頻度が多くないため、私の場合は手動で行っています。
興味のある方は、ググってみて下さい。いろいろな記事があると思います。

---

以上、FTPソフトを使わずにファイルをlocalにコピーする方法を紹介させて頂きました。
自分の知らない事を学び実際に実行して正常に動作した時ってとても楽しいです。

これからも学んだことを記事にしていきたいと思います。
『システム運用アンチパターン』輪読会 ９章「せっかくのインシデントを無駄にする」

## イントロダクション

なんかエラー出た。よし、再起動しよ....お、動いた動いた。よしよし。

〜半年後〜

お、またエラー出た。
よし、再起動っと....
あれ...？なんか動かない...なんでー！？

<b>あの時、あの時ちゃんと原因を追求していたら...!!!</b>

---

## インシデントとは

> 本書におけるインシデントとは「予期せぬ、あるいは計画外の出来事が起きてシステムに悪影響を及ぼす場合、その出来事をインシデントと定義する」

---

## ポストモーテムとは

> ポストモーテムとは、チームがインシデントに至るまでの出来事を評価するプロセス。
通常、関連するステークホルダーやインシデント対応に携わった人全員でのMTG形式で実施される。

<br>
<br>
<b>振り返りだね。</b>

---

## 良いポストモーテムの構成要素

 - メンタルモデルの作成
 - 24時間ルールの厳守
 - ポストモーテムのルール設定

---

## メンタルモデルの作成

> メンタルモデルとは、対象がどのように機能するかについてのある人の思考プロセスを表したのもの。メンタルモデルにはコンポーネント間の関係や相互作用、あるコンポーネントの動作が他のコンポーネントにどのような影響を与えるか認識が表される。
> 人のメンタルモデルはしばし間違っていたり、不完全だったりする。
<br>
<br>

こんなことってあるよね...

![図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300430/52766f56-2b8d-9422-3191-55585bc15f9e.png)

アプリケーションの構成や、NW経路、デプロイフローなどはエンジニアのこれまでの経験や、システムの歴史にかなり左右されることがある。
このようなシステムやプロセスにおいて期待と現実のギャップはインシデントの巣窟となるため、失敗に関与したシステムのメンタルモデルは全員で更新する必要がある。

---

## 24時間ルールの厳守


> 24時間ルールとは、自分たちの環境でインシデントが発生した場合、24時間以内にそのインシデントに関するポストモーテムを行うべきというシンプルなもの。
> 理由は
> - インシデント発生してからドキュメント化されるまでにの時間が長くなると状況の詳細が失われるため
> - 失敗の背景にある感情やエネルギーを確実に活用するため

つまり...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300430/778e4ee8-288c-a744-e38e-1138243af503.png)

---

## ポストモーテムのルール設定

 - 人を直接批判してはならない。
 - 誰もが、その時点で得られた情報の中で、最善の仕事をしたと考える。
 - 今となっては明白な事実があっても、その場では曖昧だった可能性があることを認識する。
 - 人ではなくシステムを責める。
 - 最終的な目標は、インシデントに関与した全ての要素を理解することであることを忘れない。

## 後半

以降では本書はインシデント発生事例とともに、ポストモーテムの詳細について触れている。
TypeScript - type predicates

# 要約

TypeScript の type predicates の使い方と使いどころをまとめる。type predicates を使わなくても `typeof` で良い場合もある。他方、

- ある変数が二つの型を取りうる場合
- ある変数が、自分が定義した型を取りうる場合

type predicates を使うことが便利だ。

## ある変数が二つの型を取りうる場合

ある変数が二つの型を取りうる場合は１つの type predicates でどちらの型なのかを TypeScript に明示できる。if else の条件分岐とともに使うことで効果を発揮する。

例えば `value` という変数が文字列か Date オブジェクトかどちらかを取りうるとする。type predicates で文字列かどうかを判定してあげることで、Dateオブジェクトである場合も TypeScript が型を認識してくれる。

```ts
function isDateString(value: string | Date): value is string {
  return typeof value === 'string'
}

const value = '2022-01-01'
let dateObj = null
if (isDateString(value)) {
  dateObj = new Date(value)
} else {
  // TypeScript が value はDateオブジェクトだと認識してくれる
  // isDateStringの引数の指定で文字列かDateオブジェクトと指定している。if文に文字列であった場合が指定されているのでelseにまわるのはDateオブジェクトの場合のみ
  dateObj = value
}
```

## ある変数が、自分が定義した型を取りうる場合

`typeof` オペレータはJavaScriptに元々あるオペレータで限られた型しか判定できない。そのため、対象の変数が、自分が定義した型なのかを判定する場合も type predicates を使用する。
次元の呪いの問題点

## 概要
機械学習において、次元の呪いによってどういった問題が起こるのかの備忘録である。

具体的な問題点を以下に挙げてみた。
1. 多くの次元を学習する必要があり、データ量が必要になる。
1. データ量と次元の多さからトレーニング時間が増える。
1. 不要なノイズが多く、ニューラルネットワークではそういったノイズにまで適合し、過学習が起こる。
1. 余計な特徴量があることでサンプル間の類似度を適切に評価できなくなる。


## 参考文献



https://atmarkit.itmedia.co.jp/ait/articles/2006/29/news023.html
https://datachemeng.com/post-4856/
RAID

# 問題１の気づき
RAIDの違いはデータ及び冗長ビットの記録方法と記録位置との組み合わせだった。

よく見ると
データが並んでいることに気づかなかった。

# 問題３の気づき
５台のうち一台がパリティ記憶領域になるので１台分を引く。
残された容量を足し合わせて求まる。

# ストライピング（RAID0）の弱点
ディスクに障害が起こると復旧することができない。

# 関連記事
https://qiita.com/masatom86650860/items/87342b992f7eafd0ef18


# 出典　
https://www.rescue-center.jp/explanation/raid/type.html

https://gihyo.jp/book/2022/978-4-297-12375-8
Vue.js コンポーネント検証

どうも、豚野郎です。
今回はコンポーネントを使ってみようと思います。

今回もソースの動きを見ながらの検証です。
ドットインストールのソースを参考にしています。
(プログラムは異なります)

## 1. コンポーネントの呼び出し
内容は、ボタンをクリックすると、ボタン横数字とTotalの数がカウントされていくものです。

```js/main.js
(function() {
    'use strict';

    let childComponent = Vue.extend({
        props: {
            message: {
                type: String,
                default: 'button'
            }
        },

        data: function() {
            return{
                count: 0
            }
        },

        template: '<button @click="countUp">{{ message }} {{ count }}</button>',

        methods: {
            countUp: function() {
                this.count++;
                this.$emit('increment');
            }
        }
    });

    let app = new Vue({
        el: '#app',
        components: {
            'child-component': childComponent
        },

        data: {
            total: 0
        },

        methods: {
            incrementTotal: function() {
                this.total++;
            }
        }
    });
})();
```

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Vue</title>
</head>
<body>
    <div id="app">
        <p>Total: {{ total }}</p>
        <child-component @increment='incrementTotal'></child-component>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="js/main.js"></script>
</body>
</html>
```

【ポイント】
・`extend`
サブクラスを作成する時に使います。

・`props`
propsで親コンポーネントから子コンポーネントに渡せる。
(上記のプログラムでは行っていない)

・コンポーネントの`data`は関数で返すルール。

・`this.$emit`
今回はイベントの発火(index.html)。
他にも使い道がある(?)みたいなので、別の記事に今後書きます。
(今回はコンポーネントの検証のため)

・`components`の左の記載箇所はhtmlと同じにする。

・この場合、イベントを発火する際、htmlにも`@increment='incrementTotal’`の記載が必要。
(`incremet`の箇所は任意で決められる)


## 4. 親コンポーネントから子コンポーネントへのデータ渡し
以下のサイトを参考にさせて頂きます。
参考：http://www.code-magagine.com/?p=5939

```js/main.js
// 親コンポーネント
Vue.component('comp-parent', {
  template: '<div><h1>componentの親</h1><comp-child one="たけし" two = "たろう"/></div>'
})
 
// 子コンポーネント
Vue.component('comp-child', {
  template: '<p>componentの子:{{ one }}と{{ two }}</p>',
 
  //親から受け取る属性名
  props: ['one', 'two']
})
 
new Vue({
  el: '#app'
})
```

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Vue</title>
</head>
<body>
    <div id="app">
        <comp-parent></comp-parent>
    </div>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="js/main.js"></script>
</body>
</html>
```
`props`に親から受け取る属性名を記載します。
属性名は自分で決まられます。
また、中をカンマ区切りすれば複数指定できました。

検証したところ「たけし」と「たろう」が表示されました。


## 3. 感想
まだわからないことが多いので学習していきます。
InstacartのリアルタイムMLシステム

今日はこの記事を読みました。
【Lessons Learned: The Journey to Real-Time Machine Learning at Instacart】
https://tech.instacart.com/lessons-learned-the-journey-to-real-time-machine-learning-at-instacart-942f3a656af3

【要約】
・Instacartとは生鮮食品版ubereatsみたいなサービス。
・リアルタイムなMLシステムを構築し、検索ランキング、推薦システム、配送システムなどに適用した。
・リアルタイムとなったことでユーザーへの貢献度を高め、優位なサービスを提供可能になった。
・具体的には、詐欺や需要の低い商品などのノイズ除去や需要のある商品表示の最適化など。
・課題としては、リアルタイム(ストリーミング)分野に強いMLエンジニアが少なく、学習量が多く開発が大変だった。

【感想】
日本ではあまり馴染みの無いサービスの開発秘話を知れてよかった。
今までのMLはとりあえずデータを集めまくって学習しました！パターンが多く、
囲碁や物体判定、画像認識などはそれでも良かったのかもしれないけど、
こういう季節や人の需要による変化、詐欺商品などノイズが常に付き纏うようなサービスの場合は
リアルタイムMLがいいのかも。
AWSサブスクリプションを解約した話

## はじめに
色々検証する中で、サブスクリプションを契約することもあると思う。
AWS環境において契約したサブスクリプションの解約手順について備忘録として記す。

## 解約手順
詳細は[公式](https://aws.amazon.com/jp/premiumsupport/knowledge-center/cancel-marketplace-subscription/)に記載されているので、その通りに実行すると解約される。
※ただし、解約する前に契約中のサブスクリプションに対して接続されている対象を諸々自分で解除しておく必要があるのも事実だ。
　その部分だけ忘れずに解約しておくことで、追加料金がかかることを防ぐことが出来る。

### 解約時の所感
- 今回はサブスクリプション契約したインスタンスを削除する内容だったのだが、対象のインスタンスが契約中のサブスクリプションで起動している状態なのかを確認する項目が、サブスクリプションページ内に存在していた。ここから確認することが出来るのは心強い。
- 解約後、即時でサブスクリプション契約が解約されたことがコンソール上からも判断つくので、反映は早い
- 解約後の料金発生については対象のサブスクリプションによって異なる認識
    - 資料：[SaaSサブスクリプションの料金](https://docs.aws.amazon.com/ja_jp/marketplace/latest/userguide/saas-subscriptions.html)

## さいごに
お読み頂きありがとうございました。
解約の手順自体は全く難しく無いので、問題ないと思いますが、料金発生の部分だけよくよく確認すること
システム構成

# その他のシステム形態
## クラスタコンピューティング
```複数台のコンピュータ```を通信可能な媒体で接続し、```単一のコンピュータとして使用する```方式。
```クラスタシステムや単にクラスタ(cluster)と呼ぶ```こともある。```処理能力と信頼性の両方を実現```できる。

### HPC(High Performance Computing）クラスタ構成
クラスタコンピューティングのうち```処理能力の向上を目的```とした形態
```ハイパフォーマンスコンピューティング```とも呼ばれる。
流体力学や自然現象の解析など、```計算量が多く高速演算が必要な処理を目的```としている。

### HA（High Availability)クラスタ構成
```可用性の向上を目的```としたクラスタ構成。
```現用系と複数の待機系によるホットスタンバイ構成```をとる。
障害に```待機系に引き継ぐアクティブスタンバイ構成```
複数の業務を担当する現用系を```相互に待機系とするアクティブアクティブ構成```がある。

## グリッドコンピューティング
```インターネットなどを介して分散するコンピュータを結びつけ、高い処理能力を得る```方法。
コンピュータの仕様を問わず、誰もがオープンな形で利用できるものが特徴

# システムの利用形態
## クラウドコンピューティング
* インターネットを介して、```ネットワーク上の環境を利用する形態```。
* ```予期費用が不要```で場所や```端末の種類を問わず```利用できる
* ```セキュリティを含む運用管理が不要```
* ```アプリケーションは常に最新```のものを利用できる

### デメリット
```情報漏洩やデータ消失の危険```を合わせ持つ。
# 関連記事
https://qiita.com/masatom86650860/items/5c48af937b12d4d2e137

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
Azure VM の監視運用（ディスク・プロセス編）

## 事前準備
[Azure VMの監視運用（準備編）](https://qiita.com/wwalpha/items/a727fd3e88e45193f41f)

## 監視の設定方法
1. `Insights` > `Monitoring configuration` の順でクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/3ac597de-6a64-2eb4-c49a-d4562f0f047a.png)

2. Monitoring configurationの詳細を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/a06e2212-654d-ee96-7514-1941b1d4d145.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/e691617c-6774-6f20-0d0c-4f58933ba54d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/710cfd9a-149b-430d-f182-1784cd830963.png)

## ディスク使用率の確認方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/b3fcb0d9-1193-d3fd-7063-134915ffee7a.png)

## プロセスの確認方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160072/5f4fc441-5bed-e863-7e6b-716449334257.png)

## その他監視項目
- [Azure VM の監視運用(CPU・メモリ編)](https://qiita.com/wwalpha/items/22d7d233f6b64f60148c)
WixのHTMLコンポーネントは、親ページとpostMessageで通信します

## はじめに

この記事は、WixのHTMLコンポーネントと通信をするための方法を解説、共有するためのものです。

:::note
この記事は2022/09/26時点でのWixを前提に書かれています。Wixの更新によって内容がそのまま適用できない可能性がありますのでご注意ください。
:::

## Wixとは

WixはhtmlやJavaScriptの知識がなくてもWebページを作成できるオンラインツールです。Wixはユーザーが自身のサイトを破壊してしまわないよう、JavaScriptの機能を制限しています。例として、Wix上で編集できるJavaScriptからは[Windowインターフェース](https://developer.mozilla.org/ja/docs/Web/API/Window)に直接アクセスできません。

## HTMLコンポーネント

こうした制限の中で、よりリッチな表現や機能が必要になった時に利用するのが[サイト埋め込み機能](https://support.wix.com/ja/article/wix-%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%EF%BC%9A%E3%82%B5%E3%82%A4%E3%83%88%E3%81%BE%E3%81%9F%E3%81%AF%E3%82%A6%E3%82%A3%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88%E3%82%92%E5%9F%8B%E3%82%81%E8%BE%BC%E3%82%80)です。Wixのオンラインエディタから他のサイトのURLを指定し、[iframe](https://developer.mozilla.org/ja/docs/Web/HTML/Element/iframe)として埋め込みます。

サイト埋め込み機能で作成されるコンポーネントがHTMLコンポーネントです。HTMLコンポーネント内は、Wixのスクリプト制限を受けません。

## メッセージ関数

iframe内のJavaScriptは、読み込み元サイトのJavaScriptとメッセージ関数で通信します。メッセージ関数を使うことで、クロスドメイン制限を受けずに安全にメッセージを受け渡せます。

https://developer.mozilla.org/ja/docs/Web/API/Window/postMessage

HTMLコンポーネント内からは、postMessage関数を使ってメッセージを送信します。

https://www.wix.com/velo/reference/$w/htmlcomponent/onmessage

WixではWindowインターフェースが隠蔽されているため`addEventListener`でメッセージイベントが受け取れません。そのためWixは専用のAPI`onMessage`を用意しています。

```javascript
$w("#myHtmlComponent").onMessage( (event) => {
  let receivedMessage = event.data;
} );
```

HTMLコンポーネントのIDを指定して`onMessage`関数でメッセージイベントを受け取ります。`event.data`内に`postMessage`で送信した内容が格納されています。

:::note
上記リンクでは、URL内の`$`記号がエスケープされるためドキュメントに辿り着けません。下記URLをコピー&ペーストしてドキュメントをご覧ください。 
```
https://www.wix.com/velo/reference/$w/htmlcomponent/onmessage
```
:::

以上、ありがとうございました。
React でテトリス練習サイトを作った

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/7b6a81a6-cc6f-8251-05e7-06a4492e756c.png)

ここで触れる
https://tet-simulator.ahyaemon.com/

ソースコード
https://github.com/ahyaemon/react-tetris

## はじめに

数年前からテトリスをやってるけど、良い感じに練習できるサービスが見当たらない。
いろいろなサイトを巡ってテンプレを探しては実機（自分の場合は switch のぷよテト2）で練習する、というのは効率的じゃない気がした。
実機だとミノが時間経過で落ちてきてしまうので、落ち着いてゆっくり考えることができない。
そこで、自分のペースで考えて練習できるようなサイトを作った。
ほぼ自分用だけど、もしかしたら誰かの役に立つかもしれない。


## 使用技術

- TypeScript
- React
- React Router
- Jest
- Netlify


## 二つのゲームモード

`エンドレス` と `テンプレ練習` の二つのモードを用意した。

### エンドレス

普通のテトリスだけど、時間経過でミノ落ちてこないからゆっくり練習できる。
「一手戻る」機能があるので好きなだけ戻って考え直せる。
あとは最初からやり直すときに `ミノ順ランダム` `ミノ順同じ` `シード値固定` を選べるようにした。

ミノ順ランダム : 毎回違う順番でミノが落ちてくる（つまりシード値が更新される）
ミノ順同じ : 前回のプレイと同じ順番でミノが落ちてくる（つまりシード値そのままでやり直し）
シード値固定 : 好きなシード値で固定してプレイできる

### テンプレ練習

あらかじめ用意されたテンプレートに沿って練習できる。
「ここに落としてください」という目印が表示されるので、それに合うようにミノを設置して行くモード。

![template.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/a8c6adfc-f489-98a5-d69b-bf7060fd2a54.gif)

これが一番作りたかった機能。

## テンプレ作成

エンドレスモードの手順を記録し、テンプレ練習モードのお題として作成することができる。
具体的には、エンドレスでプレイした後、「メニュー」->「テンプレ練習 URL 作成」とすると、専用のテンプレ練習モードの URL が作成される。
URL を共有すれば、自分の作ったテンプレを誰かに練習してもらえる。

↓ DT砲のテンプレを作成するサンプル
![template2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/61a81974-b59f-3f92-c2fa-bcd9d2f5a689.gif)


## UX, レスポンシブ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/9da66e05-c028-c78b-97af-ef2eca5e26e2.png)

レスポンシブというのか分からないけど、キーボード操作とタッチ操作の二種類に対応するようにした。

キーボード操作に関しても [w][a][s][d] キーで移動するパターン（左手で移動させる用）と矢印で移動するパターン（右手で移動させる用）の 2 パターンを用意した。
これは、軽くプレイするには矢印で移動させた方が直感的だけど、一般的な家庭用ゲーム機のコントローラーは左側に十字キーが付いていてそれを踏襲するため。

他にも主要な操作にはキーバインドを用意し、PC からプレイした際になるべくキーボード操作のみでゲームをプレイできるようにした。


## 状態管理

あんまり仰々しい状態管理は苦手なので、シンプルに Recoil を使用した。
自分は状態管理の方法として、オブジェクトを管理対象にするよりは、クラスのインスタンスを管理対象にすることが多い。（これが良いのか分からない）

https://github.com/ahyaemon/react-tetris/blob/main/src/pages/endless/useEndlessProps.ts
https://github.com/ahyaemon/react-tetris/blob/main/src/pages/practice/usePracticeProps.ts

↑みたいな実装。
atom だけ作っておいて、selector は作らない。
selector にロジックを書くよりはクラスに書く方が凝集されてる感じがある。

## Netlify で公開

ahyaemon.com を お名前.com で取得した後に DNS を Netlify に移しており、このサイトはサブドメインで公開した。
Netlify はサブドメインでの公開の設定が一瞬で終わるので楽だった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244354/bc3b29d3-6812-c357-e6f8-55c291d5d59a.png)

DNS を移した後、 `Add domain alias` から `tet-simulator.ahyaemon.com` を追加しただけ。

## おわりに

サイトを作る時間をテトリスの練習に充てた方が上手くなっていたかも知れない
『システム運用アンチパターン』輪読会 3章「盲目状態での運用」

## **盲目状態での運用とは**
システムがどのように機能しているのか実際のビジネスにどういった影響があるのかを把握できていない→ 運用の観点からは事実上、盲目状態

**開発チーム、運用チームは自分の担当範囲を超えて、アプリケーションがどう動くのか理解する必要がある**
開発チームは本番でアプリケーションをどう動くか理解する
運用チームはシステムが何を行っているかどう動くかを理解する

---

## **1 プロダクトの理解はDevOps組織では必須**
ビジネスの観点から理解して価値を付加しなければ、単純なAPIコールに置き換えられて失業する可能性がある...
**ツールに関する専門知識と会社のプロダクトやビジネスに関する知識の組み合わせが運用エンジニアの価値であり必要とされているもの**

## **2 運用の可視化**
**メトリクス**と**ログ**の2つの情報源によって可能。 
現状、多くの組織は役に立つメトリクスやログを効果的に利用できていない。

---

## **2.1 メトリクス**
システムリソースのある時点での測定値。システムで発生している様々なアクティビティの状態を伝えるのに適している。

## **2.1.1 カスタムメトリクスの作成**
運用の可視化を実現するための最初のステップはアプリケーション用のカスタムメトリクスを開発すること.

### **システムを理解するのに役立つ３つのメトリクス**
・**スループット**・・・どのぐらいの頻度でこの処理が発生しているのか？（一定期間内システムを流れる仕事の量）
・**エラー率**・・・どれくらいの頻度で失敗しているか？（リクエストの総数に対してのエラー数）
・**レイテンシ**・・・完了するまでにどのぐらいの時間がかかるか？（特定のアクションが完了するまでの時間）

一般的にゲージとカウンタの2種類でメトリクスを定義する。
・ゲージ・・・ある特定の瞬間の数値(例えば、利用可能なディスク容量)
・カウンタ・・・あるイベントが発生した回数を表し、増加し続ける値(例えば、WEBページのヒット数)

--- 

## **2.1.3 健全なメトリクスを定義する**
メトリクスの値がどうなった場合に調査をするかを定義する
→ サービスのパフォーマンスが大きく変化したことを知り、システムが「健全」かどうかを再評価する
健全なメトリクスを定義するプロセスにプロダクトチームが参加することで許容できるパフォーマンスについて全員の合意を得ることがきる（顧客の声を代弁しどの部分が特に大切なのかを判断できるため）

--- 

## **2.1.4 故障モード影響分析(FMEA)**
システムやプロセスに起こりうるエラーを予測し、トラブル未然防止を図る故障モード影響分析(FMEA=failure mode and effects analysis)を利用する。

エラーが発生する可能性がある箇所を洗い出し、以下3つの軸で1〜10の尺度で評価しスコアを掛け合わせる。
・深刻度・・・エラーが発生した場合にどれだけひどいことになるか
・発生頻度・・・エラーがどれぐらいの頻度で発生するか
・検出可能性・・・社内の監視システムやメトリクスがエラーを検出する前に、顧客がそのエラーに気付く可能性

上記のスコアを掛け合わせて、エラーにリスク優先度番号(RPN=risk priority number)を付与することでリスクが高いものの優先順位をつけることが出来る。
定期的に発生する障害をどのようにして防げば良いのか途方に暮れている場合やアプリケーションがどのように動作するか定まっていない部分を表面化させる際に有益となる。

--- 

## **2.1.5 インシデントや失敗から得られるメトリクス**
**障害が発生した後は必ずその障害を振り返るポストモーテムを行うことで、優れたメトリクスを見つけ出すことが出来る！**
「システムとその現状について答えられないような疑問があったか？」と継続的に問いかけることで監視システムに潜在する多くの欠落部が浮き彫りになる。

--- 

## **2.2 ログについて**
ログは必ず構造化(JSON形式など)し、ログ集約システムなどでチームに権限を与え可能な限り多くの情報を共有し民主化することが大事（DevOpsの中心的な考え方）
プロセスの各機能やステップがどのように動作しているかという情報を集約することで、ビジネスの流れを垣間見ることもできる。

--- 

## **2.2.1 何を記録すべきか？**
最も一般的なログレベルは、DEBUG、INFO、WARN、ERROR、FATAL。
ログメッセージを適切なカテゴリに分類することは、メッセージを記録することと同じくらい重要！
適切なレベルでログを出すかはエンジニア次第だが、適切なログレベルが設定されていないと該当の情報をログから探すことが困難となる。

## **良いログメッセージとは**
**文脈**が大事。ログを見る人はそのログメッセージしか見ないという前提で書くべき。
**ログを読む人のことを考え、エラーメッセージを読むときに生じる疑問を想定する。**
・　何のアクションが実行されたのか？
・　そのアクションの期待される結果は何か？
・　そのアクションの実際の結果は何か？
・ 取るべき修復手順
・　このエラーによって引き起こされる潜在的な結果は何か？(もしあれば)
　　　例：「クレジットカードの認証を完了出来ませんでした」
　　　　　　　　何を意味しているのか必要な情報がないため、オペレーターが実行すべき後処理が不明となり役に立たない。

--- 

## **2.2.2 ログ集約について**
ログ集約の利点は沢山あるが、時間やお金の問題もある。
お金をかけるべきかは、システムが自社の技術ソリューションの中核をなしおらず独自のノウハウもない場合に考える。

### **ログ集約システムの注意点**
・ログの送信制限を超えた場合の影響
・機密情報の取り扱い(SaaSプロバイダに送信する前に取り抜く)
・ログ集約にかかるコストによってログに記録する内容を決めない

--- 

## **本章のまとめ**
・プロダクトを理解することは障害発生時の大きな力となる。
・カスタムメトリクスはシステムがどのように動作しているかの詳細をビジネスの文脈で示すことができる。
・故障モード影響分析は何を監視すべきかを把握するための体系的な方法として使用できる。
・ログメッセージが真に有益であるためには適切なログレベルで記録される必要がある。
・ログメッセージには、そのメッセージの文脈を常に含める必要がある。
ニフクラ mobile backendを拡張するNCMBプロキシを開発中です（ファイルストア、スクリプト）

ニフクラ mobile backendでは認証やデータストア（クラウドデータベース）、ファイルストア（ファイルストレージ）、プッシュ通知など様々な機能があります。そして、サーバーレスで拡張できるスクリプト機能もあります。

しかし、実際のアプリ要件は多彩で、場合によっては他にも様々な機能が望まれます。すべての需要を満たすのは困難な場合もあります。そこで、NCMBのフロントとして動作するプロキシソフトウェアを開発中です。

このプロキシを使うことによって、小さなニーズはプロキシ側で実装できるようになります。一通りの動作はできるようになったので、使い方を紹介します。

## 追加する機能（予定）

現状は透過的なプロキシでしかありませんが、以下のような機能を実装する予定です。

- 認証をJSON Web Tokenに
- GitHub認証
- ソーシャル認証（標準ではサーバー認証が必要ですが、プロキシだけで認証できるように）
- WebSocket（リアルタイム通信）
- Webhooks
- 署名なしでデータストア操作
- 署名なしで実行できるスクリプト
- 全リクエストログ記録

他にもデータストアの集計機能、GraphQL機能なども追加できると便利そうです。なお、Webhooksなどの機能はプロキシ経由でしか実現できませんので注意してください（管理画面で操作しても実行されません）。

## インストール

[NCMBMania/ncmb-proxy](https://github.com/NCMBMania/ncmb-proxy)のリポジトリをクローンします。

```
git clone git@github.com:NCMBMania/ncmb-proxy.git
```

ライブラリをインストールします。

```
npm i
```

## 設定の編集

`setting.example.yml` をコピーして `setting.yml` を作成します。そして、ファイル内にあるアプリケーションキー、クライアントキーをそれぞれお持ちのものに書き換えてください。

```yaml
applicationKey: YOUR_APPLICATION_KEY
clientKey: YOUR_CLIENT_KEY
```

## サーバーを起動

サーバーを起動する際には、以下のコマンドを実行します（まだ開発中なので、開発用サーバーが立ち上がります）。

```
npm run dev
```

例えばローカルの場合、 `http://localhost:3000` にてサーバーが立ち上がります。

## 使い方

今回はJavaScript SDKでの使い方です。実際に利用するアプリケーション側でJavaScript SDKを初期化する際に、以下のように指定します。以下の例で分かるように、認証やデータストアとスクリプトは同じプロキシサーバーで提供されます。

```js
const ncmb = new NCMB("YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY", {
	fqdn: "localhost",
	scriptFqdn: "localhost",
	protocol: "http",
	port: 3000
});
```

この `fqdn` や `protocol` 、 `port` を実際に運用するサーバーのものに書き換えて利用できます。本番運用できるレベルになったら、 `protocol` や `port` は不要でしょう。恐らく以下のようになるはずです。

```js
const ncmb = new NCMB("YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY", {
	fqdn: "example.com",
	scriptFqdn: "example.com",
});
```

これでJavaScript SDKは直接ニフクラ mobile backendにはリクエストせず、 `example.com` へリクエストするようになります。

## コードについて

実際のコードは編集する必要はありません。これまでのJavaScript SDKを使ったコードがそのまま実行できます。

### ファイストアへのアップロード

```ts
const data = fs.readFileSync('./test.jpg');
await ncmb.File.upload('test.jpg', data);
```

### スクリプト

```ts
// Get
await ncmb.Script
    .query({name: 'test'})
    .exec("GET", "script_test_get.js");
// Post
await ncmb.Script
    .data({"name": "test"}) 
    .exec("POST", "script_test_post.js");
// Put
await ncmb.Script
    .data({"name": "test2"}) 
    .exec("PUT", "script_test_put.js");
// Delete
await ncmb.Script
    .query({name: 'test'})
    .exec("DELETE", "script_test_delete.js");
```

## まとめ

ニフクラ mobile backendは便利なmBaaSですが、機能が足りなくて別サービスと組み合わせて使うこともあるでしょう。そうした場合に2つのサービスをクライアントから呼び出すのではなく、プロキシを使うことで1つのサービスであるかのように利用できます。

開発はまだまだこれからですが、ぜひご期待ください。

[NCMBMania/ncmb-proxy](https://github.com/NCMBMania/ncmb-proxy)
剰余計算をSQLプッシュバックさせる

SPSS Modelerでわり算の剰余を求める関数には、modとremの2つがあります。

remはSQLプッシュバックしますが、modはSQLプッシュバックしないので、remを使うようにしてください。


以下のNUM1をNUM2で割った余りを求めてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5d89522a-4d1e-bfc9-0051-0156834a2936.png)

フィールド作成ノードで以下のようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2a47f3cc-a3b7-d3df-c99e-874a6392dd27.png)

これはプレビューするとSQLプッシュバックされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/43761f43-b016-5dd3-56b9-d0d97c7e174c.png)

以下のSQL文が実行されました。

```SQL:remのSQLプッシュバック
SELECT T0.NUM1 AS C0,T0.NUM2 AS C1,
(T0.NUM1 - (TRUNCATE(T0.NUM1 / NULLIF(T0.NUM2, 0), 0) * T0.NUM2)) AS C2 
FROM REMTEST T0
```
以下の結果が得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3ab13e8f-64d4-992e-9972-207d850519a4.png)


modを使うとSQLプッシュバックしません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7998ef61-f3b9-f9b1-be4b-1a7e0b47e5ea.png)

以下のSQL文が実行されました。全件SELECTになってしまっています。
```SQL:modはSQLプッシュバックしない
SELECT T0.NUM1 AS C0,T0.NUM2 AS C1 FROM REMTEST T0
```

結果は変わりません。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8a3f7b2b-86a9-83f0-7e99-f1dba10b4e6b.png)

* テスト環境
    * Modeler 18.4
    * Db2 Warehouse on Cloud
Cookieの取得・設定・削除

## 前提

`name=test` というCookieを操作する

## Java

Cookieの取得
```java
public Response get(@CookieValue(value="test", required=false) String cookieValue){
    String value = cookieValue; //SpringBootならこれでOK。簡単。
}
```


Cookieの設定
```java
public void set(HttpServletRequest request, HttpServletResponse response){
    Cookie cookie = new Cookie("test", "value");
    cookie.setSecure(true);
    cookie.setHttpOnly(true);
    cookie.setPath("/cookie");
    response.addCookie(cookie); //生成したCookieをレスポンスに追加する。
}
```


Cookieの削除

```java
public void delete(HttpServletRequest request, HttpServletResponse response) {
    Cookie[] cookies = request.getCookies();
    for (Cookie cookie : cookies) {
        if ("test".equals(cookie.getName())) {
            cookie.setMaxAge(0); //Cookieの最大有効期間を0秒に設定する。（=無効にする）
            response.addCookie(cookie);
        }
    }
}
```

## JavaScript

Cookieの取得

```javascript
var value = "";
for(var cookie of document.cookie.split(';')){
    if( cookie.split('=')[0] == 'test'){
        value = cookie.split('=')[1];
        break;
    }
}
```

Cookieの設定

```javascript
document.cookie = 'test=value; path=/cookie;
```

Cookieの削除

```javascript
document.cookie = "test=; max-age=0";
```

### おまけ

Session idの取得方法

```java
public SessionResponse getSession(HttpServletRequest request){
    HttpSession session = request.getSession();
    String sessionId = session.getId();
}
```
[開発経験1年未満 優秀賞] 技育展 2022 を終えて 

# 概要

技育展を終えて感じたことや成長したこと言葉にすることができれば良いかなと考えて記述させていただきます．
※独断と偏見も含まれます．ご了承ください．

# 感じたこと

* サービスを開発して，コンテストで登壇した という事実を作ることができたのが1番大きいのかなと思います．

* この経験は他業界で就活する際にも評価されるのかなと思います．なぜなら，自ら行動して取り組んで，制作して，発表しているから．

* この一連の流れを学生が行えるなんて凄いと思う．言い方次第でどの業種にも使えるのかなと思います．


# 成長したこと
* プレゼンを通して，どうすれば相手に聞いてもらえるのか・魅力が伝わるのか を考える良いきっかけとなった．

* 基礎体力がついた(コードを書く力・エラーを処理する方法)

* こうだからこう動かしたいくてこう書くんだ と考える力(論理的思考力？)


# まとめ

 自分の中で感じたことや成長したことについて書かせていただきました．
 
昔からPCが大好きで，プログラミングをすることに憧れていました．このような経験ができてとても幸せです．
システムを開発するに当たって，アドバイスしてくれた皆さん，プレゼンのアドバイスをしてくれた社員のみなさん． そして，技育展コンテストを開催してくれた関係者の方々，

この場を借りて感謝を申し上げます．

本当にありがとうございました，
AlmaLinux起動時に選択するやつをスキップ

# はじめに
![pic001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032988/f4774e9f-87b3-71d6-0fad-8248af37b8a2.png)
まずこれをなんというものなのかがわからなかった。
カーネルイメージを選択しているらしい。

この選択画面が何秒か経つと自動選択され起動し始めるのですが、この画面をスキップしたくなった。
ちなみにAlmaLinuxじゃなくても、CentOSとかでも出ます。

# 環境
AlmaLinux8

# 作業
そもそも何秒か経つと自動選択されるのはタイムアウトの設定が○秒となっているからであり、そのタイムアウト値を0秒にしてあげるとスキップされる。

その値がこれ
```linux:/etc/default/grub 
GRUB_TIMEOUT=0
```

そして、この設定を反映させるのがこちら。
```
grub2-mkconfig -o /boot/grub2/grub.cfg
```

これで完了。
次回起動時から0秒でタイムアウトし、あの選択画面がスキップされます。
あまり使わなくなったCSSスプライト

## なぜ今、CSSスプライト
CSSでシャドーが実装できるようになって、あまり使用することが減った方法ですが、保守案件において現行ソースコードがありますので、記事を書いてみました。
※HTML5プロフェッショナル認定試験　レベル1にて出題される可能性もあるようです。

## What's CSS スプライト
ご自身が制作したWebサイトの表示を高速化するために使われる技法です。
例えば、今回ご紹介させて頂く、複数の画像を1枚の画像として、画像を切り替えます。(＝CSSで表示位置を変えるだけです^^）

### Q:なぜ、画像をまとめる必要があるのか？ 
1枚毎にサーバーへ画像表示リクエストをすると、リクエスト回数が増えるため、場合によっては負荷がかかってしまいます。
そこで、まとめることでリクエスト回数を減らすことができ、それに伴い負荷を極力抑えることができます。

:::note warn
画像をまとめることによって、ファイルサイズが大きくなるため、サイト内で1回のみ表示する画像には不向きです。
繰り返し使用されるアイコンやボタンなどに向いていると言われています。
:::

## CSS スプライト実装
### 画像を用意
<div>
<img width="400" alt="sea" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2854030/14e10998-7f73-c52c-0631-71ccad95f9dc.jpeg">
</div>

<div>
<img width="400" alt="mountain" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2854030/c49fed7d-c4ab-4533-bc0e-4ee5e4caf81f.jpeg">
</div>

上記の画像を1つのファイルにします:information_desk_person:
こんな感じに:hand_splayed_tone2:
<div>
<img width="400" alt="combine" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2854030/240814e6-28c7-1cf3-87a4-06fa1308d80b.png">
</div>

※この作業がデメリットですね・・・:sob:。

### HTMLファイル作成
```
<!DOCTYPE html>
<html lang="ja">

<body>
    <p class="sprite_sample"></p>
</body>

</html>
```

### CSSを記述(今回はHTMLファイル内部に記述します）
```
<style>
　.sprite_sample {
　　display: block;
　　width: 400px;
　　height: 300px;
　　background-image: url("sprite_image.png");
　　background-repeat: no-repeat;
　}

　.sprite_sample:hover {
　　background-position: 0 -250px;
　}
</style>
```

### 完成コード
```
<!DOCTYPE html>
<html lang="ja">

<head>
    <style>
        .sprite_sample {
            display: block;
            width: 400px;
            height: 300px;
            background-image: url("sprite_image.png");
            background-repeat: no-repeat;

        }

        .sprite_sample:hover {
            background-position: 0 -250px;
        }
    </style>
</head>

<body>
    <p class="sprite_sample"></p>
</body>

</html>
```

## 確認
![2022-09-26_13h12_02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2854030/8aecfbef-4cdd-51ca-a5e6-eae975386669.gif)
海の画像が残っていますが、これはイメージしやすいように、完全に画像を切り替えていません^^


### こういう感じで実装されます
マウスカーソルを重ねると**海の画像**から下へスライドして、**山の画像**を表示するような感じで表示されます。
![2022-09-26_13h16_27.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2854030/2c198274-1f00-acde-a97d-aeac90373afb.gif)


## まとめ
前述の通り、現在では使用する機会が減っていますが、知識として持っておくと良いかなーと思います:family_wwgg:
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その035

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

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

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

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

今回の内容は動画でも解説しています

https://www.youtube.com/watch?v=aaHHBl3sQwQ

<iframe width="560" height="315" src="https://www.youtube.com/embed/aaHHBl3sQwQ" 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



問題はこちらです
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/8712935c-0b1d-e4c6-21b2-5a84471cdd6b.png)


正解はAとCですね

階層レベルの保存の設定についてはこちらですね

![階層01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6297296f-93dd-05f2-ec9e-094f3f630224.png)


こちらはClasic環境のみの設定なのでご注意ください
https://help.salesforce.com/s/articleView?id=sf.filter_role_hierarchy.htm&type=5
AWS Certified Data Analytics - Specialty 合格体験記 【文系・IT未経験】

北海道をこよなく愛するピーターです。
AWS Certified Data Analytics - Specialtyを取得しましたので体験記です。

# 学習期間
[AWS Certified Machine Learning - Specialtyを取得](https://qiita.com/ryuta_0309/items/a2946c716936bd0a75c0)した直後から勉強を始めたので2週間程度です。

# 学習方法

## 参考書
[1週間で攻略！AWS認定データ分析 – 専門知識 本番用問題集 140問（65問 × 2セット + 10問） 詳解付き AWS認定本番用問題集シリーズ](https://www.amazon.co.jp/1%E9%80%B1%E9%96%93%E3%81%A7%E6%94%BB%E7%95%A5%EF%BC%81AWS%E8%AA%8D%E5%AE%9A%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90-%E5%B0%82%E9%96%80%E7%9F%A5%E8%AD%98-%E6%9C%AC%E7%95%AA%E7%94%A8%E5%95%8F%E9%A1%8C%E9%9B%86-140%E5%95%8F%EF%BC%8865%E5%95%8F-AWS%E8%AA%8D%E5%AE%9A%E6%9C%AC%E7%95%AA%E7%94%A8%E5%95%8F%E9%A1%8C%E9%9B%86%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B09HH9WQ2Q/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=aws+data+analytics&qid=1664161903&s=digital-text&sr=1-1)

上記の本を読んで合格しました。この本の特徴は日本語が怪しいことです。しかしこれはメリットです。というのも、AWS試験は英文を翻訳した文章であるため、本番は翻訳チックな文章になっています。それに慣れるという意味でこの本は有用でした。

加えて、**この本の問題と似たような問題がかなりの確率で出題されたように感じました。** 問題文を見ずとも、これが答えだろうと当たりをつけることができるレベルです。本資格を受けるのであれば、この本を読んでいれば合格すると思います。

## Black Belt
上記の教材だけでは不安を感じたのでyoutubeで公式のサービス概要を確認しました。
GlueとRedshiftのことばかり問題にでるため、それを確認しました。
視聴した動画は以下です。2倍速で流してちょこっとメモを取ればokです。
蓋を開けてみれば見なくてもよかったかも。。
[AWS Glue](https://youtu.be/px96mjFoZwM)
[Amazon Redshift](https://youtu.be/Myzy68VEXjM)


# おわりに
最近筋トレをはじめました。それとは別に定期的マッサージに行くのですが、「筋肉ついてますね」と言われて嬉しかったです。シュワちゃんを目指したいです。
やればできる。
Windowsでpyenvを動かすとエラーが動かなかった

Windows11でコマンドプロンプトからpyenvを動かしたら以下のようなメッセージが出てpyenvが動かなかった。

> 'chcp' は、内部コマンドまたは外部コマンド、
> #操作可能なプログラムまたはバッチ ファイルとして認識されていません。
> 'cscript' は、内部コマンドまたは外部コマンド、
> 操作可能なプログラムまたはバッチ ファイルとして認識されていません。

どうやら原因は実行ポリシーにあるらしい。
[実行ポリシーについて - PowerShell | Microsoft Learn](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.2)

解決方法は上記Webページに書いてあるとおりだが、
Powershellを管理者でコマンドを打っておく。

### 実行ポリシーの確認例
```Powershell
Get-ExecutionPolicy -List
```

### 実行ポリシーの変更例
```Powershell
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
```

詳細は、
[実行ポリシーについて - PowerShell | Microsoft Learn](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-7.2)
を参照。

Powershellで実行ポリシーを設定しておけば、コマンドプロンプトでも管理者で入っておくだけでpyenvは実行できる。
path設定は忘れずに。

Windowsめんどくさい。
Vue Routerのparamsの渡し方の変更点について

### これまでのparamsの渡し方
これまではcreateRouterで指定した各遷移先にpropsを定義し、画面遷移の際に指定した値をparamsに入れてpushしてあげれば十分だった。

```router.js
export const router = createRouter({
  history: createWebHistory('/'),
  routes: [
    {
      path: '/',
      name: 'first',
      component: FirstPage,
    },
    {
      path: '/second', 
      name: 'second',
      component: SecondPage,
      // ここで遷移元から受け取る変数を定義する。
      props: route => ({id: route.params.id, text: route.params.text}),
    }
  ]
})
```

しかし現在のVue Router（4.1.4）でこの書き方をすると以下のような警告が表示される。

遷移先に渡すはずの変数は破棄されてしまい、変数を受け取る遷移先のpropsにはundifinedが入ることになる。
```
[Vue Router warn]: Discarded invalid param(s) "id", "text" when navigating.
```

### 回避方法
引き続きparamsを使いたい場合はcreateRouterでのpathの定義を以下のように変更する。
```router.js
export const router = createRouter({
  history: createWebHistory('/'),
  routes: [
    {
      path: '/',
      name: 'first',
      component: FirstPage,
    },
    {
      path: '/second:id/:text', //pathの書き方を変更
      name: 'second',
      component: SecondPage,
      props: route => ({id: route.params.id, text: route.params.text}),
    }
  ]
})
```

またqueryを利用する方法もある。
```router.js
export const router = createRouter({
  history: createWebHistory('/'),
  routes: [
    {
      path: '/',
      name: 'first',
      component: FirstPage,
    },
    {
      path: '/second' //pathの書き方はそのまま
      name: 'second',
      component: SecondPage,
      //propsは不要
    }
  ]
})
```

遷移元からボタンクリックで遷移する場合は以下のようにparamsではなく、queryを記述する。
```FirstPage.vue
<button
     @click="() => $router.push({ name: 'second', query: { id: '9999', text: 'XXXXXXX' } })">
</button>
```

遷移先では以下のように受け取ることができる。（createdで受け取る例）
```SecondPage.vue
<script>
export default {
  name: 'SecondPage',
  data() {
    return {
      selectedId: '',
      inputText: '',
    }
  },
  created() {
    this.selectedId = this.$route.query.id
    this.inputText = this.$route.query.text
  }
}
</script>
```

#### 参考
https://github.com/vuejs/router/blob/main/packages/router/CHANGELOG.md#414-2022-08-22

https://github.com/vuejs/router/commit/e8875705eb8b8a0756544174b85a1a3c2de55ff6
Firestoreで複数の並び替え

取得したデータをRDBのように並び替えを複数で行いたいです。
ただこんな感じに書くと、記述内容は間違っていなさそうですが
```Dart
return FirebaseFirestore.instance
      .collection('users')
      .orderBy('id')
      .orderBy('age')
      .startAt([value])
      .snapshots();
```
これだと以下のエラーになります。
```
Status{code=FAILED_PRECONDITION, description=The query requires an index.
```
orderByを2つ使用する場合はインデックスを貼る必要があります。
Cloud Firestoreで登録します。
エラー分の続きのURLから登録することもできます。（こちらのほが簡単）
ビルドの時間は少しかかります。