タグ

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

  • jq 1.7をリリースしました - プログラムモグモグ

    jqがjqlang organizationに移譲され、数名の新たなメンテナーを入れた開発体制に移行してから三か月が経ちました。 私にとってこの三か月はとても濃厚で、これまでのOSS活動の中でも特に大変な期間でした。 itchyny.hatenablog.com github.com リポジトリの管理権限をいただいてからまずやったことは、既存のissueやPRの整理でした。 500ほどのissueとPRに目を通し、ラベルをつけて、解決済みのものを閉じて、直近で入れたいものを独断でリリースマイルストーンに入れていきました。 この整理がついた頃には他のメンテナの活動も活発になり、私の作ったマイルストーンのissueやPRを確認してくれました。 そして先日、ようやく1.7をリリースしました。 1.6から実に五年弱、一時は開発が完全に止まってしまいプロジェクトの存続を危ぶむ声も上がるような状況から

    jq 1.7をリリースしました - プログラムモグモグ
    peketamin
    peketamin 2023/09/11
    すばら!
  • jq が jqlang organization に移譲されました - プログラムモグモグ

    JSONを操作するコマンドラインツールであるjqは、これまでオリジナル作者であるStephen Dolan氏 (@stedolan)のリポジトリ(github.com/stedolan/jq)で管理されていました。 メンテナンスはNico Williams氏 (@nicowilliams)とWilliam Langford氏 (@wtlangford)の二名が行なっていましたが、近年は活動が減っておりメンテナンスが滞っていることが度々指摘されていました。 最新のリリースは2018年11月に行われた1.6であり、その後に様々なバグ修正やパフォーマンス改善、新機能の実装が行われているのにリリースされておらず、またissueやPRも放置されがちになっていました。 さらにCI (AppVeyor)は常に落ちるので、簡単なドキュメント修正でもCIが通らず苦情が来る、数か月放置されたPRは作った人が諦

    jq が jqlang organization に移譲されました - プログラムモグモグ
    peketamin
    peketamin 2023/05/30
  • Go言語に出したプロポーザルが通った:{bytes,strings}.ContainsFuncの追加 - プログラムモグモグ

    今年の夏にGo言語に以下のようなプロポーザルを出していたのですが、それが先ほど承認されました。標準パッケージの関数追加になります。 proposal: bytes, strings: add ContainsFunc · Issue #54386 · golang/go · GitHub Go言語のstringsパッケージとbytesパッケージには、文字列から文字や部分文字列を探す関数がいくつかあります。 探す文字の位置を返す関数、最後から探す関数、そういう文字が含まれるかどうかを返す関数を表にまとめると、次のようになります。 Find what? Index* LastIndex* Contains* substr string Index(s, substr string) int LastIndex(s, substr string) int Contains(s, substr s

    Go言語に出したプロポーザルが通った:{bytes,strings}.ContainsFuncの追加 - プログラムモグモグ
    peketamin
    peketamin 2022/12/09
    すばら
  • 株式会社はてなを退職しました - プログラムモグモグ

    日2021年9月30日が最終出社日でした。1か月間のお休みをいただき、11月から新しい職場で働きます。2015年4月に新卒入社して、Mackerelチームとブックマークチームに所属しました。約六年半、お世話になりました。どちらのプロダクトも携わることができて楽しかったです。 入社時はウェブサービスの実装について何も知らない状態でした。しかしMackerelチームの優秀な先輩と理解あるプロダクトオーナーとディレクターに支えられて、様々なことを学びながらサービスと共に成長できました。サーバーやフロントエンドを書いたり、機能を作ったり閉じたり、年の瀬の夜中に障害対応したり、ioドメインが壊れたり、Linuxカーネルのコードを読んだり、時系列DBをクラウド上で実装したり、競合との差別化を考えたり、お客様とサービスの強み弱みについて議論したりしながら、SaaSビジネスをやる上での色々なことを経験で

    株式会社はてなを退職しました - プログラムモグモグ
    peketamin
    peketamin 2021/10/01
  • Regexp::AssembleのGo実装 rassemble-go を作りました - プログラムモグモグ

    PerlにはRegexp::Assembleという便利なライブラリがあります。 複数の正規表現を受け取り、それらのいずれかにマッチする正規表現を構築するためのライブラリです。 my $ra = Regexp::Assemble->new; $ra->add( 'ab+c' ); $ra->add( 'ab+\\d*\\s+c' ); $ra->add( 'a\\w+\\d+' ); $ra->add( 'a\\d+' ); print $ra->re; # prints (?:a(?:b+(?:\d*\s+)?c|(?:\w+)?\d+)) このライブラリのGo実装を金曜日の夜から書き始めて、ようやく形になってきたので公開しました。 package main import ( "fmt" "log" "github.com/itchyny/rassemble-go" ) func main

    Regexp::AssembleのGo実装 rassemble-go を作りました - プログラムモグモグ
    peketamin
    peketamin 2020/10/26
  • Go言語で日時と文字列を相互変換するライブラリtimefmtを作りました - プログラムモグモグ

    Go言語でstrftime・strptime相当の関数を提供するライブラリを実装しました。 t, _ := timefmt.Parse("2020/07/24 09:07:29", "%Y/%m/%d %H:%M:%S") fmt.Println(t) // 2020-07-24 09:07:29 +0000 UTC str := timefmt.Format(t, "%Y/%m/%d %H:%M:%S") fmt.Println(str) // 2020/07/24 09:07:29 str = timefmt.Format(t, "%a, %d %b %Y %T %z") fmt.Println(str) // Fri, 24 Jul 2020 09:07:29 +0000 なぜ作ったか Go言語の標準ライブラリには日時と文字列を変換する関数がありますが、2006年1月2日の15:04

    Go言語で日時と文字列を相互変換するライブラリtimefmtを作りました - プログラムモグモグ
    peketamin
    peketamin 2020/08/03
  • gojqのパーサーを書き直しました - プログラムモグモグ

    jqはJSONを絞り込むツールですが、実はれっきとしたプログラミング言語です。 算術演算子、論理演算子、分岐構文、try・catch、そして関数定義があり、ループは再帰関数で実装します。 単に .foo とか .[0] とかでJSONを辿るだけのツールだと思われている方は、builtin関数の定義を見ていただくと良いかと思います。 selectやmapのように、よく使われる関数でさえ内部実装になっていない (Cで書かれていない) のは面白いですね。 jqのクエリを思ったように書けないという経験から、jqをより深く知るためにGo言語で再実装したのがgojqです。 去年の4月から開発を始め、8月にブログ記事を書きました。 jqのほぼすべての機能を実装しており、pure Goで書かれているのでGo言語のツールに簡単に組み込むことができます。 この記事公開以降も開発を続けています。 --arg,

    gojqのパーサーを書き直しました - プログラムモグモグ
    peketamin
    peketamin 2020/07/09
  • HomebrewのインストーラーをRubyからBashに書き直しました! - プログラムモグモグ

    みなさんはHomebrewをお使いでしょうか。macOSをお使いの多くの開発者が使っていると思います。 HomebrewのインストーラーはRubyで書かれており、次のコマンドでインストールするようになっていました。 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" HomebrewがRubyに依存していることは良いのですが (formulaの書きやすさはRubyならでは)、インストーラーの話になると事情が変わってきます。HomebrewのインストールコマンドはmacOSの工場出荷状態でも動く必要があります。こういうものにRubyを使っているのはリスクがあります。 将来的にmacOSデフォルトにRubyPythonが含まれなくなる (参考リンク

    HomebrewのインストーラーをRubyからBashに書き直しました! - プログラムモグモグ
    peketamin
    peketamin 2020/03/03
  • ファイルをエディターで一括リネームするツールをGo言語で作った! ― 機能を増やさない信念と、OSSとの付き合い方 - プログラムモグモグ

    ファイルを一括でリネームしたいことはありませんか。私はあります。ということで作りました。 インストールはHomebrew brew install itchyny/tap/mmv または以下のコマンドでできます。 go get github.com/itchyny/mmv/cmd/mmv スクリーンショットではvimが起動していますが、 $EDITOR が設定されていればそれを使って編集することができます。 エディターでファイル名を編集して一括でリネームするというのは、新しい発想ではありません。 実際、多くのソフトウェア (特にファイラー) がこの機能を実装しています。 massren vimv qmv Vim plugin vimfiler Defx Vaffle fila.vim Emacs Dired 私はvimfilerの一括リネーム機能をよく使っていました。 特に不満はないのです

    ファイルをエディターで一括リネームするツールをGo言語で作った! ― 機能を増やさない信念と、OSSとの付き合い方 - プログラムモグモグ
    peketamin
    peketamin 2020/01/10
    設計上ケアしてることをあげてくれているとこがありがたい
  • 開発環境構築スクリプトのCIをGitHub Actionsで回す - プログラムモグモグ

    小ネタですが、開発環境の構築はスクリプト化して、CIを回そうという話です。 開発環境を構築することは年にそう何回もあるわけではないですが、スクリプトを一発叩いて必要なツールが揃うようにしておくと便利です。私は素朴にシェルスクリプトで書いています。好きな言語で書けばいいと思いますが、macOSは将来的にRubyPythonといったスクリプト言語を排除しようとしていて、不安ですね。Ansibleみたいなのを使ってもいいと思います。私はちょっと苦手で… あくまで私用のスクリプトなので使わないでください。 このスクリプトを叩いてしまえば、iTerm2やVim、tmux、自分のdotfilesの配置と言語処理系のインストール、Google ChromeSlackのインストールを行ってくれます。モダンなプロジェクトならdockerさえあればいいんでしょうが、なかなかそういうわけにはいかないですよね

    開発環境構築スクリプトのCIをGitHub Actionsで回す - プログラムモグモグ
    peketamin
    peketamin 2019/11/18
  • jqのGo実装 gojq を作りました! ― スタックマシン型インタープリタによるイテレータセマンティクスの実装 - プログラムモグモグ

    jqはとても便利なコマンドです。 JSONを返すAPIを実装するときや、SaaSのAPIから特定の情報を抜き出してシェル変数に代入するときなど、web開発や運用には欠かせないツールとなっています。 しかし、私にとってjqのクエリを一発で書くのは容易ではなく、思い通りの出力が得られないことがよくありました。 難しいエラーメッセージに悩まされて、jqで書くのを諦めて別の言語で書き直すこともありました。 jqの十八番と思える場面で使いこなせないのは、なかなか悔しいものがあります。 ツールを使うのが難しいなら、同じものを作ってしまえばよいのです。 jqの全ての機能を実装する jqを言語としてきちんと書けるようになる jqを完全に理解する jqの全ての機能を自分で実装してしまえば、jqがどういうものか、クエリがどのように処理されるのか、詳しくなれるはずです。 jqを得意な言語と言えるようになって、ク

    jqのGo実装 gojq を作りました! ― スタックマシン型インタープリタによるイテレータセマンティクスの実装 - プログラムモグモグ
  • joのGo実装 gojo を作りました! - プログラムモグモグ

    joというJSONを組み立てるコマンドがあって、これは2016年からある便利なCLIツールなのですが、昨日急に思い立ってGo実装を作りました。 go get github.com/itchyny/gojo/cmd/gojo brewでもインストールできます。 brew install itchyny/tap/gojo 使い方はこんな感じ。 $ gojo foo=bar qux=quux {"foo":"bar","qux":"quux"} $ gojo -p foo=bar qux=quux { "foo": "bar", "qux": "quux" } $ gojo -a foo bar baz ["foo","bar","baz"] $ seq 10 | gojo -a [1,2,3,4,5,6,7,8,9,10] $ gojo -p foo=$(gojo bar=$(gojo baz

    joのGo実装 gojo を作りました! - プログラムモグモグ
    peketamin
    peketamin 2019/03/17
  • バイナリエディタを作りました! - プログラムモグモグ

    バイナリエディタを作りました。 インストールはHomebrew brew install itchyny/tap/bed または以下のコマンドでできます。 go get github.com/itchyny/bed/cmd/bed なぜ作ったのか 私は昔からファイルフォーマットに興味があり、画像ファイルやPDFファイルのフォーマットを調べるのが好きでした。 最近も圧縮ファイルのフォーマットを趣味で調べたりしています。 コンパイラ技術にも興味があり、ゆくゆくは実行ファイルを生成したりしたいなという思いもあります。 バイナリファイルをエディットするにはバイナリエディタが必要となるわけですが、自分の手に馴染むUIを持つエディタがありませんでした。 私は実はVimというエディタが好きなので、Vimのようなインターフェースを持ち、ターミナルの中で動くエディタを探したのですが、なかなかありません。 b

    バイナリエディタを作りました! - プログラムモグモグ
    peketamin
    peketamin 2018/04/10
  • Go言語のHTTPリクエストのレスポンスボディーとEOF - プログラムモグモグ

    Reader interface の Read 関数は、どのタイミングで io.EOF を返すのでしょうか。 まずは strings.Reader で見てみましょう。 package main import ( "fmt" "strings" ) func main() { r := strings.NewReader("example\n") for { var b [1]byte n, err := r.Read(b[:]) fmt.Printf("%d %q %v\n", n, b, err) if err != nil { break } } } 結果 1 "e" <nil> 1 "x" <nil> 1 "a" <nil> 1 "m" <nil> 1 "p" <nil> 1 "l" <nil> 1 "e" <nil> 1 "\n" <nil> 0 "\x00" EOF Readの結

    Go言語のHTTPリクエストのレスポンスボディーとEOF - プログラムモグモグ
    peketamin
    peketamin 2017/12/12
  • 負荷を均すための『時間軸シャーディング』という考え方 - プログラムモグモグ

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

    負荷を均すための『時間軸シャーディング』という考え方 - プログラムモグモグ
    peketamin
    peketamin 2017/10/10
  • Mackerelのプラグインを書く楽しみ ― Rustでプラグインを書くためのライブラリを作りました! - プログラムモグモグ

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

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

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

    ptraceシステムコール入門 ― プロセスの出力を覗き見してみよう! - プログラムモグモグ
    peketamin
    peketamin 2017/07/31
  • 円周率の16進数表現100億桁目を求めてみた! ― 円周率の世界記録をどのように検証するか ― - プログラムモグモグ

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

    円周率の16進数表現100億桁目を求めてみた! ― 円周率の世界記録をどのように検証するか ― - プログラムモグモグ
    peketamin
    peketamin 2017/03/14
  • LLVMを始めよう! 〜 LLVM IRの基礎はclangが教えてくれた・Brainf**kコンパイラを作ってみよう 〜 - プログラムモグモグ

    コンパイラを作ってみたいと思っていても、アセンブリ言語はよくわからない。 パーサーみたいなコードは書いたことがあるけれど、コード生成の処理はさっぱりだ。 実行ファイルをバイナリエディターで見るとかなにそれ怖い。 そんな私なのですが、LLVMに興味を持ち始めています。 SwiftRust、あるいはEmscriptenなど、近年注目されている言語やコンパイラ技術の中枢にはLLVMがあります。 アセンブリはよく分からなくてもLLVMを使いこなせるようになれば、マルチプラットフォームで実行ファイルを生成できる言語処理系を作るのではないか。 コンパイラ作ってみたいな、LLVMを使ってみようかなと思っている今日このごろです。 ところが、いざLLVMを勉強しようと思ってもどこから始めればいいかよく分かりませんでした。 マニュアルは巨大で読む気が起きないし、リファレンスを見てもさっぱりです。 雰囲気はわ

    LLVMを始めよう! 〜 LLVM IRの基礎はclangが教えてくれた・Brainf**kコンパイラを作ってみよう 〜 - プログラムモグモグ
    peketamin
    peketamin 2017/02/27
  • 二週間で簡単なインタープリタ言語を実装してみた (日記) - プログラムモグモグ

    私は昔から言語処理系に興味があり、自分で言語を作ることを夢見てきました。 しかし、いざ言語を実装しようと思って言語処理系に関するを読んでも何から手を付けていいか分からず、アセンブラもまともに読めないまま、数年が経ってしまいました。 大学時代は情報系ではなかったため、コンパイラの実験がある情報系の学科のカリキュラムを羨ましく思い、情報系の授業の教科書を手にとって見ても読む気が起きず、自分に作れるのは所詮、構文木をちょこっといじって変換するレベルのもの (例えばsjspなど) にとどまっていました。 そんな中、去年のRebuild.fmで、とても感銘を受けた回がありました。 LLVMのlinkerであるLLDを開発されているrui314さんの回です。 rebuild.fm セルフコンパイルできるC言語のコンパイラを実装するという話のなかで、インクリメンタルに開発する重要性について話をされてい

    二週間で簡単なインタープリタ言語を実装してみた (日記) - プログラムモグモグ
    peketamin
    peketamin 2017/01/23