diff options
author | Kristóf Marussy <kristof@marussy.com> | 2024-03-15 18:01:48 +0100 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2024-03-15 19:19:33 +0100 |
commit | 0a16f36b8afc23f335c1146d6ea53329f9e27df7 (patch) | |
tree | 91a204a8f44f605042a8498a96f68dd02a5f1705 /src | |
parent | chore(deps): bump dependencies (diff) | |
download | blog-0a16f36b8afc23f335c1146d6ea53329f9e27df7.tar.gz blog-0a16f36b8afc23f335c1146d6ea53329f9e27df7.tar.zst blog-0a16f36b8afc23f335c1146d6ea53329f9e27df7.zip |
Add landing page sections and update resume
Diffstat (limited to 'src')
-rw-r--r-- | src/components/ActiveSectionProvider.tsx | 67 | ||||
-rw-r--r-- | src/components/TrackActiveSection.tsx | 47 | ||||
-rw-r--r-- | src/components/icons.tsx | 76 | ||||
-rw-r--r-- | src/components/icons/mtmt.ts | 17 | ||||
-rw-r--r-- | src/components/landing/Section.tsx | 14 | ||||
-rw-r--r-- | src/components/landing/Subtitle.tsx | 9 | ||||
-rw-r--r-- | src/components/landing/sections/Hero.tsx | 4 | ||||
-rw-r--r-- | src/components/landing/sections/Publications.module.css | 76 | ||||
-rw-r--r-- | src/components/landing/sections/Publications.tsx | 275 | ||||
-rw-r--r-- | src/components/landing/sections/Research.module.css | 101 | ||||
-rw-r--r-- | src/components/landing/sections/Research.tsx | 92 | ||||
-rw-r--r-- | src/components/landing/sections/Resume.module.css | 53 | ||||
-rw-r--r-- | src/components/landing/sections/Resume.tsx | 858 | ||||
-rw-r--r-- | src/components/landing/sections/Software.module.css | 5 | ||||
-rw-r--r-- | src/components/landing/sections/Software.tsx | 15 | ||||
-rw-r--r-- | src/pages/index.tsx | 18 | ||||
-rw-r--r-- | src/theme/NavbarItem/NavbarNavLink.jsx | 88 | ||||
-rw-r--r-- | src/theme/Root.tsx | 18 |
18 files changed, 1421 insertions, 412 deletions
diff --git a/src/components/ActiveSectionProvider.tsx b/src/components/ActiveSectionProvider.tsx new file mode 100644 index 0000000..022dbad --- /dev/null +++ b/src/components/ActiveSectionProvider.tsx | |||
@@ -0,0 +1,67 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2023 Kristóf Marussy | ||
3 | * | ||
4 | * SPDX-License-Identifier: MIT | ||
5 | */ | ||
6 | |||
7 | import { useLocation } from '@docusaurus/router'; | ||
8 | import { | ||
9 | type ReactNode, | ||
10 | createContext, | ||
11 | useCallback, | ||
12 | useContext, | ||
13 | useRef, | ||
14 | useState, | ||
15 | } from 'react'; | ||
16 | |||
17 | export interface ActiveSection { | ||
18 | hash: string | undefined; | ||
19 | setHash: (hash: string | undefined) => void; | ||
20 | } | ||
21 | |||
22 | const ActiveSectionContext = createContext<ActiveSection | undefined>( | ||
23 | undefined, | ||
24 | ); | ||
25 | |||
26 | export function useActiveSection(): ActiveSection { | ||
27 | const value = useContext(ActiveSectionContext); | ||
28 | if (value === undefined) { | ||
29 | throw new Error( | ||
30 | 'useActiveSection is only valid inside ActiveSectionProvider', | ||
31 | ); | ||
32 | } | ||
33 | return value; | ||
34 | } | ||
35 | |||
36 | export default function ActiveSectionProvider({ | ||
37 | children, | ||
38 | }: { | ||
39 | children: ReactNode; | ||
40 | }) { | ||
41 | const location = useLocation(); | ||
42 | const [hash, setHashState] = useState<string | undefined>(); | ||
43 | const lastHashRef = useRef<string | undefined>(); | ||
44 | const setHash = useCallback( | ||
45 | (hash: string | undefined) => { | ||
46 | if (hash === lastHashRef.current) { | ||
47 | return; | ||
48 | } | ||
49 | // Passing `undefined` to `hash` will give contraol pack to react-router. | ||
50 | const newURL = `${location.pathname}${location.search}${ | ||
51 | hash ?? location.hash | ||
52 | }`; | ||
53 | // Update the history entry without informing react-router so Docusaurus | ||
54 | // doesn't scroll to the top of the element. See | ||
55 | // https://github.com/facebook/docusaurus/blob/ca3dba5e5eab0f8b8a9b3388e2b2e637fe3a19a7/packages/docusaurus/src/client/ClientLifecyclesDispatcher.tsx#L30-L39 | ||
56 | window.history.replaceState(null, null, newURL); | ||
57 | setHashState(hash); | ||
58 | lastHashRef.current = hash; | ||
59 | }, | ||
60 | [location, setHashState], | ||
61 | ); | ||
62 | return ( | ||
63 | <ActiveSectionContext.Provider value={{ hash, setHash }}> | ||
64 | {children} | ||
65 | </ActiveSectionContext.Provider> | ||
66 | ); | ||
67 | } | ||
diff --git a/src/components/TrackActiveSection.tsx b/src/components/TrackActiveSection.tsx new file mode 100644 index 0000000..bb1b2ee --- /dev/null +++ b/src/components/TrackActiveSection.tsx | |||
@@ -0,0 +1,47 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2023 Kristóf Marussy | ||
3 | * | ||
4 | * SPDX-License-Identifier: MIT | ||
5 | */ | ||
6 | |||
7 | import { type ReactNode, useEffect, useCallback, useRef } from 'react'; | ||
8 | |||
9 | import { useActiveSection } from './ActiveSectionProvider'; | ||
10 | |||
11 | export default function TrackActiveSection({ | ||
12 | children, | ||
13 | }: { | ||
14 | children: ReactNode; | ||
15 | }) { | ||
16 | const { setHash } = useActiveSection(); | ||
17 | const elementRef = useRef<HTMLDivElement | null>(null); | ||
18 | const callback = useCallback(() => { | ||
19 | const { current: element } = elementRef; | ||
20 | if (!element) { | ||
21 | return; | ||
22 | } | ||
23 | const currentID = Array.from(element.children) | ||
24 | .reverse() | ||
25 | .find((child) => child.getBoundingClientRect().top <= 60)?.id; | ||
26 | const currentHash = | ||
27 | currentID === undefined || currentID === '' ? '' : `#${currentID}`; | ||
28 | setHash(currentHash); | ||
29 | }, [setHash]); | ||
30 | const setElement = useCallback( | ||
31 | (element: HTMLDivElement | null) => { | ||
32 | elementRef.current = element; | ||
33 | if (element) { | ||
34 | callback(); | ||
35 | } else { | ||
36 | setHash(undefined); | ||
37 | } | ||
38 | }, | ||
39 | [setHash], | ||
40 | ); | ||
41 | useEffect(() => { | ||
42 | window.addEventListener('scroll', callback); | ||
43 | return () => window.removeEventListener('scroll', callback); | ||
44 | }); | ||
45 | |||
46 | return <div ref={setElement}>{children}</div>; | ||
47 | } | ||
diff --git a/src/components/icons.tsx b/src/components/icons.tsx index 402b622..1411218 100644 --- a/src/components/icons.tsx +++ b/src/components/icons.tsx | |||
@@ -1,15 +1,37 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2023 Kristóf Marussy | 2 | * SPDX-FileCopyrightText: 2023-2024 Kristóf Marussy |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: MIT | 4 | * SPDX-License-Identifier: MIT |
5 | */ | 5 | */ |
6 | 6 | ||
7 | import { useId } from 'react'; | 7 | import { useId } from 'react'; |
8 | import { siGithub, siGooglescholar, siLinkedin, siOrcid } from 'simple-icons'; | 8 | import { |
9 | siCreativecommons, | ||
10 | siDblp, | ||
11 | siGithub, | ||
12 | siGooglescholar, | ||
13 | siLinkedin, | ||
14 | siOrcid, | ||
15 | siScopus, | ||
16 | } from 'simple-icons'; | ||
9 | 17 | ||
10 | import fediverse from './icons/fediverse'; | 18 | import fediverse from './icons/fediverse'; |
19 | import mtmt from './icons/mtmt'; | ||
11 | 20 | ||
12 | export function Icon({ path, alt }: { path: string; alt: string }) { | 21 | export interface IconProps { |
22 | hidden?: boolean; | ||
23 | className?: string; | ||
24 | alt?: string; | ||
25 | } | ||
26 | |||
27 | export function Icon({ | ||
28 | path, | ||
29 | alt, | ||
30 | hidden, | ||
31 | className, | ||
32 | }: IconProps & { | ||
33 | path: string; | ||
34 | }) { | ||
13 | const titleId = useId(); | 35 | const titleId = useId(); |
14 | 36 | ||
15 | return ( | 37 | return ( |
@@ -18,37 +40,55 @@ export function Icon({ path, alt }: { path: string; alt: string }) { | |||
18 | version="1.1" | 40 | version="1.1" |
19 | xmlns="http://www.w3.org/2000/svg" | 41 | xmlns="http://www.w3.org/2000/svg" |
20 | role="img" | 42 | role="img" |
21 | aria-labelledby={titleId} | 43 | {...(hidden ? { 'aria-hidden': true } : { 'aria-labelledby': titleId })} |
22 | viewBox="0 0 24 24" | 44 | viewBox="0 0 24 24" |
23 | width="24" | 45 | width="24" |
24 | height="24" | 46 | height="24" |
47 | {...(className ? { className } : {})} | ||
25 | > | 48 | > |
26 | <path fill="currentColor" d={path} /> | 49 | <path fill="currentColor" d={path} /> |
27 | </svg> | 50 | </svg> |
28 | <span className="sr-only" id={titleId}> | 51 | {!hidden && ( |
29 | {alt} | 52 | <span className="sr-only" id={titleId}> |
30 | </span> | 53 | {alt} |
54 | </span> | ||
55 | )} | ||
31 | </> | 56 | </> |
32 | ); | 57 | ); |
33 | } | 58 | } |
34 | 59 | ||
60 | export interface SimpleIcon { | ||
61 | path: string; | ||
62 | title: string; | ||
63 | } | ||
64 | |||
35 | export function SimpleIcon({ | 65 | export function SimpleIcon({ |
36 | icon: { path, title }, | 66 | icon: { path, title }, |
37 | }: { | 67 | ...props |
38 | icon: { | 68 | }: IconProps & { |
39 | path: string; | 69 | icon: SimpleIcon; |
40 | title: string; | ||
41 | }; | ||
42 | }) { | 70 | }) { |
43 | return <Icon path={path} alt={title} />; | 71 | return <Icon path={path} {...{ ...props, alt: props.alt ?? title }} />; |
44 | } | 72 | } |
45 | 73 | ||
46 | export const FediverseIcon = () => <SimpleIcon icon={fediverse} />; | 74 | function makeSimpleIcon(icon: SimpleIcon): (props: IconProps) => JSX.Element { |
75 | return (props) => <SimpleIcon icon={icon} {...props} />; | ||
76 | } | ||
77 | |||
78 | export const CreativeCommonsIcon = makeSimpleIcon(siCreativecommons); | ||
79 | |||
80 | export const DBLPIcon = makeSimpleIcon(siDblp); | ||
81 | |||
82 | export const FediverseIcon = makeSimpleIcon(fediverse); | ||
83 | |||
84 | export const GithubIcon = makeSimpleIcon(siGithub); | ||
85 | |||
86 | export const GoogleScholarIcon = makeSimpleIcon(siGooglescholar); | ||
47 | 87 | ||
48 | export const GithubIcon = () => <SimpleIcon icon={siGithub} />; | 88 | export const LinkedInIcon = makeSimpleIcon(siLinkedin); |
49 | 89 | ||
50 | export const GoogleScholarIcon = () => <SimpleIcon icon={siGooglescholar} />; | 90 | export const MTMTIcon = makeSimpleIcon(mtmt); |
51 | 91 | ||
52 | export const LinkedInIcon = () => <SimpleIcon icon={siLinkedin} />; | 92 | export const OrcidIcon = makeSimpleIcon(siOrcid); |
53 | 93 | ||
54 | export const OrcidIcon = () => <SimpleIcon icon={siOrcid} />; | 94 | export const ScopusIcon = makeSimpleIcon(siScopus); |
diff --git a/src/components/icons/mtmt.ts b/src/components/icons/mtmt.ts new file mode 100644 index 0000000..7dc3cc4 --- /dev/null +++ b/src/components/icons/mtmt.ts | |||
@@ -0,0 +1,17 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2023 Kristóf Marussy <kristof@marussy.com> | ||
3 | * | ||
4 | * SPDX-License-Identifier: CC0-1.0 | ||
5 | * | ||
6 | * Icon for MTMT (Hungarian Science Bibliography) was obtained by tracing | ||
7 | * the logo of MTMT (https://m2.mtmt.hu/frontend/resources/loadingscreen/m2logo.png). | ||
8 | * The font of the logo was replaced with Noto Sans Medium for a very close | ||
9 | * non-proprietary match. Standard caveats for using brand logos as icons | ||
10 | * (e.g., https://github.com/simple-icons/simple-icons/blob/master/DISCLAIMER.md) | ||
11 | * apply, but the SVG data itself is release under CC0-1.0. | ||
12 | */ | ||
13 | |||
14 | export default { | ||
15 | path: 'M0 0v24h24V0Zm.5.5h23v23H.5Zm16.106 2.921-.44 1.353-.937.475v.57h.89v3.538c0 .522.083.93.25 1.222.174.293.407.499.7.618.293.118.613.178.962.178.229 0 .455-.024.676-.072.23-.04.416-.09.558-.154v-.95a2.644 2.644 0 0 1-.451.12 3.769 3.769 0 0 1-.51.035c-.278 0-.503-.083-.677-.25-.166-.166-.25-.423-.25-.771V5.819h1.829v-.961h-1.828V3.42ZM7.857 4.74c-.38 0-.74.079-1.08.237-.34.159-.606.404-.796.736h-.07l-.179-.854h-.997v6.398h1.258V8.027c0-.728.111-1.286.333-1.674.23-.387.645-.581 1.246-.581.807 0 1.211.494 1.211 1.484v4h1.247V7.814c0-.657.122-1.16.367-1.508.246-.356.653-.534 1.223-.534.8 0 1.2.494 1.2 1.484v4h1.257V7.09c0-.823-.182-1.42-.546-1.792-.364-.372-.906-.558-1.626-.558a2.74 2.74 0 0 0-1.151.25 1.86 1.86 0 0 0-.855.783h-.095c-.309-.689-.958-1.033-1.947-1.033Zm8.749 7.886-.44 1.354-.937.474v.57h.89v3.538c0 .522.083.93.25 1.223.174.292.407.498.7.617.293.118.613.178.962.178.229 0 .455-.024.676-.071.23-.04.416-.091.558-.155v-.95a2.637 2.637 0 0 1-.451.12 3.769 3.769 0 0 1-.51.035c-.278 0-.503-.083-.677-.25-.166-.166-.25-.423-.25-.771v-3.514h1.829v-.961h-1.828v-1.437zm-8.749 1.318c-.38 0-.74.08-1.08.237-.34.159-.606.404-.796.736h-.07l-.179-.854h-.997v6.398h1.258v-3.229c0-.728.111-1.286.333-1.674.23-.387.645-.581 1.246-.581.807 0 1.211.494 1.211 1.484v4h1.247v-3.442c0-.657.122-1.16.367-1.508.246-.356.653-.534 1.223-.534.8 0 1.2.494 1.2 1.484v4h1.257v-4.167c0-.823-.182-1.42-.546-1.792-.364-.372-.906-.558-1.626-.558a2.74 2.74 0 0 0-1.151.25 1.86 1.86 0 0 0-.855.783h-.095c-.309-.689-.958-1.033-1.947-1.033z', | ||
16 | title: 'MTMT', | ||
17 | }; | ||
diff --git a/src/components/landing/Section.tsx b/src/components/landing/Section.tsx index f44272d..caec6b6 100644 --- a/src/components/landing/Section.tsx +++ b/src/components/landing/Section.tsx | |||
@@ -4,21 +4,33 @@ | |||
4 | * SPDX-License-Identifier: MIT | 4 | * SPDX-License-Identifier: MIT |
5 | */ | 5 | */ |
6 | 6 | ||
7 | import useBrokenLinks from '@docusaurus/useBrokenLinks'; | ||
7 | import type { ReactNode } from 'react'; | 8 | import type { ReactNode } from 'react'; |
8 | 9 | ||
9 | import styles from './Section.module.css'; | 10 | import styles from './Section.module.css'; |
10 | 11 | ||
11 | export default function Section({ | 12 | export default function Section({ |
12 | title, | 13 | title, |
14 | id, | ||
13 | children, | 15 | children, |
14 | }: { | 16 | }: { |
15 | title: string; | 17 | title: string; |
18 | id: string; | ||
16 | children?: ReactNode; | 19 | children?: ReactNode; |
17 | }) { | 20 | }) { |
21 | // Make sure the section anchors are not reported as broken. | ||
22 | // See https://docusaurus.io/blog/releases/3.1#broken-anchors-checker and | ||
23 | // https://github.com/facebook/docusaurus/issues/9721#issuecomment-1882898840 | ||
24 | useBrokenLinks().collectAnchor(id); | ||
25 | |||
18 | return ( | 26 | return ( |
19 | <section className={styles.section}> | 27 | <section id={id} className={styles.section}> |
20 | <h2 className={styles.section__title}>{title}</h2> | 28 | <h2 className={styles.section__title}>{title}</h2> |
21 | {children} | 29 | {children} |
22 | </section> | 30 | </section> |
23 | ); | 31 | ); |
24 | } | 32 | } |
33 | |||
34 | Section.defaultProps = { | ||
35 | children: undefined, | ||
36 | }; | ||
diff --git a/src/components/landing/Subtitle.tsx b/src/components/landing/Subtitle.tsx index d514f71..862ea3c 100644 --- a/src/components/landing/Subtitle.tsx +++ b/src/components/landing/Subtitle.tsx | |||
@@ -12,13 +12,18 @@ export default function Subtitle({ | |||
12 | icon, | 12 | icon, |
13 | children, | 13 | children, |
14 | }: { | 14 | }: { |
15 | icon: string; | 15 | icon?: string; |
16 | children?: ReactNode; | 16 | children?: ReactNode; |
17 | }) { | 17 | }) { |
18 | return ( | 18 | return ( |
19 | <h3 className={styles.subtitle}> | 19 | <h3 className={styles.subtitle}> |
20 | {icon !== undefined && <>{icon} </>} | 20 | {icon !== undefined && <span aria-hidden="true">{icon} </span>} |
21 | {children} | 21 | {children} |
22 | </h3> | 22 | </h3> |
23 | ); | 23 | ); |
24 | } | 24 | } |
25 | |||
26 | Subtitle.defaultProps = { | ||
27 | icon: undefined, | ||
28 | children: undefined, | ||
29 | }; | ||
diff --git a/src/components/landing/sections/Hero.tsx b/src/components/landing/sections/Hero.tsx index a56deb1..35f5bd9 100644 --- a/src/components/landing/sections/Hero.tsx +++ b/src/components/landing/sections/Hero.tsx | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2023 Kristóf Marussy | 2 | * SPDX-FileCopyrightText: 2023-2024 Kristóf Marussy |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: MIT | 4 | * SPDX-License-Identifier: MIT |
5 | */ | 5 | */ |
@@ -66,7 +66,7 @@ export default function Hero({ avatar }: { avatar: string }) { | |||
66 | )} | 66 | )} |
67 | > | 67 | > |
68 | Read my CV | 68 | Read my CV |
69 | </a> | 69 | </a>{' '} |
70 | <a | 70 | <a |
71 | href="#contact" | 71 | href="#contact" |
72 | className={clsx( | 72 | className={clsx( |
diff --git a/src/components/landing/sections/Publications.module.css b/src/components/landing/sections/Publications.module.css new file mode 100644 index 0000000..c9a39ba --- /dev/null +++ b/src/components/landing/sections/Publications.module.css | |||
@@ -0,0 +1,76 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2023-2024 Kristóf Marussy | ||
3 | * | ||
4 | * SPDX-License-Identifier: MIT | ||
5 | */ | ||
6 | |||
7 | .publications__item { | ||
8 | margin-top: 1rem; | ||
9 | } | ||
10 | |||
11 | .link { | ||
12 | white-space: nowrap; | ||
13 | } | ||
14 | |||
15 | .link--license { | ||
16 | --ifm-link-color: var(--ifm-color-secondary-contrast-foreground); | ||
17 | --ifm-link-hover-color: var(--ifm-link-color); | ||
18 | } | ||
19 | |||
20 | [data-theme='dark'] .link--license { | ||
21 | --ifm-link-color: var(--ifm-color-emphasis-500); | ||
22 | } | ||
23 | |||
24 | .link--lower { | ||
25 | text-transform: lowercase; | ||
26 | } | ||
27 | |||
28 | .link__icon { | ||
29 | vertical-align: text-top; | ||
30 | width: 1em; | ||
31 | height: 1em; | ||
32 | margin-right: 0.125rem; | ||
33 | } | ||
34 | |||
35 | .elsewhere { | ||
36 | display: flex; | ||
37 | flex-direction: row; | ||
38 | align-items: center; | ||
39 | flex-wrap: wrap; | ||
40 | column-gap: 0.25rem; | ||
41 | } | ||
42 | |||
43 | .elsewhere__text { | ||
44 | margin: 0; | ||
45 | } | ||
46 | |||
47 | .elsewhere__list { | ||
48 | display: flex; | ||
49 | margin: 0; | ||
50 | padding: 0; | ||
51 | } | ||
52 | |||
53 | .elsewhere__item { | ||
54 | display: flex; | ||
55 | align-items: center; | ||
56 | margin: 0; | ||
57 | list-style-type: none; | ||
58 | } | ||
59 | |||
60 | .elsewhere__icon { | ||
61 | display: flex; | ||
62 | padding: 0.375rem; | ||
63 | --ifm-link-color: var(--ifm-color-secondary-contrast-foreground); | ||
64 | --ifm-link-hover-color: var(--ifm-color-emphasis-700); | ||
65 | --ifm-link-text-decoration: none; | ||
66 | } | ||
67 | |||
68 | [data-theme='dark'] .elsewhere__icon { | ||
69 | --ifm-link-color: var(--ifm-color-secondary); | ||
70 | --ifm-link-hover-color: var(--ifm-color-secondary-dark); | ||
71 | } | ||
72 | |||
73 | .elsewhere__icon svg { | ||
74 | width: 1.75rem; | ||
75 | height: 1.75rem; | ||
76 | } | ||
diff --git a/src/components/landing/sections/Publications.tsx b/src/components/landing/sections/Publications.tsx new file mode 100644 index 0000000..e343c42 --- /dev/null +++ b/src/components/landing/sections/Publications.tsx | |||
@@ -0,0 +1,275 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2023-2024 Kristóf Marussy | ||
3 | * | ||
4 | * SPDX-License-Identifier: MIT | ||
5 | */ | ||
6 | |||
7 | import { | ||
8 | ArrowSquareOut, | ||
9 | Certificate, | ||
10 | File, | ||
11 | Lock, | ||
12 | Package, | ||
13 | Play, | ||
14 | } from '@phosphor-icons/react'; | ||
15 | import clsx from 'clsx'; | ||
16 | |||
17 | import { | ||
18 | CreativeCommonsIcon, | ||
19 | DBLPIcon, | ||
20 | GoogleScholarIcon, | ||
21 | MTMTIcon, | ||
22 | OrcidIcon, | ||
23 | ScopusIcon, | ||
24 | } from '@site/src/components/icons'; | ||
25 | import Section from '@site/src/components/landing/Section'; | ||
26 | import Subtitle from '@site/src/components/landing/Subtitle'; | ||
27 | import styles from './Publications.module.css'; | ||
28 | |||
29 | function DOILink({ doi }: { doi: string }) { | ||
30 | return ( | ||
31 | <a | ||
32 | href={`https://doi.org/${doi}`} | ||
33 | className={clsx(styles.link, styles['link--lower'])} | ||
34 | > | ||
35 | <ArrowSquareOut | ||
36 | weight="bold" | ||
37 | aria-hidden="true" | ||
38 | className={styles.link__icon} | ||
39 | /> | ||
40 | DOI | ||
41 | </a> | ||
42 | ); | ||
43 | } | ||
44 | |||
45 | function PDFLink({ filename }: { filename: string }) { | ||
46 | return ( | ||
47 | <a | ||
48 | href={`/papers/${filename}.pdf`} | ||
49 | className={clsx(styles.link, styles['link--lower'])} | ||
50 | > | ||
51 | <File weight="bold" aria-hidden="true" className={styles.link__icon} /> | ||
52 | |||
53 | </a> | ||
54 | ); | ||
55 | } | ||
56 | |||
57 | function ArtifactLink({ doi }: { doi: string }) { | ||
58 | return ( | ||
59 | <a | ||
60 | href={`https://doi.org/${doi}`} | ||
61 | className={clsx(styles.link, styles['link--lower'])} | ||
62 | > | ||
63 | <Package weight="bold" aria-hidden="true" className={styles.link__icon} /> | ||
64 | Artifact | ||
65 | </a> | ||
66 | ); | ||
67 | } | ||
68 | |||
69 | function ArxivLink({ arxivID }: { arxivID: string }) { | ||
70 | return ( | ||
71 | <a href={`https://arxiv.org/abs/${arxivID}`} className={styles.link}> | ||
72 | <ArrowSquareOut | ||
73 | weight="bold" | ||
74 | aria-hidden="true" | ||
75 | className={styles.link__icon} | ||
76 | /> | ||
77 | arXiv | ||
78 | </a> | ||
79 | ); | ||
80 | } | ||
81 | |||
82 | function VideoLink({ url }: { url: string }) { | ||
83 | return ( | ||
84 | <a href={url} className={clsx(styles.link, styles['link--lower'])}> | ||
85 | <Play weight="bold" aria-hidden="true" className={styles.link__icon} /> | ||
86 | Video | ||
87 | </a> | ||
88 | ); | ||
89 | } | ||
90 | |||
91 | function ClosedAccess({ publisher, url }: { publisher: string; url: string }) { | ||
92 | return ( | ||
93 | <a | ||
94 | href={url} | ||
95 | rel="nofollow" | ||
96 | className={clsx(styles.link, styles['link--license'])} | ||
97 | > | ||
98 | <Lock weight="bold" aria-hidden="true" className={styles.link__icon} /> | ||
99 | <span className="sr-only">Closed Access: </span> | ||
100 | {publisher} | ||
101 | </a> | ||
102 | ); | ||
103 | } | ||
104 | |||
105 | function OpenAccess({ license }: { license: string }) { | ||
106 | const url = `https://creativecommons.org/licenses/${license}/4.0/`; | ||
107 | return ( | ||
108 | <a href={url} className={clsx(styles.link, styles['link--license'])}> | ||
109 | <CreativeCommonsIcon className={styles.link__icon} hidden /> | ||
110 | <span className="sr-only">Open Access: </span> | ||
111 | CC-{license.toUpperCase()}-4.0 | ||
112 | </a> | ||
113 | ); | ||
114 | } | ||
115 | |||
116 | function ArtifactLicense({ license, url }: { license: string; url: string }) { | ||
117 | return ( | ||
118 | <a href={url} className={clsx(styles.link, styles['link--license'])}> | ||
119 | <Certificate | ||
120 | weight="bold" | ||
121 | aria-hidden="true" | ||
122 | className={styles.link__icon} | ||
123 | /> | ||
124 | <span className="sr-only">Artifact license: </span> | ||
125 | {license} | ||
126 | </a> | ||
127 | ); | ||
128 | } | ||
129 | |||
130 | export default function Publications() { | ||
131 | return ( | ||
132 | <Section id="publications" title="Publications"> | ||
133 | <div className="container"> | ||
134 | <section> | ||
135 | <Subtitle icon="📌">Selected publications</Subtitle> | ||
136 | <ul> | ||
137 | <li className={styles.publications__item}> | ||
138 | <b>Kristóf Marussy</b>, Attila Ficsor, Oszkár Semeráth, Dániel | ||
139 | Varró (2024). Refinery: Graph Solver as a Service. In | ||
140 | <i> | ||
141 | International Conference on Software Engineering (ICSE) 2024 | ||
142 | </i> | ||
143 | . <PDFLink filename="icse24" />{' '} | ||
144 | <VideoLink url="https://www.youtube.com/watch?v=Qy_3udNsWsM" />{' '} | ||
145 | <OpenAccess license="by" /> | ||
146 | </li> | ||
147 | <li className={styles.publications__item}> | ||
148 | Máté Földiák, <b>Kristóf Marussy</b>, Dániel Varró, István Majzik | ||
149 | (2022). System architecture synthesis for performability by logic | ||
150 | solvers. In | ||
151 | <i> | ||
152 | International Conference on Model Driven Engineering Languages | ||
153 | and Systems (MODELS) 2022, | ||
154 | </i>{' '} | ||
155 | pp. 433–45. <DOILink doi="10.1145/3550355.3552448" />{' '} | ||
156 | <PDFLink filename="models22" />{' '} | ||
157 | <ClosedAccess | ||
158 | publisher="ACM" | ||
159 | url="https://authors.acm.org/journals/rights-permissions" | ||
160 | />{' '} | ||
161 | <ArtifactLink doi="10.5281/zenodo.6974248" />{' '} | ||
162 | <ArtifactLicense | ||
163 | license="EPL-2.0" | ||
164 | url="https://www.eclipse.org/legal/epl-v20.html" | ||
165 | /> | ||
166 | </li> | ||
167 | <li className={styles.publications__item}> | ||
168 | Boqi Chen, <b>Kristóf Marussy</b>, Sebastian Pilarski, Oszkár | ||
169 | Semeráth, Dániel Varró (2022). Consistent Scene Graph Generation | ||
170 | by Constraint Optimization. In | ||
171 | <i> | ||
172 | International Conference on Automated Software Engineering (ASE) | ||
173 | 2022 | ||
174 | </i> | ||
175 | . <DOILink doi="10.1145/3551349.3560433" />{' '} | ||
176 | <PDFLink filename="ase22" /> <OpenAccess license="by" /> | ||
177 | </li> | ||
178 | <li className={styles.publications__item}> | ||
179 | <b>Kristóf Marussy</b>, Oszkár Semeráth, Dániel Varró (2022).{' '} | ||
180 | Automated Generation of Consistent Graph Models With Multiplicity | ||
181 | Reasoning. <i>IEEE Transactions on Software Engineering,</i>{' '} | ||
182 | volume 48, issue 5. <DOILink doi="10.1109/TSE.2020.3025732 " />{' '} | ||
183 | <PDFLink filename="tse22" /> <OpenAccess license="by" /> | ||
184 | </li> | ||
185 | <li className={styles.publications__item}> | ||
186 | Márton Búr, <b>Kristóf Marussy</b>, Brett H. Meyer, Dániel | ||
187 | Varró (2021). Worst-case Execution Time Calculation for | ||
188 | Query-based Monitors by Witness Generation.{' '} | ||
189 | <i>ACM Transactions on Embedded Computing Systems,</i> volume 20, | ||
190 | issue 6. <DOILink doi="10.1145/3239372.3239412" />{' '} | ||
191 | <ArxivLink arxivID="2102.03116" /> <PDFLink filename="tecs21" />{' '} | ||
192 | <OpenAccess license="by" /> | ||
193 | </li> | ||
194 | <li className={styles.publications__item}> | ||
195 | <b>Kristóf Marussy</b>, Oszkár Semeráth, Aren A. Babikian, | ||
196 | Dániel Varró (2020). A Specification Language for Consistent Model | ||
197 | Generation based on Partial Models.{' '} | ||
198 | <i>Journal of Object Technology,</i> volume 19, | ||
199 | pp. 3:1–22. <DOILink doi="10.5381/jot.2020.19.3.a12" />{' '} | ||
200 | <PDFLink filename="jot20" />{' '} | ||
201 | <VideoLink url="https://www.youtube.com/watch?v=ggTbv_s5t2A" />{' '} | ||
202 | <OpenAccess license="by-nd" /> | ||
203 | </li> | ||
204 | <li className={styles.publications__item}> | ||
205 | <b>Kristóf Marussy</b> and Oszkár Semeráth (2018). Incremental | ||
206 | View Model Synchronization Using Partial Models. In | ||
207 | <i> | ||
208 | International Conference on Model Driven Engineering Languages | ||
209 | and Systems (MODELS) 2018, | ||
210 | </i>{' '} | ||
211 | pp. 323–333. <DOILink doi="10.1145/3239372.3239412" />{' '} | ||
212 | <PDFLink filename="models18" />{' '} | ||
213 | <ClosedAccess | ||
214 | publisher="ACM" | ||
215 | url="https://authors.acm.org/journals/rights-permissions" | ||
216 | />{' '} | ||
217 | <ArtifactLink doi="10.5281/zenodo.1318156" />{' '} | ||
218 | <ArtifactLicense | ||
219 | license="EPL-1.0" | ||
220 | url="https://www.eclipse.org/legal/epl-v10.html" | ||
221 | /> | ||
222 | </li> | ||
223 | </ul> | ||
224 | </section> | ||
225 | <div className={styles.elsewhere}> | ||
226 | <p className={styles.elsewhere__text}> | ||
227 | See the full list of my publications at | ||
228 | </p> | ||
229 | <ul className={styles.elsewhere__list}> | ||
230 | <li className={styles.elsewhere__item}> | ||
231 | <a | ||
232 | href="https://orcid.org/0000-0002-9135-8256" | ||
233 | className={styles.elsewhere__icon} | ||
234 | > | ||
235 | <OrcidIcon /> | ||
236 | </a> | ||
237 | </li> | ||
238 | <li className={styles.elsewhere__item}> | ||
239 | <a | ||
240 | href="https://dblp.org/pid/130/6479.html" | ||
241 | className={styles.elsewhere__icon} | ||
242 | > | ||
243 | <DBLPIcon /> | ||
244 | </a> | ||
245 | </li> | ||
246 | <li className={styles.elsewhere__item}> | ||
247 | <a | ||
248 | href="https://scholar.google.com/citations?user=E9CKNYoAAAAJ" | ||
249 | className={styles.elsewhere__icon} | ||
250 | > | ||
251 | <GoogleScholarIcon /> | ||
252 | </a> | ||
253 | </li> | ||
254 | <li className={styles.elsewhere__item}> | ||
255 | <a | ||
256 | href="https://www.scopus.com/authid/detail.uri?authorId=55860043200" | ||
257 | className={styles.elsewhere__icon} | ||
258 | > | ||
259 | <ScopusIcon /> | ||
260 | </a> | ||
261 | </li> | ||
262 | <li className={styles.elsewhere__item}> | ||
263 | <a | ||
264 | href="https://m2.mtmt.hu/gui2/?type=authors&mode=browse&sel=authors10062709" | ||
265 | className={styles.elsewhere__icon} | ||
266 | > | ||
267 | <MTMTIcon /> | ||
268 | </a> | ||
269 | </li> | ||
270 | </ul> | ||
271 | </div> | ||
272 | </div> | ||
273 | </Section> | ||
274 | ); | ||
275 | } | ||
diff --git a/src/components/landing/sections/Research.module.css b/src/components/landing/sections/Research.module.css new file mode 100644 index 0000000..c5c87a4 --- /dev/null +++ b/src/components/landing/sections/Research.module.css | |||
@@ -0,0 +1,101 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2023 Kristóf Marussy | ||
3 | * | ||
4 | * SPDX-License-Identifier: MIT | ||
5 | */ | ||
6 | |||
7 | .topics { | ||
8 | margin-top: 1.5rem; | ||
9 | } | ||
10 | |||
11 | .topic { | ||
12 | container-type: inline-size; | ||
13 | } | ||
14 | |||
15 | .topic__contents { | ||
16 | display: flex; | ||
17 | flex-direction: column; | ||
18 | align-items: center; | ||
19 | } | ||
20 | |||
21 | .topic__icon { | ||
22 | display: flex; | ||
23 | justify-content: center; | ||
24 | align-items: center; | ||
25 | } | ||
26 | |||
27 | .topic__icon--system { | ||
28 | color: #f5a614; | ||
29 | } | ||
30 | |||
31 | [data-theme='dark'] .topic__icon--system { | ||
32 | color: #e6ac5b; | ||
33 | } | ||
34 | |||
35 | .topic__icon--verification { | ||
36 | color: #1eae4e; | ||
37 | } | ||
38 | |||
39 | [data-theme='dark'] .topic__icon--verification { | ||
40 | color: #63c177; | ||
41 | } | ||
42 | |||
43 | .topic__icon--reasoning { | ||
44 | color: #af3b6e; | ||
45 | } | ||
46 | |||
47 | [data-theme='dark'] .topic__icon--reasoning { | ||
48 | color: #d67a9d; | ||
49 | } | ||
50 | |||
51 | .topic__icon--graph { | ||
52 | color: #038a99; | ||
53 | } | ||
54 | |||
55 | [data-theme='dark'] .topic__icon--graph { | ||
56 | color: #56b6c2; | ||
57 | } | ||
58 | |||
59 | .topic__text { | ||
60 | flex-grow: 1; | ||
61 | } | ||
62 | |||
63 | .topic__title { | ||
64 | margin-top: 1rem; | ||
65 | text-align: center; | ||
66 | --casl: 0; | ||
67 | } | ||
68 | |||
69 | .topic__description { | ||
70 | margin: 0; | ||
71 | } | ||
72 | |||
73 | @container (min-width: 450px) { | ||
74 | .topic .topic__contents { | ||
75 | margin: 0.625rem 0; | ||
76 | flex-direction: row; | ||
77 | gap: 1rem; | ||
78 | } | ||
79 | |||
80 | .topic .topic__title { | ||
81 | margin-top: 0; | ||
82 | text-align: left; | ||
83 | } | ||
84 | |||
85 | .topic:nth-of-type(2n) .topic__contents { | ||
86 | flex-direction: row-reverse; | ||
87 | } | ||
88 | |||
89 | .topic:nth-of-type(2n) .topic__title, | ||
90 | .topic:nth-of-type(2n) .topic__description { | ||
91 | text-align: right; | ||
92 | } | ||
93 | |||
94 | .topic:first-of-type .topic__contents { | ||
95 | margin-top: 0; | ||
96 | } | ||
97 | |||
98 | .topic:last-of-type .topic__contents { | ||
99 | margin-top: 0; | ||
100 | } | ||
101 | } | ||
diff --git a/src/components/landing/sections/Research.tsx b/src/components/landing/sections/Research.tsx new file mode 100644 index 0000000..b6e5954 --- /dev/null +++ b/src/components/landing/sections/Research.tsx | |||
@@ -0,0 +1,92 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2023 Kristóf Marussy | ||
3 | * | ||
4 | * SPDX-License-Identifier: MIT | ||
5 | */ | ||
6 | |||
7 | import clsx from 'clsx'; | ||
8 | import type { ReactNode } from 'react'; | ||
9 | |||
10 | import { | ||
11 | type Icon, | ||
12 | Gear, | ||
13 | Graph, | ||
14 | MagicWand, | ||
15 | ShieldCheck, | ||
16 | } from '@phosphor-icons/react'; | ||
17 | |||
18 | import Section from '@site/src/components/landing/Section'; | ||
19 | |||
20 | import styles from './Research.module.css'; | ||
21 | |||
22 | function Topic({ | ||
23 | title, | ||
24 | style, | ||
25 | Icon, | ||
26 | children, | ||
27 | }: { | ||
28 | title: string; | ||
29 | style: string; | ||
30 | Icon: Icon; | ||
31 | children: ReactNode; | ||
32 | }) { | ||
33 | return ( | ||
34 | <div className={clsx('col', 'col-3', styles.topic)}> | ||
35 | <div className={styles.topic__contents}> | ||
36 | <div className={clsx(styles.topic__icon, style)}> | ||
37 | <Icon aria-hidden="true" size={128} weight="light" /> | ||
38 | </div> | ||
39 | <div className={styles.topic__text}> | ||
40 | <h3 className={styles.topic__title}>{title}</h3> | ||
41 | <p className={styles.topic__description}>{children}</p> | ||
42 | </div> | ||
43 | </div> | ||
44 | </div> | ||
45 | ); | ||
46 | } | ||
47 | |||
48 | export default function Research() { | ||
49 | return ( | ||
50 | <Section id="research" title="Research"> | ||
51 | <div className={clsx('container', styles.topics)}> | ||
52 | <div className="row"> | ||
53 | <Topic | ||
54 | title="Critical systems" | ||
55 | Icon={Gear} | ||
56 | style={styles['topic__icon--system']} | ||
57 | > | ||
58 | Cyber-physical systems especially in the railway, automotive, | ||
59 | and aerospace domains with stringent correctness and relability | ||
60 | requirements | ||
61 | </Topic> | ||
62 | <Topic | ||
63 | title="Formal verification" | ||
64 | Icon={ShieldCheck} | ||
65 | style={styles['topic__icon--verification']} | ||
66 | > | ||
67 | Proving the safety and reliability of critical system designs and | ||
68 | software components in a mathematically precise way | ||
69 | </Topic> | ||
70 | <Topic | ||
71 | title="Automated reasoning" | ||
72 | Icon={MagicWand} | ||
73 | style={styles['topic__icon--reasoning']} | ||
74 | > | ||
75 | Integrating logical and numerical solvers with intelligent | ||
76 | heuristics to answer challenging analysis questions and | ||
77 | synthesize reliable system designs | ||
78 | </Topic> | ||
79 | <Topic | ||
80 | title="Graph generation" | ||
81 | Icon={Graph} | ||
82 | style={styles['topic__icon--graph']} | ||
83 | > | ||
84 | Efficient graph-based information processing for system modeling, | ||
85 | testing data-driven systems, and knowledge representation in | ||
86 | autonomous systems | ||
87 | </Topic> | ||
88 | </div> | ||
89 | </div> | ||
90 | </Section> | ||
91 | ); | ||
92 | } | ||
diff --git a/src/components/landing/sections/Resume.module.css b/src/components/landing/sections/Resume.module.css index 246ebec..fb576a1 100644 --- a/src/components/landing/sections/Resume.module.css +++ b/src/components/landing/sections/Resume.module.css | |||
@@ -1,9 +1,41 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2023 Kristóf Marussy | 2 | * SPDX-FileCopyrightText: 2023-2024 Kristóf Marussy |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: MIT | 4 | * SPDX-License-Identifier: MIT |
5 | */ | 5 | */ |
6 | 6 | ||
7 | .resume { | ||
8 | display: flow-root; | ||
9 | margin: 0 calc(var(--ifm-spacing-horizontal) * -1); | ||
10 | } | ||
11 | |||
12 | .resume__section { | ||
13 | width: 50%; | ||
14 | /* Floats don't let margins to merge, so we merge them manually. */ | ||
15 | margin-bottom: -1rem; | ||
16 | padding: 0 var(--ifm-spacing-horizontal); | ||
17 | } | ||
18 | |||
19 | .resume__section:nth-of-type(2n + 1) { | ||
20 | float: left; | ||
21 | clear: left; | ||
22 | } | ||
23 | |||
24 | .resume__section:nth-of-type(2n) { | ||
25 | float: right; | ||
26 | clear: right; | ||
27 | } | ||
28 | |||
29 | @media (max-width: 996px) { | ||
30 | .resume__section { | ||
31 | width: 100%; | ||
32 | /* No need to merge margins any more. */ | ||
33 | margin-bottom: 0; | ||
34 | float: none !important; | ||
35 | clear: none !important; | ||
36 | } | ||
37 | } | ||
38 | |||
7 | .cv { | 39 | .cv { |
8 | position: relative; | 40 | position: relative; |
9 | } | 41 | } |
@@ -36,6 +68,10 @@ | |||
36 | border-radius: 100em; | 68 | border-radius: 100em; |
37 | } | 69 | } |
38 | 70 | ||
71 | .cv__item--no-title::before { | ||
72 | top: 0.25rem; | ||
73 | } | ||
74 | |||
39 | [data-theme='dark'] .cv__item::before { | 75 | [data-theme='dark'] .cv__item::before { |
40 | background: var(--ifm-background-color); | 76 | background: var(--ifm-background-color); |
41 | } | 77 | } |
@@ -84,13 +120,13 @@ | |||
84 | --ifm-link-hover-color: var(--ifm-color-primary-light); | 120 | --ifm-link-hover-color: var(--ifm-color-primary-light); |
85 | } | 121 | } |
86 | 122 | ||
87 | .cv__awarddesc { | 123 | .cv__muted { |
88 | font-size: 0.875rem; | 124 | font-size: 0.875rem; |
89 | color: var(--ifm-color-emphasis-800); | 125 | color: var(--ifm-color-secondary-contrast-foreground); |
90 | } | 126 | } |
91 | 127 | ||
92 | [data-theme='dark'] .cv__awarddesc { | 128 | [data-theme='dark'] .cv__muted { |
93 | color: var(--ifm-color-emphasis-600); | 129 | color: var(--ifm-color-emphasis-500); |
94 | } | 130 | } |
95 | 131 | ||
96 | .cv__activities { | 132 | .cv__activities { |
@@ -106,6 +142,13 @@ | |||
106 | margin: 0; | 142 | margin: 0; |
107 | } | 143 | } |
108 | 144 | ||
145 | .thesis-rights__icon { | ||
146 | vertical-align: text-top; | ||
147 | width: 1em; | ||
148 | height: 1em; | ||
149 | margin-right: 0.125rem; | ||
150 | } | ||
151 | |||
109 | .thesis-links { | 152 | .thesis-links { |
110 | display: flex; | 153 | display: flex; |
111 | column-gap: 0.5rem; | 154 | column-gap: 0.5rem; |
diff --git a/src/components/landing/sections/Resume.tsx b/src/components/landing/sections/Resume.tsx index 40ceeb0..fe97434 100644 --- a/src/components/landing/sections/Resume.tsx +++ b/src/components/landing/sections/Resume.tsx | |||
@@ -1,9 +1,10 @@ | |||
1 | /* | 1 | /* |
2 | * SPDX-FileCopyrightText: 2023 Kristóf Marussy | 2 | * SPDX-FileCopyrightText: 2023-2024 Kristóf Marussy |
3 | * | 3 | * |
4 | * SPDX-License-Identifier: MIT AND CC-BY-4.0 | 4 | * SPDX-License-Identifier: MIT AND CC-BY-4.0 |
5 | */ | 5 | */ |
6 | 6 | ||
7 | import { Lock } from '@phosphor-icons/react'; | ||
7 | import clsx from 'clsx'; | 8 | import clsx from 'clsx'; |
8 | 9 | ||
9 | import Section from '@site/src/components/landing/Section'; | 10 | import Section from '@site/src/components/landing/Section'; |
@@ -11,386 +12,487 @@ import Subtitle from '@site/src/components/landing/Subtitle'; | |||
11 | 12 | ||
12 | import styles from './Resume.module.css'; | 13 | import styles from './Resume.module.css'; |
13 | 14 | ||
15 | function ResumeSection({ children }: { children?: React.ReactNode }) { | ||
16 | return <div className={styles.resume__section}>{children}</div>; | ||
17 | } | ||
18 | |||
19 | function Education() { | ||
20 | return ( | ||
21 | <ResumeSection> | ||
22 | <Subtitle icon="🎓">Education</Subtitle> | ||
23 | <ul className={styles.cv}> | ||
24 | <li className={styles.cv__item}> | ||
25 | <h4 className={styles.cv__title}>Doctor of Philosophy (PhD)</h4> | ||
26 | <p className={styles.cv__times}> | ||
27 | <span className={styles.cv__time}>2018–2023</span> | ||
28 | </p> | ||
29 | <p> | ||
30 | <i>Budapest Unversity of Technology and Economics</i> | ||
31 | </p> | ||
32 | <p> | ||
33 | Thesis:{' '} | ||
34 | <a href="/thesis.pdf"> | ||
35 | <b> | ||
36 | Abstraction Techniques for the Analysis and Synthesis of | ||
37 | Critical Cyber-Physical System Architectures | ||
38 | </b> | ||
39 | </a> | ||
40 | </p> | ||
41 | <p className={styles.cv__muted}> | ||
42 | <Lock | ||
43 | weight="bold" | ||
44 | aria-hidden="true" | ||
45 | className={styles['thesis-rights__icon']} | ||
46 | /> | ||
47 | Some poritions exclusively licensed to their original publishers | ||
48 | </p> | ||
49 | <div className={styles['thesis-links']}> | ||
50 | <a | ||
51 | href="/thesis.pdf" | ||
52 | className={clsx( | ||
53 | 'button', | ||
54 | 'button--primary', | ||
55 | styles['thesis-links__link'], | ||
56 | )} | ||
57 | > | ||
58 | Read now | ||
59 | </a> | ||
60 | <a | ||
61 | href="/thesis-booklet-en.pdf" | ||
62 | className={clsx( | ||
63 | 'button', | ||
64 | 'button--secondary', | ||
65 | styles['thesis-links__link'], | ||
66 | )} | ||
67 | > | ||
68 | Extended abstract | ||
69 | </a> | ||
70 | <a | ||
71 | href="http://hdl.handle.net/10890/41832" | ||
72 | className={styles['thesis-links__link']} | ||
73 | > | ||
74 | Also available via HDL.NET | ||
75 | </a> | ||
76 | </div> | ||
77 | </li> | ||
78 | <li className={styles.cv__item}> | ||
79 | <h4 className={styles.cv__title}>Master of Science (MSc)</h4> | ||
80 | <p className={styles.cv__times}> | ||
81 | <span className={styles.cv__time}>2016–2018</span> | ||
82 | </p> | ||
83 | <p> | ||
84 | <i>Budapest Unversity of Technology and Economics</i> | ||
85 | </p> | ||
86 | </li> | ||
87 | <li className={styles.cv__item}> | ||
88 | <h4 className={styles.cv__title}>Bachleor of Science (BSc)</h4> | ||
89 | <p className={styles.cv__times}> | ||
90 | <span className={styles.cv__time}>2012–2016</span> | ||
91 | </p> | ||
92 | <p> | ||
93 | <i>Budapest Unversity of Technology and Economics</i> | ||
94 | </p> | ||
95 | </li> | ||
96 | </ul> | ||
97 | </ResumeSection> | ||
98 | ); | ||
99 | } | ||
100 | |||
101 | function Experience() { | ||
102 | return ( | ||
103 | <ResumeSection> | ||
104 | <Subtitle icon="👨💼">Professional experience</Subtitle> | ||
105 | <ul className={styles.cv}> | ||
106 | <li className={styles.cv__item}> | ||
107 | <h4 className={styles.cv__title}>Research fellow</h4> | ||
108 | <p className={styles.cv__times}> | ||
109 | <span className={styles.cv__time}>2024–</span> | ||
110 | </p> | ||
111 | </li> | ||
112 | <li className={styles.cv__item}> | ||
113 | <h4 className={styles.cv__title}>Assistant research fellow</h4> | ||
114 | <p className={styles.cv__times}> | ||
115 | <span className={styles.cv__time}>2020–2023</span> | ||
116 | </p> | ||
117 | <p> | ||
118 | <i> | ||
119 | Department of Measurement and Information Systems, Budapest | ||
120 | University of Technology and Economics, Hungary | ||
121 | </i> | ||
122 | </p> | ||
123 | <ul className={styles.cv__activities}> | ||
124 | <li className={styles.cv__activity}> | ||
125 | Performing research and developing tools to address challenges in | ||
126 | the development of critical systems motivated by case studies and | ||
127 | collaborations with industry partners | ||
128 | </li> | ||
129 | <li className={styles.cv__activity}> | ||
130 | Created reliability models for{' '} | ||
131 | <i>distributed railway interlocking systems</i> in a{' '} | ||
132 | <a href="https://projektek.bme.hu/index.php?site=3_0_0&i=28"> | ||
133 | Hungarian national project | ||
134 | </a>{' '} | ||
135 | with{' '} | ||
136 | <a href="https://www.prolan.hu/" rel="nofollow"> | ||
137 | Prolan Zrt. | ||
138 | </a> | ||
139 | </li> | ||
140 | <li className={styles.cv__activity}> | ||
141 | Formally verified a <i>critical automotive subsystem</i> in a{' '} | ||
142 | <a href="https://projektek.bme.hu/index.php?site=3_1_0&i=18"> | ||
143 | Hungarian national project | ||
144 | </a>{' '} | ||
145 | with{' '} | ||
146 | <a href="https://www.thyssenkrupp.hu/en" rel="nofollow"> | ||
147 | thyssenkrupp Ltd. | ||
148 | </a> | ||
149 | </li> | ||
150 | </ul> | ||
151 | </li> | ||
152 | <li className={styles.cv__item}> | ||
153 | <h4 className={styles.cv__title}>Assistant research fellow</h4> | ||
154 | <p className={styles.cv__times}> | ||
155 | <span className={styles.cv__time}>2018–2019</span> | ||
156 | </p> | ||
157 | <p> | ||
158 | <i> | ||
159 | <a href="https://web.archive.org/web/20200919160859/https://lendulet.inf.mit.bme.hu/"> | ||
160 | MTA-BME <span lang="hu">Lendület</span> Cyber-Physical Systems | ||
161 | Research Group | ||
162 | </a> | ||
163 | </i> | ||
164 | </p> | ||
165 | </li> | ||
166 | <li className={styles.cv__item}> | ||
167 | <h4 className={styles.cv__title}>Research trainee</h4> | ||
168 | <p className={styles.cv__times}> | ||
169 | <span className={styles.cv__time}>2014-2015</span> | ||
170 | </p> | ||
171 | <p> | ||
172 | <i> | ||
173 | <a href="https://web.archive.org/web/20150925191035/http://biointelligence.hu/"> | ||
174 | BioIntelligence Research Group, | ||
175 | </a>{' '} | ||
176 | <a href="https://semmelweis.hu/genomikai-medicina/en/"> | ||
177 | Institute of Genomic Medicine and Rare Disorders, | ||
178 | </a>{' '} | ||
179 | <a href="https://semmelweis.hu/en/">Semmelweis University,</a>{' '} | ||
180 | Budapest, Hungary | ||
181 | </i> | ||
182 | </p> | ||
183 | </li> | ||
184 | </ul> | ||
185 | </ResumeSection> | ||
186 | ); | ||
187 | } | ||
188 | |||
189 | function Awards() { | ||
190 | return ( | ||
191 | <ResumeSection> | ||
192 | <Subtitle icon="🏅">Scholarships and awards</Subtitle> | ||
193 | <ul className={styles.cv}> | ||
194 | <li className={styles.cv__item}> | ||
195 | <h4 className={styles.cv__title}> | ||
196 | <a href="https://www.unkp.gov.hu/"> | ||
197 | New National Excellence Programme (<span lang="hu">ÚNKP</span>) | ||
198 | </a> | ||
199 | </h4> | ||
200 | <p className={styles.cv__times}> | ||
201 | <span className={styles.cv__time}>2016 (MSc)</span>{' '} | ||
202 | <span className={styles.cv__time}>2018 (PhD student)</span>{' '} | ||
203 | <span className={styles.cv__time}>2021 (PhD candidate)</span>{' '} | ||
204 | <span className={styles.cv__time}>2023 (postdoc)</span>{' '} | ||
205 | </p> | ||
206 | <p className={styles.cv__muted}> | ||
207 | Awarded by the{' '} | ||
208 | <a href="https://web.archive.org/web/20230531162207/https://nkfih.gov.hu/english/nrdi-fund/new-national-excellence-programme-unkp-23-3/call-for-applications"> | ||
209 | National Research, Development and Innovation Office (NRDI) | ||
210 | </a>{' '} | ||
211 | of Hungary to around 700 recipients per year | ||
212 | </p> | ||
213 | </li> | ||
214 | <li className={styles.cv__item}> | ||
215 | <h4 className={styles.cv__title}> | ||
216 | <a href="https://www.mit.bme.hu/events/2023/11/14/schnell-alapitvany-palyazati-felhivasok-2023"> | ||
217 | 2023 Josef Heim Award | ||
218 | </a> | ||
219 | </h4> | ||
220 | <p className={styles.cv__muted}> | ||
221 | Awarded by the{' '} | ||
222 | <a href="https://www.mit.bme.hu/general/alapitvany"> | ||
223 | László Schell Foundation | ||
224 | </a>{' '} | ||
225 | to 1 member of the{' '} | ||
226 | <i>Department of Measurement and Information Systems</i> per year | ||
227 | for exceptional work in innovation | ||
228 | </p> | ||
229 | </li> | ||
230 | <li className={styles.cv__item}> | ||
231 | <h4 className={styles.cv__title}> | ||
232 | <a href="https://2021.splashcon.org/track/splash-2021-Artifacts#Chairs-Report"> | ||
233 | OOPSLA 2021 Distinguished Artifact Reviewer | ||
234 | </a> | ||
235 | </h4> | ||
236 | </li> | ||
237 | <li className={styles.cv__item}> | ||
238 | <h4 className={styles.cv__title}> | ||
239 | <a href="https://www.mit.bme.hu/node/10575"> | ||
240 | 2020 László Schnell Award | ||
241 | </a> | ||
242 | </h4> | ||
243 | </li> | ||
244 | </ul> | ||
245 | </ResumeSection> | ||
246 | ); | ||
247 | } | ||
248 | |||
249 | function Visits() { | ||
250 | return ( | ||
251 | <ResumeSection> | ||
252 | <Subtitle icon="🏕️">Research visits</Subtitle> | ||
253 | <ul className={styles.cv}> | ||
254 | <li className={styles.cv__item}> | ||
255 | <h4 className={styles.cv__title}>Graduate research trainee</h4> | ||
256 | <p className={styles.cv__times}> | ||
257 | <span className={styles.cv__time}>May–June 2019</span>{' '} | ||
258 | <span className={styles.cv__time}>October 2020</span> | ||
259 | </p> | ||
260 | <p> | ||
261 | <i> | ||
262 | <a href="https://web.archive.org/web/20201124184148/https://www.mcgill.ca/ece/daniel-varro"> | ||
263 | Department of Electrical and Computer Engineering, | ||
264 | </a>{' '} | ||
265 | <a href="https://www.mcgill.ca/">McGill Univeristy,</a>{' '} | ||
266 | </i> | ||
267 | Montreal, Canada | ||
268 | </p> | ||
269 | </li> | ||
270 | <li className={styles.cv__item}> | ||
271 | <h4 className={styles.cv__title}>Visting researcher</h4> | ||
272 | <p className={styles.cv__times}> | ||
273 | <span className={styles.cv__time}>March 2019</span>{' '} | ||
274 | </p> | ||
275 | <p> | ||
276 | <i> | ||
277 | <a href="https://web.archive.org/web/20190430204608/https://people.disim.univaq.it/cortelle/"> | ||
278 | Department of Computer Science and Engineering, and Mathematics, | ||
279 | </a>{' '} | ||
280 | <a href="https://www.univaq.it/en/index.php?&lang_s=en"> | ||
281 | University of L'Aquila, | ||
282 | </a>{' '} | ||
283 | </i> | ||
284 | Italy | ||
285 | </p> | ||
286 | </li> | ||
287 | </ul> | ||
288 | </ResumeSection> | ||
289 | ); | ||
290 | } | ||
291 | |||
292 | function Teaching() { | ||
293 | return ( | ||
294 | <ResumeSection> | ||
295 | <Subtitle icon="👨🏫">Teaching and mentoring</Subtitle> | ||
296 | <ul className={styles.cv}> | ||
297 | <li className={styles.cv__item}> | ||
298 | <h4 className={styles.cv__title}> | ||
299 | Course coordinator of{' '} | ||
300 | <a href="https://portal.vik.bme.hu/kepzes/targyak/VIMIMB11/hu/"> | ||
301 | Critical Systems Laboratory | ||
302 | </a> | ||
303 | </h4> | ||
304 | <p className={styles.cv__times}> | ||
305 | <span className={styles.cv__time}>2024–</span> | ||
306 | </p> | ||
307 | </li> | ||
308 | <li className={styles.cv__item}> | ||
309 | <h4 className={styles.cv__title}>Teaching assistant</h4> | ||
310 | <p className={styles.cv__times}> | ||
311 | <span className={styles.cv__time}>2014–2023</span> | ||
312 | </p> | ||
313 | <ul className={styles.cv__activities}> | ||
314 | <li className={styles.cv__activity}> | ||
315 | Courses at the{' '} | ||
316 | <a href="https://mit.bme.hu"> | ||
317 | Deparment of Measurement and Information Systems | ||
318 | </a>{' '} | ||
319 | and the{' '} | ||
320 | <a href="https://cs.bme.hu"> | ||
321 | Deparment of Computer Science and Information Theory | ||
322 | </a> | ||
323 | </li> | ||
324 | <li className={styles.cv__activity}> | ||
325 | Including practice and lab sessions in the{' '} | ||
326 | <a href="https://imsc.vik.bme.hu/">IMsc programme</a> of BME for | ||
327 | talented BSc students | ||
328 | </li> | ||
329 | </ul> | ||
330 | </li> | ||
331 | <li className={styles.cv__item}> | ||
332 | <h4 className={styles.cv__title}> | ||
333 | Supervised BSc and MSc{' '} | ||
334 | <a href="https://diplomaterv.vik.bme.hu/hu/Supervisors/Marussy-Kristof"> | ||
335 | thesis works | ||
336 | </a> | ||
337 | </h4> | ||
338 | <p className={styles.cv__times}> | ||
339 | <span className={styles.cv__time}>7 × BSc</span>{' '} | ||
340 | <span className={styles.cv__time}>4 × MSc</span>{' '} | ||
341 | <span className={styles.cv__time}> | ||
342 | 1 × MSc{' '} | ||
343 | <a href="https://www.unkp.gov.hu/" lang="hu"> | ||
344 | ÚNKP | ||
345 | </a>{' '} | ||
346 | student research | ||
347 | </span> | ||
348 | </p> | ||
349 | </li> | ||
350 | <li className={styles.cv__item}> | ||
351 | <h4 className={styles.cv__title}> | ||
352 | Supervised{' '} | ||
353 | <a href="https://tdk.bme.hu/Browse/Users/Marussy-Kristof"> | ||
354 | Scientific Students' Association | ||
355 | </a>{' '} | ||
356 | research | ||
357 | </h4> | ||
358 | <p className={styles.cv__times}> | ||
359 | <span className={styles.cv__time}>5 × 🥇</span>{' '} | ||
360 | <span className={styles.cv__time}>4 × 🥈</span>{' '} | ||
361 | <span className={styles.cv__time}>1 × 🥉</span>{' '} | ||
362 | <span className={styles.cv__time}>1 × merit</span> | ||
363 | at university level | ||
364 | </p> | ||
365 | <p className={styles.cv__times}> | ||
366 | <span className={styles.cv__time}>1 × 🥈</span>{' '} | ||
367 | <span className={styles.cv__time}>1 × merit</span> | ||
368 | at national level | ||
369 | </p> | ||
370 | </li> | ||
371 | </ul> | ||
372 | </ResumeSection> | ||
373 | ); | ||
374 | } | ||
375 | |||
376 | function Service() { | ||
377 | return ( | ||
378 | <ResumeSection> | ||
379 | <Subtitle icon="📔">Academic service</Subtitle> | ||
380 | <ul className={styles.cv}> | ||
381 | <li className={styles.cv__item}> | ||
382 | <h4 className={styles.cv__title}>Program Committe member</h4> | ||
383 | <p className={styles.cv__times}> | ||
384 | <span className={styles.cv__time}> | ||
385 | <a href="https://2023.splashcon.org/committee/splash-2023-oopsla-external-review---artifact-evaluation-committee"> | ||
386 | LLM4MDE ’24 | ||
387 | </a> | ||
388 | </span> | ||
389 | </p> | ||
390 | </li> | ||
391 | <li className={styles.cv__item}> | ||
392 | <h4 className={styles.cv__title}>Extended Review Committe member</h4> | ||
393 | <p className={styles.cv__times}> | ||
394 | <span className={styles.cv__time}> | ||
395 | <a href="https://2023.splashcon.org/committee/splash-2023-oopsla-external-review---artifact-evaluation-committee"> | ||
396 | OOPSLA ’23 | ||
397 | </a> | ||
398 | </span>{' '} | ||
399 | <span className={styles.cv__time}> | ||
400 | <a href="https://2023.ecoop.org/committee/ecoop-2023-research-papers-extended-review-committee"> | ||
401 | ECOOP ’23 | ||
402 | </a>{' '} | ||
403 | and{' '} | ||
404 | <a href="https://2022.ecoop.org/committee/ecoop-2022-papers-extended-review-committee-"> | ||
405 | ’22 | ||
406 | </a> | ||
407 | </span> | ||
408 | </p> | ||
409 | </li> | ||
410 | <li className={styles.cv__item}> | ||
411 | <h4 className={styles.cv__title}> | ||
412 | Artifact Evaluation Committe member | ||
413 | </h4> | ||
414 | <p className={styles.cv__times}> | ||
415 | <span className={styles.cv__time}> | ||
416 | <a href="https://2023.splashcon.org/committee/splash-2023-oopsla-external-review---artifact-evaluation-committee"> | ||
417 | OOPSLA ’23 | ||
418 | </a>{' '} | ||
419 | and{' '} | ||
420 | <a href="https://2021.splashcon.org/track/splash-2021-Artifacts"> | ||
421 | ’21 | ||
422 | </a> | ||
423 | </span>{' '} | ||
424 | <span className={styles.cv__time}> | ||
425 | <a href="https://2023.ecoop.org/committee/ecoop-2023-artifact-evaluation-artifact-evaluation-committee"> | ||
426 | ECOOP ’23 | ||
427 | </a>{' '} | ||
428 | and{' '} | ||
429 | <a href="https://2022.ecoop.org/committee/ecoop-2022-artifacts-artifact-evaluation-committee"> | ||
430 | ’22 | ||
431 | </a> | ||
432 | </span>{' '} | ||
433 | <span className={styles.cv__time}> | ||
434 | <a href="https://web.archive.org/web/20230209015023/https://fase-conf.github.io/"> | ||
435 | FASE ’24 | ||
436 | </a>{' '} | ||
437 | and{' '} | ||
438 | <a href="https://web.archive.org/web/20230209015023/https://fase-conf.github.io/"> | ||
439 | ’23 | ||
440 | </a> | ||
441 | </span>{' '} | ||
442 | <span className={styles.cv__time}> | ||
443 | <a href="https://www.etaps.org/user-profile/archive/53-etaps-2022/491-esop-2022-artifact-evaluation.html"> | ||
444 | ESOP ’22 | ||
445 | </a> | ||
446 | </span>{' '} | ||
447 | </p> | ||
448 | </li> | ||
449 | <li className={styles.cv__item}> | ||
450 | <h4 className={styles.cv__title}>Reviewing for journals</h4> | ||
451 | <ul className={styles.cv__activities}> | ||
452 | <li | ||
453 | className={clsx( | ||
454 | styles.cv__activity, | ||
455 | styles['cv__activity--tight'], | ||
456 | )} | ||
457 | > | ||
458 | <a | ||
459 | href="https://www.sciencedirect.com/journal/science-of-computer-programming" | ||
460 | rel="nofollow" | ||
461 | > | ||
462 | Science of Computer Programming | ||
463 | </a> | ||
464 | </li> | ||
465 | <li | ||
466 | className={clsx( | ||
467 | styles.cv__activity, | ||
468 | styles['cv__activity--tight'], | ||
469 | )} | ||
470 | > | ||
471 | <a | ||
472 | href="https://www.sciencedirect.com/journal/journal-of-logical-and-algebraic-methods-in-programming" | ||
473 | rel="nofollow" | ||
474 | > | ||
475 | Journal of Logical and Algebraic Methods in Programming | ||
476 | </a> | ||
477 | </li> | ||
478 | </ul> | ||
479 | </li> | ||
480 | </ul> | ||
481 | </ResumeSection> | ||
482 | ); | ||
483 | } | ||
484 | |||
14 | export default function Resume() { | 485 | export default function Resume() { |
15 | return ( | 486 | return ( |
16 | <Section title="Resume"> | 487 | <Section id="resume" title="Resume"> |
17 | <div className="container"> | 488 | <div className="container"> |
18 | <div className="row"> | 489 | <div className={styles.resume}> |
19 | <div className="col col-6"> | 490 | <Education /> |
20 | <Subtitle icon="🎓">Education</Subtitle> | 491 | <Experience /> |
21 | <ul className={styles.cv}> | 492 | <Awards /> |
22 | <li className={styles.cv__item}> | 493 | <Visits /> |
23 | <h4 className={styles.cv__title}>Doctor of Philosophy (PhD)</h4> | 494 | <Teaching /> |
24 | <p className={styles.cv__times}> | 495 | <Service /> |
25 | <span className={styles.cv__time}>2018–2023</span> | ||
26 | </p> | ||
27 | <p> | ||
28 | <i>Budapest Unversity of Technology and Economics</i> | ||
29 | </p> | ||
30 | <p> | ||
31 | Thesis:{' '} | ||
32 | <a href="/thesis.pdf"> | ||
33 | <b> | ||
34 | Abstraction Techniques for the Analysis and Synthesis of | ||
35 | Critical Cyber-Physical System Architectures | ||
36 | </b> | ||
37 | </a> | ||
38 | </p> | ||
39 | <div className={styles['thesis-links']}> | ||
40 | <a | ||
41 | href="/thesis.pdf" | ||
42 | className={clsx( | ||
43 | 'button', | ||
44 | 'button--primary', | ||
45 | styles['thesis-links__link'], | ||
46 | )} | ||
47 | > | ||
48 | Read now | ||
49 | </a> | ||
50 | <a | ||
51 | href="/thesis-booklet-en.pdf" | ||
52 | className={clsx( | ||
53 | 'button', | ||
54 | 'button--secondary', | ||
55 | styles['thesis-links__link'], | ||
56 | )} | ||
57 | > | ||
58 | Extended abstract | ||
59 | </a> | ||
60 | <a | ||
61 | href="http://hdl.handle.net/10890/41832" | ||
62 | className={styles['thesis-links__link']} | ||
63 | > | ||
64 | Also available via HDL.NET | ||
65 | </a> | ||
66 | </div> | ||
67 | </li> | ||
68 | <li className={styles.cv__item}> | ||
69 | <h4 className={styles.cv__title}>Master of Science (MSc)</h4> | ||
70 | <p className={styles.cv__times}> | ||
71 | <span className={styles.cv__time}>2016–2018</span> | ||
72 | </p> | ||
73 | <p> | ||
74 | <i>Budapest Unversity of Technology and Economics</i> | ||
75 | </p> | ||
76 | </li> | ||
77 | <li className={styles.cv__item}> | ||
78 | <h4 className={styles.cv__title}>Bachleor of Science (BSc)</h4> | ||
79 | <p className={styles.cv__times}> | ||
80 | <span className={styles.cv__time}>2012–2016</span> | ||
81 | </p> | ||
82 | <p> | ||
83 | <i>Budapest Unversity of Technology and Economics</i> | ||
84 | </p> | ||
85 | </li> | ||
86 | </ul> | ||
87 | <Subtitle icon="🏅">Scholarships and awards</Subtitle> | ||
88 | <ul className={styles.cv}> | ||
89 | <li className={styles.cv__item}> | ||
90 | <h4 className={styles.cv__title}> | ||
91 | <a href="https://www.unkp.gov.hu/"> | ||
92 | New National Excellence Programme ( | ||
93 | <span lang="hu">ÚNKP</span>) | ||
94 | </a> | ||
95 | </h4> | ||
96 | <p className={styles.cv__times}> | ||
97 | <span className={styles.cv__time}>2016 (MSc)</span>{' '} | ||
98 | <span className={styles.cv__time}>2018 (PhD student)</span>{' '} | ||
99 | <span className={styles.cv__time}>2021 (PhD candidate)</span>{' '} | ||
100 | <span className={styles.cv__time}>2023 (postdoc)</span>{' '} | ||
101 | </p> | ||
102 | <p className={styles.cv__awarddesc}> | ||
103 | Awarded by the{' '} | ||
104 | <a href="https://web.archive.org/web/20230531162207/https://nkfih.gov.hu/english/nrdi-fund/new-national-excellence-programme-unkp-23-3/call-for-applications"> | ||
105 | National Research, Development and Innovation Office (NRDI) | ||
106 | </a>{' '} | ||
107 | of Hungary to around 700 recipents per year | ||
108 | </p> | ||
109 | </li> | ||
110 | <li className={styles.cv__item}> | ||
111 | <h4 className={styles.cv__title}> | ||
112 | <a href="https://2021.splashcon.org/track/splash-2021-Artifacts#Chairs-Report"> | ||
113 | OOPSLA 2021 Distinguished Artifact Reviewer | ||
114 | </a> | ||
115 | </h4> | ||
116 | </li> | ||
117 | <li className={styles.cv__item}> | ||
118 | <h4 className={styles.cv__title}> | ||
119 | <a href="https://www.mit.bme.hu/node/10575"> | ||
120 | 2020 László Schnell Award | ||
121 | </a> | ||
122 | </h4> | ||
123 | <p className={styles.cv__awarddesc}> | ||
124 | Awarded by the{' '} | ||
125 | <a href="https://www.mit.bme.hu/general/alapitvany"> | ||
126 | László Schell Foundation | ||
127 | </a>{' '} | ||
128 | to 1 member of the{' '} | ||
129 | <i>Department of Measurement and Information Systems</i> per | ||
130 | year for exceptional research work | ||
131 | </p> | ||
132 | </li> | ||
133 | </ul> | ||
134 | <Subtitle icon="👨🏫">Teaching and mentoring</Subtitle> | ||
135 | <ul className={styles.cv}> | ||
136 | <li className={styles.cv__item}> | ||
137 | <h4 className={styles.cv__title}>Teaching assistant</h4> | ||
138 | <p className={styles.cv__times}> | ||
139 | <span className={styles.cv__time}>2014–</span> | ||
140 | </p> | ||
141 | <ul className={styles.cv__activities}> | ||
142 | <li className={styles.cv__activity}> | ||
143 | Courses at the{' '} | ||
144 | <a href="https://mit.bme.hu"> | ||
145 | Deparment of Measurement and Information Systems | ||
146 | </a>{' '} | ||
147 | and the{' '} | ||
148 | <a href="https://cs.bme.hu"> | ||
149 | Deparment of Computer Science and Information Theory | ||
150 | </a> | ||
151 | </li> | ||
152 | <li className={styles.cv__activity}> | ||
153 | Including practice and lab sessions in the{' '} | ||
154 | <a href="https://imsc.vik.bme.hu/">IMsc programme</a> of BME | ||
155 | for talented BSc students | ||
156 | </li> | ||
157 | </ul> | ||
158 | </li> | ||
159 | <li className={styles.cv__item}> | ||
160 | <h4 className={styles.cv__title}> | ||
161 | Supervised BSc and MSc{' '} | ||
162 | <a href="https://diplomaterv.vik.bme.hu/hu/Supervisors/Marussy-Kristof"> | ||
163 | thesis works | ||
164 | </a> | ||
165 | </h4> | ||
166 | <p className={styles.cv__times}> | ||
167 | <span className={styles.cv__time}>7 × BSc</span>{' '} | ||
168 | <span className={styles.cv__time}>4 × MSc</span>{' '} | ||
169 | <span className={styles.cv__time}> | ||
170 | 1 × MSc{' '} | ||
171 | <a href="https://www.unkp.gov.hu/" lang="hu"> | ||
172 | ÚNKP research | ||
173 | </a> | ||
174 | </span> | ||
175 | </p> | ||
176 | </li> | ||
177 | <li className={styles.cv__item}> | ||
178 | <h4 className={styles.cv__title}> | ||
179 | Supervised{' '} | ||
180 | <a href="https://tdk.bme.hu/Browse/Users/Marussy-Kristof"> | ||
181 | Scientific Students' Association | ||
182 | </a>{' '} | ||
183 | research | ||
184 | </h4> | ||
185 | <p className={styles.cv__times}> | ||
186 | <span className={styles.cv__time}>5 × 🥇</span>{' '} | ||
187 | <span className={styles.cv__time}>4 × 🥈</span>{' '} | ||
188 | <span className={styles.cv__time}>1 × 🥉</span>{' '} | ||
189 | <span className={styles.cv__time}>1 × merit</span> | ||
190 | at university level | ||
191 | </p> | ||
192 | <p className={styles.cv__times}> | ||
193 | <span className={styles.cv__time}>1 × 🥈</span>{' '} | ||
194 | <span className={styles.cv__time}>1 × merit</span> | ||
195 | at national level | ||
196 | </p> | ||
197 | </li> | ||
198 | </ul> | ||
199 | </div> | ||
200 | <div className="col col-6"> | ||
201 | <Subtitle icon="👨💼">Professional experience</Subtitle> | ||
202 | <ul className={styles.cv}> | ||
203 | <li className={styles.cv__item}> | ||
204 | <h4 className={styles.cv__title}>Assistant research fellow</h4> | ||
205 | <p className={styles.cv__times}> | ||
206 | <span className={styles.cv__time}>2020–2023</span> | ||
207 | </p> | ||
208 | <p> | ||
209 | <i> | ||
210 | Department of Measurement and Information Systems, Budapest | ||
211 | Unversity of Technology and Economics, Hungary | ||
212 | </i> | ||
213 | </p> | ||
214 | <ul className={styles.cv__activities}> | ||
215 | <li className={styles.cv__activity}> | ||
216 | Performing research and developing tools to address | ||
217 | challanges in the development of critical systems motivated | ||
218 | by case studies and collaborations with industry partners | ||
219 | </li> | ||
220 | <li className={styles.cv__activity}> | ||
221 | Created reliability models for{' '} | ||
222 | <i>distributed railway interlocking systems</i> in a{' '} | ||
223 | <a href="https://projektek.bme.hu/index.php?site=3_0_0&i=28"> | ||
224 | Hungarian national project | ||
225 | </a>{' '} | ||
226 | with <a href="https://www.prolan.hu/">Prolan Zrt.</a> | ||
227 | </li> | ||
228 | <li className={styles.cv__activity}> | ||
229 | Participated in the formal verification of a{' '} | ||
230 | <i>critical automotive subsystem</i> in a{' '} | ||
231 | <a href="https://projektek.bme.hu/index.php?site=3_1_0&i=18"> | ||
232 | Hungarian national project | ||
233 | </a>{' '} | ||
234 | with{' '} | ||
235 | <a href="https://www.thyssenkrupp.hu/en"> | ||
236 | thyssenkrupp Ltd. | ||
237 | </a> | ||
238 | </li> | ||
239 | </ul> | ||
240 | </li> | ||
241 | <li className={styles.cv__item}> | ||
242 | <h4 className={styles.cv__title}>Assistant research fellow</h4> | ||
243 | <p className={styles.cv__times}> | ||
244 | <span className={styles.cv__time}>2018–2019</span> | ||
245 | </p> | ||
246 | <p> | ||
247 | <i> | ||
248 | <a href="https://web.archive.org/web/20200919160859/https://lendulet.inf.mit.bme.hu/"> | ||
249 | MTA-BME <span lang="hu">Lendület</span> Cyber-Physical | ||
250 | Systems Research Group | ||
251 | </a> | ||
252 | </i> | ||
253 | </p> | ||
254 | </li> | ||
255 | <li className={styles.cv__item}> | ||
256 | <h4 className={styles.cv__title}>Research trainee</h4> | ||
257 | <p className={styles.cv__times}> | ||
258 | <span className={styles.cv__time}>2014-2015</span> | ||
259 | </p> | ||
260 | <p> | ||
261 | <i> | ||
262 | <a href="https://web.archive.org/web/20150925191035/http://biointelligence.hu/"> | ||
263 | BioIntelligence Research Group, | ||
264 | </a>{' '} | ||
265 | <a href="https://semmelweis.hu/genomikai-medicina/en/"> | ||
266 | Institute of Genomic Medicine and Rare Disorders, | ||
267 | </a>{' '} | ||
268 | <a href="https://semmelweis.hu/en/"> | ||
269 | Semmelweis University, | ||
270 | </a>{' '} | ||
271 | Budapest, Hungary | ||
272 | </i> | ||
273 | </p> | ||
274 | </li> | ||
275 | </ul> | ||
276 | <Subtitle icon="🏕️">Research visits</Subtitle> | ||
277 | <ul className={styles.cv}> | ||
278 | <li className={styles.cv__item}> | ||
279 | <h4 className={styles.cv__title}>Graduate research trainee</h4> | ||
280 | <p className={styles.cv__times}> | ||
281 | <span className={styles.cv__time}>May–June 2019</span>{' '} | ||
282 | <span className={styles.cv__time}>October 2020</span> | ||
283 | </p> | ||
284 | <p> | ||
285 | <i> | ||
286 | <a href="https://web.archive.org/web/20201124184148/https://www.mcgill.ca/ece/daniel-varro"> | ||
287 | Department of Electrical and Computer Engineering, | ||
288 | </a>{' '} | ||
289 | <a href="https://www.mcgill.ca/">McGill Univeristy,</a>{' '} | ||
290 | </i> | ||
291 | Montreal, Canada | ||
292 | </p> | ||
293 | </li> | ||
294 | <li className={styles.cv__item}> | ||
295 | <h4 className={styles.cv__title}>Visting researcher</h4> | ||
296 | <p className={styles.cv__times}> | ||
297 | <span className={styles.cv__time}>March 2019</span>{' '} | ||
298 | </p> | ||
299 | <p> | ||
300 | <i> | ||
301 | <a href="https://web.archive.org/web/20190430204608/https://people.disim.univaq.it/cortelle/"> | ||
302 | Department of Computer Science and Engineering, and | ||
303 | Mathematics, | ||
304 | </a>{' '} | ||
305 | <a href="https://www.univaq.it/en/index.php?&lang_s=en"> | ||
306 | University of L'Aquila, | ||
307 | </a>{' '} | ||
308 | </i> | ||
309 | Italy | ||
310 | </p> | ||
311 | </li> | ||
312 | </ul> | ||
313 | <Subtitle icon="📔">Academic service</Subtitle> | ||
314 | <ul className={styles.cv}> | ||
315 | <li className={styles.cv__item}> | ||
316 | <h4 className={styles.cv__title}> | ||
317 | Extended Review Committe member | ||
318 | </h4> | ||
319 | <p className={styles.cv__times}> | ||
320 | <span className={styles.cv__time}> | ||
321 | <a href="https://2023.splashcon.org/committee/splash-2023-oopsla-external-review---artifact-evaluation-committee"> | ||
322 | OOPSLA ’23 | ||
323 | </a> | ||
324 | </span>{' '} | ||
325 | <span className={styles.cv__time}> | ||
326 | <a href="https://2023.ecoop.org/committee/ecoop-2023-research-papers-extended-review-committee"> | ||
327 | ECOOP ’23 | ||
328 | </a>{' '} | ||
329 | and{' '} | ||
330 | <a href="https://2022.ecoop.org/committee/ecoop-2022-papers-extended-review-committee-"> | ||
331 | ’22 | ||
332 | </a> | ||
333 | </span> | ||
334 | </p> | ||
335 | </li> | ||
336 | <li className={styles.cv__item}> | ||
337 | <h4 className={styles.cv__title}> | ||
338 | Artifact Evaluation Committe member | ||
339 | </h4> | ||
340 | <p className={styles.cv__times}> | ||
341 | <span className={styles.cv__time}> | ||
342 | <a href="https://2023.splashcon.org/committee/splash-2023-oopsla-external-review---artifact-evaluation-committee"> | ||
343 | OOPSLA ’23 | ||
344 | </a>{' '} | ||
345 | and{' '} | ||
346 | <a href="https://2021.splashcon.org/track/splash-2021-Artifacts"> | ||
347 | ’21 | ||
348 | </a> | ||
349 | </span>{' '} | ||
350 | <span className={styles.cv__time}> | ||
351 | <a href="https://2023.ecoop.org/committee/ecoop-2023-artifact-evaluation-artifact-evaluation-committee"> | ||
352 | ECOOP ’23 | ||
353 | </a>{' '} | ||
354 | and{' '} | ||
355 | <a href="https://2022.ecoop.org/committee/ecoop-2022-artifacts-artifact-evaluation-committee"> | ||
356 | ’22 | ||
357 | </a> | ||
358 | </span>{' '} | ||
359 | <span className={styles.cv__time}> | ||
360 | <a href="https://web.archive.org/web/20230209015023/https://fase-conf.github.io/"> | ||
361 | FASE ’23 | ||
362 | </a> | ||
363 | </span>{' '} | ||
364 | <span className={styles.cv__time}> | ||
365 | <a href="https://www.etaps.org/user-profile/archive/53-etaps-2022/491-esop-2022-artifact-evaluation.html"> | ||
366 | ESOP ’22 | ||
367 | </a> | ||
368 | </span>{' '} | ||
369 | </p> | ||
370 | </li> | ||
371 | <li className={styles.cv__item}> | ||
372 | <h4 className={styles.cv__title}>Reviewing for journals</h4> | ||
373 | <ul className={styles.cv__activities}> | ||
374 | <li | ||
375 | className={clsx( | ||
376 | styles.cv__activity, | ||
377 | styles['cv__activity--tight'], | ||
378 | )} | ||
379 | > | ||
380 | Science of Computer Programming | ||
381 | </li> | ||
382 | <li | ||
383 | className={clsx( | ||
384 | styles.cv__activity, | ||
385 | styles['cv__activity--tight'], | ||
386 | )} | ||
387 | > | ||
388 | Journal of Logical and Algebraic Methods in Programming | ||
389 | </li> | ||
390 | </ul> | ||
391 | </li> | ||
392 | </ul> | ||
393 | </div> | ||
394 | </div> | 496 | </div> |
395 | </div> | 497 | </div> |
396 | </Section> | 498 | </Section> |
diff --git a/src/components/landing/sections/Software.module.css b/src/components/landing/sections/Software.module.css new file mode 100644 index 0000000..1d0db4d --- /dev/null +++ b/src/components/landing/sections/Software.module.css | |||
@@ -0,0 +1,5 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2023 Kristóf Marussy | ||
3 | * | ||
4 | * SPDX-License-Identifier: MIT | ||
5 | */ | ||
diff --git a/src/components/landing/sections/Software.tsx b/src/components/landing/sections/Software.tsx new file mode 100644 index 0000000..8a421b5 --- /dev/null +++ b/src/components/landing/sections/Software.tsx | |||
@@ -0,0 +1,15 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2023 Kristóf Marussy | ||
3 | * | ||
4 | * SPDX-License-Identifier: MIT | ||
5 | */ | ||
6 | |||
7 | import clsx from 'clsx'; | ||
8 | |||
9 | import Section from '@site/src/components/landing/Section'; | ||
10 | |||
11 | import styles from './Software.module.css'; | ||
12 | |||
13 | export default function Software() { | ||
14 | return <Section id="software" title="Software"></Section>; | ||
15 | } | ||
diff --git a/src/pages/index.tsx b/src/pages/index.tsx index b8e986d..1a2b114 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx | |||
@@ -7,20 +7,26 @@ | |||
7 | import Layout from '@theme/Layout'; | 7 | import Layout from '@theme/Layout'; |
8 | 8 | ||
9 | import Hero from '@site/src/components/landing/sections/Hero'; | 9 | import Hero from '@site/src/components/landing/sections/Hero'; |
10 | import Publications from '@site/src/components/landing/sections/Publications'; | ||
11 | import Research from '@site/src/components/landing/sections/Research'; | ||
10 | import Resume from '@site/src/components/landing/sections/Resume'; | 12 | import Resume from '@site/src/components/landing/sections/Resume'; |
13 | import Software from '@site/src/components/landing/sections/Software'; | ||
11 | import Section from '@site/src/components/landing/Section'; | 14 | import Section from '@site/src/components/landing/Section'; |
15 | import TrackActiveSection from '@site/src/components/TrackActiveSection'; | ||
12 | 16 | ||
13 | import avatar from './avatar.jpg'; | 17 | import avatar from './avatar.jpg'; |
14 | 18 | ||
15 | export default function Home() { | 19 | export default function Home() { |
16 | return ( | 20 | return ( |
17 | <Layout> | 21 | <Layout> |
18 | <Hero avatar={avatar} /> | 22 | <TrackActiveSection> |
19 | <Section title="Research" /> | 23 | <Hero avatar={avatar} /> |
20 | <Section title="Publications" /> | 24 | <Research /> |
21 | <Section title="Software" /> | 25 | <Publications /> |
22 | <Resume /> | 26 | <Software /> |
23 | <Section title="Contact" /> | 27 | <Resume /> |
28 | <Section id="contact" title="Contact" /> | ||
29 | </TrackActiveSection> | ||
24 | </Layout> | 30 | </Layout> |
25 | ); | 31 | ); |
26 | } | 32 | } |
diff --git a/src/theme/NavbarItem/NavbarNavLink.jsx b/src/theme/NavbarItem/NavbarNavLink.jsx new file mode 100644 index 0000000..cb151ea --- /dev/null +++ b/src/theme/NavbarItem/NavbarNavLink.jsx | |||
@@ -0,0 +1,88 @@ | |||
1 | /* | ||
2 | * Copyright (c) Facebook, Inc. and its affiliates. | ||
3 | * Copyright (c) 2023 Kristóf Marussy <kristof@marussy.com> | ||
4 | * | ||
5 | * SPDX-License-Identifier: MIT | ||
6 | * | ||
7 | * This file was derived from | ||
8 | * https://github.com/facebook/docusaurus/blob/c745021b01a8b88d34e1d772278d7171ad8acdf5/packages/docusaurus-theme-classic/src/theme/NavbarItem/NavbarNavLink.tsx | ||
9 | * via the `swizzle` mechanism of Docusaurus. | ||
10 | * | ||
11 | * It was modified to correctly track the change of the active anchor | ||
12 | * when `setHash` from `@site/src/components/ActiveSectionProvider` is called. | ||
13 | */ | ||
14 | |||
15 | import React from 'react'; | ||
16 | import Link from '@docusaurus/Link'; | ||
17 | import useBaseUrl from '@docusaurus/useBaseUrl'; | ||
18 | import isInternalUrl from '@docusaurus/isInternalUrl'; | ||
19 | import { isRegexpStringMatch } from '@docusaurus/theme-common'; | ||
20 | import IconExternalLink from '@theme/Icon/ExternalLink'; | ||
21 | import { useActiveSection } from '@site/src/components/ActiveSectionProvider'; | ||
22 | export default function NavbarNavLink({ | ||
23 | activeBasePath, | ||
24 | activeBaseRegex, | ||
25 | to, | ||
26 | href, | ||
27 | label, | ||
28 | html, | ||
29 | isDropdownLink, | ||
30 | prependBaseUrlToHref, | ||
31 | ...props | ||
32 | }) { | ||
33 | const { hash: activeSectionHash } = useActiveSection(); | ||
34 | // TODO all this seems hacky | ||
35 | // {to: 'version'} should probably be forbidden, in favor of {to: '/version'} | ||
36 | const toUrl = useBaseUrl(to); | ||
37 | // Check whether the target URL has a hash. | ||
38 | const hashMatch = toUrl?.match(/#.+$/); | ||
39 | const activeBaseUrl = useBaseUrl(activeBasePath); | ||
40 | const normalizedHref = useBaseUrl(href, { forcePrependBaseUrl: true }); | ||
41 | const isExternalLink = label && href && !isInternalUrl(href); | ||
42 | // Link content is set through html XOR label | ||
43 | const linkContentProps = html | ||
44 | ? { dangerouslySetInnerHTML: { __html: html } } | ||
45 | : { | ||
46 | children: ( | ||
47 | <> | ||
48 | {label} | ||
49 | {isExternalLink && ( | ||
50 | <IconExternalLink | ||
51 | {...(isDropdownLink && { width: 12, height: 12 })} | ||
52 | /> | ||
53 | )} | ||
54 | </> | ||
55 | ), | ||
56 | }; | ||
57 | if (href) { | ||
58 | return ( | ||
59 | <Link | ||
60 | href={prependBaseUrlToHref ? normalizedHref : href} | ||
61 | {...props} | ||
62 | {...linkContentProps} | ||
63 | /> | ||
64 | ); | ||
65 | } | ||
66 | return ( | ||
67 | <Link | ||
68 | to={toUrl} | ||
69 | isNavLink | ||
70 | {...((activeBasePath || activeBaseRegex || hashMatch) && { | ||
71 | isActive: (_match, location) => { | ||
72 | if (activeBaseRegex) { | ||
73 | return isRegexpStringMatch(activeBaseRegex, location.pathname); | ||
74 | } | ||
75 | if (activeBaseUrl) { | ||
76 | return location.pathname.startsWith(activeBaseUrl); | ||
77 | } | ||
78 | // Make sure to only highlight links with a hash when hash also matches. | ||
79 | return ( | ||
80 | !hashMatch || hashMatch[0] === (activeSectionHash ?? location.hash) | ||
81 | ); | ||
82 | }, | ||
83 | })} | ||
84 | {...props} | ||
85 | {...linkContentProps} | ||
86 | /> | ||
87 | ); | ||
88 | } | ||
diff --git a/src/theme/Root.tsx b/src/theme/Root.tsx new file mode 100644 index 0000000..9459e9f --- /dev/null +++ b/src/theme/Root.tsx | |||
@@ -0,0 +1,18 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2023 Kristóf Marussy | ||
3 | * | ||
4 | * SPDX-License-Identifier: MIT | ||
5 | */ | ||
6 | |||
7 | import type { Props } from '@theme/Root'; | ||
8 | import Root from '@theme-original/Root'; | ||
9 | |||
10 | import ActiveSectionProvider from '@site/src/components/ActiveSectionProvider'; | ||
11 | |||
12 | export default function RootWrapper(props: Props) { | ||
13 | return ( | ||
14 | <ActiveSectionProvider> | ||
15 | <Root {...props} /> | ||
16 | </ActiveSectionProvider> | ||
17 | ); | ||
18 | } | ||