<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>nickgeorge.net home on nick</title><link>https://nickgeorge.net/</link><description>Recent content from nick</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License</copyright><lastBuildDate>Wed, 17 Sep 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://nickgeorge.net/index.xml" rel="self" type="application/rss+xml"/><item><title>Simple and Efficient SEC Filing Parsing Using Go</title><link>https://nickgeorge.net/sec-parser/</link><pubDate>Tue, 30 Dec 2025 00:00:00 +0000</pubDate><guid>https://nickgeorge.net/sec-parser/</guid><description>&lt;p&gt;There are many SEC filings parsers, &lt;a href="https://github.com/RxDataLab/go-edgar"&gt;this one is mine&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Public companies in the US are required to file standardized disclosures with the SEC. Tracking those filings and extracting structured data from them is extremely useful, but surprisingly difficult to do. I run an &lt;a href="https://app.rxdatalab.com/"&gt;application focused on biotech company activity&lt;/a&gt;, and SEC filings are a core input that can tell you a lot about what companies are up to. For example, the cover image above is a screenshot of an interactive plot of &lt;a href="https://rxdatalab.com/research/wave-life-sciences-insiders/#eight-execution-dates-converge"&gt;insider trades based on Form 4 from Wave Life Sciences&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Debugging 'Malformed Database Schema' in SQLite</title><link>https://nickgeorge.net/sqlite-debugging-corruption/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><guid>https://nickgeorge.net/sqlite-debugging-corruption/</guid><description>&lt;p&gt;I run a biotech investment and competitive intelligence tracking application. The app is a go app run on a bare-bones VPS with a SQLite database as the data store, dead simple.&lt;/p&gt;
&lt;p&gt;I was recently working on a major rebuild of the database on a separate server (&lt;code&gt;build-server&lt;/code&gt;). When I was satisfied, with the changes, I tried to deploy:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# on the build-server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sqlite3 rxdatalab.db &lt;span style="color:#e6db74"&gt;&amp;#34;PRAGMA quick_check;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# quick_check&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# -----------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ok&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sqlite3 rxdatalab.db &lt;span style="color:#e6db74"&gt;&amp;#34;.tables&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# list of tables...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# copy to s3:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aws s3 cp rxdatalab.db s3://bucket/rxdatalab.db.new
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# OK&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, copy to my prod server, and start the app:&lt;/p&gt;</description></item><item><title>Paddle Overlay Checkout</title><link>https://nickgeorge.net/paddle-development/overlay-checkout/</link><pubDate>Sat, 05 Jul 2025 00:00:00 +0000</pubDate><guid>https://nickgeorge.net/paddle-development/overlay-checkout/</guid><description>&lt;p&gt;First, let&amp;rsquo;s make a frontend key and save it in our hugo.toml under a key like &lt;code&gt;paddleSandboxClientSideJsToken&lt;/code&gt; (you&amp;rsquo;ll also have a &lt;code&gt;paddleProdClientSideJsToken&lt;/code&gt;). Then, on your layouts/products/single.html template make a javascript snippet like so:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;script src=&amp;#34;https://cdn.paddle.com/paddle/v2/paddle.js&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;#34;text/javascript&amp;#34;&amp;gt;
{{- $paddleToken := &amp;#34;&amp;#34; -}}
{{- $priceIds := slice -}}
{{ if hugo.IsServer -}}
Paddle.Environment.set(&amp;#34;sandbox&amp;#34;);
{{- $paddleToken = .Site.Params.paddleSandboxClientSideJsToke -}}
{{- $priceIds = .Params.product.testPaddlePriceIds -}}
{{- else -}}
{{- $paddleToken = .Site.Params.paddleProdClientSideJsToken -}}
{{- $priceIds = .Params.product.prodPaddlePriceIds -}}
{{- end }}
Paddle.Initialize({
token: &amp;#39;{{ $paddleToken }}&amp;#39;,
checkout: {
settings: {
variant: &amp;#39;one-page&amp;#39; // or multi-page
}
}
});
let itemList = [
{{ range $index, $id := $priceIds -}}
{ priceId: &amp;#34;{{ $id }}&amp;#34;, quantity: 1 }{{ if ne (add $index 1) (len $priceIds) }},{{ end }}
{{ end }}
]
function openCheckout(items){
Paddle.Checkout.open({
items: items
});
}
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I use &lt;code&gt;hugo.IsServer&lt;/code&gt; to determine where I&amp;rsquo;m running and switch between my sandbox environment with the test variables and my production version with the live tokens/config.&lt;/p&gt;</description></item><item><title>Listening to Paddle Webhooks</title><link>https://nickgeorge.net/paddle-development/listening-to-paddle-webhooks/</link><pubDate>Sun, 08 Jun 2025 00:00:00 +0000</pubDate><guid>https://nickgeorge.net/paddle-development/listening-to-paddle-webhooks/</guid><description>&lt;p&gt;First, create a sandbox account at &lt;a href="https://sandbox-login.paddle.com/signup"&gt;https://sandbox-login.paddle.com/signup&lt;/a&gt; and a live account at &lt;a href="https://login.paddle.com/signup"&gt;https://login.paddle.com/signup&lt;/a&gt;. Yes, there are two separate accounts for testing and live. Use the same email address and business details.&lt;/p&gt;
&lt;p&gt;Since Paddle is a merchant of record, they are more careful about who they approve than payment providers like stripe. It will take time and a few manual verification steps before they activate your main account, and you will need things like terms of service + refund policy, a privacy policy and a pricing/products page. To follow along here, you will be working with the test account.&lt;/p&gt;</description></item><item><title>Tracking Salary Transparency in Biotech Jobs with PharmaPayWatch.com</title><link>https://nickgeorge.net/pharma-salary-tracking-job-board/</link><pubDate>Tue, 14 Jan 2025 00:00:00 +0000</pubDate><guid>https://nickgeorge.net/pharma-salary-tracking-job-board/</guid><description>&lt;p&gt;What can we learn from company job postings?&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been collecting job posts from 13 major pharma and biotech companies since November 2024. At first, I was interested in providing accurate and timely information about new jobs to the community since LinkedIn is a &lt;a href="https://www.reddit.com/r/LinkedInLunatics/"&gt;dumpster fire&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, it turns out there may be a lot of information you can learn about companies and the industry in general by watching how they hire!&lt;/p&gt;</description></item><item><title>NIH Should Buy 23andMe</title><link>https://nickgeorge.net/nih-should-buy-23-and-me/</link><pubDate>Sun, 24 Nov 2024 00:00:00 +0000</pubDate><guid>https://nickgeorge.net/nih-should-buy-23-and-me/</guid><description>&lt;p&gt;&lt;a href="https://www.23andme.com/"&gt;23andMe&lt;/a&gt; is a remarkable company. Founded in 2006, they pioneered direct-to-consumer genetic testing and have since genotyped DNA from over 15 million individuals, making it the “world’s largest crowdsourced platform for genetic research”&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Importantly, over 80% of 23andMe customers have consented to the use of their data for research, creating a unique and invaluable resource for genetic and health studies.&lt;/p&gt;
&lt;div class="my-8 mx-auto max-w-full"&gt;
&lt;div class="bg-white rounded-lg shadow-md overflow-hidden"&gt;
&lt;div class="p-4 flex justify-center items-center bg-grey-50"&gt;
&lt;img src="https://nickgeorge.net/nih-should-buy-23-and-me/images/23andme-stock.1163bc1d930123da75eba6c224b9e5cfd858b693230447e1bfad709f549730c1.png" alt="Plot of stock price for 23andMe showing a declining trend with key events marked" class="max-w-full h-auto"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="the-unmatched-scale-of-23andmes-data"&gt;The Unmatched Scale of 23andMe’s Data&lt;/h2&gt;
&lt;p&gt;The size of 23andMe’s collection is hard to appreciate without looking at other large initiatives such as NIH’s &lt;a href="https://allofus.nih.gov/"&gt;&lt;em&gt;All of Us&lt;/em&gt; program&lt;/a&gt;, or the &lt;a href="https://www.ukbiobank.ac.uk/"&gt;UK BioBank&lt;/a&gt;. 23andMe’s &lt;a href="https://investors.23andme.com/static-files/c5b02f5f-eb63-40ea-bd02-0f44f0074fc5"&gt;investor relations documents&lt;/a&gt; highlight the fact that its collection of genotyped individuals is several orders of magnitude larger than its closest competitor.&lt;/p&gt;</description></item><item><title>Static Dashboards</title><link>https://nickgeorge.net/static-dashboards/</link><pubDate>Mon, 04 Nov 2024 17:39:33 -0500</pubDate><guid>https://nickgeorge.net/static-dashboards/</guid><description>&lt;div class="my-8 mx-auto max-w-full"&gt;
&lt;div class="bg-white rounded-lg shadow-md overflow-hidden"&gt;
&lt;div class="p-4 flex justify-center items-center bg-grey-50"&gt;
&lt;img src="https://nickgeorge.net/static-dashboards/images/pipeline.84590102e07631cc94256367b96b90cca2db672f5ecd1d92ba946c16b3256a3b.png" alt="image demonstrating a CI/CD build updating a static website table" class="max-w-full h-auto"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I&amp;rsquo;ve been building dashboards (essentially just pretty tables and some plots) that display data from different public data sources in a novel ways.&lt;/p&gt;
&lt;p&gt;Most of these dashboards are ephemeral and experimental, so I&amp;rsquo;d rather not host a separate public application + database before I&amp;rsquo;m sure they&amp;rsquo;ll be around for a while. The simplest and most secure way to do this is to setup a static website and setup some kind of auto-update mechanism to build and re-deploy&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description></item><item><title>Open Knowledge - An Open Alex Explorer</title><link>https://nickgeorge.net/ok/</link><pubDate>Sun, 03 Nov 2024 00:00:00 +0000</pubDate><guid>https://nickgeorge.net/ok/</guid><description>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset="UTF-8"&gt;
&lt;link rel="stylesheet" href="https://nickgeorge.net/css/ok.css"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
&lt;title&gt;OpenKnowledge&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id="mainTitle"&gt;
&lt;h1&gt; OpenAlex API Explorer&lt;/h1&gt;
&lt;/div&gt;
&lt;div id="conceptSearchDiv"&gt;
&lt;h2&gt;Enter search terms&lt;span style="font-size: 0.8em; font-family: monospace;"&gt;&lt;a target="_blank" href="https://github.com/nkicg6/knowledge-portal"&gt;[info]&lt;/a&gt;&lt;/span&gt;:&lt;/h2&gt;
&lt;input type="text" id="conceptSearchInput"&gt;
&lt;div id="chooserConceptDiv"&gt;
&lt;select id="conceptSelectChooser" size="5" style="visibility:hidden"&gt;
&lt;/select&gt;
&lt;/div&gt;
&lt;div id="conceptDescriptionDiv" style="visibility:hidden"&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id="plotDiv" style="visibility:hidden"&gt;
&lt;/div&gt;
&lt;div id="relatedConceptDiv" style="visibility:hidden"&gt;
&lt;h2&gt;Related terms:&lt;/h2&gt;
&lt;p&gt;Click a concept to search&lt;/p&gt;
&lt;select id="relatedConceptChooser" size="5" style="visibility:hidden"&gt;
&lt;/select&gt;
&lt;/div&gt;
&lt;div id="topPublicationsDiv" style="visibility:hidden"&gt;
&lt;/div&gt;
&lt;div id="topPeopleDiv" style="visibility:hidden"&gt;
&lt;/div&gt;
&lt;script src="https://nickgeorge.net/js/openknowledge.js"&gt;&lt;/script&gt;
&lt;script src="https://cdn.plot.ly/plotly-2.11.1.min.js"&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</description></item><item><title>man(ual) pages are all you need</title><link>https://nickgeorge.net/usethemanpage/</link><pubDate>Sun, 14 Apr 2024 00:00:00 +0000</pubDate><guid>https://nickgeorge.net/usethemanpage/</guid><description>&lt;p&gt;With the ever decreasing quality of search thanks partly to ad-tech, google, and SEO (and more recently AI/LLM-&lt;em&gt;enhanced SEO&lt;/em&gt;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;) I&amp;rsquo;m noticing that it is becoming much more difficult to find quality technical information online.&lt;/p&gt;
&lt;p&gt;In the past, I defaulted to &lt;strong&gt;tutorial style&lt;/strong&gt; learning, involving web searches for tutorials and &amp;ldquo;getting started with &amp;hellip;&amp;rdquo; style articles, skim those and work from there.&lt;/p&gt;
&lt;p&gt;This style was easy, beginner friendly, and great for starting out. Unfortunately, it has also become much more difficult if your topic is popular/mainstream (e.g., Python/JavaScript/LLM). You have to know a decent amount about the topic to even know if you are reading time wasting SEO garbage or useful information. If your topic of interest is more esoteric or niche and doesn&amp;rsquo;t have a lot of high value SEO keywords you might get lucky and find quality information&amp;ndash; but there is also a better way!&lt;/p&gt;</description></item><item><title>Bootstrapping Ansible on FreeBSD</title><link>https://nickgeorge.net/bootstrap-ansible-freebsd/</link><pubDate>Tue, 02 Apr 2024 00:00:00 +0000</pubDate><guid>https://nickgeorge.net/bootstrap-ansible-freebsd/</guid><description>&lt;p&gt;Automating tasks with Ansible has been a great way to learn about server management best practices and get Linux servers up and running quickly. When I started experimenting with FreeBSD&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; in my homelab I was surprised that Ansible wasn&amp;rsquo;t well supported.&lt;/p&gt;
&lt;h2 id="python-and-sudo"&gt;Python and sudo&lt;/h2&gt;
&lt;p&gt;The primary difficulty is that while Ansible is &lt;a href="https://docs.ansible.com/ansible/latest/getting_started/introduction.html"&gt;&amp;ldquo;agentless&amp;rdquo;&lt;/a&gt;, it does require &lt;a href="https://docs.ansible.com/ansible/latest/reference_appendices/interpreter_discovery.html"&gt;Python on the target server&lt;/a&gt;. FreeBSD doesn&amp;rsquo;t clutter up your system with interpreters you may not need&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;, so using Ansible won&amp;rsquo;t work out of the box.
After some fiddling, here is my basic &amp;lsquo;bootstrap&amp;rsquo; playbook for FreeBSD. Note that FreeBSD also does not have &lt;code&gt;sudo&lt;/code&gt; by default, so I also install that and initially use &lt;code&gt;su&lt;/code&gt; to &lt;code&gt;root&lt;/code&gt; for privilege escalation&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt; when bootstrapping.&lt;/p&gt;</description></item></channel></rss>