diff --git a/elm.json b/elm.json index 0f54795..5b199d3 100644 --- a/elm.json +++ b/elm.json @@ -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", diff --git a/src/Pages/Home_.elm b/src/Pages/Home_.elm index 16b61c0..d13e671 100644 --- a/src/Pages/Home_.elm +++ b/src/Pages/Home_.elm @@ -59,6 +59,7 @@ type alias Model = , generating : Bool } + cellSize : Int cellSize = 10 diff --git a/src/Pages/Pages/AboutMe.elm b/src/Pages/Pages/AboutMe.elm index 0400d80..6171afd 100644 --- a/src/Pages/Pages/AboutMe.elm +++ b/src/Pages/Pages/AboutMe.elm @@ -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 + ) diff --git a/src/Utils/Constants.elm b/src/Utils/Constants.elm index 9dc4a42..3469733 100644 --- a/src/Utils/Constants.elm +++ b/src/Utils/Constants.elm @@ -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 diff --git a/src/Utils/JsonResume.elm b/src/Utils/JsonResume.elm new file mode 100644 index 0000000..9739425 --- /dev/null +++ b/src/Utils/JsonResume.elm @@ -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 diff --git a/src/Utils/Utils.elm b/src/Utils/Utils.elm index a8a3b0e..2ad31fa 100644 --- a/src/Utils/Utils.elm +++ b/src/Utils/Utils.elm @@ -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" ] diff --git a/static/images/avinal-title.webp b/static/images/avinal-title.webp new file mode 100644 index 0000000..21800d7 Binary files /dev/null and b/static/images/avinal-title.webp differ diff --git a/static/resume/resume.json b/static/resume/resume.json new file mode 100644 index 0000000..2e72bcd --- /dev/null +++ b/static/resume/resume.json @@ -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" + } + ] +} \ No newline at end of file