Сообщество - Web-технологии

Web-технологии

520 постов 5 813 подписчиков

Популярные теги в сообществе:

158

Написание DNS-серверов

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

Мастер Йода говорил: «И как всегда двое их, не больше и не меньше». Он, конечно же, говорил об отношениях «клиент — сервер», и поскольку вы являетесь мастером клиентов, то пришло время стать мастером серверов. В этом разделе с помощью того же пакета Go DNS мы напишем простой сервер и прокси. DNS-серверы можно использовать для нескольких вредоносных задач, включая туннелирование сетей с ограниченным доступом и совершение спуфинг-атак с помощью поддельных беспроводных точек доступа.

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


Настройка лаборатории и знакомство с сервером


Лаборатория состоит из двух виртуальных машин (VM): Microsoft Windows VM, выступающей в роли клиента, и Ubuntu VM, действующей в качестве сервера.

В этом примере для каждой машины используются VMWare Workstation и сетевой мост. Допустимо применение частной виртуальной сети, но при этом необходимо убедиться, что обе машины принадлежат одной сети. Сервер будет выполнять два экземпляра Cobalt Strike Docker, собранных из официального образа Java Docker (Java — необходимое условие для Cobalt Strike). Снизу показано, как будет выглядеть лаборатория.

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

Настройка лабораторного стенда для создания DNS-сервера

Сначала нужно создать виртуальную машину Ubuntu (Ubuntu VM). Для этого мы используем дистрибутив 16.04.1 LTS. Никаких особых требований здесь нет, но VM необходимо настроить на использование не менее 4 Гбайт ОЗУ и двух CPU. Если есть, можно задействовать существующую VM или хост. Закончив с операционной системой, необходимо установить среду разработки Go (см. главу 1).

После создания Ubuntu VM займитесь установкой утилиты контейнера виртуализации Docker. В разделе этой главы, посвященном прокси, мы будем использовать Docker для запуска нескольких экземпляров Cobalt Strike. Для установки Docker выполните в терминале:

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

После этого повторно войдите в систему и убедитесь, что Docker установлен, выполнив следующую команду:

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

После установки Docker с помощью следующей команды скачайте образ Java:

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

Эта команда получит базовый образ Java Docker, не создавая контейнеры. Таким образом мы подготавливаемся к скорому выполнению сборок Cobalt Strike.

В завершение необходимо убедиться в том, что dnsmasq не запущен, потому что он слушает порт 53. В противном случае ваши DNS-серверы не смогут работать, так как они должны использовать именно этот порт. Если процесс dnsmasq запущен, завершите его по ID:

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

Теперь нужно создать виртуальную машину Windows (Windows VM). Опять же можно использовать существующую машину. Никаких особых настроек делать не требуется, достаточно минимальных. Когда система заработает, установите для DNS-сервера IP-адрес системы Ubuntu.

Чтобы протестировать настройку лабораторного стенда и перейти к написанию DNS-серверов, мы начнем с создания простого сервера, который возвращает только А-записи. В GOPATH системы Ubuntu создайте каталог github.com/blackhat-go/bhg/ch-5/a_server и файл для хранения кода main.go. Снизу будет показан весь код для создания простого DNS-сервера.

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

Написание DNS-сервера (/ch-5/a_server/main.go)

Код начинается с вызова HandleFunc(), он во многом напоминает пакет net/http. Первый аргумент функции является шаблоном запроса для сопоставления. Он станет применяться для указания DNS-серверам, какие запросы будут обрабатываться переданной функцией. Используя точку, мы сообщаем серверу, что предоставляемая во втором аргументе функция будет обрабатывать все запросы.

Следующий передаваемый в Handlefunc() аргумент — это функция, содержащая логику обработчика. Она получает два аргумента: ResponseWriter и сам запрос. Внутри обработчика сначала создается новое сообщение и устанавливается ответ. Затем создается ответ на каждый вопрос с помощью А-записи, которая реализует интерфейс RR. Эта часть будет различаться в зависимости от типа искомого вами ответа. Указатель на А-запись добавляется в поле Answer ответа с помощью append(). По завершении ответа его сообщение записывается вызывающему клиенту с помощью w.WriteMsg(). В конце для запуска сервера вызывается ListenAndServe(). Этот код интерпретирует все запросы в IP-адрес 127.0.0.1.

Запустив сервер, можно протестировать его с помощью dig. Убедитесь, что имя хоста, для которого выполняются запросы, разрешается в 127.0.0.1. Это будет означать, что все работает как надо:

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

Обратите внимание на то, что сервер нужно будет запускать с помощью sudo или через корневую учетную запись (root), потому что он прослушивает привилегированный порт 53. Если сервер не запускается, может потребоваться завершить dnsmasq.

Создание DNS-сервера и прокси:


