OmniAICreator/Qiita-1.07M huggingface dataset:
Power Automateで日付を簡単に変換する

# はじめに
2022年10月より、クラウド版のPower Automateで「例を使用してデータを書式設定する」という機能がプレビューで提供されました。
[Microsoft 公式ドキュメント](https://learn.microsoft.com/ja-jp/power-automate/format-data-by-examples?WT.mc_id=M365-MVP-4029057)

これは、入力例と出力例をたくさん入力すると、自動でそれを変換するための式を生成してくれる機能です。
様々な時間をベースに、日付項目に値を設定する際にとても便利そうだったので、使ってみました。
「例を使用してデータを書式設定する」の使用方法として、参考になれば幸いです。

# メールの受信日時の入力フォーマット
今回は全てメールの受信日時から変換する例です。メールの受信日時の入力フォーマットは以下となります。
`2022-12-02T04:22:48+00:00`

入力フォーマットが間違っていると正しい式には出来ないので、入力フォーマットがどうなっているかは必ず確認してからフローを作成するようにしましょう。


# 翌日の日付を取得する式を生成する
「希望する出力」が翌日になるように、以下のように例を入力します。
希望する出力が全て9:30としているのは、私が翌日の9時半に期限設定をしたいためですが、もし日付情報だけでよければ「2022-12-03」とすることで、日付だけを出力することもできます。


|受信日時の値の例 | 希望する出力 |
|:-:|:-:|
|2022-12-02T04:22:48+00:00|2022-12-03T09:30:00|
|2022-12-03T10:15:50+00:00|2022-12-04T09:30:00|
|2022-12-19T07:36:31+00:00|2022-12-20T09:30:00|

**実際に入力した画面がこちら**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/864e96c2-177f-f1c6-40b9-64edc1a51d64.png)

「式を取得する」ボタンを押下すると以下のように式が提案されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/d0ee9096-9dbb-f170-dc30-a410dc0502f2.png)

テストすることも出来るので、イメージとあっているか検証することができます。
あまりこった入力例を作成せずに生成した式でしたが、年またぎも月またぎも出来ていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/7d378d65-dfee-c29d-5acc-b153987462b1.png)

式が問題ないようだったら「適用」ボタンを押下して完成です！

# かならず月末を指定する
希望する出力が月末になるように、以下のように例を入力します。
|受信日時の値の例 | 希望する出力 |
|:-:|:-:|
|2022-12-10T04:22:48+00:00|2022-12-31T09:30:00|
|2022-11-12T15:10:30+00:00|2022-11-30T09:30:00|

生成されました！
2月の例を設定してなかったので少し不安だったのですが、2月も問題なく月末を指定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/9cbda7ef-d878-41fb-1e11-96c73e49ce70.png)


# 固定文字列と月を結合する
以下のように希望する出力を設定するだけで、式が生成されます。
|受信日時の値の例 | 希望する出力 |
|:-:|:-:|
|2022-12-10T04:22:48+00:00|12月精算作業|
|2022-11-12T15:10:30+00:00|11月精算作業|
|2023-02-26T04:22:48+00:00|2月精算作業|

# できなかったこと
- 「前月の月」を取得すること
12月の月初に、11月の精算作業というタイトルのタスクを作成したかったのですが、生成できませんでした。
翌月でも当月でもできたんですが、なぜか前月はNG…。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/7e468e3e-1218-3900-2c08-198e7d74f47a.png)

# おわりに
今回は日付の変換で活用しましたが、例えば「メール本文からいつも期待したところを抜き出したい」など、活用方法はたくさんあるかと思います。
プレビューではありますが、是非ご活用ください。
infracost を使って インフラコストの見える化をする


## はじめに

アドベントカレンダーの記事作成のため、 Terraform 関連のネタを探していたら infracost というツールを見つけたので、実行してみました

## infracost とは

infracost は Terraform 上の定義から予想されるコストを表示させるツールです

https://www.infracost.io

OSS のため、ソースコードは GitHub 上に公開されています。 Infracost Cloud を利用するには一定コストがかかりますが、 CLI 上で実行するだけならコストをかけず実行することが出来ます
ただし、実行には現在のクラウドサービスの価格取得のために Infracost アカウントを作成し API Key 発行。設定する必要があります。

## 実行してみる

それでは infracost を実行してみましょう

### Infracost を install する

macOS を利用しているため Homebrew を利用して install します

```sh
brew install infracost
```

macOS 以外を利用している方は以下 Docs を参照し設定してください

https://www.infracost.io/docs/#1-install-infracost

### API key を取得する

実行には instance cost を取得のため infracost の 登録/ログインが必要になります
以下コマンドを実行すると、ブラウザが立ち上がります。登録/ログインを実施してください

```sh
infracost auth login
```

認証が完了すると CLI に API Key を保存した表示が出ます
また、ブラウザは以下のような表示に切り替わります

```
The API key was saved to /Users/mziyut/.config/infracost/credentials.yml
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55950/bda76078-048e-9b90-824c-2b8ef9717bd2.png)

### infracost を実行してみる

今回は以下のようなファイルを用意して実行してみました

```hcl:main.tf
provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_instance" "example" {
  instance_type = "t4g.micro"
  ami           = "ami-0b69ea66ff7391e80"
}
```

https://github.com/mziyut/playground/pull/1

terraform の実行環境は各々用意してください
準備が出来たら `infracost breakdown --path .` を実行してみます

```sh
> infracost breakdown --path .
Evaluating Terraform directory at .
  ✔ Downloading Terraform modules
  ✔ Evaluating Terraform directory
  ✔ Retrieving cloud prices to calculate costs

Project: mziyut/playground/test-infracost

 Name                                                  Monthly Qty  Unit   Monthly Cost

 aws_instance.example
 ├─ Instance usage (Linux/UNIX, on-demand, t4g.micro)          730  hours         $7.88
 └─ root_block_device
    └─ Storage (general purpose SSD, gp2)                        8  GB            $0.96

 OVERALL TOTAL                                                                    $8.84
──────────────────────────────────
1 cloud resource was detected:
∙ 1 was estimated, it includes usage-based costs, see https://infracost.io/usage-file
```

今回指定した、 `t4g.micro` を 1 ヶ月動かすと `$8.84` かかることがわかりました

## 最後に

今回は、 CLI での利用例を記載しましたが、 GitHub Apps や VS Code の Extension もあるそうです
各々必要な環境で設定し利用してみてください

https://www.infracost.io/docs/integrations/github_app/

https://www.infracost.io/docs/integrations/vscode/

## Reference

https://github.com/infracost/infracost

https://www.infracost.io
Jupyter Notebookで名前空間を汚さない工夫

Jupyter notebookは名前空間が汚れて大変なことになるので、極力使っていないのですが、解析が実験ノートの一部になるときはなんだかんだで便利なので使っています。名前空間が汚れるのを防ぐために次のようなことをしています。

### 1. `run`を定義

デコレートした関数を実行するだけの関数です。

```python
def run(f):
    return f()
```

### 2. main関数みたいなものを各セルで定義

```python
@run
def calculate_mean():
    data = np.random.random(100)
    print(np.mean(data))
