~n0mn0m/Statiq.Blog

e954b158815086aa609e9c8c9bdc677aa131c36e — n0mn0m 11 months ago 4b4935f
Correct post template and clean up commands

- Post template wasn't being rendered correctly. Fixed layout issues.
- Add clean commands to build.
- Remove output content before any run.
- Move all content into the content div.
M .gitignore => .gitignore +2 -1
@@ 298,4 298,5 @@ riderModule.iml
/_ReSharper.Caches/

output/
logs/
\ No newline at end of file
logs/
.DS_Store
\ No newline at end of file

M build.cake => build.cake +11 -7
@@ 2,26 2,30 @@ var target = Argument("target", "Build");
var configuration = Argument("configuration", "Release");

Task("Clean")
    .Does(() => CleanDirectory($"./src/bin/**"))
    .Does(() => CleanDirectory("./temp"))
    .Does(() => CleanDirectory("./wwwroot"))
    .Does(() => CleanDirectory("./logs"))
    .Does(() => CleanDirectory("./output"));
    .Does(() => DeleteDirectory($"./src/bin/**", new DeleteDirectorySettings {Recursive = true, Force = true}))
    .Does(() => DeleteDirectory("./src/logs", new DeleteDirectorySettings {Recursive = true, Force = true}))
    .Does(() => DeleteDirectory("./src/wwwroot", new DeleteDirectorySettings {Recursive = true, Force = true}))
    .Does(() => DeleteDirectory("./temp", new DeleteDirectorySettings {Recursive = true, Force = true}))
    .Does(() => DeleteDirectory("./output", new DeleteDirectorySettings {Recursive = true, Force = true}));

Task("Build")
    .Does(() => DotNetCoreRun("./src/src.csproj"));

Task("Preview")
    .Does(() => DeleteDirectory("./temp",  new DeleteDirectorySettings {Recursive = true, Force = true}))
    .Does(() => DeleteDirectory("./output",  new DeleteDirectorySettings {Recursive = true, Force = true}))
    .Does(() => DotNetCoreRun("./src/src.csproj", new ProcessArgumentBuilder()
        .Append("preview")
        .Append("--nocache")
        .Append("--root=/Users/n0mn0m/RiderProjects/Unexpectedeof.Blog/")));
        
Task("Run")
    .Does(() => DeleteDirectory("./temp",  new DeleteDirectorySettings {Recursive = true, Force = true}))
    .Does(() => DeleteDirectory("./output",  new DeleteDirectorySettings {Recursive = true, Force = true}))
    .Does(() => DotNetCoreRun("./src/src.csproj", new ProcessArgumentBuilder()
        .Append("--root=/Users/n0mn0m/RiderProjects/Unexpectedeof.Blog/")
        .Append("--log-file=run_")
        .Append("--nocache")
        .Append("--serial")));
        .Append("--nocache")));

Task("Default")
    .IsDependentOn("Build");

A input/404.md => input/404.md +6 -0
@@ 0,0 1,6 @@
---
Title: Page Not Found
ShowInNavbar: false
---

![404](../assets/images/404.png)

A input/_content.hbs => input/_content.hbs +4 -0
@@ 0,0 1,4 @@
<div id="content">
    <h1>{{title}}</h1>
    {{{body}}}
</div>

