OmniAICreator/Qiita-1.07M huggingface dataset:
ffmpegのdrawtextで中央に文字を置く [WIP]

実験しながらのまとめ記事的なやつなので、あとで説明とかは付け足します。
今回の目的: 丁度中央に文字を配置したかった

尚、**文字やフォントによって値は違う**と思われるのでご了承ください。

---

# ffmpegについて

[あとで書く]

# drawtextについて

[あとで書く]

# 先に結論

今回の場合、 **`x=750`/`y=700`で大体中央に来ました**

<img width="1269" alt="スクリーンショット 2018-11-15 20.55.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/222594/7505aa93-f887-9869-f3ac-ab9d7692ce4f.png">


# 試行錯誤資料

画素数とかで数えているのだと思いますが、各設定と結果を貼り付けていきます。
尚`x`/`y`以外の基本的な設定は以下の通りです

```bash
ffmpeg -i end.mp4 -vf drawtext="/Library/Fonts/Bradley Hand Bold.ttf: text='wait 4 the first video...': fontcolor=white: x=<x>: y=<y>: fontsize=100"  end_with_text.mp4
```

## `x=100`/`y=300`

<img width="1274" alt="スクリーンショット 2018-11-15 20.26.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/222594/ddcd48e1-efe5-1b9f-5234-1cb9d0f35c0f.png">

## `x=1000`/`y=800`


<img width="1275" alt="スクリーンショット 2018-11-15 20.32.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/222594/8a3c545b-ca76-85d1-5611-6cc1765dfac3.png">

## `x=800`/`y=700`

<img width="1276" alt="スクリーンショット 2018-11-15 20.35.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/222594/c7e1c22f-efbd-bc4e-4d0f-c3126d7d1509.png">

## `x=500`/`y=700`

<img width="1267" alt="スクリーンショット 2018-11-15 20.41.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/222594/0dd36ca7-c425-1faa-9f78-e4844cd4431a.png">

## `x=600`/`y=700`

<img width="1265" alt="スクリーンショット 2018-11-15 20.43.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/222594/fb3a0dca-f806-1af0-9881-530ec7016ffd.png">

## `x=700`/`y=700`

<img width="1271" alt="スクリーンショット 2018-11-15 20.49.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/222594/62f7425f-c528-dada-0c69-1acaa067e021.png">

## `x=750`/`y=700`

<img width="1269" alt="スクリーンショット 2018-11-15 20.55.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/222594/7505aa93-f887-9869-f3ac-ab9d7692ce4f.png">
【AWS CodeDeploy】AWS CodeDeployでのデプロイに失敗する。【Error code: HEALTH_CONSTRAINTS】

##【事象】
デプロイメントパイプラインをAWSのサービスで作っていた際に、AWS CodeDeployでのデプロイに失敗して辛かった話。

##【解決】
デプロイ対象のEC2に、IAMロールが足りていなかったので付け足したらうまくいった。

##【詳細】
デプロイに失敗し、下記のようなエラーがでた。

```
The overall deployment failed because too many individual instances failed deployment, too few healthy instances are available for deployment, or some instances in your deployment group are experiencing problems. (Error code: HEALTH_CONSTRAINTS
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/error-codes.html?icmpid=docs_acd_console#ecode_health_constraints
```

AWSのエラーメッセージは、都度都度ドキュメントに飛ばしてくれるのでありがたいですね～。
エラーメッセージは、なんかFailしたことくらいしかわかりませんが、エラーコードもURLも確認できました。
これならすんなりいけるはず。さて、URL先を見てみます。

**Error code: HEALTH_CONSTRAINTS**
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/error-codes.html?icmpid=docs_acd_console#ecode_health_constraints
>デプロイに失敗した個別のインスタンスが多すぎる、デプロイに使用できる正常なインスタンスが少なすぎる、またはデプロイグループの一部のインスタンスで問題が発生しているため、全体的なデプロイが失敗しました。


**(´ω｀)** 和訳しただけかと、その問題を言ってくれと....。


ここから、AppSpec File、時間ずれ、エンコード、ファイルのパーミッション等々、調べていったものの
何れも自体には問題ない模様...。
→AWSのサービスそのものの問題から、お叱りを頂いているのかもしれません。

##あーっ！お客様！困ります！あーっ！！
エラーメッセージの `Error code: HEALTH_CONSTRAINTS` からドキュメントを読んでみましょう。

>AWS CodeDeploy デプロイのログデータの表示
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/deployments-view-logs.html

なにやらAWS CodeDeployは、エージェント型だけあって、ログを保持してくれている模様です。
ていうか、CloudWatchってここ読んでんだ。へぇ～。

実際に実機の `codedeploy-agent` のログを確認してみると、きっちりエラーが出ていました。
※codedeploy-agent のログファイルは、 /var/log/aws/codedeploy-agent/codedeploy-agent.log がデフォです。

```
# tail -F /var/log/aws/codedeploy-agent/codedeploy-agent.log
ERROR [codedeploy-agent(8311)]: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Missing credentials - please check if this instance was started with an IAM instance profile

僕は癖で使っているのですが、 `tail` の `-F` 便利ですよ～。
ファイル上書きにも対応できるので、再現性テストの際には `-F` をおすすめしたく...。
```

さてさて、内容としては、「IAMの設定とかをきっちり見なさい」と出ていました。
EC2のIAMの設定を見てみると、必要な権限をEC2にアタッチしていなかったことが判明しました。
→IAM ロールを対象のEC2にアタッチ　→　codedeploy-agentをrestart　→　再デプロイ　→　無事 SUCESS!!!!
###ありがたきドキュメント集
・IAM ロールのアタッチ
　Amazon EC2 の IAM ロール
　IAM ロールをインスタンスにアタッチする
　https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#attach-iam-role

・必要なポリシー等が書かれたドキュメント
　AWS CodeDeploy でアイデンティティベースのポリシー (IAM ポリシー) を使用する
　AWS CodeDeploy での AWS 管理 (事前定義) ポリシー
　https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/auth-and-access-control-iam-identity-based-access-control.html


#参考
『続・終物語』が2018年秋より、全国劇場にてイベント上映
https://www.monogatari-series.com/news/?article_id=45902
ついに公開ですね～。
`常に半年先のアニメ事情を知っておく` というのもキャリア形成上大事ですね。

AppSpec File の構造
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file-structure.html

AWS CodeDeploy での AWS 管理 (事前定義) ポリシー
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/auth-and-access-control-iam-identity-based-access-control.html
【初心者向け】Eclipseでのデバッグ方法

# 1.はじめに

