<?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>Очередной дилетант</title><generator>teletype.in</generator><description><![CDATA[Автор курса English for IT &amp; Computer Science]]></description><image><url>https://img2.teletype.in/files/1c/fb/1cfb28b1-1aae-4262-a176-9b7c261cd6ba.png</url><title>Очередной дилетант</title><link>https://teletype.in/@nerepetitor</link></image><link>https://teletype.in/@nerepetitor?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/nerepetitor?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/nerepetitor?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Thu, 16 Apr 2026 11:15:40 GMT</pubDate><lastBuildDate>Thu, 16 Apr 2026 11:15:40 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@nerepetitor/composeBuildError</guid><link>https://teletype.in/@nerepetitor/composeBuildError?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor</link><comments>https://teletype.in/@nerepetitor/composeBuildError?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor#comments</comments><dc:creator>nerepetitor</dc:creator><title>Starting in Kotlin 2.0, the Compose Compiler Gradle plugin is required</title><pubDate>Tue, 17 Mar 2026 09:32:33 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/8d/09/8d09e3a8-558f-4b34-bea5-80b66ab047db.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/5e/fe/5efef13e-c19f-4c02-a352-5aafd8e4676f.png"></img>]]></description><content:encoded><![CDATA[
  <p id="d2FH">Если сборка проекта Android завершилась следующим сообщением об ошибке:</p>
  <section style="background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="86Na"><code>Starting in Kotlin 2.0, the Compose Compiler Gradle plugin is required</code></p>
  </section>
  <p id="gexA">Это означает, что вам нужно подключить плагин <strong>Compose Compiler</strong>. С момента выхода Kotlin 2.0 Compose Compiler поставляется вместе с Kotlin и должен быть добавлен в проект как плагин.</p>
  <p id="GYwL">Убедитесь, что в каталоге <strong>libs.versions.toml</strong> <code>[plugins]</code> у вас есть зависимость <code>org.jetbrains.kotlin.plugin.compose</code>:</p>
  <pre id="FFw0" data-lang="kotlin">kotlin-compose = { id = &quot;org.jetbrains.kotlin.plugin.compose&quot;, version.ref = &quot;kotlin&quot; }</pre>
  <p id="LCQ4">Версия плагина должна совпадать с версией Kotlin.</p>
  <p id="6fJ9">Добавьте плагин на уровне проекта(<strong>build.gradle.kts</strong>):</p>
  <pre id="734g" data-lang="kotlin">plugins {
    alias (libs.plugins.kotlin.compose) apply false
}</pre>
  <p id="jCUK">и на уровне модуля (<strong>build.gradle.kts</strong>):</p>
  <pre id="EeCF" data-lang="kotlin">plugins {
    alias(libs.plugins.kotlin.compose)
}</pre>
  <p id="1EgW">Так же убедитесь, что на уровне модуля включена поддержка Jetpack Compose:</p>
  <pre id="oN0q" data-lang="kotlin">android {
    buildFeatures {
        compose = true
    }
}</pre>
  <p id="Kipq">Синхронизируем проект, нажав на <strong>Sync now</strong> вверху (или воспользовавшись сочетанием <strong>Ctrl</strong> + <strong>Shift</strong> + <strong>O</strong>).</p>
  <figure id="7Wqf" class="m_column">
    <img src="https://img3.teletype.in/files/29/7c/297c3efd-4d36-4dfa-bb7b-6da857efba1f.png" width="1713" />
    <figcaption>Gradle сообщает, что в файлах произошли изменения</figcaption>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@nerepetitor/passwordVisibility</guid><link>https://teletype.in/@nerepetitor/passwordVisibility?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor</link><comments>https://teletype.in/@nerepetitor/passwordVisibility?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor#comments</comments><dc:creator>nerepetitor</dc:creator><title>Скрытие пароля в Android (Jetpack Compose)</title><pubDate>Tue, 24 Feb 2026 07:36:29 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/4b/8c/4b8c942a-947c-4472-b589-94ea8a3a4332.png"></media:content><category>Android</category><description><![CDATA[<img src="https://img3.teletype.in/files/a2/d6/a2d6b62a-9e9e-486f-bdc1-3e11822f9e60.png"></img>Дайте пользователям возможность показать или скрыть пароль.]]></description><content:encoded><![CDATA[
  <p id="5azb">Дайте пользователям возможность показать или скрыть пароль.</p>
  <p id="u32O">Реализовать это в <strong>Jetpack Compose</strong> можно при помощи <code>trailingIcon</code>. Это иконка в конце поля ввода, которую можно сделать кликабельной. </p>
  <figure id="fgmN" class="m_original">
    <img src="https://img3.teletype.in/files/e1/86/e186a98d-da34-4952-ac7a-428cf0e36ab4.png" width="567" />
  </figure>
  <p id="rs6c">Объявим переменную <code>passwordVisible</code>. Она будет принимать значения <code>true</code> или <code>false</code> в зависимости от того, хочет ли пользователь видеть пароль.</p>
  <p id="ZsZp">Чтобы сохранить состояние при рекомпозиции и смене конфигурации (например, при повороте устройства), будем использовать <code>rememberSaveable</code> (эта функция хранит значение в <code>Bundle</code>).</p>
  <p id="z3pb">Инициализируем <code>passwordVisible</code> через <code>mutableStateOf()</code> , используя делегат <code>by</code>. Пусть изначально пароль будет скрыт — в <code>mutableStateOf()</code> в качестве параметра передаём значение <code>false</code>. </p>
  <pre id="e77P" data-lang="kotlin">var passwordVisible by rememberSaveable { mutableStateOf(false) }</pre>
  <p id="N9TJ">Для работы с делегатом <code>by</code> импортируем следующие функции:</p>
  <pre id="57gu" data-lang="kotlin">import androidx.compose.runtime.setValue
