golangの自作パッケージインポートと環境変数

前書き

タイトルを見て分かる通り今回は結構初心者向けです。 こんなの言われなくても分かるよ!って人も多いかも知れませんが僕自身これで結構詰まったので備忘録として書いていきます。

環境

golangのバージョンは以下の通りです

$go version
go version go1.14.6 darwin/amd64

$go env 
GO111MODULE="on"

自作パッケージのimport

ファイル構造は以下のような感じです。

go/
 ├hello/
 │ ├ hello.go
 │ ├ go.mod
 │ └ go.sum
 │ └val/
 │    ├ sample.go
 │    ├ go.mod
 │    └ go.sum
 ├go.mod
 └ go.sum

ここでhello.goの中からsample.goを呼び出したい時以下のようにファイルを書いて下さい。

go/hello/go.mod

module local.com/hello-module

go 1.14

replace local.com/hello-module/val => ./val

module local.com/hello-module がローカルパッケージを使う方のパッケージ名
go 1.14がgoのバージョン
replace local.com/hello-module/val => ./valが左側のモジュールを、右に指定した相対パスに置き換えるように指定しています
またなんでモジュール名がlocal.com/hello-module/valのような名前になっているのかというと任意だがパスのルート部分(ドメイン名に該当する箇所)にドットが含まれている必要があるらしいです。URLみたいですね

そして最後にhello.goでimportしてあげれば完了です!

import local.com/hello-module/val

あとは好きなようにコードを書きましょう!!

環境変数

続いては環境変数について
今回使うのはenvconfigです。 環境変数は結構大事で間違えてgitにパスワードを載せてしまったりしないように(経験談)みんなも環境変数とgitignoreを使おうね
では例としてsample.goでenvconfigを使って環境変数を読み込む場合。実行ファイルであるhello.goと同じ階層に.envを置かないといけない。

go/
 ├hello/
 │ ├ hello.go
 │ ├ .env          ←new         
 │ ├ go.mod
 │ └ go.sum
 │ └val/
 │    ├ sample.go
 │    ├ go.mod
 │    └ go.sum
 ├go.mod
 └ go.sum

次に.envファイルの書き方として

#config 
export DBMS=mysql
export DBUSER=user
export PASS=passwd
export PROTOCOL=tcp(127.0.0.1:3306)
export DBNAME=db
export TIME="parseTime=true&loc=Asia%2FTokyo"

こんな感じで変数は全部大文字、値には""をつけてもつけなくてもいい。これをsample.goでどうやって読み込むか
以下に例をあげます。処理としてはgoでmysqlに接続してるだけ

sample.go

package val

import (    
    "github.com/jinzhu/gorm"
    "github.com/kelseyhightower/envconfig"
    "github.com/joho/godotenv"
    "log"
    // MySQL driver
    _ "github.com/jinzhu/gorm/dialects/mysql"
    "fmt"
)

//Config DBに関する情報
type Config struct {
  Dbms     string `required:"true"`
  Dbuser     string `required:"true"`
  Pass     string `required:"true"`
  Protocol string `required:"true"`
  Dbname   string `required:"true"`
  Time     string `required:"true"`
}

//GormConnect データベースの情報を記載/接続
func GormConnect() *gorm.DB {
    doterr := godotenv.Load()
    if doterr != nil {
      log.Fatal("Error loading .env file")
    }

    var config Config
    config_err := envconfig.Process("", &config)
    fmt.Println(config)
    if config_err != nil {
      log.Fatal(config_err.Error())
    }

    CONNECT := config.Dbuser+":"+config.Pass+"@"+config.Protocol+"/"+config.Dbname+"?"+config.Time
    //データベースに接続
    db,err := gorm.Open(config.Dbms, CONNECT)
  
    if err != nil {
      panic(err.Error())
    }
    return db
  }

変数は戦闘だけ大文字であとはstructで型を指定したらよしなにやってくれます。

メール認証の実装方法を考えた

今回はメール認証を実装していきたいと思います。

実装内容

イメージとしてはこんな感じ

f:id:oruta-12638:20201014151751p:plain



まず最初に、クライアントからメールアドレスを受け取ったら生成した認証コードとメールアドレスを仮のDBに保存する。
次に入力されたメールアドレスに対して認証コードを記載したメールを送る。
クライアントは受け取った認証コードを入力する。
その後仮DBにあるかの判定を行い、不備があったらエラーを返し、正常ならトークンを生成して本番DBに格納した後クライアントに対して発行する。

その後、、、

