OmniAICreator/Qiita-1.07M huggingface dataset:
リモートホストから探るドコモ光のISP情報

お引っ越しシーズンドコモ光を検討(利用)されている方も多いのではないでしょうか？
今回はリモートホストからドコモ光の提携プロバイダーを探ってみました。
すべてを把握しているわけでは無いので、皆さんからの情報提供もお待ちしております。


私が過去利用していて実際に確認したISPについては備考欄に*をつけています。
掲示板やTwitterなどで得た情報も含まれています。
####~~あくまで参考情報としてご利用下さい。~~


#### 最終更新2020年３月１４日現在

|ISP名|提供タイプ|PPPoE|IpoE提供事業者|備考|
| ---- | ---- | ---- | ---- | ---- | ---- |
|ドコモnet|A | ocn | transixと<br> OCNバーチャルコネクトを併用 |
|plala|A | plala.or.jp | transixと<br> OCNバーチャルコネクトを併用 <br>(契約した期間で違う。) |*(現在IpoEはOCNバーチャルコネクトが提供)
|GMOとくとくBB|A | gmo-isp.jp  | JPNE |* IpoEを開通するとPPPoEは無効になる。<br>(PPPoEのバックボーンはアルテリアネットワークスの模様)
|Nifty|A |infoweb.ne.jp | JPNE |*
|DTI|A |dti.ne.jp| JPNEと<br> OCNバーチャルコネクトを併用(契約した期間で違う。) |(現在IpoEはOCNバーチャルコネクトが提供)
|Biglobe|A |mesh.ad.jp| JPNEと<br>Biglobeを併用(契約した期間で違う。) |(現在IPoEはBiglobeが提供)
|andline|A | 情報なし(不明)| 不明(JPNE?) |情報提供募集中
|hi-ho|A | hi-ho.ne.jp| transix|
|tigers-net|A | 情報なし(不明)| 不明(JPNE?) |情報提供募集中
|speedia|A | 情報なし(不明)| JPNE |情報提供募集中
|エディオンネット|A | 情報なし(不明)|IpoE方式での提供なし |情報提供募集中
|ic-net|A | 情報なし(不明)|JPNE |情報提供募集中
|excite|A | excite|transix |追加での提供募集中
|synapse|A | 情報なし(不明)|不明(JPNE?) |情報提供募集中
|楽天ブロードバンド|A | 情報なし(sannet.ne.jp?)|クロスパス？|情報提供募集中
|tikitiki|A | 情報なし(不明)|IpoE方式での提供はなし |情報提供募集中
|01光コアラ|A | 情報なし(不明)|IpoE方式での提供なし|情報提供募集中
|OCN|B | ocn|OCNバーチャルコネクト |
|@ tcom|B |t-com|JPNE|
|TNC|B |不明|IpoE方式での提供なし|情報提供募集中
|WAkWAK|B |wakwak|transix|PPPoEバックボーンはxephion
|ASAHI NET|B |asahi-net|v6CONNECT|情報提供募集中
|ちゃんぷるネット|B |asahi-net|JPNE|情報提供募集中


意外とドコモ光でも知らないISPが多かったです、、、
Angularの親子コンポーネント間の値の受け渡し

少し特殊な書き方をするので備忘録。

#親から子への受け渡し
親側のhtmlで子コンポーネントのプロパティへ渡したい値を設定。
子コンポーネント側では`@Input`デコレータを使って受けとる。

**親コンポーネント側**

```parent.component.ts
export class ParentComponent {
  parentValue: string = "hoge";
}
```

```parent.component.html
  <app-child
      [valueFromParent]="parentValue">
  </app-child>
```

**子コンポーネント側**

```child.component.ts
import { Input } from '@angular/core';

export class ChildComponent {
  @Input() valueFromParent : string;
}
```

#子から親への受け渡し
こちらは少し特殊になります。

子側で`@Output`デコレータを使ったEventEmitterを使い、
親側でイベントをトリガーさせて親側へ値を渡します。


**子コンポーネント側**

```child.component.ts
import { Output } from '@angular/core';

export class ChildComponent {
  childValue: string = "hoge";
  @Output() onChild: EventEmitter = new EventEmitter<string>();

  onBtnClick(){
    this.onChild.emit(this.childValue);
  }
}
```

**親コンポーネント側**

```parent.compoment.html
  <app-child
      (onChild)="onChildInParent($event)">
  </app-child>
```

```parent.component.ts
export class ChildComponent {
  parentValue = "";

  onChildInParent(valueFromChild: string){
    this.parentValue = valueFromChild;
  }
}
```


参考
---
[Angular 親コンポーネントから子コンポーネントにデータの渡し方](https://qiita.com/AsatoSa/items/fd66071fd3b6a648131c)
[Angular 公式リファレンス　Component interaction](https://angular.io/guide/component-interaction)
仙台CTF 2019 Lab4.マルウェア解析練習1 100

#問題

http://ctf.sectanlab.jp/2019/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/70d65449-0a30-7038-a55d-cc162c071361.png)

#解いてみた

とりあえずBinTextで文字列を抽出してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/bc0cd10b-6fe3-ec5e-d82c-cb65b8966c04.png)

ありました。
仙台CTF 2019 Lab3.不審ダウンロード 100

#問題

http://ctf.sectanlab.jp/2019/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/44f2f327-3eaf-eaa3-b5a5-2f41dc6c117a.png)

#解いてみた

windows標準コマンドでファイルのダウンロードできたのか！
wget的なことができる？

powershellでしょうか？
powershell関連のログは以下の3つ。

```
Lab02\Windows\System32\winevt\Logs\Microsoft-Windows-PowerShell%4Admin.evtx
Lab02\Windows\System32\winevt\Logs\Microsoft-Windows-PowerShell%4Operational.evtx
Lab02\Windows\System32\winevt\Logs\Windows PowerShell.evtx
```

Microsoft-Windows-PowerShell%4Operational.evtx以外は0件でした。
Microsoft-Windows-PowerShell%4Operational.evtxの中身を見てみると2件ログがありましたが、ダウンロードっぽいのはなし。

WMIでしょうか？

```
Lab02\Windows\System32\winevt\Logs\Microsoft-Windows-WMI-Activity%4Operational.evtx
```

264件もログがあって、期待が持てます。
「http」で検索してみても0件。。。

とりあえずあてずっぽでやるんではなくて、Windows標準でどうやってファイルをダウンロードするのか調べてみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/b379e8a7-a6d4-ce48-126f-c850eb063a3b.png)


bitsadminっていうコマンドでできるっぽい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/a501bfb4-4d5a-a9bc-38da-9146589f27eb.png)

仙台CTFのページが出てきたので見てみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/4988e7f6-25fa-8bed-f208-8086bd3fda83.png)

とのこと。

```
Lab02\Windows\System32\winevt\Logs\Microsoft-Windows-Bits-Client%4Operational.evtx
```

をcsvにエクスポートしてhttpで絞り込む。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/ae2b458f-00f1-8fb7-da43-4c16877a9480.png)

これが答え。
3月14日は円周率の日

3.14159265 ...
3月14日は円周率の日というそうです。1時59分 もしくは 15時9分にお祝いするのだそうな。特に、3/14/1592 6:53.58(1592年3月14日6時53分58秒)は、円周率の上12桁に一致するため、究極の円周率の日といわれているそうです。

さて、先日、知人とお酒を飲んでいるときに、なぜか***『今から円周率を求めてみよう』***となり、その場でiPhone/Pythonista 3 (Python3)を使いながらプログラミングしてみました。酔っていても、意外とできるものです。インターネットを調べていると円周率を求める方法は様々あることがわかり、そのうち2つを試してみました。どちらの方法でも3.14付近の数値が求められます。

# 直交座標系のモンテカルロ法
まずは、縦0～1、横0～1の正方形の中にランダムでボールを落としていって、原点からの距離が1.0以内である確率を求め、それを四分円の面積と見て円周率を求める方法です。

```
# 直交座標系のモンテカルロ法
import random

N= 1000000
point = 0

for i in range(N):
	x = random.random()
	y = random.random()

	r = (x*x + y*y)
	if r < 1 :
		point = point +1
		
pi = 4.0 * point / N

print(pi)
```

