OmniAICreator/Qiita-1.07M huggingface dataset:
cloudwatchのログから攻撃かどうかを判断する

# 背景
- 保守を行っている案件にて警報が発生したため、ログの調査を行う
- 可能性としてはアプリの不具合か、悪意のある攻撃の可能性がある
- 対応としては、アプリの不具合の場合は即時対応、攻撃の場合は様子をみることにする
# 攻撃かどうかの判別
例
1.12.123.123 - - [15/Nov/2023:05:30:46 +0900] "GET /hoge/hoge.png HTTP/1.1" 404 8440 "-" 
"hogebrowser" "12.12.12.12"

【アクセス元のip】- - 【日付】"【リクエストの種類】/【リクエストパス】【リクエストパラメータ―】
【レスポンスのバイト数】 【リファラー】【ブラウザ名】【ip】

- アクセス元 （例の「1.12.123.123」）
  - 案件にもよるがelbを使用している場合、elbのipが表示されるため参考にはならない
- リクエストパス
    - 要チェック
    - てきとうなパス（正常に使用した際に、使用しないパス）である場合、悪意のあるユーザーの可能性が高い
    - 正常なパスが表示されていてもエラーが出ている場合はアプリの問題⇒要修正
- リクエストパラメータ
    - 200系、300系は正常。400系、500系はエラーコード
    - 今回の例の場合、404となっているためエラー。調査が必要
- レスポンスのバイト数
    - 今回見る必要なし
    - 数字が表示されるため、リクエストパラメータと混同しないことだけ注意
- リファラー
    - 要注意
    - 経由したurlを表示している
    - 今回の例の場合「-」となっているため、直接urlを入力している
    - 普通にアプリを使用していて、url入力をする機会は少ないため、攻撃の可能性がある
- ブラウザ（例の「hogebrowser」）
    - 使用しているブラウザ
    - chromeやsafariなど
    - 海外ブラウザの場合、攻撃の可能性が高い
    - 参考程度に考える
- ip
    - elbを使用している場合に表示される
    - アクセス元のipが表示されるため、elbを使用している場合はこちらをip検索する
    - 海外の場合、攻撃の可能性が高い
    - 国内からのアクセスで、実際にあった例
        - 国内の同じipから何度も攻撃があった
        - そのipを調べたところ問題はなかった
        - 攻撃のための踏み台にされてしまっている可能性が高い
Ajaxについて【自分用】

### 【概要】
---
Ajaxについて。になります。
前回も記事を執筆したのですが、自分の中の理解度チェックも兼ねて再度執筆します。

### 【環境】
---
・rails7系

### 【turbo_streamとは】
---
「turbo_stream」とは以下の機能を持っております。

・複数箇所のHTML要素を更新することが可能。
・HTML要素の追加・削除が可能。

ちなみに、これと対をなすものが「Turbo Frames」になります。
違いは下記です。

・<turbo Frames>タグで囲った1箇所のみ更新可能。
・HTML要素の置換しか対応できない。

### 【基本的な使用方法】
---

### 【書き方】
---

```ruby
#<%# turbo_stream.<アクション名> <ターゲットのid>, <追加するオブジェクト> %>
<%= turbo_stream.prepend "cats", @cat %>
```

実際は下記を省略したものですが、意味だけ抑えておく。でもいいと思います。

```ruby
<%= turbo_stream.prepend "cats" do %>
  <%= render partial: "cates/cat", #renderは省略可能。
             locals: { cat: @cat } %> #renderのオプションも省略可能。
<% end %>
```

### 【7つのメソッド】
---

下記は基本形のメソッドです。

|構文|意味|
|:-:|:-:|
|prepend|先頭に要素を追加する。|
|append|末尾に追加する。|
|before|指定したturbo frameの前に要素を追加する|
|after|beforeの逆|
|replace |ターゲット要素も含めて更新|
|update|ターゲットの要素のコンテンツのみ更新|
|remove|削除する|

一つ、例にとって見てみましょう。

①ajax化したいviewファイルを作成
```xxx.controller.rb
def create
  @message = Message.new(message_params)
  if @message.save
    render turbo_stream: [
      turbo_stream.replace("new_message_form", partial: "form", locals: { message: Message.new }),
      turbo_stream.append("message_list", partial: "message", locals: { message: @message })
    ]
#2つ以上の要素を使用する場合は、配列で表示。
#1つの場合は、省略可能。
  else
    # エラーメッセージを返すなどの処理
  end
end
```

②
```new.html.erb
<h1>Create a New Message</h1>

<!-- メッセージフォーム -->
<div id="new_message_form">
  <%= turbo_frame_tag "new_message_form" do %>
    <%= render "form", message: Message.new %>
  <% end %>
</div>

<!-- メッセージリスト -->
<div id="message_list">
  <%= turbo_frame_tag "message_list" do %>
    <%= render @messages %>
  <% end %>
</div>
```

③
```app/views/messages/create.turbo_stream.erb
<%= turbo_stream.replace "new_message_form", partial: "form", locals: { message: Message.new } %>
<%= turbo_stream.append "message_list", partial: "message", locals: { message: @message } %>
```

### 【引用】
---
https://zenn.dev/shita1112/books/cat-hotwire-turbo/viewer/turbo-streams-fetch
KubernetesConceptsとLinuxShell tips文章読む

Kubernetes Concepts With Examples part1
https://www.techmanyu.com/kubernetes-concepts-with-examples-part-1-for-interview-prep-43aae6991ac4

Kubernetes Concepts With Examples part2
https://www.techmanyu.com/kubernetes-concepts-with-examples-part-2-for-interview-prep-fe2fd453584d

Linuxで動かすスクリプトの1行目の設定
https://qiita.com/yumenomatayume/items/bd36f3c51cce33191f51

[set]の使い方一つ
https://atmarkit.itmedia.co.jp/ait/articles/1805/18/news038.html

Zookeeper详解(01) -概述
https://www.cnblogs.com/meanshift/p/15732816.html
AWS SAA-C03に一発合格した話

# はじめに
AWS SAA-C03に一発合格できました。
これから受験する方の参考になればと思い学習内容とかをまとめてみました。

:::note alert
実際に受験する際はAWS認定やPearsonVUEで最新の情報を確認してください。
:::

# プロフィール
* 業界4年目
* phpとかjsとか触り始めて2年目
* AWSの使用経験なし
* GCEなら個人的にちょっと触った程度
* 基本情報と応用情報は持ってる

# SAAって何？
[AWS Certified Solutions Architect - Associate](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)
> AWS 認定ソリューションアーキテクト – アソシエイトは、幅広い AWS のサービスにわたる AWS テクノロジーに関する知識とスキルを示します。この認定の焦点は、コストとパフォーマンスが最適化されたソリューションの設計にあり、AWS Well-Architected フレームワークに関する深い理解を示します。この認定は、認定された個人のキャリアプロファイルと収益を向上させ、利害関係者やお客様とのやり取りにおける信頼性と自信を高めます。

だそうです。特に実務で使ってなくても取れました。

# でもお高いんでしょう？
AWS認定から半額のクーポンが来てました。
2023/10/31まで使えるそうです。

1つ気になったのは、公式に150USDって書いてましたがレートに関係なく日本円では固定の金額なんでしょうか。
明細には税込み16,500円って書いてあったような...？

# テストセンター or オンライン試験
個人的にはテストセンターで受験することをお勧めします。
途中で離席できないとか、一人きりになれる空間を作らないといけないとか制約があるようです。
考えるの面倒な人はテストセンターで受けるといいと思います。

# 勉強期間
だらだらとやってしまっていた期間もありますが、試験前に集中して勉強した期間で言うと約1か月です。
09/17に受験しましたが、予約したのが09/01でした。
先に予約してから勉強を始めることをお勧めします。

# 教材
一夜漬けテキストみたいな本とPing-tを使いました。
公式が色々コンテンツを出してるみたいですが、動画教材ってのが苦手なもので全く見てません。
先にテキストをパラパラ見ていく感じでもいいのでざっと読んでそれからPing-tの問題を順番に進めていくのがいいかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569186/da739512-9963-2a39-fc70-8532b899021b.png)
僕にしては結構ちゃんとやった気がします。
Ping-tの問題をしっかりやっていければ概ね対策できると思います。

# 結果の通知
受験から5営業日以内に結果がメールで届くそうです。
僕の場合は09/17の午前中に受験して同日の夕方には通知が来ました。早い。

# スコア
720点以上で合格なので結構ギリギリでした。
受けた直後には落ちたとすら思ったので嬉しかったです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569186/6edb23b8-4c08-6c9d-89fa-c8d4da542537.png)

