OmniAICreator/Qiita-1.07M huggingface dataset:
Unity C#とC++間の配列・構造体の連携(備忘録)

# はじめに
https://qiita.com/KyoheiOkawa/items/4c6b9ed23fbf45dc5a19

前回C++プラグインの各種プラットフォームのテンプレートを作成した記事を書きました。
配列と構造体の連携方法を備忘録として残します。
ソースは前回作成したテンプレートを元にビルドしていきます。

# C++コード
## ヘッダー
```cpp
#ifndef SOURCE_LIBRARY_HPP
#define SOURCE_LIBRARY_HPP

#ifdef _WINDOWS
    #define _CRT_SECURE_NO_WARNINGS
    #define DLL_EXPORT __declspec(dllexport)
#endif

#ifndef _WINDOWS
    #define DLL_EXPORT
#endif

struct SampleStruct {
    int a;
    float b;
    char c;
};

extern "C"  {
    DLL_EXPORT void intArray(int* ptr, int length);
    DLL_EXPORT void sampleStruct(SampleStruct* ret);
};

#endif //SOURCE_LIBRARY_HPP
```

## ソース

```cpp
#include "library.hpp"


void intArray(int* ptr, int length) {
	for (int i = 0; i < length; i++) {
		ptr[i] = i + 1;
	}
}

void sampleStruct(SampleStruct* ret) {
	ret->a = 5;
	ret->b = 5.5f;
	ret->c = 'c';
}
```

# C#とC++のブリッジ

```csharp
using System;
using System.Runtime.InteropServices;

public class PluginTest
{
    public struct SampleStruct
    {
        public int a;
        public float b;
        public char c;
    }
    
#if !UNITY_EDITOR && UNITY_IOS
    private const string PLUGIN_NAME = "__Internal";
#else
    private const string PLUGIN_NAME = "sampleplugin";
#endif

    [DllImport(PLUGIN_NAME)]
    public static extern void intArray(IntPtr ptr, int length);

    [DllImport(PLUGIN_NAME)]
    public static extern void sampleStruct(IntPtr intPtr);
}

```

# int配列の連携
## C#側
```csharp
int arraySize = Marshal.SizeOf(typeof(int)) * 5;
IntPtr intPtr = Marshal.AllocCoTaskMem(arraySize);
PluginTest.intArray(intPtr, 5);

int[] intArray = new int[5];
Marshal.Copy(intPtr, intArray, 0, 5);
for (int i = 0; i < intArray.Length; i++)
{
    Debug.Log($"index:{i} value:{intArray[i]}");
}
Marshal.FreeCoTaskMem(intPtr);
```

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188476/ef32836a-e7ea-ad10-05d4-dad4e6523a3c.png)

# 構造体の連携

## C#側

```csharp
PluginTest.SampleStruct sampleStruct = new PluginTest.SampleStruct();
IntPtr pStruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(sampleStruct));
Marshal.StructureToPtr(sampleStruct, pStruct, false);

PluginTest.sampleStruct(pStruct);

sampleStruct = (PluginTest.SampleStruct)Marshal.PtrToStructure(pStruct, typeof(PluginTest.SampleStruct));

Debug.Log($"a:{sampleStruct.a}");
Debug.Log($"b:{sampleStruct.b}");
Debug.Log($"c:{sampleStruct.c}");

Marshal.FreeCoTaskMem(pStruct);
```

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188476/0962c7bb-e538-0236-1e31-96cbb16c2400.png)

## 補足

```csharp
Marshal.StructureToPtr(sampleStruct, pStruct, false);
```

第３引数は第２引数のポインタが示す構造体を破棄する場合はtrue。

今回は破棄する必要が無いのでfalse。

https://docs.microsoft.com/ja-jp/dotnet/api/system.runtime.interopservices.marshal.structuretoptr?view=net-6.0


# 注意点
C++側でnewしたものをreturnすると、メモリリークの原因になるので、C#側でメモリの確保と解放をしたほうが安全。
処理の都合上C++側でnewが必要なものに関しては、処理が終わるころにはすべて解放するようにするか、解放用の関数を別途作成してC#側から呼び出すという方法が必要。
オリジナルアプリのデータベース登録で、createを使った。

オリジナルアプリのデータベース登録で、悩みに悩み試しにcreateを使ってみることにしました。

# モデルにfillable属性を追加
```Playerdata.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Playerdata extends Model
{
    protected $table = 'playerdata';
    
    protected $fillable = ['playername', 'times_at_but', 'hit', 
        'hit_point', 'hit_adv', 'homeruns', 'steals', 'ining',
        'balls', 'hit_by_a_pitch', 'by_homeruns', 'wins', 
        'loses', 'saves', 'resp_points', 'lost_points', 'saved_adv'];
    
}
```

# 各コントローラーに処理を追加(追加部分）
```ButterController.php
public function datainsert(){
        $dataname = new Dataname();
        
        $dataname->create([
            'playername' => '',
            'times_at_but' => '',
            'hit' => '',
            'hit_adv' => '',
            'homeruns' => '',
            'steals' => ''
        ]);
}
```

```PitcherController.php
public function datainsert(){
        $dataname = new Dataname();
        
        $dataname->create([
            'playername' => '',
            'ining' => '',
            'balls' => 'testpassword',
            'hit_by_a_pitch' => '',
            'by_homeruns' => '',
            'wins' => '',
            'loses' => '',
            'saves' => '',
            'resp_points' => '',
            'lost_points' => '',
            'saved_adv' => ''
        ]);
    }
```
スクレイピングなので、値は空欄にしてあります。
# 結論
とりあえず、試しに書いてみただけなので、あっているかはわかりません。
データベース登録が無事にできればいいです。
僕が初心者にRailsを勧める理由

## 最初に

プログラミングを学習しよう！って思った時に

・どの言語を選んでいいかわからない
・Webアプリを作りたい

と思った方に僕は強くRuby(Ruby on Rails)をおすすめしてます

今回はなぜおすすめなのかという理由を書いていきたいと思います

前提としてRuby単体ではなくフレームワークのRailsもセットでおすすめしています

### 開発速度が早すぎる

なんと言ってもこれ

例えば掲示板アプリなどを作ろうとした時PHPを使ったりするより倍以上の速さでRuby(Rails)は作れます

開発速度が早いのですぐになにか作品が作れます

そうなると学習をはじめて早い

>作品ができた！

と自信に繋がります

モチベーションも上がりますしね

当サイトでもたっち1日でRailsでWeb開発からリリースまで行える講座を用意しています

### コードがスッキリ

かなりスッキリしていて見返す時にわかりやすいんですよね

この2つは同じ意味を持つコードです

まずはJavaScript
```javascript:
var manga = ['DB', 'ハガレン', 'こち亀'];
for (var i = 0; i < manga.length; i++){
    console.log(manga[i]);
}
```



続いてRuby
```ruby:
manga = ['DB', 'ハガレン', 'こち亀']
manga.each do |manga|
    puts manga
end
```



すっきりしていると思います

見やすいかどうかは個人差ありますが僕はJavaScriptやPHPより見やすいと思うのでおすすめしています

### Gemが豊富

Gemとはプログラムの集合体です

例えばログイン機能を作りたいと思った場合かなりの技術と時間を要します

ですがログイン機能を実装してくれるGemを使えば10分程度で使えます

ユーザーが投稿した画像ファイルを表示するGemやページネーションが実装できるGemなどかなりの豊富です

## Railsを学ぶなら
HeiProではたった1日でWeb開発からリリースまでの技術を習得できる講座を公開しています
ご興味のある方はぜひ
https://heipro.site/
TypeScript学習のアウトプット2

## はじめに
この記事は「プロを目指す人のためのTypeScript入門」を元にアウトプットした記事になります。

また私の現在のレベルは実務経験1年程度の駆け出しフロントエンドエンジニアなので、もし誤った解釈などしておりましたらコメントでご指摘いただけますと幸いです。

## 対象者
この記事は下記のような人を対象にしています。

- TypeScript学習中の方
- Vue.jsやReactの知見はある程度あるが、TypeScriptの知見が乏しい方
(↑まさに自分はこれでした。。。)

それでは早速アウトプットに入っていきます。
(序盤はJavaScriptに関するアウトプットが多いです。)
## 内容

