Технические заметки
19 subscribers
57 photos
15 videos
30 links
Здесь я делюсь техническим опытом, который приобретаю каждый день на работе и дома.

Сетка: https://set.ki/Nheuhoc
LinkedIn: linkedin.com/in/magrega
Download Telegram
Всяких классных сочетаний, которые сильно ускоряют работу, много, но сегодняшнюю серию постов я закончу на последнем сочетании, связанном с окнами. И это я сам открыл довольно недавно.

Представляю вам Рабочие столы. Начиная с Win10, кажется, c помощью сочетания Win + Tab можно открыть представление всех открытых приложений и добавить виртуальный рабочий стол. Очень полезно для разделение работы по смыслу.

Один рабочий стол для кода, второй для просмотра видео и чата, третий для работы с почтой и документами.

Мозг очень долго привыкал к концепту, но теперь это очень удобно и действительно помогает держать рабочее место в чистоте без открытого Хрома с миллионом вкладок.

С помощью Win + Ctrl + Arrow keys можно переключаться между столами, что делает эту фичу еще более удобной и встраиваемой в рабочий поток.

#Windows #Hotkeys
❤‍🔥11🔥1
Вероятно, кто-то уже подобное видел, но лично для меня видеть код, написанный на Кириллице в 1С, это что-то ретрофутуристичное.
Сразу воображаю себе мужей в белых научных халатах и запуски спутников под Sovietwave.

Довелось на проекте позаниматься интеграцией веб-приложения с 1С ERP. В частности, занимался исправлением нерабочей обработки, которая выгружала информацию по одежде в приложение, над которым мы сейчас работаем. В конфигураторе 1С даже нумерация строк кода не по каждой строке, как в том же VSCode, а в правом нижнем углу в строке состояния.

Не знаю, чего я вообще ожидал от 1С, но в ней есть тот же Rest API, экспорт данных в JSON и XML. Полноценная работа с запросами, отладка, точки останова. Всё, как у взрослых. До этого момента я толком вообще ничего не знал про 1С, а сейчас кажется, что это даже не так плохо, как рисуют люди, а коллеги вообще хвалят, ругают только сомнительную "кастомизацию" на отдельных предприятиях.

На секунду представил, какого это писать каждый день код на своем родном языке и не затирать без конца Shift + Alt, чтобы поменять язык, особенно, когда нужно постоянно что-то гуглить и читать стэк.

    Если Не ЗначениеЗаполнено(УзелПриложения) Тогда
Текст = НСтр("ru = 'Не заполнено поле ""Получатель""'");
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст,,,"УзелПриложения");
Возврат;
КонецЕсли;

// Павлова 27.10.2025+
ВыгрузитьВСтаромФормате = ОбщегоНазначенияУТВызовСервера.ЗначениеРеквизитаОбъекта(УзелПриложения, "ИспользоватьСтарыйФорматВыгрузки");

Если Не ВыгрузитьВСтаромФормате тогда

АдресФайла = СформироватьФайлXML(ЗадачаПАКСИЗ);
Данные = ПолучитьИзВременногоХранилища(АдресФайла);
Если ТипЗнч(Данные) <> Тип("ДвоичныеДанные") Тогда
Возврат;
КонецЕсли;

ИмяФайла = Формат(ТекущаяДата(),"ДФ=гггг_ММ_дд-чч_мм_сс")+".xml";

РезультатОтправки = ОтправитьФайлНаСервере(АдресФайла,ИмяФайла);

Если РезультатОтправки.Успешно = Ложь Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(РезультатОтправки.ОписаниеОшибки);
КонецЕсли;

Иначе
ТекущиеДанные = ОбщегоНазначенияУТВызовСервера.ЗначенияРеквизитовОбъекта(ЗадачаПАКСИЗ, "Основание, ВидОперации");
Если ЗначениеЗаполнено(ТекущиеДанные.Основание) тогда
ВыгрузкаRENTНаСервере(ТекущиеДанные);
КонецЕсли;

КонецЕсли;
// Павлова 27.10.2025-
КонецПроцедуры

