OmniAICreator/Qiita-1.07M huggingface dataset:
お名前.comより安く購入できるトップレベルドメインまとめ

# ドメイン名の購入

メジャーどころのトップレベルドメインでお名前.comより安く買えるところはないかなと探していたので共有します。最近日本語化された[Gandi.net](https://www.gandi.net/)と比較しています。Gandi.netについては[ドメイン名取得するならこれからはGandi.netが良いと思った理由](https://qiita.com/infraneko_12/items/084b291dc08496198ecc)でまとめています。

以下の価格は2019年11月時点のものです。


# .io

初年度登録費用
Gandi.net  3,825円
お名前.com  4,980円

更新費用 (2年目以降の金額)
Gandi.net 3,825円
お名前.com 6,480円

参考リンク
- Gandi.net: https://www.gandi.net/ja/domain/tld/io?country=JP#prices
- お名前.com: https://www.onamae.com/service/domain/io/

# .dev

初年度登録費用
Gandi.net 1,721円
お名前.com 1,980円

更新費用 (2年目以降の金額)
Gandi.net 1,721円
お名前.com 1,980円

参考リンク
- Gandi.net: https://www.gandi.net/ja/domain/tld/dev?country=JP#prices
- お名前.com: https://www.onamae.com/service/domain/dev/

#.ai

初年度登録費用
Gandi.net 8,458円
お名前.com 11,900円

更新費用 (2年目以降の金額)
Gandi.net 8,458円
お名前.com 11,900円

参考リンク
- Gandi.net: https://www.gandi.net/ja/domain/tld/ai?country=JP#prices
- お名前.com: https://www.onamae.com/service/domain/ai/

#.tw

初年度登録費用
Gandi.net 2,371円 (割引期間中 1,668円)
お名前.com 3,980円

更新費用 (2年目以降の金額)
Gandi.net 2,371円 
お名前.com 3,980円

参考リンク
- Gandi.net: https://www.gandi.net/ja/domain/tld/io?country=JP#prices
- お名前.com: https://www.onamae.com/service/domain/tw/
Documentation | NestJS 【翻訳】

## NestJS公式ドキュメント翻訳

[NestJS公式ドキュメント翻訳](https://qiita.com/mana-vv/items/a658051a5183183c3e50)

## 原文

[Documentation | NestJS - A progressive Node.js web framework](https://docs.nestjs.com/)

## イントロダクション

Nest（NestJS）は効率的でスケーラブルな[Node.js](https://nodejs.org/ja/)サーバサイドアプリケーションを構築するためのフレームワークです。プログレッシブJavaScriptを使用し、[TypeScript](http://www.typescriptlang.org/)で構築され完全にサポートされます（開発者は純粋なJavaScriptでもコーディングできます）。OOP（オブジェクト指向プログラミング）、FP（関数型プログラミング）、およびFRP（関数型リアクティブプログラミング）の要素を組み合わせます。

Nestは内部で[Express](https://expressjs.com/)（デフォルト）などの堅牢なHTTPサーバフレームワークを使用しており、オプションで[Fastify](https://github.com/fastify/fastify)を使用するように構成することもできます。

Nestはこれらの一般的なNode.jsフレームワーク（Express / Fastify）の上に抽象化レベルを提供しますが、そのAPIを開発者に直接公開します。これにより、開発者は基盤となるプラットフォームで利用可能な無数のサードパーティモジュールを自由に使用することができます。

### 思想

近年、Node.jsのおかげでJavaScriptはフロントエンドとバックエンドアプリケーションの両方にとってWebの「共通語」になっています。これにより、[Angular](https://angular.io/)、[React](https://github.com/facebook/react)、[Vue](https://github.com/vuejs/vue)のような素晴らしいプロジェクトが生まれ、開発者の生産性が向上し、高速でテスト可能で拡張可能なフロントエンドアプリケーションを作成できるようになりました。しかし、Node（およびサーバ側のJavaScript）には優れたライブラリ、ヘルパー、およびツールがたくさんありますが、いずれも**アーキテクチャ**の問題を効果的に解決するものではありません。

Nestはすぐに使用可能なアプリケーションアーキテクチャを提供します。これにより、開発者やチームは高度にテスト可能で、スケーラブルかつ疎結合、そして保守が容易なアプリケーションを作成することができます。

### インストール

開始するには、[Nest CLI](https://docs.nestjs.com/cli/overview)を使用してプロジェクトをスキャフォルドするか、スタータープロジェクトをクローンします（どちらも同じ結果になります）。

Nest CLIを使用してプロジェクトをスキャフォルドするには次のコマンドを実行します。これにより新しいプロジェクトディレクトリが作られ、ディレクトリに最初のNestファイルとサポートモジュールが追加され、プロジェクトの雛形が作成されます。初めてのユーザーには、**Nest CLI**を使用して新しいプロジェクトを作成することをお勧めします。[最初のステップ](https://docs.nestjs.com/first-steps)でこのアプローチを取ります。

```
$ npm i -g @nestjs/cli
$ nest new project-name
```

または**Git**でTypeScriptスタータープロジェクトをインストールするには：

```
$ git clone https://github.com/nestjs/typescript-starter.git project
$ cd project
$ npm install
$ npm run start
```

ブラウザを開き、`http://localhost:3000/` に移動します。

スタータープロジェクトのJavaScript版をインストールするには、上記のコマンドシーケンスで`javascript-starter.git`を使用します。

また、**npm**（または**yarn**）を使用してコアとサポートファイルをインストールすることにより、新しいプロジェクトを手動で最初から作成することもできます。この場合はもちろん、プロジェクトの定型ファイルを自分で作成する必要があります。

```
$ npm i --save @nestjs/core @nestjs/common rxjs reflect-metadata
```
NestJS 公式ドキュメント翻訳

## はじめに

[NestJS](https://nestjs.com/) をただただ翻訳します。

2019年11月現在、NestJSについての日本語の情報がweb上に全然なくてつらいです。

NestJSって何って人は下のintroductionだけ読んでみてください。5分です。

随時更新

---

### NestJS

- [INTRODUCTION](https://qiita.com/mana-vv/items/4b3d307e662658bb5056)
- OVERVIEW
    - [First Steps](https://qiita.com/mana-vv/items/762d026a806f12132773)
    - [Controllers](https://qiita.com/mana-vv/items/357930d554a375011e20)
    - [Providers](https://qiita.com/mana-vv/items/745ff502837cdba55011)
    - [Modules](https://qiita.com/mana-vv/items/df6c7cccc8570d9f6ac6)
    - [Middleware](https://qiita.com/mana-vv/items/6d6946085e360883e5ad)
    - [Exception filters](https://qiita.com/mana-vv/items/bd90964866b4197e4b6e)
    - [Pipes](https://qiita.com/mana-vv/items/463a0e859e71a37ee3e4)
    - [Guards](https://qiita.com/mana-vv/items/1c975573516eeefa92b3)
    - Interceptors
    - Custom decorators
- FUNDAMENTALS
- TECHNIQUES
- GRAPHQL
- WEBSOCKETS
- MICROSERVICES
- APPLICATION CONTEXT
- CLI
- RECIPES
Unityのゲーム製作で使えるC#コードまとめ

#はじめに
ゲームでよく使うものをまとめました。半分自分用です。たまに自分でも忘れるので…
#目次
・クリックで動作させる。
・キー操作で動作させる。
・衝突判定をつける。
・タグをつけたオブジェクトの数を数える。
・オブジェクトを生成する。
・オブジェクトを破壊する。
・複数回処理をする。
・座標を指定して移動させる

#クリックで動作させる
```
if ( Input.GetMouseButtonDown(0) )
{
処理
}
```
0なら左クリック1なら右クリックです。
3はホイールクリック、マウスによっては4,5…と続きます。
#キー操作で動作させる
```
 if (Input.GetKey("　"))
{
処理
}
```
" "の中は設定したいキーです。

aキーなら

```
 if (Input.GetKey("a"))
{
処理
}
```
となります。

#衝突判定をつける

```
void OnCollisionEnter(Collision collision)
{
     if (collision.gameObject.tag == "")
     {
     処理
     }
}
```
" "の間はタグ名

そのタグをつけたオブジェクトに当たった時に処理が行われます。

どちらかのオブジェクトにisTriggerがついている場合は、

```
void OnTriggerEnter(Collider collision)
{
     if (collision.gameObject.tag == " ")
     {
     処理
     }
}
```
となります。

#タグをつけたオブジェクトの数を数える
```
private GameObject[] ~~;

void Update()
{
     ~~ = GameObject.FindGameObjectsWithTag(" ");
     print(~~.Length);
}
```
~~の部分は好きな名前でOKです。

`private GameObject[] ~~;`で数えたいものを指定しておいてUpdateでタグを指定して数えています。
`if (~~.Length <= 20){処理}`と書けばタグがついたオブジェクトが20個以下の時だけ処理を行えます。
#オブジェクトを生成する
```
public GameObject ~~;

Instantiate(~~, transform.position, transform.rotation);
```
~~は好きな名前で。

`public GameObject ~~;`で使いたいオブジェクトを指定。
`Instantiate(~~, transform.position, transform.rotation);`でそのオブジェクトを呼び出し。

#座標を指定して移動させる
```
transform.position = new Vector3( ,  , );
transform.rotation = new Quaternion( , , , );
```
()の中は座標と回転です。

new Vector3( 0, 0, 0);なら原点です
Vueのv-ifで動的に出現させた要素をJQueryUIでdraggableするには

まずVueとJQのチャンポンがやばいって話はおいておいて。

## だめな例

```javascript:cliant.js
'use strict';
import Vue from 'vue';
import app from '../vue/app';

// vue
new Vue({
  el: '#vue-app',
  components: {
    app
  },
  template: '<app/>'
})

$("#button").button();
$(".draggable").draggable();
$(".resizable").resizable();
```

```vue:app.vue
<template>
  <div>
    <div>
      <moduleA v-if="!flag"></moduleA>
    </div>
    <div>
      <moduleB v-if="flag"></moduleB>
    </div>
  </div>
</template>
以下略
```

```vue:moduleA.vue
<template>
  <div>
    <div class="draggable">
      ほげほげ
    </div>
  </div>
</template>
以下略
```

```vue:moduleB.vue
<template>
  <div>
    <div class="draggable">
      ふがふが
    </div>
  </div>
</template>
以下略
```

これだと後から出したコンポーネント内の要素が、というよりは最初に出ている以外のコンポーネントがdraggableになりません。 `$(".draggable").draggable();` が実行された瞬間に要素が存在していないからです。

## 動いた例

```vue:moduleA.vue
<template>
  <div>
    <div class="draggable">
      ほげほげ
    </div>
  </div>
</template>
<script>
import Vue from 'vue';
export default {
  mounted : function(){
    $('.draggable').draggable();
  }
}
</script>
```
mountedに関数を書くと、要素が全部描画された後に発火するので問題なくdraggableになってくれます。

……で、これ全部のコンポーネントに書くの……？だる……
Visual Studio Codeで保存時自動整形の設定方法

# Visual Studio Codeで保存時自動整形の設定方法
保存時に自動整形する方法を自分なりに検索してみたので、以下にまとめています。

## 自動整形
結論から述べると、
<font color="Red">Visual Studio Code自体に自動整形の設定ができる</font>
設定項目がありました。

![auto_formatter_how_to_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525820/1ec9c695-a053-340c-1e13-b1259f9ae8c9.png)

### 設定手順
1. __[ファイル] ＞ [基本設定] ＞ [設定]__ で設定画面を開きます。
![auto_formatter_how_to_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525820/5ea857a5-8327-b839-2b07-23005656db15.png)

1. 検索ボックスに __『formaton』__ と入力すると、
__『Editor: Format On Save』__ があるので、これにチェックを入れます。
![auto_formatter_how_to_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525820/3a11d554-acf3-4860-d1b7-5d16b9f1cd2f.png)

___これで完成です。___


と、そのはずだったのですが、試してみても上手くいかないんです。
自分はここで一旦詰まりました。
チェックを入れても自動整形されない・・・。

1つの記事ではわからないので、色々な記事を調べて、次の記事と繰り返して見つけたのが、
__[Alt] + [Shift] + [F]を毎回押すのめんどくさい__ という言葉でした。

押してみると、
![auto_formatter_how_to_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525820/8608c348-2c61-fd4a-d632-2d2ef211da20.png)

フォーマッターが入ってなかったみたいです(泣)

自動整形してくれるフォーマッターがないのに、自動整形っていうのは無茶でした。

### フォーマッター
というわけで、 __[Alt] + [Shift] + [F]__ を押してみると
フォーマッターがないということが分かったので、
フォーマッターをインストールです。

<font color="Blue">__[フォーマッタをインストール]__</font>をクリックしてみると、
現在触っている言語が __PHP__ だったので、
PHP用のフォーマッターが自動で検索されました。
![auto_formatter_how_to_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525820/ea949337-63a0-c2fd-ec6e-e19770f634b9.png)

__『PHP Intelephense』__ をインストールして、
保存してみると、___できました！！！___

感動よりも、解決できてホッとする方が本音でした。
困っている方の参考になればと思います。
wordpress サイトのURLを取得

サイト名にトップページのリンクを付ける

```
<h1>
  <a href="<?php echo esc_url( home_url( '/' ) ); ?>">
    <?php bloginfo( 'name' ); ?>
  </a>
</h1>
```

トップページ以外のサイトURLを出力

```
<?php $about_url = home_url( '/任意のページ/' ); ?>
```

singleページのURL出力

```
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
```
※この関数はwordpressループの中でしか使用できない

singleページURLを文字列として取得
get_permalink()

```
記事IDが1番目の投稿URLを返す
<?php $permalink = get_permalink( 1 ); ?>

※存在しない場合、falseが返ってくる
```
Azure Arc についてまとめてみた

##はじめに
Microsoft Ignite 2019 にて、Azure の新サービスが数多く発表されました。
そのうちの1つ Azure Arc を紹介元の記事を翻訳しながら概要をまとめていきます。

翻訳元の記事
■[Azure Arc PREVIEW Bring Azure services and management to any infrastructure](https://azure.microsoft.com/en-us/services/azure-arc/)

## Microsoft Ignite 2019
Microsoft Ignite が、年に1回、アメリカで開催されるテクニカルカンファレンスです。
Azure をはじめとした Microsoft の新サービスや取り組みが発表されます。
今年はアメリカのフロリダ州オーランドで11月4日～11月8日にかけて開催されました。
これに続き、新サービスを体験できるカンファレンスが、世界の主要都市で開催されます。
日本では2020年1月には大阪での開催が予定されています。

Microsoft Ignite The Tour については下記リンク参照
■[Microsoft Ignite The Tour](https://www.microsoft.com/ja-jp/ignite-the-tour/)

##Azure Arc
###Introducing Azure Arc
Azure Arc は Microsoft Ignite 2019 で紹介されたサービスのうちの1つです。
Azure Arc を使えば、オンプレミス、エッジ、マルチクラウドにまたがる複雑化した環境も簡単にまとめることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/7103964e-81f6-77c6-e6a6-7697aad4025e.png)

###Azure Arc の特徴
主な特徴は3つあります。

- Azure データサービスをどこでも利用可能
 - Azure からの最新イノベーションに常に対応
 - 秒でデプロイ可能なキャパシティを有する弾力性スケール
 - クラウドビリングによるコストの最適化 

- Azure マネジメントを既存の環境に広げることが可能
 - windows や Linux サーバ、Kubernetes クラスターや Azure サービスを管理可能
 - Azure Portal や API, そして Azure Lighthouse などのツールを使用してリソースの運用から管理まで可能
 - Deploy and manage Kubernetes container-based applications.
  
- オンプレミス環境にクラウドプラクィスを適用可能
 - Infrastructure as Code（IaC）といった DevOps の技術の取り入れが可能
 - IT ガバナンスとガイダンスによる補足付きツールの選択権限を、デベロッパーに付与可能
 - GitOps の様な Declarative Configuration Management システムの変更管理をスタンダードにすることが可能

###Azure Arc use cases
Azure Arc の利用法として想定できるユースケースです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/c5320438-0a1f-e3b5-e73c-cd78dfa20365.png)

- 異なる環境をまたがった整備と運用が可能
 - Azure を中心とした運用・整理管理下にあるクラウド、データセンタ、そしてエッジ環境をまたがって、データベースや Kubernetes クラスタやサーバを取得可能
- Kubernetes Apps の大規模マネジメントが可能
 - GitHub や Azure Policy で Kubernetes アプリケーションの管理やデプロイが可能。アプリケーションは、デプロイから構成まで一貫して大規模にソース管理
- Azure データサービスをどこでも実行可能
 -  cloud automation や elastic scale といった最新のイノベーションや、ハイブリッドなインフラ環境をまたがるデータワークロードのための統一マネジメントを得られる。データガガバナンスやセキュリティを統一し、コストを効率的に管理可能


##おわりに
Azure Arc についての概要は以上です。
この他にも様々な新サービスが発表されたので、別途記事にまとめて紹介していきます。
XcodeとGitHubの連携方法

※久しぶりにXcodeとGitHubを連携させようとしたら文言など一部変更があったようなので修正。Xcodeのバージョンは15.0(2023/10/14)


GitHubを使い始めたのに伴い、Xcodeのプロジェクトも連携していたものの
Xcodeのバージョンが上がった際に少々やり方が変更になったようで（知らなかっただけで前からこのやり方もできたのかもですが）、備忘録として。
GitHubのアカウントは既に持っているものとして進めます。


# 1.プロジェクトを作成
まず初めにXcodeでプロジェクトを作成。
そのままGitCooperationSampleという名前。
<img width="533" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/9f004ba4-d338-0edc-3756-fcb456fcc369.png">

Nextをクリックするとプロジェクトの保存場所選択のウィンドウに移動。
保存場所は好きな場所で大丈夫ですが、「Source Control」のチェックを入れたままにしておくと書かれている通りローカルにGit repositoryを作成するので、後ほどGitHubと連携しようとした際に「既にrepositoryは存在している」旨のアラートが表示され連携ができない。
目的はGitHubとの連携なのでここではチェックをはずす。
<img width="533" alt="Next.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/886df574-1ae0-7683-4c8d-601ce6db3266.png">

この時点でソースコントロールには何もなし。
<img width="271" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/d2b5125c-d603-eb0b-3e8b-c76f02daa78b.png">

# 2.Git Repositoriesを作成する
メニューバーの「*Integrate*」から「*New Git Repositories...*」を選択。
<img width="287" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/0b597fa7-4fe8-9030-f504-1f029a88123b.png">

Gitリポジトリを作成するプロジェクト（現在使用中のプロジェクトのみしか表示されていないはず）が選択されているのを確認してCreateボタンで作成。
<img width="397" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/3f7b02d5-d646-04fc-9fd5-a0481be63ea5.png">

プロジェクトがソースコントロール対象になり、ソースコントロールに
mainブランチ他が作成される。
<img width="270" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/1fb9fd10-b017-605a-0904-ef91b75d94a7.png">


# 3.GitHubのレポジトリを作成
XcodeのSource Code Navigatorの「*Remotes*」フォルダを右クリックしてサブメニューを表示。
その中から「*New "GitCooperationSample" Remote...*」を選択。
<img width="479" alt="7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/ae12210f-8a31-fd6d-e953-9f9917fe1f88.png">


GitHubのアカウントが正しければ諸々設定を編集。
-Repository Name
-Description(必要があれば）
-Visibility
編集が終わったら「Create」

# 4.GitHubで確認
GitHubにアクセスして、作成したリポジトリができていれば成功。
<img width="794" alt="8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456861/6c270335-9dd3-b368-67d2-edca5d4255a6.png">
[Intra-mart] Forma Tips

## Tips for IM-Forma Designer Optimization

I'd like to share some tips for IM-Forma Designer here.
This article may be updated occasionally.

### Clear tables


Grid table has clearGridData().
https://dev.intra-mart.jp/cookbook150433/

But the table item has no function to do that.
Here's work around for that.

##### Try the following code

* In case of the table's ID is "tb1"

```js
var args = {};
args.data = {};
args.data.tb1 = [];
args.data.tb1[0] = {};
formaItems.product_80_table.setItemData.tb1(args,{});
```

[BEFORE]

![Tips01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521537/a1c5bdc3-4703-33f6-e5fa-8511b26f2cd2.png)

[AFTER]

![Tips02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521537/3e8ae6fd-e01d-ab52-34f8-e7751815ed34.png)


### Call Forma validation from client side JavaScript

#### Execute input validation immediately

Try the following function.

`window.inputCheck('1',false,null,null);`


The specification of the function as below.

*\*This is not official API but I just read and investigated the original source of Intra-mart.
They will not support this officially.*

bool inputCheck (string inputCheck, bool temporaryFlag, string formId, string transitionOrderNo)
　
[Return]
bool
true：No error
false：Error
　
[Parameter]
inputCheck : string
'0' : Simple check works
Other than '0' : Full check works

temporaryFlag : bool
true : Behavior of temporary save
false : Normal behavior

formId : string / optional
Validation target formID
When undefined, current formId will be assigned


![Tips03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521537/720ce3d8-adaf-c333-1543-f54c49711f5f.png)

#### Hide the displayed error banner

Try the following function.

`window.formaClearError();`

![Tips04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521537/51480095-19cf-eba2-e29a-087cc15677a0.png)
readを使用してwhileでループしている場合にうまく対話処理できないときは

# 環境
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)

## やりたいこと
  1. 対象のディレクトリ配下の空のディレクトリを検索し削除する。
  2. 空のディレクトリがある場合、毎回削除するか確認する。
 
### 結論
 - readを使用してwhileでループしている場合、while内で対話処理するreadは実行されない。
 - 対処方法としてforでループする。

#### 対象コード変更前

```bash 
PARA_DIR=`pwd`

find ${PARA_DIR} -type d -empty | while read TARGET_RMDIR; do
  echo "`$basename ${TARGET_RMDIR}`を削除する場合yを入力してください。"
  read input  #ここで対話処理したい
  if [ "${input}" = "y" ]; then
    rmdir ${TARGET_RMDIR}
  fi
done 
```
 - 実行結果

```bash
(空のディレクトリのパス)を削除する場合yを入力してください。
```

read inputに指定しているところで処理が止まってくれない。原因は既にwhileでreadを使用しており、標準入力がfind ${PARA_DIR} -type d -emptyの結果だけとなるため。readは二回使えない。

#### 対象コード変更後

```bash
PARA_DIR=`pwd`

TARGET_RMDIR=(`find ${PARA_DIR} -type d -empty`)
for (( i = 0; i < ${#TARGET_RMDIR[@]}; i++ )) do
  echo "`basename ${TARGET_RMDIR[i]}`を削除する場合yを入力してください。"
  read input
  if [ "${input}" = "y" ]; then
    rmdir ${TARGET_RMDIR[i]}
  fi
done
```
 - 実行結果

```bash
(空のディレクトリのパス[1])を削除する場合yを入力してください。
y #対話式で入力
(空のディレクトリのパス[2])を削除する場合yを入力してください。
y #対話式で入力
(空のディレクトリのパス[3])を削除する場合yを入力してください。
y #対話式で入力
```
あらかじめ削除対象のディレクトリを配列で保持し、for文でループする。

### 後からわかったこと
ディレクトリ削除をコンソールで確認するには以下でもいいことが判明。。。

```bash
rm -ri "$TARGET_RMDIR" < /dev/tty
```
やりたいことは達成できるけど、readを使用してwhileでループしている場合の対処としてこの記事は残します。

## 参考にさせていただいたサイト
https://oshiete.goo.ne.jp/qa/8511926.html
Unityでkeijiro/Pcx使って楽に点群を見る

#前置き
最近めっちゃ点群してます。個人ではインポートライブラリ持ってるのですが
汎用的に使いやすいものを探していたところkeijiro/Pcxをオススメされお手軽さに感動しqiitaに纏めてます。

#keijiro/Pcxめっちゃ便利！！
・[keijiro/Pcx](https://github.com/keijiro/Pcx)

#導入
・上記gitのリリースからunityパッケージ落としてプロジェクトにインポートします

#Ply点群の用意
・点群やってる人なら持ってると思うので飛ばします

#インポート
・パッケージをインポートしたプロジェクトにplyファイル突っ込むだけ。

#見方
・インポートしたらプレハブになってるのでシーンに配置してグリグリしましょう。
・shaderでポイントサイズや距離挙動変えられます。すごく楽。

#注意点
・対応してるのはbinary/littleendianのplyです。asciiは読めません。サクッと変換しましょう
・一般的な点群編集ソフトは左手座標系です。unityは右手座標系です。適宜x座標に-1掛けましょう。

#その他
VFX対応版なども公開されてるので気になったものを触ってみるといいです。

以上！！めっちゃお手軽で楽！！
IEだけ何度もBasic認証きかれるときの対策(Apache httpd.conf)

```:httpd.conf
<VirtualHost *:80>
  DocumentRoot 公開ディレクトリ(通常publicまでのパス)
  CustomLog /etc/httpd/logs/プロジェクト-access_log combined

  ProxyPassMatch \.(?:ico|png|gif|jpeg|jpg|css|js|html|php|json|xml)$ !
  ProxyPassMatch ^(.*)$ fcgi://127.0.0.1:9000/公開ディレクトリ(通常publicまでのパス)/index.php$1

  <Directory 公開ディレクトリ(通常publicまでのパス)>
    AllowOverRide All
    Require all denied
  </Directory>

  <Location />
    AuthType Basic
    AuthBasicProvider file
    AuthUserFile 公開ディレクトリ(通常publicまでのパス)/.htpasswd
    AuthName "Input your ID and Password."

    <RequireAll>
      Require valid-user
    </RequireAll>
  </Location>

</VirtualHost>
```

シンボリックリンクで動作させているときは上記のようなLocationディレクティブが有効らしい。
PostgreSQLのSELECT結果で--More--を表示させない方法（検索結果が多い場合）

##SELECT文での検索結果が多いと表示されない


　コマンドでSELECT文の実行時、「-- More --」と表示されてしまい、内容が読み込めないことがあります。


```
postgres=# SELECT 列名 FROM 表名;



-- More --
```

##原因
　容量の多いデータを出力させようとすると、検索結果のデータが多すぎて--more--と省略されてしまいます。


　このような、容量の多いデータを出力するには、「ページャー機能」をオフにする必要があります。



##対処方法（-- More --の対処） 
　そこで「ページャー機能」をオフにするコマンドを紹介します。

　次のようなコマンドを入力することで「ページャー機能」をオフにして、データを出力します。

```
postgres=# \pset pager off

「ページャを使う」は off です。
```



「ページャー機能」をオフにすることによって、次のように検索結果を出力することに成功しました。

```
postgres=# SELECT 列名 FROM 表名;



検索結果が表示される。
```

##まとめ

　あらかじめ、psqlでは「ページャー機能」がオンになっているため、このようなデータが多い場合は「ページャー機能」をオフにする必要があります。
　※psqlをログオフしてしまうと、元に戻ってしまうので再度設定が必要になります。
TB350-BTC の BIOS をアップデートするメモ

TB350-BTC の BIOS をアップデートします.

最新の BIOS にするには, まず B35BGB30 にあげます.
(もしかしたらこの一つ下でもいけるかも)

B35BGB30.BSS AGESA 1.0.7.2a update

https://www.biostar.com.tw/app/jp/mb/introduction.php?S_ID=882

ただ, このバージョンは不安定なようで, BIOS アップデータがうまく動きません.

BIOSTAR TB-350BTC で大ハマりからの画面表示無しBIOS更新成功
https://dodoit.info/a8e0.html

私のは Ryzen5 + 1050 Ti な環境でしたが, F12 による BIOS アップデータでは画面はでるものの, 画面が固まりました.
一度 del で BIOS 画面を立ち上げてから, F12 で BIOS アップデータに移動するとうまくいきました
(ただ, キーボードの反応が悪いでした)

これで,

B35BG723.BSS | AGESA ComboAM4 PI 1.0.0.3AB update

にアップデートできました. 3950X の準備ができましたね.

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">TB350-BTC 最新 BIOS へアップデート(B35BG723)成功しました. ありがとうございます. これで 3950X への準備は万全ですね. <a href="https://t.co/QFauTZYFET">pic.twitter.com/QFauTZYFET</a></p>&mdash; Syoyo Fujita 🌸  RayWa(Ray and Peace) (@syoyo) <a href="https://twitter.com/syoyo/status/1191705324870176769?ref_src=twsrc%5Etfw">November 5, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## TODO

* [x] 32GB x 2 のメモリを試して 64 GB 認識するかチャレンジ
  * 仕様上はサポートされていないが, 動作を確認(DDR4-3200)
Node.js (1)背景説明とインストールまとめ


<h1>Node.jsとは

一般的なJavascript使う場合はクライエントですが、Google社はJavascript V8 エンジン発表された、node.jsはV8入れるバックエンドサーバーとしてのオープンモジュールです。V8の特性あるので、node.jsはchromeのConsole似てる機能も付きます。それでは、Javascriptはフルスタック言語になっている。
<h1>インストール

環境：MacOS,Homebrew 2.1.16

```terminal:環境バージョンアップデート
~:brew update 
```

```terminal:安定バージョンインストール
~:brew install node 
```

```terminal:バージョン確認
~:brew -v 
v10.13.0
```
WebPush Notification をテストするためのクライアント・サーバサンプルを作った話

# WebPush Notification、使ってみたくないですか？
最近のアプリ界隈ですと、何かと通知やらLocalStorageへのキャッシュやら、 **Service Worker** を用いたい、という場合があると思います。

ところがまず WebPush やりたい！と言ってもクライアント・サーバを両方とも考慮して実装を考えなければならないので、例えばクライアント側、サーバ側、という風に実装を分けた場合、容易にこの開発をすすめることは難しくなります。  ~~というか一人でもだいぶ混乱します。~~

なので、サーバ側・クライアント側のサンプルを用意して、これを用いて開発の初期段階をすすめていただきたい、というのがこの記事の要旨です。

# 実装はどこ？
サーバ側(Clojure)：https://github.com/MokkeMeguru/tcs-notification/tree/test
クライアント側(React+TypeScript)：https://github.com/MokkeMeguru/tcc-notification-debug/tree/test

使い方は両方ともREADMEを見てください。Docker-Composeで解決するので、すぐに試すことができると思います。

# 技術的な話
## WebPush のぱっとした説明が欲しい。
WebPush はサーバ、クライアント、そしてプッシュサーバに構成される技術です。


## 全体の流れ
### 登録
![vapid-regist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147520/358a77c1-8c42-dbe2-7bff-e89d83d72b32.png)

### Push通知
![vapid-notif.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147520/fd2ada27-8e16-ccea-be76-0884c4e0c5fc.png)


## サーバ側のやること
まず、公開鍵・秘密鍵のペアを生成します。
(この辺りは **WebPush-\<Programming Language\>** の機能を使いましょう。私のサーバサイドプログラムでは WebPush-Java を用いて公開鍵、秘密鍵のペアを得ることができるようになっています。)

次に、クライアント側に公開鍵を晒します。するとクライアント側で **なんかしてくれて** クライアント情報、

```clojure
{:endpoint <url>
 :keys {:p256dh <str> 
        :auth <str>}}
```

というようなデータがもらえるので、こいつを例えば User-id などと組み合わせて DB に保存しておきます。(私のプログラムではDBを使わず直接ソースコードに書き込んでいます。)

Push 通知を送りたくなったならば、これも WebPush-\<Programming Language\> のライブラリに従ってデータを組み立てて、**Push Server** に送信します。

## クライアント側でやること
サーバ側から **公開鍵** が送られてくるので、こいつからのデータを受け取る、という旨のメッセージを Push サーバに送りつけます。

Push サーバが受け取ると、**endpoint** という URL が貰えるので、こいつとクライアントの情報 (**p256dh** , **auth**) をまとめてサーバに送りつけます。

ここでクライアントの User-id User-name あたりも送信できると、 **サーバ側がすごく楽になります** 。

Push サーバから通知データが送られてきたら、そいつを拾ってきて、 **Service Worker 内で** データを読みます。そして **Service Worker** から自分の通知欄に向けて、通知データを送ります。


## Push サーバ がやること
**クライアント** から **サーバの公開鍵** が送られてくるので、ふーん、って顔をして公開鍵を持っておいて、クライアントの受け取り口であるURL、 endpoint を返します。

次にサーバ側から 秘密鍵で署名されたJWT、 公開鍵、通知データが送られてくるので、本当にこいつをクライアントに送っていいか確認します。

確認が取れたら、endpoint へ通知データをポイします。

# 脆弱性
https://adiary.adiary.jp/0391

簡単に要約すると、
**不正な クライアント情報_2 を登録されると大変なことになる**

# ぜひ読んでほしい資料
Googleの WebPush に関する説明
https://developers.google.com/web/fundamentals/push-notifications/web-push-protocol
railsのバリデーション「整数のみで文字数制限あり。なおかつ空欄でもOK」を実現する書き方

railsのモデルにバリデーションをかける時のTipsです。

郵便番号や電話番号、クーポンナンバーなどで、空欄でも良いけれど登録する際は「整数のみOKで文字数も制限したい！」という時があると思います。

そんな時は、次の書き方でOKです。

```rb
validates :num, allow_blank: true, numericality: {only_integer: true}, length: { in: 10..11 }
```

以下が「空欄でもOK」の部分。

```rb
allow_blank: true
```

以下が「整数のみ許可」の部分。

```rb
numericality: {only_integer: true}
```

最後が「文字数制限」の部分です。具体的な数値は必要に応じて設定してください。

```rb
length: { in: 10..11 }
```
順序は変わっても問題ないかと思います。

ちなみに、バリデーションの種類については以下の記事がとても勉強になりました。
よかったらどうぞ！
https://qiita.com/shunhikita/items/772b81a1cc066e67930e
ENV['AWS_REGION'] (Aws::Errors::MissingRegionError) への対策

# 問題の背景

```
missing region; use :region option or export region name to ENV['AWS_REGION'] (Aws::Errors::MissingRegionError)
```

上記のようなエラーを踏んだ方への報告です。

# よくある回答

Region設定が間違っているのでRegionを正しく指定しましょう。

参考:
- https://stackoverflow.com/questions/32224995/rails4-1-aws-errors-missing-region
- https://qiita.com/1915keke/items/1302ef830a267be3a828

# 今回のケース

環境変数 ENV['AWS_REGION'] が読み込めていない為にエラーが出る。

# 対策

僕は zsh を使っているので、そこに一文追加

```
$ vim ~/.zshrc
```

```~/.zshrc
eval "$(direnv hook zsh)"
```
```
$ source ~/.zshrc
```
上記の工程で無事環境変数を読み込んでくれました。

# まとめ

Regionエラーは、Regionのせいだけでなく、環境変数の読み込みが出来てない場合もあるので注意！
何も知らないエンジニア

はじめまして

この度、今までとまったく違う業種である
エンジニアとして勤め始めました

そんな自分が
ゼロから知り始めるとどうなるか
何を知っていくのかを残していきたいと思います。

```bash
cat 今はbashとシェルスクリプトを扱っていますが
> その2つの違いがまだ理解しきれていません
> と、そういうレベルです

シェルスクリプトとは
Unixなどのコマンドなどが
内部でまとまって入っており、
それらを記述することで
全体的に実行させることができる
ドキュメントファイルのようなもの

シェルスクリプトファイルは基本的に.shの拡張子
実際のコードを書く前に最初の一行目は
#!/bin/sh
を書き、システムにこれから
シェルスクリプトを書きますようと知らせる
```

`ですよね!`

>
 - bashはそれ以前に存在したBourneシェル（コマンド名は「sh」）の後継として開発され、その名称は “Bourne” （開発創始者の姓）と “Born Again” （「新生」の意）をかけたものとも言われる。コマンド構文など基本的な仕様はBourneシェルの上位互換となっており、古いコマンドやシェルスクリプトなどはそのまま実行できる。
http://e-words.jp/w/bash.html

## 教えて下さいね！

#### 教えてくれますよね！


```
cat 心
```

## マサカリを投げる
を覚えました
Kotlinとは？～歴史や機能を調べてみた～

# まえがき
Kotlinを使ってAndroidアプリの開発を行っていますが、Kotlinはどういう歴史をたどって現在Androidアプリの開発のメイン言語になったのか気になったのでこの記事を書きました。
きちんと調べたはずですが、間違いなどがあったら是非ご指摘お願いします。

# Kotlinとは何か？
KotlinとはAndroidアプリ開発を行う際に使用するプログラミング言語です。

もともと、Androidの開発言語はJavaでしたがGoogle I/O 2017にて、
正式なAndroidの開発言語になりました。

参考サイト
https://blog.jetbrains.com/kotlin/2017/05/kotlin-on-android-now-official/

そして、Google I/O 2019にて「Kotlinファースト」が強化されたことにより開発において最新のアップデートはKotlinからされるようになりました。

参考サイト
https://android-developers.googleblog.com/2019/05/google-io-2019-empowering-developers-to-build-experiences-on-Android-Play.html


# Kotlinの歴史
ロシアのレニングラード州都サンクトペテルブルクに研究開発拠点を置く、ジェットブレインズ社で生まれ、2011年7月20日に発表されました。

いきなり横にそれますが、ジェットブレインズ社の本社はチェコ共和国の首都プラハにあります。有名な製品でいえば統合開発環境のIntelliJ IDEAが有名です。

さて、話を戻してKotlinはJavaをもっと簡潔で安全に記述でき、かつJavaと同様にOSによらず使うことができることを目的として開発されました。

すごく雑な言い方をするとJavaと最新言語のいいとこどりをして生まれた言語とも言えるのではないでしょうか。

そして、Kotlinのアップデートがどんどんされています。

次の課題としてアップデートに合わせて何がいつアップデートされたのかを表形式でまとめてみようと思います。


# 名前
Kotlin(コトリン)という名前の由来は、バルト海に浮かぶ『コトリン島』にちなんで命名されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350419/2c8ccc53-3e47-08b5-bc66-84eb387bbc0b.png)

また、Kotlinという言葉は「やかん」を表すフィンランド語です。なのでKotlinのロゴマークはやかんの形をしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350419/82750f73-9349-96cc-65ac-e86f2ad133c9.png)

上記のロゴは昔のものです。昔はこんなロゴだったんですね、まったく知りませんでした。

ちなみに、現在はロゴは下記です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350419/12c5de83-6719-1bf6-e0ed-06db596d70bb.png)

わかりやすさという意味では現在のものがぱっと見で分かりやすいですが、昔のロゴのほうがなんかかわいいですね笑

# 特徴
* 簡潔
    * セミコロン不要
    * ラムダ式
    * 型類推
* 安全
    * Null安全
* JVM言語
    * Javaのライブラリやフレームワークを使用できる
* 静的型付け
    * 変数にNullを基本的に認めない
* オブジェクト指向
* 関数型プログラミング

ほかにも細かい機能などもありますが、ここで書き出していくととんでもないことになるので機能に関してはそれぞれの項目で解説の記事を出していこうと考えています。
# あとがき
最後に、Kotlinの歴史や機能を調べてみましたが、調べ切れてないことのほうがたくさんあります。なので今後追記や別記事で展開していきます。

# 参考
* https://ja.wikipedia.org/wiki/Kotlin
* https://magazine.techcareer.jp/programming/216/
#VsCode で現在開いているファイルの絶対パスor相対パスをクリップボードにコピーするには コマンドパレットで Copy Path とか入力すればOK

![image](https://user-images.githubusercontent.com/13635059/68261799-9133de00-0084-11ea-97bf-d6f65a377e31.png)

# 絶対パス

/Users/yumainaura/.ghq/github.com/xxx/yyy/onfig/application.rb

# 相対パス

xxx/yyy/application.rb

どちらも得られて満足ですね。

# スターバックスのサーモンクリームのサンドイッチは絶対的にうまい。

相対的にではない。絶対だ。

![image](https://user-images.githubusercontent.com/13635059/68261983-2afb8b00-0085-11ea-9c53-fc099cf2894d.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2670








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【RPA】UiPath 設定ファイルの呼び出し方法

自分用備忘録

UiPathの初期処理として、設定ファイル読込ワークフローを呼び出し、元のワークフローへ返す方法。

呼び出し元ワークフローで用意するもの。
■変数
・str_設定ファイル
型：string
規定値：設定ファイルのフルパスを設定する。

・dic_設定ファイル
型：System.Collections.Generic.Dictionary(key：String、value：Object)
設定ファイル読込ワークフローより返ってきた辞書変数を格納する。

■引数
arg_設定ファイル
型：string
引数のインポートに設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521108/ab8359c3-e75f-3d5d-d2e4-515ab69952cf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521108/8e17ec86-289e-3617-c008-f78e8e4a02d9.png)

■ワークフローファイルを呼び出しを設置
・引数をインポートの設定を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521108/2695ce70-ba71-1eee-c57c-f701c55a6a16.png)

1行目：設定ファイル読込ワークフローに設定ファイルのフルパスを渡す
名前：arg_設定ファイル
方向：入力
型：string
値：str_設定ファイル

2行目：設定ファイル読込ワークフローより返ってきた辞書変数を受け取る
名前：arg_out_設定ファイル
※設定ファイル読込ワークフロー内にて設定
方向：出力
型：System.Collections.Generic.Dictionary(key：String、value：Object)
値：dic_設定ファイル

準備は以上。

これにより別のロボでも設定ファイルの内容を変えるだけでワークフローを変更する事なく、設定ファイルの読込が行える。

ReFrameworkのinitがおそらく同様の処理をしているはずです。
/proc/[pid]/environ を見てプロセスの環境変数を確認する

/proc/[pid]/environ を見てプロセスの環境変数を確認した時のメモ

# どうやってプロセスの環境変数を確認するのか

`/proc/[pid]/environ` というファイルを確認する事で確認出来るようなのでこちらを見てみる。

[man proc](http://man7.org/linux/man-pages/man5/proc.5.html)


>/proc/[pid]/environ
>This file contains the initial environment that was set when the currently executing program was started via execve(2).
>The entries are separated by null bytes ('\0'), and there may be a null byte at the end.  Thus, to print out the environment of process 1, you would do:
>$ cat /proc/1/environ | tr '\000' '\n'

# やってみる

docker ではこんな感じで環境変数を設定できるのでこれを利用して確認。

[ENV (environment variables)](https://docs.docker.com/engine/reference/run/#env-environment-variables)


```bash
$docker run -e "deep=purple" --rm alpine env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=d24d530dff8b
deep=purple
HOME=/root
```

では実際にやってみる。
`/proc` を使って確認してみる。

```bash
# deep=purple という環境変数を設定してコンテナ(プロセス）を起動
$docker run -e "deep=purple" -d alpine sleep 10000
a4868f4b60d7fb3df4ab3c8aad11f75c3a5c144db61f5692981629c7ef8b745d

# PID を確認
$docker inspect a4868f4b60d7fb3df4ab3c8aad11f75c3a5c144db61f5692981629c7ef8b745d |grep Pid
            "Pid": 30787,
            "PidMode": "",
            "PidsLimit": 0,

# 設定した環境変数が確認出来る
$sudo cat /proc/30787/environ | tr '\000' '\n'
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=a4868f4b60d7
deep=purple
HOME=/root
```

便利。
コンテナでなくても `ps`コマンドなどで PID を特定し、環境変数を確認する事ができそう。

`/proc/[pid]/` 配下はプロセスの様々な情報が確認できそう。
VisualStudioを使ってDLLを作成

#DLLとは
DLL(ダイナミックリンクライブラリ)は動的割り付けがされるライブラリ
- exeファイルの容量が小さくなる
- アップデートするときはDLLを更新してインストールすればよい．（実行ファイルの再コンパイルは不要）

と，メリットが大きいです．そこでDLLを1から作ります．

#C++でDLLの作成
1. DLLのひな型を作成
2. DLLで提供する関数の作成
3. 関数作成時の注意点，小技

## 新規プロジェクト作成
VisualStudioで新規プロジェクト作成から言語をC++にしてダイナミックリンクライブラリを選択すると，DLLのひな型が出来上がります．
そうするとDLLのmain関数にあたるものが作成されます.

```C++:dllmain.cpp
#include "pch.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
```

##メソッドの作成
DLLで提供する関数は先頭に`__declspec(dllexport)`をつけて，それを利用する側は`__declspec(dllimport)`を先頭につけるのが原則です．
ただ利用する側がdllexportをdllimportに毎回書き換えるのは面倒なので，マクロを定義するのが一般的です．
作成側はプロジェクトのプロパティから「C/C++>プリプロセッサの定義」へ行き，PRODUCT_EXPORTSを定義します．
そうすると作成側のマクロではPRODUCT_APIがdllexportとなります．
利用する側はPRODUCT_EXPORTSを定義せずに使うのでPRODUCT_APIはdllimportに切り替わります．

```C++:product_dll.h
#ifdef PRODUCT_EXPORTS
#define PRODUCT_API __declspec(dllexport)
#else
#define PRODUCT_API __declspec(dllimport)
#endif

class PRODUCT_API Product
{
public:
unsigned long OpenDevice(HANDLE handle);
};

PRODUCT_API unsigned long OpenDevice(HANDLE handle);
```

## 関数作成時の注意点
### extern cをつける
C++コンパイラでは**マングリング**と呼ばれる処理を行なっています．C++は関数のオーバーライドや名前空間を使って同じ名前の関数でも違う機能を与えることがでるので，それらの区別がつくようにコンパイラで関数のシンボルに文字を付け加えています．
これがDLLをC言語で使う場合に邪魔になるので関数には``extern "C"``を付けます．


```C++:product_dll.h

// 関数のプロトタイプ宣言はextern "C"の中
#ifdef __cplusplus
extern "C"
{
#endif

PRODUCT_API unsigned long OpenDevice(HANDLE handle);

#ifdef __cplusplus
}
#endif
```

### 型を自動でOSに合わせる
HANDLE型はOSのメモリによってサイズが異なり，x86では32ビット, x64では64ビットとなります．プラットフォームに応じて容易に切り替えられるようにハンドルの型をマクロで定義します．
x64にしてビルドする際には_M_X64Xというマクロが定義されるのでそれを利用しますコンパイルされます．

```C++:sample_dll.cpp
#ifdef _M_X64
#define COM_HANDLE unsigned long long
#else
#define COM_HANDLE unsigned long
#endif
```
javascriptによる年月日と日時を表示する



##この記事のゴール
Dateオブジェクトを利用して『年/月/日　時：分』といった形でブラウザに表示させる。
そのためには、年、月、日、時、分を個別に取得する必要がある。

##Dateオブジェクトでできる事
1.現在日時を取得する
2.過去や未来の日時を設定する
3.日時の計算をする

※今回は1.の現在日時を取得するをやる

##コードを書いてみる

```.script.js

const now = new Date();//Dateオブジェクトを初期化する
const year = now.getFullYear();//年の取得
const month = now.getMonth();//月の取得
const date = now.getDate();//日の取得
const hour = now.getHours();//時の取得
const min = now.getMinutes();//分の取得

const output = `${year}/${month + 1}/${date} ${hour}:${min}`;//テンプレート文字列を使用する
document.getElementById('time').textContent = output;
```

###HTMLで取得する
```.html
<p>最終アクセス日時:<span id="time"></span></p>
```

##解説

```.script.js
const now = new Date();//Dateオブジェクトを初期化する
```
最初にこのコードで、Dateオブジェクトを初期化する。
理由は、オブジェクト=メソッドやプロパティを持っているから。
また、()にパラメータを含めいない場合はDateオブジェクトは現在日時を記憶した状態で初期化される。
初期化したデータを基準日として使って、日時の計算等を行う。
例、10日後が何日かを計算する
######ちなみに、後述されている get〇〇はDateオブジェクトのメソッド。

##解説2
```.script.js
const output = `${year}/${month + 1}/${date} ${hour}:${min}`;
```
なぜ、month=月のところだけ『+1』されているのか??
getMonthメソッドは『実際の月−１』の数字が取得されてしまうため、+1してやらないと期待した値で出力できない。
あとはoutputするだけ。

##余談
####初期化するオブジェクト、しないオブジェクトについて
Dateオブジェクトのように初期化するオブジェクトもあれば、documentや、windowオブジェクトのように初期化しないオブジェクトが存在する。
オブジェクトによって初期化の有無の判断は
#####・複数のオブジェクトを作れるオブジェクトは初期化する
#####・複数のオブジェクトを作れないオブジェクトは初期化しない

#####複数のオブジェクトを作成とは???
今回のDateオブジェクトを例に見ると、

(元オブジェクト)                 　　　　　　　　　(コピーしたオブジェクト)
Dateオブジェクト　→new Date();→　dateオブジェクト

という構造となり、複数のオブジェクトを元オブジェクトから作成できる。
この初期化は、元オブジェクトのコピーを作る事。
そのコピーに値を入れ、複数のオブジェクトを作り計算などをする。
例
dateオブジェクトA - dateオブジェクトB = 期待する値

このように複数のオブジェクトを作成して、計算などを行う場合は初期化させるコードが必要となる。

#####逆に複数作成しないオブジェクトとは???
windowオブジェクトやdocumentオブジェクトの役割を見てみると
windowオブジェクトはブラウザウィンドウの事を指し、documentオブジェクトはそこに表示されているHTMLそのものを指しているから、ブラウザウィンドウやHTMLは1つしかなく、コピーを作れないようになっているから、初期化しないという事。
Google Cloud Storage へCSVをアップロードすると文字化けする→jsonで解決

#結論
StorageにアップロードするCSVをisonに変えたら文字化けしなくなった

#前提
Storage API でファイルをアップロードする方法はこちらの公式ドキュメントを参照
https://cloud.google.com/storage/docs/uploading-objects#storage-upload-object-python

#実験結果
##CSVの場合
###元データ
ローカルで作成したCSV(UTF-8)

```storage_upload.csv
supplements,錠剤
...
```
###結果
StorageにアップロードされたCSV

```storage_upload.csv
supplements,骭蜑
...
```
##jsonの場合
###元データ
```storage_upload.json
{{"name":"supplements","名前":"錠剤"},{...}}
```
###結果
元データと同じ

```storage_upload.json
{{"name":"supplements","名前":"錠剤"},{...}}
```

#備考
```writeJson.py
import json
class WriteJson:
    def __init__(self, ad_data, new_file,file_name):
        self.ad_data = ad_data
        self.new_file = new_file
        self.file_name = file_name
    def write(self):
        method = "w" if self.new_file else "a"
        f = open(self.file_name, method, encoding="utf-8")
        json.dump(self.ad_data,f,ensure_ascii=False)
```
→最後の行でensure_ascii=Falseとしないと出力されるデータが"\uXXXX"の形にエスケープされてしまうので注意

```
        json.dump(self.ad_data,f)　→ エスケープされてしまう
```
[[python] JSONファイルのフォーマットを整えてDumpする](https://qiita.com/Hyperion13fleet/items/7129623ab32bdcc6e203
)


#作業メモ：記事の背景
・Pythonでスクレイピングしている
→CSVをデータを BigQuery に送るループ処理を行っていると以下のエラーが出た
「10054, '既存の接続はリモート ホストに強制的に切断されました'」
→代替策としてCloud Storage へ一旦ファイルアップロードをしてみようと思った
→UTF-8でエンコードしたCSVをStorageにアップロードすると全ての日本語が文字化けした
→検索しても2019/11/06現在これといったものがヒットしない
https://stackoverflow.com/questions/45394157/google-cloud-storage-not-handling-utf-8-filenames
https://groups.google.com/forum/?hl=ja#!topic/google-app-engine-japan/0NHIIqbLx9w


jsonにする以外に良い方法をご存知の方教えてください__(._.)_


---
何かあればお手数ですが、本記事か以下アカウントでお知らせください！

**\ *Follow Me!* /**
**[*Qiitaアカウント*](https://qiita.com/MasatoEmata)**
**[*Twitterアカウント*](https://twitter.com/masatoemata)**
for文の書き方 JavaScript

メモ程度に書いてます。
JSによる繰り返し処理の書き方

```js

for(初期化式; ループ継続式; 増減式){
 //処理内容
}

for( var i = 1; i <= 3; i++){
  console.log(i)
}
```

ブラウザで検証ツールでconsoleを見てみると
1
2
3
と表示される
【Swift5/iOS13】iphoneライブラリから動画を取得する際に失敗したときの対処法

##【環境】
*  Swift 5
* iOS 13
* Xcode 11.1

## 【結論】
- UIImagePickerControllerを使ってiPhoneライブラリ（アルバム？）から動画を選択してファイルを取得する場合は、`didFinishPickingMediaWithInfo`の`mediaURL`から`tmp領域`に動画をコピーしてからファイルを取得する

## 【経緯】
### やりたかったこと
- iPhoneのライブラリ内の動画を選択してFirebaseのstorageにアップロードしたい！！

### しかし、、
- 何故か撮影した動画はアップロードできるのに、ライブラリから選択した動画はアップロードできない！

エラーログ

```swift
2019-11-05 16:37:01.505375+0900 Scene[21955:2706427] Failed to issue sandbox extension for file file:///private/var/mobile/Containers/Data/PluginKitPlugin/3FD99AEA-C405-4886-A8DD-701F1F882A0E/tmp/trim.BA3324A3-E9C0-48B1-A16A-59E932DF9F49.MOV, errno = 1
```

動画選択後のソースは↓の感じ

```swift
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    guard let videoURL = info[.mediaURL] as? URL else { return }
    self.addVideo(videoURL)
}
```

### そこで！
- 撮影した動画とライブラリから選択した動画のURLを見てみたところ、以下のような違いがありました

```
①撮影した動画
file:///private/var/mobile/Containers/Data/Application/A00AD0CC-247C-4574-A61A-2CF3AB74A55D/tmp/519E27E3-BF00-4132-BD79-136A6E691DF3.MOV

②ライブラリから選択した動画
file:///private/var/mobile/Containers/Data/PluginKitPlugin/3FD99AEA-C405-4886-A8DD-701F1F882A0E/tmp/trim.564F1BED-E555-428B-8AFD-73C96FDE6DB1.MOV
```
`Application` じゃなくて`PluginKitPlugin`になっとるやんけ！

### ググってみた
- [こちら](https://stackoverflow.com/questions/57798968/didfinishpickingmediawithinfo-returns-different-url-in-ios-13)のスタフロがヒット

> The issue may be connected to the lifetime of the url, which is extant with the lifetime of NSDictionary<UIImagePickerControllerInfoKey,id> *)info object. If the object is deallocated, the url is invalidated. So you can keep a reference to the object or copy the media to a more permanent location. I had a similar issue after the update to iOS 13 / Xcode 11.

どうやらiOS13からこの事象が発生するようになったのかは謎ですが、urlのライフタイムが死んだあとに参照してるからだめっぽいこと

### ということで
- じゃあ一旦tmp領域にcopyItemしてからアップロードしてみよ〜、という浅はかな発想で試したらできました
- Swift勉強し始めて2ヶ月も経ってないので、多分（というか絶対）tmp領域にcopyItemしなくてもいい方法があると思うので詳しいパイセン方教えて下さいm(__)m !!
【Python中級者への道】記事リンクまとめ


# はじめに

研究で使用するPythonをもっと使いこなす必要があるため、個人的に書いたものをまとめていきます。

# 記事リンク

- [中級者へのModern Python ツールならびに環境構築](https://qiita.com/ganariya/items/2815c5d19345466ff683)
- [【中級者への道】Pythonのプロパティを理解する](https://qiita.com/ganariya/items/f689c0eb783e3e4f9a14)
- [【中級者への道】Pythonはすべてオブジェクトらしい](https://qiita.com/ganariya/items/780ea8a1327d16307dc7)
- [【中級者への道】Pythonの*args, **kwargsって何？](【中級者への道】Pythonの*args, **kwargsって何？)
- [【中級者への道】Pythonの組み込み関数varsを活用する](https://qiita.com/ganariya/items/e01e0355c78e27c59d41)
- [【Python中級者への道】動的に実行メソッドを変数名で指定する](https://qiita.com/ganariya/items/3b8861788ec30238a8a9)
- [【Python中級者への道】独自クラスを比較演算を可能にする](https://qiita.com/ganariya/items/b0a96c2e23e977caec2f)
- [【Python中級者への道】__call__でクラスインスタンスを関数のように呼び出す](https://qiita.com/ganariya/items/27ade6b149728f6aae88)
- [【Python中級者への道】独自クラスにinを定義する](https://qiita.com/ganariya/items/b4bbb330d33cf5c3e842)
- [【Python中級者への道】三項演算子を利用する](https://qiita.com/ganariya/items/24131422c26ddaf8f018)
- [【Python中級者への道】リスト内包表記でif文を使う](https://qiita.com/ganariya/items/7ef860d76778163c3b90)
- [【Python中級者への道】lambda式を使う](https://qiita.com/ganariya/items/cced2bed82b9357bb078)
- [【Python中級者への道】pipでパッケージを一括インストールする](https://qiita.com/ganariya/items/1b39cf31b04f0e288417)
- [【Python中級者への道】クラスに__getattr__関数を定義する](https://qiita.com/ganariya/items/4f80b10d1d362e6c0fab)
依存関係逆転の法則とクリーンアーキテクチャ

## この記事について
この記事は、 [弁護士ドットコム Advent Calendar 2019 - Qiita](https://qiita.com/advent-calendar/2019/bengo4com) の 18 日目の記事になります。


# 依存関係逆転の法則 (The Dependency Inversion Principle, DIP)


以前 [Eureka Tech Blog](https://medium.com/eureka-engineering)の中で、SOLID 原則の D についての [依存関係逆転の原則の重要性について - Eureka Engineering](https://medium.com/eureka-engineering/go-dependency-inversion-principle-8ffaf7854a55) という解説がありました。依存関係逆転についてコードも交えた実例としての説明があり非常に参考になるとともに、私の周りで議論が起こりましたので、それについて考察を行った結果を記してみたいと思います。

元となった記事での解説内容を簡単にまとめますと次のようなものです。(各図は元記事から引用)

以下のような Controller :arrow_right: Service :arrow_right: Repository という呼び出し関係があったとします。

#### 図1
![controller-service-repository.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15966/37de0c76-c591-0255-69ca-5d3c7aa9a5f9.png)

これに依存関係逆転(DIP)を適用すると

#### 図2
![controller-service-repository-dip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15966/0fd81f81-35ca-2cd2-c5a3-c38f79e57e61.png)

となり、呼び出し元がインターフェースを規定することで、ServiceやRepositoryの実装に修正があった場合でも、呼び出し元では修正の必要がなくなります。

# クリーンアーキテクチャとの対比

DIPの説明として

> 上位のモジュールは下位のモジュールに依存してはならない。

というものがあります。これを上の図に当てはめると、

上位: Controller, 下位: Service
上位: Service, 下位: Repository

というそれぞれの関係に対して、依存関係を逆転させたと考えられます。

ここで、上の構造を[The Clean Architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html) との対比で見てみます。

#### 図3
![TheCleanArchitecture.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15966/59c61be8-139b-92f3-8b1a-09b6e9f378a9.jpeg)

Repository はこの図においては Gateways に当たりますので、

Controller 及び Repository: **Interface Adapters**
Service: **Application Business Rules(Use Cases)**

という対応になると考えられます。

この同心円の図では外側が内側に依存するという関係があります。それを上位/下位で捉えると内側が上位ということになりますのでこの場合、

上位: Service
下位: Controller, Repository

という上下関係になり、クリーンアーキテクチャを取り入れる場合には、Serviceを上位とする構造を考える必要があるのでは?という議論が私の周りで起こりました。

# 再度の依存関係逆転

クリーンアーキテクチャーの観点から

上位: Service, 下位: Controller

として、[図2](#図2)の Controller と Service の依存関係を再度逆転させてみたものが次の[図4](#図4)です。


#### 図4
![dip-with-clean-architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15966/0fa319c9-86f0-0d35-1eb3-08f4f216e683.png)

やったことは、UserServiceInterfaceをControllerからServiceの方に移動したことで、こうしてみると、[図3](#図3)の右下にある図のPresenterの部分をRepositoryに置き換えたものと、同じ依存関係の図が得られました。

# 終わりに
弁護士ドットコムで提供している[クラウドサイン](https://www.cloudsign.jp)ではGoでバックエンドの開発を行っています。個人的な感想になりますが、Goは大変おもしろい言語だと感じています。
今回は考察をすすめるにあたってGoの実例を見ながら行ったのですが、おかげでGoのinterfaceおよびSOLID原則に対する理解が深まったと思います。今回の考察を行うきっかけになった記事を書かれたEurekaのrikiiさんに感謝いたします。さまざまな有益な情報を公開されていて非常に勉強になります。

さて、クリスマスまでまもなくですね。みなさま素敵なクリスマスをお迎えください。
【VSCode Remote Development】エラー対処：Finding installed ssh failed: The "path" argument must be of type string. Received type undefined 

# 環境

- Windows 10 pro
- Visual Studio Code 1.38.1 (2019-09-11以降)
- Git BashのSSHを使用 (参考：[Git BashでWindowsで気軽にSSHコマンドを使う](http://tanaka-misaki.blogspot.com/2017/06/git-bashwindowsssh.html))

# 現象

Remote Developerをインストール後、仮想環境に接続しようとしたら以下のエラーが表示された。

```powershell
remote-ssh@0.47.2
win32 ia32
SSH Resolver called for "ssh-remote+localhost", attempt 1
SSH Resolver called for host: localhost
Setting up SSH remote "localhost"
Using commit id "" and quality "stable" for server
Finding installed ssh failed: The "path" argument must be of type string. Received type undefined
Resolver error: The "path" argument must be of type string. Received type undefined
```

```localhost``` はホスト名。
今回はVagrantの仮想環境に接続するため、```.ssh\config```は以下の通り。

```powershell
Host localhost
  HostName localhost
  User vagrant
  Port 2222
  IdentityFile [ your private_key path ]
```

# 原因

```Finding installed ssh failed``` との記述があるので、VS CodeからPC上の```ssh.exe``` が見つからない模様。

```powershell
Finding installed ssh failed: The "path" argument must be of type string. Received type undefined
Resolver error: The "path" argument must be of type string. Received type undefined
```

# 解決策

「設定 > 拡張機能 > Remote SSH > Path」に、```ssh.exe```のPathを追記する。
![sshPath.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320770/f82f060a-5117-e7a0-0329-8c277a35e704.jpeg)

左下の「><」から再度リモート接続を試みる。
![sshRemote.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320770/c620f19e-6d76-2f29-4d39-0936fd8afef9.jpeg)

無事に接続できました。
![sshRemote2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320770/c9b29034-bad6-9627-ff86-242b629cc0fe.jpeg)

以上
python pandas 勉強　最近のまとめ

#要素ごとの集計
いろいろやってみたんですが、
こんな感じで落ち着きました。

```py
for sp in set(data['要素']):
	df_op = data[data['要素'] == sp]
	com_plot(df_op,sp)　　#集計する関数へ移動。
```

#集計するファイルを１つから複数に
ファイル名称を選択していたが、
*（アスタリスク）を使うようにした。

```py
import glob

print("トランザクションデータ読み込み開始")
csv_name	=	r"インプットデータのあるフォルダ\*.csv"
csv_files	=	glob.glob(csv_name)
list = []

for f in csv_files:
    list.append(pd.read_csv(f, index_col=0).drop(['Payment Number','Refund Number'], axis=1))
df = pd.concat(list)
```

#複数選択することができたので、日付を入力させて動き方を変更する
「YYMMDD」、「YYMM」、「all」のいずれかを入力することで処理内容を変更する。
※トランザクションデータは日時で保持しており、月ごとにフォルダを分けているので、
　関数先で入力日付からyy、mm、ddを分解もしている。

```py
def main():
	print("集計日付を指定「YYMMDD」 or 「YYMM」 or 「all」")
	print("集計日付の形式で取得内容を変更")
	day = input("集計日付を指定 -> ")
	print("")
	
	if (len(day) == 6):
		print("日時データ集計")
		df = day_data(day)
		data_plot(df,day,True)
		top_20(df,day)
	elif (len(day) == 4):
		df = o_mon_data(day)
		data_plot(df,day,True)
		top_20(df,day)
	elif (day == all):
		df = month_data()
		data_plot(df,day,False)
	else:
		print("やりなおしー")
		main()

if __name__ == '__main__':
	main()


def day_data(day):
	print("これで抽出→:", day)
	yy = day[:2]
	mm = day[2:4]
```

#top20の作成
TOTALを付与→sort→TOTAL削除
私の環境ではTOTAK行、列の削除時にちょっと怒られる。。。

```py
#TOTALで降順ソート
data.sort_values(['TOTAL'],ascending=False,inplace=True)

#上位20位のものを使用して、行列入れ替え
pvtop20=data[:21]

#TOTAL行、列の削除
drop_idx = ['TOTAL']
pvtop20.drop(drop_idx, inplace=True)

drop_col = ['TOTAL']
pvtop20.drop(drop_col, axis=1, inplace=True)
```

#付加情報紐づけ
キーが同じデータから紐づけ。
辞書（dict）を使う想定だったけど、
pandasの機能がすごかった。。。

```py
print(デイリーデータ　＋アルファ)
data = pd.merge(df, tenbun_meisai, on=["キー"])
```


perlでのcsv集計が考え方のベースだったが
なんやかんややりたいことはできてきた。

tkinter書き忘れてたから追記

```py

import os, tkinter, tkinter.filedialog, tkinter.messagebox

# ファイル選択ダイアログの表示
root = tkinter.Tk()
root.withdraw()

#csvを抽出したいので拡張子がcsvを表示
fTyp = [("","*.csv")]

#インプットファイルが存在するフォルダを指定
iDir = r'hoge' 

#インプットファイル選択
tkinter.messagebox.showinfo('データ抽出対象選択','処理ファイルを選択してください！')

file = tkinter.filedialog.askopenfilenames(filetypes = fTyp,initialdir = iDir)

list = []
for f in file:
	list.append(pd.read_csv(f, index_col=0).drop(['Payment Number','Refund Number'], axis=1))
df = pd.concat(list)
```
Cognos Analytics スライサーをオプションにする

#スライサーをオプションにする
最近質問を受けたので、やり方を共有しておきます。
元ネタはこちらの記事です。
**How to create optional slicers**
http://cognosknowhow.blogspot.com/2013/08/how-to-create-optional-slicers.html

#単一選択プロンプトでデフォルト値の指定が無い場合
プロンプトページの「値のプロンプト」が、「複数選択」が「いいえ」で、「デフォルトの選択肢」に指定がない場合のスライサーの書き方です。
<img width="611" alt="001.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/ba8d65ca-1b53-0c57-803e-19e38cac2020.png">

クロス集計クエリー内容
<img width="546" alt="002.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/dcc0617e-3686-4694-fd4e-a5a4129ea609.png">

スライサー記述
※[販売].[製品].[製品]は「階層」

```html
#prompt('pPL','memberuniquename','rootMember([販売].[製品].[製品])')#
```

レポート実行時のプロンプト
プロンプトを選択していないが「終了」を選択できる。
<img width="363" alt="004.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/6caa42c4-eac9-5add-a2c9-0c377322d580.png">


#単一選択プロンプトでデフォルト値の指定が有る場合
値のプロンプトにデフォルト値を指定したい場合、スライサーは以下の記載になります。

```html
#prompt('pPL','memberuniquename','[販売].[製品].[製品].[製品ライン]->[Products].[991]')#
```

[Products].[991]は「キャンプ用品」の事ですが、このようにソースタブからメンバーとしての「キャンプ用品」にカーソルを合わせると表示されるので、こちらを記載します。
<img width="885" alt="005.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/7948ef6a-a0fa-5119-f249-9a8368f126d5.png">

値のプロンプトの「デフォルトの選択肢」は以下の記載になります。
<img width="731" alt="006.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/97901952-9eb9-24b0-6d06-e124c004b11a.png">

レポート実行時のプロンプト
「キャンプ用品」が選択された状態で表示される。
<img width="356" alt="007.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/9d04f3f2-384e-7330-a7e6-cf2013401fa6.png">

#複数選択プロンプトでデフォルト値の指定が無い場合
値のプロンプトで「複数選択」を「はい」にして、「デフォルトの選択肢」を指定しない場合です。
<img width="728" alt="008.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/f4ac7fee-fb98-1ea3-6f35-4c6df267327b.png">

スライサーは以下の記載になります。promptmanyにして、「'set(','',')'」を追加しています。

```html
#promptmany('pPL','memberuniquename','rootMember([販売].[製品].[製品])','set(','',')')#
```

レポート実行時のプロンプト
プロンプトを選択していないが「終了」を選択できる。
<img width="351" alt="009.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/ae3f0d4c-0f35-de28-b961-adbd9235246a.png">

#複数選択プロンプトでデフォルト値の指定が有る場合
複数選択の値のプロンプトにデフォルト値を指定したい場合、スライサーは以下の記載になります。※[993]は個人装備です。

```html
#promptmany('pPL','memberuniquename','set([販売].[製品].[製品].[製品ライン]->[Products].[991],[販売].[製品].[製品].[製品ライン]->[Products].[993])','set(','',')')#
```

「デフォルトの選択肢」は、以下のように「＋」ボタンで複数指定してください。
<img width="728" alt="010.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/39df581b-ca35-c8e2-dc1b-d681cab66b16.png">

レポート実行時のプロンプト
「キャンプ用品」「個人装備」が選択された状態で表示される。
<img width="360" alt="011.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/d44b494c-d98a-edec-74a9-ca534460463e.png">