RAntiquity
1.09K subscribers
296 photos
11 videos
5 files
546 links
Об античности на языке R и не только

@locusclassicus
Download Telegram
Газетир (географический справочник) для любителей античности: https://pleiades.stoa.org/

Если не уверены, где находится тот самый Пританей, в котором собирался обедать Сократ. Координаты, карта, связанные названия. #карты
11🔥5
✔️ Вы уже соскучились по профессору Томпкинсу? Вот вам еще одна #задачка.

🌀Известно, что Фукидид дает словесную характеристику своим героям. Алкивиад, например, очень любит паратаксис и часто начинает свои предложения с καί:

’Καὶ ταῦτα ἡ ἐμὴ νεότης καὶ ἄνοια παρὰ φύσιν δοκοῦσα εἶναι ἐς τὴν Πελοποννησίων δύναμιν λόγοις τε πρέπουσιν ὡμίλησε καὶ ὀργῇ πίστιν παρασχομένη ἔπεισεν. καὶ νῦν μὴ πεφόβησθε αὐτήν, ἀλλ' ἕως ἐγώ τε ἔτι ἀκμάζω μετ' αὐτῆς καὶ ὁ Νικίας εὐτυχὴς δοκεῖ εἶναι, ἀποχρήσασθε τῇ ἑκατέρου ἡμῶν ὠφελίᾳ. καὶ τὸν ἐς τὴν Σικελίαν πλοῦν μὴ μεταγιγνώσκετε ὡς ἐπὶ μεγάλην δύναμιν ἐσόμενον (6.17).

Снова сравним Алкивиада и Никия. У первого 28 предложений из 82 начинаются с καί, у второго — 14 из 73. Мы уже выяснили, как сравниваются пропорции, поэтому считаем быстро, не заглядывая под капот:


prop.test(x = c(28, 14), n = c(82, 73), conf.level = 0.95, correct = F, alternative = "two.sided")


✔️P-value = 0.036, результат значим, разница пропорций составляет от 0.054 до 0.31 с уверенностью 95%. Пока ничего нового: Алкивиад паратоксик, то есть, простите, -таксик. Новое начинается дальше, когда другой профессор, не выговорим его имя, сравнивает фукидидовских Никия и Алкивиада с платоновскими.

⭐️В речи Алкивиада в «Пире» 21 предложение из 136 начинаются с καί: больше, чем у кого-либо еще в диалоге. В репликах Никия в «Лахете» καί в начале предложения, напротив, очень редок: 3 из 45. Чтобы минимизировать влияние диалогического жанра, профессор С. учитывает только реплики из >2 предложений. Кстати, оба профессора считают предложением то, что оканчивается на точку, колон или знак вопроса.

📖В статье этого нет, а мы посчитали: разница между платоновскими Алкивиадом и Никием не является значимой (p-value = 0.1325). Не хватает данных, неоткуда взять.


prop.test(x = c(21, 3), n = c(136, 45), conf.level = 0.95, correct = F, alternative = "two.sided")


🌀А если сравнить Алкивиада у Платона и Фукидида?


prop.test(x = c(21, 28), n = c(136, 82), conf.level = 0.95, correct = F, alternative = "two.sided")


✔️Интересный результат: платоновский «икает» значимо меньше, чем фукидидовский, хотя и больше других персонажей. Хотя оба автора, Платон и Фукидид, очевидно вопроизводят какую-то узнаваемую черту исторического Алкивиада, делают это статистически по-разному. Это касается и двух Никиев, и снова у платоновского значимо меньше «и» в начале предложения, хотя другие черты его стиля он воспроизводит (но об этом не сейчас).

⭐️Ситуации, когда у нас недостаточная большая выборка, чтобы отвергнуть нулевую гипотезу, не редкость в антиковедении, особенно при работе с фрагментами и отрывками. Как с этим быть, подумаем в другой раз.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥101
В 2014 г. группа DH-сколаров создала карту по мотивам знаменитого «каталога кораблей» из второй песни «Илиады». Читать список кораблей с такой визуализацией можно дальше, чем до половины, что уже хорошо, но карта дала и неожиданный бонус. В «беотийской» группе Гомер почему-то пропускает главный город Беотии, Фивы. Геопространственная модель позволила заметить, что все другие беотийские названия словно описывают круг вокруг Фив:

