Avito на GopherCon Russia 2018

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



    Большинство фото мы взяли из отчета, выложенного на странице 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)
    }

    Ждём ваших комментариев!


    Update: ответы

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


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



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

    Авито

    232,00

    У нас живут ваши объявления

    Поделиться публикацией

    Похожие публикации

    Комментарии 32
      +2
      может быть

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

        0
        Проверьте личку, пожалуйста
        +1
        Попробую так
        1 — G
        2 — J
        3 — A
        4 — F
        5 — H
        6 — C
        7 — E
        8 — B
        9 — I
        10 — D
          +1
          Можно не подглядывать, вдруг неправильно
          1-G
          2-J
          3-A
          4-F
          5-H
          6-C
          7-E
          8-B
          9-I
          10-D
            0
            Была не была
            1-G
            2 — J
            3 — A
            4 — F
            5 — H
            6- C
            7 — E
            8 — B
            9 — I
            10 — D
              0
              может так
              1-g, 2-j, 3-a, 4-F, 5-h, 6-C, 7-E, 8-B, 9-I, 10-D
                0
                Мой ответ
                • 1 — G
                • 2 — J
                • 3 — A
                • 4 — F
                • 5 — H
                • 6 — C
                • 7 — E
                • 8 — B
                • 9 — I
                • 10 — D
                  0
                  Проверьте личку, пожалуйста
                  0
                  Попробуем
                  1) G
                  2) J
                  3) A
                  4) F
                  5) H
                  6) C
                  7) E
                  8) B
                  9) I
                  10) D
                    0
                    Заголовок спойлера
                    1 — G, 2 — J, 3 — A, 4 — F, 5 — H, 6 — C, 7 — E, 8 — B, 9 — I, 10- D
                      0
                      Заголовок спойлера
                      1 G
                      2 J
                      3 A
                      4 F
                      5 H
                      6 C
                      7 E
                      8 B
                      9 I
                      10 D
                        0
                        Проверьте личку, пожалуйста
                        0
                        Блин, я пропустил! =(
                        Какие есть ещё ближайшие тусовки, связанные с Go?

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

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

                                0
                                Заголовок спойлера
                                1-g
                                2-j
                                3-a
                                4-f
                                5-h
                                6-c
                                7-e
                                8-b
                                9-i
                                10-d
                                  0
                                  Ответ?
                                  1 — G
                                  2 — J
                                  3 — A
                                  4 — F
                                  5 — H
                                  6 — C
                                  7 — E
                                  8 — B
                                  9 — I
                                  10 — D


                                  Код №6 в виде текста :)
                                  ++++++++[>++++>++++++++++>+++++++++>++++++++++++++>+<<<<<-]>>.>.<.<.>>>++.+++.---------.-------.++++++++++++++.>++.

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


                                      0
                                      Проверьте личку, пожалуйста
                                      0
                                      Security
                                      1-g 2-j 3-a 4-f 5-h 6-c 7-e 8-b 9-i 10-d
                                        0
                                        выиграл футболку, прикольно было, жаль повторно нельзя было участвовать, очень хотелось ещё и варежки, они тоже классные))) Может есть способ их ещё раздобыть, rafinirovannoe?)))
                                          +1
                                          Есть, отправлю варежки и наклейки всем комментаторам этого поста :)
                                          См. личку Хабра.
                                            0
                                            Ващпеееее огооонь!!!
                                          0
                                          Все ответы на тест одинаковые… Мне вот интересно: они все правильные или есть какой-то подвох и все комментаторы ошиблись? И когда ждать розыгрыш?
                                            0
                                            Большинство правильные, да.
                                            Через неделю после публикации апдейтну пост, закроем розыгрыш и включим рандомайзер.
                                              0
                                              Большинство? Кажется они все равные… :)
                                                0
                                                Не хочу показаться занудой, но неделя прошла :))
                                                  0
                                                  Привет! Замораживаю приём ответов и включаю рандомайзер :)
                                                    0
                                                    Про первую пятерку комментаторов не забудьте :)
                                                0

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


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

                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                              Самое читаемое