Skip to content

Instantly share code, notes, and snippets.

View sergey-shambir's full-sized avatar

Sergey Shambir sergey-shambir

  • Йошкар-Ола
View GitHub Profile
@sergey-shambir
sergey-shambir / Guide.md
Last active August 14, 2025 15:09
Golang — именование и структура каталогов/пакетов/модулей

Идиоматичное именование

  1. Имя пакета является частью полного имени, это часто используется в именовании
    • courses.Course — курс
    • courses.Module — модуль курса
    • auth.Token — токен аутентификации
    • такой способ именования обыгрывается в стандартной библиотеке Go, пример: https://pkg.go.dev/slices
  2. Интерфейсы не имеют префикса
    • можно обыграть правило экспорта имён, начинающихся с заглавной буквы, например: интерфейс Module и его реализация module в пакете auth
  • можно расположить интерфейс и реализацию в разных пакетах, например: интерфейс domain.UserRepository и реализация infra.UserRepository
@sergey-shambir
sergey-shambir / Report.md
Created August 14, 2025 05:53
Qwen deep research - Orval и RTK Query

Интеграция Orval и RTK Query для управления API в React-приложении

В данном исследовательском отчете представлен всесторонний анализ методологии интеграции инструмента кодогенерации Orval с библиотекой Redux Toolkit Query (RTK Query) для управления взаимодействием с серверным API в приложении на React, TypeScript и Vite. Основное внимание уделяется архитектуре микрофронтендов и применению паттерна feature-sliced design. Отчет охватывает конфигурацию Orval, выбор стратегии генерации кода, реализацию кастомных клиентов, настройку хранилища Redux, модульную структуру API-слайсов, обработку ошибок и тегов, а также практические рекомендации по внедрению и оптимизации. Все выводы и рекомендации основаны исключительно на предоставленных источниках.

Конфигурация Orval для генерации кода из OpenAPI-схемы

Начальная настройка Orval является фундаментальным шагом, который определяет качество и функциональность сгенерированного API-клиента. Учитывая, что Orval напрямую не поддерживает RTK Query в качестве целевого

@sergey-shambir
sergey-shambir / HOWTO.md
Created December 20, 2024 12:43
Unit testing for source generator that use <AdditionalFiles> as input, based on https://gist.github.com/tm-nti/bb374b36d815a1166bc0cbc4febb8515

How to add XUnit test for source generator that use <AdditionalFiles> (AdditionalText) as input:

  1. Add TestAdditionalText class
  2. Add TestDataLoader class
  3. In Unit test, use method CSharpGeneratorDriver.AddAdditionalTexts to add generator input file
return CSharpGeneratorDriver.Create(generator)
    .AddAdditionalTexts(texts)
 .RunGenerators(compilation);
@sergey-shambir
sergey-shambir / generate_uuid.os
Last active November 7, 2024 18:32
Генерация UUIDv7 средствами встроенного языка 1С (проверено в onescript)
#Использовать "./Утилиты"
Сообщить("Новый UUIDv4, 1 штука: ");
Сообщить(Новый УникальныйИдентификатор);
Сообщить("");
Сообщить("Новый UUIDv7, 5 штук: ");
Сообщить(UUID.НовыйПоследовательныйUUID());
Сообщить(UUID.НовыйПоследовательныйUUID());
Сообщить(UUID.НовыйПоследовательныйUUID());
@sergey-shambir
sergey-shambir / console output.txt
Created October 31, 2019 11:20
noverify random crashes
2019/10/31 14:17:25.860031 built without version info (try using 'make install'?)
2019/10/31 14:17:25.860407 Started
fatal error: concurrent map read and map write
goroutine 36 [running]:
runtime.throw(0xa11c94, 0x21)
/snap/go/4668/src/runtime/panic.go:774 +0x72 fp=0xc00021ef30 sp=0xc00021ef00 pc=0x430c82
runtime.mapaccess2_faststr(0x965580, 0xc0000a0b70, 0xc0032c60a0, 0x20, 0xc00021f3a0, 0xc002f9f500)
/snap/go/4668/src/runtime/map_faststr.go:116 +0x48f fp=0xc00021efa0 sp=0xc00021ef30 pc=0x41497f
github.com/VKCOM/noverify/src/meta.(*info).GetClass(...)
@sergey-shambir
sergey-shambir / todo.js
Created July 5, 2019 04:08
To-Do App JS, layer 5
function onPageLoaded() {
// ...
function listenDeleteTodo(element) {
// ...
}
function loadTodos() {
const data = localStorage.getItem("todos");
if (data) {
@sergey-shambir
sergey-shambir / todo.js
Created July 5, 2019 04:05
To-Do App JS, layer 4
function onPageLoaded() {
const saveButton = document.querySelector("button.save");
const clearButton = document.querySelector("button.clear");
const showTipsButton = document.querySelector("button.showTips");
const closeTipsButton = document.querySelector("a.closeTips");
const overlay = document.querySelector("#overlay");
// ..
saveButton.addEventListener("click", () => {
@sergey-shambir
sergey-shambir / todo.js
Created July 5, 2019 04:03
To-Do App JS, layer 2
function onPageLoaded() {
// ...
function createTodo() {
// ...
listenDeleteTodo(deleteBtn);
}
function listenDeleteTodo(element) {
element.addEventListener("click", (event) => {
element.parentElement.remove();
@sergey-shambir
sergey-shambir / todo.js
Last active July 5, 2019 04:03
To-Do App JS, layer 3
function onPageLoaded() {
// ...
function createTodo() {
// ...
}
function onClickTodo(event) {
if (event.target.tagName === "LI") {
event.target.classList.toggle("checked");
}
@sergey-shambir
sergey-shambir / todo.js
Created July 5, 2019 03:58
To-Do App JS, v1
function onPageLoaded() {
const input = document.querySelector("input[type='text']");
const ul = document.querySelector("ul.todos");
function createTodo() {
const li = document.createElement("li");
const textSpan = document.createElement("span");
textSpan.classList.add("todo-text");
const newTodo = input.value;
textSpan.append(newTodo);