OmniAICreator/Qiita-1.07M huggingface dataset:
機械学習：「 第 3 章： ロジスティック回帰モデル」

分類問題とはある入力値からクラスに分類する問題のことを意味し、分類で扱うデータは
m次元のベクトル（m=1の時はスカラ）で、出力（クラス分類）は0か1の値となる。
ロジスティック回帰モデルとは、分類問題を解くための機械学習モデルのことを意味し、
ある入力とパラメータ線形結合をシグモイド関数※1に入力し、その出力結果は1になる確率を表現する。

※1：シグモイド関数
シグモイド関数とは以下の関数のことであり、計算結果は0~1の値をとり、パラメータが変わるとシグモイド関数の形がかわる。また微分の結果もシグモイド関数で表現できる点で非常に便利な関数である。
σ(x) = 1/(1+exp(-ax))

またロジスティック回帰モデルの推定方法を以下に示す。
モデルの出力Yが1となる確率と0となる確率を以下で表記すると、
P(Y = t|x) = pt(1-p)1-t

xiを与えたときに、Y=yiになる確率は以下のとおり。
P(Y = y1|x1) = p1y1(1-p1)1-y1
…
P(Y = yn|xn) = pnyn(1-pn)1-yn

上記の下、xiを与えたときに、Y=1になる確率は、
P(Y = 1|x1) = σ(ω0＋ω1x11+…ωmx1m)
…
P(Y = 1|xn) = pn=σ(ω0＋ω1xn1+…ωmxnm)

これらが同時発生するとした場合、確率の積で表現できるので、その結果を尤度関数と呼び
それが最大となるパラメータを推定する。
確率の積 = Π piyi(1-pi)1-yi　=　L(ω0, ω1,…ωm)←尤度関数
また尤度関数を最大化するパラメータを推定するよりも対数尤度関数を最大化するほうが計算が楽であり、最小二乗法と併せるために対数尤度関数にマイナスをかけ最小化で統一する。
E(ω0, ω1,…ωm) = -log L(ω0, ω1,…ωm)
                = -Σ{ yilogpi + (1-yi)log(1-pi)}

上記を微分して0になる値を求めるのは解析的に困難なため、反復学習により逐次的に収束点を求める方法として勾配降下法という手法が用いられる。
ωk+1 = ωk　– η∂E(ω,b)/∂ω、 b k+1 = bk + ∂E(ω,b)/∂ω
∂E(ω,b)/∂ω = -Σ(yi – pi)xi
またｎが大きくなった場合に計算容量が足りない、時間が膨大になるといった問題を解決するために確率的勾配降下法が用いられる。確率的勾配降下法ではΣを用いずランダムにパラメータを更新していく方法である。
ojichatのおじさん文章をコミットメッセージのデフォルトにする

