Pi
Число Пи, скажу вам братцы,
Легче так запоминать.
Три четырнадцать пятнадцать
Девять два, шесть пять, три пять.

Дмитрий Эйт


Недавно мне потребовалось число Пи в шестнадцатиричном формате. Примерно 10000 знаков после запятой. Однако все публикации в сети как правило демонстрируют Пи в десятичном виде. Потыкавшись немного я нашёл Пи в двоичном виде, и это меня более чем устроило: простая конвертация решила поставленные задачи. Тут бы и закончить историю, но как говорится, «ложечка-то нашлась, а осадок остался». Ниже вы сможете посмотреть простую имплементацию библиотеки PiHex, генерирующей цифру, или последовательность цифр в любой позиции после запятой у числа Пи (правда, не более, чем 10,000,000).
Читать дальше →

Для многих программистов, которые используют или желали бы использовать Go на практике, отсутсвие механизмов параметрического полиморфизма в языке является большой печалью. Но не все так плохо как может показаться на первый взгляд.


Конечно в Go нельзя писать обобщенные программы, например в стиле C++ templates, которые бы практически не влияли на затраты процессорного времени. Такого механизма в языке нет и, вполне возможно, что не предвидится.


С другой стороны, язык представляет довольно мощный встроенный пакет reflect, которой позволяет производить рефлексию как объектов, так и функций. Если не ставить быстродействие во главу угла, то с помощью этого пакета можно достигать интересных и гибких решений.


В этой статье я покажу как реализовать for each в виде типонезависимой рефлексивной функции.


Читать дальше →

Темы

Библиотеки и примеры кода

Конференции и митапы

  • dotGo 2016 — Париж, 10 октября, промокод GOLANGSHOW для скидки в 20%
  • The Golang UK — Лондон, 17–19 августа, промокод GOLANGSHOW2016 для скидки в £25
  • Митап в Питере, 23 июля
  • Митап в Москве ождиается в августе

Победитель конкурса

Алексей Мартынов получает плюшевого гофера за поддержку MS SQL в go-reform. Ещё один плюшевый гофер ждёт того, кто добавит поддержу Oracle.

Спонсоры и “патроны”

Ведущие этого выпуска: Артём, Алексей, Александр, Елена.


Руководство по net/http таймаутам в Go.

Перевод статьи "The complete guide to Go net/http timeouts".

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


Темы

Библиотеки и примеры кода

Вакансии

Вакансия в Juno Lab - новый проект основателей Viber. Разработка приложения - конкурента Uber. Приглашают backend разработчиков из РФ присоединиться к команде в Минске (необходим переезд).

Требования высокие - опыт разработки от 7 лет с использованием любой из технологий Java, Scala, Python, Ruby и др., некоторый опыт в Go, готовность и способность к изучению новых технологий на ходу. Как преимущество - опыт смены технологического стека в прошлом. Опыт в следующих технологиях как плюс:

  • Go
  • Microservices
  • Distributed Systems
  • Public Cloud (AWS)
  • Highload Web Services
  • Message Queues
  • NoSQL
  • CI/CD
  • Integration with 3rd party services

Вилка зарплат: от $3500 до $4500-5000.

По всем вопросам можно обращаться в skype: kashinaanna-tlt.

Конференции и митапы

Спонсоры и “патроны”

  • Промо-код GOLANGSHOW для облачного хостинга DigitalOcean.
  • Gravitational, облачные сервисы на любой инфраструктуре. Kubernetes в каждый датацентр! Мы ищем таланты
  • Благодарим за поддержку наших слушателей Maxim Tishchenko, Jaleel Akbashev, Leonid Bugaev, Danila Pisarev, Alexey Grachov, Andrew Pogrebnoy и других “патронов”. Поддержать подкаст можно здесь.

Ведущие этого выпуска: Слава, Артём, Алексей.


Язык Go в Twitch используется во многих нагруженных системах. Простота, безопасность, производительность и читабельность делают его хорошим инструментом для решения проблем, с которыми сталкиваются сервисы, например при стриминге видео и обслуживании переписки миллионов пользователей.

Но эта статья — не очередное воспевание Go. Она о том, как наше использование этого языка раздвигает некоторые границы текущей реализации runtime’а и как мы реагируем на достижение этих границ.

Это история о том, как улучшение runtime’а с Go 1.4 по Go 1.6 дало нам 20-кратное уменьшение пауз при работе сборщика мусора, как мы получили ещё 10-кратное уменьшение пауз в Go 1.6 и как, передав наш опыт команде разработчиков, работающей над runtime’ом Go, обеспечили 10-кратное ускорение в Go 1.7 без дополнительных ручных настроек с нашей стороны.
Читать дальше →



