<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>M.A. Hakim</title><generator>teletype.in</generator><description><![CDATA[Живу на Бали с 2012, без нарушений пищевого поведения и тантры. Пропагандирую здравый смысл и благополучие. Чистота - залог здоровья!]]></description><image><url>https://img4.teletype.in/files/35/93/35934326-cf79-4988-988d-903590ab0200.png</url><title>M.A. Hakim</title><link>https://teletype.in/@ind_ex-51282</link></image><link>https://teletype.in/@ind_ex-51282?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/ind_ex-51282?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/ind_ex-51282?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Tue, 07 Apr 2026 07:48:32 GMT</pubDate><lastBuildDate>Tue, 07 Apr 2026 07:48:32 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@ind_ex-51282/module-web-components</guid><link>https://teletype.in/@ind_ex-51282/module-web-components?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282</link><comments>https://teletype.in/@ind_ex-51282/module-web-components?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282#comments</comments><dc:creator>ind_ex-51282</dc:creator><title>Модульные веб-компоненты</title><pubDate>Mon, 15 Dec 2025 11:33:37 GMT</pubDate><description><![CDATA[Вложение (один веб-компонент внутри другого через &lt;slot&gt;) — это стандартный и очень мощный способ построения интерфейсов. Он отлично работает и является основой модульного дизайна веб-компонентов.]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(199, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="MyDA">Вложение (один веб-компонент внутри другого через <code>&lt;slot&gt;</code>) — это стандартный и очень мощный способ построения интерфейсов. Он отлично работает и является основой модульного дизайна веб-компонентов.</p>
    <p id="JUzb">Вот как это будет работать.</p>
  </section>
  <h2 id="NJXK">Как элементы будут адресоваться в DOM.</h2>
  <h3 id="EFMC">1. Как будет выглядеть HTML-структура</h3>
  <p id="Gjvm">Представим два компонента: <code>ui-card</code> (карточка-контейнер) и <code>user-avatar</code> (аватарка пользователя).</p>
  <p id="HOYw"><strong>Разметка на странице (Light DOM):</strong></p>
  <p id="D07s">html</p>
  <pre id="TJ8l" data-lang="html">&lt;ui-card&gt;
    &lt;h2&gt;Профиль пользователя&lt;/h2&gt;
    &lt;!-- Вложенный веб-компонент, который станет содержимым слота --&gt;
    &lt;user-avatar user-id=&quot;123&quot;&gt;&lt;/user-avatar&gt;
&lt;/ui-card&gt;
</pre>
  <p id="GaCD">Use code with caution.</p>
  <h3 id="H6xD">2. Как это работает с точки зрения Shadow DOM и слотов</h3>
  <p id="wwJN">Когда браузер рендерит <code>ui-card</code>, он берет содержимое (включая <code>user-avatar</code>) и <em>перенаправляет</em> его туда, где находится <code>&lt;slot&gt;</code> внутри Shadow DOM компонента <code>ui-card</code>.</p>
  <p id="PnCp"><strong>Внутреннее устройство <code>ui-card</code> (Shadow DOM):</strong></p>
  <p id="YIHH">html</p>
  <pre id="DEpN" data-lang="html">&lt;!-- Это Shadow DOM компонента ui-card --&gt;
&lt;div class=&quot;card-wrapper&quot;&gt;
    &lt;slot name=&quot;header&quot;&gt;&lt;/slot&gt; &lt;!-- Сюда пойдет h2, если задать ему slot=&quot;header&quot; --&gt;
    &lt;div class=&quot;body&quot;&gt;
        &lt;!-- А сюда пойдет все остальное содержимое, включая user-avatar --&gt;
        &lt;slot&gt;&lt;/slot&gt; 
    &lt;/div&gt;
&lt;/div&gt;
</pre>
  <p id="3VGU">Use code with caution.</p>
  <p id="1sqk"><strong>Визуальный результат в браузере:</strong></p>
  <p id="9c2Y">В конечном счете, компонент <code>user-avatar</code> отображается <em>внутри</em> визуальной области компонента <code>ui-card</code>, но он сохраняет свой <strong>собственный контекст DOM</strong> и свою <strong>собственную функциональность веб-компонента</strong>.</p>
  <h3 id="ayNs">3. Адресация и доступ через DOM</h3>
  <p id="fUx5">Это ключевой момент. Вложенный веб-компонент (<code>user-avatar</code>) сохраняет свое место в <strong>Light DOM</strong> родительской страницы, а не перемещается физически в Shadow DOM. Слот — это лишь точка вставки (placeholder).</p>
  <h2 id="xSrx">Доступ из родительской страницы (Light DOM)</h2>
  <p id="3nPN">Вы обращаетесь к вложенному компоненту как обычному элементу на странице:</p>
  <p id="GIac">javascript</p>
  <pre id="DmkW" data-lang="tsx">// Отлично работает, так как элемент находится в основном DOM
