Жизнь без Канбан досок в Obisidian 💎
После перехода с Notion на Obsidian я начал упрощать всё, что только можно. Например, в Obsidian нет нативной поддержки канбан-досок. Я попробовал плагин Projects для управления постами, которые перенёс из Notion.
Но у него есть проблема: статусы у новых записей почему-то слетают. Возможно я что-то настроил не так, но мне приходится выставлять их по несколько раз, что, мягко говоря, раздражает.
И тут я задумался: а ведь канбан — это просто набор папок.
Для простых случаев этого более чем достаточно. Иногда самое простое решение оказывается самым удобным.
А ещё мне нравится, что в Obsidian всё — это просто файлы и папки. Это даёт огромную свободу для оптимизаций с помощью скриптов. Например, я попросил ChatGPT написать скрипт, который автоматически переносит готовые посты в папку "3.Done".
#obsidian
После перехода с Notion на Obsidian я начал упрощать всё, что только можно. Например, в Obsidian нет нативной поддержки канбан-досок. Я попробовал плагин Projects для управления постами, которые перенёс из Notion.
Но у него есть проблема: статусы у новых записей почему-то слетают. Возможно я что-то настроил не так, но мне приходится выставлять их по несколько раз, что, мягко говоря, раздражает.
И тут я задумался: а ведь канбан — это просто набор папок.
Посты
├── 0.Backlog
├── 1.Next
├── 2.InProgress
└── 3.Done
Для простых случаев этого более чем достаточно. Иногда самое простое решение оказывается самым удобным.
А ещё мне нравится, что в Obsidian всё — это просто файлы и папки. Это даёт огромную свободу для оптимизаций с помощью скриптов. Например, я попросил ChatGPT написать скрипт, который автоматически переносит готовые посты в папку "3.Done".
#!/bin/bash
echo "Moving files with the 'done' tag to the Done folder..."
# Paths to the Posts and Done folders
POSTS_FOLDER="$HOME/Documents/Obsidian Vault/Посты" # Adjust the base path to your Obsidian vault
DONE_FOLDER="$HOME/Documents/Obsidian Vault/Посты/3.Done"
# Ensure the Done folder exists
if [ ! -d "$DONE_FOLDER" ]; then
mkdir -p "$DONE_FOLDER" || {
echo "Failed to create Done folder: $DONE_FOLDER"
exit 1
}
fi
# Check if the Posts folder exists
if [ ! -d "$POSTS_FOLDER" ]; then
echo "Posts folder does not exist: $POSTS_FOLDER"
exit 1
fi
# Process files
echo "Scanning for markdown files with #done tag in $POSTS_FOLDER..."
moved_count=0
for file in "$POSTS_FOLDER"/*.md; do
# Skip if no markdown files are found
if [ ! -e "$file" ]; then
echo "No markdown files found in $POSTS_FOLDER."
break
fi
# Check if the file contains the #done tag
if grep -q "✅ Done" "$file"; then
mv "$file" "$DONE_FOLDER/" && {
echo "Moved: $(basename "$file")"
((moved_count++))
} || {
echo "Failed to move: $(basename "$file")"
}
fi
done
echo "Finished. Total files moved: $moved_count."
#obsidian
Telegram
cherkashin.dev
Notion 👋
Только ленивый не написал, что 9 сентября Notion прекращает работу для российских пользователей. Пару дней назад и у меня появилась желтая плашка, которая говорит “на выход”. Говорят, пользователи платных подписок точно потеряют доступ. Посмотрим…
Только ленивый не написал, что 9 сентября Notion прекращает работу для российских пользователей. Пару дней назад и у меня появилась желтая плашка, которая говорит “на выход”. Говорят, пользователи платных подписок точно потеряют доступ. Посмотрим…
🔥8👍6❤5👎1
Как-то редко я стал что-то рекомендовать посмотреть/почитать, но сегодня пришел не с пустыми руками, а с докладом "Как умение продавать помогает разработчику / Андрей Кузнецов (РБС)".
Советую посмотреть доклад целиком, но мне больше всего понравилось про Эффект маятника ⚖️.
Так сложилось, что порадовать человека гораздо сложнее, чем напугать его. Но если сперва напугать, то порадовать будет гораздо проще.
Это называют эффектом маятника, потому что эмоции сначала сильно качаются в одну сторону (страх), а потом так же сильно летят обратно в другую (радость), делая её ещё ярче.
Пример, который все поймут: засовываешь руку в карман, а телефона нет 🤷♂️, и в панике начинаешь везде его искать. Находишь телефон во внутреннем кармане, и радости нет конца, ничего не изменилось — но вы счастливы.
💬 Как это пригодится в переговорах?
На этих "качелях" 🎢 можно сделать "продажу" — "Мол, смотри как всё плохо, но у нас есть волшебная таблетка 💊". И человек с радостью купит эту таблетку.
Приходите на переговоры и запугиваете начальство:
- Вот у нас есть давно написанный код, и из-за него постоянно появляются баги в продукте. Из-за одного такого бага, от нас ушел клиент.
После того, как все напуганы и в панике грызут ногти - предложите им лекарство:
- Но если бы мы делили время, покрыли бы этот код тестами и провели рефакторинг — всех этих проблем можно было бы избежать.
📌 И ещё несколько моментов из доклада:
- Ключевая часть продаж — переговоры.
- Все мы что-то продаём.
- Старайтесь не называть срок по задачам первым.
- Если кто-то пытается уговорить вас сделать задачу быстрее — не делайте скидку сразу.
- Если делаете скидку — обосновывайте. Мы сделаем задачу за 8, а не за 14 дней, но возможно будут проблемы с производительностью. Или мы не успеем сделать вот эту часть функционала.
- Не используйте круглые цифры. В "не круглые цифры" люди верят охотнее, ведь им кажется, что это результат какого-то глубокого анализа. Например, говорите, что задача займет не 5 дней, а будет сделана к 12 часам в четверг.
- Никогда никого не перебивайте.
- Вежливо отказывайте собеседнику. Понимать - не значит соглашаться.
#softskills #fridayreading
Советую посмотреть доклад целиком, но мне больше всего понравилось про Эффект маятника ⚖️.
Так сложилось, что порадовать человека гораздо сложнее, чем напугать его. Но если сперва напугать, то порадовать будет гораздо проще.
Это называют эффектом маятника, потому что эмоции сначала сильно качаются в одну сторону (страх), а потом так же сильно летят обратно в другую (радость), делая её ещё ярче.
Пример, который все поймут: засовываешь руку в карман, а телефона нет 🤷♂️, и в панике начинаешь везде его искать. Находишь телефон во внутреннем кармане, и радости нет конца, ничего не изменилось — но вы счастливы.
💬 Как это пригодится в переговорах?
На этих "качелях" 🎢 можно сделать "продажу" — "Мол, смотри как всё плохо, но у нас есть волшебная таблетка 💊". И человек с радостью купит эту таблетку.
Приходите на переговоры и запугиваете начальство:
- Вот у нас есть давно написанный код, и из-за него постоянно появляются баги в продукте. Из-за одного такого бага, от нас ушел клиент.
После того, как все напуганы и в панике грызут ногти - предложите им лекарство:
- Но если бы мы делили время, покрыли бы этот код тестами и провели рефакторинг — всех этих проблем можно было бы избежать.
📌 И ещё несколько моментов из доклада:
- Ключевая часть продаж — переговоры.
- Все мы что-то продаём.
- Старайтесь не называть срок по задачам первым.
- Если кто-то пытается уговорить вас сделать задачу быстрее — не делайте скидку сразу.
- Если делаете скидку — обосновывайте. Мы сделаем задачу за 8, а не за 14 дней, но возможно будут проблемы с производительностью. Или мы не успеем сделать вот эту часть функционала.
- Не используйте круглые цифры. В "не круглые цифры" люди верят охотнее, ведь им кажется, что это результат какого-то глубокого анализа. Например, говорите, что задача займет не 5 дней, а будет сделана к 12 часам в четверг.
- Никогда никого не перебивайте.
- Вежливо отказывайте собеседнику. Понимать - не значит соглашаться.
#softskills #fridayreading
YouTube
Как умение продавать помогает разработчику / Андрей Кузнецов (РБС)
Профессиональная конференция фронтенд-разработчиков FrontendConf 2023
Презентация и тезисы:
https://frontendconf.ru/moscow/2023/abstracts/10423
В жизни каждого разработчика наступает тот самый момент "X"...
... когда его зовут на встречу с клиентом, заказчиком…
Презентация и тезисы:
https://frontendconf.ru/moscow/2023/abstracts/10423
В жизни каждого разработчика наступает тот самый момент "X"...
... когда его зовут на встречу с клиентом, заказчиком…
👍9❤7🔥2💩1
✨ViewTransitionAPI view-transition-name
Прочитал статью "Same-document view transitions for single-page applications" и решил запилить свою демку с открытием приложения как на айфоне, используя viewTransitionAPI.
Анимация реализуется с помощью CSS свойства
⚠️ Значение
Но есть нюанс, на время перехода можно указать
В реакте, пока только появляется экспериментальная поддержка ViewTransition, поэтому придётся использовать
Код перехода выглядит так:
Во время анимации появляется дерево псевдо-элементов.
Так мы можем выставить кастомную анимацию:
Отлаживать анимацию, можно с помощью панели Animations:
⚙️ > More tools > Animations
📂 Исходники здесь
🌐 Демка здесь
Ещё по теме
- Revealed: React's experimental animations API
- Демка с расстановкой футболистов на футбольном поле
- React flushSync
#frontend@cherkashindev
Прочитал статью "Same-document view transitions for single-page applications" и решил запилить свою демку с открытием приложения как на айфоне, используя viewTransitionAPI.
Анимация реализуется с помощью CSS свойства
view-transition-name. Так мы указываем, что анимация для этого элемента должна происходить отдельно.⚠️ Значение
view-transition-name должно быть уникальным, если у разных элементов одно и то же значение view-transition-name, анимация скипнется и появится ошибка в консоли. Но есть нюанс, на время перехода можно указать
view-transition-name разным элементам. Так мы скажем браузеру, что один элемент должен анимироваться в другой. В реакте, пока только появляется экспериментальная поддержка ViewTransition, поэтому придётся использовать
flushSync, чтобы запустить рендер синхронно, что не есть гуд для производительности. Код перехода выглядит так:
const handleAppOpened = (e: React.MouseEvent<HTMLButtonElement>, appName: string) => {
openedApp.current = (e.target as HTMLButtonElement);
// выставляем иконке такой же viewTransitionName как и для экрана приложения
openedApp.current.style.viewTransitionName = 'app-content';
// запускаем переход
document.startViewTransition(() => {
if (openedApp.current?.style) {
// сбрасываем viewTransitionName для иконки
openedApp.current.style.viewTransitionName = '';
}
// синхронный рендер
flushSync(() => setApp(appName));
})
};
Во время анимации появляется дерево псевдо-элементов.
::view-transition
::view-transition-group(root)
::view-transition-group(app-content)
::view-transition-old(app-content)
::view-transition-new(app-content)
Так мы можем выставить кастомную анимацию:
::view-transition-new(app-content) {
animation: 300ms ease;
}
::view-transition-old(app-content) {
animation: 300ms ease reverse;
}
Отлаживать анимацию, можно с помощью панели Animations:
⚙️ > More tools > Animations
📂 Исходники здесь
🌐 Демка здесь
Ещё по теме
- Revealed: React's experimental animations API
- Демка с расстановкой футболистов на футбольном поле
- React flushSync
#frontend@cherkashindev
🔥12👍4❤1
Иногда бывает, засидишься за работой, пытаясь доделать интересную (или не очень) задачу. Крутишь её так и эдак 🤔, но ничего не выходит.
Потом смотришь на часы— пора заканчивать, а задача так и не сделана. Опускаешь крышку ноута, но в голове она продолжает крутиться.
А как же это решить? 🤯 Мысленно перебираешь все возможные варианты решения. А почему же это не сработало? А может быть, вот так сделать? А если тут поле добавить? А есть ли у нас вообще эти данные? А что, если сделать дополнительный запрос на сервер? А потом... а потом...
А потом наступает тревожность, и нормально уснуть уже не получается.
У вас бывает такое? 🤷♂️
Но всё же чувство, когда ты всё-таки разобрался и всё получилось - бесценно.
@cherkashindev
#about_me
Потом смотришь на часы— пора заканчивать, а задача так и не сделана. Опускаешь крышку ноута, но в голове она продолжает крутиться.
А как же это решить? 🤯 Мысленно перебираешь все возможные варианты решения. А почему же это не сработало? А может быть, вот так сделать? А если тут поле добавить? А есть ли у нас вообще эти данные? А что, если сделать дополнительный запрос на сервер? А потом... а потом...
А потом наступает тревожность, и нормально уснуть уже не получается.
У вас бывает такое? 🤷♂️
Но всё же чувство, когда ты всё-таки разобрался и всё получилось - бесценно.
@cherkashindev
#about_me
👍22😢5❤1🤓1
Запоминаем, как правильно оставлять комментарии при код-ревью
- не 🙅♂️ "опять ты накопипастил, ну сколько можно?!?!?!"
- а ☝️ "Consider refining the implementation to make better use of reusable code"
С началом продуктивной рабочей недели 👋
#meme #codereview
- не 🙅♂️ "опять ты накопипастил, ну сколько можно?!?!?!"
- а ☝️ "Consider refining the implementation to make better use of reusable code"
С началом продуктивной рабочей недели 👋
#meme #codereview
😁11❤2
🤝 Как подружить React.lazy с дефолтным экспортом
У нас в проекте используются только именованные экспорты. Почему — писал здесь.
Но
Чтобы решить проблему старая дока реакта предлагает создать промежуточный файл, который ре-экспортирует компонент с дефолтным экспортом.
Но как по мне — совсем не красиво.
Но что такое дефолтный экспорт? Когда мы используем динамическую загрузку модулей с помощью
То есть если мы экспортируем компонент
#javascript #react
У нас в проекте используются только именованные экспорты. Почему — писал здесь.
Но
React.lazy работает только с дефолтными экспортами, и раньше нам приходилось успокаивать eslint, приговаривая // eslint-disable-next-line import/no-default-export.Чтобы решить проблему старая дока реакта предлагает создать промежуточный файл, который ре-экспортирует компонент с дефолтным экспортом.
export { MyComponent as default } from "./ManyComponents.js";
Но как по мне — совсем не красиво.
Но что такое дефолтный экспорт? Когда мы используем динамическую загрузку модулей с помощью
import, в промисе получим модуль. А дефолтный экспорт будет храниться в поле default, именованные экспорты будут храниться в соответствующих полях модуля. То есть если мы экспортируем компонент
Markdown с помощью именованного экспорта, то мы сможем получить к нему доступ через одноимённое свойство Markdown на загруженном модуле.
import React, { lazy, Suspense } from "react";
import { MySpinner } from "@private/design-system";
const MarkdownPreview = lazy(async () => {
const module = await import('./myModule');
// преобразуем именованный экспорт в дефолтный
return { default: module.Markdown };
});
export const LazyMarkdownPreview = () => {
return (
<Suspense fallback={MySpinner}>
<MarkdownPreview />
</Suspense>
);
};
#javascript #react
👍14❤3🔥2
Ключевое слово infer
На тайпскрипте я пишу давно, но какие-то сложные типы практически не пишу.
Про
В итоге разобрался только во время доклада на Я 💛 Фронтенд — Антология полезностей в TypeScript .
Условные типы
Простой пример типа
Если вы знаете английский, то поняли, что тут пойдёт речь про вывод типов. Вообще, про
Теперь попробуем решить задачу обратную
Тут мы просто заменяемпеременную тип с именем
Также
Ещё по теме:
- Вывод типов в TypeScript с использованием конструкции as const и ключевого слова infer
- TypeScript: infer и conditional types. Продвинутый TS на примерах
#typescript
На тайпскрипте я пишу давно, но какие-то сложные типы практически не пишу.
Про
infer я слышал, и много месяцев откладывал пятиминутное прочтение статьи, чтобы разобраться, как он работает 😄. В итоге разобрался только во время доклада на Я 💛 Фронтенд — Антология полезностей в TypeScript .
Условные типы
infer неотрывно связан с условными типами, поэтому начнём с них. По сути это тернарный оператор, который применяется не к переменным, а к типам. Простой пример типа
ToArray. Если мы передали тип-массив — условие extends any[] выполняется и возвращается тот же тип T, иначе создаём массив типа — T[]
type ToArray<T> = T extends any[] ? T : T[];
type NumberArray = ToArray<number>; // number[]
type StringArray = ToArray<string[]>; // string[]
inferЕсли вы знаете английский, то поняли, что тут пойдёт речь про вывод типов. Вообще, про
infer удобно думать как об объявлении переменной, где тип будет выведен автоматически. То есть, TypeScript думает, можно ли что-то подставить в наше условие, чтобы оно выполнялось, если можно — выводит тип и кладёт в переменную.Теперь попробуем решить задачу обратную
ToArray — будем определять тип элемента в массиве.
type ArrayItem<T> = T extends (infer Item)[] ? Item : T;
type NumberItem = ArrayItem<number[]> // number
type StringItem = ArrayItem<string>; // string
Тут мы просто заменяем
any на infer Item, что означает: "выведи тип" и положи его в Item. И дальше просто используем Item.Также
infer работает с шаблонно-литеральными типами, вот так, например, можно вывести имя БЭМ-блока по элементу или модификатору
type BemBlock<T extends string> = T extends `${infer Block}__${string}` ?
Block :
T extends `${infer Block}__${string}--${string}` ? Block : never
type Block1 = BemBlock<"login-page__form"> // login-page
type Block2 = BemBlock<"login-page__user--active"> // login-page
Ещё по теме:
- Вывод типов в TypeScript с использованием конструкции as const и ключевого слова infer
- TypeScript: infer и conditional types. Продвинутый TS на примерах
#typescript
YouTube
Я 💛 Фронтенд 2025
Главная конференция Яндекса для фронтенд сообщества. Поговорим о любви к фронтенду и не только.
Программа конференции: https://events.yandex.ru/events/ya-love-frontend-2025
Присоединяйтесь к чату https://t.me/yalovefrontend.
Вопросы спикерам можно задавать…
Программа конференции: https://events.yandex.ru/events/ya-love-frontend-2025
Присоединяйтесь к чату https://t.me/yalovefrontend.
Вопросы спикерам можно задавать…
❤14👍8🔥3
Хвастаюсь.
Мне сегодня жена подарила такую крутую уточку, чтобы было с кем обсудить рабочие задачки.
И кабель-канал, чтобы робот-пылесос не нападал на провода.
Похоже пора заморочиться над рабочим столом, чтобы уточке не было грустно.
#about_me
Мне сегодня жена подарила такую крутую уточку, чтобы было с кем обсудить рабочие задачки.
И кабель-канал, чтобы робот-пылесос не нападал на провода.
Похоже пора заморочиться над рабочим столом, чтобы уточке не было грустно.
#about_me
👍18❤6👨💻1
Ежегодно у нас в компании каждый сотрудник получает на почту имейл, где указано, что в течение пары недель ему нужно пройти очередное обучение по безопасности, в котором в сотый раз расскажут что такое фишинг и тейлгейтинг. Насколько помню, это необходимо для прохождения аудита SOC (но это не точно).
Помню, лет шесть назад я плохо представлял, что такое фишинг. Но в один прекрасный летний день я получил имейл от владельца компании. Уже не помню, что именно там было, но вроде как он просил мой номер телефона, чтобы со мной связаться.
Я подумал: что за чушь!? Он в штатах, а я сижу в Российской деревне, прячусь от ковида. Мы никогда не разговариваем по телефону, да и на английском я говорю с трудом 😅. В общем, я проигнорил сообщение, а уже потом узнал, что это был тот самый фишинговый имейл.
Думаю, насколько бы эти тренинги не казались кому-то бесполезными, они нужны, особенно для новых сотрудников.
Сейчас время от времени у нас проводятся "учения", с рассылкой фишинговых имейлов. И тех, кто кликнет на "вредоносную" ссылку, вешаю на доску позора. Шутка 😄.
#job
Помню, лет шесть назад я плохо представлял, что такое фишинг. Но в один прекрасный летний день я получил имейл от владельца компании. Уже не помню, что именно там было, но вроде как он просил мой номер телефона, чтобы со мной связаться.
Я подумал: что за чушь!? Он в штатах, а я сижу в Российской деревне, прячусь от ковида. Мы никогда не разговариваем по телефону, да и на английском я говорю с трудом 😅. В общем, я проигнорил сообщение, а уже потом узнал, что это был тот самый фишинговый имейл.
Думаю, насколько бы эти тренинги не казались кому-то бесполезными, они нужны, особенно для новых сотрудников.
Сейчас время от времени у нас проводятся "учения", с рассылкой фишинговых имейлов. И тех, кто кликнет на "вредоносную" ссылку, вешаю на доску позора. Шутка 😄.
#job
❤10
Сегодня телеграм-каналу исполнилось 4 года. 🎉
Ещё с универа я хотел завести блог. На старом ноуте, даже написано несколько статей из далёкого 2017 года, которые никто никогда не увидит (и слава богу 🤣).
Помню, как написал первую статью на Хабр. Потом мы с друзьями пошли смотреть чемпионат мира 2018 в местный бар, и я с трясущимися руками проверял, как мне набрасывают комментарии 😄.
Помню как гуглил, как создать телеграм-канал и настроить @ControllerBot, чтобы не опубликовать ничего лишнего. Помню, как стрёмно было писать посты, хотя в канале было всего 16 человек. Спустя 4 года, конечно, стало полегче. 😅
Я завёл канал, когда почувствовал стагнацию, и с тех пор он подстёгивает меня изучать что-то новое и не стоять на месте 📈. Раньше было сложно придумать о чём бы написать, а теперь у меня есть бэклог с множеством идей.
Часто в суете мы обо всём забываем, после каждой закрытой задачи просто берёмся за следующую. Но иногда важно остановиться, оглянуться назад и вспомнить, что было сделано и какой путь был пройден.
Спасибо всем вам, что читаете — это очень мотивирует не бросать! 🎉
#about_me
Ещё с универа я хотел завести блог. На старом ноуте, даже написано несколько статей из далёкого 2017 года, которые никто никогда не увидит (и слава богу 🤣).
Помню, как написал первую статью на Хабр. Потом мы с друзьями пошли смотреть чемпионат мира 2018 в местный бар, и я с трясущимися руками проверял, как мне набрасывают комментарии 😄.
Помню как гуглил, как создать телеграм-канал и настроить @ControllerBot, чтобы не опубликовать ничего лишнего. Помню, как стрёмно было писать посты, хотя в канале было всего 16 человек. Спустя 4 года, конечно, стало полегче. 😅
Я завёл канал, когда почувствовал стагнацию, и с тех пор он подстёгивает меня изучать что-то новое и не стоять на месте 📈. Раньше было сложно придумать о чём бы написать, а теперь у меня есть бэклог с множеством идей.
Часто в суете мы обо всём забываем, после каждой закрытой задачи просто берёмся за следующую. Но иногда важно остановиться, оглянуться назад и вспомнить, что было сделано и какой путь был пройден.
Спасибо всем вам, что читаете — это очень мотивирует не бросать! 🎉
#about_me
1❤30👍5👏5
Сколько времени у вас ушло найти/поменять работу в прошлом году?
Anonymous Poll
10%
А я и не искал, меня самого нашли
12%
Меньше месяца
13%
1-3 месяца
6%
3-6 месяцев
2%
6-9 месяцев
3%
9-12 месяцев
7%
Так и не смог найти работу
37%
Я не искали работу
11%
Моя компания — семья, я их не предам
Мы в команде раздумываем, стоит ли наконец поменять TypeScript target с ES5 на ES6. IE 11 мы не поддерживаем уже около трёх лет. В связи с этим — опрос.
В какую версию ECMAScript вы транспилируете свой код?
В какую версию ECMAScript вы транспилируете свой код?
Anonymous Poll
2%
Поддерживаем IE 11, так что ES5
12%
IE не поддерживаем, но используем ES5 по старинке
33%
Долой IE, у нас ES6
30%
> ES6
23%
Без понятия
🗄️ Примеры использования IndexedDB
Я потихоньку начал разбираться как работает IndexedDb и нашел пару хороших примеров использования.
Я давно задумывался, как же excalidraw хранит всё, что я нарисовал, ведь картинки точно не влезут в localStorage. Ожидаемо, что для этого используется IndexedDB.
В отличии от localStorage, в котором доступно всего 5Mb, в indexedDb доступное пространство исчисляется гигабайтами.
VK также активно использует IndexedDb, например, чтобы хранить данные об историях.
Расскажите, а вы как-нибудь используете IndexedDb в своих приложениях?
#frontend #indexedDb
Я потихоньку начал разбираться как работает IndexedDb и нашел пару хороших примеров использования.
Я давно задумывался, как же excalidraw хранит всё, что я нарисовал, ведь картинки точно не влезут в localStorage. Ожидаемо, что для этого используется IndexedDB.
В отличии от localStorage, в котором доступно всего 5Mb, в indexedDb доступное пространство исчисляется гигабайтами.
VK также активно использует IndexedDb, например, чтобы хранить данные об историях.
Расскажите, а вы как-нибудь используете IndexedDb в своих приложениях?
#frontend #indexedDb
👍18🔥2
И вот несмотря на утреннюю атаку беспилотников и задержку рейса, несмотря на рамаданские пробки, всего каких-то 23 часа путешествия и мы в Дубае 🎉.
Расскажите, куда здесь обязательно стоит сходить, а куда точно нет?
И давайте договоримся, вы мне бустите канал и спокойно работаете, а я не хвастаюсь фотками из отпуска 😄.
P.S. завидую москвичам, просто взял и поехал в аэропорт и не нужно искать подходящий стыковочный поезд.
#vacation #dubai #about_me #travelling
Расскажите, куда здесь обязательно стоит сходить, а куда точно нет?
И давайте договоримся, вы мне бустите канал и спокойно работаете, а я не хвастаюсь фотками из отпуска 😄.
#vacation #dubai #about_me #travelling
👍8❤3👎2