OmniAICreator/Qiita-1.07M huggingface dataset:
ZipでUnityのexeファイルを配るの止めたい。InnoSetupを使おう

# 概要
Unityはマルチプラットフォーム対応のゲームエンジンなのでiOSやAndroid以外にWindows向けのバイナリを生成することも出来ます。

なので「ちょっとしたゲームが出来たから配布してみんなに遊んでもらおう」と思った時は**zipで固めてどこかにアップします。**

でも世の中にはzipの解凍でつまづく人も結構いますよね。あるいは日本語が含まれるパスだと動かないライブラリが含まれているとトラブルが起きますよね。Program Files以下にインストールされるインストーラーを作ってサポートで楽をしましょう。

Inno Setupを使います。

https://jrsoftware.org/isdl.php

6.2.0が執筆時点最新です。(2021/7/5くらいにバージョンが上がって更にモダンになりました。めでたいですね。

今回特にUnity製のWindows用アプリやゲームを対象にしますが、その場合はこの **記事を読んでから30分以内にインストーラが完成していると思います。**

余談：Inno SetupはVSCodeのインストーラとしても使われています。実績がすごい！


# InnoSetupのインストールから実行
## インストール
特に暗号化モジュールを使う事がなければそのままインストール
https://jrsoftware.org/isdl.php 内の
innosetup-6.2.0.exe　を使います。

## 実行とウィザード立ち上げ
実行してScriptWizardを使います。以前はこのWizardが不親切でしたが、6.2は凄く親切です！

（左上のFile→NewからいつでもこのScriptWizardは使えます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/769ba7c1-99f5-08a7-9ec1-9b8e7c6ebef5.png)

## ウィザード内の処理
アプリ名やバージョン、開発者の名前やウェブサイトを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/9fd604d0-f603-dab7-3a19-37b3af9f2f21.png)

インストール場所を指定します。Program Filesがおすすめです。(他のフォルダを選べるようにするかはお好みで）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/e1e3aab9-5cba-d449-0140-00a4e0392461.png)

メインのexeを指定して、プログラムの他のファイルを指定します。
Unityの場合、あなたがビルドしたexeを上に指定した後「other application files」に**「Add folder」でUnityでビルド指定したフォルダをそのまま指定** しましょう（IL2CPPビルドの場合はデバッグシンボルフォルダを消しておきましょう）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/5f2b4822-af52-9d9c-5767-1f58fcabb86b.png)


他は正直設定しなくても良い感じにやってくれるので（言語選択だけJapaneseを追加しておく、くらいです）次へ、をドンドン押していきましょう。

最後にここでコンパイラディレクティブを指定（デフォルトでonです）してNext
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/d6e48408-472d-aab1-38e3-27ea7ac9c9b3.png)

ウィザードが終了します。
## アプリのインストーラ化
↑の手順でウィザードが終了した後は、この難しそうな画面が出ます。
この難しそうな画面に書かれている設定ファイルが `*.iss ファイル` で、今までのウィザードはこのissファイルを生成しているだけです。なので issファイルを一回生成したら同じプロジェクトではずっと使いまわしが出来ます。

**プロジェクトのソースを管理しているGithubなどに、生成したissファイルをコミットしておきましょう。**

ここで「セットアップ中のアイコンを指定したい」とか「バージョンアップ時に上書き抑制したい設定ファイルの指定」とかを手書きで追加できます。

この画面で赤丸のついた再生ボタンを押すとインストーラが作られます。内部処理で圧縮を掛けているので10分程度時間が掛かります（プロジェクトが大きいともっと掛かるかも）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/a8331e1a-852d-63ec-267f-17e0ae2087bf.png)

出来上がったインストーラexeファイルは（アイコンを設定しなければ）こういう感じで**issファイルのOutputDir に書いてあるフォルダに**出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40627/971c4339-208b-b271-1b43-3fd33524e22c.png)

## 動作確認
出来上がったexeファイルを実行して

- インストール後にアプリが起動することを確認
- Windowsのプログラムと機能のインストール済みプログラムに登録されている事を確認
- Windowsのプログラムと機能からアンインストール出来ることを確認

してください。

# FAQ
## バージョンアップの時ってどうなるの？
設定ファイル(\*.iss)の AppId（uuid4で自動生成されます）が同一なら同じアプリだとみなして、**同じフォルダに上書きインストールしてくれます。**

そのときにフォルダ構造が変わっていたり、消えていたりしたときも、結構よしなにやってくれるようです。

Unity製のアプリケーションは幸いなことに**ほとんどフォルダ構成が変わらないので有利です。**

## バージョンアップ時に設定ファイルの保存はどうするの？
- PlayerPrefsに保存しているデータはそのまま残ります。
- 例えばjsonの設定ファイルをアップデータで上書きしない、という指定は "Flags: ignoreversion" を指定してください。こちらが詳しいです。 
 https://qiita.com/pekochun/items/5e6d4f827169780d1f48


## アプリ実行時の証明書警告は出るの？
残念ながらInnoSetupで生成したインストーラ自体はWindowsで警告されなくても、その後のあなたのゲームを初回起動したときはWindows警告が出ます。

これは別途証明書を取得するか、サポートに書いておきましょう。
Selfについて

#・大文字のSelfについて
セルフキーワードにはSelfとselfがあるが、今回は、Selfについて利用方法を学ぶ

#・Selfの利用方法

##・型の内部での型自身へのアクセス
Selfは、型の内部での型自身へのアクセスを行うことができる。これにより、スタティックプロパティやスタティックメソッドへのアクセスが簡単になる。

以下の例では、printNum()メソッドで型自身に紐づくプロパティであるnumにアクセスしている。
そして、インスタンスプロパティであるstrにSelfでアクセスしようとするとエラーになります。これは、インスタンスプロパティが型のインスタンスに紐づくプロパティであり、型自身に紐づいていないためである。

```swift
struct someSelfProperty {
    static let num : Int = 100
    let str : String = "Hello"
    
    func printNum() {
        print(Self.num)
        print(Self.str) // インスタンスプロパティにはアクセスできないためエラー
    }
}

```

スタティックメソッドにおいても同じようにアクセスできる

```swift
struct someSelfMethod {
    var num : Int
    
    static func judge(inputNum: Int) -> Bool {
        guard inputNum == 100 else {
            return false
        }
        return true
    }
        
    func printJudge() {
        print(Self.judge(inputNum: num))
    }
}
```

次に、プロトコルにおけるSelfの利用方法について見ていく

##・プロトコルでの利用
プロトコルでの利用方法は3つある

①protocol extensionを準拠する型で制限したい場合

```swift
protocol SomeProtocol {}

class SomeClass {}

// SomeClassを継承していれば参照可能
extension SomeProtocol where Self: SomeClass {
    func someFunc() {
        print("someFunc")
    }
}

//SomeClassを継承しているためextensionで定義したインスタンスメソッドが参照可能
class SomeSubClass : SomeClass, SomeProtocol {}

let someSubClass = SomeSubClass()
someSubClass.someFunc() // "someFunc"

//SomeClassを継承していないためextensionで定義したインスタンスメソッドが参照不可能
class OtherSomeSubClass : SomeProtocol {}

let otherSumSubClass = OtherSomeSubClass()
otherSumSubClass.someFunc() //エラー
```

②protocol extensionを準拠する型のAssociatedType(連想型)で制限する場合

```swift
class SomeClass {}

protocol SomeProtcol {
    associatedtype AssociatedType
}

// AssociatedTypeがSomeClassを継承していればこのインスタンスメソッドを参照できる
extension SomeProtcol where Self.AssociatedType : SomeClass {
    func printJudge(_ str: String) -> Bool {
        guard str == "Hello" else {
            return false
        }
        return true
    }
}

struct SomeStruct : SomeProtcol {
    // SomeClassを継承しているためSomeProtocolのインスタンスメソッドを参照できる
    typealias AssociatedType = SomeClass
}

let some = SomeStruct().printJudge("Hello") // "true"

struct OtherSomeStruct : SomeProtcol {
    // StringではなくSomeClass型を継承しなければSomeProtocolのインスタンスメソッドは参照できない
    typealias AssociatedType = String
}

let other = OtherSomeStruct().printJudge("Hello") //エラー
```

③プロトコルを定義する際にメソッドや戻り値の型に指定する場合

```swift
protocol SomeProtocol {
    func someArgumentMethod(argument: Self) -> Void
    
    func someReturnValueMethod() -> Self
}
```

##・クラス内での利用
クラス内で定義したメソッドの戻り値の型の指定でのみ利用することができる。

```swift
class SomeClass {
    func someMethod() -> Self {
        return self
    }
}

class SomeSubClass: SomeClass {
    let name = "okadai"
}

let some = SomeSubClass().someMethod().name
print(some) // "okadai"
```
Django+herokuで本棚アプリ作って公開してみた