The Boiotian towns define a rough circuit around a central point, namely, the unmentioned city of Thebes in the center of the region; it is as if Homer were standing in in the middle and pointing out toward the other towns like spokes on a wheel.

Подобное «озирание вокруг» свойственно и для другого эпизода, известного как «тейхоскопия», то есть смотр со стены. Такие описания встречаются и в других эпических поэмах, и авторы заключают, что Гомер заимствовал беотийский список из беотийской же устной традиции, в которой герой вполне мог оглядываться вокруг с фиванской стены. Поэтому в списке и нет Фив. #карты
❤‍🔥146🤔3
Еще немного античной географии. В 2010 г. группа британских исследователей презентовала проект под названием HESTIA (Herodotus Encoded Space-Text-Imaging Archive). Выловив в тексте Геродота все географические названия, они создали пространственную базу данных PostgreSQL, которую затем визулизировали в виде карты.

Среди прочего, исследователи построили и изобразили сеть географических названий, используя в качестве основы их совместную встречаемость в тексте. Оказалось, что в центре таким образом смоделированного мира находится вовсе не Греция, а Египет:

…the territory that has the strongest connections in this basic network culture is Egypt. While surprising, it does make sense on reflection, since for a better part of one book Herodotus uses Egypt as the touchstone against which other cultures, including Persia and his own, Greece, are compared. It is as a tool of comparison, then, that Egypt appears to be the centre of Herodotus’ network picture of the Mediterranean


Объясняется это тем, что Египет у Геродота — универсальное сравнение, пробирный камень для всех историко-культурных обобщений.
👏76🔥3
Снова география. Павсаний, Страбон и даже Плиний Старший тоже нанесены на карту при помощи онлайн-инструмента под названием Recogito. Разработкой и тегированием занимался тот же Элтон Баркер, который соорудил карту Геродота.

Recogito — это бесплатный, очень простой, но достаточно удобный онлайн-инструмент, в 2018 получивший приз как лучший DH-tool в Digital Humanities Awards 2018. Он позволяет работать в командах над аннотированием текстов.

Размеченные таким образом именованные сущности можно затем экспортировать в ГИС.

💡Загружаете свой текст (на любом языке) и можете — например, по мере чтения его со студентами — добавлять какую-нибудь разметку. Вот вам идея для цифровой проектной работы, которая не требует кодинга.

💡Кстати, csv или json с координатами локаций у Павсания, Страбона и Плиния вполне можно скачать и использовать в учебных целях. На картинке Страбон для привлечения внимания. #карты
Please open Telegram to view this post
VIEW IN TELEGRAM
13🔥2
❗️ Новая #задачка сегодня из рецензии Пауля Кейзера на книгу Леонарда Брэндвуда The Chronology of Plato's Dialogues (1990).

Несколько лет назад, когда я впервые прочитала эту рецензию, я почти ничего не поняла, кроме того, что Б. совершает какие-то страшные статистические грехи. Пришло время разобраться, какие именно.


Dittenberger then examined Plato’s use of comparative particles (ὥσπερ and καθάπερ), but the results are fuzzy at best (pp. 19-20). B. tries (p. 19) to make them more precise by noting a decreasing rate, counted as uses per page, from Euthd., Meno, Gorg., Crat., Phdo., Symp., Lysis (0.80) to Phdr., Rep., Theaet. (0.61), and thence to Parm., Phil., Soph., Pol., Tim., Crit., and Laws (0.40). In … comparing the three numbers [B.] claims a clear trend but he fails to determine whether it is in fact statistically significant. Briefly the uncertainty σ for each ratio would be respectively 0.80 ± 0.15, 0.61 ± 0.08, and 0.40 + 0.07, and the level of significance of the pairwise differences would be z = 1.1 (73 % ) and z = 2.0 (95 %).


Простыми словами: Б. считает, что в ранней, средней и поздней группе сравнительные наречия встречаются с убывающей частотностью (в пересчете на страницу текста): соответственно 0.80 (7 диалогов), 0.61 (3 диалога) и 0.40 (7 диалогов). Как он пишет,

Clearly there can be no doubt of the direction of the trend.


