• Как разместить Vue SPA и Golang Back на одном httpS сервере?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Reverse Proxy на Nginx. Заодно не будет проблемы с CORS.
    Ответ написан
    Комментировать
  • В какой момент срабатывает watch во vue 3 при множественном source?

    Lastor
    @Lastor
    В чем сила, брат? В ньютонах.
    const trigger = ref(false) //for watch
    
    function somePiniaAction() {
       var1.value = "1"
       var2.value = "2"
       var3.value = "3"
       trigger.value = !trigger.value
    }
    Ответ написан
    4 комментария
  • Как tilda хостит сайты?

    @Drno
    2 или более revers-proxy на входе. 2 записи DNS которые на них ведут
    2 или более одинаковых веб сервера. скорее всего подрубают отдельные конфиги nginx(доп конфиг) для каждого клиента. либо делают lxc контейнер (что может быть накладно)
    2 или более БД Master>Slave или Master>Master
    2 или более реплицируемых независимых хранилища, ceph или s3
    Ответ написан
    Комментировать
  • Как tilda хостит сайты?

    @vitaly_il1
    DevOps Consulting
    Посмотрите на highscalability.com/blog/category/example - там есть разбор реальных архитектур. Tilda там нет, но есть например Wix - правда в эпоху до Docker. Но принципы те же.
    Ответ написан
    Комментировать
  • Как распределять нагрузку подсистем?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Не надо ничего переизобретать - все уже давно придумано в k8s и сообществом CNCF
    Ответ написан
    Комментировать
  • Как отобразить уже отрисованную страницу после смены роута vue router 2?

    Fragster
    @Fragster
    помогло? отметь решением!
    Добавить префетч на асинхронные импорты (иногда (не всегда) целесообразно вообще их убрать)
    component: () => import(/* webpackPrefetch: true */ 'path/to/component')
    сделать так, чтобы данные для компонентов получались не в created/mounted, а раньше, например сильно заранее и хранились в vuex и/или пока получаются данные - отображались скелеты или экран загрузки со спиннером.
    Ответ написан
    9 комментариев
  • Стоит ли использовать Unity для GUI приложения?

    GavriKos
    @GavriKos Куратор тега Unity
    Я бы не советовал. Вам придется делать свою реализацию UI (речь именно про визуал), но вы при этом теряете поддержку всего системного, типа того же MaterialDesign.
    Ну и вес приложения )
    Ответ написан
    Комментировать
  • Как оценить мощность сервера с прокси?

    gaarchik
    @gaarchik
    Сисадмин
    Установи программу prtg и промониторь сколько ресурсов будет занимать несколько машин, и мониторинг будет и будешь знать что сколько занимает, да и сетевые пакеты будешь знать в каком количестве проходят.
    Ответ написан
    Комментировать
  • Как написать сервер DNS?

    Sanes
    @Sanes
    У регистратора дополнительно указываются IP адреса для NS серверов. Если они в этом же домене.
    Ответ написан
    8 комментариев
  • Как в golang с помощью tgbotapi переслать отправителю его же сообщение?

    @ghostiam
    На Go писатель, серверов пинатель.
    Старый ответ

    как и с сообщениями, у созданных объектов есть свойство ReplyToMessageID в которое нужно записать ID сообщения из update.Message.MessageID
    audioUpload := tgbotapi.NewAudioUpload(update.Message.Chat.ID, ...)
    audioUpload.ReplyMarkup = update.Message.MessageID
    _, err := bot.Send(audioUpload)


    Если возникает вопрос, как вообще отправить файл, то нужно передать структуру tgbotapi.FileBytes или tgbotapi.FileReader вторым параметром в функцию и заполнить её.
    Для примера, отправляем файл с диска:
    file, err := os.Open("audio.mp3")
    		if err != nil {
    			panic(err)
    		}
    		defer file.Close()
    
    		audioUpload := tgbotapi.NewAudioUpload(update.Message.Chat.ID, tgbotapi.FileReader{
    			Name:   "audio.mp3",
    			Reader: file,
    			Size:   -1, // If Size is -1, it will read the entire Reader into memory to calculate a Size.
    		})
    		audioUpload.ReplyToMessageID = update.Message.MessageID
    		_, err := bot.Send(audioUpload)
    		if err != nil {
    			panic(err)
    		}



    UPD: После общения в ЛС, оказалось, что вопрос заключался в создании Echo бота, который мог бы пересылать не только текст, но и картинки, аудио и прочее.

    В данном примере реализована отправка только текста и картинок. Чтобы добавить обработку других типов сообщений, нужно добавить новый `case` в `switch` в функции `OnMessage`:
    Код
    package main
    
    import (
    	"log"
    
    	"github.com/davecgh/go-spew/spew"
    	"github.com/go-telegram-bot-api/telegram-bot-api"
    )
    
    func main() {
    	// подключаемся к боту с помощью токена
    	bot, err := tgbotapi.NewBotAPI("ТОКЕН")
    	if err != nil {
    		log.Panic(err)
    	}
    
    	bot.Debug = true
    	log.Printf("Authorized on account %s", bot.Self.UserName)
    
    	// инициализируем канал, куда будут прилетать обновления от API
    	u := tgbotapi.NewUpdate(0)
    	u.Timeout = 60
    
    	updates, err := bot.GetUpdatesChan(u)
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	// читаем обновления из канала
    	for update := range updates {
    		switch {
    		case update.Message != nil: // Если было прислано сообщение, то обрабатываем, так как могут приходить не только сообщения.
    			OnMessage(bot, update.Message)
    		}
    	}
    }
    
    func OnMessage(bot *tgbotapi.BotAPI, message *tgbotapi.Message) {
    	// Пользователь, который написал боту
    	userName := message.From.UserName
    
    	// ID чата/диалога.
    	// Может быть идентификатором как чата с пользователем
    	// (тогда он равен UserID) так и публичного чата/канала
    	chatID := message.Chat.ID
    
    	log.Printf("[%s] %d", userName, chatID)
    
    	spew.Dump(message) // выводим то что пришло (Для отладки!!!)
    
    	var msg tgbotapi.Chattable
    	switch {
    	case message.Text != "": // Текстовое ли сообщение?
    		msg = tgbotapi.NewMessage(chatID, message.Text)
    
    	case message.Photo != nil: // Это фото?
    		photoArray := *message.Photo
    		photoLastIndex := len(photoArray) - 1
    		photo := photoArray[photoLastIndex] // Получаем последний элемент массива (самую большую картинку)
    		msg = tgbotapi.NewPhotoShare(chatID, photo.FileID)
    
    	default:                                                 // Если не одно условие не сработало
    		msg = tgbotapi.NewMessage(chatID, "Не реализовано") // Отправляется на тот тип сообщения, который ещё не реализован выше ^
    	}
    
    	// и отправляем его
    	_, err := bot.Send(msg)
    	if err != nil {
    		log.Println(err)
    	}
    }
    Ответ написан
    3 комментария
  • Где найти официальные статьи по теме "Проектирование ПО"?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Грамотную архитектуру ПО знает только вендор среды окружения функционирования этого ПО.
    Там и ищите.
    Ответ написан
    Комментировать
  • Как реализовать динамические плагины для SPA на ReactJS?

    alexiusp
    @alexiusp
    senior frontend developer
    Вопрос решается в два приёма.

    Во-первых нужно изучить динамическую подгрузку компонентов, чанки и т.п. вопросы конфигурирования webpack. Можно сделать то же, что делает роутер, но без роутера. ;)

    Во-вторых нужно договориться о некоем интерфейсе, который все плагины будут реализовывать, например, можно сказать, что все загружаемые таким образом компоненты должны поддерживать пропс store, в который приложение будет передавать store, чтобы они уже сами подписывались на изменения и т.п.
    Ответ написан
    Комментировать
  • Как сделать попиксельный поворот фигуры (вектора)?

    longclaps
    @longclaps
    Наоборот - проходишься по точкам внешнего квадрата, заведомо вмещающего повёрнутый квадрат, и обсчитываешь, на какую точку повёрнутого кварата попадаешь (если попадаешь).
    Ответ написан
    2 комментария