<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Статьи]]></title>
    <link>https://habr.com/ru/users/java73/publications/articles/</link>
    <description><![CDATA[Хабр: статьи пользователя java73]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Wed, 08 Apr 2026 15:17:38 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      
        
    
    <item>
      <title><![CDATA[Почему памятники надо ставить тем, кто автоматизирует MS Word]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/949036/</guid>
      <link>https://habr.com/ru/articles/949036/?utm_campaign=949036&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/bac/a0b/7e1/baca0b7e1d78d8ad60bddd8af0b308ea.jpg" /><p><strong>DocxKtm</strong> — это Kotlin DSL-обёртка над docx4j для автоматизации Word-документов.</p><p>Умеет: создавать документы «с нуля», вставлять текст, картинки, таблицы, колонтитулы, нумерацию страниц.</p><p>Поддерживает <strong>шаблоны с подстановками и логикой</strong> (через встроенный движок на базе MVEL2). По функциональности близко к Python-библиотеке <strong>docxtpl</strong>, но на JVM и с выразительностью Kotlin.</p><p>Если вам надоело вручную генерировать документы в Word — это может сэкономить кучу времени и нервов.</p><p>Внутри статьи&nbsp;— моя история создания этой библиотеки.</p> <a href="https://habr.com/ru/articles/949036/?utm_campaign=949036&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Sun, 21 Sep 2025 12:21:45 GMT</pubDate>
      <dc:creator><![CDATA[java73]]></dc:creator>
      <category><![CDATA[Kotlin]]></category><category><![CDATA[Java]]></category><category><![CDATA[Processing]]></category>
      <category><![CDATA[docx parser]]></category><category><![CDATA[templates]]></category><category><![CDATA[kotlin]]></category><category><![CDATA[dsl]]></category><category><![CDATA[docx4j]]></category><category><![CDATA[mvel]]></category><category><![CDATA[docxtpl]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Paging3 в стиле Compose: секретный DSL, о котором молчат все Android-разработчики]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/907910/</guid>
      <link>https://habr.com/ru/articles/907910/?utm_campaign=907910&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/5b2/320/4e4/5b23204e4fef28b961df26ad44df07de.png" /><p>В статье описан путь преобразования предложенного экспертами Google способа отображения страничных данных с использованием библиотеки Paging3 и Compose от развесистого сборника if'ов и when'ов, вероломно нарушающего все границы архитектурных слоев, до чистого, лаконичного и затягивающего в себя DSL.</p> <a href="https://habr.com/ru/articles/907910/?utm_campaign=907910&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Погрузиться в магию</a>]]></description>
      
      <pubDate>Thu, 08 May 2025 11:39:34 GMT</pubDate>
      <dc:creator><![CDATA[java73]]></dc:creator>
      <category><![CDATA[Android]]></category><category><![CDATA[Kotlin]]></category><category><![CDATA[Jetpack Compose]]></category><category><![CDATA[Функциональное программирование]]></category>
      <category><![CDATA[DSL]]></category><category><![CDATA[paging]]></category><category><![CDATA[kotlin]]></category><category><![CDATA[compose]]></category><category><![CDATA[multiplatform]]></category><category><![CDATA[android]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Proto DataStore + AndroidX Preferences на Kotlin]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/560272/</guid>
      <link>https://habr.com/ru/articles/560272/?utm_campaign=560272&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/8c0/18b/cdf/8c018bcdf3074ed682a7bb49891d2d63.png" /><p>С тех пор, как команда Google AndroidX представила на замену библиотеки SharedPreferences <a href="https://developer.android.com/topic/libraries/architecture/datastore" rel="noopener noreferrer nofollow">новую библиотеку DataStore</a>, прошел почти год, однако популяризация новой либы явно не стоит в активных задачах. Иначе я не могу объяснить 1) неполноценный гайд, следуя лишь по которому, у вас вообще не соберется проект из-за отсутствия всех необходимых зависимостей и дополнительных build-задач для системы сборки, и 2) отсутствие не hello-world подобных примеров в CodeLabs, кроме одного, и то, заточенного не под пример использования библиотеки с нуля, а под <a href="https://codelabs.developers.google.com/codelabs/android-proto-datastore" rel="noopener noreferrer nofollow">миграцию с SharedPreferences на Preferences DataStore</a>. Аналогично все статьи на Medium буквально или другими словами повторяют все то же, что написано в гайде Google, либо используют неправильные подходы для работы с DataStore, предлагая заворачивать асинхронный io-код в runBlocking прямо на ui-потоке.</p><p>А еще неплохо бы соединить "тыл" с "фронтом", так сказать: у Google имеется библиотека <a href="https://developer.android.com/guide/topics/ui/settings" rel="noopener noreferrer nofollow">AndroidX Preferences</a>, которая позволяет в два клика накидать готовый material-design фрагмент для управления настройками приложения, чтобы излюбленным способом кодогенерации освободить разработчика от написания boilerplate. Однако эта библиотека в качестве хранилища предлагает использовать устаревшие нынче SharedPreferences, а официального гайда по соединению с DataStore нет. В этой заметке я хотел бы своим способом устранить два описанных недостатка.</p> <a href="https://habr.com/ru/articles/560272/?utm_campaign=560272&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Tue, 01 Jun 2021 12:01:30 GMT</pubDate>
      <dc:creator><![CDATA[java73]]></dc:creator>
      <category><![CDATA[Android]]></category><category><![CDATA[Kotlin]]></category>
      <category><![CDATA[dataStorage]]></category><category><![CDATA[androidx]]></category><category><![CDATA[android preferences]]></category><category><![CDATA[настройки приложения]]></category><category><![CDATA[kotlin android]]></category><category><![CDATA[jetpack]]></category><category><![CDATA[settings fragment]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Простой вариант разношерстного recycler view на шаблоне Посетитель]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/551222/</guid>
      <link>https://habr.com/ru/articles/551222/?utm_campaign=551222&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/getpro/habr/upload_files/ecd/f66/d54/ecdf66d54552e6cf6ea0cdf855d921f1.png" /><p>Прошло полгода, как я <a href="https://habr.com/ru/post/535532/" rel="noopener noreferrer nofollow">с паскаля перекатился</a> на kotlin и влюбился в android-разработку, и вот уже разрешаю себе публично лезть со своими идеями в чужой монастырь. Но причина на то есть. Понаблюдав в профильных чатах за тем, какие чаще всего возникают вопросы у android-разработчиков, и не только у новичков, я понял, что в большинстве случаев, когда человек сталкивается с ошибкой, которую не может понять, как не может понять объяснение коллег из чата или их наводящие вопросы, причиной является бездумное использование готовых кусков кода или библиотек. Однако, полагаясь на готовые примеры кода, которые у них не работают (а в этой сфере код, написанный больше года назад, по умолчанию требует обновления или вообще переработки, и это касается кода со stack overflow, библиотечных гайдов и даже гайдов от самого Google), они не понимают причин возникающих ошибок или же отличающегося поведения, поскольку полагаются на библиотеку как <a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%B8%D1%82%D0%B0%D0%B9%D1%81%D0%BA%D0%B0%D1%8F_%D0%BA%D0%BE%D0%BC%D0%BD%D0%B0%D1%82%D0%B0" rel="noopener noreferrer nofollow">китайскую комнату</a>, не пытаясь разобраться в её архитектуре и принципах работы. </p><p>Поскольку очень часто всплывают вопросы, связанные с recycler view, я бы хотел немного разобраться в том, как самостоятельно сделать расширяемый и чистый код для отображения мульти-элементного списка в приложении.</p> <a href="https://habr.com/ru/articles/551222/?utm_campaign=551222&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Wed, 07 Apr 2021 12:35:01 GMT</pubDate>
      <dc:creator><![CDATA[java73]]></dc:creator>
      <category><![CDATA[Android]]></category><category><![CDATA[ООП]]></category><category><![CDATA[Kotlin]]></category>
      <category><![CDATA[recyclerview]]></category><category><![CDATA[recyclerviewadapter]]></category><category><![CDATA[visitor]]></category><category><![CDATA[kotlin]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Склонение слов и инициалов в Delphi/Freepascal]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/535532/</guid>
      <link>https://habr.com/ru/articles/535532/?utm_campaign=535532&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<p>Добрый, предновогодний день всем! В этой статье я бы хотел рассказать, как мне пришлось вернуться в legacy-проект на паскале, причем буквально перед тем, как навсегда распрощаться и с ним, и с лазарусом, и с отсутствием темной темы из <abbr title="сине-желтая не считается!">коробки</abbr>. </p><p><a href="https://habr.com/ru/post/419063/" rel="noopener noreferrer nofollow">В прошлый раз я объяснял</a>, что не являюсь программистом по роду профессиональной деятельности, но использую любимое хобби для автоматизации всего, что попадается под руку в работе юриста. Я уверен, что 90% всей юридической волокиты может быть успешно автоматизировано: ведение разнообразных баз и карточек, составление документов по шаблонам, контроль сроков выполнения задач, использование любых вспомогательных сервисов, уже имеющих свои api, для прикручивания автоматизации на конкретном рабочем месте и т.д. К этому нужно стремиться, чтобы по <abbr title="В одном рассказе роботы-юристы служили прообразом современной википедии и систем big data - аналитики для оперативного подбора юридических прецедентов">заветам Айзека Азимова</abbr> высвободить время юриста для реализации основной задачи - размышлять над условиями договора и разводить демагогию в суде.</p> <a href="https://habr.com/ru/articles/535532/?utm_campaign=535532&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать далее</a>]]></description>
      
      <pubDate>Tue, 29 Dec 2020 13:48:29 GMT</pubDate>
      <dc:creator><![CDATA[java73]]></dc:creator>
      <category><![CDATA[Delphi]]></category>
      <category><![CDATA[lazarus]]></category><category><![CDATA[freepascal]]></category><category><![CDATA[склонение слов]]></category><category><![CDATA[склонение фио]]></category><category><![CDATA[restapi]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Как устроен фреймворк tiOPF для delphi/lazarus. Шаблон «Посетитель»]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/441266/</guid>
      <link>https://habr.com/ru/articles/441266/?utm_campaign=441266&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<h3>От переводчика</h3><br>
Есть две причины, по которым я взялся перевести несколько материалов по разработанному двадцать лет назад для не самой популярной ныне среды программирования фреймворку:<br>
<br>
1. Несколько лет назад я, познав многие прелести работы с Entity Framework как ORM для платформы .Net, тщетно искал аналоги для среды Lazarus и в общем для freepascal. <br>
Удивительно, но хорошие ORM для нее отсутствуют. Всё, что тогда удалось найти — open-source проект под названием <a href="http://tiopf.sourceforge.net/index.shtml">tiOPF</a>, разработанный еще в конце 90-х годов для delphi, позже портированный под freepascal. Однако этот фреймворк коренным образом отличается от привычного вида больших и толстых ORM. <br>
<br>
Визуальные способы проектирования объектов (в Entity — model first) и сопоставления объектов с полями таблиц реляционной базы данных (в Entity — database first) в tiOPF <abbr title="Но имеются некоторые дополнительные утилиты со схожим, правда, спартанским функционалом и внешним видом">отсутствуют</abbr>. Разработчик сам позиционирует этот факт как один из недостатков проекта, однако в качестве достоинства предлагает полную ориентацию именно на объектную бизнес-модель, стоит лишь один раз похардкодить… <br> <a href="https://habr.com/ru/articles/441266/?utm_campaign=441266&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше →</a>]]></description>
      
      <pubDate>Fri, 22 Feb 2019 08:29:09 GMT</pubDate>
      <dc:creator><![CDATA[java73]]></dc:creator>
      <category><![CDATA[Delphi]]></category><category><![CDATA[ООП]]></category>
      <category><![CDATA[freepascal]]></category><category><![CDATA[lazarus]]></category><category><![CDATA[ООП]]></category><category><![CDATA[паттерн Посетитель]]></category><category><![CDATA[tiOPF]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Deprecated! Автоматизация получения сведений из ЕГРЮЛ с помощью Freepascal]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/419063/</guid>
      <link>https://habr.com/ru/articles/419063/?utm_campaign=419063&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<img src="https://habrastorage.org/webt/xp/n2/lb/xpn2lbf3yf9_ryhoprada0ehl5i.jpeg"><br>
<br>
<p>В своей работе (юридической) я готов автоматизировать всё, что только поддаётся этому. Но пока прокачанные нейросетями <a href="https://www.rbc.ru/business/23/07/2017/5974b7a69a79477896b6708d" rel="nofollow noopener noreferrer">роботы из утопии Германа Грефа</a> не появились и не отняли всю работу у рядовых юристов, рутина надолго останется нашим главным спутником. Автоматизация этой рутины — то, чем я периодически занимаюсь на протяжении последних лет, будь то многочисленные таблицы в excel с кучей формул, позволяющих быстро распечатать сотню однотипных документов-рассылок в word'е, ну или автоматически генерируемые отчеты. Но есть и такие вещи, которые простыми формулами и подстановками не сделаешь. Здесь на помощь приходит программирование, которым я увлекаюсь с детства, и так уж вышло, что началось это с delphi. Сейчас мне проще, чем в C# или python, осваивать которые начал недавно, сделать быстро какой-то проект в среде Lazarus, используя freepascal. И да, я на полном серьёзе считаю, что возможностей этой среды более, чем достаточно. Поэтому автоматизировать ЕГРЮЛ, как вы догадались, предстоит с помощью паскаля. <br>
</p> <a href="https://habr.com/ru/articles/419063/?utm_campaign=419063&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Fri, 03 Aug 2018 12:30:44 GMT</pubDate>
      <dc:creator><![CDATA[java73]]></dc:creator>
      <category><![CDATA[Delphi]]></category>
      <category><![CDATA[freepascal]]></category><category><![CDATA[lazarus]]></category><category><![CDATA[ЕГРЮЛ]]></category><category><![CDATA[nalog.ru]]></category><category><![CDATA[автоматизация бизнеса]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Перегрузка операторов в freepascal на примере обыкновенных дробей]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/327450/</guid>
      <link>https://habr.com/ru/articles/327450/?utm_campaign=327450&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<div style="text-align:center;"><img src="https://habrastorage.org/getpro/habr/post_images/23d/1d3/d25/23d1d3d25594700c3ff1cfac82f69730.jpg" alt="image" /></div><br/>
Все мы помним, как в школе учили обыкновенные дроби. Числители, знаменатели, НОД и НОК, арифметические действия с дробями. Но и в реальной жизни обыкновенные дроби успешно применяются в разных сферах деятельности, в том числе юридической: например, в обыкновенных дробях могут выражаться доли участников хозяйственных обществ, доли в праве общей долевой собственности и т.д. <br/>
<br/>
И вот, понадобилось как-то раз реализовать пару функций в корпоративном приложении для оперирования обыкновенными дробями. Современная реализация паскаля, будь то delphi или freepascal, предлагает удобные средства для этого. <br/>
 <a href="https://habr.com/ru/articles/327450/?utm_campaign=327450&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut">Читать дальше &rarr;</a>]]></description>
      
      <pubDate>Wed, 26 Apr 2017 15:01:47 GMT</pubDate>
      <dc:creator><![CDATA[java73]]></dc:creator>
      <category><![CDATA[Delphi]]></category><category><![CDATA[Математика]]></category>
      <category><![CDATA[дроби]]></category><category><![CDATA[обыкновенные дроби]]></category><category><![CDATA[перегрузка операторов]]></category><category><![CDATA[freepascal]]></category>
    </item>
  

  

  

	
  

  

  

    
    <item>
      <title><![CDATA[Безболезненная прививка объектного мышления]]></title>
      <guid isPermaLink="true">https://habr.com/ru/articles/325010/</guid>
      <link>https://habr.com/ru/articles/325010/?utm_campaign=325010&amp;utm_source=habrahabr&amp;utm_medium=rss</link>
      <description><![CDATA[<h3>Или как можно проще об основных принципах ООП в Lazarus и FreePascal</h3><br/>
<h4>Часть I</h4><br/>
<p>Изучать ООП (объектно-ориентированное программирование) можно двумя способами: или прочитать сотню книжек, в которых дается голая теория об устройстве классов и принципах наследования, полиморфизма, инкапсуляции, но так ничему и не научиться, или перестать беспокоиться и попытаться на практике освоить новые приемы, переработав, к примеру, готовые коды, а лучше с нуля изготовив что-то простое, но красивое.</p><br/>
<p>Во всех книгах, посвященных паскалю, delphi и lazarus (я нашел аж целых две о последнем), очень схожая часть, посвященная ООП. По этим книгам можно много узнать о том, насколько круче ООП устаревшего структурного подхода, но так и не получить достаточных навыков применения этого на практике. Конечно, любой программист, использующий визуальные IDE, уже по умолчанию использует ООП, так как все компоненты и структурные элементы визуального приложения представляют собой объекты, однако свои собственные структуры и абстракции перенести в парадигму ООП бывает очень сложно. Чтобы понять всю прелесть и оценить открывающиеся перспективы, я решил сделать небольшое приложение, которое в конечном итоге превратилось в простенький screensaver. Заодно вспомнил о существовании тригонометрии.<br/>
<br/>
Приложение будет рисовать на экране в случайных местах пятьдесят полярных роз с разными характеристиками: размер, цвет, количество лепестков. Потом их же затирать и рисовать новые, и т.д. Используя принципы структурного программирования, можно, конечно, сделать обычный многомерный массив объемом на 50 и в нем сохранять все уникальные характеристики. Однако стоит вспомнить, что паскаль подразумевает строгую типизацию данных, а, следовательно, массив не может состоять их элементов с разными типами. Можно сделать массив из записей (record), но чего уж мелочиться, от записи до класса — один шаг. Вот его мы и сделаем.</p> <a href="https://habr.com/ru/articles/325010/?utm_campaign=325010&amp;utm_source=habrahabr&amp;utm_medium=rss#habracut"></a>]]></description>
      
      <pubDate>Tue, 28 Mar 2017 08:19:07 GMT</pubDate>
      <dc:creator><![CDATA[java73]]></dc:creator>
      <category><![CDATA[Delphi]]></category><category><![CDATA[ООП]]></category>
      <category><![CDATA[ООП]]></category><category><![CDATA[pascal]]></category><category><![CDATA[delphi]]></category><category><![CDATA[lazarus]]></category><category><![CDATA[freepascal]]></category>
    </item>
  

  

  

	
  

  

  

      

      

      

    
  </channel>
</rss>
