Telegram Web Link
💡7 обязательных стратегий для масштабирования вашей базы данных.

1 - Индексация:
Проверьте шаблоны запросов вашего приложения и создайте подходящие индексы.

2 - Материализованные представления:
Предварительно вычислите результаты сложных запросов и сохраните их для быстрого доступа.

3 - Денормализация:
Уменьшите количество сложных соединений (join), чтобы улучшить производительность запросов.

4 - Вертикальное масштабирование:
Увеличьте мощность вашего сервера базы данных, добавив больше ЦП, оперативной памяти или хранилища.

5 - Кэширование:
Сохраните часто запрашиваемые данные в более быстром слое хранения, чтобы снизить нагрузку на базу данных.

6 - Репликация:
Создайте реплики вашей основной базы данных на разных серверах для масштабирования чтений.

7 - Шардинг:
Разделите таблицы базы данных на более мелкие части и распределите их по серверам. Используется для масштабирования как записей, так и чтений.

#database

👉 @Bookflow
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82
Подборка Telegram каналов для программистов

https://www.tg-me.com/lifeproger Жизнь программиста. Авторский канал.
https://www.tg-me.com/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
https://www.tg-me.com/rabota1C_rus 1С Работа

Системное администрирование 📌
https://www.tg-me.com/sysadmin_girl Девочка Сисадмин
https://www.tg-me.com/srv_admin_linux Админские угодья
https://www.tg-me.com/linux_srv Типичный Сисадмин

https://www.tg-me.com/linux_odmin Linux: Системный администратор
https://www.tg-me.com/devops_star DevOps Star (Звезда Девопса)
https://www.tg-me.com/i_linux Системный администратор
https://www.tg-me.com/linuxchmod Linux
https://www.tg-me.com/sys_adminos Системный Администратор
https://www.tg-me.com/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://www.tg-me.com/sysadminof Книги для админов, полезные материалы
https://www.tg-me.com/i_odmin Все для системного администратора
https://www.tg-me.com/i_odmin_book Библиотека Системного Администратора
https://www.tg-me.com/i_odmin_chat Чат системных администраторов
https://www.tg-me.com/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://www.tg-me.com/sysadminoff Новости Линукс Linux

1C разработка 📌
https://www.tg-me.com/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С

Программирование C++📌
https://www.tg-me.com/cpp_lib Библиотека C/C++ разработчика
https://www.tg-me.com/cpp_knigi Книги для программистов C/C++
https://www.tg-me.com/cpp_geek Учим C/C++ на примерах

Программирование Python 📌
https://www.tg-me.com/pythonofff Python академия. Учи Python быстро и легко🐍
https://www.tg-me.com/BookPython Библиотека Python разработчика
https://www.tg-me.com/python_real Python подборки на русском и английском
https://www.tg-me.com/python_360 Книги по Python Rus

Java разработка 📌
https://www.tg-me.com/BookJava Библиотека Java разработчика
https://www.tg-me.com/java_360 Книги по Java Rus
https://www.tg-me.com/java_geek Учим Java на примерах

GitHub Сообщество 📌
https://www.tg-me.com/Githublib Интересное из GitHub

Базы данных (Data Base) 📌
https://www.tg-me.com/database_info Все про базы данных

Мобильная разработка: iOS, Android 📌
https://www.tg-me.com/developer_mobila Мобильная разработка
https://www.tg-me.com/kotlin_lib Подборки полезного материала по Kotlin

Фронтенд разработка 📌
https://www.tg-me.com/frontend_1 Подборки для frontend разработчиков
https://www.tg-me.com/frontend_sovet Frontend советы, примеры и практика!
https://www.tg-me.com/React_lib Подборки по React js и все что с ним связано

Разработка игр 📌
https://www.tg-me.com/game_devv Все о разработке игр

Библиотеки 📌
https://www.tg-me.com/book_for_dev Книги для программистов Rus
https://www.tg-me.com/programmist_of Книги по программированию
https://www.tg-me.com/proglb Библиотека программиста
https://www.tg-me.com/bfbook Книги для программистов
https://www.tg-me.com/books_reserv Книги для программистов

