-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
196 lines (157 loc) · 10.7 KB
/
index.html
File metadata and controls
196 lines (157 loc) · 10.7 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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Sullivan. Jeremy Sullivan. </title>
<meta name="description" content="Sullivan. Jeremy Sullivan. ">
<meta name="author" content="Jeremy Sullivan ">
<meta name="keywords" content="jekyll, frog, stog, html, crygen, gRPC, ffi, lisp, c++, markdown, protobuf, all, hello, nim, wkhtmltopdf, pdf, clojure, ocaml">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" href="/favicon.ico">
<link rel="canonical" href="https://subtle-supernova.github.io/index.html">
<!-- CSS -->
<link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="/css/pygments.css">
<link rel="stylesheet" type="text/css" href="/css/scribble.css">
<link rel="stylesheet" type="text/css" href="/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="/css/custom.css">
<!-- Feeds -->
<link rel="alternate" type="application/atom+xml"
href="/feeds/all.atom.xml" title="Atom Feed">
<link rel="alternate" type="application/rss+xml"
href="/feeds/all.rss.xml" title="RSS Feed">
<!-- JS -->
<script type="text/javascript">
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-xxxxx', 'auto');
ga('send', 'pageview');
</script>
</head>
<body>
<div class="container">
<div class="header clearfix">
<nav>
<ul class="nav nav-pills pull-right">
<li><li>
<a href="/Resume.html">Resume</a>
</li> </li>
<li><li>
<a href="/About.html">About</a>
</li> </li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Tags<b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="/index.html">All posts</a></li>
<li><a href="/tags/c.html">c++</a></li>
<li><a href="/tags/clojure.html">clojure</a></li>
<li><a href="/tags/crygen.html">crygen</a></li>
<li><a href="/tags/ffi.html">ffi</a></li>
<li><a href="/tags/frog.html">frog</a></li>
<li><a href="/tags/gRPC.html">gRPC</a></li>
<li><a href="/tags/hello.html">hello</a></li>
<li><a href="/tags/html.html">html</a></li>
<li><a href="/tags/jekyll.html">jekyll</a></li>
<li><a href="/tags/lisp.html">lisp</a></li>
<li><a href="/tags/markdown.html">markdown</a></li>
<li><a href="/tags/nim.html">nim</a></li>
<li><a href="/tags/ocaml.html">ocaml</a></li>
<li><a href="/tags/pdf.html">pdf</a></li>
<li><a href="/tags/protobuf.html">protobuf</a></li>
<li><a href="/tags/stog.html">stog</a></li>
<li><a href="/tags/wkhtmltopdf.html">wkhtmltopdf</a></li>
</ul>
</li>
<li><a href="/feeds/all.atom.xml"><i class="fa fa-rss-square" aria-hidden="true"></i></a></li>
<li><a href="/feeds/all.rss.xml"><i class="fa fa-rss" aria-hidden="true"></i></a></li>
</ul>
</nav>
<a href="/"><h3 class="text-muted">Jeremy</h3></a>
</div><!-- /header -->
</div>
<div class="jumbotron">
<h1>Jeremy's software blog.</h1>
</div><!-- /jumbotron -->
<div class="container">
<div class="row">
<!-- Main column -->
<div id="content" class="col-md-12">
<h1>Welcome</h1>
<p>Here is where I rant about software.</p>
<article>
<header>
<h2><a href='/blog/2018/01/14/adventures-in-nim-ffi'>Adventures in NIM FFI</a></h2>
<p class='date-and-tags'>
<time datetime="2018-01-14" pubdate="true">2018-01-14</time> :: <span class="tags"><a href="/tags/nim.html">nim</a>, <a href="/tags/c.html">c++</a>, <a href="/tags/gRPC.html">gRPC</a>, <a href="/tags/protobuf.html">protobuf</a>, <a href="/tags/ffi.html">ffi</a></span></p>
</header>
<p>I’ve recently dipped a toe into the <a href="https://nim-lang.org/">nim</a> programming language. The things that interest me the most are the fact that it compiles to C and FFI with C++. I’ve been interested in FFI with C++ lately because <a href="https://grpc.io/">gRPC</a> is pretty wonderful to use but its language support is sort of limited. One language that’s really well supported, however, is C++. While not apposed to writing C++, I think if there is an alternative, you should seek it out.</p>
<p>I decided to first experiment with embedding nim into C++ rather than calling C++ from nim. This is definitely the less documented approach, so I would recommend it. But here are some of my findings.</p>
<footer>
<a href='/blog/2018/01/14/adventures-in-nim-ffi'>… more …</a>
</footer>
</article>
<article>
<header>
<h2><a href='/blog/2016/08/02/markdown-to-html-to-pdf-my-resume-s-journey'>Markdown to HTML to PDF - My Resume’s Journey</a></h2>
<p class='date-and-tags'>
<time datetime="2016-08-02" pubdate="true">2016-08-02</time> :: <span class="tags"><a href="/tags/wkhtmltopdf.html">wkhtmltopdf</a>, <a href="/tags/html.html">html</a>, <a href="/tags/pdf.html">pdf</a>, <a href="/tags/markdown.html">markdown</a></span></p>
</header>
<h1 id="how-my-resume-starts-out-as-markdown">How my resume starts out as markdown</h1>
<h2 id="why-would-you-do-this">Why would you do this?</h2>
<p>Other than my typical reason of “because it’s fun?” Document formats are really hard. Not only are they hard, but they’re one of the few things in computing we haven’t managed to simplify. Sure, we’ve made them <em>featureful</em> but not <em>simple</em>. Have you ever tried to parse an excel file in a meaningful way? It’s not fun.</p>
<p>This brings me to my particular problem: I only want to type my resume once, but I want it to be as accessible as possible. I love the idea of typing it in markdown. I believe markdown to be a sort of mad genius in the same vein as JSON. It only solves about 80% of our problems but it’s so easy that it makes it hard to resist. Another really great thing about this simplicity is that we can hack on the other 20% it doesn’t solve without too much effort.</p>
<h2 id="how-do-i-do-this">How do I do this?</h2>
<p>Well, I’ve already written about my static content generator. Markdown to HTML isn’t exactly exciting. HTML to PDF, however, is barrels of fun. To accomplish this I use <a href="http://wkhtmltopdf.org/">wkhtmltopdf</a>. It’s a wonderful project that leverages webkit and QT. The coolest part of this tool? You can do it all from CLI. This has saved my neck a couple of times, because generating PDFs is a pain, but people <em>love</em> them. On the flip side, generating HTML is a well explored and decently solved problem. That creates a grand solution for us: generate semi-dynamic HTML, and then have some automated process spit out a PDF using wkhtmltopdf. Since it’s all in the CLI, you can do this using a simple bash script and then leverage arcane things such as the <code>mail</code> command for delivery. I love simple things.</p>
<h2 id="whats-next">What’s next?</h2>
<p>For my resume, I’d like to do some intermediate processing. While wkhtmltopdf supports pulling from a URL directly (which is pretty sweet) we can also use local files. I’ll need to remove some things like navigation and then add some things like more contact information. I think it’d be a really cool project to let someone enter an email address and receive the processed resume. Well, I’ve beel looking for a reason to dive into the wide and strange world of OCaml webapps. More on that later, perhaps!</p>
<footer>
<a href='/blog/2016/08/02/markdown-to-html-to-pdf-my-resume-s-journey'>… more …</a>
</footer>
</article>
<article>
<header>
<h2><a href='/blog/2016/07/20/hello-world'>Hello world</a></h2>
<p class='date-and-tags'>
<time datetime="2016-07-20" pubdate="true">2016-07-20</time> :: <span class="tags"><a href="/tags/hello.html">hello</a>, <a href="/tags/lisp.html">lisp</a>, <a href="/tags/jekyll.html">jekyll</a>, <a href="/tags/ocaml.html">ocaml</a>, <a href="/tags/crygen.html">crygen</a>, <a href="/tags/clojure.html">clojure</a>, <a href="/tags/stog.html">stog</a>, <a href="/tags/frog.html">frog</a></span></p>
</header>
<h1 id="hello-world">Hello, world!</h1>
<p>Static content generators have been sort of a fad lately. I’ve used them in the past to generate all sorts of documentation and marketing pages for various jobs. In those days, I’d always use <a href="https://jekyllrb.com/">Jekyll</a> or more recently, <a href="http://cryogenweb.org/">Cryogen</a>. Jekyll always had a huge community behind it which made finding themes or plugins a breeze, and let’s face it if you’re using a static content generator you’re not looking to spend a lot of time on it. Cryogen was chosen because the ecosystem already had a large number of clojure web projects in it already, so using lein and the JRE was a big win.</p>
<footer>
<a href='/blog/2016/07/20/hello-world'>… more …</a>
</footer>
</article>
</div>
</div>
<footer>
<hr />
<!-- p><a href="https://twitter.com/racketlang"
class="twitter-follow-button"
data-show-count="false"
data-lang="en">
"Follow RacketLang"
</a>
<script type="text/javascript">
!function(d,s,id){
var js,fjs=d.getElementsByTagName(s)[0];
if(!d.getElementById(id)){
js=d.createElement(s);
js.id=id;
js.src="//platform.twitter.com/widgets.js";
fjs.parentNode.insertBefore(js,fjs);
}
}(document,"script","twitter-wjs");
</script></p -->
<p><small>Site generated
by <a href="https://github.com/greghendershott/frog">Frog</a>,
the <strong>fr</strong>ozen bl<strong>og</strong> tool.
— Using <a href="http://twitter.github.com/bootstrap/index.html">Bootstrap</a>. CSS by me.</small></p>
<!-- p><em>Your legal notice here</em>.</p -->
</footer>
</div><!-- /container -->
<!-- </body> JS -->
<script type="text/javascript" src="//code.jquery.com/jquery.min.js"></script>
<script type="text/javascript" src="/js/bootstrap.min.js"></script>
</body>
</html>