The F# Mentorship Schedule Planner – The focused generalist

வணக்கம் வாசகர்களே,

F# வருகை காலண்டர்

தெரியாதவர்களுக்கு, தி F# வருகை காலண்டர் மூலம் தொடங்கப்பட்டுள்ளது செர்ஜி டிஹோன் ஓரிரு ஆண்டுகளுக்கு முன்பு. நான் கடந்த ஆண்டு அதில் பங்கேற்க ஆரம்பித்தேன், F# சமூகம் என்றுதான் சொல்ல வேண்டும் அற்புதமான! எல்லோரும் எப்போதும் பகிர்ந்து கொள்ள சிறந்த உள்ளடக்கத்தை உருவாக்குகிறார்கள். நேர்மையாக, ஒரு மென்பொருள் உருவாக்குநராக நான் தொடர்ந்து வளரக்கூடிய சிறந்த நபர்களைக் கண்டுபிடிக்க நான் விரும்பியிருக்க முடியாது. சரி, இன்றைய இடுகையின் முக்கிய தலைப்பைப் பற்றி விவாதிப்போம்: F# வழிகாட்டல் அட்டவணை திட்டமிடுபவர்.

F# மென்பொருள் அறக்கட்டளையின் வழிகாட்டல் முயற்சி

நீங்கள் அறிந்திருக்கலாம், தி F# மென்பொருள் அறக்கட்டளை, அல்லது FSSF, F# மென்பொருள் உருவாக்குநர்களுக்கு உதவுவதற்கும் வளர்ப்பதற்கும் ஒரு கல்வி முயற்சியை துவக்கியுள்ளது. தி வழிகாட்டுதல் ஓரிரு வருடங்களாக இங்கே இருக்கிறார்; சில வாரங்களுக்கு முன்பு ஒன்பதாவது சுற்று வழிகாட்டியை முடித்துள்ளோம். நீங்கள் எளிதாக F# எழுதாத ஒருவராக இருக்கலாம் அல்லது ஒரு நிபுணராக இருக்கலாம்; அது முக்கியமில்லை. அனைவரும் சேரவும், சமூகத்தை அடையவும் வரவேற்கிறோம்!

நான் திட்டத்தை நேசித்தேன்! நான் இரண்டு முறை வழிகாட்டியாக இருந்தேன் அதே வழிகாட்டி நான் செயல்பாட்டு நிரலாக்கம் மற்றும் F# பற்றி நன்கு தெரிந்துகொள்ள முயற்சித்ததால் எனது வளர்ச்சியைத் தக்கவைக்க பெரிதும் உதவியவர். F# சமூகத்திற்குத் திரும்பக் கொடுப்பதற்கான வழிகளை நான் ஏன் கண்டுபிடிக்க விரும்பினேன் என்பதை இது விளக்குகிறது. அவர்கள் எனக்காக நிறைய செய்திருக்கிறார்கள், மேலும் உதவுவது என் முறை என்று உணர்ந்தேன்!

கோடையின் பிற்பகுதியில், நான் FSSF இன் குழு உறுப்பினராகிவிட்டேன். வழிகாட்டி முயற்சியை கவனித்துக்கொள்வது எனது பொறுப்புகளில் ஒன்றாகும். இதன் பொருள் நான் செய்ய வேண்டியது:

  • நிகழ்விற்கான அட்டவணையை உருவாக்கவும்,
  • அது வரப்போகிறது என்பதை சமூகம் அறிந்திருப்பதை உறுதிசெய்யவும்
  • புதிய வழிகாட்டி சுற்றுக்கான விண்ணப்பப் படிவத்தைப் புதுப்பிக்கவும்,
  • அனைத்து விண்ணப்பதாரர்கள் (வழிகாட்டிகள் மற்றும் வழிகாட்டிகள்)
    • ஒரே F# வட்டி(கள்) கொண்ட விண்ணப்பதாரர்களை இணைக்கவும்,
    • அவற்றின் இருப்புகள் செயல்படுவதை உறுதிசெய்க (நேர மண்டலங்கள் மற்றும் வாராந்திர அட்டவணை),
  • செய்யக்கூடிய ஜோடிகளுக்கு மின்னஞ்சல் அனுப்பவும்,
  • பொருந்தாத விண்ணப்பதாரர்களுக்கு அறிவிக்கவும்.