```

これでセルを実行すると関数が勝手に実行されます。当然変数は関数内でしか有効ではないので、名前空間は汚れません。関数名自体と変数名が衝突しないように、関数名は内容が分かるようにという意味でもすごく長いのにしましょう。

使ってみてください。
モバイルアプリの良質デザイン6選

# この記事について
どうも初めまして。
ARISE analyticsのタコです。
本記事は ARISE analytics Advent Calendar 2022 の19日目の記事になります。

今回は個人的に使ったことのあるアプリから好きなデザインのアプリを6個に絞って紹介します。
良いデザインのアプリって触っていて本当に楽しいですよね。
それがユーザーデザインであれ、UIの話であれ。
知ってるわってレベルの超有名なものもあったりするのはご愛嬌という事で。
なおメインのOSはiOSになります。

# Disney Resort
iOS：https://apps.apple.com/jp/app/tokyo-disney-resort-app/id1313147771
Android：https://play.google.com/store/apps/details?id=jp.tokyodisneyresort.portalapp&hl=ja&gl=US
リゾートアプリです
早速知らない人を探す方が難しいレベルのDisney様によるアプリです。
とは言ってもディズニーリゾートに行ったことがないという人は結構多いのでは？と思います。
かくいう私も昨年に行ったのが初めてで、その際に当アプリをDLしました。
スプラッシュ画面からアプリTOP画面に加えてランド・シーを選択した時の飛び込むような画面遷移が夢の国の世界観を作り出します。
地図画面をスワイプしているとランド←→シーに切り替わるアニメーションがあったりと初めて触った際に驚きとワクワクした事を強く覚えています。
アトラクションの待ち時間を表示するポップアップのアニメーションも、ここまでアプリ一つで世界観を表現できているのも稀有なものではないでしょうか？
ディズニーランドに行く予定がない方も一度使って最初の画面遷移と地図を動かすだけでも十分楽しめると思うのでぜひ触ってみてください

# マップ(Apple純正)
地図アプリです
リリース当初は"パチンコガンダム駅"やソビエト・邪馬台国の復活などネタの宝庫として有名だったApple純正マップも、度重なるアップデートにより素晴らしいクオリティになりつつあると思います。
実際にiOS標準アプリの中でもかなり高水準なアプリ体験をさせてもらえるものの一つになっていると思います
特にLook Around機能については移動先をタップした際の挙動はただ移動するだけでなく、障害物があれば避けるような演出があったり画像の切り替えも違和感の低減のため複数回に分けて行われたりと非常に高いクオリティになっていると思います
個人的にはこれに関してはGoogleMapsのストリートビュー以上の体験だと感じています。
Twitterなどで話題になっていたのでご存じの方も多数いらっしゃるかと思いますが、実際に触ってみてください。
良い意味で期待を裏切られると思います。さすが林檎様


# Yo Window
iOS：https://apps.apple.com/jp/app/%E6%AD%A3%E7%A2%BA%E3%81%AA%E5%A4%A9%E6%B0%97-yowindow/id799653744
Android：https://play.google.com/store/apps/details?id=yo.app.free&hl=ja&gl=US
天気アプリです。
左右にスワイプすることで時間の操作をするだけです
メインの機能としては以上になりますが、これがとても楽しいのです。
街中や空港など全8種類の内臓されている背景の絵が天気や時間によって変化します。
それに加えてこのアプリ、音が出るんですよ！
例えば風が強い日には風の音が、雨の日には雨の音。飛行機が飛んでいく音だったり意外に複雑な構成になっているので飽きの無い非常に楽しいアプリになっています

# Filmarks
iOS：https://apps.apple.com/jp/app/filmarks-%E3%83%95%E3%82%A3%E3%83%AB%E3%83%9E%E3%83%BC%E3%82%AF%E3%82%B9/id549126249
Android：https://play.google.com/store/apps/details?id=in.tsumiki.filmarks&hl=ja&gl=US
映画批評アプリです
これも非常に有名ですね。
映画が好き・映画をこれから見ていきたいなと思っている人達はこのアプリを一度でも触ってみる事をおすすめします。
ちなみに自分は後者側でしたがこのアプリを使って以来映画好きになってしまいました。すごいアプリ。
アプリをバックラウンドから戻ってくる・トレンドを開くなどいろんなアクションに新作映画のPVが流れるようになっています。
この「絶対に映画を好きにさせる」という強い意志を感じるアプリも少ないような気がします。
"強いメッセージをアプリの随所に盛り込む"事の楽しさ、大切さを学ぶことのできるこのアプリ、とてもおすすめです

# BLACK - B&W Film Emulator
iOS：https://apps.apple.com/jp/app/black-b-w-film-emulator/id939009354
Android：無し
画像編集アプリです
"モノクロにできる"というアプリはいくつもあるかと思います。
しかし過去のフィルムを再現できるモノクロ編集アプリは少ないのではないでしょうか？
左右にスワイプしてフィルムを選ぶというとてもシンプルなものになっていますがどれもモノクロなのに意外な程に差があるのです。
私はこのフィルムたちが活躍していた時代にはまだ生まれていなったのですが、レビューを見ると「とても良い」という声もあり、疑似的にでも当時の雰囲気を感じることができます。
体験はもちろん、UIも白と黒だけで表現されているので非常にスタイリッシュで洗練された美しいアプリになっています。


# 大辞林
iOS：https://apps.apple.com/jp/app/%E5%A4%A7%E8%BE%9E%E6%9E%97/id299029654
Android：無し・・・？
辞書アプリです。
私がぐだぐだ語るよりも先にこのアプリ、グッドデザイン賞を受賞しています。
これは当然の結果としか言いようのないこのアプリについてですが、
このアプリを表現するのに"美しい"以外に適する表現がありません。
黒の小枠と白の文字。これ以上ないシンプルさの中に日本特有の麗しい文化や日本語の美しさが表現されています。
しかもこのアプリ、ただ見た目の美しさだけでなく上下左右にぐりぐりと動かせるのも楽しく、言葉の海を漂うような感覚を味わう事ができます。
美しい上に楽しいとかそれはもうグッドデザイン賞の受賞もしますよ・・・
Qwikアプリの一部にIonicコンポーネントを使う方法

Ionic Frameworkは「モバイルアプリのUIをWebで再現できるUIフレームワーク」として多くのアプリ開発の現場で利用されているのは広く知られているところです。Ionic teamがIonic Conferenceの時にだした次のConference Appをみると、その再現度の高さに気づけるかと思います。

https://ionic.io/blog/building-the-eas-2021-conference-app

https://ionic.io/events/ioniconf-2022

しかしWeb開発の現場において、モバイルアプリ開発はニーズのごく一部に過ぎません。ストアに配信するアプリではなく、ブラウザのみで配信することも多いでしょう。そういう案件によっては、Human Interface GuidelinesやMaterial Designに沿って、プッシュ遷移・ポップアップ遷移までは求めることはありません。

しかし、近年モバイルUIとWeb UIの間の境はほとんどなくなってきており、Web UIにおいてもToastやAction Sheet、Floating Actionといったモバイル起源のUIを使うことも増えてきました。そこで、本記事ではアプリの一部にIonicコンポーネントを使う方法をご紹介しましょう。IonicのUIコンポーネントはすべてがLazyLoadingになっているので、追加してもアプリ立ち上げ時に必要なbundleサイズにはほとんど影響しません！

# はじめ方

## scriptタグではじめる

おそらく現代でフロントエンドを行うほとんどの人にニーズはありませんが、まずは懐かしのscriptタグではじめる方法を整理しましょう。

Ionicは導入検討をすばやく行うために、CDN「jsdelivr」を使ってコンポーネントの配信をしています。これをタグで読み込むだけで使い始めることができます。あなたのプロジェクトに追加するのは、以下のたったの3行だけです。

Qwikの場合は、 `header.tsx` に追記してください。

```html
<script type="module" src="https://cdn.jsdelivr.net/npm/@ionic/core/dist/ionic/ionic.esm.js"></script>
<script nomodule src="https://cdn.jsdelivr.net/npm/@ionic/core/dist/ionic/ionic.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@ionic/core/css/ionic.bundle.css" />
```

1行目は[type=module]ですので、ES Module対応ブラウザのためのものです。2行目はnomoduleですので非対応ブラウザのためのスクリプトを読み込みます。まぁ、こうやって対応ブラウザをみると2行目はもう必要ない気もしますが、公式ドキュメントに残っているので案内しておきます。

https://caniuse.com/es6-module

そして、3行目はIonicデフォルトのスタイルシートを読み込みます。これには以下のすべてが含まれています。

https://ionicframework.jp/docs/layout/global-stylesheets/

用意するのはこれだけ。簡単ですね。


# おわりに

この設定だけで、以下のすべてのコンポーネントを利用することができるようになります。しかもUIコンポーネントはLazy Loadingなので、少ないコストで！！

https://ionicframework.jp/docs/components/

本稿では「一部にIonicコンポーネントを使う」としましたので、これだけだとQwikのRouterをハックしたプッシュ遷移などはできませんが、それでもIonicのコンポーネントのすばらしさと使いやすさを体験してもらえると思います。

ぜひQwikプロジェクトのUIコンポーネントのひとつにIonicを候補として検討してもらえればと思います。

それではまた！
Jetpack ComposeのPaddingValues同士を加算する

`LazyColumn` / `LazyRow` の引数で登場する `contentPadding: PaddingValues` で複数の `PaddingValues` を加算したい時のコード例です。


### 実装

```kotlin
Scaffold(
    topBar = {
        TopAppBar()
    }
) {　contentPadding ->
    val layoutDirection = LocalLayoutDirection.current
    LazyColumn(
        contentPadding = PaddingValues(
            top = 16.dp + contentPadding.calculateTopPadding(),
            start = contentPadding.calculateStartPadding(layoutDirection),
            end = contentPadding.calculateEndPadding(layoutDirection),
            bottom = 16.dp + contentPadding.calculateBottomPadding(),
        ),
    ) {
        ...
    }
}

```

`PaddingValues#calculateXXXPadding()` で持っている padding を取得できるので、加算したい値をプラスして `PaddingValues` に新たに渡すことで加算しています。

### 汎用的にするなら

```kotlin
@Composable
operator fun PaddingValues.plus(other: PaddingValues): PaddingValues {
    val layoutDirection = LocalLayoutDirection.current
    return PaddingValues(
        top = calculateTopPadding() + other.calculateTopPadding(),
        start = calculateStartPadding(layoutDirection) + other.calculateStartPadding(layoutDirection),
        end = calculateEndPadding(layoutDirection) + other.calculateEndPadding(layoutDirection),
        bottom = calculateBottomPadding() + other.calculateBottomPadding(),
    )
}
```

このような拡張関数を用意しておくと次のように実装することができます。


```kotlin
Scaffold(
    topBar = {
        TopAppBar()
    }
) { contentPadding ->
    LazyColumn(
        contentPadding = contentPadding + PaddingValues(vertical = 16.dp) 
    ) {
        ...
    }
}

```
AWS BatchのジョブIDからログを特定し印字するpythonスクリプト

AWS Batchのログをコマンドラインから見たかったので、AWS BatchのAPIを叩いてCloud Watchのグループ名とストリーム名を特定し、標準出力に印字するスクリプト作りました

