タグ

ブックマーク / kiririmode.hatenablog.jp (49)

  • golang でのデバッグに非常に便利な go tool trace - 理系学生日記

    なぜかおかしな振る舞いをするサーバプログラムをデバッグするというのは、それなりに骨の折れる作業です。大量のソースを前に「ここが怪しい」と言いながらデバッグログを埋め込むこともあるでしょう。また、lsof や ss といったコマンドやスタックトレースから見える状況を元に仮説を立てて検証していくこともあるでしょう。 リクエストを受け付けるとなぜか応答を返さないままになってしまう gRPC サーバに対し、ソースから解析をかけていったことがありました。そのときは目の前の対応で必死になってしまいましたが、エントリでは「来はどのようにデバッグを進めるべきだったのか」を考えます。 実験コード mutex の Unlock を忘れたサーバ 同時並行して AcquireLock を呼び出すクライアント trace trace の取得方法 サーバサイド trace の可視化 trace からのデバッグ g

    golang でのデバッグに非常に便利な go tool trace - 理系学生日記
  • pkg/errors はもう外すことができないライブラリ - 理系学生日記

    ここ 2 ヶ月くらいずっと golang でバックエンドを書いています。 その中で、絶対に外せないなと思っているものの1つが pkg/errors です。 ぼくがこのライブラリを知ったのは、以下の記事でした。 Golangのエラー処理とpkg/errors Don’t just check errors, handle them gracefully 当時は Golang とは無縁の生活を送っていたので、まさか自分が使うことになるとは思いませんでしたが…。 問題 Golang におけるエラーハンドリングの問題 コンテキスト情報 pkg/errors が解決するもの エラーを取り出す 問題 Golang におけるエラーハンドリングの問題 Golang においては、以下のようなイディオムが多数登場してきます。 if err != nil { return err } 処理でエラーが発生している

    pkg/errors はもう外すことができないライブラリ - 理系学生日記
  • gRPC の Interceptor 概観 - 理系学生日記

    Unary と Streaming Interceptor mercari go-grpc-middleware Unary と Streaming Interceptor の前に gRPC の種類について書かないといけないのですが、 gRPC には 大きくわけて 4 つの RPC が存在しています。 Unary RPC Server streaming RPC Client streaming RPC Bidirectional Streaming RPC 一番分かりやすいのは Unary RPC で、これは一般の RESTful API 等と同様に、クライアントがリクエストを送出するとサーバがそれに対するレスポンスを返却するというものです。 イメージも分かりやすい。 次に分かりやすいのは Server streaming RPC で、これはクライアントの 1 リクエストに対して、サーバ

    gRPC の Interceptor 概観 - 理系学生日記
    BigFatCat
    BigFatCat 2018/11/24
    "gRPC の処理のうち、認証やロギング、データベーストランザクション管理といった共通的なものについては、ガンガン Interceptor に移譲させるべしだと思っています。"
  • Multi-stage builds で gRPC サーバを立ち上げる - 理系学生日記

    諸々で gRPC サーバを構築したりしているのですが、フロントを開発している人に gRPC サーバ + データベース一式を簡単に立ち上げられるようにしたいという思いがありました。 また、他にもシステム間連携を行う想定もあるので、できれば docker-compose に載せたい。 せっかく golang でアプリケーションを作っているので、Multi-stage build にチャレンジしてみました。 Multi-stage builds とは 作ってみる Multi-stage builds とは Multi-stage builds を説明するためには、Multi-stage builds の前の世界観を説明する必要があります。 たとえば今回のような golang のアプリケーションを Docker で構築する場合、 go の開発環境の入ったコンテナを作り、その中で go build

    Multi-stage builds で gRPC サーバを立ち上げる - 理系学生日記
  • ConsulやSerfのGosippingにより情報はどれだけ速く伝わるのか - 理系学生日記

    Consul や Serf でも、Gossiping と呼ばれる通信方式が良く使われます。 Gossiping というのはなにかというのは wikipedia:en:Gossip_protocol にもまとめられています。 オフィスにおいては、情報を持っている人がウォータークーラーの前で会った人にランダムでその情報を伝え、それがまた他の人に伝わっていくという情報の流れを模したものになります。 置き換えると、任意のノードがランダムに情報を伝えるノードを選び、情報を伝えながら伝搬するという流れになります。 情報を全ノードに伝搬させたいのにも関わらず、ランダムに選ぶだけでその目的が達成させられるのか。そして、達成させられるのだとすればどのくらいの時間で達成させられるのかは、Gossiping を行う以上は気になるところだと思います。 このあたりを明確に伝えるためには、数理モデルを構築して、その上

    ConsulやSerfのGosippingにより情報はどれだけ速く伝わるのか - 理系学生日記
  • なぜぼくがConsulに心奪われるのか - 理系学生日記

    ちょっと来週の中央線 Meetup で発表する Consul の資料をつくっているんだけど、つくっていたらすごい興奮してきて異常に興奮してきて、 いややっぱり Consul ってスゴいんすよみたいな熱い気持ちを吐露したくなったので発表資料まだぜんぜん作ってないんですけどここに発露します。 いつもは結構確認しながらエントリかくんですけど今日は一気に短時間でガーって書いたのでまちがいとかたくさんあると思いますけどごめんね。 かつて思い描いていた分散システムの未来 共有するデータによって広がる未来 伝搬システムとしても 他のプロダクトとの組み合わせ そういうわけで かつて思い描いていた分散システムの未来 なにがすごいかって、やっぱり自律分散的なところで Gossiping と Raft を使って整合性のある情報共有ができるようになっているっていうところがすごいと思うんですよ。 むかしから情報共有

    なぜぼくがConsulに心奪われるのか - 理系学生日記
  • フォントサイズ指定の単位は `rem` が良い - 理系学生日記

    以前に書いたとおり CSS の知識がゴミみたいなかんじなので、を読みつつ MDN と対象しつつ学んでいければと思っています。 で、今日はものすごい基的なフォントサイズ指定についてなんですが、最終的に現時点においては rem で指定するのが良いのだろうという結論に達しました。 フォントサイズの指定 フォントサイズは font-size プロパティで指定しますが、まずはアクセシビリティに関する推奨事項である Web Content Accessibility Guidelines (WCAG) 2.0 への達成方法を記載した Techniques for WCAG 2.0 を見ると、 font-size に関しては以下の 3 つが記載されています。 C12: Using percent for font sizes | Techniques for WCAG 2.0 C13: Using

    フォントサイズ指定の単位は `rem` が良い - 理系学生日記
  • Service Discoveryができるconsulっていうものは果たしてどういうものなのか - 理系学生日記

    MicroServices、コンテナオーケストレーションなどが花盛りですが、そこに格的に踏み出すにはまだ若干の時間が必要なように思います。 とはいえ、サーバの動的な構成変更への対応はいくらでも出てくるので、サービスディスカバリと、サーバのステータスをトリガにしたアクションには興味がありました。 そういうわけで、まずは Consul by HashiCorp の機能を試してみたいと思います。 まずは Consul とは何か アーキテクチャ クラスタを構成する Dockerfile docker-compose.yaml クラスタをあげる DNS Interface HTTP API ノードの死に対する耐性 Service Discovery K/V Store 最後に まずは Consul とは何か Consul は、以下の機能を持ったツールです。 サービスディスカバリ ヘルスチェック K

    Service Discoveryができるconsulっていうものは果たしてどういうものなのか - 理系学生日記
  • コンセンサスアルゴリズムであるRaftの概要 - 理系学生日記

    コンセンサスアルゴリズムというのをざっくり言うと、故障の発生し得るノードの集合が、整合性を持ったグループとして 1 つの値を決定する仕組みを指します。 wikipedia:en: Consensus (computer science) このアルゴリズムの具体的な例として、Paxos と Raft が挙げられます。 一方で Consul は、その一部に Raft を使っている こともあり、今日はこの Raft を追ってみました。 Raft の論文は、Raft: In search of an Understandable Consensus Algorithm になります。 ちなみにですが、概要の概要だけ掴みたいっていう人は、以下のサイトで Step by Step で追っていくのも良いかなと思います。 Raft Paxos との関係 Raft のアルゴリズム リーダー選出 ログレプリケー

    コンセンサスアルゴリズムであるRaftの概要 - 理系学生日記
  • RFCを調べるときは IETF の Datatracker がすごく有用なことに今更ながら気がついた - 理系学生日記

    新卒で入社した会社の新人研修で心に残っているのは、 "一次情報源にあたれ" という話でした。 要するに Blog 記事とか Qiita とかでノウハウを吸収するのは効率良いんだけど、そうする理由は何?とか、仕様として正しいの?と言われたときに、 このエントリに書いてありました、とかいうのはプロじゃないよね、という話で、そういうのは今でもできるだけ気をつけていたりします。 1 そういうわけで、RFC 参照しなきゃって気になるときは多くあるんですが、RFC を読みたいっていうとき、だいたい WebSocket rfc とかのキーワードで検索することが多かった。だいたいそれで要は足りるんですが、不安になるのは「これって他の RFC が出てたりしないかな」ってことでしたが、 そういうのの不安を軽減するのに IETF Datatracker が便利っぽい。 たとえば、oauth 2.0 について調べ

    RFCを調べるときは IETF の Datatracker がすごく有用なことに今更ながら気がついた - 理系学生日記
  • 困ったときのパケットキャプチャ+curl - 理系学生日記

    リバースプロキシから渡ってきた HTTP リクエストで WebApp がエラーになるという状況が発生しました。 状況としては、 リバプロにはぼくたちはアクセスできないし、そのリバプロにリクエストを送ることもできない。 リバプロから WebApp 用 FW に何らかの HTTP ヘッダを連携することになっているが、果たして送られているのかが不明 という状況。正確に何が起こっているのか分からない状況で鍵になるのは事象の再現であり、このときに採った戦略はパケットキャプチャでリクエスト内容を確認し、それを curl で再現することでした。 容易にサーバ上にツールを導入できる状況でもなかったので、tcpdump が使えたことは当に有り難かったです。また、自分の端末にもソフトウェアを簡単に導入できない環境ではあったものの、WireShark が入っていたのも良かった。 この 2 つが揃っていれば、あ

    困ったときのパケットキャプチャ+curl - 理系学生日記
  • 終わり行く2017年にgrepを - 理系学生日記

    みんな大好き grep についてですが、かなり機能が豊富な一方でなかなかそれがまとまっていないこともあるのと、自分自身、結構細かな Tips を忘れたりするので、ここで簡単にまとめてみたいと思います。 OR 検索 後述する拡張正規表現でも可能といえば可能ですが、サクっとできるのは -e (--regexp) を複数与えることです。 $ grep -e abc -e xyz hoge.txt abcdefg vwxyz この OR 条件がときどき変わって、その都度シェルスクリプトを変えたくないという場合、これらの条件は外出しすることも検討して良いでしょう。外出ししたファイルには、条件を 1 行 1 条件で並べます。 このファイルを -f (--file=filename) で与えれば、grep はそれらを OR 条件として解釈します。 $ cat cond.dat abc xyz $ gre

    終わり行く2017年にgrepを - 理系学生日記
  • シェルスクリプトで部分文字列を切り出す - 理系学生日記

    ときどき、シェルスクリプトで文字列の 3 文字目から 4 文字を切り出したいみたいなユースケースがあって、これまでずっと cut でやってた。 $ echo $str 1234567890 $ echo $str | cut -c3-6 3456 これ、じつは文字列操作でできる。 $ echo ${str:3:4} 4567 cut みたいな外部プロセスを呼び出すこともないので、シェルスクリプト性能おじさんも黙らせることができます。

    シェルスクリプトで部分文字列を切り出す - 理系学生日記
  • スタックトレースの出力が省略されてると思ったそのときに - 理系学生日記

    よくあったんですよ、手元で例外が発生して原因を辿るためにスタックトレースを辿ってたら、おやおや、「... 3 more」とか出てて、原因が辿れねーぞっていうケース。 HighLevelException: MidLevelException: LowLevelException at Junk.a(Junk.java:13) at Junk.main(Junk.java:4) Caused by: MidLevelException: LowLevelException at Junk.c(Junk.java:23) at Junk.b(Junk.java:17) at Junk.a(Junk.java:11) ... 1 more Caused by: LowLevelException at Junk.e(Junk.java:30) at Junk.d(Junk.java:27) at

    スタックトレースの出力が省略されてると思ったそのときに - 理系学生日記
  • シェルスクリプトにおける [ と [[ - 理系学生日記

    シェルスクリプトで条件分岐を書くとき、[ を使ったり [[ を使ったりすることになると思います。 POSIX の test にも記載がありあすが、[ は test と同じ機能を持つことになっており、同じ実装であることも多いです (ただし、[ として実行されるか、test として実行されるかに依って挙動が変わり得る)。 一方で、[[ は POSIX で定義はされていない、Bash 等の高機能シェルでの拡張になります。 [ と [[ は、当然ながら同じような機能を持っています。そりゃ、後者は前者の拡張ですからね。一方で、「拡張」であるが故に、[ と [[ で異なる挙動も存在します。 演算子 たとえば比較の演算としては以下のような挙動のちがいがあったりします。なお、[ への有無については、POSIX 定義という観点であって、シェル実装によっては普通に使えるものもあります。 機能 [ [[ 備考

    シェルスクリプトにおける [ と [[ - 理系学生日記
    BigFatCat
    BigFatCat 2017/07/23
    "[["知らなかった。正規表現も使えるのか。
  • findコマンドにおける -newer オプション - 理系学生日記

    みんな大好き find コマンド、-newer オプションというのをはじめて知った。find コマンド、マニュアルを読む度に発見ある。 -newer オプションはファイル名を引数に取って、そのファイルよりも modification time が新しいと true を返す述語になってる。 たとえば、以下のようなバックアップスクリプトを書けば、雑なバックアップが実現できることになる。 $ find /path -newer /var/backup/backup.timestamp -exec some-backup-command {} \; $ touch /var/backup/backup.timestamp find コマンド、ファイルの時刻に関する述語が多いんだけど、時間の粒度が大きくて不便だから、そういうときに使うと良いのかなと思ってた。 というのも、ファイルの変更時刻とかは t

    findコマンドにおける -newer オプション - 理系学生日記
    BigFatCat
    BigFatCat 2017/01/07
    XYの部分はmtとか入れればよいのか。
  • Yosemiteで日本語IMを消しAquaSKKに統一する - 理系学生日記

    このへんは完全に好みの世界ではあるのですが、日語を入力する場合、SKK が非常に使いやすいです (個人差があります) SKK については、wikipedia:SKK がまとまっており、さらには、ニコニコ大百科 が異常なまでに親切かつ丁寧な説明をしてくれています。 SKKが他の日語インプットメソッドと大きく異なるのは、かな漢字変換において形態素解析に基づいた変換を行わないことである。かなと漢字の境界をユーザが指定することになるため、形態素解析を行うシステムではどうしても避けられない解析ミスを回避し、意図した通りの変換を行うことができる。話し言葉や方言を記述する際、その表記のぶれのほとんどはかな文字で表記される部分であるので、SKKでは変換ミスにつながらない。 SKK を使うことの利点 文章を頭から流れるように書くことができる エンターキーを押す回数が減る 変換はユーザーが全て決める =

    Yosemiteで日本語IMを消しAquaSKKに統一する - 理系学生日記
  • BashのGlobに関わるオプション - 理系学生日記

    前に Bash の Glob に関するエントリを書きました。 他にも Glob には様々な応用があります。 あまり知られていないような使い方も多いので、それらをご紹介していくコーナーです。 extglob Glob で正規表現と not 条件を表現できるようになる。 詳細については、 BashのGlobは積極的に利用しましょう - 理系学生日記 に書きました。 nullglob 通常、Glob を指定したもののそれが合致するファイル/ディレクトリが存在しない場合、Bash は指定した Glob をファイル名として解釈します。 何を言っているかというと、これを見れば分かって頂けるでしょうか。 # *.hoge というファイルが存在しないので、Bash は '*.hoge' というファイル名をそのままコマンドに渡す $ ls *.hoge ls: cannot access '*.hoge':

    BashのGlobに関わるオプション - 理系学生日記
    BigFatCat
    BigFatCat 2016/08/10
    shopt -s nullglob failglob
  • シェルスクリプトでのtrapの使い方 - 理系学生日記

    シェルスクリプトでシグナルをトラップするには、みたいなことを考えることがあって、そういえば trap という日頃なかなか思い出されない不憫なビルトインがあることを思い出しました。trap は bash のビルトインとして存在する便利なヤツですが、忘れられがちなので、ここで一つ、trap コマンドとはどういうものかを書いてみることにしました。 trap の基 trap は、その名前の通り、シグナルを補足(trap) するためのシグナルハンドラを設定するためのビルトインです。 シェルスクリプトを長時間動かすみたいなユースケースは結構あって、別言語で実装されたバッチプログラムの起動だったり、ファイルツリーを探索して何か集計したりするとか、他システムとファイルを送受信したりです。 こういう長時間動かすケースではときどき、「あれ、意図せずシグナルを送られちゃったりしたときどうしよう」みたいなことを

    シェルスクリプトでのtrapの使い方 - 理系学生日記
    BigFatCat
    BigFatCat 2016/08/03
    trapの詳しい使い方。わかり易い。
  • BashのGlobは積極的に利用しましょう - 理系学生日記

    bash には glob というものがあります。glob ってなによっていう人も ls *.sh とかを展開する bash の機能ですよっていうと分かるかと思います。 この glob の機能って多用されますがあまりマニュアルとか読んだ人もいないと思うので、簡単にまとめてみます。 1. Pattern Matching Glob のパターンマッチングに使用できる文字のパターンっていうのは、通常、次の文字です。 *: 何にでもマッチする ?: 任意の一文字にマッチする [...]: [ と ] の間に記述された任意の文字にマッチする。これはちょっとややこしいので、もうちょっとまとめます。 [...] [...] の ... には通常として文字の集合を指定できますが、多少表現力のあるものも指定できます。 次のように、ハイフン- で指定された範囲のみにマッチさせたりできますし、 $ ls test

    BashのGlobは積極的に利用しましょう - 理系学生日記
    BigFatCat
    BigFatCat 2016/08/03
    setopt -s extglob