Однако сомнения есть. Кейзер считает не только среднее, но и стандартное отклонение для каждой группы: 0.15, 0.08, 0.07 соответственно. Это дает ему возможность попарно сравнить, есть ли значимая разница в средних (формула).

z1 <- (0.8 - 0.61) / sqrt( 0.15^2 + 0.08^2) # 1.1
z2 <- (0.61 - 0.4) / sqrt( 0.08^2 + 0.07^2) # 1.97

Ура, мы получаем те же значения, что и Кейзер. От них можно перейти к вероятности:

pnorm(abs(z1), lower.tail = F) * 2 # 27%
pnorm(abs(z2), lower.tail = F) * 2 # 5%

Таким образом с вероятностью 27% для групп 1 и 2 и с вероятностью 5% для групп 2 и 3 выборочные средние происходят из одной популяции. Кейзер говорит о 73% и 95% (т.е. 1 – p) уверенности, чего, с его точки зрения, недостаточно:

That is, those are the probabilities that the difference is significant—and most statisticians would consider anything less than 95% (I and most physicists prefer 99%) as insignificant. B. calculates (pp. 21-2) various ratios, which suffer from the same defect.


Очень непросто иногда читать рецензии.
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥1
Друзья, в первую очередь студенты и аспиранты, если у кого-то есть охота поговорить со мной о философии и цифровизации, можно до 17 марта подать заявку здесь. Если там будет мноооого и философии чуть-чуть цифровизации, то ок (и наоборот тоже ок). Просто хороший повод собраться и поговорить.
4💘3🔥1
Виртуальный визит в Помпеи: как архитектура управляет нашим вниманием

Можно ли проанализировать взаимодействие человека и архитектурной среды? И причём тут ГИС и айтрекинг? Рассказываем, как люди ходят в гости к древним римлянам в VR-очках, чтобы лучше понять культуру и повседневную жизнь античного города.   

Кратко: о чем
статья?

Исследователи из Швеции предложили новый подход к проблеме визуального воздействия среды на человека. Их метод основан на совмещении географических информационных систем (ГИС, об их использовании историками мы уже рассказывали) и айтрекинга. Они уверены: то, как современный зритель смотрит на древнюю среду, поможет лучше понять культуру и повседневную жизнь древнего города Помпеи.

Участники проекта гуляли по трёхмерной модели помпейского дома в VR-очках. Полученные данные переносились в ГИС, благодаря чему стало ясно, как распределялось зрительное внимание. Например, его точно привлекали скульптурные изображения предков или божеств. А эротические фрески располагались таким образом, чтобы большую часть дня оставаться в тени — эффект визуального воздействия мог зависеть и от положения солнца в то или иное время суток.

Эти данные открывают новые возможности для анализа взаимодействия человека с архитектурной средой и выявляют истинную роль того или иного элемента в общем ансамбле здания — кому и когда он был доступен для обозрения, на какое время выставлялся на показ и когда был спрятан от посторонних глаз.

Подробнее об исследовании и о том, что и откуда можно было увидеть в воссозданном доме — в полной версии статьи.

Время чтения: 8 минут.

🤖 «Системный Блокъ» @sysblok
Please open Telegram to view this post
VIEW IN TELEGRAM
8
RAntiquity
❗️ Новая #задачка сегодня из рецензии Пауля Кейзера на книгу Леонарда Брэндвуда The Chronology of Plato's Dialogues (1990). Несколько лет назад, когда я впервые прочитала эту рецензию, я почти ничего не поняла, кроме того, что Б. совершает какие-то страшные…
Когда что-то говоришь вслух, особенно публично, всегда есть риск сказать глупость. И когда в комментариях к этому посту @aGricolaMZ указал мне на то, что результат Кейзера воспроизводится, только если забыть об объеме выборки, было неловко. С другой стороны, как мы знаем от Сократа, кто молчит, чтобы сойти за умного, тот остается один на один со своим невежеством. Если бы не этот пост, я бы не получила письма от самого Пауля Кейзера, в котором он подтверждает наблюдения ученейшего коллеги и тем самым дает мне урок быть внимательнее в задачках — а когда это невозможно, уметь признавать свою неправоту. Уважаю.
15💯6👏4👍2
🗳 Коллеги уже написали про ежегодную выставку достижений цифрового гуманитарного хозяйства, Digital Humanities Awards 2023.