```python
"""
AWS BatchのジョブIDからログを特定し印字するpythonスクリプト
"""
import datetime
import sys

import boto3
import click


@click.command()
@click.option("--job_id", "-j", help="Job ID of AWS Batch", required=True)
def main(job_id: str) -> None:
    client = boto3.client("batch")
    response = client.describe_jobs(jobs=[job_id])
    if len(response["jobs"]) == 0:
        print("Jobs not found")
        sys.exit(1)
    log_stream_name = response["jobs"][0]["container"]["logStreamName"]
    log_group_name = response["jobs"][0]["container"]["logConfiguration"]["options"]["awslogs-group"]
    print(f"log_group_name = {log_group_name}")
    print(f"log_stream_name = {log_stream_name}")
    print("-------------------------------------------------")
    client = boto3.client("logs")
    next_token = None
    while True:
        args = {"logGroupName": log_group_name, "logStreamName": log_stream_name, "startFromHead": True}
        if next_token is not None:
            args["nextToken"] = next_token
        log_events = client.get_log_events(**args)
        events = log_events["events"]
        if len(events) == 0:
            break  # 書き込むログがなくなったのでwhileループを抜ける
        for log_line in events:
            dt = datetime.datetime.fromtimestamp(log_line["timestamp"] / 1000)
            message = log_line["message"]
            print(f"[{dt.isoformat()}] {message}")
        next_token = log_events["nextForwardToken"]
    print("-------------------------------------------------")


if __name__ == "__main__":
    main()
```

実行例
```
$ python print_awsbatch_log.py -j 9ffbad12-b57b-4ae2-81ad-c17045fa9f10

log_group_name = /aws/batch/my_log_group
log_stream_name = my_job_def/default/e79f3ac231ff4042840e3a5d93c4a357
-------------------------------------------------
[2022-12-19T17:07:59.908000] ログの１行目
[2022-12-19T17:08:00.050000] ログの２行目
[2022-12-19T17:08:00.054000] ログの３行目
-------------------------------------------------
```
ユーザーデータの格納場所を作ろう！

こんにちは！

今日はVantageにユーザーデータを格納する領域を作成します。
[データベース？ユーザー？](https://qiita.com/ykswi/items/475c35ccfbc265536dc7)の記事で書いたとおりユーザーとして領域を定義していきます。

# まず最初に親ユーザーを作成する
それではデータベース環境の構築を行いましょう。これもデータベース？ユーザー？で触れましたが、Vantageのデータベース/ユーザーは階層構造をとります。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/2b6aba89-be48-445b-036a-cc63bcd3cca0.png)

そこでまず皆さんがユーザーデータを格納する親ユーザーを作成します。図でいうSYSDBAです。このSYSDBAの中に皆さんが実際にログインするためのユーザーやデータテーブルなどを格納するユーザー（やデータベース）を作成していきます。

ユーザーを作成するSQLで最低限必要なのは、

```SQL:Create_User.sql
Create User [ユーザー名] as Perm=[データベースサイズ], Password=[パスワード];
```
括弧がきの部分はそれぞれ実際の値に書き換えてご使用ください。

今回は親ユーザーの作成ですので[ユーザー名]は「SYSDBA」としてください。
パスワードはご自身のポリシーに倣ってどうぞ。

Permをいくつにするかについて説明します。
Vantageはシステムカタログ情報（Vantageではディクショナリと呼びます）やログを保存する領域、さらにクエリーを実行するために一時的に作成するスプールのための領域を確保しておくことが必要となります。そのため用意された領域すべてをユーザーデータの格納に使えるわけではありません。
あくまでざっくりとですが以下のクエリーで照会することができるデータベースの全体サイズの概ね50％程度の数値を入力してください。

```SQL:Select_MaxPerm.sql
select sum(maxperm) from dbc.diskspace;
```

# 実際にデータを格納するユーザーを作成する
それでは実際にデータ格納に使用するユーザーを作成しましょう。今、SYSDBAを作成したばかりですのであなたはdbcユーザーでVantageにログインしているはずです。ですので今度は以下のSQLを使用してみてください。

```SQL:Create_User_From.sql
Create User [ユーザー名] From SYSDBA as Perm=[データベースサイズ], Password=[パスワード];
```

さきほどは書かなかったFrom句を追加しました。このFrom句がない場合のデフォルトはSQLを実行したユーザーとなります。したがってFrom句がない場合SQLを実行したユーザーの子ユーザーが作成されます。SQLを実行するユーザーがその他のユーザーの子ユーザーを作成する場合にこのFrom句を指定します。
領域はSYSDBAから分け与えられることになりますから、データベースサイズはSYSDBAのサイズ以下ということになります。

これでデータを格納する領域が完成しました。
次回の記事ではデータを格納するテーブルの作成について紹介します。

# より詳しく情報はこちら
[Teradata Vantage™ - SQLデータ定義言語 構文規則および例 CREATE USER](https://docs.teradata.com/r/1I0dmX0LSNZgNE0umobdwQ/eq~TvqbLYJpBa2uCCqItRQ)

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
エラー処理についてすごく簡単にまとめてみた#2

## はじめに
エラー処理について３にパターン分けて記事を投稿する。

①Optional型 >>>>> 成功時は値を返し、失敗時はnilを返す
②Result型 >>>>> 成功時は値を返し、失敗時はエラーの値（詳細）を返す
③do-catch文によるエラー処理

今回は②について記載する。

下記URLの続編である。
https://qiita.com/RammaruIshii/items/6c6015daa7583384695d

## 詳細
- Result<success, failer>型のエラー処理
    - 成功時は値を返し、失敗時はエラーの値（詳細）を返す
    - failureを表すときは対象の構造体などにErrorプロトコルを準拠させるルールがある。（Results型のfailureにwhereでErrorプロトコルを準拠するよう指示されている、気が向いたときにでも見てみてください）

```swift:Swift
//IDが登録（データが見つからない）されていない時はエラー処理（エラー詳細あり）をする

//今回のfailer時にお世話になるerror列挙体さん
enum DatabaseError: Error {
    //データが見つからないエラー
    case entryNotFound
    //重複したデータによるエラー
    case duplicatedEntry
    //不正データによるエラー
    case invalidEntry(reason: String)
}

//Resultのsuccess時に返す構造体
struct User {
    let id: Int
    let name: String
    let email: String
}

//戻り値でResult<success, failer>型のエラー処理をしているため、失敗時、retrunで .failureを返している
func findUser(byID id: Int) -> Result<User, DatabaseError> {
    let users = [
    User(id: 1, name: "山本太郎", email: "yamamoto@dmail.com"),
    User(id: 2, name: "青木小太郎", email: "aoki@gmail.com")
    ]

    for user in users {
        if user.id == id {
            return.success(user)
        }
    }

    return .failure(.entryNotFound)
}

//該当しないidをぶち込んでみる
let id = 0
let results = findUser(byID: id)

//switch文使って、これら全てのエラー(Result型のfailureですね)に対して網羅的にエラー時の動作を実装している
switch results {
    //ここの.successはUser型である。また、Result型のsuccessは型引数の連想型なので、ここのuserは自分で決めれる引数名
case let .success(user):
    print(".success\(user)")
    //ここの.failureはDatabaseError型である。また、Result型のfailureは型引数の連想型なので、ここのerrorも自分で決めれる引数名
case let .failure(error):
    switch error {
    case .entryNotFound:
        print(".failure: .entryNotFound")
    case .duplicatedEntry:
        print(".failure: .duplicatedEntry")
    case .invalidEntry(reson: let reason):
        print(".failure: .invalidEntry(\(reason)")
    }
}
//出力
//失敗の場合 .failure: .entryNotFound

//ただし成功時の場合（idを1にするなど）は下記が出力される
//.successUser(id: 1, name: "山本太郎", email: "yamamoto@dmail.com")
```

## おわりに
修正箇所等あればご指摘ください。

## 参考記事
[[増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ)　](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88-Swift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AA%E6%96%87%E6%B3%95%E3%81%A8%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E5%85%BC%E3%81%AD%E5%82%99%E3%81%88%E3%81%9F%E8%A8%80%E8%AA%9E-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4297112132)
↑引用元
石川 洋資 (著), 西山 勇世 (著)
発行者：片岡 巌
出版社：技術評論社
印刷/製本：日経印刷株式会社

## 開発環境
- Xcode-13.4.1
- Swift version 5.7
VisualStudioでビルドイベント（ビルド前 or 後にフォルダー削除やファイル移動など）

# 概要

作成中のexeには同フォルダーにファイルやフォルダーを作成する機能がある。

VisualSutudioでデバッグ実行すると、ビルド先のフォルダー内にファイルやフォルダーが出来上がる。
出来上がったものは次回デバッグ時に邪魔になる。

なので、ビルド時に特定名のフォルダーやファイルを自動削除したい。

また、dllファイルをbinフォルダーにまとめたりとか、そういうのもビルド時に自動でやってほしい。

そんな時。

# 設定の場所

プロジェクト右クリック ⇒ プロパティ 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6ee206c7-2318-caa3-c54c-d1881419d22c.png)

ビルドイベントで設定可。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/51cf1961-e4f1-7c68-a022-d6dcce28bf8d.png)
 ↑ ここに後述の設定を書いておくとビルド時に自動実行してくれる。

# フォルダー作成

```:ビルド先に『bin』という名前のフォルダーを作成する設定例
mkdir $(TargetDir)bin
```

