-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathblog.sql
More file actions
147 lines (147 loc) · 92.5 KB
/
Copy pathblog.sql
File metadata and controls
147 lines (147 loc) · 92.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
slug TEXT NOT NULL,
title TEXT,
markdown_content TEXT,
publish_date DATETIME
, meta_description TEXT);
INSERT INTO posts VALUES(1,'recipes/the-rice','Sustainable Cooks'' Garlic Butter Rice',replace('\n I often make this ahead on the weekend for use in various meals through the week.\n \n\n\n## Ingredients\n\n\n* 3 tablespoons butter\n* 1 cup uncooked white rice\n* 1/3 cup uncooked brown rice\n* 2 cups water\n* 2 teaspoons of veggie Better Than Bouillon\n* 2 tablespoons of jarred minced garlic\n* 3/4 teaspoons parsley\n* 2 tablespoons grated Parmesan cheese (optional)\n\n\n## Instructions\n\n\n1. Set Instant Pot to "saute" to melt the butter (it will take about 1\-2 minutes). Once melted, turn the Instant\n Pot to "off/keep warm".\n2. Add the rice, broth, garlic, and dried parsley. Stir.\n3. Lock the lid into place and set the steam release handle (valve on top) to “Sealing”. Press the "rice" button.\n4. When the cooking time is up, flip the vent to venting and perform a quick release.\n5. Carefully open the lid and add the parmesan and stir.\n\n\n## Notes\n\n\n* The original recipe sets pressure to high for 6 minutes. The rice button sets the time to 12 minutes but it\n still turns out great. I''m not really sure what the rice button does, but it works\n* Typically, I omit the original recipe''s use of parmesan cheese so it fits with a wider variety of cuisines.\n* The rice will stick to the side of the pot less if you rinse it first.\n* Sustainable Cooks calls for just white rice, but I found adding some brown rice adds some extra flavor and\n nutrition.\n\n\n## Original Recipe\n\n\n\n[Sustainable Cook''s Garlic Butter Rice](https://www.sustainablecooks.com/parmesan-rice/)\n\n\n','\n',char(10)),'2023-10-15 00:00:00','A versatile garlic butter rice recipe perfect for meal prep and easy weeknight dinners, featuring a delightful blend of white and brown rice.');
INSERT INTO posts VALUES(2,'recipes/pizza-dough','Adam Ragusea''s Pizza Dough',replace(' \n\n\n## Ingredients\n\n\n* 2 1/4 cups (530 ml) warm water\n* 1 tbsp sugar (12g) sugar\n* 1 tbsp (9g) active dry yeast\n* 2 tbsp (30 ml) olive oil\n* 1 tbsp (18 g) kosher salt\n* 5 cups (600g) bread flour, plus more for working the dough\n* additional oil for greasing the dough\n* cornmeal, semolina flour, or coarse\-ground whole wheat flour for dusting\n\n\n## Instructions\n\n\n1. Start the dough by combining the water, sugar and yeast in a large bowl and let sit for a few minutes.\n2. If the yeast goes foamy, it''s alive and you''re good to proceed (if it doesn''t, it''s dead and you\n need new yeast). Add the olive oil and salt and 5 cups (600g) of bread flour. Mix until just\n combined, then start kneading. Add just enough additional flour to keep the dough workable\n (i.e. not too sticky) and kneed until you can stretch some of the dough into a thin sheet\n without it tearing. (NOTE: You will probably need to add a lot more flour. The quantity I give\n here is just a base line to get your started.)\n3. Divide the dough into four equal balls and put them in four containers (ideally glass) and\n lightly coat the balls and the interior of their containers with olive oil. Cover, and either rise at room\n temperature for two hours, or put them in the refrigerator and let them rise for 1\-7 days. (I prefer the long,\n cold\n rise.)\n\n\n## Notes\n\n\n* Sometimes I choose the easy way and get pizza dough premade from the grocery store and that''s totally okay\n\n\n## Original\n\n\n* [New York\-style pizza at home, v2\.0](https://www.youtube.com/watch?v=SDpCzJw2xm4)\n','\n',char(10)),'2023-10-15 00:00:00','A straightforward guide to making Adam Ragusea''s pizza dough, from ingredients to easy kneading and rise techniques for perfect homemade pizza.');
INSERT INTO posts VALUES(3,'recipes/chicken-tinga','Internet Shaquille''s Chicken Tinga',replace(' \n\n\n## Ingredients\n\n\n* 2 lbs skinless chicken thighs\n* 2\-5 canned chipotle peppers\n* 1\-14\.5\-ounce can of fire\-roasted tomatoes\n* 3 tablespoons of jarred minced garlic\n* 1 onion\n* Olive oil\n* 3 teaspoon kosher salt\n* black pepper\n* 1 teaspoon cumin\n* 1 teaspoon oregano\n* chili powder (optional)\n* a whole bay leaf (optional)\n* smoked paprika (optional)\n\n\n## Instructions\n\n\n1. Chop the onion in the food processor.\n2. Set the instant pot to "Saute" add the oil and let it get hot.\n3. Add the onion and let it cook.\n4. Toss in the chicken and brown it a bit\n (or if feeling lazy, drop it in frozen and don''t worry about browning).\n5. Plop in the rest of the ingredients.\n6. Set the instant pot to "Pressure Cook" for 15 minutes. Quick release the pressure when it''s done.\n7. Take the the chicken out to cool.\n8. Set the instant pot to "Saute". Use an immersion blender to turn the braising liquid into a smooth sauce.\n9. Shred it by tearing it apart with your fingers.\n10. Return the chicken to the bubbling sauce.\n11. Serve chicken as part of nachos, tacos, tostadas, quesadillas, or enchiladas\n\n\n## Notes\n\n\n* Shaquille uses a crockpot for this but I find the Instant Pot easier and faster.\n* He is a chef so he chops his onion with a knife. So fancy!\n* This is probably better if you mince garlic like Shaq, but I''m lazy so I used the jarred stuff.\n* We''ll often make this for meals through the week. If the chicken gets low, we''ll heat it up with some canned\n beans and corn to pad it out a bit.\n\n\n## Original Recipe\n\n\n\n[Internet Shaquille''s Chicken Tinga](https://www.youtube.com/watch?v=DqTsb9N3cqY)\n\n\n','\n',char(10)),'2023-10-15 00:00:00','A flavorful Chicken Tinga recipe made easy in the Instant Pot, perfect for tacos, nachos, and more. Inspired by Internet Shaquille''s culinary style.');
INSERT INTO posts VALUES(4,'recipes/cajun-sausage-and-beans','Cajun Sausage and Beans',replace(' \n\n\n## Ingredients\n\n\n* 1 lb. Turkey, Smoked or, Andouille Sausage, sliced into 1/2 inch slices\n* 1\-2 cups cooked, left over [THE Rice](/recipes/the-rice)\n* 1 can (15 oz.) red kidney beans, rinsed and drained\n* 1 can (15 oz.) diced tomatoes\n* 2 celery stalks, chopped\n* 1 green bell pepper, chopped\n* 1 onion, chopped in the food processor\n* 1/2 teaspoon of salt\n* About 2 teaspoons of Cajun Seasoning\n* 2 tablespoons of jarred minced garlic\n* 1\-2 tablespoons of olive oil\n* 1/2 cup (4 fl. oz) of water\n* salt and pepper to taste\n\n\n## Instructions\n\n\n1. Heat the olive oil in a large skillet over medium heat.\n Add the sausage and cook until browned.\n Set aside.\n2. Add more olive oil to the skillet if needed.\n Add the green peppers, onion, and celery to the skillet along with the salt.\n Toss in half the Cajun seasoning.\n Cook until tender.\n3. Add the garlic and cook for about 30 seconds.\n4. Add the beans, tomatoes, water, rice, along with the rest of the Cajun seasoning.\n Simmer for about 10 minutes.\n5. Stir back in the sausage.\n Let it warm if needed.\n6. Sprinkle some salt and pepper to your taste.\n','\n',char(10)),'2023-10-25 00:00:00','A flavorful dish combining turkey sausage, beans, and Cajun spices for a hearty meal. Perfect for using leftover rice while enjoying rich Southern flavors.');
INSERT INTO posts VALUES(5,'already-blogging','Already Blogging',replace('My recent return to updating my website and finally getting\n around to starting a blog on my own site was inspired in large part\n by Alexey Guzey''s article on [Why you should start\n a blog right now](https://guzey.com/personal/why-have-a-blog/). In it, he helped me overcome my biggest\n objections to starting. First, he convinced me that it doesn''t\n matter if I don''t come up with anything original to say:\n\n\n\n> Consider a university professor teaching a course. Does she say\n> anything original? Do you think she should cancel her course\n> because somebody else discovered the things she wants to teach? Or\n> does she have to cancel her course simply because there is a\n> similar course at some other university?\n> \n> \n> Or consider yourself. Do you avoid having conversations with\n> your friends when you think you have nothing original to say? Do\n> you share things with them? Do you give advice? Do you help to\n> understand things?\n\n\nSecond, the article gave me a lot of ideas on where to find\n something to write about including:\n\n\n* Scouring old IM logs and emails for things you said that seemed\n useful to others.\n* Looking at comments you''ve made on other peoples posts.\n* Thinking about advice you repeatedly give to friends.\n* Look through notes taken when researching different\n topics.\n\n\nThis got me thinking about other sources I could use for article\n ideas and it hit me: I''d already written a lot of article\-like\n content but it was spread scattershot over the web. I then\n collected a few of these, made some minor edits and they became the\n first few articles on this site. The oldest of which I adapted from\n a StackOverflow post I wrote all the way back in 2008! If you''re\n starting a blog, you should look around the web to find things\n you''ve already written and consider adding them as back dated posts\n on the new site.\n\n\n## Where to find articles you''ve already written to add to your\n blog\n\n\nThere are a lot of places you can probably find content you''ve\n written that you can adapt to blog articles. Some you can likely\n import directly into your blog and others you might need to edit\n and or flesh out a little.\n\n\n* Posts you''ve written on third party blogging platforms like\n Medium, Blogger or BlogSpot.\n* Questions you''ve asked or answered on Q\&A websites like\n Quora, StackOverflow or StackExchange. In these cases you might\n need to edit them a bit so they make sense in a more narrative\n form, but doing so is probably quicker and easier than you\n anticipated.\n* Forum posts.\n* Entries from your personal journal (it''s probably a good idea\n to heavily edit these and obviously not post everything en\n masse).\n* Articles or documentation you''ve written for work that might be\n useful for a wider audience. Check with your boss before adapting\n any of this work, but chances are they''ll approve so long as you\n aren''t revealing anything proprietary or that could be a security\n risk.\n* If you''re a programmer, README''s from open source tools you''ve\n developed.\n* Notes you''ve taken when learning something new.\n* Content you''ve written on old, now defunct websites accessed\n through the [Wayback\n Machine](https://archive.org/web/web.php).\n* Content that has been removed by changing moderation standards.\n When I wrote the original post behind my article on getting\n [my first software development\n job](/breaking-into-coding) on [StackOverflow](http://stackoverflow.com)\n they allowed open ended questions. When the site decided to focus\n on questions with more definitive answers, my answer was removed by\n moderators even though many people found it useful. Adding it to my\n blog makes this long missing advice public again.\n* Long posts from Facebook or Twitter threads that others outside\n your friend circle might find useful.\n\n\n## Why you shouldn''t worry about duplicating content\n\n\nCollecting all of your writing in your blog can allow people\n that would otherwise only find one or two fragments of your writing\n to read all you''ve had to say if they are so inclined.\n\n\nAlso, it''s a great motivational exercise. It makes writing seem\n like a less daunting and new task. Once doing it, you''ll realize\n you''ve actually been writing for years, and now have something to\n show for it. That should make future writing easier.\n\n\nSEO experts sometimes rail against duplicate content. This might\n make you think I''m crazy for advocating using it. However,\n generally [duplicate content won''t penalize your rankings](https://searchengineland.com/myth-duplicate-content-penalty-259657), it just won''t\n count positively toward your rankings so content from the original\n site might rank more highly that the one on your new blog. If\n you''re really worried about this you can add a `noindex`\n meta tag to the page to make search engines ignore it. That way at\n least people who come to your blog through other articles can still\n get value out of it.\n\n\n## It doesn''t matter that your old writing wasn''t that great\n\n\nThink about one of your favorite blogs. One you''ve read for\n years perhaps. Go there, and click into the author''s archives and\n read their first few posts. Chances are they will suck compared to\n what they''re posting today. It''s natural for writing to improve\n over time and for your thinking on a topic to change. Make minor\n (or even major) edits if you feel the need. Write some introductory\n text that gives context about what was happening when you wrote the\n article.\n\n\n## Don''t stop with the old stuff\n\n\nOf course, the idea here is not to just collect a bunch of old\n personal writing artifacts, but to give your blog (and your brain)\n a bit of a jump start. Once you''ve added a few older articles,\n spend some time to write some new ones. If your thoughts on a topic\n have changed, write a follow up post. Or write something entirely\n different.\n\n','\n',char(10)),'2020-11-23 17:00:00','Reflecting on the motivation behind starting a blog, sharing personal insights and avenues for finding past writings to enrich content.');
INSERT INTO posts VALUES(6,'ps4','PS4',replace('*\[This article has been adapted from a post I wrote at\n Medium, years ago. It was revised and published here on\n 2020\-11\-21]*\n\n\n\n\n\nFor Christmas 2015 I got a new PlayStation 4, which was pretty\n damn awesome. It has amazing graphics, and with it came this really\n sweet open world game, Fallout 4, where you play as a survivor in\n this post\-apocalyptic world that people probably spent years\n painstakingly creating detail after detail. Its pretty fun and\n impressive. But I barely played it in the weeks following recieving\n it.\n\n\nInstead, I spent most of my time playing this Free/Open Source\n game first released 20 years ago (in some form). The game’s\n graphics (at their best) look like this:\n\n\n\n\n\nIt’s called [Dungeon\n Crawl: Stone Soup,](http://crawl.develz.org/wordpress/) and I’ve been a little obsessed. Why? In\n this game you can actually die. Just now, I played the game for 2\n hours, took a misstep and my character died. And that was it. I\n couldn’t be regenerated. I couldn’t restart from a save point. I\n couldn’t even play again and be faced with the same maps and\n enemies again armed with my newly acquired knowledge of what to\n find where, because the levels in this game are randomly generated\n each time you play. This very likely sounds awful but it’s not. As\n far as I can tell, there are two reasons for this being awesome\n instead of horrible.\n\n\nFirst, this kind of “permadeath” really ratchets up the\n intensity of the game. When you’re staring down a giant ogre with a\n spiked club he looks like something my cat could draw on the\n screen. But when he has the power to wipe out hours of effort in a\n single turn he becomes incredibly scary in your mind’s eye. And if\n you’re otherwise doing well you’ll do anything in your power to\n survive. In my recent game, I felt this kind of thrilling moment\n over and over again. I stumbled upon a very powerful weapon called\n a Dark Maul. This thing was several times more powerful than any\n normal weapon in the game, but had the disadvantage of being\n extremely slow. I could take out almost any enemy in a single hefty\n hit of this beast of a hammer, but then I’d be left at the mercy of\n any other enemies as I worked to lift it over my head to attack\n again. Despite the disadvantage I was doing well, carefully luring\n enemies into hallways where I could take them on one by one, acting\n as a one man Spartain Army in my personal Pass of Thermopylae. If\n things got to be too much, I could run up stairs, kill off any\n close enemies that followed and head back down to the waiting\n horde. If I got into a bind, I could use a scroll of teleportation\n to wisk myself away to a random location in the dungeon. Of course,\n this is what ended up doing me in. I teleported away from some\n enemies while at deaths door into a gauntlet of still more enemies\n and before I could move I was hit by a fireball from an otherwise\n weak and typically harmless orcish wizard. The moments leading up\n to that death were some of the most thrilling I’ve experienced in a\n game.\n\n\n*My Final Moments*: \n\n\nAnd this leads me to the second reason I really like this\n particular game. I could have done better. I could have used an\n ability called “Berserk” to send my character into an inferno of\n adrenaline fueled rage that maybe, just maybe would have given me\n enough speed and energy to get away to a more defensible position.\n DCSS is just one in a long line of “Roguelikes” games that share\n it’s randomly generated dungeons and permanent death. The thing for\n me that sets it apart from other Roguelikes I’ve played is every\n time I die, I feel like I could have done better. I feel like if\n I’d just thought about my last move a little bit longer, or used a\n better strategy to avoid getting in such a tight spot, but I\n didn’t. My death was my fault, not due to just an unfortunate roll\n of the dice. Other rogue likes seem to spring surprises on you that\n with your limited resources are simply too weak to deal with. In\n classics of the genere like Nethack or the original rogue, people\n spend sometimes years between wins, waiting for that perfect game\n to come along.\n\n\nDCSS keeps driving me to play again and again. It has a small\n enough complexity to be easy enough to wrap my mind around, yet a\n large enough variety to keep me coming back and trying new things.\n Big polished AAA games have their appeal and I certainly returned\n to them over the lifetime of the PS4\. But then I''d find myself\n drawn back into the lofi dungeon to see if this time I might\n survive just a little while longer this time...\n\n','\n',char(10)),'2016-01-02 17:00:00','A personal reflection on why the nostalgic roguelike Dungeon Crawl: Stone Soup captivates, even in the face of a powerful PS4. Gameplay insights included.');
INSERT INTO posts VALUES(7,'readable-list','A Library for Making List Webpages "Readable"',replace('This started as a README for a potential open source project. I\ndecided to make a blog post to maybe get some feedback or suggestions.\n\n\n## Status\n\n\nJust an idea at this point.\n\n\n## Description\n\n\nThere are "readability" libraries such as:\n\n\n* <https://github.com/mozilla/readability>\n* [https://github.com/buriy/python\-readability](https://github.com/buriy/python-readability)\n\n\nThese take a webpage containing an article and strip out all the\nnavigation and ads. Most of these work great for pages that are\narticles and some, like Mozilla''s do a pretty good job of\nidentifying when a page is NOT an article. However, there isn''t\nmuch these libraries can currently do with pages that are lists of\narticles like:\n\n\n* <https://coloradosun.com/category/news/housing/>\n* <https://drewdevault.com/>\n* <https://www.npr.org/sections/culture/>\n* <https://www.cnn.com/health>\n\n\nHere, I''m considering making a library that strips out\nextraneous side navigation/ads/other junk from web pages like\nthese, and either returning a list of article URLs or a very simple\npage with article links in a bulleted list.\n\n\nBy combining this with a standard readability algorithm/library,\none could create a simple and/or text\-only view of a website than\nwhat is typically rendered by text browsers like w3m and lynx.\n\n\nA browser built using this could sit in a missing place in the\ncontinuum of browser complexity:\n\n\n\n```\nOffpunk < THIS THING < w3m/lynx/elinks < visurf/netsurf/surf < qutebrowser/chrome/firefox\n\n```\n\n## Possible Algorithm\n\n\n1. Start with a given HTTP/S URL\n2. retrieve that page\n3. Parse the page and get a list of all the links on that\npage\n4. Remove any links that are to domains other than the one from\nthe original link\n5. Retrieve a few, say 10,maybe random links from the remaining of\nthe list\n6. Get a similar list of links for each of those pages\n7. Get a list of the links that are common across all of the\nretrieved pages. It is a reasonable assumption that these would we\nbe navigational links.\n8. Finally, we''d return to the list of links from the original\npage, and remove the links we''ve determined are navigational\n9. At this point, we''re left with links only to unique content\npages!\n\n\n### Flaws\n\n\n* If a website makes heavy use of cross linking in articles,\nthose articles may be unfairly excluded from the final list of\narticles\n* For some sites, this would be redundant with RSS/Atom feeds a\nbe of lower quality\n* This probably wouldn''t work (out of the box) for sites that\nrely on client\-side JavaScript to render content.\n','\n',char(10)),'2023-05-16 00:00:00','An introduction to a potential library for enhancing the readability of article list webpages by filtering out extraneous content.');
INSERT INTO posts VALUES(8,'welcome','Welcome',replace('*\[I wrote this a couple years back in draft form and never\n got around to publishing it. I''m a little less enthusiastic about\n the "IndieWeb" revolution now, but it does serve introduce the blog\n reasonably well]*\n\n\nI''m joining the IndieWeb revolution by creating my own personal\n website again for the first time in years! A lot of the structure\n comes from the venerable Derek Sivers, Is built with GatsbyJS and\n is hosted on GitHub Pages. Soon I''ll be porting all of my old\n facebook, twitter and medium posts over here, along with hopefully\n adding some new content.\n\n','\n',char(10)),'2018-05-21 18:00:00','A personal journey into creating a website on the IndieWeb, featuring insights on structure, technology, and future content plans.');
INSERT INTO posts VALUES(9,'burnout','Slowing down to combat burnout',replace('Last week, a co\-worker asked me if I had any resources that he could point his employees\n to that could help dealing with burn\-out. I couldn''t really think of any, but went through\n my list of usual strategies including:\n\n\n* Taking a break for a few days\n* Writing down a list of things I''ve done as I complete them, as opposed to keeping a\n to\-do list\n* Re\-evaluating my goals and making sure my current actions align with those goals\n* Being on the look out for any stress in my personal life that may be affecting my\n desire to work\n* Working on something different. Variety can powerful\n* Collaborating through difficult work\n\n\nBut the list felt flat. I wasn''t sure if anything I''d come up with would really be\n helpful. A few days later, I reread [a story from Derek\n Sivers](https://sive.rs/tilt) about slowing down on a difficult drive and explicitly ignoring those people who\n it might annoy, thus making the drive much more enjoyable. He reminds us to adjust adjust\n our environment to what we need even if it''s inconvenient to others.\n\n\nThe story reminded me a burnout combatting strategy I''d used in the past: **Slow\n down and focus on craftsmanship**. Often burnout comes when you feel stress always\n be getting something done, always moving on to the next thing that''s needed. Instead of\n getting things done as quickly as possibly, it can help to take the slow route. Zoom in on\n the little details. Take a lot more time to make what you''re working on as perfect as you\n can. In a software development context, is each variable name as good as it could be? Could\n any lines of code be removed? Could we make it perform faster? If what you''re working on\n feels repetitive, could you make the computer do the work for you? Could the code be\n rewritten to be more readable?\n\n\nWhen it works, this strategy helps me find the beauty in my work again. Sometimes I go a\n bit overboard and end up with an over\-engineered mess I have to throw away. But when I do,\n the quick solution and simple solution I started with ends up feeling much better as now\n I''ve seen the flaws in the alternative. And of course, burnout can be caused by the reverse\n too. Sometimes, if I''ve been to in the weeds of the details and too focused on making\n things perfect it can help to step back and come up with a quick and un\-elegant solution\n instead.\n\n\nThe feeling of burnout is your brain''s way of telling you that something needs to\n change. So, the next time that feeling settles upon you consider that perhaps the solution\n is as simple as changing the pace and focus of your work.\n\n','\n',char(10)),'2020-12-05 17:00:00','Examining the benefits of slowing down to tackle burnout, this post highlights strategies for finding joy in work and improving craftsmanship.');
INSERT INTO posts VALUES(10,'breaking-into-coding','How I Got My First Programming Job',replace('*\[This article is based on a stack overflow answer that was deleted after the site moved away from more open ended questions. I published it here on 11/21/2020]*\n\n\nWhen I was in high school, one of my teachers told us a story of when he was in college. A friend of his wanted a job as a DJ for the university''s radio station so he bought a huge rock and roll encyclopedia, and carried it around everywhere he went. A few months later when a position opened, he was offered the DJ job. Everyone saw him with that book, and assumed he was an expert in subject. The thing was, he never actually read a word of the book.\n\n\nNow, you won''t get a job coding simply by carrying around a PHP and not reading it. However my teacher''s story inspired me to continuously learn new technologies and to do so conspicuously, letting everyone know in both subtle and non\-subtle ways what I was are learning.\n\n\nMonths after hearing this story, I was a a freshman at University, and I was very anxious to start coding professionally. I''d been coding in Atari Basic, and then (now) old versions of Visual Basic since I was 8 years old, and didn''t want to wait until I graduated four years later to start making money with it. I was teaching myself HTML and (Classic) ASP on the side, and really came to like web development.\n\n\nI wasn''t very confident in my abilities at that point, and I just wanted to get some kind of a job working with computers at a company that had a development department. In that vein, I applied for a job at a local Internet Service Provider who was hiring folks to support their Dial\-Up Internet service. I got the job, and I''m fairly certain it was due to the fact that I was carrying around O''reily''s TCP/IP Networking book when I went to the interview and this impressed the interviewer.\n\n\nAfter getting my foot in the door, instead of spending my lunch hours eating with people in the support department or alone, I''d walk up to the web development department and bug the folks there. I''d show them what I was working on for little side projects, and they''d show me what they were working on. I would hang out behind them, watching them code (they didn''t seem to mind) and soon I was making suggestions when they got stuck. A while later, I''d come up and volunteer to help code things (on my own) in the evenings when they were close to a deadline (for free).\n\n\nAfter a few months of this, they offered me a job in the department, when one of the other developers left.\n\n\nSo in summary:\n\n\n1. Always be learning new things, and make sure people know you are learning them. Don''t just fake it like my teacher''s friend.\n2. Work on your own development projects. This is the most important thing. You need to be able to show people your can actually get stuff done.\n3. Don''t be afraid to get a non\-coding job to get your foot in the door.\n4. If you do (3\), spend as much free time as possible working with the people in the company who actually do programming, but make sure you are providing value.\n\n\nOf course, this strategy wouldn''t work for everyone, and wouldn''t work at every company, but it can work.\n\n','\n',char(10)),'2008-12-04 17:00:00','A personal journey of landing a first programming job through learning, networking, and seizing opportunities in tech.');
INSERT INTO posts VALUES(11,'how-to-verify-on-mastodon','How to Verify on Mastodon',replace('\n With the most recent influx of users from Twitter to Mastodon, I''ve noticed several new\n accounts that appear to be famous people. Because these folks are new to Mastodon, most I''ve\n seen are unverified. Verification works really differently on Mastodon than it does on Twitter\n and is a little technical, so this post serves as a step by step guid for anyone who is at\n risk of being impersonated on Mastodon.\n \n\n\n## Differences from Twitter\n\n\n\n On Twitter, verification is a process that is handled by Twitter staff. They verify that\n you are who you say you are by asking you to provide a photo of your ID. Once you''ve\n provided that, they verify you and you get a blue checkmark next to your name. Up to now\n Twitter did this at their own discretion, but they recently announced that they may start\n making this a paid feature.\n \n\n\n\n On Mastodon, there''s no centralized authority that can verify folks in the same way as\n Twitter. Instead you can verify yourself by putting a link to your website in your bio,\n then linking back to your Mastodon account from your website in a special way.\n \n\n\n## Linking to your site From Mastodon\n\n\nNote: **I''m assuming in these instructions that you''re using a PC and are interacting with\n your Mastodon account with a web browser.** Certain features are different or missing from\n the mobile website and from the mobile apps, so if you''re on your phone things might be a\n little different.\n \n\n\n\n The first step in verifying yourself is linking from your Mastodon profile to your website.\n This should be your public website that people trust is run by you or your organization.\n To do this, follow these steps:\n \n\n1. Go to your profile page on Mastodon. Click on "Edit Profile" under your username on the left.\n2. Scroll down to the "Metadata" section, towards the bottom of the page. In the first row,\n type "Website" in the box on the left and the full URL of your website in the box on the\n right. Your website URL should start with `https://`. For example, for my site\n I put `https://tristanhavelick.com`.\n3. Click "Save Changes" at the bottom of the page.\n\n\n\n This will add a link to your website in your profile. However this isn''t enough to verify\n you.\n \n## Linking back to your Mastodon account from your website\n\n\n\n Now, you need to add a link to your Mastodon account from your website. The easiest way to\n do this is to steal the bit of HTML code that Mastodon generates for you. To do this, just\n hit the copy button to the right of where you added your website on your Mastodon profile\n page, under "Verification". The HTML code will look something like this:\n \n\n\n```\n<a href="https://your-mastodon.site/@YourMastodonUser" rel="me">Mastodon</a>\n```\n\n\n\n The important bit here is the `rel="me"` part. This says "this link is to a page that I control and\n represents me".\n \n\n\n\n Then, you just add that code somewhere on the home page of your site. (If you don''t maintain\n the code on your website contact whoever does and send them the link to this article along\n with the link to this to your Mastodon, they should be able to help from there.\n \n\n\n\n Once you''ve done that, you should be verified on Mastodon. You can check by going to your\n profile page on Mastodon and looking for the little checkmark next to your username.\n \n\n\n## This solution isn''t perfect\n\n\n\n Even with this solution, it''s still possible that someone could impersonate you on Mastodon.\n This verification is only as reliable as the websites that you link to. If someone were to\n create a website that looks like yours, they could link to their cloned Mastodon account from\n that. But it''s better than nothing, and Twitter verification has it''s flaws as well.\n Have you seen how many verified Elon Musks there are on Twitter these days?\n \n\n','\n',char(10)),'2022-11-06 00:00:00','Understanding the unique verification process on Mastodon compared to Twitter, with step-by-step guidance for protecting your identity.');
INSERT INTO posts VALUES(12,'consumerism','Thoughts on consumer goods and christmas 2010',replace('*\[This article originally appeared on Blog Spot and was\npublished here on 2020\-11\-22]*\n\n\nIn recent months I''ve come to realization that I can buy pretty\nmuch any consumer good I really want. True, I can''t go down to\ncherry creek mall and buy the most expensive watch they have, but\nI''ve never had much of a taste for luxury anyhow. I can however,\nhead down to the music store and buy any CD I want. Had I the\ninclination, I could visit Best Buy and purchase any DVD I wanted.\nThe same can be said about a visit to Tattered Cover, my local\nbookshop and obtain a copy of anything I desired to read. In any\ncase, I could probably get away with doing these things quite\noften.\n\n\nThe preceding paragraph was not written out of a desire to brag.\nThe fact is, with very little determination and the ability to bend\n(okay break) a little copyright law, or dare I say, visit your\nlocal library you too can have similar ability even when living\nhand to mouth.\n\n\nStrange as it may seem, given the ability to own all this media\nand physical goods, I have recently come to procure less and less\nof it. In most cases if I want to watch a movie, I''ll Tivo it, or\nwatch it on Netflix. If I want to listen to music, more often than\nnot in the pas t few months, I''ll visit Pandora. Truth be told,\nprior to my reunion with Pandora I''d pirated a lot of music, but\nthat activity has greatly slowed recently. Whenever I do want to\nlisten to specific music, I''ll acquire it digitally, or at the very\nleast get a CD and immediately rip it to digital format, with the\nCD itself rarely to be seen again. I also very rarely buy physical\nbooks these days. Unless I''m reading something obscure, I almost\nalways read on my Kindle.\n\n\nYet, as I look around my apartment I see shelf after shelf of\nmovies I like, but rarely watch. I see bookshelves filled so much\nthat books are stacked in front of other books. The phenomenon\ncontinues as I look to my kitchen, filled with gadgets rarely used,\nand cookbooks rarely opened.\n\n\nJulia (my wife) and I spent a lot of time today clearing things\nout and getting rid of a lot of junk we''ve acquired over the years,\nand although we have a lot to go, it finally feels more than just\nclean\-\- It has some semblance of being organized. And yet, a sense\nof foreboding comes over me as the day after Christmas\napproaches.\n\n\nDespite my being an atheist, Christmas is by far my favorite\nholiday. I love spending time with family, eating, drinking and\ntalking. I love the spirit of giving and honest camaraderie. I love\nto see the expressions on everyone''s faces when they get something\nthey really wanted. I even really love the feeling I get when I\nmyself open a really creative and unique gift I hadn''t even thought\nof buying myself, or that one thing I was really hoping for.\n\n\nThat said, I have in some ways come to dread the day after\nchristmas. When I come home, much of the revelry has passed and I\nhave got a brand new batch of stuff to layer atop my existing\npossessions. Its not that I don''t like them, its that I really hate\nstoring them. I live in a small condo and really don''t want to\n"upgrade"my housing just to accommodate more stuff.\n\n\nAt the same time, I''ve come to realize of late that I get much\nmore enjoyment out of doing things than having things. I really\nenjoyed the last couple books I read, but I enjoy discussing such\nbooks with people almost more than reading. I enjoy listening to\nmusic, but I most enjoy hearing new music a friend recommended, or\ngoing to a concert (either classical or rock). Overall, I''ve found\nthat more happiness comes from gaining memories rather than\npossessions. I''ve even seen a lot of research to back up that\nproposition. On that note, I have the following suggestions to gift\ngivers out there:\n\n\n* If you''re going to give some kind of media give the digital kind, if the recipient is like me and is so inclined.\n* Instead of giving someone an art book, offer to visit your favorite museum with them, or buy them a membership.\n* Instead of giving someone a DVD, buy them some movie tickets and offer to join them.\n* In lieu of a CD, offer to take someone to a concert, play, musical, or symphony.\n* Rather than giving a cookbook or gadget, invite your recipient over to cook something with you or clip a few of your own favorite recipes.\n\n\nSure, there are many out there who like getting stuff for\nChristmas. I know when I was younger and had a severe shortage of\nstuff, I would have been disappointed if my Christmas consisted of\nthings from the above list. Also, many times a physical gift really\nis best. If you are endowed with amazing talent at creating or\nfinding unique gifts, keep it up. A place can always be found for\nsomething truly heartfelt or amazing. But if your Christmas\nshopping typically consists of a visit to the mall, best buy, or a\nweb superstore, and you can''t figure out what to give to your\nWookie friend when he already owns too many combs (see [this video](https://www.youtube.com/watch?v=OSWCQ7ALEms)) ,\ngive the above list a shot.\n\n','\n',char(10)),'2010-11-30 17:00:00','Reflections on consumer goods post-Christmas, emphasizing the joy of experiences over possessions and thoughtful gift-giving ideas.');
INSERT INTO posts VALUES(13,'nexus','On Nexus',replace('\n Sapiens by Yuval Harari is probably the last non\-fiction book I read that had a big effect\n on how I view the world.\n After years of buying into the new atheism and the skeptics movement, the book really helped\n me soften to religious and spiritual people again and that there is value in believing things\n that aren''t true actually can have value.\n So when I saw *Nexus* had been written and focused on Information Networks and how AI\n might effect society moving forward I was pretty excited as AI has always been a big interest\n of mine and has already been making big changes in my corner of the world. Although it wasn''t\n as earth shattering to my worldview, it did change my perspective on some things.\n \n\n\n\n One, was explaining the difference between autocracy and totalitarianism.\n Autocracy refers to societies with a single powerful leader with no checks on their power.\n However, an autocratic leader, historically would be limited by the scope of their view. Sure,\n a Roman Emperor could monitor and exact revenge on those he didn''t like close to home, but\n managing every aspect of people''s lives in a city thousands of miles away was impossible.\n In the 20th century, with technology like the telegraph, totalitarianism came about.\n Stalin, for instance, could plant spies and get reports from across the entirety of the U.S.S.R\n and control things at a greater distance with greater ease.\n In fact, getting too much information was often a more difficult problem than not having enough.\n One of the things Harari argues is that AI technology will make it easy for totalitarians to\n micromanage across vast areas even more effectively because it can collect and filter through\n large sets of data about people to identify potential bad actors. China''s social reputation\n scoring system might be an example of this that already exists.\n \n\n\n\n But, he brings up the point that AI, on the other hand, could be used to fight against such total\n control.\n If dissidents against a totalitarian power can make bots that share anti government ideas\n online without being traceable back to the original author, perhaps AI can help those fighting\n gain their own reach.\n \n\n\n\n Beyond giving me some ideas on how to think about how AI might affect the world, the book really\n drove home for me that History can be an interesting lens to look at current and future events\n through.\n I haven''t generally read a lot of history, but maybe that should change.\n \n\n','\n',char(10)),'2024-12-01 12:31:00','Insights from Yuval Harari''s *Nexus* on AI''s impact on society''s power dynamics and the historical lens for understanding modern events.');
INSERT INTO posts VALUES(14,'you-arent-locked-in','You aren''t locked in',replace('In 1998, Netscape decided to rewrite the code behind their iconic web browser from scratch. They failed. By the time they released the rewritten version, it was so riddled with bugs that the team decided to scrap it. [Joel Spolsky](https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/) called this "The worst strategic mistake that any software company can make". As a new professional, his message was clear and haunted me for years to come.\n\nBut a codebase without direction and planning can indeed really get out of hand. Much later in my career, a website I worked on with tons of ad-hoc PHP and spaghetti jQuery was getting incredibly hard to work with. Not having effective front-end unit tests or clear logic separation made rollbacks and merge conflicts happen. More than one high impact initiative was cancelled due to missed deadlines. We knew the current path wasn''t going to work in the long run. But I knew that doing a rewrite from scratch could potentially end the company. So what to do?\n\nTasked with finding a way out of this, I dove into researching and found it''s not the rewrite that''s dangerous. It''s lack of feedback. The longer you work on a project without getting it into the hands of the people who''ll use it, the worse off you''ll be. That leaves two options do it fast, or do it slow, one piece at a time.\n\nIn the case of the PHP/jQuery migration we went with the second option as there was too much to do to be fast. We took advantage of the [Strangler Fig pattern](https://martinfowler.com/bliki/StranglerFigApplication.html). We began by started moving core back-end functionality to Python/Flask API server. Then we moved bits of functionality, page by page, component by component over to a new Next.js/React system. We put a reverse proxy on from the old server to the new one that we could activate on a URL by URL basis. We started with a simple page as a proof of concept, but once we had that, we started moving our most changing and highest traffic routes over. Within less than a month we saw the benefits of faster page load times, easier collaboration and quicker implementation of split tests. Over time, more and more pages lived on the new system. All of it was turned on, in production, in front of customers from day one. No development branch lived for more than a week or so without being merged in. And it worked. After a few years, we''d migrated 98% of the application to the new systems with no giant rollbacks, no crunch time and no regrets. The new system isn''t perfect. It has some of the dependency hell kind of problems that plague a lot of React/Next projects. But it works well overall and is a far cry from where we used to be.\n\nYou''re not stuck choosing between a complete, existentially risky write and languishing in a buggy, hard-to-work with code base. You can escape to something better. And with LLM-based code completion like GitHub Copilot and agentic development environments like [Aider](https://aider.chat) and Cursor, you can probably do such a migration a heck of a lot faster than we did. On a recent undertaking, I saw this firsthand when I moved my manually edited HTML-only (and admittedly much smaller) personal site to a database-driven flask site using a similar process. This time the bulk of the work was done in less than 24 hours. More on that next time.\n\nDid you find this article valuable? Let me know on [Mastodon](https://social.linux.pizza/@Natris1979)!','\n',char(10)),'2025-03-14 00:00:00','Navigating the challenges of codebase migrations through incremental changes rather than risky rewrites, ensuring smoother transitions and better outcomes.');
INSERT INTO posts VALUES(21,'til/ctrl-z-bg-and-fg','TIL: Using ctrl-z to toggle between a program and the terminal',replace('In almost any terminal program you can hit `ctrl-z` to pause it, then run `fg`\nto bring it back. With some zsh configuration you can make `ctrl-z` bring back\nthe program too.\n\nFirst, I tried doing what this [Blog post](https://schulz.dk/2022/01/26/using-ctrl-z-to-toggle-process-in-fg-bg/)\nsuggested:\n\n```\n# .zshrc\n# use ctrl-z to toggle in and out of bg\nif [[ $- == *i* ]]; then\n stty susp undef\n bind ''"\C-z":" fg\015"''\nfi\n```\n\nBut my system doesn''t seem to support the `bind` command. Thus I ended up with:\n\n```\n# .zshrc\nforeground() {\n fg\n}\n\nzle -N foreground\n# use ctrl-z to toggle in and out of bg\nif [[ $- == *i* ]]; then\n stty susp undef\n bindkey "^Z" foreground\nfi\n```\n\nWhich worked, but it didn''t work from nvim which is where I thought I''d find\nit most useful. It turns out this is because I''m using Doom vim which disables\n`crtrl-z` in `lua/doom/extras/keybindings/core.lua`:\n\n```\nmappings.map("n", "<c-z>", "<Nop>", opts, "Editor", "disable_suspending", "Disable suspending")\n```\n\nCommenting out the offending line fixed me up nicely.\n\nFrom: [@Solene on Mastodon](https://bsd.network/@solene/108973780663404081)\nand [Unix Stack Exchange: How to bind a keyboard shortcut in zsh to a program requiring stdin?](https://unix.stackexchange.com/questions/475310/how-to-bind-a-keyboard-shortcut-in-zsh-to-a-program-requiring-stdin)','\n',char(10)),'2022-09-11 00:00:00','A guide to using ctrl-z for toggling between terminal programs and background processes, including zsh configuration tips for seamless functionality.');
INSERT INTO posts VALUES(22,'til/difference-between-docker-compose-exec-and-run','TIL: The Difference Between `docker compose exec` and `docker compose run`',replace('In the past, I''ve used the commands `docker compose exec [some container] bash` and\n`docker compose run [some container] bash` pretty much interchangeably. I figured there was some\nsubtle, probably unimportant, difference between them. Recently I learned what it is.\n\nRecently I had a problem where I ran the `run` variant to check the contents of a configuration file\nand to my surprise it was missing entirely! I suspected this `exec`/`run` business to be the culprit\nso I tried using `exec` instead and sure enough the missing configuration file was there.\n\nAs it turns out, `docker compose exec [some container] [command]` will run the given command in\nthe docker container that is already running. On the other hand,\n`docker compose run [some container] [command]` spins up a fresh container.\n\nBut how does that explain the missing configuration file? In our case we have a `Dockerfile` that''s\nlaid out kind of like this:\n\n```dockerfile\nFROM ubuntu:latest as base\n\nWORKDIR /app\n# ... Do a bunch of things ...\n\nFROM base as development\n\n# ... Do a bunch of extra things ...\n# Build all the configuration files:\nCMD ./entrypoint.sh\n```\n\nThen we have a `docker-compose.yml` that looks like this:\n\n```yaml\n# ...\nservices:\n app:\n build:\n context: .\n target: development\n# ...\n```\n\nWith this setup, when I ran docker compose up, it would build the container with the `development`\ntarget and the configuration files would be created. Then when I ran `docker compose exec app bash`,\nI''d see the files. However when I ran `docker compose run app bash`, it would make a new container\nthat was built with the `base` target which didn''t have the files!\n\nIf you''re like me, even after learning this you''ll have some trouble recalling\nwhich command is which, so here''s a silly mnemonic to help:\n\n* (ex)ec is for (ex)isting containers\n* (r)u(n) is for (r)unning a (n)ew container\n\nI''m still not exactly clear why the `run` command doesn''t just build the new container\nwith the `development` target but I''ll update this TIL if I figure it out.','\n',char(10)),'2022-09-25 00:00:00','A look at the key differences between `docker compose exec` and `docker compose run`, illuminating their impact on container behavior and file access.');
INSERT INTO posts VALUES(23,'til/nosetests_only_recurses_subfolders_that_are_modules','TIL: nosetests - Only Recurses Sub-folders That Are Modules',replace('In a project I work on, we organize tests under a `tests` folder. Within that\nfolder, of course, we have several levels of sub-folders. Recently I had a\nproblem where some newer tests weren''t being run with our build. It turns out\nthat `nosetests` only recurses into subfolders that are modules. Thus, to fix\nthe problem, I had to add an empty `__init__.py` file to the subfolder that\ncontained the tests that weren''t being run.\n\nTo prevent this from happening again, I added the following little meta-test to\nour test suite:\n\n```python\nimport os\nimport unittest\n\nclass TestEnsureAllTestFoldersAreModules(unittest.TestCase):\n def test_ensure_all_test_folders_are_modules(self):\n # nosetests won''t run tests in folders that don''t have an __init__.py\n # file, so make sure that all the sub-folders under tests/, recursively,\n # have an __init__.py file. Only check folders that contain a test_*.py\n # file as some folders like __pycache__ don''t contain actual tests.\n\n for root, dirs, files in os.walk(''tests''):\n if any([f.startswith(''test_'') and f.endswith(".py") for f in files]):\n self.assertTrue(\n ''__init__.py'' in files,\n ''{} does not have an __init__.py file''.format(root)\n )\n```\n\n## Resources\n* [How to Run nosetests in All Subdirectories (Stack Overflow)](https://stackoverflow.com/questions/19852548/run-nosetests-in-all-subdirectories)\n* [Python Docs: os.walk](https://docs.python.org/3.11/library/os.html#os.walk)','\n',char(10)),'2022-09-25 00:00:00','An examination of how `nosetests` only runs tests in module subfolders. Learn the fix and meta-test to prevent missing tests in projects.');
INSERT INTO posts VALUES(24,'til/skip_git_commit_hooks','TIL: Skip git Commit Hooks',replace('On my work laptop, I''ve got git hooks set up so git will complain if I forget\ncertain things that make my commits more professional, like:\n\n* Making sure I''ve got ticket numbers in branch names and commit messages\n* Making sure I''m conforming to our commitlint rules\n* Make sure I''m not committing to the directly to the main, production branch\n\nBut sometimes I''m committing to a personal repo like this one or my\n[dotfiles repo](https://github.com/thavelick/dotfiles) and I don''t care about\nthis stuff. After messing with a series of silly ways prevent the hooks from\nrunning I learned that you can just use a simple flag, either `--no-verify` or\n`-n` to skip the hooks:\n\n```bash\ngit commit -n -m "my unprofessional commit message"\n```\n\n## Resources\n* [Stack Overflow: Skip Git Commit Hooks](https://stackoverflow.com/questions/7230820/skip-git-commit-hooks)','\n',char(10)),'2022-09-25 00:00:00','A guide on how to skip git commit hooks when working on personal repositories, featuring tips for a smooth commit process.');
INSERT INTO posts VALUES(25,'a-journey-into-christian-mysticism','A Journey Into Christian Mysticism',replace('Last week, I attended the rehearsal dinner for the wedding of some friends of ours. We ended up sitting with our friend’s priest and his wife. At first, my mind was a little conflicted with the prospect of spending a meal talking to a Christian Priest. On the one hand, I had had some bad experiences with Christianity as a child, and it had turned me away from the Chruch and spirituality in general for many years. On the other hand, I’d been doing a lot of spiritual reading of late and was eager to get an enlightened Christian perspective. I set my prejudices aside and greeted the priest with an open mind.\n\n\nFather Stace turned out to be quite wise and charismatic. We discussed his life as a Priest in training, my dabbling in Buddhism, Hinduism and “New Age” readings, his blog, movies and more. I mentioned that I had attempted to read the Bible a few times and struggled with its immense length. He recommend I start with a few books of the New Testament first, which I plan to do. He could somehow tell that I was interested in the more spiritual side of Christianity and recommended I read, The Mountain of Silence: A Search for Orthodox Spirituality. I wasn’t really enjoying the other book I was reading at the time, so the next day I went out and bought it. I’m quite glad I did.\n\n\nIn some of my other studies I had heard about Christian Mysticism and that it had some similarities with East Asian spiritual paths, but when I researched it online everything was a bit over my head from a theological perspective. The Mountain of Silence was a great change. Written from the perspective of a western academic who had studied other spiritual ideas than Christianity, it was a great change of pace. I won’t try to summarize the book, as I’m sure you can get an idea from Amazon, but here are some ideas that seemed to strike a chord with me:\n\n\n* The Athonite monks recommend a practice of “Ceaseless Prayer” in which a novice monk will repeat the Jesus Prayer (something like “Lord Jesus Christ, Have Mercy on me, a sinner”) until it persisted constantly in the background behind the thought of worldly concerns. This reminded me of the Buddhist/New Age concepts of meditation involving stopping thought. I imagine that while repeating the prayer, one does not have the time for worldly thoughts, and enters a very meditative\-like state. It reminds me of Tolle’s idea that useful thoughts will emerge “from the stillness” in a person who focuses solely on the present moment. The Greek Orthodox concept of Logosimoi also rang of this.\n\n\n* The concept of Hell outlined by Maximos and the other monks from the Mountain seems much plausible than the fire and brimstone picture we get from Christian Fundamentalism and Dante. First, it is not simply unending torture. The monk tells several stories of sinful folk ascending to heaven after death, due to the prayer’s of monks and others on the worldly plane. He also explains that the real suffering in Hell comes from being cut off from God, not necessarily physical pain know here on earth.\n\n* Suffering as a doorway to God. This reminded me so much of Tich Naht Hanh, the Buddhist monk and author, that several times I had to check the title of the book just to be sure of what I was reading.\n\n* Spiritual insight as a “Scientific” practice. Although any practicing scientist would scoff, Father Maximos proposed that spiritual growth is a somewhat scientific process. He said that for spiritual pursuits we must use the proper tools to investigate: Prayer, studying the scriptures, Fasting etc. I would add Meditation and perhaps even rational reductionism ala Hobbes and Descartes to this list. Now, before any of you scientists jump down my throat, I am aware that most things of the spiritual world won’t hold up to a strictly objective scientific method, but taking a more personal/subjective perspective it makes sense.\n\nThrough reading The Mountain of Silence, I''ve gained a new respect for the Jewish/Christian tradition. Although I don’t plan on rushing out to attend church every Sunday, Christianity will no longer be absent from my reading lists.\n\nThe wider my breadth of spiritual knowledge and wisdom becomes, the more I realize that all truly enlightened people are all talking about the same things. Terrorism, War and Famine might be all things of the past if people learned from their truly enlightened spiritual guides rather than blindly following interpretations of “Holy” texts that happen to meet their worldly wishes at the moment.','\n',char(10)),'2006-10-06 00:00:00','Reflections on a conversation with a priest and insights gained from Christian mysticism, exploring parallels with Eastern spirituality and personal growth.');
INSERT INTO posts VALUES(26,'an-economic-case-for-labor-unions-in-a-political-world','An Economic Case for Labor Unions in a Political World',replace('Ask most western economists today, and they’ll tell you that a free market is the most efficient and fair economic system that exists. They’ll show through the laws of supply and demand that price caps cause shortages, that subsidies cause undue surpluses, that monopolies and inter-company collusion cause higher prices and lower wages for workers, and that labor unions and minimum wage laws cause higher unemployment and less efficiency in the economy as a whole.\n\nEconomists will typically preface such analyses with a phrase such as, “All else held equal” that simplifies their argument and allows them to talk about one thing at a time and extrapolate useful patterns. However, the real world does not exist in an economic vacuum. The way our political system works today greatly influences the economic realities in our country. Today’s Mega-corporations control vast amount of capital that can be used to fund lobbies that can greatly influence policy regarding antitrust laws, hiring practices and other such political-economic decisions. Thus, the political power of corporations can lead to artificially lower wages and higher prices than would be the case in a fully free market.\n\nIn an otherwise free market, labor unions typically cause artificially high wages, causing higher unemployment across each unionized industry. This means that those worker who would have had jobs in the industry at a lower pay rate move to other industries which they are not as well suited. Since they are not well suited to their second choice job, they are contributing to the economy as much as they otherwise would. Therefore, in a truly free market labor unions are unnecessary and counter productive.\n\nHowever, with the power large employers can gain in our political world, the price of labor is already lower than it would otherwise be in a free market. Thus, there are two possible solutions to this problem: (1.) raise the wages of laborers to their natural level by restructuring the political system through campaign finance laws and lobbying reform or (2.) by allowing workers to organize and negotiate high wages as a unit. Clearly, given the existing political power already realized by corporate America, the former solution wold be difficult and timely. In the later solution, labor can be organized without the explicit help of the political system. Workers can use their collective power to raise wages without the intervention of the government, and have.\n\nLabor unions (in most cases) are not raising their wages beyond what they would be in a free market, they are simply raising them to the level they would be under a truly free market. Labor unions create the same economic tension with large corporations that a large group of individual workers, acting in their own self interest create against a large market of potential employers. Unions are not the result of greed and laziness on the part of worker, but simply an economic response to balance the increased power of large politically interested companies.','\n',char(10)),'2007-12-01 00:00:00','An analysis of labor unions in today''s political economy, exploring their role in balancing corporate power and advocating for fair wages in a complex market.');
INSERT INTO posts VALUES(27,'back-online-concluding-spirituality','Back Online / Concluding Spirituality',replace('I finally got some time to fix my blog this afternoon… (It had been broken for a long while).\n\n\nSince I last posted, I have lost interest in spirituality reading, and thus future posts will likely be about other things. Regarding Spirituality, I still sit in pretty much the same boat I started in: I see myself as an open\-minded agnostic, respecting (nearly) all spiritual disciplines for their wisdom.','\n',char(10)),'2007-10-26 00:00:00','Reflecting on a blogging journey and a shift in focus away from spirituality towards new interests, embracing an open-minded approach.');
INSERT INTO posts VALUES(28,'spiritual-questions-re-emerge-after-seeing-the-lion-king','Philosophical Questions re-emerge after seeing, The Lion King','Last Friday, my family and I saw the stage adaptation of Disney’s *The Lion King*. It reminded me of an important lesson. Of late I had taken on the philosophy of staying focused on the present moment, and not dwelling in the past or fearing the future. Although a valuable outlook, *The Lion King* reminded me that one should not focus on the present at the expense of responsibility created in the past.','2006-10-23 00:00:00','A reflection on *The Lion King* and its profound lessons about balancing present focus with accountability for the past.');
INSERT INTO posts VALUES(29,'spirituality-survey','Spirituality Survey',replace('Tonight, I found this spirituality survey. Unlike some survey sites, this one is pretty unbiased and seems to have a wide variety of questions and answer choices. Although I think there is a lot to be learned from all the world’s religions, even the ones we consider “Mythology” now, it seems to have pegged my current spiritual state pretty well. Here are my results. How did you (my 1.2 regular readers out there) do? How does it compare with what you *think* you believe?\n\n> 1. Unitarian Universalism (100%)\n> 2. Liberal Quakers (96%)\n> 3. Mainline to Liberal Christian Protestants (94%)\n> 4. Mahayana Buddhism (85%)\n> 5. Theravada Buddhism (83%)\n> 6. Neo\-Pagan (83%)\n> 7. New Age (78%)\n> 8. Baháʼí Faith (76%)\n> 9. Christian Science (Church of Christ, Scientist) (72%)\n> 10. Taoism (66%)\n> 11. New Thought (65%)\n> 12. Reform Judaism (64%)\n> 13. Secular Humanism (62%)\n> 14. Sikhism (61%)\n> 15. Hinduism (60%)\n> 16. Scientology (60%)\n> 17. Jainism (59%)\n> 18. Orthodox Quaker (52%)\n> 19. Church of Jesus Christ of Latter\-Day Saints (Mormons) (48%)\n> 20. Mainline to Conservative Christian/Protestant (43%)\n> 21. Jehovah’s Witness (38%)\n> 22. Orthodox Judaism (37%)\n> 23. Nontheist (35%)\n> 24. Islam (31%)\n> 25. Seventh Day Adventist (27%)\n> 26. Eastern Orthodox (18%)\n> 27. Roman Catholic (18%)','\n',char(10)),'2006-10-27 00:00:00','A personal reflection on an unbiased spirituality survey, revealing insights into diverse beliefs and comparing results with personal thoughts.');
INSERT INTO posts VALUES(30,'debunking-religion-as-insurance','Debunking Religion as “insurance”',replace('Surfing around today, I stumbled onto a blog on MySpace. Here is what he says:\n\n> ...\n>\n>\n>\n>\n> I''ve come to view Christianity this way. If i live right, do what the bible says, and die (which – face it, we all will someday) and there is no God … all i would of given up is a couple nights of partying… sex before marriage (cos you do get to have sex… all you have to do is wait…)\n>\n> BUT…\n>\n> If there is a God and he sent his son to die for us… and you haven''t lived right. Do what the bible says you shouldn''t… Who has more to lose?\n>\n> ...\n\nI hear this argument quite a bit, so I decided to take a minute to respond. Here is what I responded:\n\nI find that sort of “Insurance” based belief to be a bit misleading. It works great if there are only two possibilities (Christianity or Nothing). But that isn''t the case. Wikipeida''s world religions category contains over 75 different entries, not including those in sub categories. Thus, in a purely statistical sense, by choosing Christianity, you have only a 1 in 76 chance in choosing correctly!\n\nIf your goal is to choose the spiritual path that will most likely help you avoid pain and suffering, you may want to look a Buddhism. Buddhism centers around focus on the present moment, and accepting what is, be it happiness suffering or whatever. Thus, the external world means little to the Buddhist. There are even Monks in Tibet who have gotten so good at being in touch with their inner energy, that they can turn off their sense of physical pain. (This is not conjecture, myth or just a story. Actual western scientists have researched this and have verified using brain scans etc, that they in fact do not feel pain unless they choose to). Thus, if the Buddhist is wrong, and a literal Jewish/Christian view is correct, I doubt it would matter in the slightest to the Buddhist if he were tortured in the depths of firey hell. He is no longer connected with physical and emotional pain, and can endure Satan’s torture as easily as you or I could tolerate a food we do not enjoy.\n\n\nNow of course, this is pretty ridiculous. I’m not telling you to convert or anything. I am just saying that this sort of argument you''ve presented doesn''t quite hold up. If you believe in Christianity, have faith from the depths of your heart – not as a fail\-safe against suffering in the afterlife.','\n',char(10)),'2006-10-24 00:00:00','An examination of the flawed notion of religion as ''insurance.'' Discover why faith should be heartfelt, not driven by fear of consequences.');
INSERT INTO posts VALUES(31,'islamic-philosophy-through-sufism','Islamic Philosophy through Sufism',replace('Last week, when I walked into my local bookstore, they had a display paying homage to this being the Islamic Holy month of Ramadan. Seeing this, I thought it would be prudent to honor it by reading up on Islamic Mysticism, as seen by the Sufis. So I picked up The Way of the Sufi (Penguin Arkana).\n\n\nAlthough the book was a valuable read, and at times very inthrawling, it was also quite difficult to proccess. Part of Sufism states that the right spiritual path is dependent on time and location. Thus, teachings that apply to one locality at one time, do not apply in another time or place. Therefore I was reading something that was telling me again and again that it was not applicable to me. \n\n\nAlthough it was frustrating, I found the Sufis did (do) exhibit quite a bit of true wisdom. Their general philosophy of education as described above is actually quite intriguing in and of itself. It reminds me that applying ancient texts like the Bible, the Bhagavad Gita, Homer’s works, the Koran etc. Are never going to be as applicable as they were to the contemporaries of those works. I would argue, as I believe the Sufi’s certainly would that such ancient texts are not devoid of meaning outside their original contexts, just that they should be taken with a grain of salt.\n\n\nThe Sufis also make extensive use of parable and poetry, often meant to misdirect the reader/student to learn something he doesn’t necessarily expect or even desire, while at the same time something that student **needs** to learn. This principle is well illustrated in a story I’ll attempt to paraphrase:\n\n\n**The Happiest Man in the World**\n\n\nA young man went to a Sufi teacher and asked him, “What do I need to do to attain true happiness? ”. The master responded that the questioner should seek out the happiest man in the world and ask for his shirt. Thus he would attain true happiness. \n\n\nEager to find the answer, the young man packed his bags and went on a journey to find the happiest man in the world. As he arrived in a new town, he asked the townsfolk who was the happiest person they knew. Each time he would meet someone, they always said “I know of a man who is much happier than I. He lives in such and such a place; seek him out”. For 40 years the man searched the world from town to town, from country, seeking ever happier and happier men.\n\n\nFinally, the man’s tiring travels led him to a very old man, living alone atop a high mountain. Exhausted he asked the old man: “Are you the happiest man in the world?” The old man, smiled and replied that he could not think of anyone who was happier than he. Relived that he had reached the end of Journey and was near attainment of what he had sought all these many years he asked the old one, “Please, I was instructed to ask for your shirt so that I may be as happy as you are”, the man requested, “May I please have your shirt?”\n\n\nAt the question, the old man laughed a large and hearty laugh saying, “I’m sorry son, but I do not have a shirt. Can you not see that my chest is bare?”\n\n\nPuzzled, the younger man studied elder. Not only was he not wearing a shirt but looking under the old one’s long beard and wrinkled, leather\-like skin was the face of the the Sufi teacher who first sent him on the quest. “Why!, Why”, the man cried, “why did you send me on this quest, when I had known you all those years ago?”\n\n\nThe old man smiled a wide grin and said, “Because that is what you needed at the time. Now you are ready to learn”.','\n',char(10)),'2006-10-23 00:00:00','An exploration of Sufism''s wisdom, highlighting the journey to understanding happiness through paradox and the importance of context in ancient teachings.');
INSERT INTO posts VALUES(32,'on-obsessions','On Obsessions',replace('If you’ve known me personally for a while, you’ll notice that I tend to get very interested in certain topics for 4\-6 month periods. During such a period, I’ll focus nearly all of my energy in learning everything I can about that particular topic. I don’t choose these periods, it just kind of happens that way. \n\n\nThis blog was started when my interest was focused on Spirituality. During the time this blog was broken, I became interested in, and later became bored with three to five months later:\n\n\n* Board Games – I played classic games like Mille Bornes, Othello, Cribbage and Dominoes as well as newer “German style” board games like Lost Cities. Julia (my wife) shared this interest with me. In February we went to Genghis Con, a big Gaming Convention here in Colorado and had a lot of fun. Julia was disappointed when I lost interest in board games, but I suspect I’ll come back to this one soon.\n\n\n* Entrepreneurship – If I could be paid to read about running a business, I’d be a happy man. (That isn’t to say I’m not happy as it is). Unfortunately, I tend to get really lazy when it comes to actually running a business. However, I went through a period this year where I read a ton of business books, fully intent on starting my own (non\-Consulting) business. I read classics, as well as books and blogs on “Information Marketing”, running a software business etc. I had several ideas, but none of them really panned out. Looking back, its clear I was looking for a “get rich quick” plan, which I now realize can’t really work. The last book I read in this vein was “The Millionaire Next Door” which totally changed my perspective on the whole “get rich” issue and led to my next topic of interest …\n\n\n* Personal Financial Management – After reading Thomas Stanley’s “The Millionaire Mind” I realized that I could get ‘rich’, without taking a bunch of risk, and without even doing a bunch of extra work. The key is this: Live on less than you make. Simply by going out to eat less, and visiting libraries instead of bookstores etc. I realized we could become wealthy, by Tom Stanley’s definition in about four years, much sooner than I’d ever thought possible before. Around the same time, I found Dave Ramsey, the host of a radio talk show on personal finance. In line with Stanley he advocates a detailed plan that involves paying off all consumer debt, building up a big emergency fund, then putting 15% of ones income to\-wards retirement, then paying off one’s house ASAP. We are essentially on this plan. Using it, we’ve paid off our car, some credit card debt, and raised an emergency fund that will cover me being unemployed for up to 6 months should I lose my job. Although I’ve stopped reading on this topic, we still live on a budget. We still plan on having our house paid off in a little over 3 years from now!\n\n\n* Programming – This is a recurring obsession that I’ve based my career on. This time I’m most interested in Artificial Intellegence related stuff.\n\n\n* Mathematics and Movies – I’m now interested in these two topics. I’ll write more on these in future posts.\n\n\nSo, this blog will be a bit disjointed. Its probably not a good idea from a marketing standpoint, but I’m not trying to make money from this anyway','\n',char(10)),'2007-10-26 00:00:00','A personal reflection on fleeting obsessions, from board games to programming, showcasing the ever-evolving interests that shape our lives.');
INSERT INTO posts VALUES(33,'sunday-quote-of-wisdom-i','Sunday Quote of Wisdom I',replace('> On the mountains of truth you can never climb in vain: either you will reach a point higher up today, or you will be training your powers so that you will be able to climb higher tomorrow. – **Nietzsche**\n\n\n\n\n\n\n\nWhether in science or in spirit, this rings ture. So long as we keep an open mind and keep pressing forward, we come closer to truth.\n\n\nThis weeks image is an artists rendering of the mountains of Saturn’s moon, Titan.\n\n\nNote that the Sunday Quote of Wisdom is a shameless ripoff of my sister’s [Friday Fractal](https://web.archive.org/web/20101230041145/http://scienceblogs.com/chaoticutopia/2006/10/friday_fractal_xxi.php) at her blog, [Chaotic Utopia](https://web.archive.org/web/20110101181627/http://scienceblogs.com/chaoticutopia).','\n',char(10)),'2006-10-08 00:00:00','Reflecting on a profound Nietzsche quote, this post contemplates the journey toward truth amidst the beauty of Titan''s mountains.');
INSERT INTO posts VALUES(34,'sunday-quote-of-wisdom-ii-a-look-into-rationalist-atheism','Sunday Quote of Wisdom II - A look into rationalist atheism.',replace('In order to maintain a true balance in my quest for spiritual wisdom, I’ve decided to take a while to investigate the counter\-argument. Thus, today I started reading: Why I Am Not a Christian: And Other Essays on Religion and Related Subjects. So far I am finding that Russell presents very good arguments against the formalized dogma and religious hierarchy, such as that in the Catholic church, or Tibetan Buddhism. \n\n\nThat said, his arguments don’t seem to hold up against less dogmatic spirituality as presented in Buddhism by Tich Naht Hanh (in my brief exposure to him) Eckhart Tolle and Quakerism, that focus on an individual connection with “the infinite” be it God, the Tao or whatever you’d like to call it. \n\n\nStill, I think there is a lot Russell and his spiritual adversaries can agree on. This quote struck me as such a case:\n\n\n\n> The good life is one inspired by love and guided by knowledge.\n\n\nAlthough many spiritual teachers I have read seem to reject knowledge as part of “enlightenment”, reading deeper, they do see knowledge as a valued asset for one’s day to day life.\n\n\nRussell brings up the point that religions tend to open up and become more mild in free, open societies. What he may not realize is that perhaps that openness is part of the human race’s spiritual argument. Yes, Dogmatic, closed, judgemental religion probably isn’t good for society. It perpetuates situations like Europe saw in the Middle Ages, and what parts of the middle east are experiencing today. On the other hand, it doesn’t necessarily follow that all spiritual beliefs are useless.','\n',char(10)),'2006-10-23 00:00:00','A reflection on rationalist atheism, exploring Russell''s critiques of dogmatic religion and the merit of personal spirituality in finding wisdom.');
INSERT INTO posts VALUES(35,'the-dao-of-programming','The Dao of Programming',replace('If anyone happens to look at my “Currently reading” list on the left, you’ll see I’m reading the “Tao Te Ching”. If you are are programmer, you can get a shorter, and more specialized work based on it, [The Tao of Programming](http://www.canonical.org/~kragen/tao-of-programming.html)\n\n\nIt’s hilarious in that “funny because its true” way.','\n',char(10)),'2006-10-06 00:00:00','A humorous take on programming philosophies inspired by the Tao Te Ching, highlighting the lighter side of coding and its timeless wisdom.');
INSERT INTO posts VALUES(36,'the-tao-te-ching','The Tao Te Ching',replace('I’ve just finsihed my second, slower read of Lau Tzu’s Tao Te Ching as translated by Stephen Mitchell. While pondering this short but rich (as in cheesecake) book, I thought of many things that would make great blog entries. I couldn’t decide on just one, so here is a preview of blog posts to come regarding and/or inspired by this ancient writing:\n\n\n \n\n\n\n* [The Tao Te Ching for programmers](http://www.tristanhavelick.com/the-tao-te-ching-for-programmers/) (Not to be confused with the Tao of Programming)\n* A time for this and a time for that – One stanza of the Tao Te Ching that seems strangely similar to a book of the bible (and, by proxy a classic rock song)\n* Is there a role for the “enlightend” in Politics?\n* Lao Tzu – Adam Smith from 500 BC?\n* A Quick Summary of the Tao – Not what you expect.\n\n\nMeanwhile, I’ll be starting on my next book. It’s back to the western world for a while with Holy Silence: The Gift Of Quaker Spirituality','\n',char(10)),'2006-10-09 00:00:00','Insights from my journey through the Tao Te Ching, sparking ideas for future explorations on its timeless wisdom and modern relevance.');
INSERT INTO posts VALUES(37,'the-tao-te-ching-for-programmers','The Tao Te Ching For Programmers',replace('Reading the Tao, several of it’s short chapters seemed to speak to me as a programmer. I’ll quote some of them here and give my thoughts.\n\n**Chapter 4**\n\n> The Tao is like a well:\n>\n> used but never used up.\n>\n> It is like the eternal void:\n>\n> filled with infinite possibilities.\n> It is hidden but always present.\n>\n> I don’t know who gave birth to it.\n>\n> It is older than God.\n\nIn this chapter, the Tao reminds me of the ideal code behind a software application. Its code can be used again and again, as many times as needed. It’s objects and classes can be used in infinite combinations, making for very flexible software. The users can’t see the code, and may not even know its there, but it is.\n\nThe last two lines are a little harder to fit into this perspective. Perhaps this is referring to some of the old BASIC and FORTRAN programs my grandfather wrote in the 70’s and 80’s ~~\- Powerful and flexible for their time, yet impossible to maintain :~~)\n\n\n**Chapter 63**\n\n> Act without doing;\n>\n> work without effort.\n>\n> Think of the small as large\n>\n> and the few as many.\n>\n> Confront the difficult\n>\n> while it is still easy;\n>\n> accomplish the great task\n>\n> by a series of small acts.\n>\n> The Master never reaches for the great;\n>\n> thus she achieves greatness.\n>\n> When she runs into a difficulty,\n>\n> she stops and gives herself to it.\n>\n> She doesn’t cling to her own comfort;\n>\n> thus problems are no problem for her.\n\nThis chapter describes the ideal attitude for a programmer. In my mind, this passage speaks for itself. I’ll leave the commentary to you.\n\n\n**Chapter 64**\n\n> What is rooted is easy to nourish.\n>\n> What is recent is easy to correct.\n>\n> What is brittle is easy to break.\n>\n> What is small is easy to scatter.\n>\n> Prevent trouble before it arises.\n>\n> Put things in order before they exist.\n>\n> The giant pine tree\n>\n> grows from a tiny sprout.\n>\n> The journey of a thousand miles\n>\n> starts from beneath your feet.\n>\n> Rushing into action, you fail.\n>\n> Trying to grasp things, you lose them.\n>\n> Forcing a project to completion,\n>\n> you ruin what was almost ripe.\n>\n> Therefore the Master takes action\n>\n> by letting things take their course.\n>\n> He remains as calm\n>\n> at the end as at the beginning.\n>\n> He has nothing,\n>\n> thus has nothing to lose.\n>\n> What he desires is non\-desire;\n>\n> what he learns is to unlearn.\n>\n> He simply reminds people\n>\n> of who they have always been.\n>\n> He cares about nothing but the Tao.\n>\n> Thus he can care for all things.\n\n\n\n\nThis passage brings me back to the Pragmatic Programmers who detailed such practices as\n\n\n* Care About Your Craft\n* Think! About Your Work\n* Don’t Panic When Debugging\n* Remember the Big Picture\n* Abstractions Live Longer than Details\n\n\nand just about every other chapter in their book, seems to speak this chapter of the Tao.\n\n\n**Overall Thoughts**\n\n\nA word of advice for all my programmer readers out there (I think there might be 2 of you): As a first step, put away that book on Ajax, Ruby, Haskell, the upcoming .Net Framework or whatever the latest language is and pick up some books that will help you become a better programmer in general. Second, at the same time, do not forget that programming does not exist in isolation. Be sure to expand your mind and spirit to other ideas outside of the day to day grind. I’ll end with a fitting stanza from Chapter 12 of the Tao Te Ching:\n\n\n\n> The Master observes the world\n> but trusts his inner vision.\n> He allows things to come and go.\n> His heart is open as the sky.\n\n\nQuotes taken from Stephen Mitchell’s version of Lao Tzu’s Tao te Ching. (c) 1988.','\n',char(10)),'2006-10-12 00:00:00','Reflections on the Tao Te Ching through the lens of programming. Insights connect ancient wisdom with modern coding practices and philosophy.');
INSERT INTO posts VALUES(39,'underhanded-seo-tricks','Underhanded SEO tricks','I’ve been doing a lot of reading of late on “Black Hat SEO”, which is basically search engine optimization that doesn’t play by search engines rules. This includes more grey area things, like scraping massive amounts of content from other sites, and re\-optimizing with new keywords, to more nefarious things like blog spam. A lot of things these Black Hats are just plain creative. One such thing is the using a forged referrer back to your website on all websites you visit. ( See [Fake Your Referer, Get More Traffic](https://web.archive.org/web/20190402172825/http://www.nickycakes.com/fake-your-referer-get-more-traffic/) ) I’m testing this now, so if you got here by finding my site in your logs, let me know!','2008-02-13 00:00:00','An insight into Black Hat SEO tactics, highlighting creative yet questionable strategies that manipulate search engine rules for traffic gains.');
INSERT INTO posts VALUES(40,'questionable-ai','My questionable use of AI coding instead learning something new',replace('Tonight I was reading,\n[I''m an American software developer and the "broligarchs" don''t speak for me](https://ratfactor.com/tech-nope) and ran across this passage which completely derailed me way beyond what it should have:\n\n> I can buy a 32Gb USB flash drive for the price of a cup of coffee, store a compressed copy of Wikipedia on it, and throw it in my pocket like it’s no big deal. That’s incredible.\n\nI thought, huh. That is indeed incredible! But what if I were more pedantic? I remembered the wikipedia archive I''d used previously being around 100GB, which is well beyond what you can throw on a 32 GB thumb drive. That said, I''m wrong more often than not so I decided to check my memory. I jumped over to the Kiwix Library page to investigate. For those who are unaware, Kiwix is a neat system that allows you to self host Wikipedia and a bunch of other useful websites in case the world, or just your internet connection, goes a little haywire. The Kiwix library page search leaves a lot to be desired though. With some quick browsing I could tell that the largest, most complete English Wikipedia archive was 100 GB. But with so many smaller alternatives, it was hard to tell what the smallest complete version was". Rather than spending 5 more minutes reading through the search results to find the right result I decided to see if I could quickly scrape some data here to make searching easier.\n\nThis was my first mistake.\n\nI quickly found an [Atom feed](https://library.kiwix.org/catalog/v2/entries) that I could add URL parameters like `start`, `count` and `category`. I had data! But it was in XML. XML and I. Well. Let''s just say we don''t really get along. If this was json, I could throw [jq](https://jqlang.org/) at it and query the data I need in a couple minutes. But it wasn''t. It was XML. Ugh. But, wondered, perhaps there''s something like `jq` that works with XML. Yes! It turns out [xq](https://github.com/sibprogrammer/xq) is a thing. So I installed that and fiddled with it for all of 3 minutes before giving up on finding the right XPath expression to find the largest full archive. Then I decided, that perhaps it''d be easier to just have AI code up a customized script to get the data I wanted.\n\nThis was my second mistake.\n\nI booted up [Aider](https://aider.chat) in a new repo and set out to create a script to convert the atom feed to a SQLite database I could very easily query. 19 minutes of prompting later and I had my answer. Now, I''m not one to just have an AI puke out some slop and post it on github and walk away. No sir! So I spent another 40 minutes cleaning it up and making it look nice. If you need a good tool to [convert a Kiwix atom feed to a SQLite DB](https://github.com/thavelick/kiwix-atom-to-sqlitedb), I have your back. Because I''m certain you need this tool.\n\nAn hour and a half later, I now know that a full image free copy of Wikipedia will set you back 53 GB, meaning you''d actually need a 64 GB flash drive. On Amazon this would cost an additional-- wait. The 64 GB drives seem to be **cheaper** on balance than the 32 GB ones!? Nevermind. Where was I?\n\nThe AI tooling made this easy. But I can''t help but pause and feel like maybe I''d lost something here. Had I not had access to these tools, maybe I would have actually sat down and learned `xq` better. Maybe I would have refreshed my XPath skills and maybe I wouldn''t continue to give XML so much grief. Or maybe I would have realized sooner the silliness of throwing technology at a question I could have just read a few more words using my own brain to find the answer. In some alternate timeline, I could have just focused on what I was reading and ignored an irrelevant throw-away fact.\n\nWith new technologies, we let previous skills atrophy. With writing, we lessened memorization and discounted the oral tradition. With pocket calculators we placed less importance on rote arithmetic. With search engines we became less practiced in research in the library. Perhaps tools like `jq` and `xq` will be less needed in some future where we can ask AI to code anything in seconds. But just like memorization and storytelling are still valuable skills today, keeping up on such tools is likely going to be useful for some time to come.\n\nNow, I should really get back to reading that blog article. It''s certainly worth my time.','\n',char(10)),'2025-03-26 00:00:00',NULL);
INSERT INTO posts VALUES(41,'less-code-review','Less Code Review',replace('Lately, like many software engineers, I''ve felt the double-edged sword of coding agents'' ability to create a lot of working code really quickly as well as the additional burden of reviewing that code. Avery Pennarun [recently wrote](https://apenwarr.ca/log/20260316) that this burden predates LLMs and that agentic coding only amplifies the problem. His thoughts feel apt:\n\n> The job of a code reviewer isn''t to review code. It''s to figure out how to obsolete their code review comment, that whole class of comment, in all future cases, until you don''t need their reviews at all anymore.\n>\n> (Think of the people who first created "go fmt" and how many stupid code review comments about whitespace are gone forever. Now that''s engineering.)\n\nIt''s heartening to realize that I''ve already been on the journey of reducing code review burden through automation for years, and that finding ways to do more is just traveling further down that path.\n\nSome teams are experimenting with a ["Dark Factory"](https://simonwillison.net/2026/Jan/28/the-five-levels/) pattern where no humans ever look at the code. This scares me, but I do agree with Avery when he says:\n\n> Reducing review stages, even to an uncomfortable degree, is going to be needed. But you can''t just reduce review stages without something to replace them. That way lies the Ford Pinto or any recent Boeing aircraft.\n\nOne way of doing this is probably to increase the amount of automated testing we do to what would have been a ridiculous degree a few years ago. Ideas like [mutation testing](https://peterlavigne.com/writing/verifying-ai-generated-code) help validate that our tests are actually testing functionality and we don''t have untested side effects. Building this kind of thing into our workflows could make it possible to avoid reviewing tests as closely while still staying confident that they''re effective.\n\nFinding the right balance here is going to be tricky, but I''m here for it.','\n',char(10)),'2026-03-17 00:00:00',NULL);
CREATE TABLE categories (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE
);
INSERT INTO categories VALUES(1,'blog');
INSERT INTO categories VALUES(2,'recipe');
INSERT INTO categories VALUES(3,'til');
INSERT INTO categories VALUES(4,'spirituality');
INSERT INTO categories VALUES(5,'economics');
INSERT INTO categories VALUES(6,'rambling');
INSERT INTO categories VALUES(7,'philosophy');
INSERT INTO categories VALUES(8,'sunday quote of wisdom');
INSERT INTO categories VALUES(9,'programming');
INSERT INTO categories VALUES(10,'seo');
CREATE TABLE post_categories (
post_id INTEGER,
category_id INTEGER,
PRIMARY KEY (post_id, category_id),
FOREIGN KEY (post_id) REFERENCES posts(id),
FOREIGN KEY (category_id) REFERENCES categories(id)
);
INSERT INTO post_categories VALUES(1,2);
INSERT INTO post_categories VALUES(2,2);
INSERT INTO post_categories VALUES(3,2);
INSERT INTO post_categories VALUES(4,2);
INSERT INTO post_categories VALUES(5,1);
INSERT INTO post_categories VALUES(6,1);
INSERT INTO post_categories VALUES(7,1);
INSERT INTO post_categories VALUES(8,1);
INSERT INTO post_categories VALUES(9,1);
INSERT INTO post_categories VALUES(10,1);
INSERT INTO post_categories VALUES(11,1);
INSERT INTO post_categories VALUES(12,1);
INSERT INTO post_categories VALUES(13,1);
INSERT INTO post_categories VALUES(14,1);
INSERT INTO post_categories VALUES(15,3);
INSERT INTO post_categories VALUES(15,1);
INSERT INTO post_categories VALUES(16,3);
INSERT INTO post_categories VALUES(16,1);
INSERT INTO post_categories VALUES(17,3);
INSERT INTO post_categories VALUES(17,1);
INSERT INTO post_categories VALUES(18,3);
INSERT INTO post_categories VALUES(18,1);
INSERT INTO post_categories VALUES(19,3);
INSERT INTO post_categories VALUES(19,1);
INSERT INTO post_categories VALUES(20,3);
INSERT INTO post_categories VALUES(20,1);
INSERT INTO post_categories VALUES(21,3);
INSERT INTO post_categories VALUES(21,1);
INSERT INTO post_categories VALUES(22,3);
INSERT INTO post_categories VALUES(22,1);
INSERT INTO post_categories VALUES(23,3);
INSERT INTO post_categories VALUES(23,1);
INSERT INTO post_categories VALUES(24,3);
INSERT INTO post_categories VALUES(24,1);
INSERT INTO post_categories VALUES(27,1);
INSERT INTO post_categories VALUES(27,6);
INSERT INTO post_categories VALUES(27,4);
INSERT INTO post_categories VALUES(28,1);
INSERT INTO post_categories VALUES(28,6);
INSERT INTO post_categories VALUES(28,4);
INSERT INTO post_categories VALUES(31,1);
INSERT INTO post_categories VALUES(31,7);
INSERT INTO post_categories VALUES(31,4);
INSERT INTO post_categories VALUES(32,1);
INSERT INTO post_categories VALUES(32,6);
INSERT INTO post_categories VALUES(34,1);
INSERT INTO post_categories VALUES(34,7);
INSERT INTO post_categories VALUES(34,8);
INSERT INTO post_categories VALUES(35,1);
INSERT INTO post_categories VALUES(35,9);
INSERT INTO post_categories VALUES(35,4);
INSERT INTO post_categories VALUES(36,1);
INSERT INTO post_categories VALUES(36,7);
INSERT INTO post_categories VALUES(36,4);
INSERT INTO post_categories VALUES(38,1);
INSERT INTO post_categories VALUES(38,10);
INSERT INTO post_categories VALUES(37,1);
INSERT INTO post_categories VALUES(37,7);
INSERT INTO post_categories VALUES(37,9);
INSERT INTO post_categories VALUES(37,4);
INSERT INTO post_categories VALUES(30,1);
INSERT INTO post_categories VALUES(30,4);
INSERT INTO post_categories VALUES(25,1);
INSERT INTO post_categories VALUES(25,4);
INSERT INTO post_categories VALUES(33,1);
INSERT INTO post_categories VALUES(33,7);
INSERT INTO post_categories VALUES(33,8);
INSERT INTO post_categories VALUES(29,1);
INSERT INTO post_categories VALUES(29,4);
INSERT INTO post_categories VALUES(26,1);
INSERT INTO post_categories VALUES(26,5);
INSERT INTO post_categories VALUES(39,1);
INSERT INTO post_categories VALUES(39,10);
INSERT INTO post_categories VALUES(40,1);
INSERT INTO post_categories VALUES(41,1);
DELETE FROM sqlite_sequence;
INSERT INTO sqlite_sequence VALUES('posts',41);
INSERT INTO sqlite_sequence VALUES('categories',10);
INSERT INTO sqlite_sequence VALUES('posts',39);
INSERT INTO sqlite_sequence VALUES('categories',10);
INSERT INTO sqlite_sequence VALUES('categories',2);
INSERT INTO sqlite_sequence VALUES('posts',13);
COMMIT;