Dockerコンテナ内からlocalhostで起動しているアプリケーションに接続する

解決法

Windows環境では http://docker.for.win.localhost:xxxx
Mac環境では http://docker.for.mac.localhost:xxxx へ接続する

参考 https://qiita.com/tatsuya-miyamoto/items/08bd6ea142d02708614f

どういうときに使うの

やむを得ない事情があってlocalhostMySQLを立ててしまったときとか。
docker-composeを2種類用意して、それらを接続したいときとか。

Dockerから http://localhost:xxxx に向けると、localhostって誰って話になって接続ができない。
そういうときは、 localhost を前述の docker.for.xxx.localhost に置き換えてやるとつながる。

簡単なことなのに調べてもなかなか出てこなくてハマった。
一人でも多くの人が安らかな気持ちになってくれることを祈る🙏

GCP Associate Cloud Engineer不合格記

合格記書いてる人はそこそこいるから、不合格記書いてる人がいてもいいでしょ?というコンセプト。
己の浅学を露呈するタイプのプレイである。

tl;dr

落ちました!!!!!!!!
めっちゃ悲しい悔しい!!!!!!!!!!
メッチャむずかった!!!!!!!!!!!

受験したきっかけ

Google Cloud Next '19 に参加して、
Google Cloud 認定資格チャレンジ - 入門 & インフラ 編」のチラシをもらったことがきっかけ。

cloud.google.com

Googleのオンラインコースの決められたカリキュラムを受講すると、
GCP試験の25%オフバウチャーがもらえるというもの。
ついでに、試験に受かると100ドルのGoogleストア用クーポンがもらえる。
そして、勉強のために、普段有料のオンラインコースが1ヶ月間無料で使える。

とりあえずコースを受講して、バウチャーをもらって、模擬試験受けてみたら意外と行けそうだったので申し込んで不合格になって今に至る。

コース受講前のスキル

  • PHPとかPythonとかGoとか使うWebアプリバックエンドのパソコンカタカタおじさん(エンジニア4年目)
  • インフラはDocker Composeまではちょっとだけレベル
  • 普段アプリケーション以外はあまり触らない。障害調査でログ読むくらい
  • AWSクラウドラクティショナーまでなら持ってる

受験までにやったこと

上記の通り、チャレンジで無料開放されたQwiklabsとCouseraのコースを一通りやった。
コースの中でわからなかったコマンドとかはドキュメントを調べつつ。
GCNextの後から始めて、合計約30時間。

試験の感想

めっっっっっっっっっっっちゃむずかった
模擬試験でそこそことれたからいけるっしょって思ったけど模擬試験と難易度が違いすぎる…
試験問題については触れられないので、自分に何が足りなかったかを試験後に考えた結果を書いておくので察してください

  • インフラエンジニアとしての実務経験がなかったこと
    • わからない問題がとことんわからなかった。勘所が効かなかった
    • Webアプリエンジニアは普段やらないことも試験範囲だからそれがきつかった
  • ひとりでGCPを触っていたこと
    • 複数人・組織で触らないとプロジェクト管理/IAM管理の勘所は身につかない
  • ベストプラクティスに関する知識が少なかった
    • Googleが無料開放してくれたコースで学べたのは基礎知識+ベストプラクティスの入り口
    • もっとドキュメント読みこんでおくべきだった

試験に落ちたけど残ったもの

試験自体には落ちてしまったけれど(めちゃくちゃ悲しい。試験料の1万円…)、
勉強前にはできなかったことができるようになった手応えがとてもある。
QwiklabsとCouseraが、とてもわかりやすくて良い学習ツールだったお陰だと思う。
具体的には、GCPを使って以下のようなことはできるようになりました。多分実務でもいける。

  • Webアプリのインフラ構築
    • マルチリージョンにして、ロードバランス入れて、バックエンドはLBからのトラフィックだけ受け入れるVPCにして、冗長化もして、とか一通りのシステム構築をVMとその他フルマネージドサービスで作る
    • VMほど自信ないけどKubernetesでも頑張ったらいけそう
  • StackDriverでロギング・トレース・モニタリング
  • そのほか試験範囲はちょっとだけ

今までGCPナニソレオイシイノ状態だったことを考えると、かなり成長できている。
とりあえず、GCPでWebアプリ運用ができるとこまで来れたということなので。
(Anthosとかはちゃんとわかってないですけどね)

勉強して落ちてダメダッターあー時間無駄にしたーではなく、ダメだったなりにも成果が得られたので、
トータルで「受験してよかった」と今は思えている。悲しいけど。

再受験するの?

心の傷が癒えたら
とりあえずしばらくは受けるつもりはない
秋のIPA試験のこと考えてる

試験をこれから受ける人にいいたいこと

  • Google Cloudのドキュメントは膨大すぎるんだけど、あれ全部読んだほうがいいよ(マジで)
  • バリバリGCPの実務経験があると安心だよ(Webインフラを除く)

カンファレンスで使える英語の質問表現

tl;dr

  • カンファレンスで外国人スピーカーに質問&会話する時の便利な言い回しまとめ
  • 基本的に質問するときは May I know ... の形式で質問すると良い。最も丁寧な言い回し

まえおき