```$(TargetDir)``` がビルド先フォルダーパス。末尾に『\』が付く。

# フォルダー削除

```:ビルド先から『log』という名前のフォルダーを削除する設定例
rd /s /q $(TargetDir)log
```

```rd``` がフォルダー削除。
```/s``` がサブフォルダーも含めるという意味。
```/q``` が確認メッセージ無しという意味。

# ファイル削除

```:ビルド先から『tester.xml』という名前のファイルを削除する設定例
del $(TargetDir)tester.xml
```

 ↓ ファイル削除はワイルドカード使える。

```:ビルド先から『xml』拡張子のファイルを削除する設定例
del $(TargetDir)*.xml
```

# ファイル移動

```:ビルド先にある『MailKit.dll』という名前のファイルを移動する設定例
move $(TargetDir)MailKit.dll $(TargetDir)bin\
```

```move 移動対象ファイルパス 移動先フォルダーパス```

移動先フォルダーパスの末尾に『\』を付けなくてもOK。

 ↓ ファイル移動はワイルドカード使える。

```:ビルド先にある『dll』拡張子のファイルを移動する設定例
move $(TargetDir)*.dll $(TargetDir)bin\
```

# ビルドイベントの設定にコメント

調べた限りだとできなさそう。

# 参考サイトさん

https://note.dokeep.jp/post/csharp-post-build-event-delete/

https://learn.microsoft.com/ja-jp/visualstudio/ide/reference/pre-build-event-post-build-event-command-line-dialog-box?view=vs-2022

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2364
Microsoft Visual Studio Community 2022 Version 17.4.2
VisualStudio.17.Release/17.4.2+33122.133
Microsoft .NET Framework Version 4.8.04084
【備忘録】Golangで半角全角の変換を実施する。

### 対応
表題通り、Golangで半角全角の変換を実施する記事です。カタカナは半角→全角、英数字は全角→半角に変換。

```go:main.go
package main

import (
	"fmt"

	"golang.org/x/text/width"
)
func main(){
	targetString := "ＡＢＣ１２３ｱｲｳABC123アイウ"
	fmt.Println("変換前", targetString)
	fmt.Println("変換後", width.Fold.String(targetString))
}
```

```go:実行結果
~/go/src/jikken$ go run main.go
変換前 ＡＢＣ１２３ｱｲｳABC123アイウ
変換後 ABC123アイウABC123アイウ
```
RubyonRailsチュートリアル：実践メモ【第三章】

<br>
<b>Ruby on Rails チュートリアル</b>(Webサービス開発が学べる学習サービス)に従って、MVCフレームワークアプリケーションを作成していく。<br><br>

**使用ツール** ：
AWS Cloud９
## コントローラの新規作成
コントローラの新規作成には、generateスクリプトを使用する。
```
$ rails generate controller ControllerName アクション名（省略可）
```
※rails generateはrails gという短縮形でもOK

Railsのアクションは、コントローラの中に配置する。

rails generate実行時にキャメルケースで記述を行うと、ファイルのコントローラ名がスネークケースで自動生成で登録される。
↓↓↓
**StaticPages** → **static_pages_controller.rb**

Rubynにはクラス名にキャメルケースを使う慣習と、ファイル名をスネークケースで記述する慣習がある。



<br>
<br>

参照：RubyonRailsチュートリアル
EMの役割は鼻

はじめまして、HRBrainの川田と申します。

先日2回目の新型コロナ感染を経験してしまいました。

前回は呼吸器系が少しやられ、今回は咳がとにかく大変でした。

熱もまあまあ出ましたが、仕事ができないかつ妻子とも完全に隔離生活をしたため、一人で考える時間ができて逆に思考がクリアになるといいますか、サウナに入っているときの感覚でその点は良かったです。

さてそんな新型コロナ生活ですが、一点辛いポイントがありました。

それは匂いがしないということです。

数日間嗅覚が機能しなくなるというのは今回が初めてで、この経験が自身の仕事に通じる部分があると感じたので、今回はそれを書きます。鼻ポエムです。

![body_hana.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67253/f7440f84-9184-3758-5ee4-e2c54ff034d7.png)

# 匂いがしなくなって、行動が変わった
私は嗅覚が重要なタイプでして、焼酎、お香、沈丁花、楽器、雨の降り始めのアスファルト、ガソリンなどなどの匂いが最高に好きです。

そんな私ですが、今回新型コロナに感染して鼻の粘膜がやられてしまい、匂いが分からなくなってしまいました。

その結果、どう行動が変わったかというと、食べ物に全くこだわらなくなってしまいました。

普段は全く食べないし好きでもないカップ麺を、けっこうな頻度で食べるようになってしまいました。

# なぜ？

元々食べるのが好きで、少しでも美味しいものを食べるためには労力を惜しまないタイプでした。

出汁、トリュフオイル、ホールの山椒などなど、ちょっとめんどくさいこだわりおじさん的なやつは一通り通ってきました。でもそれもこれも、良い匂いを得るためだったということが分かりました。

匂いが分からなくなった結果、お腹が膨れればなんでも良いのでカップ麺でも良いと思うようになりました。安いし。

# 健康に良くないことは分かっているけど

最近はお年頃もあり、健康にはまあまあ気を遣っています。運動したり、できるだけ野菜を食べてみたり、お酒を減らそうと念じてみたり。

しかし、匂いがしなくなったことでそういうことは全くどこかに行ってしまい、カップ麺を食べてしまいました。

長期的なメリットよりも、安くて手軽でお腹が満たせるという短期的なメリットに軍配が上がったということになります。

この自分の行動を俯瞰して考えた結果、ある気付きが得られました。

# 時間がかかるフィードバックと即時性のあるフィードバック
今回の出来事を抽象化すると、**時間がかかるフィードバックよりも、即時性のあるフィードバックの方が行動を変えやすい**と捉えることができます。

健康が重要なことは誰でも知っています。適度な運動をし、野菜を中心に摂取し、お酒を控えることが大事。だけど、これらを頑張ったとしても良いフィードバックが得られるまでに時間がかかります。

良い匂いそれ自体は栄養面で健康に良い影響をもたらしません。気分が良くなるのでメンタル面での効果はありそうですが、栄養が摂れるわけではありません。一方、フィードバックはすぐに得られます。

カップ麺を食べるという健康上好ましくない行動を取ったのは、後者の即時性のあるフィードバックが無くなった影響だと言えそうです。

# EMのお仕事
ここで突然EMの話をします。

エンジニアリングマネージャーの仕事は、開発組織の成果を最大化させることだと言われています。
以下の本でも同様のことが言及されています。

