先日 xerrors パッケージがリリースされました。 このパッケージは、Proposal:Go 2Error Inspection で提案されているものをGo1向けに外部ライブラリとして試験的に実装したものです。Goの標準ライブラリではありませんが、Go公式がメンテナンスをしています。 このパッケージができた背景は、今まで多くのGoエンジニアは下位層のエラーの情報を伝播させるために pkg/errors パッケージ などの外部ライブラリを利用していました。この手法が開発者の間で普及したため標準ライブラリで正式に検討を始めることとなりました。 2019/9/4更新Go 1.13では %w でのラップや Is メソッド、 As メソッドは正式に導入されました。 しかし%+w や %+v によるスタックトレースの表示の採用は見送られました。 スタックトレースの表示が必要な場合はxerr

tl;dr・Goの依存性注入は普通に行われるが、DIツールはまだ観測範囲では浸透していない。 ・直近出たGoogle製Go向けDIツール「Wire」はシンプルなAPIやツール作成で有用だが、依存オブジェクトの設定が複雑化すると表現性に限界がくる ・Goにおいて、DIツールはある種のフレームワークと認識して慎重に採用すべき前提:Goの依存性注入と課題Goのコードを書く際、特に一定規模を超えたAPIを書く際は、依存するオブジェクトというのが増える。DBクライアントやロガーや各種ビジネスロジックを呼び出すサービス層などがそれに該当する。 レイヤー化されたパッケージ構成の下、こうした依存オブジェクトをトップダウンに注入していくやり方は見通しがよく、テスト時にモックのAPIクライアントを差し込みやすかったりと、テスタビリティを向上させる。ざっくり依存性注入が行われるようなレイヤー化された構成で、なん

こんにちは。私はSergey Kamardin(セルゲイ・カマルディン)です。Mail.Ru(ロシアの電子メールサービス会社)で開発者をしています。 この記事では、どのように私がGoを使って高負荷対応のWebSocketサーバを開発したかについて説明したいと思っています。 パフォーマンス最適化のアイデアやテクニックを通じて、WebSocketの知識はあるもののGoについてはほとんど知らないという方のお役に立てれば幸いです。 1. はじめに まずは開発に至った経緯について、どうして私たちがこのサーバを必要としたのかを説明しておきましょう。 Mail.Ruには多くのステートフルなシステムがあります。ユーザのeメール保存もその1つです。システム内、およびシステムイベントの状態変更を追跡する方法にはいくつかの種類がありますが、それらは主に状態変更に関するシステム通知、または周期的なシステムのポーリ

lestrratさんがやってくれました。 ずいぶん前から、ソースコードを検索して読みやすいコマンドはないかなーと思っていました。個人的にはackで検索して見つかったファイルをlessで開いて再びキーワードを入れて当該行までジャンプしていたのですが、毎回毎回めんどくさい感じでした。コマンド一発でインクリメンタル検索してキーワード周辺のソースコードを読めるツールが欲しいなぁって思ってたんです。 とあるslackでお昼時に、mattnさんと「ほしいですよねー」という話から始まって、vimにあるgrepとかも物色しながら「いいのないねー」とか言ってたらkanさんが「@lestrrat 案件だ」って言い出して牧さんが召喚されてついさっきpecoに必要な機能が追加されてました。速いw ためしにpicotlsの開発ディレクトリでpecoの一行ラッパーperoを起動し、「EVP_Digest」を検索してみ

Golangのerrorにはスタックトレース情報はない.基本は必要ないと思うし困ったこともない.一方で新しくプロジェクトに入りかつコードベースに慣れてない場合はどこが問題かアタリをつけるためにあっても良いとも思う.pkg/errorsを使ってるならそれはすぐに実現できる. pkg/errorsの基本的な考え方についてなどはGoCon 2016 springの後に "Golangのエラー処理とpkg/error"にまとめた(作者のDaveのブログ記事は "Don’tjust checkerrors, handle them gracefully").ここで強調して書いたのはちゃんとエラーをアノテートする(何をしてそのエラーが発生したかの状況を付加する)ことである.特に外部のパッケージとやり取りする場合,つまりまともなエラーメッセージが返ってこないかもしれない場合,pkg/errorsの

記事中に間違いがありました。数倍も速くはなりませんでした。確か 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 の内容はスコー