認証しただけではなんの意味もない。その後登録したユーザーに対して発行されたトークンからログインしないといけない。
それを実装する手法としてOAuth認証というものがあるそう。今度はそれについて調べて書いていきたい。

AWSハンズオン感想

先日とある企業のイベントに参加したのでその感想だったりやったことを書き留めていこうと思います。

やったこと

まず内容として

  1. サーバー構築
  2. ミドルウェアのインストール 2.5. MySQLの起動(エラーログを見よう)
  3. ミドルウェアに負荷をかけてみる
  4. SQLをチューニングしてみる
  5. サーバーの消去 です。
サーバー構築

まず最初のサーバー構築ですがAWSインスタンスを生成しただけなのでここでは省略します。

ミドルウェアのインストール

今回はmemcachedというミドルウェアを使ったのですが正直ここはあまり理解できませんでした。なので後日触る機会があればちゃんとまとめます。

MySQLの起動(エラーログを見よう)

イベント主催側がMySQLの設定ファイルの値をわざと変更して起動できないようになっていました。ここからエラーログを見て値を正常値に戻して起動させてみ用途いう問題。

ミドルウェアに負荷をかけてみる

ここではmemslapコマンドを使ってミドルウェアに負荷をかけていた。実際にどのくらいcpuを使っているのか、実行までどれくらい時間がかかるかを測定しました。

SQLをチューニングしてみる

最後にチューニングですがここではSQL文が7つ用意されておりそれぞれ実行時間を省略するようにチューミングをするという問題。 問題1~6はそれぞれindexをつけることで実行時間が1秒をきり最後の問題はデータ全部を参照するようになっていてMySQLのキャッシュを有効にすることで速度が上がった。

感想

今回のハンズオンは一応授業でやったことのある知識が出てきたがなんと言うか授業でやる時と楽しさが全然違った。 当時は意味も分からずやっていた作業も実際にどう使われているのかを知ることでやる気も出た。

物語シリーズグッズ買ったぜ(久々の更新)

まじで更新忘れてましたー。

はてなブログって一ヶ月更新がなかったら通知がくるんですね。

いい機会なんで適当に呟きますよー

 

本題なんですがsupergroupiesという企業から物語シリーズのコラボグッズが売っていました。

 

今回コラボしたキャラは物語シリーズの主人公である阿良々木暦、メインヒロインの戦場ヶ原ひたぎ、主人公のパートナーであり吸血鬼の忍野忍八九寺真宵斧乃木余接たちですね。 

コラボ商品はそれぞれのキャラをモデルにして腕時計、財布、鞄が出てます。

f:id:oruta-12638:20200728212919p:plain

https://www.super-groupies.com/feature/monogatari_01_watch?utm_source=twitter&utm_medium=social&utm_campaign=20200707monogatari#shinobuより出典

忍野忍モデル

私はこの中でも忍野忍が一番好きなんですけど少しデザインが派手というか私の好みではなかったです、、、

しかし忍野忍の金髪をモチーフにしたデザイン、財布の内装は忍野忍の好物であるドーナツをモチーフにしておりファンとしてはとても良いと思います。

f:id:oruta-12638:20200728213925p:plain

 

斧乃木余接モデル

そこで他キャラの商品を見ていたんですがとっても良いデザインの財布がありました。

f:id:oruta-12638:20200728214841p:plain

f:id:oruta-12638:20200728214905p:plain

それは斧乃木余接の財布ですね。ブラックの生地にトレードマークである頭の上の人形の装飾がされておりパッと見てもアニメグッズとは思わないでしょう。

内装は斧乃木余接の神の色であるミント色、オレンジ色を使っており色合いがとても綺麗です。

 

早くこの財布を使って買い物してみたですね〜

nignxでphpを動かしてみる(前回の続き)

今回は前回にインストールしたphp,php-fpm,nginxを使ってphpを実行してみたいと思う。

phpとnginxの連携

参考文献
www.spiceworks.co.jp

上記のサイトで書かれているが、ngixでphpを動かすにはcgiがプログラムを動かすように設定する必要があります。
ここで登場するのがphp-fpmでありこれはphp-FastCGI Process Managerの略でありcgiです。

そもそもcgiとは

HTTPはステートレスなプロトコルであり、ただユーザーが指定した静的なファイル(HTML)を呼び出すと言う機能しかありません。
そのため、サーバー上でプログラムを動作させるために必要な仕組みとしてcgiがあります。
cgiの処理の流れとしては以下の様になる。

  1. クライアントがサーバーに対してファイルを要求する。
  2. サーバーはcgiを起動させプログラムを処理する。
  3. その結果をクライアントに渡す。

