フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

WSL上でHerokuのgolangを動かす

はじめに

  • golangを無料で動かせるサーバーを探していたらherokuがあったので、heroku上でgolangを動かしてみる。

  • 下記のページを参考に作業を進める devcenter.heroku.com

前提条件

  • wslのubuntu環境にて作業を行う
  • すでにherokuでアカウント作成している状態

ローカル環境

  • herokuのcliを下記のコマンドインストールする
curl https://cli-assets.heroku.com/install.sh | sh
  • herokuにログインする
heroku login
  • 下記のページを参考にgolangプロジェクトのひな形をクローンする devcenter.heroku.com

  • 下記のコマンドを一通り実行するとgit cloneしてきたgolangプロジェクトがherokuにgolangのソースがデプロイされる

git clone https://github.com/heroku/go-getting-started.git
cd go-getting-started
heroku create
git push heroku main
package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"   
    "log"
    "os"
    "github.com/gin-gonic/gin"
    _ "github.com/heroku/x/hmetrics/onload"
)

func main() {
    port := os.Getenv("PORT")

    if port == "" {
        log.Fatal("$PORT must be set")
    }

    router := gin.New()
    router.Use(gin.Logger())
    router.LoadHTMLGlob("templates/*.tmpl.html")
    router.Static("/static", "static")

    router.GET("/", func(c *gin.Context) {
        c.HTML(http.StatusOK, "index.tmpl.html", nil)
    })

    router.Run(":" + port)
}

google colabでサイト監視して条件にあったらBeep音で知らせる

はじめに

  • 一時的に、とあるサイトを監視して、ある条件になったら音で知らせるというサンプルを作成しました。

インストールするパッケージ

!pip install requests
!pip install time
!pip install tkinter 

サンプルコード

import time
import requests
from google.colab import output

## 3時間とあるサイトをチェックする
for i in range(0, 180, 1):
    ## 1分おきにリクエストを投げる
    time.sleep(60)
    response = requests.get('https://<あなたのチェックしたいサイト>')
    if (response.status_code == 200):
      print("問題なし")
    else:
      ## 問題あったときに音を出す
      output.eval_js('new Audio("https://upload.wikimedia.org/wikipedia/commons/0/05/Beep-09.ogg").play()')
    print(i, "分経過")

参考記事

stackoverflow.com

WSL/ubuntuにpython/golangをインストールしてローカル環境でvercelの開発をする

はじめに

  • vercelでserverless functionが利用できるようになっていたので、ローカルで少し動かしてみる。PythonGolangRuby、Nodeも使えるらしい。 vercel.com

  • serverless functionは利用できるがメモリなどの制限があるため、何か簡単な処理か、どうしてもサーバー側で処理しないといけないものにとどめておいた方がよさそう。果たしてそんな処理があるのか・・・。 vercel.com

WSL/ ubunts環境にgolangPythonをインストール

golangのインストール

$ sudo add-apt-repository ppa:longsleep/golang-backports
$ sudo apt update
$ sudo apt install golang
$ go version

pythonをインストール

1.下記のサイトからソースファイルをダウンロードする。
https://www.python.org/downloads/source/

2.下記のようにエクスプローラーから直接ダウンロードしたファイルをwsl環境の好きな場所に配置する
[f:id:PX-WING:20211028083247p:plain]

3.下記のコマンドを実行する

tar xf Python-3.10.0.tgz
 cd Python-3.10.0/
./configure
 make
 make install
  • vercelのAPIフォルダにgoとpythonのファイルを設置する f:id:PX-WING:20211030113452p:plain

設置したファイルの中身

golang

  • vercelでプロジェクト作成したときにdefaultで作成されるファイル
package handler

import (
    "fmt"
    "net/http"
    "time"
)

func Handler(w http.ResponseWriter, r *http.Request) {
    currentTime := time.Now().Format(time.RFC850)
    fmt.Fprintf(w, currentTime)
}

python

  • api/index.pyファイルの中身は下記のように記述する
from http.server import BaseHTTPRequestHandler
from urllib import parse
class handler(BaseHTTPRequestHandler):
    def do_GET(self):
        s = self.path
        dic = dict(parse.parse_qsl(parse.urlsplit(s).query))
        self.send_response(200)
        self.send_header('Content-type','text/plain')
        self.end_headers()
        if "name" in dic:
            message = "Hello, " + dic["name"] + "!"
        else:
            message = "Hello, stranger!"
        self.wfile.write(message.encode())
        return  

React側の呼び出し

import React from 'react';
import { useEffect, useState } from 'react';
import './App.css';

function App() {
  const [date, setDate] = useState(null);
  const [message, setMessage] = useState('');
  useEffect(() => {
    async function getDate() {
      // GoのAPIの呼び出す
      const res = await fetch('/api/date');
      const newDate = await res.text();
      // PythonのAPIを呼び出す
      const res2 = await fetch('/api/index');
      const newMessage = await res2.text();
      setDate(newDate);
      setMessage(newMessage);
    }
    getDate();
  }, []);
  return (
    <main>
      <h1>Create React App + Go And Pytho API</h1>
      <br />
      <h2>The date according to Go is:</h2>
      <p>{date ? date : 'Loading date...'}</p>
      <h2>The Message according to Python is:</h2>
      <p>{message ? message : 'Loading date...'}</p>
    </main>
  );
}

export default App;

実行結果

f:id:PX-WING:20211030113756p:plain

AIに必要な数学の勉強メモ⑥