#Code #1C
2👍2
Сегодня DeepSeek испытал стресс.

#WeAreDone #AI
2❤‍🔥1🤯1
Я в качестве хобби собираю приставки Playstation.

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

Мы, программисты, ленивые. Мы не будем делать что-то, что займет час, если это можно автоматизировать за восемь. Я так и сделал. Целый день провел за изучением и тестированием Powershell, чтобы он брал все архивы в папке, брал их несжатый размер из метаданных, складывал вместе и выдавал. Для его работы нужен установленный 7zip.exe. Я еще подумаю, как его интегрировать в скрипт, чтобы не было обязательной его предварительная установка. Но пока получилось вот это:

function Get-ArchiveSizeInfo {
param (
[string]$ArchivePath,
[string]$SevenZipPath = "C:\Program Files\7-Zip\7z.exe"
)

# Get all archive files
if (!$ArchivePath) { return Write-Warning "Archives path not specified" }
$itemsArray = Get-ChildItem -Path "$ArchivePath\*" -Include *.7z, *.rar, *.zip | Select-Object -ExpandProperty FullName

if ($itemsArray.Count -eq 0) {
Write-Warning "No archive files found in $ArchivePath"
return
}

$7zArray = @()

# Get information for each archive using 7-Zip
try {
foreach ($item in $itemsArray) {
$7zArray += & "$SevenZipPath" l "$item"
}
}
catch {
Write-Warning "Failed to process archive: $item"
Write-Warning $_.Exception.Message
return
}

Write-Output "Number of archives found: $($itemsArray.count)"

# Extract uncompressed sizes from 7-Zip output
$pattern = '\.\.\.\.A\s+(\d+)\s+'
$sizeMatches = $7zArray | Where-Object { $_ -match $pattern }

$uncompSizesArr = @()

foreach ($item in $sizeMatches) {
if ($item -match $pattern) {
$uncompSizesArr += [long]$matches[1]
}
}

# Calculate and output total size
$totalUncompSize = ($uncompSizesArr | Measure-Object -Sum).Sum
$sizeInGB = [math]::Round(($totalUncompSize / 1GB), 2)

Write-Output "Total uncompressed size: $sizeInGB GB"
}

#Playstation #7zip #Powershell
3❤‍🔥1
Media is too big
VIEW IN TELEGRAM
Как и все, я часто покупаю что-то на маркетплейсах, так как удобство похода в ПВЗ около дома затмевает все мнимые преимущества похода в магазин.

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

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

И если я, человек, который почти 10 лет уже работает в ИТ, испытываю трудности с поиском кнопки отмены подписки, то что же испытают люди, который едва умеют пользоваться смартфонами?

В общем, на коротком видео в UI представлены две кнопки, открывающие всплывающее окно управления подпиской. Но ни в одной из них нет кнопки "отменить подписку". Конечно, первый импульс - написать в поддержку, но мне часто интересно докопаться до сути и я начал слишком дотошно клацать по интерфейсу, чтобы всё-таки понять, как ее отключить.

Как оказалось, та самая кнопка находится в разделе Вопросы и ответы. Любопытно, как спрятано. Это получается уже третья кнопка на странице, которая открывает Управление подпиской, но только в ней есть кнопка Отменить.

Как на ваш взгляд, это про пользователя?)

#ux #wildberries
1❤‍🔥1🔥1
Технические заметки
В дополнение к прошлому посту. Прикольно, что на телефоне вообще нельзя отменить подписку. #ux #wildberries
This media is not supported in your browser
VIEW IN TELEGRAM
Завершаю посты про Вайлдберрис. Давайте вместе посмотрим как происходит отмена подписки.

Мы уже знаем, что отменить подписку можно только из раздела Вопросы и ответы. Вероятно, у фронтенд-разработчиков есть KPI на количество кликов и скролла на странице 😀

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

Неприятная обратная сторона эпохи маркетплейсов.

