• Почему возвращает значение третей рутины?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Вот два примера для проверки что всё на самом деле работает верно (если мы правильно понимаем в чём вопрос).
    package main
    
    import "fmt"
    import "time"
    
    func getDataFromServer(res chan string, serverName string, delay int64) {
    	fmt.Println(serverName)
    	time.Sleep(time.Duration(delay)*time.Second)
    	res <- "test_"+serverName
    }
    
    func main() {
      res := make(chan string, 3)
      go getDataFromServer(res, "Server1", 10)
      go getDataFromServer(res, "Server2", 11)
      go getDataFromServer(res, "Server3", 12)
    
      data := <- res
      fmt.Println(data)
    }
    Server3
    Server1
    Server2
    test_Server1

    package main
    
    import "fmt"
    import "time"
    
    func getDataFromServer(res chan string, serverName string, delay int64) {
    	fmt.Println(serverName)
    	time.Sleep(time.Duration(delay)*time.Second)
    	res <- "test_"+serverName
    }
    
    func main() {
      res := make(chan string, 3)
      go getDataFromServer(res, "Server1", 15)
      go getDataFromServer(res, "Server2", 11)
      go getDataFromServer(res, "Server3", 12)
    
      data := <- res
      fmt.Println(data)
    }
    Server3
    Server1
    Server2
    test_Server2

    Golang сам решает когда контекст переключать для большей производительности и меньших накладных расходов.
    Ответ написан
    Комментировать
  • Что скажете о моей реализации логирования?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Посмотрите в сторону уже готовых систем логирования (Graphite, influxdb, прочее) и мониторинга (mrtg, rrd).

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

    По поводу бенчмарков. Вы утверждаете что "вставка в редис"+"вставка в mysql" работает быстрее чем "вставка в mysql". Это по меньшей мере выглядит заблуждением, потому что тот же редис на том же сервере (на сколько я понял) и производительности прибавить не может. Изменился разве что немного подход к записи в MySQL.

    Варианты которые у вас были при написании своего логера:
    1. писать в MySQL по запросу каждый раз когда срабатывает некое событие и появляется запись в логе
    2. накапливать пачку логов в оперативной памяти - пушить в MySQL точно так же как после редиса (долой редис), за одно научитесь ограничивать потребление памяти (вы ведь не можете бесконечно склодировать данные)
    3. накапливать пачку логов в файл (банальный бинарный файл), раз в N минут менять лог-файл
    4. вариант тот же что и третий, только старые логи переносить в базу в фоне.

    Тут надо так же обратить внимание на то для чего логи пишутся:
    1. что бы точно знать кто где и что делал (доктилоскопия пользователей)
    2. что бы делать реал-тайм подстройку других алгоритмов в зависимости от поведения пользователей, системы и всего такого
    3. что бы просто быть в курсе что приложение упало (кстати в этом случае ваш код отправит емейл?:))

    У меня есть задача по сохранении метрики всякой. Условия:
    1. MySQL - для показа потом агрегированных графиков и просто списков что сделалось за определённый промежуток времени.
    2. Shared-хостинг где можно запускать бинарники, но нельзя делать fork'и и по сути ставить ничего кроме Golang приложения и PHP скриптов.
    3. Golang приложение которое щёлкает задачки как семечки и метрик просто туча - считай только их и писать.

    Без накопления и группировки MySQL только и занимается что вставкой в таблицу с метрикой. В планах хранить в бинарных блобах. Ставить тот же Графит на Shared-хостинг для такой простой задачки считаю избыточно:)
    Ответ написан
  • Какую GO либу посоветуете для написания демонов?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Попробуйте стандартные для linux start-stop-daemon в init.d скриптах, при условии что у вас Linux и не systemd.
    Ответ написан
  • Как сделать эту функцию не такой страшной?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    func dataValid(result []string) bool {
      if v.IsLogin(result[0]) == true {

    Вы уверены что там всегда будут прилетать значения в функцию?:) Прилетит что-нибудь пустое и вуаля...
    Ответ написан
  • Будет ли польза в такой затеи?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Постепенно собираю свой архив решений на все случаи жизни, у меня для этого отдельный репозитарий на github.com/mantyr/runner и вообще прочие не связанные с Golang вещи тут imagick.metlan.ru плюс ребята знакомые пишут как минимум два проекта с подсказками по программированию в виде каталогов (но Golang там врядли будет в ближайшее время). Так же не плохи ресурсы stackoverflow.com и https://www.socketloop.com/tutorials/

    По Golang же самые лучшие ресурсы: godoc.org https://golang.org/pkg/ 4gophers.ru

    В любом случае ваш проект - это ваш опыт, как программирования так и поиска и сбора информации, её представления публике. Учитесь и всё получится. И поделитесь ссылкой когда будете готовы.
    Ответ написан
  • Как правильнее записывать данные в 2 связанных таблицах?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Если я вас правильно понял то вы:
    1. на входе имеете массив тегов $tags = array("tag1", "tag2", "tag3")
    2. хотите сохранить новые в базу
    3. хотите получить id всех тегов и присвоить их к некоторому посту

    Попробуйте сделать так:
    1. INSERT IGNORE INTO `tags` (title) для всех тегов, те что есть проигнорируются
    2. SELECT id FROM `tags` WHERE `title` IN (...) для всех тегов что вам нужно
    3. INSERT IGNORE INTO `post_tags` для всех id полученных из второго запроса

    По крайней мере это уменьшит количество кода и упростит понимание.
    + добавьте слой кеширования для хранения тегов которые уже добавлены в базу (их ведь особо много явно не будет)
    Ответ написан
  • Кто нибудь получил доступ к новому api кинопоиска?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Заявку так же отправил восьмого числа, пока никакого ответа не было.

    Что бы вы хотели сделать будь у вас такое API?

    Update 20 ноября в комментариях...
    Ответ написан
  • GIN: можно ли вложить роутер в роутер?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Просто соблюдайте входные и выходные параметры. Возвращать функции с нужным перечнем входных и выходных параметров тоже можно. Остальное дело техники.
    Ответ написан
  • Где лучше хранить большие списки int'ов?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Это вполне типичный blob:)
    Ответ написан
    1 комментарий
  • Jquery plugin для работы с get параметрами урл?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Если не нашли то это отличный повод разобраться в том как делаются такие плагины, тем более что сам скрипт вы, вроде, уже для пару-тройке сайтов делали, ведь так?:)
    Ответ написан
  • Имеет ли смысл писать чат на meteor.js?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    "каждый раз делать запрос к бд, а ведь это реал-тайм" - не факт, так как meteor.js вроде надстройка над node.js, а он запускается в виде сервера и может хранить текущие данные прямо в памяти, а базу использовать только для сохранения на длительное хранение.

    Вы попробуйте, может понравится и сможете написать отличную статью о том через какие препятствия пришлось пройти что бы это всё сделать. Для продакшина node.js/meteor.js для real-time чата не советую из практических соображений, хотя и на них можно сделать нормальные решения.
    Ответ написан
    Комментировать
  • Как полностью убить дочерний процесс?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    go run имеет особенности, к примеру вы можете запустить его в консоли и забыть - от консоли он спокойно отвяжется. Тут у вас аналогичная ситуация. Если вы хотите запускать некий код в "дочернем" процессе то делайте это явно:
    1. через fork() - что не желательно
    2. через go-рутины
    3. ...
    Но, судя по всему, вы пытаетесь скрестить Golang приложение с приложением на другом языке (иначе откуда такие заморочки). В таком случае вам нужно:
    1. научить приложение (first.go) понимать сигналы операционной системы, для этого изучите os.Signal и syscall.SIGKILL (вообще почитайте на тему какие сигналы надо обрабатывать при завершении приложения) и завершайте приложение правильно в нужный момент
    2. всё таки скомпилируйте вначале в бинарник, go install first.go и используйте уже именно его...

    Ну и напоследок - не надо так расходовать ресурсы - запускать N раз другую программу что бы просто посчитать несколько однотипных цифр. Сформируйте программу более ёмко, отправьте ей кучу данных и получите от неё другую кучу результатов разом. Или сделайте многопоточный сервис который принимает запросы и выдаёт ответы.
    Ответ написан
    2 комментария
  • Как и где инициализировать все компоненты проекта на Go в стиле ООП?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Евгений правильно написал - самый правильный способ. Вообще точка входа в программе всегда одна (main и init), а уже потом init и прочие функции в пакетах которые вызывают из package main.

    package main
    import mypackage
    
    func init() {
    ... что-то сделали, что-то инициализировали, например доступ к базе или ещё чему
    ... ещё что-то инициализировали...
    ... начинаем инициализировать mypackage
    mypackage.DB = DB // проинициализировали доступ в базу в пакете:)
    mypackage.Other = Other // ещё что-то проинициализировали в пакете...
    }
    
    func main() {
    ... другой вопрос что можно и так, но в этом случае в пакете чуть больше логики...
       obj := package.Init()
       obj.SetDB(DB)
       obj.SetOther(Other)
    
       go obj.Start()
    }

    При желании можно ещё пару способов придумать...
    Ответ написан
    2 комментария
  • Как организовать развертывание(deploy) проекта?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Вариантов множество.

    1. делайте настройку для каждой группы использования (production, testing, dev, ...) и просто в коде определяйте какой блок настроек использовать в зависимости от окружения.

    Не всегда целесообразно раскрывать данные (о паролях, логинах и прочих настройках которые используются в production) тем кто работает с кодом в других окружениях (dev, testing, ...) По этому:

    2. хранить настройки для production и testing отдельно (можно во втором репозитарии) и при деплое загружать данные от туда.

    3. вынести настройки за пределы проекта, в результате настройки остаются, а проект обновляется. Обновление настроек на каждой среде - отдельная задача. При автоматизации развёртывания нужен комплект настроек под каждую среду, в идеале сам код проекта ничего об этом знать не должен и должен корректно стартовать с любыми входящими конфигами.
    Ответ написан
  • С чего лучше начать карьеру сетевого инженера?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Сетевые инженеры бывают разными. Изучите forum.nag.ru , посмотрите список оборудования shop.nag.ru/catalog , посмотрите вакансии интересных компаний (интересных вам к примеру) и составьте список технологий которые они требуют на соответствующих должностях, а так же на должностях которые к вашей прямого отношения не имеют (так можно выяснить некоторые подробности о том с чем предстоит дело).

    Присмотритесь к сертификации, просто что бы понимать что есть, а чего нету.
    Пройдитесь по ozon.ru в поисках профильной литературы - купите книги или скачайте в сети, много читайте.
    Постройте что-нибудь сетевое для себя - что угодно, от ретрансляторов, до BGP-маршрутизации в виртуальных машинах (заодно выясните что такое BGP, OSPF и другие протокольные штуки).
    Посмотрите на тестовые стенды различных вендеров, они часто предоставляю виртуальные комплексы для отработки сетевых конфигураций, а на некоторых конференциях можно поработать с живым оборудованием в купе со специалистами вендора.

    В любом случае путь самурая - это от ничего к строительству чего-то полезного путём выяснения всех подробностей и вникания в дитали. Что бы вы как сетевой инженер хотели бы построить? Вот с изучения этого и начните, а там, глядишь, и работа появится в этой же сфере.
    Ответ написан
    2 комментария
  • Как в go, в пакете template переводить в текст не все теги?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Вначале берём html/template и читаем исходники, видим что там используется text/template, потом читаем godoc к обоим пакетам и видим что text/template базовый и имеет больше полезной информации. Там же находим блок.

    Examples

    Here are some example one-line templates demonstrating pipelines and variables. All produce the quoted word "output":

    {{"\"output\""}}
    	A string constant.
    {{`"output"`}}
    	A raw string constant.
    {{printf "%q" "output"}}
    	A function call.
    {{"output" | printf "%q"}}
    	A function call whose final argument comes from the previous
    	command.
    {{printf "%q" (print "out" "put")}}
    	A parenthesized argument.
    {{"put" | printf "%s%s" "out" | printf "%q"}}
    	A more elaborate call.
    {{"output" | printf "%s" | printf "%q"}}
    	A longer chain.
    {{with "output"}}{{printf "%q" .}}{{end}}
    	A with action using dot.
    {{with $x := "output" | printf "%q"}}{{$x}}{{end}}
    	A with action that creates and uses a variable.
    {{with $x := "output"}}{{printf "%q" $x}}{{end}}
    	A with action that uses the variable in another action.
    {{with $x := "output"}}{{$x | printf "%q"}}{{end}}
    	The same, but pipelined.



    Иными словами сделайте {{`{`}} и {{`}`}} или {{"{"}} и {{"{"}} там где нужно "абфусцировать тег".
    Что бы не писать постоянно кучу скобок - можно прописать Delims("{", "}"), но как именно выясните сами:)
    func (t *Template) Delims(left, right string) *Template


    Возможно есть ещё несколько вариантов решения, если теги которые надо игнорировать не во вставляемом в шаблон тексте.
    Ответ написан
  • Javascript фреймворк для чата?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    jQuery, проще некуда.
    Ответ написан
  • "Разработка cms" как тема диплома?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Дипломная работа предполагает некоторое исследование, некий поставленный вопрос и процесс получения на него ответа. Научная работа, одним словом. Если хотите сделать разработку CMS дипломным проектом то и подходите к ней как к диплому, со всеми вытекающими от сюда особенностями.

    Придумайте методику, подкрепите её знаниями и исследованиями, проведите ряд экспериментов, а там глядишь и диплом будет с чего писать.
    Ответ написан
    5 комментариев
  • Почему замедляется работа скрипта?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Скорость вставки в базу можно проверить отдельно, посмотрев SHOW PROCESSLIST;

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

    Армянское Радио правильно указывает на то что нужно пользоваться средствами мониторинга и профилирования. Попробуйте поставить и освоить xhprof, это будет вам очень полезно с точки зрения общего понимания что и как работает и сможете ответить на вопрос точно - где тратиться больше всего времени, без догадок и домыслов.

    Гуглите на тему "поточный парсинг xml", с его помощью сможете парсить практически без ограничений и с минимальным потреблением ресурсов, в рамках возможного в PHP, конечно же.

    Для сравнения кейс парсинга каталога книг с ozon.ru на Golang:
    - 3.9 гигабайт файл xml
    - 2.3 миллиона книг (у каждой книги название, авторы, описание, ссылка на обложку, перечень языков, стоимость книги, перечень категорий и отдельно список всех категорий к книгам)
    - 10 минут поточного парсинга с сохранением в базу
    - без предварительного сохранения на диск
    - с автодокачкой при сетевых разрывах
    Ответ написан
    1 комментарий
  • Возможно ли начать работу программистом в 18 лет?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Для начала вам придётся попробовать самостоятельно найти ответы на эти вопросы. Иначе зачем вы нужны нормальной компании если за вас всё нужно делать самому? Учитесь быть самостоятельным, принимающим решения человеком. К тому же вы описали что у вас уже есть опыт. Постарайтесь его применить, что-то создать.

    Если хотите потренироваться - попробуйте продать мне или кому-то ещё одну из своих компетенций, технологическое решение. В не зависимости от того получится у вас это или нет - те знания и те выводы которые можно сделать из процесса очень полезны.
    Ответ написан
    1 комментарий