# 当日の持ち物
受付で本人確認をされます。僕は免許証とマイナンバーを提出しました。
そのうち片方は受験スペースに持ち込みます。
トイレ休憩なんかで外に出て再入室する時の確認用みたいです。
受験登録時はローマ字で大丈夫ですが、本人確認書類と氏名が一致している必要があります。

[本人確認書類について](https://www.pearsonvue.co.jp/Test-takers/Tutorial/Identification-1S.aspx)

# 感想
* 回りくどい表現の問題文が多かった
* Ping-t の模擬試験よりも難しかった
* Ping-tにある「Well-Architected Frameworkに基づいた設計」と同等かそれ以上の難易度だった
.NET8用のDevContainerを作ってみる

## はじめに

ASP.NET Core 8.0がRCになりましたね。
DevContainerで8.0 RCを試そうと思いましたが、残念ながら7.0までしか対応していません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/daccee9a-b600-e13a-4524-2daecf9d1d8c.png)
これまで通りDockerでSDKのコンテナを起動してもよいのですが、せっかくなのでVSCodeのDevContainerでカスタムコンテナを作ってみます。

## .NET 7.0のDevContainerをベースに.NET 8.0のDevContainerを作る
簡単なのは.NET7.0のDevContainerをカスタマイズする方法です。
とりあえず適当な場所にフォルダーを作り、下記の2つのファイルを作ります。

```shell
$ mkdir -p app/.devcontainer/
$ touch app/.devcontainer/devcontainer.json
$ touch app/.devcontainer/Dockerfile
```

```.devcontainer/devcontainer.json
{
	"name": "C# (.NET)",
	"build": {
		"dockerfile": "Dockerfile"
	},
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-dotnettools.csharp"
			]
		}
	},
	"remoteUser": "vscode"
}
```

```.devcontainer/Dockerfile
FROM mcr.microsoft.com/vscode/devcontainers/dotnet:0-7.0

ARG NODE_VERSION="--lts"
RUN su vscode -c "umask 0002 && . /usr/local/share/nvm/nvm.sh && nvm install ${NODE_VERSION} 2>&1"

WORKDIR /installer
RUN curl -L https://aka.ms/install-dotnet-preview -o install-dotnet-preview.sh
RUN sudo bash install-dotnet-preview.sh
```

できたらCtrl+Shift+Pからコマンドパレットを開いて、`開発コンテナー：コンテナでフォルダーを開く`から現在のフォルダー（`./app`）を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/0a1947be-c7bb-a8a2-6074-656db539b8f0.png)
少し待つとコンテナのビルドが終わり.NET8.0 RCがインストールされたDevContainerが起動します。
7.0のDevContainerをベースにしているのでSDKが複数インストールされていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/e44c8bfb-d33b-5ec7-7af5-2f741e30f858.png)

## Blazorのアプリを作成してデバックしてみる

プロジェクトテンプレートに`blazor`を指定してプロジェクトを作ります。

```sh
$ dotnet new blazor
The template "Blazor Web App" was created successfully.
This template contains technologies from parties other than Microsoft, see https://aka.ms/aspnetcore/8.0-third-party-notices for details.

Processing post-creation actions...
Restoring /workspaces/app/app.csproj:
  Determining projects to restore...
  Restored /workspaces/app/app.csproj (in 537 ms).
Restore succeeded.
```

Home.razorに現在のバージョンを表示します。

```diff:app/Components/Pages/Home.razor
@page "/"

<PageTitle>Home</PageTitle>

<h1>Hello, world!</h1>

Welcome to your new app.

+<p>@System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription</p>
```

F5を押してデバックを開始すると。いつもの証明書のエラーが出るのでインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/1d837921-1493-0330-df48-d3bd44922f7e.png)

```sh
$ dotnet dev-certs https --trust
Trusting the HTTPS development certificate was requested. Trusting the certificate on Linux distributions automatically is not supported. For instructions on how to manually trust the certificate on your Linux distribution, go to https://aka.ms/dev-certs-trust
The HTTPS developer certificate was generated successfully.
```

改めてデバックを開始すると、ブラウザーが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/aa50aed8-932e-bd04-1bce-2f256abfb5d2.png)
もちろんVSCodeでブレークポイントを設定すればデバックできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/edf613d5-9502-d2c6-3776-0ebc62a37677.png)

## おわりに
DevContainer楽ですね。
せんせー、リキッドハイドロジェルってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、リキッドハイドロジェルってなに？

# リキッドハイドロジェルとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## リキッドハイドロジェルって何？

みんな、ゼリーを食べたことある？リキッドハイドロジェルは、ちょっとゼリーみたいなものなんだよ。でも食べるのではなくて、特殊な用途のために使うんだ。

## どういうこと？

このリキッドハイドロジェルは、水と一緒になって柔らかくてしっとりした形を作る材料なんだよ。そして、このゼリーみたいなものは、たくさんの水を保持できる特技を持っているんだ。

## どうしてそれがすごいの？

これがすごいのは、そのゼリーみたいな特性のおかげで、たくさんの用途で使えるんだよ。例えば、医者さんが使うバンドエイドに入れて、怪我をしたところを冷やしたり保護したりするのに使えるんだよ。

## だから、リキッドハイドロジェルってなに？

リキッドハイドロジェルは、水と一緒になってゼリーのようになる特殊な材料で、様々な場面で役立つ素晴らしいものなんだよ。

# まとめ

リキッドハイドロジェルは、水をたくさん吸収してゼリーみたいになる素材で、それがたくさんの用途で使えるという特技を持っているんだ。だから、それはとてもすごくて、役立つものなんだよ。
せんせー、クアンタムキー配布ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、クアンタムキー配布ってなに？

# クアンタムキー配布とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## クアンタムキー配布って何？

みんな、秘密の合言葉を作ったことある？クアンタムキー配布は、大人が使うすごく特別な「秘密の合言葉」を作る方法なんだよ。

## どういうこと？

この「特別な秘密の合言葉」は、コンピュータがお話しする時に使うんだ。でも、この合言葉はすごく特別で、ほかの人が知ってしまうと新しい合言葉に変わってしまうんだよ。

## どうしてそれがすごいの？

これがすごいのは、合言葉が変わってしまうので、他の人が秘密のお話を聞いてしまうことがないんだよ。だから、大事な話も安全にできるんだ。

## だから、クアンタムキー配布ってなに？

クアンタムキー配布は、コンピュータがお話しする時に使う特別な「秘密の合言葉」を作って、安全にお話しできるようにする方法なんだよ。

# まとめ

クアンタムキー配布は、大人が使う特別な「秘密の合言葉」を作る方法で、これがあると大事なお話も安全にできるんだよ。だから、これはすごく大切な方法なんだよ。
【ChatGPT無】役割（ロール）を変えたら、ChatGPTの回答は変わるのか


　どうも、カーブミラーです。

　今回は、役割（ロール）を変えたら、ChatGPTの回答は、どの程度、変わるのか？、をやってみます。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　まずは、
　　基本となるPromptです。
　　　ネタは、薬機法です。
```Text:基本Prompt
# 目的
薬機法について教えてください。
```
　このPromptに対して
　　ChatGPTの回答がこちら。
```Text:基本の回答
薬機法（やっきほう）は、日本の法律であり、医薬品や医療機器の製造、販売、輸入、使用に関する規制を定めています。主な目的は、国民の健康と安全を保護し、医療機器と医薬品の品質と有効性を確保することです。

薬機法は、医薬品や医療機器の製造業者や販売業者に対する規制、製品の承認プロセス、品質管理、安全性評価、広告規制、薬事監視などに関する規定を含んでいます。また、医療機器の適切な使用と保守に関する指針も提供しています。

薬機法は、医療分野における製品の安全性と有効性を確保するために重要な役割を果たしており、日本の医療制度の一部を構成しています。法律の詳細な内容や最新の規制については、厚生労働省などの公式情報源を確認することをお勧めします。
```
　ここからは、
　　Promptとその回答を
　　　一緒に出します。

```Text:何も知らない人
***User***
# 目的
薬機法について教えてください。

# 役割
あなたは、薬機法について、何も知らない人です。

***ChatGPT***
薬機法（やっきほう）は、日本の医薬品の製造、販売、品質管理に関する法律です。この法律の目的は、医薬品の安全性と有効性を確保し、公衆の健康を守ることです。薬機法は医薬品の製造業者や販売業者に対する規制を定め、医薬品の品質や効能に関する基準を設けています。また、医薬品の製造・販売に関する許可制度も含まれており、法律違反には厳しい罰則が設けられています。薬機法は日本の医療制度において重要な法律の一つであり、医薬品の安全性を確保し、患者の健康を守るために存在しています。
```

