<?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>Sun, 09 Aug 2026 20:21:07 GMT</pubDate><lastBuildDate>Sun, 09 Aug 2026 20:21:07 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@nerepetitor/hardReset</guid><link>https://teletype.in/@nerepetitor/hardReset?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor</link><comments>https://teletype.in/@nerepetitor/hardReset?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor#comments</comments><dc:creator>nerepetitor</dc:creator><title>Жёсткая перезагрузка</title><pubDate>Fri, 07 Aug 2026 09:24:01 GMT</pubDate><description><![CDATA[Жёсткая перезагрузка — это принудительное выключение и последующий запуск устройства, минуя обычную процедуру завершения работы операционной системы.]]></description><content:encoded><![CDATA[
  <p id="H6oc">Если вдруг устройство перестаёт отвечать и обычная перезагрузка не представляется возможной, возможна жёсткая перезагрузка.</p>
  <p id="xVtK"><strong>Жёсткая перезагрузка</strong> — это принудительное выключение и последующий запуск устройства. При этом не происходит корректное завершение запущенных процессов, и текущие данные не сохраняются.</p>
  <p id="EJ7y">В старых телефонах можно было запустить жёсткую перезагрузку извлеченим съёмного аккумулятора. В современных Android-устройствах возможно несколько сценариев: нажатие комбинации физических клавиш (например, одновременное удержание нижней клавиши громкости и кнопки питания в течение 10–15 секунд или длительное нажатие на кнопку питания) или перезагрузка через командную строку.</p>
  <h3 id="v7ll">ADB (Android Debug Bridge)</h3>
  <p id="JYDE">ADB позволяет управлять устройствами на базе Android с помощью командной строки через USB или Wi-Fi. Однако для этого нужно, чтобы на телефоне был включен режим разработчика и отладка по USB. Если же они включены не были, жёсткая перезагрузка возможна только при помощи аппаратных клавиш.</p>
  <p id="JJUa">1. Обычная перезагрузка устройства</p>
  <p id="wVfK"><code>adb reboot</code></p>
  <h3 id="fRlM">2. Жёсткая перезагрузка</h3>
  <p id="Sa4v">Если устройство &quot;зависло&quot;, можно использовать:</p>
  <p id="mq4k"><code>adb shell reboot -p &amp;&amp; adb shell input keyevent 26</code></p>
  <p id="KHJS">В отличие от обычной перезагрузки, она может привести к повреждению данных. Поэтому она применяется тогда, когда обычная перезагрузка невозможна.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@nerepetitor/kotlinOptions</guid><link>https://teletype.in/@nerepetitor/kotlinOptions?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor</link><comments>https://teletype.in/@nerepetitor/kotlinOptions?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor#comments</comments><dc:creator>nerepetitor</dc:creator><title>LibraryExtension.kotlinOptions is deprecated</title><pubDate>Fri, 03 Jul 2026 07:59:12 GMT</pubDate><category>Android</category><description><![CDATA[Вы открываете файл сборки build.gradle.kts в своём Android-проекте и видите следующее предупреждение...]]></description><content:encoded><![CDATA[
  <p id="sFnw">Вы открываете файл сборки <code>build.gradle.kts</code> в своём Android-проекте и видите следующее предупреждение:</p>
  <pre id="zt7h">&#x27;fun LibraryExtension.kotlinOptions(configure: Action&lt;KotlinJvmOptions&gt;): 
Unit&#x27; is deprecated. The kotlinOptions types are deprecated, 
please migrate to the compilerOptions types. 
More details are here: https://kotl.in/u1r8ln.</pre>
  <p id="7yXP">В коде выглядит это так:</p>
  <pre id="PS5w" data-lang="kotlin">compileOptions {
    sourceCompatibility = JavaVersion.VERSION_11
    targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
    jvmTarget = &quot;11&quot;
}</pre>
  <figure id="2wA0" class="m_column">
    <img src="https://img4.teletype.in/files/fe/58/fe58579f-8695-4509-a952-13c52073621f.png" width="1524" />
    <figcaption>Предупреждение в Android Studio</figcaption>
  </figure>
  <p id="YIf1">Удалите блок <code>kotlinOptions</code>, вместо этого используйте следующее:</p>
  <pre id="dNEM" data-lang="kotlin">kotlin {
    jvmToolchain(11)
}</pre>
  <figure id="OTEp" class="m_column">
    <img src="https://img2.teletype.in/files/1a/4d/1a4d0e0a-33c1-4c05-af19-5c388f6492fb.png" width="1029" />
  </figure>
  <p id="Fr16">Так, для сборки проекта будет использоваться <strong>Java toolchain</strong>. Это набор инструментов Java, позволяющий автоматически использовать нужную версию <strong>JDK</strong>. </p>
  <p id="4rEI">Теперь проект явно сообщает <strong>Gradle</strong>, какую <strong>Java toolchain</strong> использовать, не зависит от случайной локальной JDK и не использует устаревший <strong>Kotlin DSL</strong>.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@nerepetitor/imeAction</guid><link>https://teletype.in/@nerepetitor/imeAction?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor</link><comments>https://teletype.in/@nerepetitor/imeAction?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor#comments</comments><dc:creator>nerepetitor</dc:creator><title>IME Action Buttons в Android</title><pubDate>Sat, 13 Jun 2026 08:21:34 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/6f/36/6f3697a0-e4b4-4c64-bf54-0dba30453c83.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/60/5c/605cb9f8-4f89-4f23-964d-ae14d7b03663.png"></img>В Android IME (Input Method Action) это кнопка на клавиатуре в правом нижнем углу. Она предназначена для выполнения определённого действия.]]></description><content:encoded><![CDATA[
  <p id="goVV">В Android IME (Input Method Action) это кнопка на клавиатуре в правом нижнем углу. Она предназначена для выполнения определённого действия. Например,  <strong>Done</strong> означает, что пользователь заполнил все поля ввода. <strong>Next</strong> — что пользователь заполнил данное поле ввода и хочет перейти к следующему.</p>
  <figure id="RvtV" class="m_column">
    <img src="https://img3.teletype.in/files/60/5c/605cb9f8-4f89-4f23-964d-ae14d7b03663.png" width="3500" />
  </figure>
  <p id="veBx">Класс KeyboardOptions в Jetpack Compose позволяет настроить клавиатуру для определённого текстового поля. В правом нижем углу появляется кнопка, действие по нажатию на которую различается в зависимости от назначения поля ввода.</p>
  <p id="xZ2X">Доступны следующие вариации imeAction:</p>
  <p id="SAow"><code>ImeAction.Unspecified</code>: поведение imeAction по умолчанию — не определено.</p>
  <p id="2dCK"><code>ImeAction.Done</code>: ввод завершён, скрыть клавиатуру.</p>
  <p id="UkiX"><code>ImeAction.Go</code>: продолжить.</p>
  <p id="xDxB"><code>ImeAction.Next</code>: перейти к следующему полю ввода.</p>
  <p id="rS6b"><code>ImeAction.Previous</code>: вернуться к предыдущему полю ввода.</p>
  <p id="ss3L"><code>ImeAction.Search</code>: поиск.</p>
  <p id="yohf"><code>ImeAction.Send</code>: отправить данные.</p>
  <p id="JUb1">Пример переиспользуемой Composable-функции:</p>
  <pre id="kQmN" data-lang="kotlin">@Composable
