エンジニア劣等感の克服記

エンジニアでありながら、エンジニアに劣等感を感じている。それを克服していきたい。

mysqlとの通信内容をtcpdumpで確認する

概要

mac上のlocalhostで起動しているmysqlとの通信内容をtcpdumpコマンドを用いて確認する。

やったこと

以下のようなコマンドで、tcpdumpでport3306の内容をみようとした。

sudo tcpdump dst -i lo0 -s0 -A port 3306

しかし、mysqlクライアントでmysqlに接続しselectなどしても、tcpdumpの結果に何も表示されない・・・。

少し調べてみると、どうやらlocalhostのmysqlに接続するときにはtcpで接続するのではなく、unix domain socket経由で接続するとのこと。

unix domain socketでの通信内容をみるにはstraceコマンドを用いることができる。ただmacにはstraceがなく、代わりにdtrussコマンドというのを使えるらしい。が、dtruss使ってみたがちょっと調べてもよく分からず、、(途中で面倒くさくなってきたというのもある)

そもそもmysqltcpとかで繋げばいいのでは?という発想に至り少し調べると、以下のようにmysqlクライアントのオプションを指定することで、tcpで接続するようにもできるらしい。

 mysql --protocol tcp -u xxx -p

このようにmysqltcpで接続すると、tcpdumpにも無事結果が表示された。

ただ正直、表示された内容を見てもよく分からない・・・! 次回以降では表示された内容を詳しくみる。

メモ

  • 調べた時間:30分程度
  • この記事の執筆にかかった時間:10分もかかっていない?

array.map(&:method)の挙動

array.map(&:method)の挙動

以下のように書いていると

[1, 2, 3].map { |value| value.to_s }

以下のように書けるぞ、とrubocopなどでよく怒られる。

[1, 2, 3].map(&:to_i)

なぜこう書けるのか今まで理解していなかったが、最近理解したので記述する。

&:method は何をしているのか

&:mehtod をmapの引数に渡していることになるが、では &:methodとは何をしてくれてるのか?

&:method は、:method というシンボルに対してto_procメソッドを呼びProcオブジェクトを作り、 そのProcオブジェクトをブロックとして渡している。

Procオブジェクトとは Proc.new{ |val| val.method } のようオブジェクト。

irb(main):023:0> proc_object = Proc.new{ |val| val.to_i }
=> #<Proc:0x007ff98b986ea8@(irb):23>
irb(main):024:0> proc_object.call "01"
=> 1

こんな感じで、callすると、引数に対してto_iを適用するようなオブジェクトを作れたりする。

まとめると、例えば [1, 2, 3].map(&:to_s) は [1, 2, 3].map(&Proc.new{ |val| val.to_s }) と同じ。シンボルにto_procを呼んでProcオブジェクトを作り、それをブロックとして渡している。

詳しくはパーフェクトrubyを参照すると非常によくわかるかと…。

tcpdumpを触ってみた

概要:tcpdumpを触ってみた

tcpdumpを使うとパケットをみれる。 どんな通信が行われているかみれる。

以下をみて少しだけいじった。

なぜtcpdump?動機は?

通信プロトコルの理論とかの話は聞いたことあるし、大学の時に本当に単純なhttpサーバーの実装とかをやった(確か)。けれどなんとなく腑に落ちないというか、納得感がない状態が今。

だからパケットみてどんなリクエスト来てどんなレスポンスが来ているのかとか、見たいし、それを理解できたらいいなと。あとそういうことできたらトラブル、例えばなぜmysqlに繋がらない?、なぜ期待通りのレスポンスが返らない?(リクエストが問題なのか処理が問題なのか)とか切り分けしやすそうだし。

ようするにとりあえず基本的で末長く使えそうだからやりたいという感じ。

具体的に何をやったか

tcpdumpのインストール

インストール必要なのかと思ったら、macにデフォルトで入っていた。

$ which tcpdump
/usr/sbin/tcpdump

googleとの80番portのパケットを見る

sudoでないと実行できないのが注意点

 sudo tcpdump -s0 -A port 80 and host www.google.co.jp

localhostの3000番portとのパケットを見る

sudo tcpdump -i lo0 -s0 -A port 3000

以下のように dst とかつけると、こっちから向こうへのパケット(送信)のみ表示、とかできる。

sudo tcpdump dst  -i lo0 -s0 -A port 3000

向こうからこっちへのパケット(受診)のみは src

感想

flashで作られているサイトとか見ているときにパケット監視して、裏でどんな通信されているのか、とかを見てみてい(みれるようになりたい)。

ngrepとの比較を行いたい。

コマンドいじるのに10分もかかっていないが記事を書くのは20分くらいかかっている?大変。

目標

目標

ブログ運営にあたっての目標を記述する。

頻度

  • 1週間に最低5本の記事を書く
    • とにかくアウトプットをだす
    • 質が低いからアウトプットしない、とかよりもとにかくアウトプット

内容

  • どんなに短くても良い
  • コピペはなどはだめ、自分でまとめた文章を書く
  • 内容は特に問わないが、基本的には技術的な内容、サービスやビジネスモデル、自分の考えなど
  • 最低限の品質は保つ(読んでもわからんような日本語力、文章力のアウトプットはNG)