OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで基本的な処理をそれとなく書いてみる

##バッチ処理でよくあるやつ

DBからレコード取得
↓
編集
↓
DB update

の流れをそれとなくpythonで

```batch.py
# like a batch job
class Job ():

    # select from table
    def select():
        # from DB
        records = list()
        records.append('tableRecord0')
        records.append('tableRecord1')
        records.append('tableRecord2')
        records.append('tableRecord3')
        return records

    # update for DB
    def update(entity):
        for v in entity:
            print(v)

    # execute
    def edit():
        Job.update([v + ' edited' for v in Job.select() if type(v) is str])

# main
if __name__ == '__main__':
    Job.edit()

```

editメソッドの中身適当すぎですが、この程度なら1行ですね

複雑な処理をeditで行いたい場合は

```exe.py
    # execute
    def edit():

        # select
        targets = Job.select()

        # Buisness Logic
        # edit targets
        # and so on

        Job.update(targets)
```

まぁ普通に分ければいいだけですね

Javaでやると

```stream.java
Job.select().stream().filter(条件).map(編集).forEach(Job::update);
```

こうですね

しかし括弧が少なくて本当に見やすい...

まだDB接続等をやったことがないのでこの程度しか書けませんが
Javaと同じく、ある程度の骨子がわかれば
あとはどれだけライブラリに精通するか勝負みたいなとこありますよね

そればっかりは経験というか、多くのコードに触れるしかなさそうですね
# ２つのデータの独立性の検定 ( χ2検定 )

## χ2検定
**観測されたデータの分布は，理論値の分布とほぼ同じとみなせるか**を調べるための検定．

### χ2検定の検定統計量
```math
 χ2の実現値 = \frac{(観測度数 - 期待値)^2}{期待値} の総和
```

- 期待度数と観測度数が完全に一致すれば，χ2値は0になる
- 期待度数と観測度数の差が大きくなると，χ2値も大きくなる

### サイコロの目の分布

```R
data <- read.table("./r_sample/chap07/sec01/dice/サイコロ.txt", header=T)

freq <- c(
  data[1, 2],
  data[2, 2],
  data[3, 2],
  data[4, 2],
  data[5, 2],
  data[6, 2]
 )

# 統計検定量を求める
element <- (freq -2)^2 / 2
elm_val <- sum(element)  # 5.435

#有意水準5%の値を求める
chi_val <- qchisq(0.05, 5, lower.tail=FALSE) # 11.07
```

この結果，検定統計量の実現値は棄却域を超えていなかった．
サイコロ投げ12回の目の出方は偶然に起こり得る範囲内だと言える．


## ２店舗のメインメニュー，セカンドメニューの売り上げ数の割合

```R

data <- read.table("./r_sample/chap07/sec01/chi_square_test/A店B店.txt", header=T)

A_sum <- data[1,3]
B_sum <- data[2,3]
AB_sum <- data[3,3]

menu1_sum <- data[3,1]
menu2_sum <- data[3,2]
menu_sales <- c(
  data[1,1],
  data[1,2],
  data[2,1],
  data[2,2]
)

exp_A_m1 <- menu1_sum * A_sum / AB_sum #A店メニュー2の期待値
exp_A_m2 <- menu2_sum * A_sum / AB_sum #A店メニュー2の期待値
exp_B_m1 <- menu1_sum * B_sum / AB_sum #B店メニュー1の期待値
exp_B_m2 <- menu2_sum * B_sum / AB_sum #B店メニュー2の期待値

exp_freq <- c(exp_A_m1, exp_A_m2, exp_B_m1, exp_B_m2)

chi_element <- (menu_sales - exp_freq) ^2 / exp_freq
chi_elm_val <- sum(chi_element)
chi_val <- qchisq(0.05, 1, lower.tail = FALSE)

curve(dchisq(x, 1), 0, 6)
abline(v=qchisq(0.05, 1, lower.tail = FALSE))
```

検定統計量の実現値は4.55であった．有意水準5%の値である3.84を超えているので，このデータ分布は「めったに起こらない」と言える．つまり，２店舗の注文数には差がある．

<img width="530" alt="スクリーンショット 2020-03-09 10.20.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517036/f571ca75-6cb7-a945-ce1c-4e500ffcae47.png">
【RSpec】described_classについて

## はじめに
RSpecを書くときに、`described_class`を使うようにアドバイスをいただきました。

今回は、`described_class`の使い方と使う理由を説明していきます。

## described_classの使い方

通常、このようにモデルの処理を書くと思います。

```rb:user.rb
RSpec.describe User do
  subject {User.new}
end
```

`described_class`を使うと下記のように書けます。

```rb:user_spec.rb
RSpec.describe User do
  subject {described_class.new}
end
```

`User`が`described_class`に変わりました。

この`described_class`が何者かというと、</br>
RSpec.describeの直後に書かれているモデルなんです。

```rb
RSpec.describe User do # Userがdescribed_class
end
```

## described_classを使う理由

ではなぜ、`described_class`を使うのでしょうか。

`described_class`はテストコードを書くモデルを直接対象としているのがいいみたいです。