БигДата, машинное обучение 📌
https://www.tg-me.com/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning

Программирование 📌
https://www.tg-me.com/bookflow Лекции, видеоуроки, доклады с IT конференций
https://www.tg-me.com/coddy_academy Полезные советы по программированию
https://www.tg-me.com/rust_lib Полезный контент по программированию на Rust
https://www.tg-me.com/golang_lib Библиотека Go (Golang) разработчика
https://www.tg-me.com/itmozg Программисты, дизайнеры, новости из мира IT
https://www.tg-me.com/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻
https://www.tg-me.com/nodejs_lib Подборки по Node js и все что с ним связано
https://www.tg-me.com/ruby_lib Библиотека Ruby программиста

QA, тестирование 📌
https://www.tg-me.com/testlab_qa Библиотека тестировщика

Шутки программистов 📌
https://www.tg-me.com/itumor Шутки программистов

Защита, взлом, безопасность 📌
https://www.tg-me.com/thehaking Канал о кибербезопасности
https://www.tg-me.com/xakep_1 Статьи из "Хакера"

Книги, статьи для дизайнеров 📌
https://www.tg-me.com/ux_web Статьи, книги для дизайнеров

Английский 📌
https://www.tg-me.com/UchuEnglish Английский с нуля

Математика 📌
https://www.tg-me.com/Pomatematike Канал по математике
https://www.tg-me.com/phis_mat Обучающие видео, книги по Физике и Математике

Excel лайфхак📌
https://www.tg-me.com/Excel_lifehack

https://www.tg-me.com/tikon_1 Новости высоких технологий, науки и техники💡
https://www.tg-me.com/mir_teh Мир технологий (Technology World)

Вакансии 📌
https://www.tg-me.com/sysadmin_rabota Системный Администратор
https://www.tg-me.com/progjob Вакансии в IT
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
FTXUI

Простая кроссплатформенная библиотека C++ для пользовательских интерфейсов на базе терминала!

• Функциональный стиль
• Простой и элегантный синтаксис
• Создаваемые консольные UI поддерживают навигацию с помощью клавиатуры и мыши
• Поддержка UTF8
• Поддержка анимации
• Поддержка рисования
• Нет зависимостей
• Кроссплатформенность: Linux/MacOS, WebAssembly, Windows


https://github.com/ArthurSonzogni/FTXUI

#cpp

👉 @Bookflow
👍4
CGAL

Библиотека алгоритмов вычислительной геометрии (CGAL) - это библиотека C++, цель которой - обеспечить легкий доступ к эффективным и надежным алгоритмам вычислительной геометрии.

https://github.com/CGAL/cgal


#cpp

👉 @Bookflow
👍2
🐍Пишете на Python, но с веб-разработкой пока не срослось. Попробовали Django — слишком громоздко. Flask — вроде проще, но чего-то не хватает. В итоге на бэкенде сплошной хаос, а продакшену страшно доверить даже тестовый сервер.

FastAPI решает эти проблемы. Он быстрый, удобный и дружит с асинхронностью. Хотите понять, как писать API и рендерить страницы без боли? Приходите на открытый урок «Знакомство с веб-разработкой на FastAPI» 27 февраля в 20:00 (мск).

Мы разберём:
- Как работает FastAPI и почему он быстрее Flask
- Как писать JSON API и рендерить HTML в одном приложении
- Как подружить FastAPI с Jinja2 и обрабатывать формы

Спикер Сурен Хоренян — бэкенд-разработчик на Python, open-source contributor, руководитель команды в ВК Рекламе.

Участники получат скидку на большое обучение «Python Developer. Basic».

👉Регистрируйтесь на вебинар: https://vk.cc/cIVW1N

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍1
Оптимизация C++ кода: Inline-функции и их влияние на производительность 🚀

Сегодня разберём интересную тему — inline-функции в C++ и их влияние на производительность. Когда стоит их использовать, а когда лучше избегать?