Djangoを一通り勉強してWebアプリ（っぽいもの）が作れるようになったので、復習がてら手順を一通りまとめてみました。

#### 作ったもの

本を本棚にコメント付きでしまっておけるアプリです。

本記事では個人情報のない部分を取り出し、開発の一連の流れをまとめました。本検索にはOpenBDを使用して、ISBNコードという本を一意に識別できるコードで検索し、タイトルを自動取得します。

ISBNコードは[楽天Books](https://books.rakuten.co.jp/)で検索すると分かります。上部のCREATEから作成フォームに移動し、LISTから今まで作成されたものを見ることができます。

# 2023/11/12 追記

ソースコード等は以下に移動しました。

https://wooolwoool.hatenablog.com/entry/2023/11/12/153414
Playgroundsはplaygroundとは異なります

Playgroundsの「コードを学ぼう２」でswiftの勉強中！
今、ようやく、「宝石があちこちにランダムに」をクリアしたところ。
継続は力なりと信じて、継続しています…。


```swift:test.swift
let totalGems = randomNumberOfGems

var m_gem = 0
var flg = true

while !(m_gem == totalGems) {
    if !isBlocked && !isBlockedLeft {
        moveForward()
    }else if !isBlocked {
        moveForward()
        if isOnGem {
            collectGem()
            m_gem += 1
        }
    }else{
        turnLeft()
        turnLeft()
        if flg {
            pinkPortal.isActive = false
            bluePortal.isActive = true
            flg = false
        }else {
            pinkPortal.isActive = true
            bluePortal.isActive = false
            flg = true
        }
    }
}
```
[GitHub]コマンドラインでアクセストークンを使用するよう設定する

複数の記事を探して分かった手順を、備忘録としてこの記事にまとめます。

## 背景
コマンドラインでGitHubに接続するためにアクセストークンが必要となりました。

https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/

これまでパスワードを使用してssh接続していましたが、2021年6月30日に突如以下のエラーが出て通信できなくなりました。

```
remote: Password authentication is temporarily disabled as part of a brownout. Please use a personal access token instead.
```
これを解決します。

## 1. Access Tokenを発行する
GitHub上で行います。
手順は公式が画像つきで分かりやすく説明してくれています。
1~9を行ってください。

https://docs.github.com/ja/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token#creating-a-token

## 2. PCに入っているキーのパスワードを更新する
### Macの場合
「キーチェーンアクセス」で `github.com` のキーを検索し、削除します。

https://docs.github.com/ja/github/getting-started-with-github/getting-started-with-git/updating-credentials-from-the-macos-keychain#updating-your-credentials-via-keychain-access

### Windowsの場合
※環境によっては不要なようです。

「資格情報マネージャー」で `github.com` のパスワードを、1で取得したAccessTokenに書き換えます。


https://support.microsoft.com/ja-jp/windows/%E8%B3%87%E6%A0%BC%E6%83%85%E5%A0%B1%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B-1b5c916a-6a16-889f-8581-fc16e8165ac0

## 3. ターミナルでAccessTokenに変更
1.gitコマンドを打つ

remoteリポジトリに接続するコマンドならなんでもOKです。
例) `$ git fetch`

2.パスワードにAccessTokenを入力
1で作成したAccessTokenを入力すればOKです。
[ツッコミ歓迎]大気循環のシミュレーション

プリミティブモデルを参考に、大気循環をシミュレーションしてみました。
シミュレーション条件が特殊だったり挙動が怪しい部分はありますが、一旦公開します。

