動かざることバグの如し

近づきたいよ 君の理想に

AWSを使ったRspecテストにはモックを使うと簡単

環境

やりたいこと

Rubyを使ってS3とか扱うこと全然あると思う。例えば以下はバケット一覧を取得して表示するコード

require 'aws-sdk-s3'

client = Aws::S3::Client.new(
  region: 'ap-northeast-1'
)

bucket_data = client.list_buckets.buckets
bucket_data.each do |b|
  p b.name
end

が、S3ないしはAWSクラウドサービスなのでネットワークが入る。外部サービスをまたぐサービスを組み込んだコードのテストは結構厄介である。

これをなんとかしたい

方法1 非公式のモックライブラリを使う

例えばS3に限定した話だが、fake-s3というライブラリを使うとS3を振る舞うエンドポイントを作ることができる。

github.com

方法2localstack

もともとAtlassianが開発していたAWSのモックフレームワーク こっちは1と違ってフルスタックなので安心できる

github.com

懸念点としては今回みたいにピンポイントなモックを作るためだけにDockerを上げるべきなのかという点と引き継ぎ募集中!と書いてあって今後の開発が怪しいところ。。

方法3

公式が出しているモック機能を使う いわゆるstub

やり方

わりと簡単で手順は以下

  • 同じクラスをstub_responses: trueとして生成する
  • stub_responsesで振る舞いを定義

あとは実際のレスポンス同様にクラスが振る舞ってくれる。以下はさっきのをstubで書き換えたバージョン

require 'aws-sdk-s3'

client = Aws::S3::Client.new(stub_responses: true)
client.stub_responses(:list_buckets, buckets: [{name:'hoge'}, {name:'piyo'}])


bucket_data = client.list_buckets.buckets
bucket_data.each do |b|
  p b.name
end

しゅごい

取得にはエラーがつきもの 実はstub_responsesには例外も渡すことができる

require 'aws-sdk-s3'

client = Aws::S3::Client.new(stub_responses: true)
client.stub_responses(:list_buckets, Aws::Sigv4::Errors::MissingCredentialsError)

begin
  bucket_data = client.list_buckets.buckets
  bucket_data.each do |b|
    p b.name
  end
rescue => e
  puts "#{e.class} #{e.message}"
end

実行結果

Aws::Sigv4::Errors::MissingCredentialsError missing credentials, provide credentials with one of the following options:
  - :access_key_id and :secret_access_key
  - :credentials
  - :credentials_provider

当然オリジナルエラーも投げることができる

client = Aws::S3::Client.new(stub_responses: true)
client.stub_responses(:list_buckets, StandardError.new("custom error"))

これ他のSESとかAWSサービスでもstub使えるっていうだから設計すごいなぁというお気持ち

Github.comをブロッキングする方法

GitHubとは

Wikipediaで調べてみました!

それによると、

GitHub(ギットハブ)は、ソフトウェア開発のプラットフォームであり、ソースコードホスティングする。コードのバージョン管理システムにはGitを使用する。Ruby on RailsおよびErlangで記述されており、アメリカのカリフォルニア州サンフランシスコ市に拠点を置くGitHub社によって保守されている。主な開発者はChris Wanstrath、PJ Hyett、Tom Preston-Wernerである[4]。

どうやらギットハブと読み方の設計図共有サイトだそうです。

また、現在はマイクロソフトに買収されたそうです。

やり方

ブロッキングする方法は簡単で、以下のコマンドを実行するだけです!

echo 127.0.0.1 github.com > /etc/hosts

まとめ

いかがでしたか?Github.comに流出してしまうのは怖いですが、適切に扱えば良いサイトです。あとGithubじゃなくてGitHub

横浜の猫カフェぷちまりーに行ったら猫ハーレムで癒やされた件

2021年2月8日追記

PuchiMarry横浜元町店は閉店してしまいました。😢😢😢😢😢😢😢😢

以下過去記事 ほかのぷちまりー店もいいから是非

唐突だが、癒やしを求めて猫カフェに行ってきた。

都内にもいろんな猫カフェがあるが、今回は横浜に用事があったのでその近辺で探したところ、猫カフェぷちまりーという場所を見つけたので行ってみた。

正式名称は 猫カフェPuchiMarry横浜元町店 というところ (11:00-20:00(最終入場19:30))

www.puchimarry.com

横浜駅から地下鉄で元町・中華街駅へ 後述するが、迷わなければ徒歩10分以内で行けるので割と近い。

料金