DNS-туннелирование — это техника извлечения данных, дающая возможность установить C2-канал из сетей с контролем исходящего трафика. Используя авторитетный DNS-сервер, злоумышленник может проложить маршрут через внутренние DNS-серверы организации и выйти через интернет, причем ему не потребуется прямое подключение к собственной инфраструктуре. Несмотря на медлительность такой атаки, защититься от нее сложно. DNS-туннелирование выполняется с помощью ряда открытых и проприетарных полезных нагрузок, одной из которых является Beacon от Cobalt Strike. В текущем разделе мы напишем собственный DNS-сервер и прокси, а также научимся с помощью Cobalt Strike мультиплексировать полезные нагрузки C2 для DNS-туннелирования.


Настройка Cobalt Strike:


Если вам доводилось использовать этот инструмент, то вы наверняка замечали, что по умолчанию team-сервер прослушивает порт 53. В связи с этим и с тем, что советует документация, в системе должен быть запущен только один сервер, поддерживая соотношение один к одному. Это может стать проблемой для средних и больших команд. Например, если у вас есть 20 команд, реализующих наступательные мероприятия против 20 отдельных организаций, то поддержка 20 систем, способных выполнять team-сервер, может стать затруднительной. Эта проблема касается не только Cobalt Strike и DNS, но и других протоколов, включая полезные нагрузки HTTP, такие как Metasploit Meterpreter и Empire. Несмотря на то что можно установить слушатели на различные порты, есть большая вероятность выхода трафика через такие стандартные TCP-порты, как 80 и 443. Отсюда возникает логичный вопрос: как вы и другие команды можете совместно использовать один порт и делать перенаправление на разных слушателей? Ответом будет, конечно же, прокси-сервер. Пора вернуться в лабораторию.

ПРИМЕЧАНИЕ


В реальных сценариях противодействия вам потребуется иметь несколько уровней маневрирования, абстрагирования и переадресации для маскировки team-сервера. Это можно реализовать с помощью UDP- и TCP-переадресации через небольшие вспомогательные серверы, использующие разных хостинг-провайдеров. Основной team-сервер и прокси также могут работать на разных системах. В этом случае кластер коллективного сервера размещается в обширной системе с большим объемом ОЗУ и мощным CPU.

Давайте запустим два экземпляра коллективного сервера в двух контейнерах Docker. Это позволит им прослушивать порт 53, а также даст каждому серверу возможность использовать собственную систему и, следовательно, собственный стек IP. Для сопоставления UDP-портов с хостом из контейнера мы будем применять встроенный в Docker сетевой механизм. Для начала скачайте пробную версию Cobalt Strike с https://trial.cobaltstrike.com/1. Для этого нужно создать пробную учетную запись, получив возможность скачать tar-архив. Теперь можно запускать team-серверы.


Для запуска первого контейнера выполните в терминале следующий код:

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

Эта команда выполняет несколько действий. С ее помощью вы сообщаете Docker о необходимости удаления контейнера после выхода, а также о том, что после запуска будете с ним взаимодействовать. Далее идет сопоставление порта 2020 системы хоста с портом 53 в контейнере и порта 50051 с портом 50050. Затем каталог, содержащий архив Cobalt Strike, сопоставляется с каталогом данных в контейнере. Здесь можно указать любое имя каталога, и Docker без проблем его создаст. В завершение предоставляется образ, который нужно использовать (в данном случае Java), а также команда для выполнения при запуске.

Оказавшись внутри контейнера, запустите team-сервер с помощью следующих команд:

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

Указываемый IP-адрес должен соответствовать текущей виртуальной машине, а не адресу контейнера.

Далее откройте новое окно терминала в хосте Ubuntu и перейдите в каталог с архивом Cobalt Strike. Выполните следующие команды для установки Java и запуска клиента Cobalt Strike:

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

Должен запуститься Cobalt Strike GUI. После сообщения о пробной версии измените порт team-сервера на 50051, а также установите соответствующие имя пользователя и пароль.

Вы успешно подключились к серверу, полностью работающему в Docker-контейнере. Теперь повторим тот же процесс для запуска второго сервера. На этот раз будем сопоставлять другие порты. При этом вполне логичным будет увеличить значение порта на единицу. Выполните следующую команду в новом окне терминала, чтобы запустить новый контейнер и прослушивать порты 2021 и 50052:

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

Из клиента Cobalt Strike создайте новое подключение, выбрав Cobalt Strike New Connection, изменив порт на 50052 и нажав Connect. Подключившись, вы должны увидеть в нижней части консоли две вкладки, с помощью которых можно переключаться между серверами.

Успешно завершив подключение к двум коллективным серверам, пора запустить два DNS-слушателя. Для создания слушателя выберите в меню пункт Configure Listeners. Он обозначен значком с изображением наушников. Из этого меню выберите Add, чтобы вызвать окно New Listener. Введите в нем следующее:

  • Name: DNS 1;

  • Payload: windows/beacon_dns/reverse_dns_txt;

  • Host: <IP address of host>;

  • Port: 0.