分散

  • 数値データのばらつき具合を表すための指標
  • ある一つの群の数値データにおいて、平均値と個々のデータの差の2乗の平均を求めることによって計算

 v=\frac{1}{n} \sum_{k=1}^{n} (x_k-u)^{2}

分散の求め方

x= np.array([55,45,60,40])
print(np.var(x))

標準偏差

 \sqrt{v}=\sqrt{\frac{1}{n} \sum_{k=1}^{n} (x_k-u)^{2}}

  • すべてのデータを使った、ばらつきを示す値(散らばりの度合い)
x= np.array([55,45,60,40])
print(np.std(x))

【高校 数学Ⅰ】 データ分析11 標準偏差とは? (11分) - YouTube

正規分布

  • 「ありふれた」「通常の」確率分布です
  • ガウス分布と呼ばれることもある

※確率分布

【高校数学】 数B-102 確率分布と確率変数② - YouTube

正規分布

標準化とは

https://www.youtube.com/watch?v=fAFAn3XgMfE https://www.youtube.com/watch?v=wQFY1fnpYcM&t=360s

AIに必要な数学の勉強メモ⑤

確率とは

  • ある現象がおきることが期待される度合いのこと

 P(A) = \frac{a}{n}

 P(A)は事象 Aが起きる確率、aは事象 Aが起きる場合の数、nはすべての場合の数となる。

 P(\bar{A}) = 1 - P(A)

確率への収束

  • 事象の発生数 / 試行数が確率に収束する
  •  \frac{1}{2}の確率の収束のサンプル
x= []
y=[]
total = 0 # 試行数
num_front = 0 # 事象の発生回数
n = 5000 # 実行回数
for i in range(n):
  if np.random.randint(2) == 0:
    num_front += 1
  total += 1
  x.append(i)
  y.append(num_front/total)

plt.plot(x,y)
plt.plot(x, [1/2]*n)
plt.show()

平均値

x = np.array([55,60,45,35])
print(np.average(x))

期待値とは

  • 1回の試行で得られる値の平均値のことで、得られうるすべての値とそれが起こる確率の積を足し合わせたもの。
p = np.array([0.75,0.23,0.02]) # 確率
x = np.array([100,500,10000]) # 値
print(np.sum(p*x))

AIに必要な数学の勉強メモ④

連鎖律

  • 複数の関数が合成された合成関数を微分するとき、その導関数がそれぞれの導関数の積で与えられるという関係式のこと。(Wikipediaから引用)

 \frac{dy}{dx} = \frac{dy}{du} \frac{du}{dx}

導関数 f`(x)

ex) f(x) = x2の導入関数f`(x)を求める

 \frac{1}{h} (x+h)2 -x2

 \frac{1}{h} 2xh + h2 = 2x + h

 f(`x) = \lim_{n \to 0} (2xh) = 2x + 0 = 2x

Answer:2x

合成関数

ex)

関数 y = (x2 + 1)3 はuを挟んだ合成関数にすると

y = u3

u = x2 + 1

合成関数の導関数を連鎖律を使って求める方法

y=(x2+4x+1)4

解答

u=x2 + 4x + 1 →u=2x+4

y = u4 →y=4u3

y=4(x2 + 4x + 1)3(2x+4)

偏微分

  • 多変数関数を1つの変数により微分する
  • 複数の変数をもつ関数に対する1つの変数のみによる微分偏微分という。

例題

2変数関数をx及びyで偏微分する

f(x, y) = 2x3 + 4x2y + xy2 - 4y2

 \frac{∂}{∂x}f(x,y)=6x2+8xy+y2

 \frac{∂}{∂y}f(x,y)=4x2+xy-8y

微分

  • 多変数関数の微小変化を全ての変数の微小変化により求める

今日はここまで

本日はpythonのコードを1つも書いていない

AIに必要な数学の勉強メモ③

線形変換

  • 線形変換により、ベクトルを変換します。
  • ベクトルからベクトルへの変換を線形変換という

基底とは

  • 座標系を作りだす一次独立なベクトルの集まり

ベクトル空間

  • 基底によって構成される座標系

標準基底

  • 直交座標系の各軸方向に向かう単位ベクトルからなるユークリッド空間の基底を言う
import numpy as np

a = np.array([2, 3])  # 変換前のベクトル
A = np.array([[1, -1],
              [2, -1]])
b = np.dot(A, a)      # 線形変換

固有値固有ベクトルの求め方

a = np.array([[3, 1],
              [2, 4]])

ev = np.linalg.eig(a)
print(ev[0])  # 固有値
print(ev[1])  # 固有ベクトル(単位ベクトル)

極限

  • 関数における変数の値をある値に近づけるとき、関数の値が限りなく近づく値

微分

関数y=f(x)において、$x$の微小な変化量を  \Delta x とすると、xを \Delta xだけ変化させた際のyの値は次のようになります。

導関数

 f'(x)= \displaystyle \lim_{h \to 0} \frac{f(x+h)-f(x)}{h}

微分

  • 1変数関数に対する微分

勾配

  • xに対するyの変化の割合

接線の求め方

  • 関数 f(x)=3x2+4x-5の  x=1 における接線
import numpy as np

def my_func(x):
    return 3*x**2 + 4*x - 5

def my_func_dif(x):  # 導関数
    return 6*x + 4

x = np.linspace(-3, 3)
y = my_func(x)

a = 1
y_t = my_func_dif(a)*x + my_func(a) - my_func_dif(a)*a  # x=1のときの接線