<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Очередной дилетант</title><subtitle>Автор курса English for IT &amp; Computer Science</subtitle><author><name>Очередной дилетант</name></author><id>https://teletype.in/atom/nerepetitor</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/nerepetitor?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@nerepetitor?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=nerepetitor"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/nerepetitor?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-08-09T21:16:34.616Z</updated><entry><id>nerepetitor:hardReset</id><link rel="alternate" type="text/html" href="https://teletype.in/@nerepetitor/hardReset?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=nerepetitor"></link><title>Жёсткая перезагрузка</title><published>2026-08-07T09:24:01.171Z</published><updated>2026-08-07T09:24:01.171Z</updated><summary type="html">Жёсткая перезагрузка — это принудительное выключение и последующий запуск устройства, минуя обычную процедуру завершения работы операционной системы.</summary><content type="html">
  &lt;p id=&quot;H6oc&quot;&gt;Если вдруг устройство перестаёт отвечать и обычная перезагрузка не представляется возможной, возможна жёсткая перезагрузка.&lt;/p&gt;
  &lt;p id=&quot;xVtK&quot;&gt;&lt;strong&gt;Жёсткая перезагрузка&lt;/strong&gt; — это принудительное выключение и последующий запуск устройства. При этом не происходит корректное завершение запущенных процессов, и текущие данные не сохраняются.&lt;/p&gt;
  &lt;p id=&quot;EJ7y&quot;&gt;В старых телефонах можно было запустить жёсткую перезагрузку извлеченим съёмного аккумулятора. В современных Android-устройствах возможно несколько сценариев: нажатие комбинации физических клавиш (например, одновременное удержание нижней клавиши громкости и кнопки питания в течение 10–15 секунд или длительное нажатие на кнопку питания) или перезагрузка через командную строку.&lt;/p&gt;
  &lt;h3 id=&quot;v7ll&quot;&gt;ADB (Android Debug Bridge)&lt;/h3&gt;
  &lt;p id=&quot;JYDE&quot;&gt;ADB позволяет управлять устройствами на базе Android с помощью командной строки через USB или Wi-Fi. Однако для этого нужно, чтобы на телефоне был включен режим разработчика и отладка по USB. Если же они включены не были, жёсткая перезагрузка возможна только при помощи аппаратных клавиш.&lt;/p&gt;
  &lt;p id=&quot;JJUa&quot;&gt;1. Обычная перезагрузка устройства&lt;/p&gt;
  &lt;p id=&quot;wVfK&quot;&gt;&lt;code&gt;adb reboot&lt;/code&gt;&lt;/p&gt;
  &lt;h3 id=&quot;fRlM&quot;&gt;2. Жёсткая перезагрузка&lt;/h3&gt;
  &lt;p id=&quot;Sa4v&quot;&gt;Если устройство &amp;quot;зависло&amp;quot;, можно использовать:&lt;/p&gt;
  &lt;p id=&quot;mq4k&quot;&gt;&lt;code&gt;adb shell reboot -p &amp;amp;&amp;amp; adb shell input keyevent 26&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;KHJS&quot;&gt;В отличие от обычной перезагрузки, она может привести к повреждению данных. Поэтому она применяется тогда, когда обычная перезагрузка невозможна.&lt;/p&gt;

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

