Deploy 2025-02-03
This commit is contained in:
parent
b05bea95c6
commit
012b7386c7
53 changed files with 216 additions and 6428 deletions
.forgejo/workflows
.gitignore404.htmlMakefileassets
404.html-Xq3T-2PH.jsapp-R2Ffa9VO.jsindex.html-7-wjojn8.jsindex.html-DasZnaAo.jsstyle-CynUSZ8x.cssworks.html-D4EgERwy.jsworks.html-DplNc40I.js
dist
docs
.vuepress
eng
index.mdworks.mdeng
flake.lockflake.nixindex.htmlpackage.jsonpnpm-lock.yamlrenovate.jsonrobots.txtrus
scripts
sitemap.xmlsitemap.xsltsconfig.jsonworks.html
|
@ -1,16 +0,0 @@
|
|||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'renovate/*'
|
||||
|
||||
jobs:
|
||||
test-dependencies:
|
||||
runs-on: docker
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: pnpm/action-setup@v4
|
||||
with:
|
||||
run_install: |
|
||||
- recursive: true
|
||||
args: [--frozen-lockfile, --strict-peer-dependencies]
|
||||
- run: pnpm build
|
17
.gitignore
vendored
17
.gitignore
vendored
|
@ -1,17 +0,0 @@
|
|||
# editors
|
||||
.idea/
|
||||
.vscode/
|
||||
*.swp
|
||||
# direnv
|
||||
.direnv
|
||||
.envrc
|
||||
# nodejs
|
||||
node_modules/
|
||||
# nix
|
||||
/result
|
||||
# custom
|
||||
.DS_Store
|
||||
# vuepress
|
||||
/docs/.vuepress/.cache
|
||||
/docs/.vuepress/.temp
|
||||
/docs/.vuepress/dist
|
|
@ -3,7 +3,7 @@
|
|||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||||
<meta name="generator" content="VuePress 2.0.0-rc.18" />
|
||||
<meta name="generator" content="VuePress 2.0.0-rc.19" />
|
||||
<style>
|
||||
:root {
|
||||
--vp-c-bg: #fff;
|
||||
|
@ -32,12 +32,12 @@
|
|||
}
|
||||
</script>
|
||||
<meta property="og:url" content="https://pleshevski.ru/404.html"><meta property="og:site_name" content="Дмитрий Плешевский"><meta property="og:type" content="website"><meta property="og:locale" content="ru-RU"><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","name":""}</script><title>Дмитрий Плешевский</title><meta name="description" content=" ">
|
||||
<link rel="preload" href="/assets/style-CyqMEKOR.css" as="style"><link rel="stylesheet" href="/assets/style-CyqMEKOR.css">
|
||||
<link rel="modulepreload" href="/assets/app-CvTe0YTg.js"><link rel="modulepreload" href="/assets/404.html-BGekuXRq.js">
|
||||
<link rel="prefetch" href="/assets/index.html-D7ve43IL.js" as="script"><link rel="prefetch" href="/assets/works.html-NBBFoiT7.js" as="script"><link rel="prefetch" href="/assets/index.html-B5LWGqHO.js" as="script"><link rel="prefetch" href="/assets/works.html-CihZ59B-.js" as="script">
|
||||
<link rel="preload" href="/assets/style-CynUSZ8x.css" as="style"><link rel="stylesheet" href="/assets/style-CynUSZ8x.css">
|
||||
<link rel="modulepreload" href="/assets/app-R2Ffa9VO.js"><link rel="modulepreload" href="/assets/404.html-Xq3T-2PH.js">
|
||||
<link rel="prefetch" href="/assets/index.html-DasZnaAo.js" as="script"><link rel="prefetch" href="/assets/works.html-DplNc40I.js" as="script"><link rel="prefetch" href="/assets/index.html-7-wjojn8.js" as="script"><link rel="prefetch" href="/assets/works.html-D4EgERwy.js" as="script">
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"><!--[--><div class="vp-theme-container" vp-container data-v-9607bbd4><main class="page" data-v-9607bbd4><div class="theme-default-content" vp-content data-v-9607bbd4><h1 data-v-9607bbd4>404</h1><blockquote data-v-9607bbd4>Ошиблись в параллельной вселенной.</blockquote><a class="route-link" href="/" data-v-9607bbd4>Вернуться на главную</a></div></main></div><!--[--><!----><!--]--><!--]--></div>
|
||||
<script type="module" src="/assets/app-CvTe0YTg.js" defer></script>
|
||||
<div id="app"><!--[--><div class="vp-theme-container" vp-container data-v-f90f3f6a><main class="page" data-v-f90f3f6a><div vp-content data-v-f90f3f6a><h1 data-v-f90f3f6a>404</h1><blockquote data-v-f90f3f6a>Ошиблись в параллельной вселенной.</blockquote><a class="route-link" href="/" data-v-f90f3f6a>Вернуться на главную</a></div></main></div><!--[--><!----><!--]--><!--]--></div>
|
||||
<script type="module" src="/assets/app-R2Ffa9VO.js" defer></script>
|
||||
</body>
|
||||
</html>
|
24
Makefile
24
Makefile
|
@ -1,24 +0,0 @@
|
|||
PREFIX ?= dist
|
||||
|
||||
.PHONY: help
|
||||
help:
|
||||
cat Makefile
|
||||
|
||||
.PHONY: build
|
||||
build:
|
||||
pnpm run build --dest $(PREFIX)
|
||||
|
||||
.PHONY: install
|
||||
install: build
|
||||
|
||||
.PHONY: dev
|
||||
dev:
|
||||
pnpm run dev
|
||||
|
||||
.PHONY: deps
|
||||
deps:
|
||||
pnpm install
|
||||
|
||||
.PHONY: init-git-hooks
|
||||
init-git-hooks:
|
||||
ln -sf $(PWD)/scripts/pre-commit $(PWD)/.git/hooks/pre-commit
|
|
@ -1 +1 @@
|
|||
import{_ as e,c as o,a,o as n}from"./app-CvTe0YTg.js";const r={};function l(p,t){return n(),o("div",null,t[0]||(t[0]=[a("p",null,"404 Not Found",-1)]))}const c=e(r,[["render",l],["__file","404.html.vue"]]),m=JSON.parse('{"path":"/404.html","title":"","lang":"ru-RU","frontmatter":{"layout":"NotFound","head":[["meta",{"property":"og:url","content":"https://pleshevski.ru/404.html"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"\\"}"]]},"headers":[],"git":{},"filePathRelative":null}');export{c as comp,m as data};
|
||||
import{_ as e,c as o,a,o as n}from"./app-R2Ffa9VO.js";const r={};function l(p,t){return n(),o("div",null,t[0]||(t[0]=[a("p",null,"404 Not Found",-1)]))}const c=e(r,[["render",l],["__file","404.html.vue"]]),m=JSON.parse('{"path":"/404.html","title":"","lang":"ru-RU","frontmatter":{"layout":"NotFound","head":[["meta",{"property":"og:url","content":"https://pleshevski.ru/404.html"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"\\"}"]]},"headers":[],"git":{},"filePathRelative":null}');export{c as comp,m as data};
|
31
assets/app-R2Ffa9VO.js
Normal file
31
assets/app-R2Ffa9VO.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
assets/style-CynUSZ8x.css
Normal file
1
assets/style-CynUSZ8x.css
Normal file
File diff suppressed because one or more lines are too long
1
assets/works.html-D4EgERwy.js
Normal file
1
assets/works.html-D4EgERwy.js
Normal file
File diff suppressed because one or more lines are too long
1
assets/works.html-DplNc40I.js
Normal file
1
assets/works.html-DplNc40I.js
Normal file
File diff suppressed because one or more lines are too long
31
dist/assets/app-CvTe0YTg.js
vendored
31
dist/assets/app-CvTe0YTg.js
vendored
File diff suppressed because one or more lines are too long
1
dist/assets/style-CyqMEKOR.css
vendored
1
dist/assets/style-CyqMEKOR.css
vendored
File diff suppressed because one or more lines are too long
1
dist/assets/works.html-CihZ59B-.js
vendored
1
dist/assets/works.html-CihZ59B-.js
vendored
File diff suppressed because one or more lines are too long
1
dist/assets/works.html-NBBFoiT7.js
vendored
1
dist/assets/works.html-NBBFoiT7.js
vendored
File diff suppressed because one or more lines are too long
43
dist/eng/index.html
vendored
43
dist/eng/index.html
vendored
File diff suppressed because one or more lines are too long
43
dist/eng/works.html
vendored
43
dist/eng/works.html
vendored
File diff suppressed because one or more lines are too long
43
dist/index.html
vendored
43
dist/index.html
vendored
File diff suppressed because one or more lines are too long
43
dist/works.html
vendored
43
dist/works.html
vendored
File diff suppressed because one or more lines are too long
|
@ -1,6 +0,0 @@
|
|||
import { defineClientConfig } from "vuepress/client";
|
||||
import WorksPage from "./pages/WorksPage.vue";
|
||||
|
||||
export default defineClientConfig({
|
||||
layouts: { WorksPage },
|
||||
});
|
|
@ -1,98 +0,0 @@
|
|||
import { defineUserConfig } from "vuepress";
|
||||
import { viteBundler } from "@vuepress/bundler-vite";
|
||||
import { mkMyTheme } from "./theme.js";
|
||||
import { redirectPlugin } from "@vuepress/plugin-redirect";
|
||||
|
||||
export default defineUserConfig({
|
||||
lang: "ru-RU",
|
||||
|
||||
title: "Дмитрий Плешевский",
|
||||
description: " ",
|
||||
|
||||
locales: {
|
||||
"/": {
|
||||
lang: "ru-RU",
|
||||
title: "Дмитрий Плешевский",
|
||||
},
|
||||
"/eng/": {
|
||||
lang: "en-US",
|
||||
title: "Dmitriy Pleshevskiy",
|
||||
},
|
||||
},
|
||||
|
||||
theme: mkMyTheme({
|
||||
hostname: "https://pleshevski.ru",
|
||||
|
||||
repo: "https://git.pleshevski.ru/pleshevskiy/pleshevski.ru",
|
||||
|
||||
locales: {
|
||||
"/": {
|
||||
selectLanguageName: "Русский",
|
||||
navbar: ["/", "/works"],
|
||||
notFound: [
|
||||
"Верните страницу!",
|
||||
"Мы потеряли страницу...",
|
||||
"Вы заблокированы в лабиринте.",
|
||||
"Искали кота?",
|
||||
"Страница украдена.",
|
||||
"Ошиблись в параллельной вселенной.",
|
||||
],
|
||||
backToHome: "Вернуться на главную",
|
||||
worksTable: {
|
||||
name: "Название",
|
||||
description: "Описание",
|
||||
role: "Роль",
|
||||
technologies: "Технологии",
|
||||
status: "Статус",
|
||||
dates: "Даты",
|
||||
},
|
||||
},
|
||||
"/eng/": {
|
||||
selectLanguageName: "English",
|
||||
navbar: ["/eng/", "/eng/works"],
|
||||
notFound: [
|
||||
"Return the page!",
|
||||
"We lost a page...",
|
||||
"You're blocked in a labyrinth.",
|
||||
"Looking for a cat?",
|
||||
"The page has been stolen.",
|
||||
"Wrong turn in parallel universe.",
|
||||
],
|
||||
backToHome: "Back to home",
|
||||
worksTable: {
|
||||
name: "Name",
|
||||
description: "Description",
|
||||
role: "Role",
|
||||
technologies: "Technologies",
|
||||
status: "Status",
|
||||
dates: "Dates",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
themePlugins: {
|
||||
seo: {
|
||||
autoDescription: false,
|
||||
isArticle: () => false,
|
||||
},
|
||||
linksCheck: {
|
||||
build: "error",
|
||||
},
|
||||
mediumZoom: false,
|
||||
sitemap: {
|
||||
changefreq: "monthly",
|
||||
},
|
||||
},
|
||||
}),
|
||||
|
||||
plugins: [
|
||||
redirectPlugin({
|
||||
config: {
|
||||
"/rus/": "/",
|
||||
"/rus/works.html": "/works.html",
|
||||
},
|
||||
}),
|
||||
],
|
||||
|
||||
bundler: viteBundler(),
|
||||
});
|
|
@ -1,9 +0,0 @@
|
|||
export type NonEmptyArray<T> = [T, ...T[]];
|
||||
|
||||
export function renderDate(date: Date): string {
|
||||
return date.toLocaleDateString(undefined, {
|
||||
year: "numeric",
|
||||
month: "2-digit",
|
||||
day: "2-digit",
|
||||
});
|
||||
}
|
|
@ -1,73 +0,0 @@
|
|||
<script lang="ts">
|
||||
function date2num(date: Date | undefined): number {
|
||||
return date?.valueOf() ?? Infinity;
|
||||
}
|
||||
|
||||
export default {
|
||||
name: "WorksPage",
|
||||
computed: {
|
||||
tableTheme() {
|
||||
return this.$themeLocale.worksTable ?? {};
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { CHRONOLOGICAL_WORKS } from "../data.ts";
|
||||
import { renderDate } from "../../../global.ts";
|
||||
import { work as w } from "../domain";
|
||||
import { computed } from "vue";
|
||||
|
||||
const works = computed(() =>
|
||||
CHRONOLOGICAL_WORKS.concat().sort(
|
||||
(a, b) =>
|
||||
date2num(b.endDate) - date2num(a.endDate) ||
|
||||
date2num(b.startDate) - date2num(a.startDate),
|
||||
),
|
||||
);
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ tableTheme.name }}</th>
|
||||
<th>{{ tableTheme.description }}</th>
|
||||
<th>{{ tableTheme.role }}</th>
|
||||
<th>{{ tableTheme.technologies }}</th>
|
||||
<th>{{ tableTheme.status }}</th>
|
||||
<th>{{ tableTheme.dates }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="work in works">
|
||||
<td>
|
||||
<a rel="nofollow noopener" :href="w.getExternalLink(work)">
|
||||
{{ work.name }}
|
||||
</a>
|
||||
</td>
|
||||
<td>{{ work.description }}</td>
|
||||
<td v-html="work.roles.join(', ')"></td>
|
||||
<td>{{ work.technologies.join(", ") }}</td>
|
||||
<td>{{ work.status }}</td>
|
||||
<td>
|
||||
<div>
|
||||
<small :class="{ grey: work.endDate }">
|
||||
{{ renderDate(work.startDate) }}
|
||||
</small>
|
||||
</div>
|
||||
<div v-if="work.endDate">
|
||||
<small>{{ renderDate(work.endDate) }}</small>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</template>
|
||||
|
||||
<style lang="css">
|
||||
.grey {
|
||||
color: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
</style>
|
|
@ -1 +0,0 @@
|
|||
export { default as ChronologicalWorksTable } from "./ChronologicalWorksTable.vue";
|
|
@ -1,375 +0,0 @@
|
|||
import { Role } from "./domain/Role.ts";
|
||||
import { Status } from "./domain/Status.ts";
|
||||
import { Technology } from "./domain/Technology.ts";
|
||||
import type { Work } from "./domain/Work.ts";
|
||||
|
||||
export const CHRONOLOGICAL_WORKS: Work[] = [
|
||||
{
|
||||
name: "nixeovim",
|
||||
url: "/pleshevskiy/nixeovim",
|
||||
description: "Configure and build neovim editor using nix",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.Nix],
|
||||
startDate: new Date("2024-04-24"),
|
||||
status: Status.ActiveDeveloped,
|
||||
},
|
||||
{
|
||||
name: "picsg",
|
||||
url: "/pleshevskiy/picsg",
|
||||
description:
|
||||
"A tool for steganographing information in a picture encoded using the Vernam cipher.",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.Haskell],
|
||||
startDate: new Date("2024-04-13"),
|
||||
endDate: new Date("2024-07-25"),
|
||||
status: Status.AsIs,
|
||||
},
|
||||
{
|
||||
name: "Mindustry tools",
|
||||
url: "/pleshevskiy/mindustry-tools",
|
||||
description: "Tools for the Mindustry game",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.Nix, Technology.Godot],
|
||||
startDate: new Date("2024-01-07"),
|
||||
status: Status.PassivelyMaintained,
|
||||
},
|
||||
{
|
||||
name: "Master Progress Rosmintrud tools",
|
||||
url: "https://rosmintrud.masterprogress.ru",
|
||||
description:
|
||||
"Internal service to prepare documents for the rosmintrud (SPA)",
|
||||
roles: [Role.TechLead],
|
||||
technologies: [
|
||||
Technology.Deno,
|
||||
Technology.Sqlite,
|
||||
Technology.TypeScript,
|
||||
Technology.Vue,
|
||||
Technology.Docker,
|
||||
Technology.Woodpecker,
|
||||
Technology.Nix,
|
||||
],
|
||||
startDate: new Date("2023-07-03"),
|
||||
status: Status.PassivelyMaintained,
|
||||
},
|
||||
{
|
||||
name: "yandexgpt_tg_bot",
|
||||
url: "/pleshevskiy/yandexgpt_tg_bot",
|
||||
description: "The Telegram bot to describe article with link by YandexGPT.",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.JavaScript, Technology.NodeJS, Technology.Nix],
|
||||
startDate: new Date("2023-06-27"),
|
||||
endDate: new Date("2024-07-25"),
|
||||
status: Status.AsIs,
|
||||
},
|
||||
{
|
||||
name: "tree-sitter-plpgsql",
|
||||
url: "/pleshevskiy/tree-sitter-plpgsql",
|
||||
description: "plpgsql grammar for tree-sitter",
|
||||
roles: [Role.Author],
|
||||
technologies: [
|
||||
Technology.C,
|
||||
Technology.JavaScript,
|
||||
Technology.TreeSitter,
|
||||
Technology.Nix,
|
||||
],
|
||||
startDate: new Date("2023-01-05"),
|
||||
status: Status.PassivelyMaintained,
|
||||
},
|
||||
{
|
||||
name: "wd2",
|
||||
url: "/pleshevskiy/wd2",
|
||||
description:
|
||||
"A wrapper over d2 which allows to use additional configs from d2 file",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.Bash, Technology.Nix],
|
||||
startDate: new Date("2022-12-12"),
|
||||
endDate: new Date("2023-07-31"),
|
||||
status: Status.AsIs,
|
||||
},
|
||||
{
|
||||
name: "tree-sitter-d2",
|
||||
url: "/pleshevskiy/tree-sitter-d2",
|
||||
description: "d2 grammar for tree-sitter",
|
||||
roles: [Role.Author],
|
||||
technologies: [
|
||||
Technology.C,
|
||||
Technology.JavaScript,
|
||||
Technology.TreeSitter,
|
||||
Technology.Nix,
|
||||
],
|
||||
startDate: new Date("2022-12-04"),
|
||||
status: Status.ActiveDeveloped,
|
||||
},
|
||||
{
|
||||
name: "nix2lua",
|
||||
url: "/mynix/nix2lua",
|
||||
description:
|
||||
"This is a small but functional library that converts your nix configurations into lua format.",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.Nix, Technology.Lua],
|
||||
startDate: new Date("2022-11-22"),
|
||||
status: Status.PassivelyMaintained,
|
||||
},
|
||||
{
|
||||
name: "vnetod",
|
||||
url: "/pleshevskiy/vnetod",
|
||||
description: "Dotenv section switcher",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.Rust],
|
||||
startDate: new Date("2022-07-29"),
|
||||
status: Status.PassivelyMaintained,
|
||||
},
|
||||
{
|
||||
name: "estring",
|
||||
url: "/pleshevskiy/estring",
|
||||
description: "A simple way to parse a string using type annotations.",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.Rust],
|
||||
startDate: new Date("2022-07-23"),
|
||||
endDate: new Date("2024-07-25"),
|
||||
status: Status.AsIs,
|
||||
},
|
||||
{
|
||||
name: "enve",
|
||||
url: "/pleshevskiy/enve",
|
||||
description:
|
||||
"It helps you work with environment variables and convert it to any type using only type annotations",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.Rust],
|
||||
startDate: new Date("2022-07-18"),
|
||||
endDate: new Date("2024-07-25"),
|
||||
status: Status.AsIs,
|
||||
},
|
||||
{
|
||||
name: "docker stack drone plugin",
|
||||
url: "/pleshevskiy/docker_stack",
|
||||
description: "Deploy to production using `docker stack deploy`",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.Docker, Technology.Drone, Technology.Woodpecker],
|
||||
startDate: new Date("2022-06-06"),
|
||||
endDate: new Date("2024-07-25"),
|
||||
status: Status.AsIs,
|
||||
},
|
||||
{
|
||||
name: "dexios",
|
||||
url: "/github/dexios",
|
||||
description:
|
||||
"Dexios is a fast, secure, and open source command-line encryption tool.",
|
||||
roles: [Role.Collaborator],
|
||||
technologies: [Technology.Rust],
|
||||
startDate: new Date("2022-06-01"),
|
||||
endDate: new Date("2023-02-28"),
|
||||
},
|
||||
{
|
||||
name: "recipes",
|
||||
url: "/pleshevskiy/recipes",
|
||||
description: "Site with recipes which cares about privacy",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.TypeScript, Technology.Deno, Technology.Rust],
|
||||
startDate: new Date("2022-05-04"),
|
||||
status: Status.PassivelyMaintained,
|
||||
},
|
||||
{
|
||||
name: "pleshevski.ru",
|
||||
url: "/pleshevskiy/pleshevski.ru",
|
||||
description: "Source code of my personal site",
|
||||
roles: [Role.Author],
|
||||
technologies: [
|
||||
Technology.TypeScript,
|
||||
Technology.Vue,
|
||||
Technology.Vuepress,
|
||||
Technology.Nix,
|
||||
],
|
||||
startDate: new Date("2022-03-16"),
|
||||
status: Status.PassivelyMaintained,
|
||||
},
|
||||
{
|
||||
name: "paren",
|
||||
url: "/pleshevskiy/paren",
|
||||
description: "Library for parsing and rendering information.",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.TypeScript, Technology.Deno],
|
||||
startDate: new Date("2022-03-14"),
|
||||
endDate: new Date("2024-07-25"),
|
||||
status: Status.Experimental,
|
||||
},
|
||||
{
|
||||
name: "hwt",
|
||||
url: "/pleshevskiy/hwt",
|
||||
description:
|
||||
"healthy workaholic timer – A tool that keeps you from breaking your health by working all day.",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.Rust],
|
||||
startDate: new Date("2022-02-04"),
|
||||
endDate: new Date("2024-07-25"),
|
||||
status: Status.AsIs,
|
||||
},
|
||||
{
|
||||
name: "ood_persistence",
|
||||
url: "/pleshevskiy/ood_persistence",
|
||||
description:
|
||||
"Asynchronous and synchronous interfaces and persistence implementations for your OOD architecture ",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.Rust],
|
||||
startDate: new Date("2021-10-12"),
|
||||
endDate: new Date("2021-10-21"),
|
||||
status: Status.Deprecated,
|
||||
},
|
||||
{
|
||||
name: "migra",
|
||||
url: "/pleshevskiy/migra",
|
||||
description: "Simple SQL migration manager for your project.",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.Rust],
|
||||
startDate: new Date("2021-01-31"),
|
||||
endDate: new Date("2022-03-17"),
|
||||
status: Status.AsIs,
|
||||
},
|
||||
{
|
||||
name: "espruino-starter",
|
||||
url: "/pleshevskiy/espruino-starter",
|
||||
description:
|
||||
"Quickly start creating your new project on the espruino board or a board based on it.",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.JavaScript],
|
||||
startDate: new Date("2021-08-23"),
|
||||
status: Status.AsIs,
|
||||
},
|
||||
{
|
||||
name: "react-rest-request",
|
||||
url: "/pleshevskiy/react-rest-request",
|
||||
description: "Minimalistic REST API client for React inspired by Apollo.",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.TypeScript, Technology.React],
|
||||
startDate: new Date("2020-10-04"),
|
||||
endDate: new Date("2023-03-02"),
|
||||
status: Status.Deprecated,
|
||||
},
|
||||
{
|
||||
name: "sonic-channel",
|
||||
url: "/pleshevskiy/sonic-channel",
|
||||
description: "Rust client for sonic search backend.",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.Rust],
|
||||
startDate: new Date("2020-07-18"),
|
||||
status: Status.PassivelyMaintained,
|
||||
},
|
||||
{
|
||||
name: "itconfig",
|
||||
url: "/pleshevskiy/itconfig",
|
||||
description:
|
||||
"Easy build a configs from environment variables and use it in globally.",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.Rust],
|
||||
startDate: new Date("2019-12-22"),
|
||||
endDate: new Date("2022-07-24"),
|
||||
status: Status.Deprecated,
|
||||
},
|
||||
{
|
||||
name: "it-fsm",
|
||||
url: "/pleshevskiy/it-fsm",
|
||||
description: "Simple full-featured finite state machine for your project",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.TypeScript, Technology.NodeJS, Technology.Deno],
|
||||
startDate: new Date("2019-10-11"),
|
||||
status: Status.PassivelyMaintained,
|
||||
},
|
||||
{
|
||||
name: "Cabinet Master Progress",
|
||||
url: "https://cabinet.masterprogress.ru",
|
||||
description:
|
||||
"Student's cabinet of the educational center Master Progress (SSR + SPA)",
|
||||
roles: [Role.TechLead],
|
||||
technologies: [
|
||||
Technology.Python,
|
||||
Technology.Flask,
|
||||
Technology.Postgresql,
|
||||
Technology.TypeScript,
|
||||
Technology.React,
|
||||
Technology.Docker,
|
||||
Technology.Woodpecker,
|
||||
Technology.Nix,
|
||||
],
|
||||
startDate: new Date("2019-09-22"),
|
||||
status: Status.PassivelyMaintained,
|
||||
},
|
||||
{
|
||||
name: "genrss",
|
||||
url: "/pleshevskiy/genrss",
|
||||
description: "RSS generator for python",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.Python],
|
||||
startDate: new Date("2019-07-23"),
|
||||
status: Status.AsIs,
|
||||
},
|
||||
{
|
||||
name: "marshmallow_pageinfo",
|
||||
url: "/pleshevskiy/marshmallow_pageinfo",
|
||||
description: "Page info marshmallow schema for api",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.Python],
|
||||
startDate: new Date("2019-10-05"),
|
||||
endDate: new Date("2023-03-02"),
|
||||
status: Status.AsIs,
|
||||
},
|
||||
{
|
||||
name: "Binary Management",
|
||||
url: "https://www.binarymanagement.com",
|
||||
description: "Project management tool for interior designers",
|
||||
roles: [Role.Developer, Role.TechLead, Role.TeamLead],
|
||||
technologies: [
|
||||
Technology.TypeScript,
|
||||
Technology.NodeJS,
|
||||
Technology.React,
|
||||
Technology.Antd,
|
||||
Technology.Docker,
|
||||
Technology.Drone,
|
||||
Technology.Rust,
|
||||
Technology.Nix,
|
||||
],
|
||||
startDate: new Date("2018-09-15"),
|
||||
status: Status.ActiveDeveloped,
|
||||
},
|
||||
{
|
||||
name: "Core Spirit",
|
||||
url: "https://corespirit.com",
|
||||
description: "Social platform focusing on human and planetary enhancement",
|
||||
roles: [Role.Developer],
|
||||
technologies: [
|
||||
Technology.TypeScript,
|
||||
Technology.NodeJS,
|
||||
Technology.Go,
|
||||
Technology.Python,
|
||||
Technology.React,
|
||||
Technology.Docker,
|
||||
Technology.Drone,
|
||||
],
|
||||
startDate: new Date("2018-09-05"),
|
||||
endDate: new Date("2019-12-31"),
|
||||
},
|
||||
{
|
||||
name: "Master Progress",
|
||||
url: "https://masterprogress.ru",
|
||||
description:
|
||||
"Main website of the educational center Master Progress (SSR + Forms)",
|
||||
roles: [Role.TechLead],
|
||||
technologies: [
|
||||
Technology.Python,
|
||||
Technology.Flask,
|
||||
Technology.JavaScript,
|
||||
Technology.Nix,
|
||||
],
|
||||
startDate: new Date("2018-04-10"),
|
||||
status: Status.PassivelyMaintained,
|
||||
},
|
||||
{
|
||||
name: "ictmpl",
|
||||
url: "/pleshevskiy/ictmpl",
|
||||
description: "Generate projects from templates",
|
||||
roles: [Role.Author],
|
||||
technologies: [Technology.Python],
|
||||
startDate: new Date("2018-06-30"),
|
||||
endDate: new Date("2023-03-02"),
|
||||
status: Status.AsIs,
|
||||
},
|
||||
];
|
|
@ -1,7 +0,0 @@
|
|||
export enum Role {
|
||||
Collaborator = "collaborator",
|
||||
Author = "author",
|
||||
TechLead = "tech lead",
|
||||
TeamLead = "team lead",
|
||||
Developer = "developer",
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
export enum Status {
|
||||
// New features are being added and bugs are being fixed.
|
||||
ActiveDeveloped = "actively-developed",
|
||||
|
||||
// There are no plans for new features, but the maintainer intends to respond
|
||||
// to issues that get filed.
|
||||
PassivelyMaintained = "passively-maintained",
|
||||
|
||||
// The package is feature complete, the maintainer does not intend to continue
|
||||
// working on it or providing support, but it works for the purposes it was
|
||||
// designed for.
|
||||
AsIs = "as-is",
|
||||
|
||||
// The author wants to share it with the community but is not intending to
|
||||
// meet anyone's particular use case.
|
||||
Experimental = "experimental",
|
||||
|
||||
// The current maintainer would like to transfer the package to someone else.
|
||||
LookingForMaintainer = "looking-for-maintainer",
|
||||
|
||||
// The maintainer does not recommend using this package (the description of the
|
||||
// package can describe why, there could be a better solution available or
|
||||
// there could be problems with the package that the author does not want to fix).
|
||||
Deprecated = "deprecated",
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
export enum Technology {
|
||||
C = "C",
|
||||
Go = "Go",
|
||||
JavaScript = "JS",
|
||||
TypeScript = "TS",
|
||||
Rust = "Rust",
|
||||
Python = "Python",
|
||||
Php = "PHP",
|
||||
Deno = "Deno",
|
||||
NodeJS = "NodeJS",
|
||||
Flask = "Flask",
|
||||
React = "React",
|
||||
Antd = "Antd",
|
||||
Postgresql = "PostgreSQL",
|
||||
Docker = "Docker",
|
||||
Drone = "Drone CI",
|
||||
Woodpecker = "Woodpecker CI",
|
||||
Bash = "Bash",
|
||||
TreeSitter = "TreeSitter",
|
||||
Nix = "Nix",
|
||||
Lua = "Lua",
|
||||
Sqlite = "Sqlite",
|
||||
Vue = "Vue",
|
||||
Vuepress = "Vuepress",
|
||||
Godot = "Godot",
|
||||
Haskell = "Haskell",
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
import type { NonEmptyArray } from "../../../global.ts";
|
||||
import { Role } from "./Role.ts";
|
||||
import { Status } from "./Status.ts";
|
||||
import { Technology } from "./Technology.ts";
|
||||
|
||||
export interface Work {
|
||||
name: string;
|
||||
url: string;
|
||||
description: string;
|
||||
roles: NonEmptyArray<Role>;
|
||||
technologies: NonEmptyArray<Technology>;
|
||||
startDate: Date;
|
||||
endDate?: Date;
|
||||
status?: Status;
|
||||
}
|
||||
|
||||
export const getExternalLink: (work: Pick<Work, "url">) => string = (work) =>
|
||||
work.url.startsWith("https://")
|
||||
? work.url
|
||||
: new URL(work.url, "https://git.pleshevski.ru").toString();
|
|
@ -1,5 +0,0 @@
|
|||
export { Role } from "./Role.ts";
|
||||
export { Status } from "./Status.ts";
|
||||
export { Technology } from "./Technology.ts";
|
||||
export type { Work } from "./Work.ts";
|
||||
export * as work from "./Work.ts";
|
|
@ -1 +0,0 @@
|
|||
export * from "./ChronologicalWorksTable";
|
|
@ -1,42 +0,0 @@
|
|||
<script setup>
|
||||
// See: https://github.com/vuejs/vuepress/blob/master/packages/%40vuepress/theme-default/layouts/Layout.vue
|
||||
import ParentLayout from '@vuepress/theme-default/layouts/Layout.vue'
|
||||
import { ChronologicalWorksTable } from "../modules/work";
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<ParentLayout>
|
||||
<template #page-bottom>
|
||||
<div class="works-table-wrapper">
|
||||
<ChronologicalWorksTable />
|
||||
</div>
|
||||
</template>
|
||||
</ParentLayout>
|
||||
</template>
|
||||
|
||||
<style lang="css" scoped>
|
||||
.works-table-wrapper {
|
||||
margin: 0 auto;
|
||||
padding: 0 2rem;
|
||||
max-width: 1224px;
|
||||
box-sizing: border-box
|
||||
}
|
||||
|
||||
.works-table-wrapper :deep(table) {
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style lang="css">
|
||||
:root {
|
||||
--content-width: 960px;
|
||||
}
|
||||
|
||||
.vp-page .theme-default-content {
|
||||
padding-bottom: 0 !important;
|
||||
}
|
||||
|
||||
.vp-page-meta {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
|
@ -1,10 +0,0 @@
|
|||
import { DefaultThemeOptions, defaultTheme } from "@vuepress/theme-default";
|
||||
|
||||
export const mkMyTheme = (options: DefaultThemeOptions) => {
|
||||
// returns a theme object
|
||||
return {
|
||||
name: "my-theme",
|
||||
|
||||
extends: defaultTheme(options),
|
||||
};
|
||||
};
|
|
@ -1,112 +0,0 @@
|
|||
---
|
||||
home: true
|
||||
title: Resume
|
||||
heroText: null
|
||||
---
|
||||
|
||||
Always up-to-date link to [resume](/eng/).
|
||||
|
||||
## Overview
|
||||
|
||||
My name is Dmitriy Pleshevskiy.
|
||||
|
||||
I'm an open source software enthusiast, a lead software developer, architect,
|
||||
team leader and also mentor.
|
||||
|
||||
## Skills
|
||||
|
||||
#### Programming Languages:
|
||||
|
||||
- TypeScript (prefer, solid 9-year exp)
|
||||
- SQL (prefer, solid 8-year exp)
|
||||
- Rust (prefer, solid 5-year exp)
|
||||
- Python (solid 9-year exp)
|
||||
- Haskell
|
||||
- Bash (8-year exp)
|
||||
- Java
|
||||
- C#
|
||||
- C++
|
||||
|
||||
#### Repositories:
|
||||
|
||||
- PostgreSQL (prefer, solid 8-year exp)
|
||||
- MySQL
|
||||
- Sqlite
|
||||
- MsSQL
|
||||
- MongoDB
|
||||
- Reddis
|
||||
- Minio (prefer, solid 5-year exp)
|
||||
|
||||
---
|
||||
|
||||
I also have extensive experience in creating the following applications:
|
||||
|
||||
- Traditional (SSR + Forms)
|
||||
- API (REST/GraphQL/WebSocket/EventSource)
|
||||
- Dynamic (SPA)
|
||||
- Hybrid (SSR + SPA)
|
||||
- Console
|
||||
- Cross-platform
|
||||
|
||||
## Stack
|
||||
|
||||
#### Backend (Rust)
|
||||
|
||||
- `axum` (prefer, solid 2-year exp)
|
||||
- `async-graphql` (prefer, solid 2-year exp)
|
||||
- `shaku` (prefer, solid 2-year exp)
|
||||
- `bb8` + `postgres-types` (prefer, solid 5-year exp)
|
||||
- `diesel` (2-year exp)
|
||||
|
||||
#### Backend (Node.JS)
|
||||
|
||||
- `Apollo` (solid 5-year exp)
|
||||
- `Express` (solid 9-year exp)
|
||||
- `Nest.JS`
|
||||
- `Knex.js` / `Objection.js` (solid 5-year exp)
|
||||
- `Sequelize`
|
||||
|
||||
#### Frontend
|
||||
|
||||
- `React` (solid 8-year exp)
|
||||
- `VueJS` (prefer, solid 3-year exp)
|
||||
- `Cypress` (prefer, solid 3-year exp)
|
||||
- `JQuery`
|
||||
- `Antd` / `Antdv`
|
||||
- `PostCSS` (prefer, solid 5-year exp)
|
||||
- `Sass` (prefer, solid 8-year exp)
|
||||
- `Less` (weak 4-year exp)
|
||||
|
||||
#### DevOps
|
||||
|
||||
- `NixOS` / `NixOps` / `Nix dev shell` (prefer, solid 3-year exp)
|
||||
- `Docker Swarm` (solid 6-year exp)
|
||||
- `Kubernetes` (weak 5-year exp)
|
||||
- `Woodpecker CI` (prefer, solid 4-year exp)
|
||||
- `Drone CI` (solid 3-year exp)
|
||||
- `Gitlab CI` (solid 7-year exp)
|
||||
- `GitHub Actions` (4-year exp)
|
||||
|
||||
## Interests
|
||||
|
||||
Open-source projects are my passion! I develop, maintain and improve projects in
|
||||
my spare time.
|
||||
|
||||
Besides programming, I love to cook and spend time with my beloved family!
|
||||
|
||||
## Contacts
|
||||
|
||||
Simplex (Prefer): [Dmitriy
|
||||
Pleshevskiy](https://simplex.chat/contact#/?v=2-7&smp=smp%3A%2F%2FZKe4uxF4Z_aLJJOEsC-Y6hSkXgQS5-oc442JQGkyP8M%3D%40smp17.simplex.im%2F8JE7lkP68DZG-1DP8U8_njTlIz9fzRzf%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAxdWiN9so1FqPVTsKhS4Y2OK80zzUvsIZ1Yo77kYV6Co%253D%26srv%3Dogtwfxyi3h2h5weftjjpjmxclhb5ugufa5rcyrmg7j4xlch7qsr5nuqd.onion)
|
||||
|
||||
|
||||
Telegram: [Dmitriy Pleshevskiy](https://telegram.me/da_pranaya)
|
||||
|
||||
Matrix: `@pleshevskiy:matrix.org`
|
||||
|
||||
Email: `dmitriy[at]pleshevski[dot]ru`
|
||||
|
||||
## Links
|
||||
|
||||
- [Forgejo](https://git.pleshevski.ru/)
|
||||
- [Github (Suspended)](https://github.com/pleshevskiy)
|
|
@ -1,121 +0,0 @@
|
|||
---
|
||||
title: Works
|
||||
layout: WorksPage
|
||||
sidebar: false
|
||||
---
|
||||
|
||||
## Highlighted working experience
|
||||
|
||||
### Binary Management
|
||||
|
||||
- Dates: August 2018 – currently
|
||||
- Roles: Lead Fullstack Developer, Team Lead, Architect
|
||||
|
||||
Development of a Project Management Tool for Interior Designers
|
||||
|
||||
##### Backend GraphQL API
|
||||
|
||||
Stack: `Node.JS`, `Apollo`, `PostgreSQL`, `Redis`, `BullMQ`
|
||||
|
||||
- Migrated database triggers into business logic. Code became easier to read and
|
||||
maintain, and the system became more reliable.
|
||||
- Introduced unit testing and integration testing practices. I wrote over 70% of
|
||||
all tests myself.
|
||||
- Added GraphQL subscriptions for dynamic updates.
|
||||
|
||||
##### Frontend
|
||||
|
||||
Stack: `React`, `Apollo`, `Antd`
|
||||
|
||||
- Formed a UIKit and general components, optimized complex and loaded
|
||||
components.
|
||||
- Changed API work on the frontend.
|
||||
- Introduced integration testing practice using Cypress.
|
||||
- Migrated the entire project to TypeScript. Created isolated system modules.
|
||||
|
||||
##### Leadership of the Team
|
||||
|
||||
- Introduced TDD (Test-Driven Development) practices.
|
||||
- Brought the "Critical Chain Method", the "Buffer Method", and the "Backward
|
||||
Planning" method into the project. Helped the team get in sync,
|
||||
releasing small batches every week.
|
||||
- Created individual development plans for team members.
|
||||
|
||||
##### Architecture
|
||||
|
||||
- Broke down the entire codebase into modules by feature.
|
||||
- Optimized `PostgreSQL` database, splitting company data into separate schemas
|
||||
and applying partitioning tables.
|
||||
- Added query caching with Redis.
|
||||
- Reduced infrastructure costs by 5 times, migrating the project from Kubernetes
|
||||
to NixOS.
|
||||
|
||||
---
|
||||
|
||||
### Core Spirit (Back Office)
|
||||
|
||||
- Даты: Август 2024 - currently
|
||||
- Роль: Lead Fullstack Developer
|
||||
|
||||
Development of the Back Office for Core Spirit social platform.
|
||||
|
||||
- Integrated `Dependabot`, which helped update all outdated
|
||||
dependencies. Replaced webpack with `vite`.
|
||||
|
||||
---
|
||||
|
||||
### Master Progress
|
||||
|
||||
- Dates: May 2018 - currently (Passively maintained)
|
||||
- Role: Tech Lead
|
||||
|
||||
Development web infrastructure of the educational center Master Progress
|
||||
|
||||
- [The main site](https://masterprogress.ru) (`Python`, `Flask`).
|
||||
- [Student's cabinet](https://cabinet.masterprogress.ru) (`Python`,
|
||||
`Flask`, `TypeScript`, `React`, `PostgreSQL`).
|
||||
- [A tool for rosmintrud](https://rosmintrud.masterprogress.ru)
|
||||
(`Deno`, `Vue`, `Typescript`)
|
||||
- A complete infrastructure was created on `NixOS`. Before that, I had created
|
||||
an infrastructure using `Drone CI` / `Woodpecker CI` and `Docker
|
||||
swarm`, which has been running for over 5 years.
|
||||
|
||||
---
|
||||
|
||||
### Core Spirit
|
||||
|
||||
- Dates: August 2018 - May 2020, August 2024 - currently
|
||||
- Role: Lead Fullstack Developer
|
||||
|
||||
Development of Social platform focusing on human and planetary enhancement.
|
||||
|
||||
- A REST API (using `Node.JS`, `Express`, and `PostgreSQL`) for the main website
|
||||
and back office. I also got to work with a new version of the REST
|
||||
API using `Go` and `PostgreSQL`.
|
||||
- Auto poster to various social networks and messengers
|
||||
(Facebook, LinkedIn, Twitter, Telegram).
|
||||
- Neural network for automatic categorization of articles.
|
||||
|
||||
---
|
||||
|
||||
#### MERLION
|
||||
|
||||
- Dates: March 2016 – May 2018
|
||||
- Role: Senior Fullstack developer
|
||||
|
||||
In this company there were 6 considerable projects I have successfully
|
||||
completed:
|
||||
|
||||
- optimize the creation of promotional pages (PHP, JavaScript)
|
||||
- support main traditional site <https://citilink.ru> (PHP, JavaScript)
|
||||
- development of parsing to monitor products for changes in price,
|
||||
quantity/availability in stock, rating and other fields based on data from 55
|
||||
websites (Node.JS, Express)
|
||||
- work with neural networks for matching of goods
|
||||
- development face recognition apps for Android (Java)
|
||||
|
||||
---
|
||||
|
||||
## Chronology
|
||||
|
||||
Public projects only.
|
113
docs/index.md
113
docs/index.md
|
@ -1,113 +0,0 @@
|
|||
---
|
||||
home: true
|
||||
title: Резюме
|
||||
heroText: null
|
||||
---
|
||||
|
||||
Всегда актуальная ссылка на [резюме](/).
|
||||
|
||||
## Общие сведения
|
||||
|
||||
Меня зовут Дмитрий Плешевский.
|
||||
|
||||
Я энтузиаст программного обеспечения с открытым исходным кодом, ведущий
|
||||
разработчик програмного обеспечения, архитектор, руководитель команды, а так же
|
||||
ментор.
|
||||
|
||||
## Умения
|
||||
|
||||
#### Языки программирования:
|
||||
|
||||
- TypeScript (предпочитаю, твёрдый 9-летний опыт)
|
||||
- SQL (предпочитаю, твёрдый 8-летний опыт)
|
||||
- Rust (предпочитаю, 5-летний опыт)
|
||||
- Python (твёрдый 9-летний опыт)
|
||||
- Haskell
|
||||
- Bash (8-летний опыт)
|
||||
- Java
|
||||
- C#
|
||||
- C++
|
||||
|
||||
#### Хранилища данных:
|
||||
|
||||
- PostgreSQL (предпочитаю, твёрдый 8-летний опыт)
|
||||
- MySQL
|
||||
- Sqlite
|
||||
- MsSQL
|
||||
- MongoDB
|
||||
- Reddis
|
||||
- Minio (предпочитаю, твердый 5-летний опыт)
|
||||
|
||||
---
|
||||
|
||||
Я так же имею большой опыт в создании следующих типов приложений:
|
||||
|
||||
- Традиционные (SSR + Forms)
|
||||
- API (REST/GraphQL/WebSocket/EventSource)
|
||||
- Динамическое (SPA)
|
||||
- Гибридное (SSR + SPA)
|
||||
- Консольные
|
||||
- Кроссплатформенные
|
||||
|
||||
## Stack
|
||||
|
||||
#### Backend (Rust)
|
||||
|
||||
- `axum` (предпочитаю, твёрдый 2-летний опыт)
|
||||
- `async-graphql` (предпочитаю, твёрдый 2-летний опыт)
|
||||
- `shaku` (предпочитаю, твёрдый 2-летний опыт)
|
||||
- `bb8` + `postgres-types` (предпочитаю, твёрдый 5-летний опыт)
|
||||
- `diesel` (2-летний опыт)
|
||||
|
||||
#### Backend (Node.JS)
|
||||
|
||||
- `Apollo` (твёрдый 5-летний опыт)
|
||||
- `Express` (твёрдый 9-летний опыт)
|
||||
- `Nest.JS`
|
||||
- `Knex.js` / `Objection.js` (твёрдый 5-летний опыт)
|
||||
- `Sequelize`
|
||||
|
||||
#### Frontend
|
||||
|
||||
- `React` (твёрдый 8-летний опыт)
|
||||
- `VueJS` (предпочитаю, твёрдый 4-летний опыт)
|
||||
- `Cypress` (предпочитаю, твёрдый 3-летний опыт)
|
||||
- `JQuery`
|
||||
- `Antd` / `Antdv`
|
||||
- `PostCSS` (предпочитаю, твёрдый 5-летний опыт)
|
||||
- `Sass` (предпочитаю, твёрдый 8-летний опыт)
|
||||
- `Less` (слабый 4-летний опыт)
|
||||
|
||||
#### DevOps
|
||||
|
||||
- `NixOS` / `NixOps` / `Nix dev shell` (предпочитаю, твёрдый 3-летний опыт)
|
||||
- `Docker Swarm` (твёрдый 6-летний опыт)
|
||||
- `Kubernetes` (слабый 5-летний опыт)
|
||||
- `Woodpecker CI` (твёрдый 4-летний опыт)
|
||||
- `Drone CI` (твёрдый 3-летний опыт)
|
||||
- `Gitlab CI` (твёрдый 7-летний опыт)
|
||||
- `GitHub Actions` (4-летний опыт)
|
||||
|
||||
## Интересы
|
||||
|
||||
Open-source проекты - моя страсть! Разрабатываю, поддерживаю и улучшаю проекты в
|
||||
своё свободное время.
|
||||
|
||||
Помимо программирования я люблю готовить и проводить время со своей любимой
|
||||
семьей!
|
||||
|
||||
## Контакты
|
||||
|
||||
Simplex (Предпочтительно): [Dmitriy
|
||||
Pleshevskiy](https://simplex.chat/contact#/?v=2-7&smp=smp%3A%2F%2FZKe4uxF4Z_aLJJOEsC-Y6hSkXgQS5-oc442JQGkyP8M%3D%40smp17.simplex.im%2F8JE7lkP68DZG-1DP8U8_njTlIz9fzRzf%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAxdWiN9so1FqPVTsKhS4Y2OK80zzUvsIZ1Yo77kYV6Co%253D%26srv%3Dogtwfxyi3h2h5weftjjpjmxclhb5ugufa5rcyrmg7j4xlch7qsr5nuqd.onion)
|
||||
|
||||
Telegram: [Dmitriy Pleshevskiy](https://telegram.me/da_pranaya)
|
||||
|
||||
Matrix: `@pleshevskiy:matrix.org`
|
||||
|
||||
Email: `dmitriy[at]pleshevski[dot]ru`
|
||||
|
||||
## Ссылки
|
||||
|
||||
- [Forgejo](https://git.pleshevski.ru/)
|
||||
- [Github (Приостановлен)](https://github.com/pleshevskiy)
|
122
docs/works.md
122
docs/works.md
|
@ -1,122 +0,0 @@
|
|||
---
|
||||
title: Работы
|
||||
layout: WorksPage
|
||||
sidebar: false
|
||||
---
|
||||
|
||||
## Выделенный опыт работы
|
||||
|
||||
### Binary Management
|
||||
|
||||
- Даты: Август 2018 – по настоящее время
|
||||
- Роли: Lead Fullstack Developer, Team Lead, Architect
|
||||
|
||||
Разработка инструмента управления проектами для дизайнеров интерьера.
|
||||
|
||||
##### Backend GraphQL API
|
||||
|
||||
Стек: `Node.JS`, `Apollo`, `PostgreSQL`, `Redis`, `BullMQ`
|
||||
|
||||
- Перенес триггеры базы данных в бизнес-логику. Проще стало читать код, вносить
|
||||
изменение и система стала надежнее.
|
||||
- Ввёл практику написания unit тестов и интеграционных тестов. Самолично написал
|
||||
более 70% всех тестов.
|
||||
- Добавил GraphQL подписки для динамичного обновления.
|
||||
|
||||
##### Frontend
|
||||
|
||||
Стек: `React`, `Apollo`, `Antd`
|
||||
|
||||
- Сформировал UIKit и общие компоненты, оптимизировал сложные и нагруженные
|
||||
компоненты.
|
||||
- Изменил работу с API на фронтенде.
|
||||
- Внедрил практику написания интеграционных тестов с помощью cypress.
|
||||
- Полностью перенес проект на TypeScript. Сформировал изолированные модули
|
||||
системы.
|
||||
|
||||
##### Руководство командой
|
||||
|
||||
- Ввёл практику TDD (Test-Driven Development).
|
||||
- Я привнес в проект "метод критической цепи", "метод буфера" и "метод
|
||||
планирования с конца". Помог команде войти в ритм, чтобы выпускать релизы каждую
|
||||
неделю небольшими партиями.
|
||||
- Составлял индивидуальный план развития для членов команды.
|
||||
|
||||
##### Архитектура
|
||||
|
||||
- Разбил всю кодовую базу на модули по фичам.
|
||||
- Ускорил базу данных `PostgreSQL`, разбив данные компаний по отдельным схемам и
|
||||
применив партиципирование таблиц.
|
||||
- Добавил кеширование запросов с `Redis`.
|
||||
- Уменьшил затраты на инфраструткуру в 5 раз, перенес весь проект с kubernetes
|
||||
на `NixOS`.
|
||||
|
||||
---
|
||||
|
||||
### Core Spirit (Back Office)
|
||||
|
||||
- Даты: Август 2024 - по настоящее время
|
||||
- Роль: Lead Fullstack Developer
|
||||
|
||||
Разработка бэк-офиса для социальной платформы Core Spirit.
|
||||
|
||||
- Интегрировал Dependabot, который помог обновить все устаревшие
|
||||
зависимости. Заменил webpack на vite.
|
||||
|
||||
---
|
||||
|
||||
### Master Progress
|
||||
|
||||
- Даты: Май 2018 - по настоящее время (Пассивная поддержка)
|
||||
- Роль: Tech Lead
|
||||
|
||||
Разработка веб-инфраструктуры образовательного центра Мастер Прогресс.
|
||||
|
||||
- [Главного сайта](https://masterprogress.ru) (`Python`, `Flask`).
|
||||
- [Кабинета студента](https://cabinet.masterprogress.ru) (`Python`, `Flask`,
|
||||
`TypeScript`, `React`, `PostgreSQL`).
|
||||
- [Инструмента для работы с rosmintrud](https://rosmintrud.masterprogress.ru)
|
||||
(`Deno`, `Vue`, `Typescript`)
|
||||
- Создана полная инфраструктура на `NixOS`. До этого создал инфраструктуру
|
||||
используя `Drone CI` / `Woodpecker CI` и `Docker swarm`, которая проработала
|
||||
более 5 лет.
|
||||
|
||||
---
|
||||
|
||||
### Core Spirit
|
||||
|
||||
- Даты: Август 2018 - May 2020, Август 2024 - по настоящее время
|
||||
- Роль: Lead Fullstack Developer
|
||||
|
||||
Разработка социальной платформы, сфокусированной на улучшении человека и
|
||||
планеты.
|
||||
|
||||
- REST API (`Node.JS`, `Express`, `PostgreSQL`) для основного сайта и
|
||||
бэк-офиса. Успел поработать с новой версией REST API на `Go`, `PostgreSQL`
|
||||
- Автопостер в различные социальные сети и мессенджеры (Facebook,
|
||||
LinkedIn, Twitter, Telegram).
|
||||
- Создал нейронную сеть для автоматической категоризации статей.
|
||||
|
||||
---
|
||||
|
||||
### MERLION
|
||||
|
||||
- Dates: March 2016 – May 2018
|
||||
- Role: Senior Fullstack developer
|
||||
|
||||
В этой компании было 6 значительных проектов, которые я успешно завершил:
|
||||
|
||||
- Оптимизация создания рекламных страниц (PHP, JavaScript)
|
||||
- Поддержка основного традиционного сайта <https://citilink.ru> (PHP,
|
||||
JavaScript)
|
||||
- Разработка парсинга для мониторинга товаров на предмет изменения цены,
|
||||
количества/наличия на складе, рейтинга и других полей на основе данных с 55+
|
||||
сайтов (Node.js, Express)
|
||||
- Работа с нейронными сетями для подбора товаров
|
||||
- Разработка приложений для распознавания лиц для Android (Java)
|
||||
|
||||
---
|
||||
|
||||
## Хронология
|
||||
|
||||
В списке перечислены только публичные проекты.
|
43
eng/index.html
Normal file
43
eng/index.html
Normal file
File diff suppressed because one or more lines are too long
43
eng/works.html
Normal file
43
eng/works.html
Normal file
File diff suppressed because one or more lines are too long
61
flake.lock
generated
61
flake.lock
generated
|
@ -1,61 +0,0 @@
|
|||
{
|
||||
"nodes": {
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1710146030,
|
||||
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1721562059,
|
||||
"narHash": "sha256-Tybxt65eyOARf285hMHIJ2uul8SULjFZbT9ZaEeUnP8=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "68c9ed8bbed9dfce253cc91560bf9043297ef2fe",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
47
flake.nix
47
flake.nix
|
@ -1,47 +0,0 @@
|
|||
{
|
||||
description = "Pleshevski personal site";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs, flake-utils }:
|
||||
let
|
||||
out = system:
|
||||
let
|
||||
inherit (builtins) substring;
|
||||
|
||||
pkgs = import nixpkgs { inherit system; };
|
||||
version = "0.0.1+${substring 0 8 self.lastModifiedDate}_${self.shortRev or "dirty"}";
|
||||
in
|
||||
{
|
||||
packages.default = with pkgs; stdenv.mkDerivation (finalAttrs: {
|
||||
pname = "pleshevski_site";
|
||||
inherit version;
|
||||
|
||||
src = ./.;
|
||||
|
||||
dontBuild = true;
|
||||
|
||||
installPhase = ''
|
||||
mkdir -p $out
|
||||
cp -r dist/* $out
|
||||
'';
|
||||
});
|
||||
|
||||
devShells.default = pkgs.mkShell {
|
||||
buildInputs = with pkgs; [
|
||||
pre-commit
|
||||
nodejs_22
|
||||
gnumake
|
||||
pnpm
|
||||
nodePackages.typescript-language-server # typescript
|
||||
nodePackages.vscode-langservers-extracted # html, css, json, eslint
|
||||
];
|
||||
};
|
||||
};
|
||||
in
|
||||
flake-utils.lib.eachDefaultSystem out;
|
||||
|
||||
}
|
43
index.html
Normal file
43
index.html
Normal file
File diff suppressed because one or more lines are too long
35
package.json
35
package.json
|
@ -1,35 +0,0 @@
|
|||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "pleshevskiy",
|
||||
"description": "Dmitriy Pleshevskiy",
|
||||
"version": "0.0.1",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"packageManager": "pnpm@9.15.4",
|
||||
"scripts": {
|
||||
"build": "vuepress build docs",
|
||||
"dev": "vuepress dev docs"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@rushstack/eslint-patch": "^1.1.4",
|
||||
"@types/node": "^22.1.0",
|
||||
"@vitejs/plugin-vue": "^5.0.0",
|
||||
"@vue/eslint-config-prettier": "^10.0.0",
|
||||
"@vue/eslint-config-typescript": "^14.0.0",
|
||||
"@vue/language-server": "^2.0.19",
|
||||
"@vue/tsconfig": "^0.7.0",
|
||||
"@vue/typescript-plugin": "^2.0.19",
|
||||
"@vuepress/bundler-vite": "^2.0.0-rc.7",
|
||||
"@vuepress/plugin-blog": "^2.0.0-rc.11",
|
||||
"@vuepress/plugin-redirect": "2.0.0-rc.8",
|
||||
"@vuepress/theme-default": "^2.0.0-rc.11",
|
||||
"eslint": "<10.0.0",
|
||||
"eslint-plugin-vue": "^9.14.1",
|
||||
"prettier": ">=3.0.0",
|
||||
"sass": "^1.79.5",
|
||||
"typescript": "~5.7.0",
|
||||
"vue": "^3.4.0",
|
||||
"vue-tsc": "^2.0.0",
|
||||
"vuepress": "^2.0.0-rc.7"
|
||||
}
|
||||
}
|
4815
pnpm-lock.yaml
generated
4815
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load diff
|
@ -1,6 +0,0 @@
|
|||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"configMigration": true,
|
||||
"extends": ["config:recommended"],
|
||||
"postUpdateOptions": ["pnpmDedupe"]
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
#! /usr/bin/env bash
|
||||
|
||||
# Can be used as a pre-commit hook
|
||||
# Just symlink this file to .git/hooks/pre-commit
|
||||
|
||||
set -xe
|
||||
|
||||
if [ ! -z "$(git diff --cached --name-only | grep "^docs/")" ]
|
||||
then
|
||||
make build
|
||||
git add dist
|
||||
fi
|
||||
|
|
@ -1,3 +1,3 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml-stylesheet type="text/xsl" href="/sitemap.xsl"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://pleshevski.ru/</loc><lastmod>2024-09-05T22:11:51.000Z</lastmod><changefreq>monthly</changefreq><xhtml:link rel="alternate" hreflang="ru-RU" href="https://pleshevski.ru/"/><xhtml:link rel="alternate" hreflang="en-US" href="https://pleshevski.ru/eng/"/></url><url><loc>https://pleshevski.ru/works.html</loc><lastmod>2024-08-07T08:48:54.000Z</lastmod><changefreq>monthly</changefreq><xhtml:link rel="alternate" hreflang="ru-RU" href="https://pleshevski.ru/works.html"/><xhtml:link rel="alternate" hreflang="en-US" href="https://pleshevski.ru/eng/works.html"/></url><url><loc>https://pleshevski.ru/eng/</loc><lastmod>2024-09-05T22:11:51.000Z</lastmod><changefreq>monthly</changefreq><xhtml:link rel="alternate" hreflang="ru-RU" href="https://pleshevski.ru/"/><xhtml:link rel="alternate" hreflang="en-US" href="https://pleshevski.ru/eng/"/></url><url><loc>https://pleshevski.ru/eng/works.html</loc><lastmod>2024-08-07T08:48:54.000Z</lastmod><changefreq>monthly</changefreq><xhtml:link rel="alternate" hreflang="ru-RU" href="https://pleshevski.ru/works.html"/><xhtml:link rel="alternate" hreflang="en-US" href="https://pleshevski.ru/eng/works.html"/></url></urlset>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://pleshevski.ru/</loc><lastmod>2024-09-05T22:11:51.000Z</lastmod><changefreq>monthly</changefreq><xhtml:link rel="alternate" hreflang="ru-RU" href="https://pleshevski.ru/"/><xhtml:link rel="alternate" hreflang="en-US" href="https://pleshevski.ru/eng/"/></url><url><loc>https://pleshevski.ru/works.html</loc><lastmod>2024-10-15T14:10:49.000Z</lastmod><changefreq>monthly</changefreq><xhtml:link rel="alternate" hreflang="ru-RU" href="https://pleshevski.ru/works.html"/><xhtml:link rel="alternate" hreflang="en-US" href="https://pleshevski.ru/eng/works.html"/></url><url><loc>https://pleshevski.ru/eng/</loc><lastmod>2024-09-05T22:11:51.000Z</lastmod><changefreq>monthly</changefreq><xhtml:link rel="alternate" hreflang="ru-RU" href="https://pleshevski.ru/"/><xhtml:link rel="alternate" hreflang="en-US" href="https://pleshevski.ru/eng/"/></url><url><loc>https://pleshevski.ru/eng/works.html</loc><lastmod>2024-08-07T08:48:54.000Z</lastmod><changefreq>monthly</changefreq><xhtml:link rel="alternate" hreflang="ru-RU" href="https://pleshevski.ru/works.html"/><xhtml:link rel="alternate" hreflang="en-US" href="https://pleshevski.ru/eng/works.html"/></url></urlset>
|
|
@ -1,11 +0,0 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"composite": true,
|
||||
"paths": {
|
||||
"@/*": ["./docs/*"]
|
||||
}
|
||||
},
|
||||
"extends": "@vue/tsconfig/tsconfig.dom.json",
|
||||
"include": ["env.d.ts", "docs/**/*", "docs/**/*.vue"]
|
||||
}
|
43
works.html
Normal file
43
works.html
Normal file
File diff suppressed because one or more lines are too long
Loading…
Add table
Reference in a new issue