GopherCon Russia 2018でのAvito

みなさんこんにちは! 3月、Goプログラミング言語であるGopherCon Russia 2018の会議がモスクワのテクノポリスで開催されました。 彼女はコアチームからスピーチを行いました-それを正しく行う方法について直接聞くのはクールでした。 そしてもちろん、マイクロサービス、オープントレーディング、Goでのネットワークの操作、クライアントライブラリとクールなツールの作成に関するレポートがありました。

報告者と主催者に、活発なブラッド・フィッツパトリックと本物のアシュリー・マクナマラとチャットする機会を与えてくれたスピーカーに「ありがとう」と言いたい。 カットの下で、レポート、マスタークラス、Avitoからのコンペティションについて話し、またGoのお土産も演奏します。

UPD、12.04、10:13モスクワ時間:競合するコメントの受信が停止され、後日更新されます。すべての受賞者に書き込みます。

UPD、13.04、13:40モスクワ時間:回答は投稿の最後にネタバレの下に投稿され、2018年4月12日までに書いたすべてのコメンテーターが賞品を受け取ります。













GopherCon Russia 2018のFacebookページに投稿されレポートの写真のほとんどを撮りました。







Avitoによる論文とセクション



Goで検索エコシステムを構築する



Andrei Drozdovは、レポートで、ライブサンプルを使用した検索エンジンの構造、このトピックに関するGoコミュニティで既に行われていること、およびGoでの「自作」検索エンジンのパフォーマンスと暴動フレームワークでのソリューションを比較しました。 レポートの中で、彼らは社内に検索インフラストラクチャを構築し、すぐに新しい検索アルゴリズムを運用する方法について議論しました。 多くの便利なリンクのあるスライドはこちらです。 そして、このスピーチのビデオは次のとおりです。









100万を検索



Andrei Drozdovはレポートの続きで、検索エンジンの作成を練習できるマスタークラスを開催しました。

彼が会議について言っていることは次のとおりです。







コンピューターの接続に関する小さな問題にもかかわらず、マスタークラスには多くの人がいました。 彼らのほとんどは暴動のフレームワークで検索を書いて、そこに100万のニュースの見出しをロードし、Avitoからステッカーをプレゼントとして受け取った。 メインタスクに加えて、最もアクティブな3つのタスクは、いくつかの追加のタスクを解決しました。ベンチマークを保持し、カスタムランカーを実装しました。 その結果、より多くの人々が暴動を学び、恐らくそれをコピーして、より速く発展するようになれば嬉しいです。


Centrifugo 2



Avitoルーム内のセクションの一部として、Alexander EmelinはCentrifugoプロジェクトのさらなる開発計画について話しました。 過去数ヶ月にわたって、彼はサーバーの2番目のバージョンに取り組んでいます。これにより、アプリケーションユーザーからの数千の同時接続を提供し、リアルタイムでメッセージを送信できます(WebsocketおよびSockJS)。 サーバーの重要な機能は、任意のプログラミング言語で書かれたバックエンドと統合できることです。







2番目のバージョンでは、非常に複雑なタスクが実装されました。たとえば、サーバーコアは、Go開発者が使用できる別のライブラリに割り当てられました。 既存のJSONプロトコルに加えて、Websocket(Protobuf)を介したバイナリデータの転送のサポートを実装し、代替トランスポートとしてGRPCのサポートも実装しました。







マスタークラスの後にアレクサンダーが言ったことは次のとおりです。







かなり多くの人がAvitoルームに来て、その中には現在のCentrifugoユーザーもいました。 開発のこの段階で非常に重要な貴重なフィードバックを得ることが判明しました。 2番目のバージョンの機能について口頭で話し合った後、このライブラリを使用した小さなリアルタイムの例を見ました-興味深い機能を備えた非常にシンプルなチャット:サーバーは、クライアントがWebsocketプロトコルだけでなくGRPCも使用できるようにしました。


Golang、またはThere and Back



もちろん私たちのブースでは、一日中混雑していました。 すでに午前∞には、会議の最も早い参加者を待っていました。 Gopherで写真を撮ることができます...