விண்ணப்பதாரர்களை ஒன்றாக இணைத்தல்

நான் மற்றொரு குழு உறுப்பினருடன் பகிர்ந்து கொள்ளும் திட்டத்திற்கான எனது பொறுப்புகள் குறித்து புதுப்பிக்கப்பட்ட பிறகு, நான் உதவ என்ன செய்யலாம் என்று யோசிக்க ஆரம்பித்தேன்.

அங்கே ஒரு மிகப்பெரிய ஜோடிகளை உருவாக்குவதில் ஈடுபட்டுள்ள நேர அர்ப்பணிப்பு. என் முன்னோடி இது வழக்கமாக எடுக்கும் என்று குறிப்பிட்டுள்ளார் 8 முதல் 10 மணி நேரம் ஜோடிகளை உருவாக்க. இந்தச் சுற்றுக்கு மட்டும், எங்களிடம் சுமார் 120 விண்ணப்பதாரர்கள் இருந்தனர், இது இதுவரை நடந்ததில்லை. இதற்கு முன்பை விட அதிக நேரம் எடுத்திருக்கும் என்று அர்த்தம்.

நான் ரசிக்கவில்லை என்பதுதான் விஷயம் மீண்டும் மீண்டும் உடல் உழைப்பு. ஒரு மென்பொருள் உருவாக்குநராக, செயல்முறைகளுக்கு ஆட்டோமேஷனை எவ்வாறு கொண்டு வருவது மற்றும் கழிவுகளைக் குறைப்பதன் மூலம் அவை செயல்திறனைப் பெற உதவுவது எப்படி என்பதைப் பற்றி சிந்திக்க எனது மூளை மாற்றியமைக்கப்பட்டுள்ளது. வழிகாட்டல் முன்முயற்சியின் பொறுப்பாளராக இருப்பதன் அர்த்தம், 2 சுற்று வழிகாட்டல்களுக்கு நான் பொறுப்பு. பழைய தரவுகளின் அடிப்படையில் அந்தச் செயல்பாட்டில் சுமார் 90 மணிநேரம் முதலீடு செய்துள்ளோம் என்று தோராயமாகச் சொன்னேன். இன்னும் சிறப்பாகச் செய்யலாம் என்று நினைத்தேன், அதன் பிறகு, டேட்டாவைக் கவர ஆரம்பித்தேன்.

அட்டவணை திட்டமிடுபவரின் பிறப்பு

நான் செய்த முதல் விஷயம், கூகுள் படிவங்களில் உள்ள விண்ணப்பதாரரின் தரவைப் பார்ப்பதுதான். எனக்குத் தெரியாது, ஆனால் நான் அதை ஒரு CSV ஆவணமாக ஏற்றுமதி செய்யலாம்! அங்கிருந்து, எனக்கு கிடைத்தது உற்சாகமாக நான் பயன்படுத்த முடியும் என்று தெரிந்தும் CSV வகை வழங்குநர் (TP) மற்றும் எப்படியாவது உதவியாக இருக்கும் ஒன்றைத் தொடங்குங்கள்!

சில சோதனை மற்றும் பிழைக்குப் பிறகு TPநான் சமாளித்துவிட்டேன் சாறு CSV ஆவணத்திலிருந்து தரவு. TP களை விரும்பாதவர்களுக்கு, நான் வேறு திசையில் சென்றிருக்கலாம் என்பதை நான் அறிவேன், ஆனால் நேரம் கட்டுப்படுத்தப்பட்டதால், தரவு தானாகவே வகைகளில் வடிவமைக்கப்படும் யோசனை எனக்கு பிடித்திருந்தது. இது உண்மையிலேயே எனது வாழ்க்கையை எளிதாக்கியது மற்றும் CLI கருவியை உருவாக்குவதை விரைவுபடுத்தியது. அனைத்து விண்ணப்பதாரர்களிடமிருந்தும் தரவு கிடைக்கும் வரை நான் காத்திருந்தேன். குட் ஃபீலிங்கில் நடிக்க சில நாட்கள் மட்டுமே இருந்தது, ஏதாவது வேலை கிடைக்கலாம் என்று நினைத்தேன் சுமார் 3 நாட்களில்.

