ブックマーク / songmu.jp (51)

  • Goの任意のLoggerをログローテート対応できるreplaceablewriter | おそらくはそれさえも平凡な日々

    https://github.com/Songmu/replaceablewriter 表題の通りですが、io.Writer をラップして io.WriteCloser として振る舞い、その内部に保持した io.Writer を差し替え可能にするライブラリを書いた。 例えば、Goの標準logをログローテートしたい場合には以下のようにします。 f, _ := os.OpenFile("20191001.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) w := replaceablewriter.New(f) log.SetOutput(w) // 翌日になったら差し替える f2, _ := os.OpenFile("20191002.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) w.Repl

    Goの任意のLoggerをログローテート対応できるreplaceablewriter | おそらくはそれさえも平凡な日々
  • Nature Remo作ってる会社のCTOになったのでみんな買ってくれよな! | おそらくはそれさえも平凡な日々

    6月1日付けでNature Japan株式会社の取締役CTOに就任しました。最初の営業日の6/3(月)からいきなり台湾出張に行ってきました。良いスタートアップ感。ついでに日6月5日に39歳になりました。新たなチャレンジにワクワクしています。 大塚(@maaash)さん、村瀬(@typester)さんに続く3代目のCTOとなります。2人はカヤック時代の同僚でもありますが、カヤックのラボチームのダブルエースだった彼らの後任としてCTOをやるのは恐れ多いのですが、僕は組織づくりなど含めて僕なりに組織に貢献していきます。 当社はおかげさまでスマートリモコンのNature Remoが好調で、現在はNature Remo Eというスマートエネルギーハブの開発を進めているところです。今後は電力なども見据えて事業を展開していく計画で面白いフェーズにあります。 まだ、社員全員でも10人に満たない小さな会社

    Nature Remo作ってる会社のCTOになったのでみんな買ってくれよな! | おそらくはそれさえも平凡な日々
  • Goのバイナリへのファイル同梱はstatikで決まり | おそらくはそれさえも平凡な日々

    https://github.com/rakyll/statik Goのバイナリにファイルを同梱するという誰もが欲しいはずのものがなかなか決定版がなく、go-bindataがメンテを終了し、go-assetsもいまいちメンテが滞っているので、statikを使うことにしました。作者のrakyllさんも実績のある方なので大丈夫でしょう。 statikも少しpull requestの取り込みが滞っていたのですが、試しにpull requestを送ってみたらちゃんと取り込まれたので大丈夫そう。 https://github.com/rakyll/statik/pull/61 元々、ファイル単体を取得する分には問題なかったのですが、ファイルシステムとして走査しようとするとうまく辿れない問題があり、このpull requestで修正しました。ですのでより安心して使えるでしょう。 http.FileSy

    Goのバイナリへのファイル同梱はstatikで決まり | おそらくはそれさえも平凡な日々
  • 実行中のプロセスの終了を検知して通知をするpeepというのを作った | おそらくはそれさえも平凡な日々

    https://github.com/Songmu/peep なにかコマンドを実行して、思ったより時間がかかりそうな場合、終了を通知して欲しくなること、あると思います。それをしてくれるのが peep です。言うなれば、 horenso の後付版です。 使い方はめちゃくちゃ簡単で、以下のようにpidと、その後に任意のコマンドを指定します。 % peep $pid -- /peth/to/notification-script 当該 $pid のプロセスが終了したら、指定したコマンドが動くという仕組みです。なんと、リモートプロセスの終了も検知できます。 インストール go get % go get github.com/Songmu/peep/cmd/peep % go get github.com/Songmu/peep/cmd/peep-notify Homebrew % brew ins

    実行中のプロセスの終了を検知して通知をするpeepというのを作った | おそらくはそれさえも平凡な日々
  • オライリーの「入門 監視」の付録Cを執筆しました | おそらくはそれさえも平凡な日々

    入門 監視 ―モダンなモニタリングのためのデザインパターン このはPractical Monitoringの邦訳です。原著は持っており、良いだと思っていたので、翻訳者の松浦さんが邦訳されている話を聞いたときには嬉しく思いましたし、そこで付録を執筆して欲しいという依頼もいただき、身に余る話でしたが、引き受けさせてもらいました。 そして「実践 監視SaaS」と言う内容を付録Cとして20ページほど書かせていただきました。原著が監視SaaSの活用を推奨してはいるのですが、内容的にはツールに偏らない、概念的で中立的なであるため、監視SaaS活用に関してはもう少し具体的、実践的な話を補強して欲しいというオーダーを受け、書いたものです。 私は、Mackerel という監視SaaSのプロダクトマネージャーを務めており、それもあって依頼を頂いた形ですが、逆に、原著の中立的な良さを損なわないように公平さ

  • sh -cで呼び出したコマンドがbashだと孫プロセスにならないことがある | おそらくはそれさえも平凡な日々

    前提として、/bin/sh は、デフォルトでは、RHEL系の場合bashシェル、Debian系の場合dashシェルへのsymlinkになっています。この2つのシェルの挙動は細かいところで結構異なります。そもそもの思想として、dashシェルはPOSIX互換を目指す軽量なシェルであり、bashは拡張された高機能なシェル。なのでbash前提で書かれたシェルスクリプトがdashでは動かない、みたいなことはよくあります。そういう感じで困ることがままありますが今回もそういう話。 例えば % sh -c "sleep 100" のようなコマンドを実行した場合、呼び出し元の子プロセスが sh になり、その更に子プロセスが sleep になると直感的には思うでしょう。つまり以下のような具合。 . \_ sh -c sleep 100 \_ sleep 100 しかし、 sh の実体が bash である場合な

    sh -cで呼び出したコマンドがbashだと孫プロセスにならないことがある | おそらくはそれさえも平凡な日々
  • JSONを使ってコマンドラインを動的に組み立てて実行するjfillを作った | おそらくはそれさえも平凡な日々

    https://github.com/Songmu/jfill 標準入力からJSONを受け取り、その値を使ってコマンドラインを組み立てて実行するユーティリティです。以下のような具合です。 インストール % go get github.com/Songmu/jfill/cmd/jfill もしくはGitHub Releasesからご利用ください。 使い方 % echo '{"name":"jfill"}' | jfill echo Hello {{name}}! Hello jfill! {{name}} の部分がプレースホルダーです。それがJSONの入力を元に置換され実行されています。 プレースホルダー内には以下のようにデフォルト値を指定することも可能です。 % echo '{}' | jfill echo Hello {{name:jfill}}! Hello jfill! {{name

    JSONを使ってコマンドラインを動的に組み立てて実行するjfillを作った | おそらくはそれさえも平凡な日々
  • Goツールのクロスビルドとパッケージングのためのgoxzというツールを作った | おそらくはそれさえも平凡な日々

    Goツールのクロスビルドと成果物生成には個人的に長らく、goxcを愛用していましたが、その乗り換えとして、goxzというのを作った。go + x(cross) + z(zip)でgoxz。便利です。 https://github.com/Songmu/goxz goxcは非常に高機能なのですが、僕がその機能の一部しか必要ないことや、goxcのメンテ自体も止まっている(とオフィシャルでも案内されている)ことが気になったので作りました。 具体的には「Goツールのクロスビルドと成果物のアーカイブ生成をパラレルにおこなう」ことしかしない。アーカイブ生成時に、リポジトリからLICENSEやREADMEを自動的にかき集めるのはやってくれます。 基的には「設定より規約」という感じで、良い感じのデフォルトを決め打ちにして、あまり細かい設定項目などは作らない想定です。 インストール https://git

    Goツールのクロスビルドとパッケージングのためのgoxzというツールを作った | おそらくはそれさえも平凡な日々
  • あらゆる日付文字列をよしなに扱うgo-httpdate を書いた | おそらくはそれさえも平凡な日々

    https://github.com/Songmu/go-httpdate Perl界には HTTP::Date という便利モジュールがあります。これは、あらゆる日付文字列を特にフォーマットの指定無しによしなにパースしてくれるもので、クイックハックに非常に有用です。ISUCONでは毎回使っている気がします。 このモジュールは異常な正規表現によって成り立っています。おそらく元々はその名の通り、単にHTTPのための日付フォーマットを扱うモジュールだったのでしょうが、徐々に拡張が継ぎ足されてこのようなモジュールになったのだと想像されます。 で、これをGoに移植しました。以下のように使います。 import "github.com/Songmu/go-httpdate" t1, _ := httpdate.Str2Time("2017-11-11", nil) t2, _ := httpdate.

    あらゆる日付文字列をよしなに扱うgo-httpdate を書いた | おそらくはそれさえも平凡な日々
  • GoでSingletonぽいことを実現する、とある方法 | おそらくはそれさえも平凡な日々

    ちなみに今回のコードはそれほど実用性はありません。ここまで頑張って、シングルトンぽいことを実現する必要性は感じられないからです。サンプルコードはこちら。 https://www.github.com/Songmu/go-sandbox/ Goでシングルトンを実現する方法として以下の様なコードが良く見られます。 package singleton import "sync" type singleton struct{ } var ( instance *singleton once sync.Once ) func GetInstance() *singleton{ once.Do(func() { instance = &singleton{} }) return instance } このコードのグッドポイントとしては、 sync.Once を使っていること。以下のように素朴に nil

    GoでSingletonぽいことを実現する、とある方法 | おそらくはそれさえも平凡な日々
  • Goツールのリリースにおけるバージョニングについて | おそらくはそれさえも平凡な日々

    Goのツールをリリースする時、個人的には以下のような手順を踏んでいる。もちろんスクリプトで一撃でできるようにはしている。今回は1.の話。セマンティックバージョニングの話は出てきません。 versionをbumpする CHANGELOGを更新する 1,2での変更をgitに反映してタグを打つ ビルドする ビルドをアップロードする versionは -ldflags を使って動的に埋め込む方法があるが、最近は明示的にソースコードに書いた方が良いと思うようになってそうしている。 理由としては、ユーザーが go get/build で実行ファイルを取得した場合でもバージョンは表示されて欲しいというのが一つ。 -ldflags で実行ファイルに色々な値を埋めることはできますが、基原則として、それらを埋めてない状態でもちゃんと実行ファイルが正常に動くようにすることを意識した方が良い。 もう一つの理由と

    Goツールのリリースにおけるバージョニングについて | おそらくはそれさえも平凡な日々
  • Goツールのリリースエンジニアリング | おそらくはそれさえも平凡な日々

    前回: Goツールのリリースにおけるバージョニングについて 前回挙げた以下のリリース5段階の中で、バージョニングだけで1エントリになりましたが、今回は、2,3について。 versionをbumpする CHANGELOGを更新する 1,2での変更をgitに反映してタグを打つ ビルドする ビルドをアップロードする 具体的には、リリースに纏わるファイル更新をgitに反映さえてタグを打つところまで。ビルドする直前までとも言えます。 CHANGELOG.mdを自動更新する CHANGELOGは ghch で自動生成させている。規定の CHANGELOG.md をリポジトリに配置して、 % ghch -w -N $next_tag とすれば、魔法のように CHANGELOG.md を更新してくれる。生成された CHANGELOG.md はこんな感じ。 https://github.com/Songmu

    Goツールのリリースエンジニアリング | おそらくはそれさえも平凡な日々
  • ISUCON7開催に寄せて。もしくはISUCON6予選問題作問奮闘記 | おそらくはそれさえも平凡な日々

    ISUCON7開催決定 めでたいですね。開催されるかどうかハラハラしていたので、開催が決まって良かったです。 考えてみたら、昨年のISUCONに関して個人ブログの方に何も書いてなかったので書いてみます。書いたら「とにかく辛かった」みたいな話ばかり出てきそうなので、それが影響して今年の問題作成に名乗りを上げる人がいなかったら困るなと思って、書くのを躊躇していた部分もあります。 問題作成することになったきっかけ 2015年末当時の話になりますが、過去3回優勝させてもらっていたので、そろそろお鉢が回ってくるんじゃないかとは思っていました。過去のISUCON優勝者、もしくは上位入賞者を擁する企業の中で、はてなはまだ問題作成をしていなかったからです。 回ってきたら困るな、と思っていたのも事実です。過去の問題作成者に比べると、僕は明らかにエンジニアとしての実力が見劣りするからです。過去の優勝もチームメ

    ISUCON7開催に寄せて。もしくはISUCON6予選問題作問奮闘記 | おそらくはそれさえも平凡な日々
  • Redisアプリケーションパターン | おそらくはそれさえも平凡な日々

    この記事は、はてなエンジニアアドベントカレンダー2016の12日目の記事です。 先日こういうツイートをしました。 Redisはキャッシュ用途のミドルウェアだと思わない方が良いと思う — songmu (@songmu) 2016年12月10日 言いたかったのは、Redisはキャッシュのためだけのミドルウェアだと誤解されがちなのですが実際はそうではないということです。実際、公式サイト を見に行くと以下の様なことが書かれています。 Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. つまり、Redisは多彩なデータ構造を保持できるインメモリーのデータストアで、様々な活用法があり、キャッシュとして「も」使える、とい

    Redisアプリケーションパターン | おそらくはそれさえも平凡な日々
  • はてなに入って2年くらい経ちました。CTOとかMackerelとか | おそらくはそれさえも平凡な日々

    この度はてなのCTOが id:stanaka から id:motemen に交代しました。僕はチーフエンジニアとして引き続き頑張っていく所存です。 stanakaとMackerel stanaka にはチーフエンジニアMackerelチームのディレクターを務める中で様々な指導をいただきました。 そのエンジニアリング能力、ビジネスも含めた視野の広さ、Mackerelに立ち上げたことに代表されるようなビジョンにはただただ圧倒される日々でした。 思い起こせば2年前、stanakaにMackerel事業の魅力やはてな東京オフィスでのエンジニアリングチームの立ち上げについて話をしていただきました。僕はそれらに魅力を感じはてなに入社しました。その後は、チーフエンジニアMackerelのディレクターなどの立場も与えてもらい、引き上げてもらったと感じています。 Mackerel事業にディレクターとして

    はてなに入って2年くらい経ちました。CTOとかMackerelとか | おそらくはそれさえも平凡な日々
  • コミュ力が無いのはいつだって自分 | おそらくはそれさえも平凡な日々

    突然何を言い出すのかという話ですが、対話相手にコミュニケーション能力を求める醜さについて書きたくなったので書きます。 僕はオタクだったしスクールカーストで言うと下の方を彷徨ってきた。地元でもいろいろあって浮いていた。新卒時の就活も散々だった。なので、コミュ力がないことは自覚しているし、だからこそ「コミュニケーション能力」という言葉には警戒心があります。 比較的マイノリティであったことが多かった経験上分かったのは、相手とコミュニケーションが取りづらいな、と思うときは、そもそもプロトコルが異なる、ということです。 これは、話している自然言語が違うようなものだと考えるとわかりやすい。例えば、自分が日語しか話せず、相手がロシア語しか話せないのであれば、まともなコミュニケーションが成り立たないのは明らかです。そして、その時に、日語が話せない相手にコミュ力がないと思うような人はいないでしょう。 そ

    コミュ力が無いのはいつだって自分 | おそらくはそれさえも平凡な日々
  • 「nginx実践入門」は紛うことなき「実践」の本だった | おそらくはそれさえも平凡な日々

    nginx実践入門 技術評論社様よりご恵贈頂きました。著者の1人である cubicdaiya さんより、いただけるというお話をもらった時は非常に光栄でした。ありがとうございます。 思っていたとおり非常に良いでしたが、特に良かった点としては、章立てを含めた構成の素晴らしさ、そしてまさに「実践」を意識したインフラアーキテクチャのになっている点だと思う。 Nginxのアーキテクチャ 静的ファイル配信 リバプロ構成 コンテンツ配信システム モニタリング LuaとかOpenRestyとかによる拡張 という章立てになっていて、流れが非常にわかりやすい。Nginxを軸にした、様々なインフラのデザインパターンの説明になっている。これは紛うことなき「実践」のであり、イマドキのインフラアーキテクチャについて学ぶ上でも良である。 静的ファイル配信、リバプロ構成、コンテンツ配信システム、それぞれの構成にお

  • #ISUCON 5の予選をトップ通過してきました | おそらくはそれさえも平凡な日々

    雑に稼ぐにはPerlはサイコーだぜ tokuhirom 主催のLINE様、毎年ありがとうございます。GCP使いやすかったです、Google様もありがとうございました。 さて、いつもながらfujiwaraさんと組んで1位を取ると、つい自分がすごいと錯覚してしまいそうになるのですが、すごいのはfujiwawaさんであって「僕ではない」ということを強く意識しないといけない。 とはいえ、久しぶりにfujiwaraさんと組んで、自分がどれくらい戦えるのか楽しみだったのですが、以前優勝させてもらった時よりも自分としては大きな手応えがあり、僕もfujiwaraさんと組ませてもらって恥ずかしくないくらいの実力はあるなと思いました。 今年のISUCON予選は、とにかくやることが尽きず、ずっと手を動かしながら改善を続けられる楽しさがあって、疲れましたが充実した時間を過ごすことができました。最近仕事でコード書く

    #ISUCON 5の予選をトップ通過してきました | おそらくはそれさえも平凡な日々
  • 何故僕はエンジニアとして対外発表をするのか | おそらくはそれさえも平凡な日々

    僕は来、人前に出て積極的に話そうとは思わないし、目立たずにおとなしく引きこもっていたいみたいな気持ちがある。潔癖な部分もあるので、プレゼンスばかり高くて技術力がないような中身が無い人間になりたくないし、そうなったら死ぬしか無い、みたいな気持ちもある。それなのに何故、ものすごく技術力があるわけではない自分が対外発表をするのか。 それは元はと言えば対外発表をするような側に行かないとエンジニアとして生き残れないのではないかという危機感があったからです。 Shibuya.pmの衝撃 初めて参加したShibuya.pmは#10だった。その頃の僕は一企業のよくある何でも屋の1人システム担当であり、開発のメインは前担当者から引き継いだレガシーASPだった。そしてつぶしの効く技術を習得したいと思いPerlを学び始めた頃だった。そしてPerlがそこそこ書けると手応えを感じ始めているところだった。 ところが

    何故僕はエンジニアとして対外発表をするのか | おそらくはそれさえも平凡な日々
  • ソースコード以外もとにかくテストする。もしくはカバレッジだけではダメだという話 | おそらくはそれさえも平凡な日々

    あなたはプロジェクトのソースコードに対して適切にCIを回しているかもしれません。定期的にコードカバレッジの測定も行い、90%以上もしくは100%の数字を出しているかもしれません。 しかし果たしてそれで十分でしょうか?もしくはコードカバレッジだけにとらわれすぎていないでしょうか? 監視とは(システムに対する)継続的なテストである、というのは筆者の尊敬する奥一穂氏の言葉ですが、その逆もしかりで 「テストとはプロジェクトに対する継続的な監視である」 ということも言えます。 その観点に立ってみると、プロジェクトのソースコード以外にもテストが必要なものがたくさんあることに気づくでしょう。以下に実際に筆者が自分のプロジェクトの中でソースコード以外にテストを書き、CIを回していたものを挙げてみます。 アプリケーション設定ファイルのテスト 開発中に番用の設定ファイルを使うことはないため、番用の設定ファ

    ソースコード以外もとにかくテストする。もしくはカバレッジだけではダメだという話 | おそらくはそれさえも平凡な日々