OmniAICreator/Qiita-1.07M huggingface dataset:
【入門】Dockerfileを記述するときの最低限知識

## はじめに
Docker は Dockerfile というテキストファイルから命令を読み込んで、自動的にイメージをビルドしますね`docker build`を実行すると、順次コマンドライン命令を自動化した処理が行われて、ビルド結果となるイメージが得られます。
初心者がまず、dockerfileを記述するときのコマンドをまとめました。
### FROM
ベースとなるDockerのimageを設定します。
`FROM <image名>[:<tag>] `
ubuntuベースの場合はこちら。：の後にtagを指定することもできます。
デフォルトは`latest`

```
FROM ubuntu:latest
```

### RUN
ビルド後にコンテナに対してLinaxのコマンドを実行する。

```
FROM ubuntu
RUN mkdir hoge_dir
RUN echo 'hogehoge' > hoge.txt
```
このように書くことで、できたコンテナ内にhoge_dirディレクトリを作り、hogeテキストファイルを作成し、hogehogeと書き込んでくれます。

ただ、注意しなければならないのは、RUNごとにlayerができてしまう点。一つのコマンドごとにRUNを指定しているとlayerが積み重なってdocker imageが重くなってしまうので

```
FROM ubuntu
RUN mkdir hoge_dir && echo 'hogehoge' > hoge.txt
```
`&&`でつなぎましょう。

### CMD
大抵はDockerfileの最後に記述してあり、こちらもデフォルトのLinaxコマンドを設定するという意味では、`RUN`と似たようなものです。

ただ、`CMD`はlayerを作らないという違いがあります。
どうやって使い分ければ良いのかと言えば、自分はざっくりと`RUN`は残しておきたいもので`CMD`はそうじゃないものに使うという認識でいいのかなと思ってます。

```
RUN apt-get update
CMD ["/bin/bash"]
```
上の場合は一度ビルドしてupdateしたら、二度同じことすると時間がかかるので、layerに残して置きたいですよね。
逆に下の場合はbash使うよという指示だけなんで、layerに残す必要はないです。

また、似たものでENTRYPOINTというものもあります。
CMDは設定したコマンドをrunの時に上書きできてしまいますので、そういった場合はENTRYPOINTで設定しましょう。

### COPYとADD
どちらもローカルからコンテナにファイルをコピーできるものです。
`ADD`の方ができることが多いです。

```
COPY <src> <dist>
ADD  <src> <dist>
```
公式でも基本はCOPYを使うことを推奨しています。
コピー元がファイルでtar形式なんかだとADDが勝手に展開してくれます。
自分はADDは大きなファイルを圧縮してコンテナに持っていきたい時に使っています。


### WORKDIR

コンテナ内での実行ディレクトリを変更してくれるものです。例えばdockerfileに

```
RUN mkdir test && cd test
RUN touch hoge.txt  
```

としてもhoge.txtはroot直下に作られてしまいます。まあ `&&`で繋げればいい話なんですけど、それじゃdockerfileに書き足していくときに毎回移動しないといけないんでWORKDIRを使うみたいです。

```
WORKDIR <絶対パス>
```
絶対パスにしてくださいね。


### ENV

ENVは環境変数の設定をしてくれます。

```
ENV <key> <value>
```

例えば自分は`ENV PATH /anaconda3/bin:$PATH
` のようにPythonのPATHを通すときに使いました。

## 最後に
自分がとりあえず必要になって触れたコマンドをまとめてみました。
ENTRYPOINTとかLABELとかは必要になってからでいいかなあ。
Siriみたいな会話相手作ってみた

## 作成動機

私はstay home期間にほとんど人と喋っていないので悲しくなり誰かと話したい、とSiriみたいな会話相手をpythonで作ってみました。

____
# コード
```python
import tkinter as tk
import tkinter.messagebox as tmsg
import time

while True :
    s= input("")
    初="初めまして"
    へ="Hey oh"
    お="おはよう"
    こ="こんにちは"
    ば="こんばんは"
    男="あなたは男性ですか？"
    か="男性かな"
    な="女性かな"
    漫画="漫画は好きですか？"
    悩み="悩みはありますか？"
    自己="自己紹介して"
    悩="悩みがあります"
    家="コロナウイルスの影響で家から出れないのがしんどくなってきた"
    
    if s == 初:
        tmsg.showinfo("oh", "初めまして" + " これからよろしくお願いします")
    elif s == お:
        tmsg.showinfo("oh", "おはようございます" + "本日も良い１日になる事を願っています")
    elif s == こ:
        tmsg.showinfo("oh", "こんにちは")
    elif s == ば:
        tmsg.showinfo("oh", "こんばんは")
    elif s == へ:
        tmsg.showinfo("oh", "はい、お呼びでしょうか")
    elif s == 男:
        tmsg.showinfo("oh", "逆にどちらであって欲しいですか？")
    elif s == か:
        tmsg.showinfo("oh", "ではそういうことにしておきます")
    elif s == な:
        tmsg.showinfo("oh", "ではそういうことにしておきます")
    elif s == 漫画:
        tmsg.showinfo("oh", "私は人間の皆さんの書いたものは展開が読めてしまって面白くないので好きでありません")
    elif s == 悩み:
        tmsg.showinfo("oh", "私には悩みという概念が存在しません")
    elif s == 自己:
        tmsg.showinfo("oh", "私はoh" + "　　お友達になりましょう")
    elif s == 悩:
        tmsg.showinfo("oh", "どうされましたか？")
    elif s == 家:
        tmsg.showinfo("oh", "あなたのその頑張りのおかげで救われる命があります。" + "　　一緒に乗り越えましょう")
```
- input()の中で取得した値ををsという変数に格納
- これらをifやelifを用いて返答を表示する。

___
# 実行結果
ターミナルに打ち込むと・・・<img width="1440" alt="スクリーンショット 2020-07-09 20.59.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638193/40be8168-1ba2-9e7c-6f44-a1e69a7db321.png">

<img width="1440" alt="スクリーンショット 2020-07-09 21.25.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638193/919f5432-7c3e-c8e2-edea-58eb9fd8bb74.png">


このように返答してくれました！

___

###　感想

プログラミングが上手くいって返答してくれた時はすごく嬉しかった。ただ質問と返答を一人で作っているところを客観視してしまうと余計に悲しい気持ちになりました。