...または、テクノPR部門Gosha Immortalの勇敢な従業員。最近、ジュニアスペシャリストに雇われました(ただし、これまでは在庫番号としてのみ)。













さて、そしておそらく最も興味深い活動-私たちのブースでは終日「Golang、またはThere and Back」というコンテストがあり、Tシャツ、ミトン、またはGoシンボルのステッカーパックを獲得できます。 Golangや他のプログラミング言語で記述されたコードのスニペットと一致させる必要がありました。 よく見ると、この写真でキャプチャされた会議参加者の約半数がスニペットであることがわかります。













しかし、より大きな計画:













そして少し-講堂で:













このゲームはすべての参加者に「行った」ようです。競技に参加した人たちは、レポートの前とその間に喜んで頭を伸ばし、このゲームの約350人の参加者のそれぞれと話をしました。







HabréでのステッカーパックとGoミトンの描画



Go-mittensとステッカーパックはまだ残っています。ここでHabréでプレイしたいと思います。 ラベルセットの内容 9つの「基本的な」ゴーファー...













...そして、それらのためのステッカーアクセサリーセットを使用すると、独自のホリネズミをまとめることができます。 たとえば、次のように:













これを行うには、Golangや他のプログラミング言語で記述されたコードの断片を見て比較することをお勧めします。 そして、コメントに1-A、2-Bなどの原則に関するペアを書きます。 他のファンを台無しにしないために、ネタバレの下に答えを隠してください!







最初の5人のコメンテーターはGo-stickerpackで、ミトンは郵便または宅配便で送付します。 ランダマイザーを使用して、残りの参加者に同じセットをさらに5つ配布します。 お楽しみください!







コードサンプルを展開

1







2







3







4







5







6







7







8







9







10







A







type vertex struct { X, Y int } func f(v *vertex) { vX = 3 vY = 4 } func main() { v1 := vertex{1, 8} f(&v1) }
      
      





B







 package main import "fmt" import "math" func main() { fmt.Printf("%f", 1.0/math.Sqrt(49)) }
      
      





C







 package main import ( "fmt" "unicode/utf8" ) func main() { b := []byte{80, 72, 80, 32, 114, 117, 108, 101, 115} for len(b) > 0 { r, size := utf8.DecodeRune(b) fmt.Printf("%c", r) b = b[size:] } }
      
      





D







 func f(x, y int64) int64 { return x + y }
      
      





E







 package main import ( "fmt" ) func f(a int) func(b int) int { return func(b int) int { return a*b } } func main() { list := []int{2, 2, 2, 2} g := f(3) for i, value := range list { list[i] = g(value) } fmt.Println(list) }
      
      





F







 type vt struct { X, Y int } func f(v vt) { vX = 3 vY = 4 } func main() { v1 := vt{1, 8} f(v1) }
      
      





G







 package main import ( "io" "log" "net/http" ) func h(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "hello, world!\n") } func main() { http.HandleFunc("/", h) log.Fatal(http.ListenAndServe(":8080", nil)) }
      
      





H







 type filter func(string) bool func bf(list []string, fn filter) [][]string { valid, invalid := []string{}, []string{} for _, s := range list { if fn(s) { valid = append(valid, s) } else { invalid = append(invalid, s) } } return [][]string{valid, invalid} } func main() { l := []string{"gl", "hf", "ht", "tt"} res := bf(l, func(s string) bool { return s[0] == 'h' }) }
      
      





私は







 package main import "fmt" func main() { a, b := 5, 10 fmt.Println(map[bool]int{true: a, false: a-1}[a > b]) }
      
      





J







 package main import ( "fmt" ) func f(a, b int) int { if a > b { return a } return b } func main() { ints := []int{1, 8, 3, 4, 5} res := ints[0] for _, v := range ints { res = f(res, v) } fmt.Println(res) }
      
      





あなたのコメントを待っています!







更新:回答

1-G、2-J、3-A、4-F、5-H、6-C、7-E、8-B、9-I、10-D.







しかし、Gopherは会議の後休んでおり、次の前に力を得ています。













じゃあね!








All Articles