[マネジメント[エッセンシャル版] - 基本と原則](https://www.amazon.co.jp/dp/B0083ZDWPE/): *投入した資源の総和よりも大きなものを生み出す生産体を創造すること*

[HIGH OUTPUT MANAGEMENT(ハイアウトプット マネジメント) 人を育て、成果を最大にするマネジメント](https://www.amazon.co.jp/dp/4822255018/): *マネージャーのアウトプット = 自分の組織のアウトプット + 自分の影響力が及ぶ隣接諸組織のアウトプット*

成果を最大化させるには何かしらの変化が必要で、そのためには個々人の行動も変わることが必要不可欠です。

ではどのように行動変容を促すのか。ここで先程のフィードバックの話を重ね合わせてみます。

- 最終的には事業成果につながるが、得られるまでに時間がかかるフィードバック
    - 例: AよりもBの方が売上に良い影響がある->アポ取って商談して受注が決まるまで長い時間がかかる
- 事業成果とは直接の関係は薄いが、すぐに得られるフィードバック
    - 例: AよりもBの方がXさんが喜ぶ->アクション後すぐに喜ばれる

この2つは、どちらが人の行動を変えやすいでしょうか。

これまでは事業成果の最大化を意識して前者を重視してきました。最終的に価値があることをロジカルに理解してさえいれば、日々の行動は正しい方を選択できるはずです。

しかし今回の自身の体験から、考えを見直すことにしました。

最終的なゴールをロジカルに説明できることは当然重要ですが、それに加えて即時フィードバックもセットで実施するとより良さそうです。

ということで、EMは開発組織の鼻として良し悪しを香りに乗せて即座にメンバーに伝える役割といえるのではないでしょうか。

# さいごに
『行動分析学マネジメント』という本に「行動随伴性」として似たような話が書いてありました。

https://amzn.asia/d/hYeXHf8

良い行動にはポジティブなリアクションをし、良くない行動は無視するかネガティブなリアクションをすることで行動を減らすという内容です。

でもやっぱり漢字が多くて難しいので、鼻でいいんじゃないですかね。EMの役割は鼻です。

さて、HRBrainでは鼻を担う方を募集しています！

一緒に鼻道を極めていきませんか。

どことなくバスケっぽい雰囲気もしてきたところで、結びとさせていただきます。

ご清覧ありがとうございました。

おしまい。
複数のGithubアカウントを使用する際の設定

新規案件を始めるにあたり、1台のPCで複数のGithubアカウントを使い分ける必要があったので、その備忘録です。

:::note warn
Githubでは、1人が複数の無料アカウントを保持することは禁止されています。ご注意ください。
:::

# SSHキーを作成
`ssh-keygen -t rsa` コマンドを使用して、それぞれのGithubアカウントに登録するSSHキーを作成します。
コマンドの詳しい使い方はググるとして、次のようにSSHキーを作成します。
``` ls -l ~/.ssh
id_foo_rsa
id_foo_rsa.pub
id_bar_rsa
id_bar_rsa.pub
```
作成したキーをそれぞれGithubに登録しておきます。

# ~/.ssh/config の設定
`~/.ssh/config`を以下のように設定します。
``` ~/.ssh/config
Host foo.github.com
  HostName github.com
  IdentityFile ~/.ssh/id_foo_rsa
  User git

Host bar.github.com
  HostName github.com
  IdentityFile ~/.ssh/id_bar_rsa
  User git
```
設定後、以下のコマンドで接続確認します。
```
ssh -T git@foo.github.com
ssh -T git@bar.github.com
```

# .gitconfig の設定
`~/workspace/bar/**`　ディレクトリ配下のプロジェクトで　`bar.github.com` を使用するための設定をします。
まず `~/.gitconfig.bar` を作成して `bar.github.com` で使用する情報を記載します。
``` ~/.gitconfig.bar
[user]
    name = bar-name
    email = bar@example.com
```
次に　`~/.gitconfig`を次のように編集します。
``` ~/.gitconfig
[user]
    name = foo-name
    email = foo@example.com

[includeIf "gitdir:~/workspace/bar/**"]
    path = .gitconfig.bar
```
設定後、以下のコマンドで確認します。
```
git config --get user.name
```
`bar.github.com`　の方は、対象のディレクトリ配下で何かしらの操作を行った後、確認します。

# リモート接続時
リモートに接続する際には、次のようにします。

```
# 普通はこれでいいけど、今回はダメです。
git@github.com:<アカウント名>/<リポジトリ名>.git

# このようにする
git@foo.github.com:<アカウント名>/<リポジトリ名>.git
```

# 謝辞
勉強になりました。ありがとうございます。
https://zenn.dev/m10maeda/articles/how-to-use-multiple-git-accounts
https://zenn.dev/taichifukumoto/articles/how-to-use-multiple-github-accounts
【令和最新版】海外版スマートフォンアプリの実課金検証についてまとめてみた

# はじめに
世界のモバイルゲーム市場は右肩上がりに成長を続けており、スマートフォンアプリを海外向けに配信されているデベロッパーの方も増加傾向にあるかと思います。
弊社も海外展開は積極的に行っているのですが、その際の悩みの一つとして、海外版アプリの実課金検証があります。

今回は最近の各PFにおける国判定の実情をもとに、日本に住んでいるデベロッパーが海外でアプリを配信する際の実課金についての情報を共有したいと思います。
## この記事のターゲット
海外のAppストア、Playストアでスマートフォンアプリをリリースする際、実課金検証ってどうやればいいんだっけ？と思った方
# 海外版アプリの実課金
## 最適解
海外版アプリの実課金を行う際の最適解は、 __現地で課金を行う__ ことです。
現地にスタジオを持つ検証会社等に依頼をして、現地で対応をしてもらうのがベストです。
## 何らかの理由で現地で課金が行えない場合の対応手段
海外版のストアアカウントを所有していることが前提ですが、国内にいても海外版アプリに実課金が行える手段がいくつか存在しています。
なお、海外版ストアアカウントの作成方法やVPNの利用方法は[こちらの記事](https://qiita.com/masatoshi_nomoto/items/c1ee8142bf88688b1003)で詳しくまとめてくださっているので、よろしければご参照ください。

以下の表は、各決済手段を試した結果をまとめています。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320947/86c435ff-9e5b-fda1-7764-40d454e7f729.png">


### Appleで日本から海外版アプリへの実課金を行う方法
Appleについては、海外発行のクレジットカードか海外版のiTunesカードがあればシンプルな手順で実課金を行うことが可能です。

#### 必要なもの
・海外のAppleID
・海外版Apple Gift Card or 海外発行のクレジットカード

#### 手順
1. 海外のAppleIDを用意する
1. 海外の決済方法を用意する
    a. AppleIDの国設定と同じ国で発行したクレジットカードを紐づける
    b. AppleIDの国設定と同じ国のプリペイドカードを登録する
1. 決済を行う

### Googleで日本から海外版アプリへの実課金を行う方法
#### 必要なもの
・VPN
・海外で発行したクレジットカード or 海外版決済サービスアカウント
※海外のGoogle Playカードは使用できない場合があるのでここでは除外しています。（詳細は後述します）

#### 手順

1. 海外のGoogleIDを用意する
    ※GoogleアカウントはIPアドレス/決済手段から自動的に国が判別される
1. 海外の決済方法を用意する
    a. Googleアカウントの国設定と同じ国で発行したクレジットカードを紐づける
    b. paypal等の決済手段を紐づける
1. 決済を行う


# Googleにおける海外版アプリ実課金の際の注意事項
Googleでは国判定がシビアになっており、以下決済手段の場合は注意が必要です。
## 国内発行のクレジットカード
国内で発行したクレジットカードでも海外アカウントに紐づけることは可能ですが、決済時にエラーが発生する可能性があります。
Googleに問い合わせることでエラーが解消するケースもあるようですが、確実ではないため注意が必要です。
## 海外発行のプリペイドカード
通販サイト等で購入した海外のプリペイドカードは、他の国で使用するとアクティベートに失敗することがあります。
この場合問い合わせを行っても解消されないため、この方法は避けることを推奨します。
## その他決済サービス
国ごとに使用できる決済方法は以下ページに記載されています。
[Google Play でご利用いただけるお支払い方法](https://support.google.com/googleplay/answer/2651410?hl=ja&co=GENIE.CountryCode%3DJP)

各国のpaypalや、香港のAlipayHKは日本国内からも利用が可能です。
ただし、アカウント作成時に各国の電話番号によるSMS認証が必要なので注意してください。
（電話番号を取得できるwebサービスがあるが、IP電話の番号だとSMS認証を受け取れない場合がある）
米国や香港の電話番号を持っている場合はこの方法でのテスト課金が可能です。

# おわりに
今回は海外版アプリの課金について記載しました。
先述の通り、基本的には現地を利用することがベストではありつつ、国を跨ぐとリードタイムも大きいことが多いので、急遽国内から確認したいタイミングは今後もあるかなと思っています。
各PFの仕様（挙動？）は変更されることも多いため、また動きがあれば追記していきたいと思います。
Wordpress6.1.1でClassic EditorをOFFにしたのにブロックエディタが使えない

## 問題
＝＝＝＝＝＝＝＝＝＝＝＝＝
WordPress6.1.1
PHP7.3.28
テーマ　自作
＝＝＝＝＝＝＝＝＝＝＝＝＝
のローカルテスト環境で、プラグイン「Classic Editor」を無効化したにも関わらず、ブロックエディタ（Gutenberg）が有効化されず、HTMLコードで表示される問題が起きました。（画像参照）
![ブロックエディタ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004345/9c673860-4aae-3bea-090e-b0cd5f1b39f3.png)

特に`functions.php`等ではブロックエディタの使用を規制しておらず、規制するプラグインは「Classic Editor」だけでした。
プラグイン「Gutenberg」を入れても同じ状況で、問題の原因を見つけるまで、少々手間取りましたので、同じ状況になった方への一助になれば。

## 原因
画像を見ていただくのが早いかと思います。
![プロフィール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004345/002387b7-0dfd-f13d-58bc-50131b2e4c65.png)
「プロフィール」ページにある「ビジュアルエディターを使用しない」にチェックが入っていると、ブロックエディタが使えないことがわかりました。

## 解決
単純に「プロフィール」ページにある「ビジュアルエディターを使用しない」のチェックを外すことで、プラグイン「Gutenberg」を入れなくてもブロックエディタが使えるようになりました。
![ブロックエディタ出た.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004345/01213e62-08c4-2fef-f2fd-56f56dc940ce.png)

## まとめ
WordpressでWEBサイトを構築する際にはずっと何となくチェックを入れていた「ビジュアルエディターを使用しない」が、こんな所に影響するとは思っていませんでした。
新しいバージョンのWordpressが出た際には、「今まで通り」が通用しないと言う事を肝に銘じておかねばと思いました。
paiza.ioでelixir その154

# 概要
paiza.ioでelixirやってみた。
timer.tc使ってみた。

# 参考にしたページ

https://qiita.com/zacky1972/items/2cdc68f56c2b42b803e1


# サンプルコード

```

defmodule Prime do
  def prime_candidates() do
    Stream.unfold(2, fn
      2 -> 
        {2, 3}
      n -> 
        {n, n + 2}
    end)
  end
  def prime_enum(count) do
    prime_candidates()
    |> Stream.map(fn pr -> 
        {pr, Stream.take_while(prime_candidates(), & &1 < pr)} 
    end)
    |> Enum.take(count)
    |> Enum.map(fn {pr, prs} -> 
        {pr, Enum.filter(prs, & rem(pr, &1) == 0)} 
    end)
    |> Enum.filter(fn {_pr, divisors} -> 
        Enum.count(divisors) == 0 
    end)
    |> Enum.map(fn {pr, _} -> 
        pr 
    end)
  end
  def prime_stream(count) do
    prime_candidates()
    |> Stream.map(fn pr -> {pr, Stream.take_while(prime_candidates(), & &1 < pr)} end)
    |> Stream.take(count)
    |> Stream.map(fn {pr, prs} -> {pr, Stream.filter(prs, & rem(pr, &1) == 0)} end)
    |> Stream.filter(fn {_pr, divisors} -> Enum.count(divisors) == 0 end)
    |> Stream.map(fn {pr, _} -> pr end)
    |> Enum.to_list()
  end
end

IO.inspect :timer.tc(Prime, :prime_enum, [10])
IO.inspect :timer.tc(Prime, :prime_enum, [100])
IO.inspect :timer.tc(Prime, :prime_enum, [1000])
IO.inspect :timer.tc(Prime, :prime_stream, [10])
IO.inspect :timer.tc(Prime, :prime_stream, [100])
IO.inspect :timer.tc(Prime, :prime_stream, [1000])

```

# 実行結果

```
{4631, [2, 3, 5, 7, 11, 13, 17, 19]}
{1093,
 [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
  73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151,
  157, 163, 167, 173, 179, 181, 191, 193, 197, 199]}
{96705,
 [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
  73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151,
  157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, ...]}
{43, [2, 3, 5, 7, 11, 13, 17, 19]}
{945,
 [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
  73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151,
  157, 163, 167, 173, 179, 181, 191, 193, 197, 199]}
{68826,
 [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
  73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151,
  157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, ...]}
```

# 成果物

https://paiza.io/projects/bkYNAKdR7MibYP4Ypn4LMA


以上。
【FileMaker】「全レコード削除」更新版

この記事を書いている時点での FileMaker バージョンは、19.6.1ですが、以下の記事を書いたときは、日付からしておそらくバージョン13か14の2015年でした。

https://qiita.com/tyuma/items/8967703fc4c322eb98b7

今回は、この記事のバージョンアップになります。

# FileMakerでのレコード削除方法

ヘルプにもあるとおり、全レコードを表示してから対象レコードを削除するオーソドックスなやり方です。

https://help.claris.com/ja/pro-help/content/delete-all-records.html

2016年に発売されたバージョン15では、レコードの削除の方法として、新しく「テーブルデータを削除」が追加されました。

https://help.claris.com/ja/pro-help/content/truncate-table.html

最初は何がどう違うのかわからなかったのですが、次のように整理できます。

# 同じところ


## 互換性も同じ
FileMaker 製品のサポートは、どちらも同じ互換性になっています。
| 製品 | サポート |
|:-:|:-:|
| FileMaker Pro  | はい  |
| FileMaker Go  | はい  |
| FileMaker WebDirect  |  はい |
| FileMaker Server  | 一部  |
| FileMaker Cloud  | 一部  |
| FileMaker Data API  | 一部  |
| カスタム Web 公開  | 一部  |

引用： [Claris Pro および FileMaker Pro ヘルプ](https://help.claris.com/ja/pro-help/content/index.html#)

# 違うところ

## レコードを削除した場合は元に戻すことはできません
「テーブルデータを削除」は、削除したデータは元に戻せません。
これは、バージョン19.6.1で導入されたトランザクション復帰を行なっても、削除したデータは元に戻せません。
（ロールバックされません）
「対象レコード削除」は、トランザクション復帰で戻せます。

トランザクションでの「テーブルデータを削除」でデータが復帰されない例を以下で見てみます。
![スクリーンショット 2022-12-19 17.36.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/2115917a-4ff0-f2ac-2815-48241eb71300.png)


トランザクションでの「対象レコード削除」でデータが復帰する例を以下で見てみます。
![スクリーンショット 2022-12-19 17.32.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/54dcde20-ab67-8b5c-6c02-14b4a15ee554.png)



## 「テーブルデータを削除」の方が処理速度が速い
ということらしいです。
ただし、ヘルプによると「高速に処理できる場合がある」とありますので、絶対的に速いわけではないようです。

## 処理の違い
ヘルプを参考に、処理の違いを見ていきます。
汎用
◯：される、要
×：されない、不要

|  | 対象レコードを削除 | テーブルデータを削除 |
|:-:|:-:|:-:|
| 関連レコードを含んだ削除  | ◯ [^1] | ×  |
| [完全アクセス権]アクセス権セットが必要  |  × | ◯  |
| グローバルオブジェクトフィールドの内容削除  | × | ◯  |
| ODBCデータソースの削除  | ◯  | × [^2] |

[^1]: リレーションシップグラフのオプションで「他のレコードが削除された時、このテーブルの関連レコードを削除」にチェックされている場合
[^2]: ただしODBCデータソース先が FileMaker Pro ファイルであれば削除される

思った以上に違いがあると思います。
その他、されるされない、要不要については[Claris ジャパンのyoutube](https://www.youtube.com/@filemakerjapan/featured)やClaris Partnerさまのブログでもピックアップされていますので、検索してみてください。

関連レコードを含んだ削除については、思いもよらない関連データを削除してしまう可能性がありますので、「対象レコードを削除」を実装するときは、リレーションシップグラフの確認をしておいた方が無難です。
![スクリーンショット 2022-12-19 16.39.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/380dee4c-8b18-ebda-216e-50276f922e31.png)



# その他の削除
[FileMaker OData](https://help.claris.com/ja/odata-guide/content/index.html) の[テーブルの削除](https://help.claris.com/ja/odata-guide/content/delete-table.html)も全データ削除を実行する方法になります。
こちらも「テーブルデータを削除」と同様、１コマンドでテーブルのデータが跡形もなく（グローバルオブジェクトフィールドの内容も）消し去ってしまいますので、慎重な実装が必要です。

# 使い分け
「対象レコードを削除」「テーブルデータを削除」を見ていくと、どう使い分けをすればいいのかというところが気になると思います。
開発会社やプロジェクトによってルールはあると思いますが、私は次のように使い分けています。

## 対象レコードを削除
・一般的に絞り込んでデータを削除したいとき
・完全アクセス権ではなくカスタマイズしたアクセス権セットでの実行を考慮したいとき
・不用意に対象でないデータの削除を防ぎたいとき

## テーブルデータを削除
・テンポラリ的な扱いをしているテーブルの初期化（ex.インポートデータをワンクッション置いて処理したデータを目的のテーブルにデータコピーしたい時など）
・完全アクセス権で運用時のメンテナンススクリプトを書いていて明らかにテーブルデータの一括削除をしたいとき
・大量のデータを削除したいとき

などです。
みなさんは、どのように使い分けてますか？

違いを理解して思わぬ落とし穴にハマらないようにしたいですね。（自戒）
QGIS で PLATEAUのLOD2 建物を（ともかく）表示する



**PLATEAU の LOD2 を QGIS で表示させたい**，というリクエストがあった．
追加履歴：Macでできないのかと追加リクエストがあったので試してみました．GDALのバージョンと投影座標系が大事みたいだ．

**filegeodatabase (FGDB) 形式をQGISに放り込む**と，——正直，元も子もないし，先のことはともかくだが——表示できる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569582/a738c0d4-6b0f-42dd-541d-d55ba9ce9e2a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569582/33f0afb4-e273-679f-02bd-e7d54a61d6d9.png)


# 1. **データのDL**
PLATEAU の FGDB 形式データのDLサイトは下記の2つがある．どちらでもよいのでDLする．ファイルサイズが大きいので要注意．
- G空間情報センター：https://www.geospatial.jp/ckan/organization/toshi
    - 東京都23区のPLATEAUのデータは [このページ](
https://www.geospatial.jp/ckan/dataset/plateau-tokyo23ku) にCityGML，FBX，OBJ，3D Tiles形式がまとめられているのだが，なぜかFGDB形式は [別ページ](https://www.geospatial.jp/ckan/dataset/plateau-tokyo23ku-fgdb-2020) にある．（なぜだろう？）
- ESRIジャパン：https://3d-city-model.esrij.com/


# 2. **データの表示**

データをDLして解凍してできる，「***.gdbフォルダ」を QGISのレイヤパネルにドラッグ&ドロップする．gdbフォルダには建物や道路などいろいろなレイヤが格納されているので，表示させたいレイヤ（LOD2_building）を選択する．座標系の注意ポップアップがでたら，m 単位の投影座標系を指定する．東京都23区であれば，例えば，日本測地系2011（JGD2011）平面直角座標系IX系（EPSG:6677）にする．

Qgis2threejs プラグインを利用すると，2Dと3Dをインタラクティブに表示できる．

---
*Notes*:
- QGISのバージョン：3.18.3-Zürich
- Qgis2threejsのバージョン: 2.6
Salesforce のタスクをExcel で一括更新してみよう！

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954391/847e9c36-c3d6-508c-d1b3-2d5153fa3050.jpeg)



こんにちは。CData Software Japan カスタマーサクセスの小野です。
今年もあっという間に年の瀬ですね。仙台では、雪が降り始めてきています。 

今回は、Salesforce のタスク名をきれいにそろえる管理方法について、弊社のExcel Add-Inを使って紹介していきます。
この記事は、CData Software Advent Calendar 2022 19日目です。

### Excel Add-Ins とは
多くの学校・企業で使われているMicrosoft Excel からSaaS やクラウドDB データの一括編集、一括挿入、データクレンジング、さらにExcel でのデータ分析やグラフ化ができる製品がExcel Add-Insです。

### Excel Add-In for Salesforce
まずは、Excel Add-In for Salesforce をこちらからダウンロードします。
https://www.cdata.com/jp/drivers/salesforce/download/excel/


### STEP1 : Salesforce をExcel に接続する
Excel Add-In for Salesforce をインストールしたら、いつも使っているMicrosoft Excel を開いてください。下記のように、[CData] リボンが追加されていることを確認したら、[データの取得] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954391/6fdd4240-76de-b761-9363-21944e4440b0.png)
データの取得から、[Salesforce] を選び、Login URLなどの情報を入れていきましょう。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954391/60a1d96d-d305-77e2-12dc-749374b44ea1.png)
[接続テスト（T）]を押すと、OAuth 認証が成功したとブラウザ上に出てきます。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954391/f3d8cfbb-c051-b79c-8de5-ede4eb6d054b.png)
「サーバーに接続できました。」と出てきたら、[OK] →[OK]を押します。 これで、Salesforce への接続は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954391/f0aae56d-0f8d-41a2-5f59-084cf6c02f41.png)

### STEP 2: Salesforce のデータを取得する

次に、テーブル/ ビュー(T)の選択をクリックします。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954391/0e5e7404-f43c-3199-c6a5-08530c4b5057.png)
今回は、タスク名を変更したいので、Task と検索をかけて、[CData Salesforce Task (テーブル)]を選びます。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954391/326ae678-564f-c618-2cf6-e5a301511036.png)
そのままOKボタンを押します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954391/59ad3b1a-fd55-a1b3-fe20-71b2843cdcf3.png)
これで、Salesforce のタスクリストに入っていたタスクを取得できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954391/3492bc5d-96bc-3ee5-3b57-b94577bb0f0e.png)