M input/_index.hbs => input/_index.hbs +16 -16
@@ 1,18 1,18 @@
<div id="content">
    <div class="row">
        <div class="8u 12u$(medium)">
            {{#each posts}}
            <div>
                <a href="{{link}}">
                    <h2>{{title}}</h2>
                </a>
                <p>Posted on {{date}}</p>
                <p>{{{excerpt}}}</p>
    <div id="content">
        <div class="row">
            <div class="8u 12u$(medium)">
                {{#each posts}}
                <div>
                    <a href="{{link}}">
                        <h2>{{title}}</h2>
                    </a>
                    <p>Posted on {{date}}</p>
                    <p>{{{excerpt}}}</p>
                </div>
                {{/each}}
            </div>
            <div class="4u 12u$(medium) text-right">
                <a href="/posts" class="action button">Archive &rarr;</a>
            </div>
            {{/each}}
        </div>
        <div class="4u 12u$(medium) text-right">
            <a href="/posts" class="action button">Archive &rarr;</a>
        </div>
    </div>
</div>
\ No newline at end of file
    </div>
\ No newline at end of file

M input/_post.hbs => input/_post.hbs +8 -12
@@ 1,15 1,11 @@
<header>
<div id="content">
    <h1>{{title}}</h1>
    <p><em>Published on {{date}}</em></p>
</header>

<div id="content">
    {{{body}}}
</div>

<ul id="post-tags">
    <li>Post Tags: </li>
{{#each tags}}
    <li><a role="button" href="{{link}}"> {{title}}</a>, </li>
{{/each}}
</ul>
    <ul id="post-tags">
        <li>Post Tags:</li>
        {{#each tags}}
            <li><a role="button" href="{{link}}" class="button">{{title}}</a></li>
        {{/each}}
    </ul>
</div>
\ No newline at end of file

M input/_tagIndex.hbs => input/_tagIndex.hbs +2 -3
@@ 1,6 1,5 @@
<h1>All Tags</h1>

<div id="content">
<div id="content">
    <h1>All Tags</h1>
    <ul id="all-tags" class="actions">
        {{#each tags}}
        <li><a role="button" href="{{link}}" class="button">{{title}}</a>, </li>

A input/about.md => input/about.md +46 -0
@@ 0,0 1,46 @@
---
Title: About
ShowInNavbar: false
---

Hi, I'm Alexander (n0mn0m in some spaces)

Maker / Mentor / Forever a student

Currently located in Louisville, KY USA I enjoy creating and working on projects that
intersect with every day life. 


During the day I am at Humana where I help data scientist deploy models that assist
providers in understanding patient history and events.


Previously I worked at Elastic as a Senior Software Engineer at where we launched the
initial billing integrations for GCP Marketplace. Before that I was a Senior Analytics
Consultant for Aspect building solutions in the retail and airline industries.


I obtained my BS in Computer Information Technology from Western Kentucky University
where I focused on network hardware and database technologies. I continue to learn
through a variety of platforms such as EdX, Element14 and technical publishers like
No Starch and Manning.


When I am not at work I like to find opportunities to give back via open source and my 
local community. I have helped develop and teach Python courses with Code Louisville, I'm
one of the co-organizers and founders of the Louisville Hardware Happy Hour and I'm
reguarly involved with DerbyPy our local Python user group. Additionally I like to write,
contribute to OSS and I'm constantly looking for something to hack on. Lately most of my
personal projects have centered on using a variety of hardware platforms to find new ways
to automate and interact with the world around us.


Aside from the technical I am the proud father of Maris and a gardener in the making.


If you want to know more you can check out my [resume](/resume) or reach out
at <alexander@unexpectedeof.net> where I enjoy chatting with others.

<p>
<img src="../assets/images/us.png" alt="profile image" align="middle">
</p>

A input/certs.md => input/certs.md +10 -0
@@ 0,0 1,10 @@
---
Title: Certificates
ShowInNavbar: false
---

- [UT.6.10x: Embedded Systems](../assets/certifications/Embedded_601.pdf)
- [Microsoft® Certified Solutions Associate: Web Applications Charter Member](../assets/certifications/MCSA_WebApps.pdf)
- [Microsoft Certified Solutions Developer: Web Applications](../assets/certifications/MCSD_WebApps.pdf)
- [Microsoft Certified Professional](../assets/certifications/MCP.pdf)
- Bachelor of Science in Computer Information Technology - Western Kentucky University 2011

A input/podcast.md => input/podcast.md +17 -0
@@ 0,0 1,17 @@
---
Title: Podcasts
ShowInNavbar: false
---

# Now Listening

Below are some of the podcast I enjoy listening to and recommend.

- [BSD Now](https://www.bsdnow.tv/)
- [Corecursive](https://corecursive.com/)
- [Dev Game Club](http://www.devgameclub.com/)
- [Embedded](https://embedded.fm/)
- [Hackaday](https://hackaday.com/category/podcasts/)
- [No Dogma](https://nodogmapodcast.bryanhogan.net/)
- [The Amp Hour](https://theamphour.com/)
- [Stuff You Should Know](https://www.stuffyoushouldknow.com/)

A input/resume.md => input/resume.md +90 -0
@@ 0,0 1,90 @@
---
Title: Resume
ShowInNavbar: false
---

### Profile

I am a software engineer that enjoys working on projects that let people experience
and interact with technology in new and unique ways. I have experience in a variety
of date oriented domains, distributed system and embedded applications. Along with
building and maintaining systems I am passionate about teaching, mentoring and
giving back to the community. 

### Experience

#### Humana
- Senior Software Engineer - September 2019 to Present
    - Collaborate with Data Scientist to transform unstructured member and provider
    data into structured datasets, deploy NLP models and better integrate software
    engineers and data scientist. 
    - Designed, built and deployed a system for orchestrating the profiling and
    measurement of OCR experiment accuracy and system performance.
    - Collaborated on a project where we deployed the first FaaS application and
    ML model at Humana on Azure.

#### Elastic
- Senior Software Engineer- April 2019 to August 2019
    - Build out the Elastic Cloud GCP Marketplace billing integration.

#### Humana
- Senior Software Engineer - January 2017 to March 2019
    - Collaborate with Data Scientist focused on provider patient insights to 
    help modernize software/model development practices, expand software engineering
    integration and buildout supporting Python services and packages.
- Analytic Developer - July 2015 to January 2017
    - Lead the development and expansion of SIU Fraud data integration, reporting
    and analysis.

#### Aspect
- Senior Analytic Consultant - January 2014  to July 2015
    - Partner with clients in retail and consumer airline industries to build out
    or expand analytic capabilities via the MS BI stack.
- Developer - November 2012  to January 2014
    - Responsible for building a variety of front end web and cli tools for
    clients using C#.

### Education and Certifications

- Bachelors of Science in Computer Information Technologies, 
Western Kentucky University, Bowling Green, KY, August 2011
- [MCSD Web Applications](/certifications/MCSD_WebApps.pdf)
- [UT.6.10x: Embedded Systems](/certifications/Embedded_601.pdf)

### Technical Competencies
- Python, C#, C, Rust, SQL, bash
- SQL Server, Postgres, Hadoop, Spark, Elasticsearch, RabbitMQ, Netezza
- git, gdb, Linux, docker, Jupyter
- Software Architecture, Software Testing, Pair Programming, CI/CD

### Volunteer and Open Source Experience

- Hardware Happy Hour Louisville
- DerbyPy
- Code Louisville
- PyMSSQL
- aioodbc
- Apache Arrow
- Firefox Mobile

### Talks

- [Intro to Circuit Playground Express](https://github.com/Hardware-Happy-Hour-Louisville/HardwareLou_CircuitPlayground), H3 Louisville, Louisville KY January 2020
- [Python for Embedded Systems](https://github.com/DerbyPy/python_for_embedded_systems), DerbyPy Louisville KY 2019
- [What is ODBC](https://github.com/DerbyPy/what-is-odbc), DerbyPy, Louisville KY March 2019
- [Intro to PySpark](https://github.com/DerbyPy/intro-to-pyspark), DerbyPy, Louisville KY October 2018
- [Python Modules and Packages](https://github.com/DerbyPy/modules-and-packages-intro), Derby Py, Louisville KY September 2018
- [Column Oriented Data](https://github.com/n0mn0m/presentations/blob/master/JupyterNotebooks/DerbyPyArrow.ipynb), DerbyPy, Louisville KY June 2018

### Awards
- [Hackaday Connected World Contest](https://hackaday.io/contest/163251-connected-world-contest/log/169141-30-winners-get-25-oshpark-certificates) - Connected Roomba
- Humana Star Award 2018 - Data Engineering
- Best Buy Star Award 2010 - P&L Logistics

### Memberships

- [ACM](http://member.acm.org/~ahagerman)

### Downloads
- [Summary Resume](https://git.sr.ht/~n0mn0m/resume/blob/master/resume_summary.pdf)
- [Detailed Resume](https://git.sr.ht/~n0mn0m/resume/blob/master/resume_detailed.pdf)

A input/shelf.md => input/shelf.md +52 -0
@@ 0,0 1,52 @@
---
Title: Bookshelf
ShowInNavbar: false
---


# The Book Shelf

Here is a collection of what I'm reading, what I will read or what I've read.
Feel free to reach out and chat as I love discussing books or learning about
new books to checkout.

### Now reading
- [Data Science from Scratch 2nd Edition](http://shop.oreilly.com/product/0636920179337.do)

### On the stack
- [Doing Math with Python](https://nostarch.com/doingmathwithpython)
- [Make Electronics 2nd Edition](https://www.adafruit.com/product/203)
- [Making Embedded Systems](http://shop.oreilly.com/product/0636920017776.do)

### On the heap
- [Effective Debugging](https://www.pearson.com/us/higher-education/program/Spinellis-Effective-Debugging-66-Specific-Ways-to-Debug-Software-and-Systems/PGM328356.html)
- [Fluent Python](http://shop.oreilly.com/product/0636920032519.do)
- [Hacking the Xbox](https://nostarch.com/xbox)
- [Math Adventures with Python](https://nostarch.com/mathadventures)
- [Mazes for Programmers](https://pragprog.com/book/jbmaze/mazes-for-programmers)
- [Monstress Vol. 4](https://imagecomics.com/comics/releases/monstress-vol-4-tp)
- [PoC || GTGO 2](https://nostarch.com/gtfo2)
- [Test Driven Development for Embeddedd C](https://pragprog.com/book/jgade/test-driven-development-for-embedded-c)
- [The Hardware Hacker](https://nostarch.com/hardwarehackerpaperback)
- [The Pragmatic Programmer 2nd Edition](https://pragprog.com/book/tpp20/the-pragmatic-programmer-20th-anniversary-edition)


### Recommended reading
- [21st Century C](http://shop.oreilly.com/product/0636920033677.do)
- [Algorithms in C](http://shop.oreilly.com/product/9781565924536.do)
- [Computer Organization and Design](https://dl.acm.org/citation.cfm?id=3153875)
- [The Phoenix Project](https://www.oreilly.com/library/view/the-phoenix-project/9781457191350/)
- [Classic Computer Science Problems in Python](https://www.manning.com/books/classic-computer-science-problems-in-python)
- [Design Patterns Elements of Reusable Object Oriented Software](https://www.oreilly.com/library/view/design-patterns-elements/0201633612/)
- [Designing Data-Intesive Applications](https://dataintensive.net/)
- [SICP](https://mitpress.mit.edu/sites/default/files/sicp/index.html)
- [The Linux Command Line 2nd Edition](https://nostarch.com/tlcl2)
- [Unix and Unix System Administartion Handbook](https://www.oreilly.com/library/view/unix-and-linux/9780134278308/)
- [Saga](https://imagecomics.com/comics/series/saga)
- [The Culture](https://en.wikipedia.org/wiki/Culture_series)


### Newsletters
- [Hackaday](http://eepurl.com/bQmQqD)
- [Morning cup of code](https://morningcupofcoding.com/)
- [Python Weekly](https://www.pythonweekly.com/)

A input/tools.md => input/tools.md +25 -0
@@ 0,0 1,25 @@
---
Title: Tools
ShowInNavbar: false
---

# Some tools I use

I've been asked at different meetups and events about some of the tools I use. Whether
or not this is broadly helpful I figured I would start capturing this here. I think
the most important things to keep in mind are:

- Use the right tool for the job. What are you trying to do? What's the best way to do that.
- Mastery of a given tool takes time so be careful of switching tools frequently.

With that, I've ran the gamut of editors, shells, etc. and this is what I tend to use
for my day to day now.

 - emacs
 - datagrip
 - git
 - llvm
 - gdb
 - ipython
 - jupyter
 - a flavor of Unix(FreeBSD, OSX) and Linux(Ubuntu, RHEL)

M src/Extensions/DocumentExtensions.cs => src/Extensions/DocumentExtensions.cs +1 -1
@@ 3,7 3,7 @@ using System.Dynamic;
using Statiq.Common;
using Statiq.Feeds;

namespace site.Extensions
namespace src.Extensions
{
    public static class DocumentExtensions
    {

M src/Pipelines/ApplyLayoutPipeline.cs => src/Pipelines/ApplyLayoutPipeline.cs +7 -16
@@ 1,12 1,12 @@
using System;
using site.Extensions;
using src.Extensions;
using System.Linq;
using Statiq.Common;
using Statiq.Core;
using Statiq.Feeds;
using Statiq.Handlebars;

namespace site.Pipelines
namespace src.Pipelines
{
    public abstract class ApplyLayoutPipeline : Pipeline
    {


@@ 19,26 19,17 @@ namespace site.Pipelines
                    .First(x => x.Source.FileName == "layout.hbs")
                    .GetContentStringAsync())),
                new RenderHandlebars("template")
                    .Configure(async (context, document, handlebars) =>
                    {
                        foreach (var partial in context.Outputs
                            .FromPipeline(nameof(LayoutPipeline)).WhereContainsKey("partial"))
                        {
                            handlebars.RegisterTemplate(
                                partial.GetString("partial"),
                                await partial.GetContentStringAsync());
                        }
                    }).WithModel(Config.FromDocument(async (doc, ctx) => new
                    .WithModel(Config.FromDocument(async (doc, ctx) => new
                    {
                        title = doc.GetString(Keys.Title),
                        body = await doc.GetContentStringAsync(),
                        link = ctx.GetLink(doc),
                        year = ctx.Settings.GetString(FeedKeys.Copyright),
                        tags = ctx.Outputs.FromPipeline(nameof(TagsPipeline))
                            .OrderByDescending(x => x.GetChildren().Count)
                            .ThenBy(x => x.GetString(Keys.GroupKey))
                            .Take(10)
                            .Select(x => x.AsTag(ctx))
                                                    .OrderByDescending(x => x.GetChildren().Count)
                                                    .ThenBy(x => x.GetString(Keys.GroupKey))
                                                    .Take(10)
                                                    .Select(x => x.AsTag(ctx))
                    })),
                new SetContent(Config.FromDocument(x => x.GetString("template")))
            };

M src/Pipelines/ArchivePipeline.cs => src/Pipelines/ArchivePipeline.cs +2 -2
@@ 1,11 1,11 @@
using System.Linq;
using site.Extensions;
using src.Extensions;
using Statiq.Common;
using Statiq.Core;
using Statiq.Feeds;
using Statiq.Handlebars;

namespace site.Pipelines
namespace src.Pipelines
{
    public class ArchivePipeline : ApplyLayoutPipeline
    {

M src/Pipelines/AssetsPipeline.cs => src/Pipelines/AssetsPipeline.cs +1 -1
@@ 1,7 1,7 @@
using Statiq.Common;
using Statiq.Core;

namespace site.Pipelines
namespace src.Pipelines
{
    public class AssetsPipeline : Pipeline
    {

M src/Pipelines/BlogPostPipeline.cs => src/Pipelines/BlogPostPipeline.cs +3 -3
@@ 1,5 1,5 @@
using System.Linq;
using site.Extensions;
using src.Extensions;
using Statiq.Common;
using Statiq.Core;
using Statiq.Feeds;


@@ 8,7 8,7 @@ using Statiq.Html;
using Statiq.Markdown;
using Statiq.Yaml;

namespace site.Pipelines
namespace src.Pipelines
{
    public class BlogPostPipeline : ApplyLayoutPipeline
    {


@@ 53,4 53,4 @@ namespace site.Pipelines
            };
        }
    }
}
}
\ No newline at end of file

M src/Pipelines/ContentPipeline.cs => src/Pipelines/ContentPipeline.cs +15 -15
@@ 1,5 1,5 @@
using System.Linq;
using site.Extensions;
using System.Linq;
using src.Extensions;
using Statiq.Common;
using Statiq.Core;
using Statiq.Feeds;


@@ 8,7 8,7 @@ using Statiq.Html;
using Statiq.Markdown;
using Statiq.Yaml;

namespace site.Pipelines
namespace src.Pipelines
{
    public class ContentPipeline: ApplyLayoutPipeline
    {


@@ 26,18 26,18 @@ namespace site.Pipelines
                    new SetDestination(".html")
            };

            // PostProcessModules = PostProcessModules.Prepend(
            //     new SetMetadata("template",
            //         Config.FromContext(async ctx =>
            //             await ctx.FileSystem.GetInputFile("_content.hbs").ReadAllTextAsync())),
            //     new RenderHandlebars("template")
            //         .WithModel(Config.FromDocument(async (doc, context) => new
            //         {
            //             title = doc.GetString(Keys.Title),
            //             body = await doc.GetContentStringAsync(),
            //         })),
            //     new SetContent(Config.FromDocument(x => x.GetString("template"))));
            //
            PostProcessModules = PostProcessModules.Prepend(
                new SetMetadata("template",
                    Config.FromContext(async ctx =>
                        await ctx.FileSystem.GetInputFile("_content.hbs").ReadAllTextAsync())),
                new RenderHandlebars("template")
                    .WithModel(Config.FromDocument(async (doc, context) => new
                    {
                        title = doc.GetString(Keys.Title),
                        body = await doc.GetContentStringAsync(),
                    })),
                new SetContent(Config.FromDocument(x => x.GetString("template"))));
            
            OutputModules = new ModuleList
            {
                new WriteFiles()

M src/Pipelines/FeedsPipeline.cs => src/Pipelines/FeedsPipeline.cs +1 -1
@@ 2,7 2,7 @@
using Statiq.Core;
using Statiq.Feeds;

namespace site.Pipelines
namespace src.Pipelines
{
    public class FeedsPipeline : Pipeline
    {

M src/Pipelines/IndexPipeline.cs => src/Pipelines/IndexPipeline.cs +2 -7
@@ 1,12 1,12 @@
using System.Linq;
using site.Extensions;
using src.Extensions;
using Statiq.Common;
using Statiq.Core;
using Statiq.Feeds;
using Statiq.Handlebars;
using Statiq.Yaml;

namespace site.Pipelines
namespace src.Pipelines
{
    public class IndexPipeline : ApplyLayoutPipeline
    {


@@ 27,15 27,10 @@ namespace site.Pipelines
                    .WithModel(Config.FromDocument((doc, context) => new
                    {
                        description = context.Settings.GetString(FeedKeys.Description),
                        head = doc.GetString(Keys.SourceHeaders),
                        posts = context.Outputs.FromPipeline(nameof(BlogPostPipeline))
                            .OrderByDescending(x => x.GetDateTime(FeedKeys.Published))
                            .Take(3)
                            .Select(x => x.AsPost(context)),
                        olderPosts = context.Outputs.FromPipeline(nameof(BlogPostPipeline))
                            .OrderByDescending(x => x.GetDateTime(FeedKeys.Published))
                            .Skip(3)
                            .Select(x => x.AsPost(context)), 
                        tags = context.Outputs.FromPipeline(nameof(TagsPipeline))
                            .OrderByDescending(x => x.GetChildren().Count)
                            .ThenBy(x => x.GetString(Keys.GroupKey))

M src/Pipelines/LayoutPipeline.cs => src/Pipelines/LayoutPipeline.cs +1 -1
@@ 2,7 2,7 @@
using Statiq.Core;
using Statiq.Yaml;

namespace site.Pipelines
namespace src.Pipelines
{
    public class LayoutPipeline : Pipeline
    {

M src/Pipelines/TagIndexPipeline.cs => src/Pipelines/TagIndexPipeline.cs +2 -2
@@ 1,10 1,10 @@
using System.Linq;
using site.Extensions;
using src.Extensions;
using Statiq.Common;
using Statiq.Core;
using Statiq.Handlebars;

namespace site.Pipelines
namespace src.Pipelines
{
    public class TagIndexPipeline : ApplyLayoutPipeline
    {

M src/Pipelines/TagsPipeline.cs => src/Pipelines/TagsPipeline.cs +2 -8
@@ 1,11 1,11 @@
using System.Linq;
using site.Extensions;
using src.Extensions;
using Statiq.Common;
using Statiq.Core;
using Statiq.Feeds;
using Statiq.Handlebars;

namespace site.Pipelines
namespace src.Pipelines
{
    public class TagsPipeline : ApplyLayoutPipeline
    {


@@ 31,15 31,9 @@ namespace site.Pipelines
                    .WithModel(Config.FromDocument((doc, context) => new
                    {
                        title = doc.GetString(Keys.GroupKey),
                        head = doc.GetString(Keys.SourceHeaders),
                        posts = doc.GetChildren()
                            .OrderByDescending(x => x.GetDateTime(FeedKeys.Published))
                            .Select(x => x.AsPost(context)),
                        tags = context.Inputs
                            .OrderByDescending(x => x.GetChildren().Count)
                            .ThenBy(x => x.GetString(Keys.GroupKey))
                            .Take(10)
                            .Select(x => x.AsTag(context)),
                    }))
            };


M src/Program.cs => src/Program.cs +2 -3
@@ 3,7 3,6 @@ using System.Threading.Tasks;
using Statiq.App;
using Statiq.Common;
using Statiq.Feeds;
using Statiq.Web;

namespace src
{


@@ 13,8 12,8 @@ namespace src
        {
            return Bootstrapper
                .Factory
                .CreateWeb(args)
                .AddHostingCommands()
                .CreateDefault(args)
                // .AddHostingCommands()
                .AddSetting(Keys.LinkLowercase, true)
                .AddSetting(Keys.LinksUseHttps, true)
                .AddSetting(Keys.Host, "alexander@unexpectedeof.net")