2019年末のRe:Inventに参加することになりました。
ただ英語は全っっ然できないので、準備として EnglishCentral に登録して、ネイティブスピーカーの先生と25分×週2で話すのをここ1ヶ月ほど続けています。

ja.englishcentral.com

レッスンの中で、「カンファレンスでの丁寧な質問の仕方」をいくつか教えてもらいました。
自分的に使い所が多そうだったので&身につけたいので記録に残します。

ポイント

  • Can < Could < May の順で丁寧な言い回しになる
    • とりあえず人に物聞くときは May を使うクセをつける!
  • 質問は May I know... から始め、短く質問する

表現まとめ

セッションで使える表現

  • 挙手して当てられたときの決まり文句

    Okay.. Good morning(時間に合う挨拶) everyone.
    Especially to our speaker(s) for today.

  • 質問の仕方

    • Aについて教えて下さい。

      May I know about A.

    • AとBどちらが良いと思いますか?あなたの意見を教えて下さい。

      May I know your opinion... which is better A or B?

  • 発表後、セッションを称賛する

    • 個人的に感動した時とかに使う
      • 発表お疲れさまでした!とても参考になるセッションをありがとうございます。またお会いできることを楽しみにしています。

        Job well done. Congratulations!
        It has been very useful and informative to us.
        Thank you very much.
        Hope to see you again.

懇親会などでの会話に使える表現

  • 相手の仕事内容について訊ねる
    • あなたのお仕事内容はどんなものですか?

      May I know your job description?

    • あなたの主なお仕事はなんですか?

      What is your main responsibility at work?

Qiitaに初投稿した

qiita.com

温めてたブログ用ネタのうち、
そこそこのサイズ感で、Qiitaに出しても一応恥ずかしくなさそうなやつを選んだつもり…つもり。
バーンと出すのが恥ずかしい小さいやつはブログ、そうじゃないやつはQiitaに流していこうと思いました。

mimetypes.guess_type()の挙動はOS依存だよ

なんだこれゎ。

mimetypes.guess_type() でどのmimetypeが返ってくるかは動作している環境のOSに依存する様子。
そのため、たとえば hogehoge.csv というファイルを引数に与えたとき、
Windowsでは application/vnd.ms-excel が返り、Linuxでは text/csv が返る。
動作環境を変えたときにこれ使ってるとハマるので注意。

Windows

>>> import platform
>>> platform.platform()
'Windows-10-10.0.17763-SP0'

>>> import mimetypes
>>> mimetypes.guess_type('hogehoge.csv')
('application/vnd.ms-excel', None)

>>> mimetypes.guess_type('hogehoge.xlsx')
('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', None)

Linux

>>> import platform
>>> platform.platform()
'Linux-4.9.125-linuxkit-x86_64-with-debian-9.4'

>>> import mimetypes
>>> mimetypes.guess_type('hogehoge.csv')
('text/csv', None)

>>> mimetypes.guess_type('hogehoge.xlsx')
('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', None)

ただ text/csv を取りたかっただけなのに。。。
実用的な関数でないなぁ

Djangoのテストでsettingsの値をモックする

定期的に忘れるのでメモ

settingsの値をモックしたいときは、 django.test.utils.override_settingsTestCase.settings を使う。

override_settingsを使う場合

参考: https://gist.github.com/blaix/2294982#gistcomment-1318400

👆に書いてある通り。

from django.test.utils import override_settings

をインポートして、デコレーターとして使う。

@override_settings(DEBUG=False)

これだけ。

TestCase.settingsを使う場合

参考: https://stackoverflow.com/questions/36611393/how-to-mock-django-settings-attribute-used-in-another-module

with句で使う。withの範囲中だけsettingsのモックが有効になる。

class TestSample(TestCase):
    def test_1(self):
        try:
            val = settings.AA
        except AttributeError:
            print('AAはないよ!')

        with self.settings(AA='hogedayo'):
            print('AA='+settings.AA)

        try:
            val = settings.AA
        except AttributeError:
            print('withを抜けたからAAはないよ!')

    def test_2(self):
        try:
            val = settings.AA
        except AttributeError:
            print('AAはなくなったよ!')

出力

AAはないよ!
AA=hogedayo
withを抜けたからAAはないよ!
AAはなくなったよ!

デコレーターでやったほうがテストコードの見通しが良い気がする。わかりやすい。
お好みでお使いください。

moto+boto3のテストでOSError、NoCredentialErrorが出る場合

現象

moto == 1.3.7,
boto3 == 1.9.130
環境でテスト実行時に発生。

urllib3.exceptions.NewConnectionError: <botocore.awsrequest.AWSHTTPConnection object at xxxxxxxxxxxxxxxx>: Failed to establish a new connection: [WinError 10051] 到達できないネットワークでソケット操作を実行しようとしました。

テストのときにboto3がモックできておらず、AWSに通信が行ってしまっているが、認証情報不足でErrorになっているっぽい。

原因

開発環境にAWS接続用環境変数が存在しなかったため。
ダミーでもいいので何らかの値がないとmotoが動かない。
コマンドラインから、 AWS CLIaws configure を実行して、何らかの値をセットしておく。
(AWS CLIが入っていない場合は、

docs.aws.amazon.com

を参照。)

パソコン変えてからこれが発生して苦しんだ…初期設定はだいじ。