1
0
Fork 0

Use fragments

This commit is contained in:
Alex Kotov 2021-08-16 02:13:39 +05:00
parent 0c1bf9975f
commit 0733811295
Signed by: kotovalexarian
GPG key ID: 553C0EBBEB5D5F08
9 changed files with 204 additions and 229 deletions

View file

@ -14,16 +14,13 @@
android:theme="@style/Theme.CausaArcana" android:theme="@style/Theme.CausaArcana"
tools:ignore="AllowBackup"> tools:ignore="AllowBackup">
<activity <activity
android:name=".MainActivity" android:name=".AppActivity"
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN"/> <action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter> </intent-filter>
</activity> </activity>
<activity
android:name=".ArticleActivity"
android:exported="true"/>
</application> </application>
</manifest> </manifest>

View file

@ -0,0 +1,23 @@
package com.causa_arcana
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class AppActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_app)
val fragmentTransaction = supportFragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.activity_main__frame, MainFragment() {
onArticlesListItemClick()
})
fragmentTransaction.commit()
}
fun onArticlesListItemClick() {
val fragmentTransaction = supportFragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.activity_main__frame, ArticleFragment())
fragmentTransaction.commit()
}
}

View file

@ -1,158 +0,0 @@
package com.causa_arcana
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.webkit.WebView
class ArticleActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_article)
val articleWebView: WebView = findViewById(R.id.articleWebView)
val customWebViewClient = CustomWebViewClient(applicationContext)
articleWebView.webViewClient = customWebViewClient
val htmlGenerator = HtmlGenerator(
"Почему сложно писать о передовых информационных технологиях?",
contentHtml,
)
articleWebView.loadDataWithBaseURL("https://causa-arcana.com", htmlGenerator.fullHtml(),
"text/html", "utf-8", "")
}
companion object {
private const val contentHtml = """
<p>Однажды мы выпустили статью
&ldquo;<a href="../../../2020/06/04/decentralized-vs-distributed.html">Децентрализованные сервисы против распределённых</a>&rdquo;,
где предприняли попытку подтолкнуть читателей к более обдуманному отношению к
терминам, таким как &ldquo;централизованный&rdquo;, &ldquo;децентрализованный&rdquo; и &ldquo;распределённый&rdquo;.
Это имеет значение не только с точки зрения теоретической информатики и удобства
практической деятельности по написанию программного обеспечения. Часто такие
термины используются спекулятивно с целью рекламного продвижения продуктов
сомнительного качества, таких как некоторые реализации децентрализованных
финансов (DeFi; от англ. <em>decentralized finance</em>), а то и вовсе мошеннических
предложений.</p>
<p>Мы не собирались развивать эту тему, так как любая попытка составления подробной
классификации обречена на провал. Технологии развиваются быстрее, чем успевают
осмысляться, а их сложность не даёт шансов охватить все тонкости. Единственное,
что можно сделать &ndash; это посоветовать подробнее изучать то, что собираетесь
использовать.</p>
<p>Закономерно, что отвечать на критику представленного нами наброска классификации
мы тоже не хотели, потому что она с большой вероятностью была бы справедлива.
Любой выбор терминологии имеет как преимущества, позволяя удобнее передавать
мысли, так и недостатки, заковывая сознание в слишком строгие рамки. В начале
нашей статьи так и было сказано, что мы не ставим целью создание идеальной
классификации.</p>
<p>Однако мы столкнулись, помимо прочего, с обвинениями в невежестве. Это может
означать, что мы слишком плохо объяснили нашу мотивацию. Мы хотим исправить эту
ошибку, потому что проблемы эпистемологии и языка довольно важны для нас, они
касаются мышления о мире вообще, а не только о технологиях.</p>
<div class="d-flex justify-content-center">
<figure class="nice-figure">
<img src="https://causa-arcana.com/assets/images/blog/decentralized-vs-distributed-wrong.png"
alt='Та самая "неправильная" картинка.'/>
<figcaption>
Та самая &ldquo;неправильная&rdquo; картинка.
</figcaption>
</figure>
</div>
<p>Что же не так с распространёнными вариантами использования упомянутых терминов?
Начнём с рассмотрения представленной выше картинки, альтернатива которой была
показана в нашей статье. Она часто используется для иллюстрации соответствующих
терминов, причём не только в популярных статьях, но и в научных публикациях.
Так, в
<a href="https://www.researchgate.net/publication/316042146_A_Survey_on_Trust_Computation_in_the_Internet_of_Things">одной</a>
из рассмотренных нами публикаций децентрализованная система определяется в том
числе как система без единой точки отказа, и тут же приводится эта картинка.
Если присмотреться к ней, то в примере децентрализованной системы есть один
узел, при удалении которого части системы больше не будут связаны. Возможно, это
не является противоречием при каком-то экзотическом определении требований к
системе, смысла узлов и связей между ними, но рассматриваемая публикация не
содержит ничего подобного.</p>
<p>Рассматриваемая выше картинка ведёт своё происхождение из
<a href="https://www.rand.org/content/dam/rand/pubs/research_memoranda/2006/RM3420.pdf">книги</a>
1964 года &ldquo;On Distributed Communications Networks&rdquo; (автор Paul Baran). Там
даётся определение децентрализованной сети как такой, где отказ центрального
узла не приводит к полной потере связности между всеми узлами, а лишь
некоторыми. Это было довольно актуально в то время, поскольку количество
информации, передаваемой между отдалёнными узлами больших сетей было невелико, а
связность внутри организаций могла быть гораздо важнее, чем между ними. Чего
нельзя сказать про наше время. Кроме того, автор рассматривает довольно узкий
вопрос сетевых топологий, то есть физической связности. У современных же систем
есть множество других свойств, таких как доверие между узлами или хранение
данных на разных узлах.</p>
<div class="d-flex justify-content-center">
<figure class="nice-figure">
<img src="https://causa-arcana.com/assets/images/blog/network-topologies.png"
alt="Классификация сетевых топологий. Возможно, тоже неправильная или неполная."/>
<figcaption>
Классификация сетевых топологий. Возможно, тоже неправильная или неполная.
</figcaption>
</figure>
</div>
<p>Попытка создать современную классификацию была предпринята, например, в
<a href="https://journals.sagepub.com/doi/full/10.1177/2631787720977052">работе</a> 2020
года &ldquo;Decentralized vs. Distributed Organization: Blockchain, Machine Learning
and the Future of the Digital Platform&rdquo;. Там предлагается воспринимать
децентрализацию как рассеивание коммуникации, а распределённость как рассеивание
принятия решений. Это интересная работа с историческим обзором, собственным
теоретическим аппаратом и масштабными выводами, в том числе
социально-политического характера. Однако её результаты противоречат устоявшейся
терминологии, а также являются слишком сложными, чтобы их можно было корректно
применять. Так, в добавок к существующим трём терминам там вводится ещё один &ndash;
концентрированные системы. Авторы текстов с тремя-то не справляются.</p>
<p>Похожий подход предлагает и создатель криптовалюты Ethereum Виталик Бутерин в
<a href="https://medium.com/@VitalikButerin/the-meaning-of-decentralization-a0c92b76a274">статье</a>
&ldquo;The Meaning of Decentralization&rdquo;. Он особенно подчёркивает, что каждая система
может классифицироваться тем или иным образом по каждому из трёх различных
критериев:</p>
<ul>
<li>Архитектурная децентрализованность &ndash; как много узлов в системе? Как много из
них могут выйти из строя, не вызывая отказа всей системы?</li>
<li>Политическая децентрализованность &ndash; как много людей или организаций
контролируют систему?</li>
<li>Логическая децентрализованность &ndash; являются ли интерфейсы и структуры данных
системы единым монолитным объектом (как в блокчейне) или нет (как в федеративных
социальных сетях)?</li>
</ul>
<p>Мы согласны, что соответствие системы каким-то критериям зависит от целей,
которые ставятся теми, кто её обсуждает, но явное введение таких критериев,
опять же, слишком усложняет классификацию, оставляя её потенциально неполной.</p>
<p>Главным возражением на нашу статью было противоречие (только кажущееся) нашего
определения распределённой системы наиболее распространённому, согласно которому
это коллекция узлов, которая выглядит для пользователей как единая когерентная
система. Это определение даёт сам Эндрю Таненбаум в книге &ldquo;Distributed Systems:
Principles and Paradigms&rdquo;. Наше определение, возможно, более широкое, но оно
точно полностью включает указанное. Есть, например, распределённые базы данных,
управление которыми осуществляет одна инстанция, принимающие некоторые
административные решения. Однако необходимость наличия администратора в случае
баз данных не вызывает никаких сомнений и при обсуждении может не упоминаться.
Большую же часть времени они работают автономно, без какого-либо единого центра
принятия решений, и принятие решений действительно осуществляется всей сетью с
помощью алгоритмов распределённого консенсуса, таких как Paxos или Raft.</p>
<p>Таким образом, удобство классификаций и определений сильно зависит от того,
какие задачи необходимо решать. Как мы уже писали в статье
&ldquo;<a href="../../07/19/capitalization-of-internet.html">Почему слово Интернет пишется с прописной буквы?</a>&rdquo;,
мы не указываем вам, как и что говорить, лишь помогаем думать эффективнее и не
попадаться в ментальные ловушки, расставленные теми, кто на самом деле хочет вас
контролировать. Это непростая задача в столь быстро меняющеся мире, но благодаря
вашей поддержке и обратной связи мы сможем выполнять её более эффективно.</p>
"""
}
}

