1
0
forked from SPC/spc-site

Some fixes at masters

This commit is contained in:
Alexander Nozik 2022-05-24 21:39:01 +03:00
parent b92f880ce4
commit ccc68b614f
No known key found for this signature in database
GPG Key ID: F7FCF2DD25C71357
16 changed files with 111 additions and 82 deletions

View File

@ -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())
}
} }

View File

@ -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).
Цель создания программы &mdash; объединение усилий ученых и программистов для разработки лучших компьютерных решений и применения этих решений в области фундаментальной и прикладной науки и инженерии. Цель создания программы &mdash; объединение усилий ученых и программистов для разработки лучших компьютерных решений и применения этих решений в области фундаментальной и прикладной науки и инженерии.
@ -15,16 +15,22 @@ language: ru
* нахождение оптимальной траектории для задач в георазведке; * нахождение оптимальной траектории для задач в георазведке;
* разработка инструментов анализа данных для нефтяных компаний и количество прикладных учебных задач от реальных заказчиков постоянно растет. * разработка инструментов анализа данных для нефтяных компаний и количество прикладных учебных задач от реальных заказчиков постоянно растет.
<hr/>
**Почему же** это направление так актуально? **Почему же** это направление так актуально?
Существенная часть работы ученых так или иначе связана с компьютером. Компьютеры и программы используются на всех этапах экспериментального или теоретического исследования. Любой работе предшествует **компьютерное моделирование**, затем требуется **автоматизация сбора и хранения данных**, **анализ данных** и, наконец, **представление результатов**. На всех этих этапах нужны компьютеры и программное обеспечение. Качество программного обеспечения &mdash; ключевой фактор в исследованиях и разработках. Существенная часть работы ученых так или иначе связана с компьютером. Компьютеры и программы используются на всех этапах экспериментального или теоретического исследования. Любой работе предшествует **компьютерное моделирование**, затем требуется **автоматизация сбора и хранения данных**, **анализ данных** и, наконец, **представление результатов**. На всех этих этапах нужны компьютеры и программное обеспечение. Качество программного обеспечения &mdash; ключевой фактор в исследованиях и разработках.
Современная разработка программного обеспечения &mdash; это отдельная инженерная дисциплина, требующая опыта и погружения в технологию и соответствующие профессиональные сообщества. Несмотря на то, что современное программирование зародилось в научных исследованиях, с тех пор прошло много времени, и ученые во многих областях в среднем уже не могут похвастаться хорошими знаниями в этой области. Качество программного обеспечения в естественных науках низкое. Те же проблемы свойственны инженерной индустрии. Современная разработка программного обеспечения &mdash; это отдельная инженерная дисциплина, требующая опыта и погружения в технологию и соответствующие профессиональные сообщества. Несмотря на то, что современное программирование зародилось в научных исследованиях, с тех пор прошло много времени, и ученые во многих областях в среднем уже не могут похвастаться хорошими знаниями в этой области. Качество программного обеспечения в естественных науках низкое. Те же проблемы свойственны инженерной индустрии.
<hr/>
**Зачем** для этого нужны ученые? **Зачем** для этого нужны ученые?
Прошлые попытки поручить разработку программного обеспечения профессиональным программистам не увенчались успехом. Чтобы сформулировать задачу программисту, надо знать современные компьютерные технологии и понимать, как их лучше применять. Прошлые попытки поручить разработку программного обеспечения профессиональным программистам не увенчались успехом. Чтобы сформулировать задачу программисту, надо знать современные компьютерные технологии и понимать, как их лучше применять.
<hr/>
**Зачем** все это программистам? **Зачем** все это программистам?
Задачи, возникающие на стыке физики и программирования, на порядок интереснее тех, что ожидают инженера-программиста в повседневной рабочей жизни. Также работа с учеными &mdash; это хороший повод опробовать все самые свежие и экспериментальные технологии. Кроме того, опыт в моделировании, обработке данных и работе с приборами является бесценным в IT-среде. Задачи, возникающие на стыке физики и программирования, на порядок интереснее тех, что ожидают инженера-программиста в повседневной рабочей жизни. Также работа с учеными &mdash; это хороший повод опробовать все самые свежие и экспериментальные технологии. Кроме того, опыт в моделировании, обработке данных и работе с приборами является бесценным в IT-среде.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -6,4 +6,4 @@ order: 4
photo: images/team/Aivazov.jpg photo: images/team/Aivazov.jpg
language: ru language: ru
--- ---
**Консультант от ФПМИ** Консультант от ФПМИ

View File

@ -7,4 +7,4 @@ photo: images/team/muhina.jpg
language: ru language: ru
--- ---
Менеджер образовательных проектов. Менеджер образовательных проектов

View File

@ -8,8 +8,4 @@ language: ru
--- ---
**Руководитель программы** **Руководитель программы**
Заместитель заведующего ЛМЯФЭ МФТИ. Директор центра научного программирования
Руководитель направления в JetBrains Research.
Преподаватель общей физики, статистических методов и программирования на Kotlin в МФТИ.

View File

@ -9,6 +9,3 @@ language: ru
**Заместитель руководителя** **Заместитель руководителя**
Преподаватель кафедры общей физики МФТИ.
Аспирант ИЯИ РАН.

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -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"

View File

@ -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(" ")
} }
} }
} }

View File

@ -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