В этом примере установлен порт 80, но наша полезная нагрузка DNS по-прежнему использует порт 53. Это нормально. Порт 80 специально задействуется для гибридных полезных нагрузок. На скрине снизу показаны окно New Listener и информация, которую необходимо ввести.

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

Добавление слушателя

Далее, как показано на скрине снизу, вам будет предложено указать домены, которые будут использоваться для установки маячков.

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

Добавление домена DNS-маячка

Введите в качестве DNS-маячка домен attacker1.com. Он должен соответствовать имени домена, куда полезная нагрузка будет отправлять сигналы. Далее отобразится сообщение о запуске нового слушателя. Повторите этот процесс на другом team-сервере, используя значения DNS2 и attacker2.com. Прежде чем задействовать этих двух слушателей, нужно написать промежуточный сервер, который будет проверять DNS-сообщения и соответствующим образом их перенаправлять. Это и будет ваш прокси.


Создание DNS-прокси:


Используемый вами на протяжении этой главы DNS-пакет облегчает написание функции-посредника — вы уже работали с некоторыми такими функциями в предыдущих разделах. Наш прокси должен уметь:

  • создавать функцию-обработчик для приема входящего запроса;

  • проверять в этом запросе вопрос и извлекать имя домена;

  • определять вышестоящий DNS-сервер, соответствующий этому имени домена;

  • обмениваться вопросом с этим вышестоящим DNS-сервером и писать ответ клиенту.

В функции можно прописать обработку attacker1.com и attacker2.com как статических значений, но такой вариант не удастся поддерживать. Вместо этого следует искать записи во внешнем для программы источнике, например в базе данных или файле конфигурации. В приведенном далее коде это реализуется с помощью формата domain.server, который перечисляет входящие домен и вышестоящий сервер через точку. Чтобы запустить программу, создайте функцию для парсинга файла, содержащего записи в этом формате. Запишите код снизу в новый файл main.go.

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

Написание DNS-прокси (/ch-5/dns_proxy/main.go)

В этом коде сначала мы определяем функцию, которая парсит файл с информацией о конфигурации и возвращает map[string]string. Эта карта будет использоваться для поиска входящего домена и извлечения вышестоящего сервера.

Введите в терминале первую команду приведенного далее кода, чтобы записать следующую за echo строку в файл proxy.config. Затем нужно скомпилировать и запустить dns_proxy.go.

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

Что мы здесь видим? Вывод представляет сопоставление между именами доменов team-серверов и портом, который прослушивает DNS-сервер Cobalt Strike. Напомним, что в двух отдельных контейнерах Docker мы сопоставили порты 2020 и 2021 с портом 53. Здесь же использовали быстрый и грязный путь создания основной конфигурации для инструмента, чтобы вам не пришлось хранить его в базе данных или другом постоянном хранилище.

Определив карты записей, можно написать обработчик. Давайте уточним код, добавив в функцию main() приведенный далее фрагмент, который должен следовать за парсингом файла конфигурации:

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

Код начинается с вызова HandleFunc() с точкой для обработки всех входящих запросов, а также определения анонимной функции, то есть функции, которую мы не собираемся использовать повторно (у нее нет имени). Это удобная структура на случай, когда вам не нужно повторно задействовать некий блок кода. Если же ее применение в нескольких местах все же подразумевается, то необходимо объявлять и вызывать ее как именованную функцию. Далее идет проверка среза входящих вопросов, гарантирующая, что все вопросы переданы. Если же нет, происходит вызов HandleFailed() и возврат для раннего выхода из функции. Такой шаблон используется во всем обработчике. Если присутствует хотя бы один вопрос, можно безопасно получить запрашиваемое имя из первого вопроса. Разделять имя точкой нужно для извлечения имени домена. В результате этого не должно получаться значение меньше 1, но на всякий случай стоит проверить. Хвост среза — элементы в его конце — можно получить, применив в срезе оператор slice. Теперь нужно извлечь вышестоящий сервер из карты записей.

При извлечении значения из карты могут возвращаться одна или две переменные. Если ключ (в нашем случае имя домена) в карте присутствует, будет возвращено соответствующее значение. Если же домен отсутствует, возвращается пустая строка. Можно проверять, является ли возвращенное значение пустой строкой, но это окажется неэффективным, когда вы начнете работать с более сложными типами. Вместо этого мы задаем две переменные: первая — это значение ключа, а вторая — логическое значение, возвращающее true, если ключ найден. Убедившись в совпадении, мы обмениваемся запросом с вышестоящим сервером. Здесь мы просто подтверждаем, что имя домена, для которого получен запрос, настроено в постоянном хранилище. Далее записывается ответ вышестоящего сервера клиенту. Определив функцию-обработчик, мы запускаем сервер. В завершение можно собирать и запускать прокси.