Go でアプリケーションを作ると、そのまま他になにもなくとも実行できるバイナリが出来あがります。この特性によりデプロイが大変楽です。 このような特性があるので、Go を使う場合Docker のようなオーケストレーションツールを使わなくても多くのサーバーにアプリをデプロイしていくことも可能かと思われますが、そこはまあDocker という巨人に乗っておくと楽なことが多いです。具体的には swarm とdocker-compose が便利なのでDocker 上で実行したい。 ここで問題となってくるのが何も考えずにDocker イメージを作るとイメージサイズが膨れあがってしまってシングルバイナリによる手軽さなどが損なわれてしまうという点です。 たとえばgolang:alpine のような比較的小さいイメージを使ってもファイルサイズはバイナリサイズ + 300MB ほどにもなってしまい
僕がプログラミング言語「Go言語」を知り、使い始めてからそろそろ7年目に入ろうとしています。 当初Google が作っているという鳴り物があった為、色々なメディアに取り上げられ色々な方がブログ等でGo言語を紹介し、色々な意見でGo言語が語られました。大抵の場合、プログラミング言語とは始めはチヤホヤと取り出され、落ち着いてからが本当の人気を表すという傾向にあります。皆さんもそう思っていたかもしれませんし、僕もそう思っていたと思います。 僕がGo言語を触りだした頃、まだ色々と足りない部分がありました。Linux で動いている多くの機能がWindows では未実装になっていました。しかしそんなGo言語であっても高速なビルドと実行速度で僕の好奇心を揺さぶるには十分な物でした。 その後、僕はGo言語にパッチを送る様になりました。その内幾らかはマージされました。現時点ではコアのリポジトリで79個の

今回、「みんなのGo言語」の執筆に参加しました! みんなのGo言語【現場で使える実践テクニック】 : 松木雅幸,mattn, 藤原俊一郎, 中島大一, 牧 大輔, 鈴木健太 :本 :Amazon Big Sky :: 「みんなのGo言語」の執筆に参加させて頂きました。 「みんなのGo言語」執筆参加しました! : D-7 私がGoでプログラムを書き始めたのは2015年の明けごろからです。mattnさんのブログ を読みながら、面白い言語があるのだなーと思って書き始めました。 A Tour ofGo を触ってみて、ちょっと冗長そうだけど案外いい感じかもな?と思いつつ少しずつGoで実装するようになっていました。そこから標準ライブラリ読み漁り、小さなツールを書きつつ、気がついたらプロダクションでも使うようになっていました。今では毎日Goで何かを書いています。 これまでにつかった言語のなかで、
昨日僕のTwitter タイムラインで q というツールが話題に上がっていました。GitHub - harelba/q: q - RunSQL directly onCSV or TSV filesText as Data q is a commandline tool that allows direct execution ofSQL-like q... https://github.com/harelba/q 標準入力をSQL で抽出できるという物です。ただ個人的には「こういうのpython じゃなくてGo でビルドされてると助かるよなー」と思ったので q と同じ様な動作になるツールを作ってみました。GitHub -mattn/qq Select stdin with query https://github.com/mattn/qq 例えば msys2 のシ

Go書いててなんとなく見えてきたGoでやっちゃいけないパターン WAF導入してらくらくWebアプリ WAF自体が現在群雄割拠状態。 WAF毎にハンドラインターフェースが違うので既存コードつなぐにはラッパーが必要。 どのWAFもLL言語に比べるとまだまだフィーチャーの網羅範囲が狭い。 なのでもちろんLL言語ほど楽には書けないことが多い。 リフレクション使いまくりでトータル性能はLL言語並みに遅いのもある。Go1.7のcontextパッケージの導入で標準のHTTPハンドラが復権する可能性があり更に荒れる予想。 追記: 楽できるのを期待してWAFを導入するの「やっちゃいけない」とまでは言い過ぎだったかもしれないけれど例のsqlでPrepareを正しく使えていないで性能出なかった件とか、当面WAFを使うなら自分で概ね中身を理解して使う覚悟が必要。 構造体メソッドにロジックを詰め込むGoの思想
プロ生から、プログラミング言語マスコット のLINE クリエイターズスタンプがついに登場! Gopher、Lisp エイリアン、D言語くん(D-man)のスタンプです。LINE での購入は「プログラミング言語マスコット」で検索してください。 プログラミング言語マスコットLINE スタンプ プログラミング言語のマスコットから今回採用したのは次の3キャラクターです。Gopher は、Go 言語のマスコット。ホリネズミです。 Lisp エイリアン は、正確には言語のマスコットではなく、Lispプログラマー以外から見た Lispプログラマーみたいです。 D言語くんは、D言語 のマスコット。英語では D-man と呼ばれています。イラストは、タキヲさん(@taxiwon)に依頼しました。スタンプが売れるとタキヲさんにもインセンティブが入るよう契約していますので、どんどん買ってくださいね

