OmniAICreator/Qiita-1.07M huggingface dataset:
Django新しいアプリケーションの作成方法

Djangoには新しいアプリケーションを作成するときの雛形が用意されている。
それを用いて、アプリケーションのディレクトリーを作成し、URLディスパッチを出来るようにするところまでをまとめる。


まず、Djangoのある仮想環境へ移動する。ターミナルやコマンドプロンプト(cmp)で実行する。
Anacondaを使用している場合は、以下の方法を用いる。

```
#仮想環境の構築
conda create -n djangoenv python=3.10 #djangoenvは仮想環境名、pythonのバージョン指定がなければ記入は不要。
#仮想環境の有効化
conda activate djangoenv#仮想環境名
#仮想環境の無効化
conda deactivate
#作成した仮想環境の一覧
conda env list
#作成した仮想環境の削除
conda remove -n djangoenv --all #djangoenvは仮想環境名
```

そして、Djangoの実行できる環境を有効化したら、以下のコマンドでアプリケーションの雛形を作成する。
```
django-admin startproject FirstProject#FirstProjectはプロジェクトの名前
cd FirstProject #cmpの実行レベルを作成したプロジェクトに合わせる。不要な場合もある。
manage.py runserver
```
最後のコードを実行すると、プロジェクトのURLが発行される。

そして、またcmpで以下のコードを入力すると、appファイルを作成できる。
```
python manage.py startapp first-app#アプリケーションの名前
```
こちらを入力すると、プロジェクト内部にappファイルを作成することが出来る。

ここから、文字を記入したページにURLディスパッチを実行する方法をまとめていく。

作成したアプリケーションをプロジェクト内のsetting.pyに追記する。

```
INSTALLED_APPS = [
   "Django.hello.hello.something", #コンマを付ける。
   "first-app" #作成したアプリケーションの名前を入力する。
```

その後、appファイル内のViews.pyに以下のコードを追加する。
このフォルダに書かれた関数の呼び出しがurls.pyからかかると、returnで書かれた内容がHttpResponseとして返される。
この場合、indexが呼び出されたら、ページに"Something"とでかでかと表示される。

```
from django.http import HttpResponse

def index(request):
    return HttpResponse("<h1>Something</h1>") #リクエストが来たらこの値をレスポンスとして返す
```

そして、appファイル内にurls.pyを作成し、以下の内容を記述する。
これを用いて、URLが指定されたとき、それに対応するページを実行する。
この場合、URLの末尾に何もついていないとき、viewsで作成したindexの関数が呼び出される。
```
from django.urls import path
from . import views

app_name = 'first-app' #appの名前空間を表す。(画面の遷移先を指定する場合に用いる)
urlpatterns = [
    path('', views.index, name='index') #/でアクセスした場合にviewsファイル内のindex関数を返す
```

その後、プロジェクトディレクトリ内のurls.pyにappフォルダ内のurls.pyのパスを通す。
すでにある記述に繋げる形で2行目のimportのあとのincludeとurlpatternsのpathの2行目の記述を追加していく。
```
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('firstapp/', include('first-app.urls')) #最初の引数はURLにつくものだから何でも良い
]
```

こうすると、最初にmanage.py runserverで発行したURLに/firstapp/をつけると以下のような表示ができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2971002/badfe28f-991b-979d-d8d6-9c6e400ce11b.png)

以上でDjangoでページを表示させ、URLディスパッチを作成するところまでのまとめでした。

補足　マイグレーションのやり方も記しておく。
```
python manage.py migrate
```
これを入力するとマイグレーションが実行される。

詳細はまだ理解していないので説明できないが、DBの種類に合わせてsetting.pyのDATABASEを書きかえる必要がある。

```
DATABASES = {
 'default':{
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': BASE_DIR/ 'db.sqlite3'
  }
}
#ENGINE: 利用するデータベース
#NAME: DATABASEの名前
```

デフォルトではSQLite3で有効化されている。SQLite以外では接続先のホスト名、パスワード、ユーザー名なども合わせて記載が必要。
BigQuery Viewの参照状況を調べる方法

以下の記事の手法を使うとBigQueryの特定のテーブルを参照しているクエリを見つけることができます。
しかし、この方法はVIEWに対して使うことができません。
VIEWの参照状況はJOBS_BY_ORGANIZATIONSには格納されず、その代わりにVIEW経由で参照されているテーブルがreferrenced_tablesに格納されています。

https://qiita.com/shiozaki/items/f578808d4c7ddb682ded

では、VIEWに対する参照状況を調べるにはどうしたら良いのでしょうか？
監査ログにはVIEWを参照した情報が格納されているので、これを活用します。

まずは、以下の記事を参考にし、監査ログをBigQueryに保存します。

https://qiita.com/shiozaki/private/302aa331c16c5e1badf7

その後、以下のSQLを実行するとVIEWの参照を行っているクエリ一覧を取得できます。

```sql
select
  protopayload_auditlog.authenticationInfo.principalEmail as email,
  resource.labels.project_id,
  timestamp,
  protopayload_auditlog.servicedata_v1_bigquery.jobGetQueryResultsResponse.job.jobStatistics.referencedViews as referenced_views,
  protopayload_auditlog.servicedata_v1_bigquery.jobGetQueryResultsResponse.job.jobConfiguration.query.query,
from `<プロジェクトID>.audit_log.cloudaudit_googleapis_com_data_access_*`
where
protopayload_auditlog.serviceName = "bigquery.googleapis.com" and
protopayload_auditlog.methodName = "jobservice.getqueryresults" and
array_length(protopayload_auditlog.servicedata_v1_bigquery.jobGetQueryResultsResponse.job.jobStatistics.referencedViews) <> 0
```
今日のアウトゥフィトゥを教えてくるobniz温度計を作成

### WHYこの企画？
最近の天気が寒くなってしまいました。
しかし、時々に奇跡的な暖かい日があります。
（自分は夏が大好きく、冬が苦手人間です）
特に出社する日は朝早いので、よく先日の夜先に衣装を準備しております。
しかし、こういう突然な変わりがあるので、アウトゥフィトゥを判断をミスする時もあります。
だから、もし朝ラインでアウトゥフィトゥのおすすめが送信してくれば、助かります！

### 成果物の紹介（Node-REDの構成）
![截圖 2022-11-24 下午8.08.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885175/e2224336-4f21-5255-3ebe-98f679ee1bad.png)
1.obnizの温度センサーを応用し、今の温度を判断できる
2.温度をグループ分け、node-redのswitchで設定 
3.何度から何度はどんなアウトゥフィトゥがいいのかを決まり、温度による、linebotに違うメッセージを送信を設定
### 動画
obnizの温度センサーがおかしいので、633度と-67度くらいの結果しか出てこないですが。
<blockquote class="twitter-tweet"><p lang="qme" dir="ltr"><a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a><br> <a href="https://twitter.com/hashtag/obniz?src=hash&amp;ref_src=twsrc%5Etfw">#obniz</a> <a href="https://t.co/MioW0u2w4t">pic.twitter.com/MioW0u2w4t</a></p>&mdash; W. Hsu (@winniexedge) <a href="https://twitter.com/winniexedge/status/1595739463031967744?ref_src=twsrc%5Etfw">November 24, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### ソースコード
```[{"id":"09f1b2cc05ea43c4","type":"ReplyMessage","z":"03da83b806aa3f65","name":"","replyMessage":"","credentials":{"channelSecret":"","channelAccessToken":""},"x":800,"y":160,"wires":[]}]```
### 感想
obnizとnode-red連結ができ、そしてlinebotとnode-red連結もできましたが、
3つとも連結するのは時間かかりました。
最終につなげるようにでき、少し感動しています。
このツールがあれば、今後アウトゥフィトゥ予想ミスな日がなくなるように思います。
Nxのdefnの使いどころ

Q学習のプログラム作成中に、エラーが発生しました。

```Elixir
  def get_target(reword, gamma, next_q_max, done) do
    reword + (1-done) * gamma * next_q_max
  end
```

この関数に与えた値が、Nx.Tensorだったので、+ や　*で演算ができなかったのです。

こんな時には、defnを使って関数を定義します。
算術記号を使った記述をNxの演算関数に置き換えてくれるので、うまくいきます。

```Elixir
  defn get_target(reword, gamma, next_q_max, done) do
    reword + (1-done) * gamma * next_q_max
  end
```

defで記述するとしたら、次のような記述ですね。
|>演算子のおかげで、これでもまあ、読めなくはない。

```Elixir
  def get_target_nx(reword, gamma, next_q_max, done) do
    Nx.subtract(1, done)
    |> Nx.multiply(gamma)
    |> Nx.multiply(next_q_max)
    |> Nx.add(reword)
  end
```

算術演算子で書けた方がわかりやすいので、defn使いましょう！
Spread SheetからBigQueryを参照している箇所を特定する方法

BigQueryのConnected Sheet機能を使うと、BigQueryとSpread Sheetを簡単に連携できてとても便利です。

https://cloud.google.com/bigquery/docs/connected-sheets

しかし、その便利さ・気軽さが仇となるケースも存在します。
定期的にBigQueryを参照しているシートが不要になった後もクエリを実行し続け、費用が無駄にかかってしまうことが考えられます。
また、スキャン量やスロット数に問題のあるクエリの監査ログを確認して、実行ユーザーに連絡をとってもConnected Sheet経由のクエリの場合は、身に覚えないと返答されることも多いです。

この記事では、Spead SheetからBigQueryにクエリを実行したログを活用して、どのシートURLからどのクエリが実行されているのかを調査する方法を説明します。

