タグ

Goに関するW53SAのブックマーク (94)

  • Go言語におけるブロックとスコープ

    Go言語には「ブロック」と「スコープ」という似たような2つの概念があります。 「ブロックとスコープはどう違うの?」という疑問に答えてみたいと思います。 ブロックとはソースコードの「かたまり」のこと ブロックとはソースコードをある単位でまとめた「かたまり」です。 最もわかりやすい例は、記号 { ... } でくくられたステートメント群です。 これを「明示的ブロック」と言います。 「明示的ブロック」以外にも「暗黙のブロック」というものがあります。 暗黙ブロックは以下のとおり5種類あります。 ユニバースブロック: 全てのGoのソースコードの外側を包んでいる仮想的なブロック パッケージブロック: 1パッケージ内の全ソースコードを包含するブロック ファイルブロック: 1ファイル内の全ソースコードを包含するブロック if, for, switchブロック: if,for,swtich文それ自体がブロッ

    Go言語におけるブロックとスコープ
  • Goが未使用のパッケージインポートをエラーとする理由

    Goが未使用のパッケージインポートの記述をエラーにするという挙動は多くの非難を浴びました。 「コンパイルエラーでなく警告にすべき」 または 「コンパイルオプションで選べる様にして欲しい」 というような意見はたくさん寄せられましたがGo開発コアメンバーはこれらの要望に応えることはありませんでした。その理由を解説します。 Goの依存解決のアプローチ Goの依存ツリーはコードの中に記述します。これはメジャーなパッケージマネージャとは異なる手法です。 多くの処理系では依存解決に必要な情報を言語仕様には含めず、別途ファイルに依存情報を列挙して記述しておき、それらの情報を辿ることで依存ツリーを構築しそのツリーに基づいて依存を解決するというアプローチを採用しているものがほとんどです。 Goは依存解決に必要な情報をコードの中に記述するというレアなアプローチを採りました。 ESモジュールのアイディアに近い考

    Goが未使用のパッケージインポートをエラーとする理由
  • Go Tips(2020Q3)

    Go 言語での便利な Tips を紹介していきます。 「GO111MODULE=on」を設定しよう! 最近、いろんなサードパーティパッケージが Go モジュールサポートへの修正が進んでいます。 その中で、GO111MODULE=auto のデフォルト値のままだと go get に失敗するものが目立つようになりました。Go1.16 からは「GO111MODULE=on」がデフォルト値になる予定なので、それまでは各自「GO111MODULE=on」を設定しちゃいましょう! ドキュメント通り「go get」してもうまくインストールできない場合は「GO111MODULE=on」を指定してリトライしてみてください。 ちなみに OS に関係なく環境変数を書き換える便利なコマンドがあります。

    Go Tips(2020Q3)
  • OWASP/Go-SCPを読んでセキュアプログラミングとGoを学ぶ - My External Storage

    この記事はGo Advent Calendar 2019の4日目の記事になる。 3日目は@ikawahaさんの「Goa v3 のテストをシュッとする]」だった。 記事ではOpen Web Application Security Project(OWASP)が公開しているGo-SCPリポジトリを紹介する。 Webアプリケーションにはクロスサイトスクリプティング(XSS)やクロスサイトリクエストフォージェリ(CSRF)など、様々な脆弱性が潜む可能性がある。 脆弱性対策の書籍としては、体系的に学ぶ 安全なWebアプリケーションの作り方(徳丸)などが有名だろう。 Go-SCPリポジトリにはWebアプリケーションを実装する際に必要な脆弱性の知識と、Goを使った脆弱性対策の実装方法が含まれている。 https://github.com/OWASP/Go-SCP TL;DR OWASPというWEB

    OWASP/Go-SCPを読んでセキュアプログラミングとGoを学ぶ - My External Storage
    W53SA
    W53SA 2020/09/15
  • GoのアプリケーションをOpenMetricsを使って監視する | おそらくはそれさえも平凡な日々

    前のエントリでDatadogについて書いたが、実際にGoのアプリケーションがOpenMetricsを吐くようにするのはどうのようすれば良いかをもう少し解説します。 OpenMetricsとは? 元々[Prometheus]が利用しているフォーマット。Prometheusは"Promethues exporter"と呼ばれる監視対象からメトリクスを集約する作りになっている。 Prometheus exporterは実は「単なるHTTPのエンドポイント」であり、そのレスポンスが独自のテキストフォーマットになっている。このフォーマットを標準化しようとして提唱されているのがOpenMetrics。 https://openmetrics.io/ 実際問題としては、Prometheusのドキュメントの方がまだまだ充実している。 DatadogにはOpenMetricsのインテグレーションがあり、自前

    GoのアプリケーションをOpenMetricsを使って監視する | おそらくはそれさえも平凡な日々
  • [Go] スライスのfor rangeループ内で新しいスライスにappendしたらバグらせた - ぷらすのブログ

    久々にポインタ関連でバグらせてしまったので、自戒のためにメモしておく。 tl;dr for range ループの value は常に同じアドレス値を取る。 バグらせた実装 あるスライスから特定の条件を満たす値だけを抽出した新しいスライスを作ろうをして以下のようなコードを書いた。 type User struct { id int } func filter(users []User) []*User{ var filtered []*User for _, v := range users { if v.id % 2 == 0{ filtered = append(filtered, &v) } } return users } このコードを実行したとき filtered のスライスはどのような値になるだろうか? 結果はこのようになる。 users := []User{{1}, {2},

    [Go] スライスのfor rangeループ内で新しいスライスにappendしたらバグらせた - ぷらすのブログ
  • 「プログラミング言語Go完全入門」の「完全」公開のお知らせ | メルカリエンジニアリング

    メルペイ エキスパートチームの@tenntennです。稿は Merpay Tech Openness Month の11日目の記事です。 「プログラミング言語Go完全入門」の期間限定公開のお知らせでも書いたように、メルペイでは、社外の方向けにGopher道場という体系的にGoを学べる場を無償で提供してきました。Goの普及を目的にこれまでに8回開催し100人以上の方に参加していただきました。 また、Gopher道場の動画や資料はGopher道場 自習室として誰でも利用できるようになっており、現時点で300名以上の方が利用されています。 Gopher道場の資料のベースになっている「プログラミング言語Go完全入門」は、2020年7月31日までの限定公開になっていましたが、日より公開期限を撤廃し、完全公開することになりました。 また、日8月31日から始まる「Online Summer Int

    「プログラミング言語Go完全入門」の「完全」公開のお知らせ | メルカリエンジニアリング
  • Go言語でのテストの並列化 〜t.Parallel()メソッドを理解する〜 | メルカリエンジニアリング

    この記事は、Merpay Tech Openness Month 2020 の6日目の記事です。 メルペイでBackendエンジニアをしている柴田(@yoshiki_shibata)です。この記事では、Go言語のtestingパッケージに用意されている並列化の機能について説明します。 Go言語では、テストコードを作成するためのtestingパッケージが用意されています。一般に開発するソフトウェアの規模が大きくなるに従って、作成されるテストコードの量も多くなり、すべてのテストが終了するまでの時間も長くなっていきます。特に、データベースへアクセスするようなテストでは、データベースへの通信時間がテスト時間の多く占めますので、テストコードを逐次実行するよりは並列実行することで、テスト時間を短縮できます(厳密には用語「並行」ですが、t.Parallel()メソッドの説明なので、この記事では用語「並列

    Go言語でのテストの並列化 〜t.Parallel()メソッドを理解する〜 | メルカリエンジニアリング
  • SlackをGo製ツールのGUIフロントエンドとして使う(#1: データの登録と表示) - ほんじゃらねっと

    ブラウザで操作できるツールを作りたいけどWebのフロントエンド作るの面倒だな...とWeb系開発者にあるまじき事を考えつつ良いプラットフォームを探していたら、SlackAPIが進化してツールフロントエンド化するのにうってつけの機能が増えているのを見つけました。 api.slack.com チャットツールのAPIといえば、「チャットで入力したテキストをボット側でがんばって解釈して実行する」というCUIのコマンド的な使い方しかできないイメージだったのですが、最近のSlackAPIは「ショートカット(Shortcuts)」「モーダル(Modals)」「ブロックキット(Block Kit)」といった機能を使うことで、入力コンポーネントを使用したGUIでボットとやりとりすることができるようになっています。 これらを駆使すれば、入力フォームからデータを登録したり、編集フォームでデータを変更したり、

    SlackをGo製ツールのGUIフロントエンドとして使う(#1: データの登録と表示) - ほんじゃらねっと
    W53SA
    W53SA 2020/07/09
  • sync.Cond/コンディション変数についての解説

    sync.Cond(コンディション変数)について、Goをよく使ってる人たちですら「うまく説明できん」という話がmercarigoで出てたので、あとで誰かの役に立てばよいな、という気持ちで新たな解説記事を書いてみたいと思います。 自分はPerl5をバリバリ書いていた時代ではAE::Cond、Goを使うようになってからはsync.Condと、とにかく非同期処理でピタゴラ装置を作らないといけない時はこの仕組みがあったことでロジックを無駄に小難しくしないで実装することができたので、この仕組みは是非広く知られて欲しいのです。 というわけでまたあらたにGoのsync.Condを解説してみます。 なお、Web+DB Press vol 113の私の連載、「Goにいりては…」でもこの話を書いていますが、あちらの記事では Broadcast を使った方法ではなく、 Signal を使った方法について書いてあ

    sync.Cond/コンディション変数についての解説
  • SNAKE(EKANS)ランサムウェアの内部構造を紐解く | 技術者ブログ | 三井物産セキュアディレクション株式会社

    ここ数日ホンダがサイバー攻撃を受けたというニュースが世界各国で報じられています。 記事では、一部で関連性が指摘されているVirusTotalにアップロードされたSNAKEランサムウェアの検体(※)について解析を行い、現時点までに判明した内容を簡単ですが共有します。海外ではすでにいくらか情報は出ているものの、日語での解析記事はあまりないと思われるため何かの参考になれば幸いです。 ※ハッシュ値:d4da69e424241c291c173c8b3756639c654432706e7def5025a649730868c4a1 なお弊社では、検体がホンダに対するサイバー攻撃と関連があるかどうかは把握しておらず、記事はあくまで上記ハッシュ値の検体の解析結果に終始している点をご了承ください。 ■検体調査 まず、当該検体は以下の通り、日国内から6/8頃にVirusTotalにアップロードされてい

    SNAKE(EKANS)ランサムウェアの内部構造を紐解く | 技術者ブログ | 三井物産セキュアディレクション株式会社
  • Gormが本番テーブルの数億件のデータを消そうとした話 - keroxpのScrapbox

    MySQLの場合、--safe-updatesオプションを利用することでこういった不慮のUPDATE/DELETEを防げるようです

    Gormが本番テーブルの数億件のデータを消そうとした話 - keroxpのScrapbox
  • GoとRustの言語比較記事を書くのが流行ってるらしい

    コンテキスト 私もGoRustの比較記事書いてバズるやつやりたい — みょん (@myuon_myon) February 27, 2020 仕事GoRustを書いています。いずれもWebのサーバーサイドです。パフォーマンスとかほとほどって感じなので極限までチューニングしたりしません。という前提で読んでください。 Rust/Goはいずれも習得してから2年くらい書いています。書いてる量も多分そんなに変わりません。 Go なんと言っても習得難度が低いので人を選ばず書けるようになります。現状だと仕事で書くなら一番無難な選択肢だなと思っています。一方言語もエコシステムも何もかもかなりクセが強いので、Go Wayにちゃんと従うことが大事だなと思ったりします。 ジェネリクスがないことは高速なコンパイルなど利点もありますがmap,filter等を型ごとにfor文書きまくることになるのでとても手が疲

  • Discord Blog

    From Blocky to Brilliant: Improving Video Quality on Discord Go Live on AMD GPUs

    Discord Blog
  • time.Timer#Reset() の正しい使い方 — KaoriYa

    time.Timer は使ってますか? とても基的な要素なのですが意外と正しい使い方は難しいのです。 つい先日ハマった事例とともにその正しい使い方を紹介します。 この記事は Go Advent Calendar 2019 の21日目の記事です。 皆さんは time.Timer は使ってますか? Timer は指定時間経過後に C <-chan Time に現在時刻が 1回だけ投入されるという極めてシンプルな型です。 メソッドも Stop() と Reset() の2つだけと少なくシンプルです。 そう…シンプルなのですが正しく使うには2つほど大事な注意事項があります。 この記事ではそれらを解説します。 TL;DR time.Timer#Stop() 後に time.Timer.C を読み捨てなければいけない場合がある

  • いま知っておきたいLinux─WebアプリがOSのプロセスとしてどのように見えるか? を運用に生かす|ハイクラス転職・求人情報サイト AMBI(アンビ)

    いま知っておきたいLinux─WebアプリがOSのプロセスとしてどのように見えるか? を運用に生かす Webアプリを動かして負荷をかけると、OSのプロセスという観点ではどのように見えるのでしょう? それを通して運用やトラブルシューティングではどういったことが分かるのでしょう? Linuxカーネルの開発者でもある武内覚(sat)さんによる解説です。 こんにちは、sat(@satoru_takeuchi)と申します。 コンピュータが誕生してから現在まで、最終的にエンドユーザが意識するアプリケーション開発はどんどん楽になっています。先人たちのたゆまぬ努力の結果、アプリ開発者はOSや、そのさらに下にあるハードウェアのことをほとんど意識することなく開発ができるようになりました。 しかし、「作ったアプリが、OSレベルでどのように動いているか?」が今一つピンと来なくて、モヤモヤしていないでしょうか。それ

    いま知っておきたいLinux─WebアプリがOSのプロセスとしてどのように見えるか? を運用に生かす|ハイクラス転職・求人情報サイト AMBI(アンビ)
    W53SA
    W53SA 2019/10/17
  • Big Sky :: Microsoft Word を Markdown に変換するコマンド「docx2md」を作った。

    8月に Google Developers Expert となり、新米の様にオロオロとしています。過去の GDE ミーティングの議事録を見せて頂いているのですが Google Document に保存されており、Go だけでなく他のカテゴリの GDE に関する物も含めると全てに目を通すのはなかなか骨が折れます。技術者なので問題は技術で解決すべく、これらの資料を grep 検索できる様にしました。 Google Document はエクスポートすると Microsoft Word の形式となるので、Microsoft Word から Markdown に変換するプログラムを書けばテキスト検索もできるし、なんならそのまま GitHub に貼り付けてしまう事もできます。 GitHub - mattn/docx2md docx2md Convert Microsoft Word Document

    Big Sky :: Microsoft Word を Markdown に変換するコマンド「docx2md」を作った。
  • JSON decoding in Go

    Incidentally, decoding JSON data (or really, almost any data structure) is really easy in Go (golang). We simply call json.Unmarshal(…) and boom! We have nice data structures. Well, except if our input source is not very well defined (meaning not strictly typed). Objects with loose schema Take this example. We want to decode a JSON object that looks like this: { "author": "attilaolah@gmail.com", "

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

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

    jqのGo実装 gojq を作りました! ― スタックマシン型インタープリタによるイテレータセマンティクスの実装 - プログラムモグモグ
    W53SA
    W53SA 2019/08/26
    「jqは完全に理解しました。」
  • Goのバイナリに静的ファイルを埋め込むツール assets-life を書いた

    語の Go コミュニティだと go-bindata (なんか乗っ取り騒動とか色々あってメンテナンスされてない), go-assets (最近メンテナンス滞りがち) が有名(要出典)なやつです。 これらのライブラリに関してたくさん日語記事が書かれて、今もたくさん検索に引っかかるのですが、残念ながら最近はメンテナンスが滞っています。 最近は statik の名前もよく見るようになりました。 その他は Resource Embedding - Awesome Go からどうぞ。 で、まあ、今回も完全に車輪の再発明なんですが、他の実装には色々と思うところがあり書いてみました。 shogo82148/assets-life USAGE なにはともあれ、まずは go get してきます。 $ go get github.com/shogo82148/assets-life assets-life

    W53SA
    W53SA 2019/07/25
    “そうでもないな、と思った人も 「最終更新日時からの経過時間の10%を、キャッシュの寿命に設定する」 HTTPクライアントが存在するっていうことだけは覚えて帰ってね。”