View file

@ -5,6 +5,7 @@ import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.webkit.WebView
class ArticleFragment : Fragment() { class ArticleFragment : Fragment() {
override fun onCreateView( override fun onCreateView(
@ -14,4 +15,154 @@ class ArticleFragment : Fragment() {
): View? { ): View? {
return inflater.inflate(R.layout.fragment_article, container, false) return inflater.inflate(R.layout.fragment_article, container, false)
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val articleWebView: WebView = view.findViewById(R.id.fragment_article__article_web_view)
val customWebViewClient = CustomWebViewClient(requireContext())
articleWebView.webViewClient = customWebViewClient
val htmlGenerator = HtmlGenerator(
"Почему сложно писать о передовых информационных технологиях?",
contentHtml,
)
articleWebView.loadDataWithBaseURL("https://causa-arcana.com", htmlGenerator.fullHtml(),
"text/html", "utf-8", "")
}
companion object {
private const val contentHtml = """
<p>Однажды мы выпустили статью
&ldquo;<a href="../../../2020/06/04/decentralized-vs-distributed.html">Децентрализованные сервисы против распределённых</a>&rdquo;,
где предприняли попытку подтолкнуть читателей к более обдуманному отношению к
терминам, таким как &ldquo;централизованный&rdquo;, &ldquo;децентрализованный&rdquo; и &ldquo;распределённый&rdquo;.
Это имеет значение не только с точки зрения теоретической информатики и удобства
практической деятельности по написанию программного обеспечения. Часто такие
термины используются спекулятивно с целью рекламного продвижения продуктов
сомнительного качества, таких как некоторые реализации децентрализованных
финансов (DeFi; от англ. <em>decentralized finance</em>), а то и вовсе мошеннических
предложений.</p>
<p>Мы не собирались развивать эту тему, так как любая попытка составления подробной
классификации обречена на провал. Технологии развиваются быстрее, чем успевают
осмысляться, а их сложность не даёт шансов охватить все тонкости. Единственное,
что можно сделать &ndash; это посоветовать подробнее изучать то, что собираетесь
использовать.</p>
<p>Закономерно, что отвечать на критику представленного нами наброска классификации
мы тоже не хотели, потому что она с большой вероятностью была бы справедлива.
Любой выбор терминологии имеет как преимущества, позволяя удобнее передавать
мысли, так и недостатки, заковывая сознание в слишком строгие рамки. В начале
нашей статьи так и было сказано, что мы не ставим целью создание идеальной
классификации.</p>
<p>Однако мы столкнулись, помимо прочего, с обвинениями в невежестве. Это может
означать, что мы слишком плохо объяснили нашу мотивацию. Мы хотим исправить эту
ошибку, потому что проблемы эпистемологии и языка довольно важны для нас, они
касаются мышления о мире вообще, а не только о технологиях.</p>
<div class="d-flex justify-content-center">
<figure class="nice-figure">
<img src="https://causa-arcana.com/assets/images/blog/decentralized-vs-distributed-wrong.png"
alt='Та самая "неправильная" картинка.'/>
<figcaption>
Та самая &ldquo;неправильная&rdquo; картинка.
</figcaption>
</figure>
</div>
<p>Что же не так с распространёнными вариантами использования упомянутых терминов?
Начнём с рассмотрения представленной выше картинки, альтернатива которой была
показана в нашей статье. Она часто используется для иллюстрации соответствующих
терминов, причём не только в популярных статьях, но и в научных публикациях.
Так, в
<a href="https://www.researchgate.net/publication/316042146_A_Survey_on_Trust_Computation_in_the_Internet_of_Things">одной</a>
из рассмотренных нами публикаций децентрализованная система определяется в том
числе как система без единой точки отказа, и тут же приводится эта картинка.
Если присмотреться к ней, то в примере децентрализованной системы есть один
узел, при удалении которого части системы больше не будут связаны. Возможно, это
не является противоречием при каком-то экзотическом определении требований к
системе, смысла узлов и связей между ними, но рассматриваемая публикация не
содержит ничего подобного.</p>
<p>Рассматриваемая выше картинка ведёт своё происхождение из
<a href="https://www.rand.org/content/dam/rand/pubs/research_memoranda/2006/RM3420.pdf">книги</a>
1964 года &ldquo;On Distributed Communications Networks&rdquo; (автор Paul Baran). Там
даётся определение децентрализованной сети как такой, где отказ центрального
узла не приводит к полной потере связности между всеми узлами, а лишь
некоторыми. Это было довольно актуально в то время, поскольку количество
информации, передаваемой между отдалёнными узлами больших сетей было невелико, а
связность внутри организаций могла быть гораздо важнее, чем между ними. Чего
нельзя сказать про наше время. Кроме того, автор рассматривает довольно узкий
вопрос сетевых топологий, то есть физической связности. У современных же систем
есть множество других свойств, таких как доверие между узлами или хранение
данных на разных узлах.</p>
<div class="d-flex justify-content-center">
<figure class="nice-figure">
<img src="https://causa-arcana.com/assets/images/blog/network-topologies.png"
alt="Классификация сетевых топологий. Возможно, тоже неправильная или неполная."/>
<figcaption>
Классификация сетевых топологий. Возможно, тоже неправильная или неполная.
</figcaption>
</figure>
</div>
<p>Попытка создать современную классификацию была предпринята, например, в
<a href="https://journals.sagepub.com/doi/full/10.1177/2631787720977052">работе</a> 2020
года &ldquo;Decentralized vs. Distributed Organization: Blockchain, Machine Learning
and the Future of the Digital Platform&rdquo;. Там предлагается воспринимать
децентрализацию как рассеивание коммуникации, а распределённость как рассеивание
принятия решений. Это интересная работа с историческим обзором, собственным
теоретическим аппаратом и масштабными выводами, в том числе
социально-политического характера. Однако её результаты противоречат устоявшейся
терминологии, а также являются слишком сложными, чтобы их можно было корректно
применять. Так, в добавок к существующим трём терминам там вводится ещё один &ndash;
концентрированные системы. Авторы текстов с тремя-то не справляются.</p>
<p>Похожий подход предлагает и создатель криптовалюты Ethereum Виталик Бутерин в
<a href="https://medium.com/@VitalikButerin/the-meaning-of-decentralization-a0c92b76a274">статье</a>
&ldquo;The Meaning of Decentralization&rdquo;. Он особенно подчёркивает, что каждая система
может классифицироваться тем или иным образом по каждому из трёх различных
критериев:</p>
<ul>
<li>Архитектурная децентрализованность &ndash; как много узлов в системе? Как много из
них могут выйти из строя, не вызывая отказа всей системы?</li>
<li>Политическая децентрализованность &ndash; как много людей или организаций
контролируют систему?</li>
<li>Логическая децентрализованность &ndash; являются ли интерфейсы и структуры данных
системы единым монолитным объектом (как в блокчейне) или нет (как в федеративных
социальных сетях)?</li>
</ul>
<p>Мы согласны, что соответствие системы каким-то критериям зависит от целей,
которые ставятся теми, кто её обсуждает, но явное введение таких критериев,
опять же, слишком усложняет классификацию, оставляя её потенциально неполной.</p>
<p>Главным возражением на нашу статью было противоречие (только кажущееся) нашего
определения распределённой системы наиболее распространённому, согласно которому
это коллекция узлов, которая выглядит для пользователей как единая когерентная
система. Это определение даёт сам Эндрю Таненбаум в книге &ldquo;Distributed Systems:
Principles and Paradigms&rdquo;. Наше определение, возможно, более широкое, но оно
точно полностью включает указанное. Есть, например, распределённые базы данных,
управление которыми осуществляет одна инстанция, принимающие некоторые
административные решения. Однако необходимость наличия администратора в случае
баз данных не вызывает никаких сомнений и при обсуждении может не упоминаться.
Большую же часть времени они работают автономно, без какого-либо единого центра
принятия решений, и принятие решений действительно осуществляется всей сетью с
помощью алгоритмов распределённого консенсуса, таких как Paxos или Raft.</p>
<p>Таким образом, удобство классификаций и определений сильно зависит от того,
какие задачи необходимо решать. Как мы уже писали в статье
&ldquo;<a href="../../07/19/capitalization-of-internet.html">Почему слово Интернет пишется с прописной буквы?</a>&rdquo;,
мы не указываем вам, как и что говорить, лишь помогаем думать эффективнее и не
попадаться в ментальные ловушки, расставленные теми, кто на самом деле хочет вас
контролировать. Это непростая задача в столь быстро меняющеся мире, но благодаря
вашей поддержке и обратной связи мы сможем выполнять её более эффективно.</p>
"""
}
} }

View file

@ -1,26 +0,0 @@
package com.causa_arcana
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val articlesListRecyclerView: RecyclerView =
findViewById(R.id.activity_main__articles_list_rv)
articlesListRecyclerView.layoutManager = LinearLayoutManager(this)
articlesListRecyclerView.adapter = ArticlesListRecyclerViewAdapter {
onArticlesListItemClick()
}
}
private fun onArticlesListItemClick() {
val intent = Intent(this, ArticleActivity::class.java)
startActivity(intent)
}
}

View file

@ -5,8 +5,10 @@ import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
class MainFragment : Fragment() { class MainFragment(private val onArticlesListItemClick: () -> Unit) : Fragment() {
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
@ -14,4 +16,15 @@ class MainFragment : Fragment() {
): View? { ): View? {
return inflater.inflate(R.layout.fragment_main, container, false) return inflater.inflate(R.layout.fragment_main, container, false)
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val articlesListRecyclerView: RecyclerView =
view.findViewById(R.id.fragment_main__articles_list_rv)
articlesListRecyclerView.layoutManager = LinearLayoutManager(requireContext())
articlesListRecyclerView.adapter = ArticlesListRecyclerViewAdapter {
onArticlesListItemClick()
}
}
} }

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".AppActivity">
<FrameLayout
android:id="@+id/activity_main__frame"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ArticleActivity">
<WebView
android:id="@+id/articleWebView"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.336"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/activity_main__articles_list_rv"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:listitem="@layout/rvitem_article_card"/>
</androidx.constraintlayout.widget.ConstraintLayout>