diff --git a/dennis/src/dennis.py b/dennis/src/dennis.py
index 59ac53d..c82d13f 100644
--- a/dennis/src/dennis.py
+++ b/dennis/src/dennis.py
@@ -1,7 +1,11 @@
+import os
+import markdown
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
-from datetime import date
+from datetime import date, datetime
+
+STATIC_PATH = "./static"
api = FastAPI()
@@ -19,121 +23,59 @@ class Article(BaseModel):
date: date
content: str
-def get_html(content):
- with open('./static/'+content) as file:
- return file.read();
+def walk_for_md(path: str):
+ buf = []
-fake_db = [
+ for root, _, files in os.walk(path):
+ print(files)
+ mdeez = [f"{root}/{filename}" for filename in files if filename[-2:] == "md"]
- Article(
- content_type='project',
- title='''Lightning''',
- date=date(2023, 4, 27),
- content=get_html('projects/20230427-lightning.html'),
- ),
+ if mdeez:
+ buf.extend(mdeez)
- Article(
- content_type='project',
- title='''Cartman is public!''',
- date=date(2022, 10, 20),
- content=get_html('projects/20221020-cartman.html'),
- ),
+ return buf
- Article(
- content_type='game',
- title='''fps''',
- date=date(2022, 10, 9),
- content=get_html('games/fps.html'),
- ),
+def get_articles_from_dir(root_path: str) -> list[Article]:
+ md = markdown.Markdown(extensions=['meta'])
+ articles: list[Article] = []
- Article(
- content_type='game',
- title='''balls''',
- date=date(2022, 9, 13),
- content=get_html('games/balls.html'),
- ),
+ for file_path in walk_for_md(root_path):
+ with open(file_path) as file:
+ html: str = md.convert(file.read());
+ meta: dict = md.Meta;
- Article(
- content_type='game',
- title='''adam''', # this stuff will change
- date=date(2022, 9, 11),
- content=get_html('games/adam.html'),
- ),
+ articles.append(
+ Article(
+ content_type=meta.get('content_type')[0],
+ title=meta.get('title')[0],
+ date=datetime.strptime( meta.get( 'date')[0], '%Y %m %d'),
+ content=html,
+ ));
- Article(
- content_type='blog',
- title='''It's a post about nothing!''',
- date=date(2022, 7, 1),
- content=get_html('blog/20220701-progress.html'),
- ),
+ return articles;
- Article(
- content_type='project',
- title='''What Goes Into a Successful Reddit Post?''',
- date=date(2022, 6, 16),
- content=get_html('projects/20220614-reddit.html'),
- ),
-
- Article(
- content_type='blog',
- title='''Back to School''',
- date=date(2022, 6, 2),
- content=get_html('blog/20220602-back.html'),
- ),
-
- Article(
- content_type='game',
- title='''snek''',
- date=date(2022, 5, 29),
- content=get_html('games/snek.html'),
- ),
-
- Article(
- content_type='project',
- title='''Predicting Housing Prices''',
- date=date(2022, 5, 29),
- content=get_html('projects/20220529-housing.html'),
- ),
-
- Article(
- content_type='blog',
- title='''It's about time, NVIDIA''',
- date=date(2022, 5, 20),
- content=get_html('blog/20220520-nvidia.html'),
- ),
-
- Article(
- content_type='blog',
- title='''Change''',
- date=date(2022, 5, 6),
- content=get_html('blog/20220506-change.html'),
- ),
-
- Article(
- content_type='blog',
- title='''Hume''',
- date=date(2022, 2, 7),
- content=get_html('blog/000000000-swim.html'),
- ),
-
- ];
+DB = sorted(
+ get_articles_from_dir(STATIC_PATH),
+ key=lambda article: article.date,
+ reverse=True
+ );
@api.get('/home')
async def serve_home():
- return fake_db
+ return DB
@api.get('/blog')
async def serve_blog():
- return [entry for entry in fake_db if entry.content_type == 'blog']
+ return [entry for entry in DB if entry.content_type == 'blog']
@api.get('/projects')
async def serve_projects():
- return [entry for entry in fake_db if entry.content_type == 'project' or entry.content_type == 'game']
+ return [entry for entry in DB if entry.content_type == 'project' or entry.content_type == 'game']
@api.get('/bots')
async def serve_bots():
- return [entry for entry in fake_db if entry.content_type == 'chatbot']
+ return [entry for entry in DB if entry.content_type == 'chatbot']
diff --git a/dennis/static/blog/000000000-swim.html b/dennis/static/blog/000000000-swim.html
deleted file mode 100644
index 777051c..0000000
--- a/dennis/static/blog/000000000-swim.html
+++ /dev/null
@@ -1,158 +0,0 @@
-
-
- April 22, 1958
- 57 Perry Street
- New York City
-
- Dear Hume,
-
- You ask advice: ah, what a very human and very dangerous thing to do! For to give advice
- to a man who asks what to do with his life implies something very close to egomania. To
- presume to point a man to the right and ultimate goal—to point with a trembling
- finger in the RIGHT direction is something only a fool would take upon himself.
-
-
- I am not a fool, but I respect your sincerity in asking my
- advice. I ask you though, in listening to what I say, to remember that all advice can
- only be a product of the man who gives it. What is truth to one may be a disaster to
- another. I do not see life through your eyes, nor you through mine. If I were to attempt
- to give you
- specific advice, it would be too much like the blind leading the blind.
-
-
-
- "To be, or not to be: that is the question: Whether 'tis nobler in the mind to
- suffer the slings and arrows of outrageous fortune, or to take arms against a sea of
- troubles..."
-
-
- (Shakespeare)
-
-
- And indeed, that IS the question: whether to float with the tide, or to swim for a goal.
- It is a choice we must all make consciously or unconsciously at one time in our lives.
- So few people understand this! Think of any decision you've ever made which had a
- bearing on your future: I may be wrong, but I don't see how it could have been anything
- but a choice however indirect—between the two things I've mentioned: the floating
- or the swimming.
-
-
- But why not float if you have no goal? That is another question.
- It is unquestionably better to enjoy the floating than to swim in uncertainty. So how
- does a man find a goal? Not a castle in the stars, but a real and tangible thing. How
- can a man be sure he's not after the "big rock candy mountain," the enticing sugar-candy
- goal that has little taste and no substance?
-
-
- The answer—and, in a sense, the tragedy of life—is
- that we seek to understand the goal and not the man. We set up a goal which demands of
- us certain things: and we do these things. We adjust to the demands of a concept which
- CANNOT be valid. When you were young, let us say that you wanted to be a fireman. I feel
- reasonably safe in saying that you no longer want to be a fireman. Why? Because your
- perspective has changed. It's not the fireman who has changed, but you. Every man is the
- sum total of his reactions to experience. As your experiences differ and multiply, you
- become a different man, and hence your perspective changes. This goes on and on. Every
- reaction is a learning process; every significant experience alters your perspective.
-
-
- So it would seem foolish, would it not, to adjust our lives to
- the demands of a goal we see from a different angle every day? How could we ever hope to
- accomplish anything other than galloping neurosis?
-
-
- The answer, then, must not deal with goals at all, or not with
- tangible goals, anyway. It would take reams of paper to develop this subject to
- fulfillment. God only knows how many books have been written on "the meaning of man" and
- that sort of thing, and god only knows how many people have pondered the subject. (I use
- the term "god only knows" purely as an expression.) There's very little sense in my
- trying to give it up to you in the proverbial nutshell, because I'm the first to admit
- my absolute lack of qualifications for reducing the meaning of life to one or two
- paragraphs.
-
-
- I'm going to steer clear of the word "existentialism," but you
- might keep it in mind as a key of sorts. You might also try something called
- Being and Nothingness by Jean-Paul Sartre, and another little thing called
- Existentialism: From Dostoyevsky to Sartre. These are merely suggestions. If
- you're genuinely statisfied with what you are and what you're doing, then give those
- books a wide berth. (Let sleeping dogs lie.) But back to the answer. As I said, to put
- our faith in tangible goals would seem to be, at best, unwise. So we do not strive to be
- firemen, we do not strive to be bankers, nor policemen, nor doctors. WE STRIVE TO BE
- OURSELVES.
-
-
- But don't misunderstand me. I don't mean that we can't BE
- firemen, bankers, or doctors—but that we must make the goal conform to the
- individual, rather than make the individual conform to the goal. In every man, heredity
- and environment have combined to produce a creature of certain abilities and
- desires—including a deeply ingrained need to function in such a way that his life
- will be MEANINGFUL. A man has to BE something; he has to matter.
-
-
- As I see it then, the formula runs something like this: a man
- must choose a path which will let his ABILITIES function at maximum efficiency toward
- the gratification of his DESIRES. In doing this, he is fulfilling a need (giving himself
- identity by functioning in a set pattern toward a set goal) he avoids frustrating his
- potential (choosing a path which puts no limit on his self-development), and he avoids
- the terror of seeing his goal wilt or lose its charm as he draws closer to it (rather
- than bending himself to meet the demands of that which he seeks, he has bent his goal to
- conform to his own abilities and desires).
-
-
- In short, he has not dedicated his life to reaching a
- pre-defined goal, but he has rather chosen a way of like he KNOWS he will enjoy. The
- goal is absolutely secondary: it is the
- functioning toward the goal which is important. And it seems almost ridiculous to
- say that a man MUST function in a pattern of his own choosing; for to let another man
- define your own goals is to give up one of the most meaningful aspects of life—the
- definitive act of will which makes a man an individual.
-
-
- Let's assume that you think you have a choice of eight paths to
- follow (all pre-defined paths, of course). And let's assume that you can't see any real
- purpose in any of the eight. Then—and here is the essence of all I've
- said—you MUST FIND A NINTH PATH.
-
-
- Naturally, it isn't as easy as it sounds. you've lived a
- relatively narrow life, a vertical rather than a horizontal existence. So it isn't any
- too difficult to understand why you seem to feel the way you do. But a man who
- procrastinates in his CHOOSING will inevitably have his choice made for him by
- circumstance.
-
-
- So if you now number yourself among the disenchanted, then you
- have no choice but to accept things as they are, or to seriously seek something else.
- But beware of looking for
- goals: look for a way of life. Decide how you want to live and then see what you
- can do to make a living WITHIN that way of life. But you say, "I don't know where to
- look; I don't know what to look for."
-
-
- And there's the crux. Is it worth giving up what I have to look
- for something better? I don't know—is it? Who can make that decision but you? But
- even by DECIDING TO LOOK, you go a long way toward making the choice.
-
-
- If I don't call this to a halt, I'm going to find myself writing
- a book. I hope it's not as confusing as it looks at first glance. Keep in mind, of
- course, that this is MY WAY of looking at things. I happen to think that it's pretty
- generally applicable, but you may not. Each of us has to create our own credo—this
- merely happens to be mine.
-
-
- If any part of it doesn't seem to make sense, by all means call
- it to my attention. I'm not trying to send you out "on the road" in search of Valhalla,
- but merely pointing out that it is not necessary to accept the choices handed down to
- you by life as you know it. There is more to it than that—no one HAS to do
- something he doesn't want to do for the rest of his life. But then again, if that's what
- you wind up doing, by all means convince yourself that you HAD to do it. You'll have
- lots of company.
-
-
- And that's it for now. Until I hear from you again, I remain,
-
- your friend...
- Hunter
-
-
diff --git a/dennis/test/blog/000000000-swim.md b/dennis/static/blog/000000000-swim.md
similarity index 100%
rename from dennis/test/blog/000000000-swim.md
rename to dennis/static/blog/000000000-swim.md
diff --git a/dennis/static/blog/20220506-change.html b/dennis/static/blog/20220506-change.html
deleted file mode 100644
index a1b6014..0000000
--- a/dennis/static/blog/20220506-change.html
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
- "Life should not be a journey to the grave with the intention of arriving safely in
- a pretty and well preserved body, but rather to skid in broadside in a cloud of
- smoke, thoroughly used up, totally worn out, and loudly proclaiming "Wow! What a
- Ride!"
-
- (Hunter S.Thompson)
-
-
- There comes a time in one's life, perhaps multiple, when there
- is an unquestionable need for change. Maybe you're not sure how, why, or where it came
- from, or where even it is you're headed, or how to get there, but here you are taking
- your first steps toward a new life. A journey into the unknown. I've just set out on one
- of these journeys, and even as I sit here typing this now I can't help but feel a little
- bit nervous, but even more excited. I have absolutely no idea where I'm headed to be
- quite honest. But I know where I've been.
-
-
- Growing up I would always be taking things apart, I HAD to see
- what was inside. What makes this thing, a thing. What makes it tick? Can it tick faster?
- For no particular reason I just had to know every little detail about what made the
- thing the thing that it was and why it did what it did. It's a gift and a curse of
- sorts. Quickly this led to taking apart things of increasing complexity, our home
- computer for instance. Luckily I was able to get it put back together before my parents
- got home because it was made clear that this was not allowed, and the CPU didn't seem to
- mind the sudden absence of thermal compound either. I must have been around 7 or 8 years
- old at that time, and it still puzzles me just what is going on inside there.
-
-
- I have a better idea now, naturally I had to figure out just
- what all those pieces were, what they did, and how they did it. What if I replaced some
- of these parts with other parts? As I honed my web searching skills to try to answer the
- seemingly endless hows and whys I ended up building myself a little hotrod computer and
- then raced it against other peoples' computers because why not, right? And I actually
- won! It was an overclocking contest called the winter suicides, a kind of computer drag
- race. Highest CPU clock speed wins, you have to boot into Windows XP, open CPU-Z, and
- take a screenshot. If it crashes immediately after that (and it did) it still counts. I
- got some pretty weird looks from my father as I stuck my computer outside in the snow
- but that was a small price to pay for the grand prize which was a RAM kit (2GB of DDR400
- I believe) and RAM cooler.
-
-
- After getting comfortable with hardware I started to study the
- software side of things, I tried teaching myself C++ (and didn't get very far), I did
- teach myself HTML and CSS, some JavaScript, and started playing around with Linux. It
- took until only a year or two ago to finally be completely on Linux full time (gaming
- holding me back), I even have a Linux phone now (Pinephone Pro). At this point I reached
- high school and my attention moved from computers to cars.
-
- To be continued...
-
diff --git a/dennis/test/blog/20220506-change.md b/dennis/static/blog/20220506-change.md
similarity index 100%
rename from dennis/test/blog/20220506-change.md
rename to dennis/static/blog/20220506-change.md
diff --git a/dennis/static/blog/20220520-nvidia.html b/dennis/static/blog/20220520-nvidia.html
deleted file mode 100644
index 627c24f..0000000
--- a/dennis/static/blog/20220520-nvidia.html
+++ /dev/null
@@ -1,11 +0,0 @@
-
- It's about time... NVIDIA has finally released and is starting to
- support Open-source software with their new modules released recently for the Linux
- kernel. NVIDIA historically has been seemingly against Linux/OSS for whatever reason.
- This is a huge step forward both for end users and NVIDIA.
-
-
-
- NVIDIA open-gpu-kernel-modules on github.
-
-
diff --git a/dennis/test/blog/20220520-nvidia.md b/dennis/static/blog/20220520-nvidia.md
similarity index 100%
rename from dennis/test/blog/20220520-nvidia.md
rename to dennis/static/blog/20220520-nvidia.md
diff --git a/dennis/static/blog/20220602-back.html b/dennis/static/blog/20220602-back.html
deleted file mode 100644
index a3822ad..0000000
--- a/dennis/static/blog/20220602-back.html
+++ /dev/null
@@ -1,43 +0,0 @@
-
- Where the hell have I been!?
-
- Looking back at the past 5 weeks, it's impressive the amount of new things that have
- been shoved in my face. A list I'll try to make contains:
-
-
-
- It doesn't seem like much at the time except chaos, but then about a week later it
- finally sets in. After tomorrow we'll be halfway through the course and while I guess
- you could say that it's half over, or that it signifies progress, I feel it's more like
- being halfway up Mount Everest and looking—trying to squint through the clouds and
- make out what looks like the peak. I don't see a peak and maybe it's because I'm
- nearsighted but I can also tell you that if were to look down then I can't see where
- I've started either!
-
-
- It's been quite a ride and I hope to see it to the end. I don't have time to even think
- about it further. It's where I perform my best though, on my heels. Probably by
- design...
-
- After?
-
- I would like to use these skills to expand on some of the class projects I've worked on
- and I have some other ideas using language processing I think would be fun to play with.
- I think it would be fun to create an internet chat bot, we'll start with text but if
- speech recognition is practical then I may add and play with that too. I would also like
- to make some sort of "Propaganda Detector"
-
-
diff --git a/dennis/test/blog/20220602-back.md b/dennis/static/blog/20220602-back.md
similarity index 100%
rename from dennis/test/blog/20220602-back.md
rename to dennis/static/blog/20220602-back.md
diff --git a/dennis/static/blog/20220701-progress.html b/dennis/static/blog/20220701-progress.html
deleted file mode 100644
index f4e995c..0000000
--- a/dennis/static/blog/20220701-progress.html
+++ /dev/null
@@ -1,94 +0,0 @@
-
- The progress update
-
-
-
- Bots
-
- After finding a number of ways not to begin the project formerly known as my capstone,
- I've finally settled on a
- dataset.
- The project is about detecting bots, starting with twitter. I've
- studied a
- few
- different
- methods of bot detection and particularly like the
- DeBot and
- BotWalk methods and think I will try to mimic them,
- in that order.
-
-
- Long story short, DeBot uses a fancy method of time correlation to group accounts
- together based on their posting habits. By identifying accounts that all have identical
- posting habits that are beyond what a human could do by coincidence, this is a great
- first step to identifying an inital group of seed bots. This can then be expanded by
- using BotWalk's method of checking all the followers of the bot accounts and comparing
- anomalous behavior to separate humans from non-humans. Rinse and repeat. I'll begin this
- on twitter but hope to make it platform independent.
-
- The Real Capstone
-
- The bot project is too much to complete in this short amount of time, so instead I'm
- working with a
- small dataset
- containing info about cars with some specs and I'll predict MPG. The problem itself for
- me is trivial from past study/experience as an auto mechanic so I should have a nice
- playground to focus completely on modeling. It's a very small data set too at < 400
- lines, I should be able to test multiple models in depth very quickly. It may or may not
- be interesting, expect a write-up anyway.
-
- Cartman
-
- Well I guess I've adopted an 8 year old. Based on
- this project
- I've trained a chat bot with the personality of Eric Cartman. He's a feature of my
- Discord bot living on a Raspberry Pi 4B, which I would say is probably the slowest
- computer you would ever want to run something like this on. It takes a somewhat
- reasonable amount of time to respond, almost feeling human if you make it think a bit.
- The project uses PyTorch to train the model. I'd like
- to re-create it using TensorFlow as an
- exercise to understand each one better, but that's a project for another night. It also
- only responds to one line at a time so it can't carry a conversation with context,
- yet...
-
- Website
-
- I never thought I'd end up having a blog. I had no plans at all actually when I set up
- this server, just to host a silly page that I would change from time to time whenever I
- was bored. I've been looking at
- Hugo as a way to organize what is now just a list of
- divs in a single html file slowly growing out of control. Basically you just dump each
- post into its own file, create a template of how to render them, and let it do its
- thing. I should be able to create a template that recreates exactly what you see right
- now, which is beginning to grow on me.
-
-
- If you haven't noticed yet, (and I don't blame you if you haven't because only a handful
- of people even visit this page) each time there is an update there is a completely new
- background image, color scheme, a whole new theme. This is because this page is a near
- identical representation of terminal windows open my computer and each time I update the
- page I also update it with my current wallpaper, which generates the color scheme
- dynamically using
- Pywal.
-
- TODO:
-
- - Code blocks with syntax highlighting
- -
- Develop an easy workflow to dump a jupyter notebook into the website and have it
- display nicely with minimal effort
-
- -
- Find a way to hack plots generated with matplotlib to change colors with the page
- color scheme (or find another way to do the same thing)
-
- -
- Automate generating the site - probably
- Hugo
-
- - Separate from blog, projects, etc.
- - Add socials, contact, about
- - A bunch of stuff I haven't even thought of yet
-
- That's all for now
-
diff --git a/dennis/test/blog/20220701-progress.md b/dennis/static/blog/20220701-progress.md
similarity index 100%
rename from dennis/test/blog/20220701-progress.md
rename to dennis/static/blog/20220701-progress.md
diff --git a/dennis/static/games/adam.html b/dennis/static/games/adam.html
deleted file mode 100644
index 9ff0795..0000000
--- a/dennis/static/games/adam.html
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
- adam is a quick fps demo to test how well WebGL
- performs using Unity.
-
-
diff --git a/dennis/test/games/adam.md b/dennis/static/games/adam.md
similarity index 100%
rename from dennis/test/games/adam.md
rename to dennis/static/games/adam.md
diff --git a/dennis/static/games/balls.html b/dennis/static/games/balls.html
deleted file mode 100644
index 1eff698..0000000
--- a/dennis/static/games/balls.html
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
- balls is another demo to test WebGL performance.
- This time using Godot Engine.
-
-
diff --git a/dennis/test/games/balls.md b/dennis/static/games/balls.md
similarity index 100%
rename from dennis/test/games/balls.md
rename to dennis/static/games/balls.md
diff --git a/dennis/static/games/fps.html b/dennis/static/games/fps.html
deleted file mode 100644
index 8c12aca..0000000
--- a/dennis/static/games/fps.html
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
- fps is a Godot/WebGL experiment from scratch with
- multiplayer using websockets and a master/slave architecture. Invite a friend or open multiple instances!
-
-
diff --git a/dennis/test/games/fps.md b/dennis/static/games/fps.md
similarity index 100%
rename from dennis/test/games/fps.md
rename to dennis/static/games/fps.md
diff --git a/dennis/static/games/snek.html b/dennis/static/games/snek.html
deleted file mode 100644
index bbfaf49..0000000
--- a/dennis/static/games/snek.html
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
- snek is a simple snake game made with JS/Canvas.
-
-
diff --git a/dennis/test/games/snek.md b/dennis/static/games/snek.md
similarity index 100%
rename from dennis/test/games/snek.md
rename to dennis/static/games/snek.md
diff --git a/dennis/static/projects/20220529-housing.html b/dennis/static/projects/20220529-housing.html
deleted file mode 100644
index ae89a3f..0000000
--- a/dennis/static/projects/20220529-housing.html
+++ /dev/null
@@ -1,136 +0,0 @@
-
-
- A recent project I had for class was to use
- scikit-learn
- to create a regression model that will predict the price of a house based on some
- features of that house.
-
- How?
-
- -
- Pick out and analyze certain features from the dataset. Used here is the
- Ames Iowa Housing Data
- set.
-
- -
- Do some signal processing to provide a clearer input down the line, improving
- accuracy
-
- - Make predictions on sale price
- -
- Compare the predicted prices to recorded actual sale prices and score the results
-
-
- What's important?
-
- Well, I don't know much about appraising houses. But I have heard the term "price per
- square foot" so we'll start with that:
-
-
-
- There is a feature for 'Above Grade Living Area' meaning floor area that's not basement.
- It looks linear, there were a couple outliers to take care of but this should be a good
- signal.
-
- Next I calculated the age of every house at time of sale and plotted it:
-
-
- Exactly what I'd expect to see. Price drops as age goes up, a few outliers. We'll
- include that in the model.
-
- Next I chose the area of the lot:
-
-
- Lot area positively affects sale price because land has value. Most of the houses here
- have similarly sized lots.
-
- Pre-Processing
-
-
- Here is an example where using
- StandardScaler()
- just doesn't cut it. The values are all scaled in a way where they can be compared
- to one-another, but outliers have a huge effect on the clarity of the signal as a
- whole.
-
-
-
-
-
-
-
-
-
- You should clearly see in the second figure that an old shed represented in the top left
- corner will sell for far less than a brand new mansion represented in the bottom right
- corner. This is the result of using the
- QuantileTransformer()
- for scaling.
-
- The Model
-
- A simple
- LinearRegression()
- should do just fine, with
- QuantileTransformer()
- scaling of course.
-
-
-
-
-
- Predictions were within about $35-$40k on average.
- It's a little fuzzy in the higher end of prices, I believe due to the small sample size.
- There are a few outliers that can probably be reduced with some deeper cleaning however
- I was worried about going too far and creating a different story. An "ideal" model in
- this case would look like a straight line.
-
- Conclusion
-
- This model was designed with a focus on quality and consistency. With some refinement,
- the margin of error should be able to be reduced to a reasonable number and then
- reliable, accurate predictions can be made for any application where there is a need to
- assess the value of a property.
-
-
- I think a large limiting factor here is the size of the dataset compared to the quality
- of the features provided. There are
- more features
- from this dataset that can be included but I think the largest gains will be had from
- simply feeding in more data. As you stray from the "low hanging fruit" features, the
- quality of your model overall starts to go down.
-
- Here's an interesting case, Overall Condition of Property:
-
-
-
-
- You would expect sale price to increase with quality, no? Yet it goes down.. Why?
- I believe it's because a lot of sellers want to say that their house is of highest
- quality, no matter the condition. It seems that most normal people (who aren't liars)
- dont't care to rate their property and just say it's average. Both of these combined
- actually create a negative trend for quality which definitely won't help predictions!
-
-
- I would like to expand this in the future, maybe scraping websites like Zillow to gather
- more data.
- We'll see.
-
-
diff --git a/dennis/test/projects/20220529-housing.md b/dennis/static/projects/20220529-housing.md
similarity index 100%
rename from dennis/test/projects/20220529-housing.md
rename to dennis/static/projects/20220529-housing.md
diff --git a/dennis/static/projects/20220529-housing/pics/age.png b/dennis/static/projects/20220529-housing/pics/age.png
deleted file mode 100644
index 318184d..0000000
Binary files a/dennis/static/projects/20220529-housing/pics/age.png and /dev/null differ
diff --git a/dennis/static/projects/20220529-housing/pics/age_liv_area_ss.png b/dennis/static/projects/20220529-housing/pics/age_liv_area_ss.png
deleted file mode 100644
index ffb5739..0000000
Binary files a/dennis/static/projects/20220529-housing/pics/age_liv_area_ss.png and /dev/null differ
diff --git a/dennis/static/projects/20220529-housing/pics/age_liv_qt.png b/dennis/static/projects/20220529-housing/pics/age_liv_qt.png
deleted file mode 100644
index 1f9782a..0000000
Binary files a/dennis/static/projects/20220529-housing/pics/age_liv_qt.png and /dev/null differ
diff --git a/dennis/static/projects/20220529-housing/pics/livarea_no_outliers.png b/dennis/static/projects/20220529-housing/pics/livarea_no_outliers.png
deleted file mode 100644
index 520a4a3..0000000
Binary files a/dennis/static/projects/20220529-housing/pics/livarea_no_outliers.png and /dev/null differ
diff --git a/dennis/static/projects/20220529-housing/pics/lot_area.png b/dennis/static/projects/20220529-housing/pics/lot_area.png
deleted file mode 100644
index f5eb2bc..0000000
Binary files a/dennis/static/projects/20220529-housing/pics/lot_area.png and /dev/null differ
diff --git a/dennis/static/projects/20220529-housing/pics/mod_out.png b/dennis/static/projects/20220529-housing/pics/mod_out.png
deleted file mode 100644
index 7bad6cc..0000000
Binary files a/dennis/static/projects/20220529-housing/pics/mod_out.png and /dev/null differ
diff --git a/dennis/static/projects/20220529-housing/pics/overall_cond.png b/dennis/static/projects/20220529-housing/pics/overall_cond.png
deleted file mode 100644
index 8141f20..0000000
Binary files a/dennis/static/projects/20220529-housing/pics/overall_cond.png and /dev/null differ
diff --git a/dennis/static/projects/20220614-reddit.html b/dennis/static/projects/20220614-reddit.html
deleted file mode 100644
index c64d492..0000000
--- a/dennis/static/projects/20220614-reddit.html
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
- In an attempt to find out what about a Reddit post makes it successful I will use some
- classification models to try to determine which features have the highest influence on
- making a correct prediction. In particular I use
- Random Forest
- and
- KNNeighbors
- classifiers. Then I'll score the results and see what the highest predictors are.
-
-
- To find what goes into making a successful Reddit post we'll have to do a few things,
- first of which is collecting data:
-
- Introducing Scrapey!
-
- Scrapey is my scraper script that takes a snapshot
- of Reddit/r/all hot and saves the data to a .csv file including a calculated age for
- each post about every 12 minutes. Run time is about 2 minutes per iteration and each
- time adds about 100 unique posts to the list while updating any post it's already seen.
-
-
- I run this in the background in a terminal and it updates my data set every ~12 minutes.
- I have records of all posts within about 12 minutes of them disappearing from /r/all.
-
- EDA
-
- Next I take a quick look to see what looks useful, what
- doesn't, and check for outliers that will throw off the model. There were a few outliers
- to drop from the num_comments column.
-
- Chosen Features:
-
- - Title
- - Subreddit
- - Over_18
- - Is_Original_Content
- - Is_Self
- - Spoiler
- - Locked
- - Stickied
- - Num_Comments (Target)
-
-
- Then I split the data I'm going to use into two dataframes (numeric and non) to prepare
- for further processing.
-
- Clean
- Cleaning the data further consists of:
-
- - Scaling numeric features between 0-1
- - Converting '_' and '-' to whitespace
- - Removing any non a-z or A-Z or whitespace
- - Stripping any leftover whitespace
- - Deleting any titles that were reduced to empty strings
-
- Model
-
- If the number of comments of a post is greater than the median total number of comments
- then it's assigned a 1, otherwise a 0. This is the target column. I then try some
- lemmatizing, it doesn't seem to add much. After that I create and join some dummies,
- then split and feed the new dataframe into
- Random Forest
- and
- KNNeighbors
- classifiers. Both actually scored the same with
- cross validation
- so I mainly used the forest.
-
- Notebook Here
- Conclusion
- Some Predictors from Top 25:
-
- - Is_Self
- - Subreddit_Memes
- - OC
- - Over_18
- - Subreddit_Shitposting
- - Is_Original_Content
- - Subreddit_Superstonk
-
-
- Popular words: 'like', 'just', 'time', 'new', 'oc', 'good', 'got', 'day', 'today', 'im',
- 'dont', and 'love'.
-
-
- People on Reddit (at least in the past few days) like their memes, porn, and talking
- about their day. And it's preferred if the content is original and self posted. So yes,
- post your memes to memes and shitposting, tag them NSFW, use some words from the list,
- and rake in all that sweet karma!
-
-
- But it's not that simple, this is a fairly simple model, with simple data. To go beyond
- this I think the comments would have to be analyzed.
- Lemmatisation I thought would
- be the most influential piece, and I still think that thinking is correct. But in this
- case it doesn't apply because there is no real meaning to be had from reddit post
- titles, at least to a computer. (or I did something wrong)
-
-
- There's a lot more seen by a human than just the text in the title, there's often an
- image attached, most posts reference a recent/current event, they could be an inside
- joke of sorts. For some posts there could be emojis in the title, and depending on their
- combination they can take on a meaning completely different from their individual
- meanings. The next step from here I believe is to analyze the comments section of these
- posts because in this moment I think that's the easiest way to truly describe the
- meaning of a post to a computer. With what was gathered here I'm only to get 10% above
- baseline and I think that's all there is to be had here, I mean we can tweak for a few
- percent probably but I don't think there's much left on the table.
-
-
diff --git a/dennis/test/projects/20220614-reddit.md b/dennis/static/projects/20220614-reddit.md
similarity index 100%
rename from dennis/test/projects/20220614-reddit.md
rename to dennis/static/projects/20220614-reddit.md
diff --git a/dennis/static/projects/20221020-cartman.html b/dennis/static/projects/20221020-cartman.html
deleted file mode 100644
index 28de05e..0000000
--- a/dennis/static/projects/20221020-cartman.html
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
- Cartman is trained by combining Microsoft's
- DialoGPT-large
- NLP model (trained on 147M samples of multi-turn dialogue from Reddit) with 17 seasons of
- South Park
- transcripts.
-
-
- Requests are routed from
- Nginx
- through
- WireGuard
- to a
- Raspberry Pi 4B 8GB
- running
- FastAPI,
- and the Cartman model using PyTorch.
- It has enough RAM for more, but the CPU is pretty much at its limit. Expect it to take a few
- seconds, I'm cheap. Sorry(kinda).
-
-
- You can download a Docker image if you'd like to run it on your own hardware for either
- x86_64
- or
- aarch64.
-
-
- More info here as well as
- example scripts
- to talk to the docker container.
-
-
diff --git a/dennis/test/projects/20221020-cartman.md b/dennis/static/projects/20221020-cartman.md
similarity index 100%
rename from dennis/test/projects/20221020-cartman.md
rename to dennis/static/projects/20221020-cartman.md
diff --git a/dennis/static/projects/20230427-lightning.html b/dennis/static/projects/20230427-lightning.html
deleted file mode 100644
index 1829449..0000000
--- a/dennis/static/projects/20230427-lightning.html
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
- Lightning is a mapping/data vis project for finding
- EV charging stations. It uses Martin to serve
- tiles generated from OpenStreetMap data to a MapLibre frontend. Additional layers are added on top
- via Deck.gl using data from EVChargerFinder made by my friend
- Kevin.
-
-
diff --git a/dennis/test/projects/20230427-lightning.md b/dennis/static/projects/20230427-lightning.md
similarity index 100%
rename from dennis/test/projects/20230427-lightning.md
rename to dennis/static/projects/20230427-lightning.md
diff --git a/dennis/test/bots/cartman.html b/dennis/test/bots/cartman.html
deleted file mode 100644
index 2755d2d..0000000
--- a/dennis/test/bots/cartman.html
+++ /dev/null
@@ -1 +0,0 @@
-cartman
diff --git a/dennis/test/filetest.py b/dennis/test/filetest.py
deleted file mode 100644
index 0eef9b1..0000000
--- a/dennis/test/filetest.py
+++ /dev/null
@@ -1,53 +0,0 @@
-import os
-import markdown
-from datetime import date, datetime
-from pydantic import BaseModel
-
-class Article(BaseModel):
- content_type: str
- title: str
- date: date
- content: str
-
-def walk_for_md(path: str):
- buf = []
-
- for root, _, files in os.walk(path):
- mdeez = [f"{root}/{filename}" for filename in files if filename[-2:] == "md"]
-
- if mdeez:
- buf.extend(mdeez)
-
- return buf
-
-def get_articles_from_dir(root_path: str) -> list[Article]:
- md = markdown.Markdown(extensions=['meta'])
- articles: list[Article] = []
-
- for file_path in walk_for_md(root_path):
- with open(file_path) as file:
- html: str = md.convert(file.read());
- meta: dict = md.Meta;
-
- articles.append(
- Article(
- content_type=meta.get('content_type')[0],
- title=meta.get('title')[0],
- date=datetime.strptime( meta.get( 'date')[0], '%Y %m %d'),
- content=html,
- ));
-
- return articles;
-
-DB = sorted(
- get_articles_from_dir('.'),
- key=lambda article: article.date,
- reverse=True
- );
-
-for article in DB:
- print(
- article.date,
- article.content_type,
- article.title,
- )
diff --git a/dennis/test/games/index.html b/dennis/test/games/index.html
deleted file mode 100644
index 68a671e..0000000
--- a/dennis/test/games/index.html
+++ /dev/null
@@ -1,23 +0,0 @@
-
Some games using wasm/webgl
-Browser performance as of January 2023
-Tested better:
-
- - Opera
- - Firefox Developer Edition
- - Brave
-
-Tested poor or broken:
-
- - Safari
- - Chrome stable release or older
- - Edge, see above^
-
-Consider anything else average or let me know otherwise
-
- ---MY GAMES---
- - adam - The first. Unity Demo/Tutorial with some mods
- - multiplayer fps - Dive into netcode with Godot (Open two, invite
- your friends!)
- - snek - Canvas + JS (the actual first)
- - balls - Godot demo engine test
-
diff --git a/dennis/test/runtest b/dennis/test/runtest
deleted file mode 100755
index 4ab7b1e..0000000
--- a/dennis/test/runtest
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-
-clear &&
-python filetest.py