После запуска мы протестируем его с помощью двух слушателей Cobalt Strike. Для этого сначала нужно создать два самостоятельных (stageless) исполняемых файла. В верхнем меню Cobalt Strike нажмите значок с изображением шестеренки и измените формат вывода на Windows Exe. Повторите процесс из каждого team-сервера. Скопируйте эти исполняемые файлы в Windows VM и запустите. DNS-сервер Windows VM должен иметь IP-адрес вашего Linux-хоста. В противном случае тест не сработает.

На это уйдет какое-то время, но в итоге вы должны увидеть, что в каждом team-сервере установлен маячок. Миссия выполнена!


Финальные штрихи:


Все отлично, но когда вам нужно изменить IP-адрес team-сервера или переадресатора, а также в случаях добавления записи, потребуется перезапускать сервер. Маячки, скорее всего, переживут этот процесс, но зачем рисковать, если есть лучшее решение? Можно использовать сигналы процесса, сообщая выполняющейся программе о необходимости перезагрузки файла конфигурации. Об этом трюке я впервые узнал от Мэтта Холта (Matt Holt), который реализовал его на прекрасном Caddy Server. На скрине снизу показана вся программа с уже добавленной логикой отправки сигнала процесса.

package main


import (

"bufio"

"fmt"

"log"

"os"

"os/signal"

"strings"

"sync"

"syscall"


"github.com/miekg/dns"

)


func parse(filename string) (map[string]string, error) {

records := make(map[string]string)

fh, err := os.Open(filename)

if err != nil {

return records, err

}

defer fh.Close()

scanner := bufio.NewScanner(fh)

for scanner.Scan() {

line := scanner.Text()

parts := strings.SplitN(line, ",", 2)

if len(parts) < 2 {

return records, fmt.Errorf("%s is not a valid line", line)

}

records[parts[0]] = parts[1]

}

log.Println("records set to:")

for k, v := range records {

fmt.Printf("%s -> %s\n", k, v)

}

return records, scanner.Err()

}


func main() {

var recordLock sync.RWMutex


records, err := parse("proxy.config")

if err != nil {

panic(err)

}


dns.HandleFunc(".", func(w dns.ResponseWriter, req *dns.Msg) {

if len(req.Question) == 0 {

dns.HandleFailed(w, req)

return

}

fqdn := req.Question[0].Name

parts := strings.Split(fqdn, ".")

if len(parts) >= 2 {

fqdn = strings.Join(parts[len(parts)-2:], ".")

}

recordLock.RLock()

match := records[fqdn]

recordLock.RUnlock()

if match == "" {

dns.HandleFailed(w, req)

return

}

resp, err := dns.Exchange(req, match)

if err != nil {

dns.HandleFailed(w, req)

return

}

if err := w.WriteMsg(resp); err != nil {

dns.HandleFailed(w, req)

return

}

})


go func() {

sigs := make(chan os.Signal, 1)

signal.Notify(sigs, syscall.SIGUSR1)


for sig := range sigs {

switch sig {

case syscall.SIGUSR1:

log.Println("SIGUSR1: reloading records")

recordLock.Lock()

parse("proxy.config")

recordLock.Unlock()

}

}

}()


log.Fatal(dns.ListenAndServe(":53", "udp", nil))


}

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

Перед обращением к карте в обработчике происходит вызов RLock для считывания значения в match. По завершении чтения вызывается RUnlock, освобождая карту для следующей горутины. В анонимной функции, выполняющейся в новой горутине, мы начинаем процесс прослушивания сигнала. Это делается с помощью канала типа os.Signal, передаваемого в вызове к signal.Notify() вместе с фактическим сигналом, получаемым каналом SIGUSR1, который сам является сигналом, зарезервированным для различных целей. В цикле перебора этих сигналов с помощью инструкции match определяется тип полученного сигнала.

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

Давайте протестируем программу, запустив прокси и создав новый слушатель в существующем team-сервере. Используйте домен attacker3.com. При запущенном прокси измените файл proxy.config, добавив новую строку, направляющую домен на слушатель. Сигнализировать процессу о необходимости перезагрузки конфигурации можно с помощью kill, но сначала используйте ps и grep для определения его ID процесса:

Написание DNS-серверов Linux, Хакеры, Информационная безопасность, Взлом, Google, Интернет, Длиннопост

Прокси должен перезагрузиться. Проверьте это, создав и выполнив новый самостоятельный исполняемый файл. Теперь прокси должен быть работоспособен и готов к использованию.

ССЫЛКА НА ТЕЛЕГРАМ КАНАЛ АВТОРА

Показать полностью 17
3

Необходимый минимум для фронтендера

Скажите честно, что действительно необходимо для того чтобы стать джуном фронтендером. Нужно ли досканально изучать typescript и подобные темы или достаточно основ html/css/js? Расскажите по подробнее что конкретно вы знали, когда устраивались на своё первое рабочее место джуном

3

Атомарные обновления в Zustand

Атомарные обновления в Zustand Кросспостинг, Pikabu Publish Bot, Frontend, React, Текст, Telegram (ссылка)

Я уже упоминал атомарные обновления ранее, когда говорил о проблемах контекста реакта.