### constでもプロパティの再代入は可能
```js
cosnt obj = {
  foo: 123,
  bar: 'aaa',
}

// ok
obj.foo = 456

// no
cosnt obj = {
  foo: 456,
  bar: 'bbb',
}
```
定数宣言の「const」を使っていてもプロパティの値は変更できます。
当然ですが、再宣言はNG

また、最近はプロパティの最後にも「,」を付けるのが慣例らしいです。
理由は下の2つです。

①「要素」の間に「,」が並んでいるという見方から「要素,」のセットが並んでいるというシンプルな見方に変えることができる
②Gitでも余分な差分を発生させずに済む。

### オブジェクトの比較は値ではなくメモリで見る。
```js
const foo = { num: 1234 };
const bar = foo;
const baz = { num: 1234 };

// true
console.log(foo === bar);

// false
console.log(foo === baz);
```

`const bar = foo`は同じメモリの値を変数barと変数fooの2箇所に格納している状態です。
そのため比較をしてもtrueとなります。

しかし、新しいメモリを使って生成した変数bazについては、たとえ中身が全く同じだったとしてもメモリ自体は別々なのでflaseとなります。

＊自分の別記事ですがこちらを見るとよく分かるかもしれません。
[【JavaScript】使用してはまずい破壊的メソッドの話](https://qiita.com/y-riki/items/81a47fa25f961de6ef6b)

### TypeScriptでは2つの方宣言がある。
```ts

// type文
// TypeScriptではかなり頻出
// オブジェクト型以外もなんでもok
type FooBarObj = {
  foo: 123,
  bar: 'test',
}

// interface宣言(ほぼ使わない)
// 2014年以前使われていたらしい
// interface宣言が使えるのはオブジェクト型のみ
interface FooBarObj {
  foo: 123;
  bar: 'test';
}
```

TypeScriptの型宣言には以下の2つがあります。
①type文での型宣言
②interface宣言

ただし今は①メインで使われており、②は2014年以前に使われていたものらしいです。

利便性もtype文ではプリミティブ型やオブジェクト型関係なく、何でも型宣言できるのに対し、interface宣言ではオブジェクト型のみなので、type文のみ抑えとけば問題なさそうです。

### 動的プロパティの時に用いるインデックスシグネチャ
```ts
type PriceData = {
  [key: string]: number;
}

const data: PriceData = {
  apple: 220,
  coffee: 120,
  bento: 500,
}

// ok
data.chicken = 250;

// コンパイルエラー
// Type '"foo"' is not assignable to type 'number'.
data.弁当 = "foo";
```

プロパティ名が動的に決まるときはtype文での型宣言ではなく、インデックスシグネチャを使います。
[key: string]とは、「任意のstring型のキーに対して」という意味。

オブジェクトのプロパティ名は全て文字列で表現されるので、これは「任意のプロパティ名に対して」とも言い換えることが可能。

**ただし、このインデックスシグネチャはあまり多用すべきではないっぽいです。**

理由は、**TypeScriptが保証する方安全機能を破壊**してしまうからです。

### オプショナルなプロパティの宣言
```ts
type MyObj = {
  foo: boolean;
  bar: boolean;
  baz?: number;
}

const obj: MyObj = { foo: false, bar: true };
const obj2: MyObj = { foo: true, bar: false, baz: 1234 };
```

オプショナルなプロパティとはあってもなくてもよいプロパティのことを指します。
(上記コードの`baz?: number;`がそうです。)

これがあることでエラーにならず、プロパティアクセスを行えます。
```ts
console.log(obj.baz); // undefined
console.log(obj2.baz); // 1234
```

またVScodeでobj.bazにマウスカーソルを乗せると、`number | undefined`型と表示されます。

これはユニオン型とも言われ、「number型かもしれないし、undefined型かもしれない」という意味です。

さらにこの状態だと通常のnumber型のように扱うことができません。
```ts:サンプル
console.log(obj2.baz * 1000); // コンパイルエラー

// ok
if(obj2.baz !== undefined) {
  console.log(obj2.baz * 1000);
}
```

### 読み取り専用プロパティの宣言
```ts
type MyObj = {
  readonly foo: number;
}

const obj: MyObj = { foo: 123 };

// エラー: Cannot assign to 'foo' because it is a read-only peoperty.
obj.foo = 0;
```

`readonly`を付けることで**読み取り専用**となります。
再代入しようとするとコンパイルエラーが起きます。

特にプロパティを変更する予定が無ければreadonlyをつけておく方が安全です。

## 最後に
「プロを目指す人のためのTypeScript入門」を参考にアウトプットしてますが非常に分かりやすくおすすめです。

一旦は以上ですが、また時間ある時に続きのアウトプットを書きたいと思います。
もし何かあればコメントしていただけると助かります！
AtCoderを始めてから２週間の成果とやったこと(C++)

AtCoderの勉強を始めてから今日で約2週間経過したので、「これまでにやったこと」や「現状」を記述していく。(私はAtCoderにはC++しか使用しておりません)

超初心者なので、同じ超初心者の方の参考になると嬉しい。逆に元からアルゴリズムや計算量の勉強をしていた方の参考にはならないと思うので、もっと上のレベルの人の投稿を見るべきだと思う。あくまで超初心者の進捗報告だということを理解して記事を読んでいただきたい。

## 0週目. 勉強を始める前のスペック
- 情報系大学 と アルバイト でプログラミングを学んでいるが、Java や Pythonのみで、C++ は触ったことがなかった。

- 「Oracle Java Silver」を取得しているので、基礎的なプログラミング や オブジェクト指向 は理解していた。

- アルゴリズムに関する勉強  をしたことは無かった。

## １週目. C++(STL)の学習とコンテスト初参加
- １日目(水) : 初めてC++ を見たので文法の勉強

- ２〜３日目(木,金) : [AtCoder Problems](https://kenkoooo.com/atcoder/#/table/) で A問題 と B問題 の過去問演習をして問題慣れする。
※[AtCoder Problems](https://kenkoooo.com/atcoder/#/table/) : AtCoder の 過去問題 が解ける有志のサイト

- ４日目(土) : コンテストに初参加。結果は A問題のみを6分34秒で解き、レートは 9 に上昇。

- ５日目(日) : 用事があり、何もせずに１日が終了。

１週目は C++ と AtCoder に慣れるところから始めた。最初は 問題文を全く理解できなかったが、問題を何回も解くうちに問題文の理解スピード が上がっていった。この頃は まだB問題もほとんど解けなかった。
### １週目で学んだこと
- STLはコンテスト中に調べられるので、存在だけ知っておけばOK(早解きをするレベルになったら覚えるべき)
- [AtCoder Problems](https://kenkoooo.com/atcoder/#/table/)が超有能
- A問題ばかりやっていないで、さっさとB問題の演習を始めた方が良かった

## ２週目. C++(STL)の学習とコンテスト初参加
- ６〜１０日目(月〜金) : B問題の過去問演習に加え、軽いアルゴリズムの勉強を始めた。最初から動的計画法を学んだが、全く理解できなかった。理解できたのは全探索くらいだった

- １１日目(土) : ２回目のコンテスト参加。結果は A問題とB問題 を23分56秒で解き、レートは３６に上昇

- １２日目(日) : ARCに参加し、A問題すら解けなかったが、レートは５１に上昇

土日にコンテストの復習及びB問題の過去問演習を行い、A問題とB問題を安定して１５分程度で解けるようになってきた。
### ２週目で学んだこと
- 動的計画法は難しいので始めたばかりの時に学ぶべきではない
- まずは比較的簡単なアルゴリズム(全探索など)を勉強するべき
- B問題になれたら、さっさとC問題の演習を始めるべきだった

## ３週目. C問題とABS(AtCoder Beginners Selection)
- １３日目(月) : C問題の過去問演習を始めるが、TLEを連発しアルゴリズム力の無さを痛感する
- １４日目(火) : ABSの演習を始める
(ABSとは下記リンクの、「けんちょん」という方が厳選したAtCoderの過去問である)
[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067)

ABSは、A問題から簡単なアルゴリズムが必要なC問題まであり、C問題の解き方を学べるのでおすすめです。

### ３週目で学んだこと
- A問題とB問題に慣れたらすぐにでもABSを解いた方が良い
- 最初からアルゴリズムを学ぶのではなく、解けない過去問に必要なアルゴリズムを都度覚えるべきだと思った

# これからの予定 と 当面の目標

### 予定
- ひたすらC問題を解く
- 解けないC問題は解説を見てでも解けるようにする(学んだアルゴリズムはメモしておく)
- [競プロ典型90問](https://atcoder.jp/contests/typical90)の★２と★３の問題をひたすら解く

### 当面の目標
- 安定して３完できるアルゴリズム力を身につける
- あと２回のABCコンテスト参加でレート100越え

追記
・E8さんの競プロ典型90問の★2を解き終わりました！
・当記事投稿からABCとARC1回ずつの参加でレートが100を超えました！

(下記は記事投稿時のレートです)
![2022/6/22記事投稿時のレート](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705701/4ea47e15-0b2e-fcdd-5c4c-bc3a16727061.png)
AWS glue でのポート開放不備エラー

glue で crawler を使ったときに、JDBC 接続にしたところ、以下のエラーとなった。

```
ERROR : At least one security group must open all ingress ports.To limit traffic, the source security group in your inbound rule can be restricted to the same security group
```
どうやら、自分自身（のセキュリティグループ）を対象として、すべてのポートを開放する必要があるらしい。

RDS に接続しているセキュリティグループのインバウンドが、Web tier からの PostgreSQL が使用するポートしか許可しないというポリシーだけだったので、自分自身のすべてを許可するレコードを追加したら、接続できるようになり、エラーも出力されず、データベースの各テーブルのスキーマを glue で取得できるようになった。

（参考）
自己参照ルールを追加して、AWS Glue コンポーネントが通信できるようにします。具体的には、[Type (タイプ)] All TCP、[Protocol (プロトコル)] は TCP、[Port Range (ポート範囲)] にはすべてのポートが含まれ、[Source (ソース)] は [Group ID (グループ ID)] と同じセキュリティグループ名であるというルールを追加または確認します。

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/setup-vpc-for-glue-access.html
KCCS APIサービス  雷ナウキャストデータ配信機能(thunder-forecast)について

KCCS APIサービスの機能を色々と使用してみましたが、今回はその中の雷ナウキャストデータ配信機能(thunder-forecast)を使ってみます。


# 雷ナウキャストデータ配信機能(thunder-forecast)

### 提供されているデータ
・指定した緯度・経度の雷予報(1キロメッシュ単位で60分先のデータまで)
　・予報/解析時刻
　・雷活動度

KCCS APIサービスの機能概要は、こちら。
雷ナウキャストデータ配信機能の詳細については、以下の資料のサービス仕様書の「2.13 雷ナウキャストデータ配信機能（REST API）」をご参照ください。
https://www.energy-cloud.jp/documents/#service-specification

検索地点を新潟駅に指定して
緯度：37.912
経度：139.0618

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1525729/c8843332-c333-a8a0-bb85-0022d4b6e70d.png)


早速、リクエストしてみます。

```http
https://<ログインID>:<パスワード>@rest.energy-cloud.jp/api/v1/thunder-forecast?latitude=35.64564675&longitude=139.74745073974765
```

以下のようなJSONが返ってきます。

```JSON
{
  "datetime": "2022-02-16 13:40:00",
  "timezone": "+09:00",
  "request_info": {
    "latitude": 37.912,
    "longitude": 139.0618
  },
  "mesh": {
    "latitude": 37.9124999068175,
    "longitude": 139.056250000005
  },
  "values": [
    {
      "time": "2022-02-16T13:40:00+09:00",
      "value": 2
    },
    {
      "time": "2022-02-16T13:50:00+09:00",
      "value": 2
    },
    {
      "time": "2022-02-16T14:00:00+09:00",
      "value": 1
    },
    {
      "time": "2022-02-16T14:10:00+09:00",
      "value": 2
    },
    {
      "time": "2022-02-16T14:20:00+09:00",
      "value": 2
    },
    {
      "time": "2022-02-16T14:30:00+09:00",
      "value": 2
    },
    {
      "time": "2022-02-16T14:40:00+09:00",
      "value": 2
    }
  ]
}
```

纏めると

|予報/解析時刻|雷活動度|
|:---|:---|
|2022-02-16T13:40:00(JST)|2|
|2022-02-16T13:50:00(JST)|2|
|2022-02-16T14:00:00(JST)|1|
|2022-02-16T14:10:00(JST)|2|
|2022-02-16T14:20:00(JST)|2|
|2022-02-16T14:30:00(JST)|2|
|2022-02-16T14:40:00(JST)|2|

となります。

現在の雷の危険度を気象庁のページにアクセスして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1525729/87efcdea-4cc5-44fe-6c0c-2483afb62694.png)

この時の活動度は「雷の激しさを表すために活動度1～4と活動度なし」で分けられており。
KCCS API サービス仕様書より
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1525729/7b0ab65b-6a69-2e7d-71e7-137ab8444a67.png)
https://www.energy-cloud.jp/docs/KCCSAPI_DataDistribution_ServiceSpecification_3.0.0_2022020701.pdf
※「2.13.5.4. 雷活動度について」を参照のこと。

13:40は活動度が2のデータに分類されています。
※雷ナウキャストの地図上では黄色で表示されるみたいです。

気象庁発表の雷情報と合っています。
1時間後の雷の情報を見て注意したい時に使える機能になります。


# KCCS APIサービスの機能を使ってみた記事はこちら

https://qiita.com/kccs_api3/items/242d9f73a29425b97409

https://qiita.com/kccs_api3/items/48cfca432fb9ea277000

https://qiita.com/kccs_api3/items/463b985bd65a34874b4d
BigQuery のシャーディングテーブルを定期的に削除してみる

# この記事はなに？

Google Cloud Platform(以下GCP)の BigQuery のシャーディングテーブルを、Cloud Scheduler + Cloud Pub/Sub + Cloud Functions の組み合わせで、定期的に削除する方法をまとめた記事になります。

BigQuery には標準機能でテーブルに対して有効期限を設定できるのですが、シャーディングテーブルを生成するタイミングで有効期限を設定できない場合の対処方法として、この仕組みを実装しました。

# シャーディングテーブルとは？

例えば、テーブル名が

- users_20220620
- users_20220621
- users_20220622

のように、`[Prefix]_YYYYMMDD`の形式のテーブルを、シャーディングテーブルと呼びます。

実態としてはそれぞれ別のテーブルなのですが、`_TABLE_SUFFIX`を使うことで、複数のテーブルを対象にクエリを実行することができます。

# システム構成

![スクリーンショット 2022-06-22 12.24.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311026/de407d63-903d-0dd5-a4b5-d2307ce8b2d7.png)

日次で`Cloud Scheduler`のジョブを実行し、`Cloud Pub/Sub`でメッセージを受け取り、それをトリガーに`Cloud Functions`を実行する流れになっています。

以下、それぞれの設定情報を説明していきます。

# 設定手順
## Cloud Scheduler 

以下の内容でジョブを作成します。

| 項目 | 内容 |
| :-- | :-- |
| 名前 | delete-bigquery-sharding-table |
| リージョン | asia-northeast1 |
| 頻度 | * 1 * * * |
| タイムゾーン | JST |
| ターゲットタイプ | Pub/Sub |
| Pub/Sub トピック | `delete-bigquery-sharding-table-topic`という名前で新規作成 |
| メッセージ本文 | delete bigquery sharding table. |

## Cloud Functions

以下の内容で関数を作成します。

| 項目 | 内容 |
| :-- | :-- |
| 関数名 | delete-bigquery-sharding-table |
| リージョン | asia-northeast1 |
| トリガーのタイプ | Cloud Pub/Sub |
| トピック | delete-bigquery-sharding-table-topic |


以下のコードは、`lake_prod`データセットに、`salesforce_{{オブジェクト名}}_YYYYMMDD`形式でシャーディングテーブルが作られている場合のものです。
必要に応じて、データセット名やテーブル名の部分を修正していください。

```python:main.py
from google.cloud import bigquery
import re
import datetime

# 作成されてから30日以上経過しているシャーディングテーブルを削除する
def delete_bigquery_sharding_table(event, context):
  # データセットからテーブルのリストを週出
  client = bigquery.Client()
  table_list = client.list_tables('lake_prod')

  # 現在から30日前の日付をYmd形式で取得
  ymd_now = (datetime.datetime.now() - datetime.timedelta(days=30)).strftime('%Y%m%d')
  
  # 1テーブルずつ確認し、30日以上前のシャーディングテーブルを削除する
  for table in table_list:
    if re.match("^salesforce_.+_[0-9]+$", table.table_id):
      ymd_table = re.findall(r'^salesforce_.+_([0-9]+)$', table.table_id)

      if int(ymd_table[0]) <= int(ymd_now):
        table_path = table.project + '.' + table.dataset_id + '.' + table.table_id
        client.delete_table(table_path)
        print("deleted {}.{}.{}".format(table.project, table.dataset_id, table.table_id))
```

```text:requirements.txt
bigquery==0.0.8
```

# 実行

毎日AM1時に、`Cloud Scheduler`が起動し、`Cloud Pub/Sub`を経由して`Cloud Functions`に設定した Python のコードが実行されます。

デバッグしたい場合は、削除処理をコメントアウトしていただき、`Cloud Scheduler`を強制実行してください。
[#Unity]LightMapをベイクしたシーンをマルチシーンで追加で読み込んだ時の見た目の差異を解消する

# 概要
シーン単位で背景などの3Dモデルの見た目を開発し、LightMapをベイクしてそれをマルチシーンで読み込んだ時の見た目が異なったため、それを解消する方法について調べる。

## 環境
Unity 2021.3.4f1
(この記事の内容はRenderPipelineに依らない内容となっています)

## 状況
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/11875417-9e87-1494-578a-69be98a8ebce.png)
SampleSceneとBakeStageSceneを用意しました。
今回SampleSceneの中には何もなく、
BakeStageSceneは仮のPlaneとCubeが配置されており、LightMapをベイクしています。
PlaneとCubeはともにStaticであり、DirectionLightとPointLight3つはすべてBakedとなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/2dfc04a1-5abc-d09e-1bc6-ee150e75c02a.png)

シーンのLighting設定は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/9b0313fd-1190-59ad-cb57-e28d4ffdd408.png)