### STEP 3: Excel でタスク名を一括更新する
タスク名を編集すると、編集した箇所が赤字に変わります。今回はほとんどのタスク名を変更するので、真っ赤になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954391/ee9f9ee2-77a3-62e3-023c-903b789ef050.png)
タスク名を変更したら、[行の更新] を選択します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954391/0d9dde42-b8ee-2f23-efbb-7aad6646f531.png)

 Salesforce をみにいってみると、人によって、タスクの登録名がばらばらでしたが・・・ 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954391/31511c0e-820e-a69f-cc7b-6991b75c5a3b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954391/f0613bea-0607-381d-1f21-8ec5288348cc.png)
タスク名がきれいになっていました。

### さいごに

Excel Add-In for Salesforce（https://www.cdata.com/jp/drivers/salesforce/excel/） を使って、Salesforce のタスク登録名を、時間をかけずに一括更新することができました。

Excel Add-In for Salesforce は、30日間の無償トライアル（https://www.cdata.com/jp/drivers/salesforce/download/excel/） をご利用いただけます。

Salesforce のデータをExcel で編集・更新・データクレンジングしたい方は是非お試しください！
Watson Discovery APIを使ってペア分析の結果を取得する方法

# はじめに
Watson DiscoveryのContent Miner機能を使って分析をする際によく利用する手法として、ペア分析というものが存在します。
https://cloud.ibm.com/docs/discovery-data?topic=discovery-data-cm-analyze-data#cm-facets-compare


