<?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[Олжас Азирали / Olzhas Azirali. Основатель AZIRAL с 2019 года, IT-предприниматель и разработчик приложений. Заметки о продуктах и интерфейсах.]]></description><image><url>https://img2.teletype.in/files/d2/75/d27537b8-d1ea-4400-ad64-4fa34b3c132e.png</url><title>Олжас Азирали</title><link>https://teletype.in/@azirali</link></image><link>https://teletype.in/@azirali?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=azirali</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/azirali?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/azirali?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Mon, 02 Nov 2026 06:40:23 GMT</pubDate><lastBuildDate>Mon, 02 Nov 2026 06:40:23 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@azirali/file-picker-metadata-content</guid><link>https://teletype.in/@azirali/file-picker-metadata-content?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=azirali</link><comments>https://teletype.in/@azirali/file-picker-metadata-content?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=azirali#comments</comments><dc:creator>azirali</dc:creator><title>Три разных проверки за кнопкой «Выбрать файл»</title><pubDate>Sun, 01 Nov 2026 17:12:05 GMT</pubDate><description><![CDATA[Поле загрузки принимает изображения. В диалоге выбора доступны PNG, а после выбора интерфейс показывает имя cover.png. В этот момент легко объединить три разных события: браузер помог выбрать файл, клиент прочитал его свойства, сервер принял содержимое. Между ними ещё нужны явные правила.]]></description><content:encoded><![CDATA[
  <p id="Nanp">Поле загрузки принимает изображения. В диалоге выбора доступны PNG, а после выбора интерфейс показывает имя cover.png. В этот момент легко объединить три разных события: браузер помог выбрать файл, клиент прочитал его свойства, сервер принял содержимое. Между ними ещё нужны явные правила.</p>
  <p id="5IlR">Материал подготовлен с AI-помощью. Пример ниже выполнен локально в Node.js на синтетическом тексте. Он проверяет поведение объектов File; диалог браузера, загрузка по сети и обработка изображения в этом запуске не проверялись.</p>
  <h2 id="9XSM">Что делает диалог выбора</h2>
  <p id="P9HT">Атрибут accept=&quot;image/png,.png&quot; у input type=&quot;file&quot; задаёт подсказку о нужных типах. MDN прямо отделяет её от проверки содержимого: во многих диалогах пользователь может переключить фильтр и выбрать другой файл. Поэтому наличие accept в разметке не подтверждает выполнение требований к загрузке. Источник: <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/accept" target="_blank">https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/accept</a></p>
  <p id="DIWz">Такая подсказка всё равно полезна: человеку проще найти подходящий файл. Рядом стоит назвать допустимые форматы и ограничения размера, которые действительно применяет продукт. Текст «Выберите PNG» описывает ожидаемое действие. Сообщение «Файл проверен» уже требует отдельного основания, а не только подходящего расширения в имени.</p>
  <h2 id="nXkW">Имя и MIME описывают разные свойства</h2>
  <p id="sVoj">У File есть имя и свойство type, унаследованное от Blob. По документации MDN, тип может остаться пустой строкой; браузерное определение может зависеть от расширения и конфигурации клиента. MDN не рекомендует использовать это свойство как единственный способ валидации. Источник: <a href="https://developer.mozilla.org/en-US/docs/Web/API/Blob/type" target="_blank">https://developer.mozilla.org/en-US/docs/Web/API/Blob/type</a></p>
  <p id="5u7y">В конструкторе File значение type можно передать явно. Для наглядной проверки достаточно обычной строки, без настоящей картинки и без обращения к серверу. Конструктор принимает содержимое, имя и параметры как разные аргументы. Описание API: <a href="https://developer.mozilla.org/en-US/docs/Web/API/File/File" target="_blank">https://developer.mozilla.org/en-US/docs/Web/API/File/File</a></p>
  <pre id="khAZ">const file = new File([&#x27;учебный текст&#x27;], &#x27;cover.png&#x27;, {
  type: &#x27;image/png&#x27;
});
console.log(file.name);         // cover.png
console.log(file.type);         // image/png
console.log(await file.text()); // учебный текст
</pre>
  <p id="abRk">Локальный запуск вывел cover.png, image/png и исходный учебный текст. Дополнительная проверка создала из той же строки объект note.txt с типом text/plain. Их байтовое содержимое совпало. Третий объект, созданный без параметра type, вернул пустую строку типа и сохранил тот же текст. Восемь утверждений завершились успешно.</p>
  <p id="IlMJ">Из этого следует узкий вывод: в проверенном конструкторе метаданные не доказывают соответствие содержимого выбранному формату. Этот пример не оценивает качество PNG-декодера и не показывает обход конкретного сервиса. Он помогает увидеть, почему проверке file.type === &quot;image/png&quot; нельзя приписывать работу, которую она не выполняла.</p>
  <h2 id="9xg3">Разделить ответственность в задании</h2>
  <p id="no62">Клиентская часть может заранее объяснить ограничения и показать понятную причину отказа по тем свойствам, которые она действительно проверила. Пустой type означает, что тип не определён, а не автоматически «подходящий файл». Поведение для такого случая следует согласовать отдельно и проверить в интерфейсе.</p>
  <p id="TrJd">На стороне сервера требуется собственное правило приёма: разрешённые форматы, ограничения ресурсов и подходящая проверка содержимого. Способ проверки зависит от дальнейшей обработки файла. Один заголовок MIME, расширение или короткая сигнатура не описывают всю пригодность документа. Эту задачу нужно определить и проверить отдельно от фильтра диалога.</p>
  <p id="wheW">В приёмочный сценарий полезно включить подходящий файл, неподходящее содержимое под знакомым именем, пустой MIME и превышение установленного размера. Результат каждого случая должен объяснять, какая сторона принимает решение и что видит человек. Синтетические объекты удобны для части таких проверок; работу реального выбора и серверной обработки нужно проверять своими сценариями.</p>
  <p id="7MCg">Так в задании для разработчика или AI-ассистента появляются три проверяемых результата: подсказка при выборе, ранняя обратная связь клиента и самостоятельное решение сервера. Это помогает обсуждать конкретное поведение загрузки вместо общей отметки «валидация добавлена».</p>
  <p id="oVoe">Олжас Азирали, разработчик приложений из Астаны, основатель AZIRAL с 2019 года.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@azirali/saved-local-sync-export</guid><link>https://teletype.in/@azirali/saved-local-sync-export?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=azirali</link><comments>https://teletype.in/@azirali/saved-local-sync-export?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=azirali#comments</comments><dc:creator>azirali</dc:creator><title>Что означает «Сохранено»: три вопроса к экрану приложения</title><pubDate>Fri, 30 Oct 2026 17:18:46 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/ea/10/ea10afb6-6040-40c8-b9dd-29b9587a5604.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/7f/40/7f4099b2-aa8c-41a0-afff-7e888dfb156b.jpeg"></img>Локальная запись, синхронизация и экспорт: как связать короткий статус с конкретным подтверждённым результатом.]]></description><content:encoded><![CDATA[
  <p id="iAbW">Олжас Азирали / Olzhas Azirali, основатель AZIRAL с 2019 года и разработчик приложений.</p>
  <p id="JUW8">Материал подготовлен с помощью AI-ассистента по открытым материалам MDN и W3C. Портрет и обложка также созданы с помощью ИИ. Все экраны и надписи ниже являются учебными предложениями.</p>
  <p id="S06V">Представим вымышленный веб-редактор заметок с локальным хранением, синхронизацией и экспортом. Человек дописал список дел и увидел «Сохранено». Затем открыл редактор на другом устройстве или решил получить отдельный файл. Одной короткой надписи недостаточно, чтобы объяснить все три результата.</p>
  <p id="tNX4">Полезно заранее определить, какое событие подтверждает каждый статус. Запись на устройстве, получение версии общим сервисом и подготовка файла имеют разные границы. Их можно объяснить обычными словами, сохранив компактный интерфейс.</p>
  <h2 id="Xtrx">1. Где доступна локальная запись?</h2>
  <p id="mCiX">Для учебного локального режима можно предложить сообщение «Сохранено в этом браузере». Оно помогает понять, где искать результат после закрытия экрана. Надпись появляется после подтверждения соответствующей операции хранения.</p>
  <p id="nuXz">В веб-приложении один из возможных механизмов описан в <a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage" target="_blank">MDN о localStorage</a>: данные относятся к определённому источнику страницы и сохраняются между сессиями браузера. Для приватного режима MDN указывает очистку после закрытия последней приватной вкладки. Это свойства конкретного хранилища; они сами по себе не сообщают о доставке записи на другой телефон или в общий сервис.</p>
  <p id="kXQW">Поэтому для продукта важно назвать область действия статуса. Подтверждение локальной записи должно оставаться понятным и при отсутствии соединения. Человек может продолжить работу, зная, какой результат приложение уже установило.</p>
  <h2 id="GZCY">2. Какую версию подтвердил общий сервис?</h2>
  <p id="BQQ3">Теперь добавим в вымышленный сценарий синхронизацию. После локального сохранения изменения ещё могут ожидать отправки. Для этого состояния подходит отдельное предложенное сообщение: «Изменения ожидают синхронизации».</p>
  <p id="Xmf8">Статус «Синхронизировано» требует собственного условия подтверждения. Команде нужно договориться, какое состояние общего сервиса считается достаточным и к какой версии заметки оно относится. Если человек продолжает печатать после отправки, уже подтверждённая версия и новые изменения могут находиться на разных этапах.</p>
  <p id="QWrK">Для обсуждения полезно нарисовать короткую последовательность: изменено, записано локально, отправляется, подтверждено сервисом. Это модель требований, которую затем сопоставляют с реальным поведением приложения. Она позволяет редактору выбрать точный текст без обещаний, которых продукт ещё не проверил.</p>
  <h2 id="OKHh">3. Что произошло с отдельным файлом?</h2>
  <p id="1zlX">Экспорт добавляет третье событие. Человек может получить файл только с выбранной заметкой или с определённой частью её содержимого. Назначение экспорта лучше указать рядом с действием: какой формат и какие сведения будут подготовлены.</p>
  <p id="GEWE">В веб-сценарии следует учитывать роль браузера. <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/a#download" target="_blank">MDN разбирает поведение скачивания</a>: оно зависит от браузера и настроек пользователя. Перед загрузкой может появиться запрос, а файл может сохраниться автоматически или открыться в приложении.</p>
  <p id="5KFF">Если редактор знает только о подготовке данных и передаче запроса браузеру, сообщение должно описывать именно этот этап. Например: «Файл подготовлен. Запрос на скачивание передан браузеру». Утверждение о файле в конкретной папке уместно при наличии соответствующего подтверждения. Содержимое файла также стоит связать с моментом экспорта, чтобы последующие правки заметки не воспринимались как автоматическое обновление уже полученной копии.</p>
  <h2 id="AHOE">4. Проверить обещание одним сценарием</h2>
  <p id="uPuC">Для проверки макета достаточно одной вымышленной заметки. Измените её, дождитесь локального подтверждения, пройдите синхронизацию и запросите экспорт. На каждом этапе ответьте: что приложение уже подтвердило, к какой версии относится ответ и какое действие доступно человеку?</p>
  <p id="dfHr">Затем увеличьте шрифт и проверьте, остаются ли различия понятными. <a href="https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html" target="_blank">W3C в разборе сообщений о статусе</a> объясняет, как важные изменения могут становиться доступными вспомогательным технологиям без переноса фокуса. Это полезный ориентир для проверки сообщения вместе с его поведением.</p>
  <p id="drYc">Слово «Сохранено» становится точнее, когда у команды есть ясное описание подтверждённого результата. Так короткая надпись помогает человеку решить, можно ли закрыть экран, перейти на другое устройство или завершить получение файла.</p>
  <p id="04U9">Материалы MDN и W3C проверены 30 октября 2026 года.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@azirali/finance-bro-import-review</guid><link>https://teletype.in/@azirali/finance-bro-import-review?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=azirali</link><comments>https://teletype.in/@azirali/finance-bro-import-review?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=azirali#comments</comments><dc:creator>azirali</dc:creator><title>Импорт выписки: что человек должен проверить до сохранения</title><pubDate>Fri, 30 Oct 2026 00:24:58 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/77/ac/77acf24a-75dd-4fee-bd23-781a58dbdd52.png"></media:content><description><![CDATA[<img src="https://img3.teletype.in/files/67/75/67756c07-5afb-4c91-bd3b-64d4df81f1fe.png"></img>Олжас Азирали / Olzhas Azirali, основатель AZIRAL с 2019 года и разработчик приложений.]]></description><content:encoded><![CDATA[
  <figure id="Xtnj" class="m_original">
    <img src="https://img3.teletype.in/files/67/75/67756c07-5afb-4c91-bd3b-64d4df81f1fe.png" width="1672" />
    <figcaption>Олжас Азирали, основатель AZIRAL. Портрет и обложка подготовлены с помощью ИИ.</figcaption>
  </figure>
  <p id="gebl">Олжас Азирали / Olzhas Azirali, основатель AZIRAL с 2019 года и разработчик приложений.</p>
  <p id="erXn">Материал подготовлен с помощью AI-ассистента по опубликованным описаниям Finance Bro и документации поддержки.</p>
  <p id="ykY8">Импорт банковской выписки часто выглядит как одно действие: выбрать файл и получить готовый список операций. Между этими точками, однако, находятся разные задачи. Нужно прочитать данные, понять их смысл, связать запись с нужным счётом и решить, что именно сохранить. Если интерфейс объединяет всё в одну непрозрачную кнопку, человеку трудно заметить ошибку до её появления в учёте.</p>
  <p id="6Kn7">Поэтому экран проверки заслуживает места в основном сценарии. Его задача - показать будущую запись понятным языком и дать исправить её до подтверждения. Это полезный принцип проектирования даже тогда, когда файл распознаётся без технической ошибки.</p>
  <h2 id="4RBK">Разделить прочитанное и предложенное</h2>
  <p id="KDOO">В качестве конкретного примера можно взять <a href="https://apps.apple.com/kz/app/finance-bro-budget-expenses/id6780292828" target="_blank">Finance Bro в App Store</a>. Описание приложения предлагает проверять суммы, даты, направление операций и категории перед сохранением поддерживаемой выписки.</p>
  <p id="mAak">Эти поля имеют разное происхождение. Сумма может быть явно указана в строке файла. Категория может оказаться предложением на основе названия продавца. Выбор счёта зависит от контекста пользователя. Список полей выглядит простым, но за ним стоят несколько решений, которые нельзя автоматически считать одинаково надёжными.</p>
  <p id="fjwJ">Для интерфейса полезно разделять три состояния: значение прочитано из источника; значение предложено правилом; значение выбрал человек. Тогда исправление категории не выглядит как спор с исходным документом, а выбор счёта не маскируется под результат распознавания.</p>
  <h2 id="aMpo">Показать последствие на коротком примере</h2>
  <p id="voCB">Рассмотрим условную запись: 5 000 тенге, магазин, 30 октября. Это учебный пример, а не данные пользователя или результат измерения качества Finance Bro.</p>
  <ul id="WyRP">
    <li id="JanA">Прочитано: сумма и дата из выбранной строки.</li>
    <li id="2J4d">Предложено: направление «расход» и подходящая категория.</li>
    <li id="imkv">Требует решения: счёт, к которому относится операция.</li>
  </ul>
  <p id="oT5t">Проверка должна помогать ответить на практический вопрос: что окажется в моём учёте после сохранения? Если выбран другой счёт, даже верно прочитанная сумма создаёт другую запись. Если операция похожа на перевод между собственными счетами, один лишь ярлык «расход» не объясняет её смысл.</p>
  <p id="7naj">Такое представление не требует сложного отчёта о работе распознавателя. Часто достаточно показывать исходный фрагмент рядом с редактируемыми значениями и ясно обозначать действие подтверждения. Это предложение к дизайну, а не описание каждого экрана текущей версии приложения.</p>
  <h2 id="n2UC">Дать сомнению видимое место</h2>
  <p id="wy8C">Неопределённость лучше оставлять заметной. Незаполненная категория предлагает человеку принять решение. Уверенно выбранная, но неподходящая категория может выглядеть как уже проверенный факт.</p>
  <p id="fIPm"><a href="https://finance.aziral.com/support" target="_blank">Поддержка Finance Bro</a> объясняет, что категории предлагаются по локальным словам в названии продавца; незнакомое название может остаться без категории. Это конкретный пример ограниченного правила, назначение которого можно объяснить пользователю.</p>
  <p id="EJXs">Для разработчика отсюда следует полезный вопрос: умеет ли интерфейс сообщить «здесь нужно ваше решение»? Поле может оставаться незаполненным, строка может требовать проверки, а подсказка - объяснять причину. Важно, чтобы такое состояние отличалось от ошибки чтения файла и от уже подтверждённой операции.</p>
  <h2 id="aj7c">Считать повтор вопросом к данным</h2>
  <p id="zdct">Один и тот же документ можно выбрать дважды. Записи из разных источников могут описывать одно событие. При проектировании импорта стоит заранее определить, что человек увидит при возможном повторе и какие признаки помогут ему сравнить строки.</p>
  <p id="5QaY">Удобный экран проверки сохраняет контекст: дату, сумму, счёт и название источника. Решение о повторе не должно зависеть только от похожего названия продавца. Для объяснения результата полезно также различать строки, которые будут добавлены, исключены или оставлены для проверки.</p>
  <p id="5oRC">Это критерии для оценки сценария, а не обещание безошибочного поиска дублей. Конкретные правила сопоставления нужно проверять на поддерживаемых форматах и явно описывать в продукте.</p>
  <h2 id="COee">Не смешивать запись и оплату</h2>
  <p id="huXC">Автоматическое заполнение учёта и исполнение банковской операции - разные действия. По текущему описанию, Finance Bro не проводит банковские платежи. Созданная запись отражает информацию в приложении; она не означает новое списание денег банком.</p>
  <p id="bMKm">Проверку импорта также не стоит подменять обещанием полной автоматизации. В описании сценария важно перечислить поддерживаемые форматы, условия запуска и действия, для которых остаётся нужно подтверждение человека.</p>
  <h2 id="ALZz">Проверять понятность завершения</h2>
  <p id="iRKz">Перед выпуском сценария импорта полезно пройти его с несколькими учебными строками: заполненной, неполной и похожей на уже существующую. Для каждой должно быть понятно, что прочитано, что предложено, что изменится после подтверждения и какие записи ещё требуют внимания.</p>
  <p id="63s3">Такой разбор можно провести до разговора о скорости импорта. Он показывает, способен ли человек объяснить результат своими словами. Хороший импорт сокращает ручную работу и сохраняет возможность осознанного подтверждения. Именно это сочетание стоит делать видимым в интерфейсе.</p>
  <p id="8Z6c">Другие продукты и материалы: <a href="https://aziral.com/olzhas-azirali" target="_blank">Олжас Азирали / AZIRAL</a>. Finance Bro развивается на открытой Flutter-основе; происхождение приложения раскрыто в <a href="https://aziral.com/build-notes/finance-bro" target="_blank">продуктовой заметке</a>.</p>
  <p id="4yv8">Описания проверены 30 октября 2026 года. В App Store показана версия 1.0.9. Поддерживаемые форматы и доступность функций нужно сопоставлять с установленной версией приложения.</p>

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