1
0
mirror of https://github.com/avinal/avinal.github.io.git synced 2026-07-03 23:30:09 +05:30

update about page

Signed-off-by: Avinal Kumar <avinal.xlvii@gmail.com>
This commit is contained in:
2023-09-30 20:51:59 +05:30
parent 26a9b72dff
commit 046ad24d97
8 changed files with 728 additions and 113 deletions
+1
View File
@@ -8,6 +8,7 @@
"dependencies": {
"direct": {
"MaybeJustJames/yaml": "2.1.2",
"NoRedInk/elm-json-decode-pipeline": "1.0.1",
"elm/browser": "1.0.2",
"elm/core": "1.0.5",
"elm/html": "1.0.0",
+1
View File
@@ -59,6 +59,7 @@ type alias Model =
, generating : Bool
}
cellSize : Int
cellSize =
10
+154 -46
View File
@@ -1,64 +1,172 @@
module Pages.Pages.AboutMe exposing (page)
module Pages.Pages.AboutMe exposing (Model, Msg, page)
import Components.Footer exposing (footerLinksToSide)
import Effect exposing (Effect)
import Html exposing (Html)
import Html.Attributes exposing (class, datetime, href)
import Utils.Constants exposing (Job, jobList)
import Html.Attributes exposing (class, datetime, href, src)
import Http
import Page exposing (Page)
import Route exposing (Route)
import Shared
import Utils.JsonResume exposing (Education, Resume, Work, resumeDecoder)
import Utils.Utils exposing (getFormattedDate)
import View exposing (View)
import Components.Footer exposing (footerLinksToSide)
import Components.Footer exposing (iconLinkToCenter)
page : View msg
page =
page : Shared.Model -> Route () -> Page Model Msg
page _ _ =
Page.new
{ init = init
, update = update
, view = view
, subscriptions = subscriptions
}
-- INIT
type alias Model =
{ resume : Maybe Resume
, error : Maybe String
}
init : () -> ( Model, Effect Msg )
init () =
let
cmd : Cmd Msg
cmd =
Http.get
{ url = "/resume/resume.json"
, expect = Http.expectJson GotResume resumeDecoder
}
in
( { resume = Nothing, error = Nothing }, Effect.sendCmd cmd )
-- UPDATE
type Msg
= GotResume (Result Http.Error Resume)
update : Msg -> Model -> ( Model, Effect Msg )
update msg model =
case msg of
GotResume (Ok resume) ->
( { model | resume = Just resume }, Effect.none )
GotResume (Err err) ->
( { model | error = Just (Utils.Utils.errorToString err) }, Effect.none )
-- SUBSCRIPTIONS
subscriptions : Model -> Sub Msg
subscriptions model =
Sub.none
-- VIEW
view : Model -> View msg
view model =
{ title = "About Me"
, body =
[ Html.section []
[ Html.div [ class "text-white py-8" ]
[ Html.div [ class "container mx-auto flex flex-col items-start md:flex-row my-12 md:my-24" ]
[ Html.div [ class "flex flex-col w-full sticky md:top-36 lg:w-1/3 mt-2 md:mt-12 px-8" ]
[ Html.p [ class "text-lg ml-2 text-cyan-500 uppercase tracking-lppse" ] [ Html.text "Software Engineer" ]
, Html.p [ class "text-3xl md:text-6xl leading-normal md:leading-relaxed mb-2" ] [ Html.text "Avinal Kumar" ]
, Html.p [ class "md:text-base text-gray-50 mb-4 text-xl " ] [ Html.text description ]
, Html.a
[ class "bg-transparent mr-auto hover:bg-pink-600 text-cyan-500 hover:text-white rounded border py-2 px-4 border-cyan-500"
, href "https://docs.google.com/document/d/1uoCxH9UvWwzFRtuJQ40MJ4kNxVT0tDnHguY7OQOKkN4/edit?usp=sharing"
]
[ Html.text "Download CV" ]
]
, Html.div [ class "ml-0 md:ml-12 lg:w-2/3 sticky" ]
[ Html.div [ class "container mx-auto w-full h-full" ]
[ Html.div [ class "relative wrap overflow-hidden p-10 h-full" ]
[ Html.ol [ class "relative border-l border-cyan-700" ]
(List.map jobListing jobList)
let
experience : List Work -> Html msg
experience workList =
Html.ol [ class "relative border-l border-cyan-700" ]
(List.map
(\work ->
Html.li [ class "mb-10 ml-6 " ]
[ Html.span [ class "absolute flex items-center justify-center w-6 h-6 bg-pink-600 ring-pink-900 rounded-full -left-3 ring-8" ]
[ Html.text <| String.left 1 work.name ]
, Html.h3 [ class "flex items-center mb-1 text-xl font-semibold" ] [ Html.text <| work.position ++ " at " ++ work.name ]
, Html.time [ class "block mb-2 text font-normal leading-none text-gray-500", datetime work.startDate ]
[ Html.text <| getFormattedDate work.startDate False ++ " - " ++ getFormattedDate work.endDate False ]
, Html.p [ class "mb-4 text-base font-normal text-gray-400" ] [ Html.text work.summary ]
, Html.p [ class "mb-4 text-lg font-normal text-gray-300" ] [ Html.text work.description ]
, Html.p [ class "mb-4 text-lg font-normal text-gray-300 ml-8" ] [ listThings work.highlights ]
]
)
workList
)
education : List Education -> Html msg
education eduList =
Html.ol [ class "relative border-l border-cyan-700" ]
(List.map
(\edu ->
Html.li [ class "mb-10 ml-6" ]
[ Html.span [ class "absolute flex items-center justify-center w-6 h-6 bg-pink-600 ring-pink-900 rounded-full -left-3 ring-8" ]
[ Html.text <| String.left 1 edu.institution ]
, Html.h3 [ class "flex items-center mb-1 text-2xl font-semibold" ] [ Html.text <| edu.studyType ++ " at " ++ edu.institution ]
, Html.time [ class "block mb-2 text font-normal leading-none text-gray-500", datetime edu.startDate ]
[ Html.text <| getFormattedDate edu.startDate False ++ " - " ++ getFormattedDate edu.endDate False ]
, Html.p [ class "mb-4 text-base font-normal text-gray-400" ] [ Html.text edu.area ]
]
)
eduList
)
in
case model.resume of
Just resume ->
[ Html.section []
[ Html.div [ class "text-white" ]
[ Html.div [ class "container mx-auto flex flex-col items-start xl:flex-row my-12 xl:my-24" ]
[ Html.div [ class "flex flex-col w-full sticky xl:top-36 xl:w-2/3 mt-2 xl:mt-12 px-8" ]
[ Html.img [ class "w-full h-80 object-cover mx-auto mb-4", src resume.basics.image ] []
, Html.p [ class "text-5xl lg:text-6xl 2xl:text-7xl leading-normal md:leading-relaxed" ] [ Html.text resume.basics.name ]
, Html.p [ class "lg:text-xl md:text-md text-base text-cyan-500 uppercase tracking-lppse mb-2" ] [ Html.text resume.basics.label ]
, Html.p [ class "md:text-base text-gray-50 mb-4 lg:text-xl" ] [ Html.text resume.basics.summary ]
, iconLinkToCenter
]
, Html.div [ class "flex-row" ]
[ Html.div [ class "ml-0 md:ml-12 lg:w-3/3 sticky" ]
[ Html.div [ class "container mx-auto w-full h-full" ]
[ Html.div [ class "relative wrap overflow-hidden p-10 h-full" ]
[ experience resume.work ]
]
]
, Html.div [ class "ml-0 md:ml-12 lg:w-3/3 sticky" ]
[ Html.div [ class "container mx-auto w-full h-full" ]
[ Html.h2 [ class "text-xl ml-2 text-cyan-500" ] [ Html.text "Education" ]
, Html.div [ class "relative wrap overflow-hidden p-10 h-full" ]
[ education resume.education ]
]
]
]
]
]
]
, footerLinksToSide
]
]
, footerLinksToSide
]
Nothing ->
[]
}
description : String
description =
"""
I am a Software Engineer Associate at Red Hat, specialising in hybrid cloud engineering.
I have been involved with Google's Summer of Code and Google Season of Docs programmes as a mentor and contributor to Open Source for many years.
For fun, I like to play around with cutting-edge areas of computer science; at the moment, I'm learning about Elm.
GNU/Linux and free/open-source software are two of my favourite things
"""
-- simply list things
jobListing : Job msg -> Html msg
jobListing job =
Html.li [ class "mb-10 ml-6" ]
[ Html.span [ class "absolute flex items-center justify-center w-6 h-6 bg-pink-600 ring-pink-900 rounded-full -left-3 ring-8" ]
[ Html.text <| String.left 1 job.company
]
, Html.h3 [ class "flex items-center mb-1 text-xl font-semibold" ] [ Html.text <| job.title ++ " at " ++ job.company ]
, Html.time [ class "block mb-2 text font-normal leading-none text-gray-500", datetime job.from ]
[ Html.text <| getFormattedDate job.from False ++ " - " ++ getFormattedDate job.to False ]
, job.body
]
listThings : List String -> Html msg
listThings things =
Html.ul []
(List.map
(\thing ->
Html.li [ class "list-disc" ] [ Html.text thing ]
)
things
)
-66
View File
@@ -2,7 +2,6 @@ module Utils.Constants exposing (..)
import Array exposing (Array)
import Html exposing (Html)
import Html.Attributes exposing (class)
type alias Link =
@@ -45,71 +44,6 @@ iconLinks =
]
jobList : List (Job msg)
jobList =
[ { title = "Associate Software Engineer"
, company = "Red Hat"
, from = "2022-07-01T10:10:00"
, to = "Present"
, body = Html.div [] [ Html.p [ class "mb-4 text-base font-normal text-gray-400" ] [ Html.text "Working on Tekton Results and Pipeline Service." ] ]
}
, { title = "Google Summer of Code Mentor"
, company = "FOSSology"
, from = "2022-05-01T10:10:00"
, to = "Parent"
, body = Html.p [ class "mb-4 text-base font-normal text-gray-400" ] [ Html.text "Mentoring Google Summer of Code contributors for The FOSSology Project." ]
}
, { title = "Software Engineering Intern"
, company = "Red Hat"
, from = "2022-01-05T10:10:00"
, to = "2022-06-30T10:10:00"
, body = Html.p [ class "mb-4 text-base font-normal text-gray-400" ] [ Html.text "Worked on Pipeline Service and Minimal Tekton Server." ]
}
, { title = "Technical Writer"
, company = "API7.ai"
, from = "2022-02-01T10:10:00"
, to = "2022-07-31T10:10:00"
, body = Html.p [ class "mb-4 text-base font-normal text-gray-400" ] [ Html.text "Created Katacoda tutorials for Apache APISIX, a cloud-native API gateway." ]
}
, { title = "Open Source Contributor"
, company = "FOSSology"
, from = "2021-05-15T10:10:00"
, to = "2021-09-23T10:10:00"
, body = Html.p [ class "mb-4 text-base font-normal text-gray-400" ] [ Html.text "Upgraded old build system to CMake and improved tests and CI/CD for FOSSology." ]
}
, { title = "Java Developer Intern"
, company = "XResearch"
, from = "2021-03-01T10:10:00"
, to = "2021-05-15T10:10:00"
, body = Html.p [ class "mb-4 text-base font-normal text-gray-400" ] [ Html.text "" ]
}
, { title = "Technical Writer"
, company = "VideoLAN"
, from = "2020-09-15T10:10:00"
, to = "2020-11-30T10:10:00"
, body = Html.p [ class "mb-4 text-base font-normal text-gray-400" ] [ Html.text "Created Mobile App user documentation for VLC Media Player." ]
}
, { title = "Hindi Editor"
, company = "SRIJAN, NIT Hamirpur"
, from = "2018-11-01T10:10:00"
, to = "2022-09-30T10:10:00"
, body = Html.p [ class "mb-4 text-base font-normal text-gray-400" ] []
}
, { title = "Member"
, company = "Computer Science Engineers' Society, NIT Hamirpur"
, from = "2019-01-07T10:10:00"
, to = "2022-06-30T10:10:00"
, body = Html.p [ class "mb-4 text-base font-normal text-gray-400" ] []
}
, { title = "Computer Science and Engineering"
, company = "National Institute of Technology Hamirpur"
, from = "2018-06-20T10:10:00"
, to = "2022-05-31T10:10:00"
, body = Html.p [ class "mb-4 text-base font-normal text-gray-400" ] []
}
]
months : Array String
months =
Array.fromList
+435
View File
@@ -0,0 +1,435 @@
module Utils.JsonResume exposing (..)
import Json.Decode as Decode exposing (Decoder)
import Json.Decode.Pipeline exposing (optional, required)
-- Main Resume type
type alias Resume =
{ basics : Basics
, work : List Work
, volunteer : List Volunteer
, education : List Education
, awards : List Award
, certificates : List Certificate
, publications : List Publication
, skills : List Skill
, languages : List Language
, interests : List Interest
, references : List Reference
, projects : List Project
, meta : Meta
}
-- Basics
type alias Basics =
{ name : String
, label : String
, image : String
, email : String
, phone : String
, url : String
, summary : String
, location : Location
, profiles : List Profile
}
type alias Location =
{ address : String
, postalCode : String
, city : String
, countryCode : String
, region : String
}
type alias Profile =
{ network : String
, username : String
, url : String
}
-- Work
type alias Work =
{ name : String
, location : String
, description : String
, position : String
, url : String
, startDate : String
, endDate : String
, summary : String
, highlights : List String
}
-- Volunteer
type alias Volunteer =
{ organization : String
, position : String
, url : String
, startDate : String
, endDate : String
, summary : String
, highlights : List String
}
-- Education
type alias Education =
{ institution : String
, url : String
, area : String
, studyType : String
, startDate : String
, endDate : String
, score : String
, courses : List String
}
-- Awards
type alias Award =
{ title : String
, date : String
, awarder : String
, summary : String
}
-- Certificates
type alias Certificate =
{ name : String
, date : String
, url : String
, issuer : String
}
-- Publications
type alias Publication =
{ name : String
, publisher : String
, releaseDate : String
, url : String
, summary : String
}
-- Skills
type alias Skill =
{ name : String
, level : String
, keywords : List String
}
-- Languages
type alias Language =
{ language : String
, fluency : String
}
-- Interests
type alias Interest =
{ name : String
, keywords : List String
}
-- References
type alias Reference =
{ name : String
, reference : String
}
-- Projects
type alias Project =
{ name : String
, description : String
, highlights : List String
, keywords : List String
, startDate : String
, endDate : String
, url : String
, roles : List String
, entity : String
, type_ : String
}
-- Meta
type alias Meta =
{ canonical : String
, version : String
, lastModified : String
}
-- JSON Decoders
-- Resume Decoder
resumeDecoder : Decoder Resume
resumeDecoder =
Decode.succeed Resume
|> required "basics" basicsDecoder
|> required "work" (Decode.list workDecoder)
|> optional "volunteer" (Decode.list volunteerDecoder) []
|> required "education" (Decode.list educationDecoder)
|> optional "awards" (Decode.list awardDecoder) []
|> optional "certificates" (Decode.list certificateDecoder) []
|> optional "publications" (Decode.list publicationDecoder) []
|> optional "skills" (Decode.list skillDecoder) []
|> optional "languages" (Decode.list languageDecoder) []
|> optional "interests" (Decode.list interestDecoder) []
|> optional "references" (Decode.list referenceDecoder) []
|> optional "projects" (Decode.list projectDecoder) []
|> optional "meta" metaDecoder (Meta "" "" "")
-- Basics Decoder
basicsDecoder : Decoder Basics
basicsDecoder =
Decode.succeed Basics
|> required "name" Decode.string
|> required "label" Decode.string
|> optional "image" Decode.string ""
|> required "email" Decode.string
|> optional "phone" Decode.string ""
|> required "url" Decode.string
|> required "summary" Decode.string
|> optional "location" locationDecoder (Location "" "" "" "" "")
|> optional "profiles" (Decode.list profileDecoder) []
locationDecoder : Decoder Location
locationDecoder =
Decode.succeed Location
|> optional "address" Decode.string ""
|> optional "postalCode" Decode.string ""
|> required "city" Decode.string
|> required "countryCode" Decode.string
|> optional "region" Decode.string ""
profileDecoder : Decoder Profile
profileDecoder =
Decode.succeed Profile
|> required "network" Decode.string
|> required "username" Decode.string
|> required "url" Decode.string
workDecoder : Decoder Work
workDecoder =
Decode.succeed Work
|> required "name" Decode.string
|> optional "location" Decode.string ""
|> optional "description" Decode.string ""
|> required "position" Decode.string
|> optional "url" Decode.string ""
|> required "startDate" Decode.string
|> required "endDate" Decode.string
|> required "summary" Decode.string
|> optional "highlights" (Decode.list Decode.string) []
-- Volunteer Decoder
volunteerDecoder : Decoder Volunteer
volunteerDecoder =
Decode.succeed Volunteer
|> required "organization" Decode.string
|> required "position" Decode.string
|> required "url" Decode.string
|> required "startDate" Decode.string
|> required "endDate" Decode.string
|> required "summary" Decode.string
|> optional "highlights" (Decode.list Decode.string) []
-- Education Decoder
educationDecoder : Decoder Education
educationDecoder =
Decode.succeed Education
|> required "institution" Decode.string
|> optional "url" Decode.string ""
|> required "area" Decode.string
|> required "studyType" Decode.string
|> required "startDate" Decode.string
|> required "endDate" Decode.string
|> optional "score" Decode.string ""
|> optional "courses" (Decode.list Decode.string) []
-- Award Decoder
awardDecoder : Decoder Award
awardDecoder =
Decode.succeed Award
|> required "title" Decode.string
|> required "date" Decode.string
|> required "awarder" Decode.string
|> required "summary" Decode.string
-- Certificate Decoder
certificateDecoder : Decoder Certificate
certificateDecoder =
Decode.succeed Certificate
|> required "name" Decode.string
|> required "date" Decode.string
|> required "url" Decode.string
|> required "issuer" Decode.string
-- Publication Decoder
publicationDecoder : Decoder Publication
publicationDecoder =
Decode.succeed Publication
|> required "name" Decode.string
|> required "publisher" Decode.string
|> required "releaseDate" Decode.string
|> required "url" Decode.string
|> required "summary" Decode.string
-- Skill Decoder
skillDecoder : Decoder Skill
skillDecoder =
Decode.succeed Skill
|> required "name" Decode.string
|> optional "level" Decode.string ""
|> optional "keywords" (Decode.list Decode.string) []
-- Language Decoder
languageDecoder : Decoder Language
languageDecoder =
Decode.succeed Language
|> required "language" Decode.string
|> required "fluency" Decode.string
-- Interest Decoder
interestDecoder : Decoder Interest
interestDecoder =
Decode.succeed Interest
|> required "name" Decode.string
|> required "keywords" (Decode.list Decode.string)
-- Reference Decoder
referenceDecoder : Decoder Reference
referenceDecoder =
Decode.succeed Reference
|> required "name" Decode.string
|> required "reference" Decode.string
-- Project Decoder
projectDecoder : Decoder Project
projectDecoder =
Decode.succeed Project
|> required "name" Decode.string
|> required "description" Decode.string
|> optional "highlights" (Decode.list Decode.string) []
|> optional "keywords" (Decode.list Decode.string) []
|> required "startDate" Decode.string
|> optional "endDate" Decode.string ""
|> required "url" Decode.string
|> optional "roles" (Decode.list Decode.string) []
|> optional "entity" Decode.string ""
|> optional "type_" Decode.string ""
-- Meta Decoder
metaDecoder : Decoder Meta
metaDecoder =
Decode.succeed Meta
|> required "canonical" Decode.string
|> required "version" Decode.string
|> required "lastModified" Decode.string
+34 -1
View File
@@ -47,7 +47,17 @@ getFormattedDate dateString time =
dateParser : Parser DateTime
dateParser =
succeed DateTime
oneOf
[ succeed Tuple.pair
|= datePart
|= optional timePart
]
|> map toDateTime
datePart : Parser ( Int, Int, Int )
datePart =
succeed (\y m d -> ( y, m, d ))
|= int
|. token "-"
|. chompWhile (\c -> c == '0')
@@ -55,6 +65,11 @@ dateParser =
|. token "-"
|. chompWhile (\c -> c == '0')
|= int
timePart : Parser ( Int, Int )
timePart =
succeed (\h m -> ( h, m ))
|. token "T"
|. chompWhile (\c -> c == '0')
|= int
@@ -65,6 +80,24 @@ dateParser =
|. end
toDateTime : ( ( Int, Int, Int ), Maybe ( Int, Int ) ) -> DateTime
toDateTime ( ( y, m, d ), maybeTime ) =
case maybeTime of
Just ( h, min ) ->
DateTime y m d h min
Nothing ->
DateTime y m d 0 0
optional : Parser a -> Parser (Maybe a)
optional parser =
oneOf
[ succeed Just |= parser
, succeed Nothing
]
categoryNtags : String -> List String -> Html msg
categoryNtags category tags =
Html.span [ class "flex flex-wrap py-6 space-x-2" ]
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 MiB

+103
View File
@@ -0,0 +1,103 @@
{
"$schema": "https://raw.githubusercontent.com/jsonresume/resume-schema/v1.0.0/schema.json",
"basics": {
"name": "Avinal Kumar",
"label": "Open Sourcerer | Software Engineer",
"email": "ripple@avinal.space",
"url": "https://avinal.space",
"image": "/images/avinal-title.webp",
"location": {
"city": "Bengaluru",
"countryCode": "IN"
},
"summary": "I am a Software Engineer Associate at Red Hat, specialising in hybrid cloud engineering. I have been involved with Google's Summer of Code and Google Season of Docs programmes as a mentor and contributor to Open Source for many years. For fun, I like to play around with cutting-edge areas of computer science; at the moment, I'm learning about Elm. GNU/Linux and free/open-source software are two of my favourite things"
},
"work": [
{
"name": "Red Hat",
"location": "Bengaluru, IN",
"position": "Software Engineer",
"startDate": "2023-10-01",
"endDate": "Today",
"summary": "Working on Pipeline Service, Tekton Results Maintainer",
"description": ""
},
{
"name": "Red Hat",
"location": "Bengaluru, IN",
"position": "Associate Software Engineer",
"startDate": "2022-07-01",
"endDate": "2023-09-30",
"summary": "Pipeline Service | Tekton Results"
},
{
"name": "Red Hat",
"location": "Bengaluru, IN",
"position": "Software Engineering Intern",
"startDate": "2022-01-05",
"endDate": "2022-06-30",
"summary": "Tekton Pipelines, Minimal Tekton Server"
},
{
"name": "API7.ai",
"location": "",
"position": "Technical Writer",
"startDate": "2022-02-01",
"endDate": "2022-07-31",
"summary": "APISIX documentation, Katacoda Scenarios"
},
{
"name": "The FOSSology Project",
"location": "",
"startDate": "2021-05-15",
"endDate": "2021-09-23",
"position": "Open Source Contributor",
"summary": "Google Summer of Code"
},
{
"name": "XResearch",
"position": "Java Developer Intern",
"startDate": "2021-03-01",
"endDate": "2021-05-15",
"summary": ""
},
{
"name": "VideoLAN",
"position": "Technical Writer",
"startDate": "2020-09-15",
"endDate": "2020-11-30",
"summary": "Google Season of Docs, VLC for Android User Documentation"
}
],
"education": [
{
"institution": "National Institute of Technology Hamirpur",
"area": "Computer Science and Engineering",
"startDate": "2018-06-20",
"endDate": "2022-05-31",
"studyType": "Bachelor of Technology"
},
{
"institution": "Sri Chaitanya Junior Kalasala",
"area": "Mathematics, Physics, Chemistry",
"studyType": "Intermediate",
"startDate": "2015-05-20",
"endDate": "2017-05-30"
},
{
"institution": "Simultala Awasiya Vidyalaya",
"area": "Secondary School",
"studyType": "Metriculation",
"startDate": "2010-08-09",
"endDate": "2015-03-30"
}
],
"skills": [
{
"name": "C++"
},
{
"name": "Go"
}
]
}