私は大学時代に、興味本位でJavaScriptを始めて、それ以来ウェブページを幾つか作成してきました。JavaScriptは常にC言語やJavaの合間の楽しい息抜きでしたが、アニメーションや、ユーザをあっと言わせるようなちょっとしたことを提供するといった、特殊な目的にかなり限られた言語だと考えていました。JavaScriptは覚えやすく、開発者に具体的な結果をすぐにもたらしてくれるので、コーディングする方法を学びたいと思っている人に私が教えた最初の言語でした。JavaScriptにHTMLとCSSを少し組み合わせれば、ウェブページが出来上がります。プログラミング初心者には喜ばれます。 その後、あることが2年前に起こりました。当時、私は、主にサーバーサイドのコードとAndroid用のアプリのプロトタイプに取り組む研究職に近い立場にいました。すぐにNode.jsの存在が目に留まりました。バック

中規模APIサーバー開発で得た知見 第2回 関西golang勉強会 21 January 2016 Yusuke Hatanaka (a.k.a Hatajoe) Software Engineer, Clover Lab.,inc. 中規模? $ find . -name "*.go" | wc -l 449 $ find . -name "*.go" | xargs cat | wc -l 81114 2 使用している主なパッケージ zenazn/goji jinzhu/gormgocql/gocql garyburd/redigo naoina/migu これらをラップした内製フレームワークを使用 3 内製フレームワーク app ├── common ├── controllers ├──db │ ├── cassandra │ ├── fluentd │ ├── m
FINAL FANTASY Record Keeper用に作ったツールのGolang実装についていろいろ。
概要 自社サービスの開発中、必要にかられてGOで簡単なリバースプロキシツールを作った話を書いてみます。 前提 自社サービスの開発を、次のような構成で進めています。フロントエンドとバックエンド(APIなど)をパスで振り分け /の下はフロントエンド /api/の下はAPI その他にも色々・・・フロントエンドとバックエンドは、担当者もリポジトリも、動いているサーバも別 それぞれサーバが開発環境、本番環境とテスト環境、のように複数の環境をもっている やりたいこと 前提の環境をもって、いざ開発をしようとローカル環境を構築するとなれば、 ローカルにnginxでリバースプロキシを立てて管理するのは面倒くさい ちょっとした環境の変更があると共有がいちいち面倒くさいフロントエンド担当者がわざわざバックエンドをcloneだのpullだの面倒くさい 環境間でテストするためにわざわざnginxの設定書き換え

本稿は2015年11月26日公開、2016年5月13日に改訂された「Visual Studio Codeでエクステンション機能を使ってみよう」をVisual Studio Code 1.4.0に合わせて改訂したものです。 Visual Studio Code(以下、VS Code)には拡張機能(エクステンション)と呼ばれる機能がある。これはその名の通り、VS Code自体がサポートしていない機能を後付けで拡張するためのものだ。本稿ではVS Codeの拡張機能の使い方について見ていこう。拡張機能とは VS Codeの拡張機能とは上でも述べたように、VS Codeが単体ではサポートしていない機能を後から付け加えるためのものだ。VS Codeのユーザーは既存の拡張機能をインストールして利用することも、自分で拡張機能を作成(して、それを公開)することもできる。本稿では拡張機能の利用に焦点を当てる

さて、このタイトル、かなり挑発的ですよね。それは認めます。もう少し説明すると、私は大胆なタイトルが好きなのです。人の注意を引くことができますからね。とにかく、この記事では、Goがひどい設計の言語(実際、本当に全て台無しになります)だということを証明していこうと思います。私は既に数カ月間Goで遊んでいますし、たしか6月のいつだったかに初めてHello, Worldを走らせてもみました。私は数学がそんなに得意ではありませんが、あれから既に4カ月経っていますし、Github 上のパッケージもいくつか手に入れました。言うまでもありませんが、私は仕事でGoを使ったことは全くないので、”コードサポート”や”デプロイ”やそのあたりに関する私の意見は話半分で読んでくださいね。 私はGoが大好きです。使ってみて大好きになりました。慣用表現を理解したり、ジェネリクスがないことや、おかしなエラーハンドリングや

リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く