IDE(統合開発環境) がIntegrated なのはエディタ上で「デバッグ」ができるから。
IDEでデバッグができることで、生産性が上がる。
デバッグすることが[勉強になる。](https://qiita.com/YudaiTsukamoto/items/42a8df22ca4c6b327dfd#4-%E5%8B%89%E5%BC%B7%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%82%92%E8%A1%8C%E3%81%AA%E3%81%86)

## 1.1.この文章の対象

- 対象環境: Eclipse。バージョンは気にしない。
- 対象者: Eclipseとデバッグの初心者。
- 対象言語: Java。バージョンは気にしない。

## 1.2.デバッグ、デバッガって何

バグの原因を調査し、修正するのが「デバッグ」。

プログラムにバグがあったときにの原因調査のために利用するツールが「デバッガ(debugger)」。

デバッガは、
- 「ブレークポイント」でプログラムを一時停止し
- その時点の変数などの値を見たり、1行ずつなど動かして、プログラムの動作を見て
- どこで想定と違う動きとなるか、といった調査を行う
というように利用する。

## 1.3.なぜ、デバッガがいるの？

バグがあるから。
全部想定どおり動けば要らない。

プログラムを動かすと、想定と異なるデータ、考慮不足の設計、
コーディングミスなど様々な原因でバグが発生する。
(想定どおり動いているよね、という確認に利用することもあります。)

# 2. 使い方

## 2.1.「ブレークポイント」 と その設定

「ブレークポイント」とは、一時停止させるプログラムの行のこと。  
プログラムの「エディター」ウィンドウの一番左側をダブルクリックすると、ブレークポイントとして設定され、○が表示される。
![BreakPoint.png](https://qiita-image-store.s3.amazonaws.com/0/234166/b15e425a-a23e-640e-a7b2-31b000bbc97f.png)


- 停止できる行にしか設定できない。(空白行、クラスやメソッドの定義の行などには停止しない。)
- 複数の行をブレークポイントに設定できる。
- その行に来た時点で一時停止する。
- ブレークポイントに条件を設定し、設定条件の場合にのみ一時停止することも可能。

「ここら辺が怪しい、この変数の値を見たい、ここら辺の動作をみたい」というところに設定する。

ブレークポイントを解除したい場合、○をダブルクリックする。

## 2.2.「実行(Run)」/「デバッグ」

IDEでのプログラムの実行方法は次の2つがある。

- 「実行」: ブレークポイントで一時停止しない。
- 「デバッグ」: ブレークポイントで一時停止する。  
    
デバッグでブレークポイントに到達すると、そこで一時停止し、Eclipseの「デバッグパースペクティブ」上のエディタが開き、停止している行が矢印で示される。
![BreakPoint2.png](https://qiita-image-store.s3.amazonaws.com/0/234166/f79fc9de-e46a-867c-06bc-5b5ad6c22f74.png)

尚、main関数で引数を設定する場合は、右クリック→「構成(run configuration, debug configuration)」の「引数(Argument)」で設定できる。

## 2.3.デバッグ 停止中にできること

### 2.3.1.値の確認

下記で、値を確認できる。  
メソッド戻り値や、クラスのフィールドも見れる。

### 2.3.2.インスペクション(Inspect): 一回だけ見たい場合

フィールドを選択した状態で、右クリック -> インスペクション

### 2.3.3.監視(Watch): 継続的に見たい場合

フィールドを選択した状態で、右クリック -> 監視

変数であれば、「変数(Variable)」タブで変数の値を確認できる。

## 2.4.一時停止から動かす

デバッグの一時停止中に「処理が次の行に進むとどうなるのかな？」といった場合に以下のように動作させる。
(よく使うもののみ記載。)  

ステップオーバーなど、ショートカットを使うと手間が減る。

|日本語コマンド|English|挙動|ショートカット|
|:---|:---|:---|:---|
|再開|Resume|プログラムの終了まで実行する。※|F8|
|終了|Terminate|処理を中断(アプリケーションを終了)する。|Ctrl+2|
|ステップイン|Step Into|一時停止している次の行に進んで一時停止する。対象行でメソッドを呼び出す場合、呼び出し先のメソッドに入って先頭で一時停止する。|F5|
|ステップオーバー|Step Over|一時停止している次の行に進んで一時停止する。対象行でメソッドを呼び出している場合などは、それらの処理を行って次の行に進む。※|F6|
|ステップリターン|Step Return|実行中のメソッドのreturnまで行い、呼び出し元のメソッドに戻った時点で一時停止する。※|F7|

※ それまでにブレークポイントに進んだ場合は、そこで一時停止する。

ショートカットについては、ボタンの押し間違いに注意！
「やっと再現した！」 → トレースしているときに、F7とF8を押し間違える → ( ﾟДﾟ) ( ﾟДﾟ) ( ﾟДﾟ)
VSCode for Solidity :Error Case "Linebreak-style: Inconsistent line-break style."

EthereumやSolidityに直接関係ない話だが、Solidityベースのスマートコントラクト開発時のTips

**【環境】**
OS： windows10
IDE：VSCode (Visual Studio Code)

**【Tips】**
truffleを使って、Solidityベースのスマコン書こうとすると、"version pragma"（例："pragma solidity ^0.4.23;"）のとこで、以下のエラーが出力されることがある。

（出力エラー）
**"Linebreak-style: Inconsistent line-break style."**

この場合、VS Codeの"settings.json"で以下を追加すると大丈夫みたい。

>```java:settings.json
{
    ... ,
    // 以下、追記
    "solidity.soliumRules": {
      "linebreak-style": "windows"
    }
    // 追記、終わり
 }
>```

【参考】

+ [Linebreak-style: Inconsistent line-break style. #86 (GitHub)](https://github.com/juanfranblanco/vscode-solidity/issues/86)
画面上のどこからでもスワイプバックできるようにする

iOS標準で付いている、画面左端からのスワイプで前画面に戻る機能を画面上のどこをスワイプしても戻れるようにする方法

```swift:ViewController.swift
override func viewDidLoad() {
    super.viewDidLoad()
    // ↓この3行を追加
    let target = self.navigationController?.value(forKey: "_cachedInteractionController")
    let recognizer = UIPanGestureRecognizer(target: target, action: Selector(("handleNavigationTransition:")))
    self.view.addGestureRecognizer(recognizer)
}
```

この3行をviewDidLoadとかで呼ぶだけ。
お手軽です。
BalancedBaggingClassifierのestimatorsからcoefficient, interceptの値（参考）を抽出する方法

# 不均衡データにおける係数の算出
単一のLogisticRegressionを実行した場合、下記attributeを指定することで各説明変数の係数と切片を求めることができる。


```
lr = LogisticRegression()
lr.fit(X,y)
lr.coef_, lr.intercept_
```

しかし、不均衡データにおいてBalancedBaggingClassifierを使った場合、係数と切片を取得するattributeが存在しないため、以下の要領で算出する必要がある。

```
import pandas as pd
Import numpy as np
from sklearn.linear_model import LogisticRegression
from imblearn.ensemble import BalanceBaggingClassifier

# base_estimatorでLogistic Regressionを設定
lr_bbc = BlanceBaggingClassifier(base_estimator=LogisticRegression())
lr_bbc.fit(X, [str(s) for s in y])

# Pipelineオブジェクトの表示
lr_bbc.estimatrors_
```

>[Pipeline(memory=None,
      steps=[('sampler', RandomUnderSampler(random_state=96484896, ratio='not minority',
           replacement=False, return_indices=False,
           sampling_strategy='not minority')), ('classifier', LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
           intercept_scaling=1, max_iter=100, multi_class='warn',
           n_jobs=None, penalty='l2', random_state=53827939, solver='warn',
           tol=0.0001, verbose=0, warm_start=False))])…

## Baggingされた各ステップから係数を抽出
for文のリスト内包表記でPipelineオブジェクトの中から”classifier”というkeyのオブジェクトを指定。
各オブジェクトに対してcoef_, intercept_を抽出し、平均をとることで参考値としての係数を算出する。

```
lr_coef = np.mean([lr.named_steps["classifier"].coef_[0] for lr in lr_bbc.estimators_],axis=0)
lr_intercept = np.mean([lr.named_steps["classifier"].intercept_[0] for lr in lr_bbc.estimators_],axis=0)
```

# おまけ：GridsearchCVを実行した際の係数
GridsearchCVにおいて選択されたモデルに対する係数は下記で算出可能

```
params_lr = {“C”:[1,10,100]}
lr = LogisticRegression()
gr_lr = Gridsearch(lr,params,cv=5)
gr_lr.fit(X,y)
gr_lr.best_estimator_.coef_
```

以上
Nextcloud の2段階認証

#はじめに
Nextcloudにブラウザーでログインするとき、ユーザIDとパスワードを入力します。基本的にどの端末からでもアクセスできるのがオンラインストレージの良いところですが、少しでもセキュリティを強化したい方は、二段階認証の機能もあります。ログイン時にユーザIDとパスワードを入力した後、ワンタイムパスワードを入力してログインできるようになります。

#プラグイン
プラグイン名は「Two Factor TOTP Provider」です。こちらを有効にしておきます。
![画像98.png](https://qiita-image-store.s3.amazonaws.com/0/308127/517cee48-432b-f723-d019-a41da4bd8498.png)

#使い方
管理者が設定する事はなく、ユーザ毎に設定を行います。個人設定画面のセキュリティ項目に、TOTP第2認証の設定画面があります。TOTP有効化をチェックします。
![画像99.png](https://qiita-image-store.s3.amazonaws.com/0/308127/04865cfc-f993-2b37-691c-aaedb181e7f2.png)
チェックしたら、QRコードが生成されるので、スマートフォン等の認証アプリに登録を行います。（私は、[Google認証アプリ](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=ja)を使っています。）
![画像100.png](https://qiita-image-store.s3.amazonaws.com/0/308127/316ff3a9-fbf9-c179-2d6b-f65a489adf98.png)
QRコードを登録したら、そのユーザは二段階認証をする必要があります。ログイン画面でユーザIDとパスワードを入力した後、ワンタイムパスワードを聞かれますので、スマートフォン等の認証アプリに表示されているパスコードを入力するとログインできます。
![画像101.png](https://qiita-image-store.s3.amazonaws.com/0/308127/a429a043-aa20-3a16-39eb-2c3f9a8ecea9.png)
ログインすると、通常のファイル操作画面に移ります。
![画像102.png](https://qiita-image-store.s3.amazonaws.com/0/308127/1ce0637e-88c9-bd56-ce5e-4d7aa4202cbb.png)

#まとめ
外出先からアクセスしたり、違うPCでログインする事が多いユーザには、使った方が良いかもしれませんね。ログイン時にスマートフォンでパスコードを確認するのが面倒かもしれませんが、自分のファイルを守るという事も大切な事かと思います。
VirtualBoxにインストールしたOSへ接続できない時の確認ポイント

別記事が最初になるはずだったのですが、業務中手詰まりになったので調べた結果を残しておくことにしました。
結構当たり前のことかもしれませんが、自分への備忘録を兼ねて。

# 事象
Windows7にインストールしたOracle VM VirtualBox上のWindowsServer2016にアクセスできない。
(pingが双方向に通らない)


# 環境
+ Windows7(PC本体)
+ Oracle VM VirtualBox
+ WindowsServer2016(VM上)

# 対処
ググると色んな事が書いてあって、ファイアウォールの設定だとかがヒットすると思うのですが(いじったけどやぱり通らなかった)原因は違うところにありました。

VirtualBoxマネージャーの該当サーバーの設定-ネットワークの割り当てがデフォルトNATになっていたのをブリッジアダプターに変更することでpingが通るようになりました。
<img width="539" alt="設定.png" src="https://qiita-image-store.s3.amazonaws.com/0/315883/97a46a34-16a9-5d74-1778-f113d9113c55.png">

ファイアウォール云々よりもまずは設定を確認しましょうというお話でした。
Macで快適な作業環境を構築する(zsh編)

[最強のターミナル環境](https://qiita.com/ucan-lab/items/ed0687e9cd4a8ea7c76c)ができたら次に取り掛かるのは最強のシェル環境です😊
私がオススメするshellは **z shell** です！

## zsh(z shell) とは

bourne　shell系コマンドとcsh系のコマンドが両方使える上に、ksh系のコマンドライン編集機能も実装された究極のシェル。

**「zshに出来ないことがあったら、それはバグだ」**

[zshとは](https://qiita.com/munazo/items/fa010d9815a04578658c)

## 私の shell 変遷

bash => fish => zsh

fishの入力補完が魅力ですが、bash互換がなく、他の人とコマンドを共有するのが面倒になってました。zshでも入力補完が使えてbash互換があると聞き、即乗り換えました😏

## zsh インストール

```
$ brew install zsh
```

## シェル一覧へ登録

デフォルトシェルに変更するには、 `/etc/shells` へ追加する必要があります。

```
$ echo `which zsh` | sudo tee -a /etc/shells
```

```
$ cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
```

## デフォルトシェルを変更

デフォルトシェルを変更するには `chsh` コマンドを使います。

```
$ chsh -s `which zsh`
```

シェルの一覧に追加されていないと `chsh: /bin/zsh: non-standard shell` のエラーが出ます。

デフォルトシェルの変更が終わったら、**ターミナルを再起動**します。

```
$ $SHELL --version
zsh 5.3 (x86_64-apple-darwin18.0)
```

環境変数 `$SHELL` にはデフォルトシェルのパスが入ってます。
zshのバージョン情報が表示されていればokです🍻

## ゆうきゃんカスタムシェル設定

こちらのリポジトリに [dotfiles](https://github.com/ucan-lab/dotfiles) 私の設定ファイルをまとめてます。

zshの設定フレームワークのpreztoを使用してます。
その他、諸々の設定を行ってますので、現在の設定を壊したくない人はダウンロードして適宜コピーして使ってください😅

### シェル設定のインストール

```
$ git clone https://github.com/ucan-lab/dotfiles.git ~/dotfiles && cd ~/dotfiles && ./install.sh
```

`~/dotfiles` ここに設定ファイルがインストールされます。

### z コマンド

[z](https://github.com/rupa/z) コマンドを導入しています。

一度行ったディレクトリはディレクトリ名だけで移動できる便利なコマンドです。
例えば。

```
$ mkdir -p ~/foo/bar/hogefuga
$ cd $_ # 作成したディレクトリへ移動
$ cd # ホームディレクトリへ移動
$ z hogefuga
```

と移動できるようになります。
ディレクトリ名は部分一致でも良く、 `z gefu` でも移動できます。
また、同じディレクトリ名で別階層の場合は最近行った方が優先されるようです。

`z` だとタイプしづらいので `j` にエイリアスを設定しています。

```
$ j hoge
```

でも移動できます。

### .. コマンド

一つ上のディレクトリに戻ります

```
$ ..
```

### f コマンド

カレントディレクトリを Finder で開きます。

```
$ f
```

### cdf コマンド

Finder で表示しているディレクトリへ移動します。

```
$ cdf
```

### relogin コマンド

shellを再起動します。設定ファイルを反映したいときなど

```
$ relogin
```

### md コマンド

カレントディレクトリに配置してあるMarkdownファイルをvimで開けるようにしてます。
※カレントディレクトリにマークダウンファイルが1つだけ配置されてる前提です。

```
$ echo "foo" > bar.md # テストファイル作成
$ md
```

### calc コマンド

簡易的な計算コマンド

```
$ calc "15*4"
60
```

### ggrks コマンド

ググレカスコマンド。ブラウザを開いて入力した文字で検索してくれる。
`g` エイリアスも設定してます。

```
$ ggrks 原宿
$ g 原宿 パフェ
```

## プロンプトテーマを変更したい

```
# テーマ一覧
$ prompt -l
# テーマをプレビュー
$ prompt -p <テーマ名>
# すべてのテーマをプレビュー
$ prompt -p
# テーマを適用(再起動したら戻る)
$ prompt <テーマ名>
```

永続的にテーマを変更したいときは `~/.zpreztorc` preztoの設定ファイルを開いて下記の行を変更してください。

```
zstyle ':prezto:module:prompt' theme 'pure'
```

theme を設定している `pure` を好きなテーマ名に変更すればokです🍻
Pythonで時刻同期（Windows）する

#使用する技術
- ctypes
- 
 - PythonでC/C++の共有ライブラリを使用することができるライブラリ。

#必要条件
- 管理者権限での実行

#サンプルソース
```Sample.py
# coding: Shift_JIS
from ctypes import Structure, windll, pointer
from ctypes.wintypes import WORD

# 時刻同期関数に渡してあげるための構造体を作成する。
class SYSTEMTIME(Structure):
    _fields_ = [
      ('wYear',            WORD),
      ('wMonth',           WORD),
      ('wDayOfWeek',       WORD),
      ('wDay',             WORD),
      ('wHour',            WORD),
      ('wMinute',          WORD),
      ('wSecond',          WORD),
      ('wMilliseconds',    WORD),
    ]

# 設定する時刻の構造体にデータを入れる
setTimeData = SYSTEMTIME()
setTimeData.wYear = 2018
setTimeData.wMonth = 11
setTimeData.wDayOfWeek = 0  # 曜日は勝手に入る
setTimeData.wDay = 15
setTimeData.wHour = 17
setTimeData.wMinute = 0
setTimeData.wSecond = 0
setTimeData.wMilliseconds = 0

# 時刻同期する部分
SetLocalTime = windll.kernel32.SetLocalTime
ret = SetLocalTime(pointer(setTimeData))

# 結果判定
if ret == 0:
    print('設定に失敗しました。管理者権限で実行してください。')
else:
    print('成功しました。システムを終了します。')

```


#所感
Cの機能がPythonの手軽さで使えるので、
便利といえば便利。
Pupeteerを使うときは try~finallyでbrowserをcloseする。

Pupeteerでクローリング処理を作成した時の注意事項として、
**全ての処理が終了した時に`browser.close()`  を呼び出さないと処理が終了しません。**

```javascript

//ページ内のatagのhrefを全部取得
async function getAtagHref(url) {
  let outputs = [];
  const puppeteer = require('puppeteer');
  const browser = await puppeteer.launch();

  const page = await browser.newPage();
  await page.goto(url, {waitUntil: "domcontentloaded"});

  //ここでエラーが発生して終了
  throw new Error('無理やりエラー!');

  outputs = await page.$$eval('a', anchors => anchors.map(anchor => anchor.href));
  await browser.close();
  
  return outputs;
}

function main() {
  try {
    return getAtagHref('https://qiita.com/');
  } catch (e) {
    console.log(e);
    //なんかクローリングがうまく行かなかったらから配列を返して終了してほしい
    return [];
  }
}

main()
```

上記javascriptをcliで実行しても処理は永久に終わりません。

CLIで使う分には Ctrl+C で良いのですが、
AWS Lambda や バッチ処理に組み込むときはこれだと困ってしまいます。


かといって、

```javascript
await page.goto(url, {waitUntil: "domcontentloaded"})
  .catch(async()=>await browser.close());
outputs = await page.$$eval('a', anchors => anchors.map(anchor => anchor.href))
  .catch(async()=>await browser.close());
```
とか一々`await ゴニョゴニョ().catch(async()=>await browser.close())`書くのも面倒だし、pupeteer以外で例外が発生したらやっぱり処理が終わらないので、
**try~catch~finally　構文を使って確実に`browser.close()` を呼び出すようにしましょう。**

```javascript
//ページ内のatagのhrefを全部取得
async function getAtagHref(url) {
  const puppeteer = require('puppeteer');
  const browser = await puppeteer.launch();
  try {
    const page = await browser.newPage();
    await page.goto(url, {waitUntil: "domcontentloaded"});

    return await page.$$eval('a', anchors => anchors.map(anchor => anchor.href));
  } catch(e) {
    // 何かしらエラー処理
    // 呼び出し元でcatchするのであればここのcatchは不要
    throw e;
  } finally {
    //例外が発生しても発生しなくてもここは必ず通る
    await browser.close();
  }
  
}
```
ターミナルで電子掲示板風にYahooニュースを表示させる

#ターミナルで電子掲示板風にYahooニュースを表示させる

##きっかけ
[BTTでTouch Barにyahooニュースを表示する。](https://qiita.com/KyoHeyyy/items/d062c17fc56ee5585690)
こちらの記事を読んで、電光掲示板風に流れるニュースが見たくなったのがきっかけです。

##完成したもの
![qiita.gif](https://qiita-image-store.s3.amazonaws.com/0/241671/348837b4-40bb-6e50-4e8f-ac7f836b624b.gif)

##ソースコード
Yahooニュースの取得には上記の記事をほとんど参考に
作りました。

```python
from bs4 import BeautifulSoup
import requests
import random
import time
import numpy as np

# 表示文字数
text_num = 20

url = requests.get('https://news.yahoo.co.jp/hl?c=bus')
soup = BeautifulSoup(url.content, 'html.parser')
news = soup.find_all("dt")
r = random.randrange(len(news))

# ランダムに新着ニュースを選ぶ
news_text = news[r].get_text().strip()
# 表示させるテキストのnumpy配列作成(空白で表示文字数だけ埋める)
display_text = np.array(["  "]*text_num)

print()

# ニュースを一文字ずつ追加していく
for s in news_text:
    # 1文字、左にずらす
    display_text = np.roll(display_text, -1)
    # 一番右の要素に新しい文字を入れる
    display_text[text_num-1] = s
    # 表示
    print("".join(display_text), '\r', end='')
    # 一定時間スリープ
    time.sleep(0.2)

# 文字の削除
for i in range(text_num):
    # 1文字、左にずらす
    display_text = np.roll(display_text, -1)
    # 一番右に空白を入れる
    display_text[text_num-1] = "  "
    # 表示
    print("".join(display_text), '\r', end='')
    # 一定時間スリープ
    time.sleep(0.2)

```

##ポイント
標準出力(ターミナル上での出力)で上書きする方法を初めてしりました。

```python
print("".join(display_text), '\r', end='')
```

参考：https://www.haya-programming.com/entry/2018/04/11/181635

実装自体はすごくシンプル(~~パッと思いつくのがこれしかなかった~~)で、
ただニュースのタイトルをnumpy配列に格納して、ずらしていくだけです。

##本当にやりたかったこと
本当はこれをBTTで用いて、touchbar上に表示させたかったのですが
上手くいきそうもなかったので、ターミナルでの出力に切り替えました。

実用性皆無！
Ubuntu1810DesktopにKibana+Elasticsearchのコンテナを立ててみる

以下の記事を参考にしました。

大変参考になりました。
[Dockerで Elasticsearch + Kibana を動かしてみた](https://qiita.com/tsukapah/items/24bab0f5ab9bb4e12309)


rootで作業しました。

### 1.dockerのインストール

`apt install docker.io`

これでdockerコマンドが使えるようになります。

### 2.Elasticsearchのコンテナを立てる。
まずElasticsearchコンテナ用のネットワークブリッジを用意します。

```bash

docker network create elasticsearch --driver bridge
```

### 3.Elasticsearchのコンテナをたてる。

```bash

docker run -d -e "http.host=0.0.0.0" -e "transport.host=127.0.0.1" -e "xpack.security.enabled=false" -e "xpack.monitoring.enabled=false"     -e "xpack.watcher.enabled=false" -e "xpack.graph.enabled=false" -e "xpack.ml.enabled=false" -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -p 9200:9200 -p 9300:9300 --name elasticsearch --network="elasticsearch" docker.elastic.co/elasticsearch/elasticsearch:6.5.0
```

これでElasticsearchは立ち上がるみたいです。
動いているか確認するなら`curl localhost:9200`をやってみるとよい。

### 4.Kibanaコンテナの起動

```bash

docker run -d --name kibana -p 5601:5601 -e "ELASTICSEARCH_URL=http://elasticsearch:9200" -e "xpack.graph.enabled=false" -e "xpack.security.enabled=false" -e "xpack.ml.enabled=false" --network="elasticsearch" docker.elastic.co/kibana/kibana:6.5.0
```
これでおｋ。
コンテナが起動する。


### 5.ブラウザで確認する
`http:localhost:5601`にアクセスしてみる。

![Screenshot from 2018-11-15 18-08-05.png](https://qiita-image-store.s3.amazonaws.com/0/213689/419751b1-83c2-bea0-4ed8-0b75b8b888f7.png)

中でセットアップされてるみたいで、この画面が出るまでは結構時間がかかる。
とりあえず触ってみたいならこれくらいでいいでしょ。


公式
https://www.elastic.co/guide/en/kibana/6.5/setup.html
HTML、CSS、JavaScriptをVisual Studioを使って、開発環境の構築からHelloWorldの出力まで

**HTML、CSS、JavaScript**の勉強を**[ドットインストール](https://dotinstall.com/)**というサイトで始めました。いくつかやってみましたが、とても分かりやすくて、効率良く学習できると思います。環境に関しては**ブラウザ**と**テキストエディタ**さえあれば十分なのですが、私は、**Visual Studio**を使って学習を進めています。Visual Studioを使ったやり方を説明しているサイトが少なかったので、ここに書き記そうと思いました。ぜひ参考にしてみてください。

ついでに作成したWebページを無料で公開する方法！→ [GitHub Pagesを使って、10秒でWebページを公開する](https://qiita.com/michimichix521/items/0f2632fcae058f453277)



#開発環境
・Windows 10 home
・[Google Chrome](https://www.google.co.jp/chrome/?brand=CHBD&gclid=CjwKCAiArK_fBRABEiwA0gOOc8MWzUOWgVGUkbH_rN0hiUd1j9IwPmb_BLY6gw2SkaHcwGt8vpDFixoC1twQAvD_BwE&gclsrc=aw.ds)
・[Visual Studio 2017 Community](https://visualstudio.microsoft.com/ja/downloads/?utm_source=windows+store+app&utm_medium=microsoft&utm_campaign=store+visualstudio+download&ocid=ems.dco.storeautosuggest&ccid=7f3b07eb9ea849d2b0ff7883682f86b9)



#Visual Studioで開発環境の構築手順
上記のものをそれぞれインストールし終わった前提で話を進めていきます。


##Visual Studio 2017 Communityを起動する
<img width="900" alt="visual studio.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/309633/2aec9179-1de2-e2d3-0465-ebf792456e66.png">

起動するとこのような画面が出てきます。

##新しいプロジェクトの作成
<img width="900" alt="visual studio2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/309633/2a1c1f99-1fe4-2859-a01d-0563bd682b0b.png">

**ファイル → 新規作成 → プロジェクト(Ctrl + Shift + N)**から新しいプロジェクトを作成します。**その他のプロジェクトの種類のVisual Studio ソリューション**を選択し、空のソリューションを選びます。ここではとりあえず、名前はtest01とし、デスクトップ上に保存しました。できたらOKを押します。

<img width="900" alt="visual studio3.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/309633/e5d07bfb-fbc0-8c40-2c87-7a2200e54ac1.png">

このような画面が出れば成功です。

##HTML、CSS、JavaScriptファイルの準備

<img width="900" alt="visual studio4.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/309633/815bc60a-a9d0-13a0-dbe3-f6905a357bc1.png">




画面右側の方にあるソリューションエクスプローラーのソリューション'test01'(0プロジェクト)を**右クリック → 追加 → 新しい項目(Ctrl + Shift + I)**の順に進めると、このような画面が出てきます。
そして**HTMLページ、JavaScriptファイル、スタイルシート**を追加しましょう。

<img width="900" alt="visual studio5.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/309633/09172c14-ad51-03cd-bb38-115a1daee387.png">

このような画面になれば、開発環境の構築は完了です。
それではweb上にHelloWorldを出力してみましょう。

##HelloWorldの出力

<img width="900" alt="visual studio6.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/309633/7e0a638b-24a0-83ec-f6cd-7a823f548e0f.png">

HTMLPage1.htmlに**＜h1＞HelloWorld＜/h1＞**を書き足します。一応プログラムは下記にある通りです。

```HTMLPage1.html
<!DOCTYPE html>

<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
    <h1>HelloWorld</h1>
</body>
</html>
```

書き足したら保存をしましょう。**ファイル → すべて保存(Ctrl + Shift + S)**

それでは**デスクトップ上に保存していたtest01フォルダの中のHTMLPage1.html**をGoogle Chromeで開いてみましょう。

<img width="900" alt="visual studio7.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/309633/1dc09f06-efac-16ff-9c44-0c9c03e3548e.png">

HelloWorldが出力されていれば成功です。お疲れ様でした。


#終わりに

メモ帳などのテキストエディタでもできますが、Visual Studioを使ってあげた方が、予測変換などがあり、使い勝手が良いのでお勧めです。簡単に環境構築ができるので、ぜひ試してみてください。

HTML、CSS、JavaScriptの勉強をしている方々、ぜひ一緒に頑張っていきましょう！

作成したWebページを無料で公開する方法もあります！→ [GitHub Pagesを使って、10秒でWebページを公開する](https://qiita.com/michimichix521/items/0f2632fcae058f453277)
Cognos レポートのフィルターで他のクエリーの結果を使用するやり方

#フィルターで他のクエリーの結果を使用
SQLのwhere句にサブクエリーを埋め込むようなイメージで、Cognosのレポートのフィルターに他のクエリーの結果を使う方法です。

例えば、こんなリストがあったとします。クエリー1とします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/a7865bc1-df49-d7f8-e1b2-787149adfb65.png)

クエリー1に、[年]='2010'、[数量] between 2000000 and 7000000 ※集計後、というフィルターを指定すると、以下の表示になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/73868c00-39dd-77d9-1b85-fa18bde80fcb.png)

このクエリー1の結果の、製品ラインでの「アウトドア用保護用品」「キャンプ用品」という結果を、クエリー2で作られている下のクロス集計のフィルターに指定できないでしょうか、という話です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/35bc5905-85bf-d290-040d-7cdd7ecbb51c.png)

そんな時は、クエリー2の詳細フィルターで、以下のフィルターを指定します。
[製品ライン] in ([クエリー1].[製品ライン])

するとこうなります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/f8b2272f-6b70-bd07-9c0a-c87cd73199d3.png)

なんか前やった時は、クエリー2のプロパティで「製品を超えた結合を許可」を「許可」にしないとエラーになってましたが、今やってみるとこの設定無しでできてしまいました。
とりあえずやってみて、エラーになるようであればこの設定もお試し下さい。

という訳で、超簡単ですが以上です。
もちろん、クエリー1とクエリー2を結合してやって行けば同じ事はできるのですが、結合でやるしかないと思っている人も多いので、投稿しておきます。
a-blog cmsのフォームの最小構成パーツ #ablogcms

[フォームの基本 | ドキュメント | a-blog cms developer](https://developer.a-blogcms.jp/document/form/)

a-blog cmsのフォームは、カスタマイズの幅が広く、柔軟で、設置しやすい……はずなんですが、個人的には一発で動かないことが割と多いです。
大体は凡ミスで、

- フォームIDを間違えている
- submitボタンのnameが違っている
- [メールのテンプレート](https://developer.a-blogcms.jp/document/form/#entry-id-1247)のパスが違う

が、三大ミステイクです。
2.9から、メールのテンプレートを、フォームの管理画面に直接入力できるようになりました。
第三者が修正ミスしたらどうするかを考えないといけないですが、メールのテンプレートの扱いが好きじゃなかったので、かなり嬉しいところです。
ミスができるだけ起こらないように、一番シンプルな雛形を作っているんですが、おそらく次のようなパーツになると思います。

##フォームのステップ設定

```
<!-- BEGIN_MODULE Form -->
 
<!-- BEGIN step-->
	<!-- 新規 -->
	@include("/form/input.html")
<!-- END step -->
 
<!-- BEGIN step#reapply -->
	<!-- 修正 -->
	@include("/form/input.html")
<!-- END step#reapply -->
 
<!-- BEGIN step#confirm -->
	<!-- 確認 -->
	@include("//confirm.html")
<!-- END step#confirm -->
 
<!-- BEGIN step#result -->
	<!-- 完了 -->
<!-- END step#result -->
 
<!-- END_MODULE Form -->
```

##フォーム入力（上記の/form/input.html）

```
<form action="?step=reapply" method="post" enctype="multipart/form-data">
	
	<!-- ここにフォームの内容を入力 -->
	
	<input type="hidden" name="step" value="confirm">
	<input type="hidden" name="id" value="フォームIDを設定">
	<p class="center">
		<input type="submit" name="ACMS_POST_Form_Confirm" value="送信内容の確認へ" class="action">
	</p>
</form>
```

##確認画面（上記の/form/confirm.html）

```
<!-- ここにフォームの内容確認を入力 -->

<form action="" method="post">
	<input type="hidden" name="step" value="reapply">
	<input type="hidden" name="takeover" value="{takeover}">
	<input type="submit" name="ACMS_POST_Form_Chain" value="修正する">
</form>

<form action="thanks.htmlなど送信後の遷移先" method="post" enctype="multipart/form-data">
	<input type="hidden" name="To[]" value="確認メールの送信先:{email}などフォーム内の投稿者メールアドレス">
	<input type="hidden" name="step" value="result">
	<input type="hidden" name="takeover" value="{takeover}">
	<input type="hidden" name="id" value="フォームIDを設定">
	<input type="submit" name="ACMS_POST_Form_Submit" value="以上の内容を送信する" id="btnSubmit" class="action">
</form>
```
【SharePoint】サイトコレクションの機能比較

※2017/09 時点での比較です。
[【SharePoint】サイトコレクションの機能比較 ](https://pg-ma-com.blogspot.com/2017/09/blog-post.html)
<iframe allowfullscreen="" frameborder="0" height="500px" marginheight="0" marginwidth="0" max-width="100%" mozallowfullscreen="" msallowfullscreen="" sandbox="allow-forms allow-modals allow-orientation-lock allow-popups allow-same-origin allow-scripts" scrolling="no" src="https://sway.com/s/7rwrBuCSKN2dqRhb/embed" style="border: none; max-height: 100vh; max-width: 100%;" webkitallowfullscreen="" width="760px"></iframe>
【Exchange】会議室配布グループ

# 会議室一覧
会議室一覧は、配布グループを使用するのと同じ方法で使用できる、特別な配布グループです。ただし、会議室一覧は、Exchange 管理シェルを使用してのみ作成できます。
## 会議室配布グループに会議室メールボックスを追加する

```posh
# 管理者ユーザ名
$userName = 'root@XXXXXXXX.onmicrosoft.com'

# パスワード
$password = 'XXXXXXXX'

$policy = Get-ExecutionPolicy -Scope LocalMachine
if ($policy -ne 'RemoteSigned') {
	Set-ExecutionPolicy RemoteSigned
	Write-Host 'リモートシェルを有効にしました。'
}

$secureStr = ConvertTo-SecureString $password -AsPlainText -force
$pscredential = New-Object System.Management.Automation.PSCredential($userName, $secureStr)
$UserCredential = Get-Credential $pscredential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection
Import-PSSession $Session -AllowClobber

# ------------------------------------------------------------------------------
$roomListName = '会議室一覧'
$roomListAlias = 'rooms'

# 会議室配布グループ作成
New-DistributionGroup -Name $roomListName -Alias $roomListAlias -RoomList

# 作成確認
Get-DistributionGroup $roomListName

# 会議室メールボックス取得
$mailboxes = Get-Mailbox -ResultSize unlimited -Filter { RecipientTypeDetails -eq 'RoomMailbox' }

# 会議室配布グループに追加
$mailboxes | % { Add-DistributionGroupMember $roomListAlias -Member $_.Alias }

# 追加確認
Get-DistributionGroupMember $roomListName
# ------------------------------------------------------------------------------

Remove-PSSession $Session
```

# 参考サイト
* [【Exchange 2013】 会議室メールボックスと会議室一覧を利用することになったので覚書](http://exchange-sharepoint.hatenablog.jp/entry/2015/08/31/140059)
* [会議室一覧配布グループを作成する](https://docs.microsoft.com/ja-jp/previous-versions/office/exchange-server-2010/ee633471(v=exchg.141))
* [仕様がグレー？新機能「グループ」](https://licensecounter.jp/office365/blog/2015/04/new-feature-group.html)
* [Office 365 グループはこう使おう](http://mokudai.jp/small_talk/office-365-group-should-use/)
Herokuでアプリを公開するときの流れ

#Heroku
Herokuとは、[PaaS（Platform as a Service）](https://ja.wikipedia.org/wiki/Platform_as_a_Service)と呼ばれるサービスで、アプリケーションの開発から実行、運用までのすべてを[クラウド](https://aws.amazon.com/jp/cloud/#what-is-cloud)で完結できる[プラットフォーム](https://kotobank.jp/word/%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0-2749)である。
わかりやすく説明すると、WEBアプリの公開を簡単にしてくれる画期的なサービスである。
##Herokuがどれだけ便利なのか解説
では、実際にHeroku（PaaS）がどれだけ便利なのかを解説する。

これまで、インターネット上にアプリケーションを公開しようとした場合、次のような工程を踏まなければ、アプリケーションを作り始めることすらできなかった。

1.**サーバPCやルータなどのハードウェアを購入**
2.**インターネットに接続し、ネットワークを構築**
3.**サーバの仮想化環境を整備**
4.**LinuxやWindowsサーバなどのOSをインストール**
5.**Oracle、MySQL、PostgreSQLなどのデータベースをセットアップ**
6.**Java、Ruby、PHPなどのアプリケーション実行環境をセットアップ**

実際には、データベースのバックアップなどももっと細かい部分も必要になるので、環境構築にかかるコストは金銭的にも、時間的にもかなり大きなものになる。

Heroku（PaaS）は、このようなアプリケーション公開にかかる数々の作業を代行してくれるサービスである。

##Herokuでアプリを公開するときの流れ
では実際に、新しいアプリの生成からHerokuを使って[デプロイ](https://kotobank.jp/word/deploy-1689419)（アプリを公開）するまでの流れを解説する。
＊ここでは、Ruby on Railsを利用していることを前提とする。

1.**rails newコマンドでアプリの骨組みを生成**

```
$ rails new hello_Heroku
```

2.**Gemfileを編集する**
Herokuでは、PostgreSQLデータベースを使う為、RailsがPostgreSQLと通信できるようにGemfileに以下のgemを追加する。

```
group :production do
  gem 'pg', '0.20.0'
end
```

またHerokuではSQLiteがサポートされていないため、以下の変更を行って、sqlite3 gemが本番環境に導入されないようにしておきます。

```
group :development, :test do
  gem 'sqlite3', '1.3.13'
  gem 'byebug',  '9.0.6', platform: :mri
end
```

3.**bundle installする**
この場合、本番用のgem (この場合はpg gem) をローカルの環境にはインストールしないようにするために、bundle installに特殊なフラグ「--without production」を追加して実行する。

```
$ bundle install --without production
```

4.**Gitでアプリケーションをバージョン管理下に置く。**

```
$ git init
$ git add -A
$ git commit -m "Initialize repository"
```

Gitで新しいリポジトリを作成し、生成したファイルをこの新しいリモートリポジトリにプッシュします。

```
$ git remote add origin https://github.com/<username>/hello_Heroku.git
$ git push -u origin master
```
5.**Herokuの会員登録**
[Herokuの公式ページ](https://jp.heroku.com/home)で会員登録を行う。
Heroku内で[heroku toolbelt](https://toolbelt.heroku.com/)というツールをインストールする。

6.**ターミナルでHerokuにログインする**

```
$ heroku login
```

7.**Herokuサーバーにサンプルアプリケーションの実行場所を作成する。**

```
$ heroku create
```

8.**GitでHerokuにリポジトリをプッシュする。**

```
$ git push heroku master
```

これでデプロイ完了。

##参考サイト
[herokuとは？概要や特徴をわかりやすく解説](https://www.sejuku.net/blog/7858)
[Ruby on Rails チュートリアル](https://railstutorial.jp/chapters/beginning?version=5.1#sec-deploying)
【CSV】OLE DB プロバイダに適用される考慮事項 

CSV ファイルの列に数値と文字列が混在していると、以下の問題がある

### [HOWTO] Visual Basic または VBA から ADO を Excel データで使用する
> データ型の混在についての注意 > 「スキャンする行数」で説明したとおり、ADO は Excel のワークシートまたは範囲に含まれる各列のデータ型を推測する必要があります (これは Excel のセル書式設定には影響されません)。
> 同じ列に数値と文字列値が混在していると重大な問題が発生することがあります。
> Jet プロバイダと ODBC プロバイダはどちらも、最も数が多い型についてはそのデータを返し、その他の数が少ないデータ型については NULL (空) 値を返します。
> 2 つの型が列内で同数の場合、文字列ではなく数値が返されます。

数値と文字列が混在する列のデータを["(ダブルクォーテーション)]で囲うことで、回避できる。
テキストエディタで置換したり、ツールを使うことで、列データを["]で囲うようにします。

# 参考サイト
* [ADO CSV接続 勝手に型を決めんなよ・・・](http://www.ken3.org/asp/backno/asp101.html)
* [OleDbDataAdapter による CSVデータの読込み](http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=20039&forum=7)
* [Excel CSV I/O ～ Excel 2007以降で CSV ファイルを簡単にインポート・エクスポートできるアドイン](https://www.aruse.net/entry/2018/09/12/220211)
【C#】フォーム上のテキストボックスのショートカットキー処理を追加する 

フォーム上のテキストボックスのショートカットキー処理を追加する 

ContainerControlExtension.cs

```c#
using System;
using System.Windows.Forms;

namespace ExtensionsLibrary.Extensions {
	/// <summary>
	/// ContainerControl を拡張するメソッドを提供します。
	/// </summary>
	public static partial class ContainerControlExtension {
		/// <summary>
		/// アクティブコントロールを取得する
		/// </summary>
		/// <param name="this">アクティブコントロールを探す元のコンテナコントロール</param>
		/// <returns>アクティブコントロール</returns>
		/// <example>
		/// 自分自身のフォームのアクティブコントロールを取得する例
		/// <code>
		/// var c = this.GetRealActiveControl();
		/// </code>
		/// </example>
		public static Control GetActiveControl(this ContainerControl @this) {
			// ActiveControlプロパティを取得
			var ac = @this.ActiveControl;

			if (ac == null) {
				// ActiveControlがNULLの時は、コンテナコントロールを返す
				return @this;
			}

			if (ac is ContainerControl) {// 再帰処理
				// ActiveControlがコンテナコントロールの場合は、さらにActiveControlを取得
				return (ac as ContainerControl).GetActiveControl();
			}

			return ac;
		}
	}
}
```
FormEditText.cs

```c#
using System.Windows.Forms;
using ExtensionsLibrary.Extensions;

namespace TestProject {
	public partial class FormEditText : Form {
		public FormEditText() {
			InitializeComponent();
		}

		/// <summary>
		/// コマンド キーを処理します。(オーバーライド)
		/// </summary>
		/// <param name="msg">処理する Win32 メッセージを表す、参照渡しされた <see cref="T:System.Windows.Forms.Message" />。</param>
		/// <param name="keyData">処理するキーを表す <see cref="T:System.Windows.Forms.Keys" /> 値の 1 つ。</param>
		/// <returns>
		/// キーストロークがコントロールによって処理および使用された場合は true。キーストロークをさらに処理できるようにする場合は false。
		/// </returns>
		protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
			var tbx = this.GetActiveControl() as TextBoxBase;
			if (tbx != null) {
				switch (keyData) {
				case Keys.Control | Keys.A:// Ctrl + A
					tbx.SelectAll();
					return true;
				case Keys.Control | Keys.C:// Ctrl + C
					tbx.Copy();
					return true;
				case Keys.Control | Keys.X:// Ctrl + X
					tbx.Cut();
					return true;
				case Keys.Control | Keys.V:// Ctrl + V
					tbx.Paste();
					return true;
				case Keys.Control | Keys.Z:// Ctrl + Z
					tbx.Undo();
					return true;
				default:
					break;
				}
			}

			return base.ProcessCmdKey(ref msg, keyData);
		}
	}
}
```
簡単に、ディレクトリ構造について

#はじめに
ディレクトリに構成について超簡単にまとめました。


##/(ルート)
ルートディレクトリ。最上階。

##/boot
起動に必要なファイル

##/bin

ls/chmod/cp/pwdなどの基本コマンドが入っています。
基本コマンドを管理しているので、ソフトのインストールに付随するコマンドなどはここにインストールしません。

##/dev

デバイスファイルが配置されています。

##/etc
システムやアプリケーションに関する設定ファイルやが配置されています。

##/lib

システム起動時に必要なものと、/binや/sbinディレクトリにあるコマンドを、実行するのに必要なものが保存されています。 

##/mnt(マウント)

リムーバブルメディアを使うときに利用するマウントポイント用ディレクトリです。 

##/opt

rpmなどパッケージ管理システムでプログラムをインストールする時に使用するディレクトリです。

##/proc（プロック）

各種プロセスのステータスを確認する際に利用されます。

##/root（ルート）

rootユーザーのホームディレクトリ。一般ユーザーのホームディレクトリと別になっているのは 
「/home」が壊れても大丈夫なようにです。

##/sbin（エスビン）

起動、停止や再起動などのシステム管理者用のコマンドが配置されています。

##/tmp（テンプ）

一時的な保存場所。メモリ上の一時ファイルを保存します。ダウンロードフォルダとして利用することもあります。再起動時に消去されます。また通常はcronで定期的に消去されます。

##/usr

ユーザーが共通利用するプログラム・ライブラリが配置されたディレクトリ。パッケージの追加をするとこのディレクトリの配下に配置されます。

##/var

ログやキャッシュなどの可変的システムデータ（動的ファイル）。一時的なという意味では/tmpと同じですが、こちらは再起動しても消去されずに残ります。

#参考

[WindowsのあのフォルダはUNIX/Linuxで言えばあそこだ](https://qiita.com/yuba/items/669f718fe6e62dbaab19)
[OXY NOTE](https://oxynotes.com/?p=5987)
[各ディレクトリの役割を知ろう（ルートディレクトリ編） (1/2)](http://www.atmarkit.co.jp/ait/articles/0108/07/news002.html)
[Linuxの/bin、/usr/bin、$HOME/binのそれぞれの役割](https://qiita.com/totzyuta/items/84d610f56129a186f0c5)
AWS/RDS/MySQL5.7を複製する

# やりたいこと
 - `AWS/RDS/MySQL5.7`のDBをもう一つ別に作りたかった

# やること
 - 元DBからdumpを取得して、新DBにインポートする

# RDSの設定変更
 - `RDS カスタムパラメーターグループの大域 log_bin_trust_function_creators システム変数に 1 を設定`

# ハマったこと
 - 元DBからdump取得までは良かったが、インポートするときにエラー出まくった

# コマンド
```shell
mysqldump -u <user_name> -p<password> -h <host> --quick --single-transaction --skip-triggers --compress --order-by-primary --databases <database_name> > <output_file>
```
 - パスワードは`-p`にスペース無しで記述（警告は出る `mysql: [Warning] Using a password on the command line interface can be insecure.`）
 - `--skip-triggers`オプションでtriggerに関わるエラーを回避

# エラー内容
```
ERROR 1227 (42000) at line <line number>: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
```

# 対処したこと
 - dumpファイルのエラーの箇所を全部修正

## 削除したもの
 - `SET @@SESSION.SQL_LOG_BIN= 0;`
 - `SET @@GLOBAL.GTID_PURGED='';`
 - `SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;`

これでなんとかインポートできました。

# 参考にしたもの(ほぼこの記事のおかげ)
 - [MySQLのDBからAWSのRDSへデータをインポートする](https://qiita.com/hikey/items/ab5fca33849d3e3929cb)

いつもQiitaに助けられてます。感謝。
conda の Python 仮想環境を peco で簡単に切り替える

<img src="https://qiita-image-store.s3.amazonaws.com/0/285675/d537950a-2809-338e-791f-928715a5685b.gif" alt="sample image switching conda environment using peco command" width="400px">

conda で管理している Python 仮想環境を peco で選択して簡単に切り替えます。


## 前提

以下をインストール済みであるものとして話を進めます。

- `Anaconda` OR `Miniconda`
- `peco`

これらのインストールに関しては次を参考にしてください。

- [Anaconda Downloads](https://www.anaconda.com/download/)
- [Miniconda Downloads](https://conda.io/miniconda.html)
- [peco/peco: Simplistic interactive filtering tool - GitHub](https://github.com/peco/peco)



## 設定

例えば、 bash であれば `~/.bashrc` とかに以下を追記してください。

```sh
function sa() {
    local conda_envs=$(conda info -e | awk '{print $1}' | grep -v "#")
    source activate $(peco <<< ${conda_envs})
}

alias sd="source activate base"
```

Shell 関数 `sa()` は `function` で宣言しなくても定義できます。

- `sa`: source activate
- `sd`: source deactivate

で名前を付けました。もちろんお好きな名前を付けられます。今回はシステムの Python を使わないために `source activate base` しているので、 deactivate はしていません。ですが便宜上 `sd` としています。 deactivate したい人は以下のようにしてください。

```diff
- alias sd="source activate base"
+ alias sd="source deactivate"
```

保存したら `source ~/.bashrc` もしくは `exec ${SHELL}` を実行して設定を読み込みます。

`source` は `conda` で置き換えることが可能です。最新の conda では `conda` コマンドで Python 仮想環境を切り替えることを推奨しています。 `conda activate` の初回実行ではエラーが出ると思うので次を参考にして解決してください。

- [conda activate の CommandNotFoundError への対処方法 - Qiita](https://qiita.com/peaceiris/items/e41488096e765269c93c)



## 使い方

`sa` を実行すれば、作成済みの仮想環境が一覧表示されます。カーソルキーや `Ctrl + n` `Ctrl + p` などで選択するか、インクリメンタルサーチをすることで切り替え先の仮想環境を選ぶことができます。エンターキーを押せば `source activate ${env_name}` が実行されて仮想環境が切り替わります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/285675/d537950a-2809-338e-791f-928715a5685b.gif" alt="sample image switching conda environment using peco command" width="400px">
長時間掛かるバッチの監視について

# 長時間掛かるバッチの監視
AWSのCloudWatchではカスタムメトリクスを作成することにより任意のshellスクリプトを用いてアラートを設定することが可能です。そこで、任意のプロセスを正規表現で抽出し継続実行時間が1時間以上の場合は警告する仕組みを考えて見ました。

まずは、1時間以上継続実行されるプロセスを表示するスクリプトを作成します。

```
#/bin/bash
#
# pickup process files of the over 3600sec execution time.
# in the process target strings
#
PregStr="i\/usr\/bin\/java(.*)\.jar"
PID=$$
for i in `ps -ef | grep -E "$PregStr" | grep -v $PID | grep -v grep | awk '{print $2}'`
do
  TIME=`ps -o lstart --noheader -p $i`
  if [ -n "$TIME" ]; then
    StartupTime=`date +%s -d "$TIME"`
    CurrentTime=`date +%s`
    ElapsedTime=`expr $CurrentTime - $StartupTime`
  else
    ElapsedTime=1
  fi
  if [ $ElapsedTime -gt 3600 ] ; then
    fpath=`ps -ef | grep -E "^[0-9]{1,}\s+$i\s+" | awk '{print $11}'`
    echo $fpath $ElapsedTime
  fi
done
```

上記を元に、CloudWatchにカスタムメトリクスに値を投げる処理を追加します。
以下は、追加イメージ（動作確認してません。。）

```
#!/bin/bash
export JAVA_HOME=/usr/lib/jvm/jre
export AWS_CLOUDWATCH_URL=https://monitoring.amazonaws.com
export EC2_REGION=ap-northeast-1

instanceid=$(curl -sS http://IP_ADDRESS/latest/meta-data/instance-id)


# batch start
LOG_FILE="ログファイルのパス"
echo $(date +'%Y-%m-%d[%H:%M:%S]')"CheckOver1HourPS START" >> $LOG_FILE

# 先ほどのシェルの echo $fpath $ElapsedTime を変数に
OVER_PS=$fpath $ElapsedTime

# put cloudwatch
RESULT=$(aws cloudwatch put-metric-data --metric-name "CheckOver1HourPS" --namespace "System/Linux" --dimensions "InstanceId=$instanceid" --value "$OVER_PS" --unit "Files" --region $EC2_REGION)

# end log
echo $(date +'%Y-%m-%d[%H:%M:%S]')"CheckOver1HourPS END" >> $LOG_FILE
```
Vue.jsで属性かv-bindかの応用

## 経緯

まずはじめに、私はVue.js初心者です。

ラジオボタンで選択したものを後から出てくるコンテンツでテキストを切り替えて表示したく、
かつ、タイトルのコンポーネント内で表示したいという時につまずき、いろいろ模索した結果解決出来たので、
ちょっと細かく残しておきます。


## まず、コンポーネントで親から子へデータをもたせるとき

（タイトルのコンポーネント）

親のテンプレート

```html
<com-child title-text="タイトルを表示する">コンテンツ内容</com-child>
```

子コンポーネント

```js
Vue.component('com-child',{
  template: '<section><h1>{{ titleText }}</h1><slot></slot></section>',
  props: ['titleText']
})
```

実際の表示

```html
<section><h1>タイトルを表示する</h1>コンテンツ内容</section>
```

ここで使われているものを簡単に説明

* component：同じHTML構造を繰り返し使える機能
* props：親で定義した属性を子のtemplate内で使うことができる（ケバブケースとキャメルケースが混ざることに注意）
* slot：親のコンテンツを子のテンプレートに反映させる


## やりたかったけど、できなかったこと

```html
<input type="radio" value="赤" v-model="selectColor">
<input type="radio" value="青" v-model="selectColor">

<com-child title-text="あなたが{{ selectColor }}から連想するものはなんですか？">コンテンツ内容</com-child>
```

このような感じで、選択したものを次のタイトルに表示したかったが、
これでは、`{{ selectColor }}`の部分がそのまま表示されてしまう

## 解決方法

`v-bind` ディレクティブを使う。

```html
<com-child v-bind:title-text="'あなたが' + selectColor + 'から連想するものはなんですか？'">コンテンツ内容</com-child>
```

これで、私がやりたかったことはできました。

赤を選択した時には、タイトルは「あなたが赤から連想するものはなんですか？」となります。

ちなみに、

```html
<com-child title-text="'あなたが' + selectColor + 'から連想するものはなんですか？'">コンテンツ内容</com-child>
```

では、「'あなたが' + selectColor + 'から連想するものはなんですか？'」と表示されてしまいます。

ポイントとなるのは、`属性`か`v-bind`かです。

### `属性`と`v-bind`

子コンポーネントに`props`を定義しておけば、コンポーネントの呼び出し時に`属性`にアクセスすることができます。

`v-bind`は属性に対して埋め込みたい時に使います。

```html
<a href="{{ url }}">リンク</a>
```

上記では正しく動きません。

```html
<a v-bind:href="url">リンク</a>
```

これが正しいです。
ちなみに、`v-bind`は省略できるので、以下でも同じです。

```html
<a :href="url">リンク</a>
```

### ※ここの部分がきちんと理解できてなかった

* 属性値は**文字列扱い**となる。
* 数値として値を渡したい場合は`v-bind:your-name="1"`のように表す
* v-bindで文字列を渡す場合は、`v-bind:your-name="'山田'"`のようにダブルクォートの中をシングルクォートでくくる

今回の場合は、属性の中にテキスト以外も含まれていたので、`v-bind`を使い、テキストの部分はシングルクォートでくくり、`+`で連結することで解決できました。

## 最後に

挙動が確認できるコードを載せておきます。

```html
<div id="app">
  <com-child title-text="好きな色はなんですか？">
    <input type="radio" value="赤" v-model="selectColor">赤
    <input type="radio" value="青" v-model="selectColor">青
  </com-child>

  <com-child v-bind:title-text="'あなたが' + selectColor + 'から連想するものはなんですか？'">
    <template v-if="selectColor === '赤'">
      <input type="radio" value="りんご" v-model="selectThing">りんご
      <input type="radio" value="ポスト" v-model="selectThing">ポスト
    </template>
    <template v-if="selectColor === '青'">
      <input type="radio" value="空" v-model="selectThing">空
      <input type="radio" value="サファイア" v-model="selectThing">サファイア
    </template>
  </com-child>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.min.js"></script>
```

```js
Vue.component('com-child',{
  template: '<section><h1>{{ titleText }}</h1><slot></slot></section>',
  props: ['titleText']
})
new Vue({
  el: '#app',
  data: {
    selectColor: '',
    selectThing: ''
  }
})
```
Bitcoin JSON-RPCを叩く

JavaScriptで [bitcoin/bitcoin](https://github.com/bitcoin/bitcoin) （Bitcoin core）の API を叩こうとしたとき、検索すると、いくつかの定番っぽい npm がヒットしますが、どれも古すぎてメンテナンスもされていません。

現在の Bitcoin core のバージョンは0.17ですが、0.16以前とは API 仕様に違いがあります。ウォレット関連で、いくつものAPIが deprecated になって、新しい API も新設されています。

* https://bitcoincore.org/ja/releases/0.17.0/

というか、Bitcoin core の API を JSON-RPC で叩くのはアホみたいに簡単なのでわざわざライブラリ、それも古代に書かれたものを使う必要性はありません。

## Bitcoin core JSON-RPC

bitcoindのrpc用のポートにHTTP POSTを投げるだけです。

筆者の好みでrequest-promiseで書くと以下のようなコードになります。

```js
const dispatch = async (host, rpcport, user, pass, method, ...params) => {
  const { result, error } = JSON.parse(
    await rp(`http://${host}:${rpcport}`, {
      method: 'POST',
      body: JSON.stringify({ method, params }),
      auth: { user, pass },
    }).catch(e => {
      if (e.statusCode) {
        return JSON.stringify({ error: JSON.parse(e.error).error })
      } else {
        return JSON.stringify({ error: e.error })
      }
    })
  )
}
```

たとえば `const { result } = await dispatch('localhost', 18332, 'u', 'p', 'help')`みたいに叩くだけです。いとも簡単ですね。

### 接続情報を毎回返さなくてもいいようにする

毎回、hostだのを書くのは大変なのでクライアントというものを作ってみます。

```js
export const createClient = ({ host, rpcport, user, pass }) => {
  return async (method, ...params) => {
    ...
  }
}

const client = createClient(.....)
client('help')
```

これだと `const client = createClient({host: 'localhost', ...})` でクライアントを作成し、クライアントの引数にメソッドとパラメータを渡すだけです。

### メソッドを引数ではなくてメソッドとして叩けるようにする

既存のライブラリだとクライアントのメソッドとして、`client.help()` とか `client.getBlockchainInfo()` のようなたたき方ができるので、それを実現します。

```typescript
export interface Client {
  [method: string]: (...args) => Promise<any>
}
```

まずは、Client型の定義をします。もっともこれはTypeScriptの話なので、JavaScriptだけで生きていく決意をしている方には不要です。


```typescript
export const createClient = ({ host, rpcport, user, pass }) => {
  const client: Client = new Proxy({}, {
    get: (target: any, method: string) => {
      if (method === 'then' || method === 'catch') {
        return target[method] // 実質 undefined
      }
      method = method.toLowerCase()
      return async (...params) => {
        // 省略
      }
    }
  })
  return client
}
```

[ECMAScriptで定義されているProxy](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Proxy)を使っています。Proxyオブジェクトは、メンバーへのアクセスを乗っとることができます。`get`ハンドラを書くと、メンバー変数の読み出し、メソッドの呼び出しを制御ます。

あと、既存のライブラリは、キャメルケースの区切りがいまいちよくわからない感じがあってクソダルいのと、もともとBitcoin coreのJSON-RPCのmethod名は、全部小文字と決まっているので、`.toLowerCase()`をしています。

ちなみに`then` `catch` を特別扱いしているのは、特定のケースでなぜかクライアント自体のthenが叩かれることがあるっぽいからです。

```js
return new Promise(resolve => {
  ...
  resolve(client)
})
```

みたいなコードを書いた時に、なるようです。おそらく、resolveする時だかthenを実際に呼び出すときだかに、resolveする変数がthenableかどうかチェックしているためでしょう。きっと。

既存のライブラリのように変換テーブルを持っておくのは手ですが、それだとAPIが追加されたときにいちいちテーブルに追加する必要があります。

## まとめ

* Bitcoin coreのJSON-RPCを叩くのにライブラリはいらん
  - むしろ古すぎて弊害が大きい
  - どうせ簡単
* 関数を返す関数で関数型プログラミング気分
  - Proxy 便利

最後に筆者が実際に使っているTypeScriptのコードは、[gist](https://gist.github.com/erukiti/cb6b11d6c2aa9f797426dd6e7155b3a8) に貼り付けてあります。
AndroidStudioでGradlePlugin 3.2に上げたら死んだ


表題の通りAndroidStudioのすすめるまま、GradlePluginのバージョン上げたらビルド通らなくなりました。
エラーログには Execution failed for task ':app:kaptStagingDebugKotlin' とあったのでKotlin関係でなんかあった？って調べ始めてたどり着いた先は違ったので解決までの道のりを記したいと思います。

## 結論

公式ドキュメントを読もう！
https://developer.android.com/topic/libraries/data-binding/start


## 原因

![スクリーンショット 2018-11-15 15.50.38.png](https://qiita-image-store.s3.amazonaws.com/0/44384/9db2aa39-e28b-d35c-677b-fac40751bdc8.png)


``` 
 Execution failed for task ':app:kaptStagingDebugKotlin'
```

タスク名みるとKotlin関係のライブラリの更新が必要なのかな？とか思いますがそっちじゃありませんでした。
Buildログをさかのぼってみるとこんな感じのエラーが大量に吐かれています。

![スクリーンショット 2018-11-15 16.03.53.png](https://qiita-image-store.s3.amazonaws.com/0/44384/6e6e9d87-7b32-bb83-b83a-a4937829fec3.png)

見たままですね。DataBindingの方で問題がありビルドが通らなくなってました。

## databinding.enableV2
先のエラーログから紆余曲折を経てたどり着いたのは公式ドキュメントでした…
https://developer.android.com/topic/libraries/data-binding/start

New data binding compiler for binding classes
のセクションに記載している通り、GradlePlugin 3.1より設定方法が変わっていました。
これまで以下のように記述していたと思いますが、これが変更にりgradle.propertiesで記載するようになっています。
また、dependenciesブロックに記載していたkaptの記載は不要になりましたので消しましょう。

```build.gradle
// 古い方
android{
  dataBinding {
      enabled = true
  }
  ...   
}

dependencies {
    kapt "com.android.databinding:compiler:$gradle_plugin_version" //これは不要
    ...
```


```gradle.properties 
// gradle plugin:3.1から
android.databinding.enableV2=true

```

## そのた
- Android Studioがすすめるままに更新したんですが、もともとのgradle pluginが2.3.3だったので解決までに時間かかりました…
  - dependenciesブロックのライブラリ記述方法がcompileからimplementationに変わってたりとか
- targetSdkも古いプロジェクトだったのでそっちの対応も必要だったり

## 参考

https://developer.android.com/topic/libraries/data-binding/start

この他3.2で変わったこと対応が必要なことについてはこちらが参考になるかもしれません。
https://qiita.com/takahirom/items/c8df8dfdc8056f903395
3.0 -> 3.1についてはこちら
https://qiita.com/taki4227/items/00e295c8aaf79d463312