Короче, сегодня пытался купить сервер на reg.ru, но понятия не имел, что хостинг и сервер - это не одно и то же (по крайней мере, я не разобрался).
Очень просто теперь отличаю: сервак можно кастомизировать, хостинг - не совсем.
Если по делу, хостинг нужен для публикации контента на твоей сайте, но в целом можно это сделать и при помощи сервера, если там все настроить. На reg.ru хорошо объясняют в базе знаний, что и к чему - если что не понятно, лучше либо туда, либо в нейронках поспрашивать, либо google
#VPS #hosting #server
Очень просто теперь отличаю: сервак можно кастомизировать, хостинг - не совсем.
Если по делу, хостинг нужен для публикации контента на твоей сайте, но в целом можно это сделать и при помощи сервера, если там все настроить. На reg.ru хорошо объясняют в базе знаний, что и к чему - если что не понятно, лучше либо туда, либо в нейронках поспрашивать, либо google
#VPS #hosting #server
Кста, почему-то, если в React Native с Expo использовать Tabs Navigator, дальше уже не получится просто так использовать маршрутизатор (useRouter) по экранам и перейти на другой экран - ошибку не выдает, но и переход не совершает.
Мне помог Slot, а layout приложения кастомизировал под свои вкусы
#react #expo #react_native #expo_router
const router = useRouter();
...
// с Tabs Navigator не сработает
router.push({
pathname: url,
params: searchParams,
})
Мне помог Slot, а layout приложения кастомизировал под свои вкусы
<StatusBar
animated={true}
barStyle={`${theme === "dark" ? "light" : "dark"}-content`}
backgroundColor={themeColors.surface[0]}
/>
<Navbar />
<Slot />
<View
style={[
layoutStyles.flexRow,
layoutStyles.spaceAround,
layoutStyles.alignCenter,
]}
>
#react #expo #react_native #expo_router
Недавно понял, зачем нужно кеширование на примере из фронтенда: мне надо, чтобы пользователь мог получать данные о себе в зависимости от того, по какому периоду времени он хочет посмотреть свою активность в приложении. Я заметил, что, так как выбор опций довольно ограничен, можно просто в время открытия приложения заранее подготовить данные для пользователя и тогда, когда пользователю надо будет посмотреть статистику, я легко ему предоставлю данные из кэша (так как мобильное приложение на React Native, то просто сделал хранилище на Zustand и храню данные на телефоне пользователя через Expo SecureStore API).
#zustand #cache #expo #react_native
#zustand #cache #expo #react_native
Оказывается, что в Expo есть способ внедрить локальную для телефона sqlite - назвывается expo-sqlite. Кроме внедрения sqlite, также для работы с базой данных можно использовать drizzle - на их сайте есть специальный раздел про внедрение drizzle с expo-sqlite.
Сам drizzle позволяет работать с базами данных через провайдеры - все есть в библиотеке и на сайте с документацией.
Почему получилось это найти: сначала думал, что лучше использовать AsyncStorage для работы с данными в мобильном приложении, но потом вспомнил про наличие IndexedDB в браузерах - решил загуглить, можно ли также в мобилке, и нашел это. До того, как начать использовать SQLite с Drizzle, работу с данными делал при помощи Zustand, потом еще думал перейти на Redux, чтобы было легче работать с изменением данных, а тут, оказывается, есть такое
#expo #drizzle_orm #sqlite
Сам drizzle позволяет работать с базами данных через провайдеры - все есть в библиотеке и на сайте с документацией.
Почему получилось это найти: сначала думал, что лучше использовать AsyncStorage для работы с данными в мобильном приложении, но потом вспомнил про наличие IndexedDB в браузерах - решил загуглить, можно ли также в мобилке, и нашел это. До того, как начать использовать SQLite с Drizzle, работу с данными делал при помощи Zustand, потом еще думал перейти на Redux, чтобы было легче работать с изменением данных, а тут, оказывается, есть такое
#expo #drizzle_orm #sqlite
Tailwind CSS: прикольная и простая библиотека для стилизации компонентов. Сейчас столкнулся с тем, что необходимо поменять тему приложения со светлой на темную, и в Tailwind это можно сделать следующим образом:
1. Необходимо добавить класс "dark" на самый верхний уровень DOM (я добавляю в document.documentElement, в devtools будет отображаться в body).
2. Добавить в файл стилей @custom-variant:
.dark - это селектор css, в котором лежать стили для темной темы (могут быть просто стили, либо переменные —[var-name]), а .dark * выбирает все возможные дочерние элементы от .dark
3. Добавить @theme с необходимыми переменными для их использования в Tailwind.
Почему это работает: когда прописываются переменные для темной или светлой темы, обычно это делается, например, так (кстати, так делается поддержка тем в shadcn компонентах)
При добавлении .dark, переменные переписываются, потому что они добавляются позже, чем в :root, несмотря на одинаковую специфичность селекторов
#tailwindcss #specificity #css
1. Необходимо добавить класс "dark" на самый верхний уровень DOM (я добавляю в document.documentElement, в devtools будет отображаться в body).
// theme, чтобы пользователь сам выбирал переменную
document.documentElement.classList.toggle("dark", theme === "dark");
// или, с использованием ситемной темы:
const prefersDark = window.matchMedia(
"(prefers-color-scheme: dark)",
).matches;
document.documentElement.classList.toggle("dark", prefersDark);
2. Добавить в файл стилей @custom-variant:
@custom-variant dark (&:where(.dark, .dark *));
.dark - это селектор css, в котором лежать стили для темной темы (могут быть просто стили, либо переменные —[var-name]), а .dark * выбирает все возможные дочерние элементы от .dark
3. Добавить @theme с необходимыми переменными для их использования в Tailwind.
Почему это работает: когда прописываются переменные для темной или светлой темы, обычно это делается, например, так (кстати, так делается поддержка тем в shadcn компонентах)
:root {
--primary: white;
}
.dark {
--primary: black;
}
@theme inline {
--color-primary: var(--primary);
}
При добавлении .dark, переменные переписываются, потому что они добавляются позже, чем в :root, несмотря на одинаковую специфичность селекторов
#tailwindcss #specificity #css
NotebookLM - если хочется, чтобы чтение было интересным и продуктивным.
Сегодня решил первый раз для себя открыть это приложение, и нашел пару удивительных моментов:
1. Оказывается, приложуха умеет съедать и обрабатывать книги, чтобы пользователь приложения мог спокойно получать информацию из книги при помощи запросов в чат внутри приложения.
2. Как только вы скормили нейронной сети книгу, вы можете попросить приложение сделать дерево из тем внутри приложения - полноценная визуализация в виде дерева (в приложении называется Mind Map).
3. Можно попросить приложение создать детализированную презентацию на тему внутри книги, причем будут и картинки, и текст. Если надо, можно попросить прошерстить интернет, чтобы добавить точности в материал или добавить дополнительные ресурсы (файлы) нейросети для анализа и формирования презы.
Пока что не использовал все функции, но очень удобно, если изучаешь что-то (я изучаю алгоритмы и структуры данных по книге Introduction to Algorithms - Third Edition).
Вообще, есть один нехороший недостаток - плохо отображает формулы вне чата с запросами в нейронку (есть функция - посмотреть источник, карточка и сам источник формулы не рисует)
#notebooklm #ai
Сегодня решил первый раз для себя открыть это приложение, и нашел пару удивительных моментов:
1. Оказывается, приложуха умеет съедать и обрабатывать книги, чтобы пользователь приложения мог спокойно получать информацию из книги при помощи запросов в чат внутри приложения.
2. Как только вы скормили нейронной сети книгу, вы можете попросить приложение сделать дерево из тем внутри приложения - полноценная визуализация в виде дерева (в приложении называется Mind Map).
3. Можно попросить приложение создать детализированную презентацию на тему внутри книги, причем будут и картинки, и текст. Если надо, можно попросить прошерстить интернет, чтобы добавить точности в материал или добавить дополнительные ресурсы (файлы) нейросети для анализа и формирования презы.
Пока что не использовал все функции, но очень удобно, если изучаешь что-то (я изучаю алгоритмы и структуры данных по книге Introduction to Algorithms - Third Edition).
Вообще, есть один нехороший недостаток - плохо отображает формулы вне чата с запросами в нейронку (есть функция - посмотреть источник, карточка и сам источник формулы не рисует)
#notebooklm #ai
CLI-приложение для code review - CodeRabbit CLI.
Какую проблему: когда пишете код, можете случайно залить неверные изменения в коде - просто могут быть какие-то опечатки и ошибки в логике.
Как решает: при помощи ИИ анализирует кодовую базу репозитория и предлагает в интерфейсе командной строки разные фиксы, которые он может сделать в коде. То есть, ИИ проанализировал код и выдал свои поправки, которые он может внести в зависимости от того, одобряете вы их или нет (одно одобрение на одну поправку в одном файле).
Работа с ним очень простая:
1. Скачать coderabbit cli - просто ищете в интернете, и получаете строку для ввода в терминал на скачку. Пример такой строки:
2. Переходите в папку с вашим кодом и вводите в терминале
Дальше, чтобы сделать Review репозитория, просто нажимаете на Enter, и ждете - переходить по предложенным опциям можно стрелками на клавиатуре + там подписаны кнопки для работы с программой.
Лично мне помогает искать ошибки в коде, которые сразу не заметил, когда писал код быстро или навайбкодил что-то вдруг.
Какую проблему: когда пишете код, можете случайно залить неверные изменения в коде - просто могут быть какие-то опечатки и ошибки в логике.
Как решает: при помощи ИИ анализирует кодовую базу репозитория и предлагает в интерфейсе командной строки разные фиксы, которые он может сделать в коде. То есть, ИИ проанализировал код и выдал свои поправки, которые он может внести в зависимости от того, одобряете вы их или нет (одно одобрение на одну поправку в одном файле).
Работа с ним очень простая:
1. Скачать coderabbit cli - просто ищете в интернете, и получаете строку для ввода в терминал на скачку. Пример такой строки:
curl -fsSL https://cli.coderabbit.ai/install.sh | sh
2. Переходите в папку с вашим кодом и вводите в терминале
coderabbit
Дальше, чтобы сделать Review репозитория, просто нажимаете на Enter, и ждете - переходить по предложенным опциям можно стрелками на клавиатуре + там подписаны кнопки для работы с программой.
Лично мне помогает искать ошибки в коде, которые сразу не заметил, когда писал код быстро или навайбкодил что-то вдруг.
Ультра вайб-кодинг сочетание - OpenCode/Cursor + CodeRabbit.
Решил попробовать запустить агента, чтобы создать проект для работы с личной эффективностью и подумал: а че, если агенту дать команду делать ревью проекта при помощи coderabbit и затем делать все необходимые изменения в коде, если сoderabbit нашел говнокод?
Таким образом, агент пишет код, а coderabbit следит за его качеством. Удивительно, но качество кода получается неплохое, учитывая, что я ему не задавал использовать довольно много библиотек (если хотите, чтобы агент использовал определенные библиотеки, обязательно надо из перечислить в запросе!). В итоге сейчас постепенно регулирую запросы, итеративно полируя агентом и ревьюером весь код проекта.
Решил для этого проекта использовать такой подход, потому что занят просто другими делами и могу постепенно давать запросы, если что вдруг.
Минусы подхода: ИИ все равно ошибается - очень плохо справляется с сетапом проекта, плюс делает ошибки в коде. В этом случае уже Я лично вмешиваюсь, и дальше все окей - ИИ пишет код, я смотрю, что он написал, и делаю поправки, если ИИ не смог понять, в чем проблема.
Проще говоря, экспертиза помогает вайбкодить 100%
#vibe_coding #opencode #cursor #coderabbit #code_review
Решил попробовать запустить агента, чтобы создать проект для работы с личной эффективностью и подумал: а че, если агенту дать команду делать ревью проекта при помощи coderabbit и затем делать все необходимые изменения в коде, если сoderabbit нашел говнокод?
Таким образом, агент пишет код, а coderabbit следит за его качеством. Удивительно, но качество кода получается неплохое, учитывая, что я ему не задавал использовать довольно много библиотек (если хотите, чтобы агент использовал определенные библиотеки, обязательно надо из перечислить в запросе!). В итоге сейчас постепенно регулирую запросы, итеративно полируя агентом и ревьюером весь код проекта.
Решил для этого проекта использовать такой подход, потому что занят просто другими делами и могу постепенно давать запросы, если что вдруг.
Минусы подхода: ИИ все равно ошибается - очень плохо справляется с сетапом проекта, плюс делает ошибки в коде. В этом случае уже Я лично вмешиваюсь, и дальше все окей - ИИ пишет код, я смотрю, что он написал, и делаю поправки, если ИИ не смог понять, в чем проблема.
Проще говоря, экспертиза помогает вайбкодить 100%
#vibe_coding #opencode #cursor #coderabbit #code_review
Зачем тестировать приложения на уязвимости:
Я тут начал эксперименты с вайбкодингом по хардкору, и подумал: а может, попробовать хакнуть свои приложения при помощи вайбкодера? (честно, на днях придется делать review всего этого кода - разберусь и напишу, что именно делал агент, чтобы хакнуть приложение и проверить уязвимости - мне самому интересно) Чисто на вайбе получилось создать пару скриптов, которые проверяли атаки SQL Injection, XSS, Auth Bypass и хаки при валидации ввода пользователя - проверял, как эти хаки обрабатывает backend мой. В итоге, вайбкодер смог таки найти потенциальную уязвимость при аутентификации пользователя в приложение.
Проще говоря, даже если вы не эксперт в кибербезопасности, вы можете так попросить агента хакнуть ваше приложение и потом посмотреть, что именно агент написал, чтобы хакнуть ваше приложение - разумеется, просмотр написанного агентом кода 100% ВАЖЕН!!! Это для вашей личной выгоды: будете больше понимать в работе того или иного спеца в команде на работе + лучше будете понимать код в кодовой базе и ловить говнокод как можно раньше.
#vide_coding #security
Я тут начал эксперименты с вайбкодингом по хардкору, и подумал: а может, попробовать хакнуть свои приложения при помощи вайбкодера? (честно, на днях придется делать review всего этого кода - разберусь и напишу, что именно делал агент, чтобы хакнуть приложение и проверить уязвимости - мне самому интересно) Чисто на вайбе получилось создать пару скриптов, которые проверяли атаки SQL Injection, XSS, Auth Bypass и хаки при валидации ввода пользователя - проверял, как эти хаки обрабатывает backend мой. В итоге, вайбкодер смог таки найти потенциальную уязвимость при аутентификации пользователя в приложение.
Проще говоря, даже если вы не эксперт в кибербезопасности, вы можете так попросить агента хакнуть ваше приложение и потом посмотреть, что именно агент написал, чтобы хакнуть ваше приложение - разумеется, просмотр написанного агентом кода 100% ВАЖЕН!!! Это для вашей личной выгоды: будете больше понимать в работе того или иного спеца в команде на работе + лучше будете понимать код в кодовой базе и ловить говнокод как можно раньше.
#vide_coding #security
Заметил одну неприятную вещь, когда использовал анимации GSAP в своем приложении, и потратил много времени, чтобы найти ошибку: когда я через CSS задаю парамерты transform для определенного компонента, скорее всего, это элемент у вас не получится анимировать при помощи GSAP. Дело в том, что GSAP под копотом как раз использует transform, чтобы управлять анимациями элементов. Когда я сам задаю transform для компонента, те свойства, которые GSAP установил сам, перепишутся вашими -> анимация не работает.
#GSAP #CSS
#GSAP #CSS
КААААААПЕЦ!!!!!
Есть открытая библиотека для анимаций, назвыается GSAP. Её удобство в том, что там довольно легко создать и отдебажить анимацию. Также в этой библиотеке есть возможность активировать работу внутренних плагинов. Примеры плагинов:
1. ScrollTrigger для запуска анимации, когда элемент появляется в определенном месте на экране пользователя
2. ScrollTo - позволяет проскролить в определенное место на странице (можно проскролить к элементу, к которому подходит определенный CSS-селектор), плюс можно сделать анимацию скролла.
3. SplitText (по этой причине, в целом, появился этот пост) - позволяет добавить анимацию в текст, разделяя текст на разные div-элементы и определенным образом манипулируя каждым из них (например, можно сделать так, чтобы текст появлялся на экране побуквенно и постепенно).
Собственно, где я офигел: сегодня часа 4 искал, почему, когда я меняю язык на странице, текст, на который я наложил анимацию при помощи SplitText, не хочет обновляться - ну совсем не хочет. Дальше обнаружил, что ref для текста тоже не обновился - понятия не имел почему.
Потом самое интересное - я решил разделить компонент на два: контейнер для текста и сам текст, но я это только сделал, чтобы протестировать, как рендерится текст (самое важное - использовал внутри компонента с текстом useEffect для проверки рендеринга).
ТАК УЖ оказалось, что можно было сначала отдельно отрендерить текст, и потом его использовать там, где мне удобно будет... Странно, что React не отрендерил весь компонент изначально, если честно, но что есть, то есть - такой подход мне помог. Код ниже - можете глядеть.
Проще говоря, чтобы SplitText анимация правильно работала, нужно было элементы, где текст находится, заранее перерендерить, если язык поменял (или текст изменился)
#GSAP #React #useEffect
(ref - это ссылка на объект Javascript, в React можно создать ref, и при обновлении интерфейса)
Есть открытая библиотека для анимаций, назвыается GSAP. Её удобство в том, что там довольно легко создать и отдебажить анимацию. Также в этой библиотеке есть возможность активировать работу внутренних плагинов. Примеры плагинов:
1. ScrollTrigger для запуска анимации, когда элемент появляется в определенном месте на экране пользователя
2. ScrollTo - позволяет проскролить в определенное место на странице (можно проскролить к элементу, к которому подходит определенный CSS-селектор), плюс можно сделать анимацию скролла.
3. SplitText (по этой причине, в целом, появился этот пост) - позволяет добавить анимацию в текст, разделяя текст на разные div-элементы и определенным образом манипулируя каждым из них (например, можно сделать так, чтобы текст появлялся на экране побуквенно и постепенно).
Собственно, где я офигел: сегодня часа 4 искал, почему, когда я меняю язык на странице, текст, на который я наложил анимацию при помощи SplitText, не хочет обновляться - ну совсем не хочет. Дальше обнаружил, что ref для текста тоже не обновился - понятия не имел почему.
Потом самое интересное - я решил разделить компонент на два: контейнер для текста и сам текст, но я это только сделал, чтобы протестировать, как рендерится текст (самое важное - использовал внутри компонента с текстом useEffect для проверки рендеринга).
ТАК УЖ оказалось, что можно было сначала отдельно отрендерить текст, и потом его использовать там, где мне удобно будет... Странно, что React не отрендерил весь компонент изначально, если честно, но что есть, то есть - такой подход мне помог. Код ниже - можете глядеть.
Проще говоря, чтобы SplitText анимация правильно работала, нужно было элементы, где текст находится, заранее перерендерить, если язык поменял (или текст изменился)
#GSAP #React #useEffect
(ref - это ссылка на объект Javascript, в React можно создать ref, и при обновлении интерфейса)
import React, { useEffect, useEffectEvent, useRef, useState } from "react";
import { gsap } from "gsap";
import { SplitText } from "gsap/all";
import { useTranslation } from "react-i18next";
import { useGSAP } from "@gsap/react";
// Contact is now a standard FC, using forwardedRef for h2
const Contact = ({
text,
lang,
ref,
}: {
ref: React.RefObject<HTMLHeadingElement | null>;
text: {
getIn: string;
touch: string;
};
lang: string;
}) => {
const { t } = useTranslation();
useGSAP(() => {
if (!ref) return;
gsap.from(".suggestion", {
scrollTrigger: {
trigger: ref.current,
start: "top 80%",
markers: true,
},
x: 30,
opacity: 0,
duration: 0.3,
ease: "power3.out",
});
});
return (
<div className="text-center mb-16">
<h2
ref={ref}
className="text-3xl md:text-4xl font-bold text-foreground"
>
{text.getIn} <span className="themed-text">{text.touch}</span>
</h2>
<p className="suggestion text-secondary-foreground mt-4 max-w-2xl mx-auto">
{t("contactMe.label", { lng: lang })}
</p>
</div>
);
};
export function ContactMe({ lang }: { lang: string }) {
const { t } = useTranslation();
// Store text depending on `lang` using effect
const [text, setText] = useState(() => ({
getIn: t("contactMe.getIn", { lng: lang }),
touch: t("contactMe.touch", { lng: lang }),
}));
const updateText = useEffectEvent((language: string) => {
setText({
getIn: t("contactMe.getIn", { lng: language }),
touch: t("contactMe.touch", { lng: language }),
});
});
// This will ensure text updates when language changes
useEffect(() => {
updateText(lang);
}, [lang, t]);
// We use a ref for the h2 for animation
const getInTouchRef = useRef<HTMLHeadingElement>(null);
// Animation hook
useGSAP(
() => {
const h2 = getInTouchRef.current;
console.log(h2);
if (!h2) return;
const split = new SplitText(h2, {
type: "chars",
aria: "none",
});
gsap.from(split.chars, {
scrollTrigger: {
trigger: h2,
start: "top 90%",
// markers: true,
},
x: 30,
opacity: 0,
duration: 0.5,
stagger: 0.05,
ease: "power3.out",
});
return () => {
split.revert();
};
},
// Depend on text, so when language changes and text re-renders, the animation is retriggered
[text],
);
// Use a `key` prop on Contact to force re-mount and ensure SplitText gets the fresh DOM after language changes
return (
<section id="contact" className="py-24 bg-background">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<Contact
ref={getInTouchRef}
text={text}
lang={lang}
key={
lang +
text.getIn +
text.touch /* will remount when language or text changes */
}
/>
</div>
</section>
);
}
Приложухи
import React, { useEffect, useEffectEvent, useRef, useState } from "react"; import { gsap } from "gsap"; import { SplitText } from "gsap/all"; import { useTranslation } from "react-i18next"; import { useGSAP } from "@gsap/react"; // Contact is now a standard…
Если необходимо какой-то элемент перерисовать раньше других, можно использовать свойство
key любого элемента JSX - при его изменении элемент перерисуется сам (React отвечает за это, в Vue это тоже есть вроде)Что делать, если нужно сделать запрос и получить данные из него прямо в компоненте React?
Начиная с версии React v18, есть возможность использовать React.Suspense компонент, который будет отображать fallback UI до тех пор, пока дочерний компонент не будет целиком готов для отображения (на языке React - ждет, пока дочерний код срендерится).
Сразу пример из документации:
А теперь то, как выглядить Albums:
Пока данные загружаются с API, Suspense покажет статус загрузки.
Важно отметить, что Suspense работает только с lazy, либо с Suspense-включенными источниками (документация говорит только о Promise, сюда же входят fetch).
Начиная с версии React v18, есть возможность использовать React.Suspense компонент, который будет отображать fallback UI до тех пор, пока дочерний компонент не будет целиком готов для отображения (на языке React - ждет, пока дочерний код срендерится).
Сразу пример из документации:
import { Suspense } from 'react';
import Albums from './Albums.js';
export default function ArtistPage({ artist }) {
// вот мы захотели загрузить музыку из какого-то API
// Albums отображает музыку, но загрузка может быть долгой
return (
<>
<h1>{artist.name}</h1>
<Suspense fallback={<Loading />}>
<Albums artistId={artist.id} />
</Suspense>
</>
);
}
function Loading() {
return <h2>🌀 Loading...</h2>;
}А теперь то, как выглядить Albums:
import {use} from 'react';
import { fetchData } from './data.js';
export default function Albums({ artistId }) {
// используем хук use, чтобы раскрыть полученный Promise - может занять время
const albums = use(fetchData(`/${artistId}/albums`));
return (
<ul>
{albums.map(album => (
<li key={album.id}>
{album.title} ({album.year})
</li>
))}
</ul>
);
}
Пока данные загружаются с API, Suspense покажет статус загрузки.
Важно отметить, что Suspense работает только с lazy, либо с Suspense-включенными источниками (документация говорит только о Promise, сюда же входят fetch).
Как сделать сетап protoc для gRPC?
Два варианта:
Первый вариант:
1. Скачать исходник с гитхаба - https://github.com/protocolbuffers/protobuf/releases
2. bin файл копировать в /usr/local/bin, include файлы в /usr/local/include. Это позволить выполнять protoc через консоль и использовать библиотеки и файлы для работы с .proto файлами (protoc смотрит в папку /usr/local/include).
Второй вариант - собрать все самому:
1. Склонировать репозиторий protobuf на машину. (инструкции по клонированию здесь)
2. Скачать bazelisk отсюда
3. Запустить bazelisk - эта программа предназначена для удобной установки сборщика Bazel, при помощи него дальше можно будет собрать protoc. Как только запустите bazelisk (просто ввести bazelisk в командную строку), Bazel начнет автоматически скачиваться - просто подождать конца установки.
4. Запустить build при помощи Bazel
5. Скопировать бинарник protoc в /usr/local/bin + скопировать ./src/google в /usr/local/include - это даст возможность использовать .proto файлы от google + protoc тоже будет их видеть
Edit: возможно, когда используете protoc, нужно будет добавить флаги
Два варианта:
Первый вариант:
1. Скачать исходник с гитхаба - https://github.com/protocolbuffers/protobuf/releases
2. bin файл копировать в /usr/local/bin, include файлы в /usr/local/include. Это позволить выполнять protoc через консоль и использовать библиотеки и файлы для работы с .proto файлами (protoc смотрит в папку /usr/local/include).
Второй вариант - собрать все самому:
1. Склонировать репозиторий protobuf на машину. (инструкции по клонированию здесь)
git clone https://github.com/protocolbuffers/protobuf.git
cd protobuf
git submodule update --init --recursive
2. Скачать bazelisk отсюда
3. Запустить bazelisk - эта программа предназначена для удобной установки сборщика Bazel, при помощи него дальше можно будет собрать protoc. Как только запустите bazelisk (просто ввести bazelisk в командную строку), Bazel начнет автоматически скачиваться - просто подождать конца установки.
bazelisk
4. Запустить build при помощи Bazel
bazel build :protoc :protobuf
5. Скопировать бинарник protoc в /usr/local/bin + скопировать ./src/google в /usr/local/include - это даст возможность использовать .proto файлы от google + protoc тоже будет их видеть
cp bazel-bin/protoc /usr/local/bin
cp ./src/google /usr/local/include
Edit: возможно, когда используете protoc, нужно будет добавить флаги
--[language]_out=[outdir] --[langauge]-grpc_out=[outdir], куда будут генерироваться два файла: типы из .proto файла и функционал для использования этих типов с gRPC-сервером (пробовал с Go 1.26.1 - без генерации двух файлов не работает, оба нужны). Смотрите отдельно для своего языка, какие файлы нужно генерировать и подставляйте соответствующие флаги для protocNeoVim - редактор для кода, который можно кастомизировать как душе угодно + есть возможность подгружать плагины.
Кастомизация: NeoVim поддерживает создание расширений на Lua и на VimScript. Логику работы редактора можно настроить при помощи доступа к Vim API - здесь будет только настройка на Lua.
Настройка:
Настроить можно все: горячие клавиши, переназначить клавиши, настроить тему редактора, размер табуляции, и другие настройки
Кастомизация: NeoVim поддерживает создание расширений на Lua и на VimScript. Логику работы редактора можно настроить при помощи доступа к Vim API - здесь будет только настройка на Lua.
Настройка:
-- Через vim.opt можно поправить настройки - из довольно много, каждую можно найти либо на ютубе в обзоре, либо в документации NeoVim
vim.opt.[настройка]
Настроить можно все: горячие клавиши, переназначить клавиши, настроить тему редактора, размер табуляции, и другие настройки
-- Через vim.keymap можно настроить или перенастроить горячие клавиши
vim.keymap
-- Пример
vim.keymap.set("n", "<C-s>", ":w", {desc = "Сохранить файл"})
🔥1