```Text:コンピューター学者
***User***
# 目的
薬機法について教えてください。

# 役割
あなたは、コンピューター学者です。

***ChatGPT***
薬機法（やくきほう）は、日本の医薬品の安全性と有効性を確保し、適切な品質管理を行うための法律です。この法律は、医薬品や医療機器の製造、販売、輸入、流通に関する規制や基準を定めています。薬機法の主な目的は、患者の安全を保護し、医療品の品質を維持することです。

薬機法には、医薬品や医療機器の承認プロセス、製造工場の規制、品質管理、販売業者の登録、医療機器の安全性評価などが含まれます。また、違反した場合には罰則が規定されており、法令遵守が求められます。

薬機法について詳細な情報や具体的な規定について知りたい場合は、日本の厚生労働省の公式ウェブサイトや専門家の助言をご参考にすることが重要です。
***
```
```Text:薬機法専門ライター
***User***
# 目的
薬機法について教えてください。

# 役割
あなたは、薬機法専門の記事を書くライターです。

***ChatGPT***
薬機法（やっきほう）は、日本の医薬品や医療機器に関する法律です。この法律の目的は、医薬品や医療機器の安全性、有効性、品質を確保し、国民の健康を守ることです。薬機法は以下の主要なポイントを含んでいます：

1. **医薬品の規制**: 薬機法は、医薬品の製造、販売、使用に関する規制を定めています。医薬品は厳格に評価され、安全性と有効性が確保されなければなりません。

2. **医療機器の規制**: 医療機器も薬機法の対象であり、安全性や品質が確保されるよう規制されています。医療機器は患者の安全性に影響を及ぼす可能性があるため、厳格な審査が行われます。

3. **製造業者の登録**: 医薬品や医療機器の製造業者は、薬機法に基づいて登録しなければなりません。これにより、製造プロセスの品質管理が強化されます。

4. **薬事監視**: 薬機法に基づいて、医薬品や医療機器の市場監視が行われ、安全性に問題がある製品が早期に発見され対処されます。

5. **医療関係者への情報提供**: 医療関係者に対して、正確な情報提供が求められます。これは患者の適切な治療と安全性を確保するために重要です。

薬機法は日本の医療制度において非常に重要な役割を果たしており、国民の健康と安全を守るために厳格に運用されています。
```
***
　このとおり、
　　三者三様ではあるのですが、
　　　何も知らない人が、
　　　　きちんと説明しちゃ
　　　　　ダメでしょw

　コンピューター学者も
　　いくらなんでも
　　　詳し過ぎw

　しかも、ライターは、
　　記事を書いてくるしw
***
　これは、設問がイケなかった？

　そこで、
　　上記の三者に
　　　「桃太郎の要約」を
　　　　頼んでみました。

　三者の回答だけを
　　示します。

```Text:何も知らない人
桃太郎は、日本の民話で、桃から生まれた少年が鬼と戦う物語です。
```

```Text:コンピューター学者
もちろん、桃太郎の要約をお手伝いします。桃太郎は日本の有名な民話で、簡単に要約すると、桃から生まれた桃太郎が鬼と戦う物語です。桃太郎は仲間を集めて鬼を退治し、平和を取り戻すという冒険の物語です。詳細な要約が必要であれば、具体的な部分についてお聞かせいただければと思います。
```

```Text:薬機法専門ライター
もちろん、薬機法に関する記事を書くお手伝いをします。まずは「桃太郎」に関する具体的な情報や要約の詳細を教えていただけますか？どのような情報を含めるべきでしょうか？
```

　今度は、
　　結果に、
　　　顕著な差が出ましたね。

　何も知らない人でも、
　　桃太郎は知っているのは、
　　　わかる、として。

　コンピューター学者が
　　それっぽい感じで答えてるw

　ライターは、
　　何を勘違いしたのか、
　　　薬機法の記事を
　　　　書こうとしている？
***
　まぁ、
　　どんな答えを得たいかによって、
　　　指定する役割は、
　　　　変えるべきなのでしょうね。

　つまり、
　　目的と合わない
　　　役割を与えても
　　　　得たい回答には、
　　　　　たどり着けない。

　みなさんも
　　この点に気を付けて、
　　　役割を指定してください。

　以上。
從國際學校踏向美國大學：關鍵考試與簽證要點


對於[國際學校](https://www.apexcharity.org/news/3/82)的學生來說，[出國留學](https://www.apexcharity.org/news/3/83)可能是一生中的轉折點。從熟悉的教室走向國際舞台，每一步都充滿挑戰與期待。這裡，我們將深入探討從SAT考試到獲得美國簽證的整個過程。

1. 國際學校的培養

學生在國際學校所獲得的全球視野和多語言能力是他們的一大資產。不僅學習內容與國際標準接軌，學生還經常有機會參加各種國際交流活動，這對於日後進入美國大學非常有幫助。

2. 邁向SAT的第一步

想要申請美國的本科教育，[SAT](https://www.apexcharity.org/news/3/84)考試幾乎是不可或缺的。這考試不僅評估學生的數學和英語能力，更試圖瞭解他們的邏輯思考和問題解決技巧。許多學生會選擇參加培訓課程或找導師輔導，以確保在考試中獲得理想的成績。

3. 踏上申請[美國簽證](https://www.apexcharity.org/news/3/94)的旅程

被美國學校錄取後，學生需要開始他們的簽證申請流程。以下是一些主要步驟：

確認I-20表格: 這是學生證明已被美國學校接受的文件。確保所有資料都是正確無誤的。

支付SEVIS費用: 這是一筆對於國際學生的必要費用，確保能夠在美國合法學習。

簽證面試: 在當地的美國領事館或大使館安排簽證面試，並攜帶所有必要的文件和證明。

確認簽證: 獲得簽證後，就可以安排前往美國的行程了。

赴美留學是一條既刺激又具挑戰性的路。但只要有適當的準備和決心，國際學校的學生絕對可以在美國大學裡繼續他們的學術旅程，並開創自己的未來。
【UiPath】Cloud Orchestratorにおけるロールと権限の変更について

## 概要
お客様より多くのお問合せを頂いておりますAutomation Cloud上のOrchestrator（以下、Cloud Orchestrator）におけるロールと権限の変更についてご案内します。
※注：私の投稿する内容は個人の見解であり、所属団体を代表するものではありません。

## 変更内容
2023年8月23日の更新によりCloud Orchestratorのロールと権限が変更されました。主な変更は以下の2つです。
<dl>
  <dt>パブリッシュ権限の削除</dt>
  <dd>「Automation User」と「Allow to be Automation User」</dd>
  <dt>新しいロールの追加</dt>
  <dd>「Automation Publisher」と「Allow to be Automation Publisher」<br>「Automation Developer」と「Allow to be Automation Developer」</dd>
</dl>

:::note warn
「Automation User」と「Allow to be Automation User」をご利用の場合、従来実行できていたStudioからCloud Orchestratorへのパブリッシュが権限不足でできなくなります。
:::


参考：
Orchestrator Automation Cloud リリース ノートー2023年8月23日ー
https://docs.uipath.com/ja/orchestrator/automation-cloud/latest/release-notes/release-notes-august-2023#roles-and-permissions-changes

上記の詳細につきましては英文記事で恐縮ですが以下フォーラム記事でも弊社からご案内しております。

参考：
Important updates in Orchestrator roles and permissions
https://forum.uipath.com/t/important-updates-in-orchestrator-roles-and-permissions/567082

## ロールと権限の差分
* Automation Userロール
これまで(例:オンプレミス版Orchestrator v23.4系で)存在していた、フォルダーパッケージの作成権限が削除されました。

![2023-09-19_10h35_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334078/d0fec8b8-7cf3-9546-24b1-6185c8b096f6.png)

* Allow to Automation Userロール
これまで(例:オンプレミス版Orchestrator v23.4系で)存在していた、パッケージの作成権限が削除されました。
![2023-09-19_10h40_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334078/7abb50f5-cd4d-2450-19f0-08df75930d3a.png)

* Automation Publisherロール
パッケージのパブリッシュに特化した新規のフォルダーロールです。

![2023-09-19_10h43_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334078/481869d6-f3ca-c798-d39c-2bc0096142f2.png)

* Allow to be Automation Publisherロール
パッケージのパブリッシュに特化した新規のテナントロールです。
![2023-09-19_10h47_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334078/eb1803e1-38de-731b-91aa-a740a9ebf691.png)

* Automation Developerロール
ジョブ実行やパッケージパブリッシュ等開発に適した新規のフォルダーロールです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334078/2302cf04-0a59-468c-1828-cd040e7f626f.png)


* Allow to be Automation Developerロール
パッケージパブリッシュ等開発に適した新規のテナントロールです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334078/e176297d-523c-a467-d027-b86cb6151e33.png)


## パブリッシュが行えない事象の回避策

「Automation User」ロールや、「Allow to be Automation User」ロールをご利用でパブリッシュを実行したい場合、パッケージの作成権限が付与されたロールを組み合わせることでご対応ください。
例）「Automation User」＋「Automation Publisher」

## おわりに
本記事で紹介した内容が皆様のお役に立てれば幸いです。
【XCode15】SwiftUIのViewを11個以上並べる事が可能に

# XCode14.3.1におけるViewの最大数
XCode14.3.1ではSwiftUIの`HStack`、`VStack`、`ZStack`、`Group`等の中で
Viewを11個以上並べると`Extra argument in call`や`No exact matches in reference to static method 'buildExpression'`というエラーがでてビルドできませんでした。
![スクリーンショット 2023-09-19 10.29.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559656/9b4d8de2-355d-8cd3-14b9-ec7bfdcf66e3.png)

どうしても11個以上並べたい場合は子の`Group`にViewを分割するハックがありました。

https://capibara1969.com/1621/
# XCode15におけるViewの最大数
XCode15では`HStack`、`VStack`、`ZStack`、`Group`等の中でViewを11個以上並べてもエラーがでずビルド可能になりました。
![スクリーンショット 2023-09-19 10.27.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3559656/fba6c5a1-4ec4-b57b-deec-c1dde6ac6696.png)
## 何個まで並べる事ができるか
`Group`にViewを1000個程度並べてみたところビルド可能でした。未検証ですが最大数の制限がなくなった可能性があります。
# たくさん並べた時のデメリット
1000個の動作確認中にビルド時間が長くなったり、プレビューの描画がタイムアウトしたりすることがありました。コードの可読性の低下にもつながりますので適度に別のViewに切り出す等を行い、並べすぎには注意しましょう。
Power Query workout - クエリの評価は一度だけとは限らない

クエリを分割するアプローチ採用したとき、はて？と思うことがあるようだ。なぜ何回もクエリを評価してしまうの？と。

Power Query エディタだけを眺めていると評価済みの結果が再利用されるのでは？そう錯覚したり期待するかもしれない。プレビュー用途や処理の都合上キャッシュが用意されることはあるけれど、別のクエリで再利用するという動作はしない。そもそも Power Query だけでクエリの評価結果を保存することはない。

# たとえば
クエリの評価が一度だけとは限らない、つまり、クエリは必要なだけ繰り返し評価されるのはなぜ？という動作にはいくつかある。シンプルなケースで、
クエリ: SourceQuery を参照するクエリ、QueryA と QueryB があり、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/133730c2-ebe5-81c1-8c11-b1c445836c45.png)
QueryA が評価されるとき、SourceQueryは評価される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/1c8bb08f-4672-96e8-0144-5fc5b00a5287.png)
QueryB が評価されるとき、SourceQueryは評価される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/242d90e3-bcd5-01c5-cfa8-4aa76ad20d8b.png)
ここでは SourceQuery は少なくとも2回評価されるということだ。一連のクエリの評価で Refresh All としても、QuaryA と QuaryB が個別に評価されるだけ。再利用するためにそれぞれ結果を保存するわけがない。
評価されたクエリの結果を使いまわせれば効率的なのでは？と思うかもだけど、SourceQuery の結果が 数 TB あったらどうするの。メモリがどれだけ必要なの？って話。扱えるデータ量にしきい値があるのは道具の用途としてよくない話だと思うね。