Я называю обновления атомарными, если компонент обновляется только тогда, когда изменяются данные, которые он использует. У контекста реакта с этим большие проблемы, но и при использовании Zustand можно выстрелить себе в ногу.

Zustand сравнивает по ссылке предыдущее и текущее значение, возвращаемое из useStore(), и если объект изменился — происходит ре-рендер.

❌ В следующем примере у нас всегда будет возвращаться новый объект, и ре-рендер произойдёт даже если изменился только age, а lastName и firstName не изменились

const {firstName, lastName} = useStore(({firstName, lastName}) => ({firstName, lastName}));

Аналогичное поведение будет и в следующем случае

const {firstName, lastName} = useStore();

✅ Есть три варианта использования значений из стейта, которые поддерживают атомарные обновления:

1️⃣ Одиночные селекторы

const firstName = useStore((state) => state.firstName)
const lastName = useStore((state) => state.lastName)


2️⃣ Селектор, который возвращает объект + shallow - функция сравнения предыдущего и нового стейтов

const {firstName, lastName} = useStore(({firstName, lastName}) => ({
firstName,
lastName
}), shallow);


3️⃣ Автосгенерированных селекторы

const firstName = useStore.use.firstName();
const lastName = useStore.use.lastName();


Накидал небольшую демку в Codesandbox

https://t.me/cherkashindev/133

Показать полностью
6

AI для JavaScript и его применение в бизнес автоматизации


Привет Пикабу ! На связи команда облачной лоу-код платформы Нодуль, где вы можете строить самые гибкие автоматизации бизнес-процессов и создавать собственные приложения, не беспокоясь об инфраструктуре для их поддержания. Не важно, заняты вы фронтендом, бекендом или только начинаете осваивать JavaScript – в этой статье вас информация о бесплатном инструменте, который сэкономит вам кучу сил и времени.

AI для JavaScript и его применение в бизнес автоматизации IT, Программирование, Удаленная работа, Разработка, Веб-разработка, Гифка, Длиннопост

Интерфейс платформы

Недавно в узле JavaScript, который может быть частью ваших разработок, появился ИИ ассистент, который готов закрывать весь объем работ, связанный с кодом:

  • написание

  • отладка ошибок

  • объяснение кода

  • дальнейшая модификация

Как воспользоваться ИИ ассистентом?

Ассистент находится внутри JavaScript узла. Общение происходит в диалоговом окне ‘AI Chat’. В свою очередь, нейронка Нодуля обладает следующими навыками:

  • Возможность видеть ваш сценарий и структуру узлов

  • Способность анализировать уже имеющийся код в ноде JavaScript, откуда ассистент и был вызван

  • Доступ к структуре данных по левую сторону от JS узла.

AI для JavaScript и его применение в бизнес автоматизации IT, Программирование, Удаленная работа, Разработка, Веб-разработка, Гифка, Длиннопост

Сценарии использования

Прелесть AI ассистента на Нодуле в том, что он совершил семимильный шаг по пути реализации нашей миссии: теперь создание собственных микросервисов или построение сложных автоматизаций доступно даже тем, кто до этого в жизни с кодом не взаимодействовал! Рассмотрим 3 сценария использования, чтобы это доказать.

Сценарий #1 Работа с HTML

Рассмотрим сценарий, где нам нужна форма для сбора данных, которая будет доступна по webhook url. Такое решение может пригодиться в тысяче разных случаев. Сначала мы заполняем форму, а дальше информация передается куда вздумается: либо на другую ветку автоматизации на Нодуле для дальнейших преобразований, либо в иную систему. Как насчёт построить такой сценарий без написания и строчки кода?

AI для JavaScript и его применение в бизнес автоматизации IT, Программирование, Удаленная работа, Разработка, Веб-разработка, Гифка, Длиннопост

форма для компоновки емейла для рассылки по базе данных пользователей

Шаг 1. Отправим ИИ ассистенту запрос

Привет! Добавь к моему коду скрипт для создания HTML кода для формы с названием ‘создать емейл’. В ней должны быть следующие поля для заполнения: ‘тема письма’, ‘обзор’, ‘заголовок’, ‘апдейты платформы’, ‘полезные материалы’, ‘другие новости’. Снизу расположи кнопку ‘отправить’. Оформи HTML красивым дизайном и форматированием. Верни результат в виде JSON объекта “html”

Шаг 2. Заменяем наш код на полученный результат.

AI для JavaScript и его применение в бизнес автоматизации IT, Программирование, Удаленная работа, Разработка, Веб-разработка, Гифка, Длиннопост

Шаг 3. Запускаем один раз наш сценарий.

Так JavaScript модуль вернет нам “html” JSON объект для использования его в webhook response, где помимо этого мы меняем параметр типа контента на text/html для корректного отображения формы по ссылке из нашего входного webhook. 

AI для JavaScript и его применение в бизнес автоматизации IT, Программирование, Удаленная работа, Разработка, Веб-разработка, Гифка, Длиннопост

