OmniAICreator/Qiita-1.07M huggingface dataset:
OpenCVの基本操作

# 概要
OpenCVの基本操作を備忘録としてメモします。

## 画像の読み込みと表示
Lena.jpgがdataフォルダに入っていた場合の読み込み方法。

cv2.imreadで対象の画像を読み込む。
cv2.imshowで表示する。第一引数はウィンドウの名前（何でもいい）。第二引数に読み込みたい画像。
cv2.waitKey(0)は何かしらのキーが押されるまで待ち続ける。
キーが押されたら、cv2.destroyAllWindows()でウィンドウを消す。

```python:画像の読み込みと表示.py
import cv2

img = cv2.imread("./data/Lena.jpg")
cv2.imshow("img_test", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```

![Lena.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339647/1ee20624-19ad-d34a-feed-e9e6330685ac.jpeg)

## 表示ウィンドウの大きさを変えたいとき
cv2.namedWindowでウィンドウの設定。第一引数はウィンドウの名前（何でもいい。）
第二引数にウィンドウの設定。デフォルトではcv2.WINDOW_AUTOSIZEが設定されている。
（自動で大きさが決められる。）
これを、cv2.WINDOW_NORMALにすると、ウィンドウの大きさを自分で調整できるようになる。

```python:change_windowsize.py
import cv2

img = cv2.imread("./data/Lena.jpg")
cv2.namedWindow("window", cv2.WINDOW_NORMAL)
cv2.imshow("img_test", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```

## 画像のサイズを確認
画像が縦横何画素かを確認したいとき


```python:shape.py
print(img.shape)
```
->(512, 512, 3)
縦512画素, 横512画素、3チャンネル（カラー）であることを確認。
※画像がグレー画像の場合、第３引数は表示されない。


## 画像のリサイズ

画像を縦320, 横480画素にリサイズ

```python:resize.py
img_resize = cv2.resize(img, (256, 256))

cv2.imshow("resize", img_resize)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
![Lena_resize.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/339647/e2acaadf-83e0-12ab-8dda-e30f5e56bf08.jpeg)

ちゃんと指定の画像サイズになっているか確認。

```python:resize_sahpe.py
print(img_resize.shape)
```
->(256, 256, 3)

## まとめ
OpenCVの超基本操作をメモ。
そしてこれがQiita初投稿。
これからちょくちょくメモ代わりに投稿しようかと思います。
緑本のBUGSをStanで書いてみた

#緑本のBugsをRstanで書いてみた
みんな大好き[緑本（データ解析のための統計モデリング入門――一般化線形モデル・階層ベイズモデル・MCMC (確率と情報の科学)](https://www.amazon.co.jp/%E3%83%87%E3%83%BC%E3%82%BF%E8%A7%A3%E6%9E%90%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E7%B5%B1%E8%A8%88%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80%E2%80%95%E2%80%95%E4%B8%80%E8%88%AC%E5%8C%96%E7%B7%9A%E5%BD%A2%E3%83%A2%E3%83%87%E3%83%AB%E3%83%BB%E9%9A%8E%E5%B1%A4%E3%83%99%E3%82%A4%E3%82%BA%E3%83%A2%E3%83%87%E3%83%AB%E3%83%BBMCMC-%E7%A2%BA%E7%8E%87%E3%81%A8%E6%83%85%E5%A0%B1%E3%81%AE%E7%A7%91%E5%AD%A6-%E4%B9%85%E4%BF%9D-%E6%8B%93%E5%BC%A5/dp/400006973X)こちらに出てくる、BUGSのコードをRstanで実装したので、今日はそれのご紹介。

「10.5 個体差＋場所差の階層ベイズモデル」をRstanで書きました。

```
data {
    int N;
    int P; #Pot数（1～10に変換）
    int F; #施肥処理の有無（0-1に変換）
    int y[N];　＃個体差
    int pot[N];　＃Pot差
    int f[N];　＃施肥処理差
}

parameters{
    real beta1;
    real beta2;
    real id_est[N];　＃個体差
    real pot_est[P];　＃Pot差
    real<lower = 0> s1;
    real<lower = 0> s2;
}    

transformed parameters{
    real lambda[N];
      for(i in 1:N){
        lambda[i] = exp(beta1 + beta2*f[i] + pot_est[pot[i]] + id_est[i]);
      }
}

model {
    for(i in 1:N){
      y[i] ~ poisson(lambda[i]);
    }
    beta1 ~ normal(0, 100);
    beta2 ~ normal(0, 100);
    for(i in 1:N){
      id_est[i] ~ normal(0, s1);
    }
    for(p in 1:P){
      pot_est[p] ~ normal(0, s2);
    }
    s1 ~ normal(0, 1000);
    s2 ~ normal(0, 1000);
}

