2017/09/06 CA.go #2
6月からDMM.comラボの六本木オフィスでミドルウェアを作るエンジニアインターンをしている@kawasin73です。 DMM.comラボではluaで実装されたKVS(キーバリューストア)を利用しています。 これは、TCPの上で独自プロトコルで通信しており、URIのPathがKeyとなり最長共通接頭辞検索をするKVSで、社内でluaの皮を被ったC言語で実装されたものが運用されています。 この度、このKVSをGo言語で再実装することになり、設計は既存のミドルウェアを踏襲した形で DMM.com ラボの方が行い、実装は僕がすることになりました。 Go言語の実装手法(goroutine や channel等)については僕が学びながらそれについて都度相談するというスタイルで行なっています。 その開発記を連載しています。 今回は、実装の第1ステップとして、TCPのエコーサーバーを実装していきます。
はてなの京都オフィスで開催された そうだ Go、京都。 - connpass にて、「Go言語をほぼ毎日書いている話(序)」というふわっとした話をしました。いわゆる Write Code Every Dayという活動ですね。 タイトルに(序)と付けているのは、書き始めてまだ5ヶ月程度だからです。 ちなみにこのGWでは、Rustを毎日書いていて、すでにタイトル詐欺感がありますね。 スライド スライドを以下に貼っておきます。 speakerdeck.com 同僚の id:niwatako さんの超速記により、ツイートはるだけで内容紹介できて贅沢。 去年からめっちゃGithubに草を生やしている話 #golangkyoto pic.twitter.com/xInr7G9BHT— にわタコ (@niwatako) 2017年4月29日 オペレーションよりソフトウェアや文章を書く方が実は好き ソフト
Go言語でシステムプログラミングの世界を覗くこの連載では、前々回からファイルシステムに関係する話題を扱ってきました。 今回の記事では、その総まとめとして、アプリケーションから見たファイルシステム周りの最深部を辿っていきます。 扱う話題は次の4つです。 ファイルロック ファイルのメモリへのマッピング 同期・非同期とブロッキング・ノンブロッキング select属のシステムコールによるI/O多重化 ファイルのロック(syscall.Flock()) ファイルのロックは、複数のプロセス間で同じリソースを同時に変更しないようにするために「いま使用していますよ」と他のプロセスに伝える手法のひとつです。 ファイルロックの最も単純な方法は、リソースが使用中であることをファイル(ロックファイル)によって示すというものでしょう。 たとえば、古いプログラマ(30代以上?)にはお馴染みのCGI(かつて動的なウェブ
[9:43 AM] tokuhirom plack のアプリだと Plack::Middleware::ServerStatus::Lite とかで監視したりしますけど、go だとそういうのってどうやるのが一般的なんでしょうか? [9:47 AM] macopy https://github.com/fukata/golang-stats-api-handler github.com GitHub - fukata/golang-stats-api-handler: Golang cpu, memory, gc, etc information api handler. golang-stats-api-handler - Golang cpu, memory, gc, etc information api handler. [9:47 AM] https://golang.org/pk
インテリジェントスイッチングハブなどのネットワーク機器の設定をする時に、 Windows だといちいちコントロールパネルを辿ってアダプター一覧を表示して、 そこから UAC の権限昇格 (環境によってはパスワード入力が必要) を挟んでプロパティを開いて、 IPv4 の設定を開いて変更して閉じて行って反映、という作業が大変だったので、 netsh を呼び出して省力化する GUI アプリを作りました。 環境 開発環境: go version go1.7.5 darwin/amd64 (Homebrew で入れた go) 動作対象環境: Windows 7 などの Windows 環境 GUI ツールキットの選定 開発環境を Windows に入れたくなかった (配布先のユーザーの環境に近い環境にしておきたかった) のと、確実に1バイナリで配布がすみそうということで、 最終的には Windows
※ タイトルは2.1秒となっていますが、0.96秒を達成しました。詳しくは「追記の章」を参照。 はじめに C#で「エラトステネスの篩」で「2.6秒で百万個」の素数を計算できる「無限シーケンス」を作ってみた - tail-islandを参考に、Golangのチャネルとgoroutineとクロージャをそれぞれ用いた無限素数ジェネレータを実装してみました。タイトルは元記事のオマージュです。 みなさんご存知のエラトステネスの篩は、自然数のリストから素数の倍数を消していくものだと思います。無限に素数を生成するためには遅延評価などを使って無限に素数の倍数を消していく必要があります。しかし、遅延評価がデフォルトではないGolangでは、自然数リストを有限にしか持つことができないため、決め打ちの値までしか素数を生成できませんでした。そこで、今回実装した無限素数ジェネレータは、素数の奇倍数と素数の2倍の数を
« Ruby の a = a + 1 はなぜ undefined method '+' for nil:NilClass なのか | Main | Ruby の Array#<< は Array#push よりも速いか » 僕は日々 memolist.vim という Vim plugin を使い、仕事で思いついた疑問点や会話の一部をメモ取りする様にしています。相手と会話している最中に「あ、ここ大事だ」と思ったら vim を起動して :MemoNew してメモを編集していました。もちろん Vim ですから起動は抜群に速くてとてもご機嫌良く動くのですが、どうしてもこれをシェルから扱いたいという要求に負けてささっと作ってみました。 GitHub - mattn/memo: Memo Life For You README.md memo Memo Life For You Usage NAME:
先週末、仕事で東京に行く機会があって、往復の新幹線の中でまとまった時間が取れるなと思ってGo言語に入門していました。Go言語に入門する理由は 仕事で普通に使う(mackerel-agentなど) 職場で評判がいい 一年に一個は新しい言語を勉強しようっていうアレ などなどです。本やtour of goを読むだけだとあまり頭に入ってこないので、複雑過ぎず簡単過ぎない例をやろうということで平均化パーセプトロンで二値分類を書きました(ファイルの読み込み、文字列操作、スライス、Mapの基本的な操作、structの使い方などがちょっと身に付く)。Perlに再入門、Scalaを勉強するときもこのネタだったので、定番になってきつつある。コードはこの辺に置いてます。 https://github.com/syou6162/go-perceptron/blob/master/main.go ちょっと困った箇所
はじめに 先日 NHK ETV で放送された "大人のピタゴラスイッチ" で "ピーマンとハトと数学" と題して "ピーマンの袋がどれもほぼ同じ重さになる仕組み" について解説があり面白かった。 ピーマンの袋がどれもほぼ同じ重さになる仕組み 12個のピーマンを "組み合わせ計量装置" の上に置くと 150g になる組み合わせを計算して排出する仕組みになっている。 "組み合わせがない場合もあるのでは?" という問に対しては "98% の確率で組み合わせがあることが数学が保証している" ということ。 "98%" の根拠が知りたかったが確率の計算がわからなかったので、実際に Go 言語で試して検証してみることにした。 解法 とりあえずすぐ思いついたのは愚直に全組み合わせを試すパターン。 togetter みてたら "subset sum" というキーワードが出てきたので検索。 部分和問題 という
おそらく golang を暫く使っておられる方であればご存じだと思いますが今日は crypto/ssh を紹介します。 Windows で ssh と聞くとどうしても msys やら cygwin やら入れないといけなくて ランタイムを入れるのが嫌だ 特殊なパス形式とか嫌だ そもそも業務で使いづらい といった個人的もしくは政治的な事柄が起きてなかなか実現しづらかったりします。でも golang なら msys や cygwin に頼らず ssh コマンドを、しかもライブラリとして扱う事が出来るので golang で作ったウェブサーバやバッチから UNIX ホストに対して ssh コマンドを送る事が出来るのです。 ssh - GoDoc package ssh import "golang.org/x/crypto/ssh" Package ssh implements an SSH cli
結構前に作っていたんですが、いろいろと忙しくてブログに書くタイミングを失していたので年末のタイミングで紹介。 TL;DR GoReplayを利用して、Production環境のリクエストを複製し、Stagins環境、開発環境に投げる仕組みを作った インフラ構成の大きな変更無しで、手軽にProduction環境の実リクエストを複製し、開発、動作検証ができるようになった 2016年の弊社サービスのDocker化や、インフラ構成の大幅な変更、ミドルウェアのアップデート、アプリの改修時のバグ事前検知と事故防止に大いに役に立った GoReplayの説明 GoReplay Goで書かれており、バイナリを設置し、オプションを指定し実行するだけで動作する アプリが稼働しているサーバで動く。(例えばNginx+Railsが稼働しているサーバで一緒にGoReplayを動かす感じ。) libpcap を利用して
下記のような画面が表示されれば準備完了です。 レスポンシブな画面なので、細くして表示するのも良いです。 今はテストがないので、 0/0 assertions と表示されています。 早速テストを書くことにしますが、折角なのでテストコード生成機能を使ってみます。 画面上部の鉛筆アイコンをクリックすれば、テストコードの生成画面が出てきます。 インデントしない文字列はテスト関数名、インデントした部分はテストのスコープを意味するそうです。 とりあえず、うるう年計算プログラムのテストとなるスコープを書いてみました。 生成されたソースをコピペし、必要なimport文を書いて、テストコードのテンプレートが出来上がりです。 package main import ( . "github.com/smartystreets/goconvey/convey" "testing" ) func TestLeapY
はじめに この記事は,以下の過去にQiitaに投稿したインタフェースの実装パターンの記事に,typeやメソッド,インタフェースの基本的な説明を追加してわかりやすくしたものです. Go言語における埋め込みによるインタフェースの部分実装パターン structにinterfaceを埋め込んで,動的に入れ替えるパターン まずtypeとメソッド,基本的なインタフェースの実装方法についておさらいすることで,さまざまなインタフェースの実装パターンを扱う準備をしましょう. typeで型を宣言する まずはじめに,Go言語における型の宣言方法をおさらいします.Go言語をはじめたばかりの方の中に,typeの使い方を限定的にしか理解していない方をよく見かけます.ご存知のとおり,typeは型を宣言するために使うキーワードです.以下のように,構造体型やインタフェース型の宣言の際に,使用することが多いでしょう. //
今回は Golang の勉強がてらダイクストラ法を実装してみる。 ダイクストラ法はグラフ理論の最短経路問題を解くためのアルゴリズムのひとつ。 DirectedGraph#Add() のところを編集するとグラフを書き換えることができる。 package main import ( "errors" "fmt" ) // ノード type Node struct { name string // ノード名 edges []*Edge // 次に移動できるエッジ done bool // 処理済みかを表すフラグ cost int // このノードにたどり着くのに必要だったコスト prev *Node // このノードにたどりつくのに使われたノード } func NewNode(name string) *Node { node := &Node{name, []*Edge{}, false, -
package main import "fmt" func main() { fmt.Println("Hello, 世界") } イントロダクション このドキュメントでは簡単なGoパッケージの開発の説明、 goツール 、Goパッケージとコマンドの標準的なフェッチ・ビルド・インストールの方法を紹介しています。 go ツールの利用に際しては、コードを特定の方法で構成する必要があります。このドキュメントを注意深く読みましょう。最も簡単にGoをインストールし、使い始める方法を説明しています。 同様の説明を スクリーンキャスト で見ることができます。 コードの構成 ワークスペース go ツールは、公開レポジトリでメンテナンスされているオープンソースコードを扱うことを想定して設計されています。実際にコードを公開する必要はありませんが、公開する場合もしない場合も同じ方法で環境の設定を行うことができま
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く