</content></entry><entry><id>nerepetitor:imeAction</id><link rel="alternate" type="text/html" href="https://teletype.in/@nerepetitor/imeAction?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=nerepetitor"></link><title>IME Action Buttons в Android</title><published>2026-06-13T08:21:34.781Z</published><updated>2026-06-13T08:22:21.628Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/6f/36/6f3697a0-e4b4-4c64-bf54-0dba30453c83.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/60/5c/605cb9f8-4f89-4f23-964d-ae14d7b03663.png&quot;&gt;В Android IME (Input Method Action) это кнопка на клавиатуре в правом нижнем углу. Она предназначена для выполнения определённого действия.</summary><content type="html">
  &lt;p id=&quot;goVV&quot;&gt;В Android IME (Input Method Action) это кнопка на клавиатуре в правом нижнем углу. Она предназначена для выполнения определённого действия. Например,  &lt;strong&gt;Done&lt;/strong&gt; означает, что пользователь заполнил все поля ввода. &lt;strong&gt;Next&lt;/strong&gt; — что пользователь заполнил данное поле ввода и хочет перейти к следующему.&lt;/p&gt;
  &lt;figure id=&quot;RvtV&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/60/5c/605cb9f8-4f89-4f23-964d-ae14d7b03663.png&quot; width=&quot;3500&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;veBx&quot;&gt;Класс KeyboardOptions в Jetpack Compose позволяет настроить клавиатуру для определённого текстового поля. В правом нижем углу появляется кнопка, действие по нажатию на которую различается в зависимости от назначения поля ввода.&lt;/p&gt;
  &lt;p id=&quot;xZ2X&quot;&gt;Доступны следующие вариации imeAction:&lt;/p&gt;
  &lt;p id=&quot;SAow&quot;&gt;&lt;code&gt;ImeAction.Unspecified&lt;/code&gt;: поведение imeAction по умолчанию — не определено.&lt;/p&gt;
  &lt;p id=&quot;2dCK&quot;&gt;&lt;code&gt;ImeAction.Done&lt;/code&gt;: ввод завершён, скрыть клавиатуру.&lt;/p&gt;
  &lt;p id=&quot;UkiX&quot;&gt;&lt;code&gt;ImeAction.Go&lt;/code&gt;: продолжить.&lt;/p&gt;
  &lt;p id=&quot;xDxB&quot;&gt;&lt;code&gt;ImeAction.Next&lt;/code&gt;: перейти к следующему полю ввода.&lt;/p&gt;
  &lt;p id=&quot;rS6b&quot;&gt;&lt;code&gt;ImeAction.Previous&lt;/code&gt;: вернуться к предыдущему полю ввода.&lt;/p&gt;
  &lt;p id=&quot;ss3L&quot;&gt;&lt;code&gt;ImeAction.Search&lt;/code&gt;: поиск.&lt;/p&gt;
  &lt;p id=&quot;yohf&quot;&gt;&lt;code&gt;ImeAction.Send&lt;/code&gt;: отправить данные.&lt;/p&gt;
  &lt;p id=&quot;JUb1&quot;&gt;Пример переиспользуемой Composable-функции:&lt;/p&gt;
  &lt;pre id=&quot;kQmN&quot; data-lang=&quot;kotlin&quot;&gt;@Composable
fun FormInput(
    value: String,
    description: String,
    keyboardActions: KeyboardActions = KeyboardActions.Default,
    imeAction: ImeAction = ImeAction.Default,
    onValueChanged: (String) -&amp;gt; Unit
) {
    OutlinedTextField(
        modifier = Modifier
            .fillMaxWidth()
            .padding(8.dp),
        value = value,
        label = { Text(text = description) },
        keyboardOptions = KeyboardOptions(imeAction = imeAction),
        keyboardActions = keyboardActions,
        onValueChange = { newValue -&amp;gt; onValueChanged(newValue) }
    )
}&lt;/pre&gt;
  &lt;p id=&quot;z32Y&quot;&gt;В параметр передаётся imeAction, по умолчанию это &lt;code&gt;ImeAction.Default&lt;/code&gt;.&lt;/p&gt;

</content></entry><entry><id>nerepetitor:gitCommands</id><link rel="alternate" type="text/html" href="https://teletype.in/@nerepetitor/gitCommands?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=nerepetitor"></link><title>Команды Git, о которых вы не знали</title><published>2026-05-03T18:58:28.793Z</published><updated>2026-05-09T15:59:10.658Z</updated><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/e2/a8/e2a8e33f-64ee-47b9-b67f-ac61eb27ae80.png&quot;&gt;Интересные команды, которые нечасто применяются в работе, но могут быть полезны</summary><content type="html">
  &lt;p id=&quot;9WDS&quot;&gt;&lt;code&gt;git ls-files | wc -l&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;oyJI&quot;&gt;Подсчитывает количество файлов, которые отслеживает Git.&lt;/p&gt;
  &lt;p id=&quot;Dzbt&quot;&gt;&lt;code&gt;git branch -v&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;6Zvg&quot;&gt;Позволяет посмотреть последний коммит в каждой ветке.&lt;/p&gt;
  &lt;p id=&quot;wycf&quot;&gt;&lt;code&gt;git branch --merged&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;0RXF&quot;&gt;Покажет, какие ветки уже влили в текущую.&lt;/p&gt;
  &lt;p id=&quot;AyOH&quot;&gt;&lt;code&gt;git show&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;rhFr&quot;&gt;Выводит информацию о последнем коммите.&lt;/p&gt;
  &lt;pre id=&quot;1T2K&quot;&gt;user@PC:~/Projects/app.android$ git show
