<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Lua</title>
    <description/>
    <link>https://tproger.ru/tag/lua</link>
    <atom:link href="https://tproger.ru/tag/lua/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sat, 19 Sep 2026 04:09:41 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Lua</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Как сеньоры документируют проекты: протокол архитектурных решений</title>
      <link>https://tproger.ru/articles/kak-senory-dokumentiruyut-proekty--protokol-arhitekturnyh-rewenij</link>
      <comments>https://tproger.ru/articles/kak-senory-dokumentiruyut-proekty--protokol-arhitekturnyh-rewenij?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Даровская Маша]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/kak-senory-dokumentiruyut-proekty--protokol-arhitekturnyh-rewenij</guid>
      <description><![CDATA[<p>Как сеньоры документируют архитектуру без боли. Обзор подхода ADR: шаблоны, примеры из практики и комментарии экспертов. Ускорьте онбординг и перестаньте объяснять одно и то же.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/kak-senory-dokumentiruyut-proekty--protokol-arhitekturnyh-rewenij">Как сеньоры документируют проекты: протокол архитектурных решений</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Unity]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[GitHub]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[Scala]]></category>
      <category><![CDATA[Amazon]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[GitLab]]></category>
      <category><![CDATA[MIT]]></category>
      <category><![CDATA[Финтех]]></category>
      <category><![CDATA[Фронтенд]]></category>
      <category><![CDATA[Lua]]></category>
      <category><![CDATA[Бэкенд]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[PostgreSQL]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 09 Sep 2025 10:00:03 GMT</pubDate>
      <content:encoded><![CDATA[<p><i>Это перевод <a href="https://dev.to/koladev/how-senior-software-engineers-document-their-project-1nf4">статьи</a> автора <a href="https://dev.to/koladev">Мангабо Колаволе</a> с портала DevTo с комментариями экспертов.</i></p><p>Есть одна задача, которую программисты терпеть не могут — но именно она отличает хорошего инженера от посредственного: как они документируют свой проект? Несколько лет назад я отвечал за запуск финтех-проекта. Мы выбрали стратегию быстрого старта, поэтому масштабируемость не стала для нас приоритетом. Главной целью было проверить гипотезу — и мы двигались вперёд, разрабатывая API, архитектуру и системы —  с упором на простоту, не особенно задумываясь о будущем.</p><p>Но я отвечал за бэкенд и инфраструктуру — и понимал: как бы хороша ни была моя память, через шесть месяцев я не смогу вспомнить все технические детали.</p><p>Во время работы я наткнулся на подход, который мне очень понравился: ADR — Architectural Decision Record, или «протокол архитектурных решений».</p><figure><img src="https://media.tproger.ru/user-uploads/102593/2025-09-05/7d1206a7-6729-4bcb-ab55-63d59240df12.png" alt="" /></figure><p>По сути, это документ, в котором
фиксируются все изменения, внесённые в архитектуру: само решение, его влияние и
полученные уроки.</p><p>Проще говоря, это как личный дневник —
только для всей команды.</p><h2>Почему это важно?</h2><p><b>Память
— ненадёжна.</b> Мы часто забываем, почему выбрали одну
архитектурную модель, а не другую. Документирование изменений помогает
восстановить ход мыслей и избежать повторения одних и тех же ошибок.</p><p><b>Это
усиливает команду.</b> Представьте, что вы перепробовали
несколько вариантов решения проблемы и зафиксировали как удачные, так и
неудачные попытки. Это не просто ваш личный опыт — это знание, которым могут
воспользоваться все, включая тех, кто придёт после вас.</p><p><b>Будущие
разработчики скажут вам спасибо.</b> Подумайте о человеке,
который через пять лет будет разбираться в вашем коде. Если вы не оставили
объяснений, он, скорее всего, будет мучиться, пытаясь понять, зачем было
сделано то или иное изменение. А теперь представьте другого разработчика в
другой компании, который находит ADR-документ с чётким объяснением принятого
решения. Он, без сомнения, будет вам благодарен.</p><p>Синьор-фронтендер из ВК Маргарита Лукина, автор телеграм-канала <a href="https://t.me/frontend_kitchen">«Фронтенд кухня»</a>:</p><blockquote>Ценность ADR я впервые осознала в 2019 году. В команду, где работала, активно набирали новых ребят, и приблизительно раз в неделю кто-нибудь из новых разработчиков спрашивал "а почему это сделано так, а не иначе?" Приходилось постоянно давать ответы на одни и те же вопросы, и тогда-то я и поняла, насколько будет удобно записывать ответы где-нибудь в документацию в confluence и просто кидать ссылку новичкам. <br /><br />В 2019 году я еще не знала сам термин ADR и говорила "документация". С термином я познакомилась совсем недавно — этим летом, на курсе по архитектуре монолитных приложений. Тогда я поняла, насколько эффективно можно использовать ADR для ускорения разработки и уменьшения TTM. Дело в том, что начиная разрабатывать новый проект, разработчик первое время (от месяца до полугода! всё зависит от размера проекта) погружается в проект — разбирается, как всё устроено, чтобы вносить изменения соответственно архитектуре. В этот период разработчик, по сути, составляет собственные adr —  обычно в виде мыслеобразов в своей голове :) Если записать основные решения, разработчик сможет намного быстрее погрузиться в проект.</blockquote><h2>Как писать ADR?</h2><p>Существует несколько общепринятых правил, но
вы всегда можете адаптировать их под себя.</p><p>Вдохновившее меня соглашение можно найти на <a href="https://adr.github.io/madr/">GitHub</a>
. Вы также можете ознакомиться с процессом <a href="https://docs.aws.amazon.com/prescriptive-guidance/latest/architectural-decision-records/adr-process.html">ADR на Amazon</a>.</p><p>Вот пример шаблона, который вы можете
использовать.</p><p>Такой тип документа может находиться прямо в репозитории проекта, в Confluence или, например, в JIRA.</p><p>В моей последней компании, где я работал фронтенд-разработчиком, не существовало одного централизованного документа, фиксирующего все архитектурные изменения. Вместо этого мы использовали задачи GitLab и привязывали каждое архитектурное изменение к соответствующей ветке. Это позволяло отслеживать причины изменений даже спустя месяцы после их внедрения.</p><p>Практика спасала нас бесчисленное количество раз. Как я всегда говорю: не важно, насколько вы или ваши коллеги умны — будь то технический директор, менеджер или любой другой участник команды — никто не помнит каждое техническое решение, принятое два года назад.</p><p>Синьор-фронтендер из ВК Маргарита Лукина, автор телеграм-канала <a href="https://t.me/frontend_kitchen">«Фронтенд кухня»</a>:</p><blockquote>Многие руководители хотят видеть на своём проекте разработчиков, которые "сразу, без раскачки" начнут перформить. Совсем избежать периода погружения невозможно, но можно ускорить его в десятки раз за счёт ADR</blockquote>]]></content:encoded>
    </item>
    <item>
      <title>В ESET нашли первый ИИ-вымогатель PromptLock — написан на Go, крадёт и шифрует данные</title>
      <link>https://tproger.ru/news/v-eset-nawli-pervyj-ii-vymogatel-promptlock---napisan-na-go--kradyot-i-wifruet-dannye</link>
      <comments>https://tproger.ru/news/v-eset-nawli-pervyj-ii-vymogatel-promptlock---napisan-na-go--kradyot-i-wifruet-dannye?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Булат Яббаров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/v-eset-nawli-pervyj-ii-vymogatel-promptlock---napisan-na-go--kradyot-i-wifruet-dannye</guid>
      <description><![CDATA[<p>ESET обнаружила первый ИИ-вымогатель PromptLock: он написан на Go, генерирует Lua-скрипты с помощью AI и шифрует данные на Windows и Linux</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/v-eset-nawli-pervyj-ii-vymogatel-promptlock---napisan-na-go--kradyot-i-wifruet-dannye">В ESET нашли первый ИИ-вымогатель PromptLock — написан на Go, крадёт и шифрует данные</a>»</p>]]></description>
      <category><![CDATA[API]]></category>
      <category><![CDATA[Linux]]></category>
      <category><![CDATA[Инструменты]]></category>
      <category><![CDATA[Искусственный интеллект]]></category>
      <category><![CDATA[Windows]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Lua]]></category>
      <category><![CDATA[Хакеры]]></category>
      <category><![CDATA[Кибербезопасность]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 28 Aug 2025 04:57:30 GMT</pubDate>
      <content:encoded><![CDATA[<p>Компания ESET, известная своим антивирусом, <a href="https://www.welivesecurity.com/en/ransomware/first-known-ai-powered-ransomware-uncovered-eset-research/">сообщила</a> о выявлении первого в истории вымогателя, использующего искусственный интеллект. Новый вирус получил название <i>PromptLock</i>.</p><p>Несмотря на то, что пока нет подтверждений использования PromptLock в реальных атаках, эксперты считают находку важным предупреждением: злоумышленники уже научились внедрять ИИ в инструменты для автоматизированных кибератак.</p><h2>Что умеет PromptLock</h2><p>По данным ESET, PromptLock:</p><ul><li>написан на языке <b>Golang</b>, с версиями для <b>Windows</b> <b>и Linux</b>;</li><li>использует <b>ИИ-модель gpt-oss-20b</b> через локальный API Ollama;</li><li><b>генерирует вредоносные Lua-скрипты на лету</b>, которые сканируют файловую систему, выбирают цели для атаки, шифруют и похищают данные;</li><li>потенциально способен <b>уничтожать данные</b>, но эта функция пока не реализована.</li></ul><p>Фактически, вирус на ходу использует ИИ, чтобы адаптировать поведение скриптов в зависимости от окружения.</p><p>Это делает его особенно опасным: поведение может меняться при каждом запуске, а скрипты — генерироваться динамически, что усложняет обнаружение.</p><h2>Зачем в вирусе нужен ИИ</h2><p>Искусственный интеллект используется не для общения с жертвой или фишинга — он создаёт исполняемый вредоносный код на основе <b>заранее заданных подсказок</b> (промтов). То есть, вместо статического набора функций, злоумышленники получают возможность модифицировать поведение вируса под любую цель и инфраструктуру.</p><blockquote>Именно такие примеры показывают, как ИИ может автоматизировать все этапы атаки — от разведки до кражи данных. Подобные инструменты меняют масштаб и скорость атак</blockquote><h2>Почему это тревожный сигнал</h2><p>Хотя PromptLock пока выглядит как <b>прототип или доказательство концепции</b>, его появление сигнализирует об одном: инструменты на базе ИИ становятся доступными не только бизнесу, но и киберпреступникам.</p><p>Теперь для создания продвинутого вредоносного ПО не обязательно быть опытным программистом — достаточно задать правильный промпт. Сама угроза особенно актуальна в контексте:</p><ul><li>распространения <b>локальных моделей</b> и open-source решений;</li><li><b>снижения технического порога</b> входа для атакующих;</li><li>роста интереса APT-групп к <b>ИИ-автоматизации атак</b>.</li></ul><h2>Что делать</h2><p>Эксперты рекомендуют:</p><ul><li>пересмотреть защиту ИТ-инфраструктуры от<b> динамически генерируемых скриптов</b>;</li><li>уделить внимание <b>аномалиям в поведении программ</b>, а не только сигнатурам;</li><li>следить за <b>новыми классами угроз с участием ИИ</b>.</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Поминки по хайпу: технологии, которые не смогли</title>
      <link>https://tproger.ru/articles/pominki-po-hajpu--tehnologii--kotorye-ne-smogli</link>
      <comments>https://tproger.ru/articles/pominki-po-hajpu--tehnologii--kotorye-ne-smogli?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Виктория Эберт]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/pominki-po-hajpu--tehnologii--kotorye-ne-smogli</guid>
      <description><![CDATA[<p>Почему метавселенная, NFT, Google Glass и 3D-ТВ провалились — разбор хайповых технологий, как хайп стал разочарованием ✔ Tproger</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/pominki-po-hajpu--tehnologii--kotorye-ne-smogli">Поминки по хайпу: технологии, которые не смогли</a>»</p>]]></description>
      <category><![CDATA[Интернет]]></category>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Опрос]]></category>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[IDE]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Tor]]></category>
      <category><![CDATA[HTML]]></category>
      <category><![CDATA[Боты]]></category>
      <category><![CDATA[HR]]></category>
      <category><![CDATA[Samsung]]></category>
      <category><![CDATA[Блокчейн]]></category>
      <category><![CDATA[Ethereum]]></category>
      <category><![CDATA[Xen]]></category>
      <category><![CDATA[Lua]]></category>
      <category><![CDATA[Маркетинг]]></category>
      <category><![CDATA[Twitter]]></category>
      <category><![CDATA[ARM]]></category>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Разработка]]></category>
      <category><![CDATA[Discord]]></category>
      <category><![CDATA[Сервер]]></category>
      <category><![CDATA[NFT]]></category>
      <category><![CDATA[аналитик]]></category>
      <category><![CDATA[1C]]></category>
      <category><![CDATA[Бизнес]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 09 Jul 2025 10:00:15 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Метавселенные: киберпанк не наступил</h2><p>Все ждали, что вот-вот начнётся киберпанк: наши аватары будут тусоваться в 3D, ходить по виртуальным улицам и работать в офисе на Марсе. Но метавселенная не случилась и вместо этого мы <a href="https://news.ycombinator.com/item?id=43280564#:~:text=Without%20a%20robust%20economic%20model,erosion%20of%20real%2Dworld%20connections.">получили</a> пустые миры, лаги и виртуальную морскую болезнь. Чтобы попасть в эту «новую реальность», нужен мощный комп, дорогущий VR-шлем и вестибулярка космонавта. Массовому пользователю это не по карману и <a href="https://www.reddit.com/r/Futurology/comments/1ej412m/whatever_happened_to_the_metaverse/">не по душе</a>. Даже если вы добрались до метавечеринки — вас ждала примитивная мультяшная графика.</p><p>Метавселенная — красивый технологический концепт, но без реального запроса со стороны людей. Одни видели в ней VR и AR, другие — NFT и блокчейн, третьи — некий 3D-интернет. И стало непонятно: что это вообще было и зачем?</p><figure><img src="https://media.tproger.ru/user-uploads/111449/2025-06-27/ae184ea5-b970-4174-adac-ad239ca6a175.png" alt="метавселенная" /><figcaption>Источник: Clara McMichael / digitaltrends.com</figcaption></figure><p>Метавселенная обещала стать новым поколением соцсетей, что именно там будет жить наше будущее общение и работа. Весь хайп смыл новый тренд: волна генеративного ИИ. Meta* <i>(признана в России экстремистской организацией и запрещена)</i> и другие техногиганты свернули свои эксперименты и переключились на нейросети.</p><p>У бизнеса с метавселенными тоже не сложилось: ни чёткой модели монетизации, ни реальных кейсов. Продажа виртуальной недвижимости в Decentraland, мерч для аватаров, баннеры в виртуальных тусовках — всё больше напоминает Web3-версию The Sims, чем серьёзную платформу с реальной экономикой. Так что будущее в 3D отложили до лучших времён.</p><p>Игровые платформы вроде Minecraft, Roblox, Fortnite — это по сути и есть настоящие метавселенные, которые давно живут своей жизнью. Среднестатистический пользователь от виртуальных тусовок отказывается: ему проще зайти в Discord или залипнуть в обычный стрим на Twitch, чем надевать шлем ради планёрки в Horizon Worlds.</p><blockquote>Я могу просто посмотреть стрим и получить лучший опыт. Надевать шлем не имеет смысла — никакой пользы</blockquote><p>Громкие обещания про «полное погружение» и «эффект присутствия» на практике <a href="https://www.businessinsider.com/metaverse-dead-obituary-facebook-mark-zuckerberg-tech-fad-ai-chatgpt-2023-5?">разбивались</a> о суровую реальность — кривую техническую реализацию. Сейчас платформы выглядят заброшенными: пустые сцены, аватары без ног и скучные шаблонные взаимодействия. Ещё одна проблема — отсутствие единого мира. Все платформы живут по отдельности, между ними нет порталов и возможности перемещаться. К тому же, в виртуальности были серьёзные проблемы с безопасностью — например, случаи <a href="https://www.theguardian.com/society/2025/jun/10/the-misogyny-of-the-metaverse-is-mark-zuckerbergs-dream-world-a-no-go-area-for-women">домогательств</a>.</p><p>Есть надежда, что метавселенная вернётся — когда технологии и контекст будут готовы. Когда VR-шлемы станут лёгкими, дешевыми и удобными, появятся реальные сценарии, а не просто презентации для инвесторов. Тогда, может быть, мы ещё туда заглянем.<b> А пока — rest in pixels, Metaverse.</b></p><h2>NFT-мания</h2><p>Пока одни тусовались в метавселенной и зарабатывали миллионы на продаже пикселей, другие гуглили, что такое OpenSea и почему JPEG стоит как однушка в Москве. Сейчас NFT называют либо финансовым пузырём, либо зачатками новой цифровой инфраструктуры.</p><p>Пандемия и локдаун дали интернету второе дыхание. Люди заскучали и начали скупать цифровое искусство, как раньше собирали марки, карточки или скины в играх. В 2021 году NFT стали мейнстримом: <a href="https://cryptopunks.app/">CryptoPunks</a>, <a href="https://boredapeyachtclub.com/">Bored Ape</a>, <a href="https://www.beeple-crap.com/">Beeple</a> — эти имена знали все. К цифровой лихорадке подключились бренды: <a href="https://www.adidas.com/us/blog/825513-into-the-metaverse-lets-go">Adidas</a>, <a href="https://www.nytimes.com/2022/05/26/style/nike-nft-sneaker.html">Nike</a> и даже <a href="https://corporate.mcdonalds.com/corpmcd/our-stories/article/40-anniversary-mcrib.html">McDonald’s</a> начали продавать цифровой мерч в метавселенных. Пиксельные обезьяны разлетались, как будто золото будущего: в январе 2022 NFT-маркетплейс OpenSea побил все рекорды, ведь месячный объём торгов <a href="https://www.reuters.com/business/future-of-money/cryptoverse-bonfire-nfts-2022-07-05/">составил</a> около $5 млрд. Владение NFT стало признаком цифрового престижа. Люди устанавливали токены себе на аватарки в Twitter, потому что это был цифровой Rolex: если у тебя был токен — ты в теме. А если нет — шёл читать <a href="https://tproger.ru/articles/nft-kak-iskusstvo-chto-jeto-i-kak-sozdat-nft-token-opyt-it-razrabotchika-kontur">гайды</a> на Tproger.</p><figure><img src="https://media.tproger.ru/user-uploads/111449/2025-06-27/e2640635-0d76-4d5d-ad8b-6ee25ee73691.png" alt="NFT" /><figcaption>Источник: Bored Ape Yacht Club</figcaption></figure><p>Но уже к лету того же года рынок начал сдуваться. В июне 2022 объем OpenSea <a href="https://www.reuters.com/business/future-of-money/cryptoverse-bonfire-nfts-2022-07-05/">упал</a> до ~$700 млн, а в октябре 2023 он <a href="https://www.rbc.ru/crypto/news/654b85cb9a7947b3071db244#:~:text=%D0%9F%D0%BE%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%20%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE%20%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%B0%20The,%D0%91%D0%BB%D0%B8%D0%B6%D0%B0%D0%B9%D1%88%D0%B8%D0%B9%20%D0%BA%D0%BE%D0%BD%D0%BA%D1%83%D1%80%D0%B5%D0%BD%D1%82">составлял</a> лишь $91 млн. Минус 98% от пиковых значений. Что же пошло не так?</p><p>Большинство NFT не дают прав на владение цифровым активом. Вы покупаете не саму картинку, а ссылку на неё в блокчейне. Если сервер с изображением ляжет — останется только строчка кода, свидетельствующая о вашем хорошем вкусе. Многие NFT были просто картинками. Ни привязки к играм, ни доступа к сообществам, ни других функций — только красивая (или не очень) обёртка.</p><blockquote>Зачем мне вообще покупать этот NFT вместо настоящего произведения искусства?</blockquote><p>Тысячи NFT-проектов <a href="https://www.nfthailer.com/reports/q3-nft-market-report">выходили</a> каждый день, рынок быстро перенасытился, и в итоге NFT-платформы утонули в спаме и мошенничестве. Один из самых распространённых трюков — <a href="https://financialcrimeacademy.org/understanding-nft-wash-trading/">wash trading</a>: пользователь продаёт токен сам себе, чтобы искусственно раздуть спрос. Исследования <a href="https://www.coindesk.com/web3/2022/12/23/over-30b-of-nft-trading-volume-on-ethereum-is-wash-trading-research-suggests">показывают</a>, что по итогам 2022 года более половины объёма торгов NFT на Ethereum приходилось на липовые сделки. Кто-то считает, что NFT со временем обесценились. Но возможно, что они с самого начала были пустышками.</p><p>Ещё один удар по доверию — кражи и хаос с плагиатом. Работы художников массово превращали в NFT <a href="https://www.nbcnews.com/tech/security/nft-art-sales-are-booming-just-artists-permission-rcna10798">без их ведома</a>: копировали, заливали и продавали, как своё. Никто не спрашивал разрешения у авторов, и уж точно не предлагал процент с продаж. NFT также <a href="https://www.cbsnews.com/news/nft-art-environmental-costs/">критиковали</a> за углеродный след и загрязнение окружающей среды.</p><p>NFT как спекулятивный пузырь — фактически умер. Большинство коллекций потеряли всякий торговый смысл: объёмы упали, активные игроки исчезли, а токены превратились в мёртвые цифровые артефакты. Лихорадочные инвестиции, основанные на спекуляциях, просто сдулись.</p><p>Но сама концепция уникального цифрового актива живёт дальше. Токен как технология адаптируется и трансформируется. В играх NFT уже показали себя как востребованный юзкейс: игроки могут владеть, торговать и прокачивать виртуальные предметы. <a href="https://www.startwithnfts.com/posts/i-responded-to-a-quora-user-who-said-nfts-arent-valuable-heres-what-happened/">Эксперты</a> считают, что инфраструктура останется, и на её базе появятся проекты с реальной практической ценностью. А NFT превратится в элемент цифровой инфраструктуры — как инструмент доступа и сертификат владения. Цифровой «паспорт», который фиксирует принадлежность к сообществам, открывает возможности для участия в клубах и эксклюзивных событиях.</p><h2>3D‑телевизоры: история провала объёмного кино у вас дома</h2><figure><img src="https://media.tproger.ru/user-uploads/111449/2025-06-27/196f3c5f-fea5-433b-a513-4063fa84cfcd.png" alt="3D TV" /><figcaption>Источник: VAVA</figcaption></figure><p>В начале 2010-х 3D-ТВ казались мегатрендом после хита «Аватар». Однако к 2016 году большинство крупных производителей <a href="https://theconversation.com/3d-television-is-dead-so-what-next-72192?">отказались</a> от выпуска моделей с поддержкой 3D. Многие пользователи так и не получили качественный опыт из-за технических ограничений и ранней стадии развития.</p><blockquote>Я знаю, почему 3D-телевизоры провалились: производители поспешили поймать волну кинотеатрального бумa, сделав технологию с тяжёлыми и требующими подзарядки очками. В то же время на горизонте появились большие плоские телевизоры без очков, которые выглядели гораздо лучше и удобнее для пользователей.</blockquote><p>Что пошло не так? Во-первых, сами 3D-очки. Их нужно было заряжать, носить поверх своих, а сидеть при этом строго под определённым углом, иначе магия пропадала. Многие <a href="https://www.reddit.com/r/metro/comments/1enuq1c/why_did_3d_tvs_die_out_this_crap_is_mindblowing/">отмечают</a>, что это было неудобно — очки были дорогими, тяжелыми, а некоторые зрители уставали уже на середине фильма: жаловались на напряжение в глазах, дискомфорт и головные боли. Технология, которая должна была удивлять, в итоге просто раздражала.</p><p>Контента почти не было, и пользователи, купив дорогой телевизор, сталкивались с вопросом: а что, собственно, смотреть? 3D-телевизоры были дороже своих 2D-аналогов, и с развитием 4K, HDR и OLED-технологий потребители начали отдавать предпочтение лучшему качеству изображения без 3D. Зачем платить за условную «глубину», если можно просто получить красивую живую картинку из коробки.</p><p>Несмотря на провал 3D-ТВ в их классическом виде, эксперты <a href="https://www.wired.com/story/3d-is-back/">не ставят</a> на них технологии крест. Как пишет WIRED, новый виток связан с автостереоскопическими дисплеями: они используют трекинг взгляда, линзы и AI, чтобы создавать объёмное изображение прямо на экране — без всяких аксессуаров.</p><h2>Google Glass: будущее было на носу</h2><figure><img src="https://media.tproger.ru/user-uploads/111449/2025-06-27/6878713e-86e0-4dd2-b509-48b4a883ef32.png" alt="Google Glass" /><figcaption>Источник: Google</figcaption></figure><p>Google Glass подавали как прорыв — интерфейс будущего прямо у вас перед глазами. Но вместо футуризма — странная дужка с экранчиком сбоку. Стоила как хороший ноутбук, делала как плохой смартфон. Пользователи получали уведомления на уровне браслета и фото из 2005 года. Памяти почти нет, батарея умирает быстрее, чем вы успеете сказать «Окей, Google».</p><p>Соучредитель Google Сергей Брин позже <a href="https://techcrunch.com/2025/05/20/googles-sergey-brin-i-made-a-lot-of-mistakes-with-google-glass/">признал</a>, что не понимал, как устроены поставки и насколько сложно произвести такие очки массово и недорого. И это многое объясняет: в Google Glass вложили идею, но не довели её до жизнеспособного устройства.</p><p>Хотя запуск обставили красиво: дали очки техноинфлюенсерам, звёздам, первопроходцам — маркетинг остался без главного: никакой конкретики, ни сроков, ни объяснения, зачем это всё нужно. Продукт обсуждали, хайп был — но в продаже его не было. Сама общественность встретила Glass с настороженностью: главной проблемой стала <a href="https://www.wired.com/story/google-glass-reasonable-expectation-of-privacy/">конфиденциальность</a>. У очков не было явного индикатора съёмки, и люди не понимали, записывают их или нет.</p><p>Некоторые <a href="https://www.reddit.com/r/virtualreality/comments/1ai5chh/google_glass_was_ahead_of_its_time/">считают</a>, что Google Glass просто опередили своё время. Прототип показали ещё в 2013 году на Google I/O, а уже к 2015-му производство <a href="https://www.bbc.com/news/technology-30831128">свернули</a>. На практике очки оказались недостаточно удобными, многие обозреватели говорили, что они нелепо выглядят, а способов их применения никто так и не придумал. При цене в $1500 очки превратились в атрибут избранных гиков, а не в массовый гаджет.</p><p>По <a href="http://www.cio.com/article/2369965/consumer-technology/how-many-people-actually-own-google-glass-.html">оценкам</a> аналитиков, всего было продано не более 250 тыс. таких устройств, причем на старте Google отдала лишь 10 000 очков ограниченному кругу «избранных». Попасть к покупателю было сложно — очки продавали только по рекомендациям действующих владельцев. Функционально устройство не впечатляло: маленький прозрачный дисплей с разрешением 640×360, слабая 5-Мп камера, мало памяти и скромные 2–3 часа работы от батареи не соответствовали ожиданиям пользователей.</p><p>После провала на массовом рынке Google сменила стратегию на бизнес‑фокус. С 2014 года разрабатывалась корпоративная версия Glass Enterprise Edition, адаптированная для промышленных задач. Однако эти бизнес-успехи не спасли проект на массовом рынке, и Google окончательно <a href="https://support.google.com/glass-enterprise/customer/answer/13417888">закрыла</a> проект в 2023 году.</p><p>На фоне фиаско Google Glass, современные игроки делают выводы — и действуют иначе. Ray-Ban Meta* (признана в России экстремистской организацией и запрещена) не обещают революцию — они интегрируют ИИ и камеру в повседневную форму очков. Не «будущее на лице», а стильный способ снять сторис и получить подсказки от ИИ. Apple Vision Pro, напротив, сознательно уходит в премиум и не обещает быть массовым — только для профессионалов, с чётким сценарием: дополнительный дисплей, работа с контентом и Facetime. А Android XR (например, от Samsung) с <a href="https://www.techradar.com/computing/virtual-reality-augmented-reality/heres-what-we-know-about-the-5-android-xr-smart-glasses-currently-in-development">амбицией</a> создать экосистему, куда подключаются другие производители.</p><h2>Главные фейлы: почему хайп умер быстрее, чем мы успели надеть шлемы</h2><ul><li>Переоценка трендов: компании хотели <b>влететь в хайповый тренд</b>. В итоге технологии оказывались сырыми или неудобными.</li><li>Нет <b>ценности для пользователя</b>: эти продукты часто не решали реальных задач, а разработчики не объясняли, почему именно их стоит использовать.</li><li>Сложность и <b>неудобства</b>: тяжёлые VR-шлемы, громоздкие или нелепые устройства.</li><li>Непроработанные <b>риски</b>: проблемы с приватностью, мошенничеством и токсичностью подрывали репутацию и доверие.</li></ul><p>В итоге большинство хайповых технологий проваливаются не из-за идеи, а из-за недостатка внимания к пользовательскому опыту, адекватности технических решений и реальным потребностям рынка. Технологии должны идти в ногу с ожиданиями и возможностями людей, а не только с фантазиями инвесторов и маркетологов. Будущее — за теми, кто сумеет не просто создать инновацию, а сделать её удобной, полезной и понятной.</p>]]></content:encoded>
    </item>
    <item>
      <title>5 фишек Lua, которые позволяют оставаться ему популярным</title>
      <link>https://tproger.ru/articles/5-fiwek-lua--kotorye-pozvolyayut-ostavatsya-emu-populyarnym</link>
      <comments>https://tproger.ru/articles/5-fiwek-lua--kotorye-pozvolyayut-ostavatsya-emu-populyarnym?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ирина Тюльпакова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-fiwek-lua--kotorye-pozvolyayut-ostavatsya-emu-populyarnym</guid>
      <description><![CDATA[<p>IT-канал Awesome на примерах рассказал, почему язык Lua остаётся востребованным. Некоторые могут сломать вам голову, если с Lua вы до этого не сталкивались.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-fiwek-lua--kotorye-pozvolyayut-ostavatsya-emu-populyarnym">5 фишек Lua, которые позволяют оставаться ему популярным</a>»</p>]]></description>
      <category><![CDATA[Lua]]></category>
      <category><![CDATA[Библиотеки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 13 Mar 2024 09:33:25 GMT</pubDate>
      <content:encoded><![CDATA[<p>Lua — маленький скриптовый язык. Как правило, он идёт в связке с каким-то дополнительным языком, например C или C#, и часто используется в геймдеве. К тому же, Lua — очень быстрый язык, на нём пишут модули, чтобы ускорить, например, тот же Python.</p><p>IT-канал Awesome подробно рассказал об интересных особенностях Lua.</p><p>В видео рассказывают:</p><ol><li>Что из себя представляет Lua.</li><li>Как выглядит базовый синтаксис языка.</li><li>Таблица — единственная структура данных, которая прекрасно обходится в одиночку.</li><li>Типов данных в Lua всего 8.</li><li>Как выглядит поток управления в Lua.</li><li>Стандартные библиотеки и API позволяют работать с другими языками, например с С.</li></ol><p>Ниже — транскрибация ролика.</p><p>Если вы взглянете на диаграммы, показывающие самый быстрорастущий язык программирования в проектах с открытым исходным кодом, вас ждет большой сюрприз. Во-вторых, внимательно изучив Rust, вы обнаружите крошечный язык под названием Lua. Так в чем же дело? Почему Lua вдруг стал таким популярным и, что более важно, есть ли польза в его изучении? Давайте потратим несколько минут на исследование основных функций Lua и преимуществ, и к концу &lt;...&gt; вы увидите, что благодаря своей простоте и популярности Lua может стать ценным дополнением к вашему набору навыков.</p><p>Для краткости: я разработчик программного обеспечения с 15-летним опытом работы, в основном на языках, основанных на JVM в бэкенде и различных библиотеках пользовательского интерфейса во фронтенде. Мне нравится исследовать то, что предлагает мир разработки, и я создал довольно простую и эффективную систему для оценки жизнеспособности языка программирования.</p><h2>Как выглядит программирование на Lua</h2><p>Во-первых, давайте разберемся с основами. Lua — это мощный, эффективный, легкий, встраиваемый, динамически типизируемый скриптовый язык, который поддерживает как объектно-ориентированное, так и функциональное программирование. Не волнуйтесь, я знаю, что это полный бред, но мы разберем это определение и разберемся в нём.</p><p>Итак, Lua эффективен и легковесен, поскольку он опирается всего на 22 зарезервированных ключевых слова и 8 базовых типов. Еще более интересным, однако, является его подход к структурам данных. Здесь нет классов, структур, интерфейсов или трейтов. Нет массивов, списков или хэш-карт.</p><p>Единственным механизмом структурирования данных, доступным в Lua, является таблица. На первый взгляд это может показаться странным, но через секунду вы увидите, что эта базовая структура достаточно универсальна и мощна, чтобы удовлетворить все ваши потребности. Благодаря своей легковесности и низкому барьеру входа, Lua также можно легко встраивать в другие хост-клиенты, начиная от популярных игр, таких как Roblox, и заканчивая современными IDE, такими как NeoVim. Итак, давайте перейдем к самой интересной части и рассмотрим некоторый код.</p><p>Мы рассмотрим 7 основных языковых функций, о которых вам необходимо знать, чтобы ориентироваться в языке. Сначала в списке давайте посмотрим, как на самом деле выглядит базовая программа на Lua.</p><p>Мы определяем локальную пользовательскую переменную, указывающую на ссылку на таблицу. Поскольку мы можем использовать строковые имена полей в качестве индексов, это заставит таблицу вести себя как запись (record) или словарь.</p><p>В Lua функции являются значениями первого класса (first-class values), поэтому мы можем легко присоединять методы к нашему пользовательскому объекту. Язык довольно гибкий, и функция user.hello также может быть определена непосредственно в таблице.</p><p>Обратите внимание, что оператор точечной записи ( .. ) используется для объединения строк. На протяжении всего этого видео вы увидите, что Lua полон этих небольших особенностей, которые делают язык действительно интересным.</p><p>Далее, мы используем некоторую поддержку стандартной библиотеки, мы также вернемся к этому позже, чтобы считывать информацию с терминала, преобразовывать значения в правильный тип и заполнять нашу запись.</p><p>Наконец, мы убедимся, что длина имени больше нуля, используя другой интересный оператор, и вызовем user.hello, если проверка пройдет успешно. Мы можем запустить этот код в терминале, вызвав команду lua, за которой следует имя файла:</p><p>Это должно дать вам представление о самых основах языка. Далее давайте рассмотрим значения и типы, а затем перейдем к некоторым более сложным темам.</p><h2>Типы данных в Lua</h2><p>В Lua существует восемь типов:</p><p>Строка, число, логическое значение, nil, не представляющий значения, таблицу, функцию, потоки и пользовательские данные. Все это довольно понятно само собой, за исключением, может быть, последних двух. Мы подробно обсудим их через секунду, но пока помните, что, несмотря на кажущуюся простоту, в Lua вы можете обрабатывать рабочие нагрузки с помощью «совместной многопоточности», а также вы можете хранить данные C и работать с ними с помощью пользовательских типов данных.</p><p>Lua — это язык с динамической типизацией, что означает, что переменные не имеют типов, а имеют только значения. В языке нет определений типов, и все значения имеют свой собственный тип.</p><p>Возможно, вы также заметили, что мы довольно часто используем ключевое слово local. Это потому, что в Lua переменные по умолчанию являются глобальными. Как вы, возможно, знаете из других языков, загрязнение глобальной области видимости чревато ошибками, поэтому вы всегда должны стараться ограничить область действия ваших переменных. В качестве дополнительного преимущества использование локальных переменных приводит к повышению производительности, поскольку локальные переменные хранятся в стеке, в то время как глобальные переменные хранятся в специальной таблице глобального окружения.</p><h2>Поток управления Lua</h2><p>Далее давайте кратко рассмотрим поток управления Lua. Здесь все немного более подробно, но, тем не менее, просто. У вас есть доступ к вашим обычным операторам if-then-else, циклам while, а также к циклам repeat until, которые выполнят ваш код хотя бы один раз. Оператор for может быть числовым или общим, чтобы вы могли выполнять итерацию по значениям таблицы.</p><p>Краткое примечание: я знаю, что синтаксис Lua может вам не подойти, особенно если вы имеете опыт работы с языками, которые фокусируются на лаконичной семантике.</p><p>Однако имейте в виду, что мы говорим о языке 30-летней давности, и тенденции тогда были немного другими.</p><h2>Таблица в Lua</h2><p>Далее, давайте более подробно рассмотрим таблицу Lua. Как я уже упоминал, это единственный механизм структурирования данных и одна из самых мощных функций языка. Мы можем инициализировать пустую таблицу</p><p>а затем просто добавить поля, используя один из этих подходов:</p><p>Затем мы можем получить доступ к значениям полей либо с помощью точечной записи, либо с помощью квадратных скобок.</p><p>Конечно, когда мы инициализируем таблицу только значениями, она будет действовать как массив с индексацией, начинающейся с 1. При работе со структурами данных такие операции, как вставка, удаление или сортировка ваших данных, довольно распространены, и они предоставляются в Lua благодаря стандартной библиотеке таблиц. Помните, что таблицы, так же как функции или потоки, являются объектами. Другими словами, переменные на самом деле не содержат этих значений, только ссылки на них.</p><p>Присваивание, передача параметров и возврат функций всегда выполняются по ссылке, поэтому всегда следите за тем, как вы изменяете свои данные. Для сравнения, примитивные типы Lua неизменяемы и всегда передаются по значению. Сейчас самое подходящее время кратко обсудить автоматическое управление памятью Lua. Благодаря сборщику мусора память Lua обрабатывается автоматически, поэтому вам не нужно беспокоиться о выделении или освобождении памяти для ваших объектов.</p><h2>Метатаблицы в Lua</h2><p>Метатаблицы - это еще одна интересная функция, направленная на повышение гибкости таблиц. Самый простой способ понять их - на примере. Представьте, что у нас есть простой пользовательский объект, который выводится на экран.</p><p>Для объекта вызывается внутренний метод toString, который возвращает адрес памяти, где объект хранится в куче. Мы можем изменить это, создав мета-таблицу user, переопределив одну из многих операций, которыми вы можете управлять с помощью мета-таблиц, а затем связать объект user с новым поведением.</p><p>Это мощная функция с большим потенциалом, и ее стоит изучить более подробно. Просто чтобы дать вам представление о степени этой гибкости, мы можем определить метод вызова в нашей мета-таблице, и теперь, внезапно, наш пользовательский объект также можно вызывать как функцию.</p><h2>Стандартные библиотеки Lua</h2><p>Я неоднократно упоминал, что Lua поставляется в комплекте со стандартной библиотекой, предлагающей полезные функции, реализованные непосредственно на C. Одна интересная такая библиотека предлагает поддержку сопрограмм, которые позволяют выполнять многозадачность без вытеснения. В отличие от потоков во многих других языках программирования, сопрограммы Lua выполняются не параллельно, а скорее позволяют чередовать несколько последовательностей операций совместным образом.</p><p>Рассмотрим другой базовый пример: сопрограммы могут быть созданы на основе функций, которые обрабатывают рабочие нагрузки, а затем передают управление, или, другими словами, освобождают процессорное время, чтобы позволить выполняться другим задачам.</p><h2>Lua и С</h2><p>Переключаясь на некоторые низкоуровневые, но все еще интересные аспекты, Lua известен своей скоростью и эффективностью, главным образом благодаря своей реализации на языке Си. Это делает язык переносимым и легко встраиваемым в другие приложения на базе C благодаря Lua C API, который позволяет вызывать функции Lua из C и беспрепятственно передавать данные между двумя языками. Мы можем увидеть это в действии, посмотрев на следующий пример.</p><p>В С-файле давайте убедимся, что у нас есть доступ к Lua API, а затем определим структуру Point. Функция new_point() позволяет нам создать экземпляр point, проверив данные, полученные из стека, и убедившись, что зарегистрировано новое значение пользовательских данных. Наконец, мы зарегистрируем функцию new_point() с помощью Lua, скомпилируем наш C-код, и мы должны быть готовы к работе.</p><p>В новом Lua-файле теперь мы можем загрузить наш C-модуль и напрямую использовать предоставленные функции и структуры данных.</p><h2>Экосистема Lua</h2><p>Наконец, давайте оценим экосистему Lua, чтобы понять, достаточно ли сторонней поддержки и необходимых библиотек, которые мы можем использовать, чтобы не изобретать велосипед заново. Lua предлагает простую модульную систему для упаковки кода и легкого обмена им, особенно благодаря менеджеру пакетов Luarox. Существуют различные успешные библиотеки, начиная от хорошо зарекомендовавших себя веб-фреймворков, таких как Lapis, и заканчивая серверами веб-приложений, такими как OpenResty. Сообщество также живо и вовлечено, и вы увидите различные эксперименты, такие как перенос языка шаблонов JSX на Lua или Moonscript, динамический язык сценариев, который компилируется в Lua.</p>]]></content:encoded>
    </item>
    <item>
      <title>На чём программируют интернет вещей</title>
      <link>https://tproger.ru/articles/na-chyom-programmiruyut-internet-veshhej-240905</link>
      <comments>https://tproger.ru/articles/na-chyom-programmiruyut-internet-veshhej-240905?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[МТС]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/na-chyom-programmiruyut-internet-veshhej-240905</guid>
      <description><![CDATA[<p>Рассказываем, какие популярные и не очень языки программирования нужно знать, чтобы заниматься разработкой в IoT.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/na-chyom-programmiruyut-internet-veshhej-240905">На чём программируют интернет вещей</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[C++]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Swift]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[Интернет вещей]]></category>
      <category><![CDATA[Lua]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 19 May 2023 11:22:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>С каждым годом интернет вещей (Internet of Things, IoT) всё глубже проникает в нашу жизнь. Кофеварка будит ароматом кофе вместо будильника, лампочки в доме автоматически выключаются, когда все уходят на работу, а фитнес-браслеты следят за нашими активностью и самочувствием в течение дня.</p><p>Вы тоже можете принять участие в разработке таких полезных устройств — нужно только разобраться в архитектуре IoT и выбрать язык, на котором хотите программировать.</p><h2>Что такое интернет вещей, и из чего он состоит</h2><p>Интернет вещей — система, которая объединяет с помощью проводных и беспроводных сетей (Wi-Fi, Bluetooth и т. д.) разные устройства, подключённые к интернету.</p><p>IoT-устройства работают в режиме реального времени, собирая, анализируя и передавая данные в облако. Там программное обеспечение обрабатывает данные и оповещает пользователя или выполняет дальнейшие действия самостоятельно. Например, при повышении температуры в помещении включается кондиционер, а если кто-то открыл окно в доме в отсутствие хозяев, идёт сигнал на пункт полиции.</p><p>Архитектуру IoT обычно разделяют на несколько уровней:</p><ul><li>датчики, собирающие данные (датчики пульса, температуры в помещении, движения и т. д.);</li><li>локальные шлюзы — устройства, позволяющие датчикам и облаку обмениваться данными;</li><li>граничные серверы, которые собирают всю информацию;</li><li>облачная инфраструктура.</li></ul><p>Компании, которые работают в сфере IoT, обычно занимаются созданием как самих устройств, так и программного обеспечения для всех уровней архитектуры. Каждый из уровней имеет свои особенности, поэтому при разработке интернета вещей используют разные языки программирования.</p><h2>Какие языки программирования востребованы в IoT</h2><p>Каждый год компания Eclipse Foundation организует опрос IoT-разработчиков из разных стран и публикует исследование о трендах интернета вещей. В нём есть блок про языки программирования.</p><p>По итогам 2022 года:</p><ul><li>в топ-3 языков для программирования микроконтроллеров и встраиваемых устройств вошли C, C++ и Python;</li><li>самыми популярными языками для создания программного обеспечения облачной инфраструктуры стали Java, C, C++, Python и JavaScript;</li><li>Java, Python, JavaScript и C заняли первые места в топе языков для программирования шлюзов и пограничных узлов.</li></ul><p>Таким образом у нас наметился список из языков программирования, которые чаще всего используют для IoT. Рассмотрим каждый из них подробнее.</p><h3>Java</h3><p>Самый популярный язык программирования в сфере IoT. Причина проста — один раз написав код на Java, вы можете быть уверены, что он будет стабильно работать на любом другом устройстве (от смартфона до одноплатного микрокомпьютера).</p><p>Всё это возможно благодаря виртуальной машине Java (JVM), которая позволяет писать код, поддерживаемый любым чипом.</p><p>Не стоит забывать и о том, что Java — объектно-ориентированный язык, поэтому на нём можно создавать код для облачной инфраструктуры и пограничных узлов. Для Java создано большое количество библиотек и инструментов безопасности, он отличается высокой скоростью работы.</p><p>При всех плюсах неудивительно, что на Java написан бэкенд нашего приложения для поддержания микроклимата «Цельсиум» и платформы MTS IoT HUB.</p><h3>Python</h3><p>Благодаря простому синтаксису и быстроте написания кода Python всё чаще используется в сфере IoT. Так как это интерпретируемый язык, он хорошо совместим с такими парадигмами, как объектно-ориентированное, структурное и функциональное программирование.</p><p>Кроме того, под Python создано множество библиотек для решения различных задач, например для машинного обучения и работы с данными. А для программирования микроконтроллеров есть специальный пакет MicroPython, который запускает Python непосредственно на «железе».</p><h3>C</h3><p>Может показаться удивительным, что один из старейших языков программирования используется в такой инновационной сфере, как IoT.</p><p>Причины популярности заключаются как в большой кодовой базе на С, которую нельзя переписать на современных языках, так и в возможности работать напрямую с памятью и любым «железом».</p><p>Также важно, что С не нуждается в больших вычислительных мощностях и позволяет добиться высокого быстродействия системы даже на слабых устройствах.</p><h3>C++</h3><p>Этот язык часто используют для программирования одноплатных компьютеров. Он такой же быстрый, как С, но при этом написание кода на нём обычно занимает меньше времени.</p><p>Благодаря возможности создавать абстракции C++ отлично подходит для приложений Linux и программирования встраиваемых устройств.</p><p>Мы остановились на С++ для фронтенда приложения NB-IoT-тревожной кнопки Smart Click.</p><h4>JavaScript</h4><p>JavaScript — универсальный язык программирования, который можно использовать не только для создания фронтенда сайтов и веб-приложений.</p><p>Благодаря программной платформе Node.js, расширяющей возможности JavaScript, он также подходит для программирования датчиков, серверов и шлюзов.</p><h2>Языки программирования для узких задач в сфере IoT</h2><p>Здесь поговорим о языках, которые не вошли в рейтинг Eclipse Foundation, но используются для решения конкретных задач, поэтому владение ими будет плюсом при поиске работы.</p><h3>LUA</h3><p>Довольно редкий язык программирования, который тем не менее часто используется в сфере IoT.</p><p>LUA — гибкий скриптовый язык, подходящий для создания приложений, ориентированных на портативность, экономию энергии и работу с большими объёмами данных. У него также есть фреймворк Node.lua, аналогичный Node.js.</p><h3>Swift</h3><p>Используется для разработки приложений под устройства на операционной системе iOS. Это простой в изучении язык, который отлично подходит для начинающих программистов, планирующих работать в сфере IoT.</p><h3>Go</h3><p>Golang, или Go, позволяет писать оптимизированный код, подходящий для устройств с низким энергопотреблением и небольшой памятью, поэтому набирает популярность в IoT.</p><p>Кроме того, Go позволяет легко маршрутизировать тысячи потоков данных и обрабатывать несколько асинхронных потоков одновременно.</p><h2>Выводы</h2><p>Нет сомнений, что IoT будет развиваться дальше, охватывая всё больше сфер нашей жизни.</p><p><b>✔ </b>Если вы уже программируете на Python, Java, C или C++, поищите вакансии в компаниях, разрабатывающих устройства для интернета вещей.</p><p><b>✔ </b>Если только планируете делать первые шаги в программировании, советуем освоить Python для решения большинства задач IoT или C/C++ для работы с «железом».</p>]]></content:encoded>
    </item>
    <item>
      <title>Создание 3D-игр в Roblox Studio для детей и подростков — бесплатные видеоуроки</title>
      <link>https://tproger.ru/articles/sozdanie-3d-igr-v-roblox-studio-dlja-detej-i-podrostkov-besplatnye-videouroki</link>
      <comments>https://tproger.ru/articles/sozdanie-3d-igr-v-roblox-studio-dlja-detej-i-podrostkov-besplatnye-videouroki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Вадим Бордик]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/sozdanie-3d-igr-v-roblox-studio-dlja-detej-i-podrostkov-besplatnye-videouroki</guid>
      <description><![CDATA[<p>Подготовили плейлист с видеоуроками по Roblox Studio и программированию на Lua. Попробуйте покопаться в Роблокс и сделать свои первые игры.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/sozdanie-3d-igr-v-roblox-studio-dlja-detej-i-podrostkov-besplatnye-videouroki">Создание 3D-игр в Roblox Studio для детей и подростков — бесплатные видеоуроки</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Lua]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Mar 2022 16:59:16 GMT</pubDate>
      <content:encoded><![CDATA[<p>Roblox (Роблокс) — это платформа, где можно выложить 3D-игру, созданную в специальной программе — Roblox Studio (Роблокс Студио). Здесь даже дети с 8-9 лет могут моделировать 3D-объекты, создавать игровые вселенные, учиться писать скрипты на Lua — простом и легко усваиваемом языке программирования.</p><p>Мы собрали серию видеоуроков, которые познакомят детей с разработкой игр в Роблокс Студио и программированием на Lua. Короткие пошаговые уроки рассчитаны на начинающих разработчиков и будут полезны детям и подросткам: сначала мы изучим интерфейс программы и основы языка Lua, а затем создадим игры разных жанров. Попробуйте покопаться в Роблокс и сделать свои первые игры с помощью этого плейлиста.</p><h2>Урок 0. Скачивание и установка Roblox Studio</h2><p>Для начала давайте установим Roblox и Roblox Studio на компьютер. Подробная инструкция в видео.</p><h2>Урок 1. Создание первой карты в Роблокс Студио</h2><p>Процесс обучения начнём с разбора интерфейса программы, а заодно попробуем создать первую игровую карту.</p><h2>Урок 2. Основы Lua, первые шаги в создании игры</h2><p>В этом уроке мы разберём, как создать скрипт на языке Lua. А также рассмотрим особенности этого языка, попробуем сделать небольшую программу. Кроме того, мы научимся делать спавн героя и создадим мини-игру в жанре шутера (стрелялки).</p><h2>Урок 3. Создание уровней, циклы</h2><p>Мы продолжим изучать язык программирования Lua и писать скрипты, познакомимся с понятием циклов. А также подробно разберём тему добавления уровней в игру, попробуем создать проект наподобие популярного LineRunner.</p><h2>Урок 4. Создание первого уровня игры Obby</h2><p>В этом видео мы познакомимся с понятиями условия и функции в программировании. В процессе создадим игру в жанре Obby — проект с полосой препятствий. И добавим в нее несколько уровней.</p><h2>Урок 5. Создание диалогов в Роблокс</h2><p>На этом занятии займёмся построением диалогов. Чтобы их осуществить, нам нужно добавить несколько второстепенных персонажей в наш «платформер».</p><h2>Урок 6. Компоненты GUI в Roblox Studio</h2><p>Простыми словами, GUI — это вспомогательные компоненты, благодаря которым мы можем делать интерфейс. В этом видеоуроке мы создадим игровое меню с помощью GUI.</p><h2>Урок 7. Создание 3D-игры Capture the Flag</h2><p>Давайте научимся создавать команды для наших игр. Для проекта Capture the Flag мы добавим 4 команды, им предстоит пройти полосу препятствий и добраться до вершины первыми. В ходе игры команды будут мешать друг другу.</p><h2>Урок 8. Продолжаем создавать игру Capture the Flag</h2><p>Улучшим и доделаем нашу игру.</p><h2>Урок 9. Повторение материала</h2><p>Обобщаем изученный материал, подкрепляем знания созданием несложной, но обширной новой игры.</p><p>На этом уроки по Roblox Studio и программированию Lua для начинающих завершены, теперь вы умеете делать все самое основное!</p>]]></content:encoded>
    </item>
    <item>
      <title>Гайд по использованию Lua-скриптов в Redis</title>
      <link>https://tproger.ru/translations/redis-lua-guide</link>
      <comments>https://tproger.ru/translations/redis-lua-guide?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Corewood]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/redis-lua-guide</guid>
      <description><![CDATA[<p>Язык Lua встраивается почти в любое приложение, включая Redis: скрипты добавляют базе собственные расширения и работают как умные транзакции.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/redis-lua-guide">Гайд по использованию Lua-скриптов в Redis</a>»</p>]]></description>
      <category><![CDATA[Redis]]></category>
      <category><![CDATA[Lua]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 24 Nov 2018 12:36:09 GMT</pubDate>
      <content:encoded><![CDATA[<h3>Что такое язык Lua?</h3><p>Язык программирования Lua появился в 1993 году. По своей структуре он является компактным языком программирования, который можно встраивать практически в любое приложение — от World of Warcraft до веб-сервера Nginx. Ну и конечно же, в Redis, о котором далее и пойдёт речь.</p><p>Благодаря Lua в Redis возможно встраивать собственные скриптовые расширения для базы данных. Вызов скриптов выглядит следующим образом:</p><p>Далее сам Lua-скрипт:</p><p>Что более важно, вы можете запускать скрипты в качестве “умных транзакций”. Это позволяет обрабатывать ошибки в рантайме, не останавливая приложение. Безусловно, то, насколько “умными” будут эти транзакции, зависит целиком и полностью от вас.</p><h3>Ключи и аргументы</h3><p>Для обращения к скрипту неплохо бы было передать ему ключи и аргументы. Например, как в нижеприведённом коде:</p><p>В конце EVAL мы видим ноль — это количество ключей, переданных скрипту. Но если вместо ноля написать 2 foo bar fizz buzzthen, первые два элемента foo и bar будут переданы в качестве ключей, а fizz и buzz — в качестве аргументов.</p><p>Ключи доступны Lua-скрипту в таблице KEYS. Таблица в Lua — это ассоциативный массив, который также используется в качестве массива из одного элемента. Если помимо ключей используются аргументы, они будут доступны в таблице ARGV, например:</p><p>В Lua .. используется в качестве оператора объединения, так что здесь в качестве возвращаемого значения мы получаем аргумент, привязанный к пробелу, и название ключа, которое было передано в качестве аргумента:</p><p>Никакой магии в KEYS, это просто строка, так что нам по-прежнему нужно получить их значение.</p><p>Что касается вызова Redis из Lua, можно использовать функцию redis.call(). Например:</p><p>Прим. автора  Если в процессе объединения вы получаете ошибку “attempt to concatenate a boolean value” (попытка объединения значений булевого типа), скорее всего name:first не было присвоено какое-либо значение.</p><p>Таким образом, скрипт взял параметр, нашёл значение ключа и вернул в качестве вывода созданную строку.</p><p>Однако помимо EVAL есть и другой способ передать скрипт на сервер. Например, используя аргументы команды redis-cli. Попробуем написать чуть более сложный скрипт:</p><p>Сохраним его как longhello.lua и выполним в командной строке:</p><p>Итак, мы запускаем redis-cli, добавляем параметры -h, -p и -a для связи с базой данных. Затем идёт --eval, позволяющий указать имя файла, в виде которого скрипт отправится на сервер. Также нашему скрипту понадобятся ключи и аргументы. В данном случае ключами являются указанные до первой запятой параметры команды.</p><h3>Сложные скрипты</h3><p>Следующий случай наглядно демонстрирует, как Lua решает одну небольшую проблему. Допустим, разные пользователи или разработчики увеличивают счётчики в большой структуре данных. Например, region:one увеличивает count:emea, count:usa, count:atlantic, в то время как region:two затрагивает лишь count:usa. Эти счётчики могут быть добавлены позже, но вдруг вам важно убедиться, что добавятся они все разом? Самое время вспомнить про “умные транзакции”.</p><p>Добавим все наши регионы в список:</p><p>Создадим локальную переменную:</p><p>Начнём с переменной-счётчика — он будет считать все операции по увеличению наших округов.</p><p>Теперь запросим у Redis все значения списка, относящиеся к первому ключу.</p><p>Здесь мы запустили цикл, в котором функция ipairs() просмотрит каждую задействованную Lua-таблицу и передаст из неё ключ.</p><p>С каждым вызовом мы увеличиваем указанный ключ, а заодно и наш счётчик.</p><p>После окончания цикла мы получаем конечное число итераций. Сохраним итоговый скрипт и запустим его на сервере:</p><p>В таблице будут содержаться следующие значения:</p><p>Значения для region.two:</p><p>Но что, если бы во время выполнения скрипта произошла ошибка? Он просто продолжил бы выполняться, игнорируя её. Для вывода деталей ошибки следует использовать redis.pcall().</p><h3>Кэширование скриптов</h3><p>Для того чтобы не загружать скрипт каждый раз перед выполнением, можно использовать команду SCRIPT LOAD для загрузки скрипта в кэш. Рассмотрим пример использования из командной строки:</p><p>Здесь $(cat broadcast.lua) превращает наш скрипт в аргумент. А шестнадцатеричное число ниже — SHA1-подпись нашего скрипта. Её можно использовать для его последующего вызова командой EVALSHA:</p><p>Также есть команды для проверки наличия скрипта на сервере и его удаления – SCRIPT EXISTS и SCRIPT FLUSH соответственно.</p><h3>Не всё так просто</h3><p>После довольно небольшого промежутка времени (по умолчанию — 5 секунд) Lua-скрипты начнут выдавать ошибки в ответ на запросы — в таком случае возможно только “убить” скрипт командой KILL SCRIPT либо выключить сервер командой SHUTDOWN NOSAVE. С другой стороны, 5 секунд — очень щедрое ограничение, ведь ваши скрипты должны выполняться буквально в течение миллисекунд. И на это есть очень веская причина: во время выполнения ваших скриптов все остальные процессы приостанавливаются.</p><h3>Заключение</h3><p>Итак, в этой статье мы рассмотрели примеры написания простых и сложных Lua-скриптов, их вызов из Redis, а также запись и хранение на сервере.</p>]]></content:encoded>
    </item>
    <item>
      <title>В World of Warcraft появился новый способ мошенничества, основанный на перехвате функции интерфейса игры</title>
      <link>https://tproger.ru/news/wow-scamming</link>
      <comments>https://tproger.ru/news/wow-scamming?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Иван Бирюков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/news/wow-scamming</guid>
      <description><![CDATA[<p>Схема в World of Warcraft строится на социальной инженерии и незадокументированной фиче интерфейса: жертву просят ввести в чат всего одну строку.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/news/wow-scamming">В World of Warcraft появился новый способ мошенничества, основанный на перехвате функции интерфейса игры</a>»</p>]]></description>
      <category><![CDATA[Безопасность]]></category>
      <category><![CDATA[Lua]]></category>
      <category><![CDATA[Новости]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 26 Jul 2016 12:42:28 GMT</pubDate>
      <content:encoded><![CDATA[<p>Обычно мошенничеством в ММОРПГ занимаются при помощи <a href="https://ru.wikipedia.org/wiki/Социальная_инженерия">социальной инженерии</a>, например, мошенник продаёт фальшивые коды на редкие предметы за внутриигровую валюту. Обнаруженный же способ базируется не только на социальной инженерии, но и на эксплойте незадокументированной фичи интерфейса WoW.</p><h3>Новая атака</h3><p>Представьте следующую ситуацию: игрок, представляющийся членом известной гильдии, обещает продать вам какую-то классную вещь (которой у него скорее всего нет). Всё, что от вас требуется — ввести в чат одну строку:</p><p>Интерфейс WoW и его дополнения написаны на скриптовом языке Lua. Обе части вышеуказанного равенства являются рабочими функциями WoW Lua API. Исполнение этой строчки кода меняет поведение интерфейса.</p><h3>Что делает эта команда?</h3><ul><li>/run  — это команда воспринимать следующий текст как скрипт Lua;</li><li>RemoveExtraSpaces — встроенная функция, удаляющая лишние пробелы;</li><li>RunScript — функция, исполняющая код Lua code (аналогично /run)</li></ul><h3>Почему это опасно?</h3><p>Функция RemoveExtraSpaces применяется к каждому полученному в чате сообщению. Вышеуказанная команда заменяет эту функцию на функцию RunScript, что называется <a href="https://ru.wikipedia.org/wiki/Перехват_(программирование)">перехватом</a>. После этого все сообщения в чате воспринимаются как код Lua и исполняются.</p><figure><img src="https://media.tproger.ru/uploads/2016/07/GDATA_SecurityBlog_wow_script_overwriting_75862w361h121.png" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2016/07/GDATA_SecurityBlog_wow_script_poc_code_75863w361h123.png" alt="" /></figure><figure><img src="https://media.tproger.ru/uploads/2016/07/GDATA_SecurityBlog_wow_script_poc_test_75864w361h220.png" alt="" /></figure><p>Этим было доказано существование уязвимости. Таким образом, этот способ чем-то похож на использование троянов.</p><p>Подробнее об этой уязвимости читайте <a href="https://blog.gdatasoftware.com/2016/07/28809-world-of-warcraft-one-simple-line-of-code-can-cost-you-dearly">здесь</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Пишем Space Invaders при помощи Corona. Настройка проекта</title>
      <link>https://tproger.ru/translations/create-a-space-invaders-game-in-corona-project-setup</link>
      <comments>https://tproger.ru/translations/create-a-space-invaders-game-in-corona-project-setup?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/create-a-space-invaders-game-in-corona-project-setup</guid>
      <description><![CDATA[<p>Старт серии уроков по игре на Corona: создание проекта в Corona Simulator, ключевые файлы main.lua и config.lua и эмуляция классов на языке Lua.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/create-a-space-invaders-game-in-corona-project-setup">Пишем Space Invaders при помощи Corona. Настройка проекта</a>»</p>]]></description>
      <category><![CDATA[Игра]]></category>
      <category><![CDATA[Разработка игр]]></category>
      <category><![CDATA[Lua]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 26 May 2015 16:01:10 GMT</pubDate>
      <content:encoded><![CDATA[<p>В этой серии уроков мы будем писать игру по мотивам старой доброй Space Invaders. В рамках этих статей мы познакомимся с Corona, а именно:</p><ul><li>с управлением сцен;</li><li>с таймерами;</li><li>с перемещением героев;</li><li>со встроенным физическим движком.</li></ul><p>Также мы узнаем, как использовать модули для эмуляции классов на языке программирования Lua. Прилагаем полный список всех статей в этой серии:</p><ol><li>Настройка проекта.</li><li><a href="https://tproger.ru/translations/create-a-space-invaders-game-in-corona-gameplay-part-1">Реализация геймплея. Часть 1</a></li><li><a href="https://tproger.ru/translations/create-a-space-invaders-game-in-corona-gameplay-part-2">Реализация геймплея. Часть 2</a></li><li><a href="https://tproger.ru/translations/create-a-space-invaders-game-in-corona-finishing/">Заключение</a></li></ol><h3>Создание проекта</h3><p>Откройте Corona Simulator, нажмите New Project и сконфигурируйте проект так, как показано на изображении ниже. Не забудьте выбрать папку для сохранения проекта и нажмите OK. После этого создастся указанная вами папка, которая будет содержать ряд иконок и три особенно важных файла: main.lua, config.lua и build.settings. Мы поговорим о каждом из них чуть позже.</p><h3>Настройка сборки</h3><p>Файл build.settings, как несложно догадаться, отвечает за настройки сборки проекта. Откройте этот файл и удалите его содержимое, вместо которого напишите следующее:</p><p>Здесь мы указываем, что ориентация экрана должны быть по умолчанию портретной. Более того, игра будет поддерживать только портретный режим. Более подробно о параметрах вы можете прочитать в <a href="http://docs.coronalabs.com/guide/distribution/buildSettings/index.html">официальной документации</a>.</p><h3>Настройка приложения</h3><p>Файл config.lua отвечает за настройки самого приложения. Откройте этот файл, также удалите его содержимое, вместо которого напишите следующее:</p><p>Здесь все просто: мы устанавливаем размер рабочего пространства и задаем частоту кадров. Все подробности в <a href="http://docs.coronalabs.com/guide/basics/configSettings/index.html">официальной документации</a>.</p><p>Примечание переводчика Стоит отдельно рассказать про третью строчку, в которой устанавливается масштаб. Параметр scale может принимать различные значения ("letterbox", "zoomEven", "adaptive" и т.д.). Автор статьи использует "letterbox", и это означает, что если размер экрана отличается от установленного нами, то изображение наше будет масштабироваться до тех пор, пока оно целиком входит в экран. Иными словами, если окно будет размером 800×1024, то слева и справа от изображения будут черные полосы. Проще увидеть, чем прочитать:</p><h3>Точка входа</h3><p>Файл main.lua является точкой входа в приложение. Мы будем использовать этот файл для того, чтобы установить несколько параметров по умолчанию и загрузить первый экран при помощи библиотеки Composer.</p><p>Если вы не знакомы с Composer, то мы вам настоятельно рекомендуем прочитать <a href="https://docs.coronalabs.com/api/library/composer/">официальную документацию</a> по библиотеке по этой ссылке. Если говорить о ней вкратце, то Composer — встроенный в Corona инструмент для управления сценами.</p><p>Вышеупомянутая библиотека достаточно новая, она заменяет уже устаревшую StoryBoard.</p><h3>Статус бар</h3><p>В игре статус бар не особо-то и нужен, а потому мы уберем его. Для этого следует в файле main.lua прописать следующий код:</p><h3>Точка привязки</h3><p>Когда мы указываем координаты для некоторого объекта, мы должны учитывать точку привязки, в качестве которой удобнее всего использовать центральную точку. Для этого добавьте в main.lua:</p><p>Значения параметров anchorX и anchorY лежит в диапазоне от 0 до 1. Отсчет начинается слева и сверху. Например, если вы хотите указать в качестве точки привязки левый верхний угол, то выставьте оба значения в нули.</p><h3>Зерно генерации</h3><p>Наша игра будет использовать функцию math.random, и для того, чтобы числа получались по-настоящему случайными, нам надо задать зерно генерации псевдослучайных чисел. Если этого не сделать, то при каждом запуске мы будем получать одни и те же значения.</p><p>Хорошим параметром для зерна генерации может послужить функция os.time, которая будет различной при каждом запуске приложения. Для определения этого параметра напишите следующий код:</p><h3>«Нет» глобальным переменным</h3><p>При использовании Corona и, в частности, языка программирования Lua (да и не только Lua) используют глобальные переменные для того, чтобы расширить область их видимости. Чтобы объявить глобальную переменную в Lua, достаточно убрать ключевое слово local перед ее именем.</p><p>Например, в следующем блоке кода объявляются две переменные, первая из которых локальная (она видна только в той функции, в которой объявлена), а вторая — глобальная (она видна в любом месте файла после объявления).</p><p>Но использование глобальных переменных, как правило, считается плохой практикой: могут возникнуть конфликты между двумя переменными с одним и тем же названием. Мы можем решить эту проблему с помощью модулей. Создайте новый Lua файл, назовите его gamedata.lua и добавьте в него следующий код:</p><p>Мы попросту создали таблицу и вернули ее. Для того, чтобы использовать этот код, мы воспользуемся методом require. Добавьте этот код в main.lua:</p><p>Мы можем добавить в gameData ключи, которые будут <i>искусственно</i> глобальными. Взгляните на пример ниже:</p><p>Всякий раз, когда мы хотим получить эти переменные, мы должны вызвать функцию require, чтобы загрузить gamedata.lua. Каждый раз, когда мы загружаем модуль при помощи вышеупомянутой функции, сам модуль помещается в таблицу package.loaded. При следующем запросе игровые данные не будут заново прогружаться, а попросту извлекутся из кэша.</p><h3>Загружаем Composer</h3><p>Прежде чем воспользоваться модулем Composer, его нужно «затребовать». Добавьте в main.lua следующий код:</p><h3>Первая сцена</h3><p>Чтобы перейти к какой-либо сцене, следует воспользоваться функцией gotoScene. Причем каждая сцена будет описана в своем файле. Добавьте следующий код, чтобы перейти к сцене start, определенной в файле start.lua (да, ее пока нет, но мы вскоре ее создадим):</p><p>Обратите внимание, что при использовании функции gotoScene расширение файла писать не нужно.</p><h3>Запуск сцены</h3><p>Итак, давайте создадим файл start.lua, в которой и опишем нашу первую сцену. Как уже говорилось выше, для того, чтобы управлять сценами, нам потребуется модуль Composer — самое время его подключить. Добавьте следующий код в start.lua:</p><p>Вызов метода newScene сделает start.lua частью иерархии сцен модуля Composer. Именно поэтому все то, что мы хотим увидеть в первой сцене, должно быть написано между этой строчкой и ключевым словом return.</p><h3>Локальные переменные</h3><p>Вот те переменные, которые нам потребуются в файле start.lua:</p><p>Важно помнить, что эти строчки будут вызваны лишь единожды. А дальше при вызове метода gotoScene эти переменные уже будут проинициализированы.</p><p>Есть несколько способов, как сделать так, чтобы переменные каждый раз переинициализировались. Мы будем использовать самый простой способ: удалим сцену из иерархии модуля Composer с помощью метода removeScene. В этом уроке мы будем использовать именно такой подход.</p><p>Мы также будем использовать два кастомных модуля: pulsatingText и starFieldGenerator. Создадим два новых файла в папке проекта с названиями pulsatingtext.lua и starfieldgenerator.lua.</p><h3>События сцены</h3><p>Если вы нашли время и прочитали <a href="http://docs.coronalabs.com/api/library/composer/index.html">документацию</a>, ссылку на которую мы прилагали в начале статьи, то вы наверняка заметили шаблон, содержащий все возможные события модуля Composer. К каждому событию прилагается комментарий, в котором указывается, для чего оно используется. Нас интересуют следующие функции: scene:create, scene:show и scene:hide.</p><h4>Шаг 1: scene:create</h4><p>Добавьте этот отрывок кода в файл start.lua:</p><p>Этот метод вызывается, когда сцена еще не существует. Здесь вы должны проинициализировать все переменные и объекты и добавить их на сцену. Переменная group, являясь экземпляром класса GroupObject, указывает на саму сцену, и именно «на нее» добавляются все изображения и другие визуальные элементы.</p><p>Мы создаем кнопку startButton при помощи метода newImage объекта класса Display. Сама функция принимает в качестве аргументов путь к изображению и координаты будущей кнопки.</p><h4>Шаг 2: scene:show</h4><p>Этот метод имеет 2 фазы. Фаза will вызывается, когда сцена по-прежнему еще не на экране, но вот-вот будет. Фаза did вызывается, когда сцена уже появилась и видна пользователю. Именно во второй фазе мы и будем «оживлять» нашу игру: запустим таймеры, добавим слушателей, начнем проигрывать музыку и т.д.</p><p>В этом уроке фаза will нам не понадобится.</p><p>Мы объявляем локальную переменную phase, в которую и записываем текущую фазу выполнения метода. Так как позднее мы будем к этой сцене возвращаться, то проверим, есть ли предыдущая сцена, и если она есть — удаляем ее. Также мы добавляем слушателя для кнопки startButton (при ее нажатии вызовется метод startGame).</p><h4>Шаг 3: scene:hide</h4><p>Метод hide тоже имеет две фазы: will и did. По смыслу они такие же, как и в scene:show. Во время выполнения фазы will мы будем останавливать таймеры, удалять слушателей различных событий, останавливать музыку и т.д. Фаза did вызывается ровно один раз, когда сцена исчезает с экрана. В наших статьях она нам не понадобится.</p><h3>Начало игры</h3><p>Функция startGame вызывается тогда, когда игрок нажимает на кнопку startButton. В этом методе мы будем вызывать gotoScene и переходить к сцене gamelevel.</p><h3>Игровая сцена</h3><p>Создайте новый файл с именем gamelevel.lua и добавьте в него следующий код:</p><p>Все знакомо, не правда ли? Да, мы здесь попросту создаем новую сцену.</p><h3>Слушатель сцен</h3><p>Теперь нам следует добавить слушателя сцен для методов create, show, hide. Для этого напишем в start.lua:</p><h3>Запуск</h3><p>Если вы в данный момент запустите игру, то увидите черный экран с одной кнопкой — это сцена start. При нажатии на кнопку вы попадете на другой экран, который пока полностью пустой — это сцена gamelevel.</p><h3>Вывод</h3><p>Итак, мы подошли к концу статьи. Мы создали хорошую базу для игры, научились переключаться между сценами и познакомились с основами Corona. В следующей части статьи мы займемся реализацией самого геймплея. Оставайтесь с нами!</p><p>Перевод статьи «Create a Space Invaders Game in Corona: Project Setup»</p>]]></content:encoded>
    </item>
  </channel>
</rss>