add content and change project layout
9
.pugrc.js
Normal file
|
@ -0,0 +1,9 @@
|
|||
module.exports = {
|
||||
"pretty": true,
|
||||
"basedir": ".",
|
||||
// "debug": true,
|
||||
// "compileDebug": true,
|
||||
"locals": {
|
||||
"require": require
|
||||
}
|
||||
}
|
37
README.md
Normal file
|
@ -0,0 +1,37 @@
|
|||
# intro
|
||||
|
||||
this is a manpage-like html template, but tbh it's not really a manpage
|
||||
|
||||
created with [pug][pug] and [sass][sass], build with [parcel][parcel].
|
||||
|
||||
## setup
|
||||
|
||||
```bash
|
||||
# install dependencies
|
||||
$ yarn install
|
||||
# build the output
|
||||
$ yarn build
|
||||
# build results are here
|
||||
$ ls dist
|
||||
```
|
||||
|
||||
## contents
|
||||
|
||||
`/index.pug`: the starting point of the template.
|
||||
|
||||
`/vars.pug`: sample variables. copy it to `/vars.local.pug` and edit it.
|
||||
|
||||
`/includes`: template parts are located here.
|
||||
|
||||
- `include /somefile` from anywhere will look for `somefile` in project root
|
||||
- `include somefile` will be relative to current pug file.
|
||||
|
||||
`/assets`: css/sass, scripts, images etc are located here.
|
||||
|
||||
`/assets/styles/index.sass`: the starting point of the sass template.
|
||||
|
||||
---
|
||||
|
||||
[pug]: https://pugjs.org
|
||||
[sass]: https://sass-lang.com
|
||||
[parcel]: https://parceljs.org
|
BIN
assets/images/android-chrome-192x192.png
Normal file
After Width: | Height: | Size: 5.0 KiB |
BIN
assets/images/android-chrome-512x512.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
assets/images/apple-touch-icon.png
Normal file
After Width: | Height: | Size: 4.4 KiB |
BIN
assets/images/favicon-16x16.png
Normal file
After Width: | Height: | Size: 390 B |
BIN
assets/images/favicon-32x32.png
Normal file
After Width: | Height: | Size: 781 B |
BIN
assets/images/favicon.ico
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
assets/images/opengraph.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
assets/media/spell.mp3
Normal file
BIN
assets/media/spell.ogg
Normal file
BIN
assets/media/spell.wav
Normal file
51
assets/pubkey.asc
Normal file
|
@ -0,0 +1,51 @@
|
|||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
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
|
||||
=98Kc
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
1
assets/site.webmanifest
Normal file
|
@ -0,0 +1 @@
|
|||
{"name":"","short_name":"","icons":[{"src":"./images/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"./images/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
|
50
assets/styles/content.sass
Normal file
|
@ -0,0 +1,50 @@
|
|||
@import 'variables'
|
||||
|
||||
*
|
||||
scroll-behavior: smooth
|
||||
|
||||
a
|
||||
cursor: pointer
|
||||
|
||||
@media print
|
||||
a.print:after
|
||||
content: " (" attr(href) ") "
|
||||
font-size: 50%
|
||||
|
||||
.synopsis
|
||||
.desc > p
|
||||
// make command line wraps keep indent
|
||||
margin: 0
|
||||
margin-left: 4em
|
||||
text-indent: -4em
|
||||
@media (max-width: 600px)
|
||||
margin-left: 2em
|
||||
text-indent: -2em
|
||||
|
||||
.options, .history
|
||||
.desc > ul > li
|
||||
list-style: none
|
||||
.desc li > .opt_desc
|
||||
margin-left: 2em
|
||||
@media (max-width: 600px)
|
||||
margin-left: 1em
|
||||
p
|
||||
margin-top: 0
|
||||
|
||||
.history
|
||||
// .job
|
||||
// font-weight: bold
|
||||
// .org
|
||||
// font-style: italic
|
||||
.period
|
||||
float: right
|
||||
font-style: italic
|
||||
|
||||
#phone-hint
|
||||
visibility: hidden
|
||||
opacity: 0
|
||||
#phone:hover
|
||||
#phone-hint
|
||||
opacity: inherit
|
||||
visibility: inherit
|
||||
transition: all 1s ease-out
|
10
assets/styles/index.sass
Normal file
|
@ -0,0 +1,10 @@
|
|||
@import 'variables'
|
||||
@import 'npm:@csstools/normalize.css/normalize.css'
|
||||
|
||||
*
|
||||
box-sizing: border-box
|
||||
|
||||
@import 'structure'
|
||||
@import 'content'
|
||||
@import 'typography'
|
||||
@import 'scheme'
|
89
assets/styles/scheme.sass
Normal file
|
@ -0,0 +1,89 @@
|
|||
|
||||
$bg: #444444
|
||||
$mg: #222222
|
||||
$fg: #C8C8C8
|
||||
|
||||
$dim: #A4A4A4
|
||||
$bright: #D8D8D8
|
||||
$dimmer: #888888
|
||||
$brighter: #FBFBFB
|
||||
|
||||
$accent1: #98e2ff
|
||||
$accent2: #ffe655
|
||||
$accent3: #82cdff
|
||||
$accent4: #69f07b
|
||||
|
||||
body
|
||||
background-color: $bg
|
||||
color: $fg
|
||||
.container
|
||||
background-color: $bg
|
||||
.content
|
||||
background-color: $mg
|
||||
h1, h2, h3, h4, h5, h6
|
||||
color: $brighter
|
||||
.main
|
||||
.target:target
|
||||
animation: 2s attention ease-out
|
||||
|
||||
.period
|
||||
color: $dimmer
|
||||
header, footer
|
||||
color: $dimmer
|
||||
|
||||
.dark
|
||||
color: $bg
|
||||
.dim
|
||||
color: $dim
|
||||
.dimmer
|
||||
color: $dimmer
|
||||
.bright
|
||||
color: $bright
|
||||
.brighter
|
||||
color: $brighter
|
||||
|
||||
.main
|
||||
b
|
||||
color: $accent4
|
||||
em
|
||||
color: $accent1
|
||||
h1
|
||||
color: $fg
|
||||
.description, .options
|
||||
em
|
||||
color: $accent1
|
||||
.options b
|
||||
color: $accent4
|
||||
.synopsis
|
||||
.desc > p > b
|
||||
color: $accent4
|
||||
.history
|
||||
.job
|
||||
color: $accent4
|
||||
|
||||
.target a, a.target
|
||||
text-decoration: none
|
||||
border: none
|
||||
color: inherit
|
||||
&:visited
|
||||
color: inherit
|
||||
&:hover
|
||||
color: inherit
|
||||
|
||||
a
|
||||
text-decoration: none
|
||||
border-bottom: 1px dotted grey
|
||||
color: inherit
|
||||
&:visited
|
||||
color: inherit
|
||||
&:hover, &:focus
|
||||
color: $accent2
|
||||
|
||||
#phone-hint
|
||||
color: $dimmer
|
||||
|
||||
@keyframes attention
|
||||
70%
|
||||
color: $accent2
|
||||
100%
|
||||
color: auto
|
97
assets/styles/structure.sass
Normal file
|
@ -0,0 +1,97 @@
|
|||
@import 'variables'
|
||||
|
||||
body
|
||||
padding: 0
|
||||
margin: 0
|
||||
line-height: 1.5
|
||||
|
||||
.container
|
||||
max-width: 1200px
|
||||
margin: 0 auto
|
||||
padding: 20px
|
||||
min-height: 100vh
|
||||
|
||||
.content
|
||||
// text-align: justify
|
||||
max-width: 1000px
|
||||
margin: 0 auto
|
||||
padding: 20px 40px
|
||||
border-radius: 3px
|
||||
@media (max-width: 600px)
|
||||
padding: 20px
|
||||
|
||||
.main
|
||||
section
|
||||
margin-bottom: 1.5*$size
|
||||
h1
|
||||
padding-left: 0
|
||||
h2
|
||||
padding-left: 2em
|
||||
@media (max-width: 600px)
|
||||
padding-left: 1em
|
||||
.desc
|
||||
padding-left: 4em
|
||||
@media (max-width: 600px)
|
||||
padding-left: 2em
|
||||
ol, ul
|
||||
padding-left: 2em
|
||||
@media (max-width: 600px)
|
||||
padding-left: 1em
|
||||
li
|
||||
// list-style-position: inside
|
||||
list-style-type: square
|
||||
.history
|
||||
.desc > ul > li
|
||||
margin-bottom: 1.5*$size
|
||||
|
||||
header
|
||||
margin-bottom: 2*$size
|
||||
footer
|
||||
margin-top: 2*$size
|
||||
|
||||
header table, footer table
|
||||
width: 100%
|
||||
border-collapse: collapse
|
||||
border-spacing: 0
|
||||
.left, .right
|
||||
width: 30%
|
||||
.center
|
||||
width: 40%
|
||||
td
|
||||
word-break: break-word
|
||||
|
||||
header
|
||||
.left, .right
|
||||
text-transform: uppercase
|
||||
footer
|
||||
.right
|
||||
text-transform: uppercase
|
||||
|
||||
.left
|
||||
text-align: left
|
||||
.center
|
||||
text-align: center
|
||||
.right
|
||||
text-align: right
|
||||
|
||||
// .box {
|
||||
// display: flex;
|
||||
// align-items: center;
|
||||
// justify-content: center;
|
||||
// width: 100%;
|
||||
// heigh: 100%;
|
||||
// padding: 10px;
|
||||
// box-sizing: border-box;
|
||||
// }
|
||||
//
|
||||
// .box div {
|
||||
// width: 100%;
|
||||
// height: 100%;
|
||||
// padding: 10px;
|
||||
// margin: 0;
|
||||
// border: 0;
|
||||
// box-sizing: border-box;
|
||||
// }
|
||||
// .box p {
|
||||
// margin: 0
|
||||
// }
|
24
assets/styles/typography.sass
Normal file
|
@ -0,0 +1,24 @@
|
|||
@import 'variables'
|
||||
|
||||
$font: 'IBM Plex Mono'
|
||||
$font_stack: $font, 'SF Mono', 'Liberation Mono', 'Consolas', monospace
|
||||
|
||||
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,700;1,400;1,700&display=swap')
|
||||
*
|
||||
font-family: $font_stack
|
||||
|
||||
body
|
||||
font-size: $size
|
||||
|
||||
h1, h2, h3, h4, h5, h6
|
||||
font-size: $size + 2
|
||||
text-transform: uppercase
|
||||
|
||||
.header, .footer
|
||||
// font-size: $size - 1
|
||||
text-transform: uppercase
|
||||
.center
|
||||
text-transform: capitalize
|
||||
.footer
|
||||
.left
|
||||
text-transform: none
|
1
assets/styles/variables.sass
Normal file
|
@ -0,0 +1 @@
|
|||
$size: 12pt
|
|
@ -0,0 +1,32 @@
|
|||
include /vars
|
||||
include /includes/mixins/page_id
|
||||
|
||||
div.container
|
||||
div.content
|
||||
|
||||
header
|
||||
table
|
||||
tr
|
||||
td.left #[+page_id()]
|
||||
td.center= section_name
|
||||
td.right #[+page_id()]
|
||||
|
||||
section.main
|
||||
block main-content
|
||||
include ./sections/name
|
||||
include ./sections/synopsis
|
||||
include ./sections/description
|
||||
include ./sections/options
|
||||
include ./sections/history
|
||||
include ./sections/recognition
|
||||
include ./sections/contact
|
||||
include ./sections/seealso
|
||||
include ./sections/copyright
|
||||
|
||||
footer
|
||||
table
|
||||
tr
|
||||
// .left Version #[a(href=source_link) #{short_version}]
|
||||
td.left Version #{short_version}
|
||||
td.center= date
|
||||
td.right #[+page_id()]
|
|
@ -0,0 +1,20 @@
|
|||
include /vars
|
||||
block meta
|
||||
meta(http-equiv="Content-Type" content="text/html;charset=UTF-8")
|
||||
meta(http-equiv="X-UA-Compatible" content="IE=edge")
|
||||
meta(name="viewport" content="width=device-width,initial-scale=1.0")
|
||||
block links
|
||||
link(rel="apple-touch-icon" sizes="180x180" href="./assets/images/apple-touch-icon.png")
|
||||
link(rel="icon" type="image/png" sizes="32x32" href="./assets/images/favicon-32x32.png")
|
||||
link(rel="icon" type="image/png" sizes="16x16" href="./assets/images/favicon-16x16.png")
|
||||
link(rel="manifest" href="./assets/site.webmanifest")
|
||||
meta(name="author" content=name)
|
||||
meta(name="description" content=meta_description)
|
||||
meta(property="og:title" content=name + ' - ' + description)
|
||||
meta(property="og:description" content=meta_description)
|
||||
meta(property="og:type" content="website")
|
||||
meta(property="og:image" content=site_url + "/assets/opengraph.png")
|
||||
meta(name="twitter:card" content="summary_large_image")
|
||||
block styles
|
||||
link(rel="stylesheet" href="assets/styles/index.sass")
|
||||
title #{name}(#{section})
|
2
includes/mixins/ext_a.pug
Normal file
|
@ -0,0 +1,2 @@
|
|||
mixin ext_a(href, content, class_name='')
|
||||
a(href=href target="_blank" rel="external nofollow noopener" class=class_name)= content
|
2
includes/mixins/page_id.pug
Normal file
|
@ -0,0 +1,2 @@
|
|||
mixin page_id()
|
||||
| #{name}(#{section})
|
6
includes/sections/contact.pug
Normal file
|
@ -0,0 +1,6 @@
|
|||
section.contact
|
||||
h1.target#contact: a(href="#contact") contact
|
||||
.desc
|
||||
ul
|
||||
each value, method in contacts
|
||||
li #{method}: #[em !{value}]
|
11
includes/sections/copyright.pug
Normal file
|
@ -0,0 +1,11 @@
|
|||
include /includes/mixins/ext_a
|
||||
|
||||
section.copyright
|
||||
h1.target#copyright: a(href="#copyright") copyright
|
||||
.desc
|
||||
| © #{year} #{first_name} #{last_name}.
|
||||
br
|
||||
| Created with #[+ext_a('https://pugjs.org', 'pug')]
|
||||
| and #[+ext_a('https://sass-lang.com', 'sass')].
|
||||
| Built with #[+ext_a('https://parceljs.org', 'parcel')].
|
||||
| Pronunciation generated by #[+ext_a('https://ipa-reader.xyz', 'ipa-reader')].
|
14
includes/sections/description.pug
Normal file
|
@ -0,0 +1,14 @@
|
|||
section.description
|
||||
h1.target#description: a(href="#description") description
|
||||
.desc
|
||||
p.
|
||||
Hello! I am a self-taught technology professional with a strong background in
|
||||
#[em system administration] and #[em general programming], with proven hands-on
|
||||
experience in #[em modern dev-ops], #[em cloud-ops], and #[em IaC] work domains.
|
||||
p.
|
||||
I have a passion for learning and building things that are useful,
|
||||
sustainable, minimal, and easy to use. I put a lot of care to keep my work
|
||||
output #[em clean], #[em maintainable] and #[em well-documented].
|
||||
p.
|
||||
I'm also an active member of the open-source culture, always
|
||||
looking for opportunities to contribute and to assist the community.
|
46
includes/sections/history.pug
Normal file
|
@ -0,0 +1,46 @@
|
|||
section.history
|
||||
h1.target#history: a(href="#history") history
|
||||
.desc
|
||||
// p My professional employment summary with notable duties is listed below.
|
||||
ul
|
||||
li #[b.job DevOps Consultant] - #[em.org contract] #[span.period 2021-....]
|
||||
ul
|
||||
li adapting classic workloads to serverless architecture
|
||||
li implementing modern logging and tracing solutions
|
||||
li providing support for cloud devops processes
|
||||
|
||||
li #[b.job DevOps Engineer] - #[em.org Digital Healthcare Solutions] #[span.period 2021-....]
|
||||
ul
|
||||
li supervising kubernetes and classic server workloads
|
||||
li in charge of cloud infrastructure administration
|
||||
li managing ci/cd and deployment pipeline
|
||||
li maintaining total monitoring stack
|
||||
|
||||
li #[b.job TechOps Engineer] - #[em.org Telenor Health] #[span.period 2020-2021]
|
||||
ul
|
||||
li provided application support services for engineering
|
||||
li managed application performance monitoring
|
||||
li provided support and service automation
|
||||
li prepared service documentation
|
||||
|
||||
li #[b.job IT Engineer] - #[em.org Taurus] #[span.period 2018-2020]
|
||||
ul
|
||||
li maintained local network infrastructure and email service
|
||||
li created digital service catalog and inventory systems
|
||||
li implemented document management and backup systems
|
||||
|
||||
li #[b.job Programmer] - #[em.org freelance] #[span.period 2015-2018]
|
||||
ul
|
||||
li delivered system automation and scripting projects
|
||||
li performed front-end web development and debugging
|
||||
li created web APIs for data parsing and analysis
|
||||
//-
|
||||
li #[b.job Technician] - #[em.org community] #[span.period 2012-2015]
|
||||
ul
|
||||
li troubleshooting and resolving software problems
|
||||
li computer hardware and software servicing
|
||||
li operating system and software support
|
||||
|
||||
//- each history in histories
|
||||
//- li #[span.job #{history.job}] #[span.org #{history.org}]
|
||||
//- p #[span.works #{history.desc}]
|
14
includes/sections/name.pug
Normal file
|
@ -0,0 +1,14 @@
|
|||
audio#pronounce(controls=false preload="auto")
|
||||
source(src="assets/media/spell.mp3" type="audio/mpeg")
|
||||
source(src="assets/media/spell.ogg" type="audio/ogg")
|
||||
source(src="assets/media/spell.wav" type="audio/wav")
|
||||
|
||||
script.
|
||||
function pronounce() {
|
||||
var audio = document.getElementById('pronounce')
|
||||
audio.play()
|
||||
}
|
||||
|
||||
section.name
|
||||
h1.target#name: a(href="#name") name
|
||||
.desc #[a(href='#' onclick="pronounce()") #{name}] - #{description}
|
85
includes/sections/options.pug
Normal file
|
@ -0,0 +1,85 @@
|
|||
section.options
|
||||
h1.target#options: a(href="#options") options
|
||||
.desc
|
||||
ul
|
||||
|
||||
li
|
||||
b.target#sysadmin: a(href="#sysadmin") --sys-admin
|
||||
.opt_desc
|
||||
p.
|
||||
I have in-depth experience of #[em linux server] administration, covering
|
||||
installation, configuration, optimization, hardening, and maintenance of
|
||||
various common linux distros such as Ubuntu, CentOS, Oracle, AmazonLinux, ArchLinux etc.
|
||||
p.
|
||||
I have hands-on knowledge of #[em DNS] and #[em Email server] administration too.
|
||||
I can configure and publish secure and performant DNS/Email servers with load balancing.
|
||||
In fact, I manage my own DNS, email, and web hosting service, and more.
|
||||
p.
|
||||
I also have above-average expertise about #[em Windows] systems, with working knowledge of #[em Mac OSX].
|
||||
|
||||
li
|
||||
b.target#devops: a(href="#devops") --dev-ops
|
||||
.opt_desc
|
||||
p.
|
||||
I am involved in both classic and modern DevOps practices. I have current knowledge of
|
||||
container orchestration and management tools such as #[em Docker] and #[em Kubernetes].
|
||||
I have professional experience of managing production k8s clusters on #[em AWS] cloud.
|
||||
I have also worked on converting legacy workloads to #[em serverless] arch and maintaining them.
|
||||
p.
|
||||
I can set up a working DevOps environment from scratch, with a working CI/CD pipeline.
|
||||
I can do this with both modern container-based tools such as #[em k8s], #[em Helm], #[em Argo],
|
||||
#[em Gitlab/Github CI], as well as with legacy tools such as #[em Ansible] and #[em Jenkins].
|
||||
p.
|
||||
I also have experience of maintaining monitoring and alerting stacks comprised of
|
||||
#[em prometheus], #[em Grafana], #[em PagerDuty], #[em ELK], as well as in-depth
|
||||
observability toolkits such as #[em Graylog], #[em NewRelic], #[em DataDog], #[em Splunk] etc.
|
||||
|
||||
li
|
||||
b.target#backend: a(href="#backend") --back-end
|
||||
.opt_desc
|
||||
p.
|
||||
Backend engineering is another point of interest to me. I have created multiple
|
||||
backend services with #[em Flask], catering to various production-grade use cases,
|
||||
as well as #[em api gateways] to establish communication between disparate systems.
|
||||
I mostly work with #[em Python]; I am also learning #[em Golang] as a low-level option.
|
||||
|
||||
li
|
||||
b.target#automation: a(href="#automation") --automation
|
||||
.opt_desc
|
||||
p.
|
||||
I try to find a solution that is both efficient and easy to maintain. Automation is
|
||||
a natual fit in this field. I always look out for any repetitive tasks to convert into
|
||||
a simple script or button press. Some of my shortcut scripts have actually grown into
|
||||
full-fledged programs themselves.
|
||||
p.
|
||||
I have used #[em Python], #[em shell scripts], #[em Lua], and #[em Ansible] for automation,
|
||||
as well as trigger-based workflow tools like #[em n8n], #[em inotify] etc.
|
||||
|
||||
li
|
||||
b.target#contrib: a(href="#contrib") --contrib
|
||||
.opt_desc
|
||||
p.
|
||||
outside of professional life, I am an enthusiastic and active fan of open-source.
|
||||
I have worked on #[em numerous open-source projects] such as a locale keyboard layout,
|
||||
a popular regional keyboard input system, a time tracking tool, a regex tool, as well
|
||||
as plugins for sublime text, vim, and other miscellaneous applications.
|
||||
p.
|
||||
I have also contributed with documentation for #[em freecodecamp], #[em ArchLinux wiki], #[em Wikipedia],
|
||||
and contributed #[em i18n] translations to many open-source projects.
|
||||
p.
|
||||
I helped maintain a local online Linux community to welcome new contributors and freshers
|
||||
into the tech world, and to educate on the values of open-source and digital safety.
|
||||
|
||||
li
|
||||
b.target#misc: a(href="#misc") --misc
|
||||
.opt_desc
|
||||
p.
|
||||
I am a strong proponent of #[em selfhosting] and owning my data. I wrote an Ansible playbook
|
||||
to deploy and manange a self-hosted environment that includes webhosting, email, DNS, VPN, RSS, caldav and more.
|
||||
p.
|
||||
I'm also interested in the #[em decentralized web]. I closely follow the fediverse and indieweb
|
||||
movements.
|
||||
p.
|
||||
I am a #[strike huge] medium nerd, as is obvious from the design of this page.
|
||||
I love to tinker with tools, and I'm always looking for interesting stuff to learn, and for new ways to improve my skills.
|
||||
p #[span.dark I use arch btw.]
|
35
includes/sections/recognition.pug
Normal file
|
@ -0,0 +1,35 @@
|
|||
include /includes/mixins/ext_a
|
||||
|
||||
section.achievements
|
||||
h1.target#achievements: a(href="#achievements") achievements
|
||||
.desc
|
||||
ul
|
||||
li #[b Star Performer 2021], Digital Healthcare Solutions
|
||||
li
|
||||
b: +ext_a("https://coursera.org/share/90a24b5165900b3e22011c322b4013f8", "Google IT Support Professional")
|
||||
|, Google
|
||||
li
|
||||
b: +ext_a("https://coursera.org/share/53e0dc7863382d6253086b8dcac2518d", "AWS DevOps Specialization")
|
||||
|, AWS
|
||||
li
|
||||
b: +ext_a("https://coursera.org/share/5b48cc6ac827b619d69056d0d6705b5b", "Google Cloud Digital Leader")
|
||||
|, Google
|
||||
li
|
||||
b: +ext_a("https://coursera.org/share/47e5a79207cec44a45fcf2cb0ca1f815", "Python IT Automation Certificate")
|
||||
|, Google
|
||||
li
|
||||
b: +ext_a("https://www.credly.com/badges/fc8a7edc-8abb-4068-8a57-3d3c52400c9c/public_url", "Linux & Git Specialization")
|
||||
|, Linux Foundation
|
||||
li
|
||||
b: +ext_a("https://www.hackerrank.com/certificates/162646ca14f7", "Python Skill Certificate")
|
||||
|, HackerRank
|
||||
li
|
||||
b: +ext_a("https://www.freecodecamp.org/certification/smmy/javascript-algorithms-and-data-structures", "JavaScript DSA Certificate")
|
||||
|, HackerRank
|
||||
li
|
||||
b: +ext_a("https://www.hackerrank.com/certificates/76d08910bf9f", "REST API Skil Certificate")
|
||||
|, HackerRank
|
||||
li
|
||||
b: +ext_a("https://www.hackerrank.com/certificates/dcdb6c3c4463", "Problem Solving Skill Certificate")
|
||||
|, HackerRank
|
||||
li #[b Recognized Contributor], Wikipedia
|
4
includes/sections/section.pug
Normal file
|
@ -0,0 +1,4 @@
|
|||
section.<section-name>
|
||||
a.target#<section_name>(href="#<section_name>"): h1 <section_name>
|
||||
.desc
|
||||
<section-content>
|
13
includes/sections/seealso.pug
Normal file
|
@ -0,0 +1,13 @@
|
|||
section.seealso
|
||||
h1.target#seealso: a(href="#seealso") see also
|
||||
.desc
|
||||
p
|
||||
a(href="https://bdeshi.space" target="_blank").print: b articles
|
||||
|(7),
|
||||
|
|
||||
a(href="https://github.com/bdeshi" target="_blank" rel="external nofollow noopener noreferrer").print: b github
|
||||
|(1)
|
||||
//-
|
||||
|
|
||||
|
|
||||
a(href="./portfolio.pug") #[b portfolio](7),
|
26
includes/sections/synopsis.pug
Normal file
|
@ -0,0 +1,26 @@
|
|||
section.synopsis
|
||||
h1.target#synopsis: a(href="#synopsis") synopsis
|
||||
.desc
|
||||
p #[b #{name}]
|
||||
| --#[a(href="#sysadmin") sys-admin]
|
||||
|
|
||||
span.dimmer [#[em linux], #[em server] ...]
|
||||
| --#[a(href='#devops') dev-ops]
|
||||
|
|
||||
span.dimmer [#[em cloud], #[em k8s], #[em iac] ...]
|
||||
p #[b #{name}]
|
||||
| --#[a(href='#backend') back-end] --#[a(href="#automation") automation]
|
||||
|
|
||||
span.dimmer [#[em python], #[em shell] ...]
|
||||
p #[b #{name}]
|
||||
| --#[a(href='#contrib') contrib]
|
||||
|
|
||||
span.dimmer [#[em opensource], #[em education] ...]
|
||||
p #[b #{name}]
|
||||
| --#[a(href='#misc') misc]
|
||||
|
|
||||
span.dimmer [#[em selfhoster], #[em nerd] ...]
|
||||
p #[b #{name}]
|
||||
| --#[a(href='#history') history] --#[a(href='#contact') contact]
|
||||
|
|
||||
span.dimmer [#[em --help]]
|
|
@ -1,7 +1,7 @@
|
|||
include vars
|
||||
include /vars
|
||||
doctype html
|
||||
head
|
||||
include includes/head
|
||||
include /includes/head
|
||||
body
|
||||
include includes/body
|
||||
include includes/tail
|
||||
include /includes/body
|
||||
include /includes/tail
|
||||
|
|
|
@ -3,8 +3,11 @@
|
|||
"version": "0.0.1",
|
||||
"license": "CC-BY-4.0",
|
||||
"devDependencies": {
|
||||
"@csstools/normalize.css": "^12.0.0",
|
||||
"@parcel/packager-raw-url": "2.5.0",
|
||||
"@parcel/transformer-pug": "2.5.0",
|
||||
"@parcel/transformer-sass": "2.5.0",
|
||||
"@parcel/transformer-webmanifest": "2.5.0",
|
||||
"parcel": "^2.5.0"
|
||||
},
|
||||
"scripts": {
|
||||
|
|
37
portfolio.pug
Normal file
|
@ -0,0 +1,37 @@
|
|||
include /vars
|
||||
doctype html
|
||||
head
|
||||
meta(http-equiv="Content-Type" content="text/html;charset=UTF-8")
|
||||
meta(http-equiv="X-UA-Compatible" content="IE=edge")
|
||||
meta(name="viewport" content="width=device-width,initial-scale=1.0")
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="./assets/images/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="./assets/images/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="./assets/images/favicon-16x16.png">
|
||||
<link rel="manifest" href="./assets/site.webmanifest">
|
||||
link(rel="stylesheet" href="assets/styles/index.sass")
|
||||
title portfolio(7)
|
||||
body
|
||||
div.container
|
||||
div.content
|
||||
header.header
|
||||
.left portfolio(7)
|
||||
.center= section_name
|
||||
.right portfolio(7)
|
||||
section.main
|
||||
section#name
|
||||
h1 name
|
||||
.desc portfolio - projects by sammay_sarkar
|
||||
section#description
|
||||
h1 description
|
||||
.desc
|
||||
p This portfolio only lists personal hobby projects.
|
||||
p Installing projects. Please check back later.
|
||||
section#seealso
|
||||
h1 see also
|
||||
.desc
|
||||
p
|
||||
a(href="/") #[b sammay_sarkar](7)
|
||||
footer.footer
|
||||
.left Version #[a(href=source_link) #{version}]
|
||||
.center= date
|
||||
.right portfolio(7)
|
2
vars.pug
|
@ -1,3 +1,3 @@
|
|||
-
|
||||
var variable = 'value'
|
||||
include vars.local
|
||||
include vars.local.pug
|
||||
|
|
23
yarn.lock
|
@ -36,6 +36,11 @@
|
|||
"@babel/helper-validator-identifier" "^7.16.7"
|
||||
to-fast-properties "^2.0.0"
|
||||
|
||||
"@csstools/normalize.css@^12.0.0":
|
||||
version "12.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-12.0.0.tgz#a9583a75c3f150667771f30b60d9f059473e62c4"
|
||||
integrity sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==
|
||||
|
||||
"@lezer/common@^0.15.0", "@lezer/common@^0.15.7":
|
||||
version "0.15.12"
|
||||
resolved "https://registry.yarnpkg.com/@lezer/common/-/common-0.15.12.tgz#2f21aec551dd5fd7d24eb069f90f54d5bc6ee5e9"
|
||||
|
@ -428,6 +433,14 @@
|
|||
globals "^13.2.0"
|
||||
nullthrows "^1.1.1"
|
||||
|
||||
"@parcel/packager-raw-url@2.5.0":
|
||||
version "2.5.0"
|
||||
resolved "https://registry.yarnpkg.com/@parcel/packager-raw-url/-/packager-raw-url-2.5.0.tgz#e95e1a38c3581bf5b5cd57aa6cfc6742ac5cce29"
|
||||
integrity sha512-NIdmuuivotlIFTG8NU6SwR39wkDqzBSnEHjiLopZuj0bRY2PPnEeIHK0aoNayo8UOJOSthflwFKFW4goAb1S/w==
|
||||
dependencies:
|
||||
"@parcel/plugin" "2.5.0"
|
||||
"@parcel/utils" "2.5.0"
|
||||
|
||||
"@parcel/packager-raw@2.5.0":
|
||||
version "2.5.0"
|
||||
resolved "https://registry.yarnpkg.com/@parcel/packager-raw/-/packager-raw-2.5.0.tgz#ce0103c26667c93e5c04eda92691363e93aecb1a"
|
||||
|
@ -670,6 +683,16 @@
|
|||
posthtml-render "^3.0.0"
|
||||
semver "^5.7.1"
|
||||
|
||||
"@parcel/transformer-webmanifest@2.5.0":
|
||||
version "2.5.0"
|
||||
resolved "https://registry.yarnpkg.com/@parcel/transformer-webmanifest/-/transformer-webmanifest-2.5.0.tgz#2892c3103bbee93a07ab5f756acd5a18e84172df"
|
||||
integrity sha512-7RtE4f+QUzQqXHJ9kVL80x0xrOYdI7EDBl0jZbJ3Kiec8hE/aB1I3c2bmjyU44tGnd3z9mLzmRS9IaU/gZvXkw==
|
||||
dependencies:
|
||||
"@mischnic/json-sourcemap" "^0.1.0"
|
||||
"@parcel/diagnostic" "2.5.0"
|
||||
"@parcel/plugin" "2.5.0"
|
||||
"@parcel/utils" "2.5.0"
|
||||
|
||||
"@parcel/types@2.5.0":
|
||||
version "2.5.0"
|
||||
resolved "https://registry.yarnpkg.com/@parcel/types/-/types-2.5.0.tgz#e3818d4358f849ac2593605b98366b8e156ab533"
|
||||
|
|