BakeStageSceneのSkyboxにはSkybox/Proceduralシェーダーの自作マテリアルを当てています。
LightMapベイクへの影響などをわかりやすくするためにいろいろと値を変えています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/75f4a99a-30e2-1b64-5d23-6ffeb8d2fcb4.png)


## 問題
この状態でSampleSceneにBakeStageSceneを読み込むと、BakeStageScene単体で見ていた時と全く異なることに気が付きます
SampleSceneにBakeStageSceneを追加で読み込んだだけの時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/b7965bb6-5dd6-6aa4-efcc-4b8d63fd4974.png)
BakeStageScene単体の見た目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/2dfc04a1-5abc-d09e-1bc6-ee150e75c02a.png)
こちらを解決する方法を2つ示します。


## 解決方法①　読み込んだBakeStageSceneをアクティブにする
![sol1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/f9c50515-799c-6d46-5bec-81fa20e38110.gif)
読み込んだシーンを右クリック→SetActiveSceneとすることで、Skyboxの設定や、Fogの影響度合いが変わっていることがわかります。これはもともとシーン単体で開発し、想定していた見た目と合致しています。

## 解決方法②　シーン依存な情報を読み込んだシーンに合わせる
なにかしらの問題で読み込んだシーンをActiveにできないとき、アクティブなシーンに依存するLighting情報を合わせてあげることでこれを解決します。
アクティブなシーンに依存するLighting情報は以下の通りです

