Показаны сообщения с ярлыком cgo. Показать все сообщения
Показаны сообщения с ярлыком cgo. Показать все сообщения

суббота, 23 ноября 2013 г.

На почитать

Как обычно, в основном про Go, но не только:

  1. http://www.slideshare.net/alexclear/on-go - обзорная презентация, но много ссылок на различные проекты, написанные на Go
  2. https://www.facebook.com/notes/facebook-engineering/the-mature-optimization-handbook/10151784131623920 книга про оптимизацию по взрослому. Надо заставить себя прочитать.
  3. http://www.slideshare.net/jpetazzo/docker-and-go-why-did-we-decide-to-write-docker-in-go?goback=.gde_3712244_member_5805932917834149890#! - о проекте Docker, и почему именно Go.
  4. http://blog.golang.org/4years?goback=.gde_3712244_member_5805932917834149891#! Go 4 года, итоги. Если в общем - все выглядит позитивненько.
  5. https://code.google.com/p/go-wiki/wiki/SuccessStories#! Что было сделано на Go.
  6. http://www.linkedin.com/groupAnswers?viewQuestionAndAnswers=&discussionID=5808846211502845954&gid=3712244&commentID=5809268744651837440&trk=view_disc&fromEmail=&ut=1iTBwgk886fS01 Оказывается Go используют в одном из проектов Rocket'а. В общем зная внутреннюю кухню стартапов Rocket'а могу сказать одно - "респект и уважуха" их CTO. Представляю какое противодействие это встретило со стороны Берлина.  Ведь речь идет не о каком-то инструменте, а об одном из основных веб сервисов.
  7.  http://stackoverflow.com/questions/6125683/call-go-functions-from-c - очень хороший пост о том как работать с callback функциями в CGO. Вызов Go функций из процесса, исполняющегося вне Go runtime.
  8. http://cheesesun.blogspot.com/2010/04/callbacks-in-cgo.html - еще один пост про CGO и callback функции.
  9. http://puppetlabs.com/mcollective - про Puppet. Вообще в последние месяцы я очень плотно занимаюсь Puppet манифестами и невольно сравниваю  Puppet c Solt, который я использовал ранее. В общем сравнение не в пользу Puppet. Я считаю Solt - круче на порядок.    














суббота, 24 августа 2013 г.

На почитать

      Про  Go:

Если в кратце - в Go 1.2 должен появится вытесняющий планировщик задач, улучшена поддержка C++ в cgo, сделаны улучшений в encoder/* пакетах, и много-много других оптимизаций.
     Про Linux:

1. Разработка ядра Linux, by Robert Love (интересная фамилия :-)). Уже есть 3-е издание этой книги, но только в английском варианте.
2. Linux System Programing, того же Robert Love
3. Linux in the Nutshell. Снова Robert Love со товарищами. Плодовитый в общем писака - и вообще много чего другого успел сделать.

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

вторник, 19 февраля 2013 г.

Go + C = cgo

       Иногда возникает задача использовать какую-нибуть C библиотеку из Go. К примеру мне понадобилось использовать ImageMagick. Но это в общем-то применимо к любой библиотеке написанной на C. В моем случае уже существовала Go обертка вокруг ImageMagick - Canvas
но в ней не было нужного мне метода - поэтому пришлось написать его самому.
       Попробую в кратце описать как это сделать.  Если вы хорошо владеете английским, лучше пропустить мой эпос и сразу читать оригинал:
    http://golang.org/doc/articles/c_go_cgo.html
    http://golang.org/cmd/cgo/
Если в кратце - то в Go есть специальный псевдо пакет C. Соответсвенно для того чтобы обратится к какой нибуть функции, описанной в C библиотеке, вам нужно подключить .h файл в котором описана эта функция:
/*
#include
*/
import "C"

Последняя строчка говорит Go компилятору что в этом пакете будут вызовы сишных функций и что необходимо специальным образом обрабатывать комментарии начинающиеся с #. Поэтому комментарий #include будет обработан как подключение заголовочного файла, и все символы, объявленные в нем будут добавлены в талицу символов псевдомодуля C. После этого вы сможете вызывать таким образом:
C.fputs(...)

Чтобы все это работало как надо нужно чтобы подключаемый заголовочный файл был установлен у вас в системе и компилятор мог его найти. То же самое относится непосредственно к самой библиотеке - линкер должен ее находить. Если что-то не находится, нужно с помощью специальных комментариев вида:

// #cgo CFLAGS: -DPNG_DEBUG=1
// #cgo LDFLAGS: -lpng
указать соответсвенно компилятору и линкеру где лежат соответсвующие подключаемые файлы и файлы библиотек.
Еще одна особенность связанная с подключение C библиотек состоит в том что они в отличии от обычных пакетов Go, которые линкуются статически, подключаемые библиотеки линкуются динамически. Соответственно нужно чтобы подключаемая библиотека была установлена на том сервере где вы планируете запускать бинарник.

Еще одна особенность состоит в том что вам придется как в C - самостоятельно управлять памятью. Go runtime не имеет не малейшего представления о памяти которая была выделена с помощью сишных функций или где-то в недрах  сишной библиотеки - и поэтому вам необходимо самим освободить ее.
      Но если быть внимательным и понимать что делаешь - возможность подключать сишные библиотеки дает очень большие возможности. У меня это вот уже с месяц работает в продакшене - и очень даже успешно.