commit c5c3d9198639ecc0a954bef102dbf (HEAD -&amp;gt; develop, origin/develop)
Merge: 942636 130e3e9f
Author: Tom Holland &amp;lt;holland@gmail.com&amp;gt;
Date:   Sun May 3 12:27:02 20  26 +0300

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

</content></entry><entry><id>nerepetitor:composeBuildError</id><link rel="alternate" type="text/html" href="https://teletype.in/@nerepetitor/composeBuildError?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=nerepetitor"></link><title>Starting in Kotlin 2.0, the Compose Compiler Gradle plugin is required</title><published>2026-03-17T09:32:33.548Z</published><updated>2026-03-17T09:32:33.548Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/8d/09/8d09e3a8-558f-4b34-bea5-80b66ab047db.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/5e/fe/5efef13e-c19f-4c02-a352-5aafd8e4676f.png&quot;&gt;</summary><content type="html">
  &lt;p id=&quot;d2FH&quot;&gt;Если сборка проекта Android завершилась следующим сообщением об ошибке:&lt;/p&gt;
  &lt;section style=&quot;background-color:hsl(hsl(323, 50%, var(--autocolor-background-lightness, 95%)), 85%, 85%);&quot;&gt;
    &lt;p id=&quot;86Na&quot;&gt;&lt;code&gt;Starting in Kotlin 2.0, the Compose Compiler Gradle plugin is required&lt;/code&gt;&lt;/p&gt;
  &lt;/section&gt;
  &lt;p id=&quot;gexA&quot;&gt;Это означает, что вам нужно подключить плагин &lt;strong&gt;Compose Compiler&lt;/strong&gt;. С момента выхода Kotlin 2.0 Compose Compiler поставляется вместе с Kotlin и должен быть добавлен в проект как плагин.&lt;/p&gt;
  &lt;p id=&quot;GYwL&quot;&gt;Убедитесь, что в каталоге &lt;strong&gt;libs.versions.toml&lt;/strong&gt; &lt;code&gt;[plugins]&lt;/code&gt; у вас есть зависимость &lt;code&gt;org.jetbrains.kotlin.plugin.compose&lt;/code&gt;:&lt;/p&gt;
  &lt;pre id=&quot;FFw0&quot; data-lang=&quot;kotlin&quot;&gt;kotlin-compose = { id = &amp;quot;org.jetbrains.kotlin.plugin.compose&amp;quot;, version.ref = &amp;quot;kotlin&amp;quot; }&lt;/pre&gt;
  &lt;p id=&quot;LCQ4&quot;&gt;Версия плагина должна совпадать с версией Kotlin.&lt;/p&gt;
  &lt;p id=&quot;6fJ9&quot;&gt;Добавьте плагин на уровне проекта(&lt;strong&gt;build.gradle.kts&lt;/strong&gt;):&lt;/p&gt;
  &lt;pre id=&quot;734g&quot; data-lang=&quot;kotlin&quot;&gt;plugins {
    alias (libs.plugins.kotlin.compose) apply false
}&lt;/pre&gt;
  &lt;p id=&quot;jCUK&quot;&gt;и на уровне модуля (&lt;strong&gt;build.gradle.kts&lt;/strong&gt;):&lt;/p&gt;
  &lt;pre id=&quot;EeCF&quot; data-lang=&quot;kotlin&quot;&gt;plugins {
    alias(libs.plugins.kotlin.compose)
}&lt;/pre&gt;
  &lt;p id=&quot;1EgW&quot;&gt;Так же убедитесь, что на уровне модуля включена поддержка Jetpack Compose:&lt;/p&gt;
  &lt;pre id=&quot;oN0q&quot; data-lang=&quot;kotlin&quot;&gt;android {
    buildFeatures {
        compose = true
    }
}&lt;/pre&gt;
  &lt;p id=&quot;Kipq&quot;&gt;Синхронизируем проект, нажав на &lt;strong&gt;Sync now&lt;/strong&gt; вверху (или воспользовавшись сочетанием &lt;strong&gt;Ctrl&lt;/strong&gt; + &lt;strong&gt;Shift&lt;/strong&gt; + &lt;strong&gt;O&lt;/strong&gt;).&lt;/p&gt;
  &lt;figure id=&quot;7Wqf&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/29/7c/297c3efd-4d36-4dfa-bb7b-6da857efba1f.png&quot; width=&quot;1713&quot; /&gt;
    &lt;figcaption&gt;Gradle сообщает, что в файлах произошли изменения&lt;/figcaption&gt;
  &lt;/figure&gt;