Content Miner機能はざっくり言うとGUI上でテキスト分析や自然言語処理ができる機能になりますが、今回はそこで得られるペア分析の結果をAPIで取得する方法について調査しましたので、自身のメモがてらこちらの記事を投稿致します。

# 実施方法
早速ですが、実施方法を以下に記載致します。今回はPythonを用いた場合の方法をご紹介します。
＊<>内はご自身で使用する値を指定する箇所になります。

~~~Python
response = discovery.query(
  project_id='<プロジェクトID>',
  collection_ids=['<コレクションID>'],
  natural_language_query='<検索文>',
  aggregation='pair(first:term(<第一ファセットID>), second:term(<第二ファセットID>))' # ここでペア分析に使用する2つのファセットを指定
).get_result()

print(json.dumps(response, indent=2, ensure_ascii=False))

~~~

# 参考情報
上記APIの基本的な記述形式は公式のマニュアルにも記載があります。以下にリンクを記載します。
https://cloud.ibm.com/apidocs/discovery-data?code=python#query

また、こちらは別の方の記事になりますが、Watson Discovery APIを用いて様々な形式で結果を取得する例が記載されている記事が参考になりましたので、併せて記載します。
https://qiita.com/har0yama/items/fbae8a275fe6d257434d

# お断り
このサイトの掲載内容は私自身の見解であり、必ずしも所属会社の立場、戦略、意見を代表するものではありません。 記事は執筆時点の情報を元に書いているため、必ずしも最新情報であるとはかぎりません。 記事の内容の正確性には責任を負いません。自己責任で実行してください。
pyenvとpipenvを使用したPythonの環境構築の方法

## 概要
・pyenvを使用して任意のpythonのバージョンをインストールする方法について
・pipenvを使用して仮想環境の環境の作成と基本操作について

## pyenvの設定
①pyenvで使用したいpythonのバージョンをインストールする
```
# install 可能なpythonのバージョンを一覧で表示
% pyenv install -l

# 指定したバージョンのPythonをインストール
% pyenv isntall x.x.x
```

②使用するPythonのバージョンを設定する

```
# 現在インストールされているPythonのバージョンを確認
# *がついているバージョンが現在設定されているPythonのバージョン
% pyenv versions
=>
* system (set by /Users/xxxxx/.pyenv/version)
  3.9.16

# Pythonの設定を行う(local)
% pyenv local x.x.x

# 再度確認するとversionが変更されていることが確認できる
% pyenv versions
=>
  system
* 3.9.16 (set by /Users/xxxxx/.pyenv/version)
```

※pyenvのpathを通しておかないと使用するpythonのバージョンが切り合わらないため事前に下記のコードを.zshrcに記述する
```
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
```

## pipenvの設定
①仮想環境を構築したいディレクトリを作成する
```
#ディレクトリを作成して移動する
% mkdir test-project && cd test-project
```

②仮想環境を作成する
```
#指定したPythonのバージョンで仮想環境を作成する(pyenvがinstallされていれば指定したpythonのバージョンが環境になかったとしても自動でインストールしてくれる)
% pipenv --python x.x.x

※この時にPipfileが同時に生成される
```

③必要なライブラリをインストール
```
#バージョンの指定をしないと最新のバージョンがインストールされる
% pipenv isntall [package-name]==x.x.x

※この時にPipfile.lockがなければ生成される
```

③仮想環境のアクティブ化と非アクティブ化
```
#仮想環境をアクティブ化する
% pipenv shell

#仮想環境を非アクティブ化する
# exit
```

※仮想環境をアクティブ化せずに仮想環境でコマンドを実行する方法
```
% pipenv run [command]
```

## その他コマンドメモ
```
#仮想環境のパスを確認
% pipenv --venv

#仮想環境を削除
% pipenv --rm

#Pipfileを元に仮装環境を再現する(このときにインストールされた内容でPipfile.lockが更新される)
$ pipenv install

#Pipfile.lockを元に仮装環境を再現する
$ pipenv sync
```

## 参考記事
https://zenn.dev/kenghaya/articles/9f07914156fab5

https://qiita.com/y-tsutsu/items/54c10e0b2c6b565c887a
pyenvからasdfにスムーズに切り替えたいあなたに【チートシート】