А мы добавим, что в этом году в шортлисте несколькими именами представлена магистратура "Цифровые методы в гуманитарных науках" НИУ ВШЭ и даже, силы небесные, автор этого канала.

По ссылке можно нас (или кого-то еще) поддержать, чтобы мы и дальше вдохновенно радовали вас чем-нибудь таким эдаким.

В общем, вот наши номинации:

⭐️ BEST DH DATASET
Борис Орехов (руководитель программы), Russian-European literary relations of the 18th century – https://dataverse.pushdom.ru/dataset.xhtml?persistentId=doi:10.31860/openlit-2023.4-B003

⭐️ BEST DH TOOL OR SUITE OF TOOLS
Диана Есаян (выпускница программы), Direct Speech Extractor – https://github.com/diana-esaian/direct-speech-extractor-ru

⭐️ BEST DH TRAINING MATERIALS
Ольга Алиева (преподаватель программы), Computer text analysis with R – https://locusclassicus.github.io/text_analysis_2023/

⭐️ BEST DH SHORT PUBLICATION
Борис Орехов
, Identifying the style by a qualified reader on a short fragment of generated poetry – https://arxiv.org/abs/2306.02771

⭐️ BEST USE OF DH FOR FUN
Борис Орехов, Calendarium Romanum – https://vk.com/calendariumromanum

ℹ️ Не забудьте поделиться информацией с друзьями: голосовать могут все, вне зависимости от академического статуса и отношения к DH.

⌛️ Голосование продлится до 30 марта 2024 г. Голосовать можно в нескольких номинациях.

❗️Голосовать можно только один раз, но зато сами организаторы призывают делиться информацией с друзьями и коллегами, потому что одна из идей конкурса -- популяризация DH.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥6🔥4🍾3
Это мартовское утро я провожу, пытаясь добыть текст речи Лисия “Против Эратосфена” из #xml.

В Perseus нужный мне текст хранится под тегом <p> (параграф), но внутри каждого параграфа есть еще сноски по изданию Loeb, которые мне не нужны. Обычно там лежат разночтения. Например, вот такие:


<note resp="Loeb" anchored="true" xml:lang="lat"><foreign xml:lang="grc">δʼ</foreign> add. Scaliger</note>


Если так и оставить, то слова δʼ add. Scaliger тоже извлекутся, а мне они не нужны. Вот так это работает:


library(xml2)
test_xml <- '<top> нужный текст <div type="textpart"> <p> нужный текст <note> ненужный текст </note> нужный текст <note> ненужный текст </note> нужный текст</p></div></top>'

doc <- read_xml(test_xml) xml_text(doc)


Чинится просто:


remove_me <- xml_find_all(doc, "//note")
xml_remove(remove_me) xml_text(doc)


Можно перезаписать файл:


write_xml(doc, file = "new.xml")
9
Простой и универсальный способ создать филогенетическое дерево — использовать формат Ньюика, т.е. просто-напросто комбинацию скобок и запятых.


library(ape)
tr <- read.tree(text ="(Rest,(R,(Greek,Latin)));")

par(mfrow = c(2,2), mar = c(1,2,2,2), family = "Arial Narrow")
plot.phylo(tr, type = "unrooted", main = "unrooted")
plot.phylo(tr, type = "cladogram", main = "cladogram")
plot.phylo(tr, type = "phylogram", main = "phylogram")
plot.phylo(tr, type = "fan", main = "fan")


Вот такое, например, нехитрое у меня сегодня дерево активностей выходного дня.

#филогенетика
10
🌳 Придется вам потерпеть еще несколько постов про #филогенетика, пока я разбираюсь в теме. Этот пост о силе консенсуса, но совсем не того, о котором сегодня можно было бы подумать.

Допустим, у нас есть три дерева. Таких, как на картинке 1. Вот код для воспроизведения:

library(ape)
tr1 <- ape::read.tree(text = "((1,2),(3,4));")
tr2 <- ape::read.tree(text = "((1,3),(2,4));")
tr3 <- ape::read.tree(text = "((1,2),(3,4));")


