OmniAICreator/Qiita-1.07M huggingface dataset:
Alibaba Cloud認定資格　基本情報

#Alibaba Cloud認定資格
Alibaba Cloudの認定資格には3つのジャンルと3段階のレベルに分かれている。

**【Expert】エキスパートレベル**

* ACE クラウドコンピューティング認定
* ACE ビッグデータ認定

**【Professional】プロフェッショナルレベル**

* ACP クラウドコンピューティング認定
* ACP クラウド・セキュリティ認定
* ACP ビッグデータ認定

**【Assosiate】エントリーレベル**

* ACA クラウドコンピューティング認定
* ACA クラウド・セキュリティ認定
* ACA ビッグデータ認定


#ACA クラウドコンピューティング認定の出題範囲


| 出題範囲          |　出題率 　| 
|:-----------------|:------------------:|
| ECS             |              30% |
| SLB           |            20% |
| OSS             |              15% | 
| RDS              |                10% | 
| AutoScaling             |             10% | 
| Alibaba Cloud Security Service and Cloud Monitor  |             10% | 
| General knowledge about Cloud Computing  |             5% | 


#出題形式


| 出題形式          |　出題数 　| 
|:-----------------|:------------------:|
| 単一選択問題      |               30問 |
| 複数選択問題      |            10問 |
| 正否選択問題      |               10問 | 

※それぞれ配点は2点。65点/100点で合格。