php-fpmはFastCGIぞ?

FastCGIとはCGIの問題点を解決したものらしいですね。
CGIはリクエストのたびにプロセスを起動しそれが終わったら終了させています。この場合起動、終了に時間がかかったりサーバーに負荷がかかります。そのためFastGCIはリクエスト毎に新しいプロセスを作成するのではなく永続的なプロセスを利用してリクエストの処理をします。
つまり前回紹介したphp-fpmの起動コマンドはphpファイルを実行させるために必要なコマンドだったってことですね

因みに

php-fpmの設定

/etc/php-fpm.d/www.confファイルを開こう。デフォルトだとuser,group,listenの欄がapacheにowner,listen.groupの欄がnobodyになってると思う。
ここを両方nginxに変えてあげよう。ポート接続からソケット接続に変更してあげよう。listen = 127.0.0.1:9000となっているところを/var/run/php-fpm/php-fpm.sockに変えたらおk。

user = nginx
group = nginx

listen = /var/run/php-fpm/php-fpm.sock

listen.owner = nginx
listen.group = nginx

nginxの設定

/etc/nginx/nginx.confファイルで以下のコードがコメントアウトされていると思う。なのでコメントアウトを取ってあげよう。

location ~ \.php$ {
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

またデフォルトではnginxのドキュメントルートは/usr/share/nginx/htmlとなっているが今回は/var/www/に変更してみた。

location / {
        root     /var/www;
        index    index.html index.htm index.php;
        try_files $uri $uri/ /index.php?$args;
    }

最後にphp-fpmとnginxを起動させさっき設定したドキュメントルートにphpファイルをおけば完了。
phpinfoを置くのが多いらしいので私もphpinfoを置いてみました。

ブラウザで[http//:ipアドレス]に接続して表示されたら終了です!

centos7にphp,php-fpmとnginx,(MySQL)を入れて動作確認(下準備)

今回は授業でサーバーを借りて、Nginx+MySQLを利用してWordPressを構築し公開と言う課題がでたのでそのした準備をまとめてみた。
基本最新バージョンをインストールする。

まずcentosのバージョン確認

cat /etc/redhat-releaseコマンドを利用してosのバージョンを確認
CentOS Linux release 7.7.1908 (Core)

とりあえずphpインストール

参考サイト
deep-blog.jp
ここでは一度remiリポジトリをインストールしてからphpをインストールしている。
その理由としてcentosの標準リポジトリではphp5系をインストールしてしまうからである。

 yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm 

osによってコマンドの数字が変わってくるが今回はver7なので7となってる。

次にphpをインストール今回はphp7.4をインストールした。さらにライブラリも一緒にインストールした。

yum -y install --enablerepo=remi,remi-php74 php php-devel php-mbstring php-pdo php-mysql php-gd php-xml php-mcrypt 

ちゃんとインストールされているか確認しよう

# php -v
PHP 7.4.7 (cli) (built: Jun  9 2020 10:57:17) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies 

php-fpm

参考文献
CentOS 7にPHP-FPM 7.4をインストール(Remi's RPM repository) - Qiita

php-fpmをインストールする。以下のコマンドでインストール可能
yum install -y --enablerepo=remi-php74 php-fpm which

phpはこれでおk

nginxのインストール

参考文献
qiita.com

centosのベースリポジトリにはnginxがないので最初にレポジトリ作成から行う。

sudo vi /etc/yum.repos.d/nginx.repo

このコマンドでファイルを作成し、以下の内容を書き込む。

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

nginxのインストールコマンドは

sudo yum install nginx

バージョン確認

nginx version: nginx/1.19.0

centosでの起動、停止のコマンド
sudoは忘れない様に

//起動コマンド
sudo systemctl start nginx
//停止コマンド
sudo systemctl stop nginx

MySQLのインストール

参考文献
qiita.com

例のごとくmysqlリポジトリcentosのベースリポジトリにはないのでMySQLの公式が公開してるリポジトリを追加する。
以下のコマンドでrpmファイルをインストールする。

yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

/etc/yum.repos.d配下にmysql-community-source.repoとmysql-community.repoがあるか確認、こいつらがあればリポジトリはおk。

MySQLのインストールは

yum info mysql-community-server

バージョン確認

#mysql -version
mysqld  Ver 5.7.30 for Linux on x86_64 (MySQL Community Server (GPL))

wordpress

wgetコマンドを使って公式サイトからファイルをダウンロードするため最初にwgetコマンドが使えるか確認する。

yum list installed | grep wget

ここでなにも表示されなかったら

yum install wget

でインストールしておこう。
できたら次にwgetコマンドを使ってファイルをインストール。ここでwordpressディレクトリを展開したい場所で作業すると後々楽。

wget https://ja.wordpress.org/latest-ja.tar.gz

ファイルを解凍。

tar xzf latest-ja.tar.gz

デドバを始めるならswitchはやめた方がいいかも

タイトルをみて察した人もいるだろうがDead by Daylight(デッドバイデイライト)についての記事を書いていく。
以下よりDead by Daylight(デッドバイデイライト)をデドバと略しています。

まず今回のお題は『switchはデドバを快適にプレイできるだけのスペックがあるのか』と言うことを話そうと考えている。

と言うのも、私自身かなりswitch版のデドバをプレイしているのだがラグや動きのもっさり感に不満を感じていた。そんな中pc版はswitchと比較にならないほど快適と聞いた。そこでpc版を購入し実際にプレイした時その差に驚いたので少し調べてみようと思い立ったわけだ。

軽〜くデドバの歴史について調べてみた。

引用元
ja.wikipedia.org

PC版は2016年6月に発売され、
PS4版、Xbox One版は2017年6月23日に発売、日本国内ではPS4版が2018年4月4日に発売
switch版は2019年9月24日に発売。



パソコン版デドバの要求スペック

引用元
store.steampowered.com

このサイトによるとデドバの最低動作環境と推奨動作環境は以下の様になっている。

最低 推奨
OS 64-bit Operating Systems (Windows 7, Windows 8.1) 64-bit Operating Systems (Windows 7, Windows 8.1 or above)
プロセッサ Intel Core i3-4170 or AMD FX-8120 Intel Core i3-4170 or AMD FX-8300 or higher
モリー 8 GB RAM 8 GB RAM
グラフィック DX11 Compatible GeForce GTX 460 1GB or AMD HD 6850 1GB DX11 Compatible GeForce 760 or AMD HD 8800 or higher with 4GB of RAM
ストレージ 25 GB 利用可能 25 GB 利用可能

※一部省略

switch自体のスペック(非公式)

引用元
ja.wikipedia.org

CPU ARM Cortex-A57 4コア+ARM Cortex-A53 4コア
メモリ 4GBのLPDDR4
GPU 第2世代MaxwellアーキテクチャのCUDAコア
ストレージ 32GB

比べてみよう

PC版のデドバの最低/要求スペックとswitchのスペックを比べるのはどうかと思うが、一応同じゲームだしそんなに軽量化できるのかって思うから比べてみた。

プロセッサ(CPU)性能

CPUには大きく分けて「制御」と「演算」の2つの機能処理を行っている。そのため、CPUの性能が高ければ高いほどパソコンはサクサク動く。

ARM Cortex-A57 4コア+ARM Cortex-A53 4コア Core i3-4170
コア数 8コア 2コア
動作周波数 1GHz 3.70HGz

コア数が多いほど同時に多くの処理が行える。switchはCortex-A57 4コア+ARM Cortex-A53 4コアで8コアとなっており
Cortex-A57がメイン処理を担い、Cortex-A53は省電力で負荷の小さい処理を行うように役割分担している様だ。

対してCore i3-4170は2コアである。

次は動作周波数だが数値が高いほど処理速度が高く実行能力が高くなる。
switchの1GHzに対してCore i3-4170は3.70HGzとなっておりCPU自体の性能はそこまで変わらない様に見える。

グラフィック(GPU)性能

第2世代MaxwellアーキテクチャのCUDAコア DX11 Compatible GeForce GTX 460 1GB
FLOPS 157.2GFLOPS(ドック時393.2GFLOPS) 907.2GFLOPS

FLOPSはFLOPSは1秒間に何回浮動小数点数演算ができるかの単位で、どの程度のポリゴン数を1秒間何フレーム描画できるかを表す。
これも高ければ高いほど良い。

switch版とPCを比較した際およそ三倍もの差がみられる。

メモリ

メモリはよく机の広さに例えられる、CPUで処理する情報を貯めておく領域の広さのことを示す。これも大きければ大きいほどよい。
switchは4GBに対してPCは8GBである。

全体的に見て

あくまでこれらの比較はswitch版デドバの要求スペックがPC版の要求スペックと同程度と言う前提のもとで成り立っている。だが同じゲームだしそこまで変わらんだろ(適当)と割り切って書くことにした。

さらに、switchはFPS(フレームレート)が30FPSしかなく無線環境が多いのでそれらの要因もラグを生んでいると思う。