Теперь, открывая ваш webhook url, вам отобразиться форма для сбора данных.

Шаг 4. Отправка полученных данных.

Единственное, что остаётся, это сделать так, чтобы полученная через форму информация передавалась на webhook другого сценария для дальнейшей с ней работы. Естественно, писать сами мы ничего не будем:

AI для JavaScript и его применение в бизнес автоматизации IT, Программирование, Удаленная работа, Разработка, Веб-разработка, Гифка, Длиннопост

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

AI для JavaScript и его применение в бизнес автоматизации IT, Программирование, Удаленная работа, Разработка, Веб-разработка, Гифка, Длиннопост

Сценарий #2 Доступ к NPM пакетам

В мире насчитывается более миллиона NPM пакетов (готовые приложения для программистов, которое они добавляют в свой код), доступ к которым вам может обеспечить ИИ ассистент на Нодуле. Предположим, в вашем сценарии понадобился актуальный обменный курс USD/EUR для осуществления торговли в разных валютах и предоставления актуальной информации на сайте для клиентов. Нежели мучать себя поиском нужной API и чтением документации, озвучьте ваш запрос следующим образом:

AI для JavaScript и его применение в бизнес автоматизации IT, Программирование, Удаленная работа, Разработка, Веб-разработка, Гифка, Длиннопост

Для реализации задачи ассистент использует NPM библиотеку axios для отправки HTTP-запроса GET к ExchangeRate-API, который предоставляет последние обменные курсы. Он получает обменный курс 1 доллара США к 1 Евро и возвращает его в формате JSON.

Корректный результат не всегда достигается с первого раза: иногда получаем ошибки, иногда пустые значения на выходе. Главное не забывать, что отладка ошибок – это тоже не наша забота. Чтобы все было исправлено, попросите ИИ добавить в код console.log для детализации серверного ответа. Далее, возвращаете любую ошибку в чат с ИИ – и новый код перед глазами!

Сценарий #3 Преобразование данных

Также вы можете забыть о головной боли при преобразовании данных, таких как, например, форматирование даты. Вам ведь знакомо, когда системы отдают дату в одном формате, например, "YYYY-MM-DD", но другая система должна их принять в другом – “DD MMMM YYYY”

AI для JavaScript и его применение в бизнес автоматизации IT, Программирование, Удаленная работа, Разработка, Веб-разработка, Гифка, Длиннопост

Результат преобразования полученной через webhook даты формата ‘2023-07-11’:

AI для JavaScript и его применение в бизнес автоматизации IT, Программирование, Удаленная работа, Разработка, Веб-разработка, Гифка, Длиннопост

Аналогичным образом ИИ может помочь вам преобразовывать строки, агрегировать данные, фильтровать, сортировать, трансформировать, соединять, разделять, удалять дубликаты, проводить статистический анализ и даже анализировать текст.

Альтернативный режим использования

В предыдущей части статьи мы обращались к ассистенту через диалоговое окно, но есть еще один вариант, который будет полезен для более предметной отладки какой-то части кода, или для просьбы объяснить, что в нем происходит:

AI для JavaScript и его применение в бизнес автоматизации IT, Программирование, Удаленная работа, Разработка, Веб-разработка, Гифка, Длиннопост

Сообщество лоу-код энтузиастов

В настоящее время сообщество платформы Нодуль активно набирает обороты и специалисты в области low-code присоединяются к нашему чату, где команда проекта рада фидбеку и готова помочь со всеми вопросами!

Важная ремарка: платформа находиться в бета и предоставляет бесплатный доступ для всех желающих!

Ждем вас на Нодуле и в Телеграмм сообществе!

Показать полностью 10

История gRPC от Google до open source

gRPC - это система удаленного вызова процедур (RPC) с открытым исходным кодом, которая была разработана в Google в 2015 году. Она использует HTTP/2 в качестве транспортного протокола и Protocol Buffers в качестве языка описания интерфейса и формата данных. gRPC позволяет определить и реализовать четыре типа сервисных методов: унарный, серверный потоковый, клиентский потоковый и двунаправленный потоковый. gRPC также поддерживает различные функции, такие как аутентификация, сжатие, отмена, тайм-ауты и метаданные.

История gRPC от Google до open source Инновации, Технологии, IT, Программирование, Разработка, Web, Программист

История gRPC началась с разработки внутренней системы RPC в Google под названием Stubby. Stubby был создан для обеспечения высокопроизводительной и надежной связи между микросервисами в распределенных системах. Stubby использовал Protocol Buffers для сериализации данных и HTTP/2 для передачи данных. Stubby также предоставлял различные функции, такие как балансировка нагрузки, отказоустойчивость, трассировка, мониторинг и безопасность.

В 2015 году Google решил выложить Stubby в открытый доступ под новым названием gRPC. Целью этого шага было расширить использование RPC во внешних проектах и сообществах, а также сделать RPC более доступным и универсальным для разных языков программирования и платформ. Google также хотел продвигать стандартизацию и совместимость RPC между разными системами.