import androidx.compose.runtime.getValue</pre>
  <p id="MLTC">Создадим поле ввода. В <code>OutlinedTextField</code> за отображение текста отвечает параметр <code>visualTransformation</code>. </p>
  <p id="ykwR">В коде ниже если <code>passwordVisible == true</code>, то применяется <code>VisualTransformation.None</code> (пароль виден), если <code>false</code> — применяется <code>PasswordVisualTransformation</code> (пароль в виде точек •••••••).</p>
  <pre id="X8Lm" data-lang="kotlin">visualTransformation = if (passwordVisible) VisualTransformation.None
else PasswordVisualTransformation()</pre>
  <p id="pqos">В ресурсы проекта добавим два значка (<code>ic_visibility_off</code> и <code>ic_visibility_on</code>) для иконки. Передадим в <code>trailingIcon</code> лямбда-выражение:</p>
  <pre id="OT4m" data-lang="kotlin">trailingIcon = {
    IconButton(
        onClick = { passwordVisible = !passwordVisible }
    ) {}
}</pre>
  <p id="qYtH"><code>IconButton</code> содержит обработчик события:</p>
  <pre id="v5Qg" data-lang="kotlin">onClick = { passwordVisible = !passwordVisible }</pre>
  <p id="zURR">При нажатии состояние <code>passwordVisible</code> будет инвертироваться.</p>
  <p id="WI6i">Ресурс для <code>Icon</code> выбирается динамически в зависимости от значения в переменной <code>passwordVisible</code>.</p>
  <pre id="jxgd" data-lang="kotlin">@Composable