こんにちは。ななめ210([@naname210](https://twitter.com/naname210))です。
個人開発で、物書きさん向けライブ配信サービス [TxT Live](https://txtlive.net) などを作ってます。

# 最初に
これは、最近Twitterなどで話題になっている [おじさん文章ジェネレーター](https://reverent-shirley-368990.netlify.com/) で作られた文章をGitのコミットメッセージにする方法をまとめたものです。

[おじさん文章ジェネレーター](https://reverent-shirley-368990.netlify.com/)は、[@3qgt](https://twitter.com/3qgt)さんが作成されて公開しているサービスです。

```
ヤッホー😃♥ 😘（笑）😃☀ はなチャン、元気かな❗❓🤔⁉そういえば、昨日は例のバー🍷に行ってきたよ。結構いい雰囲気だったから、オススメダヨ(^з<)(^_^)
```
```
はなちゃんのお目々、キラキラ😆(^o^)してるね(^з<)こんなに可愛く😃☀ なっちゃったらお姫様みたいで僕困っちゃウヨ(・_・;
```
のような、おじさん風のクソリプを自動生成してくれるものになります。

おじさん文章を作るプログラムは、[@grethlen](https://twitter.com/grethlen)さんが作成している[ojichat](https://github.com/greymd/ojichat)が使われています。

# なぜ作ったか

理由は、簡単！TwitterのTLでコミットメッセージをおじさん文章にしているのを見たからです！
(これを作って記事にしようと思ったときに再度探してみましたが、見つけられませんでした。。。

先駆者の方のものを見て、
日頃、個人開発をしているけど、共同開発と違いコミットメッセージを書くのがめんどくさくて画像のような「aaaa」「ddddd」などが並んでるなー。
![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428428/48103978-8ede-b6af-4f5b-b14bc91c942e.png)


そこで、意味のない文字列が並んでるよりおじさん文章が並んでる方が見ていて楽しくなるなー、できれば自動で挿入されてほしいなーと思ったので作りました！

#  環境
・git version 2.16.2
・go version go1.12.5 darwin/amd64
・ojichat v0.2.0

# 作り方
前提として、

```
$ ojichat
```

でojichatが使えるようになってるとします。
ojichatのインストール＆使い方はojichatの[GitHub](https://github.com/greymd/ojichat)をみてください。

## Git フック

Git フックを使って作っていきます。
Gitフックについては、参考文献のURLの記事を見てみてください。

まずフックスクリプトを読み込む設定をします。
今回は、個人開発のプロジェクトのみ適用していきたいので対象をローカルにします。

```
$ cd git_project
$ git config --local init.templatedir '~/.git'
```

次にフックスクリプトの作成を行います。

```
$ touch ~/.git/hooks/prepare-commit-msg
```



```:prepare-commit-msg
#!/bin/sh

if [ "$2" == "" ] ; then
  echo "`ojichat`\n`cat $1`" > $1
fi
```

最後にhookファイルのパーミッションを変更します。

```
chmod +x ~/.git/hooks/prepare-commit-msg
```

これで完成です！

# 使用すると

画像みたいにデフォルトでおじさん文章が挿入されます！
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428428/d710f600-3986-9f15-ae4c-d2257a4aafac.png)

これでGitログが華やか？に！
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428428/2e93a785-e1f5-4d5a-14fe-31255f6ece06.png)

# 問題点
エディタでVScodeを使ってるのですが、VScode内のGit機能には反映されない。
どうにかできないか調査中。

# 最後に
日頃、「aaaa」「hogehoge」などでコミットメッセージをしている方、華やかになりますよ！
個人開発に華が！おじさんだけど！

いいねやコメントをしてくださると、嬉しいです。よろしくお願いします。

# 参考文献
Git フックについて、Gitフックの設定の仕方で参考にさせていただきました。
・https://qiita.com/noraworld/items/c562de68a627ae792c6c
・https://qiita.com/mkiken/items/b7d4731a31e5559cd090
グローバルIPを確認するにはhttp://checkip.amazonaws.comが便利

クラウドサービスを利用していると
自分の開発マシンがどのグローバルIPを使用しているのかとちょくちょく調べる機会があると思います。
実はAWSはグローバルIPチェックのためのサービスを以下のURLで提供しています。

http://checkip.amazonaws.com/ 

シンプルにグローバルIPだけを返却するサービスなのですが、
これがなかなか便利なのでいつも使ってます。

```bash
$ curl http://checkip.amazonaws.com/
126.152.252.105
```
とかで実行すると思うんですが、いつもURLを忘れてしまうので
`.bashrc`にcheck-my-ipというコマンドを登録しています。

```bash:.bashrc
check-my-ip() {
    curl http://checkip.amazonaws.com/
}
```


```bash
$ check-my-ip
126.152.252.105
```

ただ、EC2とかにログインすると
こんな便利コマンド用意してないから
結局curlで調べることになって
URLわからなくてググったりするんですけどね😅
IT資格は意味ない？ 現役エンジニアが取ってみて思うこと

# 【IT資格の取得は意味があるか、実際にとってみて考えた】

1. [資格を持つ意味はあるか](#資格を持つ意味はあるか)
1. [ではとるだけ無駄なのか？](#ではとるだけ無駄なのか？)
1. [まとめ](#まとめ)

コンクリートの照り返しがまぶしかった5月末、HTML5プロフェッショナル資格を取得してきました。
先に買っておいた額縁が無駄にならなくて一安心した折に、知人からこんなことを聞かれました。

**「IT資格ってとる意味あるの？」**と 

話を聞いてみると、どうやら知人は資格に興味があるけれど、せっかく取っても無駄かもしれないので迷っているようでした。
せっかくなのでIT資格に意味はあるのか、取ってみて思うことを私なりに書いてみようと思います。

## 資格を持つ意味はあるか

資格を持つ意味ですが、**持っていること自体にさほど意味は無い**と思います。
資格は一定レベルの`知識`証明ではありますが、その人が実際に`何ができる`のかに直結していません。  
    
「ぼく、これ知ってます」より「ぼく、これできます」のほうが重宝される業界で、資格の有無はそれほど力はない思っています。

## ではとるだけ無駄なのか？

私の場合、実務に活きているので**得られた知識は無駄ではない**と思います。

最近でいうと、実務でJavascriptで別画面にパラメタを引き継ぐような処理を書くときにも、
HTML5で勉強したDOM構成や、セレクタなどの知識が活かして実装しているので、
持っているだけの`知識`から`経験`に昇華できたと思います。


**「取得した後にどう活かしたいか」**
    
それさえハッキリしていれば「無駄だった」と思うことは無いはずです。  
    
ただ実際に、資格をとっても意味が無かったという声もちらほら聞きます。
「とりあえず取ったから、なにかいいことあるだろう」というように期待すると、
「変わらなかった」と感じてしまうかもしれません。
  
## まとめ

「IT資格の所得は意味があるのか」について考えてみましたが、
結論、私の意見としては`持っていること自体にさほど意味は無い`です。

けれど、それは`資格自体に劇的な変化をもたらす力はない`という意味で、
取るまでの過程で得られた知識などは意味があるものだと思います。
  
前述した通り、大切なのは取得した後に
**「どう活かしたいか」**です。　　

今勉強している、もしくはこれからチャレンジしたいと思ってる方は、取った後のことも考えてみると、
資格が自分にとってどんな意味を持つかが分かるかもしれません。
カードをシャッフルする話

##### 🚨注意🚨

以下，Ruby入門二日目の**ド**素人がコード書いてます．

# 問題
`1`から`n`までの値がそれぞれ書かれた$n$枚のカードをシャッフルしてください．

![トランプ 出典：イラストや](https://1.bp.blogspot.com/-cXryTthTVMM/UW4WF1a0PvI/AAAAAAAAQqM/_MXz50Q2T9g/s400/card_royalstraightflush.png)

# 解答例

- `shuffle`メソッドを使います．

```ruby
cards = [*1..n]
cards.shuffle
p cards 
```

- `rand`で`sort`します．

```ruby
cards = [*1..n]
cards.sort_by!{rand}
p cards
```

- 登場する数字がユニークになるまで`rand`を振り続けます．（頭悪い）

```ruby
cards = Set.new
loop do
  cards << rand(max)
  if cards.size >= n
    p cards
    break
  end
end
```

- [fisher-yatesのシャッフルアルゴリズム](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%83%E3%82%B7%E3%83%A3%E3%83%BC%E2%80%93%E3%82%A4%E3%82%A7%E3%83%BC%E3%83%84%E3%81%AE%E3%82%B7%E3%83%A3%E3%83%83%E3%83%95%E3%83%AB)を使います．

> フィッシャー–イェーツのシャッフル (英: Fisher–Yates shuffle) は、有限集合からランダムな順列を生成するアルゴリズムである。言い換えると、有限列をランダムな別の（シャッフルされた）順序の有限列に並べ直す方法である。 
> 

![fisher-yatesのシャッフル](https://thumbs.gfycat.com/CreamyConsiderateAmazontreeboa-size_restricted.gif)

```ruby
cards = [*1..n]
len = cards.length - 1
c = 0
len.step(1, -1) do |i|
  r = rand(i)
  c += 1
  cards[i], cards[r] = cards[r], cards[i]
end
p cards
```

- 現実世界でカードを引く動作を考慮してそのままプログラムにします．

```ruby
cards = [*1..n]
shuffled = []
n.times do
  idx = rand(cards.length)
  shuffled << cards[idx]
  cards.delete_at(idx)
end
p cards
```

- シャッフルした結果は$n!$通りなので，それを辞書式に並べた時のインデックスを引くことでシャッフルします．
    - `rand`を一回しか使わないのがいい．

```ruby
def factorial(number)
  number = 0 if number.nil?
  (1..number).inject(1,:*)
end

cards = [*1..n]
shuffled = []
r = rand(factorial(n))
(n-1).downto(1) do |i|
  quotient = r/factorial(i)
  excess = r%factorial(i)
  shuffled << cards.delete_at(quotient)
  r = excess
end
p shuffled
```
Bootstrapで右側に謎の余白ができた時の対処法

#起きたこと

Bootstrap4を使ってレスポンシブ対応のWebページを作ったら、右側に謎の余白ができてしまった。
<img width="232" alt="謎の余白.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241418/75464171-644b-a770-7dc3-482ed1d0a395.png">
画像のように右端に隙間ができてしまい、無駄な横スクロールが発生する。
bodyのwidthやmarginをいじってみたが直らなかった。

#対処方法
bodyの中身をwrapしてoverflow:hidden;を設定したら直った。

##変更前HTML

```sample.html
<!doctype html>
<html lang="ja">
  <head>
    ...（省略）...
  </head>
  <body>
    <h1>hello</h1>
    ...（省略）...
  </body>
</html>
```
##変更後HTML

```sample.html
<!doctype html>
<html lang="ja">
  <head>
    ...（省略）...
  </head>
  <body>
    <div id="wrap">
      <h1>hello</h1>
      ...（省略）...
    </div>
  </body>
</html>
```

body直下にdivを追加して、id「wrap」を指定する。

##変更後CSS

```layout.css
#wrap {
  overflow: hidden;
}
```
CSS側ではid「wrap」に対してoverflow: hidden;を指定した。

これで謎の余白は表示されなくなった。

#参考
http://bashalog.c-brains.jp/15/06/26-170500.php
OpenCVとAmazon Rekognitionでリアルタイムに顔の表情から感情を分析する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163591/23de71fe-2c99-00d9-a1e3-95c6d68c8438.png)

AmazonRekognitionを使用すると物体認識だけでなく、顔認識やその感情分析までできるようです。
機械学習の専門家でなくてもAPIを利用するだけで手軽に画像認識が使えるというのは非常に魅力的です。
これを動画のようにリアルタイムでスキャンして解析できたら面白いだろうと思い、少し描いてみました。

今回作成したソースコードは[こちら](https://github.com/daisuke-awaji/opencv-face-detector)です。
公開しているリポジトリにはAmazonRekognitionを使用したソースコード以外にもOpenCVだけの機能で実装した顔検知も含まれています。

## 動作イメージ

笑顔を検知すると、四角い線が緑になるように実装しています。
左上には感情分析の結果を表示、SUPRISEDやCONFUSEDが目立ちますw
![detect_faces.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163591/faa4ba6c-d26c-cbad-9245-a2ac067a26d3.gif)

## 実装

想像以上に簡単に実装できました。
Rekognitionには画像ファイルをAPIで送信し、返却されたJsonに顔認識の情報などが含まれているので
あとはJsonの中身を整形して画面に出せばいいというだけです。

```python:detect_faces.py
import cv2
import numpy as np
import boto3

# スケールや色などの設定
scale_factor = .15
green = (0,255,0)
red = (0,0,255)
frame_thickness = 2
cap = cv2.VideoCapture(0)
rekognition = boto3.client('rekognition')

# フォントサイズ
fontscale = 1.0
# フォント色 (B, G, R)
color = (0, 120, 238)
# フォント
fontface = cv2.FONT_HERSHEY_DUPLEX

# q を押すまでループします。
while(True):

    # フレームをキャプチャ取得
    ret, frame = cap.read()
    height, width, channels = frame.shape

    # jpgに変換 画像ファイルをインターネットを介してAPIで送信するのでサイズを小さくしておく
    small = cv2.resize(frame, (int(width * scale_factor), int(height * scale_factor)))
    ret, buf = cv2.imencode('.jpg', small)

    # Amazon RekognitionにAPIを投げる
    faces = rekognition.detect_faces(Image={'Bytes':buf.tobytes()}, Attributes=['ALL'])

    # 顔の周りに箱を描画する
    for face in faces['FaceDetails']:
        smile = face['Smile']['Value']
        cv2.rectangle(frame,
                      (int(face['BoundingBox']['Left']*width),
                       int(face['BoundingBox']['Top']*height)),
                      (int((face['BoundingBox']['Left']+face['BoundingBox']['Width'])*width),
                       int((face['BoundingBox']['Top']+face['BoundingBox']['Height'])*height)),
                      green if smile else red, frame_thickness)
        emothions = face['Emotions']
        i = 0
        for emothion in emothions:
            cv2.putText(frame,
                        str(emothion['Type']) + ": " + str(emothion['Confidence']),
                        (25, 40 + (i * 25)),
                        fontface,
                        fontscale,
                        color)
            i += 1

    # 結果をディスプレイに表示
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
```

boto3を利用するので`~/.aws/credentials`にアクセスキーとシークレットキーを格納するのをお忘れずに
boto3を使用する際のAWS認証情報の取り扱いは[こちらの公式ドキュメント](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html)を参考にしてください。

```bash
$ cat ~/.aws/credentials

[default]
aws_access_key_id = xxxxxxxxxxxxxxxxxxxx
aws_secret_access_key = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
```

## さいごに

最近では[OpenCV.js](https://docs.opencv.org/3.4/d5/d10/tutorial_js_root.html)というJavaScriptで動作するOpenCVも話題になっていますね。
これをうまく使えばフロントエンド（ブラウザ）での顔認識＋感情分析も簡単に実装できるかもしれませんね
Leetcode #168: Excel Sheet Column Title

```swift
func convertToTitle(_ n: Int) -> String {
    guard n > 0 else {
        return ""
    }
    var dict = [1: "A", 2: "B", 3: "C", 4: "D", 5: "E", 6: "F", 7: "G", 8: "H", 9: "I", 10: "J",
    11: "K", 12: "L", 13: "M", 14: "N", 15: "O", 16: "P", 17: "Q", 18: "R", 19: "S", 20: "T",
    21: "U", 22: "V", 23: "W", 24: "X", 25: "Y", 0: "Z"]

    var n = n
    var answer = ""
    while n > 0 {
        if let value = dict[n%26] {
            answer = value + answer
            n /= 26
            if value == "Z" {
                n -= 1
            }
        }
    }
    return answer
}
```
とりあえずDockerでMySQLを使えるようにする

自分のPCで実行したときのめもです。
# DockerでMySQLを実行する
### DockerでMySQLのイメージをPullする
```:docker
docker pull mysql:5.6
```
[MySQL docker official page](https://hub.docker.com/_/mysql?tab=description)

Tagに何も指定せずpullするとバージョン８になるので、5.7や5.6を指定するのが吉。
バージョンが高いと既存バグ？とかあるので苦戦することもある。

### MySQLのサーバインスタンスを実行
```:docker
docker run --name some-mysql_04 -e MYSQL_ROOT_PASSWORD=mysql -d -p 13306:3306 mysql:5.6 
```
オプションの説明
* -e 環境変数　（root password をmysqlで設定）
* -d コンテナをバックグラウンドで実行

### 2回目以降の起動の仕方
まず過去に動かしたdocker image のcontainer idをチェック
（存在していれば過去に作ったテーブルデータとかもある）

```:docker
docker ps -a
```

動かす

```:docker
docker start <container id> 
```
### docker imageの止めかた
container idをチェックする

```:docker
docker ps
```
止める

```:docker
docker stop <container id> 
```
### MySQLでの事前準備
まずcontainer idをチェックする
以下のコマンドで動いているdocker imageとそのcontainer idがわかる。
以下のコマンドで出力されない場合は起動できていない。

```:docker
docker ps
```

以下のコマンドでdocker image内にアクセスできる

（MySQLサーバの中に入って操作するイメージ）

```:docker
docker exec -it <container id> bash
```

bashが表示されるので、以下のコマンドでMySQL
に接続する。パスワードはmysql。

```:mysql
mysql -u root -p
```

作成したばっかりだとデータベースがないので作る

```:mysql
CREATE DATABASE test_app;
```

適当にテーブル作ったりするときは以下のようなクエリー

```:mysql

CREATE TABLE users(
    id INT(11) AUTO_INCREMENT NOT NULL, 
    name VARCHAR(30) NOT NULL,
    PRIMARY KEY (id));

insert users (name) value("testUser");

CREATE TABLE posts(
    id INT(11) AUTO_INCREMENT NOT NULL, 
    title VARCHAR(30) NOT NULL,
    text VARCHAR(1024) NOT NULL,
    PRIMARY KEY (id));

insert posts (title, text) value("title01 from db", "text01 from db");
insert posts (title, text) value("title02 from db", "text02 from db");
```

### ホストマシンからの接続先（Windows編）
Docker Toolboxで、Windows10Pro以外の場合の接続先アドレス
192.168.99.100
ホストマシンや他のdocker imageからアクセスできるポート
13306
※docker runで指定している
GitLab CIでservicesにdockerイメージを使った時のhostname


## TL;DR

- `localhost`ではない
- dockerイメージ名が`hostname`
- dockerイメージ名にスラッシュがあるときは、スラッシュが`-`か`__`で置換

## 例

- `docker:dnd` なら `docker`がhostname
- `golang:1.12.5-alpine3.9`なら`golang`がhostname
- `danielgtaylor/apisprout:latest`の場合は２つ
    - スラッシュ`/`がハイフン`-` に置換した`danielgtaylor-apisprout`
    - スラッシュ`/`をダブルアンダースコア`__` に置換した`danielgtaylor__apisprout`

## 役立つ場面

```sh
services:
  - docker:dind
lint:
  stage: test
  script:
    - docker-compose up -d
    - dockerize -wait http://docker:4000 -timeout 30s
    - # skip
```


## c.f.

https://docs.gitlab.com/ce/ci/docker/using_docker_images.html#accessing-the-services
【LimeChat】定時に曜日を発言スクリプト

```js
/*
 指定した時間にメッセージを出力するスクリプト
  ※連投防止のため指定時間の1分後に動作します
  ※上記時間から最大で±1分程度の誤差があります
 
 *Version*
 1.0:新規作成
 
*/
// 出力設定
var today = new Date();
var weekday = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];

var messageText = weekday[today.getDay()];
var hour = 22; // 時（24時間表示）
var min = 18;  // 分（1桁でも0は不要…あっても動くかも）
var channel = "#aaa";


/*
 連投防止用wait関数
*/
function wait(intervalTime)
{
	setTimeout(showMessage, 60 * 1000);
}

/*
 メッセージ出力関数
*/
function showMessage()
{
	send(channel, messageText);
	setNextTimer();
}

/*
 タイマー設定
*/
function setNextTimer()
{
	log("ABC:" + channel);
	var now = new Date();

	var nextH = hour - now.getHours();
	var nextM = min - now.getMinutes();
	var intervalTime = ((nextH * 60) + nextM) * 60 * 1000;
	if (intervalTime < 0)
	{
		intervalTime = (((24 * 60) * 60) * 1000 ) + intervalTime;
	}
	var nextDate = new Date();
	nextDate.setTime(now.getTime() + intervalTime + 1000);
	log("DEF:" + nextDate.toLocaleString());
	setTimeout(wait, intervalTime);
	log("GHI:" + messageText);
}

/*
 起動時イベント
*/
function event::onLoad()
{
	setNextTimer();
}
```
###参考
>
http://blog.nakajijapan.net/archives/2209
https://lab.syncer.jp/Web/JavaScript/Snippet/3/
http://persimummies.hatenablog.com/entry/2015/04/12/110217
https://peacepopo.net/blog-entry-151.html
CentOSにgit環境を構築する

hyper-v環境にgit環境を作ったのでそれの手順。
今回はCentOS7.6にいれます。

とりあえずyumでgitをいれましょう。

```
>sudo yum install -y git
```
インストールが完了したら試しにコマンドラインで確認します。

```
>git
usage: git [--version] [--help] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

The most commonly used git commands are:
   add        Add file contents to the index
   bisect     Find by binary search the change that introduced a bug
   branch     List, create, or delete branches
   checkout   Checkout a branch or paths to the working tree
   clone      Clone a repository into a new directory
   commit     Record changes to the repository
   diff       Show changes between commits, commit and working tree, etc
   fetch      Download objects and refs from another repository
   grep       Print lines matching a pattern
   init       Create an empty Git repository or reinitialize an existing one
   log        Show commit logs
   merge      Join two or more development histories together
   mv         Move or rename a file, a directory, or a symlink
   pull       Fetch from and merge with another repository or a local branch
   push       Update remote refs along with associated objects
   rebase     Forward-port local commits to the updated upstream head
   reset      Reset current HEAD to the specified state
   rm         Remove files from the working tree and from the index
   show       Show various types of objects
   status     Show the working tree status
   tag        Create, list, delete or verify a tag object signed with GPG

'git help -a' and 'git help -g' lists available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.
```
こんな感じになればOK。
では、ここから各種設定。
まず、個人情報登録です。git configを使います。

```
>git config --global user.name "hoge"
>git config --global user.email hoge@hoge.com
```

登録できたか確認します。

```
>git config user.name
hoge
```

そして、プロジェクトのあるディレクトリに移動し

```
>git init
Initialized empty Git repository in /hoge/hoge/.git/
```
となればひとまずgitの環境は完成。

つくるだけなら誰でもできます。
Unity WebGLでビルドしたものが再生できない

## はじめに
 
Unity WebGLでビルドしたさいに生成されたindex.htmlを開いてもエラーが出てしまうことがある。

<img width="437" alt="pic1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401517/9ce81b76-f0ff-2946-17a0-7d706a4e3271.png">

![pic2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401517/6c23b9ee-7552-c681-f237-1cb0b2bd7a69.jpeg)


## 実行環境

・Windows10
・Unity 2017.04 23f1
・Google Chrome

・Mac Mojave
・Safari

## 原因

使用しているブラウザーがUnity WebGLをサポートしていないため。

私が実行したChrome Opera Vivaldi Safariのブラウザでは動作しなかった。

Chromiumをベースとしたブラウザであるものは、動かない可能性がある。

## 対処方法

####Windows

Microsoft Edgeでindex.htmlを起動する。

もしかしたらこれから動かなくなる可能性がある。

####Mac

もともとある機能から実装する。

ビルドしたファイルはこのような構成になる

・Build
・TemplateData
・index.html

このディレクトリ内で下のコードを実行する。

```terminal:terminal
python3 -m http.server 8000
```

次に下のURLをクリック

[http://localhost:8000](http://localhost:8000)

これでビルドしたものが再生できる。

Directory listing for /
この画面が表示された場合はコマンドを実行したディレクトリが間違っている可能性があります。そのディレクトリ内にindex.htmlがあるかを確認してみてください。よかったら下のターミナルのコードも参考にしてみてください。

```terminal:terminal
ls  #lsは現在のディレクトリ内のファイルを一覧で表示します。lsと打ってindex.htmlが表示されるかを確認。
cd  #cdはディレクトリを移動できます。cd Desktopでデスクトップにディレクトリを移動できます。
```

####そのほかの方法

実際にHttpサーバーにアップロードして再生する。

他にもGoogle Driveにアップロードしても再生が出来るのかもしれない

>[WebブラウザでUnityで作ったシーンを歩き廻ろう！](https://qiita.com/ChinatsuMatsumoto/items/c99457cc85318da892cb)

##感想

ブラウザをFirefoxなどに変更すれば起動するのかもしれません。Edgeが起動したことには驚きました。実際にこのindex.htmlを開いても確認できないのは少し不便に感じました。
PythonのMatplotlib Basemap Toolkitで日本地図を描く 

# 環境
- Windows10 Pro
- Python 3.6.4 :: Anaconda 
- matplotlib 3.0.3
- basemap 1.2.0
- basemap-data-hires 1.1.0
- pyproj 1.9.5.1

# 概要
令和になったし、日本の地図を描きたくなることありますよね。
Basemapを使って地図を描いてみました。

# エラーとその対処
basemapをimportする際に以下のようなエラーが出ました。

```
Traceback (most recent call last):
  File "basemap.py", line 2, in <module>
    from mpl_toolkits.basemap import Basemap
  File "C:\Users\jh_0606\Anaconda3\lib\site-packages\mpl_toolkits\basemap\__init__.py", line 155, in <module>
    pyproj_datadir = os.environ['PROJ_LIB']
  File "C:\Users\jh_0606\Anaconda3\lib\os.py", line 669, in __getitem__
    raise KeyError(key) from None
KeyError: 'PROJ_LIB'
```

以下のように環境変数を設定してあげればOKです。

```python
import os
os.environ['PROJ_LIB'] = "C:/Users/jh_0606/Anaconda3/Library/share"
```

# コード

```python:basemap.py
import os
os.environ['PROJ_LIB'] = "C:/Users/jh_0606/Anaconda3/Library/share"

from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.pyplot as plt

fig=plt.figure()
ax=fig.add_axes([1,1,1,1])

#E120-E150, N20-N50, high-resolution, mercator_projection
m = Basemap(llcrnrlon=120.,llcrnrlat=20.,urcrnrlon=150.,urcrnrlat=50.,
            rsphere=(6378137.00,6356752.3142),
            resolution='h',projection='merc')

m.drawcoastlines()
m.fillcontinents()

# draw parallels
m.drawparallels(np.arange(10,50,10), labels=[1,1,0,1])
# draw meridians
m.drawmeridians(np.arange(120,150,10),labels=[1,1,0,1])

ax.set_title('Japan')
plt.show()
```

# 出力
![basemap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244405/3094af11-21d4-82fc-c3c5-f67855be6ff8.png)

素晴らしい。
今後、これを基本に拡張していきます。

# Bibriography

Basemap 公式ドキュメント
https://matplotlib.org/basemap/index.html
Leetcode #165: Compare Version Numbers

```swift
func compareVersion(_ version1: String, _ version2: String) -> Int {
    let ar1 = version1.components(separatedBy: ".")
    let ar2 = version2.components(separatedBy: ".")
    for i in 0..<ar1.count {
        guard i < ar2.count else {
            for j in i..<ar1.count {
                if Int(ar1[j]) != 0 {
                    return 1
                }
            }
            return 0
        }

        if let first = Int(ar1[i]), let second = Int(ar2[i]) {
            if first > second {
                return 1
            } else if first < second {
                return -1
            }
        }
    }
    for i in stride(from: ar1.count, to: ar2.count, by: 1) {
        if Int(ar2[i]) != 0 {
            return -1
        }
    }
    return 0
}
```
「退屈なことはPythonにやらせよう」を読んだのでPythonで小テストを作るためのフォーマットを作ってみた

# 概要

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

を読んだので、教師の方や親御さん、はたまた自分でテストを作って勉強したい方向けに小テストを作るためのフォーマットを
Pythonで作ってみました。

特に教師の方は仕組みさえ分かれば様々なテスト作りに応用が効くので、ぜひ一読頂いて試して頂ければ幸いです。
[こちら](https://github.com/Kuehar/Create-Test-Automation)にコードを置いています。気になる方はどうぞ。


#参考書籍

[退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング](https://www.amazon.co.jp/dp/487311778X/ref=cm_sw_em_r_mt_dp_U_Ohr9Cb24N6FS5)

個人的名著です。今回の記事の内容以外にも様々な雑用から解放されるような内容がたくさん載っているので、興味ある方は読んでみてください。


#環境
MacOS Mojave 10.14
Python 3.7.3



#コード

```python:randomQuiz.py
# !python3
# coding: UTF-8


# randomQuiz.py -ランダムに問題と答えを並べて問題集と解答集を作る


#問題と選択肢をシャッフルするためにrandomモジュールをインポート。
import random

# 問のデータ。キー（問題部分）と値（答え）を自身で入れ替えることで様々な問題に対応可能

wordQuiz = {'意気':'投合','自業':'自特','天変':'地異','泰然':'自若','魑魅':'魍魎','百花':'繚乱','一挙':'両得','内憂':'外患','破顔':'一笑','右往':'左往','神出':'鬼没','和洋':'折衷','電光':'石火','朝三':'暮四','竜頭':'蛇尾','徹頭':'徹尾'}

# 35通りの問題を作成。range()の中の数字を任意の数字に変えることで何パターン分作るかを決められる。
for quiz_num in range(35):

    #問題集と解答集のファイル作成
    quiz_file = open('randomQuiz{}.txt'.format(quiz_num + 1),'w')
    answer_key_file = open('randomQuiz_answers{}.txt'.format(quiz_num + 1),'w')

    #問題集のヘッダー（名前の記入欄などのスペース）を書く
    quiz_file.write('名前:\n\n日付:\n\n学期:\n\n')
    quiz_file.write((' ' * 28) + '四字熟語クイズ(問題番号{})'.format(quiz_num + 1))
    quiz_file.write('\n\n')

    #言葉の順番をシャッフルする
    Questions = list(wordQuiz.keys())
    random.shuffle(Questions)

    # 問題をループしてそれぞれの問題を作成する
    for question_num in range(len(Questions)):

        #正解と誤答を取得する

        correct_answer = wordQuiz[Questions[question_num]]
        wrong_answers = list(wordQuiz.values())
        del wrong_answers[wrong_answers.index(correct_answer)]
        wrong_answers = random.sample(wrong_answers,3)
        answer_options = wrong_answers + [correct_answer]
        random.shuffle(answer_options)

        #問題文と回答選択肢を問題ファイルに書く
        quiz_file.write('{}.{}の後に続く正しい語句は次のうちどれ？\n'.format(question_num + 1,Questions[question_num]))
        for i in range(4):
            quiz_file.write('{}.{}\n'.format('ABCD'[i],answer_options[i]))

        quiz_file.write('\n')

        #答えの選択肢をファイルに書く

        answer_key_file.write('{}.{}\n'.format(question_num + 1,'ABCD'[answer_options.index(correct_answer)]))

    #　ファイルを閉じる
    quiz_file.close()
    answer_key_file.close()

```

#解説

上記のプログラムで、登録したキーと値をランダムな順番に並べ、正答と誤答を1:3の割合で選択肢として作ったものが出来上がります。

問題の順番と誤答の選択肢を無差別にシャッフルしてくれるものといえば分かりやすいでしょうか。

こちらのプログラムの素晴らしいところは、キーと値さえ設定してしまえば問題の順番などは考えなくてよく、使い回しが効くフォーマットとして使用できる点です。
今回は四字熟語の例を使っていますが、このプログラムは単純な暗記を試すようなテストから、少し設定を変えれば算数の計算問題作成などにも使えます。


今回の例では、for quiz_num in range(35):の括弧の中が35なので35通りの問題と解答が作成されることになります。

以下の画像が実際にプログラムを実行した際の完成品となります。
このような形式のテストがプログラムを実行した時に35通り分、実行したプログラムと同じフォルダ内に作成されます。

![スクリーンショット 2019-06-05 21.57.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412789/085e3324-dadf-ec58-b7ab-dd7c7942492f.png)




#あとがき

一人でも多くの方に雑用を楽にこなして欲しかったのと、個人的に名著だと思っている本の内容に触れている記事がほとんど無かったので記事を書きました。


この記事が少しでも多くの方の助けになればと思います、是非活用してみてください。
[Vue.js] Vueのイベントリスナの種類(v-on:??)

# Event listnerの種類

<img width="736" alt="스크린샷 2019-06-05 오후 9.45.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428595/9a7446c7-bb73-4911-dbd8-250c88555185.png">

Vueの公式サイトを見たら上記のように書いてありました。
そうしたらJavascriptのonから始まるEventListnerを＠またはv-onで可能と思ってテストしました。
やぱりｗできました。

### Vue Event Listnerの一覧
```
@abort 
@auxclick 
@beforecopy 
@beforecut 
@beforepaste 
@blur 
@cancel 
@canplay 
@canplaythrough 
@change 
@click 
@close 
@contextmenu 
@copy 
@cuechange 
@cut 
@dblclick 
@drag 
@dragend 
@dragenter 
@dragleave 
@dragover 
@dragstart 
@drop 
@durationchange 
@emptied 
@ended 
@error 
@focus 
@focusin
@focusout
@fullscreenchange 
@fullscreenerror 
@gotpointercapture 
@input 
@invalid 
@keydown 
@keypress　　　＜ーーーこれ動かない。　 
@keyup 
@load 
@loadeddata 
@loadedmetadata 
@loadstart 
@lostpointercapture 
@mousedown 
@mouseenter 
@mouseleave 
@mousemove 
@mouseout 
@mouseover 
@mouseup 
@mousewheel 
@paste 
@pause 
@play 
@playing 
@pointercancel 
@pointerdown 　　　　
@pointerenter 
@pointerleave 
@pointermove 
@pointerout 
@pointerover 
@pointerup 
@progress 
@ratechange 
@reset 
@resize 
@scroll 
@search 
@seeked 
@seeking 
@select 
@selectionchange 
@selectstart 
@stalled 
@submit 
@suspend 
@timeupdate 
@toggle 
@volumechange 
@waiting 
@webkitfullscreenchange 
@webkitfullscreenerror 
@wheel 
```
【Blender】ぽよよ〜ん♪ぷよぷよ♪柔らかいゼリーみたいなもの作ってみたよぉ（ソフトボディ）

環境メモ
⭐️Mac OS Mojave バージョン10.14
⭐️Blender v2.79.6
⭐️Mac Book

↓↓完成した内容
https://twitter.com/nonnonkapibara/status/1136241123737817088
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">💕Blender💕<br>昨日よりもっと柔らかいソフトボディな<br>✨ぽよよよ〜ん✨ぷるぷる✨<br>作ってみたよぉ😍<br>なんだか、ゼリーが食べたくなっちゃうぅ😋<br>（●＾o＾●）<a href="https://twitter.com/hashtag/blender?src=hash&amp;ref_src=twsrc%5Etfw">#blender</a> <a href="https://twitter.com/hashtag/blender3d?src=hash&amp;ref_src=twsrc%5Etfw">#blender3d</a> <a href="https://t.co/lzbbwcaEBZ">pic.twitter.com/lzbbwcaEBZ</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1136241123737817088?ref_src=twsrc%5Etfw">June 5, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



<img width="1057" alt="スクリーンショット 2019-06-05 21.56.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/705ff226-1e8e-a40d-159d-169144aec4a1.png">

<img width="644" alt="スクリーンショット 2019-06-04 20.47.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/7d14fe50-61c4-08f9-2bf8-81f98309d31d.png">


<font color="Magenta">
キャプチャ画像が多いので
続きは、「はてなブログ」に記載してます↓
</font>

[かぴばらさんの覚書ブログ nonkapibara](https://nonkapibara.hatenablog.com/entry/2019/06/05/215713)

<br><br><br><br><br><br>


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">🐹Blender🐹<br>🥝ソフトボディ🥝を試してみたよぉ<br>ソフトボディのプロパティで、いろいろ硬さが調整ができるみたいですぅ😊<br>ぽよよ〜ん😍<br>逆再生😁も楽しんでみたよぉ🤩<a href="https://twitter.com/hashtag/Blender?src=hash&amp;ref_src=twsrc%5Etfw">#Blender</a> <a href="https://twitter.com/hashtag/Blender3d?src=hash&amp;ref_src=twsrc%5Etfw">#Blender3d</a> <a href="https://t.co/SNszNjOg0D">pic.twitter.com/SNszNjOg0D</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1135915785463902208?ref_src=twsrc%5Etfw">June 4, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【人工知能（AI）が仕事を奪う・奪わないの論争について調べてみた】

お疲れ様です。
昨今話題の人工知能やAIの話に少し乗っかってみました。
元々エンジニアになった際にそこらへんの領域で働く人間になりたいな
というきっかけでしたが、今は世界が広がりそことは別の領域で働くのも良いなぁと
迷っているエンジニア二年目の人間です。

少しだけ、人工知能（AI）について調べたのでまとめようかなと。
※技術の話はあまりないです。どっちかっていうとポエミーです。

#### 【人工知能はまだできていない？！】
人工知能　＝　Artificial　Intelijence　略してAIです。
最近では自動車の自動運転の法案も取り上げられたり、
将棋や囲碁の「電王戦」でプロの棋士達が負け越すなどでも話題になってますが、
「人工知能はまだできていない」というのが参考文献の松尾豊さんの論旨です。

というのも、「人工知能を使った製品」「人工知能の技術を使ったサービス」は
現時点でも作られたり世の中に発生してますが、
本当の意味で

「人間のように考えて、思考して判断するコンピュータや技術はまだ生まれていない」

と述べられています。
確かに、上記で取り上げた自動車や電王戦のロボット、
それからクイズ王にも輝くIBMのワトソン等も
「ある一定の枠組みの中での分析・判断」しかできていないというのが事実です。

もし仮に「人間のように考えて・思考して判断するコンピュータ」が
あればSF映画のようにロボットが人間を支配する世界が実在するやもしれませんね。
（ロボットが人間を支配する・しないに関してはさまざまな論争がありますが、
　私にはわからん世界なので一旦置いておきます。）



####【人工知能の現在について】
大学の論文的な話や概要はさておき、
すこし技術的な内容も投稿したいと思います。

現在人工知能系では「Python」が非常に人気ですが、
なんでPythonが人気なんでしょうか。

調べた結果から先にお話すると「いろいろな意味で安定しているから」
というのが結論になるようです。

長ったらしく説明するのは嫌いなので、要約と引用を。

>オープンソースプロジェクトは
　開発リソース(おもにマンパワー)が限られ、
　開発の中心メンバーが何らかの理由で参加しなくなった場合、
　一気にそのプロジェクトが衰退する場合があるが、
　特に科学技術計算関係のパッケージについては
　民間企業が本格的にサポートとしており、
　オープンソースソフトウェアとして公開する体制が整っている。

つまるところ、オープンソースソフトウェア（OSS）の開発には
「人」が依存するけど、民間企業のサポートがあると
人の依存度が下がり、安定してバージョンアップがあるため。
そのため言語がEOLを迎える心配があまりない
→言語がEOLを迎えたためのシステムの
　マイグレーションをする必要がない。

というのが一つ。

もう一つに「ライブラリが充実してきている」というのが理由にあるそうです。
Pythonは科学技術の計算（天文学的な計算とか確率とか言いますが）のために
作られた言語ではなく、一昔前までは「R言語」という言語が使用されていたそうです。

このR言語にしか無かった「ライブラリ」（Lib）がPythonにも
どんどん流入されつつあり、R言語を使う理由がなくなってきている
というのが昨今のブームの理由のようです。

民間企業のサポートもありつつ、ライブラリも充実してきている
（サポートがあるからライブラリが充実しているとも言えますが）
ので、Pythonが利用されている理由の大半とのことでした。

もっと「重み付けの話」とか、「バックプロパゲーション」の話とかも書きたいのですが
図や文章量がエグいことになりそうなので、一旦今回は置いておきます。

ただ、あまりに話をしなさすぎるのもあれなので一つだけ。


####【機械学習やディープラーニングの基本をわかりやすく】

人工知能の基本となる、「機械学習」や「ディープラーニング」ですが
大きく分けて3つのステップが存在します。

1.データを集める
2.モデルを学習させる
3.システムに組み込む

「画像認識システム」の例で考えますと、
基本的に「猫」を見たことがある人はこれは「猫」だと判別できますが
PCや猫を見たことがない人は猫と識別することができません。

そのため、「猫」というものがどういうものかを機械に教える必要があります。
そこで膨大な量の「猫」のデータを機械に認識させ、「猫」のモデルを学習させます。

最終的に、画像を渡したときにこれは猫or猫じゃないと判別するように
なるわけですが、このときに先程ちらっと書いた
「重み付け」や「バックプロパゲーション」が関わってきます。
これは機会があれば書いていこうと思います。


####【人工知能（AI）が仕事を奪う・奪わないの論争について】

書いてる本人が若干忘れかけてましたがAIが仕事を奪う・奪わないについて。
事例をざっと調べると。

>2015年の段階で、アメリカでは会計士・税理士などの需要が
　約8万人ほど減っている。

>また、RPA(ロボティック・プロセス・オートメーション)などの技術の普及により
　ユニリーバ・ジャパンなどは1人月のかかるデータの分析等の内容を
　半日で消化するなどの事例も出しているようです。

作業効率化はともかく、上の方はなんらかネガティブなイメージもありますが

>ホテルの翌日のチェックインや今後のスケジュール、残室コントロールなどを
　RPAにチェック・管理させることで業務への負担を軽減させる目的で導入。
　実際に社員の残業時間も、支払う残業代も減り、離職率の高かった状態も軽減できた。

といったポジティブに働く要素もあるようです。


上の画像認識の例であげたように、危険物を持っている人を弾く、オフィスに入れない、
なんてシステムができたら警備員の負荷も減るでしょうね。

これらを踏まえて「仕事」は現実的に奪っているでしょう。
ただ、「職業」を奪っているか、というと現時点では違うように思います。
（仕事が奪われてるんだから結果的に職業も奪われることになるだろというツッコミはなしでｗ）

アメリカの会計士・税理士の事例も需要が減っているだけで、
まだまだ「人間が良い」と判断する方やAIを利用できない環境の方は
いるのだろうと考えます。（あれば使うのかどうかは気になりますが。）

ただ、最初にも述べたとおり現在の技術は「一定程度の枠組み」の中での事例でしかありません。
仕事に関して、本当に一定の枠組みで済む範囲であれば
人工知能やRPAなどの技術に任せてますでしょうか。

結果的に最終確認をするのは人間が現状やっているのが現実です。
テストやソースコードを流しても最終的に結果を最後に確認しているのは人間です。

もし最終的な確認まで人工知能やロボットができるようになったとしたら、
その時が職業が奪われるかもしれなくなったときなのかもしれないですね。


>参考文献：人工知能は人間を超えるか　著者：松尾豊
　　　　　はじめてのディープラーニング　Pythonで学ぶニューラルネットワークとバックプロパゲーション　著者：我妻幸長
機械学習：「 第 2 章： 非線形回帰モデル 」

回帰問題とは与えられた入力値から出力値を予測する問題のことであり、その中で出力値を非線形関数（曲線）で近似し、予測することを非線形回帰という。
非線形回帰モデルでは、回帰係数として基底関数と呼ばれる既知の非線形関数とパラメータベクトルの線形結合を使用し、未知パラメータω線形回帰モデルと同様に最小二乗法や最尤法を用いて推定する。
yi = ω0 + ΣwjΦj(xj) + εi

よく使われる基底関数としては、多項式関数、ガウス型関数、スプライン/Bスプライン関数等がある。
最尤法による予測値は以下の式で計算される。
ý = Φ（Φ(train)TΦ(train) )-1 Φ(train)T y((train)
ý：予測値
y：データ
Φ：非線形関数の行列
テスト4

```vb

Sub フォーム表示()

UserForm1.Show vbModeless

End Sub

'----------------------------------------------
Private Sub TextBox1_Change()

Set myRange = Range("B:B")
keyWord = TextBox1.Value
Set adr = myRange.Find(keyWord, LookAt:=xlWhole)

If adr Is Nothing Then

    MsgBox "該当する番号がありません"

Else

    ActiveSheet.Unprotect    '一旦シートの保護を解除する
    
    Range("D:D").Interior.ColorIndex = 0 ' D列の背景色：なし
    Range("D" & adr.Row).Interior.ColorIndex = 6  ' セルの背景色：黄色
    
    '一旦全ての行を表示する
    Rows("1:" & Rows.Count).Hidden = False
    uRow = adr.Row - 1
    dRow = adr.Row + 1
    
    '指定の行より上は全て非表示
    Rows("1:" & uRow).Hidden = True
    
    '指定の行より下は全て非表示
    Rows(dRow & ":" & Rows.Count).Hidden = True
    
    '指定のセルだけ入力できるようにする
    Range("D" & adr.Row).Locked = False
    
    '一旦シートの保護する
    ActiveSheet.Protect
End If

End Sub

'----------------------------------------------
Sub フォームモジュールインポート()

Dim Filename As String
Dim Fmodule As String
Filename = "C:\Users\user\Desktop\ABC.xlsm"
Fmodule = "C:\Users\user\Desktop\UserForm1.frm"

Set wb = Workbooks.Open(Filename)
wb.VBProject.VBComponents.Import Fmodule

End Sub

'----------------------------------------------
Sub AAA()
'最初にショートカットキーの機能を設定しておく
Application.MacroOptions Macro:="値で貼付", ShortcutKey:="v"
End Sub

Sub 値で貼付()
     ActiveCell.PasteSpecial Paste:=xlPasteValues   '値で貼付
End Sub
'----------------------------------------------
'MailItem オブジェクトの使い方について (Outlook)
'https://docs.microsoft.com/ja-JP/office/vba/api/Outlook.MailItem

'SendUsingAccountの使い方について
'https://docs.microsoft.com/ja-JP/office/vba/api/outlook.mailitem.sendusingaccount
```
mbed のprintf をMac PCの画面に表示させる方法

##1.ターミナルを起動しusb Moddemの接続先を確認。
```
ls /dev/tty.usbmodem*
```

##2.Screenコマンドでusb Modemポートに接続する。

```
Screen 上記で表示された接続先
```
以上でPCに表示できる。

##3.接続を切る。
Screenコマンドの終了はCtrl+aに続いてCtrl+\を押す。

以上

####参考URL
https://os.mbed.com/users/EndoTsunenobu/notebook/mac%E3%81%A7printf%E3%82%92%E8%A1%A8%E7%A4%BA/
fishでBoostnoteのノートを作るコマンドをつくった

# 作成物とインストール方法

### 作成物

https://github.com/mk2/boo

### インストール方法

```sh
fisher add mk2/boo
```

### 使い方

```
set -x BOOSTNOTE_DATA_DIRECTORY ~/xxx # Boostnoteのデータがあるディレクトリを指定
boo <Folder> <tag1> <tag2> 内容 # csonファイルが作成されます。<Folder>はBoostnoteのフォルダです。tabキーで補完が効きます。
```

# 余談

## 何でつくったか？

[Boostnote](https://boostnote.io/)というプログラマ用のメモツールがあるのですが、いかんせんElectron製なため、コマンドラインからBoostnoteのノートを作成する、ということが難しいです。僕は結構メモ的にBoostnoteを使っているので、コマンドラインからでも簡単にメモをBoostnoteに作れたらいいな〜と前から思っていました。なので、作りました。

## なぜfish専用？

最初はGoでTermboxを使って、ガッツリエディタ的なもの（言ってしまえばコンソール版のBoostnote）を作ろうと思っていたのですが、短文をさくっとメモる用途なら、単なるコマンドでいいのでは…？と気付いてから、ならいつも使っているfishのプラグインとして作ってみようかなと思い、fishで作ってしまった…という感じです。

## 作ってみて

fishのプラグインを作るのがこんな簡単だとは思いませんでした。https://github.com/jorgebucaran/fish-nvm を参考にしつつディレクトリ構成を決めて、あとはfishのスクリプトをちまちま書いていくだけ！fish最高！

## 最後に

自分で使うために作ったものなので、基本自分でドッグフーディングしていく感じです。ただ、どこかの誰かのニーズにはまってたらいいな〜とも思います。
SwiftUI を試してみた！

# SwiftUI を試してみた！

- 今回は自分で一からプロジェクトを作るのではなく公式が出しているプロジェクトをいじいじしていきたいと思います。

1. SwiftUIを使うためには？？
2. 実際に使ってみる

## 1. SwiftUIを使うためには
以下の二つをダウンロードしましょう！
（OS がver 10.15出ないとcanvas機能が使えません）

- macOS Catalina 10.15 beta
- Xcode 11 beta

[ここからダウンロードできます!](https://developer.apple.com/download/#ios-restore-images-ipad-new)

## 実際に使ってみる。
[チュートリアル](https://developer.apple.com/tutorials/swiftui/creating-and-combining-views)を使用していきます。

プロジェクトを開いたらこんな感じです。
<img width="1399" alt="スクリーンショット 2019-06-05 21.41.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310283/5ebd5624-e6c5-df5a-a482-67f95465fcd9.png">

私手にはこれまでよりコードの見やすくなっていて、さらにcanvas機能がいいなと感動しました！


今回はここまで書いておきます！
またどんどん記事を増やしておきます。
[SwiftUIを用いてSNS風（見た目）を作ってみました。](https://qiita.com/ankuma0617/items/b4ca967e1beb9444c194)
機械学習：「 第 1 章： 線形回帰モデル」

回帰問題とは与えられた入力値から出力値を予測する問題のことであり、その中で出力値を線形関数（直線）で近似し、予測することを線形回帰という。
線形回帰モデルは教師あり学習（正解付きデータから学習）で入力とm次元パラメータの線形結合を使用したモデルとなり、式で表すと以下の通りとなる。
y = ωT x+ b 
ω = (ω1, ω2, …ωm) T
ωは特徴量xが予測値yに対してどのような影響を与えるかを決定する重みの集合体であり、最小二乗法と呼ばれる方法で推定される。
最小二乗法では、データとモデル出力（予測値）の二乗誤差を計算し、それをωで微分した際に、傾きが0になる点（誤差が最小となる点）を求める。
MSEtrain = 1/ntrainΣ(ýi(train) – yi((train))2

MSEtrain：平均二乗誤差
ý：予測値
y：データ
上記をωで微分し、イコール0となるωは以下の通り。
ω= (X(train)T X(train) )-1 X(train)T y((train)
vscodeで複数のシェルを切り替えながら使う方法

## 経緯
Windows上で，プログラムのコンパイルもgitの操作もvscodeでできるようにしようと環境を整えていました．c++コードのコンパイルのためにはPower Shellを，gitのためにはgit bashを使う必要があります．

デフォルトで使用するシェルの設定は`File→Preferences→settings`から`terminal.integrated.shell.windows`のパスを変更することができます．ところが拡張機能なしでは複数のシェルのパスを通してやることができません．調べ方がわからずに少し手こずったので備忘録として残しておきます．

## 解決方法
Shell launcherという拡張機能を入れることでvscode上でのシェルの切り替えが可能になります．

1. Shell launcherという拡張機能を入れて，vscodeを再起動する．
1. `File→Preferences→settings`からsettings.jsonファイルを開いて以下を追加する．（例ではコマンドプロンプト，PowerShell, Git bash, WSL Bashを追加しているが欲しいシェルだけ追加すればOK．パスも確認して必要に応じて書き直してください．）
`"shellLauncher.shells.windows"`のwindowsの部分をlinuxにするとlinuxでも，osxにするとmacでも同様の設定にすることが可能です．

    ```
    "shellLauncher.shells.windows": [
        {
            "shell": "C:\\Windows\\sysnative\\cmd.exe",
            "label": "cmd"
        },
        {
            "shell": "C:\\Windows\\sysnative\\WindowsPowerShell\\v1.0\\powershell.exe",
            "label": "PowerShell"
        },
        {
            "shell": "C:\\Program Files\\Git\\bin\\bash.exe",
            "label": "Git bash"
        },
        {
            "shell": "C:\\Windows\\sysnative\\bash.exe",
            "label": "WSL Bash"
        }
    ]
    ```

1. `shellLauncher.launch`コマンドにショートカットキーを割り当ててやると切替が楽で便利です．


## 参考サイト
[How to add multiple terminal in VS Code?](https://stackoverflow.com/questions/43427631/how-to-add-multiple-terminal-in-vs-code)
RedHat Enterprise Linux 8にDNS（dnsmasq）を建てる

VMware ESXi 6.7.0 Update 2をハイパーバイザーとして使用しているが
検証用にvCenter Server Applianceを建ててみたくなった。

[VCSAの動作には6.0.0以降ではDNSが必須とのことなので](https://docs.vmware.com/jp/VMware-vSphere/6.0/com.vmware.vsphere.install.doc/GUID-1DD8E69C-4551-4C18-8698-7BFE01BEA8B7.html)
ESXi上のゲストOSRed Hat Enterprise Linux 8にDNSを建てる。
~~bindがめんどくさかったので~~今回はdnsmaqで建ててみる。
#そもそもdnsmaqって何？
dnsmaqについて全く知らなかったので調べてみると
小規模ネットワーク用のDNSサーバらしいです。
設定も簡単ぽいのでお家で簡単なDNSサーバ建てたい時は便利そう

http://www.thekelleys.org.uk/dnsmasq/doc.html
https://ja.wikipedia.org/wiki/Dnsmasq

#インストール
[こちらのサイト](https://server.etutsplus.com/dnsmasq-setup-internal-dns/)を参考にインストールしてみる。

```
[root@rhel8 ~]# yum install dnsmasq
Updating Subscription Management repositories.
Red Hat Enterprise Linux 8 for x86_64 - AppStre 3.5 kB/s | 4.5 kB     00:01    
Red Hat Enterprise Linux 8 for x86_64 - BaseOS   17 kB/s | 4.0 kB     00:00    
Package dnsmasq-2.79-4.el8.x86_64 is already installed.
依存関係が解決しました。
行うべきことはありません。
完了しました!
```

GUIサーバでインストールしたRHEL８にはじめから入っているみたいです。
設定ファイルの/etc/dnsmasq.confを編集します。
設定ファイルのコメントアウトを外すだけで最低限の動作はするようです。


```
/etc/dnsmasq.confから以下の項目のコメントアウトを外す、
local=とdomain＝の部分にはドメイン名を記載する。

[root@rhel8 ~]# vi /etc/dnsmasq.confdomain-needed
bogus-priv    →プライベートIPの逆引きは上位DNSに転送しない
local=/local.com/　→ローカルエリア内のドメインを指定
expand-hosts　　　　→正引きされた時、下記のdomain=で指定されたドメイン名を補完する。
domain=local.com
```

あとは/etc/hostsに
登録したいサーバのIP・FQDN・サーバ名を登録する。

```
[root@rhel8 ~]# vi /etc/hosts
192.168.1.12 rhel8.local.com server0１
192.168.1.13 vcsa.local.com server0２
```
最低限動かす設定は完了したのでファイアウォールを無効化してサービス起動させる。

```
[root@rhel8 ~]# systemctl stop firewalld
[root@rhel8 ~]# systemctl disable firewalld
[root@rhel8 ~]# systemctl start dnsmasq
[root@rhel8 ~]# systemctl enable dnsmasq
Created symlink /etc/systemd/system/multi-user.target.wants/dnsmasq.service → /usr/lib/systemd/system/dnsmasq.service.
```
がsystemctlでstatusを見ると以下のエラーでサービスが開始されない、、、

```
dnsmasq: failed to create listening socket for port 53: Address already in usek
```

色々調べた結果systemd-resolvedサービスがすでに５３番ポートで動いているようでエラーみたいだったので無効化します.(動的DNSを使うなら必要？)


```
[root@rhel8 ~]#systemctl disable systemd-resolved 
[root@rhel8 ~]#systemctl stop systemd-resolved
```

上記の設定後サービス再起動で使用できるようになりましたが
セキュリティ的には何の考慮もしていませんのであくまでローカル検証環境用です。
1分で作る!  API ConnectでスタブAPI

# はじめに

IBM API Connectは、外部へのAPIエンドポイントとして公開し、バックエンドシステムへリクエストを中継する使い方が一般的です。

API Connectでのアセンブリ(APIの動作定義)を開発中で、バックエンドシステムが利用できない時、スタブAPIを利用しテストを行いたいシーンがあります。

そんな時、API Connect上で簡単にスタブAPIを作成する方法をご紹介します。

# 環境

IBM CloudのAPI Connectサービス(2019.06時点)

# アセンブル定義

名前などのAPIの基本設定は省略し、さっそくアセンブルの定義方法を紹介します。

手順は、以下の２つです。

1. 変数の設定ポリシーを配置
1. 変数名(設定)フィールドに「message.body」、値フィールドにレスポンス値を設定

![assemble.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135384/4b512660-452d-cafe-501a-e555f829f863.png)


さらに、HTTPヘッダーを設定したい場合は、「message.headers.ヘッダー名」を設定します。
![HTTPHeader.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135384/9277d85d-94bd-666f-cf7c-ffddf06b1484.png)

# 動作確認

次に、このAPIの動作確認をしてみましょう。
アセンブリー画面にはテスト機能が備わっており、今回はこれを利用します。

まずはテスト機能の表示します。
![assemly-test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135384/dc5e0652-9bf3-58c7-8f5f-a82e79281fe3.png)

次に、このAPIを追加する製品を新規作成および公開(≒デプロイ)を行います。
<img width="400" alt="test-create-product.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135384/4c444b07-7efa-b6f3-cb14-4564100e165c.png">

動作確認の準備が整ったので、APIを実行してみましょう。
まず、操作(メソッド + 実行対象のAPIパス)を選択し、呼び出しを実行します。
<img width="400" alt="test-call.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135384/b5b220ee-192a-7b9a-7158-f2adb44fcab6.png">


レスポンスが表示されます。
HTTPヘッダーのContent-TypeとBodyにアセンブルで定義した内容がレスポンスされていることが分かります。
<img width="400" alt="test-result.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135384/02cef471-7bcd-5f52-0dba-50a8e91ebe7e.png">


# 最後に

API Connectでは、「message.body」、「message.headers」に、APIレスポンスを設定します。

これらの変数は、APICで、以下の順に設定され、最終的なAPIレスポンスとして採用されます。
クライアントから受信した値 => Invokeポリシーで呼びしたバックエンドからのレスポンスで上書き

今回、ご紹介した方法は、上記変数を「変数の設定ポリシー」で更新するという方法です。
WSL上で、Windowsのnpmを使ってしまう

# 問題
Windows10で使用できるUbuntu(WSL)で`npm`を使用すると、

```
: not foundram Files/nodejs/npm: 3
: /mnt/c/Program Files/nodejs/npm:: not foundram Files/nodejs/npm: 5
: /mnt/c/Program Files/nodejs/npm:/mnt/c/Program Files/nodejs/npm: 6
: /mnt/c/Program Files/nodejs/npm: Syntax error: word unexpected (expecting "in")
```

と出てしまう。

### 情報など
・Windows10 **Pro** 1809
・WSL Ubuntu 18.04.2 LTS
・`which npm` -> `/mnt/c/Program Files/nodejs/npm`

# 解決策
`vim ~/.bash_profile`に`PATH="$HOME/bin:$HOME/.local/bin:$PATH"`を書くだけ。
(zshの人は`~/.bash_profile`ではなく`~/.zshrc`)

反映のために`source ~/.bash_profile`を実行し、
確認のため`which npm`をすると`/home/USERNAME/.nodebrew/current/bin/npm`と返ってきた。
(nodebrewを使ってるため、使っていない方は違うフォルダが指定される可能性大です。)

`npm -v` -> `5.6.0`


# 参考
https://github.com/microsoft/WSL/issues/1512
gitでブランチ名を途中で変えたい時

#初めに
私のメモです。

1.現在のブランチ名で更新した内容に名前をつけて保存

```
$ git stash save "~"
```

2.ローカルリポジトリの更新　&&　更新したいブランチ名を記載

```
$ git fetch && git checkout ~
```
3.保存したstashを適応し削除

```
git stash pop　//popは削除で、applyは残す
```
[Laravel5.3]テスト用に仕込むMiddleware(備忘録)

# 前提
Laravel5.3のソースです。
備忘録代わりに投稿。

`AppBeforeMiddleware`と`AppAfterMiddleware`を新規作成して指定を追加

```php:app\Http\Middleware\AppBeforeMiddleware.php
<?php
namespace App\Http\Middleware;

use Closure;

class AppBeforeMiddleware
{
    public function handle($request, Closure $next, $guard = null)
    {
        // APP 開始時に実施する処理を記述
        logger()->info('- START -',[
            \IpCheckHelper::get(),
            $request->url(),
            $request->method(),
            $request->server("HTTP_USER_AGENT"),
            \Session::getId(),
            'memory start:'. memory_get_usage() / (1024 * 1024).'MB'
        ]);
        return $next($request);
    }
}
```

```php:app\Http\Middleware\AppAfterMiddleware.php
namespace App\Http\Middleware;

use Closure;

class AppAfterMiddleware
{
    public function handle($request, Closure $next, $guard = null)
    {
        $response = $next($request);
        // APP 終了時に実施する処理を記述
        logger()->info('- END   -',[
            \IpCheckHelper::get(),
            $request->url(),
            $request->method(),
            $request->server("HTTP_USER_AGENT"),
            \Session::getId(),
            'memory end:'. memory_get_peak_usage() / (1024 * 1024).'MB',
            'memory peak:'. memory_get_peak_usage() / (1024 * 1024).'MB'
        ]);
        return $response;
    }
}
```


```php:app\Http\Kernel.php
class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        //APP開始時の処理
        \App\Http\Middleware\AppBeforeMiddleware::class,

        //他のmiddlewareを記述

        //APP終了時の処理
        \App\Http\Middleware\AppAfterMiddleware::class,
    ];
```

仕込んだ状態である程度テストやってメモリ使用量のMAXを見極めるとか。
`\IpCheckHelper::get()`はELB経由とかの時のIP取得元振り分けとかをやっている共通部品です。
setData された Intent の Broadcast の 送受信

Broadcast で送信する Intent に setData() した場合、受信側の IntentFilter では、addDataScheme()/addDataAuthority() または、addDataType() を指定する必要があった。

**ファイルの URI を data にセットしてブロードキャストして、受信する例**

## URI のみ送信

#### 送信側

```kotlin
val intent = Intent(ACTION_DOWNLOADED)
intent.data = Uri.parse("file:///storage/emulated/0/downloadFile.zip")
sendBroadcast(intent)
```

#### 受信側

```kotlin
val intentFilter = IntentFilter(ACTION_DOWNLOADED)
intentFilter.addDataScheme("file") // スキーマでフィルタ
intentFilter.addDataAuthority("*", null) // ホスト/ポートでフィルタ ※実質フィルタしてない

registerReceiver(broadcastReceiver, intentFilter)
```

## URI と MIMEタイプ を送信

#### 送信側
```kotlin
val intent = Intent(ACTION_DOWNLOADED)
intent.data = Uri.parse("file:///storage/emulated/0/downloadFile.zip")
intent.type = "application/zip"
sendBroadcast(intent)
```

#### 受信側
```kotlin
val intentFilter = IntentFilter(ACTION_DOWNLOADED)
intentFilter.addDataType("application/zip") // MIMEタイプでフィルタ

registerReceiver(broadcastReceiver, intentFilter)
```

### 参考
- [android \- setData on intent prevents sendBroadcast from working? \- Stack Overflow](https://stackoverflow.com/questions/5220256/setdata-on-intent-prevents-sendbroadcast-from-working)
- [android \- How I can get the mime type of a file having its Uri? \- Stack Overflow](https://stackoverflow.com/questions/12473851/how-i-can-get-the-mime-type-of-a-file-having-its-uri)
- [MIME タイプの不完全な一覧 \- HTTP \| MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types)
Python dict, set練習問題[初級]

# 目的
Pythonの基本文法を得ること(初心者向け)

# 内容
Pythonにおけるdict(辞書)、set(集合)の練習問題。
簡単な解説付き。

# 練習問題一覧
- 課題1
    - 下のディクショナリ型のデータを使って、
    
```data = {"first": "Naomi", "family": "Osaka", "country": "Japan"}```

**条件**
1. print文で「Naomi Osaka」と出力してください。
2. for文を用いて、以下のように出力してください。


```
first : Naomi
family : Osaka
country : Japan
```
- 課題2
    - 下のa,b に関して、和集合、差集合、積(交わり)、排他的論理和(対象差)を
      出力してください。
    

```a = {1, 2, 3, 4, 5, 7, 9}
b = {0, 2, 4, 6, 7, 8}```

以上の問題です。頭の体操程度にやってみてください。

# 答え

　※答えは一例です。

- 課題1の答え

```python:dict.py
data_dict = {"first": "Naomi", "family": "Osaka", "country": "Japan"}

for key in data_dict:
  print(key,":",data_dict[key])
```
- 1行目 : 与えられた辞書
- 2行目 : 辞書のキーを取り出すループ
- 3行目 : ```data_dict[key]```で辞書の要素を取り出す

```
first : Naomi
family : Osaka
country : Japan
```
　求められていた答えと同じですね。では、課題2へ。

- 課題2の答え

```python:set.py
a = {1, 2, 3, 4, 5, 7, 9}
b = {0, 2, 4, 6, 7, 8}

# 和集合
a_b = a | b
print(a_b)

# 差集合
a_b = a - b
print(a_b)

# 積(交わり)
a_b = a & b
print(a_b)

# 排他的論理和
a_b = a ^ b
print(a_b)
```
　**演算子の簡単な説明**

- ```|演算子``` : 各setの重複しない要素を全て含んだ集合を得ることができる。
- ```-演算子``` : Aの要素から、Bに含まれる要素を取り除くことができる。
- ```&演算子``` : 両方に共通して含まれる要素だけを抜き出すことができる。
- ```^演算子``` : 両方に共通して含まれる要素だけを取り除いた、要素の集合を得ることができる。論理演算の排他的論理和(XOR)のような操作。

```
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
{1, 3, 5, 9}
{2, 4, 7}
{0, 1, 3, 5, 6, 8, 9}
```
のように表示されれば正解です。setで使う演算子はよく忘れる。。。

# 筆者のコメント
　TF-IDFについて勉強中。まとめているうちに混乱してきた。。。
[TreasureData]td workflow backfillコマンドをworkflow上で使いたかったがダメだった話

結局ダメだったので違う方法で実装した話。

# 使いたかった経緯
1. 集計元のRawDataは1日1回別システムからS3経由のDataConnectorでTreasureDataにimport。
2. 日次で1回動くworkflowで前日分のデータを集計。
3. 相手方のシステムが前日分データは次の日には入らない（何日か遅れる【不定】と言ってきた。）
4. 仕方がないのでworkflowで前7日分のデータを毎日再集計することに。
5. tdコマンドの `workflow backfill`使えば行けるんじゃね？という思いから調査してみたがどうにもworkflow上で動かない。
6. サポート問い合わせで「**それはできません。**」との回答をもらう。
7. 仕方がないので別な方法で対応した話。

# 最終的に実装した方法
backfillが使えればそのまま行けたのだけれどもdigファイルとsqlファイルを修正して対応。

対応方針：workflowでループ組んで1日分のtimestamp毎にfor_rangeで繰り返す。

```digdag:digファイル
+task1:
  for_range>:
    from: ${moment(session_time).add('days', -7).unix()}
    to: ${session_unixtime}
    step: 86400
  _do:
    +sub1:
      td>: analysis.sql
      insert_into: tmp_reporting
```

```sql:analysis.sql
SELECT 
  TD_TIME_FORMAT(${range.from}, 'yyyy-MM-dd', 'JST') AS aggregate_day,
  IF(
    SUM(sku_ex_vat) IS NULL,
    0,
    SUM(sku_ex_vat) AS bigint)
  ) AS sales_amount
FROM
  order_table
WHERE
  TD_TIME_RANGE(order_timestamp,
    TD_TIME_FORMAT(${range.from}, 'yyyy-MM-dd', 'JST'),
    TD_TIME_FORMAT(${range.to}, 'yyyy-MM-dd', 'JST'),
  'JST')
```

workflowでもっといろいろ出来るといいなー
ー初心者でもわかるエラー解決ー　Uncaught TypeError: $.ajax is not a function　の解決方法

#Uncaught TypeError: $.ajax is not a functionとは？

bootstrapを導入した上でjavascriptを使った非同期通信を実装しているときにエラーが発生しました。

```
#Uncaught TypeError: $.ajax is not a function
```
$.ajaxが使えない？jQuery入れてるのに？そんなバナナ、、、


見つけました。bootstrapで導入したjqueryがslim版だったため、ajaxの機能が使えなかったようです。

```
%script{crossorigin: "anonymous", integrity: "sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo", src: "https://code.jquery.com/jquery-3.3.1.slim.min.js"}
```

下記に変更したらエラー解決しました。
```
 %script{crossorigin: "anonymous", integrity: "sha384-3ceskX3iaEnIogmQchP8opvBy3Mi7Ce34nWjpBIwVTHfGYWQS9jwHDVRnpKKHJg7", src: "https://code.jquery.com/jquery-3.1.1.min.js"}
```