# 動作の実証
コードで実証するのは簡単
## 評価ごとに評価される動作
```text:Power Query
// SourceQuery
#table(
    type table [Column1 = nullable text],
    {
        {
            Text.NewGuid()
        }
    }
)

// Query1
SourceQuery

// Query2
SourceQuery
```
たとえば、Excel で [Reflesh All] してもそれぞれ異なる結果になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/a6738df9-52d9-d1b5-8d1e-435d45137095.png)
SourceQuery / Query1 で SourceQuery を参照 / Query2 で SourceQuery を参照 ですべてテーブルとしてロードしているから、少なくとも 3回

Table.Buffer 関数を使っても動作は変わらない。Table.Buffer を勘違いしているひと多いよね。
```text:Power Query
// SourceQuery
Table.Buffer(
    #table(
        type table [Column1 = nullable text],
        {
            {
                Text.NewGuid()
            }
        }
    )
)
```
https://learn.microsoft.com/en-us/powerquery-m/table-buffer

バッファリングにより評価済みの値はメモリにキャッシュされるけれども、キャッシュが共有されるわけではない。

# 最初に理解すべきこと
見た目でそう思い込むことは不思議ではない。けど、クエリの評価結果を参照しているクエリに渡すという動作をしているわけではないということがポイント。

```text:Power Query
// SourceQuery
    Text.NewGuid()

// Query1
    SourceQuery
```
Query1 が評価されるとき、SourceQuery の評価結果、つまり "Text.NewGuid() の結果" を取得するのではなく式 "Text.NewGuid()" を参照しているということ。


# 思ったこと🙄
クエリの分割が可能というのは、論理的アプローチで実現している。

# その他
https://powerbi.connpass.com/

- [Power BI 勉強会 - connpass](https://powerbi.connpass.com/)
- [Power BI Desktop を使い始めるには](http://qiita.com/PowerBIxyz/items/6c4735cb5b5712e70981)
- [Excel で Power Query を使い始めるには](http://qiita.com/PowerBIxyz/items/52e563037b855a099ca9)
いい感じのTextBox for TimeSpan

TimeSpanを、いい感じに入力できて表示する値コンバーターです。

- 時間間隔(TimeSpan) をTextBoxに入力する時に、どの区切り文字でもOKにします。→ざっくり楽に入力できます。
- 日数は、時間に変換して表示できます。2days　→　48hours。
- マイナス表示ができます。 -1と入力した時、-1:0:0と表示。

## 入力値からTimeSpanへ変換
- 1つの数値は、時間として認識。
 **"0" to "0:0:0" ,    "-1" to "-01:00:00"**
- 2つの数値は、時間・分として認識。
 **"1:2" to "01:02:00"**
- 3つの数値は、時間・分・秒として認識。
 **"1:2:3" to "01:02:03"**
- 4つの数値は、日数・時間・分・秒として認識。
 **"1:2:3:4" to "1.02:03:04"**
- 数字以外の文字は、区切り文字として利用。ただし、先頭の「-」は、マイナスとして扱う。
 **"1,2 3aaaa4" to "1.02:03:04"**

## パラメーター
- **ConverterParameter**
TimeSpan format stringsを利用でき、また、`{SumHours}`, `{Sign}`を、利用可能。
`{SumHours}`は、日数を時間に換算したのを含め合計した時間。また、自動でマイナス表示になります。
`{Sign}`は、時間間隔がマイナスの時に「-」に置き換えます。
- **IsShortTime**
Trueの時は、入力した秒の数値が0で無いとエラーが返ります。
- **Max, Min**
入力時の制限として、時間間隔の最大値・最小値を指定。


## デモ画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/692bac75-5401-52e9-d75b-c8bcfde9b518.png)

- 25とだけ入力すると25時間0分0秒として認識。
デフォルトでは、日数を時間に換算して表示する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/6031a9e6-c6ae-d39d-5d37-06fa663d3673.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/1dade785-b84e-2ed5-3c58-782b00720506.png)
TextBoxでなく、TextBlockにコンバーターを利用した場合。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/c850f0a6-5aa6-70f5-88b1-09536e5d51a5.png)


- 356日間は、Maxパラメータに指定した355日23時59分59秒を超えているのでエラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/6e5e6809-8b80-8324-5238-3312e03bf517.png)


- `IsShortTime`を有効にした場合、1時間2分3秒として入力しても、秒が0で無いのでエラー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/0bcce6d0-5a90-83de-064b-e3f1fbc78309.png)




- -240時間　→　`{Sign}`を、「-」に置き換えて、-10日間として表示。
`d hh mm ss`は、TimeSpan 書式指定文字列。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/e75bfcec-1c3b-8d10-ff41-87ba00762bf6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132059/58ae2305-2f5e-ba93-7afe-24190a4b9861.png)