fun PasswordField(
    value: String,
    onValueChange: (String) -&gt; Unit
) {
    var passwordVisible by rememberSaveable { mutableStateOf(false) }

    OutlinedTextField(
        value = value,
        onValueChange = onValueChange,
        label = { Text(&quot;Password&quot;) },

        visualTransformation = if (passwordVisible) 
        VisualTransformation.None
        else PasswordVisualTransformation(),

        trailingIcon = {
            IconButton(
                onClick = { passwordVisible = !passwordVisible }
            ) {
                Icon(
                    painter = painterResource(
                        if (passwordVisible) R.drawable.ic_visibility_on
                        else R.drawable.ic_visibility_off
                    ),
                    contentDescription = if (passwordVisible) 
                    &quot;Hide password&quot; else &quot;Show password&quot;
                )
            }
        }
    )
}</pre>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@nerepetitor/iconDesign</guid><link>https://teletype.in/@nerepetitor/iconDesign?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor</link><comments>https://teletype.in/@nerepetitor/iconDesign?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor#comments</comments><dc:creator>nerepetitor</dc:creator><title>Дизайн иконки приложения</title><pubDate>Fri, 20 Feb 2026 06:50:18 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/52/ae/52aef934-5f13-4889-868c-9695b7fa03ff.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/75/9e/759eed88-d399-4975-905a-147a1bdf9da0.png"></img>Создание иконки в Figma]]></description><content:encoded><![CDATA[
  <p id="toPs">Иконка должна доносить до пользователя идею приложения. Вписываться в интерфейс, но при этом быть уникальной.</p>
  <p id="HJAE">Минимализм всё ещё в тренде, поэтому не перегружайте иконку лишними деталями.</p>
  <p id="ZfG8">Мелкий текст тяжело читать, и его использование создаст проблемы в случае локализации, если, к примеру, приложение выйдет на китайский рынок. При этом вы можете использовать первую букву из названия компании, как это делают Tumblr или Pinterest:</p>
  <figure id="TVyY" class="m_column">
    <img src="https://img2.teletype.in/files/99/ad/99ad6442-fe3a-4453-8839-6e2cac82d9a6.jpeg" width="1303" />
    <figcaption>Логотипы Tumblr и Pinterest</figcaption>
  </figure>
  <p id="QG7W">Не используйте фотографии! Использование фотографий в иконках приложений давно стало дурным тоном. Чтобы изображение хорошо смотрелось на любых устройствах, оно должно быть в формате SVG.</p>
  <h2 id="OS7x">Создание иконки в Figma</h2>
  <p id="F6GX">На главной странице выберите <strong>Design</strong>.</p>
  <figure id="0aFL" class="m_original">
    <img src="https://img3.teletype.in/files/27/03/2703e23c-1d68-4fa9-861c-703cfe1cf1aa.png" width="133" />
  </figure>
  <figure id="DM53" class="m_column">
    <img src="https://img4.teletype.in/files/3a/80/3a80ac85-91c1-4afd-8687-a878f9f265fd.png" width="1845" />
  </figure>
  <p id="8EQa">Увеличьте масштаб до 400% (можете воспользоваться сочетанием <strong>Ctrl +</strong>) и нарисуйте квадрат 110*110, нажав клавишу <strong>R </strong>и удерживая<strong> Shift</strong>. </p>
  <figure id="YXrm" class="m_column">
    <img src="https://img2.teletype.in/files/1c/0a/1c0afdc0-987b-4110-912f-9e7df628c81c.png" width="921" />
  </figure>
  <p id="ymLK">Зафиксируйте соотношение сторон (<strong>Lock aspect ratio</strong>, кнопка справа).</p>
  <figure id="iIwc" class="m_original">
    <img src="https://img1.teletype.in/files/06/7b/067bf363-9875-4dc7-95e8-bb23d985a4fb.png" width="283" />
  </figure>
  <figure id="jUr2" class="m_original">
    <img src="https://img3.teletype.in/files/ee/ef/eeef1bc2-83f8-43ee-9204-19327ba5738a.png" width="291" />
  </figure>
  <p id="815l">В слоях (<strong>Layers</strong>) вы увидите Rectangle 1. Переименуйте его в <code>ic_launcher_background</code> и зафиксируйте (<strong>Toggle layer locking</strong>).</p>
  <figure id="jJ9f" class="m_original">
    <img src="https://img2.teletype.in/files/19/54/1954d328-645e-456d-b160-a8f2ba8881d3.png" width="291" />
  </figure>
  <figure id="7wGf" class="m_original">
    <img src="https://img2.teletype.in/files/59/48/5948b3c5-88e9-481d-846e-f8182d7d2649.png" width="292" />
  </figure>
  <p id="KzcW">Задайте цвет фона (<strong>Fill</strong>). В нашем случае задний фон будет однотонным. Но вы можете использовать и градиент. </p>
  <figure id="JY7s" class="m_column">
    <img src="https://img2.teletype.in/files/9f/60/9f60d8d9-f367-4dd7-b3db-eee4ae1d6fbb.png" width="1217" />
  </figure>
  <p id="UWC5">Добавьте логотип на передний план.</p>
  <p id="buOU">Если у вас нет готового логотипа, вы можете воспользоваться Resources (нажмите комбинацию клавиш <strong>Shift</strong> + <strong>I</strong>). Здесь можно найти простые SVG-иконки.</p>
  <figure id="4GL8" class="m_column">
    <img src="https://img3.teletype.in/files/ec/f0/ecf0a503-bbf4-4bdf-a54f-c295aa3e1d56.png" width="1118" />
    <figcaption>Resources</figcaption>
  </figure>
  <p id="10sU">Мы же для примера будем использовать векторное изображение единорога. В слоях дайте ему название <code>ic_launcher_foreground</code>.</p>
  <p id="dpZR">Выделите <code>ic_launcher_foreground</code> и <code>ic_launcher_background</code> одновременно, удерживая <strong>Shift</strong>, кликните правой кнопкой мыши и создайте фрейм (или нажмите <strong>Ctrl</strong> + <strong>Alt</strong> + <strong>G</strong>). Можете назвать его <code>Launcher</code>.</p>
  <figure id="qXMj" class="m_original">
    <img src="https://img3.teletype.in/files/ad/c0/adc0c51b-f2d9-4d72-8565-f84118f9add0.png" width="479" />
  </figure>
  <figure id="x9Tx" class="m_original">
    <img src="https://img1.teletype.in/files/42/da/42da146e-3158-4a1e-bdae-a8f462ec3879.png" width="293" />
  </figure>
  <p id="Txjl">Поместим единорога в центр фрейма. </p>
  <figure id="j6ba" class="m_column">
    <img src="https://img2.teletype.in/files/d1/d7/d1d7ec14-ecb9-4057-b889-8caae7ce12b9.png" width="798" />
    <figcaption>Выравниваем по горизонатли и по вертикали.</figcaption>
  </figure>
  <p id="evnV">Проверьте, как будет смотреться иконка на разных устройствах Android с помощью этого <a href="https://www.figma.com/community/file/778486426750404931" target="_blank">шаблона</a>.</p>
  <figure id="embE" class="m_column">
    <img src="https://img4.teletype.in/files/7b/95/7b9579cc-0bb0-46bd-8b24-d5050d331ee2.png" width="1042" />
    <figcaption>Единорог не должен выходить за рамки круга.</figcaption>
  </figure>
  <p id="9anz">Наконец, экспортируйте иконку в формате SVG. </p>
  <figure id="8z5O" class="m_original">
    <img src="https://img3.teletype.in/files/af/4e/af4eedab-132c-4cad-b752-3d17d566e6d2.png" width="289" />
  </figure>
  <p id="R27Z">Если ваш фон однотонный, экспортировать его для <strong>Android Studio </strong>не нужно, просто скопируйте шестнадцатеричный код цвета (в нашем случае это <code>#B4E1FF</code>).</p>
  <p id="wn0H">О том, как поменять иконку вашего Android-приложения, в <a href="https://teletype.in/@nerepetitor/androidAppIcon" target="_blank">другой статье</a>.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@nerepetitor/intellij</guid><link>https://teletype.in/@nerepetitor/intellij?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor</link><comments>https://teletype.in/@nerepetitor/intellij?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor#comments</comments><dc:creator>nerepetitor</dc:creator><title>Установка IntelliJ IDEA в Linux</title><pubDate>Tue, 03 Feb 2026 08:16:55 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/58/96/5896b3d6-83fc-48e6-8fbd-fc00a6758609.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/d1/37/d1378f3b-17c2-467f-827c-7f544712867b.png"></img>Перейдите на официальный сайт и скачайте архив.]]></description><content:encoded><![CDATA[
  <p id="qDoV">Перейдите на <a href="https://www.jetbrains.com/idea/download/" target="_blank">официальный сайт</a> и скачайте архив. </p>
  <figure id="yxHR" class="m_column">
    <img src="https://img2.teletype.in/files/df/6a/df6af18a-c362-4bbc-b737-327d0a95f609.png" width="1824" />
    <figcaption>Официальный сайт JetBrains</figcaption>
  </figure>
  <p id="x0bW">В папке Downloads проверьте наличие файла с расширением <code>.tar.gz</code> (например, <code>idea-2025.3.1.1.tar.gz</code>).</p>
  <p id="szCw">Распакуйте архив (щелчок правой кнопкой мыши, <strong>Извлечь</strong>). Теперь откройте директорию (в данном примере это <code>idea-2025.3.1.1</code>) в терминале.</p>
  <p id="aDVi">Командой <code>ls</code> проверьте содержимое. В нашем случае внутри находится директория <code>idea-IU-253.29346.240</code>. Переходим в неё командой <code>cd</code>:</p>
  <p id="DBdY"><code>cd idea-IU-253.29346.240</code></p>
  <p id="qre0">Снова смотрим содержимое. На этот раз видим множество файлов и директорий, но нас интересует папка <code>bin</code> (от англ. <em>binary file</em> —  бинарный, или двоичный файл), где находятся исполняемые файлы. Переходим в неё:</p>
  <p id="Q3HW"><code>cd bin</code></p>
  <p id="IVbV"><code>ls</code></p>
  <p id="PjMy">Нужный нам файл называется <code>idea.sh</code>. Запускаем его следующей командой:</p>
  <p id="j32w"><code>./idea.sh</code></p>
  <figure id="0tpY" class="m_column">
    <img src="https://img4.teletype.in/files/bf/64/bf64cbd8-4df6-49fd-9376-fed81242566a.png" width="1389" />
    <figcaption>В терминале</figcaption>
  </figure>
  <p id="efN5">Теперь, когда вы запустили IntelliJ, создайте проект (или откройте уже существующий). Самое время создать ярлык приложения. Для этого перейдите в  инструменты на верхней панели и нажмите на <strong>Создать ярлык</strong> (<strong>Tools</strong> -&gt; <strong>Create Desktop Entry...</strong>).</p>
  <p id="QAZE"></p>
  <figure id="OPkp" class="m_column">
    <img src="https://img4.teletype.in/files/7f/2f/7f2ffe3a-6d85-4058-b7c9-1a5bbab38ceb.png" width="957" />
  </figure>
  <p id="p35i">Теперь у вас появится ярлык для запуска без использования терминала.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@nerepetitor/authenticationFailed</guid><link>https://teletype.in/@nerepetitor/authenticationFailed?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor</link><comments>https://teletype.in/@nerepetitor/authenticationFailed?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor#comments</comments><dc:creator>nerepetitor</dc:creator><title>Authentication failed...</title><pubDate>Fri, 01 Aug 2025 15:15:31 GMT</pubDate><description><![CDATA[<img src="https://img1.teletype.in/files/89/cf/89cfb132-86b2-424b-b1f5-cc7ed0c3227c.png"></img>Вы работаете в IDE, делитесь проектом на GitHub, и всё в порядке. Но в какой-то момент вы вдруг сталкиваетесь с необходимостью пройти аутентификацию.]]></description><content:encoded><![CDATA[
  <p id="DW4w">Вы работаете в IDE, делитесь проектом на GitHub, и всё в порядке. Но в какой-то момент вы решаете запушить изменения на удалённый репозиторий через терминал и вдруг сталкиваетесь с необходимостью пройти аутентификацию: вас просят ввести имя пользователя и пароль. Вы вводите данные, нажимаете Enter, но почему-то возникает ошибка — войти не удалось.</p>
  <pre id="PSF4" data-lang="git">remote: No anonymous write access. 
fatal: Authenticaion failed for &#x27;https://github.com/&lt;ваш репозиторий&gt;&#x27;</pre>
  <p id="Z5kb">Но почему, если вы ввели правильный пароль?</p>
  <figure id="X1h4" class="m_column">
    <img src="https://img1.teletype.in/files/89/cf/89cfb132-86b2-424b-b1f5-cc7ed0c3227c.png" width="1114" />
  </figure>
  <p id="FvQQ">На самом деле с 2021 года GitHub <strong>больше не поддерживает пароли</strong> для <code>https://</code>. Это означает, что войти по логину и паролю не получится. Нужно использовать <strong>Personal Access Token </strong>или<strong> SSH.</strong></p>
  <p id="09e6">О том, как использовать SSH-ключи, читайте <a href="https://teletype.in/@nerepetitor/generateSSH" target="_blank">здесь</a>.</p>
  <p id="wDZt">Но что, если вы уже сгенерировали ключ? Например, вы создали его для работы над прошлым проектом. В таком случае ключ у вас уже есть, и вы хотите использовать и в этот раз. </p>
  <p id="J39u">Тогда вам нужно воспользоваться командой <code>git remote -v</code>, чтобы увидеть подключённые удалённые репозитории, с которыми работает локальный проект. Если они начинаются с <code>https://</code>, то вам нужно изменить URL.</p>
  <figure id="K40V" class="m_column">
    <img src="https://img4.teletype.in/files/f0/1f/f01ff584-cfa8-485c-bd68-1535bb2afa50.png" width="1114" />
    <figcaption>Аутентификация не сработала, потому что пароли по https:// больше не используются</figcaption>
  </figure>
  <p id="o6vn">Сделать это можно командой <code>git remote set-url origin git@github.com: username/repo.git</code>, где <em>username</em> — ваше имя на GitHub, а <em>repo</em> — название удалённого репозитория.</p>
  <p id="OU3O">Например, для пользователя <em>The-uncanny-valley</em> и репозитория по адресу <em>https://github.com/The-uncanny-valley/CatChat</em> это выглядит следующим образом:</p>
  <pre id="Ds1G" data-lang="git">git remote set-url origin git@github.com:The-uncanny-valley/CatChat.git</pre>
  <p id="gcVs">Вновь проверьте подключённые удалённые репозитории:</p>
  <pre id="Vvfd" data-lang="git">git remote -v</pre>
  <p id="F7jT">Теперь вы должны увидеть нечто подобное:</p>
  <figure id="95zl" class="m_column">
    <img src="https://img1.teletype.in/files/8c/e3/8ce38cf2-c7e8-4092-b2be-fe6fa179838d.png" width="1568" />
    <figcaption>После изменения URL</figcaption>
  </figure>
  <p id="dXyI">Если строка начинается с git@github.com, то всё прошло успешно. С этого момента для доступа к GitHub Git будет использовать <strong>SSH-ключ</strong>, сохранённый на компьютере.</p>
  <p id="tRVp">Вот и всё, теперь вы можете использовать <code>pull</code>, <code>push</code> и другие команды git, требующие аутентификации. </p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@nerepetitor/androidAppIcon</guid><link>https://teletype.in/@nerepetitor/androidAppIcon?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor</link><comments>https://teletype.in/@nerepetitor/androidAppIcon?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor#comments</comments><dc:creator>nerepetitor</dc:creator><title>Меняем иконку Android-приложения</title><pubDate>Wed, 16 Jul 2025 19:17:16 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/ca/13/ca13e10d-5507-4ef2-9c07-c65fe4aa4890.png"></media:content><category>Android</category><description><![CDATA[<img src="https://img1.teletype.in/files/05/0a/050afa05-32c3-4e56-b365-d890f5521ae8.png"></img>Сперва нам понадобится, собственно, сама иконка.]]></description><content:encoded><![CDATA[
  <p id="g2cI">Сперва нам понадобится, собственно, сама иконка. Возьмите готовую или <a href="https://teletype.in/@nerepetitor/iconDesign" target="_blank">создайте свою</a>. Используйте векторную графику, чтобы изображение одинаково хорошо смотрелось на экранах с любым dpi.</p>
  <figure id="SZlA" class="m_column">
    <img src="https://img4.teletype.in/files/73/ec/73ecf956-75ea-417d-b532-e14a48efb00d.png" width="1130" />
    <figcaption>Иконка, созданная в Figma</figcaption>
  </figure>
  <p id="VxnQ">Обратите внимание, что на устройствах Android иконки выглядят по-разному.  Изначально Android не накладывал жёстких ограничений на форму иконок. Однако с API 26 (Android 8) появились так называемые <a href="https://medium.com/@saturov/%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%BC%D0%B8%D0%BC%D1%81%D1%8F-%D1%81-android-adaptive-icons-743b7d706529" target="_blank">адаптивные иконки</a>. Они немного ограничивают свободу дизайнеров, однако улучшают UI за счёт единой стилистики. </p>
  <figure id="U2Pf" class="m_column">
    <img src="https://img1.teletype.in/files/05/0a/050afa05-32c3-4e56-b365-d890f5521ae8.png" width="1231" />
  </figure>
  <p id="r2v1">Проверьте, как будет выглядеть ваша иконка на разных устройствах с помощью <a href="https://www.figma.com/community/file/778486426750404931" target="_blank">шаблона</a>.</p>
  <p id="h5cR">Адаптивные иконки должны состоять из двух слоёв: фона и переднего плана. Экспортируйте их отдельно в формате SVG (назовите их ic_launcher_foreground и ic_launcher_background). Если фон однотонный, то он нам не понадобится. </p>
  <figure id="zexD" class="m_column">
    <img src="https://img1.teletype.in/files/0a/e9/0ae9fecb-8a0a-4345-b8e7-bf68a30f77f0.png" width="805" />
    <figcaption>Перейдите в Export и выберете SVG</figcaption>
  </figure>
  <p id="hf16"></p>
  <p id="pNeK">В Android Studio правой кнопкой мыши нажмите на директорию ресурсов <strong>res</strong> и создайте новый <strong>Image Asset. </strong></p>
  <p id="aMC3"><strong>New &gt; Image Asset</strong></p>
  <p id="DBTX">В появившемся окне Asset Studio оставьте значения по умолчанию: </p>
  <p id="eRrA"><strong>Icon type:</strong> Launcher Icons (Adaptive and Legacy)</p>
  <p id="FVYv"><strong>Name:</strong> ic_launcher.</p>
  <figure id="S95J" class="m_column">
    <img src="https://img1.teletype.in/files/0d/f2/0df224e7-d362-43a3-96bb-a87d9d96fccc.png" width="1521" />
  </figure>
  <p id="b1eH">Во вкладке <strong>Foreground Layer </strong>найдите<strong> Source Asset </strong>и в поле <strong>Path </strong>нажмите на значок папки. Найдите расположение файла <code>ic_launcher_foreground.svg</code>. Нажмите ОК. Теперь вы можете изменить размер изображения, используя <strong>Resize</strong>.</p>
  <p id="4mjq">Для однотонного фона во вкладке <strong>Background Layer </strong>в<strong> Asset Type </strong>выберете<strong> Color  </strong>вместо<strong> Image. </strong>В<strong> Figma </strong>скопируйте код цвета, например, B4E1FF. Вместо шестнадцатиричного цвета можно использовать RGB.</p>
  <figure id="oSrr" class="m_column">
    <img src="https://img4.teletype.in/files/b2/53/b253ebc6-254e-4479-8033-848b2a46a3c3.png" width="1521" />
  </figure>
  <p id="NgQ9">Нажмите Next и наконец Finish. Проверьте ресурсы проекта - в папке <code>drawable</code> должны были появиться два файла: <strong>ic_launcher_background.xml</strong> и<strong> ic_launcher_foreground.xml</strong>. </p>
  <p id="R1yS">В папке <code>mipmap</code> Android Studio создаст следующие файлы:</p>
  <ul id="rPZJ">
    <li id="SS1Y"><code>mipmap-mdpi</code></li>
    <li id="LGKa"><code>mipmap-hdpi</code></li>
    <li id="x8jH"><code>mipmap-xhdpi</code></li>
    <li id="loSG"><code>mipmap-xxhdpi</code></li>
    <li id="N0ok"><code>mipmap-xxxhdpi</code></li>
  </ul>
  <p id="MzDt">Это папка для значков приложения, оптимизированных для отображения на разных экранах с разной плотностью. При установке приложения Android подбирает нужный ресурс автоматически. Проверьте, как выглядит изображения в разном разрешении.</p>
  <p id="CQwg">Если изображения не появились, попробуйте в верхней панели перейдите в File &gt; Sync Project with Gradle Files (или сочетание Ctrl + Shift + O). Это запустит процесс синхронизации проекта с конфигурацией Gradle и решит проблемы с отображением ресурсов.</p>
  <p id="hJYo">Теперь запустите приложение. Иконка должна обновиться.</p>
  <figure id="vX1L" class="m_original">
    <img src="https://img3.teletype.in/files/a9/39/a939bf77-8126-451a-bfef-7c86656fe61a.png" width="621" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@nerepetitor/addFont</guid><link>https://teletype.in/@nerepetitor/addFont?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor</link><comments>https://teletype.in/@nerepetitor/addFont?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor#comments</comments><dc:creator>nerepetitor</dc:creator><title>Шрифты для Android-приложений</title><pubDate>Tue, 08 Jul 2025 14:08:30 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/ec/14/ec146363-1b47-493d-897b-e4412c597dfb.png"></media:content><category>Android</category><description><![CDATA[<img src="https://img4.teletype.in/files/b6/66/b6666b32-fe77-49f3-85ea-a7a86aaa1c5b.png"></img>Google Fonts — это бесплатный веб-сервис от Google, предоставляющий коллекцию шрифтов с открытой лицензией.]]></description><content:encoded><![CDATA[
  <figure id="lKtQ" class="m_column">
    <img src="https://img4.teletype.in/files/b6/66/b6666b32-fe77-49f3-85ea-a7a86aaa1c5b.png" width="3841" />
  </figure>
  <p id="KPG0">Сначала нам потребуется скачать сам шрифт. Воспользуйтесь Google Fonts — это бесплатный веб-сервис от Google, предоставляющий коллекцию шрифтов с открытой лицензией.</p>
  <p id="1Z6h">Если вы уже присмотрели конкретный шрифт, скачайте его. Обязательно учитывайте, какой язык будет в вашем приложении. Может оказаться, что шрифт только для латинницы и криллицу не поддерживает. Проверьте, как будет отображаться нужный язык (Select preview text), после чего нажмите на кнопку <strong>Get font</strong>.</p>
  <figure id="q00d" class="m_column">
    <img src="https://img4.teletype.in/files/3b/cb/3bcbc10f-8eda-457a-bf1b-1ff0be86fb00.png" width="1830" />
    <figcaption>В примере шрифт Just Another Hand</figcaption>
  </figure>
  <figure id="Qzut" class="m_column">
    <img src="https://img3.teletype.in/files/e7/d9/e7d9e115-898a-4398-88d5-653613cae4f7.png" width="1808" />
  </figure>
  <p id="Sh2y">Затем выберете <strong>Download all</strong> (1), будет загружен zip-файл. Распакуйте архив и сохраните папку в удобное место. Внутри будет файл с расширением <strong>.ttf</strong>.</p>
  <figure id="RhXR" class="m_column">
    <img src="https://img3.teletype.in/files/e9/ce/e9cecd37-9af6-4457-9293-fb3a4c5f6cb5.png" width="1589" />
  </figure>
  <p id="2wXi">В Android Studio перейдите в ресурсы (папка <code>res</code>). Найдите папку <strong>font </strong>или создайте её, если её пока нет: нажмите правой кнопкой мыши по <code>res</code> &gt; New &gt; Android Resource Directory, в выпадающем списке &quot;Resource type&quot; выберете <code>font</code> и нажите ОК.</p>
  <figure id="KJlt" class="m_custom">
    <img src="https://img2.teletype.in/files/5c/d3/5cd3a2ea-26f5-4b83-8326-d4952d5615e5.png" width="232" />
    <figcaption>Ресурсы проекта</figcaption>
  </figure>
  <p id="jdYY">Проверьте скачанные<strong> .ttf </strong>файлы. В примере это <code>JustAnotherHand-Regular.ttf</code>.</p>
  <p id="tpJu">В Android существует определённый стиль именования шрифтов: название должно быть на латинском, в нижнем регистре; пробелы, дефисы и специальные символы не допускаются. Замените их нижним подчёркиванием <code>_</code>.</p>
  <p id="PULL">Поэтому файл нужно переименовать в <code>justanotherhand_regular</code>. Теперь добавьте его в папку <code>font</code> — сделать это можно простым перетаскиванием.</p>
  <figure id="N9lp" class="m_column">
    <img src="https://img4.teletype.in/files/f7/17/f717a2c9-6a96-4f49-a981-0a06ead4b68d.png" width="981" />
    <figcaption>Когда вы перетащите файл в папку <strong>font</strong>, появится следующее окно</figcaption>
  </figure>
  <p id="xKTj">В появившемся окне нажмите <strong>ОК</strong>. </p>
  <p id="XpF7">Теперь шрифт можно использовать. В коде XML выглядит это следующим образом:</p>
  <pre id="REIv" data-lang="xml">&lt;TextView
    ...
    android:fontFamily=&quot;@font/justanotherhand_regular&quot; /&gt;</pre>
  <p id="wU2N">Название шрифта точно должно точно совпадать с именем файла (без расширения).</p>
  <p id="oTD5">Готово, теперь шрифт отображается в Preview.</p>
  <figure id="ToKJ" class="m_column">
    <img src="https://img3.teletype.in/files/22/58/2258371f-8d39-41d7-a407-2383e5ff15eb.png" width="910" />
  </figure>
  <p id="vKPx">Теперь файл можно безопасно удалить с рабочего стола (или того места, куда вы его изначально скачивали), это никак не повлияет на работу приложения.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@nerepetitor/WhatsApp</guid><link>https://teletype.in/@nerepetitor/WhatsApp?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor</link><comments>https://teletype.in/@nerepetitor/WhatsApp?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor#comments</comments><dc:creator>nerepetitor</dc:creator><title>Безопасен ли WhatsApp</title><pubDate>Mon, 05 May 2025 16:15:46 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/e7/09/e709c497-2ab4-4703-aedc-5969ea5464b4.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/de/6f/de6fad2b-f9a9-4d8b-81f5-ba8703be801c.png"></img>Сквозное шифрование не панацея]]></description><content:encoded><![CDATA[
  <p id="ApaN">Как и все популярные мессенджеры, <strong>WhatsApp</strong> привязывается к номеру телефона. Операторы обязаны регистрировать абонентов по паспортным данным, поэтому установить личность владельца не составит труда. Однако узнать содержимое самих сообщений ни у спецслужб, ни у хакеров не получится без непосредственного доступа к устройству. Так ли это?</p>
  <h3 id="dNbN">Сквозное шифрование (End-to-end encryption)</h3>
  <p id="UDD1">WhatsApp использует Signal Protocol для обеспечения сквозного шифрования. Только отправитель и получатель могут прочитать сообщение. При каждом новом сообщении ключ обновляется, а старые удаляются. Хорошая новость в том, что мессенджер не хранит сообщения пользователей на своих серверах.</p>
  <h3 id="GJtP">Метаданные</h3>
  <p id="qncE">Однако <strong>WhatsApp</strong> собирает всевозможную информацию — так называемые метаданные, такие как модель устройства, версия операционной системы, IP-адрес, контакты (список номеров) и активность. Например, <strong>Meta</strong> знает, как часто вы переписываетесь с каждым из контактов.</p>
  <p id="NPYo">При звонке на серверах фиксируются следующие данные:</p>
  <ul id="GFyy">
    <li id="yA8E">кто начал звонок и кому человек звонит;</li>
    <li id="1YEk">время;</li>
    <li id="Fksh">длительность вызова;</li>
    <li id="Hp3T">какая сеть использовалась (Wi-Fi или мобильная связь).</li>
  </ul>
  <p id="MydQ">И хотя аудиозаписи звонков не хранятся на серверах, перечисленной выше информации вполне достаточно для спецслужб. Так, по IP можно вычислить примерное местоположение.</p>
  <p id="6NQb">Meta регулярно сообщает о том, как часто правительства запрашивают доступ к данным пользователей. <a href="https://faq.whatsapp.com/808280033839222/?locale=ru_RU" target="_blank">Специальная группа по работе с запросами от правоохранительных органов</a> в индивидуальном порядке рассматривает запросы и принимает решение о предоставлении информации. Данные могут быть переданы правоохранительным органам и использоваться как для расследования настоящих преступлений, так и для преследования по политическим мотивам.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@nerepetitor/RussianForPyCharm</guid><link>https://teletype.in/@nerepetitor/RussianForPyCharm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor</link><comments>https://teletype.in/@nerepetitor/RussianForPyCharm?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor#comments</comments><dc:creator>nerepetitor</dc:creator><title>Как добавить русский язык в PyCharm</title><pubDate>Sat, 03 May 2025 09:22:03 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/81/5a/815af4fc-acb1-4a81-8915-0068db924140.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/43/28/43281c39-a76a-45ba-90d4-a3f946699e0f.jpeg"></img>Если в PyCharm русские слова подчёркиваются красным, это означает, что по умолчанию для проверки орфографии используется только английский словарь]]></description><content:encoded><![CDATA[
  <p id="GlDu">Если в <strong>PyCharm</strong> русские слова подчёркиваются красным, это означает, что по умолчанию для проверки орфографии используется только английский словарь.</p>
  <h3 id="yb6B">Скачайте словарь для русского языка</h3>
  <p id="uVq0">Перейдите по ссылке: <a href="https://github.com/LibreOffice/dictionaries#" target="_blank">https://github.com/LibreOffice/dictionaries</a> и скопируйте HTTPS-ссылку для клонирования репозитория.</p>
  <figure id="kmdq" class="m_column">
    <img src="https://img2.teletype.in/files/18/48/18489bc8-25ab-4368-ab5d-7ba6d37f8cc1.png" width="1131" />
  </figure>
  <p id="e72h">В <strong>PyCharm</strong> откройте терминал и перейдите в домашнюю директорию:</p>
  <pre id="kc6B" data-lang="bash">cd ~</pre>
  <p id="ROwq">Клонируйте репозиторий с GitHub:</p>
  <pre id="VNE0" data-lang="bash">git clone https://github.com/LibreOffice/dictionaries.git</pre>
  <p id="L3mS">Создайте папку для пользовательских словарей:</p>
  <pre id="iXkp" data-lang="bash">mkdir .PyCharmDicts</pre>
  <p id="jy3B">Скопируйте туда нужные файлы из словаря <strong>ru_RU</strong>:</p>
  <pre id="z9Dv" data-lang="bash">cp dictionaries/ru_RU/ru_RU.dic .PyCharmDicts/
cp dictionaries/ru_RU/ru_RU.aff .PyCharmDicts/</pre>
  <p id="5d6K">Проверьте содержимое:</p>
  <pre id="NXgW" data-lang="bash">ls .PyCharmDicts</pre>
  <p id="BJck">Если вы видете два файла: ru_RU.dic и ru_RU.aff, то всё в порядке.</p>
  <h3 id="iWPb">Подключение словаря в PyCharm</h3>
  <p id="T8nl">Перейдите в настройки.</p>
  <figure id="qihI" class="m_column">
    <img src="https://img4.teletype.in/files/b5/4d/b54de98b-59e8-48e5-a1e5-0ad79cd8957c.png" width="1120" />
    <figcaption>File → Settings → Editor → Natural Languages → Spelling → Dictionaries</figcaption>
  </figure>
  <p id="MEHt">Добавьте новый словарь, нажав на &quot;<strong>+</strong>&quot;.В появившемся окне укажите путь к папке:</p>
  <p id="7b6T">В Linux: <code>/home/имя_пользователя/.PyCharmDicts</code></p>
  <p id="o2BM">В Windows: <code>C:\Users\имя_пользователя\.PyCharmDicts</code></p>
  <figure id="w3Uj" class="m_column">
    <img src="https://img1.teletype.in/files/08/1a/081a8f4e-2171-4905-a419-f938f88d2f8d.png" width="821" />
    <figcaption>Нажмите <strong>ОК</strong>.</figcaption>
  </figure>
  <p id="TcHE">Наконец, нажмите <strong>Apply</strong>, чтобы применить изменения, а затем <strong>OK.</strong></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@nerepetitor/accelerateAndroid</guid><link>https://teletype.in/@nerepetitor/accelerateAndroid?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor</link><comments>https://teletype.in/@nerepetitor/accelerateAndroid?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor#comments</comments><dc:creator>nerepetitor</dc:creator><title>Ускоряем Android</title><pubDate>Sun, 30 Mar 2025 17:47:34 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/c0/ff/c0ff5a13-3f61-420c-a2ca-5be801c183d2.png"></media:content><category>Android</category><description><![CDATA[<img src="https://img3.teletype.in/files/63/03/63035f92-2dea-4bd1-ac88-a795d3276b08.jpeg"></img>О том, что делать, если телефон или планшет вдруг начал тормозить]]></description><content:encoded><![CDATA[
  <p id="zApo">О том, что делать, если телефон или планшет вдруг начал тормозить.</p>
  <h3 id="IlfP">Перезагрузка</h3>
  <p id="Wa81">Самое очевидное: перезагрузите устройство. Делайте это не реже чем раз в неделю, а также после установки новых приложений (или обновления старых).</p>
  <h3 id="P2m3">Освобождение памяти</h3>
  <p id="8W6E">Если на устройстве недостаточно свободной памяти, Android не может эффективно управлять кэшем, что замедляет работу. Не удаляйте кэш приложений, которыми вы пользуетесь регулярно. <a href="https://teletype.in/@nerepetitor/deletingCache" target="_blank">В каких случаях стоит удалять кэш?</a></p>
  <p id="31nh">В случае нехватки памяти имеет смысл удалить предустановленные приложения. Если не получается сделать это с телефона, попробуйте с помощью <a href="https://teletype.in/@nerepetitor/deleteAndroidApp" target="_blank">командной строки</a>.</p>
  <h3 id="OjhT">Отключение анимаций</h3>
  <p id="3iD9">Анимации требуют вычислительных ресурсов и занимают оперативную память. Освободите её для других задач.</p>
  <p id="pzum">Активируйте режим разработчика: перейдите в «Настройки» → «О телефоне» и нажмите 7 раз на «Номер сборки». </p>
  <p id="6mlW">В «Настройках» перейдите в «Параметры разработчика», найдите такие пункты как «Анимация окон», «Анимация переходов» и «Длительность анимации». Установите <strong>0.5x</strong> или выберите«Без анимации».</p>
  <h3 id="83OP">Отключите приложения в фоновом режиме</h3>
  <p id="62b7">Некоторые приложения работают в фоновом режиме, потребляя системные ресурсы. Отключение фоновых процессов помогает освободить оперативную память, снижает нагрузку на процессор и увеличивает время автономной работы.</p>
  <p id="pc6V">Перейдите в «Настройки» →«Параметры разработчика» и найдите «Лимит фоновых процессов». Выберите «Не более 4 процессов». </p>
  <h3 id="Mjlk">Сброс до заводских настроек</h3>
  <p id="0icd">Крайний случай. Вам не помогли другие способы, устройство отказывается нормально работать. Помните, что сброс до заводских настроек очищает все пользовательские данные с устройства, будь то загруженные приложения, фотографии, файлы, контакты или привязанные аккаунты. Не забудьте сохранить всю важную информацию в облаке.</p>
  <p id="Wkei">Чаще всего эту функцию можно найти в «Настройках» → «О телефоне» / «О системе».</p>

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