* Skybox
* Fog（Lightingの情報ではないですが…）
* Environment Reflection

これらを読み込んだシーンに対して合わせて設定してあげることで解決できます。

### Skyboxを合わせる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/99903e7b-9084-ca10-810a-3c63526fb27f.png)
LightingタブのEnvironment/EnvironmentのSkyboxMaterialに、BakeStageSceneと同じものをアタッチします。
### Fogを合わせる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/444c2afd-0bf2-346a-0063-cfb078d76a4f.png)
LightingタブのEnvironment/OtherSettingsのFogから、BakeStageSceneのFogの各パラメータを合わせます。

### Environment Reflectionを合わせる
Environment Reflectionはベイクされたシーンの場合、少し事情が異なってきます。
ベイクする際にReflectionProbeとして反射計算用のテクスチャをCubemapとして書き出しており、ベイクされたオブジェクトはこちらを参照するためです。
そのため、LightingタブのEnvironment/EnvironmentのEnvironmentReflectionsのSourceをCustomにし、CubemapをBakeStageSceneのベイクデータフォルダ内のReflectionProebe-0というCubemapをアタッチします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/e0ff3bd5-9e0c-4be9-75a3-f3503887c86c.png)

これでシーンのアクティブを切り替えなくても見た目をそろえることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564341/3cded83f-2ac7-d180-15ba-fbb69fd40a90.png)
createElement, appendChildを(おそらく)習得したので、自分なりに整理してみた。

タイトル通りです。

箇条書きのlist itemを5つ、JavaScriptで作成し、同時にテキストとidも設定しています。

日本語の使い方、変数の命名などおかしいところあると思いますが、私と同じくこの辺りで躓いている方の助けになれば幸いです。
```html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
<!--
    --目標-------
    親ノード
    ・ 子ノードは1です。idは li1 です。
    ・ 子ノードは2です。idは li2 です。
    ・ 子ノードは3です。idは li3 です。
    ・ 子ノードは4です。idは li4 です。
    ・ 子ノードは5です。idは li5 です。
    ------------------
-->
    <ul id="list">
        親ノード。id=list
        <!--<ul>要素(id:list)を親とする-->
    </ul>
    <script>//親を指定し、子を作成し、挿入
        let parent = document.getElementById("list");
        /////親を指定し、変数parentに保持。

        for(i=1;i<=5;i++){
        let item = document.createElement("li");
        /////子を作成。createElementの()内が、作りたい子供の要素。今回は<li>要素。
        item.textContent = "子ノード" + i + "です。idは li" + i + " です。";
        //子のテキストを設定。
        item.id = "li" + i;
        //子のidを設定。
        //forでiを回しているためidは重複しない。
        parent.appendChild(item);
        /////色々設定し終わったli要素の子childをul要素の親parentに挿入。
        }
    </script>
</body>
</html>
```
Unityプロジェクトをzip化して人に渡すときの手順(不要ファイル削除)

Libraryを丸ごと削除するとHierarchyの状態やEditorの画面レイアウトなどが保存されないため、そこらへんを保存した状態で渡したい時の手順。
```terminal
cd proj
rm -rf Library/Artifacts
rm- rf Library/PackageCache
rm -rf Temp
rm -rf Logs
rm -rf *.csproj
rm -rf *.sln
cd ..
zip -r proj.zip proj
```
もっと削除した方がいいファイルはあるんだろうが、とりあえずぱぱっとやりたい時の備忘録。
html-loaderが、インラインCSSのbackground-imageをバンドルしないのをなんとかする。

``` html
<div class="backImage" style="background-image: url(assets/img/sample.jpg)"></div>
```
こんな風に書きたい。
が、ビルド時にこの画像は無視されます。

参考
https://stackoverflow.com/questions/44096749/webpack-load-images-from-inline-style-background-image
https://github.com/webpack-contrib/html-loader/pull/142

ググってみると結構問題にしてる人が多そうなのに、
これといった解決方法が見つけれなかったので、自力でなんとかしてみた。

要は、style属性の中の、urlメソッドを解析できればよいので、