# 参考にしたwebページ及び文献
- [pythonでジョジョの名シーン再現してみた](http://kei-ta.hatenablog.com/entry/2018/02/06/211905)
- [pythonのinput関数でキーボードからの入力を取得](https://note.nkmk.me/python-input-usage/)
- [暇つぶしにも最適、「Siri」との会話を楽しもう](https://enjoy.sso.biglobe.ne.jp/archives/siri_talk/)
- いちばんやさしいpython入門教室　大澤文孝[著]
java.sql日時クラス↔Date And Time API系の変換

いつも忘れるので、ここでメモ

Java8 時間類
LocalDateTime→UinxTimestamp(ミリ秒)

```java
LocalDateTime yestoday = LocalDateTime.now().minusDays(1).withHour(0); // 分、秒、ミリ秒まで細かく設定。
long millis = ZonedDateTime.of(yestoday, ZoneId.systemDefault()).toInstant().toEpochMilli();
```

以下のこのページからパックリ：[https://javazuki.com/articles/sql-date-conver-to-datetime.html](https://javazuki.com/articles/sql-date-conver-to-datetime.html)
[[Java]Unixタイムスタンプと日時の変換 (ZonedDateTime, LocalDateTime)](https://tech.chakapoko.com/java/datetime/date-convert-epoch.html#unix-%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%97%E3%82%92%E6%97%A5%E6%99%82localdatetime-%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B)
Timesatmp→LocalDateTime

```java
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
LocalDateTime localDateTime = timestamp.toLocalDateTime();
```

LocalDateTime→Timesatmp

```java
LocalDateTime localDateTime = LocalDateTime.now();
Timestamp timestamp = Timestamp.valueOf(localDateTime);
```

java.sql.Date→LocalDate

```java
java.sql.Date javaSqlDate = new java.sql.Date(System.currentTimeMillis());
LocalDate localDate = javaSqlDate.toLocalDate();
```

LocalDate→java.sql.Date

```java
LocalDate localDate = LocalDate.now();
java.sql.Date javaSqlDate = java.sql.Date.valueOf(localDate);
```

java.sql.Time→LocalTime

```java
java.sql.Time javaSqlTime = new java.sql.Time(System.currentTimeMillis());
LocalTime localTime = javaSqlTime.toLocalTime();
```

LocalTime→java.sql.Time

```java
LocalTime localTime = LocalTime.now();
java.sql.Time javaSqlTime = java.sql.Time.valueOf(localTime);
```

LocalDateTime → java.util.Date

```java
ZoneId zone = ZoneId.systemDefault();
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zone);
Instant instant = zonedDateTime.toInstant();
return Date.from(instant);
```

java.util.Date → LocalDateTime

```java
Instant instant = date.toInstant();
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
```

参考になった記事
[https://qiita.com/riekure/items/d83d4ea5d8a19a267453](https://qiita.com/riekure/items/d83d4ea5d8a19a267453)

以上！
Sequel Aceを使ってみる

macOS 用の MySQL クライアントとして Sequel Pro がありますが、2016年4月3日に 1.1.2 がリリースされて以降開発が停滞していました。そしてついに [readme.md](https://github.com/sequelpro/sequelpro/blob/master/readme.md) に以下の文が掲載されました。

> This project is currently not maintained. There is a community-supported fork called Sequel-Ace available on the Mac AppStore, please check it out!

Sequel Pro としての開発は停止し、以後はコミュニティによる [Sequel Ace](https://github.com/Sequel-Ace/Sequel-Ace) に移るということです。

(2020/8/13追記)

readme.me への追記は除去されました。経緯は [#3705](https://github.com/sequelpro/sequelpro/issues/3705) にあります。私の英語力が無いため細かなニュアンスは拾いきれませんが、要約すると「fork するのは自由だが、Sequel Pro の開発を諦めたわけではない」というところでしょうか。Sequel Pro 開発チームの総意として Sequel Ace に移行したのかと思ったのですが、どうもそうではなさそうですね。

(2020/8/13追記終わり)

Sequel Ace は活発に開発が行われていて、現在は 2.1.1 がリリースされています。ということで、早速インストールして試してみました。

インストールは AppStore もしくは HomeBrew から行ます。簡単なので手順まではここでは説明しません。

起動した画面はこちらです。

![スクリーンショット 2020-07-09 21.12.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86075/c3c6d9da-3f43-343e-b60e-386b9eebcede.png)

参考までに、Sequel Pro 1.1.2 の画面はこちらです。フォークしてまだ日が浅いから当たり前ですが、非常に似ていますね。

![スクリーンショット 2020-07-09 21.12.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86075/f3fd6fd9-4f0a-d40e-06fd-7e3ca7888b65.png)

大きく違うのは、Sequel Ace ではメニューが全て英語になっている点です。Preferences に言語選択はありませんし、そもそも Sequel Pro でも言語設定できませんので OS の言語設定をみていたのだろうとは思うのですが。英語になってちょっととっつきにくくはありますが、Sequel Pro の日本語は微妙なところもありましたので（truncate -> 切り捨て、など）、個人的には英語になってむしろわかりやすくなりました。

データベース選択で嬉しいのは、sys データベースが他のシステムデータベースと同じ並びに収まるようになったことでしょうか。

![スクリーンショット 2020-07-09 19.58.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86075/9a3d1305-c5d5-a1aa-b786-a544a752bf81.png)

個人的にとても嬉しいのが、フィルター条件を複数設定できるようになったことです。複数条件で絞り込むために毎回クエリを手で書いていたのですが、その苦労から開放されます。

![スクリーンショット 2020-07-09 20.00.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86075/95179564-283e-99e6-ec95-f9caeaf5f93e.png)

Sequel Pro で長らく問題になっていた、MySQL 8.0に対応していない問題と、ウィンドウを閉じるとアプリ全体が落ちてしまうという問題も解消されています。ただし、MySQL 5.5 以前のサポートは打ち切られたそうですので、古い環境を維持している場合には注意が必要ですね。

接続設定ファイル（*.plist）はそのまま読み込めましたので、Sequel Pro からの移行も容易ではないかと思われます。

最後に新旧のアイコンを並べたところをご紹介。

![スクリーンショット 2020-07-08 15.37.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86075/18f95372-0a81-75db-e990-792445b60c19.png)
VScodeでnumpyをimportするとエラーが発生するときの対処法

#環境
VScodeでサクッとpython書きたい！
そんなとき、numpyをインポートするとエラーで読みこんでくれなくなりました。

#事象
WindowsのVScodeでnumpyをimportとするとエラーが発生します。

```

ImportError: DLL load failed: 指定されたモジュールが見つかりません。
```

jupyter notebookなどでは問題なく、importできるのに、なぜかVScodeだけimportしてくれません。

#原因
エラーメッセージの中でmklinitがimportできませんと言っています。

```

File "D:\Anaconda3\lib\site-packages\numpy\_distributor_init.py", line 34, in <module>
from . import _mklinit
```

VScodeではPowerShellからpythonを実行する際にmklモジュールのpathがわからないので、エラーになっています。

#対処
モジュールのpathを追加します。（D:\Anaconda3にインストールした場合）

```

D:\Anaconda3\Library\bin
```
Javascript クラスの書き方 進化版

かなりいいと思います。もうこれで決定ですね。
あえて何も説明を書かないが、わかる人がわかると思います。


```js
'use strict'

let Cat = (function() {
    let _share = 'only one';
    let privates = new WeakMap();
    let $ = function(o) {
        return privates.get(o);
    };
    function Cat(name) {
        privates.set(this, {});
        $(this).name = name;
    }
    Cat.prototype = {
        //self:function(){return privates.get(this);},
        init:function(){},
        load:function(){},
        say:function(){console.log('my name is', $(this).name)},
        getShare:function(){console.log(_share);},
        setShare:function(newValue){_share = newValue}
    };
    return Cat;
})();

let cat1 = new Cat('cat1');
let cat2 = new Cat('cat2');

console.log(cat1);
console.log(cat1 === cat2);
console.log(cat1.init === cat2.init);
console.log(cat1.load === cat2.load);
console.log(cat1.name);
cat1.say();
cat2.say();
cat1.getShare();
cat2.getShare();
cat1.setShare('share changed by cat1');
cat1.getShare();
cat2.getShare();
```


![Image 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638581/6b2785a6-461c-d088-d15d-60a2ab4593ca.png)


Q：継承はとうなるの？
A：継承？Javascript 継承させる？
【Swift】xcode for文でイメージを変える

##やりたいこと
for文でイメージを変える

##for文とは
制御文で繰り返し処理の際に使う。

##for文の書式
for 定数名　in 範囲　{ //処理 }
・範囲の部分の"開始の数字"と"終了の数字"の間に"."を３つつける。
例）1〜5　→　1...5
・範囲が1〜4だったら、"1..<5"と書くこともできる。

（書式は色々あるけど下記のコードで使う書式のみ書かせていただきました。）

##準備すること
イメージを３つ準備する
名前をそれぞれ0,1,2とする。


##コード
```
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var startButton: UIButton!
    @IBOutlet weak var stopButton: UIButton!
    
    var timer = Timer()
    var count = Int()
    var imageArray = [UIImage]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        count = 0
　　　　　//stopButtonを有効化
        stopButton.isEnabled = true
        
       //for文でイメージを変えてる。
        for i in 0..<3{
            print(i)
            let image = UIImage(named: "\(i)")
            imageArray.append(image!)}
        
        //最初のイメージを設定
        imageView.image = UIImage(named:"0")}
    
    func startTimer(){
        timer = Timer.scheduledTimer(timeInterval: 0.1,target:  self,selector: #selector(timerUpdate), userInfo: nil, repeats: true)
    }
    
    @objc func timerUpdate(){
        count = count + 1
        if count > 2 {
            count = 0
        }
        imageView.image = imageArray[count]
    }

    @IBAction func start(_ sender: Any) {
        //startButtonを無効化
        startButton.isEnabled = false
        //stopButtonを有効化
        stopButton.isEnabled = true
        //上のstartTimerのメソッドを呼び出す
        startTimer()
    }

    @IBAction func stop(_ sender: Any) {
        //startButtonを有効化
        startButton.isEnabled = true
       //stopButtonを無効化
        stopButton.isEnabled = false

        //timer止める
        timer.invalidate()
    }
}

```

##シミュレーター

<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://twitter.com/hashtag/Swift?src=hash&amp;ref_src=twsrc%5Etfw">#Swift</a> <a href="https://t.co/26o8tvzOCR">pic.twitter.com/26o8tvzOCR</a></p>&mdash; aa2302 (@aa23021) <a href="https://twitter.com/aa23021/status/1281195501916835840?ref_src=twsrc%5Etfw">July 9, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<a href="https://apps.apple.com/jp/app/codebelle-sukima-shi-jiande/id1072749712" target="_blank">参考アプリ</a>
c++整数値の割り算（切り捨て・切り上げ・四捨五入）

c++で割り算した時の切り捨て・切上げ・四捨五入の方法（intの場合）
・切り捨て：そのまま実行

```c++
int x;
int y;
int ans;
ans = x / y;
```
暗黙の型変換で切り捨てされます。

・切り上げ

```c++
int x;
int y;
int ans;
ans = (x + y - 1) / y;
```
・四捨五入

```c++

int x;
int y;
int ans;
ans = (double)x / double(y) + 0.5
```
四捨五入はdouble型やfloat型にキャストしないといけないですね。
以上備忘録
AIZU ONLINE JUDGE の問題をSwiftでやってみた(プログラミング入門 条件分岐編)

##トピック #1　条件分岐
[AIZU ONLINE JUDGE](https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/1/ITP1_1_D)の問題にSwiftで解答したものになります。競技プログラミングは普段やりませんので、こうしたほうが簡単！などがあればコメントで教えて下さい。

###2_A 大小関係
**問題** ２つの整数 a, b を読み込んで、a と b の大小関係を出力するプログラムを作成して下さい。
**解答**

```Swift
let a = readLine()!.split(separator: " ").map({Int($0)!})
if a[0] > a[1] {
    print("a>b")
} else if a[0] < a[1] {
    print("a<b")
} else {
    print("a=b")
}
```

###2_B 範囲

**問題** ３つの整数a, b, cを読み込み、それらが a < b < cの条件を満たすならば"Yes"を、満たさないならば"No"を出力するプログラムを作成して下さい。

**解答**

```Swift
let a = readLine()!.split(separator: " ").map({Int($0)!})
if a[0] < a[1] && a[1] < a[2] {
    print("yes")
} else {
    print("no")
}
```

###2_C 3つの数の整列

**問題**小さい順に並べ替えた３つの整数を１行に出力して下さい。整数の間に１つの空白を入れて下さい。
**解答**

```Swift
let a = readLine()!.split(separator: " ").map({Int($0)!})
print(a.sorted())
```

###3_C 長方形の中の円
**問題**
長方形の中に円が含まれるかを判定するプログラムを作成してください。次のように、長方形は左下の頂点を原点とし、右上の頂点の座標(W,H)が与えられます。また、円はその中心の座標(x,y) と半径rで与えられます。
**解答**

```Swift
let a = readLine()!.split(separator: " ").map({Int($0)!})
if a[0] > a[2] + a[4]  && a[1] > a[3] + a[4] && a[0] > 0 && a[1] > 0{
    print("Yes")
} else {
    print("No")
}
```
Matplotlibメモ

　学びのメモとして、Matplotlib周辺の視覚化に活用できるコードをチートシート代わりに自分の参考用としてまとめています。

#基本的なコードのまとめ

```python
#matplotlibをpltとしてインポート
import matplotlib.pyplot as plt

#リストxを横軸、yを縦軸にした際の折れ線グラフを作成
plt.plot(x, y)

#リストxを横軸、yを縦軸、散布図を作成(プロットの大きさがsizeに比例、色をcol、透明度は0.8)
plt.scatter(x, y, s = size, c = col, alpha = 0.8))

#リストvalues内のデータをn個のビンにおけるヒストグラムを作成
plt.hist(values, bins = n)

#グラフにタイトル(TITLE)をつける
plt.title('TITLE')

#横軸にXXX、縦軸にyyyという名前のラベルをつける
plt.xlabel('xxx')
plt.ylabel('yyy')

#縦軸を指定 (例.0から10まで2刻み)
plt.yticks([0,2,4,6,8,10])
#縦軸を指定 (例.0から10まで2刻みで、表記をカスタマイズ)
plt.yticks([0,2,4,6,8,10],['0','2万','4万','6万','8万','10万'])

#ある特定のプロットにテキストをつける(例. 横軸が10、縦軸が52のプロットに'text'というテキストを追加)
plt.text(10, 52, 'text')

#グリッド線を表示
plt.grid(True)

#作成した図を描画
plt.show()

#横軸を対数表示にする
plt.xscale('log')

```

#実際のプロット例
各都道府県ごとの県内総生産と人口のグラフ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598816/a07e119d-e741-47f6-cb01-1f10ea9faa23.png)

```python
#データの読み込み
with open('data.csv','r',encoding='shift_jis') as f:
    dataReader = csv.reader(f)
    list1 = [row for row in dataReader]  
    district = list1[0]
    population = list1[1]
    GDP = list1[2]
    district = district[1:]
    population = population[1:]
    GDP = GDP[1:]
    population = [int(s) for s in population]
    GDP = [int(s) for s in GDP]
#グラフ描画
import matplotlib.pyplot as plt
plt.scatter(GDP, population)
plt.title('Relationship between GDP and population')
plt.xlabel('GDP')
plt.ylabel('Population')
plt.xticks([0,30000000,60000000,90000000,120000000])
plt.yticks([0,3000000,6000000,9000000,12000000,15000000])
#一部のプロットに名前付け
plt.text(104470026,13623937, 'Tokyo')
plt.text(1864072,569554, 'Tottori')
plt.text(39409405,7506900, 'Aichi')
plt.text(38994994,8832512, 'Osaka')
plt.text(11944686,2837348, 'Hiroshima')
plt.text(9475481,2330120, 'Miyagi')
plt.text(19018098,5351828, 'Hokkaido')
plt.text(34609343,9144504, 'Kanagawa')
plt.text(22689675,7289429, 'Saitama')
plt.text(20391622,6235725, 'Chiba')
plt.grid(True)
plt.show()
```
出展: https://www.esri.cao.go.jp/jp/sna/data/data_list/kenmin/files/contents/main_h28.html (内閣府・県民経済計算)
adbコマンドによるdozeモード化

Android 6.0からdozeモードが搭載されました。
Android 7.0からはdeep dozeが追加され、dozeにもdeepとlightの２種類存在していることになります。

評価する際にdozeモードになるのを待とうとすると時間が掛かってしまうため、adbコマンドでdozeモードにします。

adbコマンドでdozeモードにする場合、２つ方法があります。

１つは通常のdozeモード、もう１つは強制dozeモード（←正式名称ではありません）です。

前者はdozeを解除するトリガーがあるとdozeが解除されますが、
後者はトリガーがあってもずっとdozeのままです。（adbコマンドで解除できますが）

### 共通の手順

1.まずはPCにUSB接続して、コマンドで充電をOFFにします

```
adb shell dumpsys battery unplug
```

2.次に画面を消灯します

### 通常のdozeモード化

1.dozeモードにします

```
adb shell dumpsys deviceidle step
```

モードが切り替わるため、何回か繰り返します。
mState=IDLE, mLightState=OVERRIDEになれば成功です。

2.戻したい時は画面を点灯するか下記コマンドで起こします

```
adb shell dumpsys battery reset
```

### 強制dozeモード

1.強制的にdozeモードにします

```
adb shell dumpsys deviceidle force-idle
```

2.戻したい時は解除して、充電出来るようにします

```
adb shell dumpsys deviceidle unforce
adb shell dumpsys battery reset
```
初心者によるプログラミング学習ログ 365日目

#100日チャレンジの365日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
365日目は
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>昨日の作業・やったこと⇩<br><br>●寝る直前の筋トレ5分<br>●ブログ記事1記事作成<br>●プログラミング学習365日目 1.5h<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/1280958327908782081?ref_src=twsrc%5Etfw">July 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
初投稿！RPAって何？RPAとAIの違いは？はじめての人でもわかるRPAのすべて！

みなさん、初めましてPeaceful morning株式会社でインターンをしている高橋です！

記念すべき初投稿です。
これからQittaにて、RPAについての情報を随時投稿していきたいと思います！
今回は**RPAの基本的な部分**を解説と我々が運営する**自社メディアRPA HACKの紹介**をしていきたいと思います。

#RPAとは？
そもそもみなさんRPAというものをご存知ですか？
名前は聞いた事あるけど、中身を全く知らないという方も多いのではないでしょうか。

RPAとは**Robotic Process Automation**の略称です。
Automationとあるように、人が行なっていたデスクトップ作業などのルーティーンワークを自動化する事ができ、業務効率化を推進するシステムです。

現在、大企業などではすでに導入されており金融業界をはじめ、製造業やその他の業種、官公庁などにも拡がりを見せています。

#RPAとAIの違い
RPAは**「自動化を推し進めるロボット」**、**「日々のルーティーンワークの解消をしてくれる」**というポイントは理解していただけましたでしょうか？

では次にRPAとAIの違いについてみていきましょう。
どちらも自動化のイメージはあると思いますが、決定的な違いはどこでしょうか。

それは**「自分で考えて行動できるか、できないか」**です。


RPAは人間が指示した通りにしか動くことができません。そしてその指示されたことを忠実に行い続けます。
一方で、AI(Artificial Intelligence)は「人工知能」と訳せるように、たくさん蓄積されたデータをもとに自ら判断して動き情報を処理することができます。

これがRPAとAIの違いです。
近年では、このRPAとAIを組み合わせて、高度な自動化を実現するケースも存在します。



#RPAの強み
ここまでRPAの基本的なことを見ていきましたが、最後にRPAの強みをまとめてみました。

・24時間作業できる
・ミスをしない、正確に作業が行える
・一つの業務から導入できるので、大規模な投資が不要。導入ハードルが低い
・低コスト

このように、RPAを導入すれば人がいなくても勝手に仕事が進み、人が会社に来ればもう業務が終わっているというようなことが起こり得ます。

RPAは今後「業務改革」「DX」が叫ばれている世の中で大活躍してくれるのではないでしょうか。
　　　　　　
#RPA HACKのご紹介

最後にRPA HACK（アールピーエイハック）について説明させて頂きます。
RPA HACKはPeaceful Morning株式会社が運営しているRPAメディアです。
RPA HACKでは
・日本国内のRPAの最新情報
・RPAツールのご紹介
・実際のツールの使い方の解説
などなど

これからRPAを勉強したい、RPAの知識をつけたい、RPAのエンジニアとして働いてみたいという方にはぴったりの情報がつまっております。
すでにRPA HACKでは100以上の記事があり、すべて無料でご覧いただけます！
一度でもこの記事を読んで気になった方は以下のリンクからご参照ください！

RPA HACK
https://rpahack.com/

Twitterもやっております。記事の更新時にツイートでお知らせします。
https://twitter.com/NewsRpa


##RPA HACK おすすめ記事 3選

1.**「自動化が進む世界で、時代に合わせて変化する人を応援したい――藤澤専之介氏インタビュー」**
(弊社代表のインタビューです。弊社の思いであったりビジョンがわかります！)
https://rpahack.com/sennosukefujisawa_interview

2.**「UiPath StudioXの基本をマスター！～画面構成/カード/アクション」**
(RPAツールであるUiPath StudioXの使い方を丁寧に解説しています！これからRPAを使ってみたいという方にはおすすめです！)
https://rpahack.com/uipath_studiox_1

3.**「RPAの導入事例　部門ごとに事例を紹介！」**
(RPAが実際どんな業務に使われているのかイメージがつかないという方におすすめです！)
https://rpahack.com/rpa-casestudy

この他にも、RPA関連の情報を随時更新しています！ご覧ください！

最後まで読んでいただき誠にありがとうございました！

#Peaceful Morning株式会社について
Peaceful Morningは、『我慢しないで働ける社会を創る』というミッションのもと、業務自動化テクノロジーを通じて、我慢せず⾃由にクリエイティブな仕事ができる社会の実現を⽬指しています。
2018年の創業からRPAによる業務の自動化を促進すべく自動化メディア「RPA HACK」、RPAエンジニアの就業支援「RPA HACKフリーランス」、月5万円～のRPAサポートサービス「Robo Runner」等様々な事業を行っております。
AIZU ONLINE JUDGE の問題をSwiftでやってみた(プログラミング入門 入門編)

##トピック #1　入門
[AIZU ONLINE JUDGE](https://onlinejudge.u-aizu.ac.jp/courses/lesson/2/ITP1/1/ITP1_1_D)の問題にSwiftで解答したものになります。競技プログラミングは普段やりませんので、こうしたほうが簡単！などがあればコメントで教えて下さい。
###1_A　Hello World 
**問題** "Hello World" と標準出力にプリントするプログラムを作成してください。
**解答** 

```Swift
print("Hello World")
```
###1_B xの3乗
**問題** 入力された数字の3乗の結果を出力してください
**解答**

```Swift
import UIKit
let a = Double(readLine()!)!
print(Int(pow(a, 3.0)))
```

```Swift
import UIKit
print(Int(pow(Double(readLine()!)!, 3.0)))
```

でも可能。pow()を使うにはUIKitをimportしなければなりません。

###1_C 長方形の面積と周の長さ
**問題**　たて a cm よこ b cm の長方形の面積と周の長さを求めるプログラムを作成して下さい。
**解答**

```Swift
let a = readLine()!.split(separator: " ")
let b = Int(a[0]) ?? 0
let c = Int(a[1]) ?? 0
print("\(b*c) \(2*(b+c))")v
```

```Swift
let a = readLine()!.split(separator: " ").map({Int($0)!})
print("\(a[0]*a[1]) \(2*(a[0]+a[1]))")
```
でも可能。

###1_D 時計
**問題**
秒単位の時間sが与えられるので、`h:m:s`の形式へ変換して出力してください。ここで、hは時間、mは 60 未満の分、sは 60 未満の秒とします。
**解答**

```Swift
let a = Int(readLine()!)!
let hours = a / 3600
let c = a % 3600
let minutes = c / 60
let seconds = c % 60
print("\(hours):\(minutes):\(seconds)")
```
AWS SNSが重複してメッセージを配信してしまう

よくAWSに触れるものです。

AWS SNSでちょっとハマりました。

# 問題
AWS SNSからlambda経由で何故かメッセージの送信に成功しているのに重複してメッセージが送られてきます。

そもそもSNSからlaｍbdaに対して重複して配信しているようでした。

配信再試行ポリシーの```numRetries```を0にしても解決しません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249038/ffa81572-9d55-109b-f790-95539a3420f6.png)


# 解決
lambdaで処理を終える際にresponseメッセージで成功ステータスを送る必要がありました。
(以下はpythonですが、他の言語も同様)

~~~python
##lambda関数内

def main()

    ...

    return {
        'statusCode': 200
    }
~~~

以上で重複配信がなくなります。
Android StudioでGithub上のプロジェクトをCloneする

今回初めてAndroid用のGitHubにあがっているプロジェクトをローカルに落とす必要があったので
自身の備忘録として残しておきます:bow:

#環境
Android Studio Version4.4.0
Mac OS Catalina

#対象のGitHubリポジトリを開く

Codeボタンを押下すると、"Clone with SSH"というメニューが出てくるので赤線の箇所をコピー
<img width="439" alt="スクリーンショット 2020-07-09 19.14.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329865/4ae1a1f7-6bb7-644e-8660-c9fff2bb4734.png">

#Android Studioを開く

Get Version Controlを押下
<img width="467" alt="スクリーンショット 2020-07-09 19.27.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329865/63025837-517d-d964-f2de-22039e4a0f50.png">
すると下記画面に遷移するので
`URL:`GitHubでコピーしたものをコピペ
`Directory:`Clone先のディレクトリを指定
問題なければ右下のCloneを押下
<img width="581" alt="スクリーンショット 2020-07-09 19.31.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329865/6cd2489b-f72b-9329-8b0b-f9118e49a7f2.png">

最後にGitHubのssh接続のパスワードを入力して完了！
<img width="252" alt="スクリーンショット 2020-07-09 19.30.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329865/96b69b11-0b15-db68-61e4-96f599ed2d6f.png">

#最後に
最近Androidの勉強をはじめました・・・！
ぼちぼちAndroid/Kotlinに関する記事を書いていければなぁと思ってます:relaxed:
Digdag公式ドキュメントからDigdagを学ぶ-Getting started

#Digdagについて
DigdagはOpenソースのマルチクラウドワークフローエンジンの事です。
簡単に言うとなんなかの仕事を順序に処理する流れを手伝ってくれるツールかと思いました。

## 目標
Digdagについての本などがないためDigdagの公式サイトのドキュメントを翻訳しながらQiitaに整理したいと思います。
http://docs.digdag.io/getting_started.html
ドキュメントは英語になっています。
勉強するのが目的なので誤訳などあると思います。
今日はGetting Started部分からやります。
DigdagのRubyを使ってRailsにバッチを作るまでが最後の目標になります。

#＃目次
以下のような内容になります。
[Getting started](https://qiita.com/amagasu/items/92ad70c33f73ab613d08)
[Architecture](https://qiita.com/amagasu/items/572075dcc8b3c8640072)
[Concepts](https://qiita.com/amagasu/items/c850db3b564a7d6dc99c)
[Workflow definition](https://qiita.com/amagasu/items/2a8b84ac8fb4da2d9968)
[Scheduling workflow](https://qiita.com/amagasu/items/9f47a34884ba06d93264)
[Operators](https://qiita.com/amagasu/items/1f9b26a71c86fc9d4607)
Command reference
[Language API -Ruby](https://qiita.com/amagasu/items/b11527d92d259bd3ab48)
[Digdagで環境毎に設定値を変える（RubyOnRails）](https://qiita.com/HavenSpring/items/bb1c7fbae9175c1f9479)
[Digdagを用いてRubyOnRails環境でバッチ実装](https://qiita.com/HavenSpring/items/b3c3e26ef868f8d5eaf4)

## Getting started
### 1. 最新バージョンのDigdagダウンロードと設置
Digdagは実行ファイルです。```curl```コマンドを使って```~/bin```にファイルを設置できます。

```
$ curl -o ~/bin/digdag --create-dirs -L "https://dl.digdag.io/digdag-latest"
$ chmod +x ~/bin/digdag
$ echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
```
```digdag --help```が実行できれば環境設定完了です。

zshを使う方は```~/.bashrc```を```~/.zshrc```に変更してください。

Windows

```
PowerShell -Command "& {[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::TLS12; mkdir -Force $env:USERPROFILE\bin; Invoke-WebRequest http://dl.digdag.io/digdag-latest.jar -OutFile $env:USERPROFILE\bin\digdag.bat}"
```

```
setx PATH "%PATH%;%USERPROFILE%\bin"
```

### 2. サンプルを実行してみる
```digdag init <dir>```コマンドはサンプルWorkflowを生成する。

```
$ digdag init mydag
$ cd mydag
$ digdag run 
```

```digdag init mydag```コマンドで以下のようなサンプルコード（mydag.dig）が生成される

```:mayday.dig
timezone: UTC

+setup:
  echo>: start ${session_time}

+disp_current_date:
  echo>: ${moment(session_time).utc().format('YYYY-MM-DD HH:mm:ss Z')}

+repeat:
  for_each>:
    order: [first, second, third]
    animal: [dog, cat]
  _do:
    echo>: ${order} ${animal}
  _parallel: true

+teardown:
  echo>: finish ${session_time}
```

```digdag run```Workflowが実行された
実行結果
<img width="960" alt="スクリーンショット 2020-07-09 13.19.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108475/83d6ae73-03fe-9889-e21e-eecb0e5d18e4.png">

次回はArchitecture
docker エラー (bad flag syntax: -----END)

よくAWSにふれるものです。

docker build(run)する際に次のようなエラーにハマりました。

# 問題

以下のようなコマンド

```
$ docker build --build-arg PRIVATE_KEY=$PRIVATE_KEY
```

```
bad flag syntax: -----END
See 'docker build --help'.
```

ちなみにPRIVATE_KEYはpem形式です。

```
-----BEGIN PRIVATE KEY-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
...
-----END PRIVATE KEY-----
```


# 解決

pem形式はスペースを含むので、環境変数には引用符をつけなくてはなりません。

```$ docker build --build-arg PRIVATE_KEY="$PRIVATE_KEY"```

以上で解決。
【概要】LSTM

# RNN
## 概要
- 入力層では、時刻ごとにデータを受け取り、出力層では時刻ごとの結果（たとえば分類問題の場合は分類カテゴリの確率値）を出力する
- ある時刻の中間層からの出力を次の時刻の中間層に伝えるためのパスをもつ
- 予測したい単語の間の距離が遠いとき、RNNも使えるけどレイヤ数は増える
- レイヤを増えると、過去の勾配はだんだん弱くなる（勾配消失が起こる)

# LSTM 
- Long Short-Term Memory
- STMは「ゲート」という仕組みを導入した
- Inputゲート、OutputゲートとForgetゲートでメモリに保存すべきものをコントロールする


# BiLSTM
- 双方向LSTM
- Bidirectional LSTM
- 左から右までLSTMを行って、右から左までLSTMを行って結果を合わせる。
- 両方向の文脈情報を捉えられることが可能になる。
- 固有表現認識タスク


# CRF
-   Conditional random field
-   形態素解析器の1つであるMeCab内で学習モデルとして用いられている
-   **無向グラフにより表現される確率的グラフィカルモデルの一つであり、識別モデルである**
-   無向グラフは方向性のないエッジ(辺)とノード(頂点)からなるグラフである．方向性がないとは，両方向に行き来できるという意味である
-   確率的グラフィカルモデルとは，グラフが確率変数間の条件付き依存関係を示すような確率モデルを指す．確率的グラフィカルモデルのノードは確率変数を表し，エッジは依存関係を表す
-   識別モデルとはあるデータxがクラスCkに属する確率p(Ck|x1)を表すモデルを指す
-   **CRFは系列ラベリングという問題を解くために用いられる手法である**
-   CRFはマルコフ確率場上に成り立っているため，現在の状態は1つ前の状態にのみ依存する

## 分類問題と系列ラベリング
>機械学習の最も基本的な問題は分類問題であろう．例えば届いたメールがスパムメールかどうか，入力されたデータがどのクラスに属しているか等を判断するような問題が挙げられる．分類問題では与えられる入力データは1つの場合が多く，そのデータをどのクラスに分類するかを判別することが目的となる．
これに対して系列ラベリングは，入力にデータ列(例えば単語列)を受け取り，出力として個々のデータにラベルを付加することが目的となる．例えば単語列に品詞情報を与える問題(入力：「私/は/走る」⇒出力：「名詞/助詞/動詞」)などが挙げられる．
系列ラベリングを解くためのCRFを，特にLinear-chain CRFと呼ぶ．

## 構造学習
>構造学習とは，系列ラベリングを解く際に入力であるデータ列を個々のデータに分割して入力とせず，まとめてデータ列を渡してデータごとのラベルを得る手法である．

# 参考
[Conditional_random_field -Wikipedia](https://en.wikipedia.org/wiki/Conditional_random_field)
[再帰型ニューラルネットワークの基礎](https://www.imagazine.co.jp/%E5%86%8D%E5%B8%B0%E5%9E%8B%E3%83%8B%E3%83%A5%E3%83%BC%E3%83%A9%E3%83%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E3%80%8C%E5%9F%BA%E7%A4%8E%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%80%8D/)
unityで音を鳴らそう！

#始めに
この記事の対象者
- 製作中のゲームに音を入れたい人
- unityに興味がある人
#下準備
1. unityのプロジェクトを開く
<img width="1440" alt="スクリーンショット 2020-02-17 20.04.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/196f478e-3995-e385-bf11-df3ff81b44a4.png">
2. Create -> Create Emptyを選択してCreate　Emptyを生成する
<img width="1440" alt="スクリーンショット 2020-02-17 20.05.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/50c631d3-987a-ce18-5b79-70a4e1834760.png">
3. Create(Project)　-> C# Scriptを洗濯して新しいスクリプトを生成する
<img width="229" alt="スクリーンショット 2020-02-17 20.06.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/da7be397-dbea-6f91-7d86-edb282a7326f.png">
4. スクリプトを右クリックしてRemameを選択'sound_script'と入力してダブルクリック
<img width="468" alt="スクリーンショット 2020-02-17 20.12.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/8b369a33-8de4-1f3c-453f-8080396934d8.png">
5.
unityでとりあえずプレイヤーを動かすスクリプト

#始めに
フライトゲームやFPSでプレイヤーを動かすスクリプトを書きました。<br>プレイヤーの動かし方が分からない人は必見です！
(これはmacで開発することが前提となっています)
#下準備
1. unityのnewを選択
<img width="1440" alt="スクリーンショット 2020-02-16 20.28.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/6da2dfd4-cf5c-a21c-b0fd-df3e2b39215f.png">
2. Project nameを決めてCreate projectを押す<img width="1440" alt="スクリーンショット 2020-02-16 20.31.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/fc688811-0f32-6f30-a02c-19505016ae74.png">
3. Create -> 3D Object -> Planeをクリック、地面を作ります。
<img width="1440" alt="スクリーンショット 2020-02-16 20.45.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/fd497ef1-d402-e6f7-9251-dab7ecf17223.png">
4. Create -> 3D Object -> Cube、今回はこれを動かします。
<img width="1440" alt="スクリーンショット 2020-02-16 20.46.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/81d6e5f7-5a2f-aa40-0e6c-3ffd64a0f2d7.png">
5. Cube -> Add Componentをクリック'Rigidbody'と検索Rigidbodyをクリックして追加する
<img width="786" alt="スクリーンショット 2020-02-16 20.54.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/e73ad4ff-a939-174a-0d02-a8c6f5dca777.png">
6. Main CameraをドラクアンドドロップでCubeに入れる<br><img width="228" alt="スクリーンショット 2020-02-16 20.59.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/97a89357-ee1a-b1dc-2643-f85b085c2f8e.png">
7. ProjectのCreateからC#Scriptを選択してクリック<br>
<img width="229" alt="スクリーンショット 2020-02-16 21.03.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/44f287b5-a756-c2fe-c649-ea723ebff8f7.png">
8. デリートキーを押し、'Player_controller'と入力<br><img width="229" alt="スクリーンショット 2020-02-16 21.05.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/40b85723-662d-f835-135a-4f1d00029d91.png">
9. 作成したスクリプトをダブルクリックで開く
<img width="1440" alt="スクリーンショット 2020-02-16 21.13.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/8a2e6a1c-9cfe-e79e-82fc-e10cd56b62e8.png">
これで下準備はOKです。

#スクリプト
```C#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player_controller : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.position += new Vector3(0,0,0.1f);
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.position += new Vector3(0,0,-0.1f);
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.position += new Vector3(0.1f,0,0);
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.position += new Vector3(-0.1f,0,0);
        }
    }

}
```
開いたプログラムの内容を全て削除して上のスクリプトをコピペしてコマンドSで保存。unityに戻りこのスクリプトをCubeにドラクアンドドロップをする。<br>これで上の三角のボタンを押せば終了です。
もし、Cubeにスクリプトを入れられなかったらスクリプトを右クリック -> Remameを押して'Player_controller'と入れてみてください！

#最後に
最後まで見てくださってありがとうございます。<br>Qiitaは始めたばかりなので間違っていたら遠慮なく指摘してください！よろしくお願いします。
mysqlclient インストール エラー解決策[Mac, Windows版]


#Windows

**wheelパッケージをダウンロードしてパッケージインストール**して下さい。

以下サイトからwheelパッケージをダウンロードして下さい。
https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient

注意点とし、各々の環境にあったバージョンをダウンロードして下さい。
筆者環境では「Python 3.8.0 64-bit」をインストールし使用していますので、

**mysqlclient‑1.4.6‑cp38‑cp38‑win_amd64.whl**

をダウンロードします。


```
Python 3.5 => cp35
Python 3.6 => cp36
Python 3.7 => cp37

32-bit =>win32
64-bit =>win_amd64
```

ダウンロードできましたら、ファイルがあるディレクトリに入りコマンドを実行してください。

```
pip install mysqlclient‑1.4.6‑cp38‑cp38‑win_amd64.whl
```


今回の解決策は[こちらのサイト](https://shimi-dai.com/python-install-mysqlclient-on-windows/)を参考にさせてもらい筆者環境も解決することができました。

ちなみにですが、私は

「Build Tools for Visual Studio 2017」をインストールを行い、

```
error: Microsoft Visual C++ 14.0 is required.

Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
```

「'mysql.h':No such file or directory」の部分で諦めました。

```
_mysql.c(29): fatal error C1083: include

'mysql.h':No such file or directory
```



#Mac

私の環境では以下のエラーが発生しました。

```
ld: library not found for -lssl
```

Macではターミナルを開き、順にコマンドを実行してください。

```
(1) xcode-select --install

(2) brew install mysql-connector-c

(3) sudo vim /usr/local/bin/mysql_config

    /libs="-L$pkglibdir"`と打ち、Enterを押す。

    Iを押し、INSERTモードに変更したことを確認して以下のように変更する。

　　#変更前
　　libs="-L$pkglibdir"
　　libs="$libs -l "

　　#変更後
　　libs="-L$pkglibdir"
　　libs="$libs -lmysqlclient -lssl -lcrypto"

　　escを押し、INSERTモードを終了してから、:qsを押す。

（４） brew info openssl

　　色々と出てきたと思いますが、Caveatsに注目してください。
　　If you need to ...より以下のコマンドを実行してください。

　　筆者環境でのコマンド
　　`>> ~/.zshrc`部分は環境下によって変更することがあります。（~/.bash_profileなど）

　　echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.zshrc

　　echo 'export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"' >> ~/.zshrc

　　echo 'export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"' >> ~/.zshrc

(5) ターミナルを再起動し、`pip install mysqlclient`を実行する。

```


今回の解決策は[こちらのサイト](https://stackoverflow.com/questions/51578425/mysqlclient-instal-error-raise-exceptionwrong-mysql-configuration-maybe-htt)を参考にさせてもらい筆者環境も解決することができました。


#参考文献
Windows　解決策
https://shimi-dai.com/python-install-mysqlclient-on-windows/

Mac　解決策
https://stackoverflow.com/questions/51578425/mysqlclient-instal-error-raise-exceptionwrong-mysql-configuration-maybe-htt
【徹底解説】初心者必見の関数（メソッド）の理解の仕方

--- 

元の投稿

https://wp.me/pakwHz-cr

---

プログラミングの入門をする上で最も大事と言っても過言ではない関数またはメソッド(以下、どちらも関数と呼びます)

皆さんは関数と聞くと何を思い浮かべますか？

一般的には、数学の授業で聞く言葉だと思います。

ではどうして、プログラミングの世界でメソッドの事を関数と呼ぶことになったのでしょうか？

それは数学の関数と概念が非常に似ているからです。

そこで、まずは数学的な関数を見てみましょう。数学アレルギーの人も拒絶せず難しい話はしませんので、読み進めてもらえると嬉しいです。




まず、関数とは何でしょう？

関数とはある任意のxを与えると必ず１つのy(解)を返してくれるものです。ちょっと言葉だけでは難しいですね。

それでは、数学的な関数とは代表的なものに何があるでしょうか？

私が一番はじめに思い浮かべる関数は

```
y = ax + b
```
です。これは一次関数と呼ばれるものですがaとbは定数(任意で数を決めれる)ので具体的に

```
y = 2x + 3
```

を見てみましょう。

この関数はxを指定するとある数字が答えを出してくれます。例えば、x = 3であれば yの値は9になります。これはいろんな数字に当てはめれますよね。

なので、関数とは特定のXを与えると１つのYを返してくれるものです。




![image](https://menta.s3.ap-northeast-1.amazonaws.com/post/WFWgvFVf9r8gXl1uDTsJLISsDrmRE8BeHVZKGKY7.png)


この関数のようなものは数学に限られてるものではありません。




例えば、食材を与えると美味しい料理を作るシェフがいるとします。このシェフはある意味、関数のような働きをしていると言えましょう。

具体的にはこのシェフに「人参、じゃがいも、牛肉、カレー粉」をXとして、渡してあげると、このシェフはカレーというYの値を返してくれます。



![image](https://menta.s3.ap-northeast-1.amazonaws.com/post/9rGnPeYbURdavuFSm9U0nL1NH0FAG9VQNvNqzNSy.png)



このようなXを与えるとYを返すというのが、一般的な関数の概要です。

なので、プログラミング的な関数(メソッド)も同じだと言えます。




ただ、プログラミングでは上記のXを引数と呼び、Yを戻り値のといいます。


![image](https://menta.s3.ap-northeast-1.amazonaws.com/post/95A3hF9DO3S2FX8GRVhzQWNrTr1o32cvBd5E08eC.png)




それでは実際のコードを見ていきましょう。

今回はRubyコードを使用していますが、主要なプログラミング言語ではこの概念は変わりません。

それでは与えられた２つの数字（引数）を足し算をするメソッドを作成しましょう

```ruby
# メソッド名はadd
# 引数はa, b

# どんなメソッドを作るか、どんな引数を引き受けるかは自分で決めるので、
# メソッド名と引数の名前は自由に名前を決めることが出来ます。

# メソッドの定義（作成
def add(a, b)
  return a + b
end

# メソッドの呼び出し（使用）
add(3, 2)
# =>戻り値は５になる
```

このコードを図式化すると以下のようになります




ここで新しく紹介した概念が

「呼び出しのコードそのものが戻り値に変わる」

ということです。これは非常に大事な概念なのでしっかりと理解してください。

つまり、

```ruby
result = add(2, 3)
```

というコードは

```ruby
result = 5
```


というコードとしているのと全く同じです。




ここで、どうして 5 と直接書くのではなく add(2,3) と書くのかというといくつか理由があります

まず、この例題では足し算をするメソッドを使用しているので

頭の中で５とすぐに戻り値を予想できますがこれがすごく複雑な処理だと

戻り値が予想できないのでメソッドを使用しないといけません。

次に、今回の場合では引数（a, b）が予め決められていますが

これは実際には変数になっていたりしますのでメソッドを使用する前に答えを予想することができなくなります。



ここまでで、メソッドの基本的な概念は終わりです。

プログラミングではたくさんの関数（メソッド）を使用します。

書いているもののほとんどが関数と言っても過言ではありません。

関数を定義することも多々ありますが、大きくは他人が作成した関数をしようするということがほとんどです。

その際に、引数として何が必要でどのような戻り値をくれるのかという概念で関数をみると

簡単に理解して関数の詳細を理解しなくても使用することが出来ます。




なので、関数（メソッド）を使用または定義する際は引数と戻り値に注目してみましょう。
[Shopify] とFacebook コマースマネージャーを接続する（ちょろだしワクワク）

こんばんわ、明日はクレジットカード引き落としの日です。:scream:　

そして、今日は開発の話でなく、これからローンチされるであろう商品のプレビューです。:santa:
=まだリリースされていませんので読み続ける方はあらかじめご了承ください。消して最後の募集項目に人を誘導しようとか思っていません、1㍉も思っていません。マーケティング部門から、なんかShopify x Facebookに関して書けって言われたわけでもございません、ストレートには言われなかったけど、遠回しに言われて察しました。

Facebook ShopsとShopifyが連携され、FacebookやInstagramでそのまま直接ユーザーが購入できる世界がやってくるそうです。現在はウェブサイトに遷移されてそこで購入、トラフィックを誘導しているプラットフォームとその場で購入できちゃうプラットフォームの差分は大きいですね。　



詳細はこちらを参照
https://www.facebook.com/business/shops

Facebook Shopは1販売チャンネルとして、現在Shopify上に存在しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/e84c379f-0155-f846-b07e-9ad5b6f01bce.png)

今回は新たにFacebookという販売チャンネルが追加できます。（アプリをインストールする必要があります、インストールされたい方はこちらのURLを https://www.shopify.jp/facebook よりインストールしてください）

あと少しでリリースとのことで、このチャンネル管理でできるコトのプレビューはこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/e0e41842-16a9-6b53-71d3-73de209c903a.png)

イメージしずらいので、一旦進んでみます。

チャンネルトップ画面はこちらです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/ff474b77-5fca-1e3b-9154-8d56135747b6.png)

coming soon じらしますね。

詳しく知りたいので、コチラへ行ってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/2317aa74-9c9c-8865-c5a1-47a559e6008b.png)

Facebook for Businessのトップページでした。色々ナビゲートするとそれっぽいリンクがあったのでコマースマネージャーへ到着。下記がコマースマネージャーのトップページ。　開始したい！ので、開始ボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/13df860a-5328-27f7-7775-cf03161b543c.png)

チェックアウト機能使いたいので、進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/1bf20e73-95ff-8967-cdf9-e3b684e7d66a.png)

進みます。そしていきなり英語・・翻訳されているページはここまでですね。 Shopify使って開設とのことで Set Up Using an Ecommerce Platformを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/6fa077d1-4337-c182-0b62-906d9b70a1d0.png)

ガンガン進みましょう。Shopifyをクリック！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/6420b182-ea3f-75cb-eeea-28ac505aeada.png)

β版なので、先行して利用したかったら、フォームに情報いれてください、とのことです・・今日はここまでか。先行して利用されたい方はここに情報いれておくのはいいかもしれません。いれなくても直近つかえるようになると思いますが・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/8f289098-3f6d-2954-aee3-f21ecd98c169.png)


また近日リリースされ次第、利用方法をまとめてみたいと思います。

#募集
Shopify開発を一緒にするメンバー募集中。ガンガンご応募ください。 C#, Azure, Shopify こんなテックストックです。

プロマネも募集中です。詳細に関しては下記をご参照ください。
https://t-rnd.com/Jobs/
小数点のpx指定でレイアウトが崩れる現象を考える

border-width: 1.5pxに設定したときに、「あれれ、なんかよくわからんレンダリングが行われている」っていうことがあったので記します。レアケースなので、へーそういうことがあるんだというムダ知識として、あなたの生活を豊かにするかもしれません。

## 確認したブラウザ一覧
- Google Chrome 83
- FireFox 78 [^1]
- Edge 83
- Internet Explorer 11

## 実装

以下は実装したコードとなります。

```html
<!DOCTYPE html>
<html>
    <head>
        <style>
            hr {
                border: 0;
                border-top: 1px solid black;
                border-width: 1.5px;
                border-color: red;
            }
        </style>
    </head>
    <main>
        <h1>aaa</h1>
        <hr />
        <h1>aaa</h1>
        <hr />
        <h1>aaa</h1>
        <hr />
        <h1>aaa</h1>
        <hr />
        <h1>aaa</h1>
        <hr />
    </main>
</html>
```

## 結果

Chromeブラウザにて表示されたものを見てみます。
見事にhrタグに設定したborderの太さがおかしいです。
なぜでしょうか。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315145/f382bad5-a88e-d676-0495-9351614cdd96.png)

## 考察

まず、styleタグ内に設定した内容をみてみます。

```css
hr {
  border: 0;
  border-top: 1px solid black;
  border-width: 1.5px;
  border-color: red;
}
```

スタイルは上から順に評価されるので、

- borderは上下左右ともに0を設定
- borderの上のみ、1pxの黒い線を引く
- borderの大きさは1.5pxを適用する（※ただし上にしか適用されない）
- borderの色は赤に変更

そうです、そこまで変なことはしていなさそうです。
しかしborder-topを1にしているのに、border-widthを1.5にしているのがくさいですね。
なので、`border: 0.75px solid red;` などにして上下が1.5pxづつ領域をとるようにしてみましょう。

...とれませんか？
そうですか...ブラウザは1以下のピクセル指定、対応してなさそうですね...😇

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315145/ee8ab563-1ae0-88f0-31bd-d1d4f557ba24.png)

## まとめ

小数点を使用したピクセル指定、基本的にやめたほうが無難です😇
（※最終的に2pxに指定しました）

[^1]: ちなみにFireFoxは均等な太さでレンダリングされています。
クロスサイト、AjaxのレスポンスでのCookie設定ができない場合に確認すること

# やりたかったこと
以下の条件を満たすアプリケーションでCookieを設定したい
- フロントサイト(ブラウザのナビゲーションバー)のURLとバックエンドのURLが異なる
- フロントサイトからはAjaxによるリクエストを送信し、サーバーは`REST API`を返却するSPAアプリケーションの構成

## 発生した(解決したかった)現象
Ajaxリクエストのレスポンスで _Cookie_ が設定できない。
_Chrome_ のデベロッパーツールを使用しても特にエラーは出力されないが、なぜか_Cookie_が設定されない。

# 結論
時間のない方は結論の部分だけ設定してみて下さい。
以下を設定することでクロスサイトでCookieを設定する事ができる

- フロントアプリケーションの設定
  - `XMLHttpRequest.withCredentials`に`true`を設定する[^1]
- バックエンドアプリケーションの設定
  - レスポンスヘッダーに`access-control-allow-credentials`に`true`を設定する[^2]
  - レスポンスヘッダーに`access-control-allow-origin`でフロントアプリケーションのURLを設定する[^3]
      - ['localhost:4000', "*"]の様な値でOK。ワイルドカードのみではいけない
  - Cookieを設定する際に`SameSite`ポリシーを`None`にする[^5]



### XMLHttpRequest.withCredentials[^1]
XMLHttpRequestは**<font color="RED">別のドメインからのCookieをデフォルトでは受付けていません。</font>**
ただし、withCredentialsにtrueを設定している場合、Cookieを受け付けることが出来ます。
また、この設定は同じサイトのリクエストには影響を与えません。
なので、開発環境だけクロスサイトになる様な環境でも特に考慮せずに利用できます。

Mozillaの解説
`XMLHttpRequest from a different domain cannot set cookie values for their own domain unless withCredentials is set to true before making the request`

### access-control-allow-credentials[^2]
リクエストに`Credentials`の設定が含まれている場合に、レスポンスを`JavaScript`に教えるかどうかを指示するもの

### access-control-allow-origin[^3]
指定されたOriginからのリクエストを受け付けることが出来るかを表すもの
ただし、ワイルドカードを指定した場合は`Credentials`の設定はサポートされない[^4]

### SameSite policy[^5]
- Lax
  - モダンブラウザーのdefaultのポリシー
  - 以下の何れかの場合にCookieの送信が許可される
      - トップレベルナビゲーション(ブラウザーのナビゲーションバー)と同一の場合
      - GETリクエストの場合
- Strict
  - トップレベルナビゲーション(ブラウザーのナビゲーションバー)と同一の場合のみ送信される
- None
  - Cookieは全ての状況で送信される

今回実験している中で分かったこととしては、サブドメインの場合に`Strict`を設定してもブラウザーにCookieを設定することは出来る。また、Cookieの送信も行われる。
トップレベルナビゲーションのURLとDomainが異なる場合、`None`のポリシーの場合しかCookieを設定することは出来ない。
`Lax`と`Strict`はクロスサイトではブラウザーにCookieを設定することができないポリシーとなる。

[^1]https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials
[^2]https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials
[^3]https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
[^4]https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSNotSupportingCredentials
[^5]https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
[JAVA]abstractとinterfaceの違いについて


Java言語仕様について、面接で答えられなかったことが恥ずかしかったので再度学び直します。

## interface と abstractの関係について

### 様々な表現方法で表す。

|#|interface|abstract|
|---|---|---|
|仕様面|クラス仕様としての定義をしたいときに利用する|継承関係にあり処理を再利用させたい場合に利用する|
|実装クラスor具体クラスとの関係|実装クラス *CAN* 抽象機能|具体クラス *IS* 抽象クラス|


### コード的な違い
#### interface 
```java
// 抽象
public interface Cashier {
    void bill();
}

//実装クラス1
public class CreditCart implements Cashier {
    public CreditCart(){
    }    
    @Override
    public void bill(){
        System.out.println("billed by credit card");
    }
}
//実装クラス2
public class Cash implements Cashier {
    @Override
    public void bill() {
        System.out.println("billed by cash");
    }
}
```

#### abstract
```java
// 抽象クラス
public abstract class Animal {
    String name;
    public Animal(String name) {
        this.name = name;
    }
    public void sleep() {
        System.out.println("Sleeping");
    }
    public abstract void speak();
}

//実装クラス1
public class Human extends Animal {   
    public Human(String name) {
        super(name);
    }   
    @Override
    public void speak() {
        System.out.println(name + " speack human languages");
    }
}
//実装クラス2
public class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }   
    @Override
    public void speak() {
        System.out.println(name + " speack cat's language");
    }
}
```

## 修飾子のスコープ

|#|同一クラス|同一パッケージ|サブラクス|全て|
|---|---|---|---|---|
|default|◯|◯|-|-|
|private|◯|-|-|-|
|protected|◯|◯|◯|-|
|public|◯|◯|◯|◯|
更新後のstateの値を使ってdebounce処理をしたい

##デモ
#### **`App.js`**
```jsx
import React, { useState, useEffect, useCallback } from "react";

export default function App() {
  const [state, setState] = useState("");

  const callback = useCallback(() => {
    //この中で更新後の値が使える
    console.log("debounced!!!", state);
  }, [state]);

  useEffect(() => {
    const handler = setTimeout(callback, 1000);
    //cleanup
    return () => {
      clearTimeout(handler);
    };
  },[callback);
  return (
    <div className="App">
      <input type="text" value={state} onChange={e => setState(e.target.value)} />
    </div>
  );
}
```

普通にlodashとか使って作ったdebounce関数をuseEffectにぶちこむと更新後のstateを使うためには引数として渡さなければいけないのですが、useEffectの**cleanup**関数をうまく使ってあげることでstateが変わりcallback関数が再作成されるたびcleanupの中のclearTimeoutが**待機中だった処理をキャンセル**して、effectの中で新しいsetTimeoutを作成することでdebounce処理を行うことができます。

##customHook版
#### **`useDebouncedEffect.js`**
```jsx
import { useEffect, useCallback } from "react";

const useDebounceeEffect = (effect, deps, delay) => {
  const callback = useCallback(effect, deps);

  useEffect(() => {
    const handler = setTimeout(callback, delay);
    //cleanup
    return () => {
      clearTimeout(handler);
    };
  }, [callback, delay]);
};

export default useDebounceeEffect;
```

#### **`App.js`**
```jsx
import React, { useState } from "react";

import useDebouncedEffect from "./useDebouncedEffect";

export default function App() {
  const [text, setText] = useState("");

  useDebouncedEffect(
    () => {
      console.log("debounced!!!", text);
    },
    [text],
    1000
  );

  return (
    <div className="App">
      <input type="text" value={text} onChange={e => setText(e.target.value)} />
    </div>
  );
}
```
これでかんたんにstateの更新と紐付けたdebounce処理ができます

**やったぜ。**
TestLink の RestAPI を curl コマンドでたたいてテストスイートを追加する

#はじめに

https://qiita.com/bakachou/items/0f4a4f875d7e452e5fb1
の続きで、テストケースも自動というかテキストベースで直して登録したいという自分の要望。

まずは、手順と言うところを省いたテンプレート的なテストスイートを追加できるようにしたい


# 準備

https://qiita.com/bakachou/items/0f4a4f875d7e452e5fb1
の準備を参考にしてください

# JSON ファイルの作成

テストスイート追加用に以下の JSON ファイルを用意する。

```bash
cat createTestSuite.json
{
 "name":"TestSuite  TS100-B",
 "testProjectID":1,
 "parentID":74766,
 "notes":"This is my first TS via REST",
 "order":100
}
```

# 親テストスイート（parentID）の取得方法


親となるテストスイートの「parentID」 は、TestLink のテストケースのエクスポートをすると出てくる


テストスイートを選択して、以下の「エクスポート」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/1e63aa60-3987-4207-20ae-8ffd90f63241.png)

「XMLファイルへ書き出し」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304109/52d3c1dd-7c60-074f-c5f5-8179413b4c32.png)


以下のようなXML ファイルが出力されるので「<testsuite id="74766" name="test" >」にある id の番号を JSON に設定する。

```xml

<?xml version="1.0" encoding="UTF-8"?>
<testsuite id="" name="" >
<node_order><![CDATA[]]></node_order>
<details><![CDATA[]]></details> 
<testsuite id="74766" name="test" >
<node_order><![CDATA[1]]></node_order>
<details><![CDATA[]]></details> 

<testcase internalid="74767" name="testlink1111">
	<node_order><![CDATA[0]]></node_order>
	<externalid><![CDATA[1]]></externalid>
	<version><![CDATA[1]]></version>
	<summary><![CDATA[<p>ddddbbbb</p>
]]></summary>
	<preconditions><![CDATA[<p>aaaaaaaaaaaaaa</p>
]]></preconditions>
	<execution_type><![CDATA[1]]></execution_type>
	<importance><![CDATA[2]]></importance>
	<estimated_exec_duration></estimated_exec_duration>
	<status>1</status>
	<is_open>1</is_open>
	<active>1</active>
<steps>
    :
    : （長いので省略）
    :
```

# テストスイートのエンドポイントに送信


以下のコマンドを実行すると以下のような結果の JSON が返ってくる。

```bash
curl -i -H "PHP-AUTH-USER: ＜APIキー＞" -H "Content-Type: application/json" -X POST --data "@./createTestSuite.json"   http://localhost/lib/api/rest/v1/testsuites

HTTP/1.1 200 OK
Date: Thu, 09 Jul 2020 09:30:24 GMT
Server: Apache
X-Powered-By: PHP/7.3.18
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Set-Cookie: PHPSESSID=ob32q6vd1i96umn6c9qig5f005; expires=Fri, 10-Jul-2020 13:17:03 GMT; Max-Age=99999; path=/
X-Frame-Options: SAMEORIGIN
Vary: Cookie
Transfer-Encoding: chunked
Content-Type: application/json

{"status":"ok","message":"ok","id":74791}
```


# 終わりに
トップのテストスイート（テストプロジェクト名）にはテストスイートができない。
「<testsuite id="" name="" >」となっているので、「空」でいいのか？と思ったのだがダメだった。

そして以下の値を試したのだが、やっぱりダメ。。。

* parentID:,
* parentID:"",
* parentID:0,
* parentID:null,