Slide 1

Slide 1 text

Go в бою Стачка! 13 12 апреля 2013

Slide 2

Slide 2 text

express42.com

Slide 3

Slide 3 text

rubynoname.ru

Slide 4

Slide 4 text

rubynoname.ru

Slide 5

Slide 5 text

storage.io • Распределённое отказоустойчивое хранилище • S3-совместимое API • Близко к российскому пользователю • Elliptics, nginx • Chef, Zabbix, Fabric • Go

Slide 6

Slide 6 text

О чём речь? • cgo: вызов C из Go и Go из C • mruby: вызов Ruby из Go и Go из Ruby • Тестирование • Управление зависимостями: go get or not go get • Деплоймент • Мониторинг и метрики

Slide 7

Slide 7 text

cgo • Вызов C из Go и Go из C • Простые типы, указатели • struct, enum, union • errno: n, err := C.sqrt(-1) // EDOM • Динамическая и статическая (с 1.1) линковка

Slide 8

Slide 8 text

cgo github.com/AlekSi/cgo-by-example ! cs := C.CString("Go string") ! csRet := C.f(cs) ! fmt.Printf("fmt: %s\n", ! !!C.GoString(csRet)) ! C.free(unsafe.Pointer(cs)) ! C.free(unsafe.Pointer(csRet))

Slide 9

Slide 9 text

cgo github.com/express42/elliptics-go !var sum []byte !p := unsafe.Pointer(&sum) !copy( !!key.id.id[:], !!*(*[]C.uint8_t)(p) !)

Slide 10

Slide 10 text

Проблемы cgo • runtime: cgo callback on thread not created by Go – очередь с pthread_mutex_t / pthread_cond_t, или Go 1.1 • C.f2(C.f1) – must call C.f1

Slide 11

Slide 11 text

mruby • mini Ruby (как Lua, но лучше) • Анализ и изменение поведения программы на лету

Slide 12

Slide 12 text

Проблемы mruby • Нет релиза mruby • Только статическая библиотека mruby, только динамическая линковка в cgo в Go 1.0 • ld: Assertion failed: (reExportDylibCount != 0)

Slide 13

Slide 13 text

github.com/AlekSi/gomruby • Жду Go 1.1: статическая линковка в cgo, больше возможностей в reflect

Slide 14

Slide 14 text

Модульные тесты func TestSqrt(t *testing.T) { ! const in, out = 4, 2 ! if x := Sqrt(in); x != out { ! ! t.Errorf("Sqrt(%v) = %v, want %v", in, x, out) ! } } • Benchmarks, example • launchpad.net/gocheck

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

«Unit tests are waste.» - James O. "Jim" Coplien

Slide 17

Slide 17 text

Системные тесты • Тестирование веб-приложения через API • Минимальный setup / teardown • Как настоящий пользователь API

Slide 18

Slide 18 text

Следствия • Простые системные тесты можно использовать для нагрузочного тестирования • Запросы и ответы могут быть использованы для документирования API

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

Системные тесты + Go • net на goroutines • HTTP/1.1, keep-alive, gzip, chunked encoding, timeouts

Slide 21

Slide 21 text

github.com/AlekSi/gophers • Пока что приватный :( • Но вы можете помочь! :)

Slide 22

Slide 22 text

go get •Только одна версия – последняя •Стабильность API •Удаление кода •go get launchpad.net/ gocheck •Супер просто

Slide 23

Slide 23 text

github.com/AlekSi/nut • zip-архив • Версионирование (SemVer) • Зависимости

Slide 24

Slide 24 text

gonuts.io • PyPI, RubyGems.org, NPM, Composer • Установка зависимостей • nut удалить нельзя

Slide 25

Slide 25 text

Реакция сообщества • It has been shown so many times why the versioning idea is broken. • Mate, I'm not going to quote urban dictionary to you, but you have to find another name for a versioned package. Nut is not acceptable. (сообщение в группу golang-nuts)

Slide 26

Slide 26 text

Реакция сообщества • It's annoying to me how few people seem to think that dependency management isn't a huge missing piece in the Go tooling. • Would you prefer gonads.io?

Slide 27

Slide 27 text

Что дальше? • Фиксация зависимостей приложения (bundle lock) • Извлечение конкретной ревизии после go get

Slide 28

Slide 28 text

Деплоймент • Fabric • git checkout, make, копируем статический бинарник, symlink current, перезапуск

Slide 29

Slide 29 text

Zabbix • Комплексное решение • Странный API • порядок полей в json важен для zabbix- server • формат чисел важен (%.6f) • не всегда соответствует документации

Slide 30

Slide 30 text

Zabbix • Хост создаётся до нас • Создаём приложение при запуске • Создаём items динамически • Графики, экраны и триггеры создаются руками и копируются на другие хосты

Slide 31

Slide 31 text

А теперь - слайды!

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

Спасибо! • about.me/ alexey.palazhchenko • @paaleksey • github.com/AlekSi • gonuts.io • meetup.com/ Golang-Moscow • express42.com • storage.io