`described_class`と書いておけば、ミスも少なくなると思うのもいいところかも。
Power Systems Virtual Server on IBM Cloud (AIX) で VLAN が正しく構成されているか確認する(ibmcloudコマンド版）

#1. はじめに
Power Systems Virutal ServerでのVLAN構成を確認するために、[Power Systems Virtual Server on IBM Cloud (AIX) で VLAN が正しく構成されているか確認する](https://qiita.com/khayama/items/1c61152165bcb368aa01)という記事が紹介されていますが、その記事ではREST APIが利用されています。本記事では代わりに、ibmcloudコマンドで実施する方法を紹介します。

2020/06/12追記
現在は、システム側で設定されているVLAN番号がCustomer Portalから確認できるようになったため、#2および#3の作業は不要になりました。いきなり#4を実施することで、Customer Portalでの結果と、実機との比較を直接行うことが可能です。
<img width="1276" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/bcfbc4ce-3f04-db80-4b07-9ccc208ab5cc.png">


#2. 事前準備

Power Systems Virtual Server用Pluginの導入しておきます。

```txt:PowerSystemsVirtualServer用Pluginの導入と更新
# ibmcloud update
# ibmcloud plugin install power-iaas
（最新バージョンへの更新が必要な場合）
# ibmcloud plugin update
```

#3. ibmcloud piの実施
Power Systems Virtual Serverは、`ibmcloud pi`で実行します。

```txt:リージョンの選択
# ibmcloud target -r us-south
```

```txt:ターゲットサービスの列挙
# ibmcloud pi service-list
Listing services under account IBM as user xxxxxx in region us-south...
ID                                                                                                                    Name
crn:v1:bluemix:public:power-iaas:us-south:a/039dbe6794084c7cb514a276dd2345da:01595fe7-55ac-42b9-ad3e-44a58a846a8e::   Power Systems Virtual Server-tmgw
crn:v1:bluemix:public:power-iaas:us-south:a/039dbe6794084c7cb514a276dd2345da:6fd0e16f-4be8-4236-88f7-1dcb0f0ff750::   Power Systems Virtual Server-demo
```

```txt:ターゲットサービスの選択
# ibmcloud pi service-target crn:v1:bluemix:public:power-iaas:us-south:a/039dbe6794084c7cb514a276dd2345da:01595fe7-55ac-42b9-ad3e-44a58a846a8e::
```

```txt:ネットワーク一覧
# ibmcloud pi networks
Listing networks under account IBM as user xxxxxx...
ID                                     Name                                 Address
2ac53d0e-5eda-49dc-b434-1c66dbb76ecf   public-192_168_130_88-29-VLAN_2071   /pcloud/v1/cloud-instances/a9bb79554562403f9453353e45d6d8a9/networks/2ac53d0e-5eda-49dc-b434-1c66dbb76ecf
e045a93e-0cfe-4f4e-ab30-3157ecfd0e0f   subnet-web                           /pcloud/v1/cloud-instances/a9bb79554562403f9453353e45d6d8a9/networks/e045a93e-0cfe-4f4e-ab30-3157ecfd0e0f
```

```txt:ネットワーク詳細
# ibmcloud pi network subnet-web
Getting Network subnet-web under account IBM as user xxxxxx...

ID           e045a93e-0cfe-4f4e-ab30-3157ecfd0e0f
Name         subnet-web
Type         vlan
VLAN         234
CIDR Block   192.168.100.0/24
IP Range     [192.168.100.3  192.168.100.254]
Gateway      192.168.100.2
DNS          8.8.8.8
```

#4. AIX側での確認

```txt:AIXでのVLAN構成
# entstat -d ent1 | grep VLAN
Invalid VLAN ID Packets: 0
Port VLAN ID:   234
VLAN Tag IDs:  None
```
印刷用のCSS(@media print)をFirefoxで確認する方法

Firefoxで開発ツールバー機能が削除されたため以下にある従来の方法では確認できない。

- [Firefox の使い方](https://qiita.com/ponsuke0531/items/94c462f53415dd9bbecf)

現時点(2020/03/09時点)F12で開発ツールを開いた後に以下のボタンをクリックすることで確認することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96042/bb1d54fd-d50a-cf3b-a29a-a7eca48a0e44.png)
aws s3にローカルファイルをsync使わずcpで一気にアップロード

s3にデータを一気にバックアップする際、 `sync` を使おうと思ったけど `cp` サクッと一気にアップロードしたかったので、その方法メモ。

```bash
$ IFS_bak=$IFS  # スペース入りのファイル名などある場合、改行をしないようにする
$ IFS=$'\n'
$ for x in `ls` ; do aws s3 cp "$x" s3://バケット名//パス名/パス名/ --profile=プロファイル名; done
```
XML

```py
import xml.etree.ElementTree as ET

root = ET.Element('root')
tree = ET.ElementTree(element=root)

employee = ET.SubElement(root, 'employee')

employ = ET.SubElement(employee, 'employ')
employ_id = ET.SubElement(employ, 'id')
employ_id.text = '111'
employ_id = ET.SubElement(employ, 'name')
employ_id.text = 'Mike'

employ = ET.SubElement(employee, 'employ')
employ_id = ET.SubElement(employ, 'id')
employ_id.text = '222'
employ_id = ET.SubElement(employ, 'name')
employ_id.text = 'Nancy'

#xml_declaration=Trueにすると、バージョン情報など書き込んでくれる
tree.write('test.xml', encoding='utf-8',xml_declaration=True)

tree = ET.ElementTree(file='test.xml')
root = tree.getroot()

for employee in root:
    for employ in employee:
        for person in employ:
            print(person.tag, person.text)
```
出力：

```
id 111
name Mike
id 222
name Nancy
```

```xml:test.xml
<?xml version='1.0' encoding='utf-8'?>
<root><employee><employ><id>111</id><name>Mike</name></employ><employ><id>222</id><name>Nancy</name></employ></employee></root>
```
macportsでmecabをインストール

Macでmecabを用いる時には, フォントをutf-8に設定しなければ文字化けしてしまう。mecab-ipadic-utf8はutf-8用の辞書。

~~~
sudo port install mecab mecab-ipadic-utf8
~~~

このまま使用すると文字化けしてしまう。まず辞書の設定を調べる。

~~~
mecab -D

filename:	/opt/local/lib/mecab/dic/sysdic/sys.dic
version:	102
charset:	euc-jp
type:	0
size:	392126
left size:	1316
right size:	1316
~~~

辞書は現在`/opt/local/lib/mecab/dic/sysdic/sys.dic`に設定されている。

~~~
ls -l /opt/local/lib/mecab/dic

total 0
drwxr-xr-x  11 root  admin  352  3  9 09:18 ipadic-eucjp
drwxr-xr-x  11 root  admin  352  3  9 09:18 ipadic-utf8
lrwxr-xr-x   1 root  admin   12 10 27  2018 sysdic -> ipadic-eucjp
~~~

`sys.dic`が入っているディレクトリ`/opt/local/lib/mecab/dic/sysdic`はデフォルトの辞書を含むディレクトリ`ipadic-eucjp`へのリンクなので、`ipadic-utf8`へリンクを張り替える。

~~~
sudo ln -snf /opt/local/lib/mecab/dic/ipadic-utf8 /opt/local/lib/mecab/dic/sysdic
~~~

これで正常に使えるようになる.

## 追加　(pythonバインディング)

pythonで使うには

~~~
sudo pip install mecab-python3
~~~

をすれば良い。
プログラミング初心者のために簡単用語説明

こんにちは [@dd0125](https://twitter.com/dd0125) です。

プログラミング初心者がつまづくポイントとして、

**ワタシはレベル1のエンジニアです。○○のことが知りたいんです**

ってきくと、ある程度できるエンジニアがいきなり

**これは□□なところがあって、さらにこういうこともあって、でもたまにあーいうこともあって、でもあまりおすすめはしないよ**

みたいに説明されることがあります。

初心者の人は **Lv1** で説明を受けた際にも許容量が限られている段階です。
なのに **Lv10** のことを伝えたりすると、ほぼほぼが理解できずに右から左へ受け流され、
少しだけかろうじて握った砂のような知識が得られ、かなりの疲労を伴ってしまいます。

階段は1段ずつ登っていくのが一番速いです。

なので、もっとシンプルに簡単に伝わるような説明が実は一番効果的だったりします。

・できるだけシステム用語じゃない普段の日本語
・プログラム言語の種類によらない概念の説明
・プログラム言語によって内容はほぼ同じなのに名前が違うものをわかるようにする

そんな説明をしたいって思って、キーボードを手に取りました（？）



# 基礎用語

## プログラム言語

パソコンをはじめとした、あらゆるコンピューターを動かすために書く基本的には英語のような文章です。
書いたあとコンピューターによって内部的には 1 と 0 の状態に変換してますが、
それでは人間がわからないので英語のような文章で書けるようになっています。

### コンパイル言語

プログラム言語の種類。
先に 1 と 0 のようなコンピュータしか解釈できないものに変換しておいてから、変換したものを実行します。
速い。毎回コンパイルしないといけない。
C#, Java とかがそうです。

### インタプリタ言語

プログラム言語の種類。
1 と 0 のような変換を実行しながらやってくれます。
速くない。書くだけで動く。
Ruby, PHP, Python とかがそうです。

### トランスパイル言語

その言語自体で何かが動作するわけではないです。
その言語で書いた後に何かで処理することで、
動く言語に **変換** します。
TypeScript → JavaScript, Scss → css などがそうです。


# プログラム言語基礎

## 変数関連

### 変数

ものをいれる箱。
中身は文字とか数値とか
もっと色々集まった塊(オブジェクトと言われます)の場合もあります。

### 配列・Array

変数の形の1つです。
1つだけを保存するのではなく、複数を一気に扱えるものです。
文字を複数や、数値を複数などで一気に扱うことができます。

### ハッシュ・マップ・KeyValue

言語によってはオブジェクトっていう場合もあります。
配列と同じで複数を一気に扱えます。
鍵の変数と値の組み合わせで動きます。
例えば、鍵に **田中さん** 、値に **東京** といれることで、
**田中さん** の情報ください。取得した結果、 **東京** ってことになります。
逆に鍵に **鈴木さん** 、値を **大阪** っていれることもできます。


### 定数

変数と同じようなものだけども一回設定した後、変更できないものです。

### 型

変数などの形の種類です。
この変数は文字ですよとか、これは数値ですよとかを表す時に使います。

### クラス

変数と関数を集めた **型** を自分で作れると理解すれば良いかと思います。

## 関数関連

### 関数・メソッド

コードの集まりで名前をつけておいておくと、他の場所から呼んで使うことができます。
何度も使えます。
メソッドと同じ意味です。厳密には違うかもってあるかもだけど一緒の理解でいいです。

### 引数

関数にわたす変数です。
関数さんに1を渡したら関数の中で処理をしてくれる。みたいな使い方です。

### 戻り値

返り値という場合もあります。
関数を呼んだ後に返ってくる変数の中身です。
基本的には **return 変数** と書くことで値が戻ってきます。



### スコープ

private とか public とかが変数や関数やクラスの前に書いてあるものです。
どこまでの範囲まで見せるかアクセスできるかをあらわします。

## 条件分岐 命令文

### if文

もし○○なら△△すると条件によって違うことをします

### else if文

if文を通り抜けたあとにたどり着く if文です。
if文で A ならば？ってきいたあとに更に B ならば？って聞きたい時に使います。
if文に対して、指定せずに省略することもできます。

### else文

if も else if も条件に合わなかった場合に動きます。
if文に対して、指定せずに省略することもできます。

### switch文, case文, select文

if文の条件分岐の仕方が違うバージョンって覚えておけばいいです。
A が1の場合、2の場合、3の場合ってたくさんの選択肢で書けたりします。
switch文でできることは if文でもできます。

## 繰り返し 命令文

### for文

繰り返す処理です。最初が1から始まって10回繰り返すなどで利用します。

### while文

何度も繰り返す処理です。while文に書く条件は継続条件といって、その条件を満たし続ける限り動きます。
Aが赤の場合　って while があると A が赤である限り、ずっと動きます。
for文でも同じことはできます。

### until文

プログラム言語によってはたまにあります。
while文と同じですが、条件が継続条件の逆の終了条件です。 while の逆って思っておけば良いです。
for文でも同じことはできます。

### continue文

繰り返し文の中で使います。
このまま処理を続けるんではなく、今回の1周をスキップして次の周にいきます。

### break文

繰り返しから強制的に抜けます。
switch文から抜ける時にも使えたりします。
繰り返し処理から抜けるって覚えておけばよいです。


# まとめ

解説していないことは山程ありますが、
あくまで最初の1段目と思って概念を紹介してみました。

重要な知識はたくさんあるんですが、適切に階段を1段ずつ登らないと、登ったり下ったりで苦労することになります。
Scrapy 各種コマンド

### モジュール作成

```
scrapy genspider [モジュール名] [サイトドメイン]

例)
scrapy genspider hoge wwww.hoge.com
```

### モジュール実行コマンド

```
scrapy crawl [モジュール名]

例)
scrapy crawl hoge
```

### 実行結果の出力ファイル指定

```
scrapy crawl hoge -o /home/fuga.csv
```

### デバッグコマンド

```
scrapy shell [対象URL]

例)
scrapy shell 'https://www.hoge.com/'


インタラクティブモードになる
以下を入力していく

>>>
import re
import mojimoji
from bs4 import BeautifulSoup
from urllib.request import urlopen

soup = BeautifulSoup(response.body, "html5lib")

soup
↑ 取得結果が表示される
  この後、DOMの取得コマンドを実行し、結果を確認していく
```

### 文字化け時の対策

```
html_data = urlopen('https://hoge.com/fuga/').read()
html_data = html_data.decode('utf-8')
soup = BeautifulSoup(html_data, "html5lib")
```
【ClozeTS】TypeScript穴埋めクイズ#1 (Array)

[ClozeTS]とは、TypeScriptの穴埋めクイズです。コードの一部が「穴」になっていて、その部分に適切なコードを当てはめて解く形式のクイズです。

[ClozeTS]: https://qiita.com/suin/items/3090ce2d1b1407577006

## 問題

このTypeScriptコードの中の`__MISSING_CODE__`を適切なコードに置き換えて、コードを完成してください。

```typescript
let x: __MISSING_CODE__ = [1, 2, 3];
x = [4, 5];
x = ['1', '2', '3']; // Error
x = [true]; // Error
```

→**[TypeScript Playgroundでコードを書く](http://www.typescriptlang.org/play/?esModuleInterop=false&declaration=false&module=1&ssl=4&ssc=21&pln=1&pc=1#code/DYUwLgBAHgXBD68CyBJAymlA5A4vAwgPIAiAoohALwQDaAjADQQBMTAzALoDcAUFFbQAsTAKzc+AmgHI6UplOZyIUtlO4QA9BoikATroD2uidRphdAVxDqtO-UaA)**←

__ルール__

* コメントで`Error`と書かれた行は、**コンパイルエラーになる**ようにする。
* それ以外の行は、コンパイルエラーにならないようにする。
* 型に`any`は使ってはならない。(any縛り)
* `__MISSING_CODE__`の部分以外は変更してはならない。
* コードを書く際にはTypeScript Playgroundをお使いください。(バージョンやコンパイル設定統一のため)

__ヒント__

* [Basic Types · TypeScript](https://www.typescriptlang.org/docs/handbook/basic-types.html#array)
* [基本の型 | TypeScript 日本語ハンドブック | js STUDIO](http://js.studio-kingdom.com/typescript/handbook/basic_types#array)

__解けたら__

* 回答はコメント欄に投稿する。(任意)
* 自分と同じ回答がある場合、投稿の代わりに「いいね」する。(任意)
* 気に入った回答には「いいね」する。(任意)
* 技巧輝く回答には、ちょっとした解説を添える。(任意)
* →[Q.なぜコメントしたり、いいねするといいの？](https://qiita.com/suin/items/3090ce2d1b1407577006#2-%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88%E6%AC%84%E3%81%A7%E5%9B%9E%E7%AD%94%E3%82%92%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【ClozeTS】TypeScript穴埋めクイズ#1 (Array) <a href="https://t.co/G1FCtbbOq4">https://t.co/G1FCtbbOq4</a><br><br>このクイズの難しさはどのくらいでしたか？</p>&mdash; suin (@suin) <a href="https://twitter.com/suin/status/1236808365772132352?ref_src=twsrc%5Etfw">March 9, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
false-negativeとかの覚え方

#以下覚えるだけで、導き出せます。

##tureとfalseはアタリかハズレかを表す
**true** 　 →　アタリ
**false** 　→　ハズレ

##positiveとnegativeは陽性か陰性かを表す
**positive** → 陽性
**negative** → 陰性

##まとめると
**true-positive**　陽性の判定であってる
**true-negative**　陰性の判定であってる
**false-positive** 陽性と判定したが間違い(誤検知)
**false-negative** 陰性と判定したが間違い(見逃し)
OctoberCMSによるComponent作成

#コンポーネントによる振り分け処理(未完成)
処理自体は主にphpで行う。
コンポーネントの外側の作成方法は[こちら](https://qiita.com/orito/items/25553055a834beaa8ddb)

##コンポーネントの登録
```php:Plugin.php
    public function registerComponents()
    {
        return [
            '<プラグイン名>\<プロジェクト名>\Components\NewsList' => 'NewsList',
        ];
    }
```

##振り分け処理
```php:NewsList.php
<?php namespace Kobayashi\Corporate\Components;

use Cms\Classes\ComponentBase;
use <プラグイン名>\<プロジェクト名>\Models\News;

class NewsList extends ComponentBase
{
    public function componentDetails()
    {
        return [
            'name'        => 'ニュース一覧',
            'description' => 'ニュース一覧の表示'
        ];
    }

    public function defineProperties()
    {
        return [];
    }

    // ニュースごとに掲載先を変える処理
    public function bySite()
    {
        // データの個数を取得
        $count = News::select('id')->count();

        // IDと内容、作成日時、振り分け先を取得
        $json = News::select('id', 'content', 'created_at', 'site')->get();

        // jsonファイルから配列に変換
        $decode = json_decode($json, true);

        // 格納する配列を定義
        $homepageArr = [];
        $arrId = [];

        for ($i = 0; $i < $count; $i++)
        {
            // ホームページ用ニュースのIDを取得
            $homepageId = $i+1;

            // siteカラムのn番目のデータを取得
            $arr = $decode[$i]["site"];

            // siteの中身が空もしくは0、nullなら
            if (!empty($arr))
            {
                // siteの中にhomepageという値が存在したら
                if (in_array('homepage', $arr))
                {
                    // homepageArr配列にホームページ用ニュースのIDを格納
                    array_push($homepageArr, $homepageId);
                }

            }
        }
        
        // 最新ニュースが先頭に来るよう降順に変更
        $reverse = array_reverse($homepageArr);
        return $reverse;
    }

    // database上のIDとbySite上で出したIDを比較し一致したものだけ返す
    public function getNews($id)
    {
        return Report::where('id', '=', $id)->get();
    }

    // 日付のフォーマット変更
    public function getDate($date)
    {
        return date("Y/m/d", strtotime($date));
    }

}
```

##View
```html:newslist>default.htm

// ID、内容、作成日時、振り分け先のデータ
{% for bysite in NewsList.bySite %}

    // 上記で所得下データを変数にgetNewsに返す
    {% for getnews in NewsList.getNews(bysite) %}

            // IDの一致するものからフォーマットが変換された日付を表示
            <h2>{{ Newslist.getDate(getnews.created_at) }}</h2>

            // 内容の表示（<p>タグを抜いて）
            <p>{{ getNews.content|raw }}</p>

    {% endfor %}
{% endfor %}
ClozeTSルールブック

ClozeTSとは、TypeScriptの穴埋めクイズです。コードの一部が「穴」になっていて、その部分に適切なコードを当てはめて解く形式のクイズです。

この投稿では、ClozeTSのルールと遊び方について解説します。

### ClozeTSの例題

このTypeScriptコードの中の`__MISSING_CODE__`を適切なコードに置き換えて、コードを完成してください。
 
```typescript
let x: __MISSING_CODE__ = 1;
x = 2;
x = null; // Error
```

__回答例__

```typescript
let x: number = 1;
x = 2;
x = null; // Error
```

### ClozeTSのゲームルール

* コメントで`Error`と書かれた行は、**コンパイルエラーになる**ようにする。
* それ以外の行は、コンパイルエラーにならないようにする。
* 型に`any`は使ってはならない。(any縛り)
* `__MISSING_CODE__`の部分以外は変更してはならない。

※設問によって、個別ルールが設けられる場合があります。

### エラーヒント

`Error:`の後には、発生するコンパイルエラーのメッセージが書いてある場合があります。これは、コードを埋める上でのヒントです。

## ClozeTSの遊び方

1. コードを書いてクイズを解く。
2. コメント欄で回答を共有する。 (任意)

### 1. コードを書いてクイズを解く

* コードを書くには、TypeScript Playgroundをお使いください。
* Playgroundを使わない場合は、TSのバージョンとコンパイラオプションはPlaygroundの設定をご確認ください。

### 2. コメント欄で回答を共有する

出題者としては、一応の回答例は考えていますが、正解はひとつではないはずです。出題者は、どの回答が正しいとか優れているとか、とやかく採点するつもりはありません。みんなで答えを出し合って、「ほぉ〜、こんなやりかたもあるんだ」という知識の共有につながれば、より面白くなると思います。

クイズを解いた上で、ClozeTSを盛り上げたい、協力したいという方は、この共有ステップもやってみてください。

* 回答はコメント欄に投稿する。
* 自分と同じ回答がある場合、投稿の代わりに「いいね」する。
    * コメントが多数ある場合は、自分と同じ回答を隅々まで探す必要はありません。
    * ぱっと見て、なさそうなら投稿するくらいの感じで。あくまで遊びなのでリラックスして😌
* 気に入った回答には「いいね」する。
* 出題のレベルはTypeScript基礎ですが、上級者の方も参加して頂いてかまいません。
    * 技巧輝く回答には、ちょっとした解説を添えてください。
    * そのほうが、他の参加者も楽しめると思います。
【Nuxt.js】URLののクエリパラメータを取得する方法

前回[Javascriptで「？」から始まるURLのクエリパラメータを設定・取得する方法](https://qiita.com/hiroyukiwk/items/5162a8861f716bcd5fd7)を書いたのですが、Nuxt.js(vue.js)でするにはどうすればいいのか調べたら意外と簡単だったのでメモしておきます。

# vue-routerを使ってパラメータのクエリを取得
Nuxt.jsにはvue-routerがあるのでそちらの機能を使うと簡単に取得できます。

`http://localhost:3000/?id=12345`の場合の`12345`を取得したい場合
$route.query.idで取得できます。

```vue
<template>
  <section>
    <p>{{ $route.query.id }}</p>
  </section>
</template>
```

# formのvalueに値を渡す。
これをフォームのinputタグのvalueに渡すのには

```vue

<template>
  <form action="" method="post" id="test" name="test">
    <div>
      <label>お名前</label>
      <input name="お名前" type="text">
    </div>

    <div>
      <label>メールアドレス [必須]</label>
      <input name="メールアドレス" type="text">
    </div>

    <div>
      <label>お問い合わせ [必須]</label>
    </div>

    <div>
      <input type="hidden" name="query" :value="query">
    </div>

    <button type="submit">送信</button>
  </form>
</template>

<script>
export default {
	data () {
		return {
			query: '',
		}
	},
  created() {
    this.setQuery()
  },
  methods: {
    setQuery() {
      this.query = this.$route.query.id || ''
    },
  },
}
</script>
```
これでinputタグに受け渡しできました。
いやあ、Nuxtって便利ですね。:grinning:

※前回のながれでコンタクトフォームで書きましたが、Nuxtでのコンタクトフォームはこれでいいのか微妙なのでinputタグのvalueにクエリパラメータを渡す流れだけ捉えていただければと思います。
hbase

```
brew install hase
```

```
start-hbase.sh
```
#外部からのアクセスを許可するためのプロセスを立ち上げる

```
hbase thrift start
```

```py
#pip install happybase
import happybase

connection = happybase.Connection('localhost')
connection.open()


connection.create_table(b'sns',{'blog': dict()})
table = connection.table(b'sns')
table.put(
    b'user1',{
        b'blog:bitcoin': b'user1 about bitcoin',
        b'blog:soccer': b'user1 about soccer'
    }
)

table.put(
    b'user2',{
        b'blog:soccer':b'user2 about soccer'
    }
)

print(list(table.scan()))
print()
print(list(table.scan(row_prefix=b'user1')))
print()
print(list(table.scan(columns=[b'blog:soccer'])))

connection.disable_table(b'sns')
connection.delete_table(b'sns')
```
出力：

```
[(b'user1', {b'blog:bitcoin': b'user1 about bitcoin', b'blog:soccer': b'user1 about soccer'}), (b'user2', {b'blog:soccer': b'user2 about soccer'})]

[(b'user1', {b'blog:bitcoin': b'user1 about bitcoin', b'blog:soccer': b'user1 about soccer'})]

[(b'user1', {b'blog:soccer': b'user1 about soccer'}), (b'user2', {b'blog:soccer': b'user2 about soccer'})]
```

```
stop-hbase.sh
```
【Gradle】外部ライブラリの導入で詰まった話

## 背景と事象
[こちら](https://medium.com/@JacobASeverson/s3-maven-repositories-and-gradle-911c25cebeeb)の記事を参考にAWSのS3にプライベートなMavenリポジトリを作成しようとしていました。

その際に、AWSのクレデンシャル情報を取得するために

```gradle
ext {
    awsCredentials = new ProfileCredentialsProvider().credentials
}
```
とProfileCredentialsProviderクラスを用いようとしたところ、

```console
Could not compile build file 'C:\hoge\build.gradle'.
> startup failed:
  build file 'C:\hoge\build.gradle': 12: unable to resolve class ProfileCredentialsProvider
   @ line 12, column 23.
                awsCredentials = new ProfileCredentialsProvider().credentials
                           ^

  1 error

```
とビルドエラーが発生しました。

## 解決方法
下記のようにbuild.gradle内にbuildscriptとimport文を記述します。

```gradle
buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.amazonaws:aws-java-sdk-core:1.11.723'
    }

}

import com.amazonaws.auth.profile.ProfileCredentialsProvider
```

こうすることで、build.gradle内で外部ライブラリを用いることができます。

最終的にはこのように書くことで無事にビルドに成功し、S3にプライベートなMavenリポジトリを作成することができました。

```gradle:build.gradle
buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.amazonaws:aws-java-sdk-core:1.11.723'
    }
}

import com.amazonaws.auth.profile.ProfileCredentialsProvider

apply plugin: 'java'
apply plugin: 'maven-publish'

group = 'com.hoge'
version = '1.0.0'

sourceCompatibility = '1.8'
targetCompatibility = '1.8'

compileJava {
    options.encoding = 'UTF-8'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation('省略')
    testCompile 'junit:junit:4.12'
    testCompile 'org.hamcrest:hamcrest-library:1.3'
}

ext {
	awsCredentials = new ProfileCredentialsProvider().credentials
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java
        }
    }

    repositories {
        maven {
            url "s3://hoge/fuga/"
            credentials(AwsCredentials) {
                accessKey awsCredentials.AWSAccessKeyId
                secretKey awsCredentials.AWSSecretKey
            }
        }
    }
}
```

## まとめ
build.gradle内で外部ライブラリを使用する際は下記の例のように、buildscript内で使用するライブラリを宣言し、import文を書いてみてください。

```gradle
buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.amazonaws:aws-java-sdk-core:1.11.723'
    }

}

import com.amazonaws.auth.profile.ProfileCredentialsProvider
```


本記事が少しでも誰かのお役に立てば幸いです。
最後までお読み頂きありがとうございました。

## 参考文献

### 公式ドキュメント
[Build Script Basics - External dependencies for the build script](https://docs.gradle.org/current/userguide/tutorial_using_tasks.html#sec:build_script_external_dependencies)
[Vue.js] vue-routerのhashモードとhistoryモードの違いをざっくり理解する

vue-routerの**hashモード**と**historyモード**をざっくりと理解することが目的の記事です。

## そもそもルーターはなんで必要？SPAについて少し補足
これはVueに限った話ではないですが、ルーターの役割は（簡単に）SPAを実現するためと言っても良いでしょう。

### SPAとは
最初のリクエストで受け取ったHTML（index.html）を使いまわし、URLに対応したページをJavaScriptで動的に作成する方式です。

### MPAとは
SPA対してMPA（マルチページアプリケーション）と呼ばれたりします。
URLに対応したHTMLをサーバーが返してくれる従来の方式です。


## hashモード
hashモードではURLが下記のように表示されます。
`http://localhost:8080/#/hoge`

ルーティングに`URL hash`を使用しています。
この形式で入力されるとvue-routerは、
urlの `#` を見つけてそれより先の文字列を元に動的にコンポーネントを出し分けます。
また、サーバへの通信が発生しない分**historyモード**より若干早いです。

### メリット
- 設定が簡単
- historyモードより早い
- HTML5 History API をサポートしていないブラウザで動く

### 注意点
- **URLに`＃`が入ってしまう**

## historyモード

historyモードではURLが下記のように表示されます。
`http://localhost:8080/hoge`

historyモードではlocalhostにリクエストを送信する際は、ローカルサーバがindex.htmlを返すようになっています。
ホスティングサービスを利用する際は、`index.html`を返すように設定しなければならないので注意が必要です。

### メリット
- **URLに`＃`が入らない。**

### 注意点
- サーバへの通信が発生する
- 設定が必要 [※設定例はこちら](https://router.vuejs.org/ja/guide/essentials/history-mode.html#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A%E4%BE%8B)
- HTML5 History API をサポートしていないブラウザで動かない

## まとめ
vue-routerには二種類のモードがありますが、用途によって使い分けができます。
~~てか、HTML5 History APIをサポートしていないブラウザで動かそうなんて思わないからデメリットじゃない。~~
historyモードを使う際は、初心者がハマりがちな設定が必要なことを注意したいですね！

|| hashモード | historyモード |
|:-:|:--|:--|
| パスの形式 | `http://localhost:8080/#/hoge` | `http://localhost:8080/hoge` |
| メリット | 設定が簡単<br>historyモードより早い<br>HTML5 History API不要 | **URLに`＃`が入らない** |
| 注意点 | **URLに`＃`が入る** | サーバへの通信が発生する<br>サーバの設定が必要<br>HTML5 History API必要 |


## 参考
https://router.vuejs.org/ja/
【Docker】docker-compose.ymlの変更がDBに反映されなかった話

## 事象
下記のようにDockerを用いて、DBを構築しようとしていました。

```dockerfile:Dockerfile
FROM mysql:8.0
RUN mkdir /var/log/mysql
RUN touch /var/log/mysql/mysqld.log
```

```yml:docker-compose.yml
version: '3'
services:
  dbserver:
    build: ./docker/mysql
    image: test-db:0.0.1
    restart: always
    environment:
      MYSQL_DATABASE: test_db
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: rootpassword
    ports:
      - "3306:3306"
    volumes:
      - ./docker/mysql/initdb.d:/docker-entrypoint-initdb.d
      - ./docker/mysql/conf.d:/etc/mysql/conf.d
      - ./log/mysql:/var/log/mysql
      - ./docker/mysql/data:/var/lib/mysql

volumes:
  mysql-bd:
    driver: local
```

いったんコンテナを作成した後に、データベースの名前を変えようと思い、

```yml
    environment:
      MYSQL_DATABASE: test_db
```
の箇所を変更し、コンテナを再作成後にデータベース名を確認してみたところ、データベース名が変更前から変わっていませんでした。

## 原因と解決策
原因は、データを永続化させるためにvolumesに記載したこちらの1行でした。

```yml
      - ./docker/mysql/data:/var/lib/mysql
```

コンテナを再作成する際に、./docker/mysql/dataを消去していなかったため、変更前の情報が残っており、docker-compose.ymlを変更しても、DBの名前が変わらないという現象が発生していました。

というわけで、./docker/mysql/dataの中身を消去して、コンテナを再作成したところ、無事にDBの名前を変更することができました。

## まとめ
永続化しているDBの情報を編集する場合は、コンテナを再作成する前に、永続化しているデータを持つディレクトリの中身を消すことを忘れないようにしてみてください。

わかってしまえば非常に単純な話ですが、恥ずかしながら気づくのにかなり時間がかかってしまいました...

本記事が少しでも誰かのお役に立てば幸いです。
最後までお読みいただきありがとうございました。
[Kaggle] ep.X - モデル

# tldr

モデルについて学習しました。

# モデルとは？

> 特徴量を入力データとし、予測値を出力する変換器

- 分析コンペでは教師あり学習が基本。
- 学習前にハイパーパラメータを指定する

# モデルの学習と予測

1. モデルの構築（モデルの種類とハイパーパラメータを指定）
1. 学習（学習データ・目的変数を与える）
1. 評価
1. 予測・評価（テストデータ）

上記のサイクルを回しながら、以下を変更していく。

- 特徴量の追加・変更
- ハイパーパラメータの変更
- モデルの変更

データのイメージ

- 学習データは`n_tr * n_f` の行列
- 目的変数は `n_tr` の配列
- テストデータは `n_te * n_f` の行列
- 予測値は `n_te` の配列

# モデルの評価（バリデーション）

一部のデータをバリデーションデータとして分けて検証用とする。

## バリデーションデータの作成方法
- クロスバリデーション

# モデルに関連する用語とポイント

## 過学習 (over fitting)

## 正則化 (regularization)

## スコアのモニタリング

## Early stopping

## Bagging

bootstrap aggregatingの略。
各モデルに使う学習用データをブースストラップサンプリングによって得て、その学習したモデルを予測に用いて最後にアンサンブルする。

## Boosting

# 分析コンペで使用されるモデル
以下の観点からモデルが選択される

- 精度
- 計算速度
- 使いやすさ
- 多様性によってアンサンブルによる精度向上に寄与するか

参考：[scikit-learn: Choosing the right estimator](https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html)

## 勾配ブースティング木 (GBDT)
## ニューラルネット
## 線形モデル
## k近傍法 (k-nearest neighbor algorithm, kNN)
## ランダムフォレスト (Random Forest, RF)
## Extremely Randomized Tree (ERT)
## Regularized Greedy Forest (RGF)
## Field-aware Factorization Machines (FFM)
PowerShellをLinuxにインストールして試す

普段UbuntuやCentOSのシェル環境はbashかzshでの作業が多い私ですが、PowerShellのスクリプトを業務で触ることもありますので、Linuxの作業環境にPowerShellを入れて触ってみました。

# インストール

先日リリースされたばかりのPowerShell 7.0.0です。

インストール手順は公式ドキュメントを見るとわかります。

Installing PowerShell on Linux - PowerShell | Microsoft Docs
https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7

Release v7.0.0 Release of PowerShell · PowerShell/PowerShell
https://github.com/PowerShell/PowerShell/releases/tag/v7.0.0

以下の手順でインストールしました。

```console
$ mkdir powershell
$ cd powershell
$ wget https://github.com/PowerShell/PowerShell/releases/download/v7.0.0/powershell-7.0.0-linux-x64.tar.gz
$ tar xvzf powershell-7.0.0-linux-x64.tar.gz
```

`bin`のようなディレクトリがなく、直下に実行バイナリが現れます。このディレクトリを直接`PATH`に入れるのも気持ち悪いので、`PATH`の通った汎用の`bin`にシンボリックリンクを作成しました。こんな感じ。

```console
$ ln -s $HOME/powershell/pwsh $HOME/bin/pwsh
```

以下で実行できます。

```console
$ pwsh
```

# 所感

ほとんどPowerShellを触ったことのない私の感想です。

## Linux上のコマンドとの混在とパイプについて

Linux上のコマンドはPowerShellからでも普通に呼び出せます。

```console
> ls | less
```

`ls`はPowerShellでは`Get-ChildItem`というPowerShellのコマンドのエイリアスであって、Linuxの`ls`とは違うと聞いてたのですが、LinuxのPowerShellでの`ls`はLinuxの`ls`が実行されるようです。Windowsとは違うのかもしれません。

PowerShellのコマンドとLinuxコマンドの混在もできるようです。

```console
> Get-ChildItem | less
> Get-ChildItem | grep foo
```

PowerShellのパイプは、Linuxのパイプと違ってテキストやバイナリが流れるのではなく、オブジェクトが流れるので、 `ls | grep xxx` は次のように書けるようです。

```console
> Get-ChildItem | Where-Object { $_.Name -like "*foo*" }
```

`Where-Object` はフィルタリングするもので、`{ ... }` は関数みたいなもので、 `$_` は引数か。

この例での `$_.Name` のような、 `Get-ChildItem` から流れてくるオブジェクトにどんなプロパティやメソッドがあるかを調べるには `Get-Member` というのを使う。

```console
> Get-ChildItem | Get-Member
```

## ワンライナー

bashやzshなどからPowerShellをワンライナーとしても使えます。 `-c` というオプションを使います。

```console
$ pwsh -c 'Get-ChildItem | Where-Object { $_.Name -like "*foo*" }'
```

## コマンド履歴

コマンド履歴の保存されているファイル（`.zsh_history`などに相当するファイル）は `$HOME/.local/share/powershell/PSReadLine/ConsoleHost_history.txt` です。

以上。
GSuiteを個人契約して良かったこと

## 導入前 と 導入後
[GSuite](https://gsuite.google.com/intl/ja/pricing.html)

1. 長年 Gメール(@gmail.com)を使っていたが、使用用途ごとに増えていき、
約10アカウントを管理していて、面倒に感じていた。

2. イベントやカンファレンスでの交流が増え、メールを表に出すことが
多くなったので、独自ドメインのメアドが欲しいと思った。

3. Gドライブなど便利な機能をアカウントが多かったため、管理できないと思い
別のサービスを使用するなどしていた。

## 導入後
1. メールエイリアス機能で、用途ごとにエイリアスを作成して、フォルダごとに振り分けルールを設定して
アカウントは1つで管理することでよくなった。(普通のGmailでも5個までは使用できるらしい)

2. 自分だけの、ドメインアドレスを持つことができた。作成や設定はそんなに難しくなかった。
※ドメインの取得はお金がGSuiteと別途で必要で、取得するドメインによります。

3. ファイルのバックアップなどを含めた管理をすべて、Gドライブに変更しました。今まで、xlsxファイルを使用していたが、エクセルが端末ごとに入れてたり入れてなかったりしていたので、全てスプレッドシートに変更した。

Gドライブが30GB以内で、今のところ十分なため Basicで契約しています。
今後、容量がたりないなどなれば無制限に使える。Businessに変更しようと思います。

## 機能
GSuite契約後に専用の管理画面に入ることができ、設定や管理を行うことができます。
<img width="1047" alt="スクリーンショット 2020-03-09 7.13.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411507/e20e28b3-4948-135b-469a-61c9ec688763.png">

### デバイス
ログインしている端末が管理できるので、不正なログインがあればすぐに感知できます。
アカウントが多かった頃は、どの端末にどのアカウントでログインしているなどの管理が面倒だったが、アカウント1つ管理すればいいので、結構便利です。

### ドライブファイルストリーム
管理画面にはないが、Gドライブの機能として
自分のPCにディスクドライブを1つ追加する感じで、Gドライブのファイルを管理できます。GドライブのみローカルとGドライブどっちにもおくなどの設定も簡単です。
ネット接続ができない環境では、編集だけしておくと、ネット接続時に自動でGドライブに同期されます。

## まとめ
まだ契約したばかりで、全部把握できていないので、今後便利なものがあれば使用していこうと思います。
組織やグールプなどで、利用されることが多いとは思いますが、普段Googleをメインにサービスを利用している人は個人での契約もおすすめだと思います！
BigQueryでDDLの取得をする方法

BigQueryで既存のテーブルの構成をコピーしたいので、DDL文を取る必要があった

`create table` 文は取れなそうだが、JSON形式では以下のコマンドで取得可能

```
bq show \
--schema \
--format=prettyjson \
project_id:dataset.table > path_to_file
```

取得したJSONファイルを元にテーブルを作るには以下のコマンド

```
bq mk --table project_id:dataset.table path_to_schema_file
```

テーブルの構成と一緒にデータもコピーしてよい場合は `bq cp` が便利

```
bq --location=location cp \
-a -f -n \
project_id:dataset.source_table \
project_id:dataset.destination_table
```


参考
https://cloud.google.com/bigquery/docs/schemas?hl=ja#specifying_a_json_schema_file

https://cloud.google.com/bigquery/docs/managing-tables?hl=ja#copying_a_single_source_table
BLEACHの20周年記念サイトがオサレすぎる件について

# BLEACHの20周年特設サイトとは

この度週刊少年ジャンプの大人気漫画BLEACHが連載20周年を記念して、大発表があるみたいです。

その特設サイトがとてもオサレでかっこいいので、簡単にですがサイトの調査をしてみました。

[公式サイト](https://bleach-20th-anniversary.com/)はこちら

ちなみに僕は斑目一角の卍解が大好きです。

# OSR値（オサレち）とは

週刊少年ジャンプ2007年17号で、瀕死の死神がパワーアップした敵を返り討ちにするという、従来のバトル漫画理論では説明のつけられないシーンが描かれた。この現象を説明する為に、「The男爵ディーノ」のかがみ氏が提唱したのがOSR値である。

OSR値の登場により「主人公より強い敵が倒される」「本来は強いのに、能力をひた隠しにしたために劣勢になる」といった作中の理不尽な現象に一応の説明をつける事ができたため、多くの人々がOSR理論を支持している。[^1]

# サイトの全容

<img width="1433" alt="スクリーンショット 2020-03-09 4.28.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486805/9eaa0c82-52e3-d7ae-7ba0-a6ffd565c14b.png">

公式サイトを開くとアニメーションが動き、どでかく愛染様が出現しました。
いますぐ黒棺の詠唱しそうですね。

そして、発表までのカウントダウンが始まります。

アニメーションもオサレなので実際に飛んでみてください。

カウントダウンも発表まで〇〇日〇〇時間〇〇秒などという簡単なものではなく、オサレさが漂っております。

`WILL BE IN 290Hours 25Minutes 10Seconds`


# 開発言語やシステム構成は？
<img width="468" alt="スクリーンショット 2020-03-09 4.41.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486805/50c5ccdb-022e-7476-7130-68b706840f25.png">

Webサイトやアプリに使われている言語等が見られるWappalyzerを使ってみていきます。
静的サイトにあたるのでHTML/CSSと*three.js*が使われています。

three.jsは３Dコンテンツを制作するのに得意とされています。このオサレさはthree.jsのおかげということですね。

もう一つ着目する点はAWSのCloudfrontを使っている点でしょうか。

Cloudfrontは、静的、動的コンテンツをユーザーの最も近いサーバーから読み取るので超はやい！というものです。これのおかげでサーバーの負荷が減らせたりします。色んなファイルとかキャッシュをサーバーに置いとくよ〜というものです。
ハイテクですね〜BLEACH。

# 検証画面を開いてみる

さて、次はサイトの構造を見ていきます。

ブラウザはChromeです。

右クリック⇨検証します。

すると、、、、、、、、！！！！

<img width="1440" alt="スクリーンショット 2020-03-09 4.37.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486805/a06612f5-4d1d-f81e-4867-4ab8a24f2a04.png">

反転したBLEACHの文字が現れました！！！

反転させているのがまたオサレですね。。。。しかも緑色、このチョイスがBLEACHらしいですね。

開発した人も絶対BLEACH好きですね。

# 背景画像について

先ほどの画像は愛染様でしたが、リロードすると別のキャラクターになります。

一体何種類のキャラクターがいるのか気になりませんか？

エンジニアっぽく探してみます。

**検証⇨source⇨assets⇨cut_pc**というフォルダの中にありました！！

合計で35枚のイラストが入っています。
ネタバレされたくない方もいると思うので気になる方は探してみてください。
僕のお気に入りはファイル名「31.jpg」です。

# まとめ
漫画の特設サイトのコードを読んだりするのは初めてだったのでとても面白く、他のサイトも見てみたくなりました。

BLEACH20周年、何が起きるかとても楽しみです。

皆さんの好きな卍解は何ですか？

[^1]: [出典](http://ja.uncyclopedia.info/wiki/OSR)
情報セキュリティ

# 公開鍵暗号方式

実装方法
## RSA
桁数の大きな数の素因数分解に、膨大な時間がかかることを利用した方式

## 楕円曲線暗号
楕円曲線上の演算規則を利用した方式

## ElGamal暗号(エルガマル暗号)
位数が大きな群の離散対数問題が困難であることを利用した方式
入出力装置　

テクノロジ/コンピュータ構成要素/入出力装置

# ディスプレイの種類
## 有機ELディスプレイ
　電極の間に電気を通すと発光する特殊な有機化合物を挟んだ構造のディスプレイ

## ブラウン管ディスプレイ
　電子銃から発射された電子ビームが蛍光灯に当たり発行することを利用するディスプレイ

## 液晶ディスプレイ
　光の透過を画素ごとに制御し、カラーフィルターを用いて色を表現するディスプレイ

## プラズマディスプレイ
　放電によって発生する紫外線と蛍光体を利用するディスプレイ
離散数学

# テクノロジ/基礎理論/離散数学

### 打切り誤差
　無限小数などの計算を途中で打ち切るなどによって生じる誤差

### 桁落ち
　浮動小数点演算において、絶対値の非常に近い値同士の加減算をした場合に、
有効桁数が減ってしまうこと

### 情報落ち
　浮動小数点演算において、絶対値の大きな数と小さな数の加減算をした場合に、
絶対値の小さな数の有効桁の一部または全部が結果に反映されないこと


### 絶対誤差
　真の値と測定値との差を示す誤差のこと
Ruby技術者認定試験Silverで引っ掛かりやすい問題

Ruby技術者認定試験のSilverを勉強中ですが、個人的に引っ掛かりやすい問題についてまとめました。
随時更新予定。
引っかかった問題は、ほぼ[REx - Ruby Examination](https://rex.libertyfish.co.jp/)さんからの出題です。

# x進数

### 文字列からx進数への置換

| メソッド       |   内容    |
|-----------------|------------------|
| hex             |16進数で解釈し、整数で返す。 <br> 解釈できない場合は0を返す。 <br> 接頭語0x,0X,アンダースコアは無視される。|
| oxt | 8進数で解釈し、整数で返す。 <br> 解釈できない場合は0を返す。<br> 接頭語は無視しない。|

### 基数指示子

数値の前につけることで、何進数かを指定するもの。

| 基数指示子 | 内容 |
|-----|-----|
|0b| 2進数(binary) |
|0o| 8進数(octal) |
|0d| 10進数(decimal) |
|0x| 16進数(hexadecimal) |

# 日付フォーマット

忘れやすいフォーマットを列挙します。
小文字と大文字を混同しやすいので注意。

| フォーマット | 表示 |
|-----|-----|
| %x | %m/%d/%y で表示される|
| %D | %m/%d/%y で表示される <br> %xと同等|
| %d | 0埋めの日付 |
| %F | %Y-%m-%d で表示される |
| %y | 西暦の下2桁 |
| %Y | 西暦4桁 |
| %M | 0埋めの分 |
| %m | 0埋めの月 |

# Hashクラス

### 生成方法
* Hash({})
* {}
* Hash.new
* 二次元配列.to_h

### メソッド

破壊的か、非破壊的かに注意する

| メソッド名 | 内容 | |
|-----|-----|-----|
| merge | 引数のハッシュをマージする | 非破壊的 |
| update | 引数のハッシュをマージする <br> merge!と同等 | 破壊的 |

### その他

* splat演算子(*)でハッシュは配列に展開される
    * `*{a: 100, b: 200} => [[:a, 100],[:b, 200]]`

# Arrayクラス

### メソッド

配列を組み合わせて生成するメソッド。混同しやすいので注意。

|メソッド名 | 内容 |
|-----|-----|
|zip| `[1,2].zip([3,4]) => [[1,3],[2,4]]`|
|product|`[1,2].product([3,4]) => [[1,3],[1,4][2,3][2,4]`|

配列に値を追加、削除をするメソッド。いずれも破壊的メソッド。

|メソッド名|位置||
|-----|-----|-----|
|pop|末尾|取り出し|
|push|末尾|追加|
|shift|先頭|取り出し|
|unshift|先頭|追加|

### その他

* `-`は引数に含まれる要素と同一の要素を取り除いて返却する。

# Stringクラス

### 空白、改行を削除するメソッド

何を取り除くのか間違いやすいので注意。
またいずれも非破壊的で、!を付けると破壊的メソッドとなる。

|メソッド名|除去対象|位置|
|-----|-----|-----|
|chomp|改行コード|末尾|
|strip|空白文字|先頭と末尾|
|chop|空白文字|末尾|

### その他

* `String#%`でフォーマットされた文字列を返す。指示子がない場合は、そのままを返却。
* Stringの結合は`+`,`<<`,`concat`,`*`の4つ。

# Dirクラス、Fileクラス、IOクラス

### ファイルの書き込みモード

追記する位置の違いに注意。
※読み込みは、`IO#seek`で指定が無ければ、いずれのモードも先頭から行う

|モード|内容|書き込み位置|
|-----|-----|-----|
|a|追記モード|常にファイルの末尾|
|r+|読み書きモード|ファイルの先頭|ファイルの先頭
|w+|読み書きモード|既存ファイルの内容を空にして追記|
|a+|読み書きモード|ファイルの末尾 |

### ファイルポインタ

|定数名|内容|
|-----|-----|
|IO::SEEK_SET|ファイルの先頭からの位置|
|IO:SEEK_CUR|現在のファイルのポインタの位置|
|IO:SEEK_END|ファイルの末尾|

`io.seek(-10, IO:SEEK_END)`のように使う。

# Enumerableモジュール

似ているけど動きが違うメソッド。

|メソッド名|内容|
|-----|-----|
|find|ブロックを評価し、**最初に**真になった値を返却する|
|select|ブロックを評価し、真になった値を**全て**返却する|

# %記法

`%`を付けると、文字列を囲う記号を指定できる

|書式|生成値|
|-----|-----|
|%Q|ダブルクォートで囲う。 <br> %と同意 |
|%q|シングルクォートで囲う |
|%W|配列を生成 <br> 式展開可能 |
|%w|配列を生成 <br> 式展開できない|
|%x|コマンドを出力|
|%s|シンボル|
|%r|正規表現|

# ブロック

* do...endと{...}では、{...}の方が結合度が強い
* `p [1,2,3,4].map do |e| e * e end`を実行すると、do...endの方が弱いので、`p {[1,2,3,4].map}`が評価される

# その他

* `unless`は`elsif`を用いることはできない（elseはOK）
* 可変長引数は2つ以上指定できない
* メソッドと変数の探索順位は、変数が先
* ヒアドキュメントで`<<-`と指定すると、インデントを加えることができる
テーブルの行をドラッグ＆ドロップで並び替えるJqueryプラグインにはまった

#テーブルの行をドラッグ＆ドロップで並び替えるJqueryプラグイン2選
1つはjqueryULのsorttable、もう一つはtabledndというプラグイン。両方、tableと名はついていますが、tableである必要はなく、要素を並べ替えらるプラグインです。
2つともには、はまってしまいました。

はまった条件は、総ての行にthを使っていたこと（はまったのはtablednd）、tableのクラスをセレクタに使ったこと（こっちはsorttable）です。
#はまった手法
```
<table class="foo">
  <tr>
    <th>見出し１</th><th>見出し２</th><th>見出し３</th>
  </tr>
  <tr>
    <th>見出しa</th><td></td><td></td>
  </tr>
  <tr>
    <th>見出しb</th><td>></td><td></td>
  </tr>
  </table>
```
<table class="tablednd">
  <tr>
    <th>見出し１</th><th>見出し２</th><th>見出し３</th>
  </tr>
  <tr>
    <th>見出しa</th><td></td><td></td>
  </tr>
  <tr>
    <th>見出しb</th><td></td><td></td>
  </tr>
  </table>
jqueryとそれぞれのプラグインを読み込み、
sorttableだと
[https://jqueryui.com/](https://jqueryui.com/)

```
$(function() {
    $('.foo').sorttable();
});
```

tabledndだと
[https://github.com/isocra/TableDnD](https://github.com/isocra/TableDnD)

```
$(function(){
  $(".foo").tableDnD();
});
```
で動くはずだったのに、動かない。
#わかったこと
##tablednd
- jquery1系、jquery2系、jquery3系すべてに使用可
- thが含まれる行は、初期値では固定となり動かせない

左側のセルをthにする場合、動かなくなることに留意が必要。

##sorttable
- `<table class="foo"><tr>……`としていても<br>
`$('.foo').sorttable();`ではなく、<br>
`$(".foo tbody").sorttable();`とすべし

```
$(function() {
    $('.foo tbody').sorttable();
});
```
こっちなら動きます。
tbody！！
そう思ってみると、参考にしたサイトでは、tableではなく、tbodyにクラス名が見本サイトにはついています。普段、tbodyを書かない方、要注意です。
公式サイトではul>liで、liを動かしていました。ソースよりも、dom上の親要素をセレクタにということです。
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="html,result" data-user="kazu-1" data-slug-hash="BaNdqbP" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="BaNdqbP">
  <span>See the Pen <a href="https://codepen.io/kazu-1/pen/BaNdqbP">
  BaNdqbP</a> by kazu-1 (<a href="https://codepen.io/kazu-1">@kazu-1</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
初心者によるプログラミング学習ログ 257日目

#100日チャレンジの257日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
257日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>257日目<br>・youtubeで、webサイト模写<br>・過去につくった自作ポートフォリオ改造<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1236745220223430656?ref_src=twsrc%5Etfw">March 8, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
[漏洞通告]CVE-2020-5405/Spring-cloud-config-server存在路径穿越

### 漏洞描述
近日,亚信安全网络攻防实验室跟踪到spring-cloud-config-server组件存在路径穿越漏洞,该漏洞由绿盟科技提交给Spring官方.攻击者利用此漏洞可以实现目录穿越,以此读取未授权文件的内容.

### 漏洞编号
CVE-2020-5405

### 漏洞威胁等级
中危

### 影响范围
2.2.0 <= Spring Cloud Config <= 2.2.1
2.1.0 <= Spring Cloud Config <= 2.1.6

### 漏洞验证
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/aa218c2d-d03f-e2d8-1af5-5a4e72a6298b.png)
该漏洞有以下两个注意事项:
1.该漏洞只能读取带后缀的文件
2.需要`spring.profiles.active`的值为本地文件系统`native`,且仓库为本地而非git
### 修复建议
升级到最新版本即可

### 时间轴
[0] 2020/03/05 NVD发布漏洞通高
[1] 2020/03/06 绿盟科技发布漏洞通告
[2] 2020/03/09 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告

### Reference
https://nvd.nist.gov/vuln/detail/CVE-2020-5405
https://mp.weixin.qq.com/s/sBG-hSzmUde2SF7ZdsF5GQ
sshfsを使って踏み台サーバ経由で開発用サーバのファイルをマウントする方法

## 概要

- 踏み台サーバ経由で開発用サーバにアクセスする必要がある場合
- 開発用サーバのファイルをローカルにマウントしたい
- sshfsを使ってマウントする

![Screenshot from 2020-03-09 03-36-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130670/e547d517-bd9f-46e6-3fa4-55b9556d34e6.png)

## なぜsshfsを使う？
例えば、VSCodeを使って開発する場合、
Remote SSHを使えば無駄な労力なくローカル環境で開発できるが、
接続先があまりにも大きすぎると、フリーズすることがしばしば

sshfsでは体感ですが、快適に開発することができます

## 環境構築
### macの場合

- `FUSE for mac`をインストール

```bash
$ brew tap homebrew/cask
$ brew cask install osxfuse
```

- sshfsのインストール

```bash
$ brew install sshfs

# インストールされたことを確認
$ sshfs --version
```

### Ubuntuの場合

```bash
$ apt install -y sshfs

# インストールされたことを確認
$ sshfs --version
```

## sshの設定

### キーペアの配置
ssh接続するために作成した開発用サーバのキーペアをダウンロードして、
名前を`dev.pem`に変更し`~/.ssh/keys`にコピー

```bash
# キーペアの名前をdev.pemに変更
$ mv xxxx.pem dev.pem

# キーペアの移動
$ cd dev.pem ~/.ssh/keys
```
キーペアがない場合は、[こちら](https://cloud-textbook.com/120/#i-3)を参考にキーペアを作成する。

### configファイルの編集

```:~/.ssh/config
Host jump-host
    User <<踏み台サーバのホスト名：ec2-userなど>>
    HostName <<踏み台サーバのグローバルIPアドレス>>
    port 22
    TCPKeepAlive yes
    ServerAliveInterval 60

Host dev-server
    User <<踏み台サーバのホスト名：ec2-userなど>>
    HostName <<開発用サーバのプライベートIPアドレス>>
    port 22
    IdentityFile ~/.ssh/keys/dev.pem
    ProxyCommand ssh -W %h:%p jump-host
    TCPKeepAlive yes
    ServerAliveInterval 60
    RemoteForward 52698 127.0.0.1:52698
```

IPアドレスがわからない場合は、以下の記事参照
[EC2のIPアドレスを調べる方法（超初心者向け）](https://qiita.com/t-kudo9/items/630306d138794d9a359c)

## マウント

マウントしたいファイルのパスを指定して、下記のコマンドを入力

```bash
$ sshfs -o follow_symlinks dev-server:<<マウントしたいファイルのパス>> ~/Workspace/dev
```

ファイルパスは以下のコマンドで確認

```bash
$ pwd
/home/ec2-user/dev
```

例) `/home/ec2-user/dev`をマウントするとき

```bash
$ sshfs -o follow_symlinks dev-server:/home/ec2-user/dev ~/Workspace/dev
```


## アンマウント

```bash
$ umount -f ~/Workspace/dev
```

## 便利な設定

マウントおよび、アンマウント時に入力するコマンドはどうしても長くなってしまうので、エイリアスを設定しましょう

```~/.bashrc
# setting sshfs
# mount
alias sfdev='sshfs -o follow_symlinks dev-server:<<マウントしたいファイルのパス>> ~/Workspace/dev'
# unmount
alias ufdev='umount -f ~/Workspace/dev'
```
Ruby on Rails 第３章　3.31で　rails testでエラーで嵌まる

rails test で下記エラーが発生し少し嵌まった

原因はapp/views/static_pages/home.html.erbの
４行目の
<title><%= yield(:title) %> |の部分
%> |が　空白が１文字入っていて　%>  |
になっていたところ
プログラム的にはなにがおかしいのかまだ理解できないが
空白をひとつ削ったら正常な動作になった

$ rails test
Run options: --seed 51555

# Running:

..F

Failure:
StaticPagesControllerTest#test_should_get_home [C:/Users/user/environment/samp_app/test/controllers/static_pages_controller_test.rb:11]:
<Home | Ruby on Rails Tutorial Sample App> expected but was
<Home  | Ruby on Rails Tutorial Sample App>..
Expected 0 to be >= 1.


bin/rails test test/controllers/static_pages_controller_test.rb:8

.

Finished in 0.998276s, 4.0069 runs/s, 7.0121 assertions/s.
4 runs, 7 assertions, 1 failures, 0 errors, 0 skips
自分的　vulkan エラーログメモ

#はじめまして
見てくれてありがとう、あなたの参考になると幸いです。

##出会ったやつ

###VUID-VkWriteDescriptorSet-descriptorType-00319
これは[**VkWriteDescriptorSet**](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkWriteDescriptorSet.html)の**dstBinding**変数が同じ**Descriptor**にすでに定義されていた場合発生する。

###VUID-VkWriteDescriptorSet-dstBinding-00315 
これは[**VkDescriptorSetLayoutBinding**](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkDescriptorSetLayoutBinding.html)もしくは[**VkDescriptorSetLayoutCreateInfo**](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkDescriptorSetLayoutCreateInfo.html)のbindingCount変数の内容が[**VkWriteDescriptorSet**](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkWriteDescriptorSet.html)と一致していない場合発生する。

###VUID-VkWriteDescriptorSet-dstBinding-00316 
これは[**VkDescriptorSetLayoutBinding**](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkDescriptorSetLayoutBinding.html)、[**VkDescriptorSetLayoutCreateInfo**](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkDescriptorSetLayoutCreateInfo.html)、[**VkWriteDescriptorSet**](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkWriteDescriptorSet.html)のどれかの**descriptorCount**変数が0だった場合発生する。

### UNASSIGNED-CoreValidation-Shader-MissingDescriptor
これは[**VkDescriptorSetLayoutBinding**](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkDescriptorSetLayoutBinding.html)もしくは[**VkDescriptorSetLayoutCreateInfo**](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkDescriptorSetLayoutCreateInfo.html)の内容が[**VkWriteDescriptorSet**](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkWriteDescriptorSet.html)と一致していない場合発生する。

###UNASSIGNED-CoreValidation-Shader-DescriptorTypeMismatch
これはシェーダーの**Binding**と**dstBinding**変数は一致しているが、渡したデータのタイプが違うと発生する。
OCP 4.3をお弁当箱に全自動インストールする - 4. NUC構築編

[1. 概要編](https://qiita.com/hmiyakoshi0803/items/00a26dde9de0c6983e18)
[2. 準備編①- ESXiインストールメディアの作成]()
[3. 準備編②- CentOS自動インストールメディアの作成](https://qiita.com/hmiyakoshi0803/items/e5b1786d96010f9a172d)
**4. NUC構築編（本記事）**
[5. ESXiインストール編]()
[6. ESXi Virtual Network構築編]()
[7. VCSA構築編]()
[8. 踏み台サーバ構築編① - VM構築]()
[9. 踏み台サーバ構築編② - ミドルウェア構築]()
[10. 踏み台サーバ構築編③ - MatchBox構築]()
[11. OCP4.3 インストール編]()
props.childrenを渡す方法

## childrenって何？
```js
<View>
    // ここの中のこと
</View>
```
タイトルなどのcssは同じで、中の子要素が違うデザインのコンポーネントを作る時は**children**をpropsとして渡して使います！

## やってみた

**testComponent/index.jsx**

```jsx

import React, { FC } from "react";
import "./styles.css";

// 型はNodeになります
const Test = ({ children }: { children: Node }) => {
  return (
    <div className="childrenTitle">
      <p>元々Componentに書かれているtext</p>
      {children}
    </div>
  );
};

export default Test;

```

**使う側**

```jsx
import React from "react";
import "./styles.css";
import Test from "./testComponent";

export default function App() {
  return (
    <div className="App">
      <Test>
        <p className="title">--- propsとして渡す値 ---</p>
        <p>こんな感じで子要素を渡せます!</p>
        <p>とっても便利</p>
      </Test>
    </div>
  );
}
```

**結果**
![スクリーンショット 2020-03-09 3.00.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394411/0293a873-d20c-f47a-e30d-59e48558dc62.png)
docker-composeでハマった話

こんなエラーでハマりました。
環境は`macOS Mojave 10.14.6`

```
ERROR: dial tcp: lookup registry-1.docker.io on 10.0.2.3:53: dial udp 10.0.2.3:53: connect: network is unreachable
```

### 解決策
自分の場合は`docker-machine`の環境変数の問題でした。
なので以下の方法で直しました。

```
$ docker-machine env --unset
set -e DOCKER_TLS_VERIFY;
set -e DOCKER_HOST;
set -e DOCKER_CERT_PATH;
set -e DOCKER_MACHINE_NAME;
# Run this command to configure your shell:
# eval (docker-machine env --unset)
$ eval (docker-machine env --unset)
```
Coherent Point Drift アルゴリズムのメモ

## 背景

surface registration(主に顔とか体とか)やりたい.
non-rigid ICP がよく使われているようだが, Coherent Point Drift 手法も気になる
(CPD は, ICP に比べると計算量は多いが, ロバストな結果が得られる)


世界最高精度・最高速度で点群位置合わせ問題の解を見つけるアルゴリズムを発見！～コンピュータグラフィックスなどの分野に貢献～
https://www.kanazawa-u.ac.jp/wp-content/uploads/2020/02/200218.pdf

こちらで CPD を知りました. ありがとうございます.

## 論文

A Bayesian formulation of coherent point drift
https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=8985307

上記プレスリリースの論文. 関連研究などまとまっています. ありがとうございます. :pray: 
  
## ニューラルネットで早くする

Coherent Point Drift Networks: Unsupervised Learning of Non-Rigid Point Set Registration
https://github.com/Lingjing324/CPD-Net


## コード

https://github.com/ohirose/bcpd
C++11 で動けばラッキーだと思いましたが, matlab コード + Windows のみっぽいようでつらい :cry:


https://github.com/gadomski/cpd

C++ でポータブルにまとまっていて良い!
しかし GPL2 ライセンスなので注意.
  
CUDA 実装(未検証)
https://github.com/cmsaliba/coherent_point_drift_cuda

## その他

Gravitational Approach for Point Set Registration
http://openaccess.thecvf.com/content_cvpr_2016/papers/Golyanik_Gravitational_Approach_for_CVPR_2016_paper.pdf
髪の毛フィッティングのメモ

## 背景

髪の毛の写真や RGB-D 画像などから, strand(curve)形状をフィッティングしたい

Strand-Accurate Multi-View Hair Capture
http://vclab.kaist.ac.kr/cvpr2019p1/index.html

こういうの

Strand-Accurate Multi-View Hair Capture では, hair 用の MVS アルゴリズムを提案している.

## 他に使えそうな手法

A method for global non-rigid registration of multiple thin structures
http://www.csd.uwo.ca/faculty/beau/PAPERS/crv-15.pdf