</content></entry><entry><id>nerepetitor:passwordVisibility</id><link rel="alternate" type="text/html" href="https://teletype.in/@nerepetitor/passwordVisibility?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=nerepetitor"></link><title>Скрытие пароля в Android (Jetpack Compose)</title><published>2026-02-24T07:36:29.073Z</published><updated>2026-02-24T07:36:29.073Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/4b/8c/4b8c942a-947c-4472-b589-94ea8a3a4332.png"></media:thumbnail><category term="android" label="Android"></category><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/a2/d6/a2d6b62a-9e9e-486f-bdc1-3e11822f9e60.png&quot;&gt;Дайте пользователям возможность показать или скрыть пароль.</summary><content type="html">
  &lt;p id=&quot;5azb&quot;&gt;Дайте пользователям возможность показать или скрыть пароль.&lt;/p&gt;
  &lt;p id=&quot;u32O&quot;&gt;Реализовать это в &lt;strong&gt;Jetpack Compose&lt;/strong&gt; можно при помощи &lt;code&gt;trailingIcon&lt;/code&gt;. Это иконка в конце поля ввода, которую можно сделать кликабельной. &lt;/p&gt;
  &lt;figure id=&quot;fgmN&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/e1/86/e186a98d-da34-4952-ac7a-428cf0e36ab4.png&quot; width=&quot;567&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;rs6c&quot;&gt;Объявим переменную &lt;code&gt;passwordVisible&lt;/code&gt;. Она будет принимать значения &lt;code&gt;true&lt;/code&gt; или &lt;code&gt;false&lt;/code&gt; в зависимости от того, хочет ли пользователь видеть пароль.&lt;/p&gt;
  &lt;p id=&quot;ZsZp&quot;&gt;Чтобы сохранить состояние при рекомпозиции и смене конфигурации (например, при повороте устройства), будем использовать &lt;code&gt;rememberSaveable&lt;/code&gt; (эта функция хранит значение в &lt;code&gt;Bundle&lt;/code&gt;).&lt;/p&gt;
  &lt;p id=&quot;z3pb&quot;&gt;Инициализируем &lt;code&gt;passwordVisible&lt;/code&gt; через &lt;code&gt;mutableStateOf()&lt;/code&gt; , используя делегат &lt;code&gt;by&lt;/code&gt;. Пусть изначально пароль будет скрыт — в &lt;code&gt;mutableStateOf()&lt;/code&gt; в качестве параметра передаём значение &lt;code&gt;false&lt;/code&gt;. &lt;/p&gt;
  &lt;pre id=&quot;e77P&quot; data-lang=&quot;kotlin&quot;&gt;var passwordVisible by rememberSaveable { mutableStateOf(false) }&lt;/pre&gt;
  &lt;p id=&quot;N9TJ&quot;&gt;Для работы с делегатом &lt;code&gt;by&lt;/code&gt; импортируем следующие функции:&lt;/p&gt;
  &lt;pre id=&quot;57gu&quot; data-lang=&quot;kotlin&quot;&gt;import androidx.compose.runtime.setValue
import androidx.compose.runtime.getValue&lt;/pre&gt;
  &lt;p id=&quot;MLTC&quot;&gt;Создадим поле ввода. В &lt;code&gt;OutlinedTextField&lt;/code&gt; за отображение текста отвечает параметр &lt;code&gt;visualTransformation&lt;/code&gt;. &lt;/p&gt;
  &lt;p id=&quot;ykwR&quot;&gt;В коде ниже если &lt;code&gt;passwordVisible == true&lt;/code&gt;, то применяется &lt;code&gt;VisualTransformation.None&lt;/code&gt; (пароль виден), если &lt;code&gt;false&lt;/code&gt; — применяется &lt;code&gt;PasswordVisualTransformation&lt;/code&gt; (пароль в виде точек •••••••).&lt;/p&gt;
  &lt;pre id=&quot;X8Lm&quot; data-lang=&quot;kotlin&quot;&gt;visualTransformation = if (passwordVisible) VisualTransformation.None
