Linux(Red Hat系) に MySQL コマンドを入れる
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で負荷試験シナリオを作る(初歩)
パクリ元
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触ってみる
Vegeta
- golang 用の負荷試験ツール github.com
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
elementary OS 導入時メモ
elementary OS 導入メモ
- 日本語打てない問題
- クラッシュ頻発問題
- 再起動かけるとBluetoothが切れる問題
- LINE入れる
- Skype入れる
- git を入れる
- deepl を入れる
- Steam入れる
- ApexをするためにLutris入れる
- 急に音声(Output)がでなくなった
日本語打てない問題
クラッシュ頻発問題
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入れる
git を入れる
sudo apt install git
deepl を入れる
deeplはlinuxに対応していないので、こちらを参考に。 qiita.com
Steam入れる
ApexはDLできましたが、下記エラーでゲームできず…
ApexをするためにLutris入れる
手順はこれ
sudo add-apt-repository ppa:lutris-team/lutris sudo apt update sudo apt install lutris
しかし、コマンドがないとうことで失敗
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 テストケースで同メソッドを何度も呼ぶ場合
テストケースでエラーでた
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()
ぐぐったら速攻出た参考
Golang map を for loop
package main import ( "fmt" ) func main() { hogeMap := make(map[int64]string) hogeMap[1] = "A" hogeMap[2] = "B" for key := range hogeMap { fmt.Println(key) } // 1 // 2 }
key だけほしい場合はこうなるらしい。初めて知った。