この記事は [Python Advent Calendar 2022 - 19日目](https://qiita.com/advent-calendar/2022/python) の記事となります。

## TL;DR
asdfは便利なので使ってください。以下に対応コマンド集として、まとめるので困ったら見てください。

## asdf便利ですね

linuxやmacでのpython環境構築といえば、はるか数億年前から議論されている結論が出ない問題で、pyenvを始めとしてvenv, pipenv, anacondaなど色々あって何が一番いいんだとなるPythonistaをよく見るので、この記事をきっかけに使ってみようと思った人が困らない程度のメモ書きを残せればというのが本稿の目的です。

anyenvみたいにそれぞれを毎回インストールするよりもasdfにまとまるのはとても便利なのと、コマンドが`asdf`なのでタイピングするのもなんか気持ちいい。

## チートシート
asdfはpythonだけではなく様々な言語に対応しているため、言語をインストールする前に対応プラグインを追加する必要があります。

||pyenv|asdf|
|---|---|---|
|python対応プラグインのインストール||`asdf plugin add python`|
|自身のバージョン確認|`pyenv -V`|`asdf version`|
|ヘルプ確認|`pyenv --help`|`asdf help`|
|pythonのバージョン確認(local)|`pyenv version`|`asdf current python` (参照先が `$PWD/.tool-versions` になっている)|
|pythonのバージョン確認(global)|`pyenv versions`|`asdf current python`  (参照先が `$HOME/.tool-versions` になっている)|
|インストール可能なpythonバージョン|`pyenv install --list`|`asdf list all python`|
|pythonの(アン)インストール|`pyenv (un)install VERSION_NAME`|`asdf (un)install python VERSION_NAME`|
|pythonバージョンの切り替え|`pyenv (local/global) VERSION_NAME`|`asdf (local/global) python VERSION_NAME`|
|shimの再構築|`pyenv rehash`| `asdf reshim` |

## まとめ
だいぶ便利ですね。pipenvと併用すればライブラリ管理もできるみたいですので、興味ある方はお試しを。
ONLYOFFICEと統合されたNextcloudをDockerでインストールする方法

[Nextcloud](https://nextcloud.com/)は、無料のオープンソースファイルホスティングソリューションで、ownCloudプロジェクトのフォークであり、ユーザー自身が管理しコントロールするクラウドストレージサービスを実行する能力を提供します。[ONLYOFFICE Document Server](https://www.onlyoffice.com/download.aspx)と統合されたNextcloudは、ドキュメントを保存、共有するだけでなく、テキスト文書、スプレッドシート、スライド、フォームの閲覧、作成、編集、コラボレーションを可能にしています。

Nextcloudを初めて使う場合は、提供されているDockerスクリプトを使って、ONLYOFFICEと統合したものを一度にインストールすることができます。

## 必要条件

Dockerコンテナを利用してNextcloudに接続したONLYOFFICE Document Serverの設定済みバージョンをインストールするためには、以下のものが必要です。

* **Dockerの最新版**。Dockerの最新版。[Docker公式サイト](https://docs.docker.com/engine/installation/)のガイドに従ってダウンロードしてください。
* **Docker Compose**。こちらも[公式サイト](https://docs.docker.com/compose/install/)からダウンロードできます。

### ステップ1. インストール

インストール作業を開始する前に、お使いのマシンが以下の要件を満たしていることを確認してください。

* CPU：デュアルコア2GHz以上
* RAM：2GB以上
* HDD：40GB以上の空き容量
* スワップ：2GB以上

 `docker-onlyoffice-owncloud`の最新版リポジトリを取得します。以下のコマンドを使用します。

リポジトリをダウンロードします。

```
git clone --recursive https://github.com/ONLYOFFICE/docker-onlyoffice-owncloud
```

必要なフォルダに移動します。

```
cd docker-onlyoffice-owncloud
```

アップデート用に設定します。

```
git submodule update --remote
```

### ステップ2．docker-compose.ymlファイルを編集する

`docker-onlyoffice-owncloud`リポジトリはNextcloudとownCloudの両方の設定を組み合わせており、デフォルトでownCloudが選択されているため、docker-compose.ymlファイルを編集します。

指定したファイルをnanoテキストエディタなどで開きます。

```
nano docker-compose.yml
```

`image: owncloud:fpm`の行を探し、**owncloud** の代わりに **nextcloud** と入力します。このように行を変更する必要があります。

```
image: nextcloud:fpm.
```

### ステップ3．Docker Composeを実行する
```
docker-compose up -d
```
自動的にインストールが行われます。すべてのコンテナがインストールされるまで、しばらく待ちます。

### ステップ4. NextcloudのWebアプリケーションを設定する

ブラウザを起動し、Webサーバーのアドレスを入力します。NextcloudウィザードのWebページが表示されます。ユーザー名とパスワードを入力して、管理者アカウントを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655664/c93d026d-c016-0c88-ab2c-49a9e05cd279.png)

### ステップ5. 設定を完了し、編集を開始する

ONLYOFFICE Document ServerでNextcloudにあるドキュメントを編集するオプションはまだありません。設定を完了するために、ダウンロードしたフォルダに戻り、`set_configuration.sh`スクリプトを実行します。

```
bash set_configuration.sh
```

Webページを更新してください。新しいONLYOFFICEで開くオプションは、ファイルメニューで利用可能になります。これで、ONLYOFFICEを使って、Nextcloud上で直接ドキュメントを編集したり、コラボレーションしたりできるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655664/65c667bd-9995-6ee0-4f8c-065fc894bc01.png)



### お役立ちリンク

* [ONLYOFFICE公式サイト](https://www.onlyoffice.com/)
* [ONLYOFFICE公式APIドキュメント](https://api.onlyoffice.com/editors/owncloud)
* [サポートフォーラム](http://dev.onlyoffice.org/)
* [GitHubのdocker-onlyoffice-owncloudレポジトリ](https://github.com/ONLYOFFICE/docker-onlyoffice-owncloud)
paiza.ioでelixir その153

# 概要
paiza.ioでelixirやってみた。
pure elixirな環境なので、自分的に足りないものが、２つある。
websocketとjsonパーサーだ。
構想編

# 方針

- node-redを使う。
- getでリクエストすると、結果をcsvで返す。
- backでnode-redが、jsonパースして、返す。
- node-redは、enebularでやるので、寿命３０分。


以上。
GNSSの状態を確認できるサイト

時刻同期が重要なサーバなどを運用していたり、時刻配信サーバ自体を運用していて時刻同期の問題が発生したときに、
 __GNSS自体の状態に問題__ がある可能性もあります

そんなときに確認すると便利なサイトを記載しています
いつもですが、 __失念してしまったときの参考__ にしてください（未来の自分）

例えば、2019年7月にEUの衛星測位システムであるGalileoのシステムが１週間全停止したことがあり、
その際にも衛星補足数などにへ影響した可能性があります

https://xtech.nikkei.com/atcl/nxt/news/18/05550/


# EUのガリレオ

ヨーロッパのGNSSであるガリレオの衛星ステータスを確認するサイトです



https://www.gsc-europa.eu/system-service-status/constellation-information


# 日本のみちびき
日本のGNSSであるみちびきの衛星ステータスを確認するサイトです

https://qzss.go.jp/technical/satellites/index.html

# ガリレオについての動画
https://japan.gnss.asia/european-gnss/galileo-programme/

>ほかにも見つかった都度追記したいと思います
Githubのアカウント切り替え方法決定版【windows Gitbash】

# 前語り

GitとかGithubってアカウント切り替えの方法よくわからんくないですか？？？
初心者の僕はいきなりつまずきました
でも安心してください僕がこの記事を出したので安心です

# httpsを使った管理は今すぐやめろ！！！

これ言ってくれてる人少ないです
ていうかいませんだから僕は数時間詰みました
SSL通信を使った管理方法に切り替えたら全て解決します
https通信はクソってことだけ覚えて帰ってください
SSL通信に切り替える方法は偉大な先駆者の記事を見るのを推奨します

# シェルコマンドを使ったアカウント切り替え自動化

#!/bin/sh
git config --global user.name "name"
git config --global user.email mail
git config --list

このコードを.shにコピペして書き換えてください
後は必要なときに.shをクリックするだけで切り替えられます

ちなみにwindows環境のgitbashだけで完結したいなら
https://zenn.dev/manhattan_code/articles/0317_engineer_community
この記事みたいに関数作って関数名をbashで入力したらコマンド実行みたいなのは無理です
windowsの仕組み的に絶対無理です。僕も2時間くらい調べたけど結論としては不可能という結論にいたりました

# 後語り

初めての投稿ということで記事の内容は雑ですが情報は約に立つと思います。
僕のような犠牲者を出さないためにこの記事は書きました
今後アップデートするかもです
CloudWatch Metrics 統計値で状態把握

ヘビーテイルで十分な量のデータポイントが生成されるメトリクスについて、どのようなデータ傾向になっているのかを把握したい。

例えば、これがなんらかのシステムの「レイテンシー」のメトリクスだったとして、[CloudWatch 統計定義](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Statistics-definitions.html)の内、次の値を眺めてみることで何が分かるだろうか。

* 最大値
  * Maximum
* 99パーセンタイル
  * 99th Percentile Score (p99)
* 平均値
  * Average
* 境界値99％トリム平均値
  * 99% Trimmed Mean (tm99)
* 最小値
  * Minimum

## 単品で

* `Maximum`
  * 最も時間のかかったケース、つまりレイテンシーという意味では「最悪」のケース
  * たまたま例外的に重かっただけでは？　この値に引き摺られて全体を評価してしまっていいのか？　という懸念がある
* `p99`
  * 時間のかかった方から1％分のデータポイントを無視した残りの中で、最も時間のかかったケース
  * `Maximum`のケースの「たまたま〜」のようなものが除外されている
    * つまり、例外感が比較的減った「きれいな最悪」のケース
* `Average`
  * いわゆる平均的なケース
  * `Maximum`周辺がずば抜けて大きな数値だった場合は引き摺られて大きな値になってしまう……
* `tm99`
  * 時間のかかった方から1％分のデータポイントを無視した残りから計算した、平均的なケース
  * `Maximum`周辺がずば抜けて大きな数値だった場合でも無視されている
    * データポイントが正規分布だったり総数が少なかったりすると「ただ偏らせただけ」の結果になるため、冒頭の「ヘビーテイルで十分な量のデータポイントが〜」という条件が重要
* `Minimum`
  * 最も時間のかからなかったケース、つまりレイテンシーという意味では「最良」のケース
  * システムが、例えばキャッシュを返しているなど「処理を端折った分だけ早く返せるのは当たり前」という場合に、この値に引き摺られて全体を評価してしまっていいのか？　という確認が必要
    * `Minimum`の評価基準に合わせて、トリム平均にて「時間のかからなかった方」も無視して計算するといいかもしれない（例：`TM(10%:99%)`）

## 複合で

* `p99 << Maximum`
  * 最大値に近いデータポイントが相対的に多くない雰囲気
* `Average << p99`
  * 「きれいな最悪」に近いデータポイントが相対的に多くない雰囲気
* `tm99 << p99`
  * 「きれいな最悪」に近いデータポイントが相対的に多くない雰囲気
* `tm99 ≒ Average`
  * 最大値に近いデータポイントが相対的に多くない雰囲気