С тех пор gRPC получил широкое распространение и признание в индустрии. Он используется многими компаниями и организациями, такими как Netflix, Cisco, Square, IBM, Docker, CoreOS и другими. Он также поддерживает множество языков программирования, таких как C#, C++, Dart, Go, Java, Kotlin, Node.js, Objective-C, PHP, Python, Ruby и Swift. Он также имеет большое и активное сообщество разработчиков и пользователей на GitHub и других платформах.

Интересные факты и фичи языков программирования у нас в канале, заходи :)

Показать полностью

Ведение блога о веб-дизайне в Telegram: Платформа для Инсайтов и Вдохновения

Ведение блога о веб-дизайне в Telegram: Платформа для Инсайтов и Вдохновения IT, Дизайн, Digital, Разработка, Программирование, Удаленная работа, Веб-дизайн, Дизайнер, Новости, Ux, Ui, Telegram, Канал, Сайт, Длиннопост, Telegram (ссылка)

Введение:

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

1. Преимущества блога в Telegram:

Ведение блога о веб-дизайне в Telegram: Платформа для Инсайтов и Вдохновения IT, Дизайн, Digital, Разработка, Программирование, Удаленная работа, Веб-дизайн, Дизайнер, Новости, Ux, Ui, Telegram, Канал, Сайт, Длиннопост, Telegram (ссылка)

Telegram предлагает ряд преимуществ для ведения блога о веб-дизайне:

- Широкая аудитория: Telegram имеет миллионы активных пользователей по всему миру, что позволяет достичь большей аудитории и получить обратную связь от разных людей.

- Простота использования: Создание и управление каналом в Telegram очень просто, что позволяет сосредоточиться на контенте и взаимодействии с подписчиками.

- Возможность монетизации: Telegram предоставляет различные инструменты для монетизации блога, такие как каналы с подпиской или продажа рекламного пространства.

2. Содержание блога:

Ведение блога о веб-дизайне в Telegram: Платформа для Инсайтов и Вдохновения IT, Дизайн, Digital, Разработка, Программирование, Удаленная работа, Веб-дизайн, Дизайнер, Новости, Ux, Ui, Telegram, Канал, Сайт, Длиннопост, Telegram (ссылка)

Для успешного ведения блога о веб-дизайне в Telegram, важно предлагать интересный и полезный контент.

Вот несколько идей для контента:

- Советы и рекомендации по веб-дизайну: Делитесь своими знаниями и опытом, предлагая полезные советы и трюки, которые помогут другим улучшить свои навыки веб-дизайна.

- Обзоры и анализы: Рассматривайте новые тренды, инструменты и технологии веб-дизайна, а также проводите обзоры наиболее интересных проектов.

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

3. Взаимодействие с аудиторией:

Ведение блога о веб-дизайне в Telegram: Платформа для Инсайтов и Вдохновения IT, Дизайн, Digital, Разработка, Программирование, Удаленная работа, Веб-дизайн, Дизайнер, Новости, Ux, Ui, Telegram, Канал, Сайт, Длиннопост, Telegram (ссылка)

Telegram предоставляет отличные возможности для взаимодействия с вашей аудиторией. Создайте открытую и дружественную обстановку, где люди могут задавать вопросы, делиться своим мнением и обсуждать темы веб-дизайна. Ответьте на комментарии и обратную связь, чтобы установить более тесную связь с вашими подписчиками.

4. Сетевое взаимодействие:

Ведение блога о веб-дизайне в Telegram: Платформа для Инсайтов и Вдохновения IT, Дизайн, Digital, Разработка, Программирование, Удаленная работа, Веб-дизайн, Дизайнер, Новости, Ux, Ui, Telegram, Канал, Сайт, Длиннопост, Telegram (ссылка)

Не забывайте о возможностях сетевого взаимодействия в Telegram. Присоединяйтесь к другим каналам и группам, связанным с веб-дизайном, чтобы быть в курсе последних новостей и трендов. Общайтесь с коллегами и другими экспертами в сфере, чтобы обменяться опытом и получить новые идеи.

5. Регулярность и качество контента:

Ведение блога о веб-дизайне в Telegram: Платформа для Инсайтов и Вдохновения IT, Дизайн, Digital, Разработка, Программирование, Удаленная работа, Веб-дизайн, Дизайнер, Новости, Ux, Ui, Telegram, Канал, Сайт, Длиннопост, Telegram (ссылка)

Для успешного ведения блога в Telegram важно предлагать регулярный и качественный контент. Установите расписание публикаций и придерживайтесь его, чтобы ваши подписчики знали, что они могут ожидать нового материала от вас. Используйте разнообразные форматы контента, такие как текстовые посты, изображения, видео или даже интерактивные опросы, чтобы сделать ваш блог более привлекательным и разнообразным.

Заключение:

