OmniAICreator/Qiita-1.07M huggingface dataset:
Knex.jsでMySQLのUPSERTを実行する方法

[Knex.js](http://knexjs.org/)で、MySQLのUPSERTを実行する方法を紹介します。

## UPSERTとは

**UPSERT**とは、RDBにおいてキーが重複するレコードがあればUPDATEし、なければINSERTする処理のことです。
といっても、UPDATE文やINSERT文のようにUPSERT文があるわけではないので、データベース製品によってその構文は異なります。

## MySQLにおけるUPSERT

MySQLでUPSERTを行なうには、`INSERT ... ON DUPLICATE KEY UPDATE`構文を用います。[^1]

```sql
INSERT INTO `users` (`id`, `name`, `status`)
  VALUES (1, 'Alice', 'I\'m happy')
  ON DUPLICATE KEY UPDATE `id` = 1, `name` = 'Alice', `status` = 'I\'m happy';
```

## UPSERT用関数を作成

Knex.js自体にはUPSERT用のAPIはないので、UPSERTを実行するための関数をつくります。

```ts
import Knex from 'knex'

interface Params {
  db: Knex,
  table: string,
  record: Record<string, any>
}

/**
 * Execute UPSERT (INSERT ... ON DUPLICATE KEY UPDATE) for MySQL
 * @see https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html
 */
export function upsert ({
  db,
  table,
  record
}: Params): Knex.Raw<any[]> {
  const insert = db.insert(record).into(table)
  const values = Object.entries(record)
    .map(([column, value]) => db.raw('?? = ?', [column, value]))
    .join(', ')
  return db.raw(`${insert} ON DUPLICATE KEY UPDATE ${values}`)
}
```

この関数は、次のように使用します。

```ts
await upsert({
  db: knex,
  table: 'users',
  record: {
    id: 1,
    name: 'Alice',
    status: "I'm happy"
  }
})
```

戻り値の型は`Knex.Raw<any[]>`なので、生成されたSQL文字列を取得することもできます。

```ts
const query = upsert({
  db: knex,
  table: 'users',
  record: {
    id: 1,
    name: 'Alice',
    status: "I'm happy"
  }
})
console.log(query.toString())
await query
```

上記の出力を整形（可読性のために改行を追加）すると、次のようになります。

```sql
insert into `users` (`id`, `name`, `status`)
  values (1, 'Alice', 'I\'m happy')
  ON DUPLICATE KEY UPDATE `id` = 1, `name` = 'Alice', `status` = 'I\'m happy'
```

## 参考リンク

- [MySQL :: MySQL 8.0 Reference Manual :: 13.2.6.2 INSERT ... ON DUPLICATE KEY UPDATE Statement](https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html)
- [UPSERT with Knexjs (and MySQL) - artzecode - Medium](https://medium.com/artzecode/upsert-with-knexjs-and-mysql-10419b644ffc)
- [Upsert with Knexjs and MySQL](https://gist.github.com/artze/6dc1107579247bd8bb9cc773e50d9a31)

[^1]: [MySQL :: MySQL 8.0 Reference Manual :: 13.2.6.2 INSERT ... ON DUPLICATE KEY UPDATE Statement](https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html)
WSL2での開発メモ

はまったところを書いていく
docker for Windowsは意地でも使わない
使用DistributionはopenSUSE 15.1

# WSL2内でX11アプリケーションを起動し、Windows側で描画

1. Windows側でvcXsrvを起動
1. WSL側で`export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0`
1. WSL側でX11アプリケーション起動

# WSL2はsystemdが使えない

WSL用のinitを使っているらしい

# よってdockerdの自動起動ができない

`dockerd --add-runtime oci=/usr/sbin/docker-runc`
で手動で起動する

# Windows側からWSLのファイルシステムにアクセスする

explorerのナビゲーションバー（？）に
`\\wsl$`
と入力してEnter

# docker-composeでmappingしたportにwindowsから127.0.0.1経由でアクセスできない

localhostだとつながるのに、127.0.0.1だとつながらない

``` before.yaml
ports:
  - 80:80
```

``` after.yaml
ports:
  - 127.0.0.1:80:80
```

# （追記）VirtualBoxに戻る

色々躓いたり妥協しないといけない点が多かったのでVirtualBoxのほうが良いという結論になった
【アロー関数】　javascript　() => {} 　意味　一言で、 入門　

##【ゴール】
アロー関数理解

##【コード】
■JSを学んでいくと出てきた**「　()　=>　{}　」**

```js:hoge.js
const name = () => {
  console.log('名前は太郎です');
}
```

■関数の省略
■下記と同じ意味(fucntionが有る、無い)
■function無しが推奨みたいです。

```js:hoge.js
const name = () => {
  console.log('名前は太郎です');
}

const hoge = function(){
  console.log('名前は太郎です');
}

```

##【まとめ】
###■「() => {}」はアロー関数という
###■推奨されている記述


##【合わせて読みたい】

■ 【javascript】　テンプレートリテラル とは　一言で。
https://qiita.com/tanaka-yu3/items/9b07bd9fc4126291be28

■ 【Javascript】JS　変数　定数　違い 　一言でまとめました
https://qiita.com/tanaka-yu3/items/51b8b0630a1e4e2d52c8

■ 【Javascript】 メソッド　まとめ　基礎基本コード　メモ
https://qiita.com/tanaka-yu3/items/2438798d159fa402b1d5
AthenaにてShow partitionsが失敗する

#現象

AWS Athenaにて特定テーブルのパーティションが多い場合、Show Partitionsにて、
パーティションの一覧を取得しようとすると、`internal error`で失敗することがあります。

`SHOW PARTITIONS {database}.{table_name}`

```
Your query has the following error(s):

[ErrorCode: INTERNAL_ERROR_QUERY_ENGINE] Amazon Athena an experienced an internal error while executing this query. Please contact AWS support for further assistance. You will not be charged for this query. We apologize for the inconvenience.
This query ran against the "xxx" database, unless qualified by the query. Please post the error message on our forum or contact customer support with Query Id: xxxxxxxx-50d3-4699-ae41-XXXXXXXXXXXX.
```

テーブルのパーティションの数が多い場合に発生することがあるようです。
このテーブルに対して、`MSCK REPAIR TABLE`を実行しても同じくエラーとなります。

AWSサポートに問い合わせたところ、AWS側の不具合との回答でした。(2020/07/02時点)

# 回避策

回避策としては、GlueのDataCatalogと統合されている場合には、
Glue側でパーティションの一覧を取得することができます。

  - GetPartitions
  https://docs.aws.amazon.com/glue/latest/webapi/API_GetPartitions.html 

  - GetPartition
  https://docs.aws.amazon.com/glue/latest/webapi/API_GetPartition.html 

  - BatchGetPartition
  https://docs.aws.amazon.com/glue/latest/webapi/API_BatchGetPartition.html 

Glueと統合されているケースは、基本Glue側のAPIを使用して、パーティションの更新等を実施するのが良さそうですね。
DSPラジオ

自粛明けのHardOffで110円で中国製のラジオを購入しました。FM/AMが受信できます。単四x2で非常にコンパクトでデジタルラジオでした。

エネループの単四を入れて試したところFM/AMとも感度よく受信できます。

結構いいな思った矢先、OFFにしていても、すぐに電池が切れることが判明しました。

仕方が無いのでバラして確認してみました。

基板は綺麗でおかしなところはなさそうです。

![IMGP0001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/45e05355-0fac-44d0-986b-642a6ccd8279.jpeg)

電流を測ってみました。

|状態|電流|
|:--|:--|
|ON|40-50mA|
|OFF|5mA|

OFFでも5mAも流れてしまっているので750mAhのエネループは一週間持ちません。^ ^;

使うときだけ電池をいれると、毎回選局しなくてはなりません。

液晶を外してもほとんど変わりません。電池駆動の機器の待機電流はuAが普通です。

使われているチップはAKC6951と表示の無い48ピンのICです。 48ピンのICは制御用のマイコンと思われます。

AKC6951を手がかりにネットをいろいろ検索してみたところいろいろロシア語のページがいくつか見つかりました。ロシア語は読めないので、画像だけを手かがりにします。

下記の二つの写真の製品はチップセットが同じことや、 48ピンのチップを丸く囲ったプリントが共通しているので、おそらく同じところで作られていると思われます。

![unnamed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/a6700026-8a86-9421-2bcf-94812668c1e3.jpeg)

![652055_800.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/ef7b0c90-07b4-ac27-d4c2-1f4af56017ea.jpeg)

両方ともUSBからも電源を取れるようになっています。同じように外部電源を使うようにしたほうがよさそうです。下の写真ではUSBのD+,D-がどこかにつながっているようなのですが謎です。

AKC6951はaitendoでも取り扱いがあり、ページを見たところ韓国のABOVという会社の8051系マイコンとの組み合わせの例がありました。ABOVにはMC96P6408Lという48LQFPのOTPなチップがあり、水晶の接続が12,13pinであることから48Pinはこのチップと思われます。

通常のマイコンのスリープ時には数uAまで落ちますが、ハードかソフトのバグで、正しくスリープ出来ていないように思われます。昔の普通のポータブルラジオはボリュームに電源スイッチが付いていて、OFF時には0mAです。

使用頻度が高ければ、ACアダプタを使うようにするのが良いと思います。使用頻度が低ければ、毎回選局が必要になりますが、電池の接続を切れるようにするのが良いと思います。

2023/5追記 単三電池二本のスイッチ付電池ボックスから電源を取ることにしました。

2024/9追記 結局スイッチを付けました。毎回選局しなければなりませんが、きくときだけONにすればトータル15時間くらいはきけると思います。

![写真（2024-09-28 16.55）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/cdfaff18-6852-f55a-d82b-a631384b663c.jpeg)
Nuxt.jsでポートフォリオサイトを作ろう #3: トップ画面の作成

![nuxt.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/21bc2cf8-bd38-e5b6-666e-7a884fc73be7.jpeg)

[前回](https://qiita.com/takahashitakuya031126/items/458be83bcdb1cac01e43)の続きです。

####画像の保存

staticディレクトリ内にimageディレクトリを作成し、使用する画像を保存します。本記事では「top.jpg」という名前で保存します。

####ファーストビューの表示

index.vueの内容を書き換えます。

```JavaScript:pages/index.vue
<template>
    <div>
        <Top />
    </div>
</template>

<script>
import Top from '~/components/Top.vue'

export default {
  components: {
    Top,
  }
}
</script>
```

index.vueでは、Topコンポーネントを呼び出すための処理を記述しています。

今の状態ではTopコンポーネントがないため、ブラウザにはエラーが表示されます。

次にcomponentsディレクトリにTop.vueを作成します。

```JavaScript:components/Top.vue
<template>
    <div id="top">
        <v-container
        fluid>
            <v-card
            width="100vw"
            >
            <v-img
            class="white--text align-center text-center font-italic"
            :class="{'headline': $vuetify.breakpoint. smAndDown, 'display-1': $vuetify.breakpoint. mdAndUp}"
            src="/image/top.jpg"
            >
            <p>Sample Portfolio</p>
            </v-img>
            </v-card>
        </v-container>
    </div>
</template>
```

ブラウザが自動更新されるので、確認してみると、

![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665011/9c4bd4f7-96ad-7c9d-2252-5923fd62633c.png)

上のような画面が表示されるのがわかります。

Vuetifyではクラスに指定の文字列を記述することで、さまざまなデザインを実現することができます。

詳細は[公式サイト](https://vuetifyjs.com/ja/introduction/why-vuetify/)で確認できますので、ご自身で色々カスタマイズしてみてください。

次回はプロフィール画面を作成します。

[Nuxt.jsでポートフォリオサイトを作ろう #4: プロフィール画面の作成](https://qiita.com/takahashitakuya031126/items/e1ff19571dcc6b3adfb6)
投票率から最低必要な投票数の算出

各種SNSで投票を募るアカウントを見る日は多いです。

％表記で投票比率を見たときに、
その比率は最低何人いてその％なのか
が気になった次第

そこで、投票率から最低限必要な票数を算出するプログラムを書きました。

- 二択の投票の片方の得票率を整数値で入力
- 得票率の最大公約数からそれぞれの最低票数を算出

という流れ。

学習過程の成果、記録として上げました。


```python:ration_voters.py
# -*- coding: utf-8 -*-


import math
a = int(input("1~100の整数 "))
b = int(100 - a)

a_s, b_s = str(a), str(b)

print("投票比率  " + a_s + ' : ' + b_s)


a_div = []
b_div = []


def divisor(side):
    # 約数を算出、リストに挿入
    n = int(side)
    div = []
    for i in range(2, n+1):
        num = float(n)
        ni = num / i
        f = math.modf(ni)
        if f[0] == 0:
            div.insert(0, i)
    return div


a_div = divisor(a)
b_div = divisor(b)
a_set = set(a_div)
b_set = set(b_div)
t = a_set & b_set

# 約数から最低限必要な投票人数を算出、出力
if t == set():
    print("最低、100人による投票です。")
else:
    max_divisor = max(t)
    a_max_div, b_max_div = a / max_divisor, b / max_divisor
    saitei = str(a_max_div + b_max_div)
    print("最低、" + saitei + "人による投票です。")
    str_a_max_div, str_b_max_div = str(a_max_div), str(b_max_div)
    print("投票比率  " + str_a_max_div + ' : ' + str_b_max_div)

```

##学習内容
pythonの基本文法から、諸々調べつつ書きました。
約数の算出部分は自力で考えましたが、ライブラリがあることに書き終わってから気付きました。
これも勉強の一環ということで。

日本語コメントの挿入、math.modfの扱い、複数リストから共通部分取得から配列作成あたりは勉強になりました。

##改善点
内容として、
- 投票率をfloat型で扱えるようにする。
- 投票の選択肢を４つくらいまでは扱えるようにする。

上記は実装したいです。

命名規則、処理手順など、もっとスマートにできるようにしたいです。

初投稿で何かと未熟ですが、最後まで見ていただき、ありがとうございました。
以上、記録です。
AtCoder beginner Contest 173

##[A - Payment](https://atcoder.jp/contests/abc173/tasks/abc173_a)

```Python:Python
N = int(input())
 
for i in range(11):
    money = i * 1000
    if money - N>=0:
        print(money - N)
        break
```

##[B - Judge Status Summary](https://atcoder.jp/contests/abc173/tasks/abc173_b)

```Python:Python
N = int(input())
 
answer = {'AC':0, 'WA':0, 'TLE':0, 'RE':0}
for i in range(N):
    s = input()
    answer[s] = answer.get(s, 0) + 1
 
print('AC x ' + str(answer['AC']))
print('WA x ' + str(answer['WA']))
print('TLE x ' + str(answer['TLE']))
print('RE x ' + str(answer['RE']))
```

##[C - H and V](https://atcoder.jp/contests/abc173/tasks/abc173_c)

- maxは6の為、４重ループでも間に合う 

```C++:C++
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<utility>
#include<iomanip>
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define pai 3.1415926535897932384
 
using namespace std;
using ll =long long;
using P = pair<int,int>;
 
#define MAX_H 6
#define MAX_W 6
 
int H, W, K;
char c[MAX_H][MAX_W];
 
 
int main(int argc, const char * argv[]) {
    
    cin >> H >> W >> K;
    
    rep(i, H){
        string s;
        cin >> s;
        rep(j, W){
            c[i][j] = s.c_str()[j];
        }
    }
    
    int ans = 0;
    
    for(int bit_h=0; bit_h<(1<<H); bit_h++){
        for(int bit_w=0; bit_w<(1<<W); bit_w++){
            int count=0;
            for(int i=0; i<H; i++){
                for(int j=0; j<W; j++){
                    if(bit_h>>i&1 && bit_w>>j&1){
                        if(c[i][j] == '#'){
                            count++;
                        }
                    }
                }
            }
            if(count==K) ans++;
        }
    }
    
    cout << ans << endl;
    return 0;
}
```

##[D - Chat in a Circle](https://atcoder.jp/contests/abc173/tasks/abc173_d)

- 順列全探索を200000桁に対して行うのは不可能
- 問題文からsortを使用するのが分かる
- sum（A） - min（A）だと思ったら、WA
- 割り込み先は、隣り合う要素を比較して低い方を選択した心地よさが最も高い割り込み先を選ぶ
- 問題文が理解できずに終了しました。問題文を理解したら３分でコードがかける問題。

```C++:C++
#include<iostream>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<utility>
#include<iomanip>
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>
 
#include <time.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define pai 3.1415926535897932384
 
using namespace std;
using ll =long long;
using P = pair<int,int>;
 
#define MAX_N 200001
 
ll N;
ll A[MAX_N];
ll Ans = 0;
 
int main(int argc, const char * argv[]) {
    
    cin >> N;
    
    rep(i, N){
        cin >> A[i];
    }
    
    sort(A, A+N);
    reverse(A, A+N);
    
    Ans += A[0];
    for(int i=2; i<N; i++){
        Ans += A[i/2];
    }
    
    cout << Ans << endl;
    
    return 0;
}
```
[React] 本番環境でのみ画面が真っ白になる場合

# 概要

開発環境だと問題なく動作するのに、本番環境だと画面が真っ白になる現象が発生。

開発環境で発生していた`Warning`を全て解決してもダメ。

解決に1時間以上かかったのに、結果として大したことない理由だったので、共有したいと思いました...。

# 現象

作成したページにアクセスすると画面が真っ白....。

たまたま、ブラウザの開発者コンソールを確認したら、javascriptのエラーが出ていた！

内容は `Minified React error #152;` ！

# 原因

react の `return` メソッドの中で、javascript のコメント記法である `// ` を使用していると、難読化の過程でソースが壊れてしまうことが判明。

```javascript:Hoge.js
// 例

return() {
  // returnの中でこのコメントの書き方をしているとエラーになる
}
```

# 対策

ここに書いてある通りで、

[Github issue Minified React error #152 - comments before JSX #8687](https://github.com/facebook/create-react-app/issues/8687)

return メソッドの引数内の、 `// ` によって生成しているコメントを削除すると解決する。

わかりやすいのは[ここ](https://github.com/facebook/create-react-app/issues/8687#issuecomment-636339522)か

# 感想

React初心者向けの本に書いてあると良さそうと感じました。

特に、元々 return 内に書いていなかったけれども、ソースの移動とかをしているうちに return メソッド内に紛れ込んでしまう、ということは普通にありそう。

この書き方 `/* コメント */` だとエラー発生しないという記載もあるので、全部こっちの書き方に移行すればいいかもしれない。
Vimでinsert mode時によく使う機能5選

とはいえ他で応用が効かないので
手癖にしちゃうのは悩ましいところ

| キー | 機能 |
|:--|:--|
| Ctrl+C  | insert modeから抜ける  |
| Ctrl+H  | backspace  |
| Ctrl+J  | 改行  |
| Ctrl+U  | 行頭からカーソル位置までを削除  |
| Ctrl+W |  単語削除 |

あ、あとCtrl+Oで一時的にnormal modeに戻れるのは重宝しています
【メモ】Pyenv + anacondaで仮想環境構築

#環境
Ubuntu18.04
# Pyenvのインストール

```shell
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
```
次に、.bashrcにパスを追加(profileの場合はそっちでもOKだが、bash関連の関係性を確認しといたほうがいい)

```shell
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc
```
.bashrcを再度読み込むことで、変更を適用

```shell
$ source ~/.bashrc
```
#Pyenvにanacondaをインストール
pyenvを使ってanacondaをインストール（バージョンは好きなものでOK）

```shell
$ pyenv install anaconda3-5.3.1
```
先程インストールしたanacondaを使いたいworkspaceに移動して、pyenvでworkspace内で使用するpythonディストリビューションをanaondaに指定

```shell
$ cd ~/<WORKSPACE_PATH>
$ pyenv local anaconda3-5.3.1
```
# anacondaで仮想環境構築
1. condaコマンドで仮想環境を構築する

```shell
$ conda create -n <ENV_NAME>
```

- `environment.yml`を使って環境構築する場合

```shell
$ conda env create -f environment.yml
```


2. 作成した仮想環境をactivate

```shell
$ conda activate <ENV_NAME>
```
- condaコマンド、あるいはpipを使いたい場合は、

```shell
$ conda install pip
```
をしてから、

```shell
$ conda install <PACKAGE_NAME>
# or
$ pip install <PACKAGE_NAME>
```
condaとpipではパッケージ名が異なることが多いので注意！
Ruby on Rails モデル作成・削除コマンド

# モデル作成
モデルの作成コマンドは
**rails g model モデル名（単数形、頭文字は大文字） カラム名1:データ型 カラム名2:データ型 …**

例：
```rails g model User name:string email:string```

コマンド実行後はマイグレーションファイルを適用
```rails db:migrate```

# モデル削除
モデルを削除するコマンドは
**rails destroy model モデル名**

例：
```rails destroy model User ```

**※ destroyを省略してdと書くことは不可**
【Rails】アクティブハッシュによる選択肢の表示まで

「送料込み」や「着払い」を選択する度に配送方法の選択肢を変えたい時の
手順についてこちらでご紹介。

# 1.アクティブハッシュの準備
今回は商品の配送方法についてだったので、以下の選択肢を準備。

```ruby
class ShippingMethod < ActiveHash::Base
  self.data = [
    {id: 1, name: '未定'}, {id: 2, name: 'ラクダ便'},
    {id: 3, name: 'こうもり便'}, {id: 4, name: 'ゆうメール'},
    {id: 5, name: 'レターパック'}, {id: 6, name: '普通郵便(定形、定形外)'},
    {id: 7, name: 'クロネコヤマト'}, {id: 8, name: 'ゆうパック'},
    {id: 9, name: 'クリックポスト'}, {id: 10, name: 'ゆうパケット'}
  ]
end
```

# 2. HTMl側に表示させる
htmlでとりあえず全ての選択肢を表示させます。

```haml
.box_form  
  .form-title
    %span.box-form-explanaion
      配送の方法
    %span.indispensable
      必須
  = f.collection_select :shipping_method_id, ShippingMethod.all, :id, :name, {prompt:"選択してください"}, {class: 'exhibit-form-field'}
```
___________________________________
以上で終了です。
ご覧いただきありがとうございました。
GISとは

GISについて調べたことをまとめます。　

## GISとは

GIS（Geographic Information System）とは、地理情報システムのとこを指します。

- どこ？（地理情報）をデジタル化して管理
- 地図の表現の変更、分析、共有が可能

## GISの活用

GISの活用事例として、下記のような処理が可能になります。

- 位置情報データの可視化（Excelデータの情報をグラフィカルに表現できる）
- 空間的な分析（地理関係で情報を整理できる）
- 地図を通した情報共有（形式・場所・時間を問わず共有できる）

## GISのデータ

GISで扱う地理情報は、有償と無償のものがあります。有償のものは使いやすく加工や調整がされており、分析などに活用しやすいといった特徴があります。

- 基盤地図情報
- 国土数値情報
- 位置参照情報

## GISの学習

GISを学習するのに適したサイトの例としては、下記のものがあります。

- [Quantum GIS User Guide](https://docs.osgeo.jp/foss4g/qgis/user_guide-1.6.0/user_guide.html)
- [GIS実習のオープン教材](http://gis-oer.csis.u-tokyo.ac.jp/)
- [自宅で学ぼう GIS/esriジャパン](https://www.esrij.com/getting-started/learn-at-home/)

## GISの資格

GISの技術者としての要件を定めた認定試験があります。

- ＧＩＳ上級技術者
初心者によるプログラミング学習ログ 361日目

#100日チャレンジの361日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
361日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>昨日の作業・やったこと⇩<br><br>●ブログ記事1記事作成<br>●プログラミング学習361日目 2h<br>・メンターの課題<br><br>布団の上で行き倒れたので、筋トレも読書もしなかったｗ<br>kindle持ったまま寝てた<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%E3%81%A4%E3%81%AA%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><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></p>&mdash; ぱぺまぺ@社畜✕投資✕ブロガー (@ppmp65) <a href="https://twitter.com/ppmp65/status/1279516188695883776?ref_src=twsrc%5Etfw">July 4, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ruby でプログラミング（途中）

アウトプットです

前回学んだことを生かしてrubyを使ってプログラミングを組んでます。

まだ途中ですが今回はMUPで学んだ店舗の利益計算を組んでみたいと思います。
本当はささっと仕上げる予定が構想をねるほど長くなりそうに。。。

とりあえず下記が途中です

```rb
def input_data(total_datas)
  puts "店名を入力してください"
    store_name = gets.chomp
  puts "平日ランチの客数"
    weekday_lunch_guest = gets.to_i
  puts "平日ディナーの客数"
    weekday_dinner_guest = gets.to_i
  puts "休日ランチの客数"
    weekend_lunch_guest = gets.to_i
  puts "休日ディナーの客数"
    weekday_dinner_guest = gets.to_i
  puts "平日ランチの客単価"
    weekday_lunch_guest_price = gets.to_i
  puts "平日ディナーの客単価"
    weekday_dinner_guest_price = gets.to_i
  puts "休日ランチの客単価"
    weekend_lunch_guest_price = gets.to_i
  puts "休日ディナーの客単価"
    weekend_dinner_guest_price = gets.to_i
  puts "平日の営業日"
    weekday_business = gets.to_i
  puts "休日の営業日"
    weekend_business = gets.to_i
  puts "ランチの原価"
    lunch_cost = gets.to_i
  puts "ディナーの原価"
    dinner_cost = gets.to_i
  puts "家賃を入力してください"
    rent = gets.to_i
  puts "光熱費を入力してください"
    utility_cost = gets.to_i
  puts "人件費を入力してください"
    saraly = gets.to_i
  puts "月間仕入れを入力してください"
    stocking = gets.to_i

  total_data = {store_name: store_name, weekday_lunch_guest: weekday_lunch_guest, weekday_dinner_guest: weekday_dinner_guest, weekend_lunch_guest: weekend_lunch_guest, weekday_dinner_guest: weekday_dinner_guest, weekday_lunch_guest_price: weekday_lunch_guest_price,  weekday_dinner_guest_price:  weekday_dinner_guest_price, weekend_lunch_guest_price: weekend_lunch_guest_price, weekend_dinner_guest_price: weekend_dinner_guest_price, weekday_business: weekday_business, weekend_business: weekend_business, lunch_cost: lunch_cost, dinner_cost: dinner_cost, rent: rent, utility_cost: utility_cost, saraly: saraly, stocking: stocking}

  total_datas << total_data
end

def show_store(total_datas)
  total_datas.each_with_index do |total_data, i|
    puts "[#{i}]: #{total_data[:store_name]}"
  end

  puts "確認したい番号を入力して下さい。"
  input = gets.to_i
  total_data = total_datas[input]

  if total_data
    show_data(total_data)
  else
    puts "該当する番号はありません。"
  end
end

def show_data(total_data)
end




def end_program
  exit
end

def exception
  puts "入力された値は無効な値です"
end

total_datas = []

while true do
  puts "番号を入力してください"
  puts "[0]店を登録する"
  puts "[1]データを参照する"
  puts "[2]アプリを終了する"
    input = gets.to_i

  if input == 0 then
    input_data
  elsif input == 1 then
    show_store(total_datas)
  elsif input == 2 then
    end_program
  else
    exception
  end
end
```

show_data(total_data)で
ハッシュ内の値の数値を順次計算して最終的には利益予測をたてるみたいなのを組みたいなと考えています。
まぁExcelの方が手っ取り早いんですが笑
☆AI_DEV_01_AI開発講座の始まり★

☆AI_DEV_01_AI開発講座の始まり★
クラウドAI開発講座に参加してみました♪

これは
高専キャリア × Microsoft　がコラボ主催するonlineの講座です！
https://online.kosen-career.tech/ai

ミッション
Azureを活用したTeams連携Botを開発せよ

を掲げており、

ちょうど、TeamsのBotを作成したいなーって思ってた時に、この講座が始まりとってもラッキーで、速攻、参加！！
先日 2020/07/04にキックオフミーティングがあり、
メンバーとの顔合わせを行いました！
（沖縄高専の@pinkrootさんがメンターを務めており、とても楽しそうですｗ）

これから、Qiitaにて、
そのミッションへの進捗報告をつけていきたいと思います(*´д｀*)b

---------------------------------------------------------
▶ スケジュール
7/4 20:00-21:00 キックオフ・セッション（完了）
7/25 15:00-18:00 中間プレゼン
8/29 15:00-18:00 最終プレゼン

---------------------------------------------------------
▶ 7/25までのミッション

- [ ] Azure for studensに登録する
	https://azure.microsoft.com/ja-jp/free/students/?WT.mc_id=azureforstudents-docs-nosuzuk


- [x] de:code2020の以下コンテンツを視聴して学習する
	https://www.microsoft.com/ja-jp/events/decode/2020session/detail.aspx?sid=Z01
	Z01:学生諸君！ Azure であそぼう！ ～Microsoft の AI を自作アプリに取り入れるまで～
	→ドラクエ風の説明で、面白かった♪
	Azureがそもそも、よく分かっていなかったから、よかった♪ 65536円なのが、なんかいいｗ 何か作りたくなった^u^b 
	
	
	https://www.microsoft.com/ja-jp/events/decode/2020session/detail.aspx?sid=A02
	A02:Azure Bot Services を使って Teams bot を開発する
	→ものすごい大量のスライドだったけど、30分に濃縮されてすごかったｗ

- [ ] Microsoft Learn for Studentsで学習する
https://docs.microsoft.com/ja-jp/learn/roles/student?WT.mc_id=BlendedCurriculum-MSLearn-nosuzuk

- [ ] ちょまどさんとおーちょさんのレッスンを消化する
https://qiita.com/chomado/items/6bda10abde0551f25723
https://qiita.com/miokawa/items/6f1a3e480580e1e29abc

---------------------------------------------------------


20200706 やったことまとめ
・Qiitaの登録/進捗報告up
・スケジュールの確認
・直近のミッションの確認達成状況の更新


ではでは、よろしくお願いいたします。

By shin-chan-chan
Node.js + Express + PhpStormでWordpressの投稿をWP REST APIを使って表示する

#PhpStormでNode.js Express Appを新規作成
File -> NewProject -> Node.js Express App

この時のオプションは以下の通りです。
Options
- View Engine: EJS
- Stylesheet Engine: Plain CSS

#terminalで WP APIをインストール

```shell
npm install wpapi --save
```

# routes/index.jsを編集

```javascript
var express = require('express');
var router = express.Router();
var WPAPI = require( 'wpapi' );
var wp = new WPAPI({ endpoint: 'https://localhost/my-local-test/wp-json/' });

/* GET home page. */
router.get('/', function(req, res, next) {

  wp.posts().then((posts) => {
    console.log(posts);
    res.render('index', { title: 'Express' });
  });
});
module.exports = router;
```


エンドポイントを登録して、

```javascript
var wp = new WPAPI({ endpoint: 'https://localhost/my-local-test/wp-json/' });
```

getリクエストの処理を書きます。

```javascript
router.get('/', function(req, res, next) {
  wp.posts().then((posts) => {
    console.log(posts);
    res.render('index', { title: 'Express' });
  });
});
```

ローカル環境では取れましたが、やりたいサイトではエラーがー出てしまってます。

```terminal
(node:25928) UnhandledPromiseRejectionWarning: TypeError: Cannot create property '_paging' on string ''
    at returnBody (C:\Users\Koji\PhpstormProjects\wordpress-api-test\node_modules\wpapi\lib\http-transport.js:244:16)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
(node:25928) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:25928) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
```

今日はここまで。
Fontawesomeのdisplay:noneが効かない

# プログラミングの勉強日記
2020年7月6日　Progate Lv.148
ポートフォリオ作成中

#display:noneが効かない原因
　`display:none`が効かない原因を調べてみた。

1. 意図しないところで`display:block`のようにdisplayプロパティが使用されている
2. Fontawesomeの読み込みが自分のCSSの読み込み前に読み込まれている
3. セレクタを間違えている

　どれも確認してみたが解決しなかった…
　`dislay:none`が効かなかったので、別の方法で要素を非表示にした。

#visibilityプロパティ
　`display:none`と同様に`visibility:hidden`も要素を非表示にすることができる。<font color=blue>visibility:hiddenを利用すると要素を非表示にできた！</font>
　ネットで調べてみたけど、理由はわからない…

#display:none と visibility:hiddenの違い
　上で述べたように見た目上では、どちらも要素を非表示にしている。なので、クリックはどちらもできない。（クリックしたい場合は`opacity:0`を使う）

visibility:hidden：要素を非表示にする。なので、子孫要素を表示することはできる。
display:none：要素ごと消す（レイアウトが変わる場合がある）。なので子孫要素の表示はできない。

<img width="1316" alt="0706.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/4e8709cd-0a3c-96c9-5585-ae4e65aa8294.png">

親要素だけ非表示にしたい場合には`visibility:hidden`を使う。

#参考文献
https://blog.keisuke11.com/webdesign/display-none-visibility-hidden/
https://www.irohabook.com/display-none
PythonでAtCoder Beginner Contest 173

# ABC173に参加しました
Qiitaで記事を書く練習がてら考えたことなど書いていきます。著者の色は緑です。

# [ABC173A - Payment](https://atcoder.jp/contests/abc173/tasks/abc173_a)

まさかの1WA。
print(1000 - (N%1000)) だけではNが1000の倍数のとき出力が1000になってしまう。
ifで場合分けするかもう一回1000の剰余を取れば解決。A問題とはいえちょっと気を抜きすぎた。
開始2分でAC。

```python
N = int(input())
if N%1000:
  print(1000 - (N % 1000))
else:
  print(0)
```

Nの上限が10000なので10000円札で払って小銭だけ見るのでもよい。

```python
N = int(input())
print((10000 - N) % 1000)
```



# [ABC173B - Judge Status Summary](https://atcoder.jp/contests/abc173/tasks/abc173_b)
辞書作ってD.items()からループを回してカウント増やしていって出力。
変数入りの文字列出力なので変数部分を{ }で指示しておいて後ろからformatで代入する。
開始5分でAC。

```python
N = int(input())
D = {"AC": 0, "WA": 0, "TLE": 0, "RE": 0}
for i in range(N):
    D[input()] += 1
for x, y in D.items():
    print("{0} x {1}".format(x, y))
```


# [ABC173C - H and V](https://atcoder.jp/contests/abc173/tasks/abc173_c)
## 考えたこと
- H, Wがそれぞれ6以下と小さいので全探索で行けそう。
- 塗りつぶす行と列のあり得る組み合わせを愚直に全部確かめ、各々のケースで全マスを確認して黒いところを数える。$O(2^{H+W} * HW)$で間に合う。
- 「塗りつぶす行と列」の組み合わせと「塗りつぶさない行と列」の組み合わせは完全に裏表の関係なので、ダイレクトに塗りつぶさないところを考えられる。

- 組み合わせの全列挙なのでbit全探索。桁数はH+Wにすれば1つの数字(case)に関してループを回すだけで状態を列挙できる。（2進法の下からH桁が行、残りW桁が列に関するフラグとして扱える）
- 各caseにおいて全マス確認して"#"ならカウントし、Kと等しいものをカウントする。


```python
def main():
    H, W, K = map(int, input().split())
    grid = [input() for _ in range(H)]
 
    n = H + W
    ans = 0
    for case in range(2**n):
        cnt = 0
        for i in range(H):
            for j in range(W):
                if (case >> i) & 1:
                    if (case >> j + H) & 1:
                        if grid[i][j] == "#":
                            cnt += 1
        if cnt == K:
            ans += 1
    print(ans)
```

itertoolsのcombinationやらproductやらに目移りしてしまって時間がかかってしまった。
開始30分でAC。
ちなみに

```python
itertools.product(range(2), repeat=H)
```

のようにすれば [0,0,...0] から [1,1,...1] までの$2^H$通りを列挙できるらしい。直積ってこう使うのね。


# [ABC173D - Chat in a Circle](https://atcoder.jp/contests/abc173/tasks/abc173_d)
## 考えたこと
- 既に輪になっている人数と同じ数に円周が分割され、各円弧が「そこに新しく人が入ったときに加算される心地よさ＝円弧の端点の小さいほう」を保持していると見ることができる。
- 先に小さい人が入ると最小値が下がってしまうので$A_i$を降順にソートして順番に輪に入れていく。
- ある円弧に新たに人が入るとそこに保持されていた値は消滅し、新たに入った値の円弧が2本増える。
- 今ある円弧の値の最大値をどんどこ貪欲で取ってきたいのでheapqが使えそう？



```python
import heapq

def main():
    N = int(input())
    A = list(map(int, input().split()))
    A = [a * (-1) for a in A] # Cに突っ込んで最大値を取りたいので先に負にしている
    A.sort()
    C = []
    heapq.heapify(C)
    ans = 0
    for i, a in enumerate(A):
        if i == 0:
            heapq.heappush(C, a)
            continue
 
        ans -= heapq.heappop(C) # 最大値を取り出して答えに加算
        heapq.heappush(C, a) # 入れた人の値を持つ領域が2個増える
        heapq.heappush(C, a)
    print(ans)
```

貪欲でいけそうと分かればheapqをいい感じに使うだけでなんとかなった。
（追記）そもそもソート済みで上から取って下につけてくだけなのでheapqである必要もなかった。大きい順に$A_1 + A_2 + A_2 + A_3 + A_3 +$...と$N-1$項ぶん足せばよい。


開始42分でAC。

Eはごちゃごちゃと書いてみたけどなんだか複雑な場合分けをしてしまいWA。
安定して5完できるくらいを目指したい。
docker-composeで、nginx、php、mysqlの環境を作成してみた

**私は初心者です。間違っていたりもっと良いやり方がありましたら教えていただけるとありがたいです**

こちらのリンクにコードを置きました

<a href="https://github.com/okumurakengo/docker-nginx-php-mysql"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/okumurakengo/docker-nginx-php-mysql.png" width="460px"></a>

参考

- [docker-composeでPHPとMySQLを連携させてみる - Qiita](https://qiita.com/fujitak/items/b56122e2ecd94022a7b6)
- https://hub.docker.com/_/php
- https://hub.docker.com/_/mysql
- [FuelPHPでのMySQL接続時にThe server requested authentication method unknown to the client [caching_sha2_password] となった場合に対処してみた - Qiita](https://qiita.com/forests-k/items/eb0c07829cbc5e309059)
- [Docker Laravel Mysql: could not find driver - Stack Overflow](https://stackoverflow.com/questions/56759646/docker-laravel-mysql-could-not-find-driver)

```docker-compose.yml
version: "3"

services:
  web:
    image: nginx
    ports:
      - "8080:80"
    volumes:
      # ホストのdefault.confを同期
      - ./default.conf:/etc/nginx/conf.d/default.conf
      # ホストの./myappフォルダを同期
      - ./myapp:/var/www/html
    depends_on:
      - php

  php:
    build: .
    volumes:
      # ホストの./myappフォルダを同期
      - ./myapp:/var/www/html

  db:
    image: mysql
    # PDOでhostを指定するときにこのコンテナ名を使う
    container_name: mysql
    # MySQL8.0でのデフォルトの認証方式が「caching_sha2_password」なので変更する
    # 設定しないと "The server requested authentication method unknown to the client" とエラーになる
    command: --default-authentication-plugin=mysql_native_password
    environment:
      # 設定必須、rootパスワード
      - MYSQL_ROOT_PASSWORD=root
      # この設定はオプション、イメージの起動時に作成されるデータベース名
      - MYSQL_DATABASE=sample
    ports:
      - 3306:3306
```

```nginx:default.conf
server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;
    root /var/www/html;

    location / {
        index  index.php index.html;
    }

    location ~ \.php$ {
       fastcgi_pass   php:9000;
       fastcgi_index  index.php;
       fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
       include        fastcgi_params;
    }
}
```

```Dockerfile:Dockerfile
FROM php:7-fpm

# 拡張モジュールをインストール
RUN docker-php-ext-install pdo pdo_mysql
```

```myapp/index.php
<?php
    try {

        echo (new PDO(
            'mysql:host=mysql;dbname=sample;charset=utf8mb4',
            'root',
            'root',
            [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            ]
        ))
        ->query('select concat(\'MySQL Version :\', version()) v')
        ->fetch()['v'];

    } catch (PDOException $e) {
        echo $e->getMessage();
    }
```

<img width="612" alt="Screen Shot 2020-07-06 at 2.20.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142910/a5531f89-c203-a37e-b6d9-9f22647e6a38.png">

以上です。m(_ _)m
具体例で見る「通常関数」と「アロー関数」で異なる「this」の扱い[Typescript]

# 「通常関数」と「アロー関数」で異なる `this` の扱い
> アロー関数には、それ自体が保有するthisはなく、関数の外のthisを関数内で参照できるだけです。レキシカルスコープのthisを参照します。つまり、アロー関数は定義したときに、thisが指すものがひとつに決まり、どうやって関数が実行されるかに左右されなくなります。
[通常関数とアロー関数の性質の違い-1 #thisの指すもの](https://qiita.com/suin/items/a44825d253d023e31e4d#%E9%80%9A%E5%B8%B8%E9%96%A2%E6%95%B0%E3%81%A8%E3%82%A2%E3%83%AD%E3%83%BC%E9%96%A2%E6%95%B0%E3%81%AE%E6%80%A7%E8%B3%AA%E3%81%AE%E9%81%95%E3%81%84)

結論としてはこちらの記事に書かれているとおりです。

## 具体的なコードとともに
この記事では、実際の実装中に僕がハマったコードを使って「通常関数」と「アロー関数」の違いを書いていきます。
言葉として読むだけではその性質を実感できない、という場合に見ていただければなと思います。


# 実装例

- `BuilderPattern`(勉強後まもない) を使ってラーメンを作る。
- `醤油ラーメン` は `ラーメン`(素うどん的な立ち位置) を継承して作られる。

## 使用例
**メンマと海苔の乗った濃いめ醤油ラーメン** のインスタンスを

```ts
new ShoyuRamenBuilder()
  .setMenma()
  .setNori()
  .changeHeavily(Heavily.heavy)
  .build()
// => ShoyuRamen
```

こういった書き方で作れるようにする。

## クラス図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252342/4c5ff04b-0a2d-baa2-106b-41506c1295fd.png)

`ShoyuRamenBuilder` で `setMenma()` 等を呼ぶと `this` が返される実装になっていると、

「通常関数」を使うと実行時の `this` である `ShoyuRamenBuilder` が返されるが、
「アロー関数」を使うと定義時の `this` にあたる `RamenBuilder` の型で返される。


## クラスの実装

### Ramen.builder.ts

```ts
import { Ramen, IRamenBuilder, Size } from '../ramen.domain';

export class RamenBuilder implements IRamenBuilder {
  menma = false;
  nori = false;
  size: Size = Size.nami;
  constructor() {}

  // アロー関数
  setMenma = (): IRamenBuilder => {
    this.menma = true;
    return this;
  };
  // 通常関数
  setNori() {
    this.nori = true;
    return this;
  }
  // 通常関数
  changeSize(size: Size) {
    this.size = size;
    return this;
  }
  build = (): Ramen => new Ramen(this);
}
```

### ShoyuRamen.builder.ts

```ts
import { ShoyuRamen, IShoyuRamenBuilder, Heavily } from '../shoyuRamen.domain';
import { RamenBuilder } from './ramen.builder';

export class ShoyuRamenBuilder extends RamenBuilder
  implements IShoyuRamenBuilder {
  heavily: Heavily = Heavily.normal;
  constructor() {
    super();
  }
  changeHeavily(heavily: Heavily): ShoyuRamenBuilder {
    this.heavily = heavily;
    return this;
  }
  build = (): ShoyuRamen => new ShoyuRamen(this);
}
```

## 挙動の違いを確認する

### 通常関数

「通常関数」を使うと実行時の `this` である `ShoyuRamenBuilder` が返される。

```ts
const shoyuRamenBuilder = new ShoyuRamenBuilder();
shoyuRamenBuilder.changeHeavily(Heavily.heavy)
// => ShoyuRamenBuilder
```

```ts
const shoyuRamenBuilder = new ShoyuRamenBuilder();
shoyuRamenBuilder.setNori().changeHeavily(Heavily.heavy)
// => ShoyuRamenBuilder
```

### アロー関数

「アロー関数」を使うと定義時の `this` にあたる `RamenBuilder` が返される。

```ts
const shoyuRamenBuilder = new ShoyuRamenBuilder();
shoyuRamenBuilder.setMenma()
// => RamenBuilder
```

```ts
const shoyuRamenBuilder = new ShoyuRamenBuilder();
shoyuRamenBuilder.changeHeavily(Heavily.heavy).setNori().setMenma()
// => RamenBuilder
```

`changeHeavily()` は `ShoyuRamenBuilder` で定義されているため、 `ShoyuRamenBuilder` が返される。

```ts
const shoyuRamenBuilder = new ShoyuRamenBuilder();
shoyuRamenBuilder.changeHeavily(Heavily.heavy)
// => RamenBuilder
```

# 参考
- [JavaScript: 通常の関数とアロー関数の違いは「書き方だけ」ではない。異なる性質が10個ほどある。](https://qiita.com/suin/items/a44825d253d023e31e4d)
Machine Learningコースを修了して

#はじめに
Courseraが提供している無料のMachine Learningというオンライン講義を受講し、4月末～7/4と約2カ月かかって修了しました。

私は、機械学習には、これまで全く触れたことはなかったですが、なんとなく興味があり、この講義のよい評判を聞いていて、いつかは受講したいと思っていました。コロナ禍で学習時間が確保しやすくなったこともあり、今回受講に踏み切った次第です。

機械学習に興味があって、このAndrew先生の講義の受講を考えている人の参考になれば幸いです。


#何が学べるのか
Andrew先生の最後の講義のサマリの資料より、抜粋＋αしました。
####1.教師あり学習
線形回帰、ロジスティック回帰、ニューラルネットワーク、SVM
全講義に渡り、cost functionというのが、トラウマのように出てきます。

####2.教師なし学習
K-meansクラスタリング、 次元削減の為の主成分分析、アノマリー検出

####3.機械学習を使ったアプリケーション
映画のレコメンドシステム(協調フィルタリング)、迷惑メールの振り分け、写真のリサイズ、スレイディングウィンドウを使った写真OCRパイプライン、並列化・MapReduceを含む大規模機械学習システム、オンライン学習

####4.モデル構築する上でのアドバイス
バイアス、バリアンス、正規化、評価指標(precision, recall, F1スコア)、評価手法(トレーニング/クロスバリデーション/テストセット、学習曲線、エラー曲線、シーリング分析)

この講義を受講することで、機械学習で扱われる代表的なモデルを網羅的に学習でき、さらに数式を使った論理的な理解と、直観的な理解が可能です。
個人的には「4.モデル構築する上でのアドバイス」のところが、Andrew先生の知見が詰まっている感じがしました。業務で機械学習を扱ったことのない人間にとって、モデル構築はスムーズに進まないのではないかくらいは、なんとなく想像できますが、そのようなモデル構築でうまくいかないケースにはどういうものがあるのかとか、その回避方法、時間をロスしない考え方を知ることができました。

#苦労したところ
####1.英語
講義は英語でしたが、ページの下の方に日本語訳が流れるので、それと、映像の講義資料を見比べながら、講義を聞いてなんとか理解できました。ただ、Andrew先生の話すペースがとにかく早いので(1.5倍速くらいしているのでは？)、理解が追い付かず、途中講義を何度もSTOPして、日本語訳と講義資料を見比べながら、理解するようにしました。日本語訳がなかった講義が3セッションくらいありましたが、それについては英語字幕だけでなんとかしのぎました。
講義の節目で、英語でサマリを用意してくれていて、それが理解に役立ちました。ただ、後半週になると、そのサマリも用意されていませんでした。(サマリは後付けで補充されているのだと思います。)

####2.学習スケジュール
講義映像についていくのが困難なので、講義映像の時間を目安に学習スケジュールを立てると、計画通りに進まないです。私の場合だと、課題含めて1週を終えるのに、7時間くらいかかったと思います。トータル11週あるので、大体80時間くらいかかったことになります。あらかじめCourseraで設定されているマイルストーン通り、2カ月半くらいで終わらすのが無理のないペースかなと思いました。余裕のあるスケジュールで臨むのが、重要です。

####3.テスト
これが地味に大変で、時間がかかりました。5問あって2問以上間違うと、不合格でやり直しです。もちろん英語です。やり直すたびに、設問と選択肢が微妙に変わります。3回連続で、不合格だと8時間経過するまで、テストを再チャレンジすることができません。英語なので、題意の把握に時間がかかるのと、ほとんどなかったですが、誤字があった時は、誤字と認識するのに時間がかかりました。
3回連続不合格の場合は、講義の理解が足りていないか、間違って理解しているかなので、その問題に関する講義を、もう一度も直すのが近道です。

####4.プログラミング課題
2週から9週までプログラミングの課題が用意されています。プログラミングを学習することが目的ではなく、機械学習のモデルを実際に動かしてみて、理解することに主眼が置かれています。
ストーリーで書かれている設問のPDFを読むのに苦労しますが(10P以上あります。もちろん英語です。)、講義を理解できていれば、プログラミング課題自体は何とかこなせるかなと思います。もちろんプログラミングの多少の素養はあることが前提です。
これは裏技なのかもしれませんが、Github上にパスした人達が、回答コードを挙げてくれているのが参考になります。もちろん丸写しはダメです。あくまで参考レベルに留めてください。

####5.講義が理解できない
たしか5週と8週あたりの講義が難しくて、理解に時間がかかり、挫折しかけました。そんな時は、他の方のまとめサイトを見て、理解するようにしました。以下のサイトが非常に参考になりました。感謝！
https://qiita.com/katsu1110/items/e4ef613559f02f183af5


#受講の条件
受講に適した人を推測してみました。

- 機械学習に興味があること(初心者でもOK)
    - 機械学習を網羅的に理解したい人、モデルの裏側の理論をある程度知っておきたい人
- 英語アレルギーがなく、英語を読んで理解できること(リスニングはできなくても何とかなります)
- プログラミングの素養があること
- 高校数学：1次関数、2次関数、指数関数(exp)、微分、総和(Σ)、行列、ベクトル、固有値・固有ベクトルを知っていること
    - 勉強した記憶があるくらいで大丈夫かなと。私の場合、講義を聞きながら、高校生の頃、そんなことを勉強したなと思い出しました。
- 2カ月半にわたり、1週当たり、5時間～8時間程度の学習時間を確保する覚悟があること**←これが一番重要**


#最後に
無料講座ですが、8600円ほど払えば、修了証をもらうことができます。当初、もらうつもりはありませんでしたが、自分にとって、苦労して学習した証ということで、Getしました！

久しぶりに、学習することって重要だなって感じました。例えばマッチングサービスって協調フィルタリングが使われているのかっていう気付きもありましたし、やりきってよかったです。何年後かに、これを見て、コロナ禍で、苦労して受講したなって思い出が蘇るのかなって思います。

この講義と同様の内容を本で勉強することは、もちろん可能でしょうが、私は本で独学でやったとしたら、きっと挫折しただろうと思います。このような素晴らしい講義をオンラインで無料受講できる、素晴らしい世の中になったと感じます。

Andrew先生ありがとうございました！この講義を受講できてよかったです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638724/978b42b2-55b4-1be1-683f-f49be7d0d983.png)
C#のToStringについて

#記事を書いたきっかけ
intやfloat、bool、Vector3の値をシリアライズしてデシリアライズできる処理を実装しようと思って行きついたのが、この**ToString()**。やってることの説明としてはintやfloatの値を文字列として外部に出力して、デシリアライズする際にその値の型で文字列から値に変換している。

#実際のコード
下記ではVector3NodeっていうクラスでVector3の値をシリアライズ、デシリアライズしている。

``` Vector3Node.cs
public class Vector3Node : PropertyNode
{
    private Vector3Field vec3Field;

    public Vector3 Value { get { return vec3Field.value; } set { vec3Field.value = value; } }
    public Vector3Node() : base()
    {
        CreateOutputPort<Vector3>(Port.Capacity.Multi, "Vector3");
        vec3Field = new Vector3Field();
        mainContainer.Add(vec3Field);
    }
    public override string SerializeProperty()
    {
        return Value.ToString();
    }
    public override void DeserializeProperty(string _propertyValue)
    {
        var elements = _propertyValue.Trim('(', ')').Split(',');

        if(elements.Length <= 3)
        {
            var vec = Vector3.zero;
            vec.x = float.Parse(elements[0]);
            vec.y = float.Parse(elements[1]);
            vec.z = float.Parse(elements[2]);
            Value = vec;
        }
    }
}
```
シリアライズ用の関数でVector3の数値を文字列で返し、デシリアライズの際に渡された文字列を3つに分解してVector3の各メンバに代入して処理させています。
BaseNodeクラスの方でデシリアライズ用の関数を抽象メソッドとして定義して、各クラスでオーバーライドしています。
こうすることで型ごとのクラスで型を意識することなく、文字列でデータの読み書きができるようになります。

後はこのVector3用のParseの処理を拡張メソッドとしてリファクタリングすれば汎用性が出そうですね。

#参考サイト
文字列から数値、数値から文字列への変換
https://dobon.net/vb/dotnet/programing/convert.html

Vector3の文字列から値へのの変換の方法
https://teratail.com/questions/109274
Linuxコマンド（順次更新）

#ssh

サーバーへ接続する。
sshは、通信を暗号化してリモートサーバーへ接続するプロトコル

#scp
サーバーとファイルのやり取りを行う。
フルパスで指定する。
※ftpは通信経路が暗号化されていないため、現在はサーバー接続ではほとんど使われていない。
（個人のブログならやってもいいけど、基本的にはビジネスであれば使わないほうがいい）


#grep

```
$ grep 検索正規表現 ファイル名
```

特定の文字が含まれている行を出力する。

パイプ（「｜」）と使うことが多く、その方が大変便利。

```
$ ps aux | grep apache
```

と打つと、

apacheが動いているのか確認することができる。
ひとつひとつのプロセスを確認できる。
（詳しくは参考記事参照）



#参考
「grep」の参考記事
https://webkaru.net/linux/commands-pipeline/
【備忘】SeleniumでJPXから時価総額順位表（PDF）をスクレイピング

## 初めに
- 本記事は私の備忘録的なものです。
- スクレイピングは自己責任でお願いします。

## コード
```python
# import libraries
import time
import requests
import urllib.request
from selenium import webdriver
​
# Open URL
url = 'https://www.jpx.co.jp/markets/statistics-equities/misc/02-02.html'
path = 'xxx\chromedriver_win32\chromedriver.exe'
driver = webdriver.Chrome(executable_path = path)
driver.get(url)
driver.implicitly_wait(5) #seconds
time.sleep(3) #seconds
​
# forループでテーブルデータから必要なPDFを取得してダウンロード
try:
    for j in range(2,12):
        try:
            for i in range(2,13):
                year_element = driver.find_element_by_xpath('//*[@id="readArea"]/div[5]/div[1]/table/tbody/tr[{}]/td[1]'.format(j))
                pdf_element = driver.find_element_by_xpath('//*[@id="readArea"]/div[5]/div/table[1]/tbody/tr[{}]/td[{}]/a'.format(j,i))
                pdf_url = pdf_element.get_attribute('href')
                print(pdf_url)
                urllib.request.urlretrieve(pdf_url, "時価額順位表_{}{}月.pdf".format(str(year_element.text),str(i-1)))
                print('ダウンロード　ファイル数'  + str(i-1))
​
                time.sleep(5)
        except Exception as ex:
            print(ex)

```

以上
無料でサーバーサイドを実装できるサービスについての長所、短所をまとめてみた

この記事では、現在サーバーサイドを実装するにあたって、簡単に無料枠でできるサービスについての長所、短所についてをまとめてみました。ほかにも無料で利用できるサービスもあると思いますが、今回は公開されているものの中で特に有名で、今後も使われ続けるであろうサービスを中心にを挙げてみました。

## Heroku
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271708/c7faf31f-f19d-eb53-7a90-e5e9f97d9e1c.png)

公式サイト：https://jp.heroku.com/

対応言語：Node.js, Ruby, Java, PHP, Python, Golang, Scala,Clojure, etc...

### 長所
   - 多くのプログラミング言語に対応している
   - Dockerfile で簡単に環境構築ができる
   - SQL やRedis といったDatabase を無料で利用することができる
   - すでに多くの記事が上がっていてわからないことがあっても簡単に調べられる
   
### 短所
   - 30分間アクセスがなければ停止して、再び起動させるのに時間がかかる
   - MySQL やRedis で使用できる容量が圧倒的に少ない(MySQL なら5M バイト程)

## Firebase Functions 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271708/723f18f5-2fd7-aec0-6b4c-4258da9bb6d7.png)

対応言語：Node.js, C++. Kotlin, Java, Object-C, Swift 
### 長所
   - Firebase で使用できる認証機能やStorage 機能と簡単に連携できる
   - Analytics といったGoogle ライブラリとの連携が簡単に行える
   - Emulator が用意されているため、ローカル環境下でも動作確認することができる。

### 短所
   - GitHub へ master ブランチに push すると自動的にデプロイするシステムが公式で用意されていない
   - API を 公開するためには、従量課金制のBlaze プランに変更しないと利用できない
   - 使用できる言語のバージョンが古い(Node.js なら 8, または10)
  
## Netlify Functions 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271708/e8b4c63e-f5a4-a040-45c6-d1fb3a75141d.png)

対応言語：Node.js, Golang, 

### 長所
   - Emulator 環境が用意されていて、ローカル環境でも試せる
   - Forms やCMSの機能が充実している

### 短所
   - 公式でDatabase 環境が用意されていないため、外部のDatabase を利用する必要がある
   - ドキュメントが英語しか対応しておらず、日本語の記事が少ない

## Verecel (Serverless Function) 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271708/02f535b0-4aeb-dbc4-5e0b-1871e8ecee3a.png)

対応言語：Node.js, Python, Golang, Ruby 

### 長所
   - GitHub だけでなく、GitLab やBitBucket よりプロジェクトを読み込んで自動で立ち上げることができる
   - Nuxt.js やNext.js でSSR で実装できるように公式のドキュメントやライブラリが用意されている


### 短所
   - Database が公式で用意されていないので、外部のDatabase と連携する必要がある
   - 無料枠でできるプランの変化が激しく、今後どこまでできるかがはっきりしていない
   - SSR で実装する際に、Firebaseといった一部のライブラリが使えなくなる問題がある
       -  https://qiita.com/retoruto_carry/items/3ab8199e510dc97b8f02


今後、無料枠でできることがどんどん変化していきますので、注意してください。

## 参考文献
- https://vercel.com/docs/v2/serverless-functions/supported-languages
- https://firebase.google.com/docs/functions?hl=ja
- https://techblog.kayac.com/netlify-vs-firebase-2018
- https://qiita.com/Sr_Bangs/items/7867853f5e71bd4ada56
データ型とは

#データ型とは
データ型とは データの性質のこと。
主に「整数型/浮動小数点型」「文字列型」「NULL型」「論理型」があります。

#整数型(integer) / 浮動小数点型(float)
整数型は整数を、浮動小数点型は小数を扱う形式です。

```index.php

<?php
    $int_a = 123;
    $int_b = +123;   // $int_aと同じ。普通は+はつけずに書く
    $int_c = -123;   // 負の数は「-」をつける
    $float = 0.123;  // 小数
?>
```
$int_a , $int_b , $int_c のデータ型は整数型、 $floatのデータ型は浮動小数点型となります。

#文字列型(string)
文字を扱う形式です。 
"(ダブルクオーテーション)又は'(シングルクオーテーション)で囲むと、文字列型として扱われます。



```index.php

<?php
    $int_a = 123; // これは「整数型」です。
    $string_a = '123'; // これは「文字列型」です。
    $string_b = '山田花子';
?>
```

#NULL型(null)
NULLは値を持たないことを表す形式です。
値はnullしかありません。

```index.php

<?php
    var_dump($undefined);
?>
```
を実行すると、「Notice: Undefined variable: undefined」が出て来ます。
これは、「undefinedという変数は定義されていない」というエラーです。 
このように何も値を代入していない変数の値などにNULLが使われます。

#論理値型(boolean)（ブーリアン型）
 論理型はtrue(真)又はfalse(偽)の2つの値を持つ形式です。
 この値は、TRUE または FALSE のどちらかになります。


```index.php
<?php
  $bool_true = true;   // 値trueを$bool_trueに代入する
  $bool_false = false; // 値falseを$bool_trueに代入する

?>
```
#あとがき
 基本的なものだけまとめました。
【MySQL】特定のテーブルでERROR 1064 (42000)

#概要

正しくSELECT文を打ったのに、特定のテーブルでERROR 1064 (42000)エラーがでてしまう現象を解決。

ふと、あれ？と思ってしまったので備忘録

#テーブル名が予約語の場合は要注意

今回groupsテーブルをSELECTしようとしたらエラーになってしまった。

```
mysql> SELECT * FROM groups;
```

#対処法
テーブル名に「`」で囲む

```
mysql> SELECT * FROM `groups`;
```

以上。
OSM日本の地物量推移(2007-2019)

定点観測ということで[いつものように](https://qiita.com/higa4/items/c1560975a7b97f8be629)都道府県別の半期集計をしようとしたところ、出典として利用させてもらっている[OpenStreetMap Analytics](http://osm-analytics.org/#/)が[どうやら動かなくなっている](https://github.com/hotosm/osm-analytics/issues/103)ようです。そこで、代替策を調べていたところ、界隈では有名なハイデルベルク大学が[ohsome](https://ohsome.org/apps/dashboard/)という、過去に遡ってOSMデータの統計が取れるという素敵なサービスを提供していたので試させてもらった結果、代替策というより、日本でのマッピングが始まった2007年頃から、タグごとなど、より詳細な分析ができることが分かりました。

定点観測はひとまず脇において、日本全体の2007年頃から2019年までの地物の推移をいくつかピックアップして分析してみた結果を紹介します。

#1 道路タグ別距離数(km)TOP11
![](https://i.imgur.com/nBcXm9D.png)
（[グラフの元データ](https://docs.google.com/spreadsheets/d/1h14asAc6bQEcsZiMdve2tGOnZR721biaM8zgXvuwkgY/edit#gid=1285971918)）
2011年頃の急速な伸びはyahooさんからのALPSデータインポートによるものであることは明らかです。いろんなことがありましたね。その後、2013年頃をピークにmotorwayやtrunkからtertiaryくらいまで、国や都道府県の管理道路に相当する距離はほぼ横ばいとなっています。国道や都道府県道は新しいもの以外はあまり描くことがなくなった肌感覚とも一致しています。

一方でunclassified,roadやresidential以下の道路はALPSデータでは古かったり、市区町村管理の道路と私道の見分けが付きづらかったりと、やや混沌とした部分が残っており少しずつ距離が増えています。residentialが2019年に少し減少したのは他のタグに変えられたということなのか、よくはわかりません。

伸びが顕著なのは5番目のtrack（農道、林道など）で、このあたりから商用地図では描かれにくい、OSMならではの地域密着型マッピングの傾向が現れているような気がします。なお、農道や林道は[国交省の道路統計](https://www.mlit.go.jp/road/ir/ir-data/tokei-nen/2019/nenpo02.html)からは外れています。

serviceも伸びています。施設内の道路や住宅街の路地で使われているのでしょう。pathやfootwayなど歩道系の伸びもOSMの特徴と言えそうです。

#2 道路距離(km) - 管理者・用途別集計
![](https://i.imgur.com/ynWZpjm.png)
（[グラフの元データ](https://docs.google.com/spreadsheets/d/1h14asAc6bQEcsZiMdve2tGOnZR721biaM8zgXvuwkgY/edit#gid=1257390754)）
国交省の[道路統計年報2019「表2 道路現況総括表」](https://www.mlit.go.jp/road/ir/ir-data/tokei-nen/2019/nenpo02.html)（2018/4/1現在）によれば、国や自治体の管理する道路の実延長は1,224,765.6km。農道、林道、私道、自転車道、歩道は含まれないので比較が難しいのですが、上の表のうち、「管理道路小計」と「私道小計」を足した数字（約1,498,672.7km）と比べれば、100%には至らずとも、かなりのところまではマッピング済であろうと推測されます。

あと、この表で興味深かったのは自転車道がグラフで数字が読み取れないくらいに少ない（短い）こと。自転車専用道だけだとこんなものなのでしょうか。自転車道は今後増えて行く方向性と思われるため、日本での自転車道のマッピングルールが明確化されると距離数も増えて行きやすいように思えます。現在は車道や歩道との兼用が多く専用道ですっきりマッピングしづらいというところもあります。

#3 建物数
![](https://i.imgur.com/HzhrWLE.png)
（[グラフの元データ](https://docs.google.com/spreadsheets/d/1h14asAc6bQEcsZiMdve2tGOnZR721biaM8zgXvuwkgY/edit#gid=917741601)）
衛星/航空写真からいちばんトレースしやすい地物であるだけに順調に急速に伸びています。全国で約1250万軒マッピング済みですが、まだ落ち着く感じにはなっていません。

#4 shopタグ数
![](https://i.imgur.com/WC9eMLN.png)
（[グラフの元データ](https://docs.google.com/spreadsheets/d/1h14asAc6bQEcsZiMdve2tGOnZR721biaM8zgXvuwkgY/edit#gid=269536665)）
ランキングには社会情勢やマッパーの興味の対象が反映されているのではないかと感じます。やはりコンビニは何はともあれマッピングしますよね。理美容院が2位というのはやや意外でしたが、言われてみれば地域ニーズに密着していて、空き店舗が増えている地域でも根強く残っている気がします。以下、まぁ、現代の身近な衣食住に関わるPOIが続いています。

コンビニの全店舗数は[こちらの記事](https://todo-ran.com/t/kiji/10328)によれば56,936軒でOSMマッピング済が約4万件なのでまずまずの網羅率です。しかしながらそれ以外はどこかの自治体の統計ではないかと思うくらいのレベルのように思えます。まだまだやることがいっぱいあって楽しみです！

#5 amenityタグ数
![](https://i.imgur.com/vyGoV2F.png)
（[グラフの元データ](https://docs.google.com/spreadsheets/d/1h14asAc6bQEcsZiMdve2tGOnZR721biaM8zgXvuwkgY/edit#gid=66023691)）
駐車場が1位なのは建物と同様にトレースしやすいということがあるのでしょうか。以下は飲食店や公共施設といったところ。公共施設は一時期の国土数値情報インポートによる影響が大きそうです。

#6 さいごに
[ohsome](https://ohsome.org/apps/dashboard/)は、ブラウザからの操作だけでかなりのところまで統計的な数字が拾えます。条件のandやorなど細かい指定まではできないのですが、[APIも公開](https://docs.ohsome.org/ohsome-api/v1/)されていて、こちらを使うとより複雑な条件指定などもできるようです。
TypescriptのUtilityTypesを使ってみよう

# UtilityTypesとは？

型を簡単に変換できる便利なラッパー!!
型の定義をより簡潔に書けるということで、プロジェクトなどで使いどころがありそうだったのでいくつかピックアップしてまとめてみる。

詳細を知りたい場合は[公式ドキュメント](https://www.typescriptlang.org/docs/handbook/utility-types.html)を参照してください。

## `Partial<T>`
Partialは型Tの全てのプロパティを`| undefined`にした新たな型を生成します

```ts
type Sample = {
  title: string;
  price: number;
}

type SamplePartial = Partial<Sample>

// SamplePartial = {
//   title?: string;
//   price?: number;
// }
```

## `Required<T>`
Requiredは型Tの全てのプロパティを必須にした新しい型を作成します

```ts
type Sample = {
  title?: string;
  price?: number;
}

type SampleRequired = Required<Sample>

// SamplePartial = {
//   title: string;
//   price: number;
// }

```

## `Readonly<T>`
Readonlyは型Tの全てのプロパティにreadonly属性を付与して新しい型を作成します(再割り当てを不可にする)

```ts
type Sample = {
  title: string;
  price: number;
}

const SampleReadonly: Readonly<Sample> = {
  title: 'SampleReadonly',
  price: 100
}

// SampleReadonly = {
//   readonly title: string;
//   readonly price: number;
// }

// Error(読み取り専用プロパティであるため代入することができない。)
SampleReadonly.price = 10 // ERROR

```

## `Pick<T, K>`
Pickは型TからKで指定したプロパティのみを抜き取って新しい型を作成します

```ts
type Sample = {
  title: string;
  price: number;
}

type SamplePick = Pick<Sample, 'title'>

// SamplePick = {
//   title: string
// }
```

## `Omit<T>`
Omitは型TからKで指定したプロパティを排除した新しい型を作成します

```ts
type Sample = {
  title: string;
  price: number;
}

type SampleOmit = Omit<Sample, 'title'>

// SampleOmit = {
//   price: number;
// }
```

## `Parameters<T>`
Parametersは関数型Tの引数をタプルとして抽出した型を返します

```ts

const sample = (n: number, s: string): void {}

type SampleParameters = Parameters<sample> 
// [number, string]
```

## `ReturnType<T>`
ReturnTypeは関数型Tの戻り値の型を返します。

```ts

const sample = ():number {
  return 10;
}

type T0 = ReturnType<() => string>; // string
type T1 = ReturnType<(s: string) => void>; // void
type T2 = ReturnType<typeof sample>; //number
```

## まとめ
- 個人的にピックアップした物のみの紹介となりましたが、もっと知りたいという人は公式ドキュメントを見ることをお勧めします！

- 大きなプロジェクトになっていくにつれて型定義も増えてきて、同じような型だけど少しプロパティの振る舞いが違うだけで新しい型を愚直に書いたりしていたりする場面は多々あるので今回の学習は自分にとってもすごく勉強になった

型定義はドキュメントの代わりになるくらい重要だと思っているので、今回紹介したような`UtilityTypes`をどんどん活用して行きたいなと思いました！