par(mfrow = c(1, 3), mar = c(5,1,5,1), cex = 1)
plot.phylo(tr1, tip.color = 2 )
plot.phylo(tr2, tip.color = 2 )
plot.phylo(tr3, tip.color = 2 )

Кластеры 1-2, 3-4 встречаются в двух деревьях, остальные лишь в одном. Задача — найти наиболее устойчивые кластеры методом простого большинства. Это можно сделать при помощи консенсусных деревьев.

Сначала считаем консенсус, аргумент p указывает, что кластер должен быть представлен не менее, чем в половине деревьев. Также уточняем, что наши деревья укоренены:

cons <- consensus(list(tr1, tr2, tr3), p = 0.5, rooted = TRUE)

Консенсус тоже можно изобразить; дополнительно для узлов укажем силу консенсуса (2/3 = 0.67):

par(mfrow = c(1,1), mar = c(5,5,5,5))
plot.phylo(cons, tip.color = 2)
nodelabels(round(cons$node.label[3],2), 7, frame = "c", cex = 0.7)
nodelabels(round(cons$node.label[2],2), 6, bg = "yellow")

Это очень простое консенсусное дерево, построенное по методу простого большинства, которое позволяет «обобщить» несколько разных деревьев. Полезно не только эволюционным биологам, но и тем, кто работает с текстами. Чуть позже расскажу, как.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍94
Forwarded from aGricolaMZ
https://vectors2024.tilda.ws/digitalpast

тезисы до завтра а сама конференция 18 по 21 апреля
5
RAntiquity
🌳 Придется вам потерпеть еще несколько постов про #филогенетика, пока я разбираюсь в теме. Этот пост о силе консенсуса, но совсем не того, о котором сегодня можно было бы подумать. Допустим, у нас есть три дерева. Таких, как на картинке 1. Вот код для воспроизведения:…
🌳У консенсусных деревьев есть один очевидный недостаток. Допустим, у нас есть три неукорененных дерева, как на рис. 1.

library(ape)
tr1 <- ape::read.tree(text = "((1,2),(3,4));")
tr2 <- ape::read.tree(text = "((1,3),(2,4));")
tr3 <- ape::read.tree(text = "((1,4),(2,3));")

par(mfrow = c(1, 3), mar = c(5,0,5,0), cex = 1)
plot.phylo(tr1, tip.color = 2, type= "unrooted" )
plot.phylo(tr2, tip.color = 2, type= "unrooted" )
plot.phylo(tr3, tip.color = 2, type= "unrooted" )

Консенсусное дерево в таком случае никак не поможет: оно не допускает значений p < 0.5. Проверьте сами: код ниже вернет садовые вилы 🔱

par(mfrow = c(1,1))
cons.tr <- consensus(list(tr1, tr2, tr3), p = 0.5, rooted = F)
plot.phylo(cons)

В таких случаях на помощь приходит консенсусная сеть, строится с использованием пакета phangorn. На входе отдаем объект класса multiPhylo, это по сути просто три дерева в одном букете.

library(phangorn)
library(TreeTools)
mph <- as.multiPhylo(list(tr1, tr2, tr3))

cons.nw <- consensusNet(mph, prob = 0.3, rooted = F)

Объект cons.nw относится к классу networx. Его можно изобразить как в двух, так и в трех измерениях. Вот так (рис. 2):

plot(cons.nw, type = "2D")

Но вообще говоря самое веселое — это сеть в 3D. #филогенетика

library(rgl) 
movie3d(spin3d(axis=c(0,1,0), rpm=3), duration=10, dir = ".", type = "gif", webshot = F)
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Земля в иллюминаторе… 👩‍🚀
9👌2👍1🥰1
Forwarded from Vox mediaevistae
В следующую среду в 16.30 по московскому времени (20.30 по Красноярску) состоится заседание семинара «Цифровая среда», на котором я расскажу про автоматическую транскрипцию рукописей. Это будет обзорное выступление, на котором я обрисую историю распознавания печатного и рукописного текста, опишу пайплайн распознавания рукописи (способы добычи изображения; его сегментация на зоны (на примере kraken и YOLO рассмотрим два подхода: семантическую сегментацию и обнаружение объектов); сегментация на строки (здесь тоже поговорим про несколько подходов: paths, baselines, bounding boxes); сама транскрипция) и скажу несколько слов про то, как «улучшить» полученную транскрипцию (в частности, про свежие эксперименты с трансформерами).
Дискутантом выступит Глеб Шмидт, который великолепно разбирается и в тематическом моделировании, и в факторном анализе, и в стилометрии, и в HTR.
Чтобы послушать и присоединиться к дискуссии, нужно зарегистрироваться здесь.
🔥11👍41
🌳 Снова #филогенетика. Зачем строить несколько деревьев?

