lqdev.me Post Metrics

Description

Generates an aggregate analysis of posts on lqdev.me / luisquintanilla.me.

Usage

dotnet fsi stats.fsx 

Snippet

stats.fsx

// Reference DLL
#r "../bin/Debug/net8.0/PersonalSite.dll"

// Add modules open Domain open Builder open System

// Load posts let posts = loadPosts() let notes = loadFeed () let responses = loadReponses ()

// Organize posts by year let postCountsByYear = posts |> Array.countBy (fun (x:Post) -> DateTime.Parse(x.Metadata.Date) |> _.Year) |> Array.sortByDescending fst

let noteCountsByYear = notes |> Array.countBy (fun (x:Post) -> DateTime.Parse(x.Metadata.Date) |> _.Year) |> Array.sortByDescending fst

let responseCountsByYear = responses |> Array.countBy (fun (x:Response) -> DateTime.Parse(x.Metadata.DatePublished) |> _.Year) |> Array.sortByDescending fst

// Organize responses by type let responsesByType = responses |> Array.filter(fun x -> (DateTime.Parse(x.Metadata.DatePublished) |> _.Year) = DateTime.UtcNow.Year) |> Array.countBy(fun x -> x.Metadata.ResponseType) |> Array.sortByDescending(snd)

// Organize responses by tag let responsesByTag = responses |> Array.filter(fun x -> (DateTime.Parse(x.Metadata.DatePublished) |> _.Year) = DateTime.UtcNow.Year) |> Array.collect(fun x -> match x.Metadata.Tags with | null -> [|"untagged"|] | [||] -> [|"untagged"|] | _ -> x.Metadata.Tags ) |> Array.countBy(fun x -> x) |> Array.sortByDescending(snd)

// Organize responses by host name (domain) let responsesByDomain = responses |> Array.filter(fun x -> (DateTime.Parse(x.Metadata.DatePublished) |> _.Year) = DateTime.UtcNow.Year) |> Array.countBy(fun x -> Uri(x.Metadata.TargetUrl).Host) |> Array.sortByDescending(snd)

// Utility function to display counts let printEntryCounts<'a> (title:string) (entryCounts:('a * int) array) (n:int) = printfn $"{title}"

match entryCounts.Length with
| 0 -&gt; 
    printfn $&quot;No entries&quot;
    printfn $&quot;&quot;
| a when a &gt; 0 -&gt; 
    match n with 
    | n when n = -1 || n &gt; entryCounts.Length -&gt; 
        entryCounts
        |&gt; Array.iter(fun x -&gt; printfn $&quot;{fst x} {snd x}&quot;)
        |&gt; fun _ -&gt; printfn $&quot;&quot;
    | n when n &gt; 0 -&gt; 
        entryCounts
        |&gt; Array.take n
        |&gt; Array.iter(fun x -&gt; printfn $&quot;{fst x} {snd x}&quot;)
        |&gt; fun _ -&gt; printfn $&quot;&quot;

// Print yearly counts printEntryCounts "Blogs" postCountsByYear 2

printEntryCounts "Notes" noteCountsByYear 2

printEntryCounts "Responses" responseCountsByYear 2

// Print response types printEntryCounts "Response Types" responsesByType -1

// Print response tag counts printEntryCounts "Response Tags" responsesByTag 5

// Print response by host name printEntryCounts "Domains" responsesByDomain 5

Expected Output

Blogs
2023 5
2022 7

Notes 2023 34 2022 36

Responses 2023 216 2022 146

Response Types bookmark 151 reshare 48 reply 10 star 7

Response Tags ai 104 llm 42 untagged 41 opensource 31 internet 17

Domains github.com 15 huggingface.co 11 arxiv.org 10 openai.com 6 www.theverge.com 4