Главная » Хабрахабр » Avito на GopherCon Russia 2018

Avito на GopherCon Russia 2018

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

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

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

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

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

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

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

Centrifugo 2

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

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

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

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

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

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

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

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

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

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

У нас осталось некоторое количество 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)
}

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

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


x

Ещё Hi-Tech Интересное!

[Перевод] USB-агитация от HRF (Human Rights Foundation) “Flash Drives for Freedom”

Пролог Действенным компонентом защищенного периметра агрессивной стратегии Информационной Безопасности является процедура запрета на подключение, использование и любое задействование USB-накопителей, встроенных считывателей (карт-ридеров) и дополнительных устройств на защищаемом оборудовании. Ведь внешние (принесенные пользователем) USB-накопители часто являются потенциальными источниками заражения (носителями вирусов ...

[Перевод] С — не низкоуровневый язык

Ваш компьютер не является быстрой версией PDP-11 Привет, Хабр! Меня зовут Антон Довгаль, я С (и не только) разработчик в Badoo. Мне попалась на глаза статья Дэвида Чизнэлла, исследователя Кембриджского университета, в которой он оспаривает общепринятое суждение о том, что ...