# 極座標系のモンテカルロ法 ～ ビュフォンの針
x/yの直交座標系ではなく、r/θの極座標系のモンテカルロ法でも円周率を求められるようです。等間隔に直線を引いた紙の上に、その感覚と同じ長さの針を投げて、針と線が触れる確率から円周率を求められるそうです。この発想が凄い！ですが、その説明が私には難しいので、[こちらのサイト](https://analytics-notty.tech/buffon-needle-experiment/)を参考に・・・プログラムだけは書いてみました。

```
# 極座標系のモンテカルロ法 ～ ビュフォンの針
import math
import random


N= 1000000
point = 0

for i in range(N) :
	r = random.random()
	theta = random.random() * 360
	if 0 > r - math.sin(math.radians(theta)) :
		point = point + 1
		
pi = N / point
print(pi)
```

これは面白いですね。ちなみに、本稿の投稿日は2019年3月14日です。

それでは、良い円周率の日を！
Firebase Authenticationの電話番号認証で利用するreCAPTCHAは他の認証で利用できない

# 始めに
Firebaseの認証処理でreCAPTCHAを使いたいと考えたとき
Firebaseが電話番号認証のために用意しているreCAPTCHAを
他の認証で使えないか試行錯誤をしてみました。
結果、**利用する事ができず**時間がかかってしまったので共有します。
# 上記を対応するには？
**Google reCAPTCHAを利用しましょう。**

reCAPTCHAの導入方法は他の記事に詳しくかかれていますのでそちらを参照ください。
記事を書いてくれた方々に感謝いたします。
[Google reCAPTCHAでログイン認証の強化](https://qiita.com/amagasu1234/items/9760c2c410776fd02e12)
# 参考にした資料
[Firebaseリファレンス( firebase. auth )](https://firebase.google.com/docs/reference/js/firebase.auth?hl=ja)
# Dartの制御文（条件分岐）

# Dartの制御文（条件分岐）

条件分岐のif文とswitch文について。

## switch文

switch文で同一条件の処理をまとめる場合にcaseを連続して書くやり方は使えない。
`case COL_YELLOW:``case COL_NON:`の部分のように実行したいラベル（？）を指定した`continue`を書くとそこへ飛ぶことができるらしい。

```dart
const COL_RED    = 0;
const COL_BLUE   = 1;
const COL_YELLOW = 2;
const COL_NON    = 3;
const COL_NON2   = 4;
var signal = COL_RED;

for(int i = 0; i < 3; i++)
{
	switch(signal){
		case COL_RED:
			print('赤は止まれ');
			signal++;
			break;
		case COL_BLUE:
			print('青は進め');
			signal++;
			break;
		case COL_YELLOW:
			print('黄は・・・？');
			continue COL_NON;
		COL_NON2:
		case COL_NON2:
			print('何でしょうねぇ・・。');
			break;
		COL_NON:
		case COL_NON:
			print('何ですか？');
			continue COL_NON2;
        default:
            print('Default');
            break;
	}
}
```

```dart
// 実行結果
赤は止まれ
青は進め
黄は・・・？
何ですか？
何でしょうねぇ・・。
```





## if文

```dart
var lists = [ 1, 2, 3, 4, 5 ];

lists.forEach((factor) {
	if ( factor % 2 == 0 ){
		print('$factor : Odd');
	}
	else{
		print('$factor : Even');
	}
});
```

```dart
// 実行結果
1 : Even
2 : Odd
3 : Even
4 : Odd
5 : Even
```



[参考サイト]

>[Flutter入門のためのDart入門](https://qiita.com/teradonburi/items/913fb8c311b9f2bdb1dd)
【Rails】 関連モデル先の条件で検索する方法（内部結合）

# 関連モデル先の条件で検索する方法
すでにたくさんの記事が出ていますが、自分がよく使うものを忘れないようにメモしました。

# 

```ruby
User.joins(:posts).includes(:posts).where(posts: { name: 'test1' })

# or

User.eager_load(:posts).where("posts.name": 'test1')
```




# 参考
* Rails における内部結合、外部結合まとめ
    * https://qiita.com/yuyasat/items/c2ad37b5a24a58ee3d30

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
第04回　独自開発した「ニューロ型データベースモデリング Ver.1」　既存データを【コンボボックス】として使ってみる

###
はじめに
---
【 ニューロ型データベースモデリング Ver.1 】とは

「脳を構成する神経細胞（neuron）が繋がり合って情報を司る」
という仕組み（ネイチャーテクノロジー）に着目し
私が独自で研究・開発 してきた「データベースモデリング」です。
使用する静的テーブルは「２個(２種類)だけ」なのでシンプルな構造となり結果的に基本メンテナンスフリー の 汎用データベースモデリング が出来上がりました。

詳しくは【 [開発の歴史](https://kuhen.org/ndb/?page_id=77)：2016-03-04～05　総務省「異能vation」協力・協賛企業マッチングイベントに「ニューロ型データベースモデリング」が選定される 】をご覧下さい。

###
既存データを【コンボボックス】として使ってみる
---
新規ユーザを登録する時、現在データベースに登録されている（よく使う）住所を【コンボボックス】で表示させ、まだ空白の住所欄に選択した住所を転記することは良く使う機能であろう。

![19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567414/ffa9b218-65b4-e394-b2f1-86b77752e5b0.jpeg)

自分と　<font color="Red">同じ</font>　【識別名】 **住所**　を　Select文で抽出し「コンボボックス」に表示する。もちろん表示する住所情報は「住所２」を省いて「グループ化」する方が一般的かもしれない。

例えば「市町村合併」等で住所表記が変更された時は
【識別名】住所　「住所１」「住所２」に対して　update文　を使えばよい。　
　

【ご提案】
このデータベースは縦長にデータを保存しているので「データの選択」は以下の様な縦長表示にする方法が処理的にもよいと思う。
スマートフォンやタブレットがここまで普及しデータ閲覧は左右スクロールより上下スクロールを使うことが圧倒的に多いので。
![20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567414/d93ff287-5c84-01d3-4272-6bd8b175bd0f.jpeg)


###
まとめ
---

**【ソート】**や**【ユニット】**が**<font color="Red">10000以上（もちろん100万以上でも可）</font>**のデータ行は**<font color="Red">一括更新対象外</font>**とするこのテクニックは汎用性を維持しながら柔軟に個々のデータを管理することが出来るので**非常に便利な機能**だと個人的には思っている。

###
関連投稿記事
---
第03回　[独自開発した「ニューロ型データベースモデリング Ver.1」　縦連結したデータの表示順（ソート順）を【 サブグループ 】で管理する](https://qiita.com/kuhen-org/items/d380a393fc934768b0a3)

第05回　[独自開発した「ニューロ型データベースモデリング Ver.1」　全てのデータが簡単に【リンク先】を持てる](https://qiita.com/kuhen-org/items/5d81a5e8aafe94040812)
新しいRustにバージョンアップする

# Rustをインストールする

Windows Subsystem for Linux （WSL）上にインストールした Ubuntu を使うと便利である。

[rustup](https://rustup.rs/) は，システムプログラミング言語 Rust の各種ツールを管理できる。

```cmd:Rustのインストール
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208216/e1cb9a59-5434-f994-ebeb-860c453c5b72.png)

# 新しいRustにバージョンアップする
コマンド rustup を使って最新バージョンに更新することができる。

```cmd:Rustのバージョンアップ
$ rustup update
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208216/d6ace447-1d43-7444-3b0e-d81fc34a5c4e.png)

```cmd:各種ツールのバージョン確認（2020年3月14日現在）
$ cargo --version
cargo 1.42.0 (86334295e 2020-01-31)
$ rustc --version
rustc 1.42.0 (b8cedc004 2020-03-09)
$ rustdoc --version
rustdoc 1.42.0 (b8cedc004 2020-03-09)
```

# 関連リンク
- [SICPのSchemeとTAPLのOCamlを使うために](https://qiita.com/DanYuya/items/45af3d63725894a3f34e)
- [Rust Programming Language](https://www.rust-lang.org/)
[Treasure Data][Python] TD Clientを用いた、Treasure Data上にあるクエリの実行を行う

## 背景
GUIのTreasure Workflow上においては、

```yaml
+run_query:
  td_run>: sample_query
```
な感じで、Treasure Data上のquery名でクエリの実行ができます。
しかし、Python Client側には、ばっちりこのままの機能は存在しないっぽい。(あるかもしれない)

## 結論
**run_scheduleを使う**

```python
import time
import tdclient

if __name__ == '__main__':
    query_name = 'sample_query'
    with tdclient.Client(apikey='hogehoge') as td:
        # get unix time
        unix_time = int(time.time())
        run_time = unix_time + 10

        # set schedule query
        # run now!
        res = td.run_schedule(name=query_name, time=run_time, num=1)
    return 0
```

## おまけ - 実行を待ちたい / 結果がほしい
```python
import time
import tdclient

def main():
    query_name = 'sample_query'
    with tdclient.Client(apikey='hogehoge') as td:
        unix_time = int(time.time())
        run_time = unix_time + 10

        # set schedule query
        # run now!
        res = td.run_schedule(name=query_name, time=run_time, num=1)
        schedule_job = res[0]

        # get job_id from ScheduleJob object
        job_id = schedule_job._job_id

        # get Job object by job_id
        job = td.job(job_id=job_id)

        # wait until job finished
        job.wait()

        # get results one by one
        for row in job.result():
            print(repr(row))
    return 0


if __name__ == '__main__':
    main()
```

## 追記
なぜ、Treasure Data上のクエリを叩きたかったかというと、、、。
Treasure DataのGUI上でConnector設定したものを使いたかったから。
もちろん、Python上でExportの設定をすればいいのだけれど、横着したかった。

## 参考
[公式 - Python Client](https://support.treasuredata.com/hc/en-us/articles/360001264848-Python-Client)
[GitHub - Treasure Data API library for Python](https://github.com/treasure-data/td-client-python)
Kotlin で FizzBuzz


```kotlin
fun main() {
	(1..100).forEach {
		val l = buildString {
            if (it % 3 == 0) append("Fizz")
		    if (it % 5 == 0) append("Buzz")
		    if (isEmpty()) append(it)
		}
		println(l)
    }
}
```

[実行結果 👉Kotlin Playground: FizzBuzz](https://play.kotlinlang.org/#eyJ2ZXJzaW9uIjoiMS4zLVJDIiwicGxhdGZvcm0iOiJqYXZhIiwiYXJncyI6IiIsIm5vbmVNYXJrZXJzIjp0cnVlLCJ0aGVtZSI6ImlkZWEiLCJmb2xkZWRCdXR0b24iOnRydWUsInJlYWRPbmx5IjpmYWxzZSwiY29kZSI6ImZ1biBtYWluKCkge1xuXHQoMS4uMTAwKS5mb3JFYWNoIHtcblx0XHR2YWwgbCA9IGJ1aWxkU3RyaW5nIHtcbiAgICAgICAgICAgIGlmIChpdCAlIDMgPT0gMCkgYXBwZW5kKFwiRml6elwiKVxuXHRcdCAgICBpZiAoaXQgJSA1ID09IDApIGFwcGVuZChcIkJ1enpcIilcblx0XHQgICAgaWYgKGlzRW1wdHkoKSkgYXBwZW5kKGl0KVxuXHRcdH1cblx0XHRwcmludGxuKGwpXG4gICAgfVxufSJ9)
[👉Kotlinであみだくじを書く](
https://android.benigumo.com/20181230/%E3%81%82%E3%81%BF%E3%81%A0%E3%81%8F%E3%81%98%E3%82%92%E7%BD%AB%E7%B7%9A%E3%81%A7%E6%9B%B8%E3%81%8F/)
機械制御がしたい！

Windows2000 以降PCのパラレルポートが使えなくなった。

以前はそのアドレスにTurbo Pascal でport[]とすれば簡単に

外部の機械とコミュニケーションんで来たのに！！

今時のドライバーやら　DLLのアクセスも難解すぎるしコードが長すぎる。

でも、、PCに繋いだ機械が動くのが見たい。

まず始めたのがPC接続のオシロスコープ これをコードで直接データー

がやってくるようにしたい。

というわけで、意味不明のプログラマーズガイドを

みながらDLLの操作に挑戦。
Rails の日付や時間の処理を読みやすく書く方法まとめ

Rails には Time 型、Date 型、Duration 型など時間に関わらる様々な型があり、その全てに様々なエイリアスが生えています。
様々なユースケースにおいて、日付演算が読みやすくなるように配慮された結果だと思いますが、時たま難解な組み合わせに出会うことがあります。極端な例ですが、`3.days.from_now(Time.current.yesterday)` などのような感じです。正直いつの時点を指しているのかパット見でよくわかりません。

実は読みやすさだけを考えた場合、選べる選択肢はそれほど多くありません。
その読みやすくなるパターンについてまとめてみたいと思います。

## シフトさせる時間や日数が具体的にわかっている場合

Duration 型に対して対象の日付を渡す方法が最も自然に読めると思います。
具体例としては、

```ruby
3.days.from_now # 3日後
3.days.ago # 3日後
3.days.after(some_event) # some_event から3日後
3.days.before(some_event) # some_event の3日前
```

です。`since` や `until` などもありますが、これは継続を表したいパターンで明らかに上手くハマる、みたいなケースを除いて使う必要は無いかなと思います。

パターンは以下のとおりです。

| 起点\表す時点 | 過去 | 未来 |
| --- | --- | --- |
| 現在 | ago | from_now |
| 過去・未来 | before | after |

## シフト先の時間はわかっているが具体的な差がわかっていない場合
言ってしまえば、Duration オブジェクトを定義しづらい場合です。
この場合はもちろん Date や Time に対して、メソッド呼び出しを行います。

```ruby
Time.current.noon # 正午
Time.current.beginning_of_week # 週初め
```

実はこちらの場合では特に言うことがありません。

## まとめ

* Duration を使える場合は Duration へのメソッド呼び出しにする (e.g. `3.days.ago`)
* Duration に対して使うメソッドは基本 `ago`, `from_now`, `before`, `after` の4つで良い
* Duration を使えない場合のみ、Time や Date へのメソッド呼び出しを行う
Lambda式が使える汎用ValueConverterを作ったが、いまいちだった話

WPFで値をBindingする際、そのままの値を使うのではなく
定数を加算、2倍、逆数など 簡単な演算をしたい事が度々あります。
毎回それ用にプロパティを用意したり、専用ValueConverterを作るのも面倒なので
Lambda式で処理を渡せる汎用のValueConverterを作ってみました。

こちらに同じような記事があったのですが
[Converterを書くのが面倒だというはなし](https://qiita.com/wonderful_panda/items/dad578ed5b2e77eb58f0)
IronPythonか～と思い、自分でも作ることに。

結果としては上手くいかず、今回は専用のValueConverterを作ることにしたのですが、
使える場面もあるかなと思い、ここに残す事にしました。

### 上手く行かなかった事
`Microsoft.CodeAnalysis.CSharp.Scripting`を使ってるのですが
`EvaluateAsync`の初回起動が遅いためか、アプリそのものの起動時間がかかるようになってしまいました
(今回のケースでは起動時からTextBoxに初期値が入っていてConverterが走ります)。
Bindingの際に`IsAsync=True`とすると起動時間は短縮できるものの、
`FallbackValue`には固定値しか設定できないため、値が変わる度にちらついてしまいます。
Converter完了まで前回の値を表示しておく事ができれば良いのですが…

## 実装

Lambda式を`ConverterParameter`で文字列として受け取り
`Microsoft.CodeAnalysis.CSharp.Scripting`で処理しています。

```C#:Converter.cs
public class LambdaConverter : IValueConverter
{
    public Object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var func = CSharpScript.EvaluateAsync<Func<dynamic, dynamic>>($"(Func<dynamic, dynamic>)({parameter as String})",
            ScriptOptions.Default
            .WithImports("System")
            .WithReferences(typeof(Microsoft.CSharp.RuntimeBinder.Binder).Assembly)
            ).Result;
        return func(value);
    }

    public Object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
```

`ConverterParameter`で処理内容をLambda式で定義します。

```XAML:View.xaml
<TextBox x:Name="InputData" Width="100"
         Text="{Binding InputData, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged, FallbackValue=0}"/>
<TextBlock Margin="10,0"
           Text="{Binding InputData, Converter={StaticResource LambdaConverter}, ConverterParameter='e => e + 1'}"/>
 <TextBlock
           Text="{Binding InputData, Converter={StaticResource LambdaConverter}, ConverterParameter='e => 1 / e'}"/>
```

**こんな感じ**
![example.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52493/e47efd60-6b45-00cc-ff2c-cc7051ea19a8.gif)

起動さえすれば、実行中の速度は気にならないんですけどね～
Let's EncryptでCloudflare APIを用いたワイルドカード証明書の発行

Cloudflareにドメインが移管されていることを前提に進めます。

プラグインをインストールする前に、`cryptography`が最新版でなければ実行時にエラーが出るので、確認してアップグレードしてください。

```console
# sudo pip list --outdated | grep 'cryptography'
# sudo pip install cryptography --upgrade #最新版でなければアップグレード
```

`certbot`をインストールします。

```console
# cd /usr/local #インストール先のディレクトリを作成
# sudo git clone https://github.com/certbot/certbot.git
```

必要なプラグインをインストールした後、設定ファイルを作成していきます。

```console
/nginxの場合（絶対に必要なわけではない）/
# cd /usr/local/certbot/certbot-nginx
# sudo python setup.py install

/apacheの場合（絶対に必要なわけではない）/
# cd /usr/local/certbot/certbot-apache
# sudo python setup.py install

/以下共通/
# cd /usr/local/certbot/certbot-dns-cloudflare
# sudo python setup.py install

# certbot plugins #確認

# sudo apt list "python3-pip*" --installed
# sudo apt install python3-pip #なければインストール

# sudo pip3 install certbot-dns-cloudflare #TXTレコードの自動作成＆削除プラグイン

# sudo vim /etc/letsencrypt/cloudflare.ini #設定ファイルを作成

dns_cloudflare_email = <Cloudflareに登録しているメールアドレス>
dns_cloudflare_api_key = <Global API Key>

# sudo chmod 600 /etc/letsencrypt/cloudflare.ini #パーミッションを変更
```

証明書を発行します。
Congratulations!の表示が出れば成功です。

```console
# vim /etc/letsencrypt/cli.ini #コマンドを短くするための設定ファイル

dns-cloudflare-credentials = /etc/letsencrypt/cloudflare.ini
server = https://acme-v02.api.letsencrypt.org/directory

# sudo certbot certonly -d *.<ドメイン名> -m <メールアドレス> --dns-cloudflare --dns-cloudflare-propagation-seconds 30 --agree-tos

# certbot renew --agree-tos #更新
```

[こちら](https://www.cloudflare.com/a/account/audit-log)からCloudflareのログを見ると、TXTレコードが自動作成された後、削除されているのがわかります。

とても簡単にワイルドカード証明書が発行できました。
【メモ】マーケティングの仕事をはじめる

# 4月からマーケティング職に転職する

- マーケティングのバックグラウンドは一切なし
- プログラミングのプの字も知らない
- これまではグラフィックデザインの世界で、デザイナーやったり営業やったりプランナーやったり

デザインって見た目よりも情報設計が大事じゃないですか。
実際に手を動かしてデザイン作るのも好きでありつつ、お客さんと一緒に誰にどういう見せ方したいのか、今回の目的・目標は何なのか、なんて話をしているのがすごく楽しくて、そっちサイドに移ることにしました。

## 身につけたいと思っていること

1. マーケティングの基礎知識


2. マーケティングの実務的な知識


3. 技術（WEB/プログラミング）


## そのためにやること

【１，2】
読書、読書、読書。
はひたすら読書＆ぐぐってでてきた記事を読んでインプット。

アウトプットができてない。

【3】
技術書読んで自分でもコード書いている。
現職での業務改善できそうなところもあるので自分なりに組んでみている。
インプットかつアウトプット。
【Python3】アマゾンがリングフィットアドベンチャーを定価で発売したら購入するスクリプト【Selenium】【BeautifulSoup】 

#転売屋に手を焼かされていませんか？
わたしは__リングフィットを手に入れて痩せる予定だった__のに、
__手に入らなくて学習が手につかず、太りすぎて1年以上無職に陥ってしまいました。__
という事で、今回は

__スクリプトを動かすとアマゾンに自動的にログインして、__
__リングフィットがAmazon.co.jpが直接販売しているケースに限り購入してくれる__

というスクリプトを作りました。これを自宅PCのcronやAWSのLambdaで走らせれば、
あなたはリングフィットが新品で売っているかどうかを逐一チェックする必要がなくなります。
（今回はスクリプトのみの掲載で、cronの説明は省略しています。）

__cronの解説の要望があったら言って下さい。__

#注意点
__１．事前にクレジットカードの設定はしておいて下さい。（ギフト券で買う方はちょっと改修すれば済みます）__
__２．2段階認証は外しておいて下さい（リスク回避の為にサブアカウントでギフト券オンリーにするのがオススメです）__

OS：Windows10
GoogleChrome バージョン: 70.0.3538.110（Official Build） （64 ビット）
Python：3.70
Selenium Webdriver：この記事を書いた時点で最新のもの
chromedriver.exe：この記事を書いた時点で最新のもの

※スクリプトと同じフォルダに'chromedriver.exe'を置いてください。

```python:ringfit.py
from selenium import webdriver
from bs4 import BeautifulSoup
import time
import requests
import sys

driver = webdriver.Chrome()

# 欲しい商品のURL
# リングフィットアドベンチャー（本番環境時コメント外して下さい）
#driver.get('https://www.amazon.co.jp/%E4%BB%BB%E5%A4%A9%E5%A0%82-%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%95%E3%82%A3%E3%83%83%E3%83%88-%E3%82%A2%E3%83%89%E3%83%99%E3%83%B3%E3%83%81%E3%83%A3%E3%83%BC-Switch/dp/B07XV8VSZT/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%95%E3%82%A3%E3%83%83%E3%83%88&qid=1584144601&sr=8-1')

# ジョイコン（テスト用。本番環境時コメントアウトして下さい）
driver.get('https://www.amazon.co.jp/Joy-Con-L-%E3%83%8D%E3%82%AA%E3%83%B3%E3%83%91%E3%83%BC%E3%83%97%E3%83%AB-R-%E3%83%8D%E3%82%AA%E3%83%B3%E3%82%AA%E3%83%AC%E3%83%B3%E3%82%B8/dp/B07VGPSM7T/ref=sr_1_19?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81&qid=1584144652&sr=8-19')

page_source = driver.page_source
soup = BeautifulSoup(page_source, 'html.parser')

id_merchant_info = soup.find(id="shipsFromSoldBy_feature_div").find("a").string
print(id_merchant_info)

# 発送元がAmazon.co.jpなら購入 それ以外なら購入しない
if id_merchant_info == ("Amazon.co.jp"):
    print("買う")
else :
    print("買わない")
    sys.exit()

elem_login_btn = driver.find_element_by_xpath('//*[@id="buy-now-button"]')
elem_login_btn.click()

elem_mail = driver.find_element_by_xpath('//*[@id="ap_email"]')
elem_mail.send_keys('ID')
continue_btn = driver.find_element_by_xpath('//*[@id="continue"]')
continue_btn.click()

elem_password = driver.find_element_by_xpath('//*[@id="ap_password"]')
elem_password.send_keys('PASSWARD')
submit_btn = driver.find_element_by_xpath('//*[@id="signInSubmit"]')
submit_btn.click()

# 支払い方法（ギフト券の方はここでギフト券に切り替えて下さい）
submit_btn2 = driver.find_element_by_xpath('/html/body/div[5]/div/div[2]/div[3]/div/div[2]/div[1]/form/div[2]/div/div/div/span/span/input')
submit_btn2.click()

# お急ぎ便があるケース
submit_btn3 = driver.find_element_by_xpath('//*[@id="shippingOptionFormId"]/div[1]/div[2]/div/span[1]/span/input')
submit_btn3.click()

order_btn = driver.find_element_by_xpath('//*[@id="placeYourOrder"]/span/input')

# 購入確定ボタン（本番環境時コメントアウト外して下さい）
#order_btn.click()
```

今回は以上になります。何かご要望があったらご意見下さい。
iPhoneメモアプリでPDF作成

iPhoneで箇条書きしてたメモをコンビニ印刷したいという要望。

印刷アプリが「PDF」or「写真」が必要ということからPDF化を調べました。


# 環境
iPhone11
iOS13.3.1

# 操作
メモ帳
↓
ツールバーの「共有」ボタン（画面右上の四角に上矢印のアイコン）
↓
マークアップ
↓
完了
↓
ファイルを保存

後は、保存したPDFファイルをコンビニ印刷用のアプリで読み込めば印刷可能です。

# まとめ
Qiitaに書くほどでもないですが、メモ替わりに。
Python Multiprocessingを使った並列処理でリスト型のデータをプロセス間で共有する

<h2>1.はじめに</h2>
PythonでMultiprocessingを使った並列処理を実装しているときに、配列型のデータをプロセス間で共有する処理に詰まったので備忘録として残しておきます。
実装した時のpythonのバージョンは3.7.1です。

<h2>2.実装内容</h2>
実装内容は下記の2つの関数を並列処理にして引数にとるリストをプロセス間で共有する処理です。
 ①3秒ごとに引数として受け取ったリストを表示する処理
 ②2秒ごとに引数として受け取ったリストにaを追加する処理

プロセス間の状態管理にはManagerオブジェクトを使用しました。


<h2>3.間違った実装</h2>
```python
from multiprocessing import Process, Manager
import time

#3秒ごとにリストを表示する
def list_print(test_list):
    while True:
        print(str(test_list))
        time.sleep(3)

#2秒ごとにリストにaを追加する
def list_append(test_list):
    while True:
        test_list.append("a")
        time.sleep(2)

if __name__ == '__main__':
    manager = Manager()
    test_list=manager.list()
    print("関数実行前のリスト" +str(test_list))
    p1=Process(target=list_print,args=(test_list))
    p2=Process(target=list_append,args=(test_list))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

```

<h2>4.実行結果</h2>

```
Traceback (most recent call last):
Traceback (most recent call last):
  File "/Applications/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
    self.run()
  File "/Applications/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
  File "/Applications/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
    self.run()
  File "/Applications/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run
    self._target(*self._args, **self._kwargs)
TypeError: list_append() missing 1 required positional argument: 'test_list'
TypeError: list_print() missing 1 required positional argument: 'test_list'
```

どうやら引数の取り方が悪く、エラーが出てしまったようです。
もしかしてManagerオブジェクトはリスト型には対応していないのではないかと思いましたが、公式にはがっつりとリストに対応しています、と書いてありました。
そこでしばらくリファレンスを読んでいたら解決策を見つけました。

<h2>5.解決方法</h2>
実行する関数の一つ目の引数に辞書を定義してあげることで解決できました。
空の辞書dummyを定義して引数に取ってます。
コードは下記になります。


```python
from multiprocessing import Process,Manager
import time

#リストを表示する
def list_print(dummy, test_list):
    while True:
        print(str(test_list))
        time.sleep(3)

#リストにaを追加する
def list_append(dummy, test_list):
    while True:
        test_list.append("a")
        time.sleep(2)

if __name__ == '__main__':
    manager = Manager()
    #空の辞書を定義
    dummy = manager.dict()
    test_list=manager.list()
    print("関数実行前のリスト" +str(test_list))
　　 #1つ目の引数に空の辞書を追加
    p1=Process(target=list_print,args=(dummy, test_list))
    p2=Process(target=list_append,args=(dummy, test_list))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

```

<h2>6.実行結果</h2>
実行結果は下記になります。
無事に配列の表示と追加が確認できました。

```
関数実行前のリスト[]
[]
['a', 'a']
['a', 'a', 'a']
['a', 'a', 'a', 'a', 'a']
```


以上です。
Firebase Cloud Functions 「HTTP Error: 400, The request has errors」でよくあるミス

#Cloud Functionsのエラー
エラーメッセージに含まれてる情報があまりにも少ない。。。:frowning2:


```
HTTP Error: 400, The request has errors


Functions deploy had errors with the following functions:
	myFuction


To try redeploying those functions, run:
    firebase deploy --only functions: myFuction


To continue deploying other features (such as database), run:
    firebase deploy --except functions

Error: Functions did not deploy properly.
```

404エラーの原因は何よ？ってことで、結構手こずった。。**が、タイプミス並みの凡ミスでした。。**

#原因
##ダメなパターン
```typescript:index.ts
exports.myFuction = functions.firestore
  .document('users/{userId}/events')
  .onWrite((change, context) => {
    // 略
  });
```

##OKなパターン
```typescript:index.ts
exports.myFuction = functions.firestore
  .document('users/{userId}/events/{eventId}')
  .onWrite((change, context) => {
    // 略
  });
```

**documentを参照しなければいけないところでcollectionのパスを指定していたので、エラーを突きつけられたようだ。**
Pythonのループ処理中でlambdaを使ったときに間違いやすいポイント

Pythonで「並列で500個のファイルをダウンロードする」ために以下のようなコードを書きました。

```python
from time import sleep
from concurrent.futures import ThreadPoolExecutor

def func(i):
    # 実際にはファイルのダウンロード処理
    sleep(1)
    print(f"{i}\n", flush=True, end="")

with ThreadPoolExecutor(max_workers=3) as executor:
    for i in range(500):
        # 0~499番のファイルを並列でダウンロードする
        executor.submit(
            lambda: func(i)
        )
```

これを実行すると、以下のように「同じ数字で何度も処理が実行されてしまう」ような挙動になってしまいました。

```
499
499
499
499
499
499
144
145
146
1
0
2
（以下略）
```

どうやら、「実際にfuncが実行される時点で`i`の値を読み込んでおり、そのためループ最後の時点の `i` の値が多数読み込まれてしまう」ようです。

こちらは以下のように `functools.partial` を使うことで、当初期待した通りの「0~499までのすべての `i` の値で処理を実行する」ように実行されます。

```python
from time import sleep
from functools import partial
from concurrent.futures import ThreadPoolExecutor

def func(i):
    sleep(1)
    print(f"{i}\n", flush=True, end="")

with ThreadPoolExecutor(max_workers=3) as executor:
    for i in range(500):
        executor.submit(
            partial(func, i)
        )
```

出力はこのようになります。

```
0
2
1
3
5
4
6
7
8
9
10
11
12
13
14
（以下略）
```

また、[こちらのブログ](http://blog.restartr.com/2013/04/17/bind-a-variable-to-closure-in-python/)で知ったのですが、Pythonのデフォルト引数で束縛する方法もあるようです。私は `partial` を使ったほうがプログラムの意図が伝わりやすいと思うのですが、たしかに面白いですね。


```python
from time import sleep
from concurrent.futures import ThreadPoolExecutor

def func(i):
    sleep(1)
    print(f"{i}\n", flush=True, end="")

with ThreadPoolExecutor(max_workers=3) as executor:
    for i in range(500):
        executor.submit(
            lambda x=i: func(x)
        )
```

# 追記

友人から「`submit`は[実行する関数の引数を受け取れる](https://docs.python.org/ja/3/library/concurrent.futures.html#concurrent.futures.Executor.submit)けどそれじゃダメなの？」ってツッコミを貰ったのですが、全くそのとおりだと思います。実際に使うときのコードはこちらにしましょう。

```python
with ThreadPoolExecutor(max_workers=3) as executor:
    for i in range(500):
        executor.submit(func, i)
```
コロナ対策で、DeepLearning G検定の学習コンテンツが無料公開されました！

　JDLA(日本ディープラーニング協会)のページで、新型コロナウィルス感染拡大に伴い不要の外出を控える社会人や学生のために、8種類のG検定向け講座が無料で公開されています。申し込み順の限定人数での公開の講座もあるため、G検定に興味のある方はお早めに申し込んでみてはどうでしょうか？

[【期間限定】オンライン学習コンテンツ「無料公開」のご案内](https://www.jdla.org/news/2020031301/)

【G検定について】
　(ゼネラリスト向け)
　ディープラーニングの基礎知識を有し、適切な活用方針を決定して、事業活用する能力や知識を有しているかを検定する。

【E資格について】
　(エンジニア向け、認定講座の受講が必要)
　ディープラーニングの理論を理解し、適切な手法を選択して実装する能力や知識を有しているかを認定する。
二番煎じ：[Kotlin]式しか使ってはいけないKotlin

「[[C#]式しか使ってはいけないC#](https://qiita.com/yaegaki/items/8ea1906c0124d1f4a1b7)」の二番煎じである
「[[Kotlin]式しか使ってはいけないKotlin](https://qiita.com/toliner/items/f7390cce71145da9e30d)」の
二番煎じ。

誤りがあればご指摘頂ければ幸いである。

## レギュレーション

「[[C#]式しか使ってはいけないC#](https://qiita.com/yaegaki/items/8ea1906c0124d1f4a1b7)」と意図は同じだが、少し修正した。

- 式でない文を使ってはならない。[^式でない文を使わない]
    - ただし式形式の `main` 関数は許容する。[^main関数のみは許容]

[^式でない文を使わない]: 式も文である。
[^main関数のみは許容]: 関数宣言も式でない文である。


## 実装する課題

FizzBuzz。

ただし [`forEach`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/for-each.html) などの、実質的にループを行う API は使用しない。


## 解答

```Kotlin
fun main() = mutableListOf<(Int) -> Unit>().also { funcHolder ->
    funcHolder.add { i ->
        if (i <= 100) {
            when {
                i % 3 == 0 && i % 5 == 0 -> "FizzBuzz"
                i % 3 == 0 -> "Fizz"
                i % 5 == 0 -> "Buzz"
                else -> i.toString()
            }.also { str ->
                println(str)
            }

            funcHolder[0](i + 1)
        } else {
            Unit
        }
    }
}[0](1)
```

### 解説

ループを使用しないとなると、再帰を使うしかない。
再帰をするには関数が自身を参照する必要がある。
普通であれば関数宣言して、関数名を使って自己参照するが、関数宣言は式でない文なので使えない。
[「[Kotlin]式しか使ってはいけないKotlin」の「再帰編」](https://qiita.com/toliner/items/f7390cce71145da9e30d#再帰編)では `main` 関数を再帰関数としていたが、
`main` 関数宣言は式でない文であり、特別に使用を許容されているだけなので、
これは避けたい。
そこで、再帰関数のホルダー `funcHolder` を作り、再帰関数からはホルダーの参照を介して自身の参照を取得することにした。

ホルダーは、再帰関数の出し入れができればなんでもよいのだが、プラットフォームによらず使えるものが他に見つからなかったので `MutableList` にした。
Kotlin/JVM なら [`Optional`](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/Optional.html) などを使うと良さそう。

`funcHolder.add` の後ろのブロック `{` `}` （ラムダ式）が再帰関数である。

`if` は `else` があれば式だが、なければ式でない文なので注意する。
式は値を返す必要があるが、`else` がない場合には値を返さない経路ができてしまうためだ。
`when` も同様である。

`funcHolder[0]` はホルダーから再帰関数を取り出している。
`funcHolder[0](i + 1)` は `i + 1` を引数に再帰関数を呼び出している。
最後の `[0](1)` は `1` を引数に再帰関数を呼び出している。`[0]` の `this` は `mutableListOf<...<().also {...}` であるから `funcHolder` であり、したがって `[0](1)` は `funcHolder[0](1)` という意図である。


## 最後に

最終的にはきれいにまとまったが、
かなり頭を使った。

なにが式かは言語によって異なる。
例えば JavaScript では関数宣言も式なので、
簡単に書けるかもしれない。


## 参考

- [Kotlin の Grammer](https://kotlinlang.org/docs/reference/grammar.html)


## おまけ：このレギュレーションだと使えないもの

- `for`, `while`
- `else` なしの `if`、値を返さない経路がある `when`
- `return`, `break`, `continue`
- 変数宣言（`val`, `var`）
- 関数宣言（匿名関数やラムダ式は可）
- クラス・オブジェクト宣言（オブジェクト式 `object :` は可。しかしメンバ変数・関数の宣言が不可なので使いどころがない？）

ほかにもあれば教えてください。
AWS DynamoDB(NoSQL)のテーブル定義書について

アトリビュートがアイテムごとに違うので自由度が高い。
その分、テーブル定義書が書きにくいなーと思いました。

サンプルのテーブル定義書をみても、
内容が全然頭に入ってこないし(笑)

自分で考えてみました。

##記入する項目は以下
テーブル名
モード（オンデマンド or ・・・）
ポイントインタイムリカバリの有無
暗号化
アトリビュート（日本語）
アトリビュート
アトリビュートを登録するプログラム一覧
型
プライマリキーの印（パーティションキー、ソートキー）
グローバルインデックスの印（パーティションキー、ソートキー）
ローカルインデックスの印（パーティションキー、ソートキー）
登録値サンプル
備考
TTLの項目に印
インデックスの射影項目の記載

さ、これでファイル作ってみろって話ですが、一旦ここまでです。
EC2インスタンスを立ち上げた時に真っ先にやること + nginxのインストール

railsアプリをEC2を使って立てていて、その途中のメモ書きです。
インスタンス立ち上げ後に実行するコマンドを書きなぐりました。

# アップデート
とりあえずアップデート

```
$ sudo yum -y update
```

# 作業用ユーザーの作成
railsアプリ用のユーザーを作成します。

```
$ sudo useradd -m hoge_user
$ sudo passwd hoge_user
```

# パッケージのインストール
使いそうなやつを適当にインストールします。

```
$ sudo yum install -y git gcc-c++ glibc-headers openssl openssl-devel readline readline-devel zlib zlib-devel bzip2 tar make wget
```

# タイムゾーン設定

```
$ sudo vi /etc/sysconfig/clock
```

タイムゾーンを"UTC"から"Japan"に変更します。

```sh:clock
# ZONE="UTC"
ZONE="Japan"
UTC=true
```

シンボリックリンクを貼って再起動

```
$ sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime
$ sudo reboot
```

# おまけ:Nginxのインストール
ec2では`yum install nginx`と実行すると以下の出力がされます。

```
[hoge_user@ip-xxx-xxx-xxx-xxx ~]$ sudo yum install nginx

Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                          | 2.4 kB  00:00:00     
No package nginx available.
Error: Nothing to do


nginx is available in Amazon Linux Extra topics "nginx1.12" and "nginx1"

To use, run
# sudo amazon-linux-extras install :topic:

Learn more at
https://aws.amazon.com/amazon-linux-2/faqs/#Amazon_Linux_Extras
```
ec2の場合は専用のやり方があります。

```
$ sudo amazon-linux-extras install -y nginx1.12
```

```
sudo systemctl enable nginx   ## 自動起動設定
sudo systemctl start nginx    ## 起動
sudo systemctl status nginx   ## ステータス確認
sudo systemctl stop nginx     ## 停止
sudo systemctl reload nginx   ## 再ロード
```

## 参考
[Amazon EC2のタイムゾーンを日本時間に変更する方法](https://qiita.com/drapon/items/2fc5b21a9cdc31ddb152)
[EC2にyumでNginxをインストールしようとしたらできなかった話](https://qiita.com/kazehiki03/items/7712660dd0401186ac4d)
[Python]listをPandasに変換[Pandas]

XMLをParseして取得したlistをPandas DataFrameに変換を試みたのですが、XMLによって要素数が異なるとエラーが出てしまったので対処方法を記載しておきます。

#失敗例


```
# listにはXMLによって異なる数のデータが格納
Date = []
SerialNumver = []
TrendDate = []

df = pd.DataFrame({'Date': Date,
                   'SerialNumber': SerialNumber,
                   'TrendDate': TrendDate})
```
エラーコード

```
ValueError: arrays must all be same length
```
listの要素をカウントしても同じ数値が出てくるので、八方塞がりでした。

#成功例
DataFrameの記述を下記のように変更しました。

```
# listにはXMLによって異なる数のデータが格納
Date = []
SerialNumver = []
TrendDate = []

#listを1つにまとめる
listData = [Date, SerialNumber, TrendDate]

# DataFrameに変換。.Tは行と列を入れ替え
df = pd.DataFrame(listData).T

# カラム名を追加
df.columns = ['Date', 'SerialNumber', 'TrendDate']
```

何が原因だったかよく分かりませんが、これでエラーなく処理が可能になりました。
AndroidとmacOSでファイル共有する原始的な方法

macOS使っているのに、iPhoneよりもAndroidが好きというエンジニアは多いと思います。AndroidならTermuxやいろいろ使えます。

それで、AndroidとmacOSで最も一番簡単にファイル共有する方法が分かったのでメモしておきます。それは、FTPやSSHでファイルのやりとりをするんです。なーんだという感じですが、広告がいっぱいのファイル共有アプリなんか使うより確実で、SSH使えば安全です。

# Ftp Serverを使う

簡単な広告が出ますが、Android上でFTPサーバーを起動する一番簡単な方法です。

 - 
 (Android側) https://play.google.com/store/apps/details?id=com.theolivetree.ftpserver&hl=ja

Android上でこれでオンにして、macOSのFilezilla ClientなどのFTPクライアントでアクセスします。開発者であれば最初からインストールされていることでしょう。

- (macOS側) https://ja.osdn.net/projects/filezilla/

なお、同作者が[SSH Server](https://play.google.com/store/apps/details?id=com.theolivetree.sshserver&hl=ja)も公開しているのですが、手元のAndroidでは接続できませんでした。

# TermuxでSSH/SFTPを使う

少し前に、AndroidのターミナルエミュレーターTermuxについて書きました。Termuxを設定する際、MacからSSHにも接続するように設定しました。sshdをインストールして、Mac側で公開鍵を作り、Termuxに登録します。すると、上記で紹介したFilezillaを利用して、Androidにファイルが転送できます。

 - [Termuxを素早く設定](https://qiita.com/kujirahand/items/8e34e05e7296134b55cd)

改めて、手順を整理すると以下のようになります。

 - (1) ストアで[Termuxをインストール](https://play.google.com/store/apps/details?id=com.termux)
 - (2) Termuxを起動して、``termux-setup-storage``を実行
 - (3) 必要なアプリをインストール ``pkg update && pkg install git vim wget tmux``
 - (4) sshdをインストール ``pkg install sshd``
 - (5) Macでターミナルを起動して公開鍵を作る ``ssh-keygen -t rsa``
 - (6) Macのid_rsa.pubの内容をLINEやメールでAndroidに送り、``~/.ssh/authorized_keys``に追記する(なければ作る)。

以上で、設定が完了です。以下の手順で、Filezillaを使ってファイルの転送ができます。

 - (1) sshdを起動 ``sshd``
 - (2) TermuxでAndroidのIPアドレスを調べる ``ifconfig | grep 192``
 - (3) Mac側でsshdに接続してみる ``ssh hoge@192.168.xxx.xxx -p8022 ``(xxxには上記のIPアドレス)
 - (4) 正しく接続できたなら設定完了。FilezillaでAndroidに接続すると、安全にファイルの送受信が可能。
 
二回目以降は設定が要らないので、そこそこ気軽に使えます。

# その他の方法

コメント欄で教えていただいた方法ですが、Android Studioの[Device File Manager](開発者を想定されているのであれば、Android StudioのDevice File Explorerはどうでしょ？
https://developer.android.com/studio/debug/device-file-explorer?hl=ja)を使ったファイル送受信も良いですね！

他にも、開発者に向けた手軽な方法があれば、コメント欄で教えてください！

# まとめ

手軽なのは、Ftp Serverを使ってファイルを転送することですが、平文でファイルを転送しないといけないので、ちょっと心配です。そこで、Termuxでsshdを起動して、SFTPでファイル転送すれば安心して転送できます。ただし、Termuxでコマンドを打つのはそこそこ面倒なので、使い分けると良いでしょう。
AWS EC2 にローカルのキーペアを登録する

マネジメントコンソールや CLI でキーペアが作成できますが、初回のみとはいえ秘密鍵を転送するのはあまり気持ちが良くないので、ローカルで作成した SSH 鍵を登録する。

```shell
KEY_NAME=$(whoami)@$(hostname -s)
aws ec2 import-key-pair --key-name ${KEY_NAME} --public-key-material file://~/.ssh/id_rsa.pub
```
【Day7】積み上げ日記

いきなり7日目ですいません。笑
今まで記録していた学習内容をバーっと記載していこうと思います。

＜内容＞
○Progate 
- HTML&CSS 道場コース（初級）
- HTML＆CSS 学習コース（中級）
○ドットインストール
- CSS基礎

＜学んだこと＞
○中央寄せは、”margin”を”auto”にする。

○”margin” に ”auto” を指定するときは、一緒に ”width” を指定する。
※上下の”margin”には”auto”を指定することはできない。

○背景画像を指定するときは、”background-image”に”url(…)”を指定する。

○１枚の画像で背景を埋め尽くすときは、”background-size”に”cover”を指定する。

○文字の間隔は、”letter-spacing”で指定する。
   
○カーソルを乗せたときに色を変える：hover

○透明度の指定：opacity

○角を丸める：border-radius

○テキスト等の配置：text-align(center, left,right) ≒ margin: 0 auto;
HerokuでLaravel+MySQLのプロジェクトをマイグレーションする時に詰まったこと

```ruby:
$ heroku config | grep CLEARDB_DATABASE_URL
```
上記で表示されたDATABASE_URLを参考に環境変数を設定

```ruby:
$ heroku config:set DB_DATABASE=[データベース名]
$ heroku config:set DB_HOST=[ホスト名]
$ heroku config:set DB_USERNAME=[ユーザー名]
$ heroku config:set DB_PASSWORD=[パスワード]
```

マイグレーションを実行

```ruby:
$ heroku run php artisan migrate
```

下記のエラーが表示された
環境変数を確認しても間違いはなかった

```ruby:
SQLSTATE[HY000] [2002] No such file or directory 
```

調べたところ、unix_socketはlocalhost内で通信を行う際に使うみたいなので、config/database.phpファイル内のunix_socketのパスを削除。

```ruby:config/database.php
'unix_socket' => env('DB_SOCKET', 'root'),
```

```ruby:config/database.php
'unix_socket' => env('DB_SOCKET', ''),
```
無事にMysqlに接続できた
Gitコミット時のメールアドレスをブランチごとに自動で切り替える方法

## モチベーション

Githubでcommitすると、コミッターのユーザー名とメールアドレスもコミットログに残って公開されてしまう。これを隠す方法。

githubはリポジトリ作成時に利用したメールアドレス以外からは、コミットを受け付けない。よって、コミットによってメールアドレスは実質公開されてしまう。

ただし、githubからnoreplyメールアドレスというものが割り当てられているので、それを利用してコミットすれば、リポジトリ製作者のメールアドレスでなくてもコミットを受け付けてもらえる。

`git config`でuser.emailを変更してしまうと、github以外での（ローカル作業での）コミッターのメールアドレスも変わってしまう。幸い、普段の開発ブランチと、github公開向けのブランチは分かれていて、かつ、`git merge`せずに`git merge --squash`などでコミットしなおす形をとっている。よって、github向けのブランチでのコミット時だけnoreplyメールを使うようにしたい。

`.gitconfig`に`includeIf`記述を使えば、自動化を実現できる！

(注) `.gitconfig`に`include`や`includeIf`を使う内容は多くの紹介記事が存在しますので、新しい話ではないです。`includeIf`の`onbranch`とユーザー切り替えの記事はあまり見つけられなかったので敢えて投稿しました。忘備録ってことで許してください。

## 自動化しない方法（面倒だが設定は必要ない）

### コマンド指定その1

git commit時のオプションで`-c`を指定する。このとき、gitとcommitの間に書く必要がある。```
git -c user.name='foobar' -c user.email='foobar@example.com' commit -m 'message'
```

### コマンド指定その2

git commitのオプションで--authorを使う。これはcommitの後に書くようにする。```
git commit -m 'message' --author 'First M Family <author@example.com>'
```

## .gitconfig のconditionIfで自動で切り替える方法（本丸）

まず、グローバルな`.gitconfig`に`user.name`と`user.email`が記載されているとする。ここで、条件に合わせてファイルをincludeする機能を使うことで、`user.name`と`user.email`をブランチやリポジトリごとに切り替えることができる。

ここでは、ブランチごとに切り替えることにする。想定として、普段のクローズドな開発ではクラウドストレージや社内サーバーでリモートリポジトリを運用し、そこにmasterブランチやdevelopブランチも紐づいているとする。Github公開用には、`gh-master`ブランチを作って、ローカルの`gh-master`ブランチを、github上の`master`ブランチへpushする運用とする。例えば、以下のようなpush運用だ。```
$ git push github gh-master:master
```

この場合に、クローズドな`master`,`develop`ブランチでは、プライベートメールアドレスでコミットし、`gh-master`ブランチではGithubのnoreplyメールアドレスでコミットしたい。そこで、`conditionIf`の`onbranch`条件を使って、branch名が`gh-master`の場合だけは、`user.name`と`user.email`に上書きする。

最初に、`~/.gitconfig`に次のような記述を行う。

```
[user]
    name = private your name
    email = yourname@private.jp
...
...
...
[includeIf "onbranch:gh-master"]
    path = ~/.github-noreply
```

さらに、`~/.github-noreply`ファイルを作成して、次のようにnoreplyのメールアドレスを書き込む```
[user]
    name = public your name
    email = 12345678+username@users.noreply.github.com
```

セキュリティー的には、`~/.github-noreply`ファイルはgit管理しているディレクトリの外に置いておいた方がよいだろう。間違って公開しないように。ここでは`.gitconfig`と同じホームディレクトリに置いた。

実際に上手く設定できているなら次のようになる。

```
$ git checkout master
$ git config user.email
yourname@private.jp

$ git checkout gh-master
$ git config user.email
12345678+username@users.noreply.github.com
```

同様に`gh-pages`などもonbranchで設定してやると良さそう。

## 注意

gitのversionが2.13以降が必要[^1]といわれていたり、2.23以降が必要[^2]と言われていたりします。動かない時はversionを上げてみてください。実際Git for windowsの2.10では動かず、2.25にしたら動きました。

## Reference

[^1]: [git configをプロジェクトによって使い分ける](https://qiita.com/htanjo/items/51245c08327a31da73f4)

[^2]: [Using gitconfig per branch](https://stackoverflow.com/questions/49827353/using-gitconfig-per-branch)
みそらエクスペリエンスを三段にする

UNVT 入り Raspberry Pi こと [Misora](https://un-vector-tile-toolkit.github.io/misora-leaflet/misora-min.pdf)（和文では単に「みそら」と書こう。）について、安保さんに [レポート](https://medium.com/furuhashilab/2-25-unitar-unvt-meeting-%E9%9D%92%E5%B1%B1%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%91%E3%82%B9-7fd67e913cfc) いただいたりして感謝している。頂いたレポートの中で刺激になったのは、次の箇所だ。

>埼玉県川越市のデータを収録しているようで、とりあえず配布された説明書をもながら工程を進めるも、、、なかなかできない。一度やっていてなんとなくで理解したつもりでいたがやはりど素人には難しいようだ。

UNVT をみそらにして、かなり学習曲線をなだらかにしたつもりでいたが、まだまだ改善できるところがある。まず、みそらの使い方を三段に変えて行こう。当初発想していたステージの手前に２段設けるイメージだ。

1. みそらにケーブルを接続してブラウザからアクセスするだけで、ウェブ地図が動くことを確認する段階。これは、みそらデプロイメント最新の [cambridge](https://github.com/optgeo/cambridge) で実現できている。アーキテクチャとかも別途文書化しよう。
2. みそらに ssh でログインして、マニュアル通りに動かせば自分でスタイルをコンパイルしてウェブ地図を立ち上げてウェブ地図を閲覧できるという段階。これが、[kawagoe](https://githuyb.com/un-vector-tile-toolkit) が実装したものだ。
3. みそらに含まれている国連ベクトルタイルツールキットを用いて、自分のベクトルデータを変換してラズベリーパイ上でウェブ地図を運用することに使う段階。

その他、UNVT のプロジェクト最新状況がなんとなく見えるページを作ったりすることだとか、こう言った技術の細かな発信も英語で dev.to あたりに出して行こうだとか、そういったことを最近考えている。
Oracle 新元号対応

```
SQL> -- 新元号「令和」と略称「R」のEUC文字コードを調べる。
SQL> SELECT
  2      DUMP(CONVERT('令和', 'JA16EUC' , 'AL32UTF8'), 16) AS REIWA
  3    , DUMP(CONVERT('R'   , 'JA16EUC' , 'AL32UTF8'), 16) AS R
  4  FROM DUAL ;

REIWA                                            R
------------------------------------------------ ------------------------------
Typ=1 Len=4: ce,e1,cf,c2                         Typ=1 Len=1: 52
```

```
-- ${ORACLE_HOME}/nls の定義ファイル(テキストファイル) lxecal.nlt をテキストエディタで開く。なければ作る。
DEFINE calendar
    calendar_name = "Japanese Imperial"
    DEFINE calendar_era
        era_full_name = cee1cfc2       -- 令和（EUC hex)
        era_abbr_name = 52             -- R
        start_date = "MAY-01-2019 AD"  -- 元年
        end_date   = "DEC-31-9999 AD"  -- 最終日(仮)
        ENDDEFINE calendar_era
ENDDEFINE calendar
```

```
-- lxegen実行
-- コマンドプロンプトから
lxegen

NLS Calendar Utility: Release 18.0.0.0.0 - Production
Version 18.1.0.0.0

Copyright (c) 1994, 2018, Oracle.  All rights reserved.
```

```
-- Oracle Database を再起動
SQL> shutdown immediate ;
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> startup
ORACLEインスタンスが起動しました。

Total System Global Area    1610610024 bytes
Fixed Size                     9028968 bytes
Variable Size                620756992 bytes
Database Buffers             973078528 bytes
Redo Buffers                   7745536 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL>
```

```
SQL> -- 動作確認
SQL> COLUMN GREGORIAN_CALENDAR  FORMAT A18
SQL> COLUMN SHORT_ERA           FORMAT A9
SQL> COLUMN LONG_ERA            FORMAT A16
SQL> SELECT
  2      TO_CHAR(B.DATES, 'YYYY/MM/DD') AS GREGORIAN_CALENDAR
  3    , TO_CHAR(B.DATES, 'EYY/MM/DD'           , 'NLS_CALENDAR=''JAPANESE IMPERIAL''') AS SHORT_ERA
  4    , TO_CHAR(B.DATES, 'EEYY"年"MM"月"DD"日"', 'NLS_CALENDAR=''JAPANESE IMPERIAL''') AS LONG_ERA
  5  FROM(
  6      -- DATE_FROM <= 範囲 <= DATE_TO
  7      SELECT A.DATE_FROM + ROWNUM - 1 AS DATES
  8      FROM(
  9          SELECT TO_DATE('2019/04/25', 'YYYY/MM/DD') AS DATE_FROM
 10               , TO_DATE('2019/05/05', 'YYYY/MM/DD') AS DATE_TO
 11          FROM DUAL
 12          ) A
 13      CONNECT BY LEVEL <= A.DATE_TO - A.DATE_FROM + 1
 14      ) B ;

GREGORIAN_CALENDAR SHORT_ERA LONG_ERA
------------------ --------- ----------------
2019/04/25         H31/04/25 平成31年04月25日
2019/04/26         H31/04/26 平成31年04月26日
2019/04/27         H31/04/27 平成31年04月27日
2019/04/28         H31/04/28 平成31年04月28日
2019/04/29         H31/04/29 平成31年04月29日
2019/04/30         H31/04/30 平成31年04月30日
2019/05/01         R01/05/01 令和01年05月01日
2019/05/02         R01/05/02 令和01年05月02日
2019/05/03         R01/05/03 令和01年05月03日
2019/05/04         R01/05/04 令和01年05月04日
2019/05/05         R01/05/05 令和01年05月05日

11行が選択されました。
```

[Oracle Database に 新しい元号(年号)Oracle Database に 新しい元号(年号)](https://qiita.com/ora_gonsuke777/items/dc21ee3f2abf718098b9)
[Oracle Database の DUMP関数 と CONVERT関数 で 文字列のバイトコードを調べる。](https://qiita.com/ora_gonsuke777/items/c410f75f0a7a3dfd1872)
[Oracle SQL 連番や連続した日付を取得](https://qiita.com/Papageno/items/00cf44596ce2e871cc91)
論文まとめ：Integral Human Pose Regression

# はじめに
ECCV2018 より以下の論文のまとめ
[1] X. Sun, et. al. "Integral Human Pose Regression"

arXiv:
https://arxiv.org/abs/1711.08229

著者らのコード：
https://github.com/JimmySuen/integral-human-pose
Pytorch実装。

日本語のまとめ：
１）松尾研　Hiromi Nakagawa氏のslideshare
https://www.slideshare.net/DeepLearningJP2016/dlhuman-pose-estimation-eccv2018-117009678

２）DeNA 加藤直樹氏のまとめ
https://engineer.dena.jp/2019/12/cv-papers-19-3d-human-pose-estimation.html#sun2018

既に日本語まとめが存在するので、ロジック部分だけまとめ

# 概要
- 3D 姿勢推定をするモデル
- heat map に対して argmax をとると微分不可になるので、ここを「Integral Pose Regression」なる微分可能なものに変えた

# Integral Pose Regression
$k$ 番目の関節に対する heat map を ${\bf{H}}\_k$ とし、そこから得る関節 $k$ の座標を ${\bf{J}}\_k$ とする。

一般的な heat map からpeakを取得する処理は

```math
\newcommand{\argmax}{\mathop{\rm arg~max}\limits}
{\bf{J}}_k = \argmax_{\bf{p}} {\bf{H}}_k ({\bf{p}})
```
とargmax を使う。

ここを領域全体の期待値に変える。

```math
{\bf{J}}_k = \int_{{\bf{p}} \in \Omega} {\bf{p}} \cdot \tilde{\bf{H}}_k ({\bf{p}})
```

$\tilde{\bf{H}}\_k$ は正規化した heat map で、具体的にはドメイン $\Omega$ に渡って softmax をとる。

```math
\tilde{\bf{H}}_k = \frac{exp[{\bf{H}}_k ({\bf{p}})]}{\int_{{\bf{q}} \in \Omega} exp[{\bf{H}}_k ({\bf{p}})]}
```

つまり、前回の記事で取り上げた 「2D/3D Pose Estimation and Action Recognition using Multitask Deep Learning」
https://qiita.com/masataka46/items/38321c77cf4b0610bbaa
とほぼ同じ発想。

チャンチャン。
py2hy

[py2hy](https://github.com/woodrush/py2hy) はpythonのプログラムをhyに変換するツール．古いバージョンのhyで書かれていたため最新版(hy ver0.18)のhyで動かなくなっていた．これを0.18で動くようにした.

https://github.com/woodrush/py2hy/pull/4

https://github.com/niitsuma/py2hy

主な変更点は以下

- 古いhyでは lforがlist-compとリネームされているので，list-compがlforに置き換わる[マクロ](https://github.com/niitsuma/hy015removed)を  書いた．
- 変換したコードのインテンドを揃えるためにemacsをシェルから呼び出している

# install 

```bash
git clone https://github.com/niitsuma/py2hy
cd py2hy
pip3 install -e . --user
```

# usage

```bash
py2hy demo/game.py ＞ game.hy
```

demoのディレクトリにあるpythonプログラム２つは，そのまま変換したものがhy0.18で動くようにした．
ただし全部のコードがほぼ1行の改行なしで出力される．

（,.が化けるが）改行が適切に入る以下のスクリプトも用意した．

```bash
py2hy.sh demo/game.py ＞ game.hy
```
これは綺麗に改行してくれるけれど，emacsがhyのコードをelispと仮定して余計な変換をかけてくるので，変換後にいろいろ手直しが必要です
MAMPを使ってローカル環境でWordPressを動かす

MAMPを使ってローカル環境でWordPressを動かす方法について書きます。

# 前提条件
- MAMPがインストールされていて、稼働していること

# 準備
1. MAMPの`Open WebStart page`をクリックする
2. 開いたページの下部にある`phpMyAdmin`というリンクをクリックする
3. ` Databases`というタブをクリックする
4. `Create database`フォームで`wordpress`と入力し、`[Create]`ボタンをクリックする
5. [WordPress](https://ja.wordpress.org)で必要なファイルを一式ダウンロードする
6. そのファイルを一式、MAMPのドキュメントルートに配置する

# 設定
1. ブラウザで該当のページを開く
2. `[さぁ、始めましょう！]`ボタンをクリックする
3. ユーザー名とパスワードに`root`と入力する
4. `[送信]`ボタンをクリックする
5. `[インストール実行]`ボタンをクリックする
6. 必要情報のフォームが出たら、ログイン時に使う任意の値を入力する
7. `[WordPressをインストール]`ボタンをクリックする
8. 成功したら`[ログイン]`ボタンを押して、ログイン画面へ
9. 上の手順で設定したアカウント情報を入力して、ログインする

# 参考文献
この記事は以下の情報を参考にして執筆しました。

- [XAMPPを使ってWordPressローカル環境を構築する全手順](https://bazubu.com/xampp-wordpress-23795.html)
SVD(Singular Value Decomposition)について

基本的にこの記事は機械学習初心者の私自身のためにメモ感覚で書いたものです。多く雑な所が見られます、すみません。事細かくつくつもりではなく、あくまでgeneral ideaが掴めることが目標です。

# SVDとは
この動画を見るとわかりやすい（https://www.youtube.com/watch?v=P5mlg91as1c）
SVDはData Dimensionality Reduction技法のうちの一つだ。以下はDefinitionと詳細。

<img width="300" alt="Screen Shot 2020-03-13 at 10.58.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583706/a9d9f0af-53d2-07f4-b62a-14d9e6ccafcb.png">

３行列のproductがSVD。

Aはm*nの行列。文書行列で例えるとrowが文書、columnが単語で各文書に各単語が出現したかしてないかを0か1のvalueで表す。または、movie、user行列で例えるとrowがmovie、columnがuserで、そのuserがあるmovieを見たか見てないか0,1で表す。

Σはr*rの対角行列（対角線上以外は０）。前提として値はdescending order（一番大きいのが最初、二番目が次。。。）.

UとVは左or右のベクトル。rは行列Aのランクの意。

次はGraphicalに捉えてみよう。以下詳細。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583706/eb8ad382-3614-5bbd-5de2-a9ca56089b40.png" width=50%>


input Aを頂く。見ての通り,m*rの行列、対角行列、n*rのTranspose行列を掛け合わせる。つまり下の画像の意だよねってこと。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583706/68599a74-48c6-2436-d1e9-abecb974899b.png" width=50%>

次に、property.
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583706/d0ba883c-4536-24f8-b7ee-8e332a54d9b2.png" width=50%>
AをSVDに変換する際、３つの行列はinput Aに対してたった１つずつしか存在しない。

次は実例。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583706/36ef0ce5-f825-4797-e89d-dffb1326da3b.png">

A is the user * movie matrix. The value is from 0 to 5, which indicate how much you like(5) or dislike(0) each movie. A can be divided, the scifi movies, romance-movies, third one is others which can be ignored.

U is user-to-concept matrix. First column is SciFi-concept. As you can see, first 4 user shows favorableness to scifi-concept, so the values are high. So as romance-movie is.

Sigma shows strength of each concept. This means scifi-concept is important in this matrix, but third one is the least important in this matrix.

V shows movie-to-concept matrix. This shows how much each movie corresponds to each concept.



以上がSVDのgeneral idea. つまり行列Aの特徴を抽出して、各特徴のStrength（重要度？）に基づきdata matrixをapproximateしちゃおうって感じなのかな。あとPCA（主成分分析）と考え方（各featureの代表的特徴を抽出しようという点）が似ているのかな。How it works in detail? What does the rank mean？とか細かい疑問は多々あるが、目的は果たせたので次回のお楽しみ。