#ux #wildberries
👍2🔥2❤‍🔥1
В своё время для меня стал открытием тот факт, что метод fetch в JavaScript не кидает исключения на 400-х и 500-х ошибках, так как по сути, это всё валидные ответы сервера, и нам, разработчикам, решать, как эти ошибки обрабатывать.
В методе fetch() promise будет отклонён (reject) с TypeError, когда случится ошибка сети или не будет сконфигурирован CORS на стороне запрашиваемого сервера, хотя обычно это означает проблемы доступа или аналогичные — для примера, 404 не является сетевой ошибкой. Для достоверной проверки успешности fetch() будет включать проверку того, что promise успешен (resolved), затем проверку того, что значение свойства Response.ok является true.

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

Да, конечно, вы можете справедливо мне посоветовать Axios, TanStack или RTK Query и будете правы, но когда сам по себе проект является очень маленьким, почти домашним, тащить туда целую библиотеку для запросов кажется избыточным, потому было грустно осознавать, что придется все оборачивать в try\catch.

Однако, поковырявшись в интернетах я набрел на вот такую либу: ky.
По сути, это обёртка над fetch, но с упрощенным синтаксисом и очень широким списком фичей, в виде автоматических повторов запросов, автоматического парсинга JSON, понятных исключений при 400-х и 500-х ошибках и много еще чего другого.

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

Происходит запрос => Токен истек => Запрос рефреш-токена => повторный запрос.
ky.extend({
hooks: {
afterResponse: [
async (request, options, response) => {
if (response.status === 401) {
const newToken = await refreshAuthToken();
request.headers.set('Authorization', `Bearer ${newToken}`);
return ky(request);
}
}
]
}
});

Я наткнулся на этот инструмент, когда изучал JWT-токены. Пытаясь реализовать сценарий работы с ними, мне не понравился подход с Interceptors в Axios. Очень уж громоздко.

#javascript #React #dx
❤‍🔥11🔥1
#code #dry #dx

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

Один из таких принципов называется DRY (от англ. «сухой»). Аббревиатура расшифровывается как Don’t repeat yourself (Не повторяйся). На мой взгляд, название интуитивно понятное, нет смысла дублировать строки кода по сто раз, если у нас есть инструменты, чтобы этого избежать.

А вот наглядный пример "на пальцах" для тех, кто далек от программирования:
❤‍🔥1🔥1🤯1
Была у меня история как-то, очень объемная и многогранная.

Еще когда я работал в Москве, мне купили ноут для работы Asus Vivobook S14. Прикольный, OLED-экран, 4К разрешение, ГПУ, хоть и встройка, но Back 4 Blood тащил на высоких, только тени убавлял. Но был у него такой прикол, когда пускаешь звук через Bluetooth-колонку и оставляешь ноут стоять, он уходит в сон, а сигнал блютуза начинает прерываться, превращая фоновое прослушивание музыки во вьетнамскую пытку. Тут можно видео посмотреть, как оно выглядело и звучало. Еще он включался кнопкой не с первого раза, когда работал от батареи, но поскольку ноут стоял у меня статично на столе по большей части, меня это не так сильно беспокоило.

Понятно дело, первое, что я сделал, это обновил все драйвера и биос файлами с сайта производителя, но это не поменяло абсолютно ничего. Поверхностно погуглив и не найдя очевидных решений, я решил не париться и отдать его по гарантии. Я пришел в сервисный центр, попытался все объяснить, но честно, сложилось впечатление, что меня никто не слушал. Я в этом убедился, прочитав описание проблем на квитанции СЦ. Написали вообще не то, о чем я рассказывал. Ну бог с ним, гарантия есть, пусть разбираются. Ноут забрали, вернули спустя 45 дней (!!!), сказали, что все пофиксили прошивкой биоса🤪. Я при них пытаюсь включить ноут и он не заводится.

Я вопросительно смотрю на работника СЦ, он не понимает вопроса в моих глазах. И тут я совершил первую ошибку из многих, которые потом последовали. Я решил забрать ноут и нормально протестить его дома. "Ну мало ли".

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