📌 Что такое inline-функция?
Ключевое слово inline говорит компилятору, что вызовы функции следует встраивать в код вместо выполнения обычного вызова. Это избавляет от накладных расходов на вызов, но увеличивает размер бинарного кода.

Пример:

inline int square(int x) {
return x * x;
}

int main() {
int a = square(5); // Компилятор заменит на `int a = 5 * 5;`
}


Когда стоит использовать inline?
🔹 Маленькие, часто вызываемые функции (например, геттеры в классах).
🔹 Критичные по скорости участки кода, где важна минимизация затрат на вызов.
🔹 Шаблонные функции (они и так inline, если определены в заголовочном файле).

Когда inline вреден?
⚠️ Большие функции – встраивание приводит к раздуванию кода.
⚠️ Частые изменения кода в заголовочных файлах (inline-функции обычно в .h) вызывают перекомпиляцию.
⚠️ Злоупотребление – если всё сделать inline, можно потерять кэш-память CPU из-за увеличенного размера бинарного файла.

🔥 Итог
Не стоит inline-ить всё подряд. Если сомневаетесь – доверяйте компилятору. Современные компиляторы сами умеют решать, какие функции выгодно встраивать.

#cpp

👉 @Bookflow
👍5
This media is not supported in your browser
VIEW IN TELEGRAM
Теперь в CSS появилась функция Math.pow() от JavaScript, и вы можете генерировать плавные изменения масштаба шрифтов в CSS для размеров области просмотра/контейнера 👀

:where(dd) {
--min: calc(17 * pow(1.2, var(--lvl, 0)));
font-size: clamp(var(--min), var(--fluid), var(--max));
}
dd:nth-of-type(2) { --lvl: 2; }


#frontend

👉 @Bookflow
👍7
📌 Декоратор в Java: Как добавить логику без изменения кода?

🔹 Когда использовать?
- Когда нужно добавить поведение к объекту динамически.
- Когда нельзя или не хочется менять исходный код класса.
- Когда необходимо сохранить принцип открытости/закрытости (OCP из SOLID).

🔹 Как это работает?
Декоратор — это обёртка вокруг базового объекта. Он реализует тот же интерфейс, но внутри может добавлять новую логику.

Пример использования
Допустим, у нас есть базовый интерфейс Notifier, который отправляет уведомления:


public interface Notifier {
void send(String message);
}


И его простая реализация:


public class BasicNotifier implements Notifier {
@Override
public void send(String message) {
System.out.println("Отправка сообщения: " + message);
}
}


Теперь добавим декораторы, которые расширяют функциональность:
1️⃣ Декоратор для отправки в Slack:

public class SlackNotifierDecorator implements Notifier {
private final Notifier wrapped;

public SlackNotifierDecorator(Notifier wrapped) {
this.wrapped = wrapped;
}

@Override
public void send(String message) {
wrapped.send(message); // вызываем базовый метод
System.out.println("Дополнительно отправляем в Slack: " + message);
}
}


2️⃣ Декоратор для отправки в Email:

public class EmailNotifierDecorator implements Notifier {
private final Notifier wrapped;

public EmailNotifierDecorator(Notifier wrapped) {
this.wrapped = wrapped;
}

@Override
public void send(String message) {
wrapped.send(message);
System.out.println("Дополнительно отправляем Email: " + message);
}
}


🚀 Использование:

public class Main {
public static void main(String[] args) {
Notifier notifier = new BasicNotifier();
notifier = new SlackNotifierDecorator(notifier);
notifier = new EmailNotifierDecorator(notifier);

notifier.send("Привет, мир!");
}
}


🔥 Что произойдет?

Отправка сообщения: Привет, мир!
Дополнительно отправляем в Slack: Привет, мир!
Дополнительно отправляем Email: Привет, мир!


🎯 Итог:
Мы не изменяли код BasicNotifier, но добавили новую функциональность.
Гибкость: можем легко комбинировать декораторы в любом порядке.
Код остаётся чистым и расширяемым.

