mirror of
https://github.com/avinal/avinal.github.io.git
synced 2026-07-03 23:30:09 +05:30
@@ -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",
|
||||
|
||||
@@ -59,6 +59,7 @@ type alias Model =
|
||||
, generating : Bool
|
||||
}
|
||||
|
||||
|
||||
cellSize : Int
|
||||
cellSize =
|
||||
10
|
||||
|
||||
+154
-46
@@ -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
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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 |
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user