Linux(Red Hat系) に MySQL コマンドを入れる

f:id:pigggg:20210913124341p:plain

mysql clientのインストール方法

 

リポジトリを追加する。

rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

 

確認

yum repolist enabled | grep mysql

mysql-connectors-community/x86_64     MySQL Connectors Community          167+45
mysql-tools-community/x86_64          MySQL Tools Community                  132
mysql80-community/x86_64              MySQL 8.0 Community Server             283

 

mysql clientを検索

Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
45 packages excluded due to repository priority protections
=======N/S matched: mysql-community-client =======
mysql-community-client.i686 : MySQL database client applications and tools
mysql-community-client.x86_64 : MySQL database client applications and tools
mysql-community-client-plugins.i686 : Shared plugins for MySQL client applications
mysql-community-client-plugins.x86_64 : Shared plugins for MySQL client applications

  Name and summary matches only, use "search all" for everything.

 

MySQL client install

yum install -y mysql-community-client

 

適当にコマンド

mysql --version
mysql  Ver 8.0.26 for Linux on x86_64 (MySQL Community Server - GPL)

Vegetaで負荷試験シナリオを作る(初歩)

f:id:pigggg:20210907205647p:plain

パクリ元

rarejob-tech-dept.hatenablog.com 基本的にここのパクリ

実装

main.go

package main

import (
    "context"
    "encoding/json"
    "flag"
    "os"
    "sync"
    "time"

    log "github.com/sirupsen/logrus"
    vegeta "github.com/tsenart/vegeta/lib"

    "github.com/hogehoge/hoge"
)

func main() {
    var (
        rate     = flag.Int("rate", 10, "Number of requests per time unit [0 = infinity] (default 10/1s)")
        duration = flag.Int("duration", 10, "Duration of the test [0 = forever]")
    )
    flag.Parse()

    rt := vegeta.Rate{Freq: *rate, Per: time.Second}
    dur := time.Duration(*duration) * time.Second

    count := int64(*rate)
    targeter, err := hoge.NewUserTargets(count)
    if err != nil {
        log.Fatal(err)
    }

    var metrics MetricsMutex
    var wg sync.WaitGroup

    wg.Add(1)
    go func() {
        defer wg.Done()
        for res := range vegeta.NewAttacker().Attack(targeter, rt, dur, "load_test") {
            // 全アカウント分終了すると空の結果が返るのでそれはMetricsに含めないようにする
            if res == nil || res.Error == vegeta.ErrNoTargets.Error() {
                continue
            }
            metrics.Lock()
            metrics.Add(res)
            metrics.Unlock()
        }
    }()

    wg.Wait()
    metrics.Close()

    b, err := json.Marshal(metrics)
    if err != nil {
        log.Fatal(err)
    }

    os.Stdout.Write(b)
}

type MetricsMutex struct {
    sync.Mutex
    vegeta.Metrics
}

 
user.go

package hoge

import (
    "encoding/json"
    vegeta "github.com/tsenart/vegeta/lib"
    "net/http"
    "strconv"
    "sync"
)


func CreateUserTargets(targetCount int64) ([]*UserTarget, error) {

    header := map[string][]string{
        "Content-Type": {"application/json"},
    }

    var userTargets []*UserTarget
    index := int64(0)
    for {
        if index == targetCount {
            break
        }

        // user_id を投げつけるだけのPOSTリクエスト
        user := User{
            UserId: strconv.FormatInt(index+1, 10),
        }

        var err error
        var body []byte
        if body, err = json.Marshal(user); err != nil {
            return nil, err
        }

        bean := &UserTarget{
            Method: http.MethodPost,
            URL:    "http://localhost:8080/api/hogehoge",
            Body:   body,
            Header: header,
        }
        userTargets = append(userTargets, bean)
        index++
    }

    return userTargets, nil
}

func NewUserTargets(targetCount int64) (vegeta.Targeter, error) {
    userTargets, err := CreateUserTargets(targetCount)
    if err != nil {
        panic(err)
    }

    var (
        index int
        mu sync.Mutex
    )

    return func(tgt *vegeta.Target) error {
        mu.Lock()
        defer mu.Unlock()

        defer func() {
            index++
        }()

        if index >= len(userTargets) {
            return vegeta.ErrNoTargets
        }

        target := userTargets[index]
        tgt.Method = target.Method
        tgt.URL = target.URL
        tgt.Header = target.Header
        tgt.Body = target.Body

        return nil
    }, nil
}

type User struct {
    UserId string `json:"user_id"`
}

type UserTarget struct {
    Method string
    URL    string
    Header http.Header
    Body   []byte
}

 

Result