else PasswordVisualTransformation()&lt;/pre&gt;
  &lt;p id=&quot;pqos&quot;&gt;В ресурсы проекта добавим два значка (&lt;code&gt;ic_visibility_off&lt;/code&gt; и &lt;code&gt;ic_visibility_on&lt;/code&gt;) для иконки. Передадим в &lt;code&gt;trailingIcon&lt;/code&gt; лямбда-выражение:&lt;/p&gt;
  &lt;pre id=&quot;OT4m&quot; data-lang=&quot;kotlin&quot;&gt;trailingIcon = {
    IconButton(
        onClick = { passwordVisible = !passwordVisible }
    ) {}
}&lt;/pre&gt;
  &lt;p id=&quot;qYtH&quot;&gt;&lt;code&gt;IconButton&lt;/code&gt; содержит обработчик события:&lt;/p&gt;
  &lt;pre id=&quot;v5Qg&quot; data-lang=&quot;kotlin&quot;&gt;onClick = { passwordVisible = !passwordVisible }&lt;/pre&gt;
  &lt;p id=&quot;zURR&quot;&gt;При нажатии состояние &lt;code&gt;passwordVisible&lt;/code&gt; будет инвертироваться.&lt;/p&gt;
  &lt;p id=&quot;WI6i&quot;&gt;Ресурс для &lt;code&gt;Icon&lt;/code&gt; выбирается динамически в зависимости от значения в переменной &lt;code&gt;passwordVisible&lt;/code&gt;.&lt;/p&gt;
  &lt;pre id=&quot;jxgd&quot; data-lang=&quot;kotlin&quot;&gt;@Composable
fun PasswordField(
    value: String,
    onValueChange: (String) -&amp;gt; Unit
) {
    var passwordVisible by rememberSaveable { mutableStateOf(false) }

    OutlinedTextField(
        value = value,
        onValueChange = onValueChange,
        label = { Text(&amp;quot;Password&amp;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) 
                    &amp;quot;Hide password&amp;quot; else &amp;quot;Show password&amp;quot;
                )
            }
        }
    )
}&lt;/pre&gt;

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

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

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