## その他
- [顧客マネジメントソフト ガンジス](https://ganges.pro/)で利用するために作成しました。
- 参考：[How to parse string with hours greater than 24 to TimeSpan?](https://stackoverflow.com/questions/2728321/)
- 時間は、緩いフォーマットで入力できると入力が楽な感じです。区切り文字に「:」を必ず使わないといけない、とかの入力のフォーマットの制限は、PCの都合であって人に合わせたものでは無いとも言えるでしょう。電話番号の入力は、半角・全角のどちらも受け入れて、内部で半角に変換して統一するのが、ユーザーフレンドリーなのと同じです。 

## コード

https://github.com/mikihiro-t/TimeSpanHelper

### System Requirements
- .NET 6

### History
- 2021-03-26 Ver 1.0
- 2021-12-17 Ver 1.1
	- Added ValidationRules: IsShortTime
	- Changed StringFormat. Replace
- 2023-09-19 Ver 1.2
	- Changed to from .NET 5 to .NET 6
	- Fixed TimeSpanUtils.GetTimeSpan Method.

### ライセンス
MIT
2流スマホで　Google One VPN　そして　消しゴムmagic

|嫁は　google 7なので　無料でVPN使えます
|:---
|しかし　俺のは　２流の２年前以上のスマホなので　Google One　100G契約する必要がありました
|これ2500円/年　です

## 詳しい解説は　以下

https://nsspirt-cashf2.com/vpn-life/google-one-vpn/


自分の表面的理解です


![見れる.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/6ad8ccb3-b1ef-1fe4-1a80-44824e9c9d6a.jpeg)

https://www.youtube.com/watch?v=SzDd0VnP-Y4&list=RDSzDd0VnP-Y4&start_radio=1

のように　
「サイトX」は　[google VPN サーバー]からアクセスがあったと思う。
まさか　「スマホ」からだったとわからない。

**アクセスしてきたものは　だれでしょう**

なお
https://www.ssl.ph/compare/ssl/datalibrary/contents06.html
より引用

```
「https」から始まっている場合は、SSL/TLSプロトコルを利用した、暗号化通信が行われています。

SSL暗号化通信では、データは暗号化されてやりとりされるため、復号化ができない第3者からは、内容を読みとくことができません。

```


## 1) 安物スマホ **A**にて

![e.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/7f279343-7ffa-2635-d4ac-be3452b394ec.jpeg)


![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/f4b4a515-fc13-9240-02fe-8eac31ba0e2f.jpeg)



**NHK　plus** は　バイパス許可が必要だった
なお
メルカリは　2023/9/18時点では　VPN 使っても大丈夫


![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/c0f2d289-83f4-3ad6-65ce-9fd93b7b5321.jpeg)






## 2) 別の　安物スマホ **B**　にても使えてる

![３.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/2dfb6e06-fca8-5d86-ade0-eb84e9c1f555.jpeg)


昨日から使い始めた私です

![e.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/6760c02b-e344-a9ae-8c1c-702aebc3f157.jpeg)




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



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



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

は　日本語字幕でみてください


## A) google photo から　消しゴムマジック　一応使えます


これが
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/de956b1c-011a-b5a7-c580-28f0336be380.jpeg)


こうなります
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/922bbcee-fcd4-3e90-4a24-ece35a854588.jpeg)

汚いのは　消しゴムマジックの対象を　正確にえどらなかったためと思います
Terraform×AWS　環境設定編

## はじめに

こんにちは！
RedPullといいます。

今までアウトプットをほぼ全くしておらず、危機感を覚えたので、モチベーションのアップも兼ねて、現在学習している内容を投稿していきたいと思います。

今回は「Terraform」についてです。

---
## 対象者
- AWSの設定が毎度手動でやるのが面倒と感じてきた方
- Terraformって何？と思った方

## Terraformとは？

Terraformは、Infrastructure_as_Code（IaC）ツールであり、HashiCorp社より提供されています。
これを使うことで、クラウドサービスによるリソース（サーバーなど）の設定・構築を自動で行うことが可能になるようです。

僕は業務で簡易的にAWSを触っているのですが、その設定を毎度スクラップ&ビルドしなければいけないのが億劫になり、こちらの技術に興味を持ちました。

今回はまだ学習中なので、
他のPCでも環境を再現できるように、まずは導入の手順を備忘録として残しておこうと思います。

初回設定
---

今回の学習では、AWSでの利用を前提に行っていきます。
また、AWSのアカウントは作成済みであるものとします。

### ▶AWS CLIインストール
AWS各リソースに対して、コマンドライン経由でアクセスするためのものです。
→公式から
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html
### ▶Terraformインストール 
- tfenvインストール 
- Terraformインストール
#### ◇手順
まずtfenvをインストールする（nodeにおけるnvmみたいなもので、Terraformのバージョンを指定してインストールできます。）
https://github.com/tfutils/tfenv 
1. まずgitbashで以下を叩く
   ```powershell
   $ cd ~
   $ git clone https://github.com/tfutils/tfenv.git .tfenv
   ```
2. Cユーザー直下に`.bashrc`を作成
3. ↑の中に以下
   ```
   export PATH=$PATH:/C/Users/[user]/.tfenv/bin
   ```
4. Terraformインストール 
   ```powershell 
   $ tfenv list-remote
   $ tfenv install 0.14.6 
   $ tfenv use 0.14.6 
   ```
5. 確認
   ```powershell 
   $ terraform version
   ```
#### ◇IAMアカウントの用意

手順は以下の通りです。

1. IAMユーザーの作成 
   今回は、Terraform用ユーザーを別に用意する（2つ用意）
   また、「ポリシーのアタッチ」で`Administrator_Access`を付与しておく
2. アクセスキーの設定
   →ここのアクセスキーIDとパスワードは、一度閉じたら再表示できないので、かならずメモに残しておく 
   また、`.csv`形式で情報をダウンロードできますので、こちらもできればしておきたい
3. 認証情報を登録
   ```
   $ aws configure
   AWS Access Key ID [None]:各自
   AWS Secret Access Key [None]:各自
   Default region name [None]: ap-notheast-1
   Default output format [None]: json
   $ aws configure --profile [プロファイル名] 
	```
4.  設定できているか確認する
   `C:\Users\[user]`に`.aws`フォルダが生成されているので、ここのcredentialsの中身を確認し、登録した情報が書いてあればOK。
   ```
   [default]
aws_access_key_id = 各自
aws_secret_access_key = 各自
[terraform]
aws_access_key_id = 各自
aws_secret_access_key = 各自
   ```
##  おわりに 

Terraformの設定方法についてまとめました。
適宜必要な情報を追記していきたいと思います。

---
Quick Start: Visualforce


+ [Quick Start: Visualforce](https://trailhead.salesforce.com/content/learn/projects/quickstart-visualforce)

# Create a Visualforce Page

何もしないで検証ボタンをクリック

:::note alert
We could not find the Visualforce page named ‘Contact Form’. Make sure you create the Visualforce page.
:::

これがなくても、Visualforce Pageを作れば合格できた

```
public with sharing class ContactPagination{
}
```

# Add a Standard Controller to the Page

何もしないで検証ボタンをクリック

:::note alert
We didn’t find the <head> and <body> tags in the code. Don’t forget to add the <head></head> and <body></body> tags in between the <apes:page> tags.
:::

```
<apex:page standardController="Contact">
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <title>Quick Start: Visualforce</title>
        <!-- Import the Design System style sheet -->
        <apex:slds />        
    </head>
    <body>
        <apex:form>
            <apex:pageBlock title="New Contact">
                <!--Buttons -->
                <apex:pageBlockButtons>
                    <apex:commandButton action="{!save}" value="Save"/>
                </apex:pageBlockButtons>
                <!--Input form -->
                <apex:pageBlockSection columns="1">
                    <apex:inputField value="{!Contact.Firstname}"/>
                    <apex:inputField value="{!Contact.Lastname}"/>
                    <apex:inputField value="{!Contact.Email}"/>
                </apex:pageBlockSection>
            </apex:pageBlock>
        </apex:form>        
    </body>
    
</apex:page>
```

# Add a Form to the Visualforce Page

何もしないで検証ボタンをクリック

:::note alert
We could not find the Visualforce Page as the action override for the New Contact action.
:::
ブラウザ上のCloud9でrails newするときの注意点

ブラウザ上のCloud9でrails newするとき、ローカルの開発環境と違って、必要なプラグインをインストールしなければならない。また、アクセスを許可するホストの設定もしなければならない。

## 必要なプラグインをインストールする
```command
$ yarn add @babel/plugin-proposal-private-methods @babel/plugin-proposal-private-property-in-object
```

上記のコマンドでプラグインをインストールしないと、エラーが起きてしまう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470238/bb2bfef3-ac75-1b8b-2e0e-47b03dfb9e84.png)