#java

👉 @Bookflow
👍5
Библеотека CPR

C++ Requests - это простая обертка вокруг libcurl, вдохновленная отличным проектом Python Requests.

Несмотря на свое название, простой интерфейс libcurl - это еще не все, и ошибки, неправильное использование этого языка - частый источник ошибок и разочарований. Используя более выразительные языковые средства C++17 (или C++11, если вы используете cpr < 1.10.0), эта библиотека укладывает суть выполнения сетевых вызовов в несколько лаконичных идиом.

Вот быстрый GET-запрос:

#include <cpr/cpr.h>

int main(int argc, char** argv) {
cpr::Response r = cpr::Get(cpr::Url{"https://api.github.com/repos/whoshuu/cpr/contributors"},
cpr::Authentication{"user", "pass", cpr::AuthMode::BASIC},
cpr::Parameters{{"anon", "true"}, {"key", "value"}});
r.status_code; // 200
r.header["content-type"]; // application/json; charset=utf-8
r.text; // JSON text string
return 0;
}

https://github.com/libcpr/cpr

#cpp

👉 @Bookflow
👍2
Как malloc сломала JPGLoader в Serenity, или Как выиграть в лотерее

Пару лет назад мне выпала возможность расследовать в SerenityOS интересный баг, связанный с декодированием изображений JPG, которые по какой-то причине при просмотре выглядели так, как вы видите выше.

Странно, не так ли? Похоже, будто просто перепутали RGB и BGR. При этом внесение в JPGLoader.cpp следующего изменения:

- const Color color { (u8)block.y[pixel_index], (u8)block.cb[pixel_index], (u8)block.cr[pixel_index] };
+ const Color color { (u8)block.cr[pixel_index], (u8)block.cb[pixel_index], (u8)block.y[pixel_index] };
context.bitmap->set_pixel(x, y, color);


https://habr.com/ru/companies/ruvds/articles/828224/

original https://sin-ack.github.io/posts/jpg-loader-bork/

#cpp

👉 @Bookflow
👍3💩1
C++ — мощный инструмент, но с ним нужно правильно работать

Хотите писать на C++, но настройка окружения кажется головной болью?

◽️ Компилятор не видит файлы?
◽️Дебаг работает через раз?
◽️VSCode — просто красивый редактор?

💡 Приходите на открытый вебинар «Готовим рабочее место: C++ + VSCode»!

📅 5 марта в 20:00 (мск)

Мы разберём:
◽️Как настроить VSCode для C++: компиляторы, расширения, дебаг
◽️Как запускать программы без ошибок и ручной магии
◽️Как сделать среду разработки удобной и эффективной

🎯 А ещё всем участникам подарим скидку на топовый курс «C++ Developer»!

🔗 Регистрация: https://vk.cc/cJgkOF

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Как выполнять периодические обновления данных в PostgreSQL?

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


1. CRON и SQL скрипты
- CRON (или аналогичный планировщик задач) — это системный планировщик задач, который может запускать SQL-скрипты в определенное время или с определенной периодичностью.
- Вы создаете SQL-скрипт, который выполняет необходимые обновления данных, и настраиваете CRON для его запуска.
- Пример команды в CRON:

* * * * * psql -U user -d database -c "CALL your_update_function();"

Этот пример выполняет задачу каждую минуту.

2. pg_cron
- pg_cron — это расширение для PostgreSQL, которое позволяет планировать задания непосредственно из базы данных, используя SQL-синтаксис для задания расписания.
- Пример:

SELECT cron.schedule('0 * * * *', $$CALL your_update_function();$$);

Это задание выполняет функцию каждый час.

3. pgAgent
- pgAgent — это более сложный планировщик задач, который интегрируется с PostgreSQL. Он позволяет создавать и управлять заданиями через интерфейс PgAdmin или SQL-команды.
- Пример задания:

CREATE JOB update_job
STEP 1
WHEN '0 * * * *'
EXECUTE PROCEDURE your_update_function();