{
    "latencies": {
        // Total は、攻撃におけるすべてのリクエストのレイテンシーの合計です。
        "total": 210145759,
        // Meanは、リクエストの平均レイテンシーです。
        "mean": 21014575,
        // P50は、50パーセンタイルのリクエストレイテンシーです。
        "50th": 19912375,
        // P95は、95パーセンタイルのリクエストレイテンシーです。
        "95th": 30986404,
        // P99は、99パーセンタイルのリクエストレイテンシーです。
        "99th": 30986404,
        // Maxは、観測されたリクエストの最大レイテンシーです。
        "max": 30986404
    },
    // BytesInには、計算された受信バイトメトリクスが格納されます。
    "bytes_in": {
        // Totalは、攻撃におけるフローイングバイトの総数です。
        "total": 1771,
        // Meanは、1ヒットあたりのフローイングバイト数の平均値。
        "mean": 177.1
    },
    // BytesOutには、計算された送信バイトメトリクスが格納されます。
    "bytes_out": {
        // Totalは、攻撃におけるフローイングバイトの総数です。
        "total": 151,
        // Meanは、1ヒットあたりのフローイングバイト数の平均値
        "mean": 15.1
    },
    // Earliest は、結果セットの中で最も古いタイムスタンプです。
    "earliest": "2021-09-07T17:49:43.85985934+09:00",
    // Latest は、Result set の最新のタイムスタンプです。
    "latest": "2021-09-07T17:49:44.75820043+09:00",
    // Endは、Result setの最新のタイムスタンプにレイテンシーを加えたものです。
    "end": "2021-09-07T17:49:44.778052431+09:00",
    // Durationは、攻撃の継続時間です。
    "duration": 898341090,
    // 待ち時間は、ターゲットからの回答を待つ余分な時間です。
    "wait": 19852001,
    // Requestsは、実行されたリクエストの総数です。
    "requests": 10,
    // Rateは、1秒間に送信されるリクエストの割合です。
    "rate": 11.131629301293566,
    // スループットとは、1秒間に成功したリクエストの割合です。
    "throughput": 10.89095539709305,
    // 成功とは、エラーにならなかった回答の割合です。
    "success": 1,
    // StatusCodesは、回答のステータスコードのヒストグラムです。
    "status_codes": {
        "200": 10
    },
    // Errorsは、攻撃時にターゲットから返されるユニークなエラーのセットです。
    "errors": []
}

Latencyの単位がいまいちわからない。秒数的にns??
nsにすると異常に短いのもあるが…

Vegeta触ってみる

f:id:pigggg:20210903191346p:plain

Vegeta

Install

╰─$ brew update && brew install vegeta

 

Run

10request/sec を 5秒間行う

╰─$ echo "GET https://hogehoge.com" | vegeta attack -rate=10 -duration=5s | tee result.bin

 

Result

╰─$ vegeta report result.bin

Requests      [total, rate, throughput]         50, 10.20, 10.16
Duration      [total, attack, wait]             4.921s, 4.903s, 18.422ms
Latencies     [min, mean, 50, 90, 95, 99, max]  15.858ms, 28.547ms, 19.547ms, 31.033ms, 41.625ms, 240.18ms, 240.18ms
Bytes In      [total, mean]                     0, 0.00
Bytes Out     [total, mean]                     0, 0.00
Success       [ratio]                           100.00%
Status Codes  [code:count]                      200:50
Error Set:

 

Result(html形式)

cat result.bin | vegeta plot > result_plot.html

f:id:pigggg:20210903191415p:plain

elementary OS 導入時メモ

f:id:pigggg:20210515015607j:plain

elementary OS 導入メモ

  • 日本語打てない問題
  • クラッシュ頻発問題
  • 再起動かけるとBluetoothが切れる問題
  • LINE入れる
  • Skype入れる
  • git を入れる
  • deepl を入れる
  • Steam入れる
  • ApexをするためにLutris入れる
  • 急に音声(Output)がでなくなった

medium.com

日本語打てない問題

qiita.com

クラッシュ頻発問題

GeForce GTX 1070 を使っているのですがNVIDIAのDriverを入れてないため起きていたようです。 linustechtips.com

再起動かけるとBluetoothが切れる問題

解決策はこちら https://www.10yendama.com/archives/5265

sudo rmmod btusb && sudo rmmod btintel && sudo modprobe btsub && sudo modprobe btintel && sudo systemctl reboot

これをやったのですが下記エラー

$ sudo rmmod btusb && sudo rmmod btintel && sudo modprobe btsub && sudo modprobe btintel && sudo systemctl reboot
rmmod: ERROR: Module btusb is not currently loaded

とりあえずbluemanを入れると良いらしいということなので
pc.shigizemi.com 解決

LINE入れる

LINEはlinuxに対応していないので、ChromeのExtentionで解決したほうが良いよということでした。 askubuntu.com  

Skype入れる

linuxize.com  

git を入れる

sudo apt install git

 

deepl を入れる

deeplはlinuxに対応していないので、こちらを参考に。 qiita.com  

Steam入れる

ApexはDLできましたが、下記エラーでゲームできず…
f:id:pigggg:20210516181404j:plain
 

ApexをするためにLutris入れる

手順はこれ

sudo add-apt-repository ppa:lutris-team/lutris
sudo apt update
sudo apt install lutris

lutris.net

しかし、コマンドがないとうことで失敗

sudo: add-apt-repository: command not found

これで追加して、再度実行すると成功しました。

sudo apt-get install software-properties-common

nyakki-yossi.hatenablog.com が未だApexはできず…
割と高スペックマシンなのPCゲームはしてみたかったのですが未だにできていません。

急に音声(Output)がでなくなった

こちらを実行して解決。
ubuntu - No sound at all in elementary OS Loki - elementary OS Stack Exchange

sudo apt-get update
sudo apt-get install pavucontrol

再起動しSystem → Sound → Output を見てみるとSpeakerが選択できるようになり音が出るよになりました。
 
他にも IntelliJ 入れたり Oh-My-Zsh 入れたりしたのですが書いていくときりがないのでおわり。

Golang テストケースで同メソッドを何度も呼ぶ場合

f:id:pigggg:20210817224341p:plain

テストケースでエラーでた

has already been called the max number of times

すでに最大回数呼び出されています。

 
え、呼び出し回数とか決まっている?
 

gomockに1回しか呼び出さないようにしている書き方

mock := hoge.NewMockIFHoge(xxxx)
mock.EXPECT().GetHoge().Return(int64(1))

 

複数回呼び出してもいい書き方

mock := hoge.NewMockIFHoge(xxxx)
mock.EXPECT().GetHoge().Return(int64(1)).AnyTimes()

 

ぐぐったら速攻出た参考

stackoverflow.com