まずGCPの監査ログをCloud LoggingからBigQueryに転送するようなLog Sinkを作成します。

```terraform
resource "google_bigquery_dataset" "audit_log" {
  project    = "<プロジェクトID>"
  dataset_id = "audit_log"
  location   = "US"
}

resource "google_logging_organization_sink" "audit_log_sink" {
  name   = "audit_log_sink"
  org_id = "<Organization ID>"

  destination      = "bigquery.googleapis.com/${google_bigquery_dataset.audit_log.id}"
  include_children = true
  filter           = "protoPayload.@type=\"type.googleapis.com/google.cloud.audit.AuditLog\""
}
```

これにより、監査ログがBigQueryに蓄積されます。

次に、この監査ログに対して、以下のクエリを実行すると、どのシートからBigQueryを参照しているのかが分かります。

```sql
select
  protopayload_auditlog.authenticationInfo.principalEmail as email,
  resource.labels.project_id,
  REGEXP_EXTRACT(protopayload_auditlog.resourceName, r'^projects/[\w-]+/jobs/([\w-]+)$') as job_id,
  timestamp,
  "https://docs.google.com/spreadsheets/d/" || json_value(protopayload_auditlog.metadataJson, "$.firstPartyAppMetadata.sheetsMetadata.docId") as sheet_url,
  json_value(protopayload_auditlog.metadataJson, "$.jobInsertion.job.jobConfig.labels.sheets_trigger") as trigger,
  json_value(protopayload_auditlog.metadataJson, "$.jobInsertion.job.jobConfig.queryConfig.query") as query,
from `<プロジェクトID>.audit_log.cloudaudit_googleapis_com_data_access_*`
where
protopayload_auditlog.serviceName = "bigquery.googleapis.com" and
json_value(protopayload_auditlog.metadataJson, "$.firstPartyAppMetadata.sheetsMetadata.docId") is not null
```
ParquetやIcebergからDelta Lakeへのインクリメンタルなクローン