4. Встроенные средства PostgreSQL
- Если задача достаточно простая, и вы хотите обойтись без внешних инструментов, можно использовать механизм LISTEN/NOTIFY или bgworker (бэкграундные воркеры).
- LISTEN/NOTIFY: используется для уведомления процессов о событиях в базе данных. Рабочие процессы могут запускаться при получении уведомления.
- bgworker: позволяет создавать фоновый процесс, который будет периодически выполнять необходимые задачи.

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

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

7. Materialized Views
- Если вам нужно обновлять агрегированные или сложные запросы, можно использовать материализованные представления с автоматическим обновлением.
- Вы можете создать материализованное представление и настроить его автоматическое обновление через CRON или pg_cron:

REFRESH MATERIALIZED VIEW CONCURRENTLY your_view;


Заключение
Выбор метода зависит от конкретных требований и доступных инструментов. Если вам нужно периодически выполнять задачи непосредственно в базе данных и с минимальными усилиями, pg_cron и pgAgent — отличные варианты. Если хотите контролировать задачи с уровня операционной системы, то CRON или системные задачи на стороне приложения будут лучшим решением.

#db

👉 @Bookflow
👍6
Media is too big
VIEW IN TELEGRAM
Плывущий экран. Вирус на C++. Melting Screen

Программа предоставлена в образовательных целях! Автор не несёт ответственности за её использование!
В этом видео вы узнаете как написать вирус на с++ который заставляет экран сыпаться и плыть.

источник

#cpp

👉 @Bookflow
👍8👎1
🦾Хотите глубже понять управление процессами в микросервисах и повысить надёжность систем? На ум сразу приходят распределённые транзакции – классический, но, увы, проблематичный метод. Но мы предлагаем кое-что получше: шаблон «Сага»!

На открытом вебинаре "«Саги» vs распределённые транзакции: как моделировать рабочие потоки в распределённой архитектуре"

Вы узнаете:
- Почему распределённые транзакции могут быть непрактичны в контексте микросервисов
- Как работает Сага и в чём преимущества этого шаблона
- Какие типы «саг» существуют и как их применять
- Как использовать Сагу для моделирования сложных рабочих потоков

И, конечно же, получите важные рекомендации по внедрению саг в реальных проектах.

Будет интересно архитекторам ПО, системным аналитикам, бэкенд и фулстек-разработчикам.

💬Спикер: Сергей Прощаев Java-разработчик в ПАО «Сургутнефтегаз».

Бонус! Скидка 5% на любой курс OTUS и чек-лист «Подойдёт ли вам шаблон SAGA? Семь вопросов создателю проекта»

6 марта, 19:00 МСК, Бесплатно

Записаться на событие: https://vk.cc/cJjNRl

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
This media is not supported in your browser
VIEW IN TELEGRAM
Как написать 2D игру на C++ и чистом STL для терминала в Linux

После долгого и упорного труда мне стало скучно пилить микросервисы и бэкенды в хайлоде, я решил постичь магию разработки игр. Выбрал курс по Unreal Engine 5 и C++, так как там все структурировано, понятно, и в случае необходимости есть кому задать вопрос. На первой лекции по основам С++ преподаватель сразу предложил челлендж - написать 2D игру без использования игрового движка. Идея мне понравилась и я сразу приступил к реализации.

https://habr.com/ru/post/708486/

#cpp

👉 @Bookflow
👍32🔥1
Прошиваем программу не только в начало FLASH памяти STM32

Знаете ли вы куда попадает ваша программа после того, как вы нажали кнопку RUN или DEBUG в IDE? Если да, то как изменить этот адрес или даже выйти за пределы постоянной памяти и прожигаться сразу в оперативную память.

Я работаю в CubeIDE и весь мой интерфейс будет именно из этой среды разработки.

Начнем с ответа на первый вопрос, если использовать стандартные настройки IDE и взять стандартный ST-LINK (не важно оригинал или свисток), то при прожигании микроконтроллера будет очищено нужное количество секторов во FLASH памяти и на их место будет записана программа, причем в самое начало FLASH памяти по адресу 0x08000000.

