タグ

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

  • 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 が入った。
    udzura
    udzura 2022/10/01
    複数エラーも便利そうだけど、無名インタフェースでキャストできることを初めて知った…
  • 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 が入った。
    udzura
    udzura 2022/09/07
  • 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 が入った。
    udzura
    udzura 2020/10/30
    これぞ、いい話
  • Big Sky :: golang オフィシャル謹製のパッケージ依存解決ツール「dep」

    « Re: Go でシングルバイナリな Web アプリを開発しているときに webpack --watch をうまいところやる | Main | Ruby の a = a + 1 はなぜ undefined method '+' for nil:NilClass なのか » golang にはパッケージマネージャが無数にあります。 PackageManagementTools · golang/go Wiki · GitHub Home Articles Blogs Books BoundingResourceUse cgo ChromeOS CodeReview CodeReviewComments CodeTools C... https://github.com/golang/go/wiki/PackageManagementTools 僕もその一つの gom というのを開発している

    Big Sky :: golang オフィシャル謹製のパッケージ依存解決ツール「dep」
  • Big Sky :: golang の sort インタフェース難しい問題が解決した

    golang では配列をソートしたい場合に癖があり、Int や Float64、String といった固定の型であれば sort パッケージが提供する関数でソートが可能でしたが、独自の型や Int64 等といった sort パッケージが用意していない型の配列をソートするには Sorter というインタフェースを備えた型で扱うしかありませんでした。 package main import ( "fmt" "sort" ) type Food struct { Name  string Price int } type Foods []Food func (f Foods) Len() int { return len(f) } func (f Foods) Less(i, j int) bool { return f[i].Price < f[j].Price } func (f Foods

    Big Sky :: golang の sort インタフェース難しい問題が解決した
    udzura
    udzura 2016/10/04
    Sortはそーとー難しかったんですね
  • Big Sky :: golang の遅いコードをたった1行で高速化するテクニック

    記事中に間違いがありました。数倍も速くはなりませんでした。確か 1.0X ~ 1.1 倍程度の高速化は得られましたがびっくりするほどの物ではありませんでした。すみません。 そろそろ Go1.7 がリリースされるそうですが、皆さん如何お過ごしですか。Go 界隈の波平こと mattn ですこんにちわ。バカモー(略 Go1.7 ではコンパイラの最適化が行われ、ビルド速度がかなり短縮される様になりました。毎日ビルドしてる僕としては非常に嬉しい機能改善ですね。 さてとてもキャッチ―なタイトルで釣ってしまった訳ですが、気にしたら負けなのでどんどん話を進めます。 var t [256]byte func f(b *[16]byte) { for i, v := range b { b[i] = t[v] } } 例えばこのコードを見て下さい。このコードはココから拝借しました。issue の内容はスコー

    Big Sky :: golang の遅いコードをたった1行で高速化するテクニック
  • Big Sky :: コマンドラインから JSON が簡単に作れるツール jo

    « golang で画像アップロードが簡単に出来る go-imageupload を使ってみた。 | Main | SQLite3でカジュアルにズンドコキヨシ » コマンドラインから JSON を扱うツールとしては jq が一般的ですが、例えば ls を実行した結果を JSON の Array にしたいであったり、コマンドライン引数から簡単に Object を作りたいといった場合には一旦考え込まないといけないくらい使い方が難しかったりします。そんな中でひょいと現れたのが jo です。 GitHub - jpmens/jo: JSON output from a shell JSON output from a shell https://github.com/jpmens/jo 作者である jpmens さんがなぜ jo を作るに至ったかをブログに書いています。 Jan-Piet Mens

    Big Sky :: コマンドラインから JSON が簡単に作れるツール jo
    udzura
    udzura 2016/03/09
    すごい
  • Big Sky :: golang のミドルウェアとして組み込むだけでパフォーマンス改善が見込める「HTTP Coala」

    ミドルウェアとして Use するだけでパフォーマンスが向上するなんて夢の様な話はないと思っていたけど、HTTP Coala はそれをやってのけている様です。 goware/httpcoala · GitHub Go http middleware handler for request coalescing https://github.com/goware/httpcoala ちょっと信じがたかったので、まずはベンチマークを取ってみた。 Coala 未使用 package main import ( "net/http" "github.com/zenazn/goji" "github.com/zenazn/goji/web" ) func main() { goji.Get("/", func(c web.C, w http.ResponseWriter, r *http.Reques

    Big Sky :: golang のミドルウェアとして組み込むだけでパフォーマンス改善が見込める「HTTP Coala」
  • Big Sky :: golang でスライスの先頭に追加する append がなぜ遅いのか

    Go - ISUCON5予選でスコア34000を出す方法 - Qiita Goで下記のようなsliceの先頭にひたすらオブジェクトを追加する処理を書く際は、不必要に長いsliceにならないよう注意しましょう。負荷が非常に高い処理になります。 hoge := []int{} for _, comment := range comments { hoge = append([]int{comment.ID}, hoge...) } http://qiita.com/y_matsuwitter/items/771020ebb68c07053548 append は第一引数のスライスに第二引数以降の可変個アイテムを追加する関数です。なるべく呼ばれない実装が良いです。どうしても多いアイテムを扱う場合は出来れば以下の様に書くのが良いです。 参考: https://blog.golang.org/sli

    Big Sky :: golang でスライスの先頭に追加する append がなぜ遅いのか
  • Big Sky :: golang で複数のエラーをハンドリングする方法

    golangいまどき例外ないの頭おかしいって思ってたけどようするにgoroutineと例外がうまくいかないからgoroutineのほう取って例外捨てたってことかねえ。 — Urabe, Shyouhei (@shyouhei) April 15, 2014 FAQ に書いてあります。 Why does Go not have exceptions? - Frequently Asked Questions (FAQ) - The Go Programming Language We believe that coupling exceptions to a control structure, as in the try-catch-finally idiom, results in convoluted code. It also tends to encourage programme

    Big Sky :: golang で複数のエラーをハンドリングする方法
  • Big Sky :: bundle exec がウザい

    ruby のアプリを動かす時にいちいち bundle exec って書くのがダルい。書きたくない。でもシステムに入ってたり違うバージョンの物が動いて変な動作をされても困る。 どうにかしてこのダルさを解消できないかと考えてみた。 まず rbenv を使ってるなら gem でインストールされるコマンドは必ずシェルのラッパとして生成され、そこから物が起動する様になっている。例えば rails であれば以下の様なシェルになっている。 #!/usr/bin/env bash set -e [ -n "$RBENV_DEBUG" ] && set -x program="${0##*/}" if [ "$program" = "ruby" ]; then for arg; do case "$arg" in -e* | -- ) break ;; */* ) if [ -f "$arg" ]; th

    Big Sky :: bundle exec がウザい
    udzura
    udzura 2014/03/14
    zshのプラグインでやってた。direnvべんりそう
  • Big Sky :: Go言語でWebAppの運用に必要なN個のこと

    « Software Design 2013年10月号「生産性を向上させるVimのTips」を書かせて頂きました。 | Main | Go言語でインタフェースの変更がそれ程問題にならない理由 » golang - Go言語でWebAppの開発に必要なN個のこと - Qiita [キータ] http://golang.org/cmd/go/#hdr-Download_and_install_packages_and_dependencies アプリケーションサーバ 標準パッケージの ne... http://qiita.com/tenntenn/items/b8b27e32c28f7569f41a tenntenn さんに開発版を書いて貰ったので運用編を書こうかと思った。 なお、以下のプロダクトは全て golang で書かれているが、rubyperl のアプリケーションを運用する際にも

    Big Sky :: Go言語でWebAppの運用に必要なN個のこと
    udzura
    udzura 2013/09/18
    エコシステム育ってる
  • Big Sky :: 突然の死に備える Apache モジュール書いた。

    サーバを運用していらっしゃる方であれば、サービスの停止は死に値します。 大事な事なのでもう一度言います。 サーバを運用していらっしゃる方であれば、サービスの停止は死に値します。 サーバ管理者は皆、突然の死に備えるべきです。 そんな過酷な場面に立ち向かうサーバ管理者の皆さんの苦労を少しでも軽減する為に、apache モジュールを書きました。 mattn/mod_suddendeath - GitHub 突然の死! https://github.com/mattn/mod_suddendeath まずコンパイルしてインストールします。 apxs -ci mod_suddendeath.c -lhttpd -lapr-1 そして apache を再起動します。 サービスが動作しているディレクトリの .htaccess に以下を書き込みます。 SetHandler suddendeath すると

    Big Sky :: 突然の死に備える Apache モジュール書いた。
    udzura
    udzura 2013/02/05
    有益便利アパッチーモジュールだ(普通のメンテナンスモードに流用できないかな……)
  • Big Sky :: CD-ROM トレイを取り出せる mrbgem、「mruby-eject」作った。

    mruby 使ってると良く CD-ROM を取り出したくなりますよね。 ならないとしたら、今すぐこの記事を読むのをやめて病院に行って下さい。 mattn/mruby-eject - GitHub https://github.com/mattn/mruby-eject インストールすると eject という命令が追加されるので #!mruby eject と書くだけで CD-ROM トレイがゲロっと排出されます。 便利ですね! 例えば mruby で sinatra っぽく書けるフレームワーク、mruby-sinatic を使って #!mruby get "/eject" do eject end Sinatic.run こう書くと、ブラウザから http://127.0.0.1:8888/eject にアクセスするだけでイジェクト出来る様になります。 皆さんもぜひ、使ってみて下さい。

    Big Sky :: CD-ROM トレイを取り出せる mrbgem、「mruby-eject」作った。
    udzura
    udzura 2013/01/11
    またmrubyのトイレネタ、かと思ったらトレイでした
  • Big Sky :: 最近の mruby 業界まとめ

    トピックス mrbgems が入った お前はどこのワカメじゃ ビルド方法が変わった mruby-uv mruby-http mruby-sinatic mruby-json mruby-sqlite3 mruby-curl そして mruby-v8 mrbgems が入った mruby に GEM っぽい物が入った。 とは言ってもスタティックリンクなのでダイナミックローディングしてくれる訳じゃない。 しかしながらパッケージを導入する上での取り決めが決まりつつあると言った感じ。 使うには MRUBY_ROOT という環境変数を mruby のリポジトリトップに設定しておき、MAKEFILE_4_GEM を $MRUBY/mrbgems/Makefiel4gem にしておくと良い。後者は要らなくなったかもしれない。 具体的には $MRUBY_ROOT/mrbgems/GEMS.active と

    Big Sky :: 最近の mruby 業界まとめ
    udzura
    udzura 2012/12/21
    便利になっている
  • 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 付けないと / は消せない
  • Big Sky :: Windowsへの移植も視野にいれたプログラムを書くなら読んでおいて欲しい事

    絶対パスの先頭に/が来る事を期待してはいけない しかしながら絶対パスの先頭にドライブレターが来る事を期待してはいけない UNCパスのホスト名やシェア名はディレクトリではないのでファイルシステムAPIは使えない事を意識しておく unixに比べパス内に空白文字が入る可能性が高い事を意識しておく ホームディレクトリを意味するパスの先頭チルダは自前で展開する必要があり、またパスの途中にチルダが混じる事は日常的にある ソケットディスクリプタに対してもread/writeで送受信できる事を期待してはいけない パイプでない標準入力のselectはやっても意味がない ディレクトリ内にあるファイルを開き、ハンドルを保持したままディレクトリを消せるのは当たり前だと思わない パスのセパレータが/¥である事を期待してANSI APIを使ってはいけない Cランタイム(POSIX互換API)とWindows API

    Big Sky :: Windowsへの移植も視野にいれたプログラムを書くなら読んでおいて欲しい事
    udzura
    udzura 2012/05/09
    感動する話し
  • Big Sky :: mruby で自前の組み込み関数を呼び出してみた。

    FizzBuzzに並んで有名な教育向けな題材、Acme::Oppaiです。 #include <mruby.h> #include <mruby/proc.h> #include <compile.h> static mrb_value oppailib_oppaifunc(mrb_state *mrb, mrb_value self) { static int i = 0; puts(i++ % 2 == 0 ? "    _    おっ \n" "  ( ゜∀゜)    \n" "  (  ⊂彡     \n" "   |   |     \n" "   し ⌒J     \n" : "    _  ∩ おっ \n" "  ( ゜∀゜)彡 ぱい\n" "  (    |    \n" "   |   |    \n" "   し ⌒J     \n"); return self; }

    Big Sky :: mruby で自前の組み込み関数を呼び出してみた。
    udzura
    udzura 2012/04/20
    勉強になります
  • Big Sky :: vimのステータスラインでハァハァするプラグイン書いた。

    今まで僕はvimのstatuslineに値を設定した事は無かったんだけど、githubに置いてある色んな人のvimrcを見てると結構多くの人がstatuslineを設定してて、これってもしかして便利なんじゃ...と思って設定してみた。ただ、なんか味気ないなーという気がしたので、ステータスラインで「ハァハァ」出来るプラグインを書いた。 mattn/hahhah-vim - GitHub ハァハァ statusline for vim https://github.com/mattn/hahhah-vim タイピングしたりカーソルを移動すると、ハァハァしてる顔がクルクル回ります。 これはすごい! さらに何かvim内でエラーが発生すると、しばらくの間「工エェ」なステータスラインになります。 斬新! ぜひお役立て下さい。

    Big Sky :: vimのステータスラインでハァハァするプラグイン書いた。
    udzura
    udzura 2011/11/25
    ちょうべんりですね!
  • Big Sky :: Growl For Linuxを作ってます。

    MacにはGrowlがあり、WindowsにはGrowl For Windowsがあります。LinuxにもNotify-OSDがあるじゃないかという人もいますが、Linuxユーザは皆こう思ってる。「これGrowlじゃないもん!」 mumblesというpython+DBusで書かれたGrowl Systemもありましたが、どうやらプロジェクトが消え去った様子。 これはまずい。 と、僕は「Growl For Linux」を作り始める事を決めた。 C言語でGTKを使ったGUI。プロトコルは今後、MacのGrowl 1.3でもサポートされる予定であるGNTP(Growl Network Transfer Protocol)を使う事にした。 来ならば今日あたりにバージョン0.1あたりをリリースする予定だったんだけど、色々と立て込んでいて実はまだ出来てない。でもGNTPを受信して、Growlポップア

    Big Sky :: Growl For Linuxを作ってます。