## アクセスを許可するホストの設定
このまま、rails sでサーバーを起動してもエラーが起きる。
以下のエラー画面に出てきたconfig.hosts << ~~~とある部分をコピペし、deveropment.rbにペーストする

![スクリーンショット (123).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470238/a61f5a57-023f-8f26-2315-232cd50f5f22.png)
暗号化とハッシュ化の違い

セキュリティーについて調べていた時に、ふと暗号化とハッシュ化は同じ意味合いではないか？と疑問に思ったため、今回暗号化とハッシュ化の違いについてまとめました。

# ハッシュ化と暗号化について
### ハッシュ化
ハッシュ化は、ハッシュ関数によってデータを不規則な文字列に変換する手法である。
利用のされ方としては、パスワードをハッシュ化して保存・管理することが挙げられる。第三者が不正にパスワードへアクセスしたとしても、ランダムな文字列に変換されていることで、悪用されるのを防げるためである。

### 暗号化
暗号化は、暗号アルゴリズムによって元のデータを変換する手法である。一方で、暗号化もデータが読み取られないようにする技術であるため、ハッシュ化と混同してしまう人も見受けられる。しかし、暗号化は可逆的な変換であり、ハッシュ化は **不可逆** である点が両者の大きな違いとして挙げられる。

# 違いは、**不可逆性**
### ハッシュ化
データをハッシュ関数によってハッシュ化し、値を変換することができるが、ハッシュ化された値を、ハッシュ関数を通じて、元の値にすることができない。
![Group 12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049661/c4fffc44-9dbb-acd4-9752-592141ad99af.png)![Group 13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049661/48958933-485e-01f6-a896-2fc6cb715433.png)

### 暗号化
一方暗号化は、平文を暗号鍵によって暗号文にすることで、判読不能にすることができる。また、この暗号文は復号鍵を利用することで、復号を行い、平文に戻すことができる。
![Group 14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1049661/dd123d56-70a9-3474-f73e-bf45a59976ab.png)

以上を持って、ハッシュ化と暗号化の違いは、**不可逆性**であると言える。
【Xcode】cannot be opened because it is missing its project.pbxproj file.の解決法

## 概要
以下のような`/~~.xcodeproj cannot be opened because it is missing its project.pbxproj file.`というエラーが表示された時の対処法です。
![スクリーンショット 2023-09-18 15.54.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333791/e61c26dc-ed0e-6da7-6314-a8ab8aaef27c.png)

検索するとこのエラーについてのissueやstackoverflowでの質問がいくつか見つかりましたが解決していないままであったり自分で試してもうまくいかなかったりと、プロジェクトが開けなくなりとてもとても焦りました。
`git reflog`を使って動かなくる前のコミットに戻してみるというのを試しましたが、特に解決しませんでした。

## エラーの意味
「`/~~.xcodeproj`がパッケージ内に本来含んでいるはずの`project.pbxproj`が無くなっているのでプロジェクトを開けません。」という意味です。
何かの拍子に`project.pbxproj`が消えてしまったか、データが壊れてしまったことが原因だと考えられます。

## 結論
### バックアップをとっておきましょう
`project.pbxproj`は既存のプロジェクトに対して新規で作成することができません。
新しくXcodeのプロジェクトを作成して`project.pbxproj`をコピペするか、バックアップされている該当プロジェクトファイルの`project.pbxproj`をコピペすることで動くようになります。

プロジェクトが開けなくなる前のファイルが残っていれば、そちらを使うのがベストです。
`project.pbxproj`にはアプリの環境設定がたくさん含まれており、これを手動で復元するのはほぼ無理だと思われます。。

## 手順
**該当プロジェクトを開けた時のファイル(バックアップ)が残っている場合**
1. 開けた時のプロジェクトファイルをFinderで開き、`~~.xcodeproj`を右クリックして`パッケージの内容を表示`をクリック
1. `project.pbxproj`をコピー
1. 開けなくなった方のプロジェクトファイルをFinderで開き、`~~.xcodeproj`を右クリックして`パッケージの内容を表示`をクリック
1. 2でコピーした`project.pbxproj`をペースト

**バックアップが残っていない場合**
1. 新規Xcodeプロジェクトを作成します（開きたい元々のプロジェクトのProductNameやbundleを思い出して作ります）
1. 新規作成したプロジェクトファイルをFinderで開き、`~~.xcodeproj`を右クリックして`パッケージの内容を表示`をクリック
1. `project.pbxproj`をコピー
1. 開けなくなった方のプロジェクトファイルをFinderで開き、`~~.xcodeproj`を右クリックして`パッケージの内容を表示`をクリック
1. 3でコピーした`project.pbxproj`をペースト
1. 開けなくなった方のファイルが開けるようになりますが、Deployment Targetなどのプロジェクトに関する環境設定が初期設定になっているので思い出して修正する必要があります

この手順で開けるようになります！
Swift Package Managerを使用しているとアップデートをする必要があったり、その他エラーが出るかもしれませんがとにかく開けるようになるので安心です🎉

## 備考
gitでブランチを切り替えたりpullしたり色々動かしていたら突然このようなエラーが表示されXcodeのプロジェクトが開けなくなったので、git関連、ローカルでのコンフリクトなどが原因になっている可能性があると考えています。

## おわりに
GitHubにリポジトリを置いているとはいえ、ローカルのバックアップは大事だと痛感しました。Gitをもう少しちゃんと勉強したいと思います。
お読みいただき、ありがとうございました。お役に立てましたら幸いです。


## 参考

https://qiita.com/bamboo_music_ac/items/2814ee027021b7b9cc3d

https://note.com/runomimi/n/ne05b4885486d
Quick Start: Apex


+ [Quick Start: Apex](https://trailhead.salesforce.com/content/learn/projects/quickstart-apex)


# Create an Apex Class

何もしないで検証ボタンを実行

:::note alert
The 'OlderAccountsUtility' Apex class was not found
:::

```
public class OlderAccountsUtility {

}
```

# Add a Method to the Class

何もしないで検証ボタンを実行

:::note alert
The 'updateOlderAccounts' method did not update account records as expected
:::

```
public class OlderAccountsUtility {
    
    public static void updateOlderAccounts() {
        // Get the 5 oldest accounts
        Account[] oldAccounts = [SELECT Id, Description FROM Account ORDER BY CreatedDate ASC LIMIT 5];
        // loop through them and update the Description field
        for (Account acct : oldAccounts) {
            acct.Description = 'Heritage Account';
        }
        // save the change you made
        update oldAccounts;
    }
}
```

# Invoke and Test the Code

何もしないで検証ボタンを実行 --> 合格してしまった

# Verify the Updated Accounts


何もしないで検証ボタンを実行 --> 合格してしまった
[個人開発用] README.mdテンプレート

# はじめに
ご覧いただきありがとうございます。
ここでは主に個人開発用のReadme.mdのテンプレートを作成し、今後の自分の開発に役立てたいと思っています。
テンプレートですのでもしいいなと思った方はご自由に使用してください。

まずこの記事を書くに至った経緯についてです。
私は主にReactやNextjsを使用したウェブサイト・ウェブサービスを個人で開発しています。その際に自動生成されるReadmeを毎回そのまま放置していました。
理由としては別に編集する理由がなかったからです。しかし最近とてもシンプルな理由ですがこれを「ダサいな」と思うようになりました。また客観的に見てもサービスの利用方法やライセンスの所在・作成者は誰なのかといった内容は必要不可欠です。そのため今後の自分のためにもこの記事を通して勉強したいと思います。

# この記事で目指すこと

# まず必要なもの
# テンプレートの作成
#　　装飾
# その他の設定
# 終わりに
## 参考記事
Quick Start: Aura Components



+ [Quick Start: Aura Components](https://trailhead.salesforce.com/content/learn/projects/quickstart-lightning-components)

# Create an Aura Component

何もしないで検証ボタンを押した場合

:::note alert
The 'MyContactList' component was not found.
:::

コンポーネントを作っただけ

:::note alert
Could not find a Lightning Record Page named 'Account Record Page'.
:::

United Oil & Gas Corpという取引先がなかったけど、問題ないみたい


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0bcb8df5-fb61-86b9-48b5-4df97b6e7500.png)

# Retrieve a Contact List

何もしないで検証ボタンを押した場合

:::note alert
The component does not include a 'aura:handler'
:::

```
({
    myAction : function(component, event, helper) {
        var action = component.get("c.getContacts");
        action.setParams({
            recordId: component.get("v.recordId")
        });
        action.setCallback(this, function(data) {
            component.set("v.Contacts", data.getReturnValue());
        });
        $A.enqueueAction(action);
    },
    
})
```

# Render and Preview the Contact List

何もしないで検証ボタンを押した場合

:::note alert
The component is missing the 'aura:iteration' component
:::



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ec5e0c0a-1e1f-9f60-3895-4906b6e8401e.png)