Тут немного остановимся. Для большинства проектов этого достаточно, программа находится во FLASH памяти, при перезагрузке микроконтроллера ни куда не исчезает и исправно запускается. Проблемы начинаются, когда приходит задача, встроить загрузчик, который будет самостоятельно принимать прошивку по одному из интерфейсов, будь то UART/USART, I2C или CAN и сохранять ее в требуемом месте FLASH памяти, а после перезагрузки должен самостоятельно подготовить и передать управление требуемой программе.

https://habr.com/ru/articles/831016/

#cpp

👉 @Bookflow
👍62🥰2
🔥 Разбираем `htop`: Альтернатива top для мониторинга системы

Привет, коллеги! Сегодня разберем инструмент, который должен быть в арсенале каждого линукс-админа — htop. Это мощная альтернатива top, которая делает мониторинг ресурсов системы удобным и наглядным.

📌 Почему htop круче top?
Цветовая схема — информация подается визуально, что помогает быстрее анализировать нагрузку.
Гибкость — можно настроить отображение колонок, фильтровать процессы, сортировать их по различным параметрам.
Управление процессамиhtop позволяет не только наблюдать, но и управлять процессами (убивать, приостанавливать, менять приоритет и т.д.).
Горячие клавиши — удобный интерфейс для быстрого взаимодействия.

🛠 Установка
На большинстве дистрибутивов htop уже есть в репозиториях:
🔹 Debian/Ubuntu:

sudo apt install htop

🔹 CentOS/RHEL:

sudo yum install htop

🔹 Arch Linux:

sudo pacman -S htop


🚀 Основные фишки
🔸 Сортировка процессов — нажмите F6, чтобы выбрать критерий сортировки.
🔸 Завершение процессов — выделяем процесс, жмем F9, выбираем сигнал.
🔸 Дерево процессовF5 (отображает родственные связи между процессами).
🔸 Поиск процессаF3, вводим имя процесса.
🔸 Изменение приоритета (nice)F7`/`F8 для повышения/понижения приоритета.

htop — это удобный инструмент для мониторинга и управления процессами в Linux. Пользуетесь ли вы htop или предпочитаете что-то другое? Пишите в комментариях! 👇

#Linux@linux_odmin #LinuxTips@linux_odmin #Команды@linux_odmin

👉 @linux_odmin
👍3
CppCoreGuidelines

Основные принципы C++ - это набор проверенных рекомендаций, правил и лучших практик по программированию на C++.

https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines

#cpp

👉 @Bookflow
7👍3🥰1
🐼Обработка Excel-таблиц с Pandas: больше никакой рутины!

Excel — отличный инструмент, пока вы не начинаете работать с огромными таблицами, сложными расчётами и бесконечными формулами. Сортировки, фильтры, ручная обработка — это боль.

Как автоматизировать работу с таблицами и делать больше за меньшее время? На открытом вебинаре «Искусство обработки Excel-таблиц с Pandas» 11 марта в 20:00 (мск):

- Узнаем, как загружать, фильтровать и группировать данные в Pandas
- Освоим автоматизацию рутинных задач, чтобы не тратить часы на одно и то же
- Разберём, как строить графики и визуализировать данные прямо из таблиц

Всем участникам — скидка на большое обучение «Python Developer. Basic».

⚡️Регистрация открыта: https://vk.cc/cJwtOe

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🍌1
Что такое утечка памяти?

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

Хотя поначалу утечки памяти незаметны, они могут серьезно ухудшить производительность и стабильность системы, приводя к вялому поведению, сбоям или зависанию. Они возникают из-за ошибок в программировании, например, из-за забывания деаллокации памяти или сохранения ссылок на удаленные объекты.

https://www.codereliant.io/what-is-a-memory-leak/

👉 @Bookflow
👍5
2025/07/14 22:29:52
Back to Top
HTML Embed Code: