Всем привет! В марте в московском Технополисе прошла конференция, посвященная языку программирования Go — GopherCon Russia 2018. На ней прозвучали выступления от core-team — было круто услышать из первых уст о том, как нужно делать правильно. И конечно, не обошлось без докладов про микросервисы, опентрейсинг, работу с сетью в Go, создание клиентских библиотек и крутых инструментов.
Хотим сказать «спасибо» выступающим — за доклады и организаторам — за возможность пообщаться с живым Бредом Фитцпатриком и настоящей Эшли МакНамара. Под катом рассказываем о докладах, мастер-классах и конкурсе от Avito, а также разыгрываем немного Go-сувенирки.



Большинство фото мы взяли из отчета, выложенного на странице GopherCon Russia 2018 в Facebook.


Доклады & секции от Avito


Строим поисковую экосистему на Go


В своем докладе Андрей Дроздов рассказывал об устройстве поисковых движков на живых примерах, о том, что уже сделано в Go-сообществе на эту тему, сравнивал производительность «самопального» поискового движка на Go и решения на фреймворке riot. В ходе доклада обсудили, как строить поисковую инфраструктуру в компании и быстро вводить в эксплуатацию новые алгоритмы поиска. Слайды с множеством полезных ссылок лежат здесь. А вот видеозапись этого выступления:



Поиск на миллион


В продолжение своего доклада Андрей Дроздов провел мастер-класс, где можно было попрактиковаться в создании поисковых систем.
Вот что он рассказывает про встречу:


Несмотря на небольшие проблемы с подключением компьютера на мастер-классе было много людей. Большая часть смогла написать свой поиск на фреймворке riot, загрузить в него миллион новостных заголовков и получить в подарок наклейки от Авито). Трое самых активных помимо основной задачи решили несколько дополнительных: провели свой бенчмарк и реализовали кастомный ранкер. Я буду рад, если в итоге больше людей изучат riot и, возможно, законтрибьютят в него, чтобы он развивался быстрее.

Centrifugo 2


В рамках секции внутри Avito-комнаты Александр Емелин рассказывал о планах дальнейшего развития проекта Centrifugo. Последние несколько месяцев он работал над второй версией сервера, позволяющего обслуживать тысячи одновременных подключений от пользователей приложения и отправлять им сообщения в режиме реального времени (Websocket и SockJS). Важной особенностью сервера является то, что он позволяет интегрироваться с бекендом, написанным на любом языке программирования.


Во второй версии были реализованы достаточно сложные задачи — например, ядро сервера было выделено в отдельную библиотеку, которую смогут использовать Go-разработчики. Реализована поддержка передачи бинарных данных по Websocket (Protobuf) в дополнение к имеющемуся JSON-протоколу, а также реализована поддержка GRPC в качестве альтернативного транспорта.


Вот что рассказал Александр после мастер-класса:


В Avito-комнату пришло достаточно много людей, среди которых были и текущие пользователи Centrifugo. Получилось получить ценный фидбек, что чрезвычайно важно на данной стадии разработки. После устного рассказа про особенности второй версии посмотрели на небольшой real-time пример, использующий эту библиотеку — очень простой чат с интересной особенностью: сервер позволял клиентам использовать не только протокол Websocket в качестве транспорта, но и GRPC.

Golang, или Туда и Обратно


На нашем стенде, конечно, тоже целый день было людно. Уже в ? утра мы ждали самых ранних участников конференции. Можно было сфотографироваться с Гофером…



… Или бравым сотрудником нашего отдела технопиара Гошей Бессмертным, который совсем недавно был принят в штат младшим специалистом (правда, пока только в качестве инвентарного номера)...



Ну и самая, пожалуй, интересная активность — весь день на нашем стенде проходил конкурс «Golang, или Туда и Обратно», где можно выиграть футболку, варежки или стикерпак с символикой Go. Нужно было сопоставить сниппеты кода, написанного на Golang и других языках программирования. Если приглядеться, то можно увидеть, как примерно половина запечатлённых на этом снимке участников конференции вовсю матчит сниппеты:



А вот планы покрупнее:



И немножко — в залах докладов:



Кажется, что игра «зашла» всем участникам: те, кто участвовал в конкурсе, с удовольствием размяли мозги перед докладами и в перерывах между ними, а мы получили удовольствие от общения с каждым из примерно 350 участников этой игры.


Розыгрыш стикерпаков и Go-варежек на Хабре


У нас осталось некоторое количество Go-варежек и стикерпаков — их мы хотим разыграть здесь, на Хабре. Что внутри набора наклеек? Девять «базовых» гоферов…



… и набор наклеек-аксессуаров к ним для того, чтобы вы могли собрать своего собственного гофера. Например, так:



Для этого предлагаем вам посмотреть и сопоставить сниппеты кода, написанного на Golang и других языках программирования. И написать в комментариях пары по принципу 1 — A, 2 — B и так далее. Прячьте ответы под спойлер, чтобы не портить другим фан!