料金は以下の通り。最低入室時間30分+ドリンク代がかかるので実際には950円〜からとなるが、都心にしては安いほうだと思う。あと充電器とWifiは完備してある

入室料(10分毎)
最低入室時間30分
200円
ドリンク飲み放題 350円
平日フリータイム
(ドリンク飲放題付き)
2300円
土日祝フリータイム 2500円

流れとしては、

  • 玄関で靴を脱ぐ
  • 受付で店員さんに料金の案内をされる
    • このときに簡単な猫に対する注意事項をうける(無理にだっこしない等
  • いざ癒やし空間

箇条書きレポ

  • 時間帯によって違うんだろうけど、この時の猫ちゃんはかなり活発だった
    • ずっとおもちゃで遊んでくれる
  • 基本的に子猫が多い
  • 中の雰囲気がとても良かったし清潔だった あと店員さんの対応も非常に良かった

もうあとは文で語るより画像載せたほうが伝わるやろ感

膝の上乗ってくれた かわいい

f:id:thr3a:20190721231635j:plain

めっちゃネコパンチされた かわいい

f:id:thr3a:20190721231620j:plain

ネコによって好きなおもちゃが違う。店内にはいくつか用意されてたので好きなおもちゃを使える かわいい

f:id:thr3a:20190721234841j:plain

一度掴んだら離さなくて大変だった けどかわいい

f:id:thr3a:20190721231631j:plain

おとなしい猫ちゃんもいる。この子は窓際でひなたぼっこをしている猫 かわいい

f:id:thr3a:20190721234846j:plain

とまあ総括するとめっちゃ可愛くてあれよあれよと癒やされているうちにあっという間に時間になってしまった。

ちゅーる(別途料金)でおやつをあげることも出来るようなので、また来ようと思った。

ぷちまりー横浜元町店への行き方

最寄り駅は横浜中華街とかある「元町中華街駅」なので楽なのだが、問題はここからでGoogleMap曰く徒歩でほぼ直進4分とわかりやすい表示なのだが、行く途中で迷いやすいポイントがある。

首都高の下の橋を渡る。ここまではいい

f:id:thr3a:20190721231612p:plain

問題はここで、Google Mapだと川沿いにすぐ右折だが、そっちに行っても癒やしはない。もう1本先の賑やかな道路の方を右

f:id:thr3a:20190721231602p:plain

すると右手にぷちまりーの看板がある。この建物の2階である

f:id:thr3a:20190721231607p:plain

公式アカウント

OpenCVビルドメモ

sudo apt-get update
sudo apt-get install -y build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt-get install -y python2.7-dev python3.6-dev python-dev python-numpy python3-numpy
sudo apt-get install -y libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev libjasper-dev
sudo apt-get install -y libv4l-dev v4l-utils qv4l2 v4l2ucp
sudo apt-get install -y curl
sudo apt-get install -y zlib1g-dev libjpeg-dev libwebp-dev libpng-dev libtiff5-dev libjasper-dev libopenexr-dev libgdal-dev



cmake -D WITH_GSTREAMER=ON -D WITH_LIBV4L=ON -D BUILD_opencv_python2=ON -D BUILD_opencv_python3=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

MySQLでToo many connectionsの原因クエリ特定の対処法

環境

症状

max_connectionsの設定を大きくしているのにもかかわらず、なんらか悪いSQLが走ってしまってテーブルがロックしてしていまい「Too many connections」エラーになる。

対応方法

まずは焦らずロックの原因になってしまっているSQLを(あとからでもいいので)特定できるように保存する

先に詰まってるクエリ一覧をバックアップ

mysql -p  -e 'show full processlist' > sql_list.txt

fullをつけないとSQLが省略されてしまうので注意

次にいったん全クエリをkillしてToo many connectionsを解消する。以下のコマンドを実行

mysql -p  -e 'select concat("KILL ",id,";") from information_schema.processlist;' -s

するとKILL プロセスIDをリストがバーっと出力される。

concat("KILL",id,";")
KILL 202718241;
KILL 202718240;
KILL 202718239;
KILL 202718238;
KILL 202718237;
KILL 202718236;
(略)

これをコピーして対象のMySQLサーバーにログインしてコピペ実行すれば一旦は全クエリが中止される。

そして最初に保存したsql_list.txtを確認して、悪いSQLを特定していく おわり

蛇足

現在のコネクション数 show processlistの行とほぼ一致するはず

show variables like "%max_connections%";

MySQLのコネクション数を増やす設定

mysql> set global max_connections = XXXX;