OmniAICreator/Qiita-1.07M huggingface dataset:
Windows上のD言語でSQLite3を使うときに出るsqlite3.libまわりのエラーの解消

# 問題
Windowsで[D言語](https://dlang.org/)からSQLiteを使おうと思ってラッパーライブラリ[d2sqlite3](https://code.dlang.org/packages/d2sqlite3)使おうとしたらsqlite3.libまわりで下記のエラーが出て詰まった．
- `Warning 2: File Not Found sqlite3.lib`
- `Error 43: Not a Valid Library File`
d2sqlite3でなくとも他の方法でD言語からSQLiteを使うときに応用できる思う．

# 解消方法
- `Warning 2: File Not Found sqlite3.lib` &rarr; sqlite3.libをコンパイルディレクトリに入れる．
- `Error 43: Not a Valid Library File`
  &rarr; sqlite3.libを自分で作る．

下記の手順．
1. [SQLiteのDownloadページ](https://www.sqlite.org/download.html)にある**Precompiled Binaries for Windows**のところからdllをダウンロードする．
2. [implib](http://ftp.digitalmars.com/bup.zip)をダウンロードする．(dllからlibを作ってくれる)
3. コマンドラインで`implib /system sqlite3.lib sqlite3.dll`を実行する．(ファイルへのパスは適宜指定すること)
4. 作られたsqlite3.libをコンパイルディレクトリに入れる．

# 原因
この問題が起こる原因はよく理解してない．
`Warning 2: File Not Found sqlite3.lib`については[dub](https://code.dlang.org/)のバグとどこかに書いていた気がする．
Android Studioで定数や関数の定義をファイル移動せずに表示する


コーディング中に定数や関数の定義をちょっとだけ見たいときがあります。 Command + B で定義元のファイルを開くのも良いんですがちょっと手間なのでその場で見れる方法がないか探してみたらいい方法がありました。

`Option + Space` で以下のようにダイアログが表示され、定義をすぐに見れます。

![Kobito.X9A0N0.png](https://qiita-image-store.s3.amazonaws.com/0/18273/c2f9c9b3-8a8a-a6b7-47a1-eb0480be2a31.png "Kobito.X9A0N0.png")

この例では$HOGEの上にカーソルをのせて `Option + Space` しました。

参考
https://www.jetbrains.com/help/idea/2016.2/viewing-definition.html
ローカルのsqliteからherokuのPostgreSQLにデータをコピーする方法

完全に個人的な備忘です。（クソ記事すいません・・・）
### sqliteからデータをcsvファイルに書き出す
sqliteのコンソールに入り

```
>>> sqlite3 db.sqlite
sqlite> 
```

モードをCSVにし、CSVにデータを書き出す。
（以下、hoge_tableのデータをコピーする場合）

```
sqlite> .headers on
sqlite> .mode csv
sqlite> .output hoge.csv
sqlite> select * from hoge_table;
```
これで hoge_table の内容が hoge.csv に出力される。

### herokuのPostgreSQLにデータ投入
次にherokuのPostgreSQLに接続し

```
>>> heroku pg:psql
hogeapp::DATABASE=>
```

データをHerokuのDBにコピーする。

```
hogeapp::DATABASE=> \copy hoge_table from 'hoge.csv' CSV header;
```

この時、HerokuのPostgreSQLで過去にデータを登録したことがある場合、idが既に採番されており、PostgreSQL側のidがキー重複することがある。
その場合、以下のコマンドででidのlast_valueを確認する。
(以下はhogeテーブルのidが何番まで採番されたかを調べる）

```
hogeapp::DATABASE=> select * from hoge_table_id_seq;
```

もし、ローカル（つまりsqlite）のidが10まで採番されているのであれば、
移行後に以下のコマンドを発行して採番済みidの値を更新する

```
hogeapp::DATABASE=> select setval ('hoge_table_id_seq', 10);
```

初期化する場合は以下。

```
hogeapp::DATABASE=> select setval ('users_id_seq', 1, false);
```

以上
（数万件程度のデータなら一瞬）
今からiOS12 SDKへ対応する人のためのプッシュ通知変更点まとめ

会社のLTで話した時のメモをQiitaに書いておきます。
実装方法の概要のみ記載しているので、詳細は参考リンクをご覧ください。

# 一番大切な変更点
通知センターの機能が強化され、ユーザーが不要に感じた通知を気軽にオフにできるようになりました。
ユーザーにとってより有益な通知となるよう、この機会に改めて通知を見直しましょう。

# 新機能
## 通知のグループ化

通知がグループ化されるようになりました。

デフォルトではアプリごとにグループ化されますが、どのようにグループ化するかをアプリ側から指定できることができます。
たとえばメッセンジャーアプリの場合、送信元別に分けてグルーピングが可能です。

以下が詳しいです（ソースコードはこのサイトから引用しています）
http://ashishkakkad.com/2018/08/tutorial-lets-take-quick-dive-grouped-notifications/
https://dev.classmethod.jp/smartphone/iphone/user-notifications-grouped-local-notifications/

### 基本

通知に含まれる `content.threadIdentifier` を指定すると、文字列が同じものがグルーピングされます。

```swift
let content = UNMutableNotificationContent()content.title = "Notifications Group"
content.body = "Tutorial by Ashish Kakkad"
content.threadIdentifier = "notify-team-ios"
```

### 応用

`ほか3件の通知` の部分を指定することができます（カテゴリの概要）。

#### 1. 通知のカテゴリを作成する

```swift
let summaryFormat = "%u more messages from %@"
return UNNotificationCategory(identifier: "group-messages", actions: [], intentIdentifiers: [], hiddenPreviewsBodyPlaceholder: nil, categorySummaryFormat: summaryFormat, options: [])
```

`%u` にはグルーピングされた通知の数（または `content.summaryArgumentCount` で設定した値）が、 `%@` には `content.summaryArgument` が表示されます

#### 2. 通知センターにそのカテゴリを入れる

```swift
UNUserNotificationCenter.current().setNotificationCategories([category])
```

#### 3. カテゴリを設定した `UNUserNotificationCenter` を使って通知を送信
このとき、カテゴリ引数（`content.summaryArgument`）を指定します

```swift
let content = UNMutableNotificationContent()
content.body = "…"
content.threadIdentifier = "notify-team-ios"
content.summaryArgument = "by Ashish"
content.summaryArgumentCount = 2
UNUserNotificationCenter.current().add(content)
```

## 通知許可ダイアログを出さずに初回通知を送る

以下が詳しいです：
https://qiita.com/peka2/items/d2ce23c078fd35a92f15

`UNUserNotificationCenter.current.requestAuthorization(option:completion:)`の`option`配列に `.provisional` を含めると、ダイアログを出さずに通知を送ることができます。
ただし、この通知は通知センターのみに配信されるため、ロック画面などでは確認できません。

このオプションを追加しておくと、クロージャに渡される granted が初回起動でかならず `true` になります。
配信サーバーに端末IDの登録などを行っている場合、端末数が増加することがあるので注意が必要です。

## 設定アプリからアプリの設定画面へリンク

以下が詳しいです:
https://dev.classmethod.jp/smartphone/iphone/user-notifications-open-inapp-settings/

設定アプリの通知設定画面に、アプリ内の通知設定画面へのディープリンクを仕込めるようになりました。
通知をカテゴリごとにオンオフできるようにしておくと、ここからアプリの設定画面を立ち上げることが可能です。

`UNUserNotificationCenter.current.requestAuthorization(option:completion:)`の`option`に  `.providesAppNotificationSettings` を含めると、リンクを出すことができます。

起動時に`UNUserNotificationCenter.current().delegate`を指定すると、デリゲートの`userNotificationCenter(_:openSettingsFor:)`が呼ばれますので、この中でアプリ内の設定画面へ遷移する処理を記述します。
OpenCV3系を利用して陥ったエラー。　備忘録

#単純なエラーから、複雑なエラーまでを載せていきます。

##ValueError: too many values to unpack (expected 2)
このエラーは変数が大きすぎるよ(予想されるのは２です)というエラーです。


```python:example01.py
#修正前
x , y, w =  1 ,2 ,3,0
#修正後
x , y, w =  1 ,2 ,3.0       
```

##error: (-215:Assertion failed) ngroups > 0 && inpCn % ngroups == 0 && outCn % ngroups == 0 in function 'cv::dnn::ConvolutionLayerImpl::getMemoryShapes'
OpenCVのdnn MobileNetSSDをいじっていたときに起きたエラーです。

```python:example02.py
blob = cv2.dnn.blobFromImage(cv2.resize(frame, \
               (300, 300)), 0.007843, (300, 300), 127.5)
```
上記のframe変数のカラーコードをgrayscaleにしてあげれば直ります。
*直らないときもある。日本語の記事が少なく諦めた

```python:example03.py
frame = cv2.imread(args["image"], cv2.IMREAD_GRAYSCALE)
#または
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
```

##error: (-215:Assertion failed) npoints >= 0 && (depth == CV_32F || depth == CV_32S) in function 'cv::contourArea'
cv2.findCountContoursを利用しているときに起きたエラーです。
openCV3になり、この関数の返り値は３つになりました。
関係ないですがcontoursのtypeはnumpy.ndarrayです。
findContours関数を使うときは「[このサイト](https://qiita.com/anyamaru/items/fd3d894966a98098376c)」がとても丁寧でわかりやすいです。

```python:example04.py
#修正前
contours, hierarchy = cv2.findContours(im_bw.copy(),\
             cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 
#修正後
image, contours, hierarchy = cv2.findContours(im_bw.copy(),\
            cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)    
```
Dartでランダムな文字列を生成する

`math`パッケージの`Random`クラスを使えばよい。

```dart
import 'dart:math';

String randomString(int length) {
  const _randomChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  const _charsLength = _randomChars.length;

  final rand = new Random();
  final codeUnits = new List.generate(
    length, 
    (index) {
      final n = rand.nextInt(_charsLength);
      return _randomChars.codeUnitAt(n);
    },
  );
  return new String.fromCharCodes(codeUnits);
}

void main() {
  print(randomString(10));
}
```

なお、暗号論的に安全な乱数を使いたい場合は `new Random.secure()` を使う。
VMware Workstation Player で FreeBSD を快適に扱う為の VMware Tools 導入方法

VMware Workstation Player のゲスト OS に FreeBSD を用いる際に、動作環境を快適に扱う為の VMware Tools 導入方法の紹介です。

既にホスト OS に VMware Workstation Player がインスコされていて且つ、ゲスト OS に FreeBSD 10.x 以降がインスコされている事が前提です。
#ゲスト OS に VMware Tools の iso イメージを認識させる。
```
 Player(P) -> 管理(M) -> VMware Tools のインストール
```

ゲスト OS 内で root 権限で操作する。
#misc/compat6x のインスコ
VMware Tools 内のバイナリで、これらのライブラリが必要となる。

```
# cd /usr/ports/misc/compat6x
# make install
```
#perl5 系のインスコ
lang/perl5.?? はインストーラやアンインストーラのスクリプト言語が perl で記述されているので必要となり、インストール後も必要なので消さない事。

```
# cd /usr/ports/lang/perl5.28
# make install
```
#ホスト OS でマウント可能状態にある iso イメージのマウントをする
```
# mount_cd9660 /dev/cd0 /mnt
```
#御本尊の展開及び実行
```
# bsdtar xf /mnt/vmware-freebsd-tools.tar.gz -C/tmp
# perl /tmp/vmware-tools-distrib/vmware-install.pl
```
ディレクトリの置き場所を聞かれるので、特段拘りが無ければデフォルト設定のままで問題ない。

正常にインスコが終了したら、iso イメージはアンマウントを自動でされ、終了。
np.choiceとchainer.utils.WalkerAliasの速度対決


chainerのマニュアルに「chainer.utils.WalkerAliasはnp.choiceよりも速い」と書いてあったので，速度を比較してみた．ただしCPUオンリー．

- [chainer.utils.WalkerAlias](https://docs.chainer.org/en/stable/reference/util/generated/chainer.utils.WalkerAlias.html?highlight=WalkerAlias)
- [Alias method on Wikipedia](https://en.wikipedia.org/wiki/Alias_method)

# コード

```python:乱数生成

import numpy as np
import chainer
from time import time
import matplotlib.pyplot as plt
%matplotlib inline

loops = 10  # for taking average
verc_size = 10 ** np.arange(1, 7)  # i
n_samples = 10 ** np.arange(1, 7)  # j

t_choice = np.zeros((len(verc_size), len(n_samples)))
t_alias  = np.zeros((len(verc_size), len(n_samples)))
t_aliasv = np.zeros((len(verc_size), len(n_samples)))



for i in range(len(verc_size)):

    p = np.random.randint(100, size=verc_size[i])
    p = p / p.sum()
    # p = p.astype(np.float32)  # for gpu?
    c = np.random.randint(100, size=verc_size[i])

    start_time = time()
    for loop in range(loops):
        sampler = chainer.utils.WalkerAlias(p)
    end_time = time()
    e_time = end_time - start_time
    t_aliasv[i, :] = e_time / loops


    for j in range(len(n_samples)):

        # numpy choice
        start_time = time()
        for loop in range(loops):
            res = np.random.choice(c, size=n_samples[j], p=p)
        end_time = time()
        e_time = end_time - start_time
        print('choice', e_time, n_samples[j], verc_size[i])
        t_choice[i, j] = e_time / loops

        # chainer alisas
        start_time = time()
        for loop in range(loops):
            res = sampler.sample(n_samples[j])
            res = c[res]
        end_time = time()
        e_time = end_time - start_time
        print('alias ', e_time, n_samples[j], verc_size[i])
        t_alias[i, j] = e_time / loopsimport numpy as np
```

# プロット

```python:プロット
fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(15, 5))

def myax(ax, title):
    ax.set_yscale('log')
    ax.set_xscale('log')
    ax.set_ylim(1e-4, 1e2)
    ax.set_title(title)
    ax.set_xlabel('# samples')
    ax.set_ylabel('time [s]')

for i in range(len(verc_size)):
    ax[0].plot(n_samples, t_choice[i], label=verc_size[i])
myax(ax[0], 'np.choice')
ax[0].legend(loc='best')

ax[1].plot(n_samples, t_alias)
myax(ax[1], 'chainer.alias sampling only')

ax[2].plot(n_samples, t_alias + t_aliasv)
myax(ax[2], 'chainer.alias init + sampling')
```


# 結果

- alias methodは確かにO(1)ということが分かる（sampling onlyの場合．計算時間はサンプル数に依存しない）．
- alias methodは初期化に膨大な時間がかかるので，初期化の時間を含めると確実にnp.choiceのほうが速い．
- 初期化を除くと，「1万個の中から1つ選ぶ」を1万回繰り返すときには，alias methodのほうが速そう．
- GPUでalias methodがどの程度速いのかは未検証（chainer.utils.WalkerAliasにはto_gpu()がある）．

![choice.png](https://qiita-image-store.s3.amazonaws.com/0/44835/1736ae8c-4a33-b19f-7fdd-4ebbc1764c8d.png)
php内で操作したらapacheのpermission deniedが表示される時

# どういうエラーなのか
PHPでunlink、fopenのような関数を使っていたときにちょくちょく発生したので記載。
例えば、以下のような表示がされる時

```zsh:こんな警告
Warning: file_get_contents(/ディレクトリパス/ファイル名): failed to open stream: Permission denied in [エラーが起きているPHPファイル]
```

# まず何を調べるのか
エラーの内容が`access to`ではじまるものとは違って、該当するファイルに至るまでの**パスの所有者/所有グループ**で阻まれることがあるので、ディレクトリの一覧表示で所有者/所有グループを確認する

```zsh:一覧で確認
$ ls -la
drwxr-xr-x 3 kamo   kamo 4096 Sep 11 22:39 .
drwxr-xr-x 3 kamo   kamo 4096 Sep 11 14:01 ..
-rw-r--r-- 1 kamo   kamo   33 Sep 11 14:01 .bash_logout
-rw-r--r-- 1 kamo   kamo  176 Sep 11 14:01 .bash_profile
-rw-r--r-- 1 kamo   kamo  124 Sep 11 14:01 .bashrc
drwxr-xr-x 3 kamo   kamo 4096 Sep 11 14:01 temp
```

この場合、apacheでアクセスしようとしても所有者/所有グループが`apache`ではなく、`kamo`になっているため、apacheではアクセスができなかった。

# どのように変更すればいいのか

筆者の場合、アクセスしようとしている`temp`ディレクトリが**誰でもアクセスしていいような中身**であったため、以下のように変更した

```zsh:所有者/所有グループ変更&&アクセス権限変更
chown apache:apache 「アクセスするパス」/temp/
chmod 777 「アクセスするパス」/temp/
```

このように所有者/所有グループの権限を変えることでapacheでの操作が可能になる

```zsh:もう一度一覧で確認
$ ls -la
drwxr-xr-x 3 kamo   kamo   4096 Sep 11 22:39 .
drwxr-xr-x 3 kamo   kamo   4096 Sep 11 14:01 ..
-rw-r--r-- 1 kamo   kamo     33 Sep 11 14:01 .bash_logout
-rw-r--r-- 1 kamo   kamo    176 Sep 11 14:01 .bash_profile
-rw-r--r-- 1 kamo   kamo    124 Sep 11 14:01 .bashrc
drwxrwxrwx 3 apache apache 4096 Sep 11 14:01 temp
```

# 注意点

ただし、**アクセスする人を制限したい**、**誰もが見れるようにしてはいけない**という場合では有効ではないので注意する必要がある
Kotlin Script でシンプルなサーバを作る

Kotlin は Script としても使えるという利点があります。 つまり、 いちいち(明示的に)コンパイルしなくても利用可能ということです。

スクリプトとして使えるなら、 Python の CGIHTTPServer みたいに簡単にサーバを立ち上げられてもいいんじゃないかと思い、 コードを書いてみました。
([GitHub: Kotlin-Simple-HTTP-Server](https://github.com/KenjiOhtsuka/Kotlin-Simple-HTTP-Server) にあります。)
ちょっとした HTMLファイルの見栄えをブラウザでチェックしたいというようなニーズには応えることができます。

## 準備

Kotlin のコンパイラをインストールします。

### macOS の場合

`brew install kotlin` で Kotlin (kotlinc) をインストールします。
私の環境では、 `/usr/local/Cellar/kotlin/1.2.71/bin/kotlinc` でした。

## コード

ソケット通信を行うコードを書きます。
JVM で動かす前提です。 Java のコードを書き換えたような状態です。

```kotlin:server.kts
import java.io.*
import java.net.ServerSocket

val port = 8081;
val serverSocket = ServerSocket(port);
println("listening port: " + port.toString());

lateinit var requestLine: String
while (true) {
    val clientSocket = serverSocket.accept();

    val `in` = BufferedReader(InputStreamReader(clientSocket.getInputStream()));
    val out = BufferedWriter(OutputStreamWriter(clientSocket.getOutputStream()));

    do {
        requestLine = `in`.readLine()
        println(requestLine);
    } while (!requestLine.isNullOrEmpty())

    val body = """
        <!DOCTYPE html><html><head><title>Exemple</title></head><body><p>Server exemple.</p></body></html>
    """.trimIndent()

    out.write("HTTP/1.0 200 OK\r\n");
    out.write("Date: Fri, 31 Dec 2017 23:59:59 GMT\r\n");
    out.write("Server: Apache/0.8.4\r\n");
    out.write("Content-Type: text/html\r\n");
    out.write("Content-Length: ${body.toByteArray().size}\r\n");
    out.write("Expires: Sat, 01 Jan 2020 00:59:59 GMT\r\n");
    out.write("Last-modified: Fri, 09 Aug 1996 14:21:40 GMT\r\n");
    out.write("\r\n");
    out.write(body)

    out.close();
    `in`.close();
    clientSocket.close();
}
```

(CGIHTTPServer のようなフォームの値の簡単に取得する方法は見つかっていないのですが。)

## 実行する

```sh
kotlinc -script server.kts
```

localhost:8081 にブラウザからアクセスするとページが表示されます。

## 関連

* CGIHTTPServer
    * https://improve-future.com/ja/python-establish-light-server-to-share-server-command.html
UICollectionViewCellのxibファイルの作りかた

# 概要

いつも
`新規ファイル作成 > CocoaTouchClass > Also create XIB fileをチェック`
で作ってたけどチェック入れ忘れた時とかUICollectionViewCell(他でも)のXIB作りたい

<img width="500" alt="スクリーンショット 2018-10-23 12.34.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/199256/3ec0b8fe-77b9-0496-391c-9639d627839d.png">

# 解決

`新規ファイル作成 > UserInterface内のEmptyを選択`
(Viewを選択するとViewができちゃう)

<img width="500" alt="スクリーンショット 2018-10-23 12.37.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/199256/475058a7-9ee5-e099-65a5-d4a1d5f6dee0.png">

`ファイルできたらLibraryからCollectionViewCellをドラッグ＆ドロップ`
Library開くのには`Command + Shift + L`が便利

<img width="500" alt="スクリーンショット 2018-10-23 12.41.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/199256/38a8c1d3-b1a4-a455-bac8-722ab9ec2009.png">
<img width="500" alt="スクリーンショット 2018-10-23 12.41.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/199256/6b8ec026-88f1-c3ae-17d8-254753c1e27b.png">
初心者がまとめるPHPの基礎知識

プログラミングの勉強を始める前は、PHPやJavaScriptと言われてもなんのことかさっぱりわかりませんでした。
しかし最近になってPHPの勉強を始め、少しずつPHPというものがどういった機能を発揮するのかがわかってきました。
そこで今回はPHPについての基礎知識をまとめたいと思います。

##そもそもPHPとは
プログラミングの勉強を始める前の段階にいる人にとっては、
「PHPってよく聞くけど一体何？」という状態であることが多いのではないでしょうか。

####PHP
HTMLで書かれたスクリプトの中から動的な作業を行うことができるプログラミング言語です。
HTMLは基本的に静的なプログラミング言語ですので、PHPをはじめとした動的なプログラミング言語を入れることで問い合わせフォームやショッピングカートなどのアプリケーションを使用することができます。

####Javaとの違い
よくプログラミングの勉強をする際に「PHPかJavaのどちらを勉強すればいいの？」という疑問が浮かび上がります。
ここではその結論を出すわけではありませんが、
PHPとJavaの大きな違いをご紹介します。

**1.　使用用途**
PHPは特にWebアプリの開発に多く使われます。
一方でJavaは汎用性の高い言語で、企業による大規模システム開発から個人のスマートフォンアプリ開発まで様々な場面で使われます。
**2. 難易度**
勉強をする際の難易度ですが、PHPはJavaと比べて比較的簡単であると言われています。
文法がシンプルでHTMLと混ぜて使えるため親近感のあるPHPとは対照に、
Javaでは覚えることが多く、学習に時間がかかるとされています。
初心者にとっつきやすいという意味ではPHPのほうが難易度は低いと考えられます。


##PHPで頻出の基本用語##
**開発環境**
PHPを書く際に、自身で開発用の環境を用意する必要があります。

**変数**
PHPではさまざまなデータや長いコードが使用されます。
それを毎回毎回書く手間を省くことができるのがこの変数です。
変数とはデータや数式を保存していく箱で、
その箱に必要な中身を入れて使いまわすことができます。

**定数**
上記の変数は値を後から変更することができますが、
変数は値を変更することができません。
defineを指定することで後から書き換えられないようにすることができます。


##まとめ
以上、今回はPHPに関する基礎知識をまとめました。
この他にも覚えなければならないことはたくさんあるので、
私も日々勉強して精進していきたいと思います。
GKE 上の PostgreSQL のデータの backup と restore

PostgreSQL の公式イメージを使って GKE 上に立てた DB のデータバックアップとリストアの tips

## Backup

```bash
$ kubectl run pod-for-backup -it --rm --image=google/cloud-sdk:latest -n ${NAMESPACE} --restart=Never -- bash

% # バックアップのファイル名
% backup_yyyymmddhh=$(date -d '9 hours' +'%Y%m%d%H')

% # pg_dump を使いたいのでインストール
% apt-get install -y postgresql-client

% # Google Cloud Storage にバックアップするのでユーザーの認証
% gcloud auth login

% # バックアップ (custom フォーマットはデフォルトで圧縮してるらしいので、それに加えて gzip で圧縮して、さらに小さくしてアップロード)
% pg_dump -h postgres -d postgres -U postgres --format=custom --no-acl --no-owner | gzip > ${backup_yyyymmddhh}.dump.gz
% gsutil cp ${backup_yyyymmddhh}.dump.gz gs://${BACKET}/backup/
```

## Restore

```bash
$ kubectl run pod-for-restore -it --rm --image=google/cloud-sdk:latest -n ${NAMESPACE} --restart=Never -- bash

% # バックアップした対象ファイル名
% backup_yyyymmddhh="yyyymmddhh"

% # pg_restore を使いたいのでインストール
% apt-get install -y postgresql-client

% # Google Cloud Storage のデータを取得するのでユーザーの認証
% gcloud auth login

% # ダウンロードして展開してリストア
% gsutil cp gs://${BACKET}/backup/${backup_yyyymmddhh}.dump.gz ${backup_yyyymmddhh}.dump.gz
% gzip -d ${backup_yyyymmddhh}.dump.gz
% pg_restore -h postgres -d postgres -U postgres --format=custom --clean ${backup_yyyymmddhh}.dump
```
Vue で React の Fragment に相当するコンポーネントを使用する

以下のような table を作りたい場合、React の Fragment に類する要素が必要となる。
https://reactjs.org/docs/fragments.html

```vue
<table>
  <tbody>
    <React.Fragment v-for="item in items">
      <tr>
        <td>{{item.name}}</td>
      </tr>
      <tr v-if="item.children">{{item.children.name}}</tr>
    </React.Fragment>
  </tbody>
</table>
```

なぜならば、table の仕様上、tbody 等(thead, tfooter) の直下には div などの要素はおいてはいけないからだ。(基本は tr がくるので) つまり以下のようにはできない。このようにした場合、table の挙動が保証されない。

```vue
<table>
  <tbody>
    <div v-for="item in items">
      <tr>
        <td>{{item.name}}</td>
      </tr>
      <tr v-if="item.children">{{item.children.name}}</tr>
    </div>
  </tbody>
</table>
```

## vue には react の fragment に相当する要素がない

しかし Vue にはそれに相当する要素がない。(一時期あったバージョンもあるようだが)

https://github.com/vuejs/vue/issues/7606

解決策としては functional component 等が提案されているようだが、シンプルに fragment に類するコンポーネントを使いたい。

## 一応サードパーティ製のものがある

https://www.npmjs.com/package/vue-fragments
開発メンテが終了しているが、一応コンポーネントとしてある。
ただし、import 時の挙動がドキュメントとあっていなかったので、修正したものを個人的に公開した。本プロジェクトはメンテナンスをしていないようで、プルリクが通らないため。

https://github.com/superyusuke/nakanishi-vue-fragment

## 使い方

```
npm i @superyusuke/vue-fragment
```

```vue
<template>
  <v-fragment>2</v-fragment>
</template>

<script>
import { VFragment } from '@superyusuke/vue-fragment'
export default {
  components: { VFragment }
}
</script>
```

## 注意
ただし、本家が Fragment を採用していない理由はなにかあるはずなので、このコンポーネントは何らかの問題を抱えている可能性がある。とくにパフォーマンスに関して、あまり高くないかもしれない。使わなくていい場合には使わない方がいいと思われる。

### table を使うのをやめた
ただ、最終的には table を使用するのをやめようと今検討して動いている。table は高さの縦のラインが揃うことが利点だが、反面、スタイリングの自由度は低い。ほかのフロントエンドエンジニアに相談したところ、CSS Grid を使うのがよいのではないか、という結論に至った。IE 11 にも autoprefixer が対応させてくれる。
AWS Cloud9でWordpressを使ってみる~準備編~ 1(PHPとMYSQLのバージョンアップ)

これから4記事?に分けて、
AWS Cloud9でWordpressインストールから、接続してブラウザに移すまでを書いていこうと思います。
今回はインストールする前の準備＆確認編ということで。。

## 前提条件
■ AWSのアカウントをつくった
■ AWS Cloud9の画面で環境を作った
![check.png](https://qiita-image-store.s3.amazonaws.com/0/304122/986a9343-a518-edd9-0475-e75660fd9971.png) [作り方はこちら！](https://qiita.com/iwashito_230/items/119c1df0712804eed147)

## ここでの大まかな流れ
- 今のPHPバージョンを確認。
- PHPの最新バージョンをインストール
- 使用するバージョンの切り替え
- 切り替えできたかの確認
- MySQLdのインストール
- インストールできたかの確認をする
以上6点。

## どこでやるの?
※ 操作はAWS Cloud9の下部にある**ターミナル(bash- “ip-XXX”)**でやていきます。
#### ここ↓
![tarminaru-ichi.png](https://qiita-image-store.s3.amazonaws.com/0/304122/d7c77e9e-f9a4-cc82-0648-02f6a68dc1d7.png)

※ 操作を始める場所は、自分のいまつくってる環境の位置
<font color="MediumSeaGreen">**(ec2-user**</font>**:<font color="DodgerBlue">~/environment)**</font>のままで始めること

心配な人は`$ pwd`で位置を確認
![check.png](https://qiita-image-store.s3.amazonaws.com/0/304122/5d930266-009c-4967-e66e-c9e4b7d54eaf.png)  ` /home/ec2-user/environment`ってでればおｋ!

## 今のバージョンの確認。
(最初から最新版であれば、MYsqlを～まで飛ばしてください)
`$ php --version`

## 最新バージョンをroot権限でインストール

`$ sudo yum install php72`
![check.png](https://qiita-image-store.s3.amazonaws.com/0/304122/5d930266-009c-4967-e66e-c9e4b7d54eaf.png) Is this ok [y/d/N]: て 聞かれたら**y**で**Enter**


## 使うバージョンの切り替える
`$ sudo alternatives --config php `
![check.png](https://qiita-image-store.s3.amazonaws.com/0/304122/5d930266-009c-4967-e66e-c9e4b7d54eaf.png) Enter to keep the current selection[+], or type selection number:ってきかれたら**2**を選択して**Enter**

## 切り替えできたかの確認
` $ php --version`
(7.2になってればOK！)

## mysql もバージョンを上げる(最初から最新のバージョンなら飛ばす)
入っているかの確認
` $  yum list installed | grep php72-mysqlnd`
(何も結果が返ってこない入ってないようだ)

## インストールする
`$ sudo yum install php72-mysqlnd`
![check.png](https://qiita-image-store.s3.amazonaws.com/0/304122/986a9343-a518-edd9-0475-e75660fd9971.png) Is this ok [y/d/N]:て聞かれたら**Enter**をおす

## 入ったかの確認
 `$  yum list installed | grep php72-mysqlnd`
（結果が表示されるようになったらok!）

ここの内容は以上です。お疲れさまでした。

次はこれ
  ![check.png](https://qiita-image-store.s3.amazonaws.com/0/304122/986a9343-a518-edd9-0475-e75660fd9971.png) [80番ポートを空ける](https://qiita.com/iwashito_230/items/b35c85841c573c4585ee)
docker-composeでmongoDB環境を構築して使う

# docker-compose.yml
DockerHubに公式のものがあります
https://hub.docker.com/_/mongo/

公式のものにportsとvolumesを追記しました。
下記のdocker-compose.ymlを配置したフォルダで```docker-compose up -d```すると立ち上がります。

立ち上がったあと```docker-compose ps```で立ち上がってること（```State```が```Up```になっていること）を確認します

```
# Use root/example as user/password credentials
version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    ports:
      - 27017:27017
    volumes:
      - ./db:/data/db
      - ./configdb:/data/configdb

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
      ME_CONFIG_MONGODB_SERVER: mongo
    depends_on:
      - mongo
```
## 各項目の説明

### AdminNameとPassword
この2つはmongoDBとmongo-expressどちらにもありますが、設定するNameとPasswordは同じでなければなりません。

## ports
ポートのマッピングをしています。  
ポートは``` ホスト:コンテナ ```でマッピングするか、コンテナのポートのみ指定します。
コンテナのポートのみ指定した場合、ホストのポートはランダムで決まります。（docker psコマンドの```PORTS```列に表示されます）

## volumes
パスをボリュームとしてマウントします。オプションとしてホスト側のパスを指定（ホスト:コンテナ）しています。  
dbのデータとconfigのローカル：コンテナの指定です。```docker-compose up -d```すると自動でローカルにフォルダとファイルが作られます。

# mongoDBコマンド実行

コンテナへアクセス

```
docker-compose exec mongo bash
mongo admin -u root -p
(docker-compose.ymlに書いたパスワード)
```

testデータベースのhogeテーブルにレコードを追加して確認するサンプル

```
show databases
use test
db.hoge.insert({ name: "test" })
db.hoge.find()
exit
```

# mongo-expressへアクセス
下記URLにアクセスする。

```
http://0.0.0.0:8081/
```

アクセスすると認証が出るので、docker-compose.ymlに入れたAdminNameとPasswordでログインします。

上記のtestデータベースとかがブラウザで見れます。


# mongoDBへのアクセス

Pythonからアクセスするサンプルです。
[pymongo](http://api.mongodb.com/python/current/api/pymongo/index.html)を使ってアクセスしてみます。


## clientの指定

clientのhostはlocalhostではなく、コンテナの名前を指定します。

```main.py
# OKな例
client = MongoClient('mongo', 27017)

# NGな例
client = MongoClient('localhost', 27017)
```

## サンプルコード
コンテナ上のmongoDBにアクセスするサンプルコードです。

```main.py
# coding: utf-8
from pymongo import MongoClient

client = MongoClient('mongo', 27017)
db = client.test_db
collection = db.test_collection

# レコードの全削除
collection.drop()

# 100万件のレコード
collection.insert_many([{"id": i}for i in range(100)])

# idが1のものを探す
results = collection.find({"id": 1})

for result in results:
    print(result)
```


# コンテナを停止する
下記コマンドでコンテナを停止してネットワークを削除します。

```
docker-compose down
```
【自分用】Gini不純度計算関数

pythonの練習用に試しに作ってみた。

参考にしたのは[「はじパタ」](https://www.morikita.co.jp/books/book/2235)と[ここ](http://www.randpy.tokyo/entry/decision_tree_theory)

1列目に「分割したい指標」
2列目に「True/False」
の形をしたdataFrameと、行数を入れる事で計算してくれる。

※検算はしていない

```python:qiita.py

def giniImpurity(df, row_num):
    '''
    Input: A Nx2 dimensional dataframe, row_number (= threshhold value)
    Output: Gini Coefficient
    '''
    # 事前準備
    col_name = df.columns
    N = len(df)
    
    # スレッシュホールドで2分割
    g1 = df.iloc[:row_num, :]
    g2 = df.iloc[row_num:, :]
    
    leng1 = len(g1)
    leng2 = len(g2)
            
    # Gini係数の計算
    if len(g1) == 0:
        g1 = 0
    else:
        g1Y = len(g1.loc[g1[col_name[1]]==True])
        g1N = len(g1.loc[g1[col_name[1]]==False])
        g1 = 1 - ((g1Y/len(g1))**2 + (g1N/len(g1))**2)  # g1[0] = False

    if len(g2) == 0:
        g2 = 0
    else:
        g2Y = len(g2.loc[g2[col_name[1]]==True])
        g2N = len(g2.loc[g2[col_name[1]]==False])
        g2 = 1 - ((g2Y/len(g2))**2 + (g2N/len(g2))**2)  # g1[0] = False
        
    if g1 == 0:
        GiniImpurity = (leng2/N)*g2
    elif g2 == 0:
        GiniImpurity = (leng1/N)*g1
    else:
        GiniImpurity = (leng1/N)*g1 + (leng2/N)*g2
    
    return GiniImpurity

```

# 使い方
全ての値(=分割点)をfor-loopで計算してリストGIに格納する。
事前にdfをソートしておくことと、インデックスをリセットしておくことが必要。


```python:qiita.py
df.reset_index(drop=True, inplace=True)
df.sort_values(df.columns[0], inplace=True)

GI = []
for i in range(len(df)):
    gi = giniImpurity(df, i)
    GI.append(gi)
    
GI = pd.DataFrame(GI)
GI.columns = ['GiniImpurity']

df = pd.concat([df, GI], axis=1)
df.head()
```

式が間違ってるよ！とかあったらコメ下さい。
CSS animation, @keyframesについてちょっと調べてみた

### コード読んでいたら
コードを読んでいたら、そういえばちゃんと書いたことないな。
と思い、ちょっと調べてみました。

### animation
参考:[animation](http://www.htmq.com/css3/animation.shtml)

animationプロパティは、後述する@keyframesを適用する場合に、アニメーションについてまとめ記述できる。
以下の6つの値をまとめることができる。

- animation-name
- animation-duration 
- animation-timing-function
- animation-delay
- animation-iteration-count 
- animation-direction

初期値はそれぞれ以下。指定しない場合は、初期値となる。

- animation-name : none
- animation-duration : 0 
- animation-timing-function : ease 
- animation-delay : 0
- animation-iteration-count : 1 
- animation-direction : normal


### @keyframes
アニメーションの流れに沿ったキーとなるフレームのスタイルを定義する事で、アニメーションの中間ステップを制御できる。
参考：[@keyframes
](https://developer.mozilla.org/ja/docs/Web/CSS/@keyframes)

例えばこんなの

```css:sample.css

@keyframes slidein {
  from {
    margin-left: 100%;
    width: 300%; 
  }

  to {
    margin-left: 0%;
    width: 100%;
  }
}
```

↓こういうパーセントでも指定できる。

```css

75% {
    font-size: 300%;
    margin-left: 25%;
    width: 150%;
}
```


### 例
上の二つを使った、例。

```css
div.sample {
  animation: anime1 5s ease -2s infinite alternate;
}

@keyframes anime1 {
  0% {width: 50px; height: 50px; background-color: aqua;}
  100% {width: 200px; height: 50px; background-color: blue;}
}

```

sampleというクラスに対して、animationを指定している。




### ちなみに
ベンダープレフィックスは、最新版だとつけなくていいらしい。
iOS 8.0 以下や Android 4.4.x系向けに対応したい場合は必要みたい。
参考：[そのベンダープレフィックス、いつまでつけてるの？](https://qiita.com/amamamaou/items/42197e443134478befaf)
AWS Route53とさくらのレンサバのメール設定でハマったこと

## 最初のレコード設定
```
hostname　MX　0 ipaddress
hostname　TXT　"v=spf1 ip4:ipaddress -all"
```

これにより、Gmail等とのメール送受信が可能なことを確認しました。
ところが、AppleID登録時の確認コードを含むメールは届きませんでした。
何故..？

## レコード見直し、設定変更

```
hostname　MX　0 wwwhoge.sakura.ne.jp
hostname　TXT　"v=spf1 a:wwwhoge.sakura.ne.jp -all"
```

* ipではなくホスト名にしてみました
    - ホスト名は コントロールパネルにログイン > サーバ情報の表示 > サーバに関する情報 から確認できます

## レコード伝播を確認
```
$ nslookup -q=txt hostname
```

* まず、変更前に送受信できたメールアドレスで送受信できるか確認
    * この設定でできなくなっていたら恐い..ので。

* AppleID登録の確認コードが届くか確認

* 届いた！解決！！


## 結論
TXTレコード、MXレコードに関して、
ホスト名で設定すると確認コードが届きました。
ip4 だと逆引きになっているのか、ダメでした。

ところで Route 53 の 53 とは？
気になったので調べてみました。
DNSサーバがDNSに使用しているポートが 53 だからだそうです！

SPF設定前後をGmailで確認して気付いた点もついでに。
SPF設定前だと送信元のアイコンが赤いハテナになっており、
SPF設定すると人のアイコンが表示されました。
認証されているのが一目で分かりやすいです！
[Java] ArrayDeque

ArrayDeque is implemented by array. When capacity increased, it will create a new array and copy the old one to new. 

```java
import java.util.*;
import java.lang.reflect.*;

public class ArrayDequePerformance {
  public static void main(String[] args) {
    try {
      long s1 = now();
      ArrayDeque<Integer> q = new ArrayDeque<>();
      for (int i = 0; i < 16777215; ++i) {
        q.add(1);
      }
      long e1 = now();
      System.out.println(e1 - s1);

      Field f = q.getClass().getDeclaredField("elements");
      f.setAccessible (true);
      Object[] ar = (Object[])f.get(q);
      System.out.println(ar.length);

      long s2 = now();
      q.add(1);
      long e2 = now();
      System.out.println(e2 - s2);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  public static long now() {
    return System.currentTimeMillis();
  }
}
```

```
131
16777216
113
```
pipをアップデートするスクリプト

初めての記事がこんなので良いのだろうかと思うのですが、誤記等あればご指摘ください。

# pipをアップデートする

pip-reviewなんかを使うことが一般的かと思います。ただ、``pip-review``とやっても、``pip list -o``とやっても、アップデートすべきリストというのは出てきますが、リストから手動でアップデートしなければなりません。

なので、**python3＋pipを入れている環境限定**になりますが、OSコマンドを発行した出力を引っ張ってきて、すべてアップデートするスクリプトを作ってみました。個別に入れる・入れないを判断する場合には使えません。すべてアップデートされます（本当は1個ずつ「アップデートしますか？」と聞くのが良いのでしょうが）。

python3にパスが通っていることは確認してください。`which python3`で確認することができます。
また、pipが必要です。バージョンによって同梱されていることもあるようです。

```update.py
import subprocess #OSコマンドが実行できるようにします。

print("Update start")

# npmもアップデートしたいときは、以下の2行をコメントインしてください。
# print("Updating: npm")
# subprocess.run(["npm", "update"])

# brewもアップデートしたいときは、以下の6行をコメントインしてください。
#print("Updating: brew")
#subprocess.run(["brew", "update"])
#print("Updating: brew")
#subprocess.run(["brew", "upgrade", "--clean"])
#print("Cleanup: brew")
#subprocess.run(["brew", "cleanup"])

print("Updating: pip")

# UPDATE_LISTに、コマンド実行の結果をそのまま格納します。
# コマンドは空白を使えないので、空白ごとにカンマで区切ります。
# 以下では、[pip lise -o]を実行し、その結果を格納しています。
UPDATE_LIST = (subprocess.run(["pip", "list", "-o"],stdout=subprocess.PIPE))

# 出力の結果を行単位に分割します。
Packages = str(UPDATE_LIST.stdout).split('\\n')

# 出力の先頭2行はタイトルと区切り線なので、捨ててしまいます。
# パッケージ名とバージョン番号のセットで出てくるので、空白で区切った先頭をパッケージ名として取得します。
# そのパッケージ名を [pip install -U] します。
#　uasiさんからコメントをいただきましたので修正しました。ありがとうございます。
for package in Packages[2:]:
    name = package.split()[0]
    print("Updating: " + name)
    subprocess.run(["pip", "install", "-U", name])

print("Update finished.")
```

もうちょっとこなれた書き方にすべきとは思いましたが、動作確認のできる環境がないので、みなさんからのコメントを伺いながらブラッシュアップしていきます。

## 動かすとき
`python3 ./update.py`

## 動かした結果
```
$ python3 ./update.py
Update start
Updating: npm   
Updating: brew
Updated 2 taps (homebrew/core and homebrew/cask).
==> Updated Formulae
bup                         imagemagick                 libsoup
gjs                         imagemagick@6               varnish
==> Deleted Formulae
taylor                                    tcptrack
Updating: brew　
Cleanup: brew
Updating: pip
Update finished.
$
```
AWS Cloud9の画面での環境の作りかた

何番煎じだよってｗ感じですが、まとめてみました。


### 前提条件
AWS のアカウント作った！の方であること


## ここでの大まかな流れ
- AWS cloud9の項目を開く
- 作りたい環境名と、説明を書き書き
- 作りたい環境の接続設定を確認
- 最終確認画面で、再度確認したらボタンをぽちー

以上、4点。
## AWS cloud9の項目を開く
![search.png](https://qiita-image-store.s3.amazonaws.com/0/304122/c5ba3c13-e265-a587-97dd-7a6f7f0196de.png)
<font color="SteelBlue">**Cloud9**</font>と検索して、結果のリンクをクリック

## 作りたい環境名と、説明を書く
![env1.png](https://qiita-image-store.s3.amazonaws.com/0/304122/cb4a88e1-a452-0fd2-fc3b-f786439b328e.png)
できたら、[Next step]をクリック


## 作りたい環境の接続設定を確認
![env2.png](https://qiita-image-store.s3.amazonaws.com/0/304122/38ec4f00-5fcc-544f-7320-d1a9c213cf8f.png)
大体はそのまま[Next step]をクリック。

##　最終確認画面で、再度確認

![env3.png](https://qiita-image-store.s3.amazonaws.com/0/304122/d47ed547-75a5-ec34-8560-73aac5bee17e.png)

 よければ[Create environment]ボタンをぽちー。

## 結果
![deta.png](https://qiita-image-store.s3.amazonaws.com/0/304122/e4280ac9-54f2-7ec6-dfe7-677344bbf1e2.png)
が表示されればOK！
Ubuntuが起動しなくなったとき

# 環境
Ubuntu 18.04.1 LTS (Bionic Beaver)
ThinkPad X230
![IMG_0166.JPG](https://qiita-image-store.s3.amazonaws.com/0/68213/458c9811-7bea-6d3c-ac68-146c7b4ab111.jpeg)

# 対策
Recovery modeに入りcleanとdpkgを実行する。
ディスク容量不足が原因だったっぽい。
![IMG_0165.JPG](https://qiita-image-store.s3.amazonaws.com/0/68213/b8bd92fa-7c1a-1882-e17d-87d97ddf239e.jpeg)
skimage.io.imreadでどのプラグインが早いのか比べた


* `skimage.io.imread()`する時に、バックエンドに使うライブラリを指定する事ができる。
* この時、どのライブラリが高速に読み込みを行えるのか比べてみた。

環境や読み込むファイルの性質によって当然変わってくるはずなので、各自の環境で試してみた方が良い。この記事は測定方法の例示のために書いた。

# skimage.io.imreadのpluginオプション

以下のように読み込みで使うプラグインを指定できる。

```python
# matplotlibで読み込む
skimage.io.imread(fname='lenna.png', plugin='matplotlib')

# pilで読み込む
skimage.io.imread(fname='lenna.png', plugin='pil')
```

* 公式サイトのこの辺りに説明が書いてある。
    * http://scikit-image.org/docs/stable/api/skimage.io.html#imread

> plugin : str, optional
Name of plugin to use. By default, the different plugins are tried (starting with the Python Imaging Library) until a suitable candidate is found. If not given and fname is a tiff file, the tifffile plugin will be used.

* 対応しているプラグインの一覧は、`skimage.io.find_available_plugins()`で調べられる。
    * http://scikit-image.org/docs/stable/api/skimage.io.html#skimage.io.find_available_plugins
    * 実行中の環境にインストールしていないプラグインも出てくるので、必要ならインストールする。

# 測定

インストールしていないプラグインは除外して以下のように測定した。

```python
import skimage.io

plugins = skimage.io.find_available_plugins()

for name in plugins:
    # 除外
    if name in ['qt', 'gdal', 'gtk', 'simpleitk', 'fits', 'tifffile']:
        continue
    
    print(name)

    skimage.io.use_plugin(name)
    %timeit skimage.io.imread(fname='lenna.png', plugin=name)

    print('---')
```

参考までに私の環境での測定結果を載せておく。

```
imread
8.88 ms ± 2.08 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
---
pil
20.1 ms ± 892 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
---
matplotlib
37.8 ms ± 6.65 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
---
imageio
25.1 ms ± 5.67 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
---
```
パスワード変更時の再入力が一致しない件

### 経緯
はるか昔に登録していた Qiita のユーザ名を変更しようとしたら、パスワードの登録が必要なようでした。GoogleやTwitter連携でログインしていたので、パスワードを登録していませんでした。その際に、「パスワードの再入力」で30秒ほどハマったのが気になったので記載します。

### Qiita のパスワード変更
「設定 > [パスワード](https://qiita.com/settings/password)」で変更画面を表示できます。

### 事象
パスワードは、思い浮かべた単語の組み合わせか、ジェネレータで生成されたものをよく使います。
今回は、思い浮かべた単語の組み合わせます。
パスワード入力欄と再入力欄に軽快に入力し[Enter]します。

// 脱線しますが、パスワード欄にペーストさせないサイトもあるようですが、Qiitaは許可しているようですね。
// 調べるとUIとセキュリティの勉強になりそうです。

"Password confirmationとパスワードの入力が一致しません" の悲しい文言が表示されました。
完全にタイポと思い再入力しましたが、状況は変わらずでした。
[Enter]押す前に入力欄の ● を見ると、再入力欄の方がわずかに長いことに気が付きました。
// inputタグの type が "password" のときに表示される ● です。

確認したところ、初回の入力途中で勝手に文字が削除されてしまうようです。
// うまく説明できませんが、●●●●● と入力すると、一瞬の後、●●●● になります。

### お勉強

素人ですが、ソースを見てみることにしました。
inputタグはこちら。

```HTML
<input class="st-Form_text" required="" maxlength="32" type="password" name="user[password]">
```

class="st-Form_text"のCSSはこちら。

```CSS
.st-Form_text {
    display: block;
    width: 100%;
    font-size: 1.6rem;
    background-color: #fff;
    border-radius: 3px;
    border: 1px solid #ccc;
    transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
    padding: 8px 16px;
    cursor: text;
    margin-top: .6em;
}
```

transitionが気になり ease-in-out の時間を変えたりしてみましたが、関係する挙動はなさそうでした。

では、パスワード強度判定かなと思い header を見てみると、こちらがありました。

```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/zxcvbn/4.4.2/zxcvbn.js"></script>
```

[AGILE社のWebサイト](https://www.agilegroup.co.jp/technote/zxcvbn.html#jump4)から zxcvbn.js の使い方を確認します。

実際に、zxcvbn の処理を行っている以下の .js をダウンロードして試してみようとしましたが、、
・https://cdnjs.cloudflare.com/ajax/libs/zxcvbn/4.4.2/zxcvbn.js
・https://cdn.qiita.com/assets/public/bundle-70a524d8910b351d2a389235c5312375.min.js

ChromeDevToolでエラーになりました。もう少し工夫が必要そうです。

```
bundle-70a524d8910b351d2a389235c5312375.min.js:1 Uncaught TypeError: Cannot read property 'dataset' of null
    at bundle-70a524d8910b351d2a389235c5312375.min.js:1
    at bundle-70a524d8910b351d2a389235c5312375.min.js:1
```

ここまでで予想としては、1文字入力する毎に判定処理が走っているので、強度判定の処理に時間がかかるのかなと思います。
が、なぜ文字が消えるのかまではわかっていません。
もしかして、強度判定が終わった文字列を、input要素に挿入しているのかもしれません。

時間があるときに引き続き調査します。
// inputタグの maxlength="9999" にして試してみたら、PCが暖かくなりました。
英語のメニュー項目や見出しはセンテンスケースとタイトルケースどちらにすべきか？

例えばホームページの英語版を作成していて、`トップへ戻る`というリンクを`Back to top`と`Back to Top`のどちらの表記にしたらいいか迷ったことはないだろうか？

- `Back to top`スタイル（`センテンスケース`という）
    - 文の先頭や固有名詞の先頭だけをキャピタライズする
    - 学校で習う普通の大文字の使い方
- `Back to Top`スタイル（`タイトルケース`という） 
    - 前置詞・冠詞以外をキャピタライズする（[実はもう少し複雑なルールがある](http://www.sanctio.jp/archives/10355)）
    - `Crime and Punishment`など、本のタイトルはこちらが多い
    - `Department for Transport`のように部署名もこちらが多い

同じ政府系サイトでも、https://www.usa.gov/ はタイトルケースで、https://www.gov.uk/ はセンテンスケースになっている。新聞は多くがセンテンスケース、ただしThe New York TimesとThe Wall Street Journalはタイトルケースらしい。**つまり、どちらのスタイルを選ぶかは編集者しだいのようだ**。

ネイティブにとっては

>Which of These Sentences is Easier to Read?
>Which of these sentences is easier to read?

前者より後者の方が読みやすいようで、見出しにおいてはセンテンスケースが推奨されることが多いようだ。
しかし論文や本のタイトルなど、タイトルケースが慣習になっているところではそれに従ったほうがいいだろう。

## 参考
- [STUDIO » 英語タイトルの大文字ルール: 11の注意点](http://www.sanctio.jp/archives/10355)
- [Writing for the Web #2: Titles and Headings | Web Services Blog](https://swsblog.stanford.edu/blog/writing-web-2-titles-and-headings)
ChefTips: Chef Serverバックアップ・リストア時の考慮点

## 概要

以下の記事で、Chef Serverのバックアップ・リストアについてご紹介しました。

[ChefTips: Chef Serverのバックアップについて](https://qiita.com/kentarok/items/61af5ba7eae836b56b2a)
[ChefTips: Chef Serverのリストアについて](https://qiita.com/kentarok/items/15680076cb9fb5f736ea)

Chef Server を 自己証明書で運用しており、Chef Server リストア後、WorkstationとNodeがChefServerに接続できなくなる事象が発生した場合の考慮点についてご紹介します。

## 発生する事象

Chef Serverリストア後、Workstationから`knife`コマンドを使用した場合、以下のようなエラーがでます。

```
$ knife node list
ERROR: SSL Validation failure connecting to host: sjkcent01.chef.local - SSL_connect returned=1 errno=0 state=error: certificate verify failed (self signed certificate)
ERROR: Could not establish a secure connection to the server.
Use `knife ssl check` to troubleshoot your SSL configuration.
If your Chef Server uses a self-signed certificate, you can use
`knife ssl fetch` to make knife trust the server's certificates.

Original Exception: OpenSSL::SSL::SSLError: SSL Error connecting to https://sjkcent01.chef.local/organizations/test/nodes - SSL_connect returned=1 errno=0 state=error: certificate verify failed (self signed certificate)
```


Chef Serverリストア後、Nodeから `chef-client`コマンドを使用した場合、以下のようなエラーがでます。

```
Unexpected Error:
-----------------
OpenSSL::SSL::SSLError: SSL Error connecting to https://sjkcent01.chef.local/organizations/test/nodes/sjkcent02 - SSL_connect returned=1 errno=0 state=error: certificate verify failed (self signed certificate)
```

## 事象が発生する原因

trusted_certs として Workstation、Nodeに保管している Chef Serverの証明書 と、Chef Serverが実際に使用している自己証明書が不整合を起こしているために発生します。

どうやら、`chef-server-ctl backup` `chef-server-ctl restore` コマンドは、Chef Server同梱のNginxが利用しているSSL証明書はバックアップ・リストアしてくれないようです。そのため、`chef server-ctl restore`後の`chef-server-ctl reconfigure`で自己証明書が再作成されてしまい、不整合が発生します。

ちゃんとしたCAから発行されるSSL証明書同様、自分で管理しておいてね、ということのようですね。（公式マニュアルにその記述はないのは不親切ですが…）

### 自己証明書のデフォルトの保管場所

#### Chef Server:
```
$ pwd
/var/opt/opscode/nginx/ca
$ ls -l
-rw-------. 1 opscode opscode 1489 Oct 22 05:10 sjkcent01.chef.local.crt
```

#### Chef Workstation:
```
$ pwd
（Chefレポのパス）/.chef/trusted_certs
$ ls -l
-rw-r--r--. 1 root root 1489 Oct 22 21:10 sjkcent01_chef_local.crt
```

#### Chef Node:
```
$ pwd
/etc/chef/trusted_certs
$ ls -l
-rw-r--r--. 1 root root 1489 Oct 22 21:14 sjkcent01_chef_local.crt
```

## 対応策

Chef Workstaion では、Chef Workstaionの初期設定時同様、`knife ssl fetch` で解消できます。
Chef Client では、以下のいずれかの方法で対応が可能です。

### 1. 全Chef Nodeで fetch処理実施

全Chef Nodeで Workstaion同様、`knife ssl fetch` する方法です。
Workstaionから以下コマンドで、全Chef Nodeに対して爆撃可能です。

```
$ knife ssh 'name:*' 'sudo knife ssl fetch -c /etc/chef/client.rb'
```

### 2. 予め自己証明書もバックアップしておく

Chef Server側で`chef-server-ctl backup`する際に、合わせて `/var/opt/opscode/nginx/ca`配下の自己証明書もバックアップをしておく方法です。
`chef-server-ctl restore`後、そのバックアップしておいた自己証明書を既定の場所に保存してください。

### 3. 予めChef NodeのSSL検証を無効化しておく

Chef Client が Chef Server に接続する際のSSL検証を無効化する設定も可能です。
Chef Client 側の設定ファイル `/etc/chef/client.rb` に 以下一行を追加してください。

```
ssl_verify_mode :verify_none
```
SVNの"previous operation has not finished”の解決方法

### はじめに
SVNの操作中に上記エラーが出てCleanupしろとのメッセージが出ていたのですがCleanupが失敗し操作ができなくなってしまいました。
その解決方法になります。

### 環境
Windows 7 64bit
Subversion 1.9.2
TortoiseSVN 1.9.2

### 解決法
SQLiteを以下よりDL
`https://www.sqlite.org/download.html`

Windowsの場合c:\とかに解答して適当にPathを通しておく。

ローカルのワーキングコピーのルートに移動
`cd C:\work\hoge`

以下を実行して`work_queue`を確認
`sqlite3 .svn/wc.db "select * from work_queue"`

Errorなしでなにかあるようなら`work_queue`ごと削除する
`sqlite3 .svn/wc.db "delete from work_queue"`

あとはTortoiseSVNでCleanupを実行すると操作できる様になりました。


#### 参考
以下参考
https://stackoverflow.com/questions/10128201/subversion-stuck-due-to-previous-operation-has-not-finished
【PHP】拡張子を「*」に変更する

※下記コードでは問題があります。コメントで指摘して頂いてる修正を時間があるときに行います

#拡張子を「*」に変更する

使用用途としては
クラウドフロントでキャッシュの削除とか、拡張子が大文字小文字混ざってる時とか結構限定はされているけれど

```
//拡張子の取得
$extension = substr(○○○.png, strrpos(○○○.png, '.') + 1);
//拡張子を「*」に置換
$filename = str_replace($extension,'*',○○○.png);
```

※例は静的にpngになっているけれど、実際使い所としてはJPGが来たりPNGが来たりpngが来たりjpgが来たりとかややこしい場合に使える
参考
https://qiita.com/kijtra/items/d25679684a46b8f8dcfd
コードレビューを効率化するちょっとした工夫

[コードレビューを行う時に意識したいこと](https://qiita.com/cschappert/items/11da059155ec371b8ba8) を読んで、僕らのチームでコードレビューするときにしている工夫と、それをやって良かったことを書きました。

# コメントにラベルを付ける :label: 
GitHubでテキストベースでのコードレビューするにあたって私達のチームでは以下のようにレビュー指摘コメントにラベルをつける事にしています。

* [MUST] 必ず直すべき良くないコードに。

* [IMO] 私はこう思います。こうした方が良いのでは？ 意見や緩やかな指摘。

* [nits]ほんの小さな指摘。インデントミスなど細かいところに。

例:

```
[MUST] publicではなくprotectedの方が良いな。
[MUST] ここでエラーになったらどうなるの？

[IMO] ここはメソッドに分けた方が良いですね。
[IMO] array_mergeより+=が良さそう。

[nits] インデントがズレてるよ！！
```

まず、上記のようなありがち?なコメントにラベルをつけて見ました。
このラベルをつける事によって以下のような良い事がありました。

## レビュイー(レビュー受ける側) :boy_tone1: 
  * レビュワーの温度感を文章から汲み取る必要がない
  * コメント対応の優先度をつけることが出来る
  *  納期が迫っている場合、まずは[MUST]だけ対応してリリースを行う等の判断材料になる
 
## レビュワー(レビューする側) :man_tone1: 
  * 相手に誤解されないような文章を考える手間が減る
  * 相手を傷付けないように気を使う手間が減る
  * 相手にどのように直して欲しいのかを具体的にまた理由を添えて書く意識を持てる

何かとコミュニケーションコストについて課題の多いコードレビューですが、この小さな工夫だけで、時間的、精神的にも負担が減ったと感じています。

例にはあえて曖昧なコメントを載せました。

もし、ラベルがなかったら、「〜が良いかな」という表現は優先度が低そう、「！！」が付いているからここは直さないと等、レビュワーの意図とは違うニュアンスで伝わってしまう可能性があります。

コメントする側も[MUST]というラベルを付けることによって、

```
[MUST] publicではなくprotectedの方が良いな。
```
　⬇

```
[MUST] このプロパティはprotectedにすべきです。なぜなら◯◯だから。
```
のような書き方に変わっていき、ここを絶対に直して欲しいのか、あるいは別のより良い方法を共有したいのか、ただのボヤキなのか等を意識し易くなります。そのように責任を持ってコメントすることにより、先程書いたとおりレビュイーの負担も大きく減ると考えています。

## 注意 :exclamation:
*  **ラベルの数はあまり増やさないほうが良い**   
  チームに最適なラベルを設定するべきですが、あまり増やしすぎるとラベルの境界線の定義が曖昧になるので、これどのラベルかな、と無駄な思考が働いてしまうし覚えられない
*  **ルールではない**  
  これは工夫であってルールではありません。 質問のときはどのラベル？とかも面倒なので明らかに質問と分かればあえて専用のラベルを作る必要は無いと考えています。伝われば良いんです。


**ちなみにこの投稿で書いた事は [IMO] です。**

## 参考
こちらのスライドは他にもプルリクエストについて面白い事が書いてあるのでリンクさせていただきます。
[pull request を利用した開発ワークフロー by Yuichi Tateno]
(https://speakerdeck.com/hotchpotch/pull-request-woli-yong-sitakai-fa-wakuhuro)
Kaggleの始め方がわからなかったので聞いてみた

Kaggleにログインしてみたけれども何をすればよいかわからなくて諦めた、自分と同じ状況の人向けの記事です。

自分は、昔、Kaggleの入門向けの問題（タイタニック）をやった。
しかし、他の競技プログラミングと雰囲気が違うのでよくわからず放置していました。
そして、昨日、競技プログラミング銭湯Off会に行った時にKaggleをやってるかたがいたので聞いてみました。

以下、適当な雑談であり、また、私個人に向けて頂いた助言を元に書いたので一般論でもないため、ご利用の際にはご注意ください。

**Q.昔、タイタニックの問題をやったが、次は入門用のデジット・レコガナイザの問題をやったほうがいいのか？**
A.
入門用ではなく他のコンペティションをやったほうがいい。


**Q.どのCompetitionをやったほうがいいのか？**
A.
①問題の傾向から選ぶ。
深層学習系とそれ以外の２種類ある。
深層学習が好きならそれをやる、そうでなければそれ以外をやったほうがいい。
見分け方は問題を読む。画像は深層学習の場合が多いかも。

②Tiersがつくものを選ぶ
Tiers(将棋で言えば段級みたいなもの）がつくコンペティションをやったほうがいい。
TiersがつくのかはCompetitionのoverviewの下の方に書いてある。
rank pointsについてはtiersほど重要でないので気にしなくて良い。
<img width="1022" alt="スクリーンショット 2018-10-23 10.13.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/138773/0a5651fa-02c3-b05d-4ce7-fb767196e632.png">

問題の種類によってある程度tiersがつくかわかる。
Play ground ← tiersがつかない
Getting started ← tiersがつかない
Research  ← 問題による
Featured ← tiersがつく

<img width="1054" alt="スクリーンショット 2018-10-23 10.02.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/138773/1037b157-5e34-bde8-847e-fbcc7f1e6ece.png">


**Q.Competitionに参加してもデメリットはないか？**
A.
参加してもtiersが下がらないので特にデメリットはない。
そのため参加しても実際にやる人は３割程度。

**Q.Kernelsって何？**
A.
ノウハウの共有。
初めのうちに1日で書いたスクリプトを公開したりよくしてくれる。
最後のほうに高度なノウハウを公開してくれる人は多分いない。


**Q.Discussionって何？**
A.問題についてDiscussionする場。競技中でもDiscussionができる。


**Q:競技中に解法を情報共有してもいいの？**
A.KernelsとDiscussionに書き込むこと、またチーム内の共有はOK。
それ以外、例えば自分のブログに書くなどはダメ。
（詳細は規約をご確認ください）

**リンク**
[Kaggle]
(https://www.kaggle.com)

[Kaggle事始め]
(https://qiita.com/taka4sato/items/802c494fdebeaa7f43b7)
Winter'19：Einstein Analytics 新機能メモ(Amazon S3 コネクタ)

Winter'19 がリリースされたので、Einstein Analyticsに追加された新機能をメモ。
S3との連携がサポートされるようになりました。
## リリースノート
Amazon S3 コネクタを使用した複数の CSV ファイルの読み込みと追加
https://releasenotes.docs.salesforce.com/ja-jp/winter19/release-notes/rn_bi_integrate_connectors_s3.htm
## Good
- ノンコーディング・外部ツール不要でS3からの連携が実現できた。
- 高速に処理できる。(合計100万行程度の複数のCSVファイルを数秒で処理)

## Bad
- フォルダの指定が必須なため、バケット直下にあるCSVファイルが連携できなかった。
- リージョンの指定がコードじゃない。
 - **ap-northeast-1**だとNG。**Asia Pacific(Tokyo)**で設定する。(※半角スペースに注意)
- 連携項目を定義しているファイル(schema_sample.csv)に含まれるデータも取り込まれてしまった。
 - **schema_sample.csv**はヘッダ行だけにしておく。

## 所感
手軽にファイルサイズの大きいファイルを扱えるS3と、それを分析できるEinstein Analyticsの相性がとても良い。
Badな部分の改善と、エンドユーザーに優しいファイルのアップロード周りの機能追加に期待。
C#でFireStoreにクラスのデータを入れる

# C#でFireStoreを使いたい
FireStoreをC#で使いたい時はを[nuget](https://www.nuget.org/packages/Google.Cloud.Firestore/
)で入れてると思うのですが、クラスのデータをそのままFireStoreにAddしたい時に型のマッピングが上手くいかなくてエラーが出てました。
[公式ドキュメント](http://googleapis.github.io/google-cloud-dotnet/docs/Google.Cloud.Firestore/api/Google.Cloud.Firestore.html)でFirestoreDataAttributeをつければいいと分かったので自分用のメモも兼ねて久々投稿です。

## FirestoreDataAttributeとFirestorePropertyをつける
例えばローカルのxmlを読み込んでそのクラスをfirestoreにaddするケースです。

```C#:C#
using Google.Cloud.Firestore;
using System;
using System.IO;
using System.Xml.Linq;

namespace FirestoreSample
{
    class Program
    {
        const string ProjectId = "自分のProjectId";
        static void Main(string[] args)
        {
            // API とサービスの認証情報でサービスアカウントを作成し、
            // ダウンロードしたアクセスキーファイルのパスを環境変数で指定
            Environment.SetEnvironmentVariable(
                "GOOGLE_APPLICATION_CREDENTIALS",
                Path.Combine(AppContext.BaseDirectory, "jsonファイルのパス"));

            XElement readXml = XElement.Load("Test.xml");
            var TestXml = new TestXml(readXml);
            var db = FirestoreDb.Create(ProjectId);
            //ここでfirestoreにデータ追加
            db.Collection("testxml").AddAsync(TestXml).Wait();
        }

        [FirestoreData()]
        public class TestXml
        {
            public TestXml() { }

            public TestXml(XElement xmlTecMLXml) => TestXmlXElement = xmlTecMLXml;
            //XElementはマッピングでエラーになるので登録しない
            public XElement TestXmlXElement { get; private set; }
            //登録したい名前をつけれる
            //なにもない場合はそのまま
            [FirestoreProperty("test_xml_string")]
            public string TestXmlString => TestXmlXElement.ToString();
            //クラスもできる
            [FirestoreProperty]
            public Child Child => new Child() { XmlChild = TestXmlXElement.Element("Child") };
        }

        [FirestoreData()]
        public class Child
        {
            public XElement XmlChild { get; set; }
            [FirestoreProperty]
            public string Test1 => XmlChild.Element("Test1").Value;
            [FirestoreProperty]
            public int Test2 => int.Parse(XmlChild.Element("Test2").Value);
        }
    }
}
```

```xml:Test.xml

<?xml version="1.0" encoding="UTF-8"?>
<Test>
    <Child Index="0">
    <Test1>test1</Test1>
    <Test2>2</Test2>
    </Child>
</Test>
```

## データ
いい感じでデータ入ってますね
![image.png](https://qiita-image-store.s3.amazonaws.com/0/61773/74d81d40-1a9b-6f3f-5166-385063159689.png)

## 生ソースで実行
実際にデバッグ実行などをソースでしたい場合は
[ソースコードを取ってきて](https://github.com/googleapis/google-cloud-dotnet)、Google.Cloud.FirestoreとGoogle.Cloud.Firestore.V1Beta1をプロジェクトに加えて参照してあげればできます

## nugetのGoogle.Cloud.Firestoreのversionが1.0.0に！
[公式のドキュメントページ](https://firebase.google.com/docs/firestore/quickstart?hl=ja)にもC#の欄が増えました！

やったね～♪
UiPath開発ではまった点 随時更新



## エラーメッセージ
#### Compiler error(s) encounterd processing expression "st.IsNullOrEmpty".
これらの引数に最も固有な、アクセス可能な 'IsNullOrEmpty'がないため、オーバーロードの解決に失敗しました:
## 実装
```
string st
st.IsNullOrEmpty

```

## 解決
```
string st
String.IsNullOrEmpty(st)

```

## 参考にした
[UiPathリリースノート](https://www.uipath.com/ja/products/release-notes/uipath-v2018.2.2)

### 戯言
Studioのバージョンは2018.1.xなのになぜエラーが発生したのだろうか...

---
# TYpe Into
## 事象
Type into アクティビティ “:”(コロン) や “_”(アンダーバー/underscore) の入力ができない
type into で “test : " +”"+“テスト” という文字列を設定したところ、
""(アンダーバー) -> “=”(イコール)
“:”(コロン) -> “*”(アスタリスク)
に変換される。
## 環境
windows 10
## 解決
type into ではなく、クリップボードを活用する。
1. Set to clipboard Activityでクリップボードに入力したい文字列をセット
2. Send Hotkey Activityを用いて ctrl + vで貼り付け
## 参考
ここで解決しました
https://forum.uipath.com/t/type-into-underscore/56647

---
## Send Hotkey - エクセルをショートカットキーで操作する
Send HotkeyのPropertiesペインに「SpecialKey」という項目があります。
ここにチェックが入っていないこと!!

※ここにチェックが入っていると、「Key」欄に入力した文字列が特殊文字とみなされる。

---
## エラーメッセージ
### UiPath.Core.Activities.OrchestratorHttpException: Could not find an asset with this name.
OrchestratorのAssetに使用しようとしているAsset名が登録されていない