fun FormInput(
    value: String,
    description: String,
    keyboardActions: KeyboardActions = KeyboardActions.Default,
    imeAction: ImeAction = ImeAction.Default,
    onValueChanged: (String) -&gt; Unit
) {
    OutlinedTextField(
        modifier = Modifier
            .fillMaxWidth()
            .padding(8.dp),
        value = value,
        label = { Text(text = description) },
        keyboardOptions = KeyboardOptions(imeAction = imeAction),
        keyboardActions = keyboardActions,
        onValueChange = { newValue -&gt; onValueChanged(newValue) }
    )
}</pre>
  <p id="z32Y">В параметр передаётся imeAction, по умолчанию это <code>ImeAction.Default</code>.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@nerepetitor/gitCommands</guid><link>https://teletype.in/@nerepetitor/gitCommands?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor</link><comments>https://teletype.in/@nerepetitor/gitCommands?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=nerepetitor#comments</comments><dc:creator>nerepetitor</dc:creator><title>Команды Git, о которых вы не знали</title><pubDate>Sun, 03 May 2026 18:58:28 GMT</pubDate><description><![CDATA[<img src="https://img3.teletype.in/files/e2/a8/e2a8e33f-64ee-47b9-b67f-ac61eb27ae80.png"></img>Интересные команды, которые нечасто применяются в работе, но могут быть полезны]]></description><content:encoded><![CDATA[
  <p id="9WDS"><code>git ls-files | wc -l</code></p>
  <p id="oyJI">Подсчитывает количество файлов, которые отслеживает Git.</p>
  <p id="Dzbt"><code>git branch -v</code></p>
  <p id="6Zvg">Позволяет посмотреть последний коммит в каждой ветке.</p>
  <p id="wycf"><code>git branch --merged</code></p>
  <p id="0RXF">Покажет, какие ветки уже влили в текущую.</p>
  <p id="AyOH"><code>git show</code></p>
  <p id="rhFr">Выводит информацию о последнем коммите.</p>
  <pre id="1T2K">user@PC:~/Projects/app.android$ git show
commit c5c3d9198639ecc0a954bef102dbf (HEAD -&gt; develop, origin/develop)
Merge: 942636 130e3e9f
Author: Tom Holland &lt;holland@gmail.com&gt;
Date:   Sun May 3 12:27:02 20  26 +0300

Merge branch &#x27;fix/typos&#x27; into develop</pre>
  <p id="sovQ">В том числе время и дату, автора, описание коммита.</p>
  <pre id="gdkT">git show HEAD~2</pre>
  <p id="qLy3">Выводит информацию о конкретном коммите (в данном случае это предпоследний коммит).</p>
  <p id="x26r"><code>git cherry-pick &lt;commit-ref&gt; --no-commit</code></p>
  <p id="e2qU">Применяет изменения из другого коммита к текущей ветке без содания нового коммита.</p>
  <p id="geoQ"><code>git pull --verbose</code></p>
  <p id="aMzo">Выводит подробную информацию о загруженных файлах.</p>
  <p id="Qvhw"><code>git log --grep bug</code></p>
  <p id="UrOs">Используется, чтобы просмотреть коммиты, в описании которых есть слово «bug».</p>
  <p id="XOmM"><code>git blame file.txt</code></p>
  <p id="Q6uS">Покажет, кто и когда вносил изменения в файл (построчно).</p>
  <p id="Aw9X"><code>git blame -w .gitignore</code></p>
  <p id="QPgF">Покажет, кто и когда вносил изменения в файл (построчно), но без учёта пустых строк.</p>
  <p id="FZjv"><code>git diff --quiet develop feature/shopping-cart &amp;&amp; echo &quot;Identical&quot; || echo &quot;Different&quot;</code></p>
  <p id="r2oe">Сравнить две ветки. Если они содержат одни и те же коммиты, вывести <em>Identical</em>. В противном случае вывод будет <em>Different</em>.</p>
  <p id="MpOj"><code>git count-objects -v</code></p>
  <p id="W246">Выводит статистику того, как Git хранит данные в репозитории.</p>

]]></content:encoded></item><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></channel></rss>