• TypeScript настройка alias'ов?

    k12th
    @k12th
    console.log(`You're pulling my leg, right?`);
    Если попробовать скомпилировать приведенный вами код с помощью команды tsc в корне проекта, то он незамедлительно показывает ошибку:
    tsconfig.json(15,5): error TS5060: Option 'paths' cannot be used without specifying '--baseUrl' option.


    Ну и собственно при добавлении "baseUrl": "./" в tsconfig всё работает:)

    P.S. Спасибо, я теперь знаю, что tsc поддерживает алиасы:)
    Ответ написан
    Комментировать
  • Оправдано ли будет использование NodeJS в качестве бэкенда крупного приложения?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Paypal и Netflix используют Node.js. У обоих нагрузки очень даже приличные.
    В плане масштабируемости думайте об архитектуре. Можно и на perl написать приложение, которое за секунду будет обслуживать миллион клиентов.
    Node.js будет прекрасно работать в качестве движка для типичного веб-приложения вроде магазина, чата или CRM. Если у вас очень много компонентов, например тысячи, логичнее приложение разбить на модули и сделать вместо одного приложения несколько, которые можно запускать по-отдельности (здесь уместно упоминание микросервисной архитектуры). Разумеется запросы нужно распределять с помощью балансировщика.
    Есть еще такая вот штука https://serverless.com/ - ее можно масштабировать практически до бесконечности. Были бы деньги.
    Node.js будет плохо работать в области процессинга данных, например генерация картинок, потоковая обработка видео, нейронные сети и т.д. Здесь лидеры C, C++, Go, Rust, Java.
    Можно даже создать гибридное приложение - большую часть выполнить на Node.js, а критичную по производительности на другом языке. Например генерация миллиона прайсов в сутки в старый xls или векторный pdf, упаковка в архив и рассылка - не самая лучшая идея для Node..JS. То же C++ здесь будет вне конкуренции.
    Ответ написан
    19 комментариев
  • Почему не работает реактивность?

    nikichv
    @nikichv
    Frontend dev. Current stack: Next.js/RTK/Saga
    methods: {
      toggle() {
        this.isActive = !this.isActive;
      }
    }

    Поменяйте стрелочную функцию toggle: () => { на метод toggle() { и тогда все заработает.

    P.S. Откуда вы все вообще решили, что в методах компонента нужно писать стрелочные функции? :)
    Просто вы не первый с такой проблемой. Ощущение, будто все насмотрелись уроков по ES6 и стали бездумно писать стрелочные функции там, где они вовсе не нужны.
    Ответ написан
    Комментировать
  • Как это работает? youtube.?

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

    А если вы спрашиваете как он это делает, то это, скорее всего, банальный Ajax (а что ещё может быть?).
    Ответ написан
    Комментировать
  • Серверные блоки nginx?

    DevMan
    @DevMan
    точно так же как и на винде.
    хост-файл лежит в /etc.
    Ответ написан
    3 комментария
  • Сколько должно пройти времени, чтобы привязать домен к ip?

    saboteur_kiev
    @saboteur_kiev Куратор тега Системное администрирование
    software engineer
    Если никто до этого момента не обращался к домену example.com, то может и мгновенно.
    Если обращался, то это обращение висит в кеше. В ns записи обычно указывается TTL, но некоторые DNS сервера могут его игнорить и работать по умолчанию - хранить информацию в кеше до суток.

    То есть через сутки - данные о домене должны устареть на всех кешах, и обновиться с ваших NS серверов свежими.
    Ответ написан
    Комментировать
  • Сервер golang не отвечает при частых запросах к БД?

    Вы подключаетесь к базе данных на каждый запрос, это совсем плохо.
    Подключайтесь к базе данных один раз при старте приложения, а при обработке запроса используйте готовое подключение.
    Ответ написан
    1 комментарий
  • Принцип асинхронных приложений в GO?

    astec
    @astec
    Разработчик https://debtstracker.io/
    За примерами и объяснением когда это нужно идём в https://tour.golang.org/concurrency/1

    Также стоит разобраться чем асинхронность отличается от многопоточности.

    Не нужно тогда когда накладные расходы на каналы и рутины превышают выигрыш от их использования.

    Так же полезно почитать разную критику чтобы понимать реальные подводные камни. Например www.jtolds.com/writing/2016/03/go-channels-are-bad...

    Удачи.
    Ответ написан
    Комментировать
  • С чего начать карьеру, если чувствуешь свою проф непригодность, хотя никогда не пытался устроиться?

    sim3x
    @sim3x
    Если не ходить на собеседования, то не возьмут
    Гарантирую
    Ответ написан
    Комментировать
  • Ошибка в калькуляторе на js, почему?

    leshikgo
    @leshikgo
    Это пока то, что заметил.
    if (a === "умножить")
    alert(result)
    = присвоение
    == это сравнение равенства
    === сравнение равенства значения и типа переменной, то есть сравниваем строку с строкой и только.
    Ответ написан
    Комментировать
  • Конвертировать JavaScript в Delphi?

    Rou1997
    @Rou1997
    Это даже на лабораторную работу не похоже, скорее на проект какого-то бота, поэтому логичный вопрос: я тут все брошу и вам помогать буду, а вы деньги получите?
    В помощи вы не нуждаетесь, проблема разрешима, есть как минимум два способа, первое - учиться анализировать и отлаживать, второе - альтернативное, подключить готовый "движок" JS, если бы хотели то решили бы ее быстрее, чем я, поскольку вы в курсе дела, я даже не знаю что это и куда.
    И тэг #bytecode здесь ни при чем.
    Ответ написан
    Комментировать
  • С помощью какого 3d редактора можно нарисовать графику, чтобы потом её можно было перенести в web?

    @GreatRash
    Любой который умеет сохранять с расширением obj, т.е. почти любой.
    Ответ написан
    Комментировать
  • С помощью какого 3d редактора можно нарисовать графику, чтобы потом её можно было перенести в web?

    Любой подойдёт.
    Можете попробовать бесплатный Blender, например. Для него есть очень годный плагин Blend4Web который позволяет легко создавать интерактивные приложения для веба.
    Ответ написан
    Комментировать
  • Как монетизируются языки программирования и бесплатные фреймворки?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Вы, простите, много видели программистов 1С, работающих на языке программирования 1С без 1С? Я - ни одного. Закрытый "клуб по интересам", который генерит такие велосипеды, что диву даешься.
    Закрытый язык программирования никто не будет учить, на закрытом фреймворке никто работать не будет, даже если будут обучать. Для чего его учить, время тратить? Чтобы потом иметь возможность устроиться только в компанию Х? Потеря сообщества - это смерть любой технологии, любого языка, любой ОС.
    Была такая замечательная ось - OS/2. То, что она замечательная, я знаю не понаслышке - все-таки два года проработал под ней. Погубило ее как раз отсутствие поддержки - не было софта, не было программистов, не было сообщества - все постепенно разбегались кто куда. Где нынче OS/2 - да никто и не вспомнит. А отдал бы IBM ее в опен сорс - глядишь, нашлись бы пара-тройка энтузиастов.
    Продавать продукт невыгодно - его можно продать один раз. Гораздо выгоднее продавать поддержку - ее можно продавать постоянно.
    Ответ написан
    4 комментария
  • От чего такая штука в шаблоне html?

    Это валидная javscript-запись для строки [{"ID":"1"}]

    Но можно сделать красивее: https://play.golang.org/p/brmFG2PGJD
    package main
    
    import (
    	"bytes"
    	"fmt"
    	"html/template"
    	"log"
    )
    
    func main() {
    
    	out := bytes.NewBuffer([]byte{})
    	t, err := template.New("foo").Parse(`<!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <script type="text/javascript">
            var data = JSON.parse( {{.}} );
        </script>
    </head>
    <body>
    </body>
    </html>`)
    	if err != nil {
    		log.Fatal("Cannot parse the template: ", err)
    	}
    
    	err = t.Execute(out, `[{"ID":"1"}]`)
    	if err != nil {
    		log.Fatal("Cannot execute the template: ", err)
    	}
    
    	fmt.Println(string(out.Bytes()))
    }


    А можно ещё красивее: https://play.golang.org/p/Ir4wLhHMuV
    package main
    
    import (
    	"bytes"
    	"fmt"
    	"html/template"
    	"log"
    )
    
    type A []struct {
    	ID string
    }
    
    func main() {
    
    	out := bytes.NewBuffer([]byte{})
    	t, err := template.New("foo").Parse(`<!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <script type="text/javascript">
            var data = {{.}};
        </script>
    </head>
    <body>
    </body>
    </html>`)
    	if err != nil {
    		log.Fatal("Cannot parse the template: ", err)
    	}
    
    	data := A{
    		{ID: "1"},
    	}
    
    	err = t.Execute(out, data)
    	if err != nil {
    		log.Fatal("Cannot execute the template: ", err)
    	}
    
    	fmt.Println(string(out.Bytes()))
    }


    Причина в том, что т.к. Go не может полностью распарсить грамматику js, он подстраховывается, чтобы случайно не допустить code injection.
    Go видит скобки и понимает, что ему надо вставить содержимое строкового литерала js, но т.к. он не может полностью гарантировать, что мы будем внутри скобок, то подстраховывается и эскейпит управляющие символы, чтобы в случае ошибки js просто остановился, но не выполнил вставленный код.
    Шаблоны нацелены только на вставку данных и должны гарантировать программисту, что эти данные не будут выполнены как код (если конечно вы сами там eval не вставите).
    Ответ написан
    9 комментариев
  • На чем писать сервер для игры?

    @Nwton
    У нас есть опыт работы с Node.JS
    не уверены, что он подойдет для игры у которой будет тысяча человек в онлайне
    Смешно.
    Ответ написан
    5 комментариев
  • Как позиционировать текст?

    @GreatRash
    Нужно знать всего три вещи, и вы их уже и так должны знать:

    1) центр окружности
    2) радиус окружности
    3) угол поворота

    Затем, для синей дуги:

    1) знаем её начало - 170°, знаем её конец - 350°
    2) находим угол поворота: 350 - 170 = 180°
    3) находим половину угла: 180 / 2 = 90°
    4) откладываем получившийся угол от начала дуги: 170 + 90 = 260°
    5) радиус - гипотенуза, угол тоже знаем, значит катеты (т.е. координаты) равны:
    y = радиус * sin(260°)
    x = радиус * cos(260°)

    Собссно.
    Ответ написан
    5 комментариев
  • Как преобразовать тип Golang?

    https://play.golang.org/p/PcQ81RtDk2
    package main
    
    import (
    	"fmt"
    	"strconv"
    )
    
    func main() {
    	var t map[string]interface{}     // Создаем переменную, сейчас она nil и мы не можем в неё класть ключи
    	t = make(map[string]interface{}) // Создаем map  в памяти, теперь можем класть ключи
    	t["key"] = "1"                   // Кладём ключ
    
    	var num int
    
    	rawValue, ok := t["key"] // Вытаскиваем ключ из map
    	if ok {
    		stringValue, ok := rawValue.(string) // Вытаскиваем string из interface{}
    		if ok {
    			var err error
    			num, err = strconv.Atoi(stringValue) // Парсим string в int
    			if err == nil {
    				fmt.Println(num)
    			} else {
    				fmt.Println("Число имеет неверный формат")
    			}
    		} else {
    			fmt.Println("Внутри interface{} лежит не тип string")
    		}
    	} else {
    		fmt.Println("Такого ключа нет в map")
    	}
    }
    Ответ написан
    Комментировать
  • Минимальные настройки безопасности Linux на VPS?

    Tyranron
    @Tyranron
    Ряд моментов Вы уже сделали, но я все равно их опишу для полноты списка.

    1. Создать отдельного пользователя и хороший пароль на sudo. Не использовать больше root напрямую. Совсем.

    2. SSH. Отключаем метод аутентификации по паролю. Если Вам не нужны другие методы, то их тоже можно отключить, оставив только publickey. Отключаем возможность аутентификации root'ом. Включаем использование только 2й версии SSH протокола.

    3. Устанавливаем Fail2Ban и настраиваем чтобы после нескольких неуспешных попыток подключения по SSH банило по IP на длительное время. Кол-во попыток и время бана можно тюнить в меру своей паранойи. У меня, например, банит на час после 2х неуспешных попыток.

    4. Iptables. Действуем по принципу "запрещено все, что не разрешено". Запрещаем по умолчанию весь INPUT и FORWARD трафик снаружи. Открываем на INPUT'е 22 порт. В дальнейшем открываем порты/forwarding по мере необходимости. Если у нас предполагаются сервисы на соседних серверах нужные только для внутренней коммуникации (Memcached, Redis, и т.д.), то открываем для них порты только для определенных IP. Просто так торчать наружу для всех они не должны.

    5. Настраиваем автоматические обновления apt-пакетов. Уровень security. То есть так, чтобы обновления безопасности накатывались автоматически, но при этом не выполнялись обновления со сменой мажорной версии (дабы обезопасить себя от "само сломалось").

    6. Устанавливаем ntpd. Серверное время должно быть точным. Также временную зону сервера лучше всего установить в UTC.

    7. TLS (не SSL) используем везде где можем. Через Let's Encrypt получаем бесплатные валидные сертификаты. В конфигах веб-серверов, mail-серверов, и других приложений торчащих наружу (в том числе и OpenVPN), запрещаем/убираем использование слабых шифров. Все ключи/параметры генерируем не менее 2048 бит. Самоподписные сертификаты подписываем с помощью SHA-256 (не SHA-1). Diffie-Hellman параметры (dh.pem) под каждый сервис лучше сгенерить отдельно. Проверяем TLS сервисов через Nmap. Минимальный grade должен быть A, не должно быть warning'ов.

    8. Правильный менеджмент пользователей/групп. Приложения/сервисы не должны запускаться под root'ом (разве что они действительно этого требуют и иначе никак). Для каждого сервиса создается свой пользователь.

    9. Если предполагается upload файлов через PHP (либо другие скриптовые языки), в директории, куда эти файлы загружаются (и которая доступна снаружи), должно быть жестко отключено любое выполнение скриптов/бинарников, что на уровне ОС (x права), что на уровне веб-сервера.

    Это была база.
    Дальше, в меру своей паранойи можно за'harden'ить сервер ещё следующими моментами:
    - SELinux, chroot
    - доступ к SSH только с определенных IP (нужно иметь 3-4 VPN-сервера под рукой)

    UPD И да, все это помнить/настраивать руками каждый раз может быть запарно. Используйте Ansible и автоматизируйте процесс (там родные и YAML, Jinja2 и Python).
    Ответ написан
    10 комментариев