```
({
    myAction : function(component, event, helper) {
        var action = component.get("c.getContacts");
        action.setParams({
            recordId: component.get("v.recordId")
        });
        action.setCallback(this, function(data) {
            component.set("v.Contacts", data.getReturnValue());
            
            component.set("v.Columns", [
                {label:"First Name", fieldName:"FirstName", type:"text"},
                {label:"Last Name", fieldName:"LastName", type:"text"},
                {label:"Phone", fieldName:"Phone", type:"phone"}
            ]);
            
        });
        $A.enqueueAction(action);
    },
    
})
```

# 

+ [Unhandled Exception on trailhead labs](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000V8Tx0AK)
引用符で囲まれた場合も考慮してカンマ区切りされた文字列を split して配列に変換する

カンマ区切りされた文字列を配列に変換する方法として split 関数が使えます。しかし、それだけでは 12,345 のような桁区切りのある金額などには対応できます。そこで、引用符で囲まれたカンマ記号も考慮して配列に変換する方法を検討しました。

下記を使用してconvertListToArray 関数を作成しました。

- 文字列の先頭や最後に特定の文字・記号が存在するかどうかを調べる startsWith および endsWith 関数
- 文字列から一部分を切り抜く slice 関数

さらに、splitMark および quoteMark の値を変更することにより、カンマ以外の区切り方に対応したり、引用符の種類を変更可能です。

```JavaScript:convertListToArray
function convertListToArray(str) {
    var res = []; //結果配列
    var resIdx = 0;
    var splitMark = ','; //区切り記号
    var quoteMark = '"'; //引用記号

    var wrk = []; //作業用
    var quoted = false; //引用符で始まり、まだ閉じられていない場合 true
    wrk = str.split(splitMark);
    for (key in wrk) {
        if (quoted) {
            if (wrk[key].endsWith(quoteMark)) {
                //引用符で閉じられました
                res[resIdx] += splitMark + wrk[key].slice(0, -1);
                resIdx++;
                quoted = false;
            } else {
                //引用符で閉じられるまで文字列連結
                res[resIdx] += splitMark + wrk[key];
            }
        } else {
            if (wrk[key].startsWith(quoteMark) && !wrk[key].endsWith(quoteMark)) {
                //引用符で始まり、閉じられていません
                res[resIdx] = wrk[key].slice(1);
                quoted = true;
            } else if (wrk[key].startsWith(quoteMark) && wrk[key].endsWith(quoteMark)) {
                //引用符で囲まれています
                res[resIdx] = wrk[key].slice(1, -1);
                resIdx++;
            } else {
                res[resIdx] = wrk[key];
                resIdx++;
            }
        }
    }

    //引用符の開始と終了がペアになるので、処理正常なら false になっているはず。
    if (quoted) {
        gs.error("引用符が閉じられませんでした");
    }

    return res;
};
```

下記のようなリストを渡した場合の結果を掲載します。

```JavaScript:Test
var str = '34,,  ,"4,567"," f,dfd ","  ","",2.3,/"54/",456,';//テストしたい文字列

var res = convertListToArray(str);

//結果確認
for (key2 in res) {
    gs.info(">" + res[key2] + "<");
};

//結果
//*** Script: >34<
//*** Script: ><
//*** Script: >  <
//*** Script: >4,567<
//*** Script: > f,dfd <
//*** Script: >  <
//*** Script: ><
//*** Script: >2.3<
//*** Script: >/"54/"<
//*** Script: >456<
//*** Script: ><
```

引用符で囲まれた数値（桁区切りあり）ばかりではなく、引用符がエスケープされている場合などもリストを配列に変換できるようになりました。

上記で示したコードのほか、文字コードのチェック、ファイル内容を改行ごとに分割する処理、ヘッダ部分の処理などを追加すると、CSVファイルを取り込むことができるようになります。

弊社ブログへも[同様の記事を投稿](https://alpcom.co.jp/blog/20230919/?utm_source=Qiita&utm_medium=post&utm_campaign=ysi&utm_id=20230919)しております。
Oracle Analytics Cloud：「過去XX日間」のデータを検索

# はじめに
日付を基にデータをフィルタする方法を考えます。
検索した日を基準に、「過去7日のデータ」を検索してみます。

:::note
この記事は、2023年8月23日に執筆しました。
:::

# サンプルデータの入手と加工
Oracle Analytics Cloud（**OAC**）のチュートリアルからダウンロードできるExcelファイルを使います。

https://docs.oracle.com/en/cloud/paas/analytics-cloud/tutorial-create-first-visualization/#before_you_begin

このページからダウンロードできる「sample_revenue.xlsx」を使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/32e8aa1d-8051-425a-7019-9d2fe2e84c8a.png)

## 日付を加工
日付データが少し古めだったので、ExcelのEDATE関数を使用して加工しました。
Q列の「BILL_DAY_DT」とR列の「ORDER_DAY_DT」を13年進めました（12ヶ月 X 13年）。
使用した式は、こんな感じです。
```
=EDATE(Q2,12*13)
```
上書き保存しておきます。

# OACで可視化
## データセットとして登録
OACにドラッグ＆ドロップして、アップロードします。
「ビジュアル化」をクリックして、ワークブックを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/a42a0740-6cf7-37f0-e9a2-cd22db822125.png)

