OmniAICreator/Qiita-1.07M huggingface dataset:
【GIS】測地系、投影法、座標系、EPSGコードについてまとめてみた

## はじめに
この記事は#30DayMapChallenge2022 10日目の記事です。
テーマはA bad mapです。
GISでつまづきやすい、測地系、投影法、座標系、EPSGコードについてまとめてみました。
指定を間違えるとBad Mapになるので気を付けたいところです・・！

![image](https://raw.githubusercontent.com/tjukanovt/30DayMapChallenge/main/images/flyers/30dmc-2022.png)

https://30daymapchallenge.com/

## 測地系
### 測地系とは
- 緯度経度で位置を表すときの座標面の基準
- 地球上の位置を緯度、経度、高さで表すために、決められた基準面の上で位置をさだめる
    - 基準面は、地球の形を代表するもの（地球楕円体）を使う

![image](https://www.esrij.com/cgi-bin/wp/wp-content/uploads/2019/01/mes_01.png)

出典：[ESRIジャパンWebサイト](https://www.esrij.com/gis-guide/coordinate-and-spatial/datum/)

### 測地系の種類
- 日本測地系（旧日本測地系、東京測地系）
    - 2001年以前の測量成果（経度、緯度）は、経緯度原点の座標を天文観測によってベッセル楕円体面に定めていた旧日本測地系で表現されていた
- 日本測地系2000（世界測地系、JGD2000）
    - 測量法の改正により世界測地系である日本測地系2000に移行した
- 日本測地系2011（世界測地系、JGD2011）
    - 2011 年の東日本大震災による地殻変動にともない、世界測地系である日本測地系2011に移行した
    - 世界全体で共通に利用ができる世界測地系であるITRF（国際地球基準座標系）に基づいている
- WGS84（世界測地系、WGS1984）
    - 米国で使用されている世界測地系


## 投影法
### 投影法とは
- 地球の曲面を平面で表現するための手法

![image](https://www.esrij.com/cgi-bin/wp/wp-content/uploads/2020/08/01_projection.png)

出典：[ESRIジャパンWebサイト](https://www.esrij.com/gis-guide/coordinate-and-spatial/map-projection/)

### 投影法の種類
- 正角図法
    - 地域の形状は維持されるが面積が歪む
    - メルカトル図法で使われている
- 正積図法
    - 地域の面積は維持されるが形状が歪む
- 正距図法（せいきょずほう）
    - 2地点の距離が維持されるが、中心から離れると面積と形状が歪む
- などなど・・



## 座標系
### 座標系とは
- 地球上の位置を座標で表すための取り決めのこと

### 座標系の種類
- 地理座標系
    - 地球を球体とみなし、緯度経度で位置を表す
- 投影座標系
    - 地球を平面に投影し、原点からのX方向とY方向の距離で位置を表す
    - 平面直角座標系、UTM座標系がある


## EPSGコード
### EPSGコードとは
- 様々な測地系や投影法に対して割り振られたユニークな番号のこと

### EPSGコードの種類
- 代表的なものは以下

|  EPSGコード  |  測地系  |　座標系　|
| ---- | ---- | --- |
|  6668  | JGD2011 | 地理座標系 |
|  4326  |  WGS84  | 地理座標系 |
|  3857  |  WGS84  | Webメルカトル |


MapLibre GL JSでは、LngLatオブジェクト（緯度経度の座標）はEPSG: 4326、
MercatorCoordinateオブジェクト（3次元の位置）はEPSG:3857 を若干異なる単位で使用しているようです。


### 参考
https://www.esrij.com/gis-guide/coordinate-and-spatial/datum/

https://www.pasco.co.jp/recommend/word/word075/

https://www.gsi.go.jp/sokuchikijun/datum-main.html

https://club.informatix.co.jp/?p=642

https://www.aeroasahi.co.jp/qgis/post/2020/02/crs_01/

https://madore.glbs.jp/glossary/glossary_sa_zahyokei.html

https://www.aeroasahi.co.jp/qgis/post/2020/02/crs_01/

https://maplibre.org/maplibre-gl-js-docs/api/geography/
多言語FizzBuzzチャレンジ20日目:Erlang

## これまでのまとめ

https://qiita.com/tenteko/private/fc52f7aec63ba5f67854

https://qiita.com/tenteko/private/ca9813f0982370d0c901

https://qiita.com/tenteko/private/bc808ba59f6993019045

https://qiita.com/tenteko/private/74aa4c422196cb5cdeac

https://qiita.com/tenteko/private/ea22bd19360333f9ca85

https://qiita.com/tenteko/private/ec2f7c2f99229a55a7aa

https://qiita.com/tenteko/private/237556777f5c5546af6e

https://qiita.com/tenteko/private/264e4aca8a2ee6761a6c

https://qiita.com/tenteko/private/6e86fa0eeed9d24805ab

https://qiita.com/tenteko/private/f32baaf43fe0217b7fc7

https://qiita.com/tenteko/private/b44e1e5bfc91f6f3a52f

https://qiita.com/tenteko/private/333b9697c03561fb6158

https://qiita.com/tenteko/private/667f5f69eda60f221912

https://qiita.com/tenteko/private/eff296000ecbc7b43f07

https://qiita.com/tenteko/private/f5ea89c185b14a5952f3

https://qiita.com/tenteko/private/64a5814d35f73972bde9

https://qiita.com/tenteko/private/7981389372c7f6bdc073

https://qiita.com/tenteko/private/f6814b2e192e23298da8

https://qiita.com/tenteko/private/e3e498be93b847139a7d

## 本日のお品書き
Erlangさん。

- 個人的には時雨堂さんのイメージがある言語です。
- 以前にFizzBuzzしたElixirさんはErlangVM上で動作しているとのことでしたが、果たして言語的な共通点もあるのでしょうか？

## FizzBuzz
- なんだかパターンマッチと再帰がわかってきた気がします（錯覚か）
- 関数型言語は`for`を持たないものも多く、リストを入力として先頭から順番に再起的に処理を行うか、リストを入力としてmap的に各要素を処理するかが多い気がしてきた。
- 以下ではFizzBuzzをスクリプトとして実行するため、ファイル冒頭にescriptのシェバンを記載している。こうすると`main(_)`が実行される。
    - https://www.erlang.org/doc/man/escript.html

```erlang:fizzbuzz.erl
#!/usr/bin/env escript

%% 空のリストが入力されたらatoms(ok)を返して終了する
fb([]) ->
    ok;
%% パターンマッチでリストの先頭とそれ以外を分ける
fb([N|Rest]) ->
    if
        N rem 15 == 0 ->
            %% 標準出力にはio:formatを使う。ioモジュールのformat関数という意味。
            io:format("FizzBuzz~n", []);
        N rem 3 == 0 ->
            io:format("Fizz~n", []);
        N rem 5 == 0 ->
            io:format("Buzz~n", []);
        true ->
            io:format("~w~n", [N])
    end,
    %% 残りの要素を再帰的に処理する
    fb(Rest).

main(_) -> fb(lists:seq(1,100)).
````

## おまけ：実行方法
Dockerでぽちっと

```shell
docker run --mount type=bind,source=$(pwd),target=/app -w /app --rm erlang bash -c "chmod +x fizzbuzz.erl && escript fizzbuzz.erl"
```

## おまけのおまけ
escriptではなくfizzbuzz関数を読んで対話的に実行する場合は、fizzbuzz.erl冒頭に次のように宣言した上で、モジュール:関数の形式で呼び出す。

```erlang:fizzbuzz.erl
-module(fizzbuzz).
-export([fb/1]).

%% 省略
```

```shell
# 対話環境に入る
erl

# コンパイル
1> c(fizzbuzz).
# モジュールと関数の呼び出し
2> fizzbuzz:fb(lists:seq(1,100)).
```
【Perl初学者】eval関数の使い方

# 目次
- eval関数とは
- 使用例


# eval関数とは

pythonで言うtry-expect, PHPで言うtry-catch
evalの中で走らせた処理と異なった**例外処理**が走った場合にエラー文を返すことができる
eval関数の中身=例外だった場合の処理が書いてるわけじゃないので理解には注意
文字列の動的実行にも使われるらしいが、今回は割愛させてください。

ちなみに

> 引用:Perlゼミ
eval文字列の危険性
普通のプログラミングでは、eval文字列を使わないことを推奨します。
evalは渡された文字列をそのまま実行してしまうのでセキュリティという観点で望ましくないです。業務でアプリケーションを作成する場合であれば、eval文字列は使う場面はまずありません。

らしいです。

# 使用例
```;hello.pl
eval {
  die "これがエラー構文です";
};
if ($@) {
  print "ERROR:$@";
};

#結果 "ERROR:これがエラー構文です"
```
die関数を使用して強制的にエラーにしています。

次に、定義していない変数を掛け算します
```;hello.pl
eval {
  $num * 1;
};
if ($@) {
  print "エラー:$@";
};

#結果 Global symbol "$num" requires explicit package name (did you forget to declare "my $num"?) at hello.pl line 70.
```
`$@`に入っていないのか、普通のエラー構文になりました。どのエラーをキャッチしてくれるのか気になりますね。

dieを使用して事前にエラーを防ぐこともできる
```;hello.pl
sub sum {
  my $num = shift;
  if ($num !~ /^\d{1}$/) {
    die '異常終了しました。';
  }
  my $sumsum = 5 + $num;
  return print $sumsum . "\n";
};
eval  {
  sum("おかわり");
};
if ($@) {
  print "エラー:$@";
};

#エラー:異常終了しました
```
ちなみに`sum(~)`とか`sum(お)`とか`sum(o)`とかにしたら`$@`に渡らずに普通のエラーになった。。
`$@`で渡るエラー、渡らないエラーに何の違いがあると言うのか。。

ちなみに、ドキュメントを見た感じ構文エラーと実行エラーの発生、それとdie文が実行されると、って書いてある。意図しないシンタックスとかは構文エラーのカテゴリじゃないのか？？

とにかく関数内で予想されそうな構文エラーとかを考慮したdie文書いておけば何とかなりそう？？1人で勝手に考えてみた
【Docker】unexpected character "/" in variable name nearの対処法【env】

<h2>症状</h2>

Dockerでenvファイルを追加したときに下記のエラーが発生しました。
翻訳すると、「近くの変数名の予期しない文字「/」」でした。
/がよく分からないといわれているようです。

```terminal:error
unexpected character "/" in variable name near(以下メールアドレスとかパスワードなので略)
```

```terminal:env
// Mailer
EMAIL="メールアドレス書いてある"
PASSWORD="パスワード書いてある"
```

<h2>解決策</h2>
コメントアウト用に書いた//がよく分からないと言われていたので、＃に直してコメントアウトにして解決しました。

```terminal:env
# Mailer
EMAIL="メールアドレス書いてある"
PASSWORD="パスワード書いてある"
```
React で作成した App を 4Step で GitHub Pages に公開

# gh-pages ライブラリをinstall
GitHub Pages 用にbranchを作ってdeployしてくれるライブラリです.
開発環境用にインストールします.
```bash
npm install gh-pages --save-dev
```

save-devに関してはこちら

https://qiita.com/kohecchi/items/092fcbc490a249a2d05c

# package.json の設定
package.jsonにデプロイコマンドとホームページを登録してやります.

```package.json
{
...
  "scripts": {
    ...
    "predeploy": "npm run build",
    "deploy": "gh-pages -d build"
  },
  "homepage": "https://[github_id].github.io/[repository_name]"
...
}
```


# デプロイ
デプロイコマンドを打ちます.
```
npm run deploy
```

`Published` が表示されたら成功.


# 公開ブランチの設定
Github 上で設定します.

Setting -> Pages -> Branch にて,
branch を gh-pages に変更します.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2846725/076eda69-f904-f31d-efb5-fd2c0ca5907e.png)




暫く待つとページ上部にリンクが表示されますので,
Visit Site をクリックして内容を確認

無事表示されたら終了.
Hexabase Dart/Flutter SDKの使い方（ファイルアップロード&ダウンロード）

[Hexabase（ヘキサベース）](https://www.hexabase.com/)は企業向けのBaaS（Backend as a Service）を提供しています。認証やデータストア、ファイルストレージ、リアルタイム通知などの機能があり、企業向けのシステム開発に必要な機能をまるっと提供しています。

APIはREST APIとGraphQLを提供しています。そのAPIをラップしたSDKも開発を進めています。SDKは現在、TypeScriptとDart向けに開発しています。Dart向けのSDKは、もちろんFlutterでも利用できます。

この記事ではDart/Flutter SDKについて、インストールとファイルアップロード、ダウンロードの実装方法を解説します。

## パッケージとソースコード

パッケージはpub.devで公開しています。

[hexabase | Flutter Package](https://pub.dev/packages/hexabase)

ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseです。

[hexabase/hexabase-dart: Hexabase SDK for Dart & Flutter](https://github.com/hexabase/hexabase-dart)

## インストール

インストールは `dart pub get` で行えます。

```
dart pub get hexabase
```

## インポート

SDKをインポートします。

```dart
import 'package:hexabase/hexabase.dart';
```

## 初期化

まずインスタンスを作成します。

```dart
var client = Hexabase();
```

別なファイルで再度インポートした場合には、以下でインスタンスを取得してください。

```dart
var client = Hexabase.instance;
```

## データストアの取得

まず登録しているデータストアを取得します。そのため、最初にデータストアを管理するプロジェクトを作成します。

```dart
var project = client.project(id: "PROJECT_ID");
var datastore = project.datastore(id: "DATASTORE_ID");
```

## データストアの新規データ作成

データストアからデータを作成する際には `item`  メソッドを使います。

```dart
var item = datastore.item();
```

## ファイルの添付

この作成するデータに対して添付ファイルを追加します。その際にはHexabaseFileクラスを利用します。データはbytes（Unit8List）で設定するので、デスクトップやスマートフォンであればFileオブジェクトから使えますし、WebであればImageクラスなどからバイト文字列を取得してください。

```dart
var filePath = './test/test.png';
var file = HexabaseFile(
		name: basename(filePath),
		contentType: lookupMimeType(filePath) ?? "application/octet-stream");
file.data = File(filePath).readAsBytesSync();
item.set('pictures', file);
```

### 複数ファイルを添付する

元々Hexabaseの添付ファイルは複数に対応しています。その場合には `set` メソッドで `List<HexabaseFile>` をセットするか、 `add` メソッドを使ってください。

```dart
var filePaths = ['./test/test.png', './test/test2.png'];
for (var filePath in filePaths) {
	var file = HexabaseFile(
			name: basename(filePath),
			contentType: lookupMimeType(filePath) ?? "application/octet-stream");
	file.data = File(filePath).readAsBytesSync();
	item.add('pictures', file);
}
```

## 保存する

データの保存は通常と変わらず、 `save` メソッドで行います。

```dart
await item.save();
```

## データの取得

添付したデータを取得する際には、 `get` メソッドを使います。この時のレスポンスは必ず `List<HexabaseFile>` になるので注意してください（必ず配列です）。

```dart
var pictures = item.get('pictures'); // List<HexabaseFile>
```

そしてデータは `download` メソッドで取得できます。返り値は `Unit8List` になります。

```dart
var data = await pictures.first.download(); // Unit8List
```

このデータは画像として画面に表示したり、ファイルに書き込めるでしょう。

## まとめ

Hexabase Dart SDKを使うことで、データストアへのデータ保存やファイル添付も簡単に実現できます。

Dart SDKはFlutterでも利用できます。Flutterで使えると言うことは、iOS/Androidといったスマートフォンアプリやタブレットアプリはもちろん、Webやデスクトップアプリ開発でも利用できます。ぜひHexabaseをDart SDKとともに活用してください。

[hexabase | Flutter Package](https://pub.dev/packages/hexabase)
シグモイド変換(Sigmoid)

[Teradata Vantage - Vantage Analytics Library](https://docs.teradata.com/r/Vantage-Analytics-Library-User-Guide/January-2022)[2022/9/22時点]の翻訳です。
(リリース番号 : 2.1.1 | リリース日 : January 2022)
> この記事はVantageアナリティクスライブラリ シリーズのコンテンツです。

# 概要
シグモイド変換は、シグモイド（S字）関数（ロジット、修正ロジット、ハイパーボリックタンジェント）を使用して連続数値データを再スケールするためにシグモイド変換は、数値の列のみに適用できます（日付の列は含まれません）。

# 前提条件
・Teradata Vantageインスタンスにアクセスできること。
・Vantage アナリティクス・ライブラリがインストールされていること。

::: note info
Vantage アナリティクス・ライブラリのインストールについて、既にVantageを導入頂いているお客様はTeradataサポートサービスにお問い合わせください。
Vantage Express (評価版)やクラウドサービスのDIYでご利用頂く場合は[Teradata Dounload](https://downloads.teradata.com/download)からダウンロードし利用可能です。
Vantage アナリティクス・ライブラリのインストール手順は「[Vantageアナリティクス・ライブラリのインストール](https://qiita.com/ykswi/items/12d0da2ac69b4b161881#vantage%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)」の記事に従い行います。
:::

# データの準備
## サンプルデータの入手とデータベースへの格納方法
こちらの「[チュートリアル用のサンプルデータを用意する](https://qiita.com/tmsky/items/4d86ca35aef753290020)」を参照ください。


# 実行方法
## SQLから実行する場合の例
```SQL
CALL td_analyze (
  'vartran',                          /* 分析手法　*/
  '
  database        = QID;              /* データベース名 */
  tablename       = Superstore;       /* テーブル名 */
  retain =
     {sigmoidstyle (logit),           columns (sales/sales1)}
     {sigmoidstyle (modifiedlogit),   columns (sales/sales2)}
     {sigmoidstyle (tanh),            columns (sales/sales3)}
  ;                                   /* 導出項目の定義 */
  '
);
```
## パラメータの説明
|パラメータ|説明　　　　　　　　　|
|:-|:-|
|logit|$f(x)=\frac{1}{1+e^{-x}}$|
|modifiedlogit|$f(x)=\frac{1-e^{-x}}{1+e^{-x}}$|
|tanh|$f(x)=\frac{e^{2x}-1}{e^{2x}+1}$|

:::note information
出力結果をテーブルに書き込む場合は以下オプションを指定可能です。
outputdatabase = 出力データベース名;
outputtablename = 出力テーブル名; 
overwrite = {true | false}; --- 未指定の場合はtrueで上書きします
:::

## 出力結果
データ量が多いため上位10件を表示しています。
|sales1|sales2|sales3|
|:-|:-|:-|
|1|1|1|
|0.9999999999944654|0.9999999999889307|1|
|0.9999999938079523|0.9999999876159047|0.9999999999999999|
|1|1|1|
|0.9999998238623731|0.999999647724746|0.9999999999999379|
|1|1|1|
|1|1|1|
|0.9999999958988565|0.999999991797713|1|
|1|1|1|
|0.9999354496199151|0.9998708992398301|0.999999991665421|
|～|～|～|

# おわりに
:::note information
サンプルコードはSQL関数から掲載し順次Pythonコードも掲載していく予定です。
:::

:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
IBM Cloud VSI: Windows 2019 をリロード後 XenCenter から Citrix XenServer 6.5へ接続できない問題

### 困ったこと
IBM CloudのVSI上でWindows 2019 Standardを運用
OSの再インストールを行った最新の状態でXenCenter 6.5をインストールしたところ、エラーで接続できない事象が発生

![asm-sv-xct-01_error-screenshot.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126158/fde840e8-8031-9e1f-ce4f-0851c2b52344.png)

### 原因
TLS1.0がデフォルトで無効化されたことでつながらなくなった模様
[参考：Microsoft Japan Windows Technology Support Blog: SSL/TLS プロトコル バージョンの有効化と無効化](https://jpwinsup.github.io/blog/2021/12/22/PublicKeyInfrastructure/SSLTLSConnection/tls-registry-settings/)


### 解決した手段

レジストリを編集

```
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client
```

Enabled: 0->1
0x0 は無効, 0x1 は有効

Disabled By Default: 1->0
0x1はデフォルトで無効, 0x0はデフォルト無効を止める

編集後再起動なしでXenCenterへ接続できるようになった。

※本作業によってTLS1.0が使えるようになりますが、セキュリティを考えれば歓迎できない設定変更ですね。
　必要な環境のみに絞ってこの対応をされることをお勧めします。

XenServer 6.5自体がすでにEOSを過ぎているので、Citrix HyperVisor8.2への移行が必要です。
※BMSの故障などで筐体ごと変えなければならないなどのアクシデント発生時には6.5自体が新規購入できないので、
　アップグレードパスは考えておくべきかなと思います。
サービスの設計と移行

# サービスの設計
ITサービスの設計は、ユーザニーズを満たし、SLAをクリアするには```どんな技術を持つサービスが適切かを検討する```。また、サービスに用いるシステムの技術や必要な```人材・機材```、さらに```新サービスへの移行計画```や```運用の引継方法```なども検討し、```サービス設計書を作成```する。
そのほか、
構築した```新サービスの評価基準となるSAC（Service Acceptance Criteria: サービス受入基準)```や```運用開始後の評価に用いる運用サービス基準```なども用意しておく。移行前には受入テストを行い、機能や品質が基準を満たすかを確認する。

# システムの移行手順
新システムに不具合があると、業務に大きな影響を与えるため、```システムの性質により適切な移行方法を選択```する。また、```移行作業は運用部門が主体```となって行う。

### 移行対象データの決定
現行システムの中の```新システムで使用するデータを決める```。

### データ移行方法の検討
新システムで使用する```データをどのようにして使用するか```を検討する。
```そのまま使える場合```もあるし、```データ変換が必要な場合```もある。

### 移行計画書の作成
移行の日時や移行手順など、```移行の計画書を作る```。一気に新システムに移行することもあるし、```並行運営しながら数ヶ月かけて移行する```こともある。

### 移行の実施
```移行計画書に従って、移行作業```を行う。
```移行方法によって、必要な要員```が変わってくる。

# システムの移行方法
### 一斉移行方式
```休日などを利用```し、一気に新システムに切り替える方法。```移行期間が短くコストが安い```。
反面、```システム障害時に業務に与える影響が大きい```.

### パイロット移行方式
一部の拠点や部門に```限定して新システムを導入```し、```動作を観察``した後で全体を移行する方式。
移行時の問題による```影響範囲を局所化```でき、リスクが少ない。

### 順次移行方式
サブシステム単位で、```順次新システムに切り替える```方法。
```システム障害をサブシステムに限定```でき、```運用部門の負荷も少ない```が、```移行手順は複雑```になる。

### 並行移行方式
```新旧システムを同時稼働```させ、```安全が確認できるまで```運用した上で、切り替える方式。
```最も安全```な方法。
しかし
```移行期間が長く、運用部門の負担は大きい。```

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
VSCode + Metals で保存時に Scalafix を実行する

VSCode を使って保存時に Scalafix を自動で実行する方法メモ。

[Metals](https://scalameta.org/metals/) が必要なのは当然として、今回はさらに [Run on Save](https://marketplace.visualstudio.com/items?itemName=pucelle.run-on-save) という拡張機能を使用します:

https://marketplace.visualstudio.com/items?itemName=pucelle.run-on-save

VSCode の設定に以下の項目を書き加えます:

```yaml
{
  # ...
  "runOnSave.commands": [
    {
      "commandBeforeSaving": "metals.scalafix-run",
      "match": ".*\\.(scala|sbt)$",
      "runIn": "vscode"
    }
  ],
  # ...
}
```

これで、保存時に Scalafix が実行されるようになります。ありがてぇ。

(余談)

なお、Scalafix に [scalafix-organize-imports](https://github.com/liancheng/scalafix-organize-imports) ルールを導入することで、import の最適化 (並び替えなど) も同時におこなえるようになります:

https://github.com/liancheng/scalafix-organize-imports

ただし、Scala 3 の場合は不要な import の削除をおこなうことができないため、`.scalafix.conf` に以下の項目を書き加えておく必要があります:

```conf
rules = [OrganizeImports]

OrganizeImports {
  preset = DEFAULT
  removeUnused = false   # Scala 3 の場合は必須
}
```

おわり。
『サイバーセキュリティプログラミング第2版』の読書メモ (2)

ひきつづき『サイバーセキュリティプログラミング第2版』の読書メモです。

https://www.oreilly.co.jp/books/9784873119731/

# 3.4 ICMP のパース　より

P62 UDP データグラムをサブネット全体に送信する Python コードについてのメモ

udp_sender 関数を抜粋
```python
import ipaddress

# スキャン対象のサブネット
SUBNET = '192.168.1.0/24'

# ICMP レスポンスのチェック用マジック文字列
MESSAGE = 'PYTHONRULES'

# マジック文字列を含んだ UDP ダイアグラムをサブネット全体に送信
def udp_sender ():
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sender:
        for ip in ipaddress.ip_network(SUBNET).hosts():
            sender.sendto(bytes(MESSAGE, 'utf8')), (str(ip), 65212))
```

この関数は ipaddress.ip_network(SUBNET).hosts() で得られるサブネット内の各IPアドレスに対して UDP ダイアグラムを送信します。
254 回 sendto 関数が呼ばれます。

ここでちょっとネットワークを勉強したことのある方なら **「ユニキャスト」ではなく「ブロードキャスト」（ディレクテッド・ブロードキャスト）であれば一回の送信で済むのではないか** という疑問をいだくことでしょう。

なぜ著者はユニキャストで実装しているのか？
本ではその理由を確認できませんでした。（もしも私が見落としていて、ちゃんと書いてあったら謝ります）

おそらく、送信元ホスト（つまりこのコードを実行するホスト）と異なるネットワークセグメントをスキャンのターゲットとする場合には、途中のルータでディレクテッド・ブロードキャストのパケットをフィルタされる可能性があることを考慮したのかもしれません。

例えば Cisco ルータではディレクテッド・ブロードキャストの転送はデフォルトでは行われません。（専用のコマンドを投入すれば転送可能ですが）
その理由としてはディレクテッド・ブロードキャストの転送ができるルータは **「DoS 攻撃のリフレクタ」** として使われる恐れがあるためです。

----

まぁ、それでもディレクテッド・ブロードキャストが転送される環境を前提とした場合に、ブロードキャストで送信する udp_sender の実装も考えてみました。使わないでしょうけど IT系オタクなので一応技術的なところは押さえておきます。

```python
# マジック文字列を含んだ UDP ダイアグラムをサブネット全体に送信（ブロードキャスト版）
def udp_sender_broadcast ():
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sender:
        sender.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        broadcast_address = ipaddress.ip_network(SUBNET).broadcast_address
        sender.sendto(bytes(MESSAGE, 'utf8')), (str(ip), 65212))
```

ポイントは以下の2点：

* setsockopt 関数でブロードキャストの設定を行う。
* 送信先アドレスはブロードキャストアドレス（ディレクテッド・ブロードキャストアドレス）を指定する。この例では  ipaddress.ip_network(SUBNET).broadcast_address により '192.168.1.255' となる。

----

この他、コーディングの流儀ではありますが、ポート番号が関数に埋め込みなのは少し気持ち悪い。
いまどきは Final 使ってこんな感じで定数化するのかな。

```python
from typing import Final
PORT_NUMBER: Final[int] = 65212

(省略)

sender.sendto(bytes(MESSAGE, 'utf8')), (str(ip), PORT_NUMBER))
```
AWSIOT: 既存の Lambda にトリガーをかけるトピックの作成

既存の　Lambda 関数を lambdatodb とします。

## ルールの作成
TESTlambda というルールを作成
 トピックは、test/topica

```bash:create_rule.sh
aws iot create-topic-rule --rule-name TESTlambda --topic-rule-payload file://new01.json
```

```json:new01.json
{
        "sql": "SELECT x AS vX,y AS vY,z AS vZ FROM 'test/topica'",
        "ruleDisabled": false,
        "awsIotSqlVersion": "2016-03-23",
        "actions": [
            {
                "lambda": {
                    "functionArn": "arn:aws:lambda:ap-northeast-1:123454806462:function:lambdatodb"
                }
            }
        ]
}
```

functionArn の調べ方

```bash
aws lambda list-functions
```

実行

```bash
./create_rule.sh
```

ルールの一覧

```bash
aws iot list-topic-rules
```

## Lambda にトリガーを追加

Lambda -> 関数 -> lambdatodb
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/8ebd57d6-1b21-530f-4605-711c3806de05.png)

## 作成したトピックの動作確認
こちらです。
[AWSIOT: AWS CLI で トピックにパブリッシュ](https://qiita.com/ekzemplaro/items/7deb2c60deb8f64af73e)
クソコードを客観的に測る(循環的複雑度)


## 　詳細

https://techblog.short-tips.info/inhouse_se/1079arch_analytics.md


## なぜ循環的複雑度なのか？

現時点では内部のコードの品質を包括的に評価する指標は存在しない。(すなわちクソコードをクソコードだと言うための数値がない)

しかし、いくつかの指標やツールはコードの構造の重要な観点を計測するのに役に立つ。

明確に計測可能なコードの観点で、**循環的複雑度**で表現される複雑さがある。

### 循環的複雑度

循環的複雑度は、客観的な複雑度合いの尺度を提供するために設計されたコードレベルの指標だ。

何が言いたいかというと、 **「このコードはこれぐらい複雑なんだよ？」** と言うための指標だ。

例えば、

- if文を一個もつ関数は二つの実行可能なパスがあるため`CC=2`となる

- 反対に、if文を持たない関数は`CC=0`となる

循環的複雑度合いは、次のような公式で定義される

```
CC = E - N + 2
```

なんでこの式になったのか?は分からないので触れない。

ここで、

- CC:循環的複雑度合い(Cyclomatic Complexity)

- N :ノード(分岐点の数,ifやelse ifの数)

- E :エッジ(コードが分岐する道の数,)

具体例を見てみよう


### 循環的複雑度のサンプル

次のような、java言語っぽいコードを見てみよう

```java
public void decision(int c1, int c2){
    if (c1 < 100) {
        return 0
    }else if ( c1 + c2 > 500){
        return 1
    }else{
        return -1;
    }
}
```

この場合、

- E :エッジの数:returnを通る3つのパスで E=3

- N :ノードの数:if文とelse if文の2つの分岐点で N=2

よって

CC = 3-2+2 = 3

という計測結果が出る。


### 循環的複雑度の一般化

循環的複雑度の式に出てくる2と言う数字は、一つの関数の単純化を表している。

他の関数を呼び出している場合は、循環的複雑度の公式は次にように変化(一般化)される。

```txt
CC = E - N + 2P
```

Pは関数内部で呼び出している他の関数の数である。



### 循環的複雑度はどれくらいの値だと良いのか

一般的に、IT業界におけるCCの閾値は、他の要素を考慮しない場合は10以下であることが推奨されている。

ただし、別の方の意見ではこの値はまだまだ高く、よくできた凝縮されたコードは5以下に収まっている。

あるケースでは、商用ソフトウェアパッケージの心臓部分として機能していた関数のCCが800を超えていた。

この関数では4000以上のコードを持ち、GOTO文を多用していたのだ。


### 循環的複雑度はどうすれば減るのか？

結論:テスト駆動開発をせよ

テスト駆動開発のようなエンジニアリングプラクティスでは、

1. コードを書く前にまずテストを書く。

2. そして、テストが通るためのコードを書く

と言う手順で開発を行なっている。

このエンジニアリングプラクティスでは、関数をテストしやすいようにキープするために必然的にサイズが小さくなる傾向がある。

これはテスト駆動開発の主目的ではないが、間違いなくポジティブな副作用である。



## 　詳細

https://techblog.short-tips.info/inhouse_se/1079arch_analytics.md
幸せになれるGitコマンド

## stashに名前をつける
```shell
git stash save "名前"
```
stashとは変更を一時的に退避させる機能で、ブランチ移動する際によく使います。
ただstashするだけだと、stash一覧を見てもどの変更なのか分かりづらくてプチストレスでした。
![スクリーンショット 2022-11-09 18.23.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1486484/38d5e72c-a071-3655-be22-ab57b2cb1e97.png)
`e2b9ec88 format`ってなんぞや。。。
画像のように一つだけならまだ良いですが、stashしすぎるとえげつないことになってしまいます。
そこで、stashに名前を付けられるコマンドがあったらな〜と思い調べたところ、先述のコマンドを知った次第です。
![スクリーンショット 2022-11-09 18.33.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1486484/bf635372-fcb7-47f6-8417-135d37ba83db.png)
ひと目でstashの内容が分かって幸せです🥰

## stashした内容を適応＆削除
```shell
git stash pop stash@{0}
```
stash関係でもう一つ、stashの適応と削除を同時に行えるコマンドです。
ちなみに適応・削除それぞれのコマンドは以下になります。
```shell
// 適応
git stash apply stash@{0}

// 削除
git stash drop stash@{0}
```
popを使うことで無駄なstashが溜まらず、stash一覧がスッキリして幸せです🥰

## 変更した内容をRollback
```shell
git reset --hard
```
このコマンドを知るまでは、エディター上の操作でRollbackしていました。
それでも特に不便さは感じていなかったのですが、Rollbackが完了するまで何回もポチポチしないといけないのはなんだかなぁ…と思っていました。
このコマンドを使えば一発で幸せになれますね。

## Gitコマンドにエイリアスを設定
`.gitconfig`を編集することで、コマンドにエイリアスを設定することができます。
早速stashのエイリアスを作ってみましょう！
まずは`.gitconfig`を開きます。
```shell
open ~/.gitconfig
```
するとテキストエディタが立ち上がり、こんな内容が書かれているかと思います。
```plaintext:.zshrc
[user]
	name = name
	email = ***@gmail.com
```
最終行に`[alias]`を追加し、エイリアスを設定します。
```plaintext:.zshrc
[alias]
	s = stash
```
そうすると、 stashのコマンドはこのようになります。
```shell
git s
```

## 'git'コマンドにもエイリアスを設定
「Gitのコマンド」ではなく、「gitコマンド」にもエイリアスを設定します。
この場合は`.zshrc`を開きます。
```shell
open ~/.zshrc
```
そして下記を追記し、シェルを再起動します。
```plaintext:.zshrc
alias g=git
```
```shell
exec $SHELL -l
```
そしてgitコマンドはこのように使えるようになりました。幸！
```shell
g add *
```

## 参考
https://zenn.dev/b1essk/articles/fcac50a00caaf2

https://www.r-staffing.co.jp/engineer/entry/20200821_1
ESXi上のVMのバックアップがいつの間にか失敗していた時の原因と対処法の一例

# 前提
ESXi上のVMを自動でバックアップしているはずが，一部または全てのVMがバックアップされていなかった時の原因と対処法を述べます．
バックアップ元をStoreNAS-main，バックアップ先をbackupとして記します．

# バックアップ失敗の原因と対処法

* 容量不足
    * いつの間にかバックアップが失敗していた場合，これが原因である可能性が一番高いでしょう．dfコマンドを用いてバックアップ先の容量の使用率が100%になっていないかを確認してみてください．
    ```例.
   [user@server:~] df -h
    Filesystem   Size   Used Available Use% Mounted on
    NFS         26.2T   8.2T     18.0T  31% /vmfs/volumes/***
    NFS         26.2T   8.2T     18.0T  31% /vmfs/volumes/***
    NFS         26.2T   5.4T     20.8T  21% /vmfs/volumes/***
    NFS         26.2T   5.4T     20.8T  21% /vmfs/volumes/backup
    VMFS-6       2.9T   1.7T      1.3T  57% /vmfs/volumes/StoreNAS-main
    VMFS-6     825.8G   1.4G    824.3G   0% /vmfs/volumes/***
    VFFS       119.8G   6.3G    113.4G   5% /vmfs/volumes/***
    vfat         4.0G 198.8M      3.8G   5% /vmfs/volumes/***
    vfat         4.0G  64.0K      4.0G   0% /vmfs/volumes/***
    ```
    バックアップ先の容量の使用率が100%になっている場合，不要なVMを削除しましょう．また，バックアップ方式を増分に変更することを検討しましょう．また，容量不足になったらSlackに通知すると良いでしょう．    

* バックアップの設定ミス
    * バックアップの設定時，VMの名前を以下のように取得している場合は注意が必要です．
    ```
    [user@server:~] vim-cmd vmsvc/getallvms | grep -v Name | grep StoreNAS-main  | awk "{print \$2;}"
    vm1
    vm2   
    backup-test 
    ...
    ```
    この取得方法でも問題なくバックアップはできますが，一度作成したVMの名前を変更していると，そのVMのバックアップができなくなります．これは，コピーしたいディレクトリの名前が，VMの名前を変更しても変更されないためです．試しに，backup-testという名前のVMを，restore-testという名前に変更しました．
    ```
    [user@server:~] vim-cmd vmsvc/getallvms | grep -v Name | grep StoreNAS-main
    1      vm1          [StoreNAS-main] vm1/vm1.vmx            ubuntu64Guest   vmx-14
    16     vm2          [StoreNAS-main] vm2/vm2.vmx            ubuntu64Guest   vmx-14       
    48     restore-test [StoreNAS-main] backup-test/backup-test.vmx ubuntu64Guest   vmx-14
    ...
    ```
    この例では，restore-testという名前のVMのディレクトリが，backup-testのままになっています．バックアップの際に存在しないファイルを取得しようとするため，バックアップが失敗します．

    ```
    vim-cmd vmsvc/getallvms | grep -v Name | grep StoreNAS-main | awk "{print \$4;}" | cut -f 1 -d "/"
    ```
    awkで直接ディレクトリを指定することで，VMのファイル名が変更されていてもバックアップをしてくれます．


* ハードウェアの故障
   * 修理を頼むか買い替えましょう．
* その他物理的な要因
    * 各種ケーブルが正常に使え接続されていることを確認しましょう．
【Go】エラー「go.mod file not found in current directory or any parent directory」が発生した場合の対処法

## 概要
Go 言語でエラーが発生した場合の対処法の備忘録

## 事象
エラー： `go: go.mod file not found in current directory or any parent directory`
👉 Go 言語を初めて扱う場合によく遭遇するエラー
![go_環境構築_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/2abef0b5-f31a-fdfb-08f3-1f86fbedf779.png)
（単純な Hello World 表示プログラムでのエラー例）

## 原因
`go.mod` ファイルが同階層もしくは親階層に見つからないため。

「go.mod ファイルが無いよ」と怒られているので、このファイルを用意する必要があります。
`go.mod` ファイルは、１つのプロジェクト（今回の事例なら「Hello World を表示するプログラム」という単位）で使用される go プログラム全体を管理するファイルのこと、…というイメージです。

## 対処法
ターミナルを開き、プロジェクトのディレクトリに移動したら、以下のコマンドを実行します（※ Hello World 表示プログラムでの例）

```bash
# go mod init {任意のプロジェクト名}
go mod init hello_world
```

すると、同階層に `go.mod` というファイルが生成され、以下の様な中身になっているはずです
```text
module hello_world

go 1.19
```

ここまで出来たら、もう一度 `hello_world.go` ファイルを開き、何も変えずに保存処理をすると、エラーが解消されます。

本来なら、コーディングをする前に、事前にこの `go.mod` を用意した方が良いということですね。
Screen Principles along with Engineering Right now

<p>
    While men&nbsp;<a href="http://www.whcleanroom.com/" style="white-space: normal;">drying tunnel sandwich panel</a>&nbsp;and women take into consideration substitute as well as replenishable electricity, the 1st impression that will relates to head can often be significant orange as well as dark-colored solar power systems in roofs as well as lightweight road symptoms which may have a smaller screen fastened. These kind of cells, often known as pv adventures (or SUN modules), turn sun rays straight into energy, along with they have been your central source involving replenishable electricity for many years.&nbsp;
</p>
<p>
    Your Pv Influence (how sun rays can be become electro-mechanical energy) ended up being found out over the millennium previously! Nevertheless prevalent rendering on this technological innovation have been quite continuous. Merely throughout quite recent times features photovoltaics received vast acceptance rather approach to develop energy.
</p>
<p>
    Throughout 1958 the 1st SUN adventures <a href="http://www.whcleanroom.com/html/en/products/mgopanel/" style="white-space: normal;">mgo eps sandwich panel</a>&nbsp;ended up presented straight into place for you to electrical power satellites. Asap, solar will be the principal method to obtain electricity with the Intercontinental Place Place. That is known also, SUN features customarily been recently employed in parts wherever there isn&#39;t a functional method to obtain energy nevertheless there exists considerable the sun.&nbsp;
</p>
<p>
    Solar power systems will often be used by rural purposes: similar to driving cabins, RVs, fishing boats along with smaller gadgets while grid assistance is just not offered. Just lately, &quot;grid-tie&quot; sun power devices get commenced increasing push as being a cost-effective approach to combine sun energy straight into each of our every day existence. Currently you can reap the benefits of offered solar panel technology even <a href="http://www.whcleanroom.com/html/en/products/handmadepanel/61.html" style="white-space: normal;">sandwich panel for clean room</a>&nbsp;though even now savoring your back-up in the electricity grid.<br/>
</p>
<p>
    <br/>
</p>
【Go】Go言語の環境構築手順とHelloWorld作成（まとめ）

## 概要
Go言語（golang）の環境構築方法、および、簡単な「Hello World」プログラム作成方法の備忘録

## 前提
- 使用PCスペック
  - OS: macOS 12.4

- Go バージョン： v1.19
- Go の公式サイトは現在英語しかなさそう

## 手順

### インストーラをダウンロード

公式サイト（[go.dev](https://go.dev)）にアクセス
![go_環境構築_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/2fd499d7-a8bc-19d0-209d-85d575222e07.jpeg)

トップページの「Download」ボタン、もしくは「Get Started」ページ内のダウンロードボタンを押すと
以下のダウンロードページに行けるので、ここで自分のPCのOSに合ったインストーラを選択してダウンロード
![go_環境構築_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/be8a5482-2ce8-c07e-74cd-5f728f6d2f59.png)

## インストール

ダウンロードしたインストーラをダブルクリックして起動
![go_環境構築_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/cbf78674-b519-4008-798c-a76813ecfd10.png)

インストーラですべて「続ける」「インストール」など肯定してインストールを完了させる
![go_環境構築_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/b751561e-0095-74db-2e8b-c1a37aeb4d6f.png)
![go_環境構築_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/a77cf02c-c407-42f7-e152-eb4e788bf911.png)
![go_環境構築_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/67df8d0e-dd2a-53c9-b639-dd1ed1c79dee.png)

インストールが完了したら、もう不要なのでゴミ箱へ捨ててもOK
![go_環境構築_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/c7fb9990-bdc3-cb53-aab9-466574ddc696.png)

### 確認

ターミナルでインストール確認

```bash
# バージョン確認
go version

# 結果
go version go1.19.3 darwin/arm64
```

Go が正常にインストールできていれば、上記のように「バージョン確認」コマンドを実行した結果が表示される。

Goのインストールは以上です。非常に簡単ですね。

## Hello World プログラムの作成と実行

最低限のプログラム作成と実行方法について、「Hello World」を出力するだけの簡単なプログラムを作成し、go言語として実行する方法をまとめます。

### go.mod の生成

`go.mod` ファイルは、１つのプロジェクト（今回なら「Hello World を表示するプログラム」という単位）で使用される go プログラム全体を管理するファイルのこと、…というイメージです。

これを作るために、任意のディレクトリを作成し、ターミナルでその場所へ移動し、以下のコマンドを実行します
```bash
# go mod init {任意のプロジェクト名}
go mod init hello_world
```

すると、同階層に `go.mod` というファイルが生成され、以下の様な中身になっているはずです
```text
module hello_world

go 1.19
```


### コーディング

`go.mod` があるディレクトリの中に `hello_world.go` というファイル名で以下のファイルを作成

VScode を起動して、以下の様にコーディングする
```go:hello_world.go
package main

import "fmt"

func main() {
  fmt.Printf("Hello world")
}
```

その際、`.go` ファイルを検知した VScode に、以下の拡張機能を推奨されるので、流れでそのままインストールしてください
![go_環境構築_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/8ed4a6e6-4890-1524-0ce0-1c81c8911a14.png)

### コンパイルと実行

ターミナルを開き、`hello_world.go` ファイルがあるディレクトリで以下のコマンドを実行します

```bash
# 実行
go run hello_world.go

# 結果
Hello World{使用しているPC名:ログインユーザ名}
```

結果に「Hello World」とは出るものの、その右側に自分のPC名などまで出てしまいます。
これは、プログラムのコンソール出力部分に改行を記載していないために発生するので、プログラムの `fmt.Printf` の部分を以下の様に修正します

**修正前**
```go:hello_world.go
func main() {
  fmt.Printf("Hello world")
}
```
👇👇👇
**修正後**
```go:hello_world.go
func main() {
  fmt.Printf("Hello world\n") // 「\n」を末尾に追記
}
```

修正したら、再度実行
```bash
# 実行
go run hello_world.go

# 結果
Hello World
```

以上で、Hello World 表示プログラムも完成しました。
あとは、色々な記事や動画で学習して、Go 言語の知見を深めていきましょう！
IBM Cloud でIBM i V7.5を構築してみた




2022/10/20(木) に開催された「セゾン情報システムズ　クラウドLT大会 vol.1」にLT発表者として参加いたしました。

 LTテーマ: クラウドサービスとしてのレガシーシステム提供の現状について

https://saison-coloris.connpass.com/event/260703/

https://speakerdeck.com/hayato_shioya/regasisisutemutokuraudosabisu


上記のLTの中で紹介した、IBM Power Systems Virtual Server を利用した、IBM i V7.5 および VPNの新規構築の詳細を記載いたします。
なお、2022年11月時点の情報となります。最新情報などは公式ページ等を参照ください。

### IBM Power Systems Virtual Server とは

https://www.ibm.com/jp-ja/products/power-virtual-server

## 環境作成の手順
1. IBM Cloud アカウントの作成
2. Power Systems Virtual Server ワークスペースの作成
3. 仮想サーバ・インスタンスの作成
4. 仮想インスタンスの操作
5. VPNの利用

#### IBM Cloud アカウントの作成
IBM Cloud を利用するにあたり、IBM Cloud アカウントが必要です。
下記のリンクからIBM Cloud アカウントの新規登録ができます。

https://cloud.ibm.com/registration

残念ながら、無償利用枠のアカウントは新規受付停止となっているようで、新規登録時にクレジットカード情報が必須となります。
よくクレジットカードの認証に問題が発生するようで、私の新規アカウント作成時もサポートへの問い合わせ(Caseの作成)を実施し解決いたしました。
また、IBM アカウントをお持ちの方をIBM Cloud へ招待することもできます。リソースはIBM Cloudアカウント単位となります。
この場合はクレジットカードの登録が不要となり、利用可能なリソースや権限を詳細に割り振ることができます。うまく利用することで、管理がしやすくなるものと考えております。



#### Power Systems Virtual Server ワークスペースの作成
IBM Cloud のリソースの検索欄から「Power」等で検索すると、[Power Systems Virtual Server]がヒットします。

https://cloud.ibm.com/power/overview

利用開始にあたり、まずワークスペースを作成します。作成時にリージョンの指定を行います。
リージョンによって利用可能なハード/ソフトウェアに違いがありますので、利用したい環境に合わせて設定してください。
利用可能な日本リージョンとしては、[東京04], [大阪21] リージョンが存在しています。
基本的に、ワークスペースの作成のみでは料金は発生しないようです。
また、ワークスペースで作成したリソースは他のワークスペースと共有することはできません。

#### 仮想サーバ・インスタンスの作成
作成したい環境を設定し、仮想サーバ・インスタンスを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651737/b970a16a-e6e0-cd02-1827-b1be10d293ec.png)
ブートイメージには、デフォルトでIBM i 7.1~7.5, AIXは7.1~7.3, LinuxはRHEL8 やSLES15 が用意されており、すぐに利用できます。
新たにブート・イメージを作成しておき、それらを指定することでカスタム・イメージとして起動することができます。
ストレージ・ボリュームやネットワーク・インターフェースは後からも変更可能ですが、初期段階で必要な分だけ確保しておくことをお勧めします。OSの自動再構成がカスタマイズされているようで、手動での再構成が必要なります。
プロファイルは、マシンタイプ以外はインスタンス停止時であれば変更可能となっています。
環境によるとは思いますが、構築には一時間弱ほどかかります。

#### 仮想インスタンスの操作
管理画面から、仮想インスタンスの操作ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651737/89143d05-b919-32df-3b5a-b3dc87d9c918.png)
起動や停止、コンソールのオープンやインスタンス自体の削除ができます。
加えて、インスタンスの詳細画面からカスタム・イメージ作成が可能です。
仮想インスタンスの起動状況に関わらず、一覧に存在することで料金が発生することになりますので、こまめな削除が望ましいと思います。カスタム・イメージをうまく利用できると大きくコストが抑制できそうです。

###### ブラウザからのコンソール操作
管理画面から、ブラウザベースのコンソールを利用できます。
少々操作がしづらい(ファンクションキーなど)ですが、専用コンソール(DSP01)での接続となります。
一時的な利用であれば、充分に操作が可能だと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651737/ea957456-08c1-18d7-9a10-29a2e7a627b2.png)


VPNの設定
Power Systems Virtual Serverには、構築不要なVPNサービス(VPNaaS)が用意されています。
必要最低限の設定で、構築した仮想インスタンスとの仮想ネットワークを構築することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651737/26edc7a3-698e-7758-ce85-c2d7e7013509.png)

VPN接続を作成すると、IBM Cloud側のゲートウェイのアドレス(ピア・ゲートウェイアドレス)が払い出されるので、ローカル側のネットワーク設定および仮想インスタンスOSのネットワークの設定をすることですぐに通信できます。VPN関連の設定の詳細については、構築の経験がない方でも十分に実施可能なレベル感となっておりましたので、省略いたします。

## おわりに
クラウド上でIBM i を構築し、ローカル環境との疎通までを確認できました。
実マシンでの構築と比べても非常に簡単に構築でき、また、ネットワーク含めて安定して稼働しております。

LTの中でも紹介させていただきましたが、Mainframeでもクラウドサービスが提供されているようであり、それぞれ検討していきたいと考えております。
MFCベクタ画像からSVG画像への変換の前準備

## MFC（Microsoft Foundation Class）にSVGクラスがほしい

SVG画像を出力するためにSVGクラスなどがライブラリにあればよかったのですが
見当たらないため自作することになりました。

SVG画像の中身はXMLなのでXMLTextReaderクラスを転用する方法も検討しましたが、
利便性の問題からその手法は取らず、設計からすべて自作することにしました。

## SVG画像の仕様
以下の仕様を基にしてします。

https://www.w3.org/TR/2011/REC-SVG11-20110816/
https://triple-underscore.github.io/SVG11/index.html

SVG画像はXML構文と同じものです。
前提知識としてXMLが必要となりますのでご注意ください。

## 座標の変換について

MFCからそのまま出力する分には座標の変換は必要ありませんが
大抵の場合、グラフ座標を使っていることが多いと思います。
グラフ座標は任意の原点 (0, 0) からX座標は右方向に向かって増加し
Y座標は上方向に向かって増加します。

SVG画像はラスタ画像と同じで画像の左上のポイントを原点 (0, 0) とし、
X座標は右方向に向かって値が増加し、Y座標は下方向に向かって値が増加します。

本投稿に関連する投稿ではすべてSVG画像への出力時に
グラフ座標から画像座標への変換（上下の反転）を行います。
また、MFCでの表示範囲から一部だけを切り取りしたものを出力する形になりますので
平行移動なども同時に行います。

変換の詳細につきましては一つの投稿にまとめますのでそちらをご覧ください。

## SVG出力用クラス

画像管理クラスとしてSvgImageクラスを用意しました。
全体管理を行う SvgImage クラスがXMLのタグ SvgTag クラスのリストを保持している形となります。
コンストラクタとデストラクタの中身は省略します。
以下のような宣言になっています。

```cpp:SvgImage.h
class SvgTag
{
public:
	CString m_strName;		// タグ名
	CString m_strValue;		// 値
	int m_nDepth;			// 階層
	BOOL m_bOne;			// 単独タブかのフラグ
	CArray<CString, CString> m_arrAttr;			// 属性名
	CArray<CString, CString> m_arrAttrValue;	// 属性値

public:
	SvgTag();
    ~SvgTag();
};

class SvgImage
{
protected:
	CString m_strFilePath;		// ファイル名
	CArray<mdSvgTag*, mdSvgTag*> m_arrayTag;	// タグ
	Rect m_rectAll;	// viewport
public:
	SvgImage();
    ~SvgImage();
}
```

足りない分の方が多いですが、記事に応じて追加していきます。
Pythonで棒グラフのpeak(山)の検出

# はじめに
棒グラフをPythonにより描写し，peakが何個存在するかを自動カウントするプログラムを作成したい

# 前提
今回求めたいpeakを説明する．
peakとは山頂，山，先端などを表し，図の赤い丸の部分のことを言う．
RSSI値(dBm)をx軸の左側から順にみていき，現在の値が一つ前の値よりも大きいかつ，現在の値が1つ次の値よりも大きい時，peakとしている．
![peak_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650453/45afe79b-fbbb-3808-1911-50c6606f7a9e.png)

# 使用したデータ
![ble_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650453/8f91fa6a-208d-3368-bab8-ab31609e183f.png)

研究で使用しているBLEのRSSIデータの一部抜粋である．今回は504個のデータを使用する．

# 環境
- Jupyter Notebook(Anaconda3)
- Python
- 使用するデータのcsvファイルとプログラムは同じレイヤーに置く
![jupyter_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650453/204c27ab-abc9-a644-e8f6-034ce4f299dd.png)

# 実装

```peak.py

def peak(data_path):
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    import csv
    from statistics import variance

    rssi = []
    
    #csvファイルを読み込む
    with open(data_path) as f:
        reader = csv.reader(f)
        data = [row for row in reader]
    
    for i in data:
        try:
            rssi.append(int(i[1]))
        except:
            pass
    
    min_rssi = min(rssi)
    max_rssi = max(rssi)
    
    #RSSIの最小値と最大値の範囲を出力
    print("{}<=RSSI<={}".format(min_rssi,max_rssi))
    
    plt.figure(figsize=(8,6))
    
    #山の数をカウントする
    count=0
    for i in range(min_rssi,max_rssi+1):
        #棒グラフの描写
        plt.bar(i, rssi.count(i), color="blue")
        if rssi.count(i) > rssi.count(i-1):
            if rssi.count(i) > rssi.count(i+1):
                count+=1
            else:
                count+=0
        elif rssi.count(i)>0:
            if rssi.count(i) == rssi.count(i-1):
                if rssi.count(i) > rssi.count(i+1):
                    count+=1
                else:
                    count+=0
        else:
            count+=0
        #print(rssi.count(i))
    print(f"山の数は{count}") 
    print(f"分散は{variance(rssi)}")
    
    #グラフの範囲と書式設定
    plt.xlim(min_rssi, max_rssi)

    plt.ylabel('取得回数(回)', fontfamily='Meiryo', fontsize=18)
    plt.xlabel('RSSI(dBm)', fontfamily='Meiryo', fontsize=18)
    plt.show()

    return (f"{data_path}の山の数は{count}")

```
# 実行結果

データから棒グラフを描写し，peakを特定することが出来ました．

![kekka_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/650453/e6a19a8c-2098-1a0c-7096-01185b2705a9.png)

# まとめ
Pythonによるpeak検出ができました．研究頑張ります．
プロジェクトマネジメント資格全般

## 経緯

日本において有名なプロジェクトマネジメントの資格といえば、
- IPA 情報処理推進機構 プロジェクトマネージャ試験（以下 IPA-PM）
- PMIのPMP(Project Management Professional)

が有名どころ。
しかし、プロマネの資格を取ろうと思った時、真にこの2つしかないのかと思って調べたのがきっかけ。
なお、筆者はCompTIA Project+を保有しているが、なぜそれにしたのかは[この辺](https://qiita.com/tatsu_sekine/private/b8a374096af7ea651cf7
 "CompTIA Project+を取得した")に。

2023年3月追記。
[Professional Scrum Master I (PSM I) を取得した。](https://qiita.com/tatsu_sekine/items/65c4ba1f8f724b03f172 "Professional Scrum Master I (PSM I) を取得した")

2023年4月追記。
[Scaled Professional Scrum (SPS) を取得した。](https://qiita.com/tatsu_sekine/items/33c96657f768e1da63cc "Scaled Professional Scrum (SPS) を取得した")

2024年4月追記
[Professional Scrum Product Owner I (PSPO I) を取得した。](https://qiita.com/tatsu_sekine/items/85e86fdc7b20845f57aa "Professional Scrum Product Owner I (PSPO I) を取得した。")

## 世の中にあるプロジェクトマネジメントの資格

世の中には本当に色々なプロマネ資格がある。

|資格名  |認定団体  |
|---|---|
|プロジェクトマネージャ |IPA 情報処理推進機構 |
|P2M プロジェクトマネジメント・コーディネーター(PMC) <br> P2M プロジェクトマネジメント・スペシャリスト(PMS) <br> P2M プログラムマネジャー・レジスタード(PMR)|日本プロジェクトマネジメント協会 |
|プロジェクトマネジメント・アソシエイト（PJM-A） <br> PMO（プロジェクトマネジメントオフィス）スペシャリスト|PMO協会 |
|Project Management Professional(PMP)<br>PMI-ACP(PMI Agile Certified Practitioner) |PMI |
|CompTIA Project+ |CompTIA|
|PRINCE2 Foundation, Practitioner  |Office of Government Commerce<br>イギリス商務局 (OGC) |
|Google Project Management Professional Certificate |Google |
|アジャイルソフトウェア開発技術者検定試験 Lv.1, Lv.2 |アジャイルソフトウエア開発技術者検定試験<br>コンソーシアム |
|Certified Scrum Master<br>Advanced Certified Scrum Master<br>Certified Scrum Professional |Scrum Alliance |
|Licensed Scrum Master |Scrum Inc. |
|Professional Scrum Master I, II, III |Scrum.org |

## 難易度
それぞれの資格同士での難易度はどうなのか。

- IPA-PMとPMPどっちが偉いのか。Project+は意味がないのか。
  - 結論：場面による。
    - one size fits all などありえない。
    - 身も蓋もない話だ。


- ITSSのキャリアフレームワークと認定試験・資格とのマップ （経済産業省・IPA配下のスキル標準ユーザー協会(特定非営利活動法人)が出している資格難易度表 ）によると[^1] 
  - **IPA-PM > PMP = Project+**
    - 政策に売りなし。
    - ジャパン・アズ・ナンバーワン！！


- IT Certification Roadmap（CompTIAなる米国で発足した非営利のIT業界団体が出しているIT資格のロードマップ）だと[^2]
  - **Prince2 > PMP > Project+**
    - IPA-PMは登場すらしない。
    - ジャパン・アズ・ナンバーワン再考。。。

## 資格を持っているとプロジェクトが成功するのか。
- 問い：資格を持っているとプロジェクトが成功するのか。
- 答え：するとは限らない。
  - 成功する場合もあるし、失敗する場合もある。
    - 資格で成功が確約されるなら苦労はしない。
    - 銀の弾丸などない。(No Silver Bullet)
  - とは言え、知識に基づいて適切なプロジェクト管理が出来る可能性は高まる。

## 取得することで何かいいことがあるのか。
- 提案時に有効になることがある。
  - 案件の入札条件に記載されている場合がある。
  - そうでなくても、顧客や社内からの信頼を得るのに一役買ってくれる。（ことがある）
    - もちろん、プロジェクトを成功に導くのが最優先。

- 金銭的な話
  - 資格手当以外でも自身の市場価値を高めてくれる。

- 知識を整理する意味でも持っておくと良い。
  - 話のネタになる。
    - 悪名は無名に勝る。

## どの資格を取るべきか
- 人による。
必要と思われる、もしくは取得可能な資格を取得するのが最良。
  - みんな違っていい。 
    - Everyone is different, everyone is special. 
  - 一人で資格を完全制覇するのは資格マニアでもない限り、現実的ではない。

## 補足
- 業務独占資格ではないので、プロマネの資格を取らなければプロジェクトマネジメントが出来ない、ということはない。
    - 資格取得を通じて勉強したことで適切なプロジェクトマネジメントが出来る可能性は高まる。
- 全員がPMでも困る。
  - 実現できる技術こそ重要。
  - 極論、勝手に実装をしてくれて開発が完了するのであればPMなど不要。
    - 実際には理想論過ぎて現実的ではない。
    - やっぱりプロマネも必要。


[^1]: ITSSのキャリアフレームワークと認定試験・資格とのマップ : https://www.ssug.jp/qualification/
  
[^2]: IT Certification Roadmap : https://partners.comptia.org/docs/default-source/resources/04687-it-certification-roadmap-nov2020-24x36-onepage.pdf
お客様の中に24時間監視体制で調子の悪いwimaxを再起動できるエンジニアの方はいらっしゃいませんか！！！

# 更新
11/10にファームウェアが2.1.0 -> 2.3.0に更新されてこの記事は用済みになりました...嬉しいけど悲しい...

# 結論
[このリポジトリ](https://github.com/Mkamono/wimax-restart)をcloneして、`.env`ファイルに`WIMAXPASS=あなたのクイック設定webのパスワード`を書いて`docker-compose up`すればできるよ

# はじめに
一ヶ月ほど前からうちのwimax home L12 の調子が悪く、どうも困っていました。
症状としては、LEDランプは正常を示しているがインターネットにはつながらない。しかしスマホやPCからは接続しているという表記になっている。「インターネットなし」との文言が出る、といったものです。
恒常的にこんな感じなのであればすぐサポート連絡なりして強く訴えられるんですが、２日に一回程度、再起動すれば治るといった頻度で対応してもらえるのか、そして今後ファームウェアの更新で直るんじゃないかと思い、とりあえずプログラムを書いてみました。このプログラムは問題の対処と同時に原因究明を目的にしているので、データの解析もできるようにしています。（現在データ収集中）

# フォルダ構成
```
.
├─docker-compose.yaml
├─Dockerfile
├─.env
├─.gitignore
├─requirement.txt
└─app
    ├─network
    │  └─wimax.py
    ├─sqlitemod
    │  ├─base.py
    │  ├─base_engine.py
    │  ├─migrate.py
    │  └─models.py
    ├─store
    │  ├─data.sqlite3
    │  ├─graph.py
    │  └─images
    │     └─img0.png
    └─main.py
```
# 環境
Dockerインストール済みを想定しています。Pythonと、Seleniumのスタンドアローンイメージを使ってブラウザの操作からwifiの管理画面にログインし、再起動をかけています。

# 動作
```python:main.py(抜粋)
if __name__ == '__main__':
    base = os.path.dirname(os.path.abspath(__file__))
    datapath = os.path.normpath(
        os.path.join(base, './store/data.sqlite3'))
    time.sleep(10)

    Migration(datapath).status()

    cli = Statuscls(datapath)
    wifi = wimax()

    while True:
        try:
            wifi.get_status()
            cli.create(wifi.status.status_OK,
                       wifi.status.status_OK_global, wifi.status.message)
            if (not wifi.status.status_OK_global):
                wifi.restart()
        except:
            cli.create(0, 0, "ネットワークオフ")
            wifi = wimax()  # 再代入によりデストラクタが実行、wifi接続リセット
            pass
        finally:
            data = Statusdatacls(datapath)
            if data.is_exist_img():
                pass
            else:
                data.save_img()
                print("image saved")
            time.sleep(50)

```
メインの処理はこのあたりです。最初にパスを生成して、データの置き場所を決めます。sqlarchemyを利用してsqliteを操作するので、極論sqlite以外のDBでも扱えると思います。
status_OKはLANが機能しているか、status_OK_globalは外部のインターネットに接続できるかを確認しています。

メインの処理としてはstatus_OK_globalが0であり、status_OKが1であれば再起動をかけ、一定時間待つというだけの処理です。ネットワーク自体がオフの場合はstatus_OKが0、というよりget_stats関数がエラーを起こすので、別途処理しています。

再起動はどうやってかけてるのかというと、seleniumでブラウザを操作してやっています。ログイン処理があるサイトはこれが一番楽ですね。

# おわり
いざ記事を書いてみると意外と書きたいことがなくて困りました。多分すぐアップデートが来て修正されると思いますが、それまで使ってやってください。以上です。ありがとうございました。
ノーコードツールで Database Collection を API を経由で利用するのは激しく簡単

Professional プラン以上を契約する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/9e79d20d-01dd-011e-45bd-617392c8e662.png)


Database Collections の API Document を選ぶ

<img width="585" alt="image" src="https://user-images.githubusercontent.com/13635059/201007362-fe123e38-3ee4-4688-a8c0-ba1037595dc9.png">

ここに丁寧にコマンド例が書かれているのでそのまま実行すればOK


<img width="758" alt="image" src="https://user-images.githubusercontent.com/13635059/201007539-695d5b33-e0b7-4473-9690-4ad9a8c0832b.png">


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
Stripeをこれから始める時に便利な、4つのStripeダッシュボード・ドキュメント機能

Stripeでは、ノーコードでのサブスクリプション・決済受付からフルスクラッチでの決済やマーケットプレイスシステム構築まで幅広い用途での開発ができます。

その分、APIやダッシュボード・ドキュメントの量に圧倒されてしまう方もいらっしゃるかもしれません。

今回は、Stripeでの開発を便利に進めるためのツールを紹介します。

## Stripeをこれから始める時に便利な、４つのStripeダッシュボード・ドキュメント機能

### 1: クイックスタートで、好きな言語を使ってStripeを試そう

ECサイトの注文処理や、サブスクリプション登録処理など、「できることはわかっても、どう作ればいいかわからない」ケースに使えるのが「クイックスタート」です。

Stripeでは、ドキュメント内に**シンプルな実装サンプル**を**言語・ライブラリ別**に表示・ダウンロードできる「クイックスタート」を複数用意しています。

![スクリーンショット 2022-10-06 12.28.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/3663666e-b913-63cb-d9e5-2dff12a9ec6c.png)


サンプルコードを解説付きで閲覧できるだけでなく、サンプルコードをまるごとダウンロードして、手元で動かすこともできます。

製品ごとに用意されていますので、新しい機能や製品を触る場合は、一度クイックスタートがないか確認してみましょう。

https://qiita.com/hideokamoto/items/c2f737d9f38a23af4a4b

### 2: Stripe APIの呼び出しが意図した通りかを確認できる「APIログ機能」

StripeのAPIに対して、どのようなリクエストが送信されているかをデバッグすることができます。

![スクリーンショット 2022-10-25 15.57.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/1e0f49c7-6692-5321-315c-42a9a39ebd29.png)

Stripeダッシュボードのログ確認ページを利用すると、「いつ、どのAPIが、どこから呼び出されたか」の調査が可能です。

https://stripe.com/docs/development/dashboard/request-logs

リクエストパラメータが条件によって動的に変わる場合などで、意図しないパラメータが生成されていないかを確認する方法として、ご活用ください。


#### エラーレスポンスから、直接ログページに移動する

Stripe APIのエラーレスポンスには、ダッシュボードのログページURLが含まれています。

このURLをエラートラッキングツールなどに表示させる設定を行うことで、エラー発生時の調査をよりスムーズに進めることができます。

https://qiita.com/hideokamoto/items/5505d8fbd717853d2c4b

### 3: ブラウザでStripe CLIを利用したWebhookデバッグができる「Stripe Shell」

Stripeをシステムに組み込む場合、さまざまなWebhookイベントとの連携を行う必要があります。

そしてこのWebhookイベントをシミュレートするには、Stripe CLIを利用するか、ダッシュボードでそのイベントが発火する操作を行わなければなりません。

Stripeのドキュメントサイトに実装されている「Stripe Shell」を利用すると、Stripe CLIをインストールする必要なく、入力補完付きでStripeのWebhookイベントを手動送信することができます。

![スクリーンショット 2022-11-10 14.23.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/bda485f7-0cef-663e-93f2-be47b4c7717b.png)


https://stripe.com/docs/stripe-shell/launch?shell=true

### 4: サブスクリプションの時間経過を試せる「テストクロック機能」

サブスクリプションを組み込む場合、「契約期間中にプラン変更や解約されたケース」や「契約日と請求サイクルが連動しない（翌月1日請求など）ケース」など、時間経過を含む状態変化をテストする必要があります。

Stripeの場合、「Stripe内の時間経過をシミュレーションする機能」として「テストクロック」を提供しています。

https://stripe.com/docs/billing/testing/test-clocks

この機能を使うことで、請求サイクルや差額の日割計算、未払い時の対応などを事前にテストすることができます。

https://qiita.com/hideokamoto/items/42bec78843a5f12529ad

## ダッシュボードを活用して、決済・サブスクリプションOPS（オペレーション）を効率化しよう

Stripeのダッシュボードを活用することで、よりシステムの組み込みや運用を効率的に行うことができます。

調査段階や開発初期フェーズでは、なかなか気づきにくい機能もあるかと思いますが、この記事をきっかけに触れていただけると幸いです。
【Next.js】ルーティング

## ルーティングとは？？
リクエストされたURLと対応する処理を関連付けること

ファイルのパスがそのままURLになります

## 基本的なルーティング
ディレクトリ構成は以下の通り
├─pages
│  ├─exapmle_router
│  │  └─otameshi     
│  │  │  └─[number].js
│  │  │  └─Example.js
└─styles

```typescript
//Example.js
const Example = () => {
  return <h1>Exampleが出力されます</h1>
}

export default Example;
```

URLを***http://localhost:3000/example_router/otameshi/Example***としてあげると画面に「Exampleが出力されます」と表示された
このようにファイルのパスが直接URLになっていることが確認できる

次に動的なルーティングについて確認する

otameshiフォルダの中にExample.js以外のファイルを追加していきたい場合を考える
その時に毎回Example2.js,Exapmle3.js...とファイルを追加することはしない

動的なルーティングを用いると.jsファイルを1つ準備するだけでこれを解決することができる

ファイルの名前が[number].jsとなっているので「number」の部分がダイナミックルーティングになり、その値をJavaScript内で使用することができる
コードの中身は以下の通り
```typescript
//[nubmer].js
const Number = () => {
  return <h1>[number].jsが出力されています</h1>;
};

export default Number;
```
URLを
http://localhost:3000/example_router/otameshi/Example2
や
http://localhost:3000/example_router/otameshi/Example3
とすると「Example」ではなく「[number].jsが出力されています」が表示されることが分かる