Книжки
Общеполезное
The Pragmatic Programmer by Andrew Hunt and David Thomas
Code Complete by Steve McConnell
Coding
Clean Code by Robert C. Martin
Refactoring by Martin Fowler
Software Architecture
Designing Data-Intensive Applications by Martin Kleppmann
Object-Oriented Analysis and Design with Applications by Grady Booch
Design Patterns
Design Patterns by Eric Gamma and Others
Domain-Driven Design by Eric Evans
Data Structures and Algorithms
Introduction to Algorithms by Cormen, Leiserson, Rivest, and Stein
Cracking the Coding Interview by Gayle Laakmann McDowell
#learning #book
Общеполезное
The Pragmatic Programmer by Andrew Hunt and David Thomas
Code Complete by Steve McConnell
Coding
Clean Code by Robert C. Martin
Refactoring by Martin Fowler
Software Architecture
Designing Data-Intensive Applications by Martin Kleppmann
Object-Oriented Analysis and Design with Applications by Grady Booch
Design Patterns
Design Patterns by Eric Gamma and Others
Domain-Driven Design by Eric Evans
Data Structures and Algorithms
Introduction to Algorithms by Cormen, Leiserson, Rivest, and Stein
Cracking the Coding Interview by Gayle Laakmann McDowell
#learning #book
This media is not supported in your browser
VIEW IN TELEGRAM
Дожили
В
Теперь сайт Аэроэкспреса пофиксят...
#chrome #css
В
Chrome 135
появилась возможность стилизовать нативный <select>
Теперь сайт Аэроэкспреса пофиксят...
#chrome #css
В
Однако полной замены
Но для ванильных случаев это полезное нововведение
#css
CSS
есть @scope
функция, ограничивающая область применения стилей:<template>
<div class="box">
<button class="button">Click me</button>
</div>
</template>
<style>
@scope (.box) {
.button {
color: red;
}
}
</style>
Однако полной замены
Vue scoped
она не может дать. Например, потому, что если компонент выше вывести списком, то во Vue
у каждого будет свой data
атрибут и своя область видимости стилей, а у @scope
всё смешаетсяНо для ванильных случаев это полезное нововведение
#css
Добавил в Argus распознавание рукописного текста, а так же других сложных картинок (надо в подписи к картинке отправлять символ "+" для перехода в этот режим)
Для этого поэкспериментировал с 18 бесплатными
В комментариях люди поделились интересными ссылками для облегчения жизни
https://github.com/marketplace/models/azure-openai/gpt-4o-mini/playground - бесплатный
https://www.comss.ru/page.php?id=7315 - обход региональных блокировок и не только
#argus #ocr #tgbot
Для этого поэкспериментировал с 18 бесплатными
LLM
моделями для выбора лучшей, тут отчетВ комментариях люди поделились интересными ссылками для облегчения жизни
AI
энтузиастов:https://github.com/marketplace/models/azure-openai/gpt-4o-mini/playground - бесплатный
gpt-4o
прям на GitHub
https://www.comss.ru/page.php?id=7315 - обход региональных блокировок и не только
#argus #ocr #tgbot
Глубокое клонирование реактивных объектов в Vue 3
3 рабочих способа
1. Комбинация
2. Ручное глубокое копирование
3. Библиотечные решения
#tip #reactivity
Vue 3
использует Proxy
для реактивности, что создает проблемы при попытке клонировать объекты. Стандартные методы работают не так, как ожидается:const state = reactive({ user: { name: "Al" } });
// Проблемы:
const badCopy1 = { ...state }; // сохраняет Proxy-ссылки
const badCopy2 = JSON.parse(JSON.stringify(state)); // теряет методы и Proxy
3 рабочих способа
1. Комбинация
toRaw
+ structuredClone
import { toRaw } from 'vue';
const original = reactive({ data: 123 });
const copy = structuredClone(toRaw(original));
2. Ручное глубокое копирование
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
const clone = Array.isArray(obj) ? [] : {};
for (const key in obj) {
clone[key] = deepClone(obj[key]);
}
return clone;
}
const copy = reactive(deepClone(toRaw(original)));
3. Библиотечные решения
import { cloneDeep } from 'lodash-es';
const copy = reactive(cloneDeep(toRaw(obj)));
#tip #reactivity
This media is not supported in your browser
VIEW IN TELEGRAM
Хорошая библиотека
Долго мучился с расположением при динамично меняющемся таргет элементе - все как-то через одно место криво работало. Решил поставить
Немного радует, что довольно часто обновляется и фиксят баги.
P.S. Ререндеринг через `:key` - плохая практика. Последний вариант.
#lib #arkui
Ark-ui
, но с особенностями. Особенно у "выпадашки" HoverCard
(для меню которая)Долго мучился с расположением при динамично меняющемся таргет элементе - все как-то через одно место криво работало. Решил поставить
:key
на HoverCard
и инкрементить его при апдейтах - и всё сразу заработало как надо. Ну, ё-моё...Немного радует, что довольно часто обновляется и фиксят баги.
P.S. Ререндеринг через `:key` - плохая практика. Последний вариант.
#lib #arkui
Статья о современном минимальном наборе фавиконок для сайта
#webdev
<link rel="icon" href="/favicon.ico" sizes="any"><!-- 32×32 -->
<link rel="icon" href="/icon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="/apple-touch-icon.png"><!-- 180×180 -->
<link rel="manifest" href="/manifest.webmanifest">
// manifest.webmanifest
{
"icons": [
{ "src": "/icon-192.png", "type": "image/png", "sizes": "192x192" },
{ "src": "/icon-512.png", "type": "image/png", "sizes": "512x512" }
]
}
#webdev
Хабр
Как создавать иконки сайтов в 2022 году — всё о favicon
Эта статья перевод англоязычной статьи Андрея Ситника из блога Злых марсиан . Пришло время переосмыслить то, как мы создаем набор иконок для современных браузеров, и остановить безумные генераторы....
Почему неконтролируемого использования
1. Нарушение реактивного потока
2. Плохая читаемость
Цепочки
Плохо для рефакторинга - логика, разбросанная по
3. Производительность
Неотписанные
#reactivity #watch
watch
лучше избегать?1. Нарушение реактивного потока
watch
часто скрывает логику реактивности. Например, отслеживание изменения переменной для вызова побочного эффекта (fetch
) делает поток данных менее предсказуемым, особенно если эффекты затрагивают несколько компонентов.Vue
поощряет однонаправленную реактивность (данные -> шаблон). watch
часто используется для обратной связи (данные -> данные), что усложняет отладку.2. Плохая читаемость
Цепочки
watch
внутри компонента превращаются в плохо понимаемый в спагетти-код.Плохо для рефакторинга - логика, разбросанная по
watch
, сложно переносится в composables
.3. Производительность
watch
с deep: true
может создать нагрузку при отслеживании больших объектов или массивов.watch
часто дублирует логику, которую можно выразить через computed
. Вычисляемые свойства кешируются и эффективнее.Неотписанные
watch
в динамических компонентах (например, внутри v-if
) могут накапливаться и вызывать утечки памяти.watch
— это аварийный выход для случаев, когда декларативных подходов недостаточно. Если возможно, нужно старайться решить задачу через computed
, props
или события.#reactivity #watch