forked from SPC/spc-site
Some fixes at masters
This commit is contained in:
parent
b92f880ce4
commit
ccc68b614f
@ -1,4 +1,5 @@
|
|||||||
import ru.mipt.npm.gradle.KScienceVersions
|
import ru.mipt.npm.gradle.KScienceVersions
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
id("ru.mipt.npm.gradle.project")
|
id("ru.mipt.npm.gradle.project")
|
||||||
@ -11,7 +12,7 @@ repositories {
|
|||||||
}
|
}
|
||||||
|
|
||||||
group = "ru.mipt.npm"
|
group = "ru.mipt.npm"
|
||||||
version = "0.0.1-SNAPSHOT"
|
version = "0.1.0-SNAPSHOT"
|
||||||
|
|
||||||
application {
|
application {
|
||||||
mainClass.set("io.ktor.server.netty.EngineMain")
|
mainClass.set("io.ktor.server.netty.EngineMain")
|
||||||
@ -54,4 +55,12 @@ sourceSets {
|
|||||||
main {
|
main {
|
||||||
resources.srcDir(project.rootDir.resolve("data"))
|
resources.srcDir(project.rootDir.resolve("data"))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//write build time in build to check outdated external data directory
|
||||||
|
tasks.getByName<Copy>("processResources") {
|
||||||
|
doFirst {
|
||||||
|
val deployDate = LocalDateTime.now()
|
||||||
|
project.buildDir.resolve("resources/main/buildDate").writeText(deployDate.toString())
|
||||||
|
}
|
||||||
}
|
}
|
@ -5,7 +5,7 @@ section_title: О программе
|
|||||||
language: ru
|
language: ru
|
||||||
---
|
---
|
||||||
|
|
||||||
Магистерская программа МФТИ **"Научное программное обеспечение"** (старое название: **"Разработка и применение программного обеспечения в физических исследованиях"**) создана при поддержке двух школ МФТИ: Физтех-школы физики и исследований им. Ландау ([ЛФИ](https://mipt.ru/education/departments/lpr/)) и Физтех-школы прикладной математики и информатики ([ФПМИ](https://mipt.ru/education/departments/fpmi/)) и ряда академических и промышленных партнеров. В ее основе лежит взаимодействие студента и [научного руководителя](#mentors).
|
Магистерская программа МФТИ **"Научное программное обеспечение"** (старое название: **"Разработка и применение программного обеспечения в физических исследованиях"**) создана при поддержке двух школ МФТИ: Физтех-школы физики и исследований им. Ландау ([ЛФИ](https://mipt.ru/education/departments/lpr/)), Физтех-школы прикладной математики и информатики ([ФПМИ](https://mipt.ru/education/departments/fpmi/)) а также ряда академических и промышленных партнеров. В ее основе лежит взаимодействие студента и [научного руководителя](#mentors).
|
||||||
|
|
||||||
Цель создания программы — объединение усилий ученых и программистов для разработки лучших компьютерных решений и применения этих решений в области фундаментальной и прикладной науки и инженерии.
|
Цель создания программы — объединение усилий ученых и программистов для разработки лучших компьютерных решений и применения этих решений в области фундаментальной и прикладной науки и инженерии.
|
||||||
|
|
||||||
@ -15,16 +15,22 @@ language: ru
|
|||||||
* нахождение оптимальной траектории для задач в георазведке;
|
* нахождение оптимальной траектории для задач в георазведке;
|
||||||
* разработка инструментов анализа данных для нефтяных компаний и количество прикладных учебных задач от реальных заказчиков постоянно растет.
|
* разработка инструментов анализа данных для нефтяных компаний и количество прикладных учебных задач от реальных заказчиков постоянно растет.
|
||||||
|
|
||||||
|
<hr/>
|
||||||
|
|
||||||
**Почему же** это направление так актуально?
|
**Почему же** это направление так актуально?
|
||||||
|
|
||||||
Существенная часть работы ученых так или иначе связана с компьютером. Компьютеры и программы используются на всех этапах экспериментального или теоретического исследования. Любой работе предшествует **компьютерное моделирование**, затем требуется **автоматизация сбора и хранения данных**, **анализ данных** и, наконец, **представление результатов**. На всех этих этапах нужны компьютеры и программное обеспечение. Качество программного обеспечения — ключевой фактор в исследованиях и разработках.
|
Существенная часть работы ученых так или иначе связана с компьютером. Компьютеры и программы используются на всех этапах экспериментального или теоретического исследования. Любой работе предшествует **компьютерное моделирование**, затем требуется **автоматизация сбора и хранения данных**, **анализ данных** и, наконец, **представление результатов**. На всех этих этапах нужны компьютеры и программное обеспечение. Качество программного обеспечения — ключевой фактор в исследованиях и разработках.
|
||||||
|
|
||||||
Современная разработка программного обеспечения — это отдельная инженерная дисциплина, требующая опыта и погружения в технологию и соответствующие профессиональные сообщества. Несмотря на то, что современное программирование зародилось в научных исследованиях, с тех пор прошло много времени, и ученые во многих областях в среднем уже не могут похвастаться хорошими знаниями в этой области. Качество программного обеспечения в естественных науках низкое. Те же проблемы свойственны инженерной индустрии.
|
Современная разработка программного обеспечения — это отдельная инженерная дисциплина, требующая опыта и погружения в технологию и соответствующие профессиональные сообщества. Несмотря на то, что современное программирование зародилось в научных исследованиях, с тех пор прошло много времени, и ученые во многих областях в среднем уже не могут похвастаться хорошими знаниями в этой области. Качество программного обеспечения в естественных науках низкое. Те же проблемы свойственны инженерной индустрии.
|
||||||
|
|
||||||
|
<hr/>
|
||||||
|
|
||||||
**Зачем** для этого нужны ученые?
|
**Зачем** для этого нужны ученые?
|
||||||
|
|
||||||
Прошлые попытки поручить разработку программного обеспечения профессиональным программистам не увенчались успехом. Чтобы сформулировать задачу программисту, надо знать современные компьютерные технологии и понимать, как их лучше применять.
|
Прошлые попытки поручить разработку программного обеспечения профессиональным программистам не увенчались успехом. Чтобы сформулировать задачу программисту, надо знать современные компьютерные технологии и понимать, как их лучше применять.
|
||||||
|
|
||||||
|
<hr/>
|
||||||
|
|
||||||
**Зачем** все это программистам?
|
**Зачем** все это программистам?
|
||||||
|
|
||||||
Задачи, возникающие на стыке физики и программирования, на порядок интереснее тех, что ожидают инженера-программиста в повседневной рабочей жизни. Также работа с учеными — это хороший повод опробовать все самые свежие и экспериментальные технологии. Кроме того, опыт в моделировании, обработке данных и работе с приборами является бесценным в IT-среде.
|
Задачи, возникающие на стыке физики и программирования, на порядок интереснее тех, что ожидают инженера-программиста в повседневной рабочей жизни. Также работа с учеными — это хороший повод опробовать все самые свежие и экспериментальные технологии. Кроме того, опыт в моделировании, обработке данных и работе с приборами является бесценным в IT-среде.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
content_type: magprog_mentor
|
content_type: magprog_mentor
|
||||||
name: Олийниченко Дмитрий Робертович
|
name: Дмитрий Робертович Олийниченко
|
||||||
id: Oliinychenko
|
id: Oliinychenko
|
||||||
photo: images/mentors/Oliinychenko.jpg
|
photo: images/mentors/Oliinychenko.jpg
|
||||||
language: ru
|
language: ru
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
content_type: magprog_mentor
|
content_type: magprog_mentor
|
||||||
name: Пантуев Владислав Сергеевич
|
name: Владислав Сергеевич Пантуев
|
||||||
id: Pantuev
|
id: Pantuev
|
||||||
photo: images/mentors/Pantuev.jpg
|
photo: images/mentors/Pantuev.jpg
|
||||||
language: ru
|
language: ru
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
content_type: magprog_mentor
|
content_type: magprog_mentor
|
||||||
name: Зиновьев Алексей Викторович
|
name: Алексей Викторович Зиновьев
|
||||||
id: Zinoviev
|
id: Zinoviev
|
||||||
photo: images/mentors/Zinoviev.jpg
|
photo: images/mentors/Zinoviev.jpg
|
||||||
language: ru
|
language: ru
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
content_type: magprog_mentor
|
content_type: magprog_mentor
|
||||||
name: Низовцева Ирина Геннадьевна
|
name: Ирина Геннадьевна Низовцева
|
||||||
id: Nizovtseva
|
id: Nizovtseva
|
||||||
photo: images/mentors/Nizovtseva.jpg
|
photo: images/mentors/Nizovtseva.jpg
|
||||||
language: ru
|
language: ru
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
content_type: magprog_mentor
|
content_type: magprog_mentor
|
||||||
name: Светличный Александр
|
name: Александр Светличный
|
||||||
id: Svetlichny
|
id: Svetlichny
|
||||||
photo: images/mentors/Svetlichny.jpg
|
photo: images/mentors/Svetlichny.jpg
|
||||||
language: ru
|
language: ru
|
||||||
|
@ -1,25 +1,28 @@
|
|||||||
title: Партнеры
|
title: Партнеры
|
||||||
content:
|
content:
|
||||||
- title: ЛФИ МФТИ
|
- title: ЛФИ МФТИ
|
||||||
link: https://mipt.ru/education/departments/lpr/
|
link: "https://mipt.ru/education/departments/lpr/"
|
||||||
logo: /images/partners/LPI.jpg
|
logo: /images/partners/LPI.jpg
|
||||||
- title: ФПМИ МФТИ
|
- title: ФПМИ МФТИ
|
||||||
link: https://mipt.ru/education/departments/fpmi/
|
link: "https://mipt.ru/education/departments/fpmi/"
|
||||||
logo: /images/partners/FPMI.jpg
|
logo: /images/partners/FPMI.jpg
|
||||||
|
- title: MIPT-NPM
|
||||||
|
link: "https://npm.mipt.ru/"
|
||||||
|
logo: /images/partners/npm-logo-no-text-white.png
|
||||||
- title: JetBrains Research (до 2022)
|
- title: JetBrains Research (до 2022)
|
||||||
link: https://research.jetbrains.org/groups/npm/
|
link: "https://research.jetbrains.org/groups/npm/"
|
||||||
logo: /images/partners/JBR.png
|
logo: /images/partners/JBR.png
|
||||||
- title: Таврида Электрик
|
- title: Таврида Электрик
|
||||||
link: https://www.tavrida.com/ter/
|
link: "https://www.tavrida.com/ter/"
|
||||||
logo: /images/partners/Tavrida.png
|
logo: /images/partners/Tavrida.png
|
||||||
- title: ИЯИ РАН
|
- title: ИЯИ РАН
|
||||||
link: https://www.inr.ru/
|
link: "https://www.inr.ru/"
|
||||||
logo: /images/partners/inr_logo.png
|
logo: /images/partners/inr_logo.png
|
||||||
- title: ИКИ РАН
|
- title: ИКИ РАН
|
||||||
link: http://www.iki.rssi.ru/
|
link: "http://www.iki.rssi.ru/"
|
||||||
logo: /images/partners/iki.jpg
|
logo: /images/partners/iki.jpg
|
||||||
- title: ОИЯИ
|
- title: ОИЯИ
|
||||||
link: https://bmn.jinr.ru/
|
link: "https://bmn.jinr.ru/"
|
||||||
logo: /images/partners/jinr.png
|
logo: /images/partners/jinr.png
|
||||||
# - title: ВШЭ
|
# - title: ВШЭ
|
||||||
# link: https://www.hse.ru/en/
|
# link: https://www.hse.ru/en/
|
||||||
@ -28,8 +31,8 @@ content:
|
|||||||
# link: https://www.desy.de/research/cooperations__institutes/hzg/index_eng.html
|
# link: https://www.desy.de/research/cooperations__institutes/hzg/index_eng.html
|
||||||
# logo: /images/partners/desy.svg
|
# logo: /images/partners/desy.svg
|
||||||
- title: Тинькофф
|
- title: Тинькофф
|
||||||
link: https://fintech.tinkoff.ru/
|
link: "https://fintech.tinkoff.ru/"
|
||||||
logo: /images/partners/tink.jpg
|
logo: /images/partners/tink.jpg
|
||||||
- title: ФИЦ Биотехнологии РАН
|
- title: ФИЦ Биотехнологии РАН
|
||||||
link: https://www.fbras.ru/
|
link: "https://www.fbras.ru/"
|
||||||
logo: /images/partners/biotech.png
|
logo: /images/partners/biotech.png
|
||||||
|
@ -6,4 +6,4 @@ order: 4
|
|||||||
photo: images/team/Aivazov.jpg
|
photo: images/team/Aivazov.jpg
|
||||||
language: ru
|
language: ru
|
||||||
---
|
---
|
||||||
**Консультант от ФПМИ**
|
Консультант от ФПМИ
|
||||||
|
@ -7,4 +7,4 @@ photo: images/team/muhina.jpg
|
|||||||
language: ru
|
language: ru
|
||||||
---
|
---
|
||||||
|
|
||||||
Менеджер образовательных проектов.
|
Менеджер образовательных проектов
|
@ -8,8 +8,4 @@ language: ru
|
|||||||
---
|
---
|
||||||
**Руководитель программы**
|
**Руководитель программы**
|
||||||
|
|
||||||
Заместитель заведующего ЛМЯФЭ МФТИ.
|
Директор центра научного программирования
|
||||||
|
|
||||||
Руководитель направления в JetBrains Research.
|
|
||||||
|
|
||||||
Преподаватель общей физики, статистических методов и программирования на Kotlin в МФТИ.
|
|
@ -9,6 +9,3 @@ language: ru
|
|||||||
|
|
||||||
**Заместитель руководителя**
|
**Заместитель руководителя**
|
||||||
|
|
||||||
Преподаватель кафедры общей физики МФТИ.
|
|
||||||
|
|
||||||
Аспирант ИЯИ РАН.
|
|
||||||
|
BIN
data/magprog/images/partners/npm-logo-no-text-white.png
Normal file
BIN
data/magprog/images/partners/npm-logo-no-text-white.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.6 KiB |
@ -11,10 +11,8 @@ import java.net.URI
|
|||||||
import java.nio.file.FileSystems
|
import java.nio.file.FileSystems
|
||||||
import java.nio.file.Files
|
import java.nio.file.Files
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
import kotlin.io.path.createDirectories
|
import java.time.LocalDateTime
|
||||||
import kotlin.io.path.div
|
import kotlin.io.path.*
|
||||||
import kotlin.io.path.isRegularFile
|
|
||||||
import kotlin.io.path.relativeTo
|
|
||||||
|
|
||||||
fun CommonAttributeGroupFacade.css(block: CssBuilder.() -> Unit) {
|
fun CommonAttributeGroupFacade.css(block: CssBuilder.() -> Unit) {
|
||||||
style = CssBuilder().block().toString()
|
style = CssBuilder().block().toString()
|
||||||
@ -42,6 +40,9 @@ private fun Application.resolveData(uri: URI, targetPath: Path): Path {
|
|||||||
return targetPath
|
return targetPath
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const val DEPLOY_DATE_FILE = "deployDate"
|
||||||
|
const val BUILD_DATE_FILE = "buildDate"
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
fun Application.spcModule() {
|
fun Application.spcModule() {
|
||||||
val context = Context("spc-site") {
|
val context = Context("spc-site") {
|
||||||
@ -50,6 +51,20 @@ fun Application.spcModule() {
|
|||||||
|
|
||||||
val dataPath = Path.of("data")
|
val dataPath = Path.of("data")
|
||||||
|
|
||||||
|
// Clear data directory if it is outdated
|
||||||
|
val deployDate = dataPath.resolve(DEPLOY_DATE_FILE).takeIf { it.exists() }
|
||||||
|
?.readText()?.let { LocalDateTime.parse(it) }
|
||||||
|
val buildDate = javaClass.getResource(BUILD_DATE_FILE)?.readText()?.let { LocalDateTime.parse(it) }
|
||||||
|
|
||||||
|
if (deployDate != null && buildDate != null && buildDate.isAfter(deployDate)) {
|
||||||
|
log.info("Outdated data. Resetting data directory.")
|
||||||
|
dataPath.deleteIfExists()
|
||||||
|
|
||||||
|
//Writing deploy date file
|
||||||
|
dataPath.createDirectories()
|
||||||
|
dataPath.resolve(DEPLOY_DATE_FILE).writeText(LocalDateTime.now().toString())
|
||||||
|
}
|
||||||
|
|
||||||
val homeDataPath = resolveData(
|
val homeDataPath = resolveData(
|
||||||
javaClass.getResource("/home")!!.toURI(),
|
javaClass.getResource("/home")!!.toURI(),
|
||||||
dataPath / "home"
|
dataPath / "home"
|
||||||
|
@ -128,34 +128,55 @@ context(PageContext) private fun FlowContent.team() {
|
|||||||
val team = findByType("magprog_team").map { Person(it.value) }.sortedBy { it.order }
|
val team = findByType("magprog_team").map { Person(it.value) }.sortedBy { it.order }
|
||||||
|
|
||||||
div("inner") {
|
div("inner") {
|
||||||
h2 {
|
h2 { +"Команда" }
|
||||||
+"Команда"
|
div("features") {
|
||||||
}
|
team.forEach { member ->
|
||||||
}
|
section {
|
||||||
team.forEach { member ->
|
a {
|
||||||
section {
|
val imagePath = member.photo?.let { resolveRef(it) }
|
||||||
id = member.id
|
img(
|
||||||
a(classes = "image", href = resolveRef("mentor-${member.id}")) {
|
classes = "icon major",
|
||||||
member.photo?.let { photoPath ->
|
src = imagePath,
|
||||||
img(
|
alt = imagePath
|
||||||
src = resolveRef(photoPath),
|
) {
|
||||||
alt = member.name
|
h3 { +member.name }
|
||||||
) {
|
htmlData(member.data)
|
||||||
attributes["data-position"] = "center center"
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
div("content") {
|
// div("inner") {
|
||||||
div("inner") {
|
// h2 {
|
||||||
h3 {
|
// +"Команда"
|
||||||
a(href = "#team_${member.id}") { +member.name }
|
// }
|
||||||
}
|
// }
|
||||||
htmlData(member)
|
// team.forEach { member ->
|
||||||
}
|
// section {
|
||||||
}
|
// id = member.id
|
||||||
}
|
// a(classes = "image") {
|
||||||
}
|
// member.photo?.let { photoPath ->
|
||||||
|
// img(
|
||||||
|
// src = resolveRef(photoPath),
|
||||||
|
// alt = member.name
|
||||||
|
// ) {
|
||||||
|
// attributes["data-position"] = "center center"
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// div("content") {
|
||||||
|
// div("inner") {
|
||||||
|
// h3 {
|
||||||
|
// a(href = "#team_${member.id}") { +member.name }
|
||||||
|
// }
|
||||||
|
// htmlData(member)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
context(PageContext) private fun FlowContent.mentors() {
|
context(PageContext) private fun FlowContent.mentors() {
|
||||||
@ -195,6 +216,10 @@ context(PageContext) private fun FlowContent.mentors() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context(PageContext) internal fun FlowContent.contacts() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
context(PageContext) internal fun HTML.magProgHead(title: String) {
|
context(PageContext) internal fun HTML.magProgHead(title: String) {
|
||||||
head {
|
head {
|
||||||
@ -273,7 +298,7 @@ internal fun Application.spcMaster(context: Context, dataPath: Path, prefix: Str
|
|||||||
routing {
|
routing {
|
||||||
route(prefix) {
|
route(prefix) {
|
||||||
with(magProgPageContext) {
|
with(magProgPageContext) {
|
||||||
static{
|
static {
|
||||||
files(dataPath.resolve("assets").toFile())
|
files(dataPath.resolve("assets").toFile())
|
||||||
|
|
||||||
static("images") {
|
static("images") {
|
||||||
@ -309,14 +334,10 @@ internal fun Application.spcMaster(context: Context, dataPath: Path, prefix: Str
|
|||||||
programSection()
|
programSection()
|
||||||
},
|
},
|
||||||
wrapSection(resolveHtml(ENROLL_PATH)!!, "enroll"),
|
wrapSection(resolveHtml(ENROLL_PATH)!!, "enroll"),
|
||||||
MagProgSection(
|
wrapSection(id = "contacts", title = "Контакты") {
|
||||||
id = "team",
|
htmlData(resolveHtml(CONTACTS_PATH)!!)
|
||||||
title = "Команда",
|
|
||||||
style = "wrapper style2 spotlights",
|
|
||||||
) {
|
|
||||||
team()
|
team()
|
||||||
},
|
}
|
||||||
wrapSection(resolveHtml(CONTACTS_PATH)!!, "contacts"),
|
|
||||||
)
|
)
|
||||||
magProgHead("Магистратура \"Научное программирование\"")
|
magProgHead("Магистратура \"Научное программирование\"")
|
||||||
body("is-preload magprog-body") {
|
body("is-preload magprog-body") {
|
||||||
@ -367,13 +388,13 @@ internal fun Application.spcMaster(context: Context, dataPath: Path, prefix: Str
|
|||||||
href = "$homeRef#mentors"
|
href = "$homeRef#mentors"
|
||||||
+"Научные руководители"
|
+"Научные руководители"
|
||||||
}
|
}
|
||||||
nav() {
|
nav{
|
||||||
ul {
|
ul {
|
||||||
mentors.forEach {
|
mentors.forEach {
|
||||||
li {
|
li {
|
||||||
a {
|
a {
|
||||||
href = resolveRef(it.mentorPageId)
|
href = resolveRef(it.mentorPageId)
|
||||||
+it.name
|
+it.name.substringAfterLast(" ")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -68,24 +68,6 @@ class SnarkPlugin : AbstractPlugin() {
|
|||||||
context.gather(SnarkParser.TYPE, true)
|
context.gather(SnarkParser.TYPE, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// val parseAction: Action<ByteArray, Any> = Action.map {
|
|
||||||
// val parser: SnarkParser<*>? = parsers.values.filter { parser ->
|
|
||||||
// parser.contentType.toString() == meta["contentType"].string ||
|
|
||||||
// meta[META_FILE_EXTENSION_KEY].string in parser.fileExtensions
|
|
||||||
// }.maxByOrNull {
|
|
||||||
// it.priority
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// //ensure that final type is correct
|
|
||||||
// if (parser == null) {
|
|
||||||
// logger.warn { "The parser is not found for data with meta $meta" }
|
|
||||||
// result { it }
|
|
||||||
// } else {
|
|
||||||
// result(parser.resultType) { bytes ->
|
|
||||||
// parser.parse(bytes, meta)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
fun readDirectory(path: Path): DataTree<Any> = io.readDataDirectory(path) { dataPath, meta ->
|
fun readDirectory(path: Path): DataTree<Any> = io.readDataDirectory(path) { dataPath, meta ->
|
||||||
val fileExtension = meta[FileData.META_FILE_EXTENSION_KEY].string ?: dataPath.extension
|
val fileExtension = meta[FileData.META_FILE_EXTENSION_KEY].string ?: dataPath.extension
|
||||||
|
Loading…
Reference in New Issue
Block a user