После долгого конфликтного разговора он все-таки решил его забрать, мол, пусть руководство решает ремонтировать по гарантии или нет. В итоге мой ноутбук пролежал у них больше полугода. Я звонил каждые две недели и мне сначала говорили, что ждут детали на замену с Кореи, потом они его сушили и диагностировали, ведь плата залита, а когда я уже пришел с досудебкой, мне его вернули с ответом СЦ, что нет технической возможности провести ремонт. В качестве компенсации дали на пиво, а я дальше этого не полез, так как ноут всё-таки покупал не я. Убрал его в долгий ящик.

Тут заканчивается эта избыточная прелюдия и начинается интересная техническая часть.

#asus #service #vivobook #bluetooth
2❤‍🔥1🤯1
У меня есть вредная черта: если что-то не работает как задумано, это нужно либо починить, либо сломать окончательно в попытках. Так я и взялся за этот несчастный ноутбук. Переустановил Windows раз тридцать, не меньше. Кстати, из этого вынес интересный опыт: если купить NVMe-диск, положить его в бокс и ставить Windows с него через USB 3.1, система устанавливается за считанные минуты.

Пробовал разные сборки Windows 10 и 11, ставил Debian — на нём всё работало идеально. Ковырял режимы питания, менял Bluetooth-модуль, пробовал разные драйверы из интернета, спрашивал на Stack Overflow и подобных форумах. Был даже забавный момент: воткнул USB-адаптер Bluetooth — и он вёл себя точно так же, что окончательно убедило меня: проблема не аппаратная.

Уже не помню по какой логике, но я был уверен, что дело в BIOS, и мне нужно найти для него обновление. Тут начался настоящий квест. Сначала разместил объявление на Profi.ru, обещая золотые горы тому, кто решит проблему. Нашлось несколько энтузиастов, пытавшихся помочь удалённо, но, к сожалению, безуспешно. Потом попался возрастной мужчина с советским техническим образованием — блестящий профиль на Profi.ru, миллион выполненных заказов, ноль жалоб, сплошные пять звёзд. Решил: вот оно, советское качество, наверняка поможет.

Встретились, поговорили, ударили по рукам. Через неделю он звонит и говорит, что установил свою «особую» Windows и прошивку BIOS от другой модели ноутбука — теперь всё работает отлично. Больших надежд я не питал, но удивился, когда на встрече ноут сразу включился нормально. Но это было просто совпадение 😮. После этого я настолько отчаялся, что отправился в LinkedIn и стал добавляться в друзья ко всем, кто разрабатывает ПО в ASUS — нашим, корейцам, американцам. Набрал кучу контактов, все обещали уточнить у коллег и вернуться ко мне, но никто так и не ответил 😶. Техподдержка ASUS тоже себя проявила: в одном из моих постов на Reddit американский сегмент компании попросил прислать им серийник, после чего ушел во тьму, а поддержка Казахстана не давала советов глубже, чем переустановка драйверов. Они еще выдали одно замечание интересное, но чтобы не бежать вперед паровоза, об этом расскажу в следующем посте.

Ах да, я даже нашёл на Avito всех, кто продавал ноутбук моей модели. Писал им и просил подтвердить, есть ли у них такая же проблема. Один человек подтвердил и поддерживал со мной связь — вместе тестировали и строили теории.

Всё было абсолютно тщетно, пока спустя примерно полгода проб я случайно не обнаружил, что после чистой установки Windows, если не обновлять драйверы, всё работает и музыка по Bluetooth не лагает. Казалось бы, можно было заметить и раньше, но дело в том, что драйверы всё равно тянутся автоматически через Центр обновлений.

В общем, я запустил систему без интернета и начал тестировать драйверы по одному, определяя, после какого именно начинается проблема. Оказалось, что проблема появляется после установки драйверов видео от AMD. Я мог бы отказаться от них и сидеть на стандартных, но для работы мне был нужен внешний монитор, так что я оставался в безвыходном положении.

Поиски продолжились. И тут я наткнулся на режим Modern Standby в Windows.

#Windows #bluetooth #drivers #asus #vivobook
🎉2🤯1😱1
Работая разработчиком пользовательских интерфейсов, особенно имея нездоровую дотошность к визуальным деталями, со временем и опытом начинаешь обращать внимание на то, как какие-то вещи, связанные с интерфейсом, делают другие.

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

