タグ

ブックマーク / itchyny.hatenablog.com (42)

  • 2017年を振り返って - プログラムモグモグ

    今年は仕事で関わっているプロダクトが大きな転換期を迎えて、様々な経験ができました。 ミドルウェアを自ら作り上げ、データをオンラインで移行し、運用を始めるというのはなかなか経験できないことだと思います。 サービスは以前より安定し、穏やかな年末を過ごしています。 今年は初めてカンファレンスで登壇しました。 慣れないことばかりで色々と戸惑いましたが、沢山の方に発表を聞きに来ていただいて嬉しかったです。 マネージドサービスを組み合わせて1つのソフトウェアを作り、それをサーバーレスミドルウェアとして抽象度を上げて捉えることができるようになったもの、このカンファレンスに参加してよかったことでした。 今年は19記事書きました。 特に、以下の記事は多くの方に読んでいただきました。 一年の後半にアウトプットが減速しているのは、カンファレンスの登壇に体力を使ってしまったこと、Prime VideoやAbema

    2017年を振り返って - プログラムモグモグ
    igrep
    igrep 2018/01/01
  • Go言語のsyscall.Sysctlは最後のNULを落とす - プログラムモグモグ

    カーネルのパラメータを引いたり設定したりする時に便利なのが sysctl コマンドです。 $ sysctl kern.ostype kern.ostype: Darwin このコマンドのシステムコールをGo言語から叩いて、OSの種類を引いてみましょう。 func main() { ret, _ := syscall.Sysctl("kern.ostype") fmt.Printf("%s\n", ret) } Darwin 問題ないですね。 数字を返すものを叩いてみましょう。 $ sysctl machdep.cpu.feature_bits machdep.cpu.feature_bits: 9221959987971750911 func main() { ret, _ := syscall.Sysctl("machdep.cpu.feature_bits") val := *(*ui

    Go言語のsyscall.Sysctlは最後のNULを落とす - プログラムモグモグ
    igrep
    igrep 2017/12/14
  • Serverlessconf Tokyo 2017で『サーバレスアーキテクチャによる時系列データベースの構築と監視』という発表してきました - プログラムモグモグ

    先日開催されたServerlessconf Tokyo 2017にスピーカーとして参加しました。 2017.serverlessconf.tokyo Mackerelの今の時系列データベースは、マネージドサービスを組み合わせて作っています。 検証・実装・投入フェーズを終えて、運用・新機能開発フェーズに入っています。そんな中で、監視サービスを提供する私たちが、サーバーレスアーキテクチャで作ったミドルウェアをどのように監視しているかについてお話しました。 何かしら役に立つことや発想の元となるようなことをお伝えできていたらいいなと思います。 私も他の発表から様々なことを学びました。特に面白かった発表を挙げておきます。 真のサーバレスアーキテクトとサーバレス時代のゲーム開発・運用 ゲーム開発を支えるBaaSを開発されるなかで得られた様々な知見についてお話されていました。 プッシュ通知のために大量の

    Serverlessconf Tokyo 2017で『サーバレスアーキテクチャによる時系列データベースの構築と監視』という発表してきました - プログラムモグモグ
  • 負荷を均すための『時間軸シャーディング』という考え方 - プログラムモグモグ

    ウェブアプリケーションを作っていると、負荷を分散させるために「タイミングをばらけさせる」場面に時々遭遇します。 データの更新、キャッシュのフラッシュ、バッチ処理など様々な問題で、同じ構造が見られます。 例えば、スマホアプリからバックグラウンドで1時間ごとに何らかの情報をサーバーに送りたいとします。 愚直に毎時0分に更新処理を行うようにすると、すべてのユーザーから同じタイミングでリクエストが来てしまいます。 ですから、リクエストのタイミングをユーザーごとにばらして負荷を均す必要があります。 他のケースを考えます。 5分ごとにジョブを投入して何らかの更新を行うタスクがあるとします。 来ならデータベースに更新を行いたいのですが、データベースのハードウェアの限界が近いので、更新データをまずキャッシュに乗せるようにしました。 何らかのタイミングでキャッシュからデータベースにフラッシュする必要があり

    負荷を均すための『時間軸シャーディング』という考え方 - プログラムモグモグ
    igrep
    igrep 2017/10/10
    “「タイミングをばらけさせる」と言っていたものを「時間軸のシャーディング」という言葉で表現することで、空間軸のシャーディングの用語を類推して用いることができます”
  • Mackerelのプラグインを書く楽しみ ― Rustでプラグインを書くためのライブラリを作りました! - プログラムモグモグ

    Mackerelは「エンジニアをワクワクさせる」ツールであることをサービスの大事な考え方の一つとして捉えています。 一体どういう場面でエンジニアはワクワクするのでしょうか。 簡単にインストールできるmackerel-agentや、直感的で触りやすい画面、チャットツールとの連携は大事な機能です。 しかし、監視ツールとしてもっと重要なのは、ミドルウェアのメトリックをどのように可視化し、何を監視するかということです。 Mackerelは公式のプラグインリポジトリに各種プラグインを揃えています (contributorの皆様ありがとうございます)。 これらはすべてGo言語で書かれています。 しかし、MackerelのプラグインはGo言語で書かなければいけない、ということはありません。 例えばカスタムメトリックのヘルプページのサンプルプラグインはRubyで書かれていますし、メタデータのヘルプのサンプ

    Mackerelのプラグインを書く楽しみ ― Rustでプラグインを書くためのライブラリを作りました! - プログラムモグモグ
    igrep
    igrep 2017/10/06
    Rustと相性良さそう。
  • ptraceシステムコール入門 ― プロセスの出力を覗き見してみよう! - プログラムモグモグ

    他のプロセスを中断せずに、その出力をミラーリングして新しくパイプで繋ぐ、そんなことはできるのでしょうか。 straceやgdbといったコマンドは一体どういう仕組みで動いているのでしょうか。 ptraceシステムコールを使い、プロセスが呼ぶシステムコールを調べて出力を覗き見するコマンドを実装してみたいと思います。 ptraceシステムコール Linuxを触っていると、いかにプロセスを組み合わせるか、組み合わせる方法をどれだけ知っているかが重要になってきます。 パイプやリダイレクトを使ってプロセスの出力結果を制御したり、コードの中からコマンドを実行して、終了ステータスを取得したりします。 プロセスツリーやプロセスグループを理解し、シグナルやnohupコマンドを使ったりします。 プロセスの扱いに慣れると疑問に持つのがstraceやgdbの仕組みです。 プロセスの実行しているシステムコールを出力し

    ptraceシステムコール入門 ― プロセスの出力を覗き見してみよう! - プログラムモグモグ
    igrep
    igrep 2017/08/01
    すばらしい
  • コマンドラインがさらに便利になるfillinコマンドを作りました! - プログラムモグモグ

    fillinというコマンドラインツールを作成しました。 コマンドの一部を変数化して、別の履歴に保存しておけるツールです。 ステージング環境と番環境のように、同じコマンドで複数の環境を切り替えるのに便利です。 zshの (エッセンシャルソフトウェアガイドブック) 作者:広瀬 雄二発売日: 2009/06/17メディア: 単行(ソフトカバー) どうして作ったの コマンド履歴って便利ですよね。 私はよくコマンド履歴からコマンドを選んで実行しています。 シェルに付属しているデフォルトの履歴を使っている方もおられるでしょうし、fzfやpecoのようなインタラクティブな絞り込みを行なっている方もいるでしょう。 私が一番困っていたのが、認証キーの扱いです。 webアプリを作っていてcurlで素早く確認するときに、認証キーやアクセストークンを打つことがあります。 アクセストークンのようなランダムな英

    コマンドラインがさらに便利になるfillinコマンドを作りました! - プログラムモグモグ
    igrep
    igrep 2017/06/12
    なるべく使わなくて済むようにはしたいけど覚えておこう。
  • Vimに自分の書いたパッチが取り込まれた! - プログラムモグモグ

    Vim 8.0.0623に私の書いたパッチが取り込まれました。 わーい ∩(>◡<*)∩ わーい! もともとのきっかけは、自分のプラグインを開発している中で、[\u3000-\u4000]という正規表現に対する挙動がset re=1とset re=2で違うことに気がついたのです。 Vimは正規表現エンジンを2つ積んでいる恐ろしいエディターなのですが、この2つの正規表現エンジンの挙動に微妙な違いがあることに気がつきました。 新しいNFAエンジンではエラーは出ませんが、古いエンジンではエラーが出ます。 古い正規表現エンジンでは、[a-z] みたいなパターンで、[\u3000-\u4000]のように差が大きすぎるとエラーを吐くのです。 この挙動の違いはまぁいいんです、エンジンの仕組みがぜんぜん違うので… ただ、この時のエラー番号E16でヘルプを引くと、コマンドのrangeに関するエラーなんです。

    Vimに自分の書いたパッチが取り込まれた! - プログラムモグモグ
    igrep
    igrep 2017/06/08
    おめでとうございます!あとは子どもにvimを教えるだけですね!
  • 円周率の16進数表現100億桁目を求めてみた! ― 円周率の世界記録をどのように検証するか ― - プログラムモグモグ

    あなたは円周率を何桁言えますか。3.14159…という、あの数字です。 円周率の小数部分は無限に続き、循環することもありません。 古来より、数学者は円周率の値を様々な幾何学的な近似や公式を用いて計算してきました。 その桁数は計算機の発明により飛躍的に伸び、収束の速い公式の発見や効率の良いアルゴリズムの発明などによって加速してきました *1。 5年前、私がまだ学生だった頃、円周率1億桁の計算に挑んだことがありました。 私にとって高精度計算の初めての挑戦で、様々な試行錯誤で苦労したのをよく覚えています。 itchyny.hatenablog.com 2017年現在、円周率計算の世界記録は22兆桁です。 円周率計算の歴史をご覧いただくとよく分かると思いますが、近年の円周率計算の世界記録からは次のような特徴が読み取れます。 2002年に1兆を超え、最新の記録 (2016年) は22兆桁 (10進数

    円周率の16進数表現100億桁目を求めてみた! ― 円周率の世界記録をどのように検証するか ― - プログラムモグモグ
    igrep
    igrep 2017/03/15
    ロマンだ…
  • Vim 8.0 リリース! - プログラムモグモグ

    Vim 8.0 released! Vim 8.0が先ほどリリースされました。10年ぶりのVimのメジャーバージョンアップです。 Vimのバージョンをcronで毎日上げ続け、最新のパッチを確認し続ける日々を送ってきました。そして、今日も夜11時のcronでバージョンが上がりました。新しいメジャーバージョン、8.0でした。 ここ一年はVimにとって様々な重要な機能が入りました。JSONエンコーダーとパーサー、パッケージ機構、channelとjob、タイマー、ラムダ式など、プラグイン製作者にとって大事な機能ばかりです。今後、より高度なプラグインがでてくることでしょう。これらの機能に対する日人の貢献は素晴らしいものです。 リポジトリをGoogle codeからGithubに移動するという重要な決定も行われました。この決定の過程にも、vim-jpの皆さんが深く関わっています。私は傍から応援するこ

    Vim 8.0 リリース! - プログラムモグモグ
    igrep
    igrep 2016/09/13
    Congrats!しかしVimでScalaとは...
  • CSVファイルをSQLのクエリで集計できるqコマンドをHaskellで実装してみました! - プログラムモグモグ

    先日、Twitterでqコマンドが話題になっていました。 github.com スターが3000を超えていてすごいですね。2014年から開発されているツールで、Pythonで書かれています。 これはGoで実装してみたいなーと思っていたところ、mattnさんが素早く実装されていました。 mattn.kaoriya.net取られたと思ったものの、よく読むとまだ標準入力しか対応していないようです。 いったいどういう仕組みなのか、何の実装が難しいところなのか、qコマンドが嬉しい場面はどういうケースなのか、自分も知りたくなったので1から実装してみました。 私が一番素早く書ける言語ということでHaskellを選びました。 qhs qコマンドのHaskell実装、ということでqhsと名づけました。 github.com stackが入っていればインストールは簡単です。 $ git clone ht

    CSVファイルをSQLのクエリで集計できるqコマンドをHaskellで実装してみました! - プログラムモグモグ
  • 30のプログラミング言語でFast inverse square rootを実装してみました! - プログラムモグモグ

    あなたの好きな言語は何ですか。そして、あなたの好きなアルゴリズムは何ですか。 好きな言語があると、その言語でどんな問題でも解決しようとなりがちになります。その言語を極めるのは素晴らしいことですが、その言語や似たような言語でしかコードが書けなくなったり、他の言語に対して見向きもしなくなってしまう可能性があります。 勇気を出して新しい言語にチャレンジしてみませんか?色々な言語に挑戦してみませんか? 何から始めればいいか分からない。次にどの言語を学べばいいか分からない。いま特に何も困っていない。何でも得意な言語で書けてしまう。そういう人が多いのではないでしょうか。 新しい言語にチャレンジするきっかけを作る一つの方法は、ある特定のアルゴリズムを一つ決めて、あらゆる言語で実装してみることです。解く問題が大きすぎると力尽きてしまうので、せいぜい20〜30行程度で書ける簡単なものが良いでしょう。大事なこ

    30のプログラミング言語でFast inverse square rootを実装してみました! - プログラムモグモグ
    igrep
    igrep 2016/07/26
    すばらしい。
  • Vimの標準プラグインmatchparenが遅かったので8倍くらい速いプラグインを作りました - プログラムモグモグ

    コードを書いているとき、対応する括弧はとても大事です。エディターの中でカーソル下の括弧がどこと対応しているかが一目でわかると便利です。Vimの標準のプラグインにmatchparenというプラグインがあります (:h matchparen)。 私もずっとmatchparenのハイライトに依存してコードを書いてきました。しかし、だんだんこのプラグインのパフォーマンスが気になるようになってきました。標準プラグインなのですがわりと重い処理をやっていると思います。対応括弧をハイライトするプラグインによって余計な処理が行われて、コーディングの妨げになってはあまりよくありません。 最初はパッチを送ることも考えましたが、プロファイルを取った結果、どうしてもある機能を実現するために必要な処理が重くて時間がかかっていることに気が付きました (3日くらい前のことです)。その機能を落とすのは標準プラグインには受け

    Vimの標準プラグインmatchparenが遅かったので8倍くらい速いプラグインを作りました - プログラムモグモグ
    igrep
    igrep 2016/03/31
    相変わらずすごい。
  • Haskellでimport文をソートするプラグイン vim-haskell-sort-import を作りました - プログラムモグモグ

    Go言語には、gofmtというコードフォーマッターがあります。 標準ライブラリーで備えており、このフォーマッターをかけることを半ば強制することにより、Goで書かれたコードはどれも統一的なスタイルをしているように見えます。 gofmtには様々な機能がありますが、特にimportしているモジュールをソートしてくれるのが便利だなと思います。 フォーマッターがimportのモジュールをソートしてくれるのはとても便利です。 第一に、どのファイルにおいてもあるモジュールはだいたい同じ場所にあります。 例えばbufioモジュールは上のほうで、osモジュールは下のほうがといった感じです。 第二に、モジュールを追加するときにどこに追加すればよいかということに気を回さなくてすみます。 何か新しいモジュールを追加しようという時に、どこに追加するかについて私たちはかなり気を使っているように思います。 もちろん、i

    Haskellでimport文をソートするプラグイン vim-haskell-sort-import を作りました - プログラムモグモグ
    igrep
    igrep 2016/01/24
    すばらしい!
  • Haskellで無限個の無限リストをソートされた形で結合する - プログラムモグモグ

    CodeforcesやProject Eulerの問題には、無限リストをうまく使うと綺麗に解くことができる問題がたくさんあります。 数列の性質から探索範囲の上界を決めて解を探索することが多いのですが、きちんとした根拠を持って上界を決めることができることは少なく、余裕を持って十分に広い範囲で計算して解を求める解法がよく取られます。 Haskellの特徴である遅延評価とその洗練された糖衣構文を用いると、無限リストを簡単に扱うことができます。 上界を適当に定める解法よりも、より宣言的で美しく、時に効率的なコードで同じ解を得ることができます。 しかし、無限リストをきちんと、それも無限個の無限リストをきちんと扱うとなると、意外と苦労します。 この記事では、無限個の無限リストをソートされた形で結合する方法について説明します。 一般的な無限リストではなく、条件はかなり絞っていてます (そうでないと原理的

    Haskellで無限個の無限リストをソートされた形で結合する - プログラムモグモグ
    igrep
    igrep 2016/01/18
    " 目の前にあるデータの数学的な性質をしっかりと見抜き、効率のよいアルゴリズムを考えて、問題を解く"
  • 2015年を振り返って - プログラムモグモグ

    今年は働き始めた年でした。環境が大きく変わりました。新しい環境は毎日刺激が多く、とても楽しく過ごしています。 入社してちょうど三か月した時、自分にとってとても大きなことが起こりました。ある仕事を与えられたのですが、その解決したい問題に対するアプローチを自ら考えて、自発的に編み出した解決法によって問題を解決したのです。入社してまだ間もないひよっこのような自分が、自らの能力を活かしてプロダクトに貢献できたことで、とても自信がつきましたし、この会社で自分が役に立っていけそうという安心感もありました。この成果によって社内の人からも評価していただき、とても嬉しく思いました。 今年はブログは28記事書きました。特に以下の記事は、多くの方々から反応をいただきとても感謝しています。 itchyny.hatenablog.com itchyny.hatenablog.com itchyny.hatenabl

    2015年を振り返って - プログラムモグモグ
    igrep
    igrep 2016/01/01
    “便利ソフトウェアを作った→実はHaskell製でしたというストーリーが好きなので、今後もそういうエントリーが出てくるかもしれません。”
  • Haskellで書かれたおもしろいFizzBuzz ― Haskellで読めないコードに遭遇した時に解読する方法を徹底解説! - プログラムモグモグ

    Haskellには抽象的な高階関数や演算子がいくつもあり、たまにそれらを巧妙に用いたコードがでてきて感心することがあります。 他の人が書いたHaskellのコードを読んでいると、なかなか面白いものと遭遇したりします。 巧妙に書かれたコードを解読していくと、実は型クラスのinstanceをうまく組み合わせて使っていて、とてもよい教材になることがあります。 実際にアプリケーションコードを書いていてここまで技巧的なコードを書くわけではありません。しかし、こういうコードを読み解くのは型クラスのいい練習になりますし、それまで知らなかったinstanceと遭遇したりしたときは、とても勉強になるのです。 このエントリーでは、とても技巧的なFizzBuzzを紹介し、それを読み解いていく方法を紹介します。 Haskellの初心者向けに、どういうふうに関数や型を調べて言ったらいいかを丁寧に書いています。 Ha

    Haskellで書かれたおもしろいFizzBuzz ― Haskellで読めないコードに遭遇した時に解読する方法を徹底解説! - プログラムモグモグ
    igrep
    igrep 2015/12/29
    想像以上に複雑だった。。。
  • 汎用的なコードの依存関係の抽出ツール rexdep を作りました! ― 正規表現で依存関係を大雑把に抽出しよう! - プログラムモグモグ

    あらすじ ソフトウェアの中の依存関係について 正規表現で抽出できることとその限界 コードの依存関係を抽出するツール rexdep を作りました ソフトウェアの構造を概観するには あなたは、大きなソフトウェアを目にした時、何をしますか? ファイルが何十、何百もある時、どこから読みますか? ソフトウェアが巨大になると、そのコードの構造を把握するのは難しくなります。 特にプロジェクトに入りたての人にとって巨大なコードベースを一目で理解することは難しく、細かなタスクをこなしていく中で徐々に「どこに何が書いてあるか」を理解していくしかありません。 ソフトウェアによってはモデルとコントローラ、データベースとビューと言った具合にコードが分かれており、これくらいの分類はディレクトリ名を見れば理解できるかもしれません。 しかしそのようなざっくりとしたコードの分類が分かったところで、ソフトウェアの構造を理解し

    汎用的なコードの依存関係の抽出ツール rexdep を作りました! ― 正規表現で依存関係を大雑把に抽出しよう! - プログラムモグモグ
    igrep
    igrep 2015/11/19
    すばらしい。今までありそうでなかった感じ。Railsみたいなrequireなくしちゃうケースはクラス名の正規表現でマッチさせるしかないかな。。。
  • Vim用のHaskellインデントプラグインvim-haskell-indentを作りました - プログラムモグモグ

    Haskellはインデントが意味を持つ言語です。コーディングするときには、エディターがいかに心地よく空気を読んでインデントを入れてくれるかが重要になってきます。HaskellのVim用インデントプラグインはこれまでいくつかありましたが、それらはどれも機能が少なすぎて、普段からHaskellを書く私にとっては苛々するものばかりでした。とても心地よいインデントをサポートしてくれるインデントプラグインはありませんでした。 とにかくHaskellの最強のインデントプラグインが欲しいということで、作りました。 VimでHaskellを書いているよという方は、ぜひインストールしてお使いください。 今のところ以下のような構文に対応しています。 データ型のインデント derivingの後はインデントをやめる guardのインデント otherwiseの後はインデントをやめる whereのインデント mod

    Vim用のHaskellインデントプラグインvim-haskell-indentを作りました - プログラムモグモグ
  • シンプルでかつ最高のJavaScriptプロファイラ sjsp を作りました! ― Webアプリケーションが複雑化する中でプロファイラに求められるものとは何か - プログラムモグモグ

    あらすじ Web技術が複雑になる中で、JavaScriptのプロファイリングをとる方法とは。 プロファイリングを取るためのコードを手で書いてみましょう。 とてもシンプルで、かつ最高のJavaScriptプロファイラ sjsp を作りました。 当にあった怖い話 上司 「とにかくJavaScriptのコードを速くしてくれ」 私 「分かりました、速くします」 (次の日) 私 「いいプロファイラがないなら作ればいいじゃない」 同じチームの人 「えっ?」 私 「最高のJavaScriptプロファイラ作ったよ」 同じチームの人 「「えっえっ???」」 私 「早速使ってみたらこことここが遅いって分かったよ」 同じチームの人 「「「この子は一体…」」」 JavaScriptのプロファイリングの難しさ 近年、Webブラウザーの処理速度は著しく向上し、その可用性の高さから、アプリケーションのプラットフォーム

    シンプルでかつ最高のJavaScriptプロファイラ sjsp を作りました! ― Webアプリケーションが複雑化する中でプロファイラに求められるものとは何か - プログラムモグモグ
    igrep
    igrep 2015/07/01
    なぜHaskellかは「抽象構文木を扱うにはとても適した言語だと思います」って書いてある通り!詳しくはHaskellやってみましょう!