Дело в том, что результат кластеризации зависит от нескольких параметров:
📌 число предикторов (например, наиболее частотных слов для разных произведений);
📌 расстояние, которое используется для попарных сравнений (евклидово, городских кварталов, др.)
📌 метод связи при иерархической кластеризации (метод полной связи, метод средней связи, метод Уорда и др.);

Иногда добавление или удаление буквально одного слова меняет структуру дерева. Поэтому бывает необходимо сравнить разные деревья. Выше мы уже видели один способ это сделать — консенсусное дерево. Но оно дает уже результат обобщения, а иногда интересно посмотреть на исходные деревья, сопоставить их попарно.

Для этого удобно построить tanglegram, в R это проще всего сделать при помощи пакета dendextend.


library(stylo)
library(dendextend)

data("galbraith")
data <- as.data.frame.matrix(galbraith)[c(1,2, 9, 10, 16, 17),c(1:30)]
distmx <- dist(scale(data))

d1 <- as.dendrogram(hclust(distmx, method ="average")) %>% set("labels_col", value = c("skyblue", "orange", "grey40"), k=3) %>% set("branches_k_color", value = c("skyblue", "orange", "grey40"), k = 3)

d2 <- as.dendrogram(hclust(distmx, method ="ward.D2")) %>% set("labels_col", value = c("skyblue", "orange", "grey40"), k=3) %>% set("branches_k_color", value = c("skyblue", "orange", "grey40"), k = 3)

dlist <- dendlist(d1, d2)

par(family = "Arial Bold")
tanglegram(dlist, common_subtrees_color_lines = FALSE, highlight_distinct_edges = TRUE, highlight_branches_lwd=FALSE, margin_inner=10, lwd=2, axes=FALSE, main_left = "Cредняя", main_right = "Уорд", lab.cex = 1.3)


На картинке видно, что одно из сочинений Дж. Роулинг попадает в разные кластеры в зависимости от метода связи, хотя для кластеризации использовалась одна и та же матрица расстояний.
Please open Telegram to view this post
VIEW IN TELEGRAM
😱6👍4
🌳 Консенсусное дерево легко построить в пакете Stylo, в том числе используя GUI (графический интерфейс).

Нажимать на кнопки легко и приятно, но есть нюансы. Во-первых, не получится кастомизировать внешний вид дерева, а, во-вторых, в Stylo реализована достаточно специфическая процедура бутстрепа (повторных выборок).

Вот что пишут разработчики:

Under the FEATURES tab, users can define the minutes of the MFW division and sampling procedure, using the increment, the minimum and maximum parameters. For minimum = 100, maximum = 3000, and increment = 50, stylo will run subsequent analyses for the following frequency bands: 100 MFW, 50–150 MFW, 100–200 MFW, ..., 2900–2950 MFW, 2950–3000 MFW.



Для консенсуса нужно много деревьев, и Stylo будет строить эти деревья в заданном интервале. Это значит, что последние деревья будут построены уже не на основе самой частотной лексики, т.е. скорее всего на них отразится тематика текстов, входящих в корпус.

В некоторых случаях это работает неплохо. Например, для моего тренировочного греческого корпуса хватило 100-500 mfw, и почти все авторы (кроме Аристида) благополучно разошлись по своим домикам на дереве 🏡 (см. рисунок).

Но, возможно, вам понадобятся другие идеи для консенсуса. Разные расстояния. Разные методы кластеризации. Случайные выборки из первых двух сотен слов или еще что-то. Тогда придется самим строить сразу множество деревьев. Как это сделать грамотно, расскажем в следующих выпусках нашего кулинарного цифрового шоу. #филогенетика
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍1