タグ

ブックマーク / mattn.kaoriya.net (140)

  • Big Sky :: VimConf 2023 Tiny に参加しました

    はじめに 11/18、東京秋葉原のアキバプラザで、4年ぶりとなる VimConf、「VimConf 2023 Tiny」が開催されました。 今回、Kaoriya さんから「SoftwareDesign で執筆した内容で基調講演をして欲しい」とお願いされた際に、即答で OK をしましたが実は少し不安がありました。SoftwareDesign を事前に購入した人に同じ話を聞かせてしまうのは残念すぎないかという気持ちです。どうしようかとしばらく検討しましたが、SoftwareDesign の内容からスピンオフした内容にする事にしました。 規模が少し小さいとは言え、せっかく楽しみにきて頂いてる皆さんに、残念に思われないようにしたい、少しでも「来て良かった」と思って貰えるイベントにしたと思い、テーマは変えないまま色々な Bram Moolenaar 氏のエピソードを盛り込んだつもりです。 11/18

    Big Sky :: VimConf 2023 Tiny に参加しました
  • Big Sky :: Go 言語プログラミングエッセンスという本を書きました。

    2023/3/12 発売です。 Go言語プログラミングエッセンス エンジニア選書 mattn 技術評論社 Kindle版 / ¥3,450 (2023年03月09日) 発送可能時間: Go が発表された当初から Go を見続けて来たので ずいぶん時間が経った気がします。僕なりにいろいろな活動をして来ました。Go 体や周辺ツールへのコントリビュート、イベント登壇、雑誌への記事の投稿や「みんなのGo言語」の共著など。 あらゆる活動が Go づくめで刺激的でした。Go で得たものも沢山あります。そして Go を使う人も想像していた以上に沢山増えました。Go に関して書かれたブログ、Go の求人、今では大学で Go を教えているところもあるくらいです。Go を知った事で僕のプログラミング人生はずいぶん変わりました。それまでは何を作るにしてもC言語をメイン言語として使ってきましたが、今や新しいアプ

    Big Sky :: Go 言語プログラミングエッセンスという本を書きました。
  • Big Sky :: errors.Join が入った。

    errors, fmt: add support for wrapping multiple errors · golang/go@4a0a2b3 · GitHub An error which implements an "Unwrap() []error" method wraps all the non-nil errors in the returned ... https://github.com/golang/go/commit/4a0a2b33dfa3c99250efa222439f2c27d6780e4a Go でエラーを扱う際に、複数のエラーを束ねたい事があります。例えば複数のタスクを実行し、1つでもエラーになれば中断するのではなく、一通りタスクを実施し終えた結果を返したい様なニーズです。 package main import ( "errors" "log" "os"

    Big Sky :: errors.Join が入った。
  • Big Sky :: unsafe.StringData、unsafe.String、unsafe.SliceData が入った。

    Go ではバイト列と文字列は異なる内部データとして扱っています。[]byte から string へ変換したり、またその逆を行う際にはキャストが必要になります。ですので string はイミュータブルになります。 しかしイミュータブルなのは理解しつつもバイト列を文字列にする為に無駄なアロケートをしたくない場合もあります。これまで Go ではドキュメントに明文化していなかった為に色々な作法が生まれてしまっていました。その代表的な物が以下です。 s := *(*string)(unsafe.Pointer(&b)) 来は、Go のバイト列の内部は SliceHeader という構造体により管理されています。 type SliceHeader struct { Data uintptr Len  int Cap  int } また string は以下の StringHeader で管理されて

    Big Sky :: unsafe.StringData、unsafe.String、unsafe.SliceData が入った。
  • Big Sky :: Re: Go言語で画像ファイルか確認してみる

    Go言語で画像ファイルか確認してみる - Qiita Go言語で書かれたサーバーサイドでアップロードされたファイルが画像ファイルか確認する必要があったため今後の備忘録として記載します。 https://qiita.com/tebakane/items/b7a47379659d42364c8d 実は Go にはそれ専用の関数が用意されています。 http package - net/http - Go Packages Package http provides HTTP client and server implementations. Get, Head, Post, and PostFo... https://pkg.go.dev/net/http#DetectContentType バイト列を指定して以下の様に呼び出すだけです。 ct := http.DetectContentTy

    Big Sky :: Re: Go言語で画像ファイルか確認してみる
  • Big Sky :: net/url に JoinPath が入った。

    Go で URL を扱う時は通常、net/url を使います。その際、例えばベースとなる URL にパスを足そうと思うと意外としんどかったりしました。 package main import ( "fmt" "log" "net/url" "path" ) func main() { endpoint := "https://example.com" u, err := url.Parse(endpoint) if err != nil { log.Fatal(err) } u.Path = path.Join(u.Path, "foo", "bar", "baz") endpoint = u.String() fmt.Println(endpoint) } 一部の方は「ハァッ?文字列で足せばいいじゃん」と思われるかもしれませんが、URL のパスを扱うという行為は実はとても難しい事なのです

    Big Sky :: net/url に JoinPath が入った。
  • Big Sky :: 「R が生産性を高める〜データ分析ワークフロー効率化の実践」を読んだ。

    Rが生産性を高める〜データ分析ワークフロー効率化の実践 igjit, atusy, hanaori 技術評論社 Kindle版 / ¥3,126 (2022年01月21日) 発送可能時間: もともとデータ解析というか機械学習に幾らか興味があり、このブログや Zenn 等でも幾らか記事を書いてきたのですが、R 言語に関してはほぼほぼノータッチで、たまに遊んだりはしていましたが使えるというレベルではありませんでした。 以前から vim-lsp-settings という、Vim からあらゆる Language Server をインストールできるプラグインを作っており、そこで R の Language Server を試したところ、Windows で動かないバグを見付けパッチを送った際に少し触ったのが初めて R を触った体験です。このパッチがマージされたのをきっかけに少しだけ R を触る様になりま

    Big Sky :: 「R が生産性を高める〜データ分析ワークフロー効率化の実践」を読んだ。
  • Big Sky :: RapidJSON や simdjson よりも速いC言語から使えるJSONライブラリ「yyjson」

    おなじみC/C++から使えるJSONライブラリを紹介するコーナー。まずは過去のまとめ。 ヘッダファイルだけでC++から使えるJSONパーサ「picojson」が凄い! 何も見ずにC++でjsonパーサが書けるか試してみた。 C言語から使えるJSONパーサ、JSMNを試してみた。 僕がboost::asioとboost::property_treeを使いHTTPプロキシ環境下で非同期にGoogle Search APIから検索するまでにやった、たった一つの事。 C言語から使えるJSONパーサ、parson が思った以上に良い仕事をしている。 最速と言われる JSON パーサ「rapidjson」が当に爆速なのか試してみた。 C言語から使えるJSONパーサ、jansson がとても直感的で良い C++ で STL フレンドリに扱えるJSONパーサ「json.hpp」 コメントも扱える高機能な

    Big Sky :: RapidJSON や simdjson よりも速いC言語から使えるJSONライブラリ「yyjson」
  • Big Sky :: Go の struct は小さくできる(fieldalignment のススメ)

    動的型付けプログラミング言語や、class を持つようなプログラミング言語を使う場合、そのフィールドメンバの定義順などを意識する事は少ないかもしれません。 Go は struct という、C言語が持っている構造体と同じ様にメモリ配置され、構造体そのものをレシーバとして、メソッドを定義しつつプログラミングを行います。struct はデータ構造そのものを示し、それが大きくなるにつれ、当然ながらメモリ使用量も多くなります。 さて、例えば以下のコードを実行すると、struct 100 個分のサイズは幾らになるでしょうか。 package main import ( "fmt" "unsafe" ) type Account struct { TimeZone struct { Name       string `json:"name"` UtcOffset  int    `json:"utc_

    Big Sky :: Go の struct は小さくできる(fieldalignment のススメ)
  • Big Sky :: 「エキスパートたちのGo言語」を読んだ。

    エキスパートたちのGo言語 一流のコードから応用力を学ぶ Software Design plus 上田 拓也, 青木 太郎, 石山 将来, 伊藤 雄貴, 生沼 一公, 鎌田 健史, 上川 慶, 狩野 達也, 五嶋 壮晃, 杉田 寿憲, 田村 弘, 十枝内 直樹, 主森 理, 福岡 秀一郎, 三木 英斗, 森 健太, 森國 泰平, 森 望, 山下 慶将, 渡辺 雄也 技術評論社 Kindle版 / ¥3,212 (2021年12月27日) 発送可能時間: 誌のサブタイトルは 入門書では得られないノウハウはコードにある です。 ちなみに筆者も似た様な書籍「みんなの Go 言語」を共著で執筆しましたが、書はこちらの拡充版とも言えるでしょう。 「エキスパートたちのGo言語」は20名もの共著で色々なノウハウが沢山掲載されています。「みんなの Go 言語」は7名の共著で個々の特色を色濃く出せた

    Big Sky :: 「エキスパートたちのGo言語」を読んだ。
  • Big Sky :: Go の http パッケージに MaxBytesHandler が入った。

    « text/template と html/template に continue/break が入った。 | Main | 「エキスパートたちのGo言語」を読んだ。 » Go の http パッケージの Request.Body はこれまで最大バイト数を指定できなかったので、巨大なファイルをアップロードするといった DoS 攻撃を心配するのであれば、各ハンドラの中で独自でサイズ制限しながら読み込む必要がありました。Go 1.18 から http.MaxBytesHandler が入ったので簡単にサイズ制限をする事ができる様になりました。 MaxBytesHandler は http.Handler として提供されるので、例えば labstack/echo であれば以下の様に、各ハンドラを直接修正する事なく、簡単に導入して使う事ができます。 package main import ( "

    Big Sky :: Go の http パッケージに MaxBytesHandler が入った。
  • Big Sky :: text/template と html/template に continue/break が入った。

    Go のテンプレートエンジンは、一般的なテンプレートエンジンの記法と気色が異なり、独特の文法で記述するのですが、ループ制御構文に関してはお世辞にも満足できる物ではありませんでした。それは continue や break が無いというのが理由です。continue や break が無かったので、無駄に if をネストして条件にあった値を出力しなければならず、必然的に無駄な if のネストが起きていました。 ■ビーフストロガノフ 2011年 受賞 2019年 受賞 ■カレーライス 2012年 受賞 ■満漢全席 2015年 受賞 2019年 受賞 例えば上記の様な出力をするには、以下の様なテンプレートを書かなければなりませんでした。 package main import ( "os" "text/template" ) var tmpl = ` {{- range .}} {{- if g

    Big Sky :: text/template と html/template に continue/break が入った。
  • Big Sky :: Go に Fuzz testing が入った。

    みなさん Fuzz testing ってご存じでしょうか。 人間が作る物は必ずといっていいほどバグが存在します。そしてそのコードをテストする人間も必ずバグを見逃します。 想定していなかった境界値テスト等、人間には先入観という物があり、それが邪魔をして簡単にバグを見逃します。昨今、この様な誰も気付かなかったバグの隙間を突く様な脆弱性が沢山見つかっています。 物によっては重大インシデントに発展する物まであります。 こういった人間では想定できない様なバグを見付けてくれるのが Fuzz testing です。Fuzz testing を実施する事で、ソフトウェアは頑丈になり安全にもなりえます。 日、Go の master ブランチに Fuzz testing の機能が入りました。 [dev.fuzz] Merge remote-tracking branch 'origin/dev.fuzz'

    Big Sky :: Go に Fuzz testing が入った。
  • Big Sky :: 最近の GNU CoreUtils を使っている限り rm -rf / は --no-preserve-root 付けないと / は消せない

    何に関連して記事を書こうと思った訳でもないです。たんなる一人コードリーディングです。 GNU CoreUtils に入ってる rm を読みました。 GNU Project Archives http://ftp.gnu.org/gnu/coreutils/ 読んだのは coreutils-8.17.tar.xz に入ってる src/rm.c preserve_root 変数は 203行目にある main で int main (int argc, char **argv) { bool preserve_root = true; struct rm_options x; true に初期化されていて319行目 if (x.recursive && preserve_root) { static struct dev_ino dev_ino_buf; x.root_dev_ino = get

    Big Sky :: 最近の GNU CoreUtils を使っている限り rm -rf / は --no-preserve-root 付けないと / は消せない
    lugecy
    lugecy 2021/06/22
  • Big Sky :: unsafe.Add と unsafe.Slice が入った。

    Go ではポインタは扱えるけれど、ポインタ演算は扱えないというのが共通認識でした。もちろん unsafe.Pointer と uintptr を使う事で、出来なくはなかったのですが簡単ではありませんでした。 package main import ( "unsafe" ) type foo struct { k int64 v int64 } func main() { f := &foo{3,4} // unsafe.Pointer() で匿名ポインタにして // uintptr() で演算可能にして // +8 バイト(64bit)足して // unsafe.Pointer で匿名ポインタに戻して // そこにはフィールド v があるはずなので *int64 にキャストして // デリファレンスすれば出来上がり *(*int64)(unsafe.Pointer((uintptr(uns

    Big Sky :: unsafe.Add と unsafe.Slice が入った。
  • Big Sky :: コメントも扱える高機能な C++ 向け JSON パーサ「jsoncpp」

    おなじみC/C++から使えるJSONライブラリを紹介するコーナー。まずは過去のまとめ。 ヘッダファイルだけでC++から使えるJSONパーサ「picojson」が凄い! 何も見ずにC++でjsonパーサが書けるか試してみた。 C言語から使えるJSONパーサ、JSMNを試してみた。 僕がboost::asioとboost::property_treeを使いHTTPプロキシ環境下で非同期にGoogle Search APIから検索するまでにやった、たった一つの事。 C言語から使えるJSONパーサ、parson が思った以上に良い仕事をしている。 最速と言われる JSON パーサ「rapidjson」が当に爆速なのか試してみた。 C言語から使えるJSONパーサ、jansson がとても直感的で良い C++ で STL フレンドリに扱えるJSONパーサ「json.hpp」 これまで C++ から扱

    Big Sky :: コメントも扱える高機能な C++ 向け JSON パーサ「jsoncpp」
  • Big Sky :: Go に go:embed が入った。

    Go 言語はシングルバイナリをウリにしたプログラミング言語です。バイナリファイルを1つポンと scp で転送すれば動くのでとても便利です。シングルバイナリとなると当然、画像や HTML といったアセットをバイナリに埋め込みたくなります。 Go 言語ではこれまで go-assets や go-bindata、statik というツールを使う事でファイルのコンテンツをバイナリ化し、変数からアクセスする様にしてきました。 しかしそれらには色々な流儀や OS 間でのまばらな動作など、ユーザにとって納得のいかない物がありました。昨日、Go 言語ではオフィシャルとしてこのファイル埋め込みをサポートする様になりました。Go 1.16 から使える様になります。 cmd/go: add //go:embed support · golang/go@25d28ec · GitHub +3 −3 src/cmd

    Big Sky :: Go に go:embed が入った。
  • Big Sky :: Zenn で Twitter bot 作成入門を書いた。

    Zenn で「シェルスクリプトで作る Twitter bot 作成入門」というを書きました。 シェルスクリプトで作る Twitter bot 作成入門 | Zenn 筆者が開発している幾らかのコマンドラインプログラムとシェルスクリプトを使って簡単に Twitter bot を作る方法をご紹介します。 ... https://zenn.dev/mattn/books/bb181f3f4731920f29a5 昨今ではプログラマは数多くの技術やデータ、サーバを相手にしなければならない事が増えてきました。その為、少ない人的リソースを有効に活用する為にシステムの自動化を行う事もあります。外部のシステムからデータを取得し、加工、また別のシステムへデータを送信する、こういった処理の流れは実務だけで学ぶのは難しい事もあります。自ら手を動かし、失敗した経験を得て知識を蓄えます。 Twitter bot

    Big Sky :: Zenn で Twitter bot 作成入門を書いた。
  • Big Sky :: プログラマーのための新しい情報共有コミュニティ Zenn で本を書いてみた。

    先日、vim-jp の Slackzenn という情報コミュニティを知りました。 Zennプログラマーのための情報共有コミュニティ Publish your book Zennではウェブ上で読めるを投稿することができます。は無料公開も、有料販売もできます。 あなたが得意な技術やアイデアを、ぜひ1冊のにまとめてみましょう。 ... https://zenn.dev Qiita と Note を足して2で割った様なサービスで、Markdown で記事やを執筆する事ができます。有料の記事やを執筆する事もできます。また有料でなくても記事を読んでサポートしたいと思う方がいれば寄付という形で還元頂ける仕組みがあります。 先日、ActixWeb という Rust のウェブフレームワークにパッチを送った話を zenn に投稿した所、1000 円のサポートを受けました。モチベーションもあ

    Big Sky :: プログラマーのための新しい情報共有コミュニティ Zenn で本を書いてみた。
  • Big Sky :: os/signal に NotifyContext が入った。

    Go のアプリケーションを作っていると、シグナルの受信に伴い処理を中断したり再起動する処理を実装する事が多い。これまでは signal.Notify でシグナルをキャッチし、別途 context.WithCancel で作成したコンテキストを自ら cancel する処理を書かなければならなかった。Go の tip に入ったコミットにより、これが幾分改善される様になった。 package main import ( "context" "fmt" "os" "os/signal" "time" ) func main() { ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) defer stop() select { case <-time.After(time.Second): fmt.Println

    Big Sky :: os/signal に NotifyContext が入った。