[Incrementally clone Parquet and Iceberg tables to Delta Lake \| Databricks on AWS](https://docs.databricks.com/ingestion/clone-parquet.html) [2022/10/5時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

ParquetやIcebergのデータソースからのデータを、マネージドあるいは外部Deltaテーブルにインクリメンタルに変換するためにDatabricksのクローン機能を活用することができます。

ParquetやIcebergに対するDatabricksのクローンは、[Deltaテーブルのクローン](https://qiita.com/taka_yayoi/items/50c5a75caff8a6fb721d)や[Delta Lakeへのテーブル変換](https://qiita.com/taka_yayoi/items/ca4c822bcc02f4ea8f7c)の機能を組み合わせます。本書では、この機能のユースケースと制限、そしてサンプルを説明します。

:::note
**プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

:::note
**注意**
この機能はDatabricksランタイム11.3以降が必要です。
:::

# ParquetやIcebergデータのインクリメンタルな取り込みのためにいつクローンを使うべきか

Databricksでは、レイクハウスにデータを取り込むための数多くのオプションを提供しています。以下のシチュエーションにおいてParquetやIcebergを取り込む際にクローンを使用することをお勧めします。

:::note
**注意**
*ソース*テーブルという用語は、クローンされるテーブルとデータファイルを指し、*ターゲット*テーブルはオペレーションによって作成、更新されるDeltaテーブルを指します。
:::

- ParquetやIcebergからDelta Lakeへのマイグレーションを実施しているが、ソーステーブルを使い続ける必要がある。
- 追加、更新、削除がなされるプロダクションソーステーブルとターゲットテーブル間の取り込みのみ動機を維持する必要がある。
- レポーティング、機械学習、バッチETLにおけるソースデータの[ACID準拠](https://docs.databricks.com/lakehouse/acid.html)のスナップショットを作成したいと考えている。

# クローンの構文はどのようなものか？

ParquetやIcebergに対するクローンは、Deltaテーブルのクローンに使うものと同じ基本構文を使用し、シャロークローンとディープクローンをサポートしています。詳細に関しては[クローンのタイプ](https://qiita.com/taka_yayoi/items/50c5a75caff8a6fb721d#%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%B3%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%97)をご覧ください。

多くのワークロードにおいてインクリメンタルなクローンを用いることをお勧めします。ParquetやIcebergに対するクローンではSQL構文を使用します。

:::note
**注意**
ParquetやIcebergに対するクローンでは、Deltaのクローンや変換とは異なる要件、保証となります。[ParquetやIcebergテーブルのクローンの要件と制限](#parquetやicebergテーブルのクローンの要件と制限)をご覧ください。
:::

ファイルパスを用いてParquetやIcebergのディープクローンを作成するには以下の構文を使います。

```sql:SQL
CREATE OR REPLACE TABLE <target_table_name> CLONE parquet.`/path/to/data`;

CREATE OR REPLACE TABLE <target_table_name> CLONE iceberg.`/path/to/data`;
```

ファイルパスを用いてParquetやIcebergのシャロークローンを作成するには以下の構文を使います。

```sql:SQL
CREATE OR REPLACE TABLE <target_table_name> SHALLOW CLONE parquet.`/path/to/data`;

CREATE OR REPLACE TABLE <target_table_name> SHALLOW CLONE iceberg.`/path/to/data`;
```

また、以下のサンプルのように、メタストアに登録されたParquetテーブルのディープクローンやシャロークローンを作成することもできます。

```sql:SQL
CREATE OR REPLACE TABLE <target_table_name> CLONE <source_table_name>;

CREATE OR REPLACE TABLE <target_table_name> SHALLOW CLONE <source_table_name>;
```

# ParquetやIcebergテーブルのクローンの要件と制限

ディープクローンにしてもシャロークローンにしても、クローンが実行された後にターゲットテーブルに適用された変更は、ソーステーブルに同期されません。クローンによるインクリメンタルな同期は一方向であり、ソーステーブルに対する変更は自動でターゲットのDeltaテーブルに適用されます。

ParquetやIcebergテーブルに対するクローンを使用する際には、以下の制限も適用されます。

- このオペレーションでは、ファイルレベルの統計情報は収集しません。このため、ターゲットテーブルではDelta Lakeのデータスキッピングのメリットを享受することができません。
- クローンする前に、パーティションを持つParquetテーブルをHiveメタストアのようなカタログに登録し、ソーステーブルと同じテーブル名を使用しなくてはなりません。パーティションを持つParquetテーブルに対してパスベースのクローン構文を使用することはできません。
- パーティション進化をおこなったIcebergテーブルをクローンすることはできません。
- Icebergテーブルにはパスのみを用いてアクセスすることができます。テーブル名はサポートされていません。
- Unity Catalogではシャロークローンをサポートしていません。


### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
[小ネタ]CDKで作成するAWSリソースに共通タグを付与する方法



## 概要

AWSリソースには付加情報としてタグを付与することができます。
タグは以下のようなケースで、請求金額の管理を行うためなどに利用されます。

・同一アカウントで複数環境を作成している場合、作成したAWSリソースがどの環境のものかわかるようにする
・同一アカウントで複数の部署がAWS環境を触っている場合、作成したAWSリソースがどの部署のものかわかるようにする
・同一アカウントで複数のシステムを作成している場合、作成したAWSリソースがどのシステムのものかわかるようにする

## 試してみた

では、実際にCDKでタグを付与してみます。

Stack APPのCDKは以下になります。

```bin/cdk.ts
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from '@aws-cdk/core';
import { SalesPlanningStack } from '../lib/stack_sales_planning';
import { DevelopmentStack } from '../lib/stack_development';

const app = new cdk.App();
const developmentStack = new DevelopmentStack(app, 'DevelopmentStack', {
});
const salesPlanningStack = new SalesPlanningStack(app, 'SalesPlanningStack', {
});

cdk.Tags.of(app).add("env", app.node.tryGetContext(`environment`)); // 環境
cdk.Tags.of(salesPlanningStack).add("department", "sales_planning"); // 部署(営業部)
cdk.Tags.of(developmentStack).add("department", "development"); // 部署(開発部)
```
・`cdk.Tags.of(app)`で全てのスタック配下の全てのAWSリソースに共通のタグを付与します。
・`cdk.Tags.of(salesPlanningStack)`でsalesPlanningStack配下の全てのAWSリソースに共通のタグを付与します。


 部署(営業部)と 部署(開発部)のCDKは以下になります。
※今回はタグの付与確認が目的のため、どちらもS3バケットのみ作成します。
```lib/stack_sales_planning.ts
import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';

export class SalesPlanningStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    new s3.CfnBucket(this, 'CreateSalesPlanningBucket', {
      bucketName: 'sales-planning-tag-bucket'
    });
  }
}
```

```lib/stack_development.ts
import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';

export class DevelopmentStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    new s3.CfnBucket(this, 'CreateDevelopmentBucket', {
      bucketName: 'development-tag-bucket'
    });
  }
}
```

デプロイ実施時に引数で環境名を渡して、各スタックをデプロイします。
```bash
cdk deploy '*' --context environment=dev
```

作成したS3バケットのタグを確認すると、全スタック共通の環境名と、当スタックの部署名が付与されていることが確認できます。
![1-S3バケット.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/5781ccae-c8db-c48e-2e15-a265e06bb1c5.png)




## おわりに

今回はCDKにおける共通タグの付与方法について説明させて頂きました。
内容としてはシンプルなものになりますが、ご参考になれば幸いです。
Python で計算する準備　足し算・引き算・掛け算・割り算・分数・累乗

Python で計算するために必要なことをまとめてみました。

準備として「足し算」・「引き算」・「掛け算」・「割り算」・「分数」・「累乗」の書き表し方を紹介していきます。

## 足し算

足し算はこのように計算します。

### print(a + b)

```
#a=5
#b=10
print(5 + 10)
#出力結果は「15」
```



## 引き算

引き算はこのように計算します。
### print(a-b)
```
#a=10
#b=5

print(10 - 5)
# 出力結果は「5」
```




## 掛け算

掛け算はこのように計算します。
### print(a * b)

```
#a=5
#b=10

print(5 * 10)
# 出力結果は「50」
```




## 割り算

割り算はこのように計算します。
### print(a / b)
```
#a=10
#b=5

print(10 / 5)
#出力結果は「2」
```



## 分数の書き表し方

分数はこのように書き表します。

### 分子 / 分母 

2分の5
```
5 / 2
```

6分の2
```
2 / 6 
```

60分の8
```
8 / 60
```

## 分数の計算

分数同士はこのように計算します。

### 6分の3たす10分の5は？

```
print (3/6 + 5/10)

※出力結果は「1」
```



## 累乗の書き方

累乗はこのように書き表します。



### （数値）**（数値）

```
#a = 2
#b = 3

print(2 ** 3)

# 「2の3乗」となるため、出力結果は「8」
```

## 累乗の計算

累乗同士はこのように計算します。

### 2の3乗たす3の3乗は？
```
print(2 ** 3+3**3)

#出力結果は「35」
```

## 関連記事

【超基礎編】Pythonで中学 数学の問題を自動作成する方法 - Qiita 

https://qiita.com/akiba_burari/items/f8a11cf0533b889e0af3

Pythonで中学 比例の計算・グラフを描く方法 - Qiita 

https://qiita.com/akiba_burari/items/954f832b408fef353aa3

Pythonで中学方程式の計算 - Qiita 

https://qiita.com/akiba_burari/items/d185a2224c7bb87e5cdf

Pythonで中学 文字式の計算 - Qiita 

https://qiita.com/akiba_burari/items/55ddae0c065fdccdef16
DDDがわからない～ズレない設計を目指して～

# ズレないように開発をしていくには
**ズレ**ないようにすると漠然とした考えで、**ズレのない開発**をするのは、難しいかもしれません。なので、**ズレ**ないようにするためのポイントを考えて見ましょう。

# 認識合わせは定期的に
人の考えや理解は常に変化し続けています。可能な限り頻繁に**名前**や**作りたいもの**について認識合わせをしましょう。

# 辞書を作ろう
システムの開発するなかで、沢山の言葉が出てきます。これが**ズレ**てしまわないようにシステム内で使うすべての名前を辞書にまとめましょう。よく話し合いをしてこの辞書は常に最新化しておきましょう。

# 人とメモ用紙があれば同じことができる
どんなに作りたいシステムが複雑になろうとも、それは人間のやる作業をコンピュータが代行しているだけです。つまり作りたいシステムが何であれ、作りたいものに精通した人とメモ用紙があれば再現できるはずです。システムと現実がかけ離れないように考えることで**ズレ**てしまわないようにしましょう。

# 顧客のイメージをそのままシステムにする
顧客に出した要望を、そのままイメージして作れば顧客の作りたいものにはなります。しかし、それは顧客の作りたいものであって顧客の使いたいものではありません。顧客の見ている正面から見たシステム、開発者の見ている裏側から見たシステムそれぞれの視点をしっかり話し合って開発しましょう。

これで、「DDDがわからない」の本編は**おしまい**です。

残り23日はこれを実現するための糸口を考えるための記事となります。1分で終わるような内容ですので、最後までお付き合いいただけたらと思います。
KVMでよく使うコマンドメモ

# KVM
KVMとはカーネルベースの仮想マシン
最近使うことが多いので、コマンドをメモしておこうと思い記事にしております。

### イメージ作成
```
$ qemu-img create -f qcow2 /var/lib/libvirt/images/TEST.qcow2 16G
```
### インストール
```
$ virt-install --virt-type kvm --name TEST --memory 2048 \
> --vcpus 1 \
> --disk /var/lib/libvirt/images/TEST.qcow2,format=qcow2 \
> --network type=direct,source=nic1,source_mode=bridge,model=virtio \
> --os-type=linux --os-variant=centos7.0 \
> --location=/root/CentOS-7_6-x86_64-DVD-1810.iso \
> --graphics none \
> --extra-args="console=tty0 console=ttyS0,11520n8"
```

### VM一覧表示
```
$ virsh list --all
```

### VM強制シャットダウン
```
$ virsh destroy TEST
```
### VM定義抹消
```
$ virsh undefine TEST
```
### イメージ削除
```
$ rm -f /var/lib/libvirt/images/TEST.qcow2
```

### クローン
```
$ virt-clone --original TEST --name TEST2 --file /var/lib/libvirt/images/TEST2.qcow2
```
### スナップショット一覧
```
$ virsh snapshot-list --domain TEST
```
### スナップショット作成
```
$ virsh snapshot-create-as --domain TEST --name test --description "first ss"
```
### スナップショット削除
```
$ virsh snapshot-delete --domain TEST --snapshotname test
```
あらゆる困難をデバッグする技法

## 「困難は分割せよ」

僕はプログラミングを
大学1年生のときにはじめてから
はや7年が経ちました。

<br/>
<br/>


社会にでてプログラムを書く機会は
すこし減りましたが、
プログラムをかく経験は
僕に人生の一つの教訓をあたえてくれました。

<br/>
<br/>


それが、「困難は分割せよ」。
デカルトの名言です。


## 二分探索の威力

<br/>
<br/>

ここに1から1000の数字が100個並んだ
配列があるとします。

<br/>
<br/>


```
［1,2,8,24,57, ..., 995, 1000］
```

<br/>
<br/>


このなかに558があるかどうかを知りたい時
どうやって探しますか。

<br/>
<br/>

いちばん愚直な発想は
forループで銭湯から探すことです。
早ければ1回目に見つかるし、
一番遅くても100回目には見つかります。


<br/>
<br/>



でもあるアルゴリズムを使えば必ず
たかだか8回で見つけることができます。


<br/>
<br/>
<br/>
<br/>
<br/>
<br/>


それが二分探索です。

<br/>
<br/>

競プロをする人にはおなじみの
最もシンプルなアルゴリズムですね。

<br/>
<br/>


https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86%E6%8E%A2%E7%B4%A2


<br/>
<br/>

かんたんに説明すると、
まず配列の真ん中の数字を見ます。
それが620とかであれば、

```
［1,2,8,24,57, ..., 620, ... , 995, 1000］
```

<br/>
<br/>

558は

配列の左側の

```
［1,2,8,24,57, ..., 620］
```

の中にありますね。

<br/>
<br/>



これを繰り返していくと、
半分、半分、半分、と
558の入っている範囲を
絞り込んでいけるので
すばやく558にたどり着けるのです。



## デバッグするときもそう

実はこの発想が、
プログラムをデバッグする時にも
役に立つんです。

<br/>
<br/>

プログラムがエラーをおこした時
勉強中の僕は
よく先頭から怪しいところを
一つずつ確認していました。

<br/>
<br/>



でも、
プログラムのだいたい半分のところから後ろを
コメントアウトして実行してみて

<br/>
<br/>


そこでエラーが出れば前半に問題があるし
でなければ後半に問題があるわけです。

<br/>
<br/>

これを繰り返すと、
エラー箇所にすばやくたどり着くことができます。

<br/>
<br/>


## 人生のデバッグ

<br/>
<br/>

人生やっていると、
大きなプロジェクトが
たまにありますよね。


<br/>
<br/>

たとえば、英単語帳を
2ヶ月後までに
覚えなきゃいけない。


<br/>
<br/>

このとき、
はじめから一つずつ覚えていくのは
愚直な実装に当たりますね。


<br/>
<br/>

うまくいけば全部覚えられますが
ペースが遅ければ序盤しか覚えられずに
終わってしまいます。


<br/>
<br/>


例えばこうやるのはどうでしょう。

まず
初めの2週間、
単語帳の前半と後半をさらっとやる。

次の4週間は
単語帳を4分割してみっちりやる。

最後の2週間、
単語帳の前半と後半で覚えていないところをやる。


<br/>
<br/>


このように分割すると、
全体をまんべんなく対処できますよね。


<br/>
<br/>


他にも、例えば
猫型ロボットを作りたいと思ったとしましょう。


<br/>
<br/>

どのように分割するか。

僕なら外側と内側に分けます。


<br/>
<br/>

外側は3Dプリンターで作って

内側が動くロボットのところです。


ただ、ロボットは複雑なので、
もう少し分割します。

<br/>
<br/>

ハードウェアのところと
ソフトウェアのところですね。


<br/>
<br/>

ハードウェアはさらに分割して

アクチュエータとか
モーターとか
センサーに分けられますね。



<br/>
<br/>

とにかく、人生の困難は
分割することさえできれば
なんてことないのです。


<br/>
<br/>

それをプログラムのデバッグから
私は学びました。
pushでデプロイ

``` bash:サーバ
git init --bare ~/example.git
cat <<'EOL' > ~/example.git/hooks/post-receive
#!/bin/sh
if [ -e ~//example ]
then
  cd ~/example
  git --git-dir=.git pull
else
  git clone ~/example.git ~/example
fi
EOL
chmod 755 ~/example.git/hooks/post-receive
```

``` bash:開発機
git init
git remote add origin ユーザ名@ホスト名:~/example.git
git add -A; git commit -m "`date '+%Y-%m-%d %H:%M:%S'`"
git push -u origin master
```

``` bash:アンインストール
rm -rf ~/example
rm -rf ~/example.git
```
【Linux】スペースを含む文字列を行単位で繰返し処理する

## `read`を使用

以下のように記述するとスペースを含む文字列を行単位で繰り返し処理できます。  
  
```bash:sample.sh
data=$( cat <<-EOF
    ai 12
    ue 34
    oo 55
EOF
)

while read line
do
  echo $line
done < <(echo "$data")
```

```terminal
$ bash sample.sh
ai 12
ue 34
oo 55
```

また以下のようなこともできます。  

```bash:sample.sh
data=$( cat <<-EOF
      ai 12
      ue 34
EOF
)
while read -a line
do
  echo '行全体'
  echo ${line[*]}
  echo '最初の単語'
  echo ${line[0]}
  echo '2番目の単語'
  echo ${line[1]}
done < <(echo "$data")
```

```terminal
$ bash test.sh
--行全体--
ai 12
--最初の単語--
ai
--2番目の単語--
12
--行全体--
ue 34
--最初の単語--
ue
--2番目の単語--
34
```

## `IFS`を変更

以下のように記述してもスペースを含む文字列を行単位で繰り返し処理できます。  

```bash:sample.sh
data=$( cat <<-EOF
      ai 12
      ue 34
      oo 55
EOF
)

IFS_BACKUP=$IFS
IFS=$'\n'
for line in $data
do
  echo $line
done
IFS=$IFS_BACKUP
```

```terminal
$ bash sample.sh
ai 12
ue 34
oo 55
```
【AWS】[資格]  AWS Certified Security - Specialty (SCS-C01) 合格体験記

# AWS Certified Security - Specialtyについて
Security - Specialtyの資格は専門知識の分野に属する資格になります。
AWS クラウドにおけるデータやワークロードのセキュリティ確保に関する
専門知識が認定されるそうです。

# 現在の資格取得状況
◆AWS
・11冠達成しました。あとはPAS-C01……

◆Azure
・AZ-900、AZ-104、AZ-303、AZ-304

# 結果
2022年7月25日に受験し、無事「合格(839点)」でした。

# 勉強方法
[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)の有料会員になって
SCSの#01-#31を3周しました、前日に#32が追加されたので#32だけ2周。
上記問題集は新機能がついて間違えた問題だけやり直すことができるようになったので、
次の日に間違えた問題をリトライして勉強を進めました。

# 勉強期間
7/1開始→7/25終了なので約1ヶ月です。

# 総評
65問の選択問題が出ました。
全体的にWEB問題集で見たことがある問題が1割～2割弱、似たような問題が2割弱、
他あんまり見た覚えがないので基礎知識で選択肢を減らして回答したのが6割って
感じだったと思います。
全体的にIAM、KMSの問題が多かったと思います。通信中の暗号化か、保存時に暗号化か、
はたまた両方とも対応するのかといったパターンが多いです。

資格を取ったから即戦力になれるかといわれると、そうでもないのが正直なところですが、
勉強して各サービスの特性やサービス同士のつながりが分ってくると、顧客との会話のレベル
がだいぶ変わってくると思うので、取得して損することはないと思います。
Herokuを使ったデプロイについて

# Webアプリを公開するには

自分のパソコン内で作ったWebアプリケーションを世の中に発信するには

どこかでサーバーを用意して、そのサーバーの中でアプリケーションを動かす必要があります。

この作業のことを**デプロイ**と言います。（デプロイメント / deploymentの略で配備する、配置するなどの意）

このデプロイを手助けしてくれるのが**Heroku**というサービスです。

# Heroku

HerokuはPaaSといわれるプラットフォーム構築代行サービスの一つです。

ざっくり言うと、「アプリケーションを動かすための環境を用意してくれるサービス」です。

アプリケーションを動かすには、処理を行うサーバーやログイン情報などのデータを保存するデータベースなどの環境が必要になります。

すべて自分で用意すると、かなりの労力とコストがかかってしまいます。

そのような問題を解決してくれるのが**Heroku**という訳です。

初心者の方には特におすすめなサービスだといえます。

# レンタルサーバーとHerokuの違い

Webサイトを公開する場合よく耳にするのは、エックスサーバーやロリポップなどのレンタルサーバーではないでしょうか。

ホームページを公開するだけであれば、HTML、CSS、Javascriptがメインの作りだと思いますので、その場合はレンタルサーバーが価格的にもおすすめです。

しかしレンタルサーバーだと対応している言語が少なかったり、ライブラリを使用する場合、インポートや設定が必要になるのでHerokuが便利です。

## Herokuで使える言語

- Ruby
- Java
- Python
- Node.js
- PHP
- Go
- Scala
- Clojure

※2022年11月時点

# 初心者に特におすすめな理由

### デプロイが容易に行える

Heroku以外のサーバーだとインフラ周り（Linux)の設定を自分で行う必要があり、

何かあった際にも対処が必要となるので、学習・運用コストが高くなってしまいます。

Herokuであれば、そのような知識なしでもデプロイすることができます。

また、Githubを使えば自動デプロイ機能もあるので、意識せずともデプロイすることが可能です。

# Heroku × Git

Herokuにデプロイする際にはGitを使用します。

Gitで管理しているリポジトリをHerokuへ反映することでHeroku上で該当するアプリケーションの操作が可能となります。

# herokuのアカウント作成&インストール方法

- herokuの公式ページからサインアップページへ移動し、herokuのアカウントを作成する
- メールアドレスの認証をする
- 8文字以上でパスワードの設定（英数・数字・記号）
- クレジットカードの登録
- heroku CLIのインストール
windowsの場合は、windows用のインストーラをダウンロードし、起動する。
Macの場合はターミナルを起動し、下記コマンドを実行。バージョンが出力されればＯＫです。
```
% brew tap heroku/brew && brew install heroku
```

ここまでできればherokuにログインできるようになります。
リストの初期化とnull代入

# 目次
[1.リスト初期化](#1-リスト初期化)
[2.null代入](#2-null代入)
[3.おまけ](#3-おまけ)

## 1. リスト初期化
参照型の変数は「参照」を保持しています。
「参照」とはメモリ上（一時的にデータを保管しておく場所）の、値が格納されている場所のことで、
オブジェクト（変数）の生成はnew演算子を使っておこないます。


ではまずはじめに、さかなリストを作成します。

```java
    // さかなリスト
    List<String> fishLsit = new ArrayList<String>();
    fishLsit.add("あじ");
    fishLsit.add("ししゃも");
    // 出力
    System.out.println("①さかなリスト：" + fishLsit.toString());
```
出力結果は以下の様になります。
①さかなリスト：[あじ, ししゃも]

つぎに、リストの初期化をおこないます。

```java
    // リスト初期化
    fishLsit = new ArrayList<String>();
    // 出力
    System.out.println("②さかなリスト初期化：" + fishLsit.toString());
```
初期化後の出力結果は以下の様になります。
②さかなリスト初期化：[]
初期化され、リストの中身が空になっています。


つぎに、初期化後のリストに要素を追加してみます。

```java
    fishLsit.add("しゃけ");
    fishLsit.add("さんま");
    // 出力
    System.out.println("③要素追加：" + fishLsit.toString());
```
要素追加後の出力結果は以下の様になります。
③要素追加：[しゃけ, さんま]

初期化後に追加した要素のみがリストに入っています。
初期化していない場合は [あじ, ししゃも, しゃけ, さんま] が要素となります。

## 2. null代入
ではここで、ここまで作成したさかなリストにnullを代入してみます。

```java
    // null代入
    fishLsit = null;
    // 出力
    System.out.println("④null代入：" + fishLsit.toString());
```
参照型の変数がnullだと、参照が何もない状態となり、
fishLsitでjava.lang.NullPointerExceptionになってしまいます。


## 3. おまけ
1.でリストの初期化をおこないましたが、初期化しない場合の動きをみていきたいと思います。
今度はあたらしく、花リストを用意します。

```java
    // 花リスト
    List<String> flowerLsit;
    // 出力
    System.out.println("⑤花リスト：" + flowerLsit.toString());
```
これだと「ローカル変数 flowerLsit が初期化されていない可能性があります」
というコンパイルエラーになります。これはnullが入る可能性があることが原因のため、
nullにならないよう、やはり初期化が必要ということになります。
エクスポートしたLogic Appsのワークフローをインポートする方法

こんにちわ、 [のりじ](https://twitter.com/nori790822) です。

最近Power Automateに甘やかされているのでLogic Appsでワークフローを複製したいと思ったときに「あれ？どうやったっけ？」となったので忘備録な記事です。

# 1. ワークフローをエクスポート

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/b79875ea-374e-1219-e1db-cf8156853c32.png)

複製したいワークフローを開き、左メニューの「テンプレートのエクスポート」をクリック。

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/72ebcc13-cd9b-9ecb-8b67-289ed9f76b53.png)

「パラメーターを含める」にチェックが入っているので外し、ダウンロードをクリック。  
zipファイルの中に「template.json」があるので、これをインポート時に利用します。

# 2. カスタム テンプレートからのデプロイを利用

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/ec8d4210-2d5a-889d-2c2a-01b6c7ee3997.png)

検索で「カスタム　テンプレート」と検索。「カスタムテンプレートからのデプロイ」が表示されるのでクリックします。  
図の画面が開いたら「エディターで独自のテンプレートを作成する」をクリック。

![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/3c67c02f-d38b-6503-91ee-c21b8dc9f0cd.png)

「ファイルの読み込み」をクリックし、先程エクスポートしたzipファイル内の「template.json」を選択。  
（zipファイルを解凍していないと読み込めないので注意）

![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/41a7f250-8a18-352e-59b8-22c41fbdf478.png)

JSONが表示されます。  
デプロイ先によって「name」のところを書き換えてください。

- リソースグループが同じ：リネーム必須
- リソースグループが違う：変更無しでもOK

「保存」ボタンをクリックします。

![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/97d9133d-fedb-69ae-8644-8adf01107d0f.png)

最後にワークフローのデプロイ先を選択し「確認と作成」をクリック。
問題なければワークフローのデプロイが完了します。

# 3. 最後に

「パラメーターを含める」で出力したものはデプロイがうまくいかなかったりあったので「ワークフローのみを複製したい」場合はコレが良さそうです。 
ただし複製したワークフローはパラメーターの確認を忘れずに！
sample weightを使ってcalibrationを行う

## 概要
広告のCTR予測において、不均衡データはundersamplingして学習するのが一般的です。
ただし、順序ではなく確率値そのものを正しく予測したいケースで、undersamplingをすると正例負例比率が実際と異なり、calibrationがズレてしまいます。

そこで、モデルが出力する予測値(=以降predictCTRと表記)を実際のCTRに近づけるため、
モデル学習を行う際に学習データと一緒にsample_weightを渡すことでcalibrationを行っていきたいと思います。




## sample weightの実装
XGBoostの学習・検証データは下記のようにdmatrix変換をしますが、
```
dtrain = xgb.DMatrix(train_x, label=train_y)
dvalid = xgb.DMatrix(valid_x, label=valid_y)
```

dmatrix変換時にsample weight配列を渡すことができます。
```
dtrain = xgb.DMatrix(train_x, label=train_y, weight=train['weight'])
dvalid = xgb.DMatrix(valid_x, label=valid_y, weight=valid['weight'])
```

実装はこれだけです。

weightの設定値については要望があれば別途説明したいと思います。
基本的には、ラベル0,1の比率に合わせて設定をしていきます。


## calibration実施前
- sample weightを渡さず、モデル学習をした場合

具体的なCTR値は伏せさせていただいています。
calibration curveでは、斜めに伸びる点線(=45度線)に近いほどcalibrationができていることが確認できます。

calbration curveをプロットしてみると、明らかに45度線から外れて下に張り付いています。
calibration curveの横軸はpredictCTR, 縦軸は実際のCTRです。
つまり、この図からわかることは、predictCTRが実際のCTRよりも大きく上振れてしまっているということです。


![calibration curve](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384461/4bca748a-e40a-169e-7578-bb27f4976c05.png)


## calibration実施後
- sample weightを渡して、モデル学習をした場合

先程のcalibrationなしの状態と比べると45度線に沿ってプロットされていることがわかるかと思います。
ヒストグラムも合わせて確認すると、calibrationが改善されていることが確認できました。

![calibration curve2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384461/d0406d57-0490-46c4-5692-7b5238660efe.png)



## 後書き
今回はsample weightを使ったcalibrationを試してみました。

calibrationの結果、CTR予測モデルの精度が実際に上がるのかについては検証中です。

引き続きcalibration周りの研究を進めるため、進展があれば追記していきたいと思います。
AWS Solutions Architect Associate （SAA-C03）取得までまとめ

合格できた嬉しさのあまり久々に書いています

### 自己紹介
* 元Web系エンジニア、一年前に転職して現在はシステム発注側の中の人 
* 現在の職掌がセキュリティ・インフラ面の担当なのだが、とくにインフラ面がよわよわなのでなんとかせんと感あった
* システム開発側ってやっぱりすてき

### スペック
* 前職はおもにオンプレのバックエンド側のもろもろを担当していた
* 業務でAWSを触ったことはまったくナシ
* 当時は社内物理サーバ内に構築された仮想環境（xen)を利用して、SSH経由でWebサーバやDBサーバをインストールして設定して、などはやっていた。 
なのでEC2を起動してあれしてこれしては比較的理解しやすかったが、それ以外は何ソレ？状態

### 教材と利用方法
|No|教材|ジャンル|利用方法|
|:--:|:--|:--|:--|
|1|[AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト 改訂第2版](www.amazon.co.jp/dp/4815607389)|書籍|これだけでは合格は正直無理なのでは？ただ、自分のようにAWS未経験がAWS全体を俯瞰で捉える目的では十分有益だった|
|2|[【SAA-C03版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座※](https://www.udemy.com/course/aws-associate/)|オンライン教材（有償）|長い。ひたすらに長い。あとテキストも動画も日本語にやや難ありなので気になる人は気になるかも。ただ、自分のようにAWS未経験がハンズオンで取り組むには一元的にまとめられていて効率よく消化できる。全部やる必要はなく、独自ドメインを用いたEC2のAutoScalingを自分で構成できるレベルまででよい気もします（必然的にVPCまわり、EC2、ELB、Route53の知識が必要なので）|
|3|[【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）※](https://www.udemy.com/course/aws-knan/)|オンライン教材（有償）|難易度かなり高めです。本番で全く同じ問題が出にくいようです（レビューより）。6回分収録されており、回を追うごとに問題のマニアック度が上がる印象。まったくお手上げな問題に遭遇したときは、その問題をマーキングし、あとで対象サービスを重点的にBlackBeltなどでざっと理解しました。微妙に迷うような問題に遭遇したときは、いったん一時停止し（制限時間があるので）かまわずググったりしてその場で知識を補填しました。全体で2周くらいして最終的には8割くらいの正答率まで持っていき、不正解した問題や、マーキングした問題を受験1週間前くらいに見直しました|
|4|[AWS サービス別資料（BlackBelt）](https://aws.amazon.com/jp/events/aws-event-resource/archive/?cards.sort-by=item.additionalFields.SortDate&cards.sort-order=desc&awsf.tech-category=*all)|オンライン教材（無償）|まったく触ったこともないサービスについては、BlackBeltの動画またはPDFをざっと見ておくだけで理解度がだいぶ違います。というかそれくらいしか対処法が思いつきません。スマホにダウンロードして、通勤電車内の時間を利用すればちょうどいい感じでした|

※私が学習した時点ではまだC02版でしたが現在はC03版に更新されているようです
### 流れ
#### 2022年8月初旬
* 突然思い立ち、参考書とオンライン教材（いずれも後述）を購入する
* SAA-C02が9月からバージョンアップし、C03になることにこの時点で初めて知る・・・
* 試験範囲めっちゃ拡がるやん・・・
* なので受験日を8月末と定めオンライン登録する
* この時点での学習方針は、実際に手を動かさない**非ハンズオン戦略**をとる（時間ないし）
#### 2022年8月中旬
* 教材No1を一通り読み通し、教材3の模擬試験にチャレンジ
* これがひくほど解けない（正答率が50%にも満たない、正答した問題もイマイチ理解できていない）
* あとで気づいたのですが、購入したオンライン教材が非ハンズオン戦略には不向き
* ハンズオンをしない戦略も体質的になんかいややわあ・・・なので**ハンズオン上等戦略**に切り替え
* ここで**8月末受験を断念**

#### 2022年9月〜10月
* 教材No2の「信頼性の設計（ELB、Auto Scaling、RDS）」を理解して自分で構成できるようにハンズオンする
* その中であやふやな点があれば各サービスを深堀りしたり、BlackBelt参照したりする
* 毎日コンソールを触るのがだんだん楽しくなってくるのがこの頃
* 教材No3にとりくむ。最初は65問解き終えるのにめげそうになっていましたが、最終的には慣れも出てきて、めげずに1時間弱で完走できるようになっていきました
* 本番も途中で集中力切れそうになるので、どの程度のしんどさか、あらかじめざっくり把握できたのはよかったのかなと
* このあたりで2ヶ月かかるのがおっさんクオリティ

#### 2022年11月
* 教材No3の不正解問題、マーキングした問題を見直しつつ試験当日まで過ごす
* そして受験、無事合格できました！嬉しい！

![res.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25351/9d896cc5-5378-adf5-3a77-b6b9ae9518d9.png)

### 所感
* 噂にあるとおり、問題文、長っ
* サービス名称を答えるだけの問題はほぼなかった（1問くらい？）
* 秒で回答できる問題、消去法で回答できる問題、回答に迷う問題は割合いでいうと「2:3:5」くらい？
* 回答に迷う問題はいちおう回答し、「あとで見直す」マークを付けて、とりあえずは完走する。そうすると時間は余りがちなので、じっくり見直す、という正攻法がおすすめ
* 最後に言うのもあれですが、効率を求めて非ハンズオン戦略をとるなら、[ここ](https://techstock.jp/)とかのほうがいいかも（受講してないのであくまで予想ですが）
画面遷移先に値を渡す


## 前提
Storyboard上でのSegueを設定するパターンとSegueなしの2パターンで解説してきます。
`ViewController`→`NextViewController`への値渡しという前提で進めていきます

# Segueあり
**簡単な流れ**
##### 1. Segueをつける
##### 2. SegueにIDをつける
##### 3. 遷移先に変数を用意する
##### 4. Segueで値を渡す


## 1. Storyboard上でSegueを設定する
controlを押しながら`ViewController`→`NextViewController`へ接続します
![スクリーンショット 2022-11-24 18.55.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778525/e2c1d0c7-a996-8f5f-bb2d-cb967caf490c.png)

## 2. SegueにIDをつける
表示されたSegueをタップし、識別子を設定します
![スクリーンショット 2022-11-24 18.53.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778525/e8ad5d1b-e379-a348-b183-08c9429c2059.png)


## 3. 遷移先に変数を用意する

`NextViewController`内に値を受け取る箱を用意します
```ruby:NextViewController
var receiveValue = ""
```

## 4. 遷移元でコード上を記述
```ruby: ViewController
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "toNext" {     
            let nextView = segue.destination as! NextViewController
            nextView.receiveValue = "渡したい値"
        }
    }
```
`ViewController`から遷移した場合、
遷移先の`var receiveValue`に値が代入されている状態になります

# Segueなし
**簡単な流れ**
##### 1. StoryboardIDを設定する
##### 2. 遷移先に箱となる変数を用意する
##### 3. 値を渡す

## 1. StoryboardIDを設定する
Segueなしで画面遷移する場合は、遷移先にStoryboardIDがついていないと遷移できないので、画面遷移先にStoryboardIDをつけます。
![スクリーンショット 2022-11-24 18.54.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778525/6ce47d97-81cf-a0af-41f4-47c4341a9e62.png)

## 2. 遷移先に箱となる変数を用意する
```ruby:NextViewController
var receiveValue = ""
```

## 3. 値を渡す

```ruby:ViewController
@IBAction func NextButtonAction(_ sender: Any) {
    let nextView = self.storyboard?.instantiateViewController(withIdentifier: "Next") as! NextViewController
    nextView.receiveValue = "渡したい値"
    self.navigationController?.pushViewController(nextView, animated: true)
}
```
ボタンタップ時に`ViewController`から遷移し、
遷移先の`NextViewController`内の`var receiveValue`に値が代入されている状態になります
【Laravel】最近WhereInの返す順番で詰まった・・・

# はじめに
もう1年以上書いていないことにびっくりしました。
2022年あけましておめでとうございます

# 仕様
DB
Products
| id |name|created_at|updated_at|
|-------|-------|----|-----|
|1|みかん|2022-11-24 15:00:00|2022-11-24 15:00:00
|2|おでん|2022-11-24 15:00:00|2022-11-24 15:00:00
|3|らーめん|2022-11-24 15:00:00|2022-11-24 15:00:00
|...|...||

こういったDBがありまして、
某サイトみたいな「最近チェックした商品」という機能が欲しいです。
実際にチェックした順番は、「おでん→らーめん→みかん」とします。

# whereInの仕様
わい「なるほど！簡単やな」


``` ProductController.php

public function productHistory()
{
  # そのユーザがチェックした商品を取得する処理は省略します
  $productIds = [2,3,1]; // 仮データ
  $products = Product::whereIn('id', $productIds)->get();
  return $products
}

```

で、できると思っていました。
ですが、APIを叩いてみると「みかん→おでん→らーめん」の順に表示されていました。
？？？と思い少し調べてみると、どうやら`whereIn`は、配列の順番に関係なく
そのテーブル（今回で言うとProducts)の `id`で取得するみたいです。

ここで困ったのが、実際の仕様通りに取得してくるか。
本来は`orderBy`を使って取得してくるのですが・・・

# 解決案
そしていろいろ調べた結果

``` ProductController.php

public function productHistory()
{
  # そのユーザがチェックした商品を取得する処理は省略します
  $productIds = [2,3,1]; // 仮データ
  $products = Product::whereIn('id', $productIds)
   ->orderByRaw('FIELD(id, '.implode(',', $productIds).')')
   ->get();
  return $products
}

```

`FIELD`と `orderBy`を組み合わせることによって実現させました。
こうすると仕様通りの順番になるので、無事実装することができました。
コマンド実行時に　EPERM: operation not permitted, uv_cwd がでる

## 結論

**存在していないファイル上でコマンドを実行していた**

### 解決法
```
cd ..
```
で
```
.Trash
```

が出なくなるまで戻る。
存在している対象ファイルまで

```
cd ファイル名
```

で移動する。

#### 原因
GUI上でファイルを削除したことを忘れてコマンド実行してた。
エラー内容の英語は直訳すると「操作が許可されていない」なので、難しく考えがちだし、よくやらかすのでメモとして。
全マネージメント必読：権限と責任

この話しは、マネージメントをやってる人にはとっても大事な話しです。
でも、ここを理解出来てないマネージメントの人がめちゃくちゃ多いです。過去に私が勤務してた会社でも分かってない人が沢山しました。その度に説明してました。
マネジメントを学んでない経営者とかベンチャー企業に山の様にいます。結構、社長や役員やってる人がこのマネジメントの基礎を知らない事が多い。不幸な人が出ない様に是非理解して読んで欲しいです。

# 権限と責任
■権限とは、
>正式または公的に行為し得る権利の範囲。特に、法規上の職権として、また法律や契約で認められて、行い得る権能の範囲。

会社の中では、マネージメントの人間が予算を決めれたり、勤怠の承認ができたり、ポジションを＆役割変更、指示命令できる等の権限があります。物や人、コストに関して決定できるのが権限。役職によって権限の幅が広がったりしますが、新入社員でも権限があります。人としての権限だったり、仕事、会社を選ぶ権限もあります。

■責任とは、
>人や団体が、なすべき務めとして、自身に引き受けなければならないもの

会社の中では、売上・利益の達成責任、新入社員や若手を育てる教育の責任。当然、若手でも納期を守る責任等もあります。

# 権限と責任はワンセット
必ず、**権限と責任はワンセット**にしてください。よく**権限**のみを与えたり、**責任**のみを与えてしまう間違ったマネジメントをしている人がいます。これは上手に機能しません。

# 責任だけ押し付けてしまう失敗事例
■納期の設定
プロジェクトやタスクで納期の設定をしますが、納期を遅延をして怒られるのは、納期の設定の権限をもった人だけです。若手が上司に言われて、納期の設定する時に、納期の日付を決める権限が若手にあるのであれば、若手の責任ですが、若手が決められる権限を持ってないのに、納期遅延で叱責するのは間違いです。

```
上司：この資料いつ迄にできますか？
若手：この内容であれば、来週月曜日までには出来ます。
上司：では、お願いします。絶対に納期までに責任もって作成してください。
```
この様に期限を設定する権限を移譲して、納期を決めさせる事で、責任も付与する事ができます。

■品質管理部門や共通基盤部門への権限未設定
これ実際によくあります。品質管理や共通基盤を策定する様な部門を作って、共通化、効率化、品質管理をしようと試みて専門部署を設置して人を配置するまではとても良い動きです。
しかし権限を与えずに責任だけをミッションと与えてしまうと、全く機能しません。機能させる事が出来ないのです。担当側には、プロジェクト目線の責任があります。ステークホルダーとして関係のない品質管理部の話しに耳を傾ける余裕等ないのです。これを機能させるには必ず権限と責任を渡す事が必要です。
品質管理であれば、チェックをさせずにリリースをした場合に違反として、評価に影響させる。又、品質管理からの指摘事項に従わなかった場合も違反としてペナルティを与えましょう。
共通基盤も同じで良いフレームワークやテンプレートを用意しても使われないと意味がない。使われる様に普及させるのが役割とか言うマネージャーは、マネジメントの基礎を理解してません。品質管理と同じく使われないとペナルティを与える仕組みにする事が重要です。権限をもたせるのです。

# 権限だけ渡してしまう失敗事例
■３６０度評価設定
周りの評価も大事だという事で、目標設定以外にも他人の評価も加えた、360度評価をやろうとする人事がいます。
ここまでは良いのですが、評価対象者を部署の全員とかにするのは、間違いです。良かれと思って全メンバーに平等に評価権限を渡してしまうミスが良く起こってます。評価対象者は、評価する責任をもったメンバーに厳選するべきです。責任を持ってないメンバーに権限を渡してしまうと**職権乱用**が起こるためです。
例えば、組織に対して責任を持ってないメンバーは、あの人嫌いだから点数低く、あの人好きだから点数高く、あの人は雰囲気暗いし。。。と言った具合の評価になってしまうでしょう。責任がないのだから当たり前です。
一方、組織に対して責任をもったメンバーであれば、組織成長のために、適当な評価はしません。組織が崩壊してしまうと自分が困るためです。

# 必ず権限と責任をペアにする
仕事を依頼する時に、常に責任を渡してるが、権限も渡しているかを確認してみましょう。知らずうちに責任のみ渡しているパターンをよく見ます。
社内の仕組みを考える時に、**職権乱用**になってないか常に確認してみましょう。権限を渡すのは、責任を持った人に限定すべきです。
権限と責任が揃ってないと、社内の優れた仕組みも全く機能しません。
今からでも社内の仕組み見直してみてください。
# お願い
今後も続けていきますので、フォロー、イイね、シェアお願いします。
下記、説明会もご参加下さい。
[エンジニア年収アップ講習(転職サポート付き！)　無料説開会　12月6日　19時開催](https://cto-can-be.hp.peraichi.com/)
rails7にjsのブラウザバージョン互換性テスト導入

# はじめに
今回は`eslint-plugin-compat`を使ってブラウザのバージョンテストを導入しました。
githubに手順が載っているので、それ通りやってもらえればできます。

https://github.com/amilajack/eslint-plugin-compat

# ダウンロード
yarnで落としました
```
yarn add eslint-plugin-compat
```

# ファイル変更
```eslintrc.json
   {
+    "plugins": ["compat"],
+    "extends": ["plugin:compat/recommended"],
+    "env": {
+      "browser": true
+    },
     // ...
   }
```
```package.json
{
     // ...
+    "browserslist": [
+      "defaults"
+    ]
  }
```

# 思ったこと
思ってた数倍簡単に導入することができました。

これを導入しようと思った原因は、実際に僕がモダンなjsを書いて特定のバージョン以下で動作しなくなったことです。その時は`Public class fields（パブリックフィールド宣言）`を書いてしまったのですが、これは残念ながら`eslint-plugin-compat`では検知できなかったです。eslint側で`ES2015`を指定しても検知されなかったです。
BigQueryのスケジュールクエリをキリの良いタイミングで実行する方法

BigQueryで定期的な集計処理を行うときにスケジュールドクエリを利用することがあります。
Cloud ComposerなどのWorkflow Engineを使用するのと比較すると機能が貧弱ですが、気軽につかえるというメリットがあります。

例えば、1時間毎にクエリを実行したい場合は、以下のようなtfファイルをapplyすれば作成できます。

```terraform
resource "google_bigquery_data_transfer_config" "scheduled_query" {
	display_name = "<表示名>"

	project = "<プロジェクトID>"
	location = "<処理を行うリージョン>"

	data_source_id = "scheduled_query"

	schedule = "every 1 hour"
	params = {
		"query" = "SELECT ..."
	}
}
```

しかし、この方法で作成したスケジュールクエリは1時間毎に実行されますが、cronの `0 * * * *`のようには動いてくれません。
以下の実行ログから分かるように、毎時04分から処理が動きます。
なおかつ、この04分はterraform applyしたタイミングによって変化し、例えば12:34にapplyした場合は毎時34分に実行されます。

![スクリーンショット_2022-11-24_18_22_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74551/a15ba78d-cb07-0def-d966-d0404f05114e.png)

every 1 hourという意味では間違っていないですが、cronのように毎時0分に動いて欲しいケースもあります。

どのようにすればapplyタイミングに依らずに毎時0分に稼働されることができるのでしょうか？

# 答え

`synchronized` を追記する。

`every 1 hour synchronized` と記載すると、毎時0分に実行されるようになります。

スケジュールクエリのscheduleを指定するときのフォーマットはAppEngineのものと同じなので、AppEngineのcron.yamlのドキュメントを確認します。

https://cloud.google.com/appengine/docs/flexible/scheduling-jobs-with-cron-yaml?hl=ja#formatting_the_schedule

上記のドキュメントによると、 `synchronized` は `from 00:00 to 23:59` を指定するのと同じであることが分かります。
つまり、 `every 1 hour`を指定するだけでは曖昧だったスケジュール実行の始点となる時刻を00:00に設定しています。これによって、毎時0分に実行されるようになります。

また、ドキュメントにも書かれている通り、 `synchronized` を指定する場合には、 `every N hour` のNは24の約数である必要がある点には注意が必要です。
Git 歴史をさかのぼり、ブランチを作成する方法

# 概要

- コミットを遡り、ブランチを作成する方法をまとめる.

# 必要な情報

- 遡りたいコミットのコミットID

# 方法

1. 下記コマンドを実行して、遡りたいコミットまで戻る。

    ```shell
    git reset --hard 戻したいコミットのコミットID
    ```

1. 下記コマンドを実行してブランチを作成する。

    ```shell
    git branch 作成したいブランチ名
    ```

1. 下記コマンドを実行することで遡りまえのコミットに戻れる。

    ```shell
    git reset --hard HEAD@{1}
    ```

# 自分用メモ

- この方法だと分岐元ブランチの歴史が巻き戻って取り返しのつかないことになる可能性がある。注意したほうがよいかも
- --hardで戻してしまった時の解決方法

https://zenn.dev/kazuwombat/articles/eced2915b6adff

- 間違えてリセットしてしまった時は`$ git reflog`で履歴を確認し、`$ git reset --hard 作業エイリアス`で戻る事ができる。
EventRegist-enavleでZoomウェビナーを開催してみた

# はじめに

ビジネスイベントのオンライン配信プラットフォーム EventRegist-enavle(イベントレジスト-エネイブル)でZoomウェビナーを開催した時の備忘録メモです。

https://info.eventregist.com/registration-service/enavle

# 今回は5回目でハイブリッドイベント

コロナの前まではオフラインイベント、コロナ禍はオンラインイベント。
そしてコロナも少し落ち着き、今回はオフラインとオンライン同時併催のハイブリッドイベントとなり、これまでの経験とノウハウの集大成としてハイブリッドイベントに挑みました。

https://meetings.jpaawg.org/

# 苦い経験を踏まえた冗長配信

第3回の時にYouTubeLiveの長時間障害でイベントが中断になる経験をしました。
自前の配信サーバを用意するか、複数の配信サービスを使用するか、などの検討をしました。

https://note.com/kitazaki/n/n008a12af2546

https://note.com/kitazaki/n/n4112fa7cf2bf

結果として、ZoomウェビナーとYouTubeLiveとで配信する方針になりました。

# 初めてのEventRegist-enavle

これまでイベント登録はEventRegistを使用し、配信は直接視聴してもらう形態を取っていました。
配信の視聴動向のデータを取得する目的で、今回はenavleオプションを使用しました。

# EventRegist-enavle

イベントを作成し、ログイン後の画面です。

![zoom_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/f9ec5200-cb81-0532-0169-fb29956c9d58.jpeg)

配信設定は左側のパネルから「イベントプログラムの編集」を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/34de4519-47ad-6b77-3374-650c5bac3e48.jpeg" width="25%">

プログラムスケジュールの「編集」ボタンを押してZoomウェビナーの情報を設定します。

![zoom_22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/b4693933-416e-3ac1-d110-2597735d4f9d.jpeg)

# Zoom APIの情報取得

注意点は、役割が「オーナー」のアカウントで操作を実施する必要があります。
今回のイベントは2トラック並行で開催するため、Zoomウェビナーのライセンスを付与したアカウントが2つ必要でしたが、Zoom APIの情報取得はメンバーアカウントではなく、オーナーアカウントで実施する点です。

![zoom_11_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/e661fdd0-b6c9-b1c7-61e8-d488d3be9b2e.jpeg)

Zoom APIキーとZoomシークレットキーの情報が必要になります。
Zoomミーティング番号とZoomウェビナー/ミーティングのパスワードは、Zoomウェビナーを作成したアカウント毎の情報を設定する必要があります。

![zoom_32_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/c2ad4c0f-f147-d89b-50fa-4a218da7602a.jpeg)

## 手順

オーナーアカウントでログインし、「ソリューション」→「マーケットプレイス」の順に選択します。

![zoom_12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/ac7dacdc-8c6e-3cd9-5488-2ce3503e7c18.jpeg)

「Develop」プルダウンメニューから「Build App」を選択すると、アプリケーションタイプを選択する画面が表示されますので、「JWT」を選択します。

![zoom_42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/52e6f75b-63ec-4dce-1acf-35afee9bce73.jpeg)

「App Credentials」の「API Key」と「API Secret」の情報を取得します。

![zoom_43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/8e49820d-d5b2-4f7e-f742-02b1c9266766.jpeg)

# まとめ

YouTubeLiveはビデオIDを指定するだけで配信設定は完了しますが、Zoomウェビナーの場合はZoom API情報取得からZoomウェビナーの作成、設定まで少し手順が複雑です。
EventRegist-enavleの主催者向けマニュアルがありますが、情報量が膨大で、必要な情報に辿りつくまで時間が掛かったので、この備忘録メモが誰かのお役に立てたら幸いです。
Spatie laravel-data ライブラリ バリデーションのrequiredとnullable

# 概要

- laravel-dataにてパターン別にrequiredとnullableのバリデーションについてまとめる。

# 前提

- バリデーションはライブラリのDataクラスを継承する任意のクラスのコンストラクターの引数指定箇所で定義するものとする。
- 本記事においてバリデーションルールはRule要素を用いアノテーションで設定するものとする。

# キーが必須・値が必須でstring

```php
#[Rule(['required', 'string'])]
public string $キー名,
```

# キーが必須・値が必須でinteger

```php
#[Rule(['required', 'integer'])]
public int $キー名,
```

# キーが必須・値が必須でboolean

```php
#[Rule(['required', 'boolean'])]
public bool $キー名,
```

# キーが必須・値が必須でstringもしくはnull

```php
#[Rule(['required'])]
public ?string $キー名,
```

# キーが必須・値が必須でstringもしくはnull

```php
#[Rule(['required'])]
public ?string $キー名,
```
[忘備録]AWS CLIインストールから名前付きプロファイルを使用して実行まで(macOS)


# はじめに
ただのメモ

# やること
IAMユーザがある状態から、

PCにAWS CLIインストール
↓
AWSアクセスキー作成
↓
名前付きプロファイルを使用してAWS CLIコマンドを実行


# １．AWS CLI インストール

## 公式サイト

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

## 手順
公式に書いてあるとおり

1. 公式ページにあるインストーラー(macOS `pkg`ファイル)をダウンロード
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728837/5442e079-7d68-7a56-088c-7c9e2aa4381a.png)
    
2. インストーラー（pkgファイル）をダブルクリックして実行し、インストール手順に従ってインストールする
3. ターミナルからawsコマンドが実行できるかを確認する
  
    ```bash
    $ which aws
    /usr/local/bin/aws
    
    $ aws --version
    aws-cli/2.9.1 Python/3.9.11 Darwin/21.1.0 exe/x86_64 prompt/off
    ```
    
# ２．AWSのアクセスキー作成
    
- AWSのアクセスキーは、AWS APIにアクセスするための長期的な認証情報。
- アクセスキーIDとシークレットアクセスキーの2つで構成される。
- 1ユーザにつき同時に２つまで発行が可能。

  
## 手順
    
AWSマネジメントコンソールのIAMコンソール画面を開く。
左のメニューのユーザ→既存ユーザ名→認証情報タブを開き、[アクセスキーの作成]をクリックする。


:::note warn
発行後はキーを再表示することができない。
「.csvファイル」のダウンロードなど、キー情報を保存する必要がある！
:::


    
# ３. AWS CLI の名前付きプロファイルを使用してコマンド実行
    
開発していると環境ごとにアクセスキーが変わってくるので、プロファイルを使用してAWS CLIコマンドを実行する。
    
## 公式サイト
    
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-profiles.html
  
  
## 設定手順
    
以下のファイルを作成する
    
- 認証情報プロファイル(`~/.aws/credentials`)
- 設定プロファイル (`~/.aws/config`)

手動で作成してもコマンドで作成してもOK。
    
```bash
aws configure --profile [任意の名前]
```
    
(例）
    
```bash
# 設定
## AWS Access Key ID：作成したアクセスキーの「Access key ID」
## AWS Secret Access Key：作成したアクセスキーの「Secret access key」

$ aws configure --profile hoge-system_dev
AWS Access Key ID [None]: XXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json

# 確認
$ ls -la ~/.aws/
-rw-------   1 hogejima  hogejima    65 11 24 17:43 config
-rw-------   1 hogejima  hogejima   125 11 24 17:43 credentials

$ cat ~/.aws/config
[profile hoge-system_dev]
region = ap-northeast-1
output = json

$ cat ~/.aws/credentials 
[hoge-system_dev]
aws_access_key_id = XXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXX

```
    
## 使用手順

(例)Amazon EC2 インスタンスを一覧表示する

```bash
$ aws ec2 describe-instances --profile hoge-system_dev
{
    "Reservations": [
        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-xxxxxxxxxxxxxx",
                    "InstanceId": "i-xxxxxxxxxxxxxx",
                    "InstanceType": "t2.micro",
           
~略~
```
ServiceNow ACLでNobody権限を設定する

# ACLでNobody権限を設定する
通常、ACLの権限にはRoleを指定しますが（このテーブルのWrite権限者はAdminだけ、とか）
誰にも操作させたくない場合はnobodyを指定する事で対応可能です。
ですがnobodyを簡単に設定する方法は無く（多分）、以下のようなちょっと面倒な手順が必要です。弊社ブログへも[同様の記事を投稿](https://alpcom.co.jp/blog/20221124/?utm_source=Qiita&utm_medium=post&utm_campaign=ysi&utm_id=20221124)しております。

##### 手順１．元ACL作成
nobodyを設定する元となるACLを１つ作成する（既にあれば２に進んでＯＫ）
<img width="950" alt="ACL01.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707437/3feeba72-3ef0-b59b-c859-88f94d95878f.png">

##### 手順２．元ACLのsys_idコピー
フィルターナビゲーターにsys_security_acl_role.listと打って実行。このテーブルから１で作ったレコードを探し、sys_idをコピーする。
<img width="950" alt="ACL02.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707437/d0cf81a0-8e9a-d687-3673-fe9a7484c19a.png">


##### 手順３．nobodyに上書き
System Definition > Scripts - Backgroundで下記スクリプトを実行すると、１で作成したACLがnobodyに上書きされる
※nobodyのroleはOOTBレコードなのでsys_idはどの環境でも同一な筈（下記スクリプトb0594…の部分）
※この処理は更新セットにも記録されるので、そのまま移送も可能です
```javascript
 var rec = new GlideRecord("sys_security_acl_role");
 rec.get("手順２でコピーしたsys_id");
 if (rec){
  rec.sys_user_role = 'b05940500a0a0aa70090a4893f6ff35d'; /* nobody role */
  rec.update();
 }
```

<img width="950" alt="ACL03.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707437/1f3c6b77-0c1e-f6b3-d566-329c96d7184b.png">


と、ここまで書きましたが同じことはACLのAdvancedにチェックをつけScriptで常にfalseをreturnする、という形でも対応できるので、そちらの方が無難かもしれません。（簡単に設定できないという事はnobodyの使用はあまり推奨されていない…？ただ一応、この方法でも挙動に問題は無さそうでした）

参考（コミュニティ記事）
[How We can use Nobody Role ?](https://www.servicenow.com/community/developer-forum/how-we-can-use-nobody-role/m-p/1764468)
VPC内のAWS WranglerでSTSのEndpointに繋がらない場合の対応

VPC内でAWS Wranglerを利用したところSTSエンドポイントに繋がらないエラーが発生したので、その対応を書いておきます。

# 事象

VPC上のPythonプログラムにて `AWS Wrangler` (現 `aws-sdk-pandas` )を利用しところ、以下のようなエラーが発生。


>botocore.exceptions.ConnectionClosedError: Connection was closed before we received a valid response from endpoint URL: "https://sts.amazonaws.com/".
[ERROR] Exception: Connection was closed before we received a valid response from endpoint URL: "https://sts.amazonaws.com/".


# 対応方法
以下の2点対応することで解決できました。

- 対応➀ VPCエンドポイント作成します
- 対応➁ STS Endpointを向くようにAWS Wranglerを設定します

## 対応➁について
以下の2パターンの対応方法があります。

- 環境変数

```sh
WR_STS_ENDPOINT_URL=https://sts.ap-northeast-1.amazonaws.com
```

- Python内に記述

```python
wr.config.sts_endpoint_url = "https://sts.ap-northeast-1.amazonaws.com"
```


# 参考

https://github.com/aws/aws-sdk-pandas/issues/418
Node.jsのバージョン切り替え方法(NVM)

# はじめに
NVMを利用したNode.jsのバージョン切り替え方法をメモ書き程度に記載しておきます。

# NVMとは
Node Version Managerの略です。
これを利用することで、複数バージョンのNode.jsを切り替えて使うことができるようになります。

# NVMのインストール
以下GitHubから取得します。
https://github.com/coreybutler/nvm-windows/releases
nvm-setup.zipをダウンロードし、中のexeを実行してください。

# 切り替え方法
変更したいバージョンのNode.jsをインストールします。
```
nvm install 16.13.0
```

次に上記でインストールしたバージョンに切り替えます。
```
nvm use 16.13.0
```

これでOKです。node -vで確認し切り替わっていることを確認してください。
エンジニアマネージャー必見：報酬設計の考え方

エンジニアの採用はすごく難しい状況です。エンジニア採用ニーズが多いのに、エンジニアがやる仕事の内容も難しくなってきており、幅も広がってきています。CTO自らが真剣に向き合って考えていく必要があります。
そして、せっかく採用したエンジニアには、長く働いて欲しい、仲間として最高のパフォーマンスを出して欲しいと思います。そのため報酬設計は重要な部分となります。

# 報酬設計の２つの側面
１．外的報酬　
外的報酬といえば、賃金、給与が先ず思い浮かびます。その他にはポジション、地位も報酬の一つと考えられるでしょう。部長や本部長等の役職がつくと社外で名刺交換した時にも見栄えが良くなります。
他にも手当てや秘書がついたり、経費の枠が増えたりと色々とあると思います。

２．内的報酬
仕事そのものやりがい等です。楽しい仕事と思えていればやる気も湧いてくるし、難しいと思うとやり甲斐を感じる人もいます。エンジニアの場合は、トラブルなプロジェクト程、闘志を燃やす人も多い様に感じます。
その他では、スキル開発のチャンスです。エンジニアの場合は、React開発の経験が出来るとか、データサイエンスが学べると言ったスキルが伸ばせるチャンスがある事でモチベーションとなります。
もちろん、人間関係も。尊敬できる上司であればやる気がわくし、頼りがいのある仲間、可愛い新人に頼られる事もモチベーションの一つとなるでしょう。

# 基本は、内的報酬
長年、CTOをやってきた経験から言うと、転職していく大きな要因は、内的報酬が無くなってきた場合です。
その中でも人間関係が悪くなってきた場合が最も大きいかもしれません。コミュニケーションができなくなったり、関係値が悪くなってた場合は、相談してくる場合は良いですが、その前に転職を決意するパターンが多いです。
次が仕事のやり甲斐でしょうか。そしてスキルチャンスとのバランスで転職を決意します。
これは経験年数でも変わると思います。
若手：　人間関係 > スキル開発 > 仕事やり甲斐
中堅：　スキル開発 > 仕事やり甲斐　>　人間関係
ベテラン：　人間関係 > 仕事やり甲斐　> スキル開発
のイメージがと強いです。
この内面報酬は、適切なマネジメントと適切なポジション配置により生まれます。状況と常にウオッチしましょう。

# 外的報酬は最低限
内面報酬ばかりを期待していると**やり甲斐詐欺**と思われます。やり甲斐だけに頼り切っている会社が結構あります。外的報酬ばかりに頼ってる会社は、もちろん長くは続きません。会社のPLのバランスがおかしくなるし、その人が転職する時に給与が合わなくなるので困った事になります。
会社を転職しようと思った時にマーケットよりも給料が高いと転職先が限られます。そして、年収を下げて転職しようとすると税金問題に当たります。税金は翌年の収入を基に仮計算させるため、収入が少ないのに税金が高いままで苦労する事になります。
しかし、外的報酬は、最低限のレベルとして必要です。やり甲斐で悩んで転職を考えても、給与が下がる場合は、転職を踏みとどまるけど、給与があがるとなれば、外的報酬、内的報酬ともに満たされるため転職しない理由は見つかりません。最低限、競合他社に負けないレベルの外的報酬は整えておきましょう。

# 最後に
報酬設計の２つの側面について説明しましたが、報酬設計はとても難しいです。
最適な報酬設計は会社毎に違います。一緒に考えていきましょう。
下記、説明会も是非ご参加下さい。
[エンジニア年収アップ講習(転職サポート付き！)　無料説開会　12月6日　19時開催](https://cto-can-be.hp.peraichi.com/)