const avatar = document.querySelector(&#x27;user-avatar&#x27;);
avatar.setUserId(456); 
</pre>
  <h3 id="kVVL">Доступ из родительского компонента (<code>ui-card</code>)</h3>
  <p id="pzBa">Доступ к элементам, которые вставлены через слоты, требует использования специального API:</p>
  <p id="PFaQ">javascript</p>
  <pre id="nFhN" data-lang="jsx">// В JavaScript компонента ui-card:
const slot = this.shadowRoot.querySelector(&#x27;slot&#x27;);

// Получаем массив всех &quot;вставленных&quot; элементов
const assignedElements = slot.assignedElements(); 

// Ищем конкретно наш вложенный компонент в этом массиве
const userAvatarComponent = assignedElements.find(el =&gt; el.tagName === &#x27;USER-AVATAR&#x27;);

if (userAvatarComponent) {
    userAvatarComponent.setUserId(789);
}
</pre>
  <p id="BKSX">Use code with caution.</p>
  <h3 id="wkjo">Доступ из вложенного компонента (<code>user-avatar</code>)</h3>
  <p id="yQhI">Вложенный компонент не знает, что он находится внутри слота. Он просто работает как обычно:</p>
  <p id="KGEy">javascript</p>
  <pre id="EION" data-lang="javascript">// В JavaScript компонента user-avatar
this.addEventListener(&#x27;click&#x27;, () =&gt; {
    console.log(&#x27;Клик по аватару!&#x27;);
    // Он может найти своего непосредственного родителя в Light DOM (это будет &lt;ui-card&gt;)
    console.log(this.parentElement); 
});
</pre>
  <p id="OmrO">Use code with caution.</p>
  <h2 id="1WbN">Резюме</h2>
  <ul id="yHVe">
    <li id="Tuvl"><strong>Работает:</strong> Да, отлично работает.</li>
    <li id="FhQR"><strong>Инкапсуляция:</strong> Каждый компонент полностью инкапсулирован своим Shadow DOM и логикой.</li>
    <li id="uFF9"><strong>Адресация:</strong> Вложенный компонент остается в <strong>Light DOM</strong>, и к нему можно получить доступ как из основного скрипта страницы, так и из родительского компонента через API слотов (<code>assignedElements()</code>).</li>
  </ul>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ind_ex-51282/villa-bali-canggu</guid><link>https://teletype.in/@ind_ex-51282/villa-bali-canggu?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282</link><comments>https://teletype.in/@ind_ex-51282/villa-bali-canggu?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282#comments</comments><dc:creator>ind_ex-51282</dc:creator><title>Покупка виллы на Бали</title><pubDate>Sun, 07 Dec 2025 18:49:16 GMT</pubDate><description><![CDATA[Посмотрите что говорит ИИ поисковик от гугла, как будто ничего и не произошло, а на рынке просто скандал и разруха - цены летят вниз, время покупать!]]></description><content:encoded><![CDATA[
  <p id="2F3f">Посмотрите что говорит ИИ поисковик от гугла, как будто ничего и не произошло, а на рынке просто скандал и разруха - цены летят вниз, время покупать!</p>
  <p id="ckGj">С Гугл ИИ поисковик по запросу «купить виллу бали чангу»</p>
  <p id="WlKI">Купить виллу в районе Чангу на Бали возможно, при этом цены могут значительно варьироваться в зависимости от размера, расположения и удобств.</p>
  <h2 id="OFzd">Обзор рынка и цен</h2>
  <ul id="44qS">
    <li id="8dak"><strong>Диапазон цен:</strong> Цены на виллы в Чангу начинаются примерно от <strong>$150 000 – $200 000</strong> за небольшие объекты и могут достигать <strong>$500 000 – $600 000</strong> и выше за более просторные и роскошные виллы.</li>
    <li id="4RWC"><strong>Средняя стоимость:</strong> Медианная стоимость виллы в Чангу составляет около <strong>314 749 €</strong> (примерно $340 000 USD), при средней цене около <strong>2 443 € за м²</strong>.</li>
    <li id="dhn3"><strong>Типы недвижимости:</strong> В основном предлагаются традиционные балийские виллы, но также есть и современные варианты.</li>
    <li id="Jtx1"><strong>Популярные локации:</strong> Востребованы виллы в таких районах, как Умалас, которые быстро развиваются и предлагают двухэтажные дома площадью около 186 м² за $590 000.</li>
  </ul>
  <p id="WtUG">Что учитывать при покупке</p>
  <ul id="nux4">
    <li id="B7x1"><strong>Право собственности для иностранцев:</strong> Иностранные граждане обычно не могут владеть землей в Индонезии напрямую (форма собственности <em>Freehold</em>), но могут приобрести недвижимость через специальные схемы, например, используя договор аренды (форма собственности <em>Leasehold</em>) на длительный срок (до 25-30 лет с возможностью продления) или через индонезийскую компанию (PT PMA).</li>
    <li id="taX1"><strong>Расположение:</strong> Чангу известен своими пляжами (Нелаян, Бату-Болонг), рисовыми полями, кафе и школами серфинга. Выбор конкретного места зависит от ваших предпочтений: близость к пляжу, уединение или доступ к инфраструктуре.</li>
    <li id="tQTk"><strong>Инфраструктура:</strong> Многие виллы предлагают частные бассейны, полностью оборудованные кухни, кондиционеры и высокоскоростной Wi-Fi.</li>
    <li id="Tx36"><strong>Специалисты:</strong> Для безопасного проведения сделки рекомендуется обратиться к местным агентствам недвижимости или юристам, которые специализируются на сделках с недвижимостью для иностранцев и обеспечивают полное сопровождение.</li>
  </ul>
  <p id="iDde">Чтобы получить актуальные предложения, рекомендуется связаться с агентствами недвижимости, работающими в этом районе.</p>
  <p id="H82I">ИИ может ошибаться. Советуем проверять его ответы.</p>
  <hr />
  <p id="Mhxc">какие сайты продают и наиболее надежны, дай список ссылок</p>
  <p id="W2Ej">Для поиска и покупки виллы в Чангу рекомендуется использовать как крупные международные порталы по недвижимости, так и специализированные местные балийские агентства, которые предлагают экспертную помощь, в том числе юридическую поддержку для иностранцев.</p>
  <p id="srH4">Надежные сайты и агентства недвижимости на Бали</p>
  <p id="NTux">Вот список надежных ресурсов, где можно найти актуальные предложения по продаже вилл:</p>
  <ul id="Upaj">
    <li id="EvVB"><strong>Prian.ru</strong> (https://prian.ru/indonesia/bali/canggu/) — крупный международный портал с объявлениями от различных агентств и застройщиков, в том числе на русском языке.</li>
    <li id="tu7m"><strong>Tranio</strong> (https://tranio.ru/indonesia/bali/canggu/) — еще один известный международный агрегатор недвижимости, предлагающий широкий выбор объектов в Чангу.</li>
    <li id="xOMv"><strong>Indonesia-Real.Estate</strong> (https://indonesia-real.estate/ru/property/bali/canggu/villas/) — специализированный портал, сфокусированный на рынке Индонезии, предлагает виллы напрямую от застройщиков и агентств.</li>
    <li id="flzR"><strong>Bali Home Immo</strong> (bali-home-immo.com) — лицензированное местное агентство, базирующееся в Чангу. Специализируется на продаже и аренде, предоставляет юридическую помощь и консультации.</li>
    <li id="m3jV"><strong>Bali Exception</strong> (baliexception.com) — местное агентство, предлагающее эксклюзивные и проверенные объекты недвижимости, включая виллы в Чангу.</li>
    <li id="BKSf"><strong>Mata Property Bali</strong> (https://matapropertybali.com/) — агентство, специализирующееся на элитной недвижимости (freehold и leasehold), предлагает объекты с полной юридической проверкой.</li>
    <li id="sjE2"><strong>Villas of Bali</strong> (https://www.balivillasales.com/ru/category/canggu/) — специализированный сайт сфокусированный на продаже вилл на Бали.</li>
  </ul>
  <p id="420H">Рекомендации по надежности</p>
  <ul id="miWR">
    <li id="XgYq"><strong>Работа с агентом:</strong> В связи с особенностями индонезийского законодательства для иностранцев (ограничения на владение землей Freehold), <strong>наиболее надежный подход</strong> — это работа через проверенное местное агентство или юриста. Агентства, перечисленные выше (например, Bali Home Immo, Mata Property, Bali Exception), имеют опыт сопровождения сделок для иностранных покупателей и помогут провести юридическую проверку объекта (Due Diligence).</li>
    <li id="W6hR"><strong>Проверка документов:</strong> Убедитесь, что все документы на недвижимость легальны, особенно если вы рассматриваете схему <strong>Leasehold</strong> (долгосрочная аренда) или покупку через индонезийскую компанию <strong>PT PMA</strong>.</li>
  </ul>
  <hr />
  <h3 id="muQ5">Задаю вопрос: А что со скэмом? Ответ:</h3>
  <p id="qnxO">На рынке недвижимости Бали, к сожалению, регулярно происходят скандалы и мошенничества (так называемые &quot;скэмы&quot;), в том числе с участием иностранных покупателей, включая граждан России и других стран СНГ.</p>
  <p id="BQic">Проблема существует из-за сочетания нескольких факторов: сложного местного законодательства, высокого спроса на недвижимость, недостаточной осведомленности иностранцев о рисках и иногда участия недобросовестных посредников.</p>
  <p id="KQdq">Основные типы скандалов и мошенничества:</p>
  <ul id="Hmzo">
    <li id="gkRb"><strong>&quot;Виллы-призраки&quot; (Phantom Projects):</strong> Самый распространенный вид мошенничества, когда инвесторы вкладывают деньги в проекты &quot;на бумаге&quot; или по красивым рендерам, но строительство вилл либо не начинается, либо бросается на полпути, а застройщик исчезает с деньгами.</li>
    <li id="qJF8"><strong>Нелегальные застройки и проблемы с разрешительной документацией :</strong> Известный недавний случай, связанный с крупным русскоязычным жилым комплексом .. Ubud, который был временно закрыт властями из-за нарушений разрешений на строительство и нецелевого использования земли. Это привело к проблемам для множества инвесторов и резидентов.</li>
    <li id="CZNo"><strong>Мошенничество с участием инфлюенсеров :</strong> Широко освещался в СМИ скандал, когда известный русскоязычный блогер и инфлюенсер **** был обвинен десятками иностранных инвесторов в хищении миллионов долларов США через свои компании, предлагавшие несуществующие или проблемные проекты вилл.</li>
    <li id="Aejp"><strong>Продажа одной виллы нескольким покупателям (Double Selling):</strong> Недобросовестные продавцы или агенты продают один и тот же объект нескольким людям, пользуясь пробелами в юридическом оформлении или отсутствием должной проверки через нотариуса.</li>
    <li id="nqxg"><strong>Поддельные документы и фальшивые агенты:</strong> Использование поддельных сертификатов на землю, измененных договоров аренды или выдача себя за реального владельца/агента с целью получения депозита и исчезновения.</li>
  </ul>
  <p id="DfkE">Как обезопасить себя:</p>
  <p id="A3zK">Для минимизации рисков при покупке недвижимости на Бали крайне важно соблюдать следующие меры предосторожности:</p>
  <ul id="CPO2">
    <li id="queN"><strong>Обязательная юридическая проверка (Due Diligence):</strong> Никогда не пренебрегайте этим шагом. Профессиональный юрист или нотариус должен проверить все документы на землю, статус собственности (Freehold или Leasehold), отсутствие залогов и судебных споров.</li>
    <li id="EVMt"><strong>Работа с проверенными агентствами:</strong> Обращайтесь к агентствам с хорошей репутацией и лицензией, которые работают на рынке много лет (список надежных сайтов был предоставлен ранее).</li>
    <li id="Vk3V"><strong>Не доверяйте &quot;слишком хорошим&quot; предложениям:</strong> Если цена значительно ниже рыночной, это серьезный повод для подозрений.</li>
    <li id="wA1f"><strong>Проверяйте застройщика:</strong> Если покупаете строящуюся виллу (off-plan), тщательно изучите историю застройщика, его завершенные проекты и наличие всех разрешений.</li>
    <li id="avzx"><strong>Избегайте &quot;серых&quot; схем:</strong> Не используйте сомнительные схемы владения, например, оформление земли на имя местного жителя (номинальный договор), так как это очень рискованно.</li>
  </ul>
  <p id="CcX9">Скандалы случаются, но они подчеркивают важность тщательного и профессионального подхода к инвестициям в недвижимость на Бали.</p>
  <hr />
  <p id="fgyB">Короче - уточняйте детали.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ind_ex-51282/arenda-villa-bali-biznes</guid><link>https://teletype.in/@ind_ex-51282/arenda-villa-bali-biznes?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282</link><comments>https://teletype.in/@ind_ex-51282/arenda-villa-bali-biznes?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282#comments</comments><dc:creator>ind_ex-51282</dc:creator><title>Реальные данные - рынок аренды вилл на Бали</title><pubDate>Tue, 12 Aug 2025 15:56:15 GMT</pubDate><description><![CDATA[Оч важная Инфа для тех, кто собирается вложиться в апартаменты или виллу под аренду!!! Сохраняйте и отправляйте тем, кто собирается инвестировать в Балийскую недвижку!]]></description><content:encoded><![CDATA[
  <figure id="7Fw9">
    <iframe src="https://www.instagram.com/p/DMcCd0sSyQg/embed/captioned/"></iframe>
  </figure>
  <h3 id="JgGm">Что пишет автор?</h3>
  <h3 id="Y4Y0">БИЗНЕС НА БАЛИ?! Ожидание и реальность</h3>
  <p id="wpJo">Оч важная Инфа для тех, кто собирается вложиться в апартаменты или виллу под аренду!!! Сохраняйте и отправляйте тем, кто собирается инвестировать в Балийскую недвижку!</p>
  <p id="lcwD">Сейчас со всех сторон сыпется реклама: стройте, вкладывайтесь, рынок растёт, туристов всё больше, всё сдаётся, всё отбивается.<br />Да…по данным 2023-24гг. А сейчас ситуация немножко другая…</p>
  <p id="IgB7">Рассказываю как есть в реале не только, как сторонний наблюдатель, но и как участница этой девелоперского бума.</p>
  <p id="EqZw">Я тоже переделала тут виллу под ежедневную аренду.<br />Вложила всё: свои деньги, занятые, нервы, время, расчёты, надежду. И сейчас я в полном а..уе.</p>
  <p id="4Nks">Если ещё год назад рынок действительно дышал — сейчас он уже задыхается от перенасыщения.<br />А стройка не прекращается!! 😣</p>
  <p id="BanC">Застраивается все до такой степени, что скоро весь остров будет закатан в бетон!!!</p>
  <p id="zSyj">Это какое то помешательство. И причем всё красивое, всё как в Pinterest все “под сдачу”.</p>
  <p id="l72w">И таких объектов уже В РАЗЫ больше, чем клиентов.</p>
  <p id="XOGd">Сейчас высокий сезон и где эти туристы?<br />Которых нам всем обещали?<br />Которые должны были снимать эти дома по $300-500 в сутки?<br />Они с нами в одной комнате?</p>
  <p id="Cpnt">Airbnb перегружен огромными роскошными домами по 100 (!!!) евро в сутки.<br />И они пустуют.<br />Никакой высокий сезон их не спасает.</p>
  <p id="0jaX">Потому что туристы не размножаются в том же темпе, как виллы!!!</p>
  <p id="ps3c">Да, Бали — прекрасное место для жизни.<br />Если вы хотите жить в тепле, среди природы, заниматься своим делом — приезжайте, это правда классное место.</p>
  <p id="4uLN">Но если вы думаете куда вложить свои кровные и заходите сюда ради бизнеса и прибыли — пожалуйста, откройте глаза.</p>
  <p id="tOyF">Посмотрите Airbnb. Сравните. Прикиньте цифры.<br />Я не говорю «не делайте».<br />Я говорю — посмотрите внимательно.</p>
  <p id="5JbI">НО!!!! если вы как раз собираетесь приехать в отпуск — добро пожаловать.<br />Сейчас для туристов начинается золотое время.</p>
  <p id="INLc">Вы будете жить по-королевски - за цену простого гостиничного номера.<br />Фантазия стала реальностью. Наслаждайтесь.</p>
  <p id="sgfj">P.S. Если приедете — выберите мою виллу, пожалуйста. Она самая классная конечно же</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ind_ex-51282/python-hosting</guid><link>https://teletype.in/@ind_ex-51282/python-hosting?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282</link><comments>https://teletype.in/@ind_ex-51282/python-hosting?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282#comments</comments><dc:creator>ind_ex-51282</dc:creator><title>Хостинги c Python</title><pubDate>Wed, 16 Apr 2025 02:00:53 GMT</pubDate><description><![CDATA[подборка бесплатных хостингов с доступом к терминалу (SSH) и Python — всё отобрано по настоящей поддержке CLI, а не по рекламным лозунгам:]]></description><content:encoded><![CDATA[
  <p id="Ytxl"><strong>подборка бесплатных хостингов с доступом к терминалу (SSH) и Python</strong> — всё отобрано по настоящей поддержке <strong>CLI</strong>, а не по рекламным лозунгам:</p>
  <hr />
  <h2 id="RlOu"><strong>1. <a href="https://replit.com/" target="_blank">Replit</a></strong></h2>
  <p id="gWmG">Возможность Есть?     <br />✅ SSH через веб <br />✅ (встроенный)   <br />✅ Python Да, любой   <br />✅ Файловая система Да   <br />✅ Web-сервер Да (preview + публичный URL)   <br />📦 Поддержка Markdown → HTML? Да, можно всё самописно или через Flask</p>
  <p id="bVHv">💡 Отлично подойдёт для Markdown → HTML генератора на Flask + веб-интерфейс + файлы.</p>
  <hr />
  <h2 id="bnA7"><strong>2. <a href="https://glitch.com/" target="_blank">Glitch</a></strong></h2>
  <p id="rW7R">Возможность Есть?     <br />❗ Pseudo-shell Да, но ограничено   <br />✅ Python/Node.js Да (ограниченный runtime)   <br />✅ Web-просмотр Да (auto-refresh на каждый файл)</p>
  <p id="Uyt0">📦 Прекрасен для микро-сервисов, API или frontend+backend шаблонов.<br /> SSH формально нет, но CLI есть (через консоль в браузере).</p>
  <hr />
  <h2 id="lSbq">✅ <strong>3. <a href="https://render.com/" target="_blank">Render Free Web Services</a></strong></h2>
  <p id="EhLQ">Возможность Есть?     <br />✅ Python Да (WSGI: Flask, FastAPI)   <br />❌ SSH Только логирование   <br />✅ Markdown-проекты Да (через генератор, Flask, Hugo, и т.п.)</p>
  <p id="OCLj">💡 Можно деплоить с GitHub, Markdown → HTML через Python/Flask — удобно.</p>
  <hr />
  <h2 id="hjyT">✅ <strong>4. <a href="https://github.com/features/codespaces" target="_blank">GitHub Codespaces</a></strong></h2>
  <p id="0zkP">Возможность Есть?     <br />✅ Full SSH Да (через VSCode)   <br />✅ Python Да, любой   <br />✅ Term + pip + git Да</p>
  <p id="Xeoz">📦 Подходит для всего: Markdown обработка, Flask, Pandoc, Hugo и т.д.<br /> 💥 Бесплатно 60 часов/мес.</p>
  <hr />
  <h2 id="yY1P">✅ <strong>5. <a href="https://www.oracle.com/cloud/free/" target="_blank">Oracle Cloud Free Tier</a></strong></h2>
  <p id="cT5m">Возможность Есть?     <br />✅ Полный SSH Да (VPS, ARM + AMD)   <br />✅ Python Да, что хочешь   <br />✅ Всё root-доступ Полный сервер</p>
  <p id="AhFa">📦 Идеально если хочешь стабильную машину 24/7, но нужно настраивать вручную.<br /> 💥 Бесплатно навсегда: 1–2 инстанса, 4 ядра, 24 ГБ RAM на ARM.</p>
  <hr />
  <h2 id="3gIp">❌ <strong>Кого избегать</strong> (нет SSH/Python):</h2>
  <p id="cXIg">Хостинг Причина     InfinityFree <br />❌ только PHP   GoogieHost <br />❌ нет SSH/Python   000WebHost <br />❌ максимум — PHP   AwardSpace <br />❌ жёсткие лимиты</p>
  <hr />
  <h2 id="OVaN">Markdown генератор на Flask </h2>
  <p id="LOu4">📁 <code>app.py</code>:</p>
  <pre id="JOds" data-lang="python">from flask import Flask, request
import markdown
app = Flask(__name__)

@app.route(&#x27;/&#x27;, methods=[&#x27;GET&#x27;, &#x27;POST&#x27;])
def index():
    if request.method == &#x27;POST&#x27;:
        md = request.form[&#x27;markdown&#x27;]
        html = markdown.markdown(md)
        return f&#x27;&lt;h1&gt;Preview:&lt;/h1&gt;&lt;div&gt;{html}&lt;/div&gt;&#x27;
    return &#x27;&lt;form method=&quot;post&quot;&gt;&lt;textarea name=&quot;markdown&quot;&gt;
&lt;/textarea&gt;&lt;button&gt;Render&lt;/button&gt;&lt;/form&gt;&#x27;

app.run()
</pre>
  <p id="HmtF">Можно деплоить на Replit, Glitch, Codespaces или Render.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ind_ex-51282/ispolzuem-curl</guid><link>https://teletype.in/@ind_ex-51282/ispolzuem-curl?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282</link><comments>https://teletype.in/@ind_ex-51282/ispolzuem-curl?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282#comments</comments><dc:creator>ind_ex-51282</dc:creator><title>Использование CURL</title><pubDate>Wed, 16 Apr 2025 01:47:00 GMT</pubDate><category>Linux &amp;amp; Tools</category><description><![CDATA[Применение CURL для оценки состояния сервера.]]></description><content:encoded><![CDATA[
  <p id="6PX1">Применение CURL для оценки состояния сервера.</p>
  <h3 id="2P3l">Ключи  для CURL</h3>
  <ul id="WvBp">
    <li id="6gBL"><strong><code>curl -I</code></strong> для получения только заголовков ответа.</li>
    <li id="iuyb"><strong><code>curl -IL</code></strong> для проверки редиректов.</li>
    <li id="iYm1"><strong><code>curl -v</code></strong> для подробной информации о запросах и ответах.</li>
    <li id="6KxE"><strong><code>curl -w</code></strong> для замера времени отклика.</li>
    <li id="2A58"><strong><code>curl -vI</code></strong> для получения данных о сертификате SSL.</li>
  </ul>
  <p id="AS03">Использование команды <strong><code>curl</code></strong> — отличный способ быстро получить информацию о статусе сервера, без необходимости заходить в браузер или использовать онлайн-инструменты. Вы можете использовать <strong><code>curl</code></strong> для проверки доступности веб-сервера, статуса ответа HTTP, а также для получения некоторых подробных данных о сервере.</p>
  <h3 id="G7y4">Основные способы использования <strong><code>curl</code></strong> для получения информации о статусе сервера:</h3>
  <hr />
  <h3 id="rDYy"><strong>1. Проверка доступности сервера (HTTP статус-код)</strong></h3>
  <p id="Url1">Чтобы проверить статус вашего сервера и узнать, какой HTTP статус-код вернул сервер (например, 200 OK, 404 Not Found, 500 Internal Server Error), используйте следующую команду:</p>
  <pre id="taxr">curl -I http://fit.whf.bz
</pre>
  <ul id="SyvW">
    <li id="EUx6"><strong><code>-I</code></strong> (или <code>--head</code>) отправляет <strong>только HTTP-заголовки</strong>, не загружая весь контент страницы.</li>
    <li id="Tdzf">Это даст вам краткую информацию, например: <code>HTTP/1.1 200 OK Date: Mon, 15 Apr 2025 00:00:00 GMT Server: Apache X-Powered-By: PHP/7.4.3 Content-Type: text/html; charset=UTF-8 </code> Это позволяет вам увидеть статус ответа от сервера (например, <code>200 OK</code>), тип содержимого, сервер и другие метаданные.</li>
  </ul>
  <hr />
  <h3 id="bGPu"><strong>2. Проверка редиректа (следование редиректам)</strong></h3>
  <p id="LtVV">Если ваш сайт перенаправляет с HTTP на HTTPS, например, вы можете увидеть, что происходит с помощью опции <strong><code>-L</code></strong> (следовать за редиректами):</p>
  <pre id="pVsk">curl -IL http://fit.whf.bz
</pre>
  <ul id="oGYu">
    <li id="LjLY"><strong><code>-L</code></strong> позволяет <code>curl</code> следовать за редиректами.</li>
    <li id="Eyug"><strong><code>-I</code></strong> по-прежнему выводит только заголовки.</li>
  </ul>
  <p id="ukrW">Это позволит увидеть, если сайт редиректит на <code>https://</code> и какие ответы сервер отправляет.</p>
  <p id="QBZK">Пример вывода:</p>
  <pre id="CYMW">HTTP/1.1 301 Moved Permanently
Location: https://fit.whf.bz/
HTTP/2 200 
</pre>
  <hr />
  <h3 id="g3ju"><strong>3. Проверка заголовков HTTP с подробной информацией о запросе</strong></h3>
  <p id="IHLe">Если вы хотите увидеть больше подробностей, например, о том, как сервер обрабатывает ваш запрос, можно использовать команду с <strong><code>-v</code></strong> (verbose), чтобы получить подробную информацию о запросе и ответе:</p>
  <pre id="E5Ek">curl -v http://fit.whf.bz</pre>
  <p id="LXMU">Пример вывода:</p>
  <pre id="QBwH">*   Trying 123.45.67.89...
* Connected to fit.whf.bz (123.45.67.89) port 80 (#0)
&gt; GET / HTTP/1.1
&gt; Host: fit.whf.bz
&gt; User-Agent: curl/7.68.0
&gt; Accept: */*
&gt; 
&lt; HTTP/1.1 200 OK
&lt; Date: Mon, 15 Apr 2025 00:00:00 GMT
&lt; Server: Apache
&lt; X-Powered-By: PHP/7.4.3
&lt; Content-Type: text/html; charset=UTF-8
&lt; 
...
</pre>
  <p id="5waa">Здесь вы видите всю информацию о запросе (например, что ваш запрос был на порт 80), а также заголовки ответа от сервера.</p>
  <hr />
  <h3 id="xrzw"><strong>4. Проверка времени отклика сервера</strong></h3>
  <p id="SjG8">Если вы хотите узнать, сколько времени занимает соединение с сервером, вы можете использовать опцию <strong><code>-w</code></strong> с форматированием:</p>
  <pre id="HV76">curl -w &quot;@curl-format.txt&quot; -o /dev/null -s http://fit.whf.bz
</pre>
  <p id="RNzE">Создайте файл <code>curl-format.txt</code> с таким содержимым:</p>
  <pre id="PSv4" data-lang="arduino">time_namelookup:  %{time_namelookup}\n
time_connect:  %{time_connect}\n
time_appconnect:  %{time_appconnect}\n
time_pretransfer:  %{time_pretransfer}\n
time_redirect:  %{time_redirect}\n
time_starttransfer:  %{time_starttransfer}\n
------------------------
time_total:  %{time_total}\n
</pre>
  <p id="XsoI">Это покажет, сколько времени тратится на каждый этап подключения, включая время на разрешение доменного имени, подключение к серверу, ожидание начала передачи данных и общее время.</p>
  <hr />
  <h3 id="R3d7"><strong>5. Проверка сертификата SSL (если сайт использует HTTPS)</strong></h3>
  <p id="0FDX">Если сайт работает через HTTPS, вы можете использовать <strong><code>curl</code></strong> для получения информации о сертификате SSL:</p>
  <pre id="Dp9g">curl -vI https://fit.whf.bz
</pre>
  <p id="knVx">В выводе будет отображена информация о сертификате, включая его дату истечения и информацию о шифровании.</p>
  <p id="rWFl">Пример:</p>
  <pre id="GuWf" data-lang="atom">* Server certificate:
*  subject: CN=fit.whf.bz
*  start date: Jan  1 00:00:00 2025 GMT
*  expire date: Jan  1 23:59:59 2026 GMT
*  subjectAltName: fit.whf.bz
*  issuer: C=US; O=Let&#x27;s Encrypt; CN=R3
</pre>
  <hr />
  <h3 id="BcEZ">Резюме:</h3>
  <ul id="VvOx">
    <li id="1Zco"><strong><code>curl -I</code></strong> для получения только заголовков ответа.</li>
    <li id="FgvY"><strong><code>curl -IL</code></strong> для проверки редиректов.</li>
    <li id="WuwW"><strong><code>curl -v</code></strong> для подробной информации о запросах и ответах.</li>
    <li id="Xz8S"><strong><code>curl -w</code></strong> для замера времени отклика.</li>
    <li id="VxJ9"><strong><code>curl -vI</code></strong> для получения данных о сертификате SSL.</li>
  </ul>
  <p id="ObaQ">Эти команды позволяют быстро и эффективно проверять статус вашего сервера и получать необходимую информацию о его работе. Если у вас будут дополнительные вопросы, не стесняйтесь спрашивать!</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ind_ex-51282/teletype-rastet</guid><link>https://teletype.in/@ind_ex-51282/teletype-rastet?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282</link><comments>https://teletype.in/@ind_ex-51282/teletype-rastet?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282#comments</comments><dc:creator>ind_ex-51282</dc:creator><title>Телетайп растёт</title><pubDate>Tue, 08 Apr 2025 06:48:53 GMT</pubDate><description><![CDATA[Техподдержка отвечает что Маркдаун поддерживать по разным причинам в планах нет. А было бы круто!]]></description><content:encoded><![CDATA[
  <p id="oM48">Техподдержка отвечает что Маркдаун поддерживать по разным причинам в планах нет. А было бы круто!</p>
  <h3 id="K2jG">Такие конструкции было бы хорошо преобразовывать в виджет из 3-х карточек</h3>
  <p id="cwAv">| <a href="https://teletype.in/@ind_ex/Bali_1day" target="_blank">https://teletype.in/@ind_ex/Bali_1day</a> | <a href="https://teletype.in/@ind_ex/mango" target="_blank">https://teletype.in/@ind_ex/mango</a> | <a href="https://teletype.in/@ind_ex/otravlenie-ifeksia-na-bali" target="_blank">https://teletype.in/@ind_ex/otravlenie-ifeksia-na-bali</a> |<br />|-------|-------|-------|</p>
  <h3 id="9HMQ">А такие - в таблицу</h3>
  <p id="TFAI">| колонка 1 | колонка 2 | колонка 3 |<br />|-------|------|--------|<br />| контент 1 | контент 2 | контент 3 |</p>
  <h2 id="FgeT">Еще сказали что можно в iframe писать любой код. </h2>
  <h3 id="x4ZW">Проверяем.</h3>
  <pre id="sdzg" data-lang="html">&lt;embed
  src=&quot;https://2aea3deb-34b4-404d-91f1-9cf5bfb5dca7.selstorage.ru
      /mp4%2FVID-20250412-WA0002.mp4&quot;
  type=&quot;video/mp4&quot;
  width=&quot;100%&quot;
  height=&quot;480&quot;
  style=&quot;display: block; margin: 0 auto;&quot;
/&gt;</pre>
  <figure id="34XT" class="m_custom">
    <iframe srcdoc="<embed
  src=&quot;https://2aea3deb-34b4-404d-91f1-9cf5bfb5dca7.selstorage.ru/mp4%2FVID-20250412-WA0002.mp4&quot;
  type=&quot;video/mp4&quot;
  width=&quot;100%&quot;
  height=&quot;480&quot;
  style=&quot;display: block; margin: 0 auto;&quot;
/>"></iframe>
  </figure>
  <hr />
  <h3 id="cBup">работает !</h3>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ind_ex-51282/rOrCkcWgrf</guid><link>https://teletype.in/@ind_ex-51282/rOrCkcWgrf?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282</link><comments>https://teletype.in/@ind_ex-51282/rOrCkcWgrf?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282#comments</comments><dc:creator>ind_ex-51282</dc:creator><title>Постим из телеги через бота</title><pubDate>Mon, 07 Apr 2025 02:37:00 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/94/25/942544cc-a2bb-4f34-9df2-5f45af7b5d1f.png"></media:content><category>А знаете ли Вы?…</category><description><![CDATA[<img src="https://img4.teletype.in/files/b5/d0/b5d02809-869f-4f84-8acf-c4e97e3f3292.png"></img>Попробую запостить что-то из телеграма с использованием Телетайп-бота
Итоги - всё получилось красиво, каждое сообщение в бот после открытия режима создания нового поста - превращается в параграф текста в посте. Разметка от телеграм удаляется, только элементы маркдауна работают, такие как «**bold*, _italic_, ~strikethrough~,  `code`» и так далее.  Удобно, когда нужно сформировать с телефона короткую заметку, с голоса в том числе. Картинки вставляет без проблем, отправкой картинки в бот. Выделение контейнера цветом и формирование h2, h3 заголовков в инструкции к боту не охвачено - непонятно как работает, если и работает вообще.]]></description><content:encoded><![CDATA[
  <p id="P6QD">Попробую запостить что-то из телеграма с использованием <code>Телетайп-бота</code><strong>Итоги</strong> - всё получилось красиво, каждое сообщение в бот после открытия режима создания нового поста - превращается в параграф текста в посте. Разметка от телеграм удаляется, только элементы маркдауна работают, такие как «**bold*, _italic_, ~strikethrough~,  &#x60;code&#x60;» и так далее.  Удобно, когда нужно сформировать с телефона короткую заметку, с голоса в том числе. Картинки вставляет без проблем, отправкой картинки в бот. Выделение контейнера цветом и формирование h2, h3 заголовков в инструкции к боту не охвачено - непонятно как работает, если и работает вообще.</p>
  <figure id="YLeC" class="m_original">
    <img src="https://img4.teletype.in/files/b5/d0/b5d02809-869f-4f84-8acf-c4e97e3f3292.png" width="959" />
  </figure>
  <p id="hlhv">пишу с телефона, картинка для красоты.</p>
  <p id="a7HG">Всё пока что нормально получается, сейчас проверю как публикуется.</p>
  <p id="XFcv">Спасибо большое</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ind_ex-51282/ofcTaJONbNG</guid><link>https://teletype.in/@ind_ex-51282/ofcTaJONbNG?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282</link><comments>https://teletype.in/@ind_ex-51282/ofcTaJONbNG?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282#comments</comments><dc:creator>ind_ex-51282</dc:creator><title>Размеры заголовков в Teletype</title><pubDate>Tue, 11 Mar 2025 20:27:15 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/a1/53/a153d1cb-9806-4c47-b09e-c0aa66ddea88.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/44/c6/44c67c8f-36ff-4fb7-b64f-71c0b68db493.png"></img>{ h1: 38 - h2: 28 - h3: 20 - p: 17px } берем на вооружение]]></description><content:encoded><![CDATA[
  <h2 id="bw0J">font-size:</h2>
  <h3 id="nmTV">Десктопы</h3>
  <pre id="fjdr" data-lang="css">{ h1: 38 - h2: 28 - h3: 20 - p: 17px } /* размеры в точках */</pre>
  <h3 id="bDZ6">Мобильные</h3>
  <pre id="shQO" data-lang="css">{ h1: 27 - h2: 24 - h3: 20 - p: 17px } </pre>
  <h2 id="dIWn">margin:</h2>
  <h3 id="tZrF">мобильные</h3>
  <pre id="PKcO" data-lang="css">h1, h2 { margin-bottom: 0; margin-top: 0;}</pre>
  <pre id="YM6V" data-lang="css">@media screen and (max-width: 720px) {
    .text h3, .text h4, .text h5, .text h6 {
        margin-top: .75em;
        margin-bottom: .25em;
        font-size: 1.17647059em;
    }
}

@media screen and (max-width: 720px) {
    .text h1, .text h2 {
        font-size: 1.41176471em;
    }
}</pre>
  <h3 id="patJ">десктопы :</h3>
  <pre id="KchA" data-lang="css">h1 {margin-bottom: .78947368em;} 
h1, h2{margin: .53571429em auto .17857143em;} 
.text h3, .text h4, .text h5, .text h6 { margin: .75em auto .25em; }</pre>
  <p id="kAYH"></p>
  <p id="qRrP">H1<br />font-size 38px /*computed */<br />font-size: 3.8rem; /.article__header_title */<br />font-size: 10px; /* html */<br /><br />для 1rem= 16px : 2.375rem</p>
  <h2 id="uxvF">Заголовок h2</h2>
  <p id="FBXf">H2<br />28px /* computed */<br />1.64705882em /* .text h1,.text h2 */<br />font-size: 1.7rem; /* .article__content */<br /><br />для 1rem= 16px : 1.75rem</p>
  <h3 id="iLmj">Заголовок h3</h3>
  <p id="YWUg">H3<br />20px<br />font-size: 1.17647059em;</p>
  <p id="bE0C">для 1rem= 16px : 1.25rem</p>
  <p id="JLF0">обычный<br />17px</p>
  <p id="RWQG">16px : 1.0625rem </p>
  <hr />
  <figure id="4evC" class="m_original">
    <img src="https://img1.teletype.in/files/44/c6/44c67c8f-36ff-4fb7-b64f-71c0b68db493.png" width="240" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ind_ex-51282/GPU-AMD-in-UNIX-node-role</guid><link>https://teletype.in/@ind_ex-51282/GPU-AMD-in-UNIX-node-role?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282</link><comments>https://teletype.in/@ind_ex-51282/GPU-AMD-in-UNIX-node-role?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282#comments</comments><dc:creator>ind_ex-51282</dc:creator><title>Думаем про : GPU карта в роли полноценного UNIX-node. </title><pubDate>Sat, 08 Mar 2025 14:56:37 GMT</pubDate><description><![CDATA[Можно ли запустить embedded Unix на видеокарте AMD как автономное устройство, без CPU, с поддержкой MPI и TCP/IP?]]></description><content:encoded><![CDATA[
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <h2 id="gyKh"><strong>Гипотеза</strong></h2>
    <blockquote id="U3OH"><strong>Можно ли запустить embedded Unix на видеокарте AMD как автономное устройство, без CPU, с поддержкой MPI и TCP/IP?</strong></blockquote>
  </section>
  <hr />
  <h4 id="tQjv"><strong>Основные положения гипотезы:</strong></h4>
  <ul id="Qzxp">
    <li id="oaiT"><strong>Видеокарта AMD содержит процессор MP1 (Management Processor), который управляет GPU и может выполнять код.</strong></li>
  </ul>
  <hr />
  <ul id="a4nr">
    <li id="sQMF"> <strong>Если заменить или модифицировать прошивку MP1</strong>, можно использовать его как основной CPU для запуска <strong>компактного Unix-ядра</strong>.</li>
  </ul>
  <hr />
  <ul id="LEBL">
    <li id="FGky"><strong>VRAM можно использовать как RAM</strong>, чтобы загружать и выполнять код.<br /> <strong>PCIe можно использовать как транспорт для TCP/IP</strong>, реализовав сетевой стек через DMA.</li>
  </ul>
  <hr />
  <ul id="xk4h">
    <li id="q6Zx"><strong>MPI можно запустить на этом стеке</strong>, чтобы использовать видеокарты в распределённых вычислениях без традиционного CPU.</li>
  </ul>
  <hr />
  <h4 id="xIyB"><strong>Технические :</strong></h4>
  <ul id="TPoj">
    <li id="oyqL"> MP1 загружает <strong>подписанную AMD-прошивку</strong> → надо обойти Secure Boot.</li>
    <li id="SATL"> <strong>Отсутствие стандартного сетевого интерфейса</strong> → нужно использовать PCIe-DMA как транспорт.</li>
    <li id="4d1z"> <strong>VRAM не предназначена для работы как RAM</strong> → нужно модифицировать MMU MP1.</li>
    <li id="FCsy"> <strong>Неизвестно, поддерживает ли MP1 полный Linux-стек</strong> → нужно реверсить микрокод.</li>
  </ul>
  <h4 id="kkqt"><strong>Как можно проверить гипотезу?</strong></h4>
  <ul id="K2D2">
    <li id="prvu"> <strong>Сделать дамп SPI Flash</strong> с MP1 и попытаться разобрать бинарник. Дизассемблинг - классика. </li>
    <li id="f6mw"> <strong>Найти способ отключить Secure Boot</strong> (например, через уязвимость в загрузчике).</li>
    <li id="FsPE"> <strong>Попробовать загрузить кастомный код в MP1 и выполнить его</strong></li>
    <li id="pQAF"> <strong>Реализовать TCP/IP поверх PCIe-DMA и протестировать передачу данных.</strong></li>
  </ul>
  <h4 id="EvdO"><strong>Вывод:</strong></h4>
  <p id="E5qN"><strong>Если удастся взломать MP1 и заставить его загружать Unix, то видеокарта AMD сможет работать как автономный вычислительный узел без CPU.</strong> </p>
  <h2 id="9cdy"><strong>Резюме по AI - справке.</strong></h2>
  <h3 id="9PRZ"><strong>1. Архитектура GPU AMD применительно к запуску embedded Unix</strong></h3>
  <p id="PEcx">🔹 <strong>Главный процессор</strong> на видеокарте — это <strong>MP1 (Management Processor)</strong>, который представляет собой ARM-микроконтроллер.<br /> 🔹 MP1 отвечает за <strong>инициализацию GPU</strong>, загрузку VBIOS и управление питанием.<br /> 🔹 GPU подключается к системе через <strong>PCIe и работает как PCIe Endpoint</strong>, не обладая автономным загрузчиком ОС.<br /> 🔹 VRAM (видеопамять) можно использовать как RAM, но без CPU доступ к ней ограничен.</p>
  <hr />
  <h3 id="B9Tn"><strong>2. Технология старта embedded Unix на GPU AMD с MPI и TCP/IP</strong></h3>
  <p id="GozI">🔹 <strong>Основная проблема</strong> — GPU <strong>не может сам инициировать загрузку ОС</strong>, так как он ожидает управляющие команды по PCIe.<br /> 🔹 <strong>Возможные способы запуска Unix</strong>:<br /> ✅ <strong>Загрузка кастомного кода в MP1</strong> (требуется обход Secure Boot).<br /> ✅ <strong>Использование VRAM как RAM</strong> для хранения минимального ядра Unix.<br /> ✅ <strong>Организация сетевого стека через PCIe</strong> (например, DMA-доступ для передачи TCP/IP пакетов).<br /> ✅ <strong>Использование MPI для распределенных вычислений</strong>, если удастся сделать TCP/IP поверх PCIe.</p>
  <hr />
  <h3 id="IbaN"><strong>3. Ограничения производителя</strong></h3>
  <p id="GSVh">🔹 <strong>Secure Boot в MP1</strong> не позволяет загружать неподписанные прошивки.<br /> 🔹 Прошивка MP1 загружается из <strong>SPI Flash / ROM</strong>, и её изменение без взлома Secure Boot невозможно.<br /> 🔹 GPU работает <strong>как ведомое устройство</strong> (PCIe Endpoint) и не поддерживает автономную загрузку ОС.<br /> 🔹 <strong>Нет встроенного Ethernet</strong>, а PCIe требует драйвера TCP/IP.</p>
  <hr />
  <h3 id="rGfQ"><strong>4. Вопросы легальности</strong></h3>
  <p id="6Rd7">✅ В США действует закон <strong>&quot;Право на ремонт&quot; (Right to Repair Act)</strong>, который запрещает блокировку пользовательских модификаций.<br /> ✅ <strong>FTC (Федеральная торговая комиссия США) может рассматривать такие ограничения как антимонопольные.</strong><br /> ❌ Однако, производители могут аргументировать запреты необходимостью <strong>защиты интеллектуальной собственности и безопасности устройств</strong>.<br /> ✅ Возможен <strong>коллективный иск против AMD / NVIDIA</strong>, если можно доказать, что блокировки <strong>искусственно мешают использованию оборудования</strong>.</p>
  <hr />
  <h3 id="D06y"><strong>5. Как можно разблокировать MP1 и обойти Secure Boot?</strong></h3>
  <p id="1F3z">🔹 <strong>Обход проверки подписи</strong> (Secure Boot bypass) через DMA-атаку или эксплойты в драйверах.<br /> 🔹 <strong>Физическая перезапись SPI Flash</strong> (например, через выпайку и программирование чипа).<br /> 🔹 <strong>Удаление Secure Boot ключей</strong>, если EEPROM позволяет это сделать.<br /> 🔹 <strong>Подмена кода в RAM после загрузки</strong>, если удастся внедрить exploit перед проверкой подписи.</p>
  <hr />
  <h3 id="T4ST"><strong>Вывод</strong></h3>
  <p id="nnju">🔹 <strong>Теоретически</strong> можно запустить embedded Unix на GPU AMD, но нужно <strong>обойти Secure Boot и модифицировать MP1</strong>.<br /> 🔹 <strong>Практически</strong> без серьезного реверс-инжиниринга это сложно, так как архитектура GPU <strong>не предполагает автономную работу</strong>.<br /> 🔹 <strong>Ограничения прошивки могут быть незаконными</strong>, но их обход требует либо эксплойтов, либо аппаратных модификаций.</p>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <blockquote id="mULQ"><strong>&quot;Серьёзный реверс-инжиниринг&quot; </strong></blockquote>
    <p id="kgCz">в данном контексте — это не просто <strong>залить кастомную прошивку в EEPROM</strong> (что само по себе возможно), а <strong>разобраться в защите Secure Boot и механизмах работы MP1</strong>, чтобы заставить видеокарту загружать <strong>любой код без ограничений</strong>.</p>
  </section>
  <h3 id="C68C"><strong>Что именно нужно сделать для кастомной прошивки MP1?</strong></h3>
  <p id="lzFE">1️⃣ <strong>Изучить текущую прошивку MP1</strong></p>
  <ul id="YlKA">
    <li id="KMPd">Дампить содержимое SPI Flash (EEPROM) видеокарты.</li>
    <li id="Wc7g">Декодировать бинарник (анализ формата, структуры, сигнатуры AMD).</li>
    <li id="LLV4">Найти точки проверки Secure Boot.</li>
  </ul>
  <p id="BKSv">2️⃣ <strong>Обойти проверку подписи Secure Boot</strong></p>
  <ul id="r7dz">
    <li id="D23C">Найти и использовать уязвимости (stack overflow, buffer overflow, bypass механизмы).</li>
    <li id="9RtR">Использовать аппаратные атаки (glitching, fault injection) для отключения защиты.</li>
    <li id="a82I">Анализировать и модифицировать коды RSA-проверки (если возможно).</li>
  </ul>
  <p id="85ZB">3️⃣ <strong>Разработать и протестировать кастомную прошивку MP1</strong></p>
  <ul id="WqoL">
    <li id="vICr">Написать минимальный загрузчик Unix и засунуть его в MP1.</li>
    <li id="qZhP">Подготовить поддержку работы с VRAM как RAM.</li>
    <li id="Spa3">Реализовать TCP/IP-стек через PCIe для взаимодействия с сетью.</li>
  </ul>
  <p id="EhiR">4️⃣ <strong>Записать прошивку в EEPROM и проверить запуск</strong></p>
  <ul id="Buv2">
    <li id="7BXa">Если Secure Boot отключён → записываем через SPI-программатор.</li>
    <li id="ZgII">Если Secure Boot активен → ищем способ его отключения.</li>
  </ul>
  <hr />
  <h3 id="Y6fY"><strong>Можно ли сделать это в гараже?</strong></h3>
  <p id="uoSe">✅ <strong>Теоретически — да</strong>, если у тебя есть программатор EEPROM, хороший дизассемблер, и ты умеешь реверсить бинарники.<br /> ❌ <strong>Практически — сложно</strong>, потому что Secure Boot защищает MP1, и без эксплойтов или аппаратных атак прошивка просто <strong>не запустится</strong>.</p>
  <blockquote id="eZi7"><strong>Итог</strong>: Да, можно <strong>залить свою прошивку в EEPROM</strong>, но если не отключить Secure Boot <strong>MP1 просто её не примет</strong>.</blockquote>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@ind_ex-51282/app_v_KDE_Plasma_servis_systray_system_settings</guid><link>https://teletype.in/@ind_ex-51282/app_v_KDE_Plasma_servis_systray_system_settings?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282</link><comments>https://teletype.in/@ind_ex-51282/app_v_KDE_Plasma_servis_systray_system_settings?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=ind_ex-51282#comments</comments><dc:creator>ind_ex-51282</dc:creator><title>Интеграция приложения в KDE Plasma и его запуск в качестве системного сервиса</title><pubDate>Thu, 20 Feb 2025 16:15:26 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/b1/80/b180d981-cca4-49fb-83c8-d2c29d0d2151.png"></media:content><category>Linux &amp;amp; Tools</category><description><![CDATA[<img src="https://img1.teletype.in/files/82/9e/829e2172-4357-4576-9477-5fb5238541c8.png"></img>Для полной интеграции приложения в системе KDE Plasma и его запуска в качестве системного сервиса, нужно создать systemd-сервис, организовать StatusNotifierItem для systray, т.е. значок в системном трее, добавить в системные настройки KDE (скомпилировать KCModule) и радоваться сидеть точить печеньки.]]></description><content:encoded><![CDATA[
  <p id="AeQD">Для полной интеграции приложения в системе <strong>KDE Plasma</strong> и его запуска в качестве <strong>системного сервиса</strong>, нужно создать systemd-сервис, организовать StatusNotifierItem для systray, т.е. значок в системном трее, добавить в системные настройки KDE (скомпилировать KCModule) и радоваться сидеть точить печеньки.</p>
  <figure id="g0eR" class="m_column">
    <img src="https://img1.teletype.in/files/82/9e/829e2172-4357-4576-9477-5fb5238541c8.png" width="1060" />
    <figcaption>Интеграция приложения в KDE Plasma</figcaption>
  </figure>
  <hr />
  <h3 id="PiDs"><strong>1. Создать systemd-сервис</strong></h3>
  <p id="KxzE">Если приложение должно работать в качестве фонового сервиса, нужно создать unit-файл для <strong>systemd</strong>.</p>
  <h4 id="UNLv"><strong>Шаги:</strong></h4>
  <ol id="p1xU">
    <li id="bAIB">Открыть терминал и создать файл службы: <code>sudo nano /etc/systemd/system/myapp.service </code></li>
    <li id="YXqX">Добавить следующее содержимое, заменив <code>myapp</code> на реальное имя приложения: </li>
  </ol>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="O3z0" data-lang="graphql">[Unit] Description=My Custom App 
After=network.target 
[Service] 
ExecStart=/usr/bin/myapp 
Restart=always 
User=myuser Group=mygroup 
[Install] WantedBy=multi-user.target </pre>
  </section>
  <ol id="NGSq">
    <ul id="lx27">
      <li id="fFlt"><strong>ExecStart</strong> — путь к исполняемому файлу приложения.</li>
      <li id="kkZQ"><strong>User</strong>/<strong>Group</strong> — пользователь и группа, от имени которых запускается процесс.</li>
    </ul>
    <li id="yhRX">Сохранить (<code>CTRL+X</code>, затем <code>Y</code> и <code>Enter</code>).</li>
    <li id="4IUH">Перезапустить <code>systemd</code>, чтобы загрузить новый сервис: <code>sudo systemctl daemon-reload </code></li>
    <li id="fgx5">Включить сервис для автозапуска: <code>sudo systemctl enable myapp </code></li>
    <li id="ggp3">Запустить сервис: <code>sudo systemctl start myapp </code></li>
    <li id="l6ad">Проверить статус работы: <code>sudo systemctl status myapp </code></li>
  </ol>
  <hr />
  <h3 id="81nN"><strong>2. Добавить в автозагрузку KDE (для GUI-приложений)</strong></h3>
  <p id="TNKl">Если приложение имеет графический интерфейс и должно запускаться при входе пользователя, то лучше использовать <strong>автозапуск KDE</strong>.</p>
  <h4 id="BQAb"><strong>Способ 1: Добавление через GUI</strong></h4>
  <ol id="dVFY">
    <li id="Q3VQ"><strong>&quot;Параметры системы&quot; → &quot;Автозапуск&quot;</strong></li>
    <li id="laT1">Нажать <strong>&quot;Добавить программу&quot;</strong>, выбрать исполняемый файл.</li>
  </ol>
  <h4 id="6ajW"><strong>Способ 2: Создать <code>.desktop</code>-файл</strong></h4>
  <ol id="sG4n">
    <li id="2kRY">Создать файл в <code>~/.config/autostart/</code>: <code>nano ~/.config/autostart/myapp.desktop </code></li>
    <li id="ODvv">Добавить содержимое: </li>
  </ol>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="3uTd" data-lang="graphql">[Desktop Entry] 
Type=Application 
Exec=/usr/bin/myapp 
Hidden=false 
NoDisplay=false 
X-GNOME-Autostart-enabled=true 
Name=MyApp 
Comment=Запуск моего приложения </pre>
  </section>
  <ol id="WmtU">
    <li id="HYop">Сохранить (<code>CTRL+X</code>, затем <code>Y</code> и <code>Enter</code>).</li>
  </ol>
  <p id="2wXZ">После выхода из системы и повторного входа приложение автоматически запустится.</p>
  <hr />
  <h3 id="ReTy"><strong>Выбор метода</strong></h3>
  <ul id="5LM0">
    <li id="GHJ4"><strong>Если это серверное/фоновое приложение</strong> → использовать <code>systemd</code>.</li>
    <li id="dUh5"><strong>Если это GUI-приложение</strong> → добавить в автозапуск KDE через <code>~/.config/autostart/</code>.</li>
  </ul>
  <p id="E4Gx">Если нужно запускать GUI-приложение через <strong>systemd</strong>, то <code>ExecStart</code> в <code>.service</code>-файле нужно изменить на:</p>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="ECkK" data-lang="shell">ExecStart=/usr/bin/env DISPLAY=:0 /usr/bin/myapp</pre>
  </section>
  <p id="E4qp">Это укажет, что приложение должно работать в графической среде.</p>
  <hr />
  <p id="6b9w">Чтобы приложение на <strong>C</strong> интегрировалось в <strong>системный трей KDE Plasma</strong> и его настройки можно было управлять через <strong>системные параметры</strong>, нужно использовать <strong>StatusNotifierItem (SNI)</strong> и <strong>KConfig</strong>.</p>
  <h3 id="NdQ6"><strong>1. Добавление значка в системный трей (StatusNotifierItem)</strong></h3>
  <p id="iFxO">KDE Plasma больше не поддерживает старый <code>XEmbed</code>, поэтому нужно использовать <strong>DBus интерфейс SNI</strong>. Для этого можно использовать <strong>Qt</strong> или писать вручную через <code>DBus</code>.</p>
  <h4 id="5zWw"><strong>Способ 1: Использование Qt и QSystemTrayIcon</strong></h4>
  <p id="uUGF">Если приложение уже использует <strong>Qt</strong>, то можно просто использовать <code>QSystemTrayIcon</code>:</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="ebR7" data-lang="cpp">#include &lt;QApplication&gt;
#include &lt;QSystemTrayIcon&gt;
#include &lt;QMenu&gt;
#include &lt;QAction&gt;

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QSystemTrayIcon trayIcon;
    trayIcon.setIcon(QIcon(
    &quot;/usr/share/icons/hicolor/48x48/apps/myapp.png&quot;));
    
    QMenu menu;
    QAction exitAction(&quot;Выход&quot;, &amp;app);
    QObject::connect(
    &amp;exitAction, &amp;QAction::triggered, &amp;app, &amp;QApplication::quit);
    menu.addAction(&amp;exitAction);

    trayIcon.setContextMenu(&amp;menu);
    trayIcon.show();

    return app.exec();
}
</pre>
  </section>
  <p id="6Xv7">🔹 <strong>Этот код</strong> создаст значок в трее с контекстным меню.</p>
  <p id="xnMw">⚠️ <strong>Важно:</strong> Если значок не отображается, установите пакет <strong><code>libappindicator</code></strong>:</p>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="XWad" data-lang="shell">sudo apt install libappindicator3-1</pre>
  </section>
  <hr />
  <h4 id="L54R"><strong>Способ 2: Реализация SNI через DBus</strong></h4>
  <p id="USPO">Если приложение <strong>не использует Qt</strong>, можно зарегистрировать значок вручную через <strong>DBus</strong>. Вот пример на <strong>C</strong>:</p>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="gLXZ" data-lang="cpp">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;gio/gio.h&gt;

int main() {
    GDBusConnection *connection;
    GError *error = NULL;

    // Подключаемся к DBus
    connection = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &amp;error);
    if (error) {
        g_printerr(&quot;Ошибка подключения к DBus: %s\n&quot;, error-&gt;message);
        g_error_free(error);
        return 1;
    }

    // Регистрируем значок в трее
    g_dbus_connection_call_sync
    (connection,
                &quot;org.kde.StatusNotifierWatcher&quot;,
                &quot;/StatusNotifierWatcher&quot;,
                &quot;org.kde.StatusNotifierWatcher&quot;,
                &quot;RegisterStatusNotifierItem&quot;,
                g_variant_new
                (&quot;(s)&quot;, &quot;/org/myapp/StatusNotifierItem&quot;),
                NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &amp;error);

    if (error) {
        g_printerr(&quot;Ошибка регистрации SNI: %s\n&quot;, error-&gt;message);
        g_error_free(error);
        return 1;
    }

    printf(&quot;Значок добавлен в трей!\n&quot;);

    return 0;
}
</pre>
  </section>
  <p id="6wsj">Этот код регистрирует <strong>StatusNotifierItem</strong> в Plasma через <strong>DBus</strong>.</p>
  <hr />
  <h3 id="13tj"><strong>2. Интеграция в системные настройки (KConfig)</strong></h3>
  <p id="g4yJ">Чтобы приложение сохраняло настройки в <strong>системных параметрах KDE</strong>, можно использовать <strong>KConfig</strong>.</p>
  <ol id="rC66">
    <li id="nDus"><strong>Установить библиотеку KDE Frameworks 5:</strong> <code>sudo apt install libkf5config-dev </code></li>
    <li id="hhoa"><strong>Использовать KConfig в коде:</strong></li>
  </ol>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="gfOa" data-lang="cpp">#include &lt;KConfig&gt;
#include &lt;KConfigGroup&gt;
#include &lt;QString&gt;
#include &lt;QDebug&gt;

void saveSettings() {
    KConfig config(&quot;myappsettingsrc&quot;);
    KConfigGroup group(&amp;config, &quot;General&quot;);
    group.writeEntry(&quot;showTrayIcon&quot;, true);
    config.sync();
}

void loadSettings() {
    KConfig config(&quot;myappsettingsrc&quot;);
    KConfigGroup group(&amp;config, &quot;General&quot;);
    bool showTray = group.readEntry(&quot;showTrayIcon&quot;, true);
    qDebug() &lt;&lt; &quot;Значок в трее:&quot; &lt;&lt; showTray;
}

int main() {
    saveSettings();
    loadSettings();
    return 0;
}
</pre>
  </section>
  <p id="z3Mr">🔹 Файл конфигурации сохранится в <code>~/.config/myappsettingsrc</code>.</p>
  <hr />
  <h3 id="OfkO"><strong>3. Добавление в системные настройки KDE (KCModule)</strong></h3>
  <p id="uEBb">Если нужно, чтобы приложение имело <strong>свой пункт в &quot;Параметры системы&quot;</strong>, то создаётся <strong>KCM (KDE Configuration Module)</strong>.</p>
  <ol id="6OYa">
    <li id="fVVd"><strong>Создаём .desktop-файл модуля KDE:</strong> </li>
  </ol>
  <section style="background-color:hsl(hsl(236, 74%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <pre id="PE5i" data-lang="shell">sudo nano /usr/share/kservices5/myapp.desktop  
Содержимое: 
[Desktop Entry] 
Type=Service 
X-KDE-ServiceTypes=KCModule 
X-KDE-Library=myappconfig 
X-KDE-PluginInfo-Name=myapp 
X-KDE-PluginInfo-Category=Settings 
Name=Настройки MyApp 
Comment=Конфигурация приложения MyApp </pre>
  </section>
  <ol id="ZPFi">
    <li id="QlxE"><strong>Создаём KCM-файл на C++:</strong> </li>
  </ol>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="K6sy"><code>#include &lt;KCModule&gt; #include &lt;KAboutData&gt; #include &lt;KPluginFactory&gt; #include &lt;QVBoxLayout&gt; #include &lt;QCheckBox&gt; class MyAppConfig : public KCModule { Q_OBJECT public: MyAppConfig(QWidget *parent, const QVariantList &amp;) : KCModule(parent) { auto *layout = new QVBoxLayout(this); auto *checkbox = new QCheckBox(&quot;Показывать значок в трее&quot;, this); layout-&gt;addWidget(checkbox); } }; K_PLUGIN_FACTORY(MyAppConfigFactory, registerPlugin&lt;MyAppConfig&gt;();) K_EXPORT_PLUGIN(MyAppConfigFactory(&quot;myappconfig&quot;)) </code></p>
  </section>
  <ol id="5jOC">
    <li id="dB4F"><strong>Компиляция KCM:</strong></li>
  </ol>
  <section style="background-color:hsl(hsl(0,   0%,  var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="cZ76"> <code>g++ -o myappconfig.so myappconfig.cpp $(pkg-config --cflags --libs KF5ConfigWidgets) -shared -fPIC sudo mv myappconfig.so /usr/lib/qt/plugins/ </code></p>
  </section>
  <p id="UdVn">Теперь <strong>настройки</strong> появятся в <strong>системных параметрах</strong> KDE!</p>
  <hr />
  <h3 id="nZS6"><strong>Заключение</strong></h3>
  <ol id="Ptz6">
    <li id="SGas"><strong>Добавить значок в трей:</strong></li>
    <ul id="sMrY">
      <li id="Z62R">Через <code>QSystemTrayIcon</code> (если <strong>Qt</strong>)</li>
      <li id="lAdl">Через <strong>DBus SNI</strong> (если <strong>C без Qt</strong>)</li>
    </ul>
    <li id="ENSO"><strong>Сохранение настроек:</strong></li>
    <ul id="xNWD">
      <li id="qbVL">Использовать <code>KConfig</code></li>
    </ul>
    <li id="BwUU"><strong>Добавление в &quot;Параметры системы&quot; KDE:</strong></li>
    <ul id="dRKL">
      <li id="Hftt">Создать <strong>KCModule</strong></li>
    </ul>
  </ol>
  <hr />

]]></content:encoded></item></channel></rss>