В числе самых обсуждаемых последних новостей в сообществе разработчиков были новые тарифы GitHub (см., например, здесь).

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

Некоторые прибегают к альтернативному решению и разворачивают GitLab (или другой git-сервис) на собственном или арендованном сервере.

Но и у этого решения есть свои подводные камни: GitLab очень требователен к системным ресурсам. Для частных лиц гораздо проще платить 7 долларов в месяц за GitHub, чем арендовать сервер надлежащей конфигурации.

Из сказанного, однако, не следует, что у GitHub на сегодняшний день альтернативы нет. Об одном весьма интересном и перспективном решении мы хотели бы рассказать в этой статье. Знакомьтесь: Gogs. Этот инструмент будет интересен как для индивидуальных разработчиков, так и для небольших компаний.
Читать дальше →

Темы

Библиотеки и примеры кода

Конференции и митапы

  • dotGo 2016 — Париж, 10 октября, промокод GOLANGSHOW для скидки в 20%
  • The Golang UK — Лондон, 17–19 августа, промокод GOLANGSHOW2016 для скидки в £25

Спонсоры и “патроны”

Ведущие этого выпуска: Александр, Артём, Алексей.


Спешим сообщить новость: мы переписали API облачного хранилища. Теперь всё работает гораздо стабильнее и быстрее благодаря новой платформе — Hummingbird, которая по сути представляет собой реализацию некоторых компонентов OpenStack Swift на Go. О том, как мы внедряли Hummingbird и какие проблемы нам удалось решить с его помощью, мы расскажем в этой статье.

Читать дальше →


Я видел много встраиваемых key — value (NoSql db) для Go. Но все что я находил хранили всё в озу и каждые n секунд отправляли данные на диск, а я же хотел гарантированное сохранение на диск и по сути из всех NoSql решений это могла делать mongoDB но а я же искал встраиваемое хранилище. И так накодил вот это github.com/v-grabko/Fly. Думаю что кому то пригодится. В репозитории есть бенчмарки

Система хранения данных



файловая система
basic dir -> db name -> key name


Как видите каждый ключ это просто файл.
Как нам известно файловые системы плохо работают когда в 1 директории куча елементов (директорий, файлов) и по этому я решил сделать птимизацию хранилища.

Теперь делается md5 каждого ключа и полученная строка разбивается посимвольно. И потом я просто для каждого символа создаю директорию.
basic dir -> db name -> 1 -> ... -> 31 -> key name


В ходе оптимизации этого процесса появился кеш распаренных ключей и кеш наличия директории. Вы спросите зачем сделано два кеша если достаточно проверить директорию? Это сделано сделано для случая если в разных бд одинаковый ключ то повторно он не парсится. (размер кеша ключей можно настроить. Минимальный размер 32 символа (на 1 ключ))
По факту у нас поключевая блокировка (ведь каждый ключ это отдельный файл)

Получение данных
изначально чтение каждый раз производилось с файла но позже я сделал репликацию данных в ram. При получении проверяется наличие данных в кеше и если их там нет то читает с диска. При Set/Del данные обновляются в кеше и файловой системе. Set кстати выступает как и Update.

Сжатие данных
Потом я решил что нужно данные сжимать для экономии пространства и прикрутил для всех данных на диске gzip компресию 9 уровня (изменить это нельзя. Но если хотите присылайте пулл реквест)

Поддерживаемые типы



  • float
  • string
  • struct


Немного примеров
package main

import (
    "fmt"
    db "github.com/v-grabko/Fly"
)
type tt struct {
    G string
    T int
}
func main() {
    db.ConfigSet(&db.Config{
        Dir:   "./db",
        CacheParseKey: 1,
        FileRecurse:5,

    })

    DB := db.Open("test")

    //string
    DB.Set("testString", "test")
    st, _ := DB.Get("testString")
    DB.Del("testString")
    fmt.Println(st.(string))

    //float
    DB.Set("testFloat", 99)
    fl, _ := DB.Get("testFloat")
    DB.Del("testFloat")
    fmt.Println(fl.(float64))

    //struct
    DB.Set("testStruct", tt{
        G:"dfdf",
        T:54,
    })
    var p tt
    DB.GetStruct("testStruct", &p)
    fmt.Println(p)
}


А вот так мы можем проверить существование ключа
value, err = DB.Get("dfsdf")
    if err == nil{
            //ключ есть
    } else if err.Error() == db.KeyNotExist {
            //ключа нет
    } else {
            //ошибка
    }



PlanetGo.ru 2015
Связаться