மேற்கொண்டு செல்வதற்கு முன், திட்டமிடலைச் செயல்படுத்துவதில் எனக்கு உதவிய F# சமூகத்தின் ஒரு உறுப்பினருக்கு நன்றி தெரிவிக்க விரும்புகிறேன். கெர்ரி உதவிக்கு ஒரு மிகப்பெரிய ஆதாரமாக உள்ளது! நாங்கள் குறியீட்டில் பல சிக்கல்களை ஒன்றாக விவாதித்தோம், நிறைய மறுசீரமைப்பு செய்தோம், முக்கியமாக, இதில் பணிபுரியும் போது ஒரு டன் வேடிக்கையாக இருந்தோம்! உங்கள் உதவிக்கு நன்றி!

அங்கு இருந்து, பல நான் ஒரு டொமைனை ஒன்றாக இணைத்து விண்ணப்பதாரர்களை இணைக்கும் முயற்சியில் வேடிக்கையான மென்பொருள் வடிவமைப்பு சிக்கல்கள் எட்டிப்பார்க்க ஆரம்பித்தன. எனது வழிகாட்டிகளிடமிருந்து வழிகாட்டிகளைப் பிரித்து தனித்தனியான சேகரிப்பில் வைத்திருப்பது நான் செய்ய வேண்டிய முக்கியமான விஷயங்களில் ஒன்று.

ஒரு செயல்பாட்டு நடைமுறையைப் பெற முயற்சிக்கிறது

ஆரம்பத்தில், CSV இல் உள்ள விண்ணப்பதாரர்களிடமிருந்து நான் பிரித்தெடுக்க வேண்டிய தகவலைப் பற்றி சிந்திக்கத் தொடங்கினேன்:

type 'T nel="T NonEmptyList

type DayAvailability = { WeekDayName: string; UtcHours: TimeSpan list }

type CalendarSchedule = { AvailableDays: DayAvailability nel }

type PersonInformation =
    { Fullname: string
      SlackName: string
      EmailAddress: string
      MentorshipSchedule: CalendarSchedule }
