OmniAICreator/Qiita-1.07M huggingface dataset:
[UiPath] LINE Notify を使って自分のLINEアカウントに通知を送ってみよう

# TL;DR
1. LINE Notify で アクセストークン を取得する
1. 【HTTP 要求】アクティビティを配置する
1. 2. のアクティビティに必要な設定を追加する
1. 実行する
1. (ﾟдﾟ)ｳﾏｰ

# LINE Notify とは

[公式サイト](https://notify-bot.line.me/ja/)によれば、

> Webサービスと連携すると、LINEが提供する公式アカウント"LINE Notify"から通知が届きます。
複数のサービスと連携でき、グループでも通知を受信することが可能です。

ということですが、今回はこのWebサービスの部分が UiPath に置き換わるとイメージしてください。
LINE Notify側はメッセージに関しては送信するのみで、メッセージを読む機能はありません。インタラクティブな使い方をしたい、という場合には別の方法が必要になります。

# さっそくやってみよう

## 1. LINE Notify で アクセストークン を取得する

[マイページ](https://notify-bot.line.me/my/)にアクセスすると、LINEアカウントでのログインが求められるので、ログインします。
ログイン後の画面下部に「アクセストークンの発行（開発者向け）」というメニューがあり、このなかに「トークンを発行する」ボタンがあります。

ボタンをクリックすると、トークン名を記入するテキストボックスと、通知を送信するトークルームを選択するエリアが表示されます。

- トークン名を記入するテキストボックス
    - ここに設定した値は、このあと実際に通知を送信したときに、送信するメッセージの先頭に必ず付与されます。
    - この値はあとから変更することができないようなので、変更したい場合は作り直す必要があります。
- 通知を送信するトークルーム
    - ここでは、「1:1でLINE Notifyから通知を受け取る」か、任意のトークルーム（グループ）に通知を送信するか、を選べます。
    - ここもあとから変更することはできないようなので、変更したい場合には作り直しましょう。

「発行する」ボタンをクリックすると、アクセストークンが発行されます。
このアクセストークンは再表示が出来ないので、このあとの手順でトークンを設定するまではなくさないようにしましょう。

## 2. 【HTTP 要求】アクティビティを配置する

ここから、UiPath Studio を操作していきます。が、その前に少しだけ補足します。

LINE Notify は Web API として提供されています。APIの厳密な説明はここでは省きますが、簡単にいえば**プログラム専用の操作用の出入口**です。
UiPath には、Web API を操作するために利用することが可能な 【HTTP 要求】という名称のアクティビティがあり、今回はこれを利用することが出来ますので、これを使って作っていこうと思います。

まずは、【HTTP 要求】アクティビティを使用するために、アクティビティパッケージをインストールします。インストールするアクティビティパッケージは、 `UiPath.WebAPI.Activities` になります。
パッケージのインストール方法については、[公式ドキュメント](https://docs.uipath.com/studio/lang-ja/docs/managing-activities-packages#installing-packages)を見ていただくと良いと思います。

インストールされましたら、アクティビティパネルの検索ボックスで `HTTP` と検索してみましょう。【HTTP 要求】アクティビティが見つかるはずです。見つかったら、これをデザイナーパネルに配置しましょう。
配置すると、「HTTP要求ウィザード」というウィンドウが自動で表示されます。これは今回使いませんので、「OK」ボタンをクリックして閉じてしまいましょう。

## 3. 2. のアクティビティに必要な設定を追加する

ここから、【HTTP 要求】アクティビティに対して、 LINE Notify の Web API を操作してメッセージを送信できるように設定を追加していきます。
設定する項目は下記のようになります。設定は、プロパティパネルを使って行いましょう。

| 項目名 | 値 |
|:-|:-|
| パラメーター  | （※1） |
| ヘッダー  | （※2）  |
| 本文形式  | `application/x-www-form-urlencoded` |
| 要求URL  | `"https://notify-api.line.me/api/notify"`  |
| 応答コンテンツ | （String型の変数） |
| 応答ステータス | （Int32型の変数） |

### （※1）パラメーターに設定するもの

| 名前 | 方向 | 型 | 値 |
|:-|:-|:-|:-|
| `message`  | 入力  | String  | （送りたいメッセージの文字列 または その文字列が代入されたString型変数）  |

### （※2）パラメーターに設定するもの

| 名前 | 方向 | 型 | 値 |
|:-|:-|:-|:-|
| `Authorization`  | 入力  | String  | `"Bearer " & 取得したトークンの文字列`|
| `Content-Type`  | 入力  | String  | `"application/x-www-form-urlencoded"`  |

配置した【HTTP 要求】アクティビティに設定エラーがなければ、きっと大丈夫です。

## 4. 実行する

さっそく、実行してみましょう。深いことは考えず、**まずはトライしてみるのが吉**です。

……

実行できましたか？ すべての設定が正しくされていれば、1. で設定した送信先にメッセージが送信され、みなさんのお手元にLINEの通知が来ているはずです。

### もし上手く動いてくれないときは

上手く動いてくれないときは、LINE Notify に送っているデータが適切ではなく、それによって失敗している可能性があります。
LINE Notify は、失敗したときにはその理由を「返事」として送ってくれる仕組みがありますので、それを確認してみましょう。
この「返事」は、 3. で設定した項目のうち** 応答コンテンツ で指定した変数のなかに格納されます**。ですので、みなさんの確認しやすい方法でこの変数の中身を表示してみましょう。

# いかがでしたか？

自動化した作業の完了を LINE で受け取ることができるようになりました。お仕事でお使いの場合、LINE を使うということはあまり多くないと思いますが、個人で開発し運用するプロセスには活用できるのではないでしょうか。
わたしもこの記事を書くまでは、個人で運用しているプロセスに通知の仕組みを入れていませんでしたが、これからは LINE Notify をもっと活用していきたいと思いました。
ASP.NET Core Razor Pagesで Web APIを定義する


## はじめに

ASP.NET Core Razor PagesのプロジェクトにWeb APIを定義する方法を示します。

環境は、ASP.NET Core Razor Pages + .NET 6です。

ここで定義するWeb APIは、与えられた文字列をQRコードに変換するAPIです。「[ASP.NET Core(C#)でQRコードを生成しブラウザに表示する](https://qiita.com/gushwell/items/59ca85fdfee0affa4821)」での記事で利用したQrCoderパッケージを使ってQRコードを作成します。

## NuGetを使いQRCoderパッケージインストールする

[QRCoder](https://github.com/codebude/QRCoder/)は、C＃.NETで記述されたQRコードを作成するライブラリです。とても簡単なコードで、QRコードを生成できます。.NET Framework にも、.NET Core系にも対応しています。

NuGetパッケージマネージャーを使いQRCoderパケージをインストールします。
csprojファイルに、以下の記述を追加します。Visual Studio の NuGetの機能を使ってインストールしてもOKです。

```xml
  <ItemGroup>
      <PackageReference Include="QRCoder" Version="1.4.3" />
  </ItemGroup>
```

## QRコード（PNG画像）を返すAPIを定義する

では、WebAPIを定義してみましょう。

ASP.NET Core Razor Pages は、ASP.NET Core MVCと異なり、Controllerフォルダがデフォルト存在しないので、プロジェクトの下にControllerフォルダを作成し、QrCodeControllerクラスを定義します。


```cs
using Microsoft.AspNetCore.Mvc;
using QRCoder;

namespace QrCodeExample.Controller;

[Route("api/[controller]")]
[ApiController]
public class QrCodeController : ControllerBase
{
    public QrCodeController()
    {
    }

    [HttpGet()]
    public ActionResult Get([FromQuery] string text)
    {
        var qrGenerator = new QRCodeGenerator();
        var qrCodeData = qrGenerator.CreateQrCode(text, QRCodeGenerator.ECCLevel.Q);
        var qrCode = new PngByteQRCode(qrCodeData);
        var bytes = qrCode.GetGraphic(10);
        return File(bytes, "image/png", "example.png");
    }
}
```

ここでは、パラメータtextを受け取り、この文字列をQRコードにしています。

これで、以下のようにAPIを呼び出しことができます。

```
https://localhost:7281/api/qrcode?text=サンプルプログラム
```

Web APIのコードは、ASP.NET Core MVCの場合と全くですね。


## Program.csを変更する

しかし、ASP.NET Razor Pagesの場合は、これだけだとルーティングの設定が不足していて404　Not Foundになってしまいます。

そのため、以下のようにProgram.csを変更します。

```cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
// 次の行を追加. Web API を提供するために必
builder.Services.AddControllers();

... 省略 ...

app.MapRazorPages();
// 次の行を追加 （ルーティングの設定）
app.MapControllers();
```

## cshtmlを変更

次に、QRコードをindexページに表示するようIndex.cshtmlを変更します。例えば以下のようにIndex.cshtmlを定義します。


```htm;
@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<div class="text-center">
    <h1 class="display-4">QRコードサンプル</h1>
    <img src="/api/qrcode?text=https%3A%2F%2Fqiita.com%2Fgushwell" />
</div>
```

上記例のtextパラメータは、`https://qiita.com/gushwell` をURLエンコードした値です。

## 実行する

では、実行してみます。

![スクリーンショット 2022-07-21 20.49.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29415/cf2271fc-b416-cc0f-6f0f-dc3c2cc3d635.png)


無事にAPI呼び出せたようです。

ここでは、imgタグのsrc属性でAPIを指定していますが、当然ですが、JavaScriptを使ったAjax呼び出しも可能です。
Scala sttpでJSONを返す外部APIを叩くサンプルコード

Scalaって簡単なことでも日本語で解説したサンプルがなくてつらいですね😂

## sttpを使って外部apiをgetで叩く簡単なコード

（sttpはインストール、import等できているものとします。）

```scala

  def callApi() = {

    val api_key = "apikey"
    val api_url = "http://apiurl/?"

    val request = basicRequest
      .get(
    uri"${api_url}&api_key=${api_key}"
      )
      .response(asJson[String])

    val response = request.send(backend)

    response.body match {
      case Left(error) =>
        throw new Exception(
          s"Error when executing api request: $error",
          error
        )
      case Right(data) => data
    }

    response
  }
```

https://sttp.softwaremill.com/en/latest/json.html

sttpはまだ公式がわかりやすいサンプルコードを提供してくれてるし、リクエストの組み立ても直感的でわかりやすいと思います。

https://sttp.softwaremill.com/en/latest/examples.html

Scalaなんもわからん
Envek日本到着!Rubyエンジニアを空港迎えに

![iOS の画像 (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462614/f93eaf03-aca6-123e-f434-5ab00955e4c3.jpeg)
（右側がEnvekさんで、左は[iAdramelk](https://github.com/iAdramelk]))


## 先週の水曜は関空行きました。

空港はコロナ前と比べると静かでしたが、今回はある方を迎えるために関空まで行ってました。

またいつか海外も行きたくなりました。
ヨーロッパのEurokoというRubyカンファレンスでも行こうかな。。。

### OSSやってます！

Evil MartiansのバックエンドエンジニアであるAndrey Novikov ([Envek](https://github.com/Envek)) が、日本のエンジニアリングチームを強化するために大阪にやってきました!

(Yabeda)[https://github.com/yabeda-rb/yabeda]や(after_commit_everywhere)[https://github.com/Envek/after_commit_everywhere]（Sidekiqに最近採用された）のような彼自身のオープンソースプロダクトのオーサリングに加え、火星人のオープンソースプロダクトのimgproxyとAnyCableも強化してくれましたので、もしこれらを使っているか、使う予定なら、彼はそれを実現できますので、大阪オフィスでコーヒーでもどうぞ。

日本語は上級レベルなので、日本語でも英語でも気軽に声をかけてください。
(今後は彼自身もQiitaに記事書いてくれると嬉しいです）


日本へようこそ、Andrey!
命名規則を今更ながらまとめてみた

# 命名規則とは？
命名規則とは、**変数名などを名付ける際の決まり事**のことを言います。

変数などでは２つの意味の単語をつなぎ合わせて1つの変数とすることがよくあります。
例）`userId`, `SourceCode`, `localhost`など 

そんな時に命名規則があることで、**統一した、わかりやすい変数名を付けることができる**ようになります。

命名規則は、各言語や開発環境、組織の決まりなどによって様々ですが、有名な書き方があるのでいくつか紹介します。



# 様々な命名規則
## キャメルケース(camelCase)
`userTypeId`のように書きます。
**先頭(`user`)が小文字、続く要素(`Type`, `Id`)の1文字目が大文字**です。
ローワーキャメルケースとも呼びます。


## パスカルケース(PascalCase)
`UserTypeId`のように書きます。
**各要素(`User`, `Type`, `Id`)の1文字目が大文字**です。
アッパーキャメルケースとも呼びます。


## スネークケース(snake_case)
`user_type_id`のように書きます。
**各要素(`user`, `type`, `id`)が小文字で、要素間を"_"で繋ぎます。**


## チェインケース(chain-case)
`user-type-id`のように書きます。
**各要素(`user`, `type`, `id`)が小文字で、要素間を"-"で繋ぎます。**
ケバブケースとも呼びます。



# 言語ごとに命名規則が違う
各プログラミング言語によって命名規則は違います。今回はJavaの命名規則を例として紹介します。
| 種類 | 命名規則 | 例 |
|:-:|:-:|:-:|
| クラス名  | パスカルケース  | UserModel  |
| 変数  | キャメルケース  | userName  |
| メソッド  | キャメルケース  | getUserName  |
| 定数  | スネークケース  | MAX_CONNECTION  |


# その他の書き方規則
## 定数は基本的に大文字にすることが多い
`MY_NAME`や`PATH`のように書きます。
定数は基本的に変わることのない値、新たに値を入れることのない値です。
**誤って別の数値を入れてしまわないように**、定数だとわかるように大文字にすることが多いです。


## 2 to 4 for
`P2P(Peer to Peer)`, `good4you(good for you)`のように書きます。
昔のコードなどにはたまに**toを2、forを4**で書いている変数があります。
これは英語のスラングからきており、文字数を減らすために使われていましたが、この書き方はおすすめしません。
**直感的にわかりづらく、エンジニアの中でも共通認識があるものではなくなっている**からです。


## ハンガリアン記法
`iId`や`sName`のように書きます。
`iId`の**i**や`sName`の**s**は型を表します。

この書き方の良いところは**別の型の変数に間違って代入するミスが減らせる**ところです。
``` java:例
String sId = "A1234";
int iId = 1234;

sId = iId;
```
ただ、**開発環境やコンパイラが高機能化されたことにより、容易に型や、エラー箇所を知ることができるようになったため、最近では使われません。**
逆に**読みづらくなってしまうので避けられている**書き方です。



# 終わりに
ハンガリアン記法などはこの記事を執筆するために調べていたら初めて見つけましたが、見たことがある書き方でした。
いまだにこのような古い命名規則を利用している場面を見つけるので、是非とも撲滅していきたいですね。
Luaのメタテーブル内のテーブルに注意

Qiitaの記事書くの初めてです。

Defoldというゲームエンジンを使ってたらLuaでちょっと気になることがあったのでメモ書き。
完全な自己理解なので間違ってたら教えてください。

## 問題
自力で書いた物理判定を使いたくて、Lua Moduleを使ってゲームオブジェクトとは別の物理判定用のテーブルを用意してそこで設置などの判定をしていた。

で、そのテーブルに基本の情報（速度とか摩擦とか）を持つメタテーブルを設定したんだけど、一部うまくいったりいかなかったりした。
　具体的には、メタテーブル内のテーブルへのアクセスうまくいかなかった。例えば、速度はvmath.vector3()で設定したんだけど、Bの速度を変更したらAの速度のみ変更になったりする感じ。

## 原因の予測
これはシンプルにLuaがtableを代入したときにすべて参照渡しになることと、メタテーブルの仕様が（たぶん）原因だった。
　普段↓こんな感じで書いてたんだけど

```
objs = {}
obj_meta = {}
obj_meta.name = "name"
obj_meta.max_spd =10
obj_meta.spd ={x =0,y=0}

function make_objects(name)
 local o = {}
 o.name = name
 setmetatable(o,{__index = obj_meta})
 table.insert(objs,o)
 return o
end
```

メタテーブルはこの時、新しいobjのmax_spdにアクセスしようとしたときに、obj_metaのmax_spdにアクセスするので、10が返る。spdも同様。

ただし、新たな値を代入するとき。
```
 local p = make_object("player")
 p.max_spd = 9
 p.spd.x = 100
```

とかするとき、max_spdのような値はobjのpの中に新しいmax_spdを作って、以後それにアクセスするようになる。
　でもspdのようにテーブル内の要素を変更するときは、metatable内のspdを変更することになってしまっていた。なので、spd.xを変更したときに別の要素のも変更されてしまっていたんだ、と思う。

## 解決法
メタテーブルの中にテーブルを入れないか、初期化の時に
```
 local p = make_object("player")
 p.spd = {x =0,y=0}
```
ってするみたいな感じにして解決した。

参照渡しと値渡しって混乱するなあ。
Microsoft 365 developer Programの紹介


AzureAD,Microsoft365で色々試してみたいけど、試用版だと1ヶ月で
ライセンスが切れてしまう、でもお金をかけるのは厳しい、という方も
いらっしゃるのではないのでしょうか。そんな方におすすめなのが
Microsoft 365 developer Programです。
このProgramにより、アプリケーション(AAD/M365も含みます)を
設計、開発、およびテストするためならば、申し込むことで90日間AzureADの機能等が無料で試せます。
そして開発活動を続けると、90日間を過ぎても再度90日間延長されます！何度でも！
(ただし本番運用にこのProgramを使うのはだめです。契約条件にそう書かれています。)

さて、申し込みですが以下のURLより申し込めます。

https://developer.microsoft.com/en-us/microsoft-365/dev-program

参加手順は以下。
https://docs.microsoft.com/ja-jp/office/developer-program/microsoft-365-developer-program

プログラムに参加し　Microsoft 365 開発者サブスクリプション を設定する際に
迷うのはサンドボックスの選択ではないでしょうか。

よくわからない、とにかく試してみたい、
ならばインスタントサンドボックスで問題ありません。
さまざまアカウント等が自動でセットアップされます。
逆に明確な目的があり、自分の考えている通りにセットアップしたいならば、
構成可能なサンドボックスです。
自動アカウントセットアップ等（プロビジョニング）は一切行われず、
全て自分で設定することができる（言い換えれば設定する必要がある）状態になります。

さて、これでまずは90日間有効なAzureAD, Microsoft365, PowerPlatformの
環境ができました。
ここで何ができるかと言いますと、ライセンスで言えばM365E5相当、
つまり
- AzureADPremiumP2
- PowerPlatform
- Teams/SharePointOnline
- Microsoft365 Defender

等々が可能です。
逆にこのプログラムでできないことは
- Azure IaaS関連
別途以下利用で一部可能ではあります。
https://azure.microsoft.com/ja-jp/free/
- log analytics/Sentinel
ストレージアカウントがないので無理です。

などになります。

次に開発プログラムの延長方法ですが、公式なものは非公開です…
しかしこれまで有志の方の挑戦により、これで延長できる！というのが
ある程度推測されています。今回こちらもご紹介します。

私が参考にしたのは以下のyoutubeです。(英語です)
https://www.youtube.com/watch?v=Pu1M5qWjk80
具体的にはみていただきたいのですが、
これをみた上で私が実施しそして90日延長に成功した開発活動は以下です。

- SharePointOnlineサイトをLookBookテンプレートから作成
- PowerAutomateのフローをテンプレートから作成、実施
- PowerAppのアプリをテンプレートから作成、実施。
さらに自分で簡単なアプリは作ってみました。
- PowerBIでテンプレートからレポート作成。
私はCoronaレポートをテンプレートから作成し、参照しました。
- PowerVirtualAgentsでBOTをTeamsに構成。
これはYouTubeにありませんが、PowerPlatformをコンプリートするためにやりました。

90日延長に成功しますと
Congratulations:Your Microsoft 365 trial developer subscription has been renewed
というメールが届きますので、
本メールが届いた方はおめでとうございます、90日延長成功です。

それでは良いM365開発者ライフを！
文章の最初と最後を抜き出すやつ　インターネット無しのローカルで動くページ

# 文章の最初と最後を抜き出すやつ(雑)
インターネット無しのローカルで動くページ。。。
とある所で使うようなので、解説とかは無しです。

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>主語述語抜き出しページ</title>
    <script>
	function OnButtonClick(){
	//格納する変数の宣言
	let element = document.getElementById("original").value;
	element = element.split('。');
	var med = [];
	//配列を全てループ+処理して、変数medに入れる。
	for (const elem of element) {
		if (elem.length > 30) {
			var elem1 = elem.slice(0, 9);
			var elem2 = elem.slice(-20);
			var medium = elem1 + '■　■' + elem2 + '。' + '<br>';
			med.push(medium);
		}else{
			;
		}
	};
	//抜き出した文章を出力する
	target = document.getElementById('output');
	target.innerHTML = med;
	}
    </script>  
  </head>
  <body>
<textarea id="original" rows= "35" cols="75"></textarea>
<br>
<input type="button" value="主語述語抜き出し" onclick="OnButtonClick();">
<div id="output"></div>

  </body>
</html>
```
1on1ミーティングで話すことがなくなったらどうするの？っていう恐怖症と戦うエンジニア

# 放送事故 恐怖症

最近、エンジニア10名ほどの1on1ミーティングを月1でやっている。

僕自身の心理でいうと、一番怖いのは「話すことがなくなること」だ。

僕らは放送事故を恐れるように社会に「教育」されている。僕は特に空白が怖い。

「話すことが何もなくなったのに、漫然と過ごす時間」がとても嫌なのだ。

# だが1on1ミーティングの要は空白だったりする。

そもそも人との会話の要も空白だ。
 
話題が尽きたからと言って、手早く会話を終わらせたりしない。

この居心地の悪さに耐えることが、話し合いに価値を生む必須事項だと思っている。

# テーマは事前に用意することもある

だが、それが全てではない。

相手の現状を聞きながら、割とフリースタイルに近い形で話し合っていく。


テーマやフォーマットが決まっていないからこそ、手探りで答えを見つけ出していく感じだ。

# 基本のスタイルはある

相手の現状を確認し、問題が起きていれば解決方法を提案したり、一緒に考えたりする。

だが相手が話したそうにしている場合は、話を止めたり無理に方向づけたりしないよう気をつけている。

あとは相手に質問をして、すぐに答えが返ってこない時の空白や、居心地の悪さも耐える。

<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
GASからシンプルにLINE Notifyにポストするライブラリを作ってみた #LINEDC #LINENotify


Google Apps ScriptからLINE Notifyにポストするライブラリを作ってみました。

LINE NotifyはLINEに通知を送れる仕組みです。

> https://notify-bot.line.me/ja/


## 使い方

### LINE Notifyのトークンを取得する

https://notify-bot.line.me/ja/

### ライブラリのインストール

GASのエディタ画面でライブラリのメニューの`+ボタン`を押します。

> ![スクリーンショット 2022-07-25 19.23.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/73714e9d-40b9-40d9-7236-842a68cd2016.png "スクリーンショット 2022-07-25 19.23.58.png")

スクリプトIDを求めらるので以下をコピペして利用します。

> `1L4uz6F_w_o0RZsH-W6oR-eXklMmGvHddVjA4FrU6VNdlm7mgk2Q4Wmrc`

検索するとライブラリが表示されるので最新バージョンをインストール(追加)します。

> ![スクリーンショット 2022-07-25 19.21.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/04443584-3ad5-283d-c548-38f18bb10ec8.png "スクリーンショット 2022-07-25 19.21.06.png")

### GASでコードを書く

以下のコードを書いて実行すれば動きますが、LINE Notifyのトークンを取得したものに書き換えだけ行いましょう。

```js
function myFunction() {
  const notify = new LINE_Notify.init(`LINE Notifyのトークンを指定`);
  notify.post(`ほげほげ`); 
}
```

こんな感じで実行できます。

> ![スクリーンショット 2022-07-25 19.26.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/d373c660-d15b-3091-72be-041ee0e0fb81.png "スクリーンショット 2022-07-25 19.26.38.png")

## 参考

> [GASからシンプルにDiscordにポストするライブラリを作ってみた](https://qiita.com/n0bisuke/items/153fa71b22f44c3d4766)
Power AutomateでOneDrive内に自動でフォルダーを作る

こんにちわ、 のりじ です。

「添付ファイル付きのメールを受信したら添付ファイルを自動でOneDriveに保存する」仕組みを作りたい場合、自動でフォルダを作成したい場合があると思います。
ですが、Power Automate / Azure Logic Appsで用意されているOneDriveコネクタには「フォルダーを作成する」というアクションが用意されていません。

今回は、それを解決する方法を毎回忘れてしまう自分用の備忘録的な記事です。

## 1. ワークフロー全体図

![20220725-00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/ade66f14-890a-c758-a221-088558bdde54.jpeg)

このように、トリガー1つ、アクション2つのシンプルなワークフローになります。

### 利用するコネクタ

- トリガー：Office 365 Outlook
- アクション：OneDrive for Business

## 2. トリガー

![20220725-01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/ed851957-651c-6825-625d-4e41e5f5812a.jpeg)

「新しいメールが届いたとき（V3）」を選択します。
トリガーの「添付ファイルを含める」と「添付ファイル付きのみ」の設定をしておくことで、添付ファイルがある場合のみトリガーが起動する形にできます。

## 3. アクション

![20220725-02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/75c23ec2-d606-3220-03ae-dc4ba6b72299.jpeg)

今回のワークフローのメイン部分です。
「ファイルの作成」を選択します。
「Apply to each」が入っているのは、複数の添付ファイルがあった場合に対応するためで、この部分は自動で入ります。

このアクションのポイントは、「フォルダーのパス」のところに「/（スラッシュ）」と「式」を入力すること。
フォルダー名に使いたい形式は以下の内容を利用で。

**01. 日付のみをフォルダー名にしたい場合**

```
formatDateTime(addhours(utcnow(),9),'yyyy-MM-dd')
```
Power Automate の日時は変換しないと「(UTC-09:00) 協定世界時-09」なので、「addhours(utcnow(),9)」で変換します。
「yyyy-MM-dd」は「年-月-日」の表示。

**02. 日付＋時刻をフォルダー名にしたい場合**

```
formatDateTime(addhours(utcnow(),9),'yyyy-MM-dd-HHmm')
```

01の表記に加え、日時を追加します。
「HH」が24 時間形式の時間 (00 ～ 23)、「mm」が分 (00 ～ 59)。  
間に「:」とか入れたいところですが入れると実行時にエラーになるので注意。

**03. 日付フォルダーを作成し直下に「メールの件名」のフォルダーを作成**

```
concat(formatDateTime(addhours(utcnow(),9),'yyyy-MM-dd'),'/',triggerOutputs()?['body/subject'])
```
「concat」関数は任意の文字列を結合します。
「triggerOutputs()?['body/subject']」のところは動的なコネクタで選択します。
結果はこちら。

![20220725-04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103396/2e1b698e-10ad-bad6-8322-2de43da61a40.jpeg)

## 4. 最後に

このように、ファイルパスの表記を変更することでOneDrive内に自動でフォルダーを作成できます。
もう忘れるなよ私！ｗ

## 5. 参考URL

- [カスタム日時形式文字列](https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/custom-date-and-time-format-strings?WT.mc_id=M365-MVP-5000493)
JavaScriptのテストフレームワークであるJestを使ってみる


開発環境は、
- Windows10 Pro(64bit)
- Node v16.16.0
- npm 8.11.0

とりあえず、Jestの公式サイトの[Getting Started](https://jestjs.io/docs/getting-started)に書いてある単純な単体テストを実行してみる。


Cドライブ直下にjestディレクトリを作成し、カレントディレクトリにする。
```
cd c:\ && mkdir jest && cd jest
```
以下のコマンドでJestをインストール。バージョンは、28.1.3です。
```
npm install --save-dev jest
```
次に、jestディレクトリ内に、srcディレクトリと、testsディレクトリを作成。
```
mkdir src && mkdir tests
```
次に、以下のコードをsum.jsという名前で、srcディレクトリに保存。
```javascript
function sum(a, b){
    return a + b;
}

module.exports = sum;
```
次に、以下のコードをsum.test.jsという名前で、testsディレクトリに保存。
```javascript
const sum = require("../src/sum");

// 1+2が3になれば成功というテスト
test('adds 1 + 2 to equal 3', () => {
    expect(sum(1,2)).toBe(3);
});

// 1+2が3にならなければ成功というテスト
test('adds 1 + 2 to not equal 3', () => {
    expect(sum(1,2)).not.toBe(4);
});
```
次に、プログラムを実行するために、package.jsonを開き、以下のscriptsの欄を追加してます。これにより、npm testを入力すると、jestが実行されます。
```json
{
  "devDependencies": {
    "jest": "^28.1.3"
  },

  "scripts": {
    "test": "jest"
  }
}
```
さっそく、実行してみましょう。
```
npm test
```
以下のような結果になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/5740b74e-b712-406b-3d6e-37aaa8c7628d.png)
どっちも成功ですね。

### リンク
- [Getting Started · Jest](https://jestjs.io/docs/getting-started)
【Linux】ZIP内のファイルをサイズ順に表示する

## 概要
ZIP内のファイルをサイズ順に表示するコマンド
(Display files in ZIP in order of size)
## コマンド
zipinfoコマンドでzipファイル内の一覧を表示し、sortでサイズ順に並び替える。
(Use the zipinfo command to display the list in the zip file, and use sort to sort by size.)
```
$ zipinfo hoge.zip |sort -k4hr
Zip file size: 391737353 bytes, number of entries: 756
-rw-rw-r--  3.0 unx 226074624 bx defN 22-Jul-22 10:18 aaa/bbb/ccc.db
-rw-rw-r--  3.0 unx 208771833 tx defN 22-Jul-25 07:18 aaa/bbb/ddd.txt
-rw-rw-r--  3.0 unx 103399424 bx defN 22-Jul-22 10:18 abc/def/ghi.db
...
```

## sortコマンドオプション
sortコマンドで使用しているオプションの詳細
|||
|--|--|
|-k\<num\>|場所と並べ替え種別を指定する（「-k 2」なら2列目、「-k 2n」なら2列目を数値として並べ替える。複数指定する場合は「-k」オプションを複数回指定する）|
|-r|並び順を降順にする|
|-h|サイズをKやMなど単位を考慮してソート|
2022年版「Cloud Natural Language」活用 第1回｜GCPの「Cloud Natural Language」の概要と活用方法

## はじめに
ヴェネクト株式会社の小峰です。
今回は、4回にわたりGCPの「Cloud Natural Language」を利用した自然言語解析の実施方法を説明します。
「Cloud Natural Language」を利用することで、大まかに下記のような成果を得ることが出来ます。
- __文章内に含まれているKWを抽出できる__
    - その結果から、KWの出現数や組み合わせを取得することができます。取得結果を活用して、文章のカテゴリ分け・タグ付けを行う機械学習のシステムに結びつけることができます。
- __文章の係り受け構造を明らかにすることができる__
    - その結果から、「文章の主題」や「その主題がどのように評価されているか」を判断することができます。その分析結果を活用して、自然言語で命令するアプリケーション（AIアシスタントなど）に結びつけることができます。
- __文章の感情（ポジティブ/ネガティブの度合い）を判断することができる__
    - 文章や各KWがどのように評価されているかを点数化して判断することができます。その結果を分析することで、マーケティングやCSRの向上を目的とした分析に役立てることができます。
## 自然言語解析エンジンとして「Cloud Natural Language」を勧める理由
- __GCP上で動作するので、環境構築が容易である__
    - 「Cloud Natural Language」はGCP上で動作し、API経由で分析したい文章を送信すれば、GCP上で処理され、結果がJSONで返されます。そのため、分析実行者側で、分析のための環境構築が不要であることが利点です。
    - また、GCPを利用していれば、「Cloud Natural Language」の利用開始はAPIの利用開始申請のみで開始できるため、利用開始のハードルも非常に低いです。
- __純粋に自然言語解析エンジンとしての品質に優れている__
    - （筆者の主観になりますが）エンティティの切り分けや、感情分析の判断、係り受け構造の分析など、どの観点でも分析結果の精度が高いと感じています。
    - そのため、分析を行う者が、精度の高い分析結果にいきなりアクセスできるのは大きな利点になります。
- __自然言語解析エンジンの開発やアップデートをGoogleに委ねられる__
    - （個人的な経験によりますが）自然言語解析エンジンの開発は、細かいパラメータや処理の微調整を通じて、抽出結果の精度を上げる開発が必要です。この部分は開発負荷がかなり大きくなります。
    - そのため、Google側で自然言語解析エンジンの開発やアップデートを実施してくれるので、自然言語解析エンジンの開発工程を飛ばして利用できることは大きな利点だと思います。

# 「Cloud Natural Language」の構成と得られる成果物
## 各種アプリケーションの説明
「Cloud Natural Langugaeですが、基本的に下記の3機能によって構成されています。
次回以降は、それぞれ1つの機能をピックアップして説明をしていきます。
- __エンティティ分析（エンティティ感情分析も併せて記載します）__
    - __概要__
        - 文章を解析し、文章内で挙げられているKW（エンティティ, Entity）を取得し、併せてKWのタイプや重要度、感情表現の強さを得る
    - __成果物__
        - __Input__
            - 文章を入力する
        - __Output__
            - 文章内で出現する主要なKW（以下、Entirty）が得られる
            - Entity毎に、下記の情報を併せて取得できる
                - Entityのタイプ
                - Entityの文章内における重要性（Salience）
                - Entityの感情表現の強さ（Sentiment）

- __感情分析__
    - __概要__
        - 文章を解析し、その感情表現の方向性（PositiveかNegativeか）とその感情表現がどれだけ強いかを判断する
    - __成果物__
        - __Input__
            - 文章を入力する
        - __Output__
            - 文章の感情表現のPositive/Negative（Score）
            - 文章の感情表現の強さ（Magnitude）

- __構文解析__
    - __概要__
        - 文章を解析し、文章内に出現する品詞毎に、係り受け構造を出力する
    - __成果物__
        - __Input__
            - 文章を入力する
        - __Output__
            - 品詞毎に下記を出力する
                - 係り受けしている品詞
                - 係り受け構造の種別

# 次回について
全4回の記事を投稿しておりますので、下記リンクから参照ください

- [第2回｜エンティティ分析の方法と成果物を説明する](https://qiita.com/venect_qiita/items/2b036a95ab4a4b30d53e)
- [第3回｜感情分析の方法と成果物を説明する](https://qiita.com/venect_qiita/items/6e44848bd2cf3a25c250)
- [第4回｜構文解析の方法と成果物を説明する](https://qiita.com/venect_qiita/items/71409bcef2caac9f2843)
ガチ初心者向けPostgreSQL

# ガチ初心者向けPostgreSQL

GCP上で使った時に覚えたことを殴り書きします。
環境毎に異なると思うのでコンソール画面（コマンドが使える画面）までは頑張って行ってください。ちなみにGCPの場合Cloud Shellで

```ssh
gcloud sql connect db-name --user=postgres
```

Linuxから起動する場合は

```shell
service postgresql start
```

停止する場合は

```shell
sudo service postgresql stop
```

起動した状態で下記コマンドでコンソールに入れます。

`sudo -u postgres psql`

コンソールから出るときは

`\q`

## DBの取り扱い

`postgres=> \l`

で存在するDBを一覧表示する。
気を付けることはPostgresでは「1コネクション＝１DB」ということ。コマンドを使ってDBを切り替えたりはできず、使用したいDBにコネクトしてからコマンドを使用する必要がある。

`postgres=> \connect [db_name]`

こんな感じで目的のDBへ再接続できる。

## Table

### 作成

```sql
CREATE TABLE IF NOT EXISTS sample_table(
    x integer,
    y integer,
    z archer(20)
);
```

こんな感じで作る。

テーブルが出来てるか確認する。

```sql
postgres=> \dt
            List of relations
 Schema |     Name     | Type  |  Owner
--------+--------------+-------+----------
 public | sample_table | table | postgres
```

### 挿入

データを追加する。

```sql
postgres=> insert into sample_table values (1, 1, 'hello');
```

挿入できてるか確認する。

```sql
postgres=> select * from sample_table;
   x    |   y  | z
--------+------+-------
      1 |    1 | hello
```

## User

### User 追加

```sql
postgres=> CREATE USER user_name WITH PASSWORD 'aaa';
```

### 権限追加

スーパーユーザ権限を付与する場合

```sql
postgres=> ALTER USER user_name WITH SUPERUSER;
```

`\dt` でユーザ一覧と権限が見れる。

## 拡張機能のインストール

GCEの場合はファイルは既にインストール済みなので

`postgres=> create extension postgis`

でpostgisという拡張機能が使えるようになる。

Linuxの場合はターミナル上でファイルをインストールしておく必要がある。

`sudo apt install postgis`
postgresqlのDBを削除して再作成する

## まずはコネクションを削除
```
select pg_terminate_backend(pid) from pg_stat_activity where datname = 'DBの名前';
```

## DBを削除
削除したいDBじゃないDBに移動して以下を実行する。
```
drop database DBの名前;
```

## DBを再作成
```
create database DBの名前;
```
サービス API とリソース API の違い

上司に、とある機能ついてはサービスを作らずにリソース API で処理するのが良さそうじゃない？という風に言われた。

ちょっといまいちピンとこなかったので少し調べてみました。

# APIって？
httpプロトコルを利用してネットワーク越しに呼び出す API のこと
つまり、機能は分かっているけれども、その中身は詳しくは分からないものを外部から呼び出すための仕様のことを指します。

プロトコルとして http を使うためそのエンドポイントは URI によって指定されることになる。

### REST設計の具体例
具体的に実装を行うとしてSymfonyで実装するとして、まずしなければならないのはエンティティとエンドポイント（URI）です。

エンティティを定義したら次にエンドポイントの URI を決定する。RESTではリソース（エンティティの形をしたデータ）のURI が一意になるように決定していく。

# サービスとは
複数のリソース(エンティティ)から加工して新たなリソースを生成する。

サービスはビジネスロジックなどの処理をまとめたものでありデータではない。
サービスは複数のリソースを参照し何らかの処理を実行して新たにリソースを生成するがあくまで動的に結果を返す処理に主眼がある。

本来的な作り方を意識するのであれば、サービス（処理の塊）をリソースに無理やりマッピングしようとして、何がしたいのかよく分からなくなってしまう。
サービスの URI がリソースっぽくないことで悩んだりすることもあるのでしょうか。。。
ただし本来的にはAPI を利用する人にとって分かりやすいI/F設計にすべきだということ。

これを解決するために今の会社では、リソースを返す純粋な rest API とサービス API の二つを持つ。

参考文献
　[WebAPIではリソースとサービスの区別が重要](https://qiita.com/stakezaki/items/047d7bb19e591e85a424)
LocalStack セットアップメモ

macOS、Python 3.10にてLocalStackをセットアップしたメモ。

https://github.com/localstack/localstack
この辺の記載だけだとよくわからなかったため

インストールはこれだけ

```
pip install localstack
```

インストールできたら、起動も簡単。

```
localstack start -d
```

初回起動はDockerのイメージダウンロードとかが入るから時間がかかるが、しばらく待ってると、ドキュメント通りに起動した。以下のコマンドで動作を確認できる。

```
localstack status services
```

また、[こちらの記事](https://qiita.com/yasomaru/items/fa708a1f21a79e637868)に書いてあるように、　[http://localhost:4566/health](http://localhost:4566/health)にアクセスすれば、JSONで情報が取得できる。

```json
{"features": {"initScripts": "initialized"}, "services": {"acm": "available", "apigateway": "available", "cloudformation": "available", "cloudwatch": "available", "config": "available", "dynamodb": "available", "dynamodbstreams": "available", "ec2": "available", "es": "available", "events": "available", "firehose": "available", "iam": "available", "kinesis": "available", "kms": "available", "lambda": "available", "logs": "available", "opensearch": "available", "redshift": "available", "resource-groups": "available", "resourcegroupstaggingapi": "available", "route53": "available", "route53resolver": "available", "s3": "running", "s3control": "available", "secretsmanager": "available", "ses": "available", "sns": "available", "sqs": "available", "ssm": "available", "stepfunctions": "available", "sts": "available", "support": "available", "swf": "available"}, "version": "1.0.2.dev"}
```

このことから、4566ポートでサービスがアクセス可能なこともわかった。ここまではドキュメントの通り。その後、`awslocal`なるコマンドを使えと書いてあるが、localstackのインストールだけではインストールされなかったので、別途インストールが必要だった。
参考: [https://github.com/localstack/awscli-local](https://github.com/localstack/awscli-local)


```
pip install awscli-local
```

そうしたら、たとえばS3のバケットは簡単に作れる。

```
awslocal s3api create-bucket --bucket sample-bucket
```

`awslocal` は、[こちらの記事](https://qiita.com/yasomaru/items/fa708a1f21a79e637868)に書いてある方法で、`aws`で、`--endpoint-url=http://localhost:4566`を指定するのと同じ

```
aws --endpoint-url=http://localhost:4566 --profile localstack s3api list-buckets 
```
フロントエンド開発 Next.js、TypeScriptのインストールと初期設定

# はじめに
フロントエンドの環境構築で
TypeScript、next.jsを使用するために行ったことについてまとめます。

## 仕様技術、環境
OS → Windows　
エディター → VSCode

## Node.jsとは
サーバーサイドでJavaScriptを動かすための動作環境。

参考記事↓
・[Node.jsとはなにか？なぜみんな使っているのか？](https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb)

## TypeScriptとは
JavaScriptを元にしたプログラミング言語。
私の認識だとJavaScriptの進化版

参考記事↓
・[TypeScriptを入門者向けに解説！JavaScriptとの違いや勉強法までわかりやすく](https://udemy.benesse.co.jp/development/system/typescript.html)

## Next.jsとは
JavaScriptのライブラリであるReactを元にしたフロントエンドフレームワーク。

参考記事↓
・[Next.jsとはReactベースのフレームワーク！Nuxt.jsとの違いや特徴は？【入門編】](https://www.webstaff.jp/guide/trend/nextjs/)
・[Next.jsとは何か？何ができるのか？React開発のフレームワークを解説](https://ssaits.jp/promapedia/technology/what-is-next-jsreact.html)



# 環境構築
_実施したこと_
1. node.jsのインストール
1. Next.jsとTypeScriptの環境構築
1. VSCodeで拡張機能のESLintとPrettierの設定
※ ESLintはJavaScriptのコードを正しく書けているかをチェックするツール。
　Prettierは、ソースコードを整形するツール。

参考記事↓
・[【入門】create-next-appでNext.jsとTypeScript環境を構築](https://mo-gu-mo-gu.com/create-next-app-typescript/#Nodejs%E3%81%AE%E7%A2%BA%E8%AA%8D)
・[VS Code への ESLint プラグインのインストール](https://maku.blog/p/xz9iry9/#eslint-%E3%81%A8%E3%81%AF)
・[【VSCode】Prettierの使い方＆おすすめ設定を紹介](https://ma-vericks.com/blog/vscode-prettier/)
可変引数テンプレートを用いたバイナリデータの読み書き

# ねらい
C++でバイナリデータの書きこみをする際に、変数を定義しなくとも良いようにしたい。　画像ファイルとかのヘッダ部分とかを描く際に短くしたいというのが動機です。
例えば、こんな感じ(個数は任意)。
```cpp
file_write(fout, int(10), double(20.123), float(30.4f)); 
``` 

# 実装
可変引数テンプレートを使ったらうまく行きそうでしたので、実装してみました(要C++11)。
https://cpprefjp.github.io/lang/cpp11/variadic_templates.html

```c++: test.cpp
#include <fstream>
#include <iostream>
#include <array>
#include <vector>
void file_write( std::ofstream& fout) {}
template <class Head, class... Tail>
void file_write(std::ofstream& fout, Head&& head, Tail&&... tail){
        fout.write(reinterpret_cast<char*>(&head), sizeof(Head));
        file_write(fout, std::forward<Tail>(tail)...);
}
void file_read( std::ifstream& fin) {}
template <class Head, class... Tail>
void file_read(std::ifstream& fin, Head&& head, Tail&&... tail){
        fin.read(reinterpret_cast<char*>(&head), sizeof(Head));
        file_read(fin, std::forward<Tail>(tail)...);
}
int main(){
        std::ofstream fout("input.bin", std::ios::binary);
        file_write(fout, int(10), double(20.123), float(30.4f));
        file_write(fout, int(10), int(20), int(30));
        fout.close();

        std::ifstream fin("input.bin", std::ios::binary);
        int a;
        double b;
        float c;
        std::array<int, 3> ar{};
        file_read(fin, a, b, c, ar);
        fin.close();
        std::cerr<<a<<" "<<b<<" "<<c<<" "<<ar[0]<<" "<<ar[1]<<" "<<ar[2]<<std::endl;
        return 0;
}
```

この実装ですと、
* 明示的にキャストが必要。
* ~~配列とかは無理そう~~ ofstream::write()で直接書き込める必要がある。std::arrayだったら配列でもできる(vectorは×っぽい）。

あたりの制約があります。

# 追記

元々は、file_readをstd::tupleの返り値でとるようにしたいとおもっていました。つまり,

```cpp
auto [a,b,c] = file_read<int, double, float>(fin); 
```
以下の通り、std::apply()とパラメータパックの展開をうまく使えばできるということがわかりました(C++17~~構造化束縛(auto[a, b, c]）はC++17~~)。
```cpp: 
template<typename... Args>
std::tuple<Args...> file_read(std::istream& in) {
        std::tuple<Args...> result;
        std::apply ([&in](Args &... v){(in.read( reinterpret_cast<char*>(&v), sizeof(v)), ...);}, result );
        return result;
}
``` 

参考
 * https://en.cppreference.com/w/cpp/utility/apply
(Swift)(PencilKit)PencilKitを使いページング機能付きお絵描きアプリの実装方法

# はじめに
PencilKitを使ったお絵描きアプリの実装方法の記事はよく見かけるがページング付きのお絵描きアプリの記事は見かけません。あと実際に実務で開発した時に苦労したので、忘備録として投稿してます。
# この記事の対象者
・PencilKitを使ったお絵描きアプリを実装したい方
# このアプリでできること
・一つの画面で描画しながらページングできる
・次へボタンで新しいページを作成
・キャンバスに背景色/背景画像を指定
・キャンバスの描画情報と背景色/背景画像を合成して、1枚の画像に変換
・ToolPickerの出し入れ
またのちほど書いていきます
Scala 重い処理をIOで非同期な感じに並列処理する

## IOで並列処理するには、parSequenceを使うと良いらしい。

サンプルコード

```scala
import cats.implicits._
import cats.effect._
import cats.effect.unsafe.implicits.global

def heavyTask(i: Int): Int = {
  Thread.sleep(1000)
  println(i * 100)
  i
}

def proc(i: Int): IO[Unit] = {
  IO {
    println(i)
    heavyTask(i)
  }
}

val ints = List(3, 4, 5)

ints.map(proc).parSequence.unsafeRunSync()
```

結果
```
3
4
5
300
500
400
```

https://typelevel.org/cats-effect/docs/2.x/datatypes/io#parsequence

このheavyTaskを外のAPI叩くとかファイル触るとか重い処理に置き換える。

Scalaなんもわからんが、要はIOを返すListを作ってparSequenceしてunsafeRunSync()すれば後は上手いことやってくれるらしい。

Scala日本語の情報なんもなくてなんもわからんから、少しでも提供できればと思ってなんもわからんままに書いてます。
APIリリースの手順(2)

# Teratermを用いてプロジェクトのリリースを行う


## 1. Teratermのインストール

　① zipファイルを[ダウンロード](https://github.com/TeraTermProject/teraterm/releases)し、解凍する。
　② 「ttermpro」を開く。
　③ 言語設定より始まり、Teraterm セットアップウィザード通りに手中を進めていく。

　インストール先はドライブなどに設定する。(今回はDドライブに設置。)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2297939/36d4fb62-7caf-96ec-7ff4-64f841896e4c.png" width="400">

　「コンポ―ネメント」の」選択画面では、デフォルト値のまま「次へ」をクリックする。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2297939/f776eaad-fd9d-5d81-28a7-271309e7829e.png" width="400">

　全て選択し終えるとインストールを開始する。


## 2. Teratermの起動

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2297939/7fad9a63-c397-97d0-b8fb-d7a2cf6879ad.png" width="400">

　・ Host&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;：接続先ホストのアドレス（ドメイン名もしくはIPアドレス）
　・ Service&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;：SSH
　・ TCP port#&nbsp;&nbsp;&nbsp;&nbsp;：22
　・ SSH version&nbsp;：SSH2

　最初の接続時はホスト認証の確認を促されるため、「続行」をクリックし、先へ進む。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2297939/879eb36c-a908-e35f-f23f-10931289aeac.png" width="500">

　接続先のユーザー名とパスワードを入力し、「OK」をクリックする。

　・ User name&nbsp;&nbsp;：Linuxのユーザ名（仮：userName）
　・ Passphrase&nbsp;&nbsp;：Linuxのパスワード(設定している場合入力)

　　RSA/DSA/ECDSA/ED25519 の秘密キーを設定している場合は、
　「Use RSA/DSA/ECDSA/ED25519 key to log in」へ入力


```:Teraterm
Last login: Sun Jul 24 23:50:19 2022 from ip-172-16-1-201.ap-northeast-1.compute.internal

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
48 package(s) needed for security, out of 81 available
Run "sudo yum update" to apply all updates.
[xxxxxxx@ip-172-16-10-120 ~]$
[xxxxxxx@ip-172-16-10-120 ~]$ cd /var/sample
[xxxxxxx@ip-172-16-10-120 var]$ cd ./sample
[xxxxxxx@ip-172-16-10-120 sample]$ sudo mkdir 20220725
[xxxxxxx@ip-172-16-10-120 sample]$ sudo chown userName /var/sample/20220725
[xxxxxxx@ip-172-16-10-120 sample]$ cd ./20220725
[xxxxxxx@ip-172-16-10-120 20220725]$ ls
sample-0.0.1.jar
[xxxxxxx@ip-172-16-10-120 20220725]$ ps -ef | grep java
userName 1023     1  0 Mar03 ?        00:08:44 java -jar wms-0.0.1.jar
userName 6885 20325  0 07:53 pts/0    00:00:00 grep ⁻⁻color=auto java
[xxxxxxx@ip-172-16-10-120 20220725]$ kill 6885
[xxxxxxx@ip-172-16-10-120 20220725]$ nohup java -jar sample-0.0.1.jar > log.txt 2> error.txt < /dev/null &

```

Linuxコマンドを実行していく。
① `cd /var/sample`
② `cd ./sample`　・・・フォルダを見つける
③ `sudo mkdir 20220725`　・・・ファイルを作成
④ `sudo chown userName /var/sample/20220725`　・・・権限を付与
➄ `cd ./20220725`　・・・フォルダを見つける
⑥ `ps -ef | grep java`　・・・APIの動作を停止
⑦ `kill プロセスID` (上記では「プロセスID = 6885」)　・・・選択したAPIを終了
⑧ `nohup java -jar sample-0.0.1.jar > log.txt 2> error.txt < /dev/null &`
　　・・・再度APIを起動

最後に、開発環境のURLページを開き、APIに接続出来ているか確認を行う。


# おわりに
簡易的に書き示してしまっているので、より具体的にLinuxコマンドの意味等を知りたい場合は、別途調べてみてください！


## 参考
・New Connectionの詳細：https://teratermproject.github.io/manual/4/ja/menu/file-new.html
・Teraterm起動手順：https://eng-entrance.com/teraterm-install
・Linuxコマンド集：https://eng-entrance.com/linux-command-ps
Firebaseプロジェクトの作成(Flutter) 

## 概要
FlutterアプリとFirebaseを接続するための準備をします。
Firebaseの設定～Flutterプロジェクトのビルドが通るようになるまで

### 前提
デフォルトのカウントアプリを改変して作っているので、
諸々名前が違かったらごめんなさい！
メモ程度でしかないので、ご参考までに〜

## Android
![スクリーンショット 2022-06-30 18.13.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/ea1c6e5c-6ae0-13ae-c8a5-e70778cf7166.png)

/{PROJECT_NAME}/android/app/src/main/AndroidManifest.xml
にある
```
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="{PACKAGE_NAME}">
```

PACKAGE_NAMEをコピーし、パッケージ名に貼り付けし、その他は埋めずアプリの登録

![スクリーンショット 2022-06-30 18.15.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/a2fd7a33-d0b5-d46a-a5c4-6954bf1a6b54.png)


2 で設定ファイルのjsonをダウンロードし、
/{PROJECT_NAME}/android/app に配置

3 で記述のあるように、
![スクリーンショット 2022-06-30 18.33.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/a1cafb0d-cd3b-b919-983a-6180770feb8c.png)
必要なとこを
/{PROJECT_NAME}/android/build.gradle に追加する

![スクリーンショット 2022-06-30 18.24.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/62cecbcd-dd96-740a-458f-f147de7b14bb.png)


続いて同じ感じで
/{PROJECT_NAME}/android/app/build.gradle に追加する
![スクリーンショット 2022-06-30 18.29.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/40540465-ebb7-5ba9-f574-a8fa6437cd7f.png)

## iOS
※MacでXcodeが準備できてる人だけ！

VSCodeのターミナルを開いて、下記を実行
```terminal
open ios/Runner.xcworkspace
```
Runnerの中の「Bundle Identifier」の値をコピー
何も設定ない人は、[色々設定しておく](https://qiita.com/darashina37/items/e6523f041104d5555540)と後で便利かも
![スクリーンショット 2022-06-29 1.39.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/54cb121d-a7c0-395b-8656-00eea1035b69.png)

アプリを追加から、iOSを追加する
![スクリーンショット 2022-06-30 18.36.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/d99280e9-9121-4e88-8b41-3cf232438b8f.png)
Androidの時と同じでパッケージ名にコピーしてある値を貼り付け

設定ファイルダウンロードして、RunnerのRunnerの中に入れる
![スクリーンショット 2022-06-30 18.49.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/6c317561-3b9f-8439-559b-5a4d712e072c.png)
※入れる時「Create folder references」にすると、参照できないよみたいなエラーで私はなぜかビルドに失敗したので、「Create groups」にした方がいいかも
 ![スクリーンショット 2022-06-30 19.31.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462497/fee24e77-df17-e200-253f-e107221a55b7.png)


あとはスキップ


## 準備
[firebase_core](https://pub.dev/packages/firebase_core)をpubspec.ymlに追加
main.dartに下記を追加
```dart
// インポート追加！
import 'package:firebase_core/firebase_core.dart'; // add

// asyncにして、上の２行追加！
void main() async {
  WidgetsFlutterBinding.ensureInitialized(); // add
  await Firebase.initializeApp(); // add
  runApp(const MyApp());
}
```

## ビルド
ビルドできれば多分大丈夫！！
【備忘録】コマンドラインからGitを操作する方法

## はじめに
コマンドラインからのGit操作を備忘を兼ねてまとめます。

## 実行環境
os：Windows10
Pythonバージョン：3.10
Git：2.37.1

## GitHubにプロジェクトを追加
1. GitHubのサイトにログイン
2. リポジトリを作成
　2-1. リポジトリ名や公開、非公開を設定
3. リモートリポジトリのURLをコピー
　3-1. 新規で作成した場合は、Quick SetupページからURLをコピー
　3-2. 既に作成済みの場合は、リポジトリの「Code - HTTPS」からURLをコピー
4. コマンドラインのカレントディレクトリをローカルプロジェクトのパスに移動
5. 下記のコマンドを実施して、GitHub上にプロジェクトを追加
```:command
$ git init
#リポジトリの新規作成または既存リポジトリの初期化

$ git remote add origin [3でコピーしたURL]
#リモートリポジトリとローカルリポジトリを関連付ける。
#originがURLで指定したリポジトリ

$ git remote -v
#リモートリポジトリが関連付けられていることを確認する。

$ git add .
#ローカルリポジトリにファイルを追加する。（コミットの対象にする）
#「.」を指定するとカレントディレクトリ配下がすべて対象になる。
#「.」の部分をファイル名にすると指定したファイルが対象となる

$ git commit -m [コメント]
#変更内容をコミット（ローカルリポジトリに反映）する。
#commitした内容が次のpushのタイミングでGitHubに反映される。

$ git push origin master
#ローカルリポジトリの内容をリモートリポジトリに反映する。
```

## 参考
https://qiita.com/c6tower/items/62f27246f189131187fb
https://www.purpledice.jp/git-add/
・基本のコマンド
https://atmarkit.itmedia.co.jp/ait/articles/2003/12/news010.html
https://www.youtube.com/watch?v=T0KAE2kq2Xo
[Ruby] 配列の結合について

Rubyによる配列の結合処理について調べていみました。
間違っていればご指摘お願いします！

# 計測コード
```
require 'benchmark'

n = 10000
y = 10
hoge_array = Array.new(y, "hoge")

Benchmark.bm(10) do |r|
  r.report "flatten" do
    n.times{ [hoge_array, hoge_array, "hoge"].flatten }
  end

  r.report "splat" do
    n.times{ [*hoge_array, *hoge_array, "hoge"] }
  end

  r.report "+" do
    n.times{ hoge_array + hoge_array + ["hoge"] }
  end
end
```

# ベンチマーク
```
n = 10
y = 10
user     system      total        real
flatten      0.000055   0.000004   0.000059 (  0.000053)
splat        0.000027   0.000001   0.000028 (  0.000028)
+            0.000012   0.000001   0.000013 (  0.000012)

n = 1000
y = 1000
user     system      total        real
flatten      0.104978   0.005486   0.110464 (  0.112003)
splat        0.010389   0.009051   0.019440 (  0.019443)
+            0.008141   0.010716   0.018857 (  0.018884)


n = 10
y = 10000
user     system      total        real
flatten      0.009268   0.000414   0.009682 (  0.009682)
splat        0.001068   0.000962   0.002030 (  0.002049)
+            0.000805   0.000758   0.001563 (  0.001563)

n = 10000
y = 10
user     system      total        real
flatten      0.027865   0.001622   0.029487 (  0.029749)
splat        0.012830   0.000590   0.013420 (  0.013561)
+            0.005672   0.000507   0.006179 (  0.006228)
```

# まとめ
**`flatten　< splat < + `** の順に速度が速いことが分かりました！！
シンプルな結合の際は、迷わず＋の実装を選択していきたいと思いました。splat展開は、色々な場面で汎用的に使用できるのでありがたいです。flattenは、想像以上にパフォーマンスが悪かったので必要な場面のみ使用していきたと思います！
C++で愛用しているクラス状態遷移モデル

### はじめに

- C++のコンストラクタは、返り値を返せません。不便ではありませんか？私は不便と感じたため解決方法を20年模索し続けました。

### 状態遷移モデルで解決

まず結論から。全クラスが同じ状態遷移をする決まりにしました。そして状態遷移用のアクションとして、クラスにはコンストラクタとデストラクタの他に4つのメソッドを用意します。
```c++
    // クラスは状態遷移のための6つのアクションをもつ
    struct MyClass {
        MyClass();
        ~MyClass();
        bool init();
        bool start();
        bool stop();
        bool finalize();
    };
```
図の状態遷移をさせてクラスを運用します。コンストラクタとデストラクタのみだと`Plain`と`Ready`と`Running`が同一状態となりますが、これが複雑さを増す原因となっています。そこで準備完了状態の`Ready`と、メイン機能がワークしている状態`Running`を別状態とすることでシンプルに書けるようにしています。
![スクリーンショット 2022-08-01 13.21.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38013/f8d4be1f-798a-c35f-821f-e60e2e101e26.png)

### 説明

　クラスはコンストラクタでインスタント化された状態となり、デストラクタで無に帰します。すなわち「無の状態」と「インスタント化された状態」の2状態が標準で存在します。

　コンストラクタのみでクラス機能を立ち上げ完了しようとすると、返り値を使えず不便です。
また、機能の立ち上げ処理が重い場合などは、適切なタイミングになるまでコンストラクタを呼ばないように、`optional<クラス>`でコンストラクタのタイミングを調整しないといけなくなります。

　私はこの2状態を基本にすることに無理があると考え、4つに分割することでこの問題を解決しました。

  - [Plain] 単にインスタント化しただけでまだ何も立ち上げ処理をしていない状態
  - [Ready] リッチな立ち上げ処理を済ませた状態
  - [Running] 機能開始している状態
  - ([Destroyed] デストラクタが呼ばれ、メモリが開放された状態 = 「無の状態」)

状態遷移は前述の図の通りです。無の状態は開始終了状態として表現しています。

- 図中のアクションは以下の意味を持ちます。
  - init / finalize
    - ファイル操作やコネクションなど不確定要素のある処理
  - start / stop
    - メインの処理のオンオフ制御
  - constructor / destructor
    - エラーや例外を発生させない軽い処理
- 備考
  - 開始から終了への1方向ではなく、**stop-->start**や**finalize-->init**も正しく処理される。

### 具体例

　ネットワークにコネクトしてデータを待って処理する感じのサンプルコードを用意しました。ぜひ一部分でも真似して試してみてください。ルールがあることで全体がスッキリと書けるようになると思います。
私は大量にクラスを生み出していますが、80〜90%のクラスはこのモデルか、start/stopがない一部省略形で表現しています。

```c++
struct MyClass {
	MyClass() = default;
	~MyClass() = default;
	bool init(const path& config, const string& host)
	{
		initialized_ = myRead(config) && myConnect(host) && myKickLoop();
		return initialized_;
	}
	bool start()
	{
		if (initialized_ && !started_)
			started_ = true;
		return started_;
	}
	bool stop()
	{
		if (initialized_ && started_)
			started_ = false;
		return !started_;
	}
	bool finalize()
	{
		bool noErr = myJoinLoop();
		noErr = myDisconnect() && noErr;
		noErr = myWrite() && noErr;
		initialized_ = false;
		return noErr;
	}

private:
	bool initialized_{ false };
	bool started_{ false };
	bool eventLoop(const EventType& event)
	{
		if (initialized_ && started_)
			myProcess(event);
	}
};
```
この`MyClass`クラスを、例えばこんな感じに利用します。
```c++
int main()
{
	bool noErr = true;
	MyClass engine;
	noErr = engine.init("./config.json", "localhost");
	noErr = noErr && engine.start();
	if (noErr) {
		// ...
	}

	noErr = engine.stop() && noErr;
	noErr = engine.finalize() && noErr;
	return (noErr ? 0 : 1);
}
```

この例の`myJoinLoop()`や`myDisconnect()`など終了系メソッドは、正常時は何度呼んでもダブって処理することのないメソッドをイメージしています。(コメントの指摘を受け修正しました。 2022/08/01)

以上です。

### 補足
- 上の例のようにクラス定義に`class`を使わないことが多いです。`public:`の1行を書くのが無駄だからです。デフォルトが`public`な`struct`が、この1点において圧倒的に優位だと思います。
JINS MEMEのモーションをリアルタイム表示するWebアプリ

NALGO研究部の笹川です。

[前回の記事](https://qiita.com/tsasagawa/items/16ed6f7263a43f9ca0b1)では、JINS MEMEから送信される情報をWebSocketでリアルタイム取得できることを確認しました。  
今回は、取得した情報を使ってメガネ(顔)の角度をリアルタイムに表示してみたいと思います。

## 動作のようす

![anim.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238582/db04f9cf-87be-e167-00ff-833692699fb3.gif)

(顔認識ではないので、この状態で動きます！)

## アプリの構成

前回の記事ではひとまずPythonを使いましたが、JINS MEMEドキュメント側で公開されている[モーショントラッキング前処理例](https://jins-meme.github.io/sdkdoc2/basics/motion-tracking-howto.html)がJavaScriptだったため、今後これを取り込む可能性を考えてJavaScriptを使おうと思いました。(Pythonに書き直すこともできるが手間なので)

またせっかくなので、JavaScript実行環境は使い慣れたNode.jsではなく新しいdenoを使ってみることにしました。もちろんTypeScriptで書きます。

以下、動作構成です。

![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238582/b18471f3-e321-f0de-b2d1-5447052d06f0.png)

deno(TypeScript)プログラムの本体は以下の動作をします。
* ブラウザーからのアクセスに対してHTMLを返す
* ブラウザーとLoggerアプリからのWebSocket接続をそれぞれ待ち受け、両方接続した後はLoggerからのメッセージをブラウザーに中継する
  * 中継する際に加工も可。現在は接続時点の値が真正面になるように角度を補正しています。将来的には前述のモーショントラッキング前処理を取り込むことができます。

## プログラム

今回作成したプログラムは以下で公開しています。

https://github.com/sasagawa-toru/deno-jinsmeme-server/tree/develop
【Rails】外部APIを使う方法

# 初めに

`Rails`で外部 API を利用するには、gem や`NET::HTTP`を使う方法がありますが、今回は`Ruby`にある`NET::HTTP`を使います。

# HTTP リクエストの仕方

以下は、`Net::HTTP`を利用して[PokeAPI](https://pokeapi.co/)からポケモンのデータを取得する例です。
`https://pokeapi.co/api/v2/pokemon/:id`に対して、`GET`メソッドでリクエストを送信します。
そして、json データを受け取ります。

```ruby:api_controller.rb
require 'net/http'

class ApiController < ApplicationController
  def show
    pokemon_id = params[:id]
    uri = URI.parse('https://pokeapi.co')
    # URI.parseは、URIオブジェクトを生成するメソッドです。
    http_client= Net::HTTP.new(uri.host,uri.port)
    # HTTPクライアントを生成し、引数にホスト名とポート番号を指定しています。
    get_request = Net::HTTP::Get.new("/api/v2/pokemon/#{pokemon_id}", 'Content-Type' => 'application/json')
    # Net::HTTP::Getは、HTTPのGETリクエストを表すクラスです。
    # 引数にリクエストするpathとヘッダーを指定しています。
    http_client.use_ssl = true
    # httpsで通信をする場合はuse_sslをtrueにする必要がある
    response = http_client.request(get_request)
    # requestメソッドの引数にNet:HTTP:Responseオブジェクトをあたえます。
    # responseには、HTTPレスポンスが格納されている
    @data = JSON.parse(response.body)
    # @responseはJSON形式になっているので、JSON.parseでHashに変換する必要がある
  end
end

```

# 参考

- [Net::HTTP::Get - Ruby リファレンス](https://docs.ruby-lang.org/ja/latest/class/Net=3a=3aHTTP=3a=3aGet.html)
- [Net::HTTP - Ruby リファレンス](https://docs.ruby-lang.org/ja/latest/class/Net=3a=3aHTTP.html)
- [pokeAPI](https://pokeapi.co/docs/v2)
Terraformで一部のリソースだけ削除したい｜テスト環境での利用

今回ご紹介する方法は基本的に本番環境では非推奨とされているようです。
テスト環境などで色々試しているという場面でしたら大丈夫だと思います。

# Terraformで一部のリソースを削除するコマンド
以下のようにターゲットオプションを指定してリソースの２つをドット繋ぎで指定します。

```terraformDestroy.sh

% terraform destroy -target=aws_s3_bucket.test-bucket

```

ちなみにこの削除したいリソースは以下のように指定されています。

```testbucket.tr

resource "aws_s3_bucket" "test-bucket" {
  bucket = "test-bucket"
}

```

# エラー
コマンド指定を間違えて以下のようなエラーが出ましたのでそちらも載せておきます。

```error.sh

% terraform destroy -target="test-bucket"
Error: Invalid target "aws_s3_bucket"
│ 
│ Resource specification must include a resource type and name.

% terraform destroy -target=aws_s3_bucket -target=test-bucket
Error: Invalid target "aws_s3_bucket"
│ 
│ Resource specification must include a resource type and name.

```

ちなみに今回のようにS3を削除する場合はバケットが空でないと削除できないため以下のようなエラーが出ます。

```error.sh

Error: deleting S3 Bucket (test-bucket): BucketNotEmpty: The bucket you tried to delete is not empty

```

コンソールからバケットの中身を削除するとTerraformからも削除できます。

# Warning
以下はterraform destroy -target=aws_s3_bucket.test-bucketを実行した際に表示されます。ここで「このコマンドは日常使いはしないでくださいね」と警告してくれています。

```warning.sh

│ Warning: Resource targeting is in effect
│ 
│ You are creating a plan with the -target option, which means that the result of this plan may not represent all of the changes requested by the current configuration.
│ 
│ The -target option is not for routine use, and is provided only for exceptional situations such as recovering from errors or mistakes, or when Terraform specifically suggests to use it as part of an error
│ message.

```
Excelのスライサーでピボットテーブルで表示する値を切り替える

ピボットテーブルでのレポートを見る際に、売上金額が知りたい人と粗利金額（売上原価）が知りたい人に分かれることがあります。<br>２つの値を表示するとレポートが見づらくなることがあるので、"値切替スライサー"を作成して、売上⇔粗利を切り替えられるようにしました。

※元は下記のページを参考にしましたが、何度も使うので覚えるために記載しました。
https://modernexcel7.hatenablog.com/entry/ParameterTable


<h2>レポートの準備</h2>

下記の売上粗利のテーブルを用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/5568c4f2-2d80-8c75-f944-5728d28f33f7.png)

ピボットテーブルの作成を行い、"このデータをデータモデルに追加する"にチェックしてＯＫをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/c145ae81-a5d6-d80a-82a8-0d4141053d32.png)

※データモデルに追加をすると、リレーションを作ったりメジャーを作成したり色々なことができます。

<h2>空のクエリで作成から値切替スライサーを作成</h2>

以下の手順で空のクエリを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/59d4b851-5e22-6a16-842b-a89567345086.png)

数式を入力する箇所に、= #table({"集計タイプ"}, {{"売上"},{"粗利"}})と入力します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/b20f6d0c-3e8b-3d25-b215-00de637e11fb.png)

閉じて読み込むをクリックすると、先ほどの工程で作成されたテーブルが出てきます。、先ほど同様にピボットテーブルの作成を行い、"このデータをデータモデルに追加する"にチェックしてＯＫをクリック。

この時点でピボットテーブルとスライサーは見かけ上出来上がっていますが何も機能していないので、この後に値の切替機能を付与します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/cbd023d4-0809-eb33-520f-280878a7da30.png)


<h2>メジャーを作成し、スライサーを使って値を切り替えられるようにする。</h2>

ピボットテーブルのフィールドに下記のような表示がされていますが、問題ないので無視します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/bcb2d849-52f2-5588-68a0-931c1055ca14.png)


①メジャーを以下内容で作成します。（名前：集計）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/ae66cbb4-a853-01e1-70de-4bc76386b093.png)

②別のメジャーを作成します。（名前：値）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/e28355ff-58f7-73d4-6caf-71a7775faf07.png)


メジャー名：集計は、それぞれ項目がスライサーで表示されているか否か（表示されてれば1を返す)を判定する変数です。
メジャー名：値は集計スライサーに連動しており、"粗利"が選択されていれば粗利の値を返し、"売上"が選択されていれば売上の値を返す変数です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624137/650b8b4e-1d1a-8d92-661f-5f9b71a22808.png)

※スライサーがどちらの項目も選択されている場合は、値は空白になります。

<h2>まとめ</h2>
この画像の数式等をそのままコピーしても使用できないので、値の名前やピボットテーブルの参照先はそれぞれのレポートに合わせて変更してください。