```


書籍のBUGSのコードでは、lambdaは`log(lambda[i] <- beta1 + beta2*F[i] + r[i] + rp[Pot[i]]`としていますが、このコードではtransformed parametersのところで、exponentialに式変形しています。

書籍では、「beta2の（周辺）事後分布の95%区間は-2.45%から0.75ぐらい」とあり、このStanで再現した場合のbeta2の95%区間は-2.49 ~ 0.74となりましたので、再現できているかと思います。(iteration 2000, burn in 400, chain 3)

もし間違ってるよ、等あればご連絡ください。。
AWS LambdaでNode.js 6.10のサポート期限らしいので更新してみる

AWSから、Node.js 6.10がEOLになるとの連絡がありました。
<img width="892" alt="スクリーンショット 2019-04-21 14.09.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135431/c95d63a6-57c9-a7bb-12f4-eb3862023bff.png">
参考: [【注意喚起】AWS LambdaでNode\.js 6\.10ランタイム構成の新規作成/更新が終了となります ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/eol-for-node-js-610/)

先日作成した、[短縮URLサービスを作って見た　ー　短縮\.jp](https://xn--s7y86k.jp/)も、Node.js 6.10を使っていたので、更新しておきました。

といっても、Lambdaの編集画面から、ランタイムを変更しただけです。
<img width="775" alt="スクリーンショット 2019-04-21 14.09.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135431/3b84ed1d-73e9-de6c-e3d8-a5740b26390c.png">


当時の記事: [サーバレスで短縮URLサービスを作ってみる（2018年度版） \- Qiita](https://qiita.com/kkoiwai/items/d7875b9d10b518390926)
DataBindingのエラーがよくわからない件をなんとかしたい

# はじめに
業務でAndroidアプリを開発していてDataBindingを使わないってことはほぼほぼないかと思いますが(組み込みなんかはどうかわかりませんが)、ビルド中にDataBinding関連でエラーが出たときに何が悪いのかよくわからん！ってなることがままあったので自分の備忘録も兼ねて投稿。

# どうしたらいいのか
app/build.gradleに以下を追加することで詳細なところまでエラー内容が出力されるようになります。

    kapt {
        javacOptions {
            option("-Xmaxerrors", <lineCount>)
        }
    }
lineCountのところにエラー行数を設定するかたちです。
とりあえず大きな数字入れておけばだいたい出ます。

# おわりに
DataBindingで出るエラーって大抵app/build配下のファイル対象で出るのでなんだこれもうわからん状態になるのでとりあえずで入れてしまってもいいかもしれません。
自分の経験から言うと大抵レイアウトファイルで使ってるstringなんかの定義名を変えたあとの変更漏れなんかがエラー原因だったりするので変更差分を見たらわかることが多いんですけどね。
ネットワーク計算 中国語

把192.168.253.0/28划分多个子网，请列出所有的可用子网段和对应主机范围？
解：
1、计算子网

掩码为28个1，即11111111.11111111.11111111.11110000，点分十进制表示为255.255.255.240，

掩码1对应的IP为网络位，掩码0对应的IP为主机位。（主机的IP地址即由网络地址+主机地址组成）。

192.168.253.0000 0000

255.255.255.1111 0000

前24位的网络地址已经固定了，为192.168.253 ，只能对最后边的0进行子网划分。

根据掩码11110000可知，前四位为网络位，后四位为主机位。保持后四位主机位全为0（主机地址全0代表IP地址为网络地址），四位网络位有以2^4=16种组合（即16个子网）

0000 0000，换成十进制为0，即子网为192.168.253.0
0001 0000，换成十进制为16，即子网为192.168.253.16
0010 0000，换成十进制即32，即子网为192.168.253.32
0011 0000，换成十进制即48，即子网为192.168.253.48
0100 0000，换成十进制即64，即子网为192.168.253.64
0101 0000，换成十进制即80，即子网为192.168.253.80
……
1110 0000，换成十进制即224，即子网为192.168.253.224
1111 0000，换成十进制即240，即子网为192.168.253.240

2、然后再计算主机范围：
再把每一个网络号对应的主机地址换成全1，即每一个子网的最大主机地址，如下：
子网192.168.253.0，最大主机地址为0000 1111，换成十进制为15
子网192.168.253.16，最大主机地址为0001 1111，换成十进制为31
子网192.168.253.32，最大主机地址为0010 1111，换成十进制为47
……
子网192.168.253.240，最大主机地址为1111 1111，换成十进制为255

3、最后一定不要忘记，主机范围中要把子网地址和全1的主机地址（即广播地址）去掉：
子网：192.168.253.0/28，主机范围：192.168.253.128-192.168.253.14
子网：192.168.253.16/28，主机范围：192.168.253.17-192.168.253.30
子网：192.168.253.32/28，主机范围：192.168.253.33-192.168.253.46
……
子网：192.168.253.240/28，主机范围：192.168.253.241-192.168.253.254
vbsの作法 その24

#概要

vbsの作法調べてみた。
html取得、やってみた。


#サンプルコード


```
Function GetHtml(url)
	Const adTypeBinary = 1
	Const adTypeText = 2
	Dim oHttpReq, oStream
	Dim sText
	Set oHttpReq = CreateObject("MSXML2.ServerXMLHTTP.3.0")
	oHttpReq.Open "GET", url, False
	oHttpReq.Send
	Set oStream = CreateObject("ADODB.Stream")
	oStream.Open
	oStream.Type = adTypeBinary
	oStream.Write oHttpReq.ResponseBody
	oStream.Position = 0
	oStream.Type = adTypeText
	oStream.Charset = "Shift-JIS"
	sText = oStream.ReadText
	oStream.Close
	GetHtml = sText
End Function

Dim html
html = GetHtml("http://jsdo.it")
msgbox html


```

以上。
一度しか実行できないPL/pgSQL関数

# はじめに
１回しか実行できないSQL関数なんてものがあると面白いかな、と思ってPL/pgSQL関数を作って試してみた。
## 検証環境
PostgreSQL 12-develで確認。

# 定義
例えば、以下のような``suicide()``というPL/pgSQL関数を``CREATE FUNCTION``を使って作成してみる。

```sql
testdb=# CREATE OR REPLACE FUNCTION suicide( )
 RETURNS INTEGER
 LANGUAGE plpgsql

AS $function$
DECLARE
  sql TEXT;
BEGIN
  --
  -- なにか処理を書く
  --
  sql := 'DROP FUNCTION suicide()';
  EXECUTE sql;
  RETURN 0;
END
$function$

;
CREATE FUNCTION
testdb=#
```
# 実行してみる
まず、さきほど作成したSQL関数が存在するか``\d``メタコマンドで確認してみる。

```
testdb=# \df
                        List of functions
 Schema |  Name   | Result data type | Argument data types | Type
--------+---------+------------------+---------------------+------
 public | suicide | integer          |                     | func
(1 row)

testdb=#
```

SELECT文を使って、sucide()を実行する。

```
testdb=# SELECT suicide();
 suicide
---------
       0
(1 row)

testdb=#
```
とくに何もエラーにもならず、関数は実行された。

再び、``\df``メタコマンドで確認する。

```
testdb=# \df
                       List of functions
 Schema | Name | Result data type | Argument data types | Type
--------+------+------------------+---------------------+------
(0 rows)

testdb=#
```

suicide()関数は消えてしまった。消えてしまったので、再度実行しようとしてもエラーになる。

```sql
testdb=# SELECT suicide();
psql: ERROR:  function suicide() does not exist
LINE 1: SELECT suicide();
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
testdb=#
```

# おわりに
一度しか実行できない、SQL関数ができた。
これが何の役に立つのかは、作った自分にもわからない。

つか、実行中の関数だから削除できないと思ったのに・・・
リストを一定間隔で分割し，リストのリストにする

2019/4/22追記
List.Split関数ありますね。
確認したところ、Excel2010のアドイン版ですら使えました。
お騒がせしました。:sweat_smile:

公式リファレンス：List.Split()
https://docs.microsoft.com/en-gb/powerquery-m/list-split

~~リスト関数群には，この問題を直接に解決する関数が見当たりませんでした．ついにTable.Partition()の出番です．~~

##やりたいこと
下記のような具合で分割したい．

**元のリスト（規則的は不要）**
![ソースのリスト.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/e1250559-7010-82f4-f7d9-4a088e48b579.jpeg)

**分割後のリスト**
![結果のリスト.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/0113bdb8-5d5c-c371-d440-f20d62b18c38.jpeg)



##直接変換できる関数は･･･見当たりました(冒頭文参照)

- List.Alternate()：リストを所々スキップできるだけで，リストのリストにはならない．
- List.Generate()：数珠つなぎしても，2階層のリストのリストにはならない．つまり，

　　　　{{リスト1個目,リスト2個目},リスト3個目}

という具合に階層が深くなって行ってしまう．

- List.Range()：1グループごと書けば実現できるけれど，分割数が多いと面倒くさい．
- List.Zip()：期待したが，駄目．存在理由自体が不明．


##コード

```query:リスト分割
let
    //適当なリスト．中身は何でもよいです．
    ソース = List.Generate(()=>0,each _<205,each _+2),
    //任意．
    分割する1単位 =15,
    
    テーブルに変換 = Table.FromList(ソース, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    インデックス列を追加 = Table.AddIndexColumn(テーブルに変換, "インデックス", 0, 1),
    テーブルのリストに変換 = Table.Partition(インデックス列を追加,"インデックス",
                                           Number.IntegerDivide(Table.RowCount(インデックス列を追加),分割する1単位)+1,
                                           each Number.IntegerDivide(_,分割する1単位)
                           ),
    各要素をリストに変換 = List.Transform(テーブルのリストに変換,each _[Column1])
in
    各要素をリストに変換

```

##多少の解説
テーブルに変換後，分割基準としてインデックス列を入れ，それを基準にTable.Partition()でテーブルのリストにします．
で，そのリストの各要素（つまり分割された各テーブル）に対しList.Transform()で，当初の列（Column1）を抜きます．
※リストをテーブル化すると,その列名はデフォルトで「Column1」になります．

##リンクなど
公式リファレンス：Table.Partition()
https://docs.microsoft.com/en-us/powerquery-m/table-partition
公式リファレンス：List.Transform()
https://docs.microsoft.com/en-us/powerquery-m/list-transform
Auth0 で LINE WORKS に SSO

## Auth0 を SAML 連携で LINE WORKS の IdP

LINE WORKS は SAML と OAuth の SSO に対応しています。
ここでは、Auth0 を SAML 連携で LINE WORKS の IdP として利用します。

## Auth0 でユーザー作成
1. Auth0 の管理画面にアクセス
- [Connections] メニューを展開し、[Database] サブ メニューを開く
- [+ Create DB Connection] ボタンをクリック
- [Nemae] に任意の名前を入力
- [Create] ボタンをクリック
- [Users & Roles] メニューを展開し、[Users] サブ メニューを開く
- [+ Create User] ボタンをクリック
- Email, Password, Repeat Password を入力、Connection で先ほど作成した Database を選択
- [SAVE] ボタンをクリック
- 表示された [User Detail] の [Details] タブの下方の [Identity Provider Attributes] で [user_id] の値を確認 (LINE WORKS のユーザーの External key に用います)

## Auth0 の Application 設定

1. Auth0 の Applications メニューで [+ CREATE APPLICATION] をクリック
- 任意の [Name] を設定し、[Chose application type] で "Regular Web Applications" を選択し、[CREATE] をクリック
- [Settings] タブの [Allowed Callback URLs] に "https://auth.worksmobile.com/acs/[tenant_name]>" を入力
- [Addons] タブで "SAML2" のトグルを ON にする
- [SAVE] をクリック
- [Show Advanced Settings] をクリック
- 展開された Advance Settings の[Endpoint] タブを開く
- [SAML Protocol URL] の値をコピーしておく
- [Certifacates] タブで [Download Certificate] をクリックし pem 形式のファイルをダウンロード 
- [Connections] タブで先ほど作成した Database のトグルを ON 、その他を Off にする

## Auth0 の Tenant Settings

1. Tenant Settings https://manage.auth0.com/#/tenant/advanced にアクセス
2. [Advanced] タブで [Allowed Logout URLs] に https://common.worksmobile.com/proxy/my を設定

## LINE WORKS の SSO 設定

LINE WORKS の SSO に関するドキュメントはこちらです。
https://developers.worksmobile.com/jp/document/1?lang=ja

1. LINE WORKS の Developer Console の SSO 設定画面にアクセス
https://developers.worksmobile.com/jp/console/sso/config/view

2. SSO Type の各設定項目を以下のとおり設定
    - [SAML] を選択
    - [Web Login URL] に Auth0 の SAML Protocol URL (先ほどコピーしたもの) を入力
    - [Logout URL] に "https://[your_domain_name].auth0.com/v2/logout?returnTo=https%3A%2F%2Fcommon.worksmobile.com/proxy/my" を入力
    - [Certifcate File] で先ほどダウンロードしたファイルをアップロード
3. 構成員 External Key Mapping で以下の操作
    - [一覧のダウンロード] をクリック
    - ダウンロードした ExternalKey_member.csv ファイルを開く
    - ExternalKey にユーザーごとに Auth0 の user_id を入力
    - ファイルを上書き保存
    - [アップロード] をクリックして編集したファイルをアップロード
4. SSO Type の [適用] ボタンをクリック

## SSO の動作を確認

モバイル アプリ、PC アプリ、ブラウザ、ドライブ エクスプローラー、POP/IMAP のいずれも SSO で動作します。

ここではモバイル アプリでの SSO の動作を確認します。

1. LINE WORKS モバイル アプリを起動  
2. LINE WORKS のユーザー名を入力し [ログイン] をタップ  
 <img width="150" alt="S__2924549.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/0117b67f-cb34-c4c4-6ced-5a9ae31ff7b9.jpeg">  

3. Auth0 の認証画面にリダイレクトされる  

<img width="150" alt="S__2924552.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/d0a3bb17-128d-53a1-e047-44db8ac1a607.jpeg">  

4.Auth0 のユーザーのユーザー名、Password を入力し、[LOG IN >] をタップ  

<img width="150" alt="S__2924551.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/bef7ab34-ac12-eb99-d69b-2d3e344ff48f.jpeg">  

5.LINE WORKS にログイン完了

![1555823735.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/d9a5f9c4-399e-e7d9-23df-60afa4ffab12.png)
git develop, feature branch作成からmergeするまで　(自分用メモ)

Git flowについての解説を書き残します。
ここでのGit flowはプラグインのことではなく、ブランチを用いた基本的なgitの開発手法についてです。
(developブランチ、featureブランチを作り、改修、masterへのマージまで)

#developの作成(最新の開発履歴)
```ruby:
$ git branch #現在の位置がmasterブランチか確認
$ git branch develop #develop作成
$ git checkout develop #developへの移動
$ git push origin develop #remoteに反映
```

#featureの作成(新しく追加する機能の開発や、簡単なバグの修正など)
```ruby:
$ git branch #現在の位置がdevelopブランチか確認
$ git branch feature/(任意の名称) #feature作成
$ git checkout feature/(任意の名称) #移動

#改修後
$ git add . # サブディレクトリも含めたファイルをインデックス領域へアップ
$ git commit -m "message" # ローカルリポジトリへコミット
$ git push origin feature/(任意の名称) # feature/(任意の名称)ブランチの内容をoriginへアップロード
```

#developへのmerge
```ruby:
$ git checkout develop # featureブランチからdevelopへ移動
$ git merge feature/(任意の名称) # featureブランチをdevelopへマージ
$ git branch -d feature/(任意の名称) # featureブランチ削除
```

#masterへのmerge
```ruby:
$ git checkout master # masterブランチへ移動
$ git merge develop # developブランチをmasterブランチに取り込む
$ git push origin master # feature/(任意の名称)ブランチの内容をoriginへアップロード
```
【VBA】文字列がすべて全角か判定する

【小ネタです】
ユーザーフォームやセル上に入力された文字列が
すべて全角かどうか判定したいときがある。
（例：名前は全角のみ、など）

こんな時、下記の関数を作成し実行すれば判定可能

```vb
Public Function IsAllCharWide(ByVal Strings As String) As Boolean
'---------------------------------------
'---　引数：Strings -> 判定する文字列
'---  返値：True -> Stringsはすべて全角
'---       False -> Stringsに半角が含まれる
'---------------------------------------

Dim i As Long
Dim Length As Long
Dim strANSI As String

Length = Len(Strings)  
    For i = 1 To Length
        strANSI = StrConv(Mid(Strings, i, 1), vbFromUnicode) '---UnicodeからANSIに変換。1文字ずつチェックする。---
        '---バイト数を計算---
            Select Case LenB(strANSI)
                Case Is = 1
                    IsAllCharWide = False
                    Exit Function
            End Select
        '------
    Next i
    IsAllCharWide = True
End Function
```
#動作確認済み環境
- Excel
    - 2007,2010
- Access
    - 2003,2007,2010,2013
[随時更新予定] コマンドまとめ


#### はじめに
僕がよく使うコマンドまとめを備忘録として記載しました。

## git 

#### ローカルにリポジトリを作成し、リモートにプッシュする

プロジェクトのルートディレクトリにて、以下のコマンドを実行します。

```
$ git init 
$ git add .
$ git commit -m "Initial commit"
$ git remote add origin https://github.com/XXXX/XXXXXX.git
$ git push -u origin master
```
`https://github.com/XXX/XXXXXX.git`は、sshのURLでの可能。
また`git add`(ファイルを登録するコマンド)をする場合、
ルートディレクトリ以下全てのファイルをコミットしたいなら`$ git add .`
ファイルを指定するなら`git add <ファイル名>`としてください。
Gradleでgitからバージョン番号を自動生成してJavaで使う

## やりたいこと
+ gitのtagとコミットハッシュからバージョン番号を生成
+ tagの中からバージョンを示すtagだけを絞り込む
+ 自動生成したバージョン番号をJavaのコードから使用する

## 参考にしたサイト
[Gradle でバージョン番号を自動的に付ける 〜 git-describe とのコラボ](https://dev.classmethod.jp/server-side/gradle/gradle-auto-versioning-with-git/)
[grgit-gradle](http://ajoberstar.org/grgit/grgit-gradle.html)
[BuildConfig Gradle-plugin for Java and Groovy projects](https://github.com/mfuerstenau/gradle-buildconfig-plugin)

## 実装
+ grgitでバージョン番号取得
+ v[数字]で始まるタグをバージョンを示すタグとして、それ以外のタグを無視します
+ BuildConfigでバージョン番号を含むクラスを自動生成してjavaコードから使用
    + android pluginにはBuildConfigが含まれているみたいですが、今回はBuildConfigプラグインを使います

```gradle:build.gradle
plugins {
    id 'idea'
    id 'application'
    id 'org.ajoberstar.grgit' version '3.1.1'
    id 'de.fuerstenau.buildconfig' version '1.1.8'
}

group 'com.example'
version = {
    def tags = grgit.tag.list().collect { it.getName() }
    def versionStr
    if (tags.any { it ==~ /v\d.*/ }) {
        versionStr = grgit.describe(longDescr: false, tags: true, match: ["v[0-9]*"])
    } else {
        versionStr = grgit.head().abbreviatedId
    }
    return versionStr + (grgit.status().isClean() ? "" : "+dirty")
}()

repositories {
    mavenCentral()
}

task showVersion {
    doLast {
        println version
    }
}

mainClassName = 'Main'
```

```java:Main.java
import com.example.BuildConfig;

public class Main {

    public static void main(String... args) {
        System.out.println(BuildConfig.VERSION);
    }
}
```

## 実行例
### バージョンを示すタグがない場合
```
2f9b747  // コミットハッシュ
```
### HEADにバージョンを示すタグがある場合
```
v0.1
```
### バージョンを示すタグから追加でコミットした場合
```
v0.0-10-g3636be7
```
### コミットされていない変更がある場合
```
v0.0-10-g3636be7+dirty
```
Elixir~名前付き関数とモジュール化~


#ここまでのあらまし

Elixir Zen Styleという記法に基づいて学習を進めています。
ひとつ関数をモジュール化、PJにして実行するまでをドキュメントにまとめてみようと思います。

#本題

適当なディレクトリで

```elixir
mix new example
```
します。


式はこちら

```elixir:lib/example.ex

defmodule E do
  def example(list) do
    list
    |> Enum.map( &IO.puts(&1) )
  end
end
```

listという引数を持ったexampleという関数で、Enum.mapを用いてそれぞれの要素をIO.putsで出力する。
今回のポイントは、Enum.mapに任意の関数を書くことで呼び出すことができる、という点でした。
また、要素ひとつひとつに対して呼び出した関数を適用する際に、Enum.mapを使う。ここもポイントです。

`````elixir
cd example
iex -S mix
```

これで

```elixir
iex > E.example([1,2,3])
1
2
3
[:ok, :ok, :ok]

```

アトムや文字列に関しても

```elixir
iex > E.example([111, :atom, "hello"])
111
atom
hello
[:ok, :ok, :ok]
```
無事出力してくれます。

#編集後記

サラっと書いてしまいましたが、やや雲を掴むようだったElixir学習について、少しずつ光が射し始めてるような気がしています！
北九州へ来て2ヶ月。
うまずたゆまず、頑張ります。
Kento Mizuno
C++ Builder 10.2 Tokyo [不具合] > font > ScaleBy()で拡大表示されない > 対処:フォントを「clWindowText」から「clWindowFrame」に変更して保存し、「clWindowText」に戻す > 症状の理由: 特定のプロパティが.dfmになかった

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
```

### 症状

- XE4のプロジェクトを10.2Tokyoへ移行
- ScaleBy()でフォントが大きくならない
    - TLabel
    - 大きくなるTLabelコンポーネントもある

### 対処

- フォントの色を変更
    - 変更前: clWindowText
    - 変更後: ~~clBlack~~
        - 近くにあるclWindowFrameの方が変更が楽

**上記の操作によって、拡大表示されるようになった後は、再度clWindowTextに戻してもScaleBy()により拡大される**
IDEのミスなのかもしれない。
(`.dfm`ファイル関連?)

### 所感

「嘘だろ」
「嘘だろ」
「嘘だろ」

### 備考

- ~~clBlackで良いかは検討したほうがいいかもしれない~~


### 変わった部分

上記の操作によって追加されたものは以下。

```.dfm
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      ParentFont = False
```

これらが何故`.dfm`に元々なかったのかは不明ではある。
(追記 2019-04-24: `.dfm`には標準から変更された項目が保存されるため、標準から変更されたものでないこれらは保存されないのだろう）

### 備考

- `.dfm`を書換えてもいいが、それは（本来）IDEのユーザがすることではないと思うので、やめておく


### 影響するコンポーネント

上と同じような不具合が発生するコンポーネントは、確認したかぎりでは

- TButton
- TEdit
- TLabel
- TComboBox

これらすべてに同じ対処をすることになる。
Leetcode #748: Shortest completing word

```swift
func shortestCompletingWord(_ licensePlate: String, _ words: [String]) -> String {
    var dict = [Character: Int]()
    for char in licensePlate {
        if (char >= "a" && char <= "z") || (char >= "A" && char <= "Z") {
            let lowerCaseChar = char.toLowerCase()
            if let value = dict[lowerCaseChar] {
                dict[lowerCaseChar] = value + 1
            } else {
                dict[lowerCaseChar] = 1
            }
        }
    }
    var answer = ""
    var count = 1001
    
    for word in words {
        let wordCount = word.count
        if wordCount >= count {
            continue
        }
        var wordDict = [Character: Int]()
        for char in word {
            if let value = wordDict[char] {
                wordDict[char] = value + 1
            } else {
                wordDict[char] = 1
            }
        }
        
        var completed = true
        for key in dict.keys {
            if let value = wordDict[key] {
                if value < (dict[key]!) {
                    completed = false
                }
            } else {
                completed = false
                break
            }
        }
        if completed, wordCount < count {
            answer = word
            count = answer.count
        }
    }
    return answer
}

extension Character {
    static let upperToLowerDict: [Character: Character] = ["A": "a", "B": "b", "C": "c", "D": "d", "E": "e", "F": "f", "G": "g",
                                                           "H": "h", "I": "i", "J": "j", "K": "k", "L": "l", "M": "m", "N": "n",
                                                           "O": "o", "P": "p", "Q": "q", "R": "r", "S": "s", "T": "t", "U": "u",
                                                           "V": "v", "W": "w", "X": "x", "Y": "y", "Z": "z"]
    func toLowerCase() -> Character {
        if self >= "a" && self <= "z" {
            return self
        } else {
            return Character.upperToLowerDict[self]!
        }
    }
}
```
#Linux サーバーで #cron の実行 log をリアルタイムで見守る方法

```
$  tail -f /var/log/cron
```

以上。

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1368








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
プロジェクトディレクトリ共有にDropboxなんて使うな

# はじめに
家のiMacと持ち出しているMacBookProでプロジェクトディレクトリを同期させたい…………
今までiCloud、Dropbox、GoogleDrive、Nas等を使って試した結果このあたりのツールはファイルサイズというよりファイル数が多いディレクトリの共有が遅いようだ
venderディレクトリ、node_modulesディレクトリはすぐに数千ファイルになり、これが数十プロジェクトになると丸一日かけても同期が終わらないこともある
CPUもやたらと使い、開発中は同期をOFF、終わったら同期をONはしたくない

# そこでSyncthing
Go言語で書かれたオープンソースの同期ツール
https://github.com/syncthing/syncthing

## すごいところ
- 他ツールと比べると半端ではなく早い  
laravelプロジェクト30個ほどの同期はDropboxだと丸2日、iCloudだと丸3日かかっても終わらなかったがSyncthingは2時間程度で終わった。
- WAN越しでもいける  
中継サーバーを使い、IPアドレスではなくDevice IDというコードを使って接続する
- Win、Mac、iOS、Android対応
- バージョン管理可能  
ゴミ箱機能、期間別等フォルダ分け等が行えるけど、プロジェクトディレクトリの共有という目的ならいらないかも
- サーバーにインストールしてクラウドストレージとしても使える  



# 導入方法
dmgを実行するだけ！簡単！
https://github.com/syncthing/syncthing-macos/releases/tag/v1.0.0-2

設定は以下
https://docs.syncthing.net/intro/getting-started.html#installing

# おまけ
・開発用DBどうするの問題
docker使おう
プロジェクトディレクトリ内にフォルダとして保存できるから

・やっぱりCPU利用率高いよ問題
cputhrottleいれて以下を実行


```bash
#!/usr/bin/env bash
SYNC_THING_ID=`ps -A | grep -m1 syncthing | awk '{print $1}'`
sudo cputhrottle $SYNC_THING_ID 10 &
```

https://forum.syncthing.net/t/limiting-syncthings-cpu-load/2237/2
numpyを使って行列を対角化させて、べき乗を求める。

## 行列のべき乗を求めたい。

行列の対角化を学習すると、必ず出てくるのが行列のべき乗を求める演習問題です。
今回はこの定番の演習問題をPythonを使って解いてみたいと思います。

---

### まずは`np.linalg`を使って直接求めてみる。

今回はAとして以下の様な行列をとることにします。

```python:
import numpy as np
A = np.array([[0.,1.,0.],[0.,0.,1.],[-2.,1.,2.]])
```

`np.linalg`を使って、例えばAの5乗を求めたければ以下の様に書けば求まります。

```python:
print(np.linalg.matrix_power(A,5))
```

実際に上のコードを実行すると以下の行列が表示されます。これがAの5乗ということになります。
[[-10.   1.  10.]
 [-20.   0.  21.]
 [-42.   1.  42.]]

余談ですが、以下の様に書くと`np.linalg`の機能一覧が表示されます。

```python:
import numpy as np
help(np.linalg)
```

### 対角化してみる。

では次に一度対角してからAのべき乗を求めてみたいと思います。
以下の様に書くと、Aの固有値と、固有ベクトルを並べた行列が一気に求まります。

```python
print(np.linalg.eig(A))
```

今回の場合は、固有値は2,1,-1で。固有ベクトルを並べた行列は
array([[-0.21821789,  0.57735027, -0.57735027],
       [-0.43643578,  0.57735027,  0.57735027],
       [-0.87287156,  0.57735027, -0.57735027]])
となります。
これをPとおくことにします。

```python
P = np.array([[-0.21821789,  0.57735027, -0.57735027],
              [-0.43643578,  0.57735027,  0.57735027],
              [-0.87287156,  0.57735027, -0.57735027]])
```

次にPの逆行列を求めます。

```python
P_inv = np.linalg.inv(P)
```

あとはP_inv,A,Pを順に掛けていきます。

```python
X = np.dot(P_inv,A)
B = np.dot(X,P)
```

すると、BはAを対角化した行列、すなわち対角成分が固有値の2,1,-1である対角行列となることが確認できます。

### 行列Aのべき乗を求める。

Bのn乗は、対角成分が(2のn乗),(1のn乗(つまり1)),((-1)のn乗)である対角行列です。今はAの5乗を求めたいのでn=5とすればBの5乗は対角成分が32,1,-1の対角行列です。
よってあとはこの対角行列にPとPの逆行列を掛けていけばOKということになります。

```python
B_5 = np.array([[32.,0.,0.],[0.,1.,0.],[0.,0.,-1.]])
Y = np.dot(P,B_5)
A_5 = np.dot(Y,P_inv)
# Aの5乗を表示。
print(A_5)
```

実際にこのコードを実行すると、下のような結果が表示されます。
[[-1.00000000e+01  1.00000000e+00  1.00000000e+01]
 [-2.00000000e+01  4.70962477e-16  2.10000000e+01]
 [-4.20000000e+01  1.00000000e+00  4.20000000e+01]]

### まとめ

```python:まとめ
import numpy as np
A = np.array([[0.,1.,0.],[0.,0.,1.],[-2.,1.,2.]])

#Aの5乗を計算。
print(np.linalg.matrix_power(A,5))

#Aの固有値と固有ベクトルを計算。

B_5 = np.array([[32.,0.,0.],[0.,1.,0.],[0.,0.,-1.]])
Y = np.dot(P,B_5)
A_5 = np.dot(Y,P_inv)
#Aの5乗を表示。
print(A_5)
```

因みに以下の様にすると計算時間を測れますが、3次正方行列くらいだとほとんど変わらないですね。(´-ω-`;)

```python
start=time.time()
print(np.linalg.matrix_power(A,1000))
float(time.time())-start
```

```python
start=time.time()
P = np.array([[-0.21821789,  0.57735027, -0.57735027],
              [-0.43643578,  0.57735027,  0.57735027],
              [-0.87287156,  0.57735027, -0.57735027]])
P_inv = np.linalg.inv(P)
B_5 = np.array([[np.power(2,1000),0.,0.],[0.,1.,0.],[0.,0.,np.power(-1,1000)]])
Y = np.dot(P,B_5)
A_5 = np.dot(Y,P_inv)
print(A_5)
float(time.time())-start
```
Cousera Deep learning specialization を受講する


[Deep learning specialization](https://www.coursera.org/specializations/deep-learning)を受講中です．

- Neural Networks and Deep Learning
- Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization
- Structuring Machine Learning Projects
- Convolutional Neural Networks
- Sequence Models  
上記の全5コース．受講を終えたコースについて簡単な感想を残します．

## Neural Networks and Deep Learning

#### Introduction to deep learning

イントロダクション．

#### Neural Networks Basics

ニューラルネットワークと言いつつ，ひたすらロジスティック回帰をやる．（何も間違ってはいないけど）
計算グラフや微分計算を含めて，基礎的なことを全部やるので，コース１の中ではこの週が一番大事．

入力テンソルの型を（特徴数，サンプル数）と扱うのが特徴的．（むしろこれが主流？）
（サンプル数，特徴数)とするのが一般的だと思っていたので，最初は「何故入れ替えた？」と思ったけど，計算のしやすさ（転置行列を何度もとる必要がない）を考えると（特徴数，サンプル数）の表現の方が良い．業界標準にしてほしい．

#### Shallow neural networks

隠れ層を追加して，少しNeural Networkっぽい様相を呈してくる．
(しかし，やっていることはほとんどロジスティック回帰だ! Neural Networkはロジスティック回帰で出来ている!)

#### Deep Neural Networks  

隠れ層をさらに増やしたDeepなNetworkを扱う．
新しい内容は無いが「Forward/Back Propagation をどういう処理のまとまりとして捉えるか？」という点が整理される．「各レイヤーが担う処理をカプセル化して，あとは何も考えずに層を増やしていきましょう！」というお話．


## Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization


#### Practical aspects of Deep Learning

この週のテーマは大きく分けると「過剰適合の抑制」と「いい感じに学習を進めるための工夫」    

「過剰適合を抑制する手段」としては，正則項を加える・Dropout・データ拡張・Early-Stopping 等々．Early-Stoppingは個人的にはあんまり好きじゃないのだけれど，Andrew先生的にもあまり推していないご様子．（「『コスト関数Jを小さくしたい』，『Over fittingを抑制したい』という２つのことを同時にやろうとしている所が微妙だよね」的な事を言っていた気がする）  

「いい感じに学習を進めるための工夫」としては，データの正規化や重みパラメータの初期化（Xavier, He の初期値)についての話．Xavierの初期値の説明は，６分ほどの動画でさらっと言っているけど，よく分からなかったので書籍等で捕捉．オライリー・ジャパンの『ゼロからつくるDeep Learning』の「6.2 重みの初期値」の説明がとても分かりやすかった．）

#### Optimization algorithms

ミニバッチ学習について，とか，各種最適化手法(SGD, RMSprop, Adam)について．プログラミング課題の中で「Optimizerを変えるだけで結果がかなり違う」ていうのが体感できてよかった．    

#### Hyperparameter tuning, Batch Normalization and Programming Frameworks

ハイパーパラメータのチューニングと，Batch Normalization について．  
プログラミング課題はほとんどTensorflowのチュートリアルなので楽チン． 


## Structuring Machine Learning Projects 

#### ML Strategy (1)

(2週目もそうだが) Deep Learning の開発をする上で，どういう所に気を付けるべきか？というお話．Human-Error-Rateとかベイズ最適誤差とかも考慮して，開発の方針を決める． 

#### ML Strategy (2)

エラー分析の考え方について．（優先順位は大事というお話．ラベリングが正しくないデータが多少混じっていても，実はそんなに問題では無いかもしれないよ？みたいな例を教えてくれる）  

後半は，転移学習とかマルチタスク学習とか，テクニック的な話も少しある． 

## 演習課題について

Pythonのnotebook形式で取り組みやすい. (Octaveとは何だったのか...)

Cousera Machine Learning と比べると演習課題が簡単. (というより，あまり理解していなくても関数の引数と戻り値をみてパズル的に回答が可能)
Next.jsでNuxt.jsみたいにエイリアスを使う

Next.jsで開発していると`import Foo from "../../../hoge"`のように相対パスがわかりにくくなりがち。[Nuxt.jsのエイリアス](https://nuxtjs.org/guide/directory-structure/#aliases)のようなものがあればいいが、Next.jsには組み込まれてはいないっぽい。
なので、babelのプラグインである[babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver)をつかって以下のようにエイリアスを設定することで、上記のインポート文が`import Foo from "＠/hoge"`とわかりやすくかけるようになる。

```json:.babelrc
{
  ...
  "plugins": [
    [
      "module-resolver",
      {
        "alias": {
          "@": "."
        }
      }
    ]
  ]
}

```
PG::UndefinedTable: ERROR:の解決方法（外部キー元のモデルのmigration未実行の場合）

#PG::UndefinedTable: ERROR:の解決方法
後で外部キー追加やrollbackした時に発生しました。原因はmigrationファイルの実行順でした。
##前提
migration時に外部キー元のテーブルがないため、エラーになる時

エラーコード

```ruby:pgの場合
PG::UndefinedTable: ERROR:  relation モデル名 does not exist
```
```ruby:SQLite3の場合
SQLite3::ConstraintException: foreign key constraint failed: DROP TABLE テーブル名
```
##解決方法
外部キーを参照される方のmigrationファイルを選んで先に実行する

以下にて、migration状況の確認

```ruby:
rake db:migrate:status
```
以下のようになっていたら、親の方を先に実行しなければならないので

```ruby:
 Status   Migration ID    Migration Name
--------------------------------------------------
D, [2019-04-20T19:03:40.930016 #4] DEBUG -- :    (7.5ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
  down    2019aaaaaaaaaa  Create 子（外部キー参照する方）
  down    2019bbbbbbbbbb  Create 親（外部キー参照される方）
```
親の方を選択して実行すればOK（その後rake db:migrateすれば子もmigrateされる）

```ruby:
rake db:migrate [VERSION=2019bbbbbbbbb]
```

##原因
・外部キーを設定しているモデルの場合、外部キー元のモデルのmigrationを先に実行する必要がある
・デフォルトでは古いmigrationファイルから実行するっぽいので、後で外部キー追加した後にまとめてrollbackしたりすると発生する
PHP The Right Way を見返した際のメモ的な

# 概要
PHP The Right Way を見返した際のメモ的な
日本語版 PHP TRW: http://ja.phptherightway.com/

# Composer
* Packagist is 何  
Composer default package repository

* package is 何  
ライブラリ。`package`は`Package Manager（パッケージ管理システム。apt, yum, apk...）`由来の名前かな？

* Composer commands:
 * composer require xxx/yyy: xxx/yyyをインストールする（パッケージをDLし、vendor/autoload.phpを更新する）
 * composer update: composer.jsonの内容に従って、パッケージ（依存関係を含む）をupdateする
 * composer install: composer.lock（ない場合はcomposer.json）の内容からパッケージをインストールする
 * composer global [command]: `global composer dir`でコマンドを実行する。Macだと`~/.composer`

* 開発用パッケージの扱い  
開発用のパッケージ（phpunitとか）は`require-dev`として扱う。`composer require --dev`でインストールする。本番環境では`composer require --update-no-dev`、`composer install --no-dev`
数検１級 (7) 重積分

# 問題

$D = \left\\{ (x,y) \,|\, x^2 + y^2 \le 1 \right\\}$ と置くとき、次の重積分を求めなさい。

$$
\int\int_D \sqrt{ \frac{1-x^2-y^2}{1+x^2+y^2} } dx \\ dy
$$

<details><summary></summary><div>

# 知識

## 重積分における置換

```math
\begin{align}
x &= f(u,v) \\
y &= g(u,v)
\end{align}
```
という置換を行う場合、微小積の変換は次のようになる。

```math
dx \, dy = \mathrm{det}(\mathrm{J}) \, du \, dv
```
ただし、$\mathrm{J}$ はジャコビアン行列。

```math
\mathrm{J} = 
\begin{bmatrix} f_u & f_v \\ g_u & g_v \end{bmatrix} 
```



### 線形変換の場合

```math
\mathbf{x} = \mathrm{A} \mathbf{u}
```

なら、ジャコビアンは $A$ 自体になるので、

```math
d\mathbf{x} = \mathrm{det}(\mathrm{A}) \\ d\mathbf{u}
```
ただし、$d\mathbf{x}$ は微小積とする。


### 極座標平面の場合

```math
\begin{align}
x &= r\cos\theta \\
y &= r\sin\theta
\end{align}
```

という置換を行うので、

```math
\mathrm{J} = 
\begin{bmatrix} 
\cos\theta & -r\sin\theta\\
\sin\theta & r\cos\theta
\end{bmatrix} 
```

したがって、

```math
\mathrm{det}(\mathrm{J}) = r
```

# 解答

被積分関数が $x^2 + y^2$ のみの関数なので、極座標変換をすると $r$ のみの関数となり良さそう。

```math
\begin{align}
x &= r\cos\theta \\
y &= r\sin\theta
\end{align}
```

* 微小積の変換：
$$
dx \\ dy = r \\ dr \\ d \theta
$$

* 積分範囲：
  * $r: 0\to 1$  （$x^2+y^2 \le 1$ より）
  * $\theta: 0 \to 2 \pi$   （特に制約がないので、一周全体）

```math
\begin{align}
\int\int_D \sqrt{ \frac{1-x^2-y^2}{1+x^2+y^2} } dx \, dy
&= \int_{0}^{1}\int_{0}^{2\pi} \sqrt{ \frac{1-r^2}{1+r^2} } r\,dr\,d\theta \\
&= 2\pi\int_{0}^{1} \sqrt{ \frac{1-r^2}{1+r^2} } r\,dr && \text{（$\theta$ で積分）} \\
&= 2\pi\int_{0}^{1} \frac{1-r^2}{\sqrt{1 - r^4}} r\,dr && \text{（分子を有理化）}
\end{align}
```

ここで、$r^2 = \sin t$ と置換する。

* 微小変化： 
$$r \\ dr = \frac{\cos t}{2} dt$$

* 積分範囲
  * $r: 0\to 1$ のとき、$t: 0 \to \frac{\pi}{2}$.

```math
\begin{align}
2\pi\int_{0}^{1} \frac{1-r^2}{\sqrt{1 - r^4}} r\,dr
&= 2\pi\int_{0}^{\frac{\pi}{2}} \frac{1-\sin t}{\sqrt{1 - \sin^2 t}} \cdot \frac{\cos t}{2} dt\\
&= 2\pi\int_{0}^{\frac{\pi}{2}} \frac{1-\sin t}{\cos t} \cdot\frac{\cos t}{2} dt \\
&= \pi\int_{0}^{\frac{\pi}{2}} (1-\sin t) \, dt \\
&= \pi \left[t + \cos t \right]_{0}^{\frac{\pi}{2}} \\
&= \pi \left(\frac{\pi}{2} - 1\right).
\end{align}
```

# 感想

* 極座標変換は覚えたほうが良さそう。
* 積分計算は綱渡り。


</div></details>
Phoenix Frameworkでテーブルを管理する

[Phoenix Frameworkでデータベースを使う](https://qiita.com/shio1997/items/2077242ae807c82ba9d9)

# テーブル管理
Ectoを使って管理します。
Phoenix FrameworkというよりもElixirのツールの使い方になります。

# テーブルへ項目の追加
既存のテーブルに項目を追加したい場合の操作手順です。
下のコマンドを実行すると新たにマイグレーションファイルが作成されます。

```shell
mix ecto.gen.migration ファイル名
```

例：add_columnという名前でマイグレーションファイルを作成します。

```shell
mix ecto.gen.migration add_column
```

作成されたマイグレーションファイル
を下のように書き換えます。

```priv/repo/migrations/XXXXXXXXXXXXXX_add_column.exs
defmodule App.Repo.Migrations.AddColumn do
  use Ecto.Migration

  def change do
    alter table(:blog_posts) do
      add :body, :text
    end
  end
end
```

下のコマンドでマイグレーションファイルを反映します。

```shell
mix ecto.gen.migrate
```

以上で、テーブルに項目が追加されました。

# マイグレーションファイルの内容
マイグレーションファイルは下のような内容で、
SQLに近いものと思います。

```priv/repo/migrations/XXXXXXXXXXXXXX_add_column.exs
defmodule App.Repo.Migrations.AddColumn do
  use Ecto.Migration

  def change do
    テーブル/インデックスの操作(create,alter,drop) (table,index)(:テーブル/インデックス名) do
      カラムの操作(add,remove,modify) :項目名, :データ型
    end
  end
end
```

# テーブルの操作について
テーブル操作（追加、変更、削除など）の詳細については、
下のリファレンスを確認してください。
https://hexdocs.pm/ecto_sql/Ecto.Migration.html
RSQLite が Window関数のサポートを追加

[RSQLite](https://cran.r-project.org/web/packages/RSQLite/index.html) は、R からSQLiteデータベースを操作するパッケージですが、つい最近 [Window関数](http://www.sqlitetutorial.net/sqlite-window-functions/) に対応したようです。本家SQLiteが2018年9月15に機能を追加して、その後いくつかの改良がなされています (https://www.sqlite.org/draft/changes.html) 。RSQLite の対応は 2018年12月30日 ([#273](https://github.com/r-dbi/RSQLite/pull/273))、SQLite 3.25.3 を利用しているようです。CRAN 版はまだ更新されていないので、利用するには開発版をGitHubからインストールする必要があります。


```R
windowfunc_test <- function() {
  db <- DBI::dbConnect(RSQLite::SQLite(), dbname=":memory:")
  
  DBI::dbExecute(db, "CREATE TABLE t0(x INTEGER PRIMARY KEY, y TEXT)")
  DBI::dbExecute(db, "INSERT INTO t0 VALUES (1, 'aaa'), (2, 'ccc'), (3, 'bbb')")
  
  res <- DBI::dbGetQuery(
    db, "SELECT x, y, row_number() OVER (ORDER BY y) AS row_number FROM t0 ORDER BY x")
  print(res)  
}
```

CRAN 版は未対応。

```R
install.packages("RSQLite")
print(packageVersion("RSQLite"))
windowfunc_test()

[1] `2.1.1`
Error in result_create(conn@ptr, statement): near "(": syntax error
Traceback:

1. windowfunc_test()
2. DBI::dbSendQuery(db, "SELECT x, y, row_number() OVER (ORDER BY y) AS row_number FROM t0 ORDER BY x")
   # at line 7 of file <text>
3. DBI::dbSendQuery(db, "SELECT x, y, row_number() OVER (ORDER BY y) AS row_number FROM t0 ORDER BY x")
4. .local(conn, statement, ...)
5. new("SQLiteResult", sql = statement, ptr = result_create(conn@ptr, 
 .     statement), conn = conn, bigint = conn@bigint)
6. initialize(value, ...)
7. initialize(value, ...)
8. result_create(conn@ptr, statement)
```

GitHubの開発版では対応。

```R
devtools::install_github("r-dbi/RSQLite")
print(packageVersion("RSQLite"))
windowfunc_test()

[1] `2.1.1.9002`
  x   y row_number
1 1 aaa          1
2 2 ccc          3
3 3 bbb          2
```
今年の言語はRust その２８


# 今年の言語はRust その２８


Rustを学びます


Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/



## 実行環境

```sh
$ cargo -V
cargo 1.33.0 (f099fe94b 2019-02-12)

$ rustup -V
rustup 1.17.0 (069c88ed6 2019-03-05)

$ rustc --version
rustc 1.33.0 (2aa4c46cf 2019-02-28)

$  cat /proc/version
Linux version 4.14.97-74.72.amzn1.x86_64 (mockbuild@gobi-build-64002) 
(gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC)) 
#1 SMP Tue Feb 5 20:59:30 UTC 2019

$ uname -a
Linux ip-10-100-0-8 4.14.97-74.72.amzn1.x86_64 
#1 SMP Tue Feb 5 20:59:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/\*release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Amazon Linux AMI release 2018.03

```


## 11. 自動テストを書く


### 11.3 テストの体系化

#### testsモジュールの#[cfg(test)]

__#[cfg(test)]__ とは、コンパライラに__cargo test__の時だけコンパイルすることを指示する

それだけです。節約。


```rust
#[cfg(test)]
mod tests {
    
    #[test]
    fn it_works() {
        assert_eq!(2 + 2, 4);
    }
}
```

#### 非公開関数をテストする

__非公開関数をテストするか否か__ には議論があります。

言語によっては、非公開関数をテストすること自体が困難だったりします

__Rustでは非公開関数をテストすることは可能__ です

しかし、非公開関数のテストを強制するものではありませんので__安心ください__

```rust
pub fn add_two(a: i32) -> i32 {
  internal_adder(a, 2)
}

fn internal_adder(a: i32, b:i32) -> i32 {
  a + b
}

#[cfg(test)]
mod tests {
  use super::*;

  #[test]
  fn internal(){
    assert_eq!(4, internal_adder(2,2));
  }
}
```

#### 結合テスト

__testsディレクトリ__ を作成して、テスト用ファイルを別で管理ももちろんできます。

cargoは__testsディレクトリにテストコードが入っている事を知っています__

testsディレクトリ内でテストを走らせるためには、__extern crate adder__ を使用してモジュールをインポートすることを忘れずに

test/integration_test.rs

```rust
extern crate adder;

#[test]
fn integration_it_adds_two() {
    assert_eq!(4, adder::add_two(2));
}

#[test]
fn integration_it_adds_two_fail() {
    assert_ne!(100, adder::add_two(2));
}
```

tests内のテストファイル.rsの名前を指定して個別実行もできます

```bash
$ cargo test --test integration_test
```

```bash
running 2 tests
test integration_it_adds_two_fail ... ok
test integration_it_adds_two ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

```

#### 結合テスト内のサブモジュール

テストを書いていると、__ヘルパー関数__ を共通化して利用したくなるでしょう

その場合には__tests/common/mod.rs__ と、tests関数内に別のモジュールを定義してあげることで利用できます


tests/common/mod.rs

```rust
pub fn setup(){

}
```

```rust
extern crate adder;

mod common;

#[test]
fn it_adds_two() {
    common::setup(); // <- ヘルパー関数
    assert_eq!(4, adder::add_two(2));
}
```


終わりー！！
これで一通りのスキルを学んだはず！

だが、リファレンスは22章まであるので、まだ折り返しはじめ。

これから、標準ライブラリや並行処理、オブジェクト指向等を学んでいきます

だいぶ手に馴染んできたぞーー


Rust楽しいすね。


イエス！
rbenv, Ruby, Railsのインストール

# rbenvのインストール

* [rbenv](https://github.com/rbenv/rbenv)

```sh
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv

```

```:~/.bashrc
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

# Rubyのインストール

```sh
$ rbenv install -l  # インストール出来るバージョンの一覧を表示
1.8.5-p52
1.8.5-p113
...

$ rbenv install 2.6.2

$ ruby --version
2.6.2 (set by /home/xxx/.rbenv version)
```

# gemでBundler, Railsのインストール

```sh
$ gem i bundle rails
```
Javascriptでカンマ付き数字が文字列か数値かを判定

## 前提条件
- テキストボックスに入力された内容をjQueryで取得してバリデーションをしたい。
- 以下の3つを識別する関数を作成したい。
    - カンマ区切りフォーマットされた数値（例：`1,234,567`）
    - 小数
    - 文字列
        - (1) カンマの区切り位置がおかしい（例：`1,23,4,56,7`）
        - (2) 通常（例`abc`, `1234z`）

## コード
```javascript
// <input id="sample" type="text" /> と仮定
// 入力値を取得
let inputVal = $("#sample").val();
// カンマを除く（カンマで分割して配列を生成し、その配列の要素をそのまま連結する）
let inputValDelComma = inputVal.split(',').join('');

// 文字列(2) の判定実行
if (! Math.abs(inputValDelComma) && inputValDelComma != 0) {
    // ERROR!! inputVal is String（ただの文字列）
}

// 入力時にカンマを含むか（カンマ削除後の長さが不一致の場合に含むと判定）
let isExistCommaInputVal = inputVal.length !== inputValDelComma.length;
// 数字化する（文字列のみの判定は完了しているため、必ず数値化できる）
inputValDelComma = Number(inputValDelComma);
// 3桁区切りフォーマット実行
let reAddedCommaInputVal = inputValDelComma.toLocaleString();

// 文字列(1) の判定実行
if (isExistCommaInputVal && (reAddedCommaInputVal !== inputVal)) {
    // ERROR!! inputVal is String（カンマ位置不正）
}

// 小数 の判定実行
if (String(Math.round(inputValDelComma)) != inputValDelComma) {
    // ERROR!! inputVal is float（小数）
}
```

## 解説
### 文字列(2) の判定

#### 前半部分 `! Math.abs(inputValDelComma)` 
- `Math.abs()`は以下の挙動を示す

```javascript
Math.abs('123456');   // 123456
Math.abs('-123456');  // 123456
Math.abc('abc');      // NaN
Math.abs('123,456');  // NaN
```

- javascriptは `NaN` をfalseと判定することを利用

```javascript
NaN ? true : false   // false
```

#### 後半部分 `inputValDelComma != 0` 
- 前半部分で 0 と判定された場合、条件式が`true`となってしまう

```javascript
Math.abs('0');      // 0
! 0 ? true : false  // true
```

- 0 は文字列ではなく数値なので、0は除外する条件式をAND条件で追加する必要がある

### 文字列(1) の判定
#### 前半部分 `isExistCommaInputVal`
- カンマを削除する前後の長さを比較することで、カンマを含むかどうか判定可能
- 入力時にカンマが入っていない場合は後半部分の判定をする必要がそもそもない

```javascript
// 入力時にカンマを含むか
let isExistCommaInputVal = inputVal.length !== inputValDelComma.length;
```

#### 後半部分 `reAddedCommaInputVal !== inputVal`
- 入力した値からカンマを削除して再度3桁区切りフォーマットすることで、適当にカンマを入れた数値を判別できる

```javascript
// 例： 1,23,4,56,7 のとき inputValDelComma = 1234567
// 次の行で再度処理するために、一度数値化する
inputValDelComma = Number(inputValDelComma);
// Number.toLocaleString() で3桁区切りフォーマット 
let reAddedCommaInputVal = inputValDelComma.toLocaleString(); // reAddedCommaInputVal = 1,234,567
```

`1,23,4,56,7` と `1,234,567` は違うため弾くことができる

### 小数の判定
- 小数点有り、無しの場合で文字列同士を比較し、弾いている

```javascript
// 例： inputValDelComma = 12.0
Math.round(inputValDelComma)         // 12
String(Math.round(inputValDelComma)) // '12'
'12' != '12.0'                       // false
```

## さいごに
今回は生のjavascriptで頑張って実装してみましたが
もっと簡単に実装できる方法があればご教示ください
【React Native】キーボード以外をタップするとキーボードが隠れるようにする

## キーボードが隠れない…

以下は店舗の名前を入れると検索してくれる画面のrender関数の中身（作りかけだけど…）。

```JSX:RegisterScreen.js
    render() {
      return (
        <View style={styles.container}>
          <View style={styles.header}>
            <Text style={styles.headerText}>
              店舗登録
            </Text>
          </View>
          <View  style={styles.inputContainer}>
              <TextInput
                  style={styles.inputBox}
                  onChangeText={(text) => this.setState({text})}
                  value={this.state.text}
                  placeholder="店舗名を入力してください"
                  clearButtonMode='while-editing'
                />
              <View style={styles.buttonContainer}>
                <TouchableOpacity style={styles.button}>
                  <Text style={styles.buttonText}>検索</Text>
                </TouchableOpacity>
              </View>
          </View>
          <View style={styles.cardContainer}
          >
          </View>
        </View>
      );
    }  
```

ここでTextInputの部分を画面上でタップするとキーボードが下に出てくる。
だがしかし、キーボード以外の部分をタップすれば隠れてくれると思っていた私は画面をタップして絶望した。
私「えいえい（画面タップ）」
キーボード「……」
私「えいえい（画面タップ）」
キーボード「……」
私「(0w0#)ﾅｽﾞｪﾐﾃﾞﾙﾝﾃﾞｨｽ!ｵﾝﾄﾞｩﾙﾙﾗｷﾞｯﾀﾝﾃﾞｨｽｶｰ!」（詳しくない方はオンドゥル語で検索）

## ScrollViewを使えば解決できた！
色々探してもろくな情報がしかなく、最後の頼みの綱であるTwitterという泉に質問を投げてみたところ、
優しい女神のようなフォロワーさんがヌッと現れて教えてくれた。

このスクリーンを構成する一番大元になっているViewをScrollViewにするという方法である。

```JSX:RegisterScreen.js
    render() {
      return (
        <ScrollView scrollEnabled={false} contentContainerStyle={{ flex: 1, justifyContent: 'center' }}>

           //…（中略：中身は前述のコードと同じです）…

        </ScrollView>
      );
    }  
```

もちろんコードの最初に

```JSX:Register.js
import { ScrollView } from 'react-native';
```
ScrollViewをインポートすることをお忘れなく。

scrollEnabledはScrollViewの部分をスクロールさせるか否かを決めるパラメータ。
falseにすると画面がスクロールすることはなくなる（ScrollViewのくせに…）。
ただし、キーボードを隠すという目的においては別にtrueにしていても問題はないようだ。

あとScrollViewのスタイルはViewのようにstyleで指定するのではなく、
contentContainerStyleっていうもので指定する必要がある。
とは言っても「style=」の部分を変えるだけで特に大きな違いはない。

たったこれだけの変更でキーボード以外の部分をタップすればキーボードが勝手に隠れてくれるようになった。
ネットを見るとなんだか他にも方法は提示されているみたいだが、とりあえずはこれで十分かなと思っている。

優しい泉の女神様の教えを忘れないように備忘録としてここに書き刻んでおこうと思った次第である。
Espressoを使う際の個人的ハマりポイントまとめ

Android開発でテストを行おうと思い、Espressoを実行しようと思ったら何ヶ所かつまずいたので、ハマりポイントをまとめたいと思います。
簡単に実行できると思ってた.....

####①実装とテストのバージョン違い

テストを実行しようと思うと下記エラーが発生しました。

```
Conflict with dependency 'com.android.support:support-annotations'. Resolved versions for app (27.0.0) and test app (27.1.1) differ.
```
アノテーションの定義なんてしたかなあと思いながら、app/build.gradleを見てみると、定義していませんでした。

```
dependencies {
    implementation 'io.realm:android-adapters:2.1.1'
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:27.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:design:27.0.0'
    implementation "org.jetbrains.anko:anko-common:$anko_version"
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test:rules:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.android.support:appcompat-v7:27.0.0'
}
```

あれれ....なんで入っているんだろうと思いながら、gradlew app:dependenciesをターミナルでたたいてみると、なんと入っていました。
設定していないのに参照していました。

```
androidTestCompile - Classpath for compiling the androidTest sources.
+--- com.android.support.test.espresso:espresso-core:3.0.2
|    +--- com.android.support.test:runner:1.0.2 (*)
|    +--- com.android.support.test.espresso:espresso-idling-resource:3.0.2
|    +--- com.squareup:javawriter:2.1.1
|    +--- javax.inject:javax.inject:1
\--- com.android.support:support-annotations:27.1.1
```

なので、下記設定を追加して、実装とテストのバージョンを合わせました。

```
implementation 'com.android.support:appcompat-v7:27.0.0'
```

####②ファイルの置き場所

次に実行すると、下記エラーが発生しました。

```
Class not found:  "jp.××××.××××.MainActivityTest"Empty test suite.
```

結果的にテストファイルの置き場所が違ってました。
app\src\testの下ではなく、app\src\androidTestの下にテストコードを置かないといけませんでした。
app\src\test配下」にはJUnitのテストファイルを置く必要があるようです。
なんで2つあるのかなぁと思っていたのですが、理由がわかりました。

####③テストの実行場所
再び実行すると、②と同様のエラーが起こりました。
テストを実行する場所を間違えていました。

MainActivityTestでRunしていたんですが、そうするとJUnitでテストしていると認識されテストの種類が違うということでエラーが発生していました。
なので、テストが格納されているディレクトリで実行するとうまく実行できました。
これは設定を変更するなどの他の解決方法がありそうですが、そこまで調べきれていません。
知っている方がもしいれば、教えていただきたいです。

なかなか、テスト始めるまでの設定が大変でした。
UIのテストは実機等で担保して、JUnitに力を注いでもいいかもと思いました。

参照--  [Android Espresso　初心者導入用のサンプル](https://oc-technote.com/android/android%20espresso%E3%80%80%E5%88%9D%E5%BF%83%E8%80%85%E5%B0%8E%E5%85%A5%E7%94%A8%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB/)
JavaからJava以外の命令を実行する

# 利用するクラス、メソッド
java.lang.Runtime#exec

結果のハンドリングは、返されるjava.lang.Processを利用して実施。

# コード例
```
Process proc = Runtime.getRuntime().exec( "java --version" );
```

# 実行例
```
jshell> Process proc = Runtime.getRuntime().exec( "java --version" );
proc ==> Process[pid=19916, exitValue="not exited"]

jshell> proc.exitValue();
$2 ==> 0
```
# 入出力
**メソッド名がProcess#execを実行した側からの視点**になっていることに注意。
## 実行プロセスからの出力
- Process#getInputStream<br>
　→　Process#execで実行したプロセスが標準出力に出力する内容を取得するためのInputStreamを取得<br><br>
＜ソースコード例＞ 

```java
import java.io.*;

Process proc = Runtime.getRuntime().exec( "java Hello" );
String line = null;

try ( var buf = new BufferedReader( new InputStreamReader( proc.getInputStream() ) ) ) {
  while( ( line = buf.readLine() ) != null ) System.out.println( line );
}

# Hello.javaの内容
public class Hello {
    public static void main( String[] args ) {
        System.out.println( "Hello, world!!" );
    }
}

```
＜結果＞

```
Hello, world!!
```


- Process#getErrorStream<br>
　→　Process#execで実行したプロセスが標準エラー出力に出力する内容を取得するための<br>
　　InputStreamを取得

＜ソースコード例＞ 
※NotExist.javaは存在していないことが前提。

```java

import java.io.*;

Process proc = Runtime.getRuntime().exec( "javac NotExist.java" );
String line = null;

try ( var buf = new BufferedReader( new InputStreamReader( proc.getErrorStream() ) ) ) {
  while( ( line = buf.readLine() ) != null ) System.out.println( line );
}
```
＜結果＞

```
エラー: ファイルが見つかりません: NotExist.java
使用方法: javac <options> <source files>
使用可能なオプションのリストについては、--helpを使用します
```

## 実行プロセスへの入力
- Process#getOutputStream<br>
　→　Process#execで実行したプロセスの標準入力へ情報を渡すためのOutputStreamを取得<br>
＜ソースコード例＞ 

```java

import java.io.*;

Process proc = Runtime.getRuntime().exec( "java -cp . SampleCode" );

try ( var buf = new BufferedWriter( new OutputStreamWriter( proc.getOutputStream() ) ) ) {
     buf.write( "3" );
     buf.newLine();
     buf.write( "5" );
     buf.newLine();
}

// 取得したプロセスからの出力内容を表示
try ( var buf = new BufferedReader( new InputStreamReader( proc.getInputStream() ) ) ) {
   while( ( line = buf.readLine() ) != null ) System.out.println( line );
}

// SampleCode.javaの内容
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class SampleCode {
	public static void main( String[] args ) throws Exception{
		try ( var buf = new BufferedReader(
				new InputStreamReader( System.in )
				) ) {
			int x = Integer.parseInt( buf.readLine() );
			int y = Integer.parseInt( buf.readLine() );

			System.out.println( x + "*" + y + "=" + x*y );
		}
	}
}
```
＜結果＞

```
3*5=15
```

# その他
- プロセスの完了を待機する場合は、Process#waitForを実行。
- プロセスの終了コードは、Process#exitValueで取得可能。<br>
ただし、プロセスが終了していない状態でexitValueを呼ぶと例外（java.lang.IllegalThreadStateException）が発生する。（下記参照）

```
Exception in thread "main" java.lang.IllegalThreadStateException: process has not exited
  at java.base/java.lang.ProcessImpl.exitValue(ProcessImpl.java:478)
```
BigQueryでViewやTableを参照しているViewがないか調べる



datasetの構成を変更する際に、過去に作った不要なviewやtableを整理したかったのですが、本当に参照されていないのか不安になり調査しました。

結論 `INFORMATION_SCHEMA.VIEW` を利用すると解決します

## サンプル

```
select * from `my-project.my-dataset.INFORMATION_SCHEMA.VIEWS` 
WHERE view_definition like '%user_dataset%'
limit 10
```

## 弱点

今回は大丈夫でしたが作っていて以下は場合によって課題になりそうです
-  projectやdatasetが複数（数個だったので良かったが大量に）あると手で一つ一つ調べなければいけなくて面倒
-  統制がなく思いもよらないdatasetから勝手に参照されていると詰む


## 参考

参照元
[Getting information about views|BigQuery](https://cloud.google.com/bigquery/docs/view-metadata?hl=ja)

類似
[redashで参照されているテーブルやフィールドがないかを調べる](https://qiita.com/ryoichi-u/items/5d66e5f7c2cb098f98bc)