``` diff
--- a/node_modules/html-loader/dist/utils.js
+++ b/node_modules/html-loader/dist/utils.js
@@ -354,6 +354,12 @@ function parseSrc(input) {
     value = value.substring(0, value.length - 1);
   }
 
+  const values = value.match(/(?<=url\(['"`]?)[^'"`]+?(?=['"`]?\))/)
+  if (values) {
+    startOffset = values.index;
+    value = values[0];
+  }
+
   if (!value) {
     throw new Error("Must be non-empty");
   }

```

html-loderのオプションはこう
``` js
  sources: {
    list: [
      // All default supported tags and attributes
      '...',
      {
        attribute: 'style',
        type: 'src'
      }
    ]
  }
```

ただ、問題はリポジトリを共有するときにどうするか、
リポジトリをforkするのが一般的だが、
なるべく内々で済ませたいので、何かいいのかないのか探してたらありました。
https://bagelee.com/programming/javascript-2/patch-package/
これで、html-loaderをインストールしたタイミングでパッチがあたります。
Kraken2 でウイルス配列DBを取得するときのエラー対処


Kraken2ではデータベース構築の段階で`--download-library bacteria` と指定することで、RefSeqのウイルスの配列のみを取得することができる。

```bash
$ kraken2-build --download-library viral --db viral-db

rsync_from_ncbi.pl: unexpected FTP path (new server?) for https://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/839/185/GCF_000839185.1_ViralProj14174
```
上記コマンドを実施すると、データベースのftpパスが間違っていると言われたので[unexpected FTP path (new server?)](https://github.com/DerrickWood/kraken2/issues/508)を参考に、`rsync_from_ncbi.pl`のコマンドを以下のように書き換えた。

- githubからインストールした場合
`kraken2/rsync_from_ncbi.pl`
- conda でインストールした場合
`miniconda/miniconda3/envs/kraken2/libexec/rsync_from_ncbi.pl`

```
（変更前） if (! ($full_path =~ s#^ftp://${qm_server}${qm_server_path}/##)) {
(変更後) if (! ($full_path =~ s#^https://${qm_server}${qm_server_path}/##)) {
```

変更後にコマンドを再度実行したところ、異なるエラーが発生。
どうやらNCBIサーバーに存在しないファイルを指定したことに起因するエラーっぽい。

```bash
$ kraken2-build --download-library viral --db viral-db

Step 1/2: Performing rsync file transfer of requested files
rsync: link_stat "/all/GCF/018/595/315/GCF_018595315.1_ASM1859531v1/GCF_018595315.1_ASM1859531v1_genomic.fna.gz" (in genomes) failed: No such file or directory (2)

rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1668) [generator=3.1.2]
rsync_from_ncbi.pl: rsync error, exiting: 5888
```

[ATVincent commented on 30 Jun 2021](https://github.com/DerrickWood/kraken2/issues/465#issuecomment-870726096) のコードを`rsync_from_ncbi.pl`として上書きして保存し、再度実行してみる。
※ さきほど修正したftpパスのコマンドも再度修正する。

問題なくダウンロード完了。

```bash
Rsync dry run complete, removing any non-existent files from manifest.
Step 1/2: Performing rsync file transfer of requested files
Rsync file transfer complete.
Step 2/2: Assigning taxonomic IDs to sequences
Processed 11753 projects (14651 sequences, 469.21 Mbp)... done.
All files processed, cleaning up extra sequence files... done, library complete.
Masking low-complexity regions of downloaded library... done.
```
Goを触る①

# はじめに
業務でGoを使うことになったので備忘録としてメモ

# インストール
Mac環境なのでHomebrewを使う
```
$ brew update
$ brew upgrade
$ brew install go
```
インストールされているか確認
```
$ go version
```
パスを確認
```
$ go env GOPATH
```

# Hello world

```go
package main
import "fmt"
func main() {
    fmt.Println("Hello world")
}
```
runでファイルをそのまま実行
```
$ go run hello-world.go
```
buildでバイナリを生成することでバイナリを直接実行できる
```
$ go build hello-world.go
$ ./hello-world
```

# 変数
変数 は var 変数名 型名で宣言
```go
var hoge int
```
初期値を設定することも可能
```go
var hoge int = 1
```
初期値を設定する際は var と型を省略することが可能
```go
hoge := 1
```
まとめて定義もできる
```go
var (
    hoge int = 1
    fuga string = "1"
)
```

# 定数
定数 const 変数名 型名で宣言
```go
const hoge int = 1
```
型名を省力することができるのは var と同じ

# 演算子
| 1 | 2 |
|:-:|:-:|
| +  | 加算  | 
|  - | 減算  |  
|   * | 乗算  |  
|   / | 除算  | 
|   % | 余り  | 
|   & | AND  | 
| \| | OR | 
|   ^ | XOR  | 
|   x++ | インクリメント  | 
|   x--| デクリメント  | 
|   &&| AかつB  | 
|   \|\|| AまたはB  |
|   !x| NOT  |
| \=\=　| 等しい  | 
|   !\=　| 等しくない  |
|    <　| AがBより大きい  |
|    <=　| AがB以上  |
|    >　| AがBより小さい  |
|    >=　| AがB以下 |

# 配列
個数と型名を宣言して設定する
```go
x := [3]string{"hoge", "guga", "bar"}
```
個数が決まっていないもの（初期化時に決定）に対しては個数を省力する
```go
y := [...]string{"hoge", "guga", "bar"}
```

# IF文
if 条件 { 処理 } 
```go
if x > a {
    fmt.Println(x)
}
```

else や else if　は以下
```go
if x > y {
    fmt.Println("hoge")
} else if x < y {
    fmt.Println("fuga")
} else {
    fmt.Println("hogefuga")
}
```

# Switch文

```go
switch cnt {
case 1:
    return "1回目"
case 2:
    return "２回目"
default:
    return "不明"
}
```
caseで条件分岐させる場合は
```go
switch {
case x > y:
    return "hoge"
case x < y:
    return "fuga"
default:
    return "default"
}
```

# For文
for 開始処理; 条件; 後処理
```
for i := 0; i < 10; i++ {
    fmt.Println(i)
}
```
開始処理や後処理を省力することができる
```go
for x < y {
    x++
}
```

# まとめ
とりあえず基礎的なところから
OneDrive　遅すぎる。

googleドライブは、ちゃんと、ドライブとして機能します。
大量のファイルをアップしても、
１日くらい放置してれば、数Ｔくらい１日でアップロード完了

だが、しかし、OneDrive これは、いったい、なんなんだぁぁ？！
どう考えても、遅い遅すぎる。
これは、本当に頭にくる。


★容量について
googleDriveは、workspaceを導入している場合
人数　×　２Ｔの容量がもらえます。
10人なら、合計２０Ｔまで利用可能
スピードは、そこそこ出ます。

一方、sharepointは、Microsoft365を導入している場合
１Ｔ＋人数　×　5Gの容量がもらえます。
なんかショボイ・・・
スピードが超遅い

そんなわけで、onedrive、使う時は注意してください。
クラウド使うだけなら、圧倒的に、workspaceの勝利です。
お話にすらなりません。
【Excel関数】日付と時間を結合する方法 #備忘録

# これは何

スプレッドシートの関数で躓いたことのメモ

# やりたいこと

別々のセルで管理している日付と時間を一つのセルに繋げて表示したい
※日時でソートをかけるため

アウトプットイメージとしては、
下記のようにB列のセルとC列のセルを関数等を使用してD列に表示したい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/f7c34a8e-1c65-5166-6751-bc55f07fa071.png)

# 間違った方法

文字列の結合と同じ要領で `=B3&C3` で繋いだらダメだった

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/10e158fc-84c6-7782-9b43-41a225c378ac.png)

表示形式を変えればいいんかと `=TEXT(B3&C3, "yyyy/mm/dd hh:mm")` で試してみたがやはりダメだった・・・

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/957f2b72-8abf-e82b-5f3e-61fc04ea5584.png)

# 正しい方法

調べたら文字列の結合はダメって書いてた（まんまとハマってる‥）
https://www.saka-en.com/office/excel-join-date-time/

正しくは、足し算するだけでよいらしい。 `=B3+C3` に直したら出来た！
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554608/ce7172e2-a971-19b0-95c2-6910080f3c7e.png)


# まとめ

日付と時間の結合は`&`じゃなくて`+`で繋ぐ（覚えた）
WSL環境でfirebase init, firebase deployが出来ない

# WSLでfirebase init, firebase deployが出来ない！！！！！

firebase init, firebase deployが出来なくて2日悩まされました。
他のfirebase系コマンドを試していないので、他のコマンドも使えない物が多いと思います

結構特殊なパターンだと思うので、複数解決方法を記述しておきます。


#### エラー内容としては以下
##### initのパターン
```shell:shell
firebase init
? Which Firebase features do you want to set up for this directory? Press Space to select features, then Enter to confirm your choices. Hosting: Configure files for Firebase Hosting and (optionally) set up GitHub Action deploys
...
? Please select an option: Use an existing project

Error: Failed to list Firebase projects. See firebase-debug.log for more info.

```



##### deployのパターン
```shell:shell
firebase deploy --only hosting
...
...
Error: Failed to get Firebase project ○○○○○. Please make sure the project exists and your account has permission to access it.
```


掘り下げるべく、--debugをつけて実行してみると・・・
```shell:shell
Timeout reached making request to https://firebase.googleapis.com/v1beta1/projects?pageSize=100
```
googleAPIへのGETで詰まってる。
Windows環境のfirebase-toolsでは問題なく動いているので、WSL内でのみtimeoutしてるみたいだ。



# 解決方法1
この解決方法は調べても全く出てこなかった。。。
PC初期化直後から発生していたバグなので、開発パートナーと設定を合わせる所で発見した。

私の環境では、DNSを8.8.8.8　8.8.4.4に設定している。
ネットワーク設定にて、HTTPS経由のDNSの部分を、「暗号化優先」に変える事で直った。Windows11環境では、「オン(自動テンプレート)」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500172/d87694c9-8c23-0055-2b8a-dac425572ef2.png)


# 解決方法2

シンプルに認証切れの場合があるので、再ログインしてみよう
```shell:shell
firebase logout && firebase login
```

# 解決方法3
WindowsへのPATHを通す。
詳しい原因は分からないが、これで直っている人が多々居た。

環境に合わせて追記する。
```shell:.bash_profile/.bashrc/.zshrc
export PATH=$PATH:/mnt/c/Windows/System32
```
LinuxからWindowsへリモートデスクトップ


Remmina は Linux から Windows のリモートデスクトップに接続するためのアプリ
https://remmina.org/



X関連をインストールしていない CUI なFedora 36 Server 環境にRemminaをインストールです



## Ｘウィンドウ関連インストール

```bash
dnf  install  xauth  xterm
```

## remmina インストール

```bash
dnf  install  remmina  remmina-plugins-rdp  remmina-devel
```

## remmina 起動

```bash
remmina
```


![remmina2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153259/543b02f8-b016-47bb-6e9b-915723725a79.png)

起動しました。


Windows10のリモートデスクトップにも無事接続できました。
terraform 再入門 

#### ■はじめに
クソ記事書いてごめんなさい orz
terraformの基本的な情報はよしとして、制約/ルール/コツ周りは残したいので書きます。

---------------------

### terraform 注意点

#### ▼ 変数関係

##### ■ variabesの優先順位
以下の順に強い
1. コマンド引数 (-var <NAME> = \<VALUE\>)
2. 変数ファイル( example.tfvars)
3. 環境変数 ( TF_VAR_\<NAME\> )

##### ■ 各variablesの使いどころ

● 環境変数
実行ログには残らない。(tfstateには残る場合も有り得る)
鍵情報、環境依存情報(prod,dev)

● tfvarsファイル
ファイルとして残す。
データとして切り分けたい場合(環境毎に各々定義する等)に使う

● コマンド引数
実行ログに残る。一時的に変更を加えたい場合に使う。
試験用に何かしらの起動スイッチに使う等(TF_VAR_DEBUG = ON)に便利

### Document周り

#### HCL2のトップメニュー
[Configuration Language](https://www.terraform.io/language)を見る。
基本的な使い方はサイドメニューにさらにまとまっている

#### 組み込み関数
↑のサイドメニューの[Functions](https://www.terraform.io/language/functions)で調べよう。
たくさん量は有るので一旦アタリを見つけてから使い方を調べた方が良さそう

#### CLI系
[Terraform CLI](https://www.terraform.io/cli)を見る。
Importコマンドもここに書かれている

#### Provider
AWS/GCP/Azureなどの各種パブリッククラウド毎にresourceは違う。
そのため、各々に適したresourceを識るために[Registry](https://registry.terraform.io/)から検索する。
「Brose Provider」を押すと各Providorが表示される。
各々のProviderのバージョンも結構重要。
各Providor毎のresourceについてはProviderのページの右上の「Documentation」を押す。
[AWSはここになる](https://registry.terraform.io/providers/hashicorp/aws/latest/docs)
whose view is not in the window hierarchy.が出た際の解決

画面遷移実装中に(ログイン周りの判定で)現れた
```whose view is not in the window hierarchy.```
これってライフサイクルが影響しているみたいで、初めてViewControllerの実行される順番を意識しました。
viewが出来るタイミングがviewDidLayoutSubviews実行後なので、
viewDidAppearで記述すると解決します。

人様の記事丸パクリですが、自分の備忘録に。
参考
https://qiita.com/yamatatsu10969/items/58511c4982ba0cb11318
Androidエミュレーターの新しいデバイスで hosts が read onlyで編集できない場合の回避方法

## はじめに

開発環境をエミュレーターから確認するにあたり hosts を書き換えるようとして `Read-only file system` が発生し困ったので解決策を備忘録として記載しておく
hosts の書き換え手順に関しては他の記事があるのでそちらにお任せします

https://qiita.com/koichi-ozaki/items/537c14d64c60193f4613


### `Read-only file system` エラーの対応

`adb push` が `error: failed to copy 'hosts' to '/system/etc/hosts': remote couldn't create file: Read-only file system` で失敗する場合の解決策として`adb root` を行う方法が紹介されていますが新しいデバイスで動作しません
古いデバイスをインストールすることでも回避することは可能ですができればAndroid 4.4 以降のデバイスでやりたい

`disable-verity` を使用して dm-verity を無効にすることで解決しました
自分は Android は詳しくないので dm-verity に関しては下記の記事を参照ください

https://source.android.com/security/verifiedboot/dm-verity?hl=ja


```
$ adb root
$ adb disable-verity
$ adb reboot
$ adb root
$ adb remount
$ adb push ~/hosts /system/etc/hosts
```
cscの作法 その206

# 概要
cscの作法、調べてみた。
qiitapi叩いてみた。
httpclient使ってみた。

# コンパイル手順

```
>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%


>csc qiita3.cs /reference:LitJSON.dll /r:System.Net.Http.WebRequest.dll /reference:System.Net.Http.dll


```

# サンプルコード

```

using System.Collections;
using System.IO;
using System;
using System.Text;
using LitJson;
using System.Net;
using System.Net.Http;

namespace app
{
	class test0 {
		static void Main() {
			ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
			string url = "https://qiita.com/api/v2/users/ohisama@github/items?page=1&per_page=5";
			HttpClient client = new HttpClient();
			string response = client.GetStringAsync(url).Result;
			LitJson.JsonData json = LitJson.JsonMapper.ToObject(response);
			Console.WriteLine(json[0]["title"]);
			Console.WriteLine(json[1]["title"]);
			Console.WriteLine(json[2]["title"]);
			Console.WriteLine(json[3]["title"]);
			Console.WriteLine(json[4]["title"]);
		}
	}
}






```

以上。
複数列の合計と比率を作成する(SPSS Modeler データ加工逆引き3-2)

# 複数列の合計と比率を作成（加算と比率）

![スクリーンショット 2022-06-21 17.29.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2ab494c0-8574-de02-619e-051cf3e3dfbf.png)

## 1.想定される利用目的
・集計表の作成
・特徴量の作成

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

https://github.com/yoichiro0903n/blue/blob/main/fields_between.str?raw=true

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

![スクリーンショット 2022-06-21 17.29.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/84382622-3024-b5bb-0765-a8b662796915.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-06-21 17.34.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c6c2a7a1-6638-4fcf-ad21-14590a617406.png)

b.[フィールド作成]ノードを編集します。1月から6月までの実績合計を求めています。それぞれのフィールド（列）をプラス記号で結んでも良いのですが、手間を考えて[sum_n(リスト)]を使います。リスト（一覧）には列の起点と終点を表す[@&#xFFF0;FIELDS_BETWEEN(起点の列,終点の列)]を用います。
![スクリーンショット 2022-06-21 17.40.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ce1042f4-dd8a-eb0d-71f8-db3e21842dd6.png)

式ビルダーの@&#xFFF0;関数を利用すると簡単に入力できます。
![スクリーンショット 2022-06-21 17.41.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/98fc2d23-943d-8ae3-df0c-44abe4628c61.png)

[プレビュー]をします。合計列ができています。
![スクリーンショット 2022-06-21 18.21.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1ae7598c-756c-edf7-3190-8d1745b27df5.png)

c.別の関数で列の合計を作成します。[実績]という文字列で終わるフィールド（列）をリストにします。
![スクリーンショット 2022-06-21 18.22.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2f928754-7898-7b77-29eb-88bf5013410b.png)

[プレビュー]をします。[通年]を合計するフィールドができています。
![スクリーンショット 2022-06-21 18.24.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2c9d013d-1c4c-ffc3-a394-a41dcee1c235.png)

d.1月から12月と[上半期]のフィールドを[通年]で按分して比率を求めます。@&#xFFF0;FIELDはワイルドカードです。13のフィールドを同時に処理することが可能です。
![スクリーンショット 2022-06-21 18.29.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1ff0e93c-d697-e035-3df3-34aa578deda6.png)

#### 注意事項

@&#xFFF0;FIELDS_MATCHING によって文字列「 \* 実績」をリスト化しました。 "?" は 1 文字に相当し、"\*" は 1 文字以上に相当します。その２つの文字をエスケープする際には直前にバックスラッシュを記述してエスケープ文字とします。


## 4.参考情報

#### @&#xFFF0;FIELDS_BETWEENを解説した記事

https://www.ibm.com/blogs/solutions/jp-ja/spssmodeler-push-node-15/

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
2つの列の加算と比率を作成する(SPSS Modeler データ加工逆引き3-1)

# 2つの列の加算と比率を作成（加算と比率）

![スクリーンショット 2022-06-21 11.40.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e0114662-a6b1-cefa-2be3-d18948632a8b.png)

## 1.想定される利用目的
・集計表の作成
・特徴量の作成


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

https://github.com/yoichiro0903n/blue/blob/main/addition_ratio.str?raw=true

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

![スクリーンショット 2022-06-21 11.42.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9cd737f9-e134-4482-08aa-bef08094b02b.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-06-21 11.44.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7b8e7156-8d8f-b128-6c9d-dd77020858a7.png)

b.[フィールド作成]ノードを編集します。２つのフィールド（列）をプラス記号で結んでいます。
![スクリーンショット 2022-06-21 11.45.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/80534273-4ac1-839b-e402-6582b22d7a0f.png)

式ビルダーの演算子（赤枠）を利用すると簡単に入力できます。
![スクリーンショット 2022-06-21 11.46.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b208c31e-52b4-66d9-4004-9237bf59fb08.png)

[プレビュー]をします。合計列ができています。
![スクリーンショット 2022-06-21 11.53.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/accb4137-df84-ddaa-3655-cc53a187bda7.png)

c.２つの列の比率を作成します。ひとつのノードで複数処理するために[モード]を[複数]にして、新しいフィールド名の拡張子を[_比率]とします。
![スクリーンショット 2022-06-21 11.47.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e90b5f2d-a3de-e15c-e435-1de679a569d3.png)

式ビルダーの@関数を利用すると簡単に入力できます。
![スクリーンショット 2022-06-21 11.48.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/41258797-50a5-fe9f-f9d0-4533c14ecdf3.png)

[プレビュー]をします。それぞれの列の比率フィールドができています。
![スクリーンショット 2022-06-21 11.50.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/dee22b7b-ddb0-8b54-9ab2-4f425f65fd9b.png)

#### 注意事項
式ビルダーで式を記述したら右下の[検査]ボタンを押してロジックが正確かどうかを確認します。式の文字が赤から黒になると式として成立しています。
![スクリーンショット 2022-06-21 11.58.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8517ca33-5d82-ced8-ceb0-9cb56f27c2ce.png)


## 4.参考情報

#### フィールド作成ノードを解説した記事

https://qiita.com/416nishimaki/items/9c8109ab7a2c1838392e

https://www.ibm.com/blogs/solutions/jp-ja/spssmodeler-push-node-7/

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
記号間の文字列を抽出する(SPSS Modeler データ加工逆引き2-5)

# 記号間の文字列を抽出（ハイフンの間の文字列を抽出）

![スクリーンショット 2022-06-17 16.44.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/addac1d4-80e5-743b-2f8e-3082950a878e.png)

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

・コード番号から商品や設備の特定
・設備ログから異常検知をするための特定のメッセージの抽出


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

https://github.com/yoichiro0903n/blue/blob/main/issubstring_count.str?raw=true

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

![スクリーンショット 2022-06-17 16.47.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/cca6b23f-6a58-3c63-6373-30c714987931.png)


a.入力するデータは以下の通りです。
![スクリーンショット 2022-06-17 14.43.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1ca39c68-d137-80a2-5bb8-bb5bc03f92f3.png)

b.[フィールド作成]ノードを編集します。[issubstring_count(文字列,N番目の文字列,フィールド)]で2回目に登場する文字列の位置を整数で返します。
![スクリーンショット 2022-06-17 16.54.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/69fb8ed8-0b25-b72e-ede6-f1690cc3351e.png)

式ビルダーの文字列関数を利用すると簡単に入力できます。
![スクリーンショット 2022-06-17 16.55.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9a555f99-ac73-6b35-7a42-6d9fa3ca5d10.png)

[プレビュー]をします。2度目のハイフンの位置が2レコードとも6文字目だとわかります。
![スクリーンショット 2022-06-17 16.58.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/01419b19-68ae-a213-7b1a-ba121ffcc1b5.png)

c.3番目のハイフンの位置も同じように求めます。
![スクリーンショット 2022-06-17 17.01.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/11078013-ea7a-bf69-dea9-207d48d2c644.png)

[プレビュー]をします。3度目のハイフンの位置が2レコードで異なります。
![スクリーンショット 2022-06-17 17.01.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1bd88fda-d86e-c808-fbd3-97616a374037.png)

d.[substring(開始位置,文字数,フィールド)]を使って該当する文字列を抽出します。
![スクリーンショット 2022-06-17 17.02.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3b645e2c-e03b-b338-bbbe-da74bae14b97.png)

e.[テーブル]を実行します。
![スクリーンショット 2022-06-17 17.02.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ae6d2fee-6fd0-0dd4-bbd6-f4f9e0ad095a.png)

f.ここまでの処理をひとつのノードでまとめることができます。
![スクリーンショット 2022-06-17 17.06.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e62c7234-fdf2-472c-78ec-32da84e6deb1.png)

h.記号が全てハイフンなので、それを区切り文字に指定した方法でも同じ処理が可能です。
![スクリーンショット 2022-06-17 17.07.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/69bc0ee5-4381-ea1c-5854-46f091e6c64c.png)



#### 注意事項
SPSS Modelerバージョンは18.3を利用しました。古いバージョンでは紹介した関数がまだ含まれていない場合がありえます。

## 4.参考情報

#### 任意の文字列を抽出

https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-02/

#### よく使う文字列関数

https://qiita.com/Makimaki2020/items/35ab02a7375325e678c1

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
文字列からN文字目を抽出する(SPSS Modeler データ加工逆引き2-4)

# 文字列からN文字目を抽出（文字列抽出）

![スクリーンショット 2022-06-17 10.00.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5cf0f87e-cb2e-1595-8342-b9959ede6c3e.png)

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

・コード番号から商品や設備の特定


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

https://github.com/yoichiro0903n/blue/blob/main/substring.str?raw=true

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

![スクリーンショット 2022-06-17 10.02.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ca88738b-4ca6-03cd-0cfc-e48a80b984d1.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-06-17 10.03.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5ec82258-d80c-f446-d2cd-0116385375de.png)

b.[フィールド作成]ノードを編集します。[substring(開始位置,文字数,フィールド)]でN文字目からN文字を抽出します。
![スクリーンショット 2022-06-17 10.03.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b1ff794f-56a8-a617-be4d-b8a55c49abce.png)

式ビルダーの文字列関数を利用すると簡単に入力できます。
![スクリーンショット 2022-06-17 10.19.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ca26e708-15e5-7a0f-0132-9580470a625d.png)

[プレビュー]をします。3文字目が抽出されました。
![スクリーンショット 2022-06-17 10.04.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ea9c7d43-fe16-2228-d505-2e1e2218d12e.png)

c.[データ型]ノードで値を読み込みカテゴリ（３文字目の種類）のメンバーを確定します。
![スクリーンショット 2022-06-17 10.04.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/da575960-e260-ca12-c7fe-247e0634f531.png)

d.[データ分類]ノードで数字に形態を割りてます。
![スクリーンショット 2022-06-17 10.05.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/dd20b7d1-f325-950c-766f-c0952a59a871.png)

[プレビュー]をします。
![スクリーンショット 2022-06-17 10.06.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/597958f7-ae7d-2850-e45e-c532888e3eb1.png)

e.[データ分類]ノードを利用せず[フィールド]作成でコード番号にラベリングします。
![スクリーンショット 2022-06-17 10.07.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d3980249-1de3-4dcf-bb38-0ef7a4b00dba.png)

f.[テーブル]を実行します。
![スクリーンショット 2022-06-17 10.08.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d3a2d5ac-e2e4-919c-6f27-5b601f0892ba.png)


#### 注意事項

・新しくストリームを作る際には、cの[データ型]の値の読み込みを実施しないとdの[データ分類]で分類値が取得できません。

・分類が多岐にわたる場合には、都度変換せずコード番号と分類を示した表（マスタ-テーブル）とレコード結合するのが一般的です。

## 4.参考情報

#### N番目の文字を抽出

https://qiita.com/har0yama/items/6da2022d0e1fbceb0c48#2-n%E7%95%AA%E7%9B%AE%E3%81%AE%E6%96%87%E5%AD%97%E3%82%92%E6%8A%BD%E5%87%BA

#### よく使う文字列関数

https://qiita.com/Makimaki2020/items/35ab02a7375325e678c1

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
文字列から先頭/末尾のN文字を抽出/削除する(SPSS Modeler データ加工逆引き2-3)

# 文字列から先頭/末尾のN文字を抽出/削除（先頭N文字抽出）

![スクリーンショット 2022-06-16 14.56.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b7a5b3c9-504e-48f4-0381-0993ebbce41a.png)

## 1.想定される利用目的
・匿名加工データ作成
・IDの末尾を特定したサンプリング
・設備コードの種別特定

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

https://github.com/yoichiro0903n/blue/blob/main/allbutfirst.str?raw=true

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

![スクリーンショット 2022-06-16 14.56.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1c1e5da9-e5e0-4665-63e0-9d38fd334faa.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-06-16 14.58.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9c28ed08-d89a-84c8-f547-c0bb8cd2198c.png)

b.[フィールド作成]ノードを編集します。[startstring(文字数,フィールド)]で先頭N文字を抽出します。
![スクリーンショット 2022-06-16 14.59.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c26d040b-e79b-85aa-f807-86312fad0b65.png)

式ビルダーの文字列関数を利用すると簡単に入力できます。このストリームが利用する関数を赤枠で囲いました。
![スクリーンショット 2022-06-16 15.01.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/96499a65-fe26-d703-7bb8-f0c0a0024b44.png)

[プレビュー]をします。先頭3文字が抽出されました。
![スクリーンショット 2022-06-16 15.02.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ab1d257b-c967-2646-eaf3-4717b1326ccd.png)

c.末尾1文字を抽出します。
![スクリーンショット 2022-06-16 15.02.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7cdfd6b5-e7af-2b61-cd74-7de3c08a0ba6.png)

[プレビュー]をします。[last(フィールド）]でも同じことが可能です。
![スクリーンショット 2022-06-16 15.03.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ad94af47-3fb9-8cbf-f4d6-7b15a424f01e.png)

d.先頭4文字を削除します。
![スクリーンショット 2022-06-16 15.03.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b81cc096-f6e5-59a3-6b8b-50cc9cb5e9f9.png)

[プレビュー]をします。ハイフン以降が残されています。
![スクリーンショット 2022-06-16 15.05.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/55924c8f-b675-890f-a78b-b6483a2ddb6c.png)

e.末尾3文字を削除します。
![スクリーンショット 2022-06-16 15.04.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1de9b725-cf97-ef7c-512b-86a1b4c1c47e.png)

[プレビュー]をします。ハイフン以降が残されています。
![スクリーンショット 2022-06-16 15.04.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/17dcd5ee-0226-b92e-6762-ba8431c0e95f.png)

#### 注意事項

今回はハイフンのある郵便番号（文字列）ですが、整数の商品コードなどで行う場合にはあらかじめ文字列にデータを変換[to_string(フィールド)]する必要があります。

## 4.参考情報

#### 先頭/末尾N文字の抽出

https://qiita.com/har0yama/items/6da2022d0e1fbceb0c48#1-%E5%85%88%E9%A0%AD%E6%9C%AB%E5%B0%BEn%E6%96%87%E5%AD%97

#### 文字列の先頭/末尾のN字を削除

https://qiita.com/har0yama/items/6da2022d0e1fbceb0c48#1-%E9%83%A8%E5%88%86%E6%96%87%E5%AD%97%E5%88%97%E3%81%AE%E6%8A%BD%E5%87%BA

#### よく使う文字列関数

https://qiita.com/Makimaki2020/items/35ab02a7375325e678c1

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
空白を除去して文字列を結合する(SPSS Modeler データ加工逆引き2-2)

# 空白を除去して文字列を結合（文字列結合）

![スクリーンショット 2022-06-16 13.35.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/63c5774a-3f77-3ad8-2074-fc32f751a198.png)

## 1.想定される利用目的
・都道府県と市町村名など個別の情報を合成する
・ログデータを特徴量として整える

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

https://github.com/yoichiro0903n/blue/blob/main/concat.str?raw=true

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

![スクリーンショット 2022-06-16 13.36.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8d944194-ab63-3092-4b29-adfd41db9439.png)


a.入力するデータは以下の通りです。
![スクリーンショット 2022-06-16 13.39.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4c9e6012-49fe-58cf-fadc-8415bb580a03.png)

b.[フィールド作成]ノードを編集します。文字列を結合するには[ >< ]の記号でつなげます。
![スクリーンショット 2022-06-16 13.39.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bb62282d-e7d4-9f8c-14c8-be92cbd7f4b5.png)

式ビルダーの文字列関数を利用すると簡単に入力できます。[ >< ]は赤枠をしています。
![スクリーンショット 2022-06-16 13.39.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9add808f-6c3c-20d6-bb4e-c002add03054.png)

[プレビュー]をします。結合した文字列の間にスペースがあります。[男性_]のように性別の後続に空白文字があったことが原因です。
![スクリーンショット 2022-06-16 14.06.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/eb730e00-84f6-e1da-bd57-f51d4360e642.png)

c.[置換]ノードを利用して性別と年代の前後の空白を除去します。置換条件を[常時]とした上で複数のフィールド（列）を同時に処理できるワイルドカード[@&#xFFF0;FIELD]を対象に[trim(フィールド)]を利用します。
![スクリーンショット 2022-06-16 13.40.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/b35564f4-0bf3-52ce-39ed-5c144e5f615c.png)

d.改めてフィールド作成します。
![スクリーンショット 2022-06-16 13.41.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8937fa31-27e7-60c9-ca48-7c89f7f02b87.png)

e.[テーブル]を確認します。セグメントが正しく作られています。
![スクリーンショット 2022-06-16 13.42.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bc11a54a-db2c-7c5f-21f5-e702f081fdcf.png)

#### Tips

![スクリーンショット 2022-06-16 13.42.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d20d164d-3e13-4c72-1a70-fee39abec8a8.png)

![スクリーンショット 2022-06-16 13.43.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/19a92140-93c6-bf2f-5067-088bbc4300e7.png)

#### 注意事項
文字列をハイフンなどで繋ぐ場合は以下のように記述します。
[trim(フィールド)]は文字列の前後の空白を除去します。前方のみは[trimstart(フィールド)]、後方のみは[trimend(フィールド)]を利用します。

## 4.参考情報

#### フィールドを結合する方法

https://www.ibm.com/support/pages/spss-modeler%E3%81%A7%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89%E3%82%92%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

#### よく使う文字列関数

https://qiita.com/Makimaki2020/items/35ab02a7375325e678c1

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

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

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

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