На прикрепленных гифках есть два примера: один из приложения Т-Инвестиции. Курсор мигает вместе с отсчетом секунд. Едва заметная деталь, но сразу даёт невероятно целостное и крепкое ощущение от интерфейса. Ощущение, что тут точно ничего не сломается, потому что работает "как часы".

Второй пример из поиска в гугле с помощью ИИ. Просто очень красиво и развекательно. Я залип в него. Курсор каждый раз мигает новым цветом из палитры логотипа компании.

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

#ux #ux #frontend #webdev
🔥21🤯1
А вот пример даунгрейда в дизайне.

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

Предлагаю два скрина:
на первом всем привычная кнопка вкл/выкл. в iOS, на втором тот же тумблер, но в iOS 26.1.

Первая мысль - поехал CSS. Растянуло, будто align-items: stretch.

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

#iOS #frontend #webdev
🤯2❤‍🔥1👍1🤝1
Сегодня выбирал себе мышку. Я с 14 лет пользовался только X7 от A4Tech. Сейчас мне 30 лет и я понял, что нужно что-то менять. Остановил свой выбор пока на этой Razer DeathAdder V3 Pro, хоть и логотип у Razer отвратительный, но эта история чуть про другое.

Пока я выбирал себе мышку, я наткнулся на то, что хват мыши, оказывается, тоже различают. Существует три вида: Palm, Claw и Fingertip. Там еще куча подвидов, но базово, как я понял, различают эти три.

Deepseek очень учтиво показал сравнение этих хватов по разным параметрам.

Ну, в общем, я себе выбрал эту мышь под свой врожденный Palm Grip. А какой Grip у вас?

PS. Fingertip хват выглядит чем-то психопатическим.

#mouse #deepseek #razer #x7
2❤‍🔥1🤯1
Внезапно представилась возможность сделать своё расширение для VSCode. Товарищ обратился за советом, хотел узнать, как можно работать с комментариями в .json файлах. Я поделился тем, что знал, и сказал, что есть формат .jsonc, который поддерживает комменты, но парсинг в обычный json он не пройдет. Потолкались идеями, подумали о том, что было бы здорово написать какой-то скрипт, который бы удалял бы комменты, висящие запятые и лишние пустые строки и выдавал это всё в обычный .json.

Сказано - сделано. Скрипт я накидал, но как его встроить в работу? Сразу подумал про магазин расширений в VSCode. По быстрой консультации с DeepSeek выяснил, что нужно сначала сделать учетку на Azure DevOps, там выпустить токен для идентификации своей организации и использовать его в при регистрации в качестве организации в магазине расширений. Практика оказалось гораздо проще: Azure вообще не понадобился. Можно просто создать учетку на сайте магазине расширений и там дропнуть файл с расширением .vsix, после чего он сразу попадает в магазин, валидируется и попадает в индексацию поиска. Azure нужен, чтобы получить упомянутый токен и с его помощью публиковать расширения напрямую из VSCode. Я в рамках своей небольшой задачи обошелся просто загрузкой на сайте.

Сама разработка расширения довольно любопытная. У VSCode есть свои встроенные методы, которыми можно пользоваться.
Например, чтобы добавить команду в палитру команд (ctrl + shift + p), можно воспользоваться методом vscode.commands.registerCommand.
Или, например, чтобы запускать команду на сохранении документа onDidSaveTextDocument, но нужно убедиться, что скрипт стартует вместе с приложением. В package.json в activationEvents добавить "onStartupFinished".

Если кто не знает, VScode написан на Electron. Это фреймворк для написания десктоп приложений на JavaScript, потому мы можем использовать привычный npm при написании расширений.

Само расширение довольно простое: библиотекой strip-json-comments вычищаются комменты, лишние запятые, а потом всё это парсится в JSON, чтобы почистить форматирование.
Посмотреть можно тут: GitHub и VSCode Marketplace.

Есть еще пара идей, как расширить функционал скрипта. Если дойдут руки - поделюсь.

#vscode #Code #javascript #extension #github #json
🤯2👍1🤓1