Apple выпустили тонну крутых шаблонов для Figma
Apple выпустили множество новых красивых дизайн-шаблонов для Figm
Даже про клипсы не забыли!
Забиарйте себе)
Вы крутые, спасибо за поддержку! (Продолжение "Я стал Ютубером!")
Честно говоря, даже не рассчитывал на такой отклик на мой предыдущий пост. 30 подписчиков на Youtube, ценные комментарии и советы, да и просто слова поддержки!
За эти две недели мне удалось выпустить еще два ролика:
- Техника собеседования STAR (7 минут)
- Третья часть серии "Кодим с chatGPT" (17 минут)
К сожалению, охват моих видео пока не очень большой, хотя видео про STAR приняли очень тепло, судя по лайкам.
На самом деле, затевая эксперимент "Кодим с ChatGPT", я был почти уверен, что сколь-нибудь значимых результатов я не получу. Но похоже, я начинаю сам себя опровергать. Чатбот сумел не просто предложить решение проблемы (например, "сделать форму авторизации"), но и решить абстрактную задачу "сделать форму красивой".
Кроме того, он неплохо разбирается в существующих библиотеках и сумел предложить мне два очень приличных варианта с полнофункциональным календарем. И это притом, что я использую версию 3.5, а не 4. В общем, мне кажется, из всего этого выйдет неплохой результат, но посмотрим. До работающего приложения еще очень далеко.
Одно могу сказать точно: если бы я писал код с нуля, я бы потратил на него раз в 5 больше времени, с учетом исправления всех ошибок, которые иногда допускает chatGPT.
Ну и немного внутренней кухни (кажется, эта рубрика становится постоянной):
Тема для видеоблога выбрана весьма непростая для новичка, ведь мне недоступна опция "перезаписать видео", если в процессе записи что-то пошло не так. Это же chatGPT, который запоминает контекст. То есть, я:
а) не могу просто как ни в чем не бывало заново его просить делать то, о чем уже просил (потому что он "знает", что я уже задавал этот вопрос и его ответ будет учитывать предыдущие ответы)
б) не могу начать новый чат с нуля, потому что для записи следующего ролика мне нужно, чтобы ИИ знал контекст предыдущего.
Приходится танцевать с бубном. Например, после записи я понял, что у меня был косяк с гарнитурой и звук был фиговый. Пришлось на имеющийся видеоряд с записью экрана накладывать новый аудио-видео ряд с голосом и миниатюрной головой. Это вылилось в адок на монтаже, общее время монтажа 17-минутного ролика составило часов 15. Всё для вас, дорогие будущие зрители :)
Спасибо за поддержку, буду рад новым подпискам на канал и идеям по развитию!
Format C:
Всем привет, Пикабу!
Наверное, это будет самый сложный пост в моей жизни, так как я никогда ранее не вел блог или что-то подобное. Я хочу начать серию постов, которая будет содержать реальные проекты по программированию на фрилансе.
Зачем это? Просто хочется делиться любым опытом с сообществом. Возможно кому-то даже удастся помочь или просто обсудить проект.
Сразу скажу, я не профессиональный программист. Все, что я знаю - черпал в разное время из книг и Youtube. Да, когда-то начинал по книге изучать Delphi, а с помощью форумов и HTML писал для себя простенькие сайты. Прошло довольно много времени, изучение было успешно отложено. Около года назад снова заинтересовало написание кода, выбор пал на распиаренный Python. В общем сейчас владею небольшим багажом знаний по Python, HTML верстке с CSS, JavaScript и немного C# (На C# имеется опыт в написании плагинов для игры Rust).
В данный момент есть огромное желание практиковаться, сталкиваться с трудностями и искать решения. Именно поэтому подался на фриланс. Конечно, я не буду рекламировать площадки при публикации проектов.
Ну и чтобы завершить данный поток написанных слов, расскажу о своем первом опыте на фрилансе. Как и ожидалось мной, опыт был негативным в силу моего доверия к людям. Мне удалось взять задание по редактированию шаблона сайта на Joomla. Ранее я уже сталкивался с этой CMS и базовые принципы работы имелись. Как это обычно бывает, заказчику потребовалось больше, чем было указано в описании задания. Я согласился, так как хотелось получить опыт в реальном заказе. Сейчас я не буду описывать в чем конкретно заключалась задача и ее многочисленные подзадачи в виде "мелких" правок и какова была реализация. Скажу только итог - я выполнил всю работу и не получил за свою работу ни копейки. Да, таков был первый опыт.
Я очень надеюсь, что найдутся те, кому это будет интересно. Надеюсь, что найдутся и те, кто будет тоже делиться своими знаниями. В общем, Пикабу, не кидай камни)
Замыкание и JavaScript
Замыкание в JavaScript — это мощная особенность языка, которая позволяет функции запоминать и иметь доступ к переменным из своей области видимости, даже после того, как исполнение функции, в контексте которой они были созданы, завершено. Это свойство чрезвычайно полезно для реализации инкапсуляции данных и работы с асинхронным кодом.
Как работают замыкания
Когда функция объявляется в JavaScript, она получает доступ не только к переменным в своей собственной области видимости, но и к переменным из внешней области видимости, в которой эта функция была создана. Этот механизм поддерживается благодаря лексической области видимости.
Замыкание создается каждый раз, когда функция генерируется. В момент создания функции, если эта функция ссылается на переменные из внешней области видимости, ссылка на эти переменные сохраняется в специальной внутренней структуре, что позволяет функции доступать к этим переменным даже после того, как функция, в контексте которой они были определены, завершит выполнение.
Примеры использования замыканий
Инкапсуляция данных:
function createCounter() {
let count = 0;
return function() {
return count++; // Использует замыкание, чтобы сохранять состояние переменной count
};
}
const counter = createCounter();
console.log(counter()); // 0
console.log(counter()); // 1
console.log(counter()); // 2
Каррирование: Каррирование — это процесс превращения функции с многими аргументами в последовательность функций, каждая из которых принимает один аргумент.
function multiply(a) {
return function(b) {
return a * b; // Замыкание использует переменную a
};
}
const double = multiply(2);
console.log(double(3)); // 6
console.log(double(4)); // 8
Тайм-ауты и интервалы: Замыкания позволяют использовать значения переменных внутри асинхронных коллбэков.
function sayHello(name) {
setTimeout(function() {
console.log('Hello, ' + name);
}, 1000); }
sayHello('Alice');
Подводные камни замыканий
Хотя замыкания могут быть очень полезны, они также могут привести к ошибкам, если их использовать неаккуратно:
Утечки памяти: Если замыкание случайно сохраняет доступ к большим объектам или структурам данных, которые не нужны, это может привести к утечке памяти.
Путаница со значениями: В циклах часто возникает путаница, когда создаются замыкания, поскольку все замыкания, созданные в цикле, будут ссылаться на одно и то же значение переменной из внешней области видимости, если не использовать let или const для объявления переменных цикла.
Замыкания — это мощный инструмент в арсенале JavaScript-разработчика, позволяющий эффективно управлять областями видимости и сохранять состояния между вызовами функций.
JavaScript и Event loop
Событийный цикл (event loop) в JavaScript является фундаментальной концепцией, которая позволяет JavaScript, будучи однопоточным языком, обрабатывать асинхронные операции и выполнять длительные задачи без блокировки интерфейса пользователя. Понимание событийного цикла помогает разработчикам писать более эффективный и отзывчивый код.
Ключевые компоненты
Стек вызовов (Call Stack):
Стек вызовов — это структура данных, которая отслеживает функции, которые должны быть выполнены. Когда функция вызывается, она помещается на вершину стека. Когда JavaScript выполнит функцию, она удаляется из стека. Это продолжается до тех пор, пока стек не будет пуст.
Память куча (Heap):
Куча — это область памяти для хранения объектов, которые не имеют структуры стека. В куче хранятся все объекты и более сложные структуры данных.
Очередь событий (Event Queue):
Очередь событий содержит все события, которые должны быть обработаны, например, клики мыши, нажатия клавиш, запросы к серверу и т.д. Когда стек вызовов пуст, первое событие из очереди перемещается в стек вызовов.
Событийный цикл (Event Loop):
Событийный цикл непрерывно проверяет стек вызовов и, если стек пуст, переносит события из очереди событий в стек вызовов, где они затем выполняются.
Как это работает
Событийный цикл работает по следующему алгоритму:
Проверка, пуст ли стек вызовов.
Если стек вызовов пуст, элементы из очереди событий перемещаются в стек вызовов для обработки.
Обработанные элементы удаляются из стека, и цикл повторяется.
Пример
console.log('Первый');
setTimeout(() => { console.log('Второй'); }, 0);
console.log('Третий');
В этом примере:
Сначала 'Первый' выводится на экран и удаляется из стека.
setTimeout планирует функцию для вывода 'Второй', которая помещается в очередь событий и будет обработана, как только стек вызовов очистится.
'Третий' выводится следующим, потому что JavaScript не ждет завершения таймера.
Наконец, когда стек вызовов станет пустым, функция из setTimeout выполняется, и 'Второй' выводится на экран.
Это базовое описание того, как событийный цикл позволяет JavaScript выполнять асинхронные операции, такие как обработка событий или выполнение задач по таймеру, оставаясь при этом отзывчивым и эффективным.
Событийный цикл в JavaScript позволяет асинхронной обработке работать эффективно в однопоточной среде, но также сопряжён с некоторыми подводными камнями, которые могут создавать трудности для разработчиков. Вот несколько таких подводных камней:
Подводные камни
1. Блокировка стека вызовов
JavaScript использует один стек вызовов, что означает, что он может обрабатывать только одну задачу за раз. Если какая-либо функция выполняется слишком долго, она может "заблокировать" стек вызовов, делая страницу или приложение нереагирующим до завершения этой функции.
Пример:
function sleepForSleepDuration(ms) {
const now = new Date().getTime();
while(new Date().getTime() < now + ms) {
/* ждем */
}
}
sleepForSleepDuration(5000);
console.log('Finally done!');
Здесь функция sleepForSleepDuration блокирует стек вызовов на 5 секунд, что делает интерфейс нереагирующим.
2. Задержка в обработке событий
Поскольку события обрабатываются только тогда, когда стек вызовов пуст, может возникнуть задержка между возникновением события и его обработкой, если стек содержит длительные задачи.
3. Проблемы с производительностью из-за чрезмерного количества колбэков
Использование большого количества асинхронных колбэков может привести к "аду колбэков" (callback hell), где управление сложными асинхронными операциями становится трудночитаемым и подвержено ошибкам.
4. Неправильное использование setTimeout и setInterval
Функции setTimeout и setInterval не гарантируют точное время выполнения. Они просто добавляют события в очередь событий после указанной задержки. Если стек вызовов занят, выполнение может быть отложено дольше, чем ожидалось.
console.log('Start');
setTimeout(() => console.log('Timer ended'), 1000);
sleepForSleepDuration(2000); // блокируем стек на 2 секунды
console.log('End');
Здесь setTimeout может не выполниться ровно через 1 секунду из-за блокировки стека вызовов функцией sleepForSleepDuration.
5. Зависание обработки событий
Если слишком много операций добавляется в очередь событий, это может привести к зависанию или замедлению обработки пользовательских взаимодействий, особенно в браузерах, где пользовательский интерфейс и JavaScript выполняются в одном потоке.
AJAZZ AKP153 Stream Controller
Добрый день. Приобрел устройство AJAZZ AKP153. Это аналог Stream deck. Устройство работает на плагинах, плагины написаны на языках Html, js, Json. Так вот, может кто-то подскажет, хотелось бы написать плагин, для того, что бы он выводил информацию о песне и исполнителе из приложения Яндекс музыка.