with
    member x.FirstName = x.Fullname.Split(" ').[0]

கொடுக்கப்பட்ட நபருக்காக நான் எந்த வகையான தகவலைப் பிரித்தெடுக்க விரும்புகிறேன் என்பதை அறிந்த பிறகு, ஒரு வழிகாட்டியிலிருந்து ஒரு வழிகாட்டியை வேறுபடுத்துவது என்ன என்பதைப் பற்றி சிந்திக்க சிறிது நேரம் தேவைப்பட்டது:

type Mentor =
    { MentorInformation: PersonInformation
      AreasOfExpertise: FsharpTopic nel
      SimultaneousMenteeCount: uint }

type Mentee =
    { MenteeInformation: PersonInformation
      TopicsOfInterest: FsharpTopic nel }

இணைக்கப்பட, ஒரு வழிகாட்டியின் F# தலைப்பு ஒரு வழிகாட்டியின் நிபுணத்துவம் வாய்ந்த பகுதிகளுடன் பொருந்த வேண்டும்.

type FSharpCategory =
    | IntroductionToFSharp
    | DeepDiveInFSharp
    | ContributeToOpenSource
    | WebDevelopment
    | ContributeToCompiler
    | MachineLearning
    | DistributedSystems
    | MobileDevelopment
    | DomainModelling
    | UpForAnything
type PopularityWeight =
    | Common = 3
    | Popular = 5
    | Rare = 10
type FsharpTopic =
    { Category: FSharpCategory
      PopularityWeight: PopularityWeight }

அங்கிருந்து, வாராந்திர கிடைக்கும், உள்ளூர் நேரம் மற்றும் அவர்கள் பகல் சேமிப்பு நேரத்தில் இருந்தால், நபர்களை இணைப்பதைப் பற்றி யோசிப்பது ஒரு சுவாரஸ்யமான சவாலாக மாறியது. திட்டத்திற்கு விண்ணப்பத்தை சமர்ப்பிக்கும் போது, ​​ஒரு விண்ணப்பதாரர் தனது சொந்த நேரத்தின் அடிப்படையில் ஒருவரை சந்திக்க சுதந்திரமாக இருக்கும்போது சேர்க்க வேண்டும். தானியக்கமாக்குவதைச் சற்று சிக்கலாக்கிய ஒரு விஷயம் என்னவென்றால், அவர்களின் நேர மண்டலத்திற்கான அணுகல் என்னிடம் இல்லை, உலகளாவிய நேரத்துடன் (UTC) அவற்றின் ஆஃப்செட் மட்டுமே.

ஒரு தலைப்பைப் பற்றி விவாதிப்பது போன்ற சில விஷயங்களை முயற்சித்த பிறகு NodaTime இன் ஆசிரியர்அதை நான் பார்த்தேன் என்னால் தானியக்கமாக்க முடியவில்லை அந்த பகுதி மற்றும் செயல்படுத்தலின் ஒரு பகுதியாக பகல் சேமிப்பு நேரத்தை கையாளவில்லை. அந்த நேரத்தில், நாங்கள் வழிகாட்டி மற்றும் வழிகாட்டி தரவு மற்றும் அவர்களின் வாராந்திர அட்டவணையைப் பிரித்தெடுக்க முடியும். இப்போது அவற்றை ஒன்றாக இணைக்கத் தொடங்குவதற்கான நேரம் இது.

விண்ணப்பதாரர்களை நான் எவ்வாறு ஒன்றாக இணைக்கிறேன் என்பதைப் பார்ப்பதற்கு முன் விவாதிக்க வேண்டிய ஒரு அம்சம் தேர்ந்தெடுக்கப்பட்ட F# தலைப்பின் தாக்கமாகும்.

type PopularityWeight =
    | Common = 3
    | Popular = 5
    | Rare = 10

சமூகத்தின் கோரிக்கையின் அடிப்படையில், ஒவ்வொரு தலைப்புக்கும் “F# அறிமுகம்” போன்ற ஒரு பிரத்யேக பிரபலமான எடை வழங்கப்பட்டது மற்றும் தொகுப்பியில் வேலை செய்வது அரிது. இதன் பொருள் F# மற்றும் கம்பைலர் வேலைக்கான அறிமுகத்தில் பொருந்திய ஒரு வழிகாட்டி இருந்தால், தொகுப்பாளர் பணிக்கு முன்னுரிமை கொடுக்கப்பட்டது.

விண்ணப்பதாரர்களை ஒன்றாக இணைத்தல்

இந்த வேலைகளுக்குப் பிறகு, நாம் இப்போது பணியில் கவனம் செலுத்தலாம்: விண்ணப்பதாரர்களை ஒன்றாக இணைத்தல். செயல்படுத்துவதை ஆழமாகப் பார்க்க ஆர்வமுள்ளவர்கள், நீங்கள் களஞ்சியத்தைக் காணலாம் இங்கே. நான் பதவியை வைத்திருக்க விரும்புவதால் ஒப்பீட்டளவில் சுருக்கமாக, நான் போக மாட்டேன் ஒவ்வொரு சிறிய விவரம் குறியீட்டின்! இருப்பினும், நீங்கள் பார்க்க வரவேற்கப்படுகிறீர்கள் 🙂

சில உதவி முறைகளின் உதவியுடன்:

let extractMentorshipPlannerInputs (csvDocumentFilePath: string) =
        let (unmatchedMentors, unmatchedMentees) =
            MentorshipInformation.Load csvDocumentFilePath
            |> Impl.extractPeopleInformation

        {   FullMenteeList = unmatchedMentees
            FullMentorList = unmatchedMentors
            ConfirmedMatches = []
            MatchedMenteesSet = Set.empty
            MatchedMentorSet = Set.empty
            NumberOfHoursRequiredForOverlap = 1 }
let doesMenteeMatchMentorProfile (mentor: Mentor) (mentee: Mentee) (hoursOfOverlap: int)=
    let foundScheduleOverlap = (mentee.MenteeInformation.MentorshipSchedule, mentor.MentorInformation.MentorshipSchedule, hoursOfOverlap) |||> doScheduleOverlap
    let hasAnyMatchingInterest = (mentor.AreasOfExpertise, mentee.TopicsOfInterest) ||> extractMatchingFsharpTopics |> Seq.length > 0
    
    foundScheduleOverlap && hasAnyMatchingInterest
let findAllMatchingMenteesForMentor (mentor: Mentor) (mentees: Mentee list) (hoursOfOverlap: int) =
    mentees 
    |> List.filter(fun mentee -> doesMenteeMatchMentorProfile mentor mentee hoursOfOverlap)
    |> List.map(fun mentee ->  { Mentor = mentor; Mentee = mentee; MatchingFsharpInterests = extractMatchingFsharpTopics mentee.TopicsOfInterest mentor.AreasOfExpertise } )
let findAllPotentialMentorshipMatches mentors mentees hoursOfOverlap =
    mentors 
    |> List.map(fun mentor -> findAllMatchingMenteesForMentor mentor mentees hoursOfOverlap)
    |> List.concat
    |> List.map(fun mentorshipMatch -> 
        let orderedInterestBasedOnPopularity = mentorshipMatch.MatchingFsharpInterests |> List.sortByDescending(fun fsharpTopic -> fsharpTopic.PopularityWeight)
        { mentorshipMatch with MatchingFsharpInterests = orderedInterestBasedOnPopularity }
    )
let rec getMentorshipPairing (plannerInputs: MentorshipPlannerInputs) =
        let filterToUnmatchedMentees (unmatchedMentees: Mentee list) (matchedMentees: Set<Mentee>) =
            unmatchedMentees |> List.filter(fun mentee -> matchedMentees.Contains mentee <> true)

        let filterToUnmatchedMentors (unmatchedMentors: Mentor list) (confirmedPairings: ConfirmedMentorshipApplication list) =
            unmatchedMentors |> List.filter(fun unmatchedMentor -> confirmedPairings.Any(fun x -> x.MatchedMentor = unmatchedMentor) <> true)

        match (plannerInputs.FullMentorList, plannerInputs.NumberOfHoursRequiredForOverlap) with
        | ([], _) ->
            plannerInputs.ConfirmedMatches, plannerInputs

        | (_, 0) ->
            plannerInputs.ConfirmedMatches, plannerInputs

        | _ ->
            let (confirmedMatches, matchedMenteeSet, matchedMentorsSet) = getConfirmedMatchesFromPlanner plannerInputs
            let updatedPlanner = 
                { plannerInputs with
                    FullMenteeList = filterToUnmatchedMentees plannerInputs.FullMenteeList plannerInputs.MatchedMenteesSet
                    FullMentorList = filterToUnmatchedMentors plannerInputs.FullMentorList plannerInputs.ConfirmedMatches
                    ConfirmedMatches = plannerInputs.ConfirmedMatches @ confirmedMatches
                    MatchedMenteesSet = matchedMenteeSet
                    MatchedMentorSet = matchedMentorsSet
                    NumberOfHoursRequiredForOverlap = plannerInputs.NumberOfHoursRequiredForOverlap - 1 }

            getMentorshipPairing updatedPlanner

கருவியால் உருவாக்க முடிந்த ஜோடிகளை என்னால் ஒரு கோப்பில் டம்ப் செய்ய முடிந்தது. துரதிர்ஷ்டவசமாக, ஒரு இல் 100% பொருத்தங்களைச் செய்ய முடியவில்லை ஒற்றை பாஸ். வழிகாட்டல் திட்டத்தின் பொறுப்பான மற்ற FSSF குழு உறுப்பினர் எனது கருவியை முடக்கி, குறைபாடுள்ள செயல்பாட்டிற்கான ஆதரவை உருவாக்கினார் (துரதிர்ஷ்டவசமாக அது என்னவென்று என்னால் நினைவில் இல்லை). நாங்கள் அதைச் செயல்படுத்தி, கணினியில் உள்ள இணைப்புகளை முடிக்க முடிந்தது இரண்டாவது பாஸ்.

இணைப்பதற்கான கணிதத் திட்டமிடலை மேம்படுத்துதல்

சமூகத்தில் ஒரு சிலருடன் கலந்துரையாடிய பிறகு, ஹூரிஸ்டிக்ஸ் பயன்பாட்டை அகற்றுவதன் மூலம் CLI கருவியை செயல்படுத்துவதை மேம்படுத்தலாம் என்று அறிந்தேன். உண்மையில், நான் என்னைக் கண்டுபிடிக்கும் சிக்கல் இடத்தில் கணிதத் திட்டமிடல் ஒரு சிறந்த கருவியாக இருக்கும்.

எனவே, இது ஒரு நேரடியான பணிப் பிரச்சனை போல் தெரிகிறது ஆனால் ஒரு திருப்பம் உள்ளது. கேள்வி கேட்பவர் மிகவும் பொதுவான திறன்களின் ஜோடிகளை விட அரிய திறன்களின் ஜோடிகளுக்கு அதிக முன்னுரிமை அளிக்க வேண்டும் என்று விரும்பினார். ஆ, இப்போது எங்களுக்கு கணித திட்டமிடல் சிக்கல் உள்ளது!

நான் கொஞ்சம் விவாதித்தேன் மத்தேயு க்ரூஸ் பயன்படுத்தி ஒரு மாதிரியை மட்டும் செயல்படுத்தும் அளவுக்கு நல்லவர் புரட்டுகிறது ஆனால் பற்றி எழுதவும் அது அவரது வலைப்பதிவில். கணித திட்டமிடல் ஒரு சிறந்த மாற்று அணுகுமுறை என்பதை அறிய, வலைப்பதிவு இடுகையைப் படிக்க பரிந்துரைக்கிறேன்.

எதிர்காலத்திற்கான பாதை வரைபடம்

தற்போது, ​​நான் அருமை வாக்குப்பதிவில் மகிழ்ச்சி. வழிகாட்டுதலின் எதிர்கால சுற்றுகளுக்கு, எல்லா தரவும் கிடைக்கும் வரை நாம் உண்மையில் காத்திருக்கலாம் அதை CLI கருவிக்கு ஊட்டவும். ஜோடிகளை உருவாக்கி அவற்றை ஒரு கோப்பாக மாற்ற சில வினாடிகள் ஆகும். இது சேமிக்கிறது நிறைய நேரம் சமூகத்திற்கு மிகவும் அர்த்தமுள்ள பங்களிப்புகளை நோக்கி திருப்பிவிடக்கூடிய FSSFக்கு!

கருவியில் நான் மேம்படுத்த விரும்பும் சில விஷயங்கள் உள்ளன:

  • இணைக்கப்பட்ட விண்ணப்பதாரர்களுக்கு தானாக மின்னஞ்சல்களை அனுப்புகிறது
  • தானாக இணைக்க முடியாத மின்னஞ்சல்களை விண்ணப்பதாரர்களுக்கு அனுப்புகிறது
  • FSSF இன் தனியார் வழிகாட்டியான ஸ்லாக் சேனலில் வழிகாட்டிகளைச் சேர்ப்பது தானாகவே

இவை ஒரு சுற்றுக்கு சுமார் 2-4 மணிநேர வேலைகளைச் சேமிக்கும்.

ஏனென்றால் நான் வலை வளர்ச்சியில் ஆழமாக மூழ்க விரும்புகிறேன் பாதுகாப்பானது 2021 இல், வழிகாட்டித் திட்டத்திற்குப் பொறுப்பான ஒரு வலைப் பயன்பாட்டை ஒன்றாக இணைக்க விரும்புகிறேன். 2021ல் இது எனது முக்கிய திட்டமாக மாறும் என்று நினைக்கிறேன்.

அந்த வலைப் பயன்பாட்டிற்கான எனது அபிலாஷைகளை நான் விரைவில் வெளியிட விரும்பவில்லை. இதைப் பற்றி நாம் என்ன செய்ய முடியும் என்பதைப் பார்க்க மற்ற நிர்வாகக் குழு உறுப்பினர்களுடன் உள்நாட்டில் விவாதிக்க நான் கடமைப்பட்டிருக்கிறேன். நேர்மையாக, இது எனது முடிவில் ஒரு மகத்தான நேர அர்ப்பணிப்பாக மாறினால், அதுவும் ஒரு தடுப்பானாக இருக்கலாம், ஏனெனில் நான் வேலைக்கு வெளியே மென்பொருள் மேம்பாட்டில் அதிக நேரத்தை செலவிட விரும்பவில்லை.

நிறைவுரை

இது என் கடந்த 2020 இன் வலைப்பதிவு நுழைவு!! நாங்கள் அதை இறுதிவரை செய்தோம்! இது ஒரு காட்டு-காட்டு மேற்கு ஒரு வருடம், ஆனால் நாங்கள் அதைத் தக்க வைத்துக் கொண்டோம்! உங்களைப் பற்றி பெருமிதம் கொள்ளுங்கள், நீங்கள் சிறப்பாக இருந்தீர்கள் 😉

2021 இல் அனைவருக்கும் நல்வாழ்த்துக்கள்! இது ஒரு இனிமையான ஆண்டாக இருக்கும் என்று நான் நம்புகிறேன் (தயவுசெய்து)

விரைவில் சந்திப்போம் 🙂

கெவின்

Leave a Comment