Первым пяти комментаторам мы пришлём по Go-стикерпаку и паре варежек почтой или курьером. Ещё пять таких же наборов распределим между оставшимися участниками с помощью рэндомайзера. Enjoy!


Развернуть примеры кода

1


2


3


4


5


6


7


8


9


10


A


type vertex struct {
        X, Y int
}

func f(v *vertex) {
        v.X = 3
        v.Y = 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) {
        v.X = 3
        v.Y = 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'
        })
}

I


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)
}

Ждём ваших комментариев! А Гофер пока отдыхает после конференции и набирается сил перед следующей.



До новых встреч!

Комментарии (22)


  1. deadkrolik
    04.04.2018 16:07
    +2

    может быть

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


  1. oWart
    04.04.2018 16:13
    +1

    Попробую так
    1 — G
    2 — J
    3 — A
    4 — F
    5 — H
    6 — C
    7 — E
    8 — B
    9 — I
    10 — D


  1. barsuksergey
    04.04.2018 16:23
    +1

    Можно не подглядывать, вдруг неправильно
    1-G
    2-J
    3-A
    4-F
    5-H
    6-C
    7-E
    8-B
    9-I
    10-D


  1. dmirogin
    04.04.2018 16:38

    Была не была
    1-G
    2 — J
    3 — A
    4 — F
    5 — H
    6- C
    7 — E
    8 — B
    9 — I
    10 — D


  1. proshik
    04.04.2018 16:43

    может так
    1-g, 2-j, 3-a, 4-F, 5-h, 6-C, 7-E, 8-B, 9-I, 10-D


  1. Blogoslov
    04.04.2018 17:08

    Мой ответ
    • 1 — G
    • 2 — J
    • 3 — A
    • 4 — F
    • 5 — H
    • 6 — C
    • 7 — E
    • 8 — B
    • 9 — I
    • 10 — D


  1. IlyaRPV
    04.04.2018 17:08

    Попробуем
    1) G
    2) J
    3) A
    4) F
    5) H
    6) C
    7) E
    8) B
    9) I
    10) D


  1. prika148
    04.04.2018 17:08

    Заголовок спойлера
    1 — G, 2 — J, 3 — A, 4 — F, 5 — H, 6 — C, 7 — E, 8 — B, 9 — I, 10- D


  1. f1int
    04.04.2018 17:30

    Заголовок спойлера
    1 G
    2 J
    3 A
    4 F
    5 H
    6 C
    7 E
    8 B
    9 I
    10 D


  1. igordata
    04.04.2018 18:20

    Блин, я пропустил! =(
    Какие есть ещё ближайшие тусовки, связанные с Go?

    ЗЫ: Может кто подскажет ещё гошные группы в тележке?


    1. rafinirovannoe Автор
      05.04.2018 11:27
      +1

      Привет! Ближайшая, что я знаю — это повод съездить в Минск на GoWay Meetup v1.3 11 апреля).
      Вот страница встречи.
      Гошные группы может быть кто-то из читателей подскажет или мои коллеги подтянутся в комментарии).



  1. Tumenbayev
    04.04.2018 20:52

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


  1. informa
    05.04.2018 04:06

    Заголовок спойлера
    1-g
    2-j
    3-a
    4-f
    5-h
    6-c
    7-e
    8-b
    9-i
    10-d


  1. Ghost_Russia
    05.04.2018 10:55

    Ответ?
    1 — G
    2 — J
    3 — A
    4 — F
    5 — H
    6 — C
    7 — E
    8 — B
    9 — I
    10 — D


  1. TaskForce141
    05.04.2018 10:55

    Это странное чувство, когда методом исключения находишь соответствие не для брейнфака.
    1234567890
    GJAFHCEBID



  1. Raz-Mik
    05.04.2018 10:55

    Security
    1-g 2-j 3-a 4-f 5-h 6-c 7-e 8-b 9-i 10-d


  1. ErgoZru
    05.04.2018 13:03

    выиграл футболку, прикольно было, жаль повторно нельзя было участвовать, очень хотелось ещё и варежки, они тоже классные))) Может есть способ их ещё раздобыть, rafinirovannoe?)))


  1. oWart
    05.04.2018 16:56

    Все ответы на тест одинаковые… Мне вот интересно: они все правильные или есть какой-то подвох и все комментаторы ошиблись? И когда ждать розыгрыш?


    1. rafinirovannoe Автор
      05.04.2018 17:00

      Большинство правильные, да.
      Через неделю после публикации апдейтну пост, закроем розыгрыш и включим рандомайзер.


      1. oWart
        05.04.2018 17:04

        Большинство? Кажется они все равные… :)


    1. deadkrolik
      06.04.2018 07:07

      Первым пяти достаточно просто прокомментировать, даже не обязательно правильно отвечать, так как:


      Первым пяти комментаторам мы пришлём ...