Ведение блога о веб-дизайне в Telegram: Платформа для Инсайтов и Вдохновения IT, Дизайн, Digital, Разработка, Программирование, Удаленная работа, Веб-дизайн, Дизайнер, Новости, Ux, Ui, Telegram, Канал, Сайт, Длиннопост, Telegram (ссылка)

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

Наш канал о дизайне:

Отдельное спасибо за подписку, тебе не сложно, а нас это мотивирует создавать контент ❤

Канал в тг

Показать полностью 6
3

TypeScript — satisfy или as

TypeScript — satisfy или as Кросспостинг, Pikabu Publish Bot, Typescript, Текст

Я думаю все знают о ключевом слове `as` в TypeScript. Мы используем его, когда нужно явно указать тип выражения, будь то переменная или функция. Когда мы используем `as`, происходит изменение типа выражения.

В TypeScript 4.9 появился оператор satisfies, который похож на оператор as, но работает немного иначе.

ℹ️ Он также проверяет, что выражение соответствует типу, но не изменяет его (тип).

Разницу легко увидеть на картинке.

При использовании as изменяется тип на Color, и мы теряем информацию об исходном типе объекта. Поэтому у нас появляется ошибка в месте вызова myColor.value.toUpperCase() , потому что компилятор думает, что value может быть также типа RGB, у которого нет метода toUpperCase .

При использовании satisfies ошибки нет, потому что исходная информация о типе сохранена.

Ещё по теме:

- Typescript’s new ‘satisfies’ operator
- Announcing TypeScript 4.9 Beta — The `satisfies` Operator

https://t.me/cherkashindev/116

Показать полностью
2

Почему мы выбрали Zustand

Почему мы выбрали Zustand Кросспостинг, Pikabu Publish Bot, Frontend, React, Текст, Программирование, Длиннопост

Как я упомянул в посте о Zustand, мы начали его использовать в июне 2021 года.

До этого использовали просто useState/useReducer/useContext, поняли что так больше нельзя, и перед разработкой новой большой фичи мы начали искать подходящий менеджер состояний. У нас были следующие требования:

1. Использование состояния между компонентами, у которых нет общего родительского компонента. Мы мигрируем с JQuery на React, поэтому большинство компонентов рендерятся с помощью createRoot и не имеют общего родителя, что не позволяет использовать контекст реакта и совместно использовать состояние между компонентами
2. Атомарные обновления, чего нет у контекста реакта
3. Поддержка асинхронных обновлений стейта вне компонента. Чтобы избегать ошибок типа Can't perform a React state update on an unmounted component, которые происходят, когда обновляется состояние для уже удалённого компонента
4. Поддержка Computed Properties
5. Поддержка TypeScript
6. Тестируемость
7. Маленький размер бандла
8. Англоязычное комьюнити, потому что команда англоязычная

И следующий 2 требования я выделю отдельно:

1. Простота использования. Очень важно, когда у вас разработчики со всех концов света и скилы у всех разные. К тому же, очень просто наговнокодить, когда вы начинаете использовать новый инструмент.
2. Возможность использовать вне реакта. Как я уже упомянул, мы мигрируем с JQuery на React, поэтому мы хотели использовать стейт менеджер и в легаси коде. Это позволило бы:
- мигрировать глобальный стейт в новую кодовую базу и использовать во всём приложении
- управлять реакт компонентами из JQuery, просто меняя стейт.

1️⃣ В первоначальном списке оказались:

- Redux
- MobX
- Recoil
- Zustand
- Jotai
- Akita
- Effector

2️⃣ После анализа, в следующем раунде отбора оказались: MobX, Recoil и Zustand. Recoil попал по блату, его проталкивал один из членов команды, и потому что он разработан в стенах авторитетной “запрещённой” организации.

Мы переписали один и тот же небольшой компонент на MobX, Recoil и Zustand, чтобы проверить их в деле:

❌ MobX. По большей части нам не понравилось, что каждый компонент нужно оборачивать в observer, если он использует observable объект. К тому же, у него не самый простой API.

❌  К Recoil было очень много вопросов. Начиная от того, что он жирный — почти 80Кб без GZip и заканчиваю тем, что нельзя просто взять и вынести из компонента асинхронные обновления стейта. С асинхронным получением данных всё понятно, там есть селекторы, но как асинхронно обновить стейт — хз. К тому же он не production ready.

✅ Zustand нам понравился своей простотой, чтобы понять код – даже не нужно смотреть документацию. Также круто, что он удовлетворял буквально каждому нашему требованию.

Если вы ещё не знакомы с Zustand, то обязательно посмотрите видео из предыдущего поста. А если вам в целом интересна тема стейт менеджеров — то подписывайтесь на Артёма — автора реатома.

P.S. Кстати, Zustand прост не только в использовании, его исходники тоже просты как дважды два — четыре. Лучше понять, как он работает под капотом поможет статья Как работает Zustand.

https://t.me/cherkashindev/124

Показать полностью
Отличная работа, все прочитано!