diff --git a/dist/404.html b/dist/404.html index 6728013..9af7f16 100644 --- a/dist/404.html +++ b/dist/404.html @@ -33,11 +33,11 @@ Дмитрий Плешевский - - + + -

404

Мы потеряли страницу...
Вернуться на главную
- +

404

Верните страницу!
Вернуться на главную
+ diff --git a/dist/assets/404.html-DhSV0iSI.js b/dist/assets/404.html-Dwh2w4FP.js similarity index 91% rename from dist/assets/404.html-DhSV0iSI.js rename to dist/assets/404.html-Dwh2w4FP.js index 23f1b72..afab415 100644 --- a/dist/assets/404.html-DhSV0iSI.js +++ b/dist/assets/404.html-Dwh2w4FP.js @@ -1 +1 @@ -import{_ as t,c as e,o,a}from"./app-OMtl6IVo.js";const n={},r=a("p",null,"404 Not Found",-1),c=[r];function s(l,p){return o(),e("div",null,c)}const i=t(n,[["render",s],["__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{i as comp,m as data}; +import{_ as t,c as e,o,a}from"./app-CICBSUru.js";const n={},r=a("p",null,"404 Not Found",-1),c=[r];function s(l,p){return o(),e("div",null,c)}const i=t(n,[["render",s],["__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{i as comp,m as data}; diff --git a/dist/assets/app-OMtl6IVo.js b/dist/assets/app-CICBSUru.js similarity index 99% rename from dist/assets/app-OMtl6IVo.js rename to dist/assets/app-CICBSUru.js index 424dc52..5e87973 100644 --- a/dist/assets/app-OMtl6IVo.js +++ b/dist/assets/app-CICBSUru.js @@ -14,7 +14,7 @@ * @vue/runtime-dom v3.4.36 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/const Pu="http://www.w3.org/2000/svg",ku="http://www.w3.org/1998/Math/MathML",vt=typeof document<"u"?document:null,Vs=vt&&vt.createElement("template"),Lu={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?vt.createElementNS(Pu,e):t==="mathml"?vt.createElementNS(ku,e):n?vt.createElement(e,{is:n}):vt.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>vt.createTextNode(e),createComment:e=>vt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>vt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{Vs.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const l=Vs.content;if(r==="svg"||r==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},kt="transition",kn="animation",Un=Symbol("_vtc"),rr=(e,{slots:t})=>ke(gc,Eu(e),t);rr.displayName="Transition";const Al={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};rr.props=$e({},nl,Al);const Wt=(e,t=[])=>{X(e)?e.forEach(n=>n(...t)):e&&e(...t)},js=e=>e?X(e)?e.some(t=>t.length>1):e.length>1:!1;function Eu(e){const t={};for(const R in e)R in Al||(t[R]=e[R]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=s,appearActiveClass:c=i,appearToClass:f=l,leaveFromClass:u=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:g=`${n}-leave-to`}=e,_=xu(o),y=_&&_[0],k=_&&_[1],{onBeforeEnter:A,onEnter:b,onEnterCancelled:m,onLeave:S,onLeaveCancelled:V,onBeforeAppear:O=A,onAppear:K=b,onAppearCancelled:Z=m}=t,j=(R,ee,ve)=>{Ut(R,ee?f:l),Ut(R,ee?c:i),ve&&ve()},L=(R,ee)=>{R._isLeaving=!1,Ut(R,u),Ut(R,g),Ut(R,p),ee&&ee()},U=R=>(ee,ve)=>{const _e=R?K:b,z=()=>j(ee,R,ve);Wt(_e,[ee,z]),Fs(()=>{Ut(ee,R?a:s),Lt(ee,R?f:l),js(_e)||Bs(ee,r,y,z)})};return $e(t,{onBeforeEnter(R){Wt(A,[R]),Lt(R,s),Lt(R,i)},onBeforeAppear(R){Wt(O,[R]),Lt(R,a),Lt(R,c)},onEnter:U(!1),onAppear:U(!0),onLeave(R,ee){R._isLeaving=!0;const ve=()=>L(R,ee);Lt(R,u),Lt(R,p),Ru(),Fs(()=>{R._isLeaving&&(Ut(R,u),Lt(R,g),js(S)||Bs(R,r,k,ve))}),Wt(S,[R,ve])},onEnterCancelled(R){j(R,!1),Wt(m,[R])},onAppearCancelled(R){j(R,!0),Wt(Z,[R])},onLeaveCancelled(R){L(R),Wt(V,[R])}})}function xu(e){if(e==null)return null;if(ye(e))return[so(e.enter),so(e.leave)];{const t=so(e);return[t,t]}}function so(e){return wa(e)}function Lt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Un]||(e[Un]=new Set)).add(t)}function Ut(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Un];n&&(n.delete(t),n.size||(e[Un]=void 0))}function Fs(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Au=0;function Bs(e,t,n,r){const o=e._endId=++Au,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:l,propCount:a}=Tu(e,t);if(!i)return r();const c=i+"end";let f=0;const u=()=>{e.removeEventListener(c,p),s()},p=g=>{g.target===e&&++f>=a&&u()};setTimeout(()=>{f(n[_]||"").split(", "),o=r(`${kt}Delay`),s=r(`${kt}Duration`),i=Ws(o,s),l=r(`${kn}Delay`),a=r(`${kn}Duration`),c=Ws(l,a);let f=null,u=0,p=0;t===kt?i>0&&(f=kt,u=i,p=s.length):t===kn?c>0&&(f=kn,u=c,p=a.length):(u=Math.max(i,c),f=u>0?i>c?kt:kn:null,p=f?f===kt?s.length:a.length:0);const g=f===kt&&/\b(transform|all)(,|$)/.test(r(`${kt}Property`).toString());return{type:f,timeout:u,propCount:p,hasTransform:g}}function Ws(e,t){for(;e.lengthUs(n)+Us(e[r])))}function Us(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Ru(){return document.body.offsetHeight}function Du(e,t,n){const r=e[Un];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Dr=Symbol("_vod"),Tl=Symbol("_vsh"),Or={beforeMount(e,{value:t},{transition:n}){e[Dr]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Ln(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Ln(e,!0),r.enter(e)):r.leave(e,()=>{Ln(e,!1)}):Ln(e,t))},beforeUnmount(e,{value:t}){Ln(e,t)}};function Ln(e,t){e.style.display=t?e[Dr]:"none",e[Tl]=!t}const Ou=Symbol(""),Iu=/(^|;)\s*display\s*:/;function Mu(e,t,n){const r=e.style,o=Te(n);let s=!1;if(n&&!o){if(t)if(Te(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&wr(r,l,"")}else for(const i in t)n[i]==null&&wr(r,i,"");for(const i in n)i==="display"&&(s=!0),wr(r,i,n[i])}else if(o){if(t!==n){const i=r[Ou];i&&(n+=";"+i),r.cssText=n,s=Iu.test(n)}}else t&&e.removeAttribute("style");Dr in e&&(e[Dr]=s?r.display:"",e[Tl]&&(r.display="none"))}const Ks=/\s*!important$/;function wr(e,t,n){if(X(n))n.forEach(r=>wr(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=$u(e,t);Ks.test(n)?e.setProperty(Ht(r),n.replace(Ks,""),"important"):e[r]=n}}const Gs=["Webkit","Moz","ms"],io={};function $u(e,t){const n=io[t];if(n)return n;let r=Ye(t);if(r!=="filter"&&r in e)return io[t]=r;r=Qn(r);for(let o=0;olo||(Bu.then(()=>lo=0),lo=Date.now());function Uu(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;rt(Ku(r,n.value),t,5,[r])};return n.value=e,n.attached=Wu(),n}function Ku(e,t){if(X(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const Ys=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Gu=(e,t,n,r,o,s)=>{const i=o==="svg";t==="class"?Du(e,r,i):t==="style"?Mu(e,n,r):Jn(t)?Oo(t)||ju(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):qu(e,t,r,i))?(Nu(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&zs(e,t,r,i,s,t!=="value")):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),zs(e,t,r,i))};function qu(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Ys(t)&&ne(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Ys(t)&&Te(n)?!1:t in e}const zu={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Ju=(e,t)=>{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=Ht(o.key);if(t.some(i=>i===s||zu[i]===s))return e(o)})},Qu=$e({patchProp:Gu},Lu);let ao,Xs=!1;function Yu(){return ao=Xs?ao:Jc(Qu),Xs=!0,ao}const Xu=(...e)=>{const t=Yu().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=ef(r);if(o)return n(o,!0,Zu(o))},t};function Zu(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function ef(e){return Te(e)?document.querySelector(e):e}var or=e=>/^[a-z][a-z0-9+.-]*:/.test(e)||e.startsWith("//"),tf=/.md((\?|#).*)?$/,nf=(e,t="/")=>or(e)||e.startsWith("/")&&!e.startsWith(t)&&!tf.test(e),Kr=e=>/^(https?:)?\/\//.test(e),Zs=e=>{if(!e||e.endsWith("/"))return e;let t=e.replace(/(^|\/)README.md$/i,"$1index.html");return t.endsWith(".md")?t=t.substring(0,t.length-3)+".html":t.endsWith(".html")||(t=t+".html"),t.endsWith("/index.html")&&(t=t.substring(0,t.length-10)),t},rf="http://.",of=(e,t)=>{if(!e.startsWith("/")&&t){const n=t.slice(0,t.lastIndexOf("/"));return Zs(new URL(`${n}/${e}`,rf).pathname)}return Zs(e)},sf=(e,t)=>{const n=Object.keys(e).sort((r,o)=>{const s=o.split("/").length-r.split("/").length;return s!==0?s:o.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"},lf=/(#|\?)/,Rl=e=>{const[t,...n]=e.split(lf);return{pathname:t,hashAndQueries:n.join("")}},af=["link","meta","script","style","noscript","template"],cf=["title","base"],uf=([e,t,n])=>cf.includes(e)?e:af.includes(e)?e==="meta"&&t.name?`${e}.${t.name}`:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map(([r,o])=>typeof o=="boolean"?o?[r,""]:null:[r,o]).filter(r=>r!=null).sort(([r],[o])=>r.localeCompare(o)),n]):null,ff=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=uf(r);o&&!t.has(o)&&(t.add(o),n.push(r))}),n},df=e=>e[e.length-1]==="/"||e.endsWith(".html")?e:`${e}/`,Dl=e=>e[e.length-1]==="/"?e.slice(0,-1):e,Ol=e=>e[0]==="/"?e.slice(1):e,Yo=e=>Object.prototype.toString.call(e)==="[object Object]",st=e=>typeof e=="string";const hf="modulepreload",pf=function(e){return"/"+e},ei={},En=function(t,n,r){let o=Promise.resolve();return n&&n.length>0&&(document.getElementsByTagName("link"),o=Promise.all(n.map(s=>{if(s=pf(s),s in ei)return;ei[s]=!0;const i=s.endsWith(".css"),l=i?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${s}"]${l}`))return;const a=document.createElement("link");if(a.rel=i?"stylesheet":hf,i||(a.as="script",a.crossOrigin=""),a.href=s,document.head.appendChild(a),i)return new Promise((c,f)=>{a.addEventListener("load",c),a.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${s}`)))})}))),o.then(()=>t()).catch(s=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=s,window.dispatchEvent(i),!i.defaultPrevented)throw s})},gf=JSON.parse("{}"),mf=Object.fromEntries([["/",{loader:()=>En(()=>import("./index.html-DdOSz3i9.js"),__vite__mapDeps([])),meta:{title:"Резюме"}}],["/works.html",{loader:()=>En(()=>import("./works.html-B-M3ZurS.js"),__vite__mapDeps([])),meta:{title:"Работы"}}],["/eng/",{loader:()=>En(()=>import("./index.html-DhiGfEXH.js"),__vite__mapDeps([])),meta:{title:"Resume"}}],["/eng/works.html",{loader:()=>En(()=>import("./works.html-B4GC5YDW.js"),__vite__mapDeps([])),meta:{title:"Works"}}],["/404.html",{loader:()=>En(()=>import("./404.html-DhSV0iSI.js"),__vite__mapDeps([])),meta:{title:""}}]]);/*! +**/const Pu="http://www.w3.org/2000/svg",ku="http://www.w3.org/1998/Math/MathML",vt=typeof document<"u"?document:null,Vs=vt&&vt.createElement("template"),Lu={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?vt.createElementNS(Pu,e):t==="mathml"?vt.createElementNS(ku,e):n?vt.createElement(e,{is:n}):vt.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>vt.createTextNode(e),createComment:e=>vt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>vt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{Vs.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const l=Vs.content;if(r==="svg"||r==="mathml"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},kt="transition",kn="animation",Un=Symbol("_vtc"),rr=(e,{slots:t})=>ke(gc,Eu(e),t);rr.displayName="Transition";const Al={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};rr.props=$e({},nl,Al);const Wt=(e,t=[])=>{X(e)?e.forEach(n=>n(...t)):e&&e(...t)},js=e=>e?X(e)?e.some(t=>t.length>1):e.length>1:!1;function Eu(e){const t={};for(const R in e)R in Al||(t[R]=e[R]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=s,appearActiveClass:c=i,appearToClass:f=l,leaveFromClass:u=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:g=`${n}-leave-to`}=e,_=xu(o),y=_&&_[0],k=_&&_[1],{onBeforeEnter:A,onEnter:b,onEnterCancelled:m,onLeave:S,onLeaveCancelled:V,onBeforeAppear:O=A,onAppear:K=b,onAppearCancelled:Z=m}=t,j=(R,ee,ve)=>{Ut(R,ee?f:l),Ut(R,ee?c:i),ve&&ve()},L=(R,ee)=>{R._isLeaving=!1,Ut(R,u),Ut(R,g),Ut(R,p),ee&&ee()},U=R=>(ee,ve)=>{const _e=R?K:b,z=()=>j(ee,R,ve);Wt(_e,[ee,z]),Fs(()=>{Ut(ee,R?a:s),Lt(ee,R?f:l),js(_e)||Bs(ee,r,y,z)})};return $e(t,{onBeforeEnter(R){Wt(A,[R]),Lt(R,s),Lt(R,i)},onBeforeAppear(R){Wt(O,[R]),Lt(R,a),Lt(R,c)},onEnter:U(!1),onAppear:U(!0),onLeave(R,ee){R._isLeaving=!0;const ve=()=>L(R,ee);Lt(R,u),Lt(R,p),Ru(),Fs(()=>{R._isLeaving&&(Ut(R,u),Lt(R,g),js(S)||Bs(R,r,k,ve))}),Wt(S,[R,ve])},onEnterCancelled(R){j(R,!1),Wt(m,[R])},onAppearCancelled(R){j(R,!0),Wt(Z,[R])},onLeaveCancelled(R){L(R),Wt(V,[R])}})}function xu(e){if(e==null)return null;if(ye(e))return[so(e.enter),so(e.leave)];{const t=so(e);return[t,t]}}function so(e){return wa(e)}function Lt(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Un]||(e[Un]=new Set)).add(t)}function Ut(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Un];n&&(n.delete(t),n.size||(e[Un]=void 0))}function Fs(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Au=0;function Bs(e,t,n,r){const o=e._endId=++Au,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:l,propCount:a}=Tu(e,t);if(!i)return r();const c=i+"end";let f=0;const u=()=>{e.removeEventListener(c,p),s()},p=g=>{g.target===e&&++f>=a&&u()};setTimeout(()=>{f(n[_]||"").split(", "),o=r(`${kt}Delay`),s=r(`${kt}Duration`),i=Ws(o,s),l=r(`${kn}Delay`),a=r(`${kn}Duration`),c=Ws(l,a);let f=null,u=0,p=0;t===kt?i>0&&(f=kt,u=i,p=s.length):t===kn?c>0&&(f=kn,u=c,p=a.length):(u=Math.max(i,c),f=u>0?i>c?kt:kn:null,p=f?f===kt?s.length:a.length:0);const g=f===kt&&/\b(transform|all)(,|$)/.test(r(`${kt}Property`).toString());return{type:f,timeout:u,propCount:p,hasTransform:g}}function Ws(e,t){for(;e.lengthUs(n)+Us(e[r])))}function Us(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Ru(){return document.body.offsetHeight}function Du(e,t,n){const r=e[Un];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Dr=Symbol("_vod"),Tl=Symbol("_vsh"),Or={beforeMount(e,{value:t},{transition:n}){e[Dr]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Ln(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Ln(e,!0),r.enter(e)):r.leave(e,()=>{Ln(e,!1)}):Ln(e,t))},beforeUnmount(e,{value:t}){Ln(e,t)}};function Ln(e,t){e.style.display=t?e[Dr]:"none",e[Tl]=!t}const Ou=Symbol(""),Iu=/(^|;)\s*display\s*:/;function Mu(e,t,n){const r=e.style,o=Te(n);let s=!1;if(n&&!o){if(t)if(Te(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&wr(r,l,"")}else for(const i in t)n[i]==null&&wr(r,i,"");for(const i in n)i==="display"&&(s=!0),wr(r,i,n[i])}else if(o){if(t!==n){const i=r[Ou];i&&(n+=";"+i),r.cssText=n,s=Iu.test(n)}}else t&&e.removeAttribute("style");Dr in e&&(e[Dr]=s?r.display:"",e[Tl]&&(r.display="none"))}const Ks=/\s*!important$/;function wr(e,t,n){if(X(n))n.forEach(r=>wr(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=$u(e,t);Ks.test(n)?e.setProperty(Ht(r),n.replace(Ks,""),"important"):e[r]=n}}const Gs=["Webkit","Moz","ms"],io={};function $u(e,t){const n=io[t];if(n)return n;let r=Ye(t);if(r!=="filter"&&r in e)return io[t]=r;r=Qn(r);for(let o=0;olo||(Bu.then(()=>lo=0),lo=Date.now());function Uu(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;rt(Ku(r,n.value),t,5,[r])};return n.value=e,n.attached=Wu(),n}function Ku(e,t){if(X(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const Ys=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Gu=(e,t,n,r,o,s)=>{const i=o==="svg";t==="class"?Du(e,r,i):t==="style"?Mu(e,n,r):Jn(t)?Oo(t)||ju(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):qu(e,t,r,i))?(Nu(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&zs(e,t,r,i,s,t!=="value")):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),zs(e,t,r,i))};function qu(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Ys(t)&&ne(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Ys(t)&&Te(n)?!1:t in e}const zu={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},Ju=(e,t)=>{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=Ht(o.key);if(t.some(i=>i===s||zu[i]===s))return e(o)})},Qu=$e({patchProp:Gu},Lu);let ao,Xs=!1;function Yu(){return ao=Xs?ao:Jc(Qu),Xs=!0,ao}const Xu=(...e)=>{const t=Yu().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=ef(r);if(o)return n(o,!0,Zu(o))},t};function Zu(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function ef(e){return Te(e)?document.querySelector(e):e}var or=e=>/^[a-z][a-z0-9+.-]*:/.test(e)||e.startsWith("//"),tf=/.md((\?|#).*)?$/,nf=(e,t="/")=>or(e)||e.startsWith("/")&&!e.startsWith(t)&&!tf.test(e),Kr=e=>/^(https?:)?\/\//.test(e),Zs=e=>{if(!e||e.endsWith("/"))return e;let t=e.replace(/(^|\/)README.md$/i,"$1index.html");return t.endsWith(".md")?t=t.substring(0,t.length-3)+".html":t.endsWith(".html")||(t=t+".html"),t.endsWith("/index.html")&&(t=t.substring(0,t.length-10)),t},rf="http://.",of=(e,t)=>{if(!e.startsWith("/")&&t){const n=t.slice(0,t.lastIndexOf("/"));return Zs(new URL(`${n}/${e}`,rf).pathname)}return Zs(e)},sf=(e,t)=>{const n=Object.keys(e).sort((r,o)=>{const s=o.split("/").length-r.split("/").length;return s!==0?s:o.length-r.length});for(const r of n)if(t.startsWith(r))return r;return"/"},lf=/(#|\?)/,Rl=e=>{const[t,...n]=e.split(lf);return{pathname:t,hashAndQueries:n.join("")}},af=["link","meta","script","style","noscript","template"],cf=["title","base"],uf=([e,t,n])=>cf.includes(e)?e:af.includes(e)?e==="meta"&&t.name?`${e}.${t.name}`:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map(([r,o])=>typeof o=="boolean"?o?[r,""]:null:[r,o]).filter(r=>r!=null).sort(([r],[o])=>r.localeCompare(o)),n]):null,ff=e=>{const t=new Set,n=[];return e.forEach(r=>{const o=uf(r);o&&!t.has(o)&&(t.add(o),n.push(r))}),n},df=e=>e[e.length-1]==="/"||e.endsWith(".html")?e:`${e}/`,Dl=e=>e[e.length-1]==="/"?e.slice(0,-1):e,Ol=e=>e[0]==="/"?e.slice(1):e,Yo=e=>Object.prototype.toString.call(e)==="[object Object]",st=e=>typeof e=="string";const hf="modulepreload",pf=function(e){return"/"+e},ei={},En=function(t,n,r){let o=Promise.resolve();return n&&n.length>0&&(document.getElementsByTagName("link"),o=Promise.all(n.map(s=>{if(s=pf(s),s in ei)return;ei[s]=!0;const i=s.endsWith(".css"),l=i?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${s}"]${l}`))return;const a=document.createElement("link");if(a.rel=i?"stylesheet":hf,i||(a.as="script",a.crossOrigin=""),a.href=s,document.head.appendChild(a),i)return new Promise((c,f)=>{a.addEventListener("load",c),a.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${s}`)))})}))),o.then(()=>t()).catch(s=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=s,window.dispatchEvent(i),!i.defaultPrevented)throw s})},gf=JSON.parse("{}"),mf=Object.fromEntries([["/",{loader:()=>En(()=>import("./index.html-CRXC2eW2.js"),__vite__mapDeps([])),meta:{title:"Резюме"}}],["/works.html",{loader:()=>En(()=>import("./works.html-dR21TKIc.js"),__vite__mapDeps([])),meta:{title:"Работы"}}],["/eng/",{loader:()=>En(()=>import("./index.html-D2WI0AD-.js"),__vite__mapDeps([])),meta:{title:"Resume"}}],["/eng/works.html",{loader:()=>En(()=>import("./works.html-ClPWTWbv.js"),__vite__mapDeps([])),meta:{title:"Works"}}],["/404.html",{loader:()=>En(()=>import("./404.html-Dwh2w4FP.js"),__vite__mapDeps([])),meta:{title:""}}]]);/*! * vue-router v4.4.2 * (c) 2024 Eduardo San Martin Morote * @license MIT diff --git a/dist/assets/index.html-DdOSz3i9.js b/dist/assets/index.html-CRXC2eW2.js similarity index 72% rename from dist/assets/index.html-DdOSz3i9.js rename to dist/assets/index.html-CRXC2eW2.js index ffe3e25..42214d1 100644 --- a/dist/assets/index.html-DdOSz3i9.js +++ b/dist/assets/index.html-CRXC2eW2.js @@ -1 +1 @@ -import{_ as i,c as a,a as t,b as e,d as o,w as c,e as n,r,o as d}from"./app-OMtl6IVo.js";const s={},h=n('

Общие сведения

Меня зовут Дмитрий Плешевский.

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

Умения

Языки программирования:

  • 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 проекты - моя страсть! Разрабатываю, поддерживаю и улучшаю проекты в своё свободное время.

Помимо программирования я люблю готовить и проводить время со своей любимой семьей!

Контакты

Telegram: Dmitriy Pleshevskiy

Matrix: @pleshevskiy:matrix.org

Email: dmitriy[at]pleshevski[dot]ru

Ссылки

',29);function p(u,m){const l=r("RouteLink");return d(),a("div",null,[t("p",null,[e("Всегда актуальная ссылка на "),o(l,{to:"/"},{default:c(()=>[e("резюме")]),_:1}),e(".")]),h])}const b=i(s,[["render",p],["__file","index.html.vue"]]),f=JSON.parse('{"path":"/","title":"Резюме","lang":"ru-RU","frontmatter":{"home":true,"title":"Резюме","heroText":null,"head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://pleshevski.ru/eng/"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:title","content":"Резюме"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2024-07-25T12:12:09.000Z"}],["meta",{"property":"article:modified_time","content":"2024-07-25T12:12:09.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Резюме\\"}"]]},"headers":[{"level":2,"title":"Общие сведения","slug":"общие-сведения","link":"#общие-сведения","children":[]},{"level":2,"title":"Умения","slug":"умения","link":"#умения","children":[]},{"level":2,"title":"Stack","slug":"stack","link":"#stack","children":[]},{"level":2,"title":"Интересы","slug":"интересы","link":"#интересы","children":[]},{"level":2,"title":"Контакты","slug":"контакты","link":"#контакты","children":[]},{"level":2,"title":"Ссылки","slug":"ссылки","link":"#ссылки","children":[]}],"git":{"updatedTime":1721909529000,"contributors":[{"name":"Dmitriy Pleshevskiy","email":"dmitriy@pleshevski.ru","commits":3}]},"filePathRelative":"index.md"}');export{b as comp,f as data}; +import{_ as i,c as a,a as t,b as e,d as o,w as c,e as n,r,o as d}from"./app-CICBSUru.js";const s={},h=n('

Общие сведения

Меня зовут Дмитрий Плешевский.

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

Умения

Языки программирования:

  • 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 проекты - моя страсть! Разрабатываю, поддерживаю и улучшаю проекты в своё свободное время.

Помимо программирования я люблю готовить и проводить время со своей любимой семьей!

Контакты

Telegram: Dmitriy Pleshevskiy

Matrix: @pleshevskiy:matrix.org

Email: dmitriy[at]pleshevski[dot]ru

Ссылки

',29);function p(u,m){const l=r("RouteLink");return d(),a("div",null,[t("p",null,[e("Всегда актуальная ссылка на "),o(l,{to:"/"},{default:c(()=>[e("резюме")]),_:1}),e(".")]),h])}const b=i(s,[["render",p],["__file","index.html.vue"]]),f=JSON.parse('{"path":"/","title":"Резюме","lang":"ru-RU","frontmatter":{"home":true,"title":"Резюме","heroText":null,"head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://pleshevski.ru/eng/"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:title","content":"Резюме"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2024-08-07T07:36:38.000Z"}],["meta",{"property":"article:modified_time","content":"2024-08-07T07:36:38.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Резюме\\"}"]]},"headers":[{"level":2,"title":"Общие сведения","slug":"общие-сведения","link":"#общие-сведения","children":[]},{"level":2,"title":"Умения","slug":"умения","link":"#умения","children":[]},{"level":2,"title":"Stack","slug":"stack","link":"#stack","children":[]},{"level":2,"title":"Интересы","slug":"интересы","link":"#интересы","children":[]},{"level":2,"title":"Контакты","slug":"контакты","link":"#контакты","children":[]},{"level":2,"title":"Ссылки","slug":"ссылки","link":"#ссылки","children":[]}],"git":{"updatedTime":1723016198000,"contributors":[{"name":"Dmitriy Pleshevskiy","email":"dmitriy@pleshevski.ru","commits":5}]},"filePathRelative":"index.md"}');export{b as comp,f as data}; diff --git a/dist/assets/index.html-DhiGfEXH.js b/dist/assets/index.html-D2WI0AD-.js similarity index 68% rename from dist/assets/index.html-DhiGfEXH.js rename to dist/assets/index.html-D2WI0AD-.js index 61dcd5b..72bf10a 100644 --- a/dist/assets/index.html-DhiGfEXH.js +++ b/dist/assets/index.html-D2WI0AD-.js @@ -1 +1 @@ -import{_ as l,c as a,a as r,b as e,d as o,w as s,e as t,r as n,o as d}from"./app-OMtl6IVo.js";const c={},p=t('

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

Telegram: Dmitriy Pleshevskiy

Matrix: @pleshevskiy:matrix.org

Email: dmitriy[at]pleshevski[dot]ru

',29);function h(m,u){const i=n("RouteLink");return d(),a("div",null,[r("p",null,[e("Always up-to-date link to "),o(i,{to:"/eng/"},{default:s(()=>[e("resume")]),_:1}),e(".")]),p])}const x=l(c,[["render",h],["__file","index.html.vue"]]),k=JSON.parse('{"path":"/eng/","title":"Resume","lang":"en-US","frontmatter":{"home":true,"title":"Resume","heroText":null,"head":[["link",{"rel":"alternate","hreflang":"ru-ru","href":"https://pleshevski.ru/"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/eng/"}],["meta",{"property":"og:site_name","content":"Dmitriy Pleshevskiy"}],["meta",{"property":"og:title","content":"Resume"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"ru-RU"}],["meta",{"property":"og:updated_time","content":"2024-07-25T12:12:09.000Z"}],["meta",{"property":"article:modified_time","content":"2024-07-25T12:12:09.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Resume\\"}"]]},"headers":[{"level":2,"title":"Overview","slug":"overview","link":"#overview","children":[]},{"level":2,"title":"Skills","slug":"skills","link":"#skills","children":[]},{"level":2,"title":"Stack","slug":"stack","link":"#stack","children":[]},{"level":2,"title":"Interests","slug":"interests","link":"#interests","children":[]},{"level":2,"title":"Contacts","slug":"contacts","link":"#contacts","children":[]},{"level":2,"title":"Links","slug":"links","link":"#links","children":[]}],"git":{"updatedTime":1721909529000,"contributors":[{"name":"Dmitriy Pleshevskiy","email":"dmitriy@pleshevski.ru","commits":3}]},"filePathRelative":"eng/index.md"}');export{x as comp,k as data}; +import{_ as l,c as a,a as r,b as e,d as o,w as s,e as t,r as n,o as d}from"./app-CICBSUru.js";const c={},p=t('

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

Telegram: Dmitriy Pleshevskiy

Matrix: @pleshevskiy:matrix.org

Email: dmitriy[at]pleshevski[dot]ru

',29);function h(m,u){const i=n("RouteLink");return d(),a("div",null,[r("p",null,[e("Always up-to-date link to "),o(i,{to:"/eng/"},{default:s(()=>[e("resume")]),_:1}),e(".")]),p])}const x=l(c,[["render",h],["__file","index.html.vue"]]),k=JSON.parse('{"path":"/eng/","title":"Resume","lang":"en-US","frontmatter":{"home":true,"title":"Resume","heroText":null,"head":[["link",{"rel":"alternate","hreflang":"ru-ru","href":"https://pleshevski.ru/"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/eng/"}],["meta",{"property":"og:site_name","content":"Dmitriy Pleshevskiy"}],["meta",{"property":"og:title","content":"Resume"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"ru-RU"}],["meta",{"property":"og:updated_time","content":"2024-08-07T07:36:38.000Z"}],["meta",{"property":"article:modified_time","content":"2024-08-07T07:36:38.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Resume\\"}"]]},"headers":[{"level":2,"title":"Overview","slug":"overview","link":"#overview","children":[]},{"level":2,"title":"Skills","slug":"skills","link":"#skills","children":[]},{"level":2,"title":"Stack","slug":"stack","link":"#stack","children":[]},{"level":2,"title":"Interests","slug":"interests","link":"#interests","children":[]},{"level":2,"title":"Contacts","slug":"contacts","link":"#contacts","children":[]},{"level":2,"title":"Links","slug":"links","link":"#links","children":[]}],"git":{"updatedTime":1723016198000,"contributors":[{"name":"Dmitriy Pleshevskiy","email":"dmitriy@pleshevski.ru","commits":5}]},"filePathRelative":"eng/index.md"}');export{x as comp,k as data}; diff --git a/dist/assets/works.html-B-M3ZurS.js b/dist/assets/works.html-B-M3ZurS.js deleted file mode 100644 index 86b1c29..0000000 --- a/dist/assets/works.html-B-M3ZurS.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as r,o as t,e as a}from"./app-OMtl6IVo.js";const l={},i=a('

Выделенный опыт работы

Binary Management

  • Даты: Август 2018 – по настоящее время
  • Роли: Lead Fullstack Developer, Team Lead, Architect

Разработка инструмента управления проектами для дизайнеров интерьера

  • Разработка GraphQL API (Node.JS, Apollo, PostgreSQL, Redis, BullMQ). Перенес триггеры базы данных в бизнес-логику. Написал интеграционные тесты на 70% api.
  • Разработка фронтенда (React, Antd). Сформировал uikit и общие компоненты, оптимизировал сложные и нагруженные компоненты. Полностью изменил работу с API на фронтенде. Внедрил практику написания интеграционных тестов с помощью cypress.
  • Полностью перенес проект на TypeScript. Сформировал изолированные модули системы.
  • Как руководитель команды, я привнес в проект метод критической цепи, метод буфера и метод планирования с конца. Помог команде войти в ритм, чтобы выпускать релизы каждую неделю небольшими партиями. Я также несколько раз составлял индивидуальный план развития для членов команды.

Master Progress

  • Даты: Май 2018 - по настоящее время (Пассивная поддержка)
  • Роль: Tech Lead

Разработка веб-инфраструктуры образовательного центра Мастер Прогресс

Core Spirit

  • Даты: Август 2018 - May 2020
  • Роль: Lead Fullstack Developer

Разработка социальной платформы, сфокусированной на улучшении человека и планеты.

  • REST API (Node.JS, Express, 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)

Хронология

В списке перечислены только публичные проекты.

',19),s=[i];function n(o,p){return t(),r("div",null,s)}const h=e(l,[["render",n],["__file","works.html.vue"]]),d=JSON.parse('{"path":"/works.html","title":"Работы","lang":"ru-RU","frontmatter":{"title":"Работы","layout":"WorksPage","sidebar":false,"head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://pleshevski.ru/eng/works.html"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/works.html"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:title","content":"Работы"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2024-07-25T13:59:34.000Z"}],["meta",{"property":"article:modified_time","content":"2024-07-25T13:59:34.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Работы\\"}"]]},"headers":[{"level":2,"title":"Выделенный опыт работы","slug":"выделенныи-опыт-работы","link":"#выделенныи-опыт-работы","children":[]},{"level":2,"title":"Хронология","slug":"хронология","link":"#хронология","children":[]}],"git":{"updatedTime":1721915974000,"contributors":[{"name":"Dmitriy Pleshevskiy","email":"dmitriy@pleshevski.ru","commits":3}]},"filePathRelative":"works.md"}');export{h as comp,d as data}; diff --git a/dist/assets/works.html-B4GC5YDW.js b/dist/assets/works.html-B4GC5YDW.js deleted file mode 100644 index 17019d3..0000000 --- a/dist/assets/works.html-B4GC5YDW.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as t,o as r,e as o}from"./app-OMtl6IVo.js";const a={},i=o('

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

  • Development of the GraphQL API (Node.JS, Apollo, PostgreSQL, Redis, BullMQ). Moved database triggers to business logic. Wrote integration tests on 70% api.
  • Development of the frontend (React, Antd). Formed uikit, shared components, redesigned the page generation gathering. Completely changed work with API on the frontend. Introduced the practice of writing integration tests using cypress
  • Completely ported the project to TypeScript. I have formed isolated modules of the system.
  • As a team leader, I brought the critical chain method, the buffer method, and the planning method to the project from the end. Helped the team get into a rhythm to make releases each week in small batches. A couple of times I also prepared an individual development plan for team members.

Master Progress

  • Dates: May 2018 - currently (Passively maintained)
  • Role: Tech Lead

Development web infrastructure of the educational center Master Progress

Core Spirit

  • Dates: August 2018 - May 2020
  • Role: Lead Fullstack Developer

Development of Social platform focusing on human and planetary enhancement.

  • REST API (Node.JS, Express, PostgreSQL) for main site and backoffice.
  • 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.

',19),n=[i];function l(s,p){return r(),t("div",null,n)}const h=e(a,[["render",l],["__file","works.html.vue"]]),d=JSON.parse('{"path":"/eng/works.html","title":"Works","lang":"en-US","frontmatter":{"title":"Works","layout":"WorksPage","sidebar":false,"head":[["link",{"rel":"alternate","hreflang":"ru-ru","href":"https://pleshevski.ru/works.html"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/eng/works.html"}],["meta",{"property":"og:site_name","content":"Dmitriy Pleshevskiy"}],["meta",{"property":"og:title","content":"Works"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"ru-RU"}],["meta",{"property":"og:updated_time","content":"2024-07-25T12:12:09.000Z"}],["meta",{"property":"article:modified_time","content":"2024-07-25T12:12:09.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Works\\"}"]]},"headers":[{"level":2,"title":"Highlighted working experience","slug":"highlighted-working-experience","link":"#highlighted-working-experience","children":[]},{"level":2,"title":"Chronology","slug":"chronology","link":"#chronology","children":[]}],"git":{"updatedTime":1721909529000,"contributors":[{"name":"Dmitriy Pleshevskiy","email":"dmitriy@pleshevski.ru","commits":2}]},"filePathRelative":"eng/works.md"}');export{h as comp,d as data}; diff --git a/dist/assets/works.html-ClPWTWbv.js b/dist/assets/works.html-ClPWTWbv.js new file mode 100644 index 0000000..778b6e6 --- /dev/null +++ b/dist/assets/works.html-ClPWTWbv.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as r,e as o}from"./app-CICBSUru.js";const a={},i=o('

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 (Python, Flask).
  • Student's cabinet (Python, Flask, TypeScript, React, PostgreSQL).
  • A tool for rosmintrud (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.

',37),n=[i];function l(s,c){return r(),t("div",null,n)}const p=e(a,[["render",l],["__file","works.html.vue"]]),h=JSON.parse('{"path":"/eng/works.html","title":"Works","lang":"en-US","frontmatter":{"title":"Works","layout":"WorksPage","sidebar":false,"head":[["link",{"rel":"alternate","hreflang":"ru-ru","href":"https://pleshevski.ru/works.html"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/eng/works.html"}],["meta",{"property":"og:site_name","content":"Dmitriy Pleshevskiy"}],["meta",{"property":"og:title","content":"Works"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:locale:alternate","content":"ru-RU"}],["meta",{"property":"og:updated_time","content":"2024-08-07T08:48:54.000Z"}],["meta",{"property":"article:modified_time","content":"2024-08-07T08:48:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Works\\"}"]]},"headers":[{"level":2,"title":"Highlighted working experience","slug":"highlighted-working-experience","link":"#highlighted-working-experience","children":[{"level":3,"title":"Binary Management","slug":"binary-management","link":"#binary-management","children":[]},{"level":3,"title":"Core Spirit (Back Office)","slug":"core-spirit-back-office","link":"#core-spirit-back-office","children":[]},{"level":3,"title":"Master Progress","slug":"master-progress","link":"#master-progress","children":[]},{"level":3,"title":"Core Spirit","slug":"core-spirit","link":"#core-spirit","children":[]}]},{"level":2,"title":"Chronology","slug":"chronology","link":"#chronology","children":[]}],"git":{"updatedTime":1723020534000,"contributors":[{"name":"Dmitriy Pleshevskiy","email":"dmitriy@pleshevski.ru","commits":4}]},"filePathRelative":"eng/works.md"}');export{p as comp,h as data}; diff --git a/dist/assets/works.html-dR21TKIc.js b/dist/assets/works.html-dR21TKIc.js new file mode 100644 index 0000000..cf7a95e --- /dev/null +++ b/dist/assets/works.html-dR21TKIc.js @@ -0,0 +1 @@ +import{_ as e,c as r,o as l,e as a}from"./app-CICBSUru.js";const i={},o=a('

Выделенный опыт работы

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

Разработка веб-инфраструктуры образовательного центра Мастер Прогресс.


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)

Хронология

В списке перечислены только публичные проекты.

',37),t=[o];function c(n,s){return l(),r("div",null,t)}const p=e(i,[["render",c],["__file","works.html.vue"]]),h=JSON.parse('{"path":"/works.html","title":"Работы","lang":"ru-RU","frontmatter":{"title":"Работы","layout":"WorksPage","sidebar":false,"head":[["link",{"rel":"alternate","hreflang":"en-us","href":"https://pleshevski.ru/eng/works.html"}],["meta",{"property":"og:url","content":"https://pleshevski.ru/works.html"}],["meta",{"property":"og:site_name","content":"Дмитрий Плешевский"}],["meta",{"property":"og:title","content":"Работы"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"ru-RU"}],["meta",{"property":"og:locale:alternate","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2024-08-07T08:48:54.000Z"}],["meta",{"property":"article:modified_time","content":"2024-08-07T08:48:54.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"Работы\\"}"]]},"headers":[{"level":2,"title":"Выделенный опыт работы","slug":"выделенныи-опыт-работы","link":"#выделенныи-опыт-работы","children":[{"level":3,"title":"Binary Management","slug":"binary-management","link":"#binary-management","children":[]},{"level":3,"title":"Core Spirit (Back Office)","slug":"core-spirit-back-office","link":"#core-spirit-back-office","children":[]},{"level":3,"title":"Master Progress","slug":"master-progress","link":"#master-progress","children":[]},{"level":3,"title":"Core Spirit","slug":"core-spirit","link":"#core-spirit","children":[]},{"level":3,"title":"MERLION","slug":"merlion","link":"#merlion","children":[]}]},{"level":2,"title":"Хронология","slug":"хронология","link":"#хронология","children":[]}],"git":{"updatedTime":1723020534000,"contributors":[{"name":"Dmitriy Pleshevskiy","email":"dmitriy@pleshevski.ru","commits":5}]},"filePathRelative":"works.md"}');export{p as comp,h as data}; diff --git a/dist/eng/index.html b/dist/eng/index.html index e925af0..22c830b 100644 --- a/dist/eng/index.html +++ b/dist/eng/index.html @@ -31,13 +31,13 @@ document.documentElement.dataset.theme = 'dark' } - Resume | Dmitriy Pleshevskiy + Resume | Dmitriy Pleshevskiy - - + + -
- +
+ diff --git a/dist/eng/works.html b/dist/eng/works.html index 521db4c..a314c79 100644 --- a/dist/eng/works.html +++ b/dist/eng/works.html @@ -31,13 +31,13 @@ document.documentElement.dataset.theme = 'dark' } - Works | Dmitriy Pleshevskiy + Works | Dmitriy Pleshevskiy - - + + -
- +
+ diff --git a/dist/index.html b/dist/index.html index e27a53a..245a966 100644 --- a/dist/index.html +++ b/dist/index.html @@ -31,13 +31,13 @@ document.documentElement.dataset.theme = 'dark' } - Резюме | Дмитрий Плешевский + Резюме | Дмитрий Плешевский - - + + -
- +
+ diff --git a/dist/sitemap.xml b/dist/sitemap.xml index a6aa71f..95205c3 100644 --- a/dist/sitemap.xml +++ b/dist/sitemap.xml @@ -1,3 +1,3 @@ -https://pleshevski.ru/2024-07-25T12:12:09.000Zmonthlyhttps://pleshevski.ru/works.html2024-07-25T13:59:34.000Zmonthlyhttps://pleshevski.ru/eng/2024-07-25T12:12:09.000Zmonthlyhttps://pleshevski.ru/eng/works.html2024-07-25T12:12:09.000Zmonthly \ No newline at end of file +https://pleshevski.ru/2024-08-07T07:36:38.000Zmonthlyhttps://pleshevski.ru/works.html2024-08-07T08:48:54.000Zmonthlyhttps://pleshevski.ru/eng/2024-08-07T07:36:38.000Zmonthlyhttps://pleshevski.ru/eng/works.html2024-08-07T08:48:54.000Zmonthly \ No newline at end of file diff --git a/dist/works.html b/dist/works.html index fb83256..7207c88 100644 --- a/dist/works.html +++ b/dist/works.html @@ -31,13 +31,13 @@ document.documentElement.dataset.theme = 'dark' } - Работы | Дмитрий Плешевский + Работы | Дмитрий Плешевский - - + + -
- +
+ diff --git a/docs/eng/works.md b/docs/eng/works.md index 99b6aee..ab2c3d3 100644 --- a/docs/eng/works.md +++ b/docs/eng/works.md @@ -6,53 +6,98 @@ sidebar: false ## Highlighted working experience -#### Binary Management +### Binary Management - Dates: August 2018 – currently - Roles: Lead Fullstack Developer, Team Lead, Architect -Development of a project management tool for interior designers +Development of a Project Management Tool for Interior Designers -- Development of the GraphQL API (Node.JS, Apollo, PostgreSQL, Redis, BullMQ). -Moved database triggers to business logic. Wrote integration tests on 70% api. -- Development of the frontend (React, Antd). Formed uikit, shared components, -redesigned the page generation gathering. Completely changed work with API on -the frontend. Introduced the practice of writing integration tests using -cypress -- Completely ported the project to TypeScript. I have formed isolated modules of -the system. -- As a team leader, I brought the critical chain method, the buffer method, and -the planning method to the project from the end. Helped the team get into a -rhythm to make releases each week in small batches. A couple of times I also -prepared an individual development plan for team members. +##### Backend GraphQL API -#### Master Progress +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). +- [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) -- Created a complete infrastructure on Woodpecker CI and Docker swarm. +(`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 +--- + +### Core Spirit - Dates: August 2018 - May 2020, August 2024 - currently - Role: Lead Fullstack Developer Development of Social platform focusing on human and planetary enhancement. -- REST API (Node.JS, Express, PostgreSQL) for main site and -backoffice. +- 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 @@ -69,6 +114,7 @@ websites (Node.JS, Express) - work with neural networks for matching of goods - development face recognition apps for Android (Java) +--- ## Chronology diff --git a/docs/works.md b/docs/works.md index 8ae6e40..79ee83b 100644 --- a/docs/works.md +++ b/docs/works.md @@ -6,41 +6,84 @@ sidebar: false ## Выделенный опыт работы -#### Binary Management +### Binary Management - Даты: Август 2018 – по настоящее время - Роли: Lead Fullstack Developer, Team Lead, Architect -Разработка инструмента управления проектами для дизайнеров интерьера +Разработка инструмента управления проектами для дизайнеров интерьера. -- Разработка GraphQL API (Node.JS, Apollo, PostgreSQL, Redis, BullMQ). Перенес -триггеры базы данных в бизнес-логику. Написал интеграционные тесты на 70% api. -- Разработка фронтенда (React, Antd). Сформировал uikit и общие компоненты, -оптимизировал сложные и нагруженные компоненты. Полностью изменил работу с API -на фронтенде. Внедрил практику написания интеграционных тестов с помощью -cypress. +##### Backend GraphQL API + +Стек: `Node.JS`, `Apollo`, `PostgreSQL`, `Redis`, `BullMQ` + +- Перенес триггеры базы данных в бизнес-логику. Проще стало читать код, вносить +изменение и система стала надежнее. +- Ввёл практику написания unit тестов и интеграционных тестов. Самолично написал +более 70% тестов всех тестов. +- Добавил GraphQL подписки для динамичного обновления. + +##### Frontend + +Стек: `React`, `Apollo`, `Antd` + +- Сформировал UIKit и общие компоненты, оптимизировал сложные и нагруженные +компоненты. +- Изменил работу с API на фронтенде. +- Внедрил практику написания интеграционных тестов с помощью cypress. - Полностью перенес проект на TypeScript. Сформировал изолированные модули системы. -- Как руководитель команды, я привнес в проект метод критической цепи, метод -буфера и метод планирования с конца. Помог команде войти в ритм, чтобы -выпускать релизы каждую неделю небольшими партиями. Я также несколько раз -составлял индивидуальный план развития для членов команды. -#### Master Progress +##### Руководство командой + +- Ввёл практику 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). +- [Главного сайта](https://masterprogress.ru) (`Python`, `Flask`). +- [Кабинета студента](https://cabinet.masterprogress.ru) (`Python`, `Flask`, +`TypeScript`, `React`, `PostgreSQL`). - [Инструмента для работы с rosmintrud](https://rosmintrud.masterprogress.ru) -(Deno, Vue, Typescript) -- Создана полная инфраструктура на Woodpecker CI и Docker swarm. +(`Deno`, `Vue`, `Typescript`) +- Создана полная инфраструктура на `NixOS`. До этого создал инфраструктуру +используя `Drone CI` / `Woodpecker CI` и `Docker swarm`, которая проработала +более 5 лет. -#### Core Spirit +--- + +### Core Spirit - Даты: Август 2018 - May 2020, Август 2024 - по настоящее время - Роль: Lead Fullstack Developer @@ -48,13 +91,15 @@ TypeScript, React). Разработка социальной платформы, сфокусированной на улучшении человека и планеты. -- REST API (Node.JS, Express, PostgreSQL) для основного сайта и -бэк-офиса. +- REST API (`Node.JS`, `Express`, `PostgreSQL`) для основного сайта и +бэк-офиса. Успел поработать с новой версией REST API на `Go`, `PostgreSQL` - Автопостер в различные социальные сети и мессенджеры (Facebook, LinkedIn, Twitter, Telegram). - Создал нейронную сеть для автоматической категоризации статей. -#### MERLION +--- + +### MERLION - Dates: March 2016 – May 2018 - Role: Senior Fullstack developer @@ -70,6 +115,8 @@ JavaScript) - Работа с нейронными сетями для подбора товаров - Разработка приложений для распознавания лиц для Android (Java) +--- + ## Хронология В списке перечислены только публичные проекты. diff --git a/scripts/pre-commit b/scripts/pre-commit index 18c4e75..90d642e 100755 --- a/scripts/pre-commit +++ b/scripts/pre-commit @@ -5,7 +5,7 @@ set -xe -if [ ! -z $(git diff --cached --name-only | grep "^docs/") ] +if [ ! -z "$(git diff --cached --name-only | grep "^docs/")" ] then make build git add dist