</content></entry><entry><id>nerepetitor:androidAppIcon</id><link rel="alternate" type="text/html" href="https://teletype.in/@nerepetitor/androidAppIcon?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=nerepetitor"></link><title>Меняем иконку Android-приложения</title><published>2025-07-16T19:17:16.416Z</published><updated>2026-02-20T06:57:57.693Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img1.teletype.in/files/ca/13/ca13e10d-5507-4ef2-9c07-c65fe4aa4890.png"></media:thumbnail><category term="android" label="Android"></category><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/05/0a/050afa05-32c3-4e56-b365-d890f5521ae8.png&quot;&gt;Сперва нам понадобится, собственно, сама иконка.</summary><content type="html">
  &lt;p id=&quot;g2cI&quot;&gt;Сперва нам понадобится, собственно, сама иконка. Возьмите готовую или &lt;a href=&quot;https://teletype.in/@nerepetitor/iconDesign&quot; target=&quot;_blank&quot;&gt;создайте свою&lt;/a&gt;. Используйте векторную графику, чтобы изображение одинаково хорошо смотрелось на экранах с любым dpi.&lt;/p&gt;
  &lt;figure id=&quot;SZlA&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/73/ec/73ecf956-75ea-417d-b532-e14a48efb00d.png&quot; width=&quot;1130&quot; /&gt;
    &lt;figcaption&gt;Иконка, созданная в Figma&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;VxnQ&quot;&gt;Обратите внимание, что на устройствах Android иконки выглядят по-разному.  Изначально Android не накладывал жёстких ограничений на форму иконок. Однако с API 26 (Android 8) появились так называемые &lt;a href=&quot;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&quot; target=&quot;_blank&quot;&gt;адаптивные иконки&lt;/a&gt;. Они немного ограничивают свободу дизайнеров, однако улучшают UI за счёт единой стилистики. &lt;/p&gt;
  &lt;figure id=&quot;U2Pf&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/05/0a/050afa05-32c3-4e56-b365-d890f5521ae8.png&quot; width=&quot;1231&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;r2v1&quot;&gt;Проверьте, как будет выглядеть ваша иконка на разных устройствах с помощью &lt;a href=&quot;https://www.figma.com/community/file/778486426750404931&quot; target=&quot;_blank&quot;&gt;шаблона&lt;/a&gt;.&lt;/p&gt;
  &lt;p id=&quot;h5cR&quot;&gt;Адаптивные иконки должны состоять из двух слоёв: фона и переднего плана. Экспортируйте их отдельно в формате SVG (назовите их ic_launcher_foreground и ic_launcher_background). Если фон однотонный, то он нам не понадобится. &lt;/p&gt;
  &lt;figure id=&quot;zexD&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0a/e9/0ae9fecb-8a0a-4345-b8e7-bf68a30f77f0.png&quot; width=&quot;805&quot; /&gt;
    &lt;figcaption&gt;Перейдите в Export и выберете SVG&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;hf16&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;pNeK&quot;&gt;В Android Studio правой кнопкой мыши нажмите на директорию ресурсов &lt;strong&gt;res&lt;/strong&gt; и создайте новый &lt;strong&gt;Image Asset. &lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;aMC3&quot;&gt;&lt;strong&gt;New &amp;gt; Image Asset&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;DBTX&quot;&gt;В появившемся окне Asset Studio оставьте значения по умолчанию: &lt;/p&gt;
  &lt;p id=&quot;eRrA&quot;&gt;&lt;strong&gt;Icon type:&lt;/strong&gt; Launcher Icons (Adaptive and Legacy)&lt;/p&gt;
  &lt;p id=&quot;FVYv&quot;&gt;&lt;strong&gt;Name:&lt;/strong&gt; ic_launcher.&lt;/p&gt;
  &lt;figure id=&quot;S95J&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0d/f2/0df224e7-d362-43a3-96bb-a87d9d96fccc.png&quot; width=&quot;1521&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;b1eH&quot;&gt;Во вкладке &lt;strong&gt;Foreground Layer &lt;/strong&gt;найдите&lt;strong&gt; Source Asset &lt;/strong&gt;и в поле &lt;strong&gt;Path &lt;/strong&gt;нажмите на значок папки. Найдите расположение файла &lt;code&gt;ic_launcher_foreground.svg&lt;/code&gt;. Нажмите ОК. Теперь вы можете изменить размер изображения, используя &lt;strong&gt;Resize&lt;/strong&gt;.&lt;/p&gt;
  &lt;p id=&quot;4mjq&quot;&gt;Для однотонного фона во вкладке &lt;strong&gt;Background Layer &lt;/strong&gt;в&lt;strong&gt; Asset Type &lt;/strong&gt;выберете&lt;strong&gt; Color  &lt;/strong&gt;вместо&lt;strong&gt; Image. &lt;/strong&gt;В&lt;strong&gt; Figma &lt;/strong&gt;скопируйте код цвета, например, B4E1FF. Вместо шестнадцатиричного цвета можно использовать RGB.&lt;/p&gt;
  &lt;figure id=&quot;oSrr&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b2/53/b253ebc6-254e-4479-8033-848b2a46a3c3.png&quot; width=&quot;1521&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;NgQ9&quot;&gt;Нажмите Next и наконец Finish. Проверьте ресурсы проекта - в папке &lt;code&gt;drawable&lt;/code&gt; должны были появиться два файла: &lt;strong&gt;ic_launcher_background.xml&lt;/strong&gt; и&lt;strong&gt; ic_launcher_foreground.xml&lt;/strong&gt;. &lt;/p&gt;
  &lt;p id=&quot;R1yS&quot;&gt;В папке &lt;code&gt;mipmap&lt;/code&gt; Android Studio создаст следующие файлы:&lt;/p&gt;
  &lt;ul id=&quot;rPZJ&quot;&gt;
    &lt;li id=&quot;SS1Y&quot;&gt;&lt;code&gt;mipmap-mdpi&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;LGKa&quot;&gt;&lt;code&gt;mipmap-hdpi&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;x8jH&quot;&gt;&lt;code&gt;mipmap-xhdpi&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;loSG&quot;&gt;&lt;code&gt;mipmap-xxhdpi&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;N0ok&quot;&gt;&lt;code&gt;mipmap-xxxhdpi&lt;/code&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;MzDt&quot;&gt;Это папка для значков приложения, оптимизированных для отображения на разных экранах с разной плотностью. При установке приложения Android подбирает нужный ресурс автоматически. Проверьте, как выглядит изображения в разном разрешении.&lt;/p&gt;
  &lt;p id=&quot;CQwg&quot;&gt;Если изображения не появились, попробуйте в верхней панели перейдите в File &amp;gt; Sync Project with Gradle Files (или сочетание Ctrl + Shift + O). Это запустит процесс синхронизации проекта с конфигурацией Gradle и решит проблемы с отображением ресурсов.&lt;/p&gt;
  &lt;p id=&quot;hJYo&quot;&gt;Теперь запустите приложение. Иконка должна обновиться.&lt;/p&gt;
  &lt;figure id=&quot;vX1L&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a9/39/a939bf77-8126-451a-bfef-7c86656fe61a.png&quot; width=&quot;621&quot; /&gt;
  &lt;/figure&gt;

</content></entry></feed>