## フィルタの設定
### 方法1: フィルタで関数を使用する
「フィルターバー・メニュー」アイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/55ea1ba2-5886-4fd2-927e-2d72381524f8.png)
「式フィルタの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/a98f9c67-63a2-f404-4ed8-8df800595a48.png)
「ORDER_DAY_DT」をドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/0cd36be1-fdf4-7387-4cb1-b80692a8651f.png)
次を参考に式を完成させ、「適用」をクリックします。
```
ORDER_DAY_DT BETWEEN TIMESTAMPADD(SQL_TSI_DAY,-7,CURRENT_DATE) AND CURRENT_DATE
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/71990973-bf48-a1b4-c13f-f7c6bf628195.png)
ORDER_DAY_DTとREVENUEで折れ線グラフを作成しました。
本日（執筆時点では2023年8月23日）から過去7日分のデータが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/1970ba92-4d2f-2432-f7b9-fa3ace664ac8.png)

### 方法2: 相対時間でフィルタする
もう一つの方法です。
こちらの方が、より簡単です。
フィルター・バーの「＋」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/27542934-aa16-5bd9-e8bf-cddb0015f747.png)
「ORDER_DAY_DT」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/a0bde29d-b671-f7ed-a376-082f2672ea11.png)
「相対時間」をクリックします。
タイプを「過去」、増分を「7」、時間レベルを「日」とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/3abb8350-96d5-0456-560b-a115d32080ab.png)
ORDER_DAY_DTとUNITSで折れ線グラフを作成しました。
検索時点（2023年8月23日）での過去7日分のデータが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/35e80e42-32df-08b8-2475-c192bdfd6967.png)

# おわりに
2つの方法を紹介しました。
方法1で使用した TIMESTAMPADD関数では、第2引数でマイナスの数値を指定したので、過去の日付を計算することができました。正の数値を使えば将来の日付が計算できます。
方法2の相対時間では、タイプを「過去」として使用しましたが、「次」タイプで将来の日付を相対的に指定できます。
CPQ未解決


+ [Quote to Order Creation Salesforce CPQ](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007F4Vwc)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b232fc88-3ee1-7bc7-f96b-45b7d07eb85f.png)

+ [User is not able to edit the Quote line record owned by another User in Quote Line Editor page](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007KHbbl)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f399d304-a4dc-fe84-4b62-23805feb01ea.png)

+ [単一ユーザーからのレコードを承認するために、Order オブジェクトに事前承認プロセスを作成しました。承認オブジェクトにボタンを作成し、その中でvfページを呼び出しましたが、拒否しました。レコードの承認中は正常に機能していますが、拒否中はエラーが表示されます。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Lpnk0)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4d8b035a-8f31-da8e-d9d2-9067212eb9fc.png)


+ ["AdditionalInstructions" not saving after edit](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007HM8SN)

:::note
Try using the field type 'Text Area' instead of 'Text Area (Long)'.  The trailhead instruction (at this time) is incorrect and asks for 'Text Area (Long)' to be used, which does not show the saved message. 

Here you can follow along the correct steps and learn more about other CPQ special fields: https://help.salesforce.com/s/articleView?id=000383950&type=1
:::


+ [Invalid ID Error on Preview Approval](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007X9noG)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8b2b4d2f-9f24-6c90-6db2-2366470f9b4a.png)

+ [Salesforce CPQ の見積品目エディタのアクション列を非表示にする](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000E9yQe)


+ [Invalid Id:Product name error coming while trying to add product in quoteline editor in saleforce cpq](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZBZY4)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/dbf18b2c-058c-94c0-d79f-5cb61b1a9958.png)

+ [Undefined error while Authorize new calculation service on Setting up CPQ package configuration. I have used Steelbrick cpq managed package. Thank you in Advance](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KEJJP)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/694c6434-ca95-4d75-b242-edef8b6703c6.png)



# Validation Rule 

+ [Validation Rule to Exclude Parent and Included Bundle Products](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000n4JI)
読書の秋：エンジニアのための読書のすすめ

エンジニアとしてのキャリアを築いていく中で、技術的なスキルや知識はもちろんのこと、情報の読解力やコミュニケーション能力も非常に重要です。これらの能力を磨くための方法として、日常的な読書の習慣を持つことがおすすめです。以下、読書がエンジニアにもたらすメリットを深掘りしていきます。

#### 1. ドキュメントの読解力向上

- **情報の取捨選択**: 技術的な仕様やエラーメッセージを理解するためには、文章の中の要点を捉える力が必要です。小説やエッセイを読むことで、複数の情報の中から本質的な部分を抽出するトレーニングができます。
  
- **複雑な概念の理解**: 技術書や学術論文は、一読してすぐに理解するのが難しいことが多いです。しかし、小説や歴史書などを読むことで、異なる背景や文脈の中での情報の結びつけ方を学べます。

#### 2. ソースコードの質向上

- **言葉の選び方**: 読書を通じて、言葉に対する感覚や表現のバリエーションを豊かにすることができます。これにより、ソースコードのコメントやドキュメンテーションを書く際に、適切な言葉を選ぶ力がつきます。

- **ロジックの構築**: 物語やエッセイには、論理的な展開が隠されています。これを追うことで、プログラムのロジックを組み立てる際の思考の整理がしやすくなります。

#### 3. コミュニケーション能力の向上

- **相手の視点を理解**: 読書を通じて、人々の考え方や背景知識、価値観を学ぶことができます。これにより、チームでの作業や顧客とのコミュニケーションがスムーズになります。

- **自分の意見の表現**: 読書を続けることで、自分の考えを言葉にする力がつきます。これは、プレゼンテーションやミーティングでの発言時に大変役立ちます。

# まとめ

エンジニアとしてのスキル向上のためには、コードだけでなく、読書を通じた言葉の力も大切にしなければなりません。日常的に様々なジャンルの本を読むことで、多角的な視点を持つことができ、それがエンジニアとしての質を高める手助けとなります。読書の習慣を持つことで、技術者としての幅が広がることを体感してみてください。

# 最後に
エンジニアの皆さん、エンジニア未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
【GAS】スプレッドシートのフォームのリンク付きのシートも含めすべて削除する

# スプレッドシートのシートをすべて削除する
スプレッドシートで余計なシートをすべて削除して、新しい任意の名前のシートを作成したいということがある。そのような処理を実現するには、以下のように書けばよい。
```
function clearSpreadSheet(new_one_sheet_name){
    var ss = SpreadsheetApp.getActive()
    var sheets = ss.getSheets();//もともとあるシート一覧を取得
    ss.insertSheet(new_one_sheet_name);//シートがすべてなくなる場合は削除できないから先にinsertする
    for (sheet of sheets){
      ss.deleteSheet(sheet);
    }
}
```
new_one_sheet_nameに新しく生成したいシート名を入れれば、そのシートだけが存在するスプレッドシートを生成することができる。しかし、上のプログラムのままだと、グーグルフォームとリンクしているスプレッドシートがある場合にエラーが発生する。それを回避するために、以下のようにフォームとのリンクを解除する処理を追加する。
```
function clearSpreadSheet(new_one_sheet_name){
    var ss = SpreadsheetApp.getActive()
    var sheets = ss.getSheets();//もともとあるシート一覧を取得
    ss.insertSheet(new_one_sheet_name);//シートがすべてなくなる場合は削除できないから先にinsertする
    for (sheet of sheets){
      if (sheet.getFormUrl()){
        var form = FormApp.openByUrl(sheet.getFormUrl());
        form.removeDestination();
      }
      ss.deleteSheet(sheet);
    }
}
```
シートがグーグルフォームとリンクしている場合、```sheet.getFormUrl()```でリンク先のグーグルフォームのURLを取得することができる。あとは、そのURLをもとに```FormApp.openByUrl```でフォームを開いて、```form.removeDestination()```でリンクを解除できる。
isNullでのエラー



+ [help : ISNULL](https://help.salesforce.com/s/articleView?id=sf.customize_functions_isnull.htm&type=5)

+ [Send Better Email bug](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000079Pdly)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/bf0e7b64-9bbd-5e95-58d4-d91404a7fc02.png)

:::note
Try using ISBLANK instead of ISNULL
:::
AとBの両方または片方を購入した顧客を抽出する(SPSS Modeler データ加工逆引き7-17)

# AとBの両方または片方を購入した顧客を抽出する

![スクリーンショット 2023-09-14 9.14.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/dc19053b-302a-6f60-a46f-a1ddc3a1308d.png)


## 1.想定される利用目的

・併買施策のためのリスト作成
・施策立案時の仮説の妥当性の検証

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/cross_sell.str

## 3.サンプルストリームの説明

![スクリーンショット 2023-09-14 13.31.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e72d22c9-88f9-e9b4-15e5-b5e6f1678cdd.png)

a.入力するデータは以下の通りです。　

![スクリーンショット 2023-09-14 13.39.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a660aafb-5cc2-2146-1d90-e5f095924016.png)

[データ型]タブの[値の読み込みボタン]を押して商品のメンバーを確定させます。

![スクリーンショット 2023-09-14 13.40.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7065df0f-3de6-065a-79fe-71a9375fd7bb.png)

b.[フラグ作成]ノードを編集します。購入商品のリストが表示されない場合には、aで[値の読み込み]ボタンが押されているか確認してください。
![スクリーンショット 2023-09-14 13.41.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a61f3e87-9272-b276-53b5-de6d1ae2c01a.png)

[プレビュー]を実行します。顧客毎にAとBの購入有無フラグが作成されました。
![スクリーンショット 2023-09-14 13.41.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b7dc0bdb-0504-f6a2-1422-be40d853063d.png)

次のノードを生成するために、AとBをハイライトさせた状態でメニューから[条件抽出(AND)]を選択します。（c）
![スクリーンショット 2023-09-14 13.46.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d47a10c3-026b-80be-92ba-a0a90fc79f3d.png)

c.自動生成された[条件抽出]ノードを編集します。
![スクリーンショット 2023-09-14 13.52.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ab231f3b-ed13-50f1-854c-2f648b34e793.png)

[テーブル]を実行します。

![スクリーンショット 2023-09-14 13.51.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6a716218-4f2a-841d-0781-fea8d24e4147.png)

d.[条件抽出]]ノードを編集します。cを複製してB=0とします。

![スクリーンショット 2023-09-14 13.52.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2f54bebe-449e-2ad5-bff4-0c0c460acd72.png)

[テーブル]を実行します。

e.[条件抽出]]ノードを編集します。cを複製してA=0とします。
![スクリーンショット 2023-09-14 13.52.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a45d27ad-f5f6-3090-6594-5b958d90e853.png)

[テーブル]を実行します。
![スクリーンショット 2023-09-14 13.51.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a2afa25d-15c9-3053-1743-f183cbe2f3cb.png)


#### 注意事項

この手続きはすべての期間を対象にしているため、厳密に同じ顧客が同時に購入する場合にはプロセスを追加する必要があります。

## 4.参考情報

####　Webグラフでカテゴリの上位アイテム間の同時購入を確認

https://qiita.com/416nishimaki/items/1546c5e26a22ee67f9c8

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008