#受験方法
[ピアソンVUE Alibaba](https://www.pearsonvue.co.jp/Clients/Alibaba-Cloud-Certification.aspx)から申し込み。
【Python】numpyの基本的な使い方

##numpyについて
numpyを利用することで、行列等の数値計算を簡単に計算することが可能です。

###行列の生成

以下のようにnp.arrayにリストを引数にすることで配列を生成できます。

```
import numpy as np

array = np.array([1,2,3,4])

array
```

```実行結果.
array([1, 2, 3, 4])
```

リストのリストを引数にすることで、行列（２行４列）を作成することができます。

```
array2 = np.array([[1,2,3,4],[11,22,33,44]])
array2
```

```実行結果.
array([[ 1,  2,  3,  4],
       [11, 22, 33, 44]])
```

何行何列の行列であるかを調べるためにshapeメソッドを使用することで調べることができます。

```
array2.shape
```

```実行結果.
(2, 4)
```

arangeメソッドを使用することで引数の値分の配列を生成することができます。

```
np.arange(5)
```

```実行結果.
array([0, 1, 2, 3, 4])
```

###行列の計算

array同士を掛け算するとそれぞれの要素同士で掛け算をした結果が出力されます。

```
array2

array([[ 1,  2,  3,  4],
       [11, 22, 33, 44]])

array2 * array2
```
```実行結果.
array([[   1,    4,    9,   16],
       [ 121,  484, 1089, 1936]])
```

array同士であれば足し算、引き算、割り算も同様に行います。
arrayと数字であればそれぞれの要素と数字で計算をします。

```
array2 ** 3
```

```実行結果.
array([[    1,     8,    27,    64],
       [ 1331, 10648, 35937, 85184]])
```

###行列の入れ替え

reshapeメソッドを使用することでnp.arangeで作成した配列を引数の値の行列に変形することができます。

```
array = np.arange(9).reshape((3,3))
array
```

```実行結果.
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
```

行と列を入れ替えるに以下で可能です。

```
array.T
```

```実行結果.
array([[0, 3, 6],
       [1, 4, 7],
       [2, 5, 8]])
```
GitHubで複数アカウントを使い分けることに手こずったらみる記事

GitHubで複数アカウントを使い分けようとしたら、どの記事も小出しにしか情報を出していなかったため
（初心者なので全部教えてもらわないとできないため）
包括的にまとめます。

## 今後はSSHでアクセスしようと覚悟を決める
あれです。git cloneとかするとき、何も考えずHTTPSでやってたアクセス方式です。
<img width="1191" alt="スクリーンショット 2020-07-24 21.37.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303716/a406042c-8c33-24da-6137-9cb9bed7f131.png">

これからは、「Use SSH」ボタンをクリックして、SSH接続しましょう。

### SSHとは？
そもそもHTTPSとSSHの違いは何でしょうか。

この問題は、HTTPSはHTTPというテキストデータをSSLという暗号技術によってセキュアにしていることから（HTTPS←HTTP＋SSL）、SSLとSSHの違いに置き換えることができます。
←初心者はそもそもここからわからない。しかもSSLとSSHの名前似すぎ。

これに関しては、以下の記事などで詳しく書かれています。
- [ここが違うよSSHとSSL！ - Qiita](https://qiita.com/satodayo/items/b45573b7165235a15152)
- [「SSL」と「SSH」の違い｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/diff384security.html)

## SSHの鍵を作成し、GitHubに登録する

SSH鍵の作成方法について、色々な方がまとめてくださっています。
個人的に一番わかりやすかったのは以下の記事です。

- [【git エラー解決策】Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. が出た時の解決方法 - " いいね " なライフをつくる。](http://tusukuru.hatenablog.com/entry/2018/08/29/021651)

補足として、SSH鍵自体はGitHub以外でも使うことがあるらしいので、ターミナルで作成することができます。
作成されるとホームディレクトリ（ターミナル立ち上げ時のカレントディレクトリ）に「.ssh」という隠しファイルができます。
この中にある「config」というのがとてつもなく大事なファイルです。
もし、2つのアカウント（仕事用とプライベート用）を使い分けたいのであれば、以下の構成がおすすめです。

```
.ssh/
 ┣config
 ┣private/
    ┣id_rsa
    ┗id_rsa.pub
 ┗job/
    ┣id_rsa
    ┗id_rsa.pub
```

上記リンクの補足として、ssh鍵をコピーするときは`=mail@hoge.com`のイコールマークまでコピーしましょう。

## sshキー情報を.ssh/configに設定する
次のステップは、以下の記事が秀逸です。
- [一つのPC上で複数のgitアカウントをうまいこと使い分ける | 前菜の備忘録](https://t-salad.com/multiple-git-account/)

configファイルの変更は、私の場合ターミナルでvimコマンドで編集しました。
vimにまだ慣れていない方は、ググってみてください。とりあえずiとwq使えばなんとかなります。

```
% vim ~/.ssh/config
```

以下のように設定しました。

```
Host github github.com
  HostName github.com
  User git
  Port  22
  IdentityFile ~/.ssh/git_job/id_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes

Host github-sub github-sub.com
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/git_private/id_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
```

私の場合は「IdentityFile」のスペルが違ってずっと接続できませんでした…

## 接続の確認

以下のsshコマンドで、正しくGitHubと両アカウントが接続できるか確認できます。

```
# メイン
$ ssh -T git@github.com
# サブ
$ ssh -T git@github-sub.com
```

以下のように表示されれば、一見ダメなように見えますが大丈夫です。

```
Hi (User ID)! You've successfully authenticated, but GitHub does not provide shell access.
```

## GitHubで操作！

以上で複数アカウントを使い分けることができますが、以下のように操作時のコマンドを変えないといけません。
以下のように、サブアカウント（プライベート用アカウント）を利用する場合はgit@以下をgithub-subとする必要があります。

```
# メイン
$ git remote add origin git@github:<ACCOUNT_NAME>/<YOUR_REPSITORY>.git
# サブ
$ git remote add origin git@github-sub:<ACCOUNT_NAME>/<YOUR_REPSITORY>.git
```

後は以下の記事の要領で、git configを変更しておけばOKです。

- [複数のgitアカウントを使い分ける - Qiita](https://qiita.com/yamataku29/items/4744c9c70ad793c83b82)


## それでもエラーが出る場合
上記手順で上手くいかなかった場合、以下の記事が参考になるかもしれません。

- [gitでssh接続する際にBad configuration option: usekeychainやterminating, 1 bad configuration optionsとエラーが出たときの解決方法 - Qiita](https://qiita.com/kaino5454/items/98dcf3a996f2074e0074)
- [GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~ - Qiita](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)
Windows10でWSL2を使う

# インストール

## 条件

windows10 バージョン 1903 以降、 ビルド 18362 以上。

## WSLの有効化
管理者でPowerShellを開き、以下を実行する

```powershell
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
```

## "Virtual Machine Platform"の有効化

```powershell
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all
```

## カーネルバージョンアップ

[こちら](https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel)からインストーラーをダウンロードして、Linuxカーネルのバージョンアップをしてください。

## デフォルトをWSL2に設定

```powershell
wsl --set-default-version 2
```

## Linuxをインストール
Microsoft Storeから、好きなLinuxディストリビューションを選択。とりあえず今回は「Ubuntu 20.04 LTS」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/e2a39228-1534-d9b5-7f76-82861e7bd70c.png)

入手を選択すると、以下の通りインストールが始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/c468adc9-ce1a-bbfe-68dc-374c3fb71515.png)

インストールが終わったら、起動を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/b071ef65-8194-d8c2-9249-52bc15231f18.png)

起動する際に、ユーザIDとパスワードを設定して、完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/872c0fd7-b217-7830-bd16-359752da405e.png)


# WidnowsとLinux間でファイル共有

## WindowsからLinuxへアクセスする場合

```
\\wsl$\Ubuntu-20.04
```

で/直下にアクセスできます。

## LinuxからWindowsへのアクセスする場合

```
/mnt/c
```
これでCドライブ直下にアクセスできます。


# リンク

WSL2をインストールする際以下のサイト　
参考しました。

[Windows Subsystem for Linux に関するドキュメント](https://docs.microsoft.com/ja-jp/windows/wsl/)
はじめてのPython3 ~はじめての変数、関数、引数、返り（戻り）値編~

# はじめに
注意点などは[前回](https://qiita.com/kashun0410/items/4113051964d5a1cd0bb5)を参照してください。

## 変数に文字列を入れる
文字はダブルクォーテーションで囲む。

```
# 3つの例文

print(“勇者は、荒野を歩いていた")
print(“勇者は、モンスターと戦った")
print(“勇者は、モンスターをたおした")

```
↓実行結果
—--
勇者は、荒野を歩いていた
勇者は、モンスターと戦った
勇者は、モンスターをたおした
—--

もし、「勇者」を「賢者」に修正する時にprint内の「勇者」を1つ1つ変えるのは手間がかかることがある。<br>そこで使うのが<b>変数</b>。<br>変数を使うと変更する箇所が1つに纏められるといったメリットがある。

※変数にデータを入れることを代入という。

```
player = “賢者” # 文字データを登録する場合はダブルクォーテーションで囲む

# 文字データが入った変数を表示、連結させるには以下のように記述する

print(player + "は、荒野を歩いていた")
print(player + "は、モンスターと戦った")
print(player + "は、モンスターをたおした")

```

↓実行結果
——
賢者は、荒野を歩いていた
賢者は、モンスターと戦った
賢者は、モンスターをたおした
——

## 変数に数値を入れる
#### 数値はダブルクォーテーションで囲まない。
そのまま数字を入れるだけでOK

```
number = 10
print(number + number)
print(number * number)
```
↓実行結果
——---
20
100
——---

## 文字列と連結、数列と計算
##### 文字列 + 文字列
文字列と文字列を + でつなぐと、連結する。

```
strings = "宇宙の" + "法則が" + "乱れる" + "！"
print(strings)
```
↓実行結果
——---
宇宙の法則が乱れる!
——---

##### 数列 + 数列
数列と数列を + でつなぐと、計算される。

```
number = 20 + 900
print(number)
```
↓実行結果
——---
920
——---

##### 数値？
数字をダブルクォーテーションで囲むと、文字列として処理される。

```
number = "20" + "900"
print(number)
```
↓実行結果
——---
20900
——---

#### 数値が入った変数を文字列と組み合わせる際の注意点

```
player = "勇者"
number = 1000

print(player + "は" + number + "の経験値を得た。")
```
↓
——
Traceback (most recent call last):
  File "Main.py", line 4, in <module>
    print(player + "は" + number + "の経験値を得た。")
TypeError: must be str, not int

(Exit status: 1)
——

文字列と数列を混ぜて連結するとエラーが起こる。
数値と文字列とでは厳密に区別されているため。
<br>このような文字列と数列の種類を<b>データ型</b>という。

##### 組み合わせる（連結する）には…
数列の部分を文字列に変換する。

- str()関数 … 数値を文字列として変換する関数。引数内の数値を文字列に変換する。

```
player = "勇者"
number = 1000

print(player + "は" + str(number) + "の経験値を得た。")
```
↓
——
勇者は1000の経験値を得た。
——

## ランダムモジュールを使う。

#### random関数
→ 0から1の間で、ランダムな数値を返す。

```
import random
number = random.random()

print("勇者は" + str(number) + "のダメージを受けた。")
```
↓実行結果(例)
—---
勇者は0.905685852637863のダメージを受けた。
—---

#### randint関数
→ 指定した引数のはにで、ランダムの整数の値を返す。

```
import random
number = random.randint(10,30)

print("勇者は" + str(number) + "のダメージを受けた。")
```

↓実行結果(例)
—---
勇者は17のダメージを受けた。
—---

- 数値であるため、それを使って計算することも可能。<br>ダメージの触れ幅が大きくなる。

```
import random
number = random.randint(1,5) * random.randint(100,500)

print("勇者は" + str(number) + "のダメージを受けた。")
```

↓実行結果(例)
—---
勇者は2030のダメージを受けた。 # 100 から 2500のランダムダメージ
—---

#### 補足

Pythonで変数(ローカル変数)の名前は、次のルールに従う。

・最初の1文字目：英文字または、「_」(アンダーバー)
・2文字目以降　：英文字・数字「_」(アンダーバー)

変数名の例：
○ player　 　：1文字目が、英小文字
○ _weapon　  ：1文字目が、「_」(アンダーバー)
○ player01 　：2文字目以降に数字
○ redDragon  ：2文字目以降に英大文字

× 1player ：1文字目に数字は使えない
× class 　：重複

なお、「print」のように、Pythonで使われる関数名などは、
あらかじめ予約されている言葉なので変数名には利用できない。

・引数 … 関数に与えるデータ。
　　　　print(data)のdata
　　　　str(number)のnumber
・戻り値(返り値)…関数の処理結果のデータ
　　　　random.randint(1,200) → 1から200までのランダムな数が戻り値

# 参考
[Paizaラーニング](https://paiza.jp/works/mypage)
UnityのuGUIで8ドットフォントを書く

Unityで2Dの低解像度のドットがくっきり見えるようなゲームを作りたいと思いました。
そこでまず文字を書こうと思い、8x8ドットのフォントを描きましたがこれをuGUIで表示する方法がわからない。
ググるとShoeBoxを使ったビットマップフォントの使い方など出てきたのですが、どうにもカーニングしてしまって等幅で書いてくれない…
探していたらこのような [サイト](https://tyfkda.github.io/blog/2015/06/14/fixed-font.html) があったので参考にさせていただきまして、自分の覚書としてまとめたものです。

まず作ったフォントはこれです。
![8x8font.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325042/a35f86f0-c13a-4a8e-c8ba-c994d6926b16.png)

128x48で数字とアルファベット少しの記号がアスキーコードに従って入っています。
縦64ドットになっているのはキリを良くするためです。

それでこれをCustomFontとして登録したいわけですけど、パラメータを手作業で入れるのは無理なので.fontsettingsファイルを吐き出すことにしました。

```python:fontsetting.py
# fontsetting を作ろう
fileName = "8x8font01.fontsettings"
imageWidth = 128
imageHeight = 64
fontWidth = 8
fontHeight = 8
charid = 0x20

header = ('%YAML 1.1 \n'
'%TAG !u! tag:unity3d.com,2011:\n'
'--- !u!128 &12800000\n'
'Font:\n'
'  m_ObjectHideFlags: 0\n'
'  m_CorrespondingSourceObject: {{fileID: 0}}\n'
'  m_PrefabInstance: {{fileID: 0}}\n'
'  m_PrefabAsset: {{fileID: 0}}\n'
'  m_Name: CustomFont01\n'
'  serializedVersion: 5\n'
'  m_LineSpacing: {}\n'
'  m_DefaultMaterial: {{fileID: 0}}\n'
'  m_FontSize: 0\n'
'  m_Texture: {{fileID: 0}}\n'
'  m_AsciiStartOffset: 0\n'
'  m_Tracking: 1\n'
'  m_CharacterSpacing: 0\n'
'  m_CharacterPadding: 1\n'
'  m_ConvertCase: 0\n'
'  m_CharacterRects:\n')

part = ('  - serializedVersion: 2\n'
'    index: {}\n'
'    uv:\n'
'      serializedVersion: 2\n'
'      x: {:.5f}\n'
'      y: {:.5f}\n'
'      width: {:.5f}\n'
'      height: {:.5f}\n'
'    vert:\n'
'      serializedVersion: 2\n'
'      x: {}\n'
'      y: {}\n'
'      width: {}\n'
'      height: {}\n'
'    advance: {}\n'
'    flipped: 0\n')
footer = ('  m_KerningValues: []\n'
'  m_PixelScale: 0.1\n'
'  m_FontData: \n'
'  m_Ascent: 0\n'
'  m_Descent: 0\n'
'  m_DefaultStyle: 0\n'
'  m_FontNames: []\n'
'  m_FallbackFonts: []\n'
'  m_FontRenderingMode: 0\n'
'  m_UseLegacyBoundsCalculation: 0\n'
'  m_ShouldRoundAdvanceValue: 1\n')

f = open(fileName,"w")

f.write(header.format(fontHeight))

height = fontHeight/imageHeight
for i in range(int(imageHeight/fontHeight)):
    y = 1.0 - (i+1)*fontHeight/imageHeight
    width = fontWidth/imageWidth
    for j in range(int(imageWidth/fontWidth)):
        x = j*fontWidth/imageWidth
        f.write(part.format(charid,x,y,width,height,0,0,fontWidth,-fontHeight,fontWidth))
        charid += 1

f.write(footer)
f.close()

```

これで出来た.fontsettingsファイルとフォントのPNGをUnityに渡します。
テクスチャはFilterModeをPointにします。
![texture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325042/bf16b48d-b65a-a98e-6260-2afab1106f6c.png)

フォント設定はこんな感じになります。
Line Spacingを縦サイズにしておかないと改行しても重なってしまいます。
![fontsettings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325042/12adc00d-d615-7036-e809-2b8ca137feba.png)

あとはマテリアルを作ります。
ShaderをUnlit/TransparentにテクスチャにフォントのPNGを指定します。
![material.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325042/d56a3b27-87e7-d1f9-47bf-89204eccde3f.png)

それらをTextに設定すると等幅で8x8のフォントが書けます。
![text.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325042/52b8f752-c3df-1b90-7631-23fa1c6660ac.png)
Vue.js×firebaseでアプリを作ってるときにfirebaseを入れたらエラーが起きた

こんにちは、[Yui](https://twitter.com/yui_active)です。

今回、Vue.js×firebaseで簡単なアプリを作ろうと思ってfirebaseとつなげた際に下記のエラーが起きたので、その解決策を書きます。

出たエラー

```コンソール
./node_modules/vuetify/lib/components/VCalendar/VCalendarDaily.js Module not found: Error: Can't resolve 'core-js/modules/es.array.concat' in '/Users/hoge/Desktop/Develop/dame.com/node_modules/vuetify/lib/components/VCalendar'
```

# 環境

```コンソール
$ node -v
v12.18.2

$ npm -v
6.14.5

$ vue -V
@vue/cli 4.4.6
```

#エラーになるまでの手順
- Vuetifyを入れて、ある程度のレイアウトを整えて`npm run serve`→ここまでは大丈夫だった
- その後、DBとつなげようと思い、firebaseを開く
- `npm install firebase`した後、main.jsに以下貼り付け

```コンソール
  // Your web app's Firebase configuration
  var firebaseConfig = {
    apiKey: "apiKey",
    authDomain: "authDomain.firebaseapp.com",
    databaseURL: "https://databaseURL.firebaseio.com",
    projectId: "projectId",
    storageBucket: "storageBucket.appspot.com",
    messagingSenderId: "messagingSenderId",
    appId: "x:xxxxxxxxx:web:xxxxxxxxxxxxxxxxxxxx",
    measurementId: "measurementId"
  };
  // Initialize Firebase
  firebase.initializeApp(firebaseConfig);
  firebase.analytics();
```
- 再度`npm run serve`→ここでエラー

画面を見ると、

```
./node_modules/vuetify/lib/components/VCalendar/VCalendarDaily.js Module not found: Error: Can't resolve 'core-js/modules/es.array.concat' in '/Users/hoge/Desktop/Develop/dame.com/node_modules/vuetify/lib/components/VCalendar'
```

コンソールに吐き出されたエラーは下記

```
 ERROR  Failed to compile with 671 errors                               21:16:38

These dependencies were not found:

* core-js/modules/es.array.concat in ./node_modules/vuetify/lib/components/VCalendar/VCalendarDaily.js, ./node_modules/vuetify/lib/components/VCalendar/VCalendarWeekly.js and 44 others
* core-js/modules/es.array.every in ./node_modules/vuetify/lib/components/VColorPicker/util/index.js, ./node_modules/vuetify/lib/components/VDataIterator/VDataIterator.js and 3 others
* core-js/modules/es.array.fill in ./node_modules/vuetify/lib/components/VDatePicker/VDatePickerMonthTable.js, ./node_modules/vuetify/lib/components/VSparkline/VSparkline.js and 1 other
* core-js/modules/es.array.filter in ./node_modules/@babel/runtime/helpers/esm/objectSpread2.js, ./node_modules/vuetify/lib/components/VAutocomplete/VAutocomplete.js and 19 others
```
エラー文が長すぎるので、全部は書かない。

#解決法

どうやらcore-jsが原因かということで、

```
$ npm install --save core-js
```

これで無事エラー解消！
【JavaScript】event.preventDefault()が何をするのか

[JSPrimer](https://jsprimer.net/)の [Todoアイテムの追加を実装する
](https://jsprimer.net/use-case/todoapp/form-event/#form-event)より引用。

## 何をするのか？

> event.preventDefaultメソッドは、submitイベントの発生元であるフォームが持つデフォルトの動作をキャンセルするメソッドです。

`event` の `Default` の動作を `prevent` する（妨げる） なので読んだまま。

### フォームが持つデフォルトの動作とは？

> フォームが持つデフォルトの動作とは、フォームの内容を指定したURLへ送信するという動作です。 

form要素に送信先が指定されていない場合、現在のURLに対してフォームの内容を送信するらしい。

### event.preventDefaultを呼び出すとどうなるか？

> event.preventDefaultメソッドを呼び出すことで、このデフォルトの動作をキャンセルしています。

以下サンプルコード

```js
formElement.addEventListener("submit", (event) => {
    // submitイベントの本来の動作を止める
    event.preventDefault();
    console.log(`入力欄の値: ${inputElement.value}`);
});
```

> 現在のURLに対してフォームの送信が行われると、結果的にページがリロードされてしまいます。 そのため、event.preventDefault()を呼び出し、デフォルトの動作をキャンセルしていました。 event.preventDefault()をコメントアウトすると、ページがリロードされてしまうことが確認できます。
【VS Code】統合ターミナル上のPowerShellでの文字化けを解消する（文字コードをSJIS→UTF-8に設定する）

## はじめに

Windows環境のVS Code上で、統合ターミナルのPowerShellを使用してプログラムを実行したところ、プログラムから出力された日本語文字列が文字化けしてしまうというトラブルに遭遇しました。

これはPowerShellの文字コードが標準ではShift-JISであり、一方で出力された文字列の文字コードはUTF-8であったことが原因でした。

不便なのでVS Codeの設定でPowerShellの文字コードをUTF-8にすることで解消しました。その際の小ネタです。

なお、検証に使用したVS Codeのバージョンは`1.47.2`です。

## 解消法

`settings.json`に下記の設定を追加します。

```json
    "terminal.integrated.shellArgs.windows": [
        "-NoExit",
        "-Command",
        "chcp",
        "65001"
    ],
```

### 解説

- `"terminal.integrated.shellArgs.windows"`: Windows環境において統合ターミナル起動時の引数として下記のものを与える
- `"-NoExit"`: 下記のコマンドを実行後も終了しない
- `"-Command"`: 下記のコマンドを実行する
- `chcp`: 文字コードを設定する
- `65001`: 設定する文字コードはUTF-8である

## 参考にしたページ

- [PowerShell起動時、文字コードをUTF-8に変える方法](https://qiita.com/s4i/items/75c19c9feb10b54c1ce9)
- [Integrated Terminal in Visual Studio Code](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)
Pythonで書いたプログラムの実行ファイル化 pyinstaller 編（Windows, Anaconda）

Anaconda 上で開発した Python のプログラムを実行ファイル(.exe)にして配布するために
pyinstaller を使ったら、つまずいてしまったので、その時の解決手順をまとめました。

## 環境
・Windows 10
・Anaconda 1.9.12

## 手順
### Anaconda Prompt の起動と仮想環境のアクティブ化
まず、次のコマンドを入力して、すべての仮想環境の確認します。

```
conda info -e
```
「*」マークがついている環境が、現在アクティブになっていることが確認できます。
次のコマンド（「test」のところは、アクティブにしたい環境名に書き換え）を入力して、
目的の環境をアクティブにします。

```
activate test
```

### pyinstaller のインストール
```
conda install pyinstaller
```
ここで「pip」ではなく「conda」を使うことをおすすめします。

### 実行ファイル化
実行ファイル化したい pyファイルが保存されているディレクトリに移動したあと、
以下のコマンドを実行すると、exeファイルが出力されます。

```
pyinstaller test.py --onefile --noconsole
```

**オプションはそれぞれ次の意味があります**
--onefile：１つのexeファイルにまとめる
--noconsole：アプリを実行した際にコマンドプロンプトを起動しない

問題なく exeファイルが出力されたら、実行してみます。
・・・あれ？開かない？
そう、なぜか開くまでに１分ほど時間がかかります。
pyinstaller の仕様なのか、オプションを追記する必要があるのかは分かりません。
※ご存知の方いましたら、ぜひ教えてください

なお、exeファイルを実行したら、
**Failed to execute script pyi_rth_pkgres**（スクリプト pyi_rth_pkgres の実行に失敗しました）
と書かれたメッセージボックスが表示されて、実行できない場合があります。
私はこの問題でつまずきました。

##  原因
http://www.pyinstaller.org/ で配布されていたリソースが古かった

## 解決方法
### １．pip install pyinstaller でDLした Pyinstaller をアンインストール

```
conda uninstall pyinstaller
```

### ２．GitHub の開発リポジトリから Pyinstaller をインストール

```
conda install https://github.com/pyinstaller/pyinstaller/archive/develop.zip
```

### ３．compat.py を修正

ソース内の次の表記を、

```
out = out.decode(encoding)
```
次のように修正します。

```
out = out.decode(encoding, errors='ignore') 
```
この表記はソース内に**２箇所**あるので、その両方を修正します。


もしこの修正をせずに exe ファイル化をすると、

```
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 136: invalid start byte
```

という文字コードエラーが出てしまいます。

以上です。最後までお読みいただきありがとうございます。
この記事が、あなたのお役に立てたら嬉しいです。

## 謝辞
執筆にあたり、こちらを参考にさせていただきました。ありがとうございます。
・[Error running the exe file in Windows "Failed to execute script pyi_rth_pkgres" #2137](https://github.com/pyinstaller/pyinstaller/issues/2137)
・[【悲報】PyInstallerさん、300MBのexeファイルを吐き出すようになる](https://lets-hack.tech/programming/languages/python/pyinstaller-issue/)
JavaScript の Promise, await, async 時のエラー捕捉について

new Promise() を返す関数内でのエラーは onError では拾えない。

```js
window.addEventListener('error', (msg, file, no) => {
  alert(['onError', msg.message, file, no].join("\n--------\n"))
})

window.addEventListener('unhandledrejection', (evt) => {
  alert(['onUnhandledrejection', evt.reason.stack].join("\n--------\n"))
})

// onErrorでは拾えない。onUnhandledrejection では拾える。
new Promise((resolve,reject)=>{ throw new Error('xxx') })
```

エラーを捕捉するにはどうするか。

```js
function p1(){ return new Promise((resolve,reject)=>{
  throw new Error('xxx')
})}
//-----
;(async()=>{
  try{ p1() }catch(err){ alert(err) } // × awaitで無い場合は拾えない
  try{ await p1() }catch(err){ alert(err) } // ○ await なら拾える
  p1().catch((err)=>{ alert(err) }) // ○ .catch()でも拾える
  
  try{
    await p1().catch((err)=>{ alert(err) }) // ○ こっちだけで拾える
  }catch(err){
    alert(err)
  }
  
  try{
    await p1().catch((err)=>{ alert(err); throw err }) // ○ 拾える
  }catch(err){
    alert(err) // ○ throw してるのでこちらでも拾える
  }
})();
```

new Promise() を返す関数内のエラーは自分で捕捉するしかない。
親には伝播しない。

```js
function p2(){ return new Promise((resolve,reject)=>{
  p1()
})}
p2().catch((err)=>{ alert(err) }) // p1 のエラーは　p2 に伝わらないので捕捉できない
```

伝播させるには手動で上げるしかない。

```js
function p2(){ return new Promise((resolve,reject)=>{
  p1().catch(reject) // こちらで捕捉して上に上げる
})}
p2().catch((err)=>{ alert(err) }) // 捕捉できる
```

new Promise() では await(try ~ catch) と .catch() は直接の **自分自身** 内のエラーのみ反応する。

new Promise() 内で new Promise() を使用するとそれはもう別世界でエラーは自動では伝播しないので注意。
React + IndexedDBでCRUD作成、Form登録など  #React #React.js #node

# 概要
React ,node.js版で
IndexedDBのCRUD作成となります
dexieライブラリで、IndexedDB操作して。
ブラウザ内に保存する形で。使用を想定しています

# 環境

react
react-dom
react-router-dom
dexie

# 画面
・リスト

![ss-crud-0724a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159710/53360589-3607-8551-7261-52be69e2bd4a.png)

・編集
![ss-crud-edit-0724b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159710/a9252bda-fa0f-ea2d-bf35-c7eb0eff272d.png)

# 参考のコード

https://github.com/kuc-arc-f/react_cms1_1crud

***
### 実装など、React Component
・Create
https://github.com/kuc-arc-f/react_cms1_1crud/blob/master/src/component/Task/Create.js

・index
https://github.com/kuc-arc-f/react_cms1_1crud/blob/master/src/component/Task/Index.js

・edit/delete
https://github.com/kuc-arc-f/react_cms1_1crud/blob/master/src/component/Task/Edit.js


***
VCIの大きさがいきなり変わる-戻らない

#結論
バーチャルキャストの手による拡縮は制限範囲がある。
だから制限範囲内に収まる様にモデルを調整しよう。

#背景
VR配信・SNSサービスのバーチャルキャストでは、他のVRSNSに見られない仕組みとしてVCIというものがあります。VCIはバーチャル空間で取り扱えるアイテムであり、好きな場所で好きなタイミングで取り出すことができ、その挙動はスクリプトを用いて制御することでインタラクティブな効果を奏することができます。

#対象
主に初心者

#症状
- 出てきたものを拡大（縮小）しようとすると急に大きさが変わる
- （その上）拡大（縮小）で大きさが元に戻らない
- 出てきたものを拡大（縮小）しようとすると急に消える

など
#どういうことか
バーチャルキャストでは、アイテムを両手で掴んで広げたり縮めたりすることで、アイテムの大きさを変えることができる機能があります。しかし、際限なく大きさを変えられるのではなく、どうやら元のモデルの5-0.2倍までに制限されている様です（これは確かどこにも書かれてなかったはず）。

しかしながら、初期状態のscaleはいくらでも大きな（小さな）値をとることができるので、拡大縮小した瞬間その制限が課せられてしまい、倍率がジャンプしてしまうのです。

これは作ったモデルの大きさがいい加減な時に起きやすいです。例えば、テニスボールを作ろうとした時、厳密な大きさは良き知りませんが、だいたい直径５センチくらいに収めると思います。しかし、大きさに頓着せずに作ると、1mの大きさで出来上がってしまいます。これを、モデルのscaleで調整してしまうと、たとえばscale0.05とかになってしまいます。

そのままVCIとして出力し、このボールを手に持って大きさを変えようとすると、scaleは最初は0.05ですから、手での拡大縮小範囲の外にあるので、一番近い0.2までジャンプしてしまう、つまり急に直径が20センチメートルになってしまうのです。しかも元に戻せません。（一応スクリプトからいじれば戻せるけど、そういう問題ではないですよね？）

#解決策
解決策は２つあります。
一つめの方法は、愚直にモデルの大きさを治す方法です。特に説明することもありませんが、正直面倒臭いです。

そこで、微調整程度なら私はいつも次の様にします
２つめの方法は　VCI消失　その５　で紹介した、読み込みのセッティングを変える方法です。
下図の「asprin」を例にとって説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/4a2a5b0e-38f4-7853-10a4-2faa3996bbab.png)

3dモデルを選択すると、インスペクタにモデルの情報が表示されます。ここの"Convert Units"にチェックを外してあげてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/4428f870-8014-3c20-0a61-d3b6c6d235b2.png)
チェックを確認したら、
scaleの値を**出力した時scale1で所望の大きさになるように**適当に設定してください。わからなかったらapplyを押してトライアンドエラーした方が早いかもしれません。先のテニスボールの例だと、0.05にするといいでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/c85910c0-56ce-5d1e-b573-644c18f93709.png)
下の方にスクロールして"Apply"ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494837/2df92ea0-5494-5deb-bd4e-cd569130f3ad.png)
すると、エディター上では大きさがかわったように見えます。
で実際VCIとして出力すると、ちゃんと治っています。　

#ちなみに
私は最近になってもよくやりますが、幸いblenderに戻らずに直せるのでまだ甚大度は高くはないです。
一番面倒なのは原点の位置がおかしくなっていることでしょうか、、、これはunity上ではたしか調整できなかったはずですから、、、
Ship&CoのAPIを使って、ヤマト運輸の代引きとクール宅急便の送り状のPDFファイルを生成する

この記事では、[Ship&CoのAPI](https://developer.shipandco.com)を使って、ヤマト運輸のヤマト運輸の代引きとクール宅急便の送り状のPDFファイルを生成する方法を紹介します。

# 1. shipment APIを呼び出す準備をする

[こちらの記事](https://qiita.com/shipandco/items/ffba21c1d0682bde1dc9)、および、[こちらのPOSTMANコレクション](https://documenter.getpostman.com/view/3269571/SW14TvyF?version=latest#217fd42c-4088-43f2-a10b-2767a0595278)を参考にして、`https://app.shipandco.com/api/v1/shipments`に`POST`するリクエストJSONを作成します。

```
{
    "to_address": {
        "full_name": "TEST TARO",
        "company": "",
        "email": "",
        "phone": "11111111111",
        "country": "JP",
        "zip": "6048072",
        "province": "京都府",
        "city": "",
        "address1": "京都市中京区",
        "address2": "八百屋町117"
    },
   "from_address": {
        "full_name": "TEST",
        "company": "",
        "email": "",
        "phone": "11111111111",
        "country": "JP",
        "zip": "5670001",
        "province": "大阪府",
        "city": "",
        "address1": "茨木市安威",
        "address2": ""
    },
    "products": [
        {
          "name": "PRODUCT NAME",
          "price": 0,
          "quantity": 1
        }
    ],
    "setup": {
        "carrier": "yamato",
        "service": "yamato_regular",
        "ref_number": "SOME REF TO DISPLAY ON LABEL",
        "pack_amount": 1,
        "care": {
           "fragile": true,
           "side_up": true,
           "valuable_goods": true
        },
        "test": true
    }
}
```

# 2. 代引きの指定をする

[APIドキュメントの「出荷情報の作成」](https://developer.shipandco.com/#t-ship)からリンクされている[共通定義](https://developer.shipandco.com/#t-common_obj)の記述をもとに、`setup`の`service `を`yamato_collect`に変更し、`cash_on_delivery`の項目を追加します。

```
"setup": {
  ...
  "service": "yamato_collect",
  ...
  "cash_on_delivery": {
    "amount": 1100,
    "tax": 100
  },
  ...
}
```

# 3. クールオプションの指定をする

上記と同じドキュメントの記述をもとに、`setup`に`cool_options`を追加します。今回は、冷凍の`frozen`を指定します。

```
"setup": {
  ...
  "cool_options": "frozen",
  ...
}
```

# 4. 出荷日と配送日を指定をする
上記と同じドキュメントの記述をもとに、`setup`に`shipment_date`と`date`を追加すると、それぞれ出荷日（受付日）と配送日（お届け予定日）を指定できます。省略すると、出荷日はAPIを呼び出した日として処理され、配送日は空欄での反映 (＝原則、運送会社がお届けできる最短での取り扱い) となります。

```
"setup": {
  ...
  "shipment_date": "2020-07-27",        
  "date": "2020-07-29",    
  ...
}
```

# 5. APIを実行する

上記で作成したリクエストをもとに、APIを実行します。成功すると、下記のようなPDFがレスポンスにURLとして返されます。代引きと冷凍の記載がPDFにあることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653449/b3ac7d53-4550-42c1-eecd-923cfcfbe156.png)
【Laravel】シーディング

# 内容
シーディングについてメモしておきます。

# factoryファイルの作成

UserFactoryはデフォルトで作成されています。
ここではuser_idを外部キーにもつPostモデルのfactoryファイルを作成してみます。

```zsh
% php artisan make:factory PostFactory --model=Post
```

--modelオプションでモデルを指定しています。
ファイルの中身は、例えば以下のようにします。

```php:database/factories/PostFactory.php
use Illuminate\Support\Str;

$factory->define(Post::class, function (Faker $faker) {
    return [
        'title' => $faker->title(),
        'comment' => Str::random(10),
    ];
});
```

指定していないcreated_atやupdated_atなどは自動生成してくれるようです。
user_idは下の方で説明する書き方をすれば自動に値を入れてくれます。

# seederファイルの作成

```zsh
% php artisan make:seeder UserSeeder
```

```php:database/seeds/UserSeeder.php
    public function run()
    {
        for ($i = 0; $i < 50; $i++) {
            $user = factory(User::class)->create(['name' => 'user'.$i]);
            $posts = [];
            for($j = $i * 10; $j < $i * 10 + 10; $j++) {
                array_push($posts, factory(Post::class)->make([
                    'title' => 'title'.$j,
                    'comment' => 'comment'.$j,
                ])->toArray());
            }
            $user->posts()->createMany($posts);
        }
    }
```

見慣れない記述ですが、titleとcommentに連番をつけたかったので、上のような書き方をしました。

factory(User::class)->create();
で一つのデータが作成されます。create()の引数を指定することで、値をオーバーライドできます。
1対多のリレーションでは、createMany()を利用するといいでしょう。引数は配列にする必要があります。

# DatabaseSeeder.php

```php:database/seeds/DatabaseSeeder.php
    public function run()
    {
        $this->call([
            UserSeeder::class,
        ]);
    }
```

run()内のcallメソッドの引数に実行するSeederを指定します。

# オートローダ

Seederファイルを作成したら、以下のコマンドを実行して、オートローダを再生成しましょう。

```zsh
% composer dump-autoload
```

# シーディング

```zsh
% php artisan db:seed
```
【SAP WebIDE】Unexpected alert. (no-alert)の解決方法

SAP WebIDE(SAP Cloud Platformとの違いがよくわかっていません。)の使用中に遭遇した
`Unexpected alert. (no-alert) [ESLINT:(no-alert)]`
なるエラーの解決方法を以下記載します。

# 経緯

別記事、[【SAPUI5】MVCで作ってみよう](https://qiita.com/tami/items/2442c0641e74eb07bd6d) に沿ってSAPコーディングしていたら、こんなエラーが出ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/a1add869-1288-b94b-c0ac-c8e831e53303.png)


`ESLINT:(no-alert)`のリンクをクリックすると、下記のページに遷移しました。

https://eslint.org/docs/rules/no-alert

ESLintというのは、JavaScriptの静的検証ツールであるとの事ですね。

>JavaScriptのalert、confirm、promptは、UI要素として邪魔になると広く考えられており、より適切なカスタムUI実装に置き換える必要があります。 さらに、アラートはコードのデバッグ中によく使用されます。本番環境にデプロイする前に削除する必要があります。
>このルールは、削除する必要があるデバッグコードと、目立たないカスタムUIに置き換える必要があるポップアップUI要素をキャッチすることを目的としています。 そのため、シャドーイングされていないalert、confirm、promptの関数呼び出しに遭遇すると警告します。

Javascriptなら、普通に動確でalert命令を使うこともあるでしょうに、~~余計な事を、、~~

# 解決方法
プロジェクトのフォルダを右クリックし、Project>Project Settingsを押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/ee32befb-07be-9393-2ffb-95d6977d9baa.png)

Code Checking>JavaScript>Validatorで、Fiori Javascriptを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/4641ac7c-921f-d86a-df61-327774b5e7ad.png)

Rulesのno-alertについて、EnabledをOFFにしてSaveボタンを押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/64bd94ff-b3ac-eaff-9362-3540291aaffd.png)

# 結果

alert命令に警告が出なくなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/300d4306-d510-33f9-e35e-9b39250be361.png)


# 参考
https://qiita.com/mysticatea/items/f523dab04a25f617c87d

https://youtu.be/axMpU8wngQI

https://eslint.org/docs/rules/no-alert
オレトラストネットワークでちゃっちゃとファイル共有


家にファイルサーバーってあります？動かしたいけどねえ・・って事無いですか？？

 - **電気代とか置き場所**とかの理由で外付けUSB使ってる
 - SaaSのファイルサービスはどうしても**容量課金や通信パケ代**が気になる

本来、ファイルサーバーで最重要であるべきセキュリティ要件よりも、
もっと他の理由で使ってなかったりしませんか？
でも家庭ネットは信頼してますよね？だから、もっとこう、サクっと共有してえなあ。

# <!-- じゃファイル共有すりゃ良い？ -->

### そういう人向けにAirDopあるやん

はい。でもあれってベンダーロックされてる感がないすか？
対応してないマイコンだの機器があるとやっぱファイルサーバーあればなーって思う。
OSSが頑張って実装してる例もあるけど対応機器がどんどん増えてく気はしないし。

### 我々は殆どの機器がしゃべれるプロトコルを知ってるはず、そうHTTP！

有線、無線関係なく、IPがあれば準備OK。それがHTTPの破壊力のスゴさ。
HTTPベースで超簡単にファイル共有！
~~車輪の再発明感ありますが、~~**UXサイドに倒した実装**を念頭に作ってみました。

# /* ここにいるよ！ */

<a href="https://github.com/yasutakatou/doukie"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/yasutakatou/doukie.png" width="460px"></a>

このツールはこんな機能があります。

 - Windows、Linux、有線ディスクトップ、無線ノート、ラズパイなど他機種対応
 - Go言語なのでバイナリいっこ置けば準備OK
 - 二重同期しないようファイルのハッシュ値を参照して同じファイルは同期除外にします
 - **IPとか調べないでも同期してくれる自動同期モードを付けました**

![autosync.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/583b92f0-b89c-78a7-1492-6a1ec4825223.gif)

詳しくはリポジトリ見てくださいな。

# =begin こんな使い方もアリ！ =end

単純なHTTPのクラサバ構成なので柔軟性がとても高いです。こんな使い方もできるぞ。

## パーティ転送モード

メールとかSlackで
「会議の資料は以下です。各自入手してください。
　*\\fileserver\会議20200715\dookie.pptx*」

### あら、面倒！？

 - 会議始まったらツールを自動サーバモードで起動
 - 会議に来た人にトークンを教えて自動クライアントで起動
 - 多人数にどんどこ転送開始！

### よし、拡散！

![party.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/e8bb0773-b1b9-d3b1-fb6d-b8c35fad01db.gif)

## バケツリレー転送

A、B、Cサーバにhostsとか同じデータを配布したい。
でもA→B→Cでセグメントが違うのでrsyncとかで一発で配布できない。

### あら、面倒！？

 - C→B→Aの順にポート番号を変えてサーバモードとクライアントモードで２つ起動する。
 - Aにファイルを置くと順繰りでCまで転送されていきます。

### よし、多重！

![relay.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/c6a2c707-6eae-636f-f34a-c4650562e680.gif)

## VPN踏み台転送

SSHで入る踏み台とデータ同期しておきたい。でもWinSCPとかツールインストールするの情シスの許可要るよなー

### あら、面倒！？

 - 転送先でサーバモードで起動する。バイナリ一個置くだけ。
 - お手元の端末からSSHポートフォワードで転送先のサービスポートに接続
 - ~~バイナリ消して証拠隠滅~~

### よし、転送！

![ssh.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/abc2dec3-7ebc-acd8-fc8e-80f63e960a18.gif)

# =pod ということで =cut

HTTPつよいのは分かるけど、ファイアウォールが立ちはだかってるって？
大丈夫だよ、家庭内はなんだし、全開放しようぜ。ｗ
~~というか家族が同居している場合は家庭内ネットワークはゼロトラストネットワーク~~

## 次号、スマホ用クライアント開発編に続く！

# 追伸

「Syncthingって知ってる？参考になると思うから使ってみたらどうだい？」
というアドバイスを頂きましたので調査中・・・
プロダクトとして一㍉も敵わないが何か実装できるとこないかなーって思ってるところ。
エクスプロイトキットの説明、ファジング、MyJVN 

応用情報技術者令和元年秋期 午前問42

エクスプロイトキットの説明はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/570bdf8f-3128-88de-e23e-b9a75493868b.png)

**エクスプロイトキット**は、複数のエクスプロイトコードをまとめ、ソフトウェアやOSに内在する脆弱性を確認したり、攻撃者がその脆弱性を悪用したりするツール群です。エクスプロイト(exploit)には、悪用という意味があります。

**エクスプロイトコード**
ソフトウェアの脆弱性を悪用した不正な動作を再現するために作成されたスクリプトやプログラムの断片

**ファジング**とは、ソフトウェアの不具合（とくに脆弱性を意図することが多い）を発見するためのテスト手法の一つである。ファズ（英語: fuzz）（予測不可能な入力データ）を与えることで意図的に例外を発生させ、その例外の挙動を確認するという方法を用いる。ファズテストと呼ばれることもある。

**MyJVN**とは、IPA（独立行政法人情報処理推進機構）が提供している、コンピュータの脆弱性への対策情報を共有するためのフレームワークの名称である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/374a95e6-d6d2-2fea-3fae-bad106261c89.png)

補足：
ファジングに該当するものはどれか。
応用情報技術者令和元年秋期 午前問44

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/fc319d35-59e1-fc94-dcda-c7eebd60f2ae.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/d4d1504d-dc88-c1a5-c348-713766c22556.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/38a0108f-8d52-446c-3773-359529fe2fae.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/d80d53bb-58e8-fbe2-983f-25656e45971a.png)


From　https://www.ap-siken.com/kakomon/01_aki/q42.html
https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%B8%E3%83%B3%E3%82%B0
https://www.weblio.jp/content/MyJVN
https://www.ap-siken.com/kakomon/30_haru/q42.html
[Ruby]変数の中身を表示する

# 概要
Rubyのputsメソッドを使用したときに、用意した変数の中身を表示する方法を記します。

# 環境
Ruby 2.6.5

# 内容
変数の中身を表示する場合は以下のように記述します。

```
number = 10
puts number
puts "#{number}"
puts '#{number}'
````
実行結果

```
10
10
#{number}
```

｀※ポイントは、シングルクォーテーションで囲った場合はそのまま出力されてしまうところです。`
Node.js の beforeExit で非同期処理を書くと終わらなくなる

Node.js で終了時のクリーンアップ処理を書こうとすると、 `exit` イベントか `beforeExit` イベントの2択になる。 `exit` だと非同期処理が書けないので、事実上 `beforeExit` の1択…と思って使ってみたらちょっとだけハマったのでメモ。

```javascript 
process.on('beforeExit', (code) => {
  console.log('Delayed');
  setTimeout(() => {
    console.log('Process beforeExit event with code: ', code);
  }, 1000);
});

process.on('exit', (code) => {
  console.log('Process exit event with code: ', code);
});

console.log('This message is displayed first.');
```

こんな感じの検証コードを書いて実行したら、 `beforeExit` の部分がこんな感じで延々実行されて止まらなくなった。

```bash
This message is displayed first.
Delayed
(1秒ウェイト)
Process beforeExit event with code:  0
Delayed
(1秒ウェイト)
Process beforeExit event with code:  0
Delayed
(1秒ウェイト)
Process beforeExit event with code:  0
Delayed
(1秒ウェイト)
...
```

どうも `beforeExit` の中で非同期処理を書くと、そこで「イベントループが空ではなくなった」ということで `beforeExit` 発火前の状態に戻ってしまうらしい。ぐぬぬ。

仕方ないので、1回だけしか実行されないようにガードしてみた。

```javascript
let isBeforeExitAlreadyFired = false;

process.on('beforeExit', (code) => {
  // beforeExit を1回しか実行させないためのガード条件
  if (isBeforeExitAlreadyFired) {
    return;
  }
  isBeforeExitAlreadyFired = true;

  console.log('Delayed');
  setTimeout(() => {
    console.log('Process beforeExit event with code: ', code);
  }, 1000);
});

process.on('exit', (code) => {
  console.log('Process exit event with code: ', code);
});

console.log('This message is displayed first.');
```

```bash 
This message is displayed first.
Delayed
Process beforeExit event with code:  0
Process exit event with code:  0
```

めでたしめでたし。

参考

- [Node.js Documentation](https://nodejs.org/dist/latest-v12.x/docs/api/process.html#process_event_beforeexit)
- [Process on beforeExit doesn't work correctly?](https://github.com/nodejs/node-v0.x-archive/issues/8863#issuecomment-66796997)
  ここを見る限り、この `beforeExit` の振る舞いは v0.x の頃から変わっていないらしい。あまり使われていないのだろうか…。
IQ Bot：明細の不要な行を除外する／明細を条件抽出する

#帳票例：明細の不要な行を除外する／明細を条件抽出する

IQ Botで取得したテーブルから、以下のように不要な行を除外する方法を考えてみましょう。
![不要な行の削除.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/73fb3612-762f-dec4-5309-2c3fa7371b25.jpeg)

#実装例

上記の帳票から「伝票合計」の行を除外するカスタムロジックの実装例は、以下のとおりです。

```python:明細の不要な行を除外するための実装例
# 値を保存する変数: table_values
#表の操作をするときに必ず入れるコード（最初）
import pandas as pd
df = pd.DataFrame(table_values)

#############################################
# ↓↓↓ ここからが今回の処理 ↓↓↓ 
#############################################

#品名欄に「伝票合計」が含まれる行を除外する
df = df[~df['品名'].str.contains("伝票合計")]

#############################################
# ↑↑↑ ここまでが今回の処理 ↑↑↑
#############################################    

#表の操作をするときに必ず入れるコード（最後）
table_values = df.to_dict()
```

[おまじないコード](https://qiita.com/IQ_Bocchi/items/68d3260c8afed7d27902)以外の部分はたった１行、非常にシンプルですね。

#応用例

上記の例の `df = df[~df['品名'].str.contains("伝票合計")]` の部分を変えると、色々と応用が効きます。
例えば以下の要領です。

```python:明細の条件抽出：さまざまな応用例

#もとのコード：「品名」の列に「伝票合計」を含んで”いない”行だけを抽出（~が否定を表す）
df = df[~df['品名'].str.contains("伝票合計")]

#上記とは逆に、「品名」の列に「伝票合計」を含む行だけを抽出する場合（否定の~を削除）
df = df[df['品名'].str.contains("伝票合計")]

#「税区分」の列が「外税」の行だけを抽出
df = df[df['税区分'] == "外税"]

#「税率」の列が空欄 "ではない" 行だけを抽出
df = df[df['税率'] != ""]

```

上記の応用例や、pandasの解説記事（例えば[こんなの](https://note.nkmk.me/python-pandas-str-contains-match/)）を参考に、みなさんもぜひIQ Botを思い通りに使い倒してみてください！
Heroku デプロイ 手順

# 概要
Herokuでアプリケーションをデプロイするまでの手順をまとめました。

# 前提
Herokuの会員登録後からの手順となります。

# 手順
会員登録後、下記コマンドでHerokuにログイン

```
heroku login
```

Herokuに新しいアプリケーションを作成
※すでに使われているアプリ名は登録できません。

```
heroku create <アプリ名>
```

アプリケーションをHerokuへ追加します。Herokuへcommitをプッシュすることで、Herokuにアプリケーションの情報が追加できます。

```
git push heroku master
```

Heroku上でマイグレーションファイルを実行します。

```
heroku run rails db:migrate
```

githubにpushした後は、下記コマンドでherokuを最新の状態にする

```
heroku restart
```
LINEBOT(Java)開発初期断面のテンプレート

## はじめに
JavaでLINEBOTを作成するため、[JavaのLINEBOTの公式サンプル](https://github.com/line/line-bot-sdk-java)を参考にしました。

しかし、公式サンプルをそのまま流用するにはいくつか問題点があったので、それを解消するためにいろいろなことを行いました。

せっかくなので、今後別のLINEBOTを作るときにテンプレートとして流用できれば良いなと考え、テンプレートを作成してみました。

## やったこと

- 公式サンプルは、[サンプルアプリケーションのプロジェクト](https://github.com/line/line-bot-sdk-java/tree/master/sample-spring-boot-kitchensink)以外にも、ライブラリのプロジェクトがたくさん入っている。ライブラリそのものはbuild.gradleで読み込めばいいので、アプリケーションの中からは削除。
- 公式サンプルは、親プロジェクトの下に子プロジェクト（ライブラリ、サンプル）がある階層構造となっている。作りたいアプリケーション以外のプロジェクトは不要なので、階層構造ではなくなるようにプロジェクト構成を変更。
- 階層構造ではなくなったことによって、親プロジェクトと子プロジェクトそれぞれのbuild.gradleをマージ
- build.gradleのlombokバージョンでエラーが起きないよう修正（[参考](https://qiita.com/shima-218/items/375f199e3cb04d798626#問題２認識したプロジェクトにエラーが発生する)）
- build.gradleのcheckstyleとspotbugsの記載を削除（[参考１](https://qiita.com/shima-218/items/7e4df25e2c2b3a626509#４checkstyle-error)、[参考２](https://qiita.com/shima-218/items/7e4df25e2c2b3a626509#５spotbugs-rule-violations)）
- .gitignoreを修正（[参考](https://qiita.com/shima-218/items/7e4df25e2c2b3a626509#３error-failed-to-run-gradle)）
- その他不要なファイルを削除
- application.ymlの記載を、環境変数としてチャネルトークンとチャネルシークレットを外出しできる形に修正
- ローカルデバッグ用のapplication_local.ymlを追加

## 作成したテンプレート

- [linebot-template-rich](https://github.com/shima-218/linebot-template-rich)
sample-spring-boot-kitchensinkの機能を一通り残したテンプレート

- [linebot-template-simple](https://github.com/shima-218/linebot-template-simple)
シンプルなテキストメッセージ（オウム返し）の機能だけ残したテンプレート

## 以前の記事

[LINEBOTのJavaサンプルプログラム（line-bot-sdk-java）のデプロイにて発生したトラブル](https://qiita.com/shima-218/items/7e4df25e2c2b3a626509)
[LINEBOTのJavaサンプルプログラム（line-bot-sdk-java）をEclipseで編集する](https://qiita.com/shima-218/items/375f199e3cb04d798626)

初心者の私は、開発前の大前提のところでかなりつまづいてしまいました。
大前提のところは情報がなかなか見つけられず・・・
同じような方の参考になれば幸いです。
WindowsのPhpStormで矩形選択

検索してもあまり出てこなかったのでメモ。

PhpStormで矩形選択を行う手順は以下の2ステップ。

1. Ctrlを2度押し
2. そのままCtrlを離さずに矢印キー

PhpStorm 2018.3.6で確認しましたが、IntelliJ, PyCharm等ほかのJetBrains製品でも同じかもしれません。
Notepad++で良く忘れるからメモ

テキストのファイルを作ってると
タイムコードやらIDやらを付けるけど、
別の用途でタイムコードやIDが要らない場合の削除方法。

置換を使って置換文字列を空で置き換えるだけ

例えば

01,ダミーテキスト

的な感じで数百行のテキストがあって
先頭のID番号はいらない場合
置換の検索文字列に
(\d+,)
をいれれば良し。


ちなみにタイムコード場合は
00:00:00	テキスト

(\d\d+:+\d\d+:\d\d)で選択できる。


###空白行を削除したい時
検索文字列に^\s*で検索


#vrewでのタイムコード付き
vrewでタイムコード付きで出すとミリ秒は切り捨てられる。
マクロ組んでpremiereにコピペしたいから
ミリ秒をとりあえずつける場合

検索文字は
(.+)
置換で
\1:00
これで末尾に:00が追加される

例えばvrewでは
00:00:50	テキスト
00:00:51	ダミーテキスト

みないな感じで書き出される。
タイムコードとテキストの間にはTABが使われてる。

まずはテキストファイルはいらないのでタブから行末まで削除する

検索文字列は
\t.+
置換文字列は空白で
これですべて置換してタブからテキストを削除する
でその後にタイムコードのミリ秒を付ける
検索文字は
(.+)
置換で
\1:00

#空白を検索したい場合は

^\s*
【Unity】Water Ripple For Screenを使ってみた

#はじめに
WaterRippleForScreenはUnityで水の波紋を表現できるJose Hernandez氏作のアセットです。無料！！
リンクは[こちら](https://assetstore.unity.com/packages/vfx/shaders/fullscreen-camera-effects/water-ripple-for-screens-83430?locale=ja-JP)

ゲームを作成しているときに「水の波紋みたいなエフェクトできたらエモくね？」となったのですが、シェーダーの知識が全く無かったために自分で作成することができなかったのでアセットに頼ろうと調べていたときに見つけました。
このアセットに関して日本語で書かれた記事を発見できなかったので備忘録を兼ねてかいていきます。
#利用方法
##基本
アセットのインストール方法に関しては他の方がわかりやすく説明しているため、自分のプロジェクトにインポートできている前提で話をすすめます。
インポートすると、Assetsフォルダの中にWaterRippleForScreenというフォルダが作成されます。

まずは、WaterRippleForScreen/Scripts/に存在するRippleEffectsをエフェクトを適用したいCameraに貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518821/46ec34df-5310-78c3-e7cf-fa12c105ad85.png)

背景の画像を適当に入れて、DetectClickにチェックを入れて実行し、ゲーム画面をクリックしてみてください(下の画像は見やすいようにWaveScaleを30にしています。) 
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518821/dffacb03-afc2-cab8-b7a0-d51404b1b01b.gif)

このように水の波紋のような効果をかけられるのがこのアセットの効果です。

スクリプトから呼び出す場合は以下のようにします。
まず、忘れては行けないのが

```csharp
using WaterRippleForScreens;
```

今回はスペースキーの入力があったら波紋を呼び出すようにしていきます。
以下のスクリプトを適当なゲームオブジェクトにアタッチしてください。

```cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using WaterRippleForScreens;

public class hogehoge : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Camera cam = Camera.main;
            Vector2 target = new Vector2(0, 0);//Unity上の座標
            target = cam.WorldToScreenPoint(target);//カメラ座標に変換
            target.y = Screen.height - target.y;//WRFS用に座標を変換
            cam.GetComponent<RippleEffect>().SetNewRipplePosition(target); //新しい波紋を生成
       }
    }
}
```

RippleEffectのSetNewRipplePositionに__画面座標を上下反転させたもの__を渡すことで波紋を生み出せます。
(DetectClickモードでもクリックした箇所の上下反転に波紋が生み出されるので多分上下反転はバグだと思われます。)

##エフェクトの調整
以下の変数はすべての波に対して適応されますのでご注意ください。波ごとに個別の設定を行うことはできませんでした。
もしかするとCameraに波の生成ごとにスクリプトからコンポーネントを追加して設定すればうまくいくかもしれません。(未検証)
###DitectClick
はじめにも利用したクリックした座標(を上下反転させた座標)に波紋を生み出します。クリックを利用するプロジェクトではどこでも生み出されてしまうため、falseにしておくことをおすすめします。
###WaveCount
画面に表示させる波の最大数
###TimeInfinity
trueにすると画面にずっと波が表示され続けます。
###WaveTime
そろぞれの波の時間が秒単位で設定できます。
###WaveAnimCurve
時間経過に伴う波の挙動を決定します。0~1に収まるようにしないとおかしなことになります。
###WaveScale
波の強度。ここが大きいと画面が大きく歪むようになります。
###WaveScale
波の速度。
###WaveFrequency
波の周波数。値が大きいほど波と波の感覚が狭まります。
###CiecleXYScale
異なる値を設定することで波を楕円形にできます。
###InternalRadio & ExternalRadio
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518821/01edb139-6b03-201c-549b-6661e2f04abf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518821/9ec68c83-7393-7539-1666-62e437fd3176.png)
画像はWaterRippleForScreenフォルダ内部に生成されるpdfよりお借りしております。
Internalの内部には波が生まれず、Internal以上Internal+External未満に波が表示され、それ以上には波が生まれません。
#その他
RippleGeneratorというスクリプトも同梱されており、こちらでは自動で波を発生させられるらしい。
このエフェクトは画面に映るもの全てを歪ませてしまうため、少々使い勝手が悪そうなので今回はパスします。
#参考
[Asset Storeのダウンロードページ](https://assetstore.unity.com/packages/vfx/shaders/fullscreen-camera-effects/water-ripple-for-screens-83430?locale=ja-JP)
VDI(Virtual Desktop Infrastructure)サーバ動作の特徴

応用情報技術者令和元年秋期 午前問41

内部ネットワークのPCからインターネット上のWebサイトを参照するときにDMZ上に用意したVDI(Virtual Desktop Infrastructure)サーバ上のWebブラウザを利用すると，未知のマルウェアがPCにダウンロードされて，PCが感染することを防ぐというセキュリティ上の効果が期待できる。この効果を生み出すVDIサーバの動作の特徴はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/42b09d10-f895-99c4-1bea-bc38a1897c99.png)

流れは下記です：
作業PC　→　VDIサーバー（＝VM）→　Webブラウザへアクセス　→　VDIサーバーにダウンロードして表示される　→　作業PCでVDIの画像を閲覧

つまり、データは全く作業PCにダウンロード**しない**という特徴ですね。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/fe882b79-34bf-7952-9856-c7064546147f.png)


From　https://www.sc-siken.com/kakomon/30_haru/am1_13.html
＜スプレ＞コードを書かずに、関数でスクレイピングする(GAS)


普段スクレイピングをするときはpythonを使うのですが、
簡易的にspreadsheetだけでスクレイピングしたいなときに使う技をご紹介します。


結論
---------
この関数をセルの中に打ち込めば終了です。
=IMPORTXML(URL, Xpath)

URLには、どんなURLでも入れることができます。

具体例
---------
例えばgoogleでの検索結果をスクレイピングしたいときには
urlの部分にこのようなアドレスを入れることができます。

"https://www.google.com/complete/search?hl=en&output=toolbar&q=[キーワード]",

このように、キーワードの部分に検索したいワードを入れることで、ブラウザを開かずに検索結果を入れることもできます。

他にも、原理的にはTwitterのようなブラウザ版があるSNSもスクレイピングすることができます。
（実際に行っても法的に大丈夫かどうかは各々でご確認の上お使いください）

"https://twitter.com/[アカウントID]",


次に、Xpathについての説明です。
こちらは簡単で、F12で取得したい部分のXpathを参照することができます。

Xpathの参照の仕方はこちらをご覧ください。
https://monoblog.biz/archives/4088
初心者によるプログラミング学習ログ 380日目

#100日チャレンジの380日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
380日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>昨日の作業・やったこと⇩<br><br>●就寝前筋トレ5分、キンドル読書 10分<br>●ブログ1記事作成<br>●プログラミング学習380日目 2h<br>・架空LP(<a href="https://twitter.com/ririru_123?ref_src=twsrc%5Etfw">@ririru_123</a> )作成<br>・ボタンアニメーション実装<br>・メンターの課題<a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアとつながりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a><a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a></p>&mdash; ぱぺまぺ@社畜✕投資✕ブロガー (@ppmp65) <a href="https://twitter.com/ppmp65/status/1286393101150375936?ref_src=twsrc%5Etfw">July 23, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
IQ Bot：テーブルの列を自由に分割する

#帳票例：テーブルの列を自由に分割する

![金額、税区分、税率を分割.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/f6f7052e-c04d-87fd-5666-79e611a3e159.jpeg)

[こちらの記事](https://qiita.com/IQ_Bocchi/items/2215c907d7fcf7cc7382)では上記と同じテーブルから金額部分だけを取り出すやりかたを紹介しましたが、今回はそのさらに応用編です。

金額部分だけではなく、税区分、税率も、それぞれ必要で、しかも別の列に入れたい！　という場合を考えます。

#考え方

この場合は、以下のように考えます。

① IQ Botには、ほしい項目のフィールドをそれぞれ定義しておく（Step１：項目設設定）
② 代表して１フィールドに、ほしい項目全体をマッピングしておく（Step２：マッピング設定）
③ カスタムロジックを使って、しかるべき部分をしかるべき列に移動させる（Step３：カスタムロジック）

以下、それぞれのステップを詳述します。

#Step１：項目設定

この場合、テーブルフィールドの定義項目として「金額」の他に「税区分」「税率」が必要になります。
もし「金額」しか作っていない場合は、「税区分」「税率」を追加します。

項目追加のやりかたは[こちら](https://qiita.com/IQ_Bocchi/items/7baa94dadd174c78ac62)を参照してください。

#Step２：マッピング設定

マッピングの設定は[こちら](https://qiita.com/IQ_Bocchi/items/2215c907d7fcf7cc7382#%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%A8%E3%82%8A%E3%81%8B%E3%81%9F)と同様、**取得したい値がある全範囲をまとめてひとつの項目として学習**させます。

今回は「金額」欄に、一時的に以下のような形で金額・税区分・税率をまとめて入れておきます。
![Hardモードマッピング.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/df551c93-579a-564c-fcb8-0cdab0651814.jpeg)

#Step３：カスタムロジック

上記のマッピング設定が完了したら、次はカスタムロジックでそれぞれの欄に値を取り出していきます。
![分割イメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/a3d04e08-7b84-6c70-1047-0697d2e756f6.jpeg)

カスタムロジックの組み方は、帳票の内容によって千差万別なので一般化は本当に難しいですが、上記の帳票を処理する場合の実装例は以下のとおりです。

##カスタムロジック実装例

```python:列を分割するためのカスタムロジック
# 値を保存する変数: table_values
#表の操作をするときに必ず入れるコード（最初）
import pandas as pd
df = pd.DataFrame(table_values)

#############################################
# ↓↓↓ ここからが今回の処理 ↓↓↓ 
#############################################

#税区分を抽出する関数
def zeikubun(x):
  result = ""
  cnt = 0
  kubun = ("外税","内税")      
  for i in kubun:
    if i in x:
      result = i
      cnt = cnt + 1
  if cnt > 1:
    result = "エラー"
  return result

#税区分を抽出する関数の適用
df['税区分'] = df['金額'].apply(zeikubun)

#税率を抽出する処理
def zeiritsu(x):
  result = ""
  splitter = ("外税","内税")       #Point１：分割の根拠となる文字列
  for i in splitter:
    if i in x:
      result = x.split(i)[1]      #Point２：↑を根拠に分割した上で、分割したどの部分を取り出すかの指定
  return result

#金額欄に定義した関数を適用する
df['税率'] = df['金額'].apply(zeiritsu)


#金額を抽出する処理
def kingaku(x):
  result = ""
  splitter = ("外税","内税")       #Point１：分割の根拠となる文字列
  for i in splitter:
    if i in x:
      result = x.split(i)[0]      #Point２：↑を根拠に分割した上で、分割したどの部分を取り出すかの指定
  if result == "":
    result = x
  return result

#金額欄に定義した関数を適用する
df['金額'] = df['金額'].apply(kingaku)

#############################################
# ↑↑↑ ここまでが今回の処理 ↑↑↑
#############################################    

#表の操作をするときに必ず入れるコード（最後）
table_values = df.to_dict()

```
#最後に

さすがにこの処理をpythonやプログラミング言語の素養が全然ない人が実務で実装することは考えにくいので、カスタムロジックの初心者向けの説明は省略します。

pythonなり、他の言語をやったことあれば、上記の処理で何をやっているかはだいたい想像がつくかなと思います。

が、もし何かわからなくて困ったことがあれば、この記事にコメントを投稿していただくか、twitterで @IQ_Bocchi までご連絡いただければ、可能な限りお答えします。