コードは[こちら](https://github.com/yasuhto/TinyAtmosphereSimulation)。

## 結果
赤道（0°）付近が最も暖められて大気が上昇し、高緯度で下降する現象が再現できました。
![TinyAtmosphereSim.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538053/62a93b5c-19b1-0d8f-f8c2-cce6cc24c14d.png)

※赤は上昇、青は下降



## シミュレーション条件
### 特殊な地球
* 地表の高低差は0（すべて海抜0m）
* 球ではなく、円筒（正距円筒図法。緯度が違っても1格子の面積は同じ）

### プリミティブモデルをできるだけシンプルに適用
 * 熱源は地表のみ
 * 摩擦力なく、断熱大気

#### 支配方程式
* 静力学平衡の式

```math
\frac{\partial{p}}{\partial{z}} = -{\rho}{g}
```
* 運動方程式（摩擦力は無視） 

```math
\frac{du}{dt} = fv - \frac{\partial{gz}}{\partial{x}} 
```
```math
\frac{dv}{dt} = fu - \frac{\partial{gz}}{\partial{y}} 
```

* 連続の式

```math
\frac{\partial{u}}{\partial{x}} + \frac{\partial{v}}{\partial{y}} + \frac{\partial{w}}{\partial{p}} = 0 
```


#### 予測値の計算方法
* 気温T(K)
 * 単純に、赤道から極にかけてsin分布で加熱します
 * 地表付近の大気のみ加熱します

```math
{dT} = sin(90°-\varphi)
```

* 標高Z(km)

```math
Z = \int_{p_n}^{p_0}dz\\
{dz} = -\frac{1}{\rho{g}}{dp} = -\frac{RT}{g} \frac{dp}{p} = -\frac{RT}{g} d(\log{p})
```

## 参考
 * [第4章 数値予報モデル - 気象庁](https://www.jma.go.jp/jma/kishou/books/nwptext/45/1_chapter4.pdf)
 * [プリミティブ方程式](https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AA%E3%83%9F%E3%83%86%E3%82%A3%E3%83%96%E6%96%B9%E7%A8%8B%E5%BC%8F)
 * [気象がわかる数と式　　8章：p座標系の基本式](https://ameblo.jp/imayohou/entry-12589224754.html)
paiza Bランクレベルアップメニュー　「足すか掛けるか」

paizaのBランクレベルアップメニュー「足すか掛けるか」問題に対して自分なりに
考えて書いた回答が合っていたので記念に残す。

問題は
2つの整数の組がn個与えられるので、各組の計算結果を足し合わせたものを
出力してください。
各組の計算結果は次の値です。
・2つの整数の組を足し合わせたもの
・ただし、2つの整数が同じ値だった場合は、掛け合わせたもの

入力は以下のフォーマットで与えられます。

n
a_1 b_1
...
a_n b_n

nは与えられる整数の組の行数です。
a_iとb_iはそれぞれが整数です。

私の回答

```java:myanswer
import java.util.*;


public class Main {
    public static void main(String[] args) {
        // 自分の得意な言語で
        // Let's チャレンジ！！
        Scanner sc = new Scanner(System.in);
        int time = sc.nextInt();
        int sum = 0;
        int esum;
        for(int i = 0;i < time *2 ;i = i + 2){
        int a = sc.nextInt();
        int b = sc.nextInt();
            if(a == b){
            esum = a * b;
            } else {
            esum = a + b;
            }
        sum = sum + esum;
        }
        System.out.println(sum);
    }
}

```

模範解答は配列を作って操作するもので配列が理解できていないと
書きようがないものだったのでこれも残しておく。

```java:answer
import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int times = scanner.nextInt();
        long sum = 0;
        
        for (int i = 0; i < times; i++) {
            long tmp[] = new long[2];
            tmp[0] = scanner.nextInt();
            tmp[1] = scanner.nextInt();

            if (tmp[0] != tmp[1]) {
                sum += (tmp[0] + tmp[1]);
            } else {
                sum += (tmp[0] * tmp[1]);
            }
        }

        System.out.println(sum);

        scanner.close();
    }
}

```


おしまい
人生にスパイスが欲しいので虹色に光るゲーミング文字を作った

# はじめに

最近雨で、家にいることが多いですよね。
となると、人生にスパイスが必要になるのは自明かと思います。

スパイスといえばやはり、笑い

笑いというのは一般に**「外的刺激によって、異なるイメージが作り出されることによる、脳の混乱が引き起こす反射的な反応であると考えられる。」**と言われております。

なので、真面目な資料の中に混入できるようにゲーミング文字を作りたいと思います。


#ゲーミング文字とは？

![UNI_DSC9455_TP_V4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715986/0e6ff880-979b-5878-f22b-3f0268ab49f9.jpeg)

このように虹色に光るものをよく「ゲーミング」と称することがあります。

真面目なビジネスシーンや、シンプルなデザインにおいて
![anime_1677.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715986/d037b426-cecb-a4c9-a53b-5aec32215135.gif)
というのは過度なノイズであると言えます。

こういったカラフルに光って存在感を出す文字を「ゲーミング文字」と定義させてください。

#作り方

まずは文字を用意しましょう
![dame.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715986/37c0e34c-4bd1-003d-656d-65da16ee93d3.png)

これじゃぁ、誠意も何も感じない進捗だめですね。
怒られるのは嫌なので改造しましょう。

# HSV色空間



今回のミソは色空間を使うことです。

hsv表記とは色を色相(Hue)・彩度(Saturation)・明度(Value)の３要素で表現する方法です。

色相が360で一周することにより疑似的に虹色を作り出すことが出来ます。

![img_hsv001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715986/7f014083-87c0-7656-bf92-4a08f52e7b79.png)

このように変化するのでHSVの値を1ずつ変え、それらをRGB値で表記させる必要があります。


```python:
def hsv_to_rgb(h, s, v):
    bgr = cv2.cvtColor(np.array([[[h, s, v]]], dtype=np.uint8), cv2.COLOR_HSV2BGR)[0][0]
    return (bgr[2], bgr[1], bgr[0])
```

この関数を使っていきましょう。

# カラフルな文字の作り方

今回は以下のプログラムを利用しました。

```python:
pic = cv2.imread("dame.png")
size = pic.shape
img = np.zeros(size, dtype=np.uint8)

for j in range(180):
    for i in range(img.shape[1]):
        # ここでスタート位置を変えている
        res = hsv_to_rgb((i+j) % 180,255,255)
        pts = np.array( [ [i,0], [i,img.shape[0]], [i+1, 0], [i+1,img.shape[0]]])
        dst = cv2.fillPoly(img, pts =[pts], color=(int(res[0]),int(res[1]),int(res[2])))
    transparence = (0,0,0)
    result = np.where(pic==transparence, dst, pic)
    ksize=7 
    result = cv2.medianBlur(result,ksize)
    cv2.imwrite(f"res/{j+1000}.jpg",result)
```

これで、以下のようなカラフルな進捗だめですを作れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715986/62e1d949-bb84-80ab-583b-e938419916d2.png)

hsvの値を少しずつ変えることによって疑似的に虹色が作れます。

さらに**np.where**を使って該当するところの色を変えています。

今回は黒い文字で書きましたので、黒い部分がすべて虹色に置き換わっていますね。


これらを見ているだけでも楽しいですが
これらを組み合わせてgifファイルを作っていきましょう。


# gifファイル化

gifファイルを作るにはPILを使います。

```python:
pictures=[]
for tmp in pic:
    pictures.append(Image.open(tmp))
    pictures[0].save('dame.gif',save_all=True, append_images=pictures[1:], optimize=False, duration=1, loop=0)
```

これを実行させると
![dame.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/715986/58981bde-7659-5b6e-c943-6b815948a6d3.gif)

虹色に光る進捗だめが出来ました。



いいですね。


# 結論

画像処理を使って簡単にゲーミング文字を作成することが出来ました。

次の目標として、文字でもできるようにしたいですね。

正規分布を虹色に光らせましょう。
残プロ　第-36回　~HTML中に複数行の文字列を書く~

# innerHTMLを変更するとき

通常，HTML中で以下のようなjsコードを書くとエラーになります．
一行で書いてもいいけど，読みづらくなるしなぁ...

~~~ html:
<script>
  document.getElementById(id).innerHTML = '
  <p>
　　Hi!
　</p>';
</script>
~~~

~~~
Uncaught SyntaxError: Invalid or unexpected token
~~~


# 文字列の加算

複数行に文字列を分ける場合，+を使った文字列の加算が利用できます．
この方法をとると文字列中で変数を扱うことも可能となります．

~~~ html:
<script>
  document.getElementById(id).innerHTML = ''+
  '<p>'+
    'Hi!'+
  '</p>';
</script>
~~~
バッチ処理でEBSのスナップショットを取得する方法

#事前準備
①volumeList.txt（EBSボリュームIDを格納する）
②createSS.sh　（EBSのスナップショットを自動取得実行ファイル）
⇒ファイルの中身：

```bash
#!/bin/bash
cat volumeList.txt | while read VOLUME_ID || [ -n "${VOLUME_ID}" ]; do
    aws ec2 create-snapshot --volume-id $VOLUME_ID --description $VOLUME_ID
done
```
＊2つのファイルは同一ディレクトリに格納する必要があります。

#EBSのスナップショットを取得する
今回はこの3つのEBSのスナップショットを一括で取得したいです。
![INKED6~2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/61e45f6a-fa2d-7aac-aa2b-011b734d7ef2.jpeg)



###STEP1
EBSのボリュームIDを「volumeList.txt」に記入します。
![Inked68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3435373839312f66393538663335622d386338652d666238352d373466632d38623931343134663864_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/731fc08c-ca22-eebb-8225-af81091c328f.jpeg)


###STEP2
「createSS.sh」を実行します。

```bash
Jenny:/Desktop/Snapshot作成バッチ$ ls -l
-rwxrwxrwx 1 song song 179 May 24 23:31 createSS.sh
-rwxrwxrwx 1 song song   0 Jul  7 14:31 volumeList.txt
Jenny:/Desktop/Snapshot作成バッチ$ ./createSS.sh
```

###STEP3
結果を確認します。
スナップショットを作成しましたね～～～～
![Inked68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3435373839312f36363761393662652d383332332d393638622d306262342d61306361316562393339_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457891/0d60f31d-222b-a431-5743-2139928a319f.jpeg)
Blazor WebAssemblyでASP.NET.Core Web APIが作成したPDFファイルを受け取る

# 1.サーバー側の処理

byte[]に変換したPDFデータをFileContentResultにして返却している。

```C#
[HttpPost]
public IActionResult GetPdf(SomeType parameter)
{
    using MemoryStream memotyStream = new();

    // ここの間でPDFライブラリを使ってPDFデータを「memotyStream」に乗せる。

    byte[] bytes = new byte[memotyStream.Length];

    memotyStream.Read(bytes, 0, bytes.Length);

    return this.File(bytes, MediaTypeNames.Application.Pdf)
}
```

#2.クライアント側の処理（C#）

1.のサーバ側APIを呼び出して、そのレスポンスデータを「ReadAsByteArrayAsync」で取得する。
そして、取得したレスポンスデータをJavaScriptのメソッド（この例では"OpenPdf"という名前）に渡して実行する。

```C#
protected override async Task OnClick()
{
    SomeType parameter = new(); // API側に渡すパラメータ（主旨とは無関係）

    HttpResponseMessage responseMessage = await Http.PostAsJsonAsync<SomeType>("https://localhost:12345/api/GetPdf", parameter);

    await JsRuntime.InvokeVoidAsync("OpenPdf", await responseMessage.Content.ReadAsByteArrayAsync());
}
```

#3.クライアント側の処理（JavaScript）

2.クライアント側の処理（C#）でAPIから返却されたレスポンスデータだが、
Base64エンコードされている状態なのでデコードしてやる必要がある。
__C#側でデコードできるはずなのだが何故かJavaScriptでやらないと上手くいかない。__
C#でデコードするとエラーになるかPDFが白紙になってしまう。
折角のWebAssemblyなのにわざわざJavaScriptで処理するのが勿体ないが
まぁ、そのうち誰かが解決してくれるだろう…

<font color="Red">
2022/9/25<br>
.NET Core 5.0→6.0にバージョンアップしたら<br>
Base64エンコードされてない状態になっていたので、<br>
.Net Core 6.0の場合、デコード処理は不要です。
</font>

```JavaScript
function OpenPdf(base64) {

    const byteCharacters = atob(base64);

    const byteNumbers = new Array(byteCharacters.length);

    for (let i = 0; i < byteCharacters.length; i++) {

        byteNumbers[i] = byteCharacters.charCodeAt(i);
    }

    const byteArray = Uint8Array(byteNumbers);

    const url = window.URL.createObjectURL(new Blob([byteArray], { type: 'application/pdf' }));

    window.open(url);
}
```
PHPで2分探索を書いてみました。

# はじめに
アルゴリズムを学び始めて理解したものから、順にアウトプットしていこうと思います。
2分探索は、「ソート済み配列の中から目的のものを高速に探索する」アルゴリズムになります。

### 以下、自分なりに書いてみました。



```php
<?php
function binarySearch($value, $array)
{
  $search_flag = false;
  $arrayLeft = 0;
  $arrayRight = count($array) - 1;

  while (abs($arrayLeft - $arrayRight) > 1) {
    $pivot = round(($arrayLeft + $arrayRight) / 2);
    if ($array[$pivot] == $value) {
      $search_flag = true;
      break;
    }
    if ($array[$pivot] < $value) {
      $arrayLeft = $pivot;
    }
    if ($array[$pivot] > $value) {
      $arrayRight = $pivot;
    }
  }


  if (!$search_flag) {
    echo "見つかりませんでした";
  } else {
    echo "見つかりました";
  }
}


$array = [3, 5, 9, 12, 15, 21, 29, 35, 42, 51, 62, 78, 81, 87, 92, 93];

binarySearch(62, $array);
binarySearch(9, $array);
binarySearch(10, $array);

```

### ポイント

while文の中でarrayLeftとarrayRightの要素が隣合わせになったら、処理を終了するという記述になります。
2分探索は、配列がソート済みという条件があるので、ソート関数を使ってから活かせればいいですね。
PHPドキュメント
https://www.php.net/manual/ja/array.sorting.php

以上
CSVファイルをExcelで開くときの文字化け対策「BOM」って？

# 概要
業務でCSVファイル出力を試していて、「Excelで開くときの文字化け対策」とだけ説明が記載された不思議な変数がありました。

```javascript
const bom = new Uint8Array([0xEf, 0xBB, 0xBF]);
```

ん？

# BOMとは
私の脳みそが一瞬爆発した音ではありません。

BOMとは「byte order mark(バイト順マーク)」の略称でUnicodeの符号化形式で符号化したテキストの先頭につける数バイトのデータのことです。

その数バイトのデータというのが先ほどのコードに記載されていた変数bomの正体です。
要するに、bomが付加されたファイルはUnicodeであることとUnicodeの符号化の種類(UTF-8とかUTF-16とか)を判別することができます。

ちなみにBOMが付加されていないファイルはUTF-8Nという名称で区別されることがあります。

# なぜ文字化けするのか
Excelの標準文字コードはShift-JISですが、入力ファイルをUTF-8として解釈することもできます。
ただし、ブラウザからダウンロードされたCSVファイルは「UTF-8N」であることが多く、Excelが認識している文字コードの違いにより文字化けの原因になるようです。

ちなみにBOMを付加しても、Excel上では文字として表示されません。

# 最後に
なんだこれをそのままにしない精神だけは大切にしよう。

# 参考サイト
[バイト順マーク - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E9%A0%86%E3%83%9E%E3%83%BC%E3%82%AF "バイト順 - Wikipedia")
[BOMの地雷を踏み抜かない正しい文字コードとの接し方](https://alaki.co.jp/blog/?p=1236 "BOMの地雷を踏み抜かない正しい文字コードとの接し方")
[javascript で作成したCSVファイルをエクセルで表示可能にする - Qiita](https://qiita.com/bump_of_kiharu/items/f41beec668e1f3ea675e "javascript で作成したCSVファイルをエクセルで表示可能にする - Qiita")
Javaの基礎

Javaで勉強したことをアウトプットしていきます。

# Javaの基本

```Java
Class main {
   public static void main (String[]args) {
    //ここに処理部分を書く。

　　　　　}

}
```

上記のようなクラスとメソッドを使って処理部分を実行していきます。

文字列を出力する場合は下記のコードを用います。
（）の中身をダブルクォーテーションで囲まないと出力されません。

```Java
System.out.println("Hello");
//最後のセミコロンは忘れないようにしましょう。
```

出力結果はこちらです。

```
Hello
```

数値の出力はこちらになります。

```Java
System.out.println(3);
System.out.println(5 - 2);
System.out.println("5 - 2");
```

出力結果はこちらです。

```
3
3
5-2
```
数値はダブルクォーションでは囲みません。
しかし、文字列として表示したい場合はダブルクォーテーションで囲みましょう。

#変数の定義

Javaで変数を定義する時はデータ型と変数名を定義します。
文字列の時はString（正確にはクラスの様なので、大文字らしいです。）
整数の時はint(Integerの省略)を使います。

```Java
int number;
number = 10;
System.out.println(number);

String name;
name = "Takeru";
System.out.println(name);
```
出力結果はこちらです。

```
10
Takeru
```
データ型と変数を同時に定義することもできます。
これを変数の初期化と言います。

また、変数の更新もできますが、更新の際はデータ型は定義しません。

```Java
String name = "Takeru";
System.out.println(name);

name = "Shun";
System.out.println(name);
```

出力結果はこちらです。

```
Takeru
Shun
```

Javaの変数で2語以上の単語の場合は大文字で区切る。
これをキャメルケースと言う。
例. userName


小数の場合はデータ型はdoubleと言います。

###自動型変換について
+や-の時は同じデータ型の時しかできません。
その時は自動で型の変換をすることができます。

例えば、String型にint型を足すと、int型がString型に変換されます。
int型の計算の答えはint型で出力され、double型の計算はdouble型で答えが出ます。
int型とdouble型の計算はdouble型に変換されます。

どうしてもデータを強制的に変換する場合は値の前にデータ型を置きます。

```Java
int number1 = 13;
int number2 = 4;

System.out.println((double)number1 / number2)
```

出力結果はこちらです。

```
3.25
```

#最後に

初心者ですので、拙い文章や書き方だと思いますが、最後まで見て頂き
ありがとうございました。もし、ご指摘等がございましたらよろしくお願い致します。
Sqoopの実行でPWをバッチのログに出さないTips

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1343/4e158164-c511-5857-34e8-753b5904e6ac.png)

DBのデータをお手軽にHadoopにロードできるSqoopさんは、 2021/06に屋根裏にいってしまいました :sob:
[Apache Sqoop - Apache Attic](http://attic.apache.org/projects/sqoop.html)

とは言え、Hadoopクラスタ使ってたら、まだまだ何かと便利な存在です。 
ただ、DBからデータをロードする際のPWの扱いについて調べると、古い or 誤った情報が散見するのでメモを残す。

## TL;DR

`--password-file` でローカルファイルを参照するときは、 `--password-file file://フルパス` と指定しよう

## 詳細


Sqoopを使うときに以下の様に `--password "himitu"` としてPWが丸見えの状態でバッチ実行しちゃうとログに残ったりして良くない。

```
$ sqoop list-tables --connect jdbc:mysql://my-mysql:3306/hoge_db \
   --username fuga \
   --password "himitu" ; # ← ダメ、絶対。
```

そうならないようにするためには、一番手っ取り早いのは、PWを以下のような感じでファイルに書き出し、

```
$ echo -n "himitu" > /etc/credential/sqoop.password
```

sqoopコマンド実行時に `--password-file` を用いたら良いのですが、以下のようにしてしまうと、HDFS上のパスを見に行こうとしてしまいます。

```
sqoop list-tables --connect jdbc:mysql://my-mysql:3306/hoge_db \
  --username fuga \
  --password-file /etc/credential/sqoop.password ; # ローカル上のパスじゃなくてHDFS上のパスを見ちゃう
```

なので、以下のようにして、 `file://` を付けるとローカルファイルを参照します。

```
sqoop list-tables --connect jdbc:mysql://my-mysql:3306/hoge_db \
   --username fuga \
   --password-file file:///etc/credential/sqoop.password
```
※`/` は３つです。

以上です。

## 参考

[7.2.1. Connecting to a Database Server | Sqoop User Guide (v1.4.6)]
(https://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html#_connecting_to_a_database_server)

> Secure way of supplying password to the database. You should save the password in a file on the users home directory with 400 permissions and specify the path to that file using the --password-file argument, and is the preferred method of entering credentials. Sqoop will then read the password from the file and pass it to the MapReduce cluster using secure means with out exposing the password in the job configuration. The file containing the password can either be on the Local FS or HDFS. For example:

```
$ sqoop import --connect jdbc:mysql://database.example.com/employees \
    --username venkatesh --password-file ${user.home}/.password
```
> Warning
Sqoop will read entire content of the password file and use it as a password. This will include any trailing white space characters such as new line characters that are added by default by most of the text editors. You need to make sure that your password file contains only characters that belongs to your password. On the command line you can use command echo with switch -n to store password without any trailing white space characters. For example to store password secret you would call echo -n "secret" > password.file.
日商簿記　電卓　M＋　M-　MR　MC　

Mはmemoryを指します。一つの配列です。
M＋　現在の計算結果をmemoryに追加する。
M-　現在の計算結果の負値をmemoryに追加する。
MR memoryの配列を合計する
MC memoryをresetする
1.
ACを押してresetする。
５　、M＋　→ [5]
4、M＋　→ 「５,4」
MRを押して９を表示します。　MRはmemoryの配列の値を合計です。
２.
ACを押してresetする。
10 X 10、 M+　→ [100]
5 X 5、　M＋　→ [100,25]
MR → １２５
３.
ACを押してresetする。
10 X 10、 M+　→ [100]
5 X 5、　M-　→ [100,-25]
MR → 75 この時memoryも　[75]
M1 MacでVS Codeをターミナルから起動できるようにするまで


# 環境
OS: macOS Big Sur 11.4
チップ: Apple M1

# 参考
こちらのページを参考にさせていただきました

* https://maku.blog/p/f5iv9kx/

# VS Codeのインストール
### [公式サイト](https://code.visualstudio.com/download#)からvscodeをダウンロード
※Apple Silicon を選択する

![スクリーンショット 2021-07-07 22.55.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84072/74c01e76-a9aa-c1b9-3b84-e8b7edbd6c93.png)

### Zipファイルを解凍
ダブルクリックで解凍後、回答されたファイルをアプリケーションフォルダ `/Users/ユーザー名/Application`に置く

### VS Codeを開く
LaunchpadやSpotlightからVisual Studio Codeを開く


### シェルコマンドを追加する
Command + Shift + p キーを同時押し→コマンドパレットが開かれる
`Shell Command: Install 'code' command in PATH` をクリック

![スクリーンショット 2021-07-07 23.00.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84072/c45a614c-d230-6812-54c3-0c99e7153abb.png)

これでコマンドが追加されました

# 使ってみる
* ターミナルを起動
* `code .`を実行

コマンドラインからvscodeが起動できるようになりました
それにしてもvscodeの起動が早い

![スクリーンショット 2021-07-07 23.07.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84072/9ece2e37-8308-0dd7-4c22-c76f2f46a687.png)
[Rails]ransackでキーワード検索をする

##はじめに
自作のQ＆Aアプリケーションでキーワード検索を実装したのでメモとして残します。
ransackは複数テーブルを検索できるので例えばquestionテーブルに紐付いているtagテーブル
のカラムに対しても検索をかけることができます。ransackのインストール方法は以下をご覧ください
[[Rails]ransackインストール](https://qiita.com/Jackson123/items/3942cb166be8cd322e70)

## テーブルの関係
questionテーブルの子テーブルとしてtagテーブルを設定している

```:model/question.rb
has_many :tags
```

```:model/tag.rb
belongs_to :question
```
## コントローラー
コントローラー以下のようになっている

```
def index
    @q = Question.ransack(params[:q])
    @question = @q.result(distinct: true)
end
```

##実装方法


以下のビューファイルのように記述します。

```:index.html.erb
<%= search_form_for @q do |f| %>　　
 <%=f.search_field:title_or_body_or_tags_name_or_country_name_cont,class:"form-control", placeholder: "キーワード検索"%>
 <%= f.submit class: "input-group-text"%>
<% end %>
```
自身のテーブルのカラムを検索したいときは`title`のようにカラムを一つ指定して記述する
しかし子テーブルtagのnameカラムを指定したいときは`tag_name`のようにスネークケースで繋げて記述する。
上記を見ても分かるとおり複数のカラムを検索したい場合は`_or_`で繋げることで実装できる。

##参考

https://hi-algorithm.com/ransack-multiple-search/
【WPF】スライダーのカーソル位置に同期してウィンドウのサイズを変える

# なにをするのか
WPFデスクトップアプリの**スライダーコントロール**を使う
スライダーのカーソル位置に応じて、**ウィンドウのサイズを変える**

# つくったもの

画面とソースコードを載せる

※動いている画面の録画を試みたが、`Win+G`の標準録画機能はつかえなかった
※理由：ウィンドウサイズが変更されると録画が停止されるため

## 画面

アプリ起動時

300 x 300の画面が表示される
画面には2つのスライダーが配置される
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/d23cfc0a-261b-09fa-8bfc-3c9ed7283ea9.png)

ピンクのスライダーを右に動かすと、ウィンドウが縦に伸びる
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/26968b74-af90-11c6-aaf9-3bff47b9af77.png)

水色のスライダーを下に動かすと、ウィンドウが横に伸びる
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/b47d26e9-af04-28f6-0e60-2198a61b5450.png)


当初は「横スライダー＝ウィンドウ横サイズ」として対応付けていたが
**ウィンドウサイズ変更にともなってスライダーの幅も変わり、描画がカクつく**ので
上記のような割り当てとした。

## XAMLソースコード

`MainWindow.xaml`の内容を載せる

```xml:MainWindow.xaml
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="{Binding Value, ElementName=HorizontalSlider, Mode=TwoWay}"
        Width="{Binding Value, ElementName=VerticalSlider, Mode=TwoWay}">
    <DockPanel LastChildFill="False">
        <!--水平方向のスライダー-->
        <StackPanel DockPanel.Dock="Top" Margin="5" Background="LightPink">
            <Slider x:Name="HorizontalSlider" Value="300" Minimum="300" Maximum="700"/>
            <TextBlock Text="{Binding Value, ElementName=HorizontalSlider, StringFormat={}{0:N1}}"/>
        </StackPanel>

        <!--垂直方向のスライダー-->
        <StackPanel DockPanel.Dock="Left" Orientation="Horizontal" Margin="5" Background="LightBlue">
            <Slider x:Name="VerticalSlider" Value="300" Minimum="300" Maximum="700" Orientation="Vertical" IsDirectionReversed="True"/>
            <TextBlock Text="{Binding Value, ElementName=VerticalSlider, StringFormat={}{0:N1}}"/>
        </StackPanel>
    </DockPanel>
</Window>
```

コードビハインドは変更していない

### XAMLのポイント

- ウィンドウの高さ・幅は`Mode=TwoWay`とする
- 縦スライダーは上が若い番号になるように`IsDirectionReversed="True"`とする
- テキストブロックに`StringFormat={}{0:N1}`を設定する
    - 未指定の場合、少数表示時にドックの幅が広くなる（下画像）

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/401ac78d-ba26-c6cf-b594-30b827747bd5.png)


# 参考
- [WPF4.5入門 その36 「Sliderコントロール」](https://blog.okazuki.jp/entry/2014/08/15/220915)
- [[WPF] XAMLでの文字列のフォーマット指定とバインディング](https://qiita.com/koara-local/items/815eb5146b3ddc48a8c3)
- [WindowのHeightとWidthにバインディングするには](http://nineworks2.blog.fc2.com/blog-entry-42.html)
【Android】ViewModel導入【Kotlin】

##①依存関係の追加

build.gradle(:app)ファイルを開きdependencies{}内に依存関係を追加する

```build.gradle(app)
dependencies{
   ...
   def lifecycle_version = "2.2.0"
   //ViewModel
   implementation　"androidx.lifecycle:lifecycle-viewmodelktx:$lifecycle_version"
}
```


画像で確認したい方はこちら
![GitHubSampleApp_–_build_gradle___app_-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062113/0b935c5b-43ba-0acf-b69b-1da7014b0982.png)

※他の記事や、本を参考にすると、ViewModelを利用するために、Lifecycle Extentionsという
　パッケージが必要になるということが書かれております。
　依存関係に、
　implementation 'androidx.lifecycle:lifecycle-extentions:2.2.0'を追加するように
　記載されている記事が多くありますが、
　公式ドキュメントを参考にすると、2021年7月7日現在、
　lifecycle-extensionsのAPIサポートは終了しており、
　代わりに、必要とする特定のLifecycleアーティファクトの依存関係を追加してください。と
　記載がありますので、昔の記事を見て、参考にしないように気をつけてください。

以下公式ドキュメント記載部分

![Lifecycle_ _ _Android_デベロッパー_ _ _Android_Developers-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062113/bc2eb8aa-21ae-28b5-9b9d-076ff4a28df9.png)



##②Sync Nowする

![GitHubSampleApp_–_build_gradle___app_-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062113/f00f7bc1-fc08-e977-d28b-db23c7f314a3.png)

ここまででプロジェクト内で、ViewModel導入することができます。

#おまけ
毎回依存関係を探してくる時に迷ってしまうので、道筋をここに記します。
Android公式とブラウザで検索するか、下記URLから公式ドキュメントを開く。
https://developer.android.com/?hl=ja

Jetpackをクリック
![Android_デベロッパー_ _ _Android_Developers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062113/a5777813-936f-9f02-bf08-a4b25524bebc.png)

ライブラリをクリック
![Android_デベロッパー_ _ _Android_Developers-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062113/99c5c485-9b28-e4dd-a24c-6835abe87e96.png)

リリースノートクリック

![Jetpack_ライブラリを種類別に探索_ _ _Android_デベロッパー_ _ _Android_Developers-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062113/310777ed-b0a2-fb61-4344-1cb0253c78d8.png)

androidx.lifecycleをクリック

![Jetpack_ライブラリを種類別に探索_ _ _Android_デベロッパー_ _ _Android_Developers-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062113/38be3808-c948-e379-e08f-493499823eff.png)

下画像枠部分からViewModelの依存関係をとってくる。

![Lifecycle_ _ _Android_デベロッパー_ _ _Android_Developers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062113/a1dc397e-70b1-dc4b-a17b-0258fcfc1abf.png)

上画像ではalpha版を使用しているが、
なるべく不本意なエラーが起きることのないように
現在の安定板と書いているバージョンを使うようにしよう

![Lifecycle_ _ _Android_デベロッパー_ _ _Android_Developers_と_GitHubSampleApp_–_build_gradle___app_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062113/8e2442ef-ece4-8091-58a3-3bb3c8dbc4dd.png)

最後までお読みいただきありがとうございます。
記事を読む皆様の参考になれば幸いです。

参考になりましたら、チャンネル登録、高評価はないので、LGTMをお気持ち程度いただければ、嬉しいです！！


##参考にさせていただいた記事と書籍

https://developer.android.com/?hl=ja

https://neet-rookie.hatenablog.com/entry/2021/01/01/170725

https://www.amazon.co.jp/Android-Jetpack%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Studio-Kotlin%E5%AF%BE%E5%BF%9C/dp/4798063215
Sonata IOST .NET SDKを使ってみる その１

##はじめに
ブロックチェーンやスマートコントラクトの勉強を始めようと思い立ちましたが、
EthereumだとSolidityだったり新たな言語を勉強する必要があり、すぐには手が出せないなと
思っていたところ、IOSTはスマートコントラクトをJavaScriptで記述できるということで、
ここを切り口にブロックチェーンやスマートコントラクトの勉強を始めてみました。

色々とネット上の情報を物色していたところ、スマートコントラクトではないですが、
偶然.NET用のクライアントSDKを見つけたので使ってみたという記事です。

#このSDKでできること
このSDKはブロックチェーンへアクセスするクライアント側の処理をライブラリ化したものかと思います。
チェーンの情報を参照できたり、スマートコントラクトを呼び出したりトランザクションを発生させたりできそうなので、このSDKを使えば.NETアプリでのIOSTウォレットとか作れそうです。※このSDKではスマートコントラクトは作れないです。

#開発環境を作る
* 必要なもの
.NET Framework4.7.2
Visual Studio 2019

* SDKのダウンロード
以下のURLからSDKをダウンロードできます。

https://sonata.asia/api/iost.html

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1164081/d252b148-4ad5-937c-2735-3981e8138b17.jpeg)
※zipファイルとなっていて、解凍するといくつかアセンブリが格納されています。
これらのアセンブリをVisualStudioのプロジェクトで参照を追加して使っていきます。

# 使ってみる
アカウント名を入力してボタンをクリックすると、テキストボックスにIOSTの保有量が表示されるシンプルなアプリケーションを作ってみます。
今回は一番使い慣れているC#のWindowsFormアプリケーションで・・・

### SDKに入っているアセンブリをプロジェクトの参照に追加
SDKには.NET CORE(UWP)用と.NET Framework4.7.2用がありますが、今回は.NET Framework用を使用。参照を追加したのはIOST.dllのみ
### using
```Form1.cs
using IOST;
using IOST.model.account;
```
今回使用するのは、IOSTクラスとClientクラス(名前空間：IOST)、
TokenBalanceクラス(名前空間：IOST.model.account)

###コンストラクタ
```Form1.cs
public Form1()
{
    InitializeComponent();
    IOST.IOST iost = new IOST.IOST();
    IOSTClient = new Client("https://api.iost.io");
}
```
IOSTクラスでは、スマートコントラクト呼び出し時のgaslimit等を管理しているようです。
今回はスマートコントラクトは呼び出さないので引数なし(SDKで設定されているデフォルト値)でnewしています。
Clientクラスは、クライアントから行われる操作がまとまっているクラスでコンストラクタの引数で
接続するIOSTノードのURLを指定します。

###ボタンクリックイベント
```Form1.cs
private void btnGet_Click(object sender, EventArgs e)
{
    var tokenBalance = IOSTClient.GetBalance(txtAccountName.Text,"iost",true);
    txtResult.Text = tokenBalance.balance.ToString();
}
```
ClientクラスのGetBalanceメソッドを使用してトークンの保有量を取得します。
引数は、アカウント名、トークン名、取得の方法(true:最長のブロックから取得、false:不可逆ブロックから取得)の３つです。
戻り値はTokenBalance型で戻るのでbalanceプロパティから保有量を取得します。

##さいごに
このSDKに関するドキュメントがほとんどないので手探りでやってみましたが
他にも色々できそうな雰囲気があります。ライブラリ化されているので.NETアプリにIOSTチェーンへの
クライアント機能を組み込む際に使えるかもしれません。

#参考にしたサイト
https://developers.iost.io/docs/ja/6-reference/API.html

https://sonata.asia/api/iost.html
IntelliJ IDEAでLucene/Solrのリポジトリを飛ぶように追いたい

Lucene/SolrのソースをIntelliJ IDEAで `⌘+b` しながら快適に追いたい、と思ったら出来なかったし設定が面倒だったのでメモしておく。

# JDK

JDK がインストールされてなかったら、IDEA 内で Setup JDK から Amazon Corretto 11 をインストール(好み)。
共有インデックスのインストールを聞かれるので Always Downloadを選択した。

```
Download pre-built shared indexes
			Reduce the indexing time and CPU load with pre-built JDK shared indexes
```

手動で適当な JDK をインストールしてもよい。

https://qiita.com/ryo0301/items/3c9a02e03b4e9a41f576

# apache/lucene-solr 編

Solr8.xまで使われていたリポジトリ。
antを利用しているので、その設定を行う。

https://github.com/apache/lucene-solr

## Ant

```
brew install ant
```

openjdk もインストールされてしまう。
`~/.ant/lib/` がないと後々エラーになるので作成しておく。

```
mkdir -p ~/.ant/lib
```

## Ivy

IDEA で Ant ペインから＋をクリックし `lucene-solr/lucene/common-build.xml` を追加する。
`ivy-bootstrap` ターゲットがあるので Run すると `~/.ant/lib/` 以下に Ivy がインストールされる。

## IDEA

Ivy の時と同様に IDEA で Ant ペインから＋をクリックし `lucene-solr/build.xml` を追加する。
`idea` ターゲットがあるので Run するとビルドが始める(長い)。

ビルドが終わったら飛ぶようにソースを追える。

# apache/lucene 編

Lucene9.xから独立したリポジトリになった。
gradleを使うようになった。

https://github.com/apache/lucene

## Gradle

プロジェクトを開くとビルドが始まる。
モジュールのダウンロードによく失敗するので、何度かリトライした。

apache/lucene-solrと同じく共有インデックスのインストールを聞かれるので Always Downloadを選択した。

```
Download pre-built shared indexes
			Reduce the indexing time and CPU load with pre-built JDK shared indexes
```

ビルドが終わったら飛ぶようにソースを追える。

# apache/solr 編

Solr9.xからApacheのTLPになったので、めでたく独立したリポジトリになった。
gradleを使うようになった。

https://github.com/apache/solr

こちらもプロジェクトを開くとビルドが始まる。
あとはapache/luceneと同じ。
Python 文字列に特定文字が含まれていたら削除する


##やりたいこと
・”Python”　という文字列に、"a","i","u","e","o"のいずれかの文字が含まれていたら
　削除して、出力する。


#実地
例1）aiueoではない文字のみを、リストに追加

```php
mozi = "Python"
target = "aiueo"

l = [] #空リストの作成

for s in mozi:
  if s not in target:
    l.append(s) 
   
print(''.join(l))
#Pythn と出力される
```

例2）↓こっちの表記の方が、リスト作成不要で、よりスマート。

```php
mozi = "Python"
target = "aiueo"

n = ''.join(s for s in mozi if s not in target)
print(n)
#Pythn と出力される
```

#（補足)　''.join(リスト)
'間に挿入する文字'.join(リスト)で
リストの文字列を、指定した文字で繋げて表示できる。
''の場合は、区切り文字なしで表示。

例）

```php
l = ["123", "aaa", "456"]

print(''.join(l))
#123aaa456 と出力される

print('-'.join(l))
#123-aaa-456 と出力される

print('pop'.join(l))
#123popaaapop456 と出力される

print('\n'.join(l))
#123
#aaa
#456
#改行されて表示される
```
【Node.js】npmとyarnの違い

#Node.jsとは
　Node.jsはサーバーサイドで動くJavaScript。Node.jsに関しては[以前の記事](https://qiita.com/mzmz__02/items/700955985150fa34a757)で詳しく扱ってる。

　以前はずっとnpmを使っていたが、最近yarnを知ったのでnpmとの違いについてまとめる。(間違い等ありましたら、コメントいただけると幸いです。)

##パッケージマネージャーとは
　パッケージマネージャーは、どのソフトウェアがインストールされたのを記録して、新しいソフトウェアのインストール・新しいバージョンのソフトウェアの更新・インストールしたソフトウェアの削除を簡単に行えるプログラム。

#npmとは
　Node Package Managerの略で、JavaScriptパッケージマネージャー。Node.jsで作られたパッケージやライブラリを管理するためのツール。`npm`というコマンドで動作するプログラム。

　npmにはインストールしたときのパッケージのバージョンの非再現性や、パフォーマンス・セキュリティの問題がある。この問題を解決するために生まれたのがyarn。

#yarnとは
　npmの後に登場したJavaScriptのパッケージマネージャー。<b>npmの上位互換のツール</b>になっている。npmとの互換性があり、`packagejson`がそのまま使える。(package.jsonについては[こちらの記事](https://qiita.com/mzmz__02/items/dfa7abb4237a3842a2a8)で詳しく扱ってる)

#npmとyarnの違い
　npmとyarnを比較すると、主に3つの点でyarnの方が優れている。

##1. インストール速度の高速化
　npmよりもyarnの方が早い。npmもアップデートされていくため、差は縮まっているもののyarnの方が高速。


##2. 高いセキュリティ
　yarnはライブラリの整合性のチェックを行う。


##3. バージョンの管理が行いやすい
　yarnにしかない機能もある。それが`upgrade-interactive`で、アップデートできるパッケージを表示してくれる。

```:コマンド
$ yarn upgrade-interactive
```

　また、`yarn.lock`ファイルでバージョンの違いの依存プログラム・パッケージのインストールが起こらないようになっている。現在では`yarn.lock`と同じ機能を持つ`package-lock.json`があるのでnpmでも変わらない。


#参考文献
[パッケージマネージャとは](https://www.debian.org/doc/manuals/aptitude/pr01s02.ja.html)
[npmとyarnとpnpmの違い2021](https://zenn.dev/hibikine/articles/27621a7f95e761)
[【JS】yarnの長所とyarnからnpmに戻ってきた理由](https://jsnotice.com/posts/2020-09-02/index.html)
Android Studio(Windows10)でエミュレータ電源起動しない時の対処

<h1>概要</h1>
エミュレータ使えるまでに行ったことを2つ記述します。

<h1>前提</h1>
エミュレータの電源はつかないものの画面が黒いまま動かないという状態まではできていること。

<h1>対処法①haxmをインストール</h1>
下記からhaxmをインストール。インストールする時には「windowsの機能の有効化または無効化」から仮想関連のチェックをオフにする必要があります。私の場合は仮想マシンプラットフォームとハイパーバイザープラットフォームをオフにした状態でインストールしました。
https://github.com/intel/haxm/releases

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/f1c15d0c-1265-8f8e-491f-c0cab8ef1d83.png)




<h1>対処法②emulator -avd｛作成した仮想デバイス名｝-gpu swiftshader_indirectを実行
</h1>
タブのFile→Setttingsを開きAndroid SDK Locationのパス/emulatorで下記コマンドを実行します。
｛作成した仮想デバイス名｝を忘れたという場合はAVD ManagerのNameがそれです。

```
emulator -avd ｛作成した仮想デバイス名｝ -gpu swiftshader_indirect
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/78daf485-ec0f-8b67-7f43-12de369d5170.png)


実行時のイメージは下記
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/9ae1f690-5c77-077a-9f8d-a59e61871365.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/0347d8cc-be78-4023-eb4a-b7a8cdac6d38.png)

<h1>感想</h1>
エミュレータの設定一発で問題なくできる人いるのでしょうか。。。
App Store Connect distribution optionsの項目の意味

## 確認時の状態
- Xcodeバージョン: 12.5.1
- 配布対象アプリのタイプ: iOS

## Include bitcode for iOS content

### 概要
AppStoreがアプリをコンパイルできるようにするため、アップロード内容に`ビットコード`（中間ファイル）を含める

### 詳細
AppStoreがアプリをコンパイルをできるようになると以下２点のメリットがある

- 対象デバイスとOSのバージョンに最適化されたアプリをコンパイルして配信してくれる
- 将来ハードウェア・ソフトウェア・コンパイラの変更があった際に、変更を適用した状態のアプリを再コンパイルし配信してくれる

そのためにアプリの`ビットコード`(中間ファイル)が必要な為、アップロード内容に含めるか選択する

## Upload your app’s symbols to receive symbolicated reports from Apple

### 概要
Appleから受け取るクラッシュログのスタックトレースにclass名・func名などの情報も含めるため、クラッシュログ(.ipsファイル)の解析に必要なシンボル情報をAppleにアップロードする


### 詳細
iOSのクラッシュログ(.ipsファイル)は以下のようにエラーが発生したclassやfuncの場所がわからないようになっている

```text:クラッシュログ
Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libswiftCore.dylib                  0x00000001b02cc398 0x1b029b000 + 201624
1   libswiftCore.dylib                  0x00000001b02cc398 0x1b029b000 + 201624
2   test                                0x00000001003518ac 0x10034c000 + 22700
3   UIKitCore                           0x00000001af1e5ca4 0x1ae6af000 + 11758756
```

そこでアプリの`シンボル情報`(.dSYMや.bcsymbolmap)を使用し、クラッシュログにクラス名や関数名の情報を付与する(このことを`シンボル化(symbolicate)`という)

```text:シンボル化後のクラッシュログ
Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libswiftCore.dylib                  0x00000001b02cc398 _assertionFailure+ 201624 (_:_:file:line:flags:) + 1504
1   libswiftCore.dylib                  0x00000001b02cc398 _assertionFailure+ 201624 (_:_:file:line:flags:) + 1504
2   test                                0x00000001003518ac @objc ViewController.didTapErrorButton(_:) + 22700 (<compiler-generated>:18)
3   UIKitCore                           0x00000001af1e5ca4 -[UIApplication sendAction:to:from:forEvent:] + 96
```

この項目では、シンボル化された状態のクラッシュログをAppleから受け取るために`シンボル情報`をアップロードするか選択する

### 参考
- [Publish Your App With Symbol Information (Apple Developer)](https://developer.apple.com/documentation/xcode/building-your-app-to-include-debugging-information)
商品表示機能のおさらい

実装したいこと
1.出品した商品の表示
2.新しい出品から表示させる
3.投稿がない場合はダミーの投稿を表示させること


1.出品した商品の表示

商品すべてを表示させるには、「繰り返し表示させる」という考え方で、each文を使用する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1650636/efbcdacf-181a-57bc-42f4-e2449162793b.png)


商品の情報（価格、値段、画像、配送料の負担）を表示させるため、ビューの記述を編集する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1650636/fef5c990-f1fe-3c62-c08b-6a1814162d99.png)

＊each文で「productというブロック変数」を使用したため、@productのインスタンス変数を使用しない
例　product.image(画像の表示)


＊配送料の表示は、productモデルの中に存在するburdenを指定するだけでは表示されないので、紐付いているburdenモデルのnameを呼び出す


2.新しい出品から表示させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1650636/123e9751-d10f-9182-3d9e-6e0f75328947.png)

昇順、降順を指定するDESCを作成日のcreated_atに指定する


3.投稿がない場合はダミーの投稿を表示させること

投稿されているか否かの条件式を記述
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1650636/e2193a05-d445-0080-5f38-3088174c2385.png)

＊exists?メソッドは存在するか田舎のメソッドなので＠インスタンス変数に指定することで商品の存在の有無を確認できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1650636/438ff611-a499-15a7-4c21-47609f896647.png)

もともと記述されていたダミーの投稿を投稿がない状態での表示「else」に指定する





重要ポイント

昇順はasc,降順はdesc
存在の有無はexistsメソッド
active_hashの表示はブロック変数.active_hashのモデル名.表示させたいデータ
VBScriputによるCSVファイルの加工

##■経緯
　・CSVデータをある程度自由に加工するスクリプトが欲しかった

##■環境：
　・windows10 64bit

##■やりたいこと：
・CSVデータ（テキスト）で、一番の左の列の文字を加工したい
　例)"id" → "id01"

##■VBSの実装方針
　・UTF-8に対応する事
　・引数で入出力のファイル名を渡せる事
    例)　cscript.exe readwrite-csv modules.csv outmodules.csv
　　※実行はcscript.exeを用いて確認
　・将来的に簡単な改造でファイルを分割したりする事が出来る事
　・結果をプロンプト上で確認出来る事

##■コード
```VBScript:readwrite-csv
Option Explicit
'-------------------------------------- 
'main
'-------------------------------------- 
    Dim inputFileName,outputFileName
    Dim inStream,outStream
    Dim records,intY,out,m,debugout
    '入出力ストリームの生成・設定（テキスト、UTF-8）
    inputFileName = WScript.Arguments.Item(0)
    outputFileName = WScript.Arguments.Item(1)
    Set inStream = CreateObject("ADODB.Stream")
    Set outStream =CreateObject("ADODB.Stream")
    inStream.type = 2 '1:バイナリデータ 2:テキストデータ
    inStream.charset = "UTF-8" '文字コード設定
    inStream.open
    inStream.LoadFromFile inputFileName
    outStream.type = 2
    outStream.charset = "UTF-8"
    outStream.open 

    Do While inStream.EOS = False
        '読み込んだレコードをカンマ区切りで配列に格納
        records = Split(inStream.ReadText(-2), ",") 'ReadTextの第一引数：-1:全部読み込む -2:一行読み込む
        intY = 1
        out = ""
        For Each m In records
            if intY = 1 then
                m = Deldbquot(m,"""")
                m = """" + m + "01" + """"
            End If
            out = out & " " & m
            intY = intY + 1
        Next
        debugout = debugout & out & VbCrLf 'debug用
        outStream.WriteText out, 1 'WriteTextの第二引数：0:文字列のみ書き込む 1:文字列＋改行を書き込む
    Loop
    'debug用
    WScript.StdOut.WriteLine "--------------------------------------" 
    WScript.StdOut.WriteLine outputFileName
    WScript.StdOut.WriteLine "--------------------------------------"
    WScript.StdOut.WriteLine debugout
    outStream.SaveToFile outputFileName, 2 '1:ファイルがない場合はファイル作成 2:ファイルがある場合は上書き
    inStream.Close
    outStream.Close
'-------------------------------------- 
'関数、文字削除
'-------------------------------------- 
Function Deldbquot(strString,delString)
    Deldbquot = Replace(strString, delString, "")
End Function
```

##■デバッグ
実行すると、左の列最後に”01”が追加された

C:\Bitnami\test>cscript.exe readwrite-csv.vbs modules.csv outmodules.csv
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

--------------------------------------
outmodules.csv
--------------------------------------
 "id01" "project_id" "name"
 "101" "1" "issue_tracking"
 "201" "1" "time_tracking"
 "301" "1" "news"
 "401" "1" "documents"
 "501" "1" "files"
 "601" "1" "wiki"
 "701" "1" "repository"
 "801" "1" "boards"
 "901" "1" "calendar"
 "1001" "1" "gantt"


C:\Bitnami\test>

##■工数
　2h

以上です、お疲れ様です。
Laravel8からtinkerの書き方が変わった


##現象

エラーが出る模様

```
# php artisan tinker
>>> factory(App\Models\User::class)->create(['name' => 'sato', 'email' => 'sato@hoge.co.jp', 'password' => bcrypt('hogehoge')]);
PHP Fatal error:  Call to undefined function factory() in Psy Shell code on line 1
```

##解決方法

こっちが正しい構文のようです。

```
# php artisan tinker
>>> User::factory()->create(['name' => 'sato', 'email' => 'sato@hoge.co.jp', 'password' => bcrypt('hogehoge')]);
```
【Python】Pythonのデータ構造4種の操作早見表

#Pythonのデータ構造とは
　データ構造とはデータを格納する形式のことであり、Pythonには4種類の基本的なデータ構造がある。それはリスト、タプル、集合、辞書である。そして、データ構造に格納された各データのことを要素という。本記事ではPythonの4種類のデータ構造への要素の追加、削除などの操作の仕方をまとめる。

#4種類のデータ構造の操作
関数やメソッドの中の"イ"の文字はイテラブルの略である。

||リスト|タプル|集合|辞書|
|:--:|:--:|:--:|:--:|:--:|
|作成|[値,...]<br>list(イ)|(値,...)<br>tuple(イ) |{値,...}<br>set(イ)|{キー:値,...}<br>dict(イ)|
|例|[0,1,2]<br>list(range(0,5))|(0,1,2)<br>tuple("ABCD")|{0,1,2}<br>set("abab")|{"a":1,"b":2}<br>dict([("a",1),("b",2)])}|
|要素の<br>追加|リスト+=イテラブル<br>.append(値)<br>.extend(イ)|-|.add(値)<br>集合&#124;={値,...}|辞書[キー]=値|
|例|.append("a")<br>.extend(["abc"])|-|.add("abc")<br>food&#124;={"milk","egg"}|value["egg"]=200|
|削除|del リスト[インデックス]<br>.pop(イ)<br>.remove(値)|-|.remove(値)<br>.discard(値)<br>集合-+{値,...}|del 辞書[キー]<br>.pop(キー)|
|例|del a[1]<br>a.pop(1)|-|food-+{"milk","egg"}|del value["egg"]|
|連結|リストA+リストB|タプルA+タプルB|集合A&#124;=集合B|辞書A.update(辞書B)|
pythonを使ってリアクティブなWebアプリを作りたい【基礎編】

こちらのプロジェクトの開発前にやるべきことについてのpostです。
https://qiita.com/geeorgey/items/ace37bd92841c9d1a378

## 開発環境を整える
開発自体はVisualstudio Codeでやります。
[こちらからダウンロード](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)してインストールしてください。

## 作業フォルダを開きます
Open folderから
![Menubar_と_Welcome_—_QAtemplate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/0a980582-f358-fda8-79a6-b51951f177b0.png)
フォルダの場所はどこでも構いません。作業フォルダを作って、そちらを開きましょう。
そこから作業開始です。

## ターミナルを開く
メニュー＞Terminal＞New Terminal
![スクリーンショット_2021-07-07_21_41_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/f87a7d68-120f-233e-3ddc-4029786b9e48.png)

右下部分にターミナルが開きます。

![Item-0_と_Item-0_と_Item-0_と_Item-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/145936be-98c0-3eb0-285d-94fb4e05dbdf.png)

## Macに公開鍵を作ります
ターミナルから一行ずつ打ち込んでください。
cd
mkdir .ssh

cdは自分のルートディレクトリに移動するコマンドです。
mkdirは make directoryのコマンドで、ディレクトリ(フォルダ)を作成するコマンドです。
ここでは .sshフォルダを作っています。
次のフォルダのパーミッションを変更します
chmod 700 ~/.ssh

次はこちらのコマンドでキーファイルを作ります。
ssh-keygen -t rsa
次に、秘密鍵のパーミッションを変更します。
chmod 600 .ssh/id_rsa

## Githubにアカウントを作りましょう(無料)
https://github.com/
自分のIDを作ってください。

## githubに公開鍵を登録します
ターミナルから開きます
vi ~/.ssh/id_rsa.pub

として開いた公開鍵をこんな風にコピーしてください。
![Welcome_—_QAtemplate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/61ddc683-8fb9-ee69-346b-0041ffbbcc80.png)
文字列をトリプルクリックすると、行全体が選択状態になります。
コピーしたらviを抜けてください。
:q
と押せばviエディタから抜けられます。

Githubのこちらの画面を開きます。
右上の自分のアイコンからSettingsを選んだらこちらのURLに移動します。
https://github.com/settings/keys
![SSH_and_GPG_keys.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/a1c1951d-9e4c-bd8b-1589-e83e8cb768e2.png)
New SSH keyボタンから公開鍵を貼り付けて保存します。
これは、ローカル環境からGithubにpushするときに必要になるので必須作業です。

## Macにgitをインストールします
参照　[MacにGitをインストールする](https://qiita.com/suke_masa/items/4bed855628f7414293f8)
Homebrewをインストールしてからbrew install gitを実行です。

## リポジトリをForkします
自分のGithubアカウントにログインしたら、リポジトリを開いてForkボタンを押しましょう。
https://github.com/geeorgey/vue_flask_template
右上にあるForkボタンを押して、自分のリポジトリにコピーしてください。リポジトリは公開/非公開どちらでも構いません。
そうすると、
https://github.com/自分のユーザー名/vue_flask_template
というリポジトリが作成されます。

## Forkしたリポジトリをcloneしましょう。
ターミナルからまずはリポジトリのアドレスをコピーしてください。

![geeorgey_vue_flask_template.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22294/fd45472a-a40b-b7b0-65fe-f7c2963417e4.png)

git clone ここにコピーしたアドレスを入れる。
とすればローカル環境にファイルが落ちてきます。
具体的には
git clone git@github.com:geeorgey/vue_flask_template.git
みたいな形ですね。

これでローカルにファイルが落ちてきました。

以降の作業については、README.mdを参照してください。
https://github.com/geeorgey/vue_flask_template#heroku%E3%81%A7%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8B

## ターミナルの基本的なコマンドについて
黒い画面が怖いという人は是非こちらで基本的な使い方を覚えましょう。
[Macのターミナルコマンド一覧（基本編）](https://qiita.com/ryouzi/items/f9dee1540a04a0bfb9a3)

最初は
cdとlsを覚えておけば、フォルダの移動とフォルダの中身の確認ができるのでそのあたりから。