feedparser 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8986d2c787017a536660de47dc443469b6eb2a0a
4
- data.tar.gz: 94441f640c433a63de4f94ffcfbd993af0e4139b
3
+ metadata.gz: b0031bf3d0abfaab137935e8710a87818fac65a3
4
+ data.tar.gz: 7ec20cb416f5127e869dad64fc1f3026657371e4
5
5
  SHA512:
6
- metadata.gz: 0643b97dc231542d7e0c426191afa625e1114b60c2828abd9615f339509f63d36f6c44fa463877c3932dd9ef6739295eaba24af98d2c942f382398c7e91352d0
7
- data.tar.gz: fc838c9f2e4875ff8def0c2855b69bd1786d2391ce9298480cf9b6782915fd88c91c22f961c9f59c17b5e16fcb8b3eb14a0929263c4e2b98fe86cd1d7a26a0ab
6
+ metadata.gz: b5c4714270bf2d81bfd1cde0ff048f2fa6ca1d704f6c4e3380951cf336ce361706a36b67624b1e437cbd95bb1174e74ffe71905d58693719235746cd86e93c84
7
+ data.tar.gz: dfdbee7200cd8d2cdd5cbdfaa283ce781d218924fe12a6afddce4a0b7968f8c89e8e0555e3b099d415e82e76bf2d2a5690d3906659c3449614e3309891f090f0
@@ -4,14 +4,17 @@ README.md
4
4
  Rakefile
5
5
  lib/feedparser.rb
6
6
  lib/feedparser/builder/atom.rb
7
+ lib/feedparser/builder/json.rb
7
8
  lib/feedparser/builder/rss.rb
8
9
  lib/feedparser/feed.rb
9
10
  lib/feedparser/item.rb
10
11
  lib/feedparser/parser.rb
11
12
  lib/feedparser/version.rb
13
+ test/feeds/byparker.json
12
14
  test/feeds/googlegroups.atom
13
15
  test/feeds/googlegroups2.atom
14
16
  test/feeds/headius.atom
17
+ test/feeds/jsonfeed.json
15
18
  test/feeds/lambdatheultimate.rss2
16
19
  test/feeds/railstutorial.atom
17
20
  test/feeds/rubyflow.rss2
@@ -21,5 +24,6 @@ test/feeds/sitepoint.rss2
21
24
  test/helper.rb
22
25
  test/test_atom.rb
23
26
  test/test_atom_live.rb
27
+ test/test_json.rb
24
28
  test/test_rss.rb
25
29
  test/test_rss_live.rb
data/README.md CHANGED
@@ -1,12 +1,12 @@
1
1
  # feedparser
2
2
 
3
- feedparser gems - web feed parser and normalizer (RSS 2.0, Atom, etc.)
3
+ feedparser gem - web feed parser and normalizer (Atom, RSS 2.0, etc.)
4
4
 
5
- * home :: [github.com/feedreader/feed.parser](https://github.com/feedreader/feed.parser)
6
- * bugs :: [github.com/feedreader/feed.parser/issues](https://github.com/feedreader/feed.parser/issues)
5
+ * home :: [github.com/feedparser/feedparser](https://github.com/feedparser/feedparser)
6
+ * bugs :: [github.com/feedparser/feedparser/issues](https://github.com/feedparser/feedparser/issues)
7
7
  * gem :: [rubygems.org/gems/feedparser](https://rubygems.org/gems/feedparser)
8
8
  * rdoc :: [rubydoc.info/gems/feedparser](http://rubydoc.info/gems/feedparser)
9
- * forum :: [groups.google.com/group/feedreader](http://groups.google.com/group/feedreader)
9
+ * forum :: [groups.google.com/group/wwwmake](http://groups.google.com/group/wwwmake)
10
10
 
11
11
 
12
12
  ## Usage
@@ -15,6 +15,8 @@ feedparser gems - web feed parser and normalizer (RSS 2.0, Atom, etc.)
15
15
 
16
16
  Feed • Item
17
17
 
18
+ ![](feed-models.png)
19
+
18
20
  ### `Feed` Struct
19
21
 
20
22
  #### Mappings
@@ -48,7 +50,7 @@ RFC-822 date format e.g. Wed, 14 Jan 2015 19:48:57 +0100
48
50
  ISO-801 date format e.g. 2015-01-11T09:30:16Z
49
51
 
50
52
 
51
- ~~~
53
+ ```
52
54
  class Feed
53
55
  attr_accessor :format # e.g. atom|rss 2.0|etc.
54
56
  attr_accessor :title # note: always plain vanilla text - if present html tags will get stripped and html entities unescaped
@@ -65,7 +67,7 @@ class Feed
65
67
  attr_accessor :generator_version # e.g. @version (atom)
66
68
  attr_accessor :generator_uri # e.g. @uri (atom) - use alias url/link ???
67
69
  end
68
- ~~~
70
+ ```
69
71
 
70
72
 
71
73
  ### `Item` Struct
@@ -100,7 +102,7 @@ Note: The content element will assume html content.
100
102
 
101
103
  Note: In plain vanilla RSS 2.0 there's only one `pubDate` for items, thus, it's not possible to differeniate between published and updated dates for items; note - the `item.pubDate` will get mapped to `item.updated`. To set the published date in RSS 2.0 use the dublin core module e.g `dc:created`, for example.
102
104
 
103
- ~~~
105
+ ```
104
106
  class Item
105
107
  attr_accessor :title # note: always plain vanilla text - if present html tags will get stripped and html entities
106
108
  attr_accessor :url
@@ -115,12 +117,12 @@ class Item
115
117
 
116
118
  attr_accessor :guid # todo: rename to id (use alias) ??
117
119
  end
118
- ~~~
120
+ ```
119
121
 
120
122
 
121
123
  ### Read Feed Example
122
124
 
123
- ~~~
125
+ ```
124
126
  require 'open-uri'
125
127
  require 'feedparser'
126
128
 
@@ -128,7 +130,7 @@ xml = open( 'http://openfootball.github.io/atom.xml' ).read
128
130
 
129
131
  feed = FeedParser::Parser.parse( xml )
130
132
  pp feed
131
- ~~~
133
+ ```
132
134
 
133
135
 
134
136
  ## Install
@@ -140,11 +142,13 @@ Just install the gem:
140
142
 
141
143
  ## License
142
144
 
145
+ ![](https://publicdomainworks.github.io/buttons/zero88x31.png)
146
+
143
147
  The `feedparser` scripts are dedicated to the public domain.
144
148
  Use it as you please with no restrictions whatsoever.
145
149
 
146
150
 
147
151
  ## Questions? Comments?
148
152
 
149
- Send them along to the [Planet Pluto and Friends Forum/Mailing List](http://groups.google.com/group/feedreader).
153
+ Send them along to the [wwwmake Forum/Mailing List](http://groups.google.com/group/wwwmake).
150
154
  Thanks!
@@ -5,8 +5,10 @@
5
5
 
6
6
  require 'rss'
7
7
  require 'pp'
8
- require 'time' # note: ruby has a builtin core time class and a stdlib time class pack; require stdlib extensions
9
- require 'date' # note: ruby has a builtin core date class and a stdlib date class pack; require stdlib extensions
8
+ require 'time' # note: ruby has a builtin core time class and a stdlib time class pack; require stdlib extensions
9
+ require 'date' # note: ruby has a builtin core date class and a stdlib date class pack; require stdlib extensions
10
+ require 'json'
11
+
10
12
 
11
13
  # 3rd party gems/libs
12
14
 
@@ -20,6 +22,7 @@ require 'feedparser/version' # let it always go first
20
22
 
21
23
  require 'feedparser/builder/atom'
22
24
  require 'feedparser/builder/rss'
25
+ require 'feedparser/builder/json'
23
26
 
24
27
  require 'feedparser/feed'
25
28
  require 'feedparser/item'
@@ -0,0 +1,73 @@
1
+ # encoding: utf-8
2
+
3
+ module FeedParser
4
+
5
+ class JsonFeedBuilder
6
+
7
+ include LogUtils::Logging
8
+
9
+
10
+ def self.build( hash )
11
+ feed = self.new( hash )
12
+ feed.to_feed
13
+ end
14
+
15
+ def initialize( hash )
16
+ @feed = build_feed( hash )
17
+ end
18
+
19
+ def to_feed
20
+ @feed
21
+ end
22
+
23
+
24
+
25
+ def build_feed( h )
26
+ feed = Feed.new
27
+ feed.format = 'json'
28
+
29
+ feed.title = h['title']
30
+ feed.url = h['home_page_url']
31
+ feed.summary = h['description']
32
+
33
+ items = []
34
+ h['items'].each do |hash_item|
35
+ items << build_feed_item( hash_item )
36
+ end
37
+ feed.items = items
38
+
39
+ feed # return new feed
40
+ end # method build_feed_from_json
41
+
42
+
43
+
44
+ def build_feed_item( h )
45
+ item = Item.new # Item.new
46
+
47
+ item.guid = h['id']
48
+ item.title = h['title']
49
+ item.url = h['url']
50
+
51
+ ## convert date if present (from string to date type)
52
+ date_published_str = h['date_published']
53
+ if date_published_str
54
+ item.published = DateTime.parse( date_published_str )
55
+ end
56
+
57
+ date_modified_str = h['date_modified']
58
+ if date_modified_str
59
+ item.updated = DateTime.parse( date_modified_str )
60
+ end
61
+
62
+
63
+ item.content = h['content_html']
64
+
65
+ ## todo/fix: add check for content_text too - why? why not??
66
+ ## use item.summary for plain text version - why? why not??
67
+
68
+ item
69
+ end # method build_feed_item
70
+
71
+
72
+ end # JsonFeedBuilder
73
+ end # FeedParser
@@ -7,6 +7,11 @@ class Parser
7
7
 
8
8
  include LogUtils::Logging
9
9
 
10
+ ###
11
+ ## todo/fix:
12
+ # change xml to txt (or text) - now supports json too!!!
13
+
14
+
10
15
  ### convenience class/factory method
11
16
  def self.parse( xml, opts={} )
12
17
  self.new( xml ).parse
@@ -18,7 +23,42 @@ class Parser
18
23
  end
19
24
 
20
25
 
26
+
21
27
  def parse
28
+ head = @xml[0..100].strip # note: remove leading spaces if present
29
+
30
+ jsonfeed_version_regex = %r{"version":\s*"https://jsonfeed.org/version/1"}
31
+
32
+ ## check if starts with knownn xml prologs
33
+ if head.start_with?( '<?xml' ) ||
34
+ head.start_with?( '<feed/' ) ||
35
+ head.start_with?( '<rss/' )
36
+ ## check if starts with { for json object/hash
37
+ ## or if includes jsonfeed prolog
38
+ parse_xml
39
+ elsif head.start_with?( '{' ) ||
40
+ head =~ jsonfeed_version_regex
41
+ parse_json
42
+ else ## assume xml for now
43
+ parse_xml
44
+ end
45
+ end # method parse
46
+
47
+
48
+ def parse_json
49
+ logger.debug "using stdlib json/#{JSON::VERSION}"
50
+
51
+ logger.debug "Parsing feed in json..."
52
+ feed_hash = JSON.parse( @xml )
53
+
54
+ feed = JsonFeedBuilder.build( feed_hash )
55
+
56
+ logger.debug "== #{feed.format} / #{feed.title} =="
57
+ feed # return new (normalized) feed
58
+ end # method parse_json
59
+
60
+
61
+ def parse_xml
22
62
  logger.debug "using stdlib rss/#{RSS::VERSION}"
23
63
 
24
64
  parser = RSS::Parser.new( @xml )
@@ -26,7 +66,7 @@ class Parser
26
66
  parser.do_validate = false
27
67
  parser.ignore_unknown_element = true
28
68
 
29
- logger.debug "Parsing feed..."
69
+ logger.debug "Parsing feed in xml..."
30
70
  feed_wild = parser.parse # not yet normalized
31
71
 
32
72
  logger.debug " feed.class=#{feed_wild.class.name}"
@@ -39,7 +79,7 @@ class Parser
39
79
 
40
80
  logger.debug "== #{feed.format} / #{feed.title} =="
41
81
  feed # return new (normalized) feed
42
- end
82
+ end # method parse_xml
43
83
 
44
84
  end # class Parser
45
85
 
@@ -3,7 +3,7 @@
3
3
  module FeedParser
4
4
 
5
5
  MAJOR = 1
6
- MINOR = 0
6
+ MINOR = 1
7
7
  PATCH = 0
8
8
  VERSION = [MAJOR,MINOR,PATCH].join('.')
9
9
 
@@ -18,7 +18,6 @@ module FeedParser
18
18
 
19
19
  def self.root
20
20
  "#{File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )}"
21
- end
21
+ end
22
22
 
23
23
  end # module FeedParser
24
-
@@ -0,0 +1,636 @@
1
+ {
2
+ "version": "https://jsonfeed.org/version/1",
3
+ "title": "By Parker",
4
+ "home_page_url": "https://byparker.com/",
5
+ "feed_url": "https://byparker.com/feed.json",
6
+ "icon": "https://byparker.com/apple-touch-icon.png",
7
+ "favicon": "https://byparker.com/favicon.ico",
8
+ "expired": false,
9
+ "items": [
10
+
11
+ {
12
+ "id": "https://byparker.com/blog/2017/add-json-feed-to-your-jekyll-site/",
13
+ "summary": "",
14
+ "content_text": "You might have heard of a neat new project called JSONFeed. It’s a project to create a spec to createfeeds in JSON. It’s easier to parse than RSS/Atom’s XML. JSON is alsoeasier to check for errors: either it parses or it doesn’t. It’s easier towrite than In my opinion, it’s a huge improvement on shipping serializedcontent. I have added a JSON feed to this site, and we’re working to add it to the jekyll-feedplugin or ship as aseparate plugin.If you want it now, I’d recommend using @vallieres’s feed.jsontemplate. :sparkles:John Gruber wrote about a JSON Feed Viewer,too, which shows off the power of this stuff. :heart:",
15
+ "content_html": "<p>You might have heard of a neat new project called <a href=\"https://jsonfeed.org/\">JSONFeed</a>. It’s a project to create a spec to createfeeds in JSON. It’s easier to parse than RSS/Atom’s XML. JSON is alsoeasier to check for errors: either it parses or it doesn’t. It’s easier towrite than In my opinion, it’s a huge improvement on shipping serializedcontent. I have <a href=\"/feed.json\">added a JSON feed to this site</a>, and we’re working to <a href=\"https://github.com/jekyll/jekyll-feed/pull/173\">add it to the jekyll-feedplugin</a> or ship as aseparate plugin.</p><p>If you want it now, I’d recommend using <a href=\"https://github.com/vallieres/jekyll-json-feed\">@vallieres’s <code class=\"highlighter-rouge\">feed.json</code>template</a>. :sparkles:</p><p>John Gruber <a href=\"https://daringfireball.net/linked/2017/05/18/maxime-vaillancourt-json-feed-viewer\">wrote about a JSON Feed Viewer</a>,too, which shows off the power of this stuff. :heart:</p>",
16
+ "url": "https://byparker.com/blog/2017/add-json-feed-to-your-jekyll-site/",
17
+
18
+
19
+
20
+
21
+ "date_published": "2017-05-18T21:08:49+00:00",
22
+ "date_modified": "2017-05-18T21:08:49+00:00",
23
+ "author": {
24
+ "name": ""
25
+ }
26
+ },
27
+
28
+ {
29
+ "id": "https://byparker.com/blog/2017/the-internet-is-unstable/",
30
+ "summary": "",
31
+ "content_text": "When was the last time you had an unstable Internet connection? Was itriding the subway home from work? Was it using the wifi at a local coffeeshop a few days ago? Or at a hotel, on a plane, or at an airport? When youwere able to connect, was it painfully slow? Could you load a webpage otherthan google.com?Even in America, the country that developed the first iteration of theInternet, the truth is a stable Internet connection is an aberration, notthe norm.Why is it, therefore, that we have built the World Wide Web for a stable&amp;amp; fast Internet connection, rather than the much more common unstable&amp;amp; slow Internet connection?In last week’s Hacker Newsletter, one of the top stories was “Most of theweb really sucks if you have a slow connection”by Dan Luu. This post really resonated with me. I have written about thisbefore. Every time, I always comeback to this central problem: the Web and all its many billions of websitesare built for a stable internet connection, when the normal case is anunstable internet connection. Dan focuses and describes well the problem onslow &amp;amp; unstable internet outside of the U.S and Europe, but I believe thatthe problem is much more prevalent than that. The only place you’re safe isat home.I went to a coffeeshop today to work. I work remotely and wanted a changeof scenery. The coffeeshop I chose is known for having good internet. TheYelp reviews even talked about it. When I sat down with my coffee andlogged in to get to work, I couldn’t load a single webpage. Not evengoogle.com would connect. To ensure it wasn’t just my machine, I lookedaround. “Page could not be loaded,” shone back at me from three computerscreens around me. Another visitor sat down next to me and opened hiscomputer and logged in. No connection to the Internet. The wifi connectionitself was stable, but somewhere between the wifi router and the webserversfor the websites we all wanted to visit, something was awry. After a fewhours, I gave up and left.I’m sure you have many such experiences yourself. Whether due to congestionin the network or some outdated hardware along the path, the most commoninternet connection we all encounter on a daily basis is unstable and slow.Why is it that the makers of the Web decidedly ignore this worldview?Besides blind optimism, we can surely say that they have fallen victim tothe fallacies of distributed computing: The network is reliable. Latency is zero. Bandwidth is infinite. The network is secure. Topology doesn’t change. There is one administrator. Transport cost is zero. The network is homogeneous.“The network is reliable.” “Latency is zero.” “Bandwidth is infinite.”Don’t all of these sound an awful lot like the conversations you heararound Silicon Valley? “What if they don’t have a reliable internetconnection?” “Let’s just focus on when they do, and we can figure out asolution to that later.” Many years later, very few internet services workwithout the web at all. On our mobile devices – devices much more prone toinstability in its connection – almost nothing works without a stable, fastinternet connection.It’s time for us to start considering an offline-first approach. Email is abrilliant example: the post office protocol (POP) available for all majormail providers allows users to download their mail when they have a stableconnection, read &amp;amp; compose messages offline, and send them when they’reback to a stable connection. Web services should enable the samehigh-fidelity offline operation.Offline-first is the approach I will be using from now on for all webservices I create and websites I create. They must be downloadable orotherwise useful when the networked device is disconnected or finds itsconnection unstable. Every web service must have an ability to download allof a user’s data and must have the ability for me to compose updates to mydata the next time I have a connection.Web developers in highly-connected offices demanding online servicesincredibly high availability must consider people who aren’t using theircreations in the same environment they’re developing them.",
32
+ "content_html": "<p>When was the last time you had an unstable Internet connection? Was itriding the subway home from work? Was it using the wifi at a local coffeeshop a few days ago? Or at a hotel, on a plane, or at an airport? When youwere able to connect, was it painfully slow? Could you load a webpage otherthan google.com?</p><p>Even in America, the country that developed the first iteration of theInternet, the truth is a stable Internet connection is an aberration, notthe norm.</p><p><strong>Why is it, therefore, that we have built the World Wide Web for a stable&amp; fast Internet connection, rather than the much more common unstable&amp; slow Internet connection?</strong></p><p>In last week’s Hacker Newsletter, one of the top stories was <a href=\"https://danluu.com/web-bloat/\">“Most of theweb really sucks if you have a slow connection”</a>by Dan Luu. This post really resonated with me. I have <a href=\"/blog/2016/the-last-mile/\">written about thisbefore</a>. Every time, I always comeback to this central problem: the Web and all its many billions of websitesare built for a stable internet connection, when the normal case is anunstable internet connection. Dan focuses and describes well the problem onslow &amp; unstable internet outside of the U.S and Europe, but I believe thatthe problem is much more prevalent than that. The only place you’re safe isat home.</p><p>I went to a coffeeshop today to work. I work remotely and wanted a changeof scenery. The coffeeshop I chose is known for having good internet. TheYelp reviews even talked about it. When I sat down with my coffee andlogged in to get to work, I couldn’t load a single webpage. Not evengoogle.com would connect. To ensure it wasn’t just my machine, I lookedaround. “Page could not be loaded,” shone back at me from three computerscreens around me. Another visitor sat down next to me and opened hiscomputer and logged in. No connection to the Internet. The wifi connectionitself was stable, but somewhere between the wifi router and the webserversfor the websites we all wanted to visit, something was awry. After a fewhours, I gave up and left.</p><p>I’m sure you have many such experiences yourself. Whether due to congestionin the network or some outdated hardware along the path, the most commoninternet connection we all encounter on a daily basis is unstable and slow.</p><p>Why is it that the makers of the Web decidedly ignore this worldview?Besides blind optimism, we can surely say that they have fallen victim to<a href=\"https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing\">the fallacies of distributed computing</a>:</p><ol> <li>The network is reliable.</li> <li>Latency is zero.</li> <li>Bandwidth is infinite.</li> <li>The network is secure.</li> <li>Topology doesn’t change.</li> <li>There is one administrator.</li> <li>Transport cost is zero.</li> <li>The network is homogeneous.</li></ol><p>“The network is reliable.” “Latency is zero.” “Bandwidth is infinite.”</p><p>Don’t all of these sound an awful lot like the conversations you heararound Silicon Valley? “What if they don’t have a reliable internetconnection?” “Let’s just focus on when they do, and we can figure out asolution to that later.” Many years later, very few internet services workwithout the web at all. On our mobile devices – devices much more prone toinstability in its connection – almost nothing works without a stable, fastinternet connection.</p><p>It’s time for us to start considering an offline-first approach. Email is abrilliant example: the post office protocol (POP) available for all majormail providers allows users to download their mail when they have a stableconnection, read &amp; compose messages offline, and send them when they’reback to a stable connection. Web services should enable the samehigh-fidelity offline operation.</p><p>Offline-first is the approach I will be using from now on for all webservices I create and websites I create. They must be downloadable orotherwise useful when the networked device is disconnected or finds itsconnection unstable. Every web service must have an ability to download allof a user’s data and must have the ability for me to compose updates to mydata the next time I have a connection.</p><p>Web developers in highly-connected offices demanding online servicesincredibly high availability must consider people who aren’t using theircreations in the same environment they’re developing them.</p>",
33
+ "url": "https://byparker.com/blog/2017/the-internet-is-unstable/",
34
+
35
+
36
+
37
+
38
+ "date_published": "2017-02-15T02:32:11+00:00",
39
+ "date_modified": "2017-02-15T02:32:11+00:00",
40
+ "author": {
41
+ "name": ""
42
+ }
43
+ },
44
+
45
+ {
46
+ "id": "https://byparker.com/blog/2016/looking-for-the-light-today/",
47
+ "summary": "",
48
+ "content_text": "My friend Stephanie wrote a beautiful blog post today entitled, “Lookingfor the Light Today”.She points out the many things we can be grateful for today in light of adevastating Presidential election result. We are not upset because shelost, but rather because he won. He stands firmly against so many of myfriends and family that I cannot rightly shrug this off.That said, we cannot dwell in the past. We must move forward, and today Iam affirming my resolve to do so.I live just around the corner from a large supermarket. Without much foodat home, I decided to make a run and fetch some needed supplies. The peopleI encountered, while somber, were friendly and full of love for theirneighbors – just as always. I have that to be thankful for.My Twitter and Facebook feeds were full of affirmations today: your livesmatter. Your safety matters. You matter. There was an overwhelming amountof love being sent from all corners of the globe today to say that nomatter who our President is, I see you and you matter. I have that to bethankful for.The leadership of Oakland, Alameda County, and California isdarker-skinned, and more gender-diverse. We elected Kamala Harris torepresent us in Washington, D.C. as on of our Senators. Barbara Lee wasre-elected to the House of Representatives. Both are African-Americanwomen. Nancy Skinner and Tony Thurmond will be representing this districtat the state level. All are people whose values and ideals I feel I canbelieve in. I have that to be thankful for.I will never stop affirming the worth of all of you. Thank you for beingyour authentic self. I will defend you with every breath in my body. I havethat to be thankful for.",
49
+ "content_html": "<p>My friend <a href=\"http://www.lifeinlimbo.org/2016/11/09/light-today/\">Stephanie wrote a beautiful blog post today entitled, “Lookingfor the Light Today”</a>.She points out the many things we can be grateful for today in light of adevastating Presidential election result. We are not upset because shelost, but rather because he won. He stands firmly against so many of myfriends and family that I cannot rightly shrug this off.</p><p>That said, we cannot dwell in the past. We must move forward, and today Iam affirming my resolve to do so.</p><p>I live just around the corner from a large supermarket. Without much foodat home, I decided to make a run and fetch some needed supplies. The peopleI encountered, while somber, were friendly and full of love for theirneighbors – just as always. I have that to be thankful for.</p><p>My Twitter and Facebook feeds were full of affirmations today: your livesmatter. Your safety matters. You matter. There was an overwhelming amountof love being sent from all corners of the globe today to say that nomatter who our President is, I see you and you matter. I have that to bethankful for.</p><p><img src=\"/img/2016-11-09-looking-for-the-light-today/national-representatives-from-california-and-oakland.png\" alt=\"National Representatives from California &amp; Oakland\" /><img src=\"/img/2016-11-09-looking-for-the-light-today/state-representatives-from-oakland.png\" alt=\"State Representatives from Oakland\" /></p><p>The leadership of Oakland, Alameda County, and California isdarker-skinned, and more gender-diverse. We elected Kamala Harris torepresent us in Washington, D.C. as on of our Senators. Barbara Lee wasre-elected to the House of Representatives. Both are African-Americanwomen. Nancy Skinner and Tony Thurmond will be representing this districtat the state level. All are people whose values and ideals I feel I canbelieve in. I have that to be thankful for.</p><p>I will never stop affirming the worth of all of you. Thank you for beingyour authentic self. I will defend you with every breath in my body. I havethat to be thankful for.</p>",
50
+ "url": "https://byparker.com/blog/2016/looking-for-the-light-today/",
51
+
52
+
53
+
54
+
55
+ "date_published": "2016-11-10T01:18:10+00:00",
56
+ "date_modified": "2016-11-10T01:18:10+00:00",
57
+ "author": {
58
+ "name": ""
59
+ }
60
+ },
61
+
62
+ {
63
+ "id": "https://byparker.com/blog/2016/the-last-mile/",
64
+ "summary": "",
65
+ "content_text": "Living without the Internet is a reality for the vast majority of people onthe Earth. With Facebook and Google treating connection speeds andbandwidth like disposable cutlery, you can hardly guess why they’re havingsuch a terrible time continuing to grow their userbase around the world.The problem is the infrastructure isn’t available. The “last mile,” as itis often referred to, is sub-par in most parts of the world.Ask anyone who travels a lot about their Internet usage habits and theywill regale you with stories of downloading all their work on terribleairport Wi-Fi, traveling halfway around the world, and have almost noquality access to the Internet. It really seems that public Wi-Fi, whetherat an airport, a hotel, or a coffee shop, is universally slow and flaky.For those who live in rural parts of the world, even in the most highlyadvanced nations, access to the Internet can be unreliable and painfullyslow at the best of times. From the backcountry in Mississippi to the greatplains of Africa, to the countryside in Austria, these rural areas all havegreat trouble accessing a reliable and fast Internet connection.Connections needn’t be 100 megabits per second to be considered fast (ifthey were, my home connection in Oakland, California would be consideredsloth-like). Imagine the average requirements for accessing the Web. First,the page must load. With sometimes dozens of external resources (photos,JavaScript, iframes, CSS, and other media), this can be a challenge.Second, the page must fully load in a reasonable amount of time. You mightbe willing to send off a request for a page and go fetch a coffee at 8, butby 10 you are most certainly not interested in waiting ninety or moreseconds for a page to fully load. Finally, the connection must be stablethroughout your session. If you navigate to a page and the connectionvanishes or becomes otherwise too slow by the time you click on ahyperlink, then it is no good. The connection cannot falter.I had the great fortune to spend a few days on a resort on the island ofLombok in Indonesia last year. Never before have I had such a terrible,teasing Internet connection. While I had no obligations to work, I did needto check the status of our flights back to the U.S. Alas, nothing at allwould load over the Wi-Fi! We borrowed the computer at the front desk witha wired connection, but couldn’t get Singapore Airlines’ website to loadfully. The initial HTML would load, but all the bells and whistles toimprove the experience of folks on a much faster connection made itunusable for us – we couldn’t load the JavaScript and other assetsnecessary to navigate the website! With flights being canceled left andright due to a recent volcanic eruption, the updated information werequired in order to plan for our travels was only accessible to folks whospoke Bahasa Indonesia. We were saved by the general manager who spokeEnglish well enough to call and explain the situation to us.Parts of the world have connectivity, but are two or three generationsbehind. For example, parts of developing countries in Africa have accessonly to 2G wireless connections. With patience and persistence, it might bepossible to conduct very simple communications online. Beyond that,Internet companies are resorting to a text message (SMS) service whichallows users to perform certain actions based on the content of messages.Imagine that! Controlling your Gmail through SMS is laughable to many ofus, but it’s equivalent to normal experiences for the vast majority of theworld.Major telecom companies need not remind us of their impressive speeds.Their datacenters pump petabytes of data around the globe every hour. Somemight find it miraculous, then, that one never experiences these impressivespeeds. By the time you connect to the Wi-Fi at the hotel, airport, orcoffee shop, you are seeing one tenth or less of the promised speeds.The problem lies in the last mile. This oft-reviled part of the Internetwhich is most crucial to tap into the economic possibility therein. Imagineany Internet service which wishes to provide goods, a service, or both.Take Handy for example, an online provider which connects folks who needtheir houses cleaned with people with the skills to clean houses (Idescribed it once as “an Uber for house cleaning,” but I am so disgusted byUber’s corporate behaviour in recent years that I quickly rescinded mycomparison with apologies to Handy). Connecting two people, one with a needand the other with the ability, requires a solid Internet connection on thepart of both client and contractor. If a client cannot place an order orthe contractor cannot receive these order details, then the business simplycannot run. The Internet connection available to each at their respectivehomes or on the go is crucial. If Comcast, Verizon, AT&amp;amp;T, etcetera cannottranslate the wonderful speeds of their datacenter into the real speedsfolks see at home, then these business simply cannot exist.Oakland is fairly urban. I live in an apartment building built, I believe,before the home Internet revolution. This is quite common around the world(the revolution is still quite young in relative terms and we haven’t hadmajor catastrophic wars or natural disasters recently to require such massrebuilding). Still, it is quite uncommon to have speeds exceeding 5 or 10Mbps in the most advanced cities in the U.S. and many European countries.The connection from Comcast’s datacenter in our vicinity to our home isslow and cannot serve that much bandwidth. Peak times for Internet usage inmy building (in the evening just after dinner) causes our connection toslow to a crawl.To live in a city on the outskirts of Silicon Valley and to still haveterrible connection speeds and bandwidth capacities should be unacceptable.If we experience that, the rest of the world is certainly experiencing muchworse. In Oakland, I have the option of paying for faster speeds. In mostof the world, that is a dream.The people consuming the Internet services have connections with speeds andbandwidth capacities orders of magnitude smaller than those who arebuilding Internet services. Speed is key. Bandwidth is key. Stability iskey. Ultimately, these factors are most affected by the presence andquality of the Last Mile. When will we decide to invest in the Last Mileand bring proper Internet connections to the world?",
66
+ "content_html": "<p>Living without the Internet is a reality for the vast majority of people onthe Earth. With Facebook and Google treating connection speeds andbandwidth like disposable cutlery, you can hardly guess why they’re havingsuch a terrible time continuing to grow their userbase around the world.The problem is the infrastructure isn’t available. The “last mile,” as itis often referred to, is sub-par in most parts of the world.</p><p>Ask anyone who travels a lot about their Internet usage habits and theywill regale you with stories of downloading all their work on terribleairport Wi-Fi, traveling halfway around the world, and have almost noquality access to the Internet. It really seems that public Wi-Fi, whetherat an airport, a hotel, or a coffee shop, is universally slow and flaky.</p><p>For those who live in rural parts of the world, even in the most highlyadvanced nations, access to the Internet can be unreliable and painfullyslow at the best of times. From the backcountry in Mississippi to the greatplains of Africa, to the countryside in Austria, these rural areas all havegreat trouble accessing a reliable and fast Internet connection.</p><p>Connections needn’t be 100 megabits per second to be considered fast (ifthey were, my home connection in Oakland, California would be consideredsloth-like). Imagine the average requirements for accessing the Web. First,the page must load. With sometimes dozens of external resources (photos,JavaScript, iframes, CSS, and other media), this can be a challenge.Second, the page must fully load in a reasonable amount of time. You mightbe willing to send off a request for a page and go fetch a coffee at 8, butby 10 you are most certainly not interested in waiting ninety or moreseconds for a page to fully load. Finally, the connection must be stablethroughout your session. If you navigate to a page and the connectionvanishes or becomes otherwise too slow by the time you click on ahyperlink, then it is no good. The connection cannot falter.</p><p>I had the great fortune to spend a few days on a resort on the island ofLombok in Indonesia last year. Never before have I had such a terrible,teasing Internet connection. While I had no obligations to work, I did needto check the status of our flights back to the U.S. Alas, nothing at allwould load over the Wi-Fi! We borrowed the computer at the front desk witha wired connection, but couldn’t get Singapore Airlines’ website to loadfully. The initial HTML would load, but all the bells and whistles toimprove the experience of folks on a much faster connection made itunusable for us – we couldn’t load the JavaScript and other assetsnecessary to navigate the website! With flights being canceled left andright due to a recent volcanic eruption, the updated information werequired in order to plan for our travels was only accessible to folks whospoke Bahasa Indonesia. We were saved by the general manager who spokeEnglish well enough to call and explain the situation to us.</p><p>Parts of the world have connectivity, but are two or three generationsbehind. For example, parts of developing countries in Africa have accessonly to 2G wireless connections. With patience and persistence, it might bepossible to conduct very simple communications online. Beyond that,Internet companies are resorting to a text message (SMS) service whichallows users to perform certain actions based on the content of messages.Imagine that! Controlling your Gmail through SMS is laughable to many ofus, but it’s equivalent to normal experiences for the vast majority of theworld.</p><p>Major telecom companies need not remind us of their impressive speeds.Their datacenters pump petabytes of data around the globe every hour. Somemight find it miraculous, then, that one never experiences these impressivespeeds. By the time you connect to the Wi-Fi at the hotel, airport, orcoffee shop, you are seeing one tenth or less of the promised speeds.</p><p>The problem lies in the last mile. This oft-reviled part of the Internetwhich is most crucial to tap into the economic possibility therein. Imagineany Internet service which wishes to provide goods, a service, or both.Take Handy for example, an online provider which connects folks who needtheir houses cleaned with people with the skills to clean houses (Idescribed it once as “an Uber for house cleaning,” but I am so disgusted byUber’s corporate behaviour in recent years that I quickly rescinded mycomparison with apologies to Handy). Connecting two people, one with a needand the other with the ability, requires a solid Internet connection on thepart of both client and contractor. If a client cannot place an order orthe contractor cannot receive these order details, then the business simplycannot run. The Internet connection available to each at their respectivehomes or on the go is crucial. If Comcast, Verizon, AT&amp;T, etcetera cannottranslate the wonderful speeds of their datacenter into the real speedsfolks see at home, then these business simply cannot exist.</p><p>Oakland is fairly urban. I live in an apartment building built, I believe,before the home Internet revolution. This is quite common around the world(the revolution is still quite young in relative terms and we haven’t hadmajor catastrophic wars or natural disasters recently to require such massrebuilding). Still, it is quite uncommon to have speeds exceeding 5 or 10Mbps in the most advanced cities in the U.S. and many European countries.The connection from Comcast’s datacenter in our vicinity to our home isslow and cannot serve that much bandwidth. Peak times for Internet usage inmy building (in the evening just after dinner) causes our connection toslow to a crawl.</p><p>To live in a city on the outskirts of Silicon Valley and to <em>still</em> haveterrible connection speeds and bandwidth capacities should be unacceptable.If we experience that, the rest of the world is certainly experiencing muchworse. In Oakland, I have the option of paying for faster speeds. In mostof the world, that is a dream.</p><p>The people consuming the Internet services have connections with speeds andbandwidth capacities orders of magnitude smaller than those who arebuilding Internet services. Speed is key. Bandwidth is key. Stability iskey. Ultimately, these factors are most affected by the presence andquality of the Last Mile. When will we decide to invest in the Last Mileand bring proper Internet connections to the world?</p>",
67
+ "url": "https://byparker.com/blog/2016/the-last-mile/",
68
+
69
+
70
+
71
+
72
+ "date_published": "2016-08-17T03:40:52+00:00",
73
+ "date_modified": "2016-08-17T03:40:52+00:00",
74
+ "author": {
75
+ "name": ""
76
+ }
77
+ },
78
+
79
+ {
80
+ "id": "https://byparker.com/blog/2016/tim-cook-s-privacy-battle-is-personal/",
81
+ "summary": "",
82
+ "content_text": "It seems like no one is talking about the elephant in the room with regardto Tim Cook &amp;amp; Privacy: his sexual orientation. In 2014, Tim Cook came outas gay. Growing up in rural Alabama during the height of KKK activity, hemust have felt very marginalized as his sexual orientation was demonized bythose around him. Anti-sodomy laws in Alabama were on the books until 2003,when SCOTUS decided Lawrence v. Texas and declared anti-sodomy laws to beillegal everywhere. For most of his life, it was illegal for him to behimself. Tim Cook is uniquely qualified to fight for privacy rights dueto his personal experience as a marginalized &amp;amp; victimized minority.His work with IBM, Compaq, and Apple brought him to California. He hadrisen through the ranks and was COO of Apple. At the time, the company wasfaltering. Cook turned it around. He must have felt great about his abilityto work with a diverse team to turn the company around and help bring tomarket some of the most popular consumer electronics products ever: theiPod, iPhone, iPad, and MacBook.In 2014, he wrote an op-ed for Bloomberg Businessweek where he confirmedthat he was gay for the first time, publicly. The most telling quote for meis, “I don’t consider myself an activist, but I realize how much I havebenefited from the sacrifice of others.” He didn’t lead the charge forbroader acceptance of LGBTQ people, but he noticed that he benefited fromit. Now it’s his turn to lead the charge.Tim Cook must know in the back of his mind that his sexual orientationcould put him in jail. Perhaps he stayed away from activism because ofthis. Activists are routinely investigated by law enforcement, whoserequest for his personal, private data could mean a conviction under thesodomy laws of Alabama and North Carolina, where he lived and was educated.He knows how much privacy means. Privacy is what kept him out of jail.In the context of terrorism, we’re not too far away from McCarthyism.Anyone who looks and sounds like a terrorist (read: any non-white person ofnon-Christian faith) is immediately implicated and questioned for hours. Ihad a Pakistani roommate my first year at university. He was coming fromthe UAE but was born in Karachi to Pakistani parents. The term started inmid-August, but he wasn’t allowed into the country until mid-September. Areyou surprised to learn that the country in question was our more liberalnorthern neighbor, Canada? Even there, my brown-skinned, black-beardedroommate had extreme difficulty gaining entry as a student.Don’t get me wrong, the threat of terrorism is very real and very importantto address. But the privacy battle Tim Cook is waging is not aboutterrorism; this battle is about all marginalized people whose acceptance insociety ebbs and flows, or whose acceptance isn’t yet secured. The word“jihad” is a term used throughout the Qur’an and Hadith to describe aspiritualstruggle.Any muslim in the US will likely use this word to discuss their spiritualstruggle– should they be considered terrorists? The naïve computer systemsat the NSA, FBI, and CIA would likely give a resounding “yes”. This term isinvoked strongly by radical factions. Should radical factions ofChristianity be marginalized in the same way for their use of slurs towardsfolks of darker-pigmented skin? These terms are used by historians and popculture artists alike, and cannot be outlawed. We cannot be in the businessof outlawing speech–removing privacy would do that.Removing privacy would be a form of outlawing speech because of the effectof self-censorship. When you know your grandparents are listening, do youswear? In my family, swearing is unacceptable in the presence of mygrandparents. Therefore, I censor myself; when I would otherwise use acurse word, I choose something more benign like a frustrated “ah!” or omitany expletive at all. In our household, curse words have been outlawed.My parents have never told me directly not to swear, but I learned byobserving the reactions of those present when someone does swear. In ourterrorism case, when someone says “jihad,” they’re questioned thoroughlyand immediately implicated in terrorist activities unless proven innocent.Our ideal conception of the result is not the reality–law enforcement isnot in the business of giving rights, rather they are in the business oftaking them away.Tim Cook thinks our privacy right is of the utmost importance, and he knowsthat the FBI is not just interested in unlocking this one phone. Privacy iswhat gives society the breathing room to discover new things about itself,allow new movements to form, and so on. Without privacy, we might not havethe Black Lives Matter movement. Without privacy, we might not have had theCivil Rights Movement. Without privacy, we would have mass incarceration ofgay people. Freedom to pursue alternative paths in life is what makesWestern society great.If the FBI gets its way, we’re all suspects in its war against terrorism,whether you like it or not. If Apple gets its way, we can continue to havea vibrant society with diversity of opinion and of ways of life. Tim Cook’spersonal experience as a marginalized gay man and leader of one of themost valuable companies in the world makes him uniquely suited to make thiscase for privacy. I can only hope, for all those who are marginalized, thatTim Cook and Apple win this fight.",
83
+ "content_html": "<p>It seems like no one is talking about the elephant in the room with regardto Tim Cook &amp; Privacy: his sexual orientation. In 2014, Tim Cook came outas gay. Growing up in rural Alabama during the height of KKK activity, hemust have felt very marginalized as his sexual orientation was demonized bythose around him. Anti-sodomy laws in Alabama were on the books until 2003,when SCOTUS decided Lawrence v. Texas and declared anti-sodomy laws to beillegal everywhere. For most of his life, it was illegal for him to behimself. <strong>Tim Cook is uniquely qualified to fight for privacy rights dueto his personal experience as a marginalized &amp; victimized minority.</strong></p><p>His work with IBM, Compaq, and Apple brought him to California. He hadrisen through the ranks and was COO of Apple. At the time, the company wasfaltering. Cook turned it around. He must have felt great about his abilityto work with a diverse team to turn the company around and help bring tomarket some of the most popular consumer electronics products ever: theiPod, iPhone, iPad, and MacBook.</p><p>In 2014, he wrote an op-ed for <em>Bloomberg Businessweek</em> where he confirmedthat he was gay for the first time, publicly. The most telling quote for meis, “I don’t consider myself an activist, but I realize how much I havebenefited from the sacrifice of others.” He didn’t lead the charge forbroader acceptance of LGBTQ people, but he noticed that he benefited fromit. Now it’s his turn to lead the charge.</p><p>Tim Cook must know in the back of his mind that his sexual orientationcould put him in jail. Perhaps he stayed away from activism because ofthis. Activists are routinely investigated by law enforcement, whoserequest for his personal, private data could mean a conviction under thesodomy laws of Alabama and North Carolina, where he lived and was educated.He knows how much privacy means. Privacy is what kept him out of jail.</p><p>In the context of terrorism, we’re not too far away from McCarthyism.Anyone who looks and sounds like a terrorist (read: any non-white person ofnon-Christian faith) is immediately implicated and questioned for hours. Ihad a Pakistani roommate my first year at university. He was coming fromthe UAE but was born in Karachi to Pakistani parents. The term started inmid-August, but he wasn’t allowed into the country until mid-September. Areyou surprised to learn that the country in question was our more liberalnorthern neighbor, Canada? Even there, my brown-skinned, black-beardedroommate had extreme difficulty gaining entry as a student.</p><p>Don’t get me wrong, the threat of terrorism is very real and very importantto address. But the privacy battle Tim Cook is waging is not aboutterrorism; this battle is about all marginalized people whose acceptance insociety ebbs and flows, or whose acceptance isn’t yet secured. The word“jihad” is a term <a href=\"http://www.al-islam.org/al-serat/vol-9-no-1/spiritual-significance-jihad-seyyed-hossein-nasr/spiritual-significance-jihad\">used throughout the Qur’an and <em>Hadith</em> to describe aspiritualstruggle</a>.Any muslim in the US will likely use this word to discuss their spiritualstruggle– should they be considered terrorists? The naïve computer systemsat the NSA, FBI, and CIA would likely give a resounding “yes”. This term isinvoked strongly by radical factions. Should radical factions ofChristianity be marginalized in the same way for their use of slurs towardsfolks of darker-pigmented skin? These terms are used by historians and popculture artists alike, and cannot be outlawed. We cannot be in the businessof outlawing speech–removing privacy would do that.</p><p>Removing privacy would be a form of outlawing speech because of the effectof self-censorship. When you know your grandparents are listening, do youswear? In my family, swearing is unacceptable in the presence of mygrandparents. Therefore, I censor myself; when I would otherwise use acurse word, I choose something more benign like a frustrated “ah!” or omitany expletive at all. In our household, curse words have been <em>outlawed</em>.My parents have never told me directly not to swear, but I learned byobserving the reactions of those present when someone does swear. In ourterrorism case, when someone says “jihad,” they’re questioned thoroughlyand immediately implicated in terrorist activities unless proven innocent.Our ideal conception of the result is not the reality–law enforcement isnot in the business of giving rights, rather they are in the business oftaking them away.</p><p>Tim Cook thinks our privacy right is of the utmost importance, and he knowsthat the FBI is not just interested in unlocking this one phone. Privacy iswhat gives society the breathing room to discover new things about itself,allow new movements to form, and so on. Without privacy, we might not havethe Black Lives Matter movement. Without privacy, we might not have had theCivil Rights Movement. Without privacy, we would have mass incarceration ofgay people. Freedom to pursue alternative paths in life is what makesWestern society great.</p><p>If the FBI gets its way, we’re all suspects in its war against terrorism,whether you like it or not. If Apple gets its way, we can continue to havea vibrant society with diversity of opinion and of ways of life. Tim Cook’spersonal experience as a marginalized gay man <em>and</em> leader of one of themost valuable companies in the world makes him uniquely suited to make thiscase for privacy. I can only hope, for all those who are marginalized, thatTim Cook and Apple win this fight.</p>",
84
+ "url": "https://byparker.com/blog/2016/tim-cook-s-privacy-battle-is-personal/",
85
+
86
+
87
+
88
+
89
+ "date_published": "2016-03-02T18:06:41+00:00",
90
+ "date_modified": "2016-03-02T18:06:41+00:00",
91
+ "author": {
92
+ "name": ""
93
+ }
94
+ },
95
+
96
+ {
97
+ "id": "https://byparker.com/blog/2016/joining-github/",
98
+ "summary": "",
99
+ "content_text": "What a whirlwind day. I have joined GitHub!Today was my first day as a Hubber. I wanted to mark this new role with alittle post of thanks to all those who advocated for me along the way. Iwon’t be able to mention everyone by name, but there are a few folks whoI’d like to mention specially.First, a shout out to @benbalter for constantly being willing to answerquestions I had about Jekyll The Product and how it integrates or couldintegrate with Pages. He made me excited about GitHub, giving me tours ofthe fancy HQ and inviting me to a nanosummit in San Francisco to talk aboutJekyll and Pages right after I started contracting. And hey! He was myprimary mentor and advocate (and PR reviewer) during my time as acontractor, working on Pages. Thanks, Ben!Second, huge thanks to @gjtorikian for connecting me to the right people(notably @tnm) at the right time in my career. In light of a likely moveaway from the Bay Area, looking for a remote position made sense. Thanks tohim also for his enthusiasm about Pages and Jekyll and spending time incoffee shops commiserating with me about being caremad for Pages and Jekyll.Next, @jglovier. His gentle-hearted friendship and thoughtful advice hasbeen a huge help for me over the last year or so. He has been an advocatefor Jekyll and for me. And, heck, everyone who uses jekyll new can thankhim for that swell design! :wink:@imathis giving me access to Octopress partly turned Tom’s hand. Alwaysgenerous with his time, he is always available to ping for a UX questionabout Jekyll. Working on Octopress with him taught me so much aboutdeveloping with the user’s experience in mind. I have also learned so muchfrom his generosity of spirit, both in dealing with contributors in theissues and also in being a more present son, brother, boyfriend, andfriend.The King of Compassion, @balevine, has been an advocate for Pages and,specifically, for improving Pages for a long while. If he hadn’t helpedguide the hand of GitHub to think more critically about their approach toPages, I wouldn’t be here. He, like all Hubbers I have met so far, iskind-hearted and generous with his mind and spirit. I feel lucky to be ableto work by his side.Last, my gratitude to @mojombo. Tom handed my overzealous college self thekeys to Jekyll in December of 2013.His hands-off approach allowed me to dive deep and really take ownershipover the development of Jekyll since v0.12.1. I wouldn’t have taken aninterest in GitHub nor been even remotely qualified if it hadn’t been forthe opportunity to work on Jekyll.This post wouldn’t be complete without thanking all the folks whointerviewed me and who made the interview and onboarding processes sowonderful. Thanks, too, to my new team for welcoming me with open arms.GitHub is already turning out to be an excellent place to work and I amexcited to begin my career here. They’re aggressively hiring right now for2016 — hit me up if youhave any questions. I may not know the answers, but I can probably help youfind someone who does. :smile:And off I go!",
100
+ "content_html": "<p>What a whirlwind day. I have joined <a href=\"https://github.com\">GitHub</a>!</p><p>Today was my first day as a Hubber. I wanted to mark this new role with alittle post of thanks to all those who advocated for me along the way. Iwon’t be able to mention everyone by name, but there are a few folks whoI’d like to mention specially.</p><p>First, a shout out to <a href=\"https://github.com/benbalter\">@benbalter</a> for constantly being willing to answerquestions I had about Jekyll The Product and how it integrates or couldintegrate with Pages. He made me excited about GitHub, giving me tours ofthe fancy HQ and inviting me to a nanosummit in San Francisco to talk aboutJekyll and Pages right after I started contracting. And hey! He was myprimary mentor and advocate (and PR reviewer) during my time as acontractor, working on Pages. Thanks, Ben!</p><p>Second, huge thanks to <a href=\"https://github.com/gjtorikian\">@gjtorikian</a> for connecting me to the right people(notably @tnm) at the right time in my career. In light of a likely moveaway from the Bay Area, looking for a remote position made sense. Thanks tohim also for his enthusiasm about Pages and Jekyll and spending time incoffee shops commiserating with me about being caremad for Pages and Jekyll.</p><p>Next, <a href=\"https://github.com/jglovier\">@jglovier</a>. His gentle-hearted friendship and thoughtful advice hasbeen a huge help for me over the last year or so. He has been an advocatefor Jekyll and for me. And, heck, everyone who uses <code class=\"highlighter-rouge\">jekyll new</code> can thankhim for that swell design! :wink:</p><p><a href=\"https://github.com/imathis\">@imathis</a> giving me access to Octopress partly turned Tom’s hand. Alwaysgenerous with his time, he is always available to ping for a UX questionabout Jekyll. Working on Octopress with him taught me so much aboutdeveloping with the user’s experience in mind. I have also learned so muchfrom his generosity of spirit, both in dealing with contributors in theissues and also in being a more present son, brother, boyfriend, andfriend.</p><p>The King of Compassion, <a href=\"https://github.com/balevine\">@balevine</a>, has been an advocate for Pages and,specifically, for <em>improving</em> Pages for a long while. If he hadn’t helpedguide the hand of GitHub to think more critically about their approach toPages, I wouldn’t be here. He, like all Hubbers I have met so far, iskind-hearted and generous with his mind and spirit. I feel lucky to be ableto work by his side.</p><p>Last, my gratitude to <a href=\"https://github.com/mojombo\">@mojombo</a>. Tom <a href=\"/blog/2012/the-immediate-future-of-jekyll/\">handed my overzealous college self thekeys to Jekyll in December of 2013</a>.His hands-off approach allowed me to dive deep and really take ownershipover the development of Jekyll since v0.12.1. I wouldn’t have taken aninterest in GitHub nor been even remotely qualified if it hadn’t been forthe opportunity to work on Jekyll.</p><p>This post wouldn’t be complete without thanking all the folks whointerviewed me and who made the interview and onboarding processes sowonderful. Thanks, too, to my new team for welcoming me with open arms.</p><p>GitHub is already turning out to be an excellent place to work and I amexcited to begin my career here. They’re <a href=\"https://jobs.github.com/companies/GitHub\">aggressively hiring right now for2016</a> — hit me up if youhave any questions. I may not know the answers, but I can probably help youfind someone who does. :smile:</p><p>And off I go!</p>",
101
+ "url": "https://byparker.com/blog/2016/joining-github/",
102
+
103
+
104
+
105
+
106
+ "date_published": "2016-01-06T05:37:03+00:00",
107
+ "date_modified": "2016-01-06T05:37:03+00:00",
108
+ "author": {
109
+ "name": ""
110
+ }
111
+ },
112
+
113
+ {
114
+ "id": "https://byparker.com/blog/2015/farewell-vsco/",
115
+ "summary": "",
116
+ "content_text": "Today was my last day at VSCO. It has been a marveloussixteen months working with one of the finest teams in San Francisco.I couldn’t have asked for a better company to work for straight out ofcollege. My colleagues here have felt like family, and their passion,commitment, and prowess is truly inspirational. We have had our fair shareof ups and downs, all of which have taught me so much. I have admired thefocus and determination with which the entire company approaches dailychallenges. VSCO is used by people all over the world every day to create,discover, and inspire thanks to the hard work of this excellent team.Thanks so much for everything, VSCO. I will miss you all. :heart:",
117
+ "content_html": "<p>Today was my last day at <a href=\"https://vsco.co\">VSCO</a>. It has been a marveloussixteen months working with one of the finest teams in San Francisco.</p><p>I couldn’t have asked for a better company to work for straight out ofcollege. My colleagues here have felt like family, and their passion,commitment, and prowess is truly inspirational. We have had our fair shareof ups and downs, all of which have taught me so much. I have admired thefocus and determination with which the entire company approaches dailychallenges. VSCO is used by people all over the world every day to create,discover, and inspire thanks to the hard work of this excellent team.</p><p>Thanks <em>so</em> much for everything, VSCO. I will miss you all. :heart:</p><p><img src=\"https://image.vsco.co/1/51c771649686d3572/53bafbc7726708772f8b4620/769x960/vsco_070714.jpg\" alt=\"VSCO eating lunch, late 2014. Oakland, CA.\" /></p>",
118
+ "url": "https://byparker.com/blog/2015/farewell-vsco/",
119
+
120
+
121
+
122
+
123
+ "date_published": "2015-12-19T01:28:02+00:00",
124
+ "date_modified": "2015-12-19T01:28:02+00:00",
125
+ "author": {
126
+ "name": ""
127
+ }
128
+ },
129
+
130
+ {
131
+ "id": "https://byparker.com/blog/2015/there-are-good-days-and-there-are-bad-days/",
132
+ "summary": "",
133
+ "content_text": "Have you ever heard this quote before? I don’t remember the full and exacttext of the quote. Maybe I’m thinking of Charles Dickens’s “It was the bestof times, and the worst of times,” which is the opening line of his piece“Great Expectations.” In any event, it is an oddly profound sentiment. Itdefines our world — not every day will be good, and not every daywill be bad. Instead, there is a mixture of both.What, then, are the implications of this assumption, that not every daywill be good and that not every day will be bad? Perhpas it means we willneed to be able to deal with both good days and bad days in productiveways. We’ll have to handle them and learn from them.I believe the best days of our lives aren’t the days we learn. They aren’tthe days from which we reap the greatest benefit. Rather, it’s thedifficult days that drive us to better ourselves. It’s the bad days thatshow us where we are going wrong and, if you’re lucky, they show us how wecan make a course correction.Good days offer more nuanced lessons. They reinforce our confidence andgive us a bit of a break from worrying and fixing. We may rest. As wereflect upon the good days, we see the value in rest and quiet.I wonder how good days and bad days shape a man like me. All I know is thatthey do and that awareness is a kind first step.Originally written on November 18, 2014, edited &amp;amp; published just over a year later.",
134
+ "content_html": "<p>Have you ever heard this quote before? I don’t remember the full and exacttext of the quote. Maybe I’m thinking of Charles Dickens’s “It was the bestof times, and the worst of times,” which is the opening line of his piece“Great Expectations.” In any event, it is an oddly profound sentiment. Itdefines our world — not every day will be good, and not every daywill be bad. Instead, there is a mixture of both.</p><p>What, then, are the implications of this assumption, that not every daywill be good and that not every day will be bad? Perhpas it means we willneed to be able to deal with both good days and bad days in productiveways. We’ll have to handle them and learn from them.</p><p>I believe the best days of our lives aren’t the days we learn. They aren’tthe days from which we reap the greatest benefit. Rather, it’s thedifficult days that drive us to better ourselves. It’s the bad days thatshow us where we are going wrong and, if you’re lucky, they show us how wecan make a course correction.</p><p>Good days offer more nuanced lessons. They reinforce our confidence andgive us a bit of a break from worrying and fixing. We may rest. As wereflect upon the good days, we see the value in rest and quiet.</p><p>I wonder how good days and bad days shape a man like me. All I know is thatthey do and that awareness is a kind first step.</p><p><em>Originally written on November 18, 2014, edited &amp; published just over a year later.</em></p>",
135
+ "url": "https://byparker.com/blog/2015/there-are-good-days-and-there-are-bad-days/",
136
+
137
+
138
+
139
+
140
+ "date_published": "2015-12-15T08:51:16+00:00",
141
+ "date_modified": "2015-12-15T08:51:16+00:00",
142
+ "author": {
143
+ "name": ""
144
+ }
145
+ },
146
+
147
+ {
148
+ "id": "https://byparker.com/blog/2015/os-x-godoc-launch-agent/",
149
+ "summary": "",
150
+ "content_text": "On a Mac? Love godoc? Load up godoc -http=:6060 at boot time with a LaunchAgent:&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&amp;lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&amp;gt;&amp;lt;plist version=&quot;1.0&quot;&amp;gt;&amp;lt;dict&amp;gt; &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt; &amp;lt;string&amp;gt;org.golang.godoc&amp;lt;/string&amp;gt; &amp;lt;key&amp;gt;EnvironmentVariables&amp;lt;/key&amp;gt; &amp;lt;dict&amp;gt; &amp;lt;key&amp;gt;GOPATH&amp;lt;/key&amp;gt; &amp;lt;string&amp;gt;/Users/parkr/.go&amp;lt;/string&amp;gt; &amp;lt;/dict&amp;gt; &amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt; &amp;lt;array&amp;gt; &amp;lt;string&amp;gt;/usr/local/opt/go/libexec/bin/godoc&amp;lt;/string&amp;gt; &amp;lt;string&amp;gt;-http=localhost:6060&amp;lt;/string&amp;gt; &amp;lt;/array&amp;gt; &amp;lt;key&amp;gt;KeepAlive&amp;lt;/key&amp;gt; &amp;lt;true/&amp;gt; &amp;lt;key&amp;gt;RunAtLoad&amp;lt;/key&amp;gt; &amp;lt;true/&amp;gt; &amp;lt;key&amp;gt;WorkingDirectory&amp;lt;/key&amp;gt; &amp;lt;string&amp;gt;/tmp&amp;lt;/string&amp;gt;&amp;lt;/dict&amp;gt;&amp;lt;/plist&amp;gt;Then load it up:$ launchctl load ~/Library/LaunchAgents/org.golang.godoc.plistAnd surf. Now, go forth and document!",
151
+ "content_html": "<p>On a Mac? <a href=\"/blog/2015/go-and-a-better-world-for-documentation/\">Love godoc?</a> Load up <code class=\"highlighter-rouge\">godoc -http=:6060</code> at boot time with a LaunchAgent:</p><figure class=\"highlight\"><pre><code class=\"language-xml\" data-lang=\"xml\"><span class=\"cp\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;</span><span class=\"cp\">&lt;!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\"&gt;</span><span class=\"nt\">&lt;plist</span> <span class=\"na\">version=</span><span class=\"s\">\"1.0\"</span><span class=\"nt\">&gt;</span><span class=\"nt\">&lt;dict&gt;</span> <span class=\"nt\">&lt;key&gt;</span>Label<span class=\"nt\">&lt;/key&gt;</span> <span class=\"nt\">&lt;string&gt;</span>org.golang.godoc<span class=\"nt\">&lt;/string&gt;</span> <span class=\"nt\">&lt;key&gt;</span>EnvironmentVariables<span class=\"nt\">&lt;/key&gt;</span> <span class=\"nt\">&lt;dict&gt;</span> <span class=\"nt\">&lt;key&gt;</span>GOPATH<span class=\"nt\">&lt;/key&gt;</span> <span class=\"nt\">&lt;string&gt;</span>/Users/parkr/.go<span class=\"nt\">&lt;/string&gt;</span> <span class=\"nt\">&lt;/dict&gt;</span> <span class=\"nt\">&lt;key&gt;</span>ProgramArguments<span class=\"nt\">&lt;/key&gt;</span> <span class=\"nt\">&lt;array&gt;</span> <span class=\"nt\">&lt;string&gt;</span>/usr/local/opt/go/libexec/bin/godoc<span class=\"nt\">&lt;/string&gt;</span> <span class=\"nt\">&lt;string&gt;</span>-http=localhost:6060<span class=\"nt\">&lt;/string&gt;</span> <span class=\"nt\">&lt;/array&gt;</span> <span class=\"nt\">&lt;key&gt;</span>KeepAlive<span class=\"nt\">&lt;/key&gt;</span> <span class=\"nt\">&lt;true/&gt;</span> <span class=\"nt\">&lt;key&gt;</span>RunAtLoad<span class=\"nt\">&lt;/key&gt;</span> <span class=\"nt\">&lt;true/&gt;</span> <span class=\"nt\">&lt;key&gt;</span>WorkingDirectory<span class=\"nt\">&lt;/key&gt;</span> <span class=\"nt\">&lt;string&gt;</span>/tmp<span class=\"nt\">&lt;/string&gt;</span><span class=\"nt\">&lt;/dict&gt;</span><span class=\"nt\">&lt;/plist&gt;</span></code></pre></figure><p>Then load it up:</p><figure class=\"highlight\"><pre><code class=\"language-bash\" data-lang=\"bash\"><span class=\"gp\">$ </span>launchctl load ~/Library/LaunchAgents/org.golang.godoc.plist</code></pre></figure><p>And surf. Now, go forth and document!</p>",
152
+ "url": "https://byparker.com/blog/2015/os-x-godoc-launch-agent/",
153
+
154
+
155
+
156
+
157
+ "date_published": "2015-12-08T21:26:44+00:00",
158
+ "date_modified": "2015-12-08T21:26:44+00:00",
159
+ "author": {
160
+ "name": ""
161
+ }
162
+ },
163
+
164
+ {
165
+ "id": "https://byparker.com/blog/2015/go-and-a-better-world-for-documentation/",
166
+ "summary": "",
167
+ "content_text": "Using Go has improved documentation at VSCO tenfold.Never has a language made it so effortlessly fruitful to write and readdocumentation. The secret: godoc.Simply comment your functions, types, constants, variables, or anythingelse you like, and read them with godoc.godoc is a tool for fetching documentation for functions, variables,types, etc. available in your GOROOT and GOPATH. It is easy to use on thecommand line, but really shines when loaded up over HTTP:$ godoc -http=:6060Run that command and open http://localhost:6060 and you will be delightedby your own local copy of golang.org! Browse the documentation for anypackage in the standard library, or any project in your GOPATH.VSCO commits any packages it writes to GitHub and, conveniently, they’reall available under the top-level namespace of github.com/vsco. Now ourdevelopers can see all we have to offer by visitinghttp://localhost:6060/pkg/github.com/vsco! Each package is named for theservice with which it interacts, so there’s no confusion.godoc has allowed us to write code with the client in mind: producing aneasy-to-use API with documentation to reduce confusion and duplicationof efforts. Write some documentation today!On a Mac? Run the godoc server all the time without needing to open a terminal.Happy documenting!",
168
+ "content_html": "<p>Using <a href=\"https://golang.org\">Go</a> has improved documentation at VSCO tenfold.Never has a language made it so effortlessly fruitful to write and readdocumentation. The secret: <a href=\"https://godoc.org/golang.org/x/tools/cmd/godoc\"><strong>godoc</strong></a>.Simply comment your functions, types, constants, variables, or anythingelse you like, and read them with <code class=\"highlighter-rouge\">godoc</code>.</p><p><code class=\"highlighter-rouge\">godoc</code> is a tool for fetching documentation for functions, variables,types, etc. available in your GOROOT and GOPATH. It is easy to use on thecommand line, but really shines when loaded up over HTTP:</p><figure class=\"highlight\"><pre><code class=\"language-bash\" data-lang=\"bash\"><span class=\"gp\">$ </span>godoc -http<span class=\"o\">=</span>:6060</code></pre></figure><p>Run that command and open http://localhost:6060 and you will be delightedby your own local copy of golang.org! Browse the documentation for anypackage in the standard library, <strong>or any project in your GOPATH</strong>.</p><p>VSCO commits any packages it writes to GitHub and, conveniently, they’reall available under the top-level namespace of <code class=\"highlighter-rouge\">github.com/vsco</code>. Now ourdevelopers can see all we have to offer by visitinghttp://localhost:6060/pkg/github.com/vsco! Each package is named for theservice with which it interacts, so there’s no confusion.</p><p><code class=\"highlighter-rouge\">godoc</code> has allowed us to write code with the client in mind: producing aneasy-to-use API <strong>with documentation</strong> to reduce confusion and duplicationof efforts. <a href=\"https://blog.golang.org/godoc-documenting-go-code\">Write some documentation today!</a></p><p>On a Mac? <a href=\"/blog/2015/os-x-godoc-launch-agent/\">Run the godoc server all the time without needing to open a terminal.</a></p><p>Happy documenting!</p>",
169
+ "url": "https://byparker.com/blog/2015/go-and-a-better-world-for-documentation/",
170
+
171
+
172
+
173
+
174
+ "date_published": "2015-12-08T21:04:44+00:00",
175
+ "date_modified": "2015-12-08T21:04:44+00:00",
176
+ "author": {
177
+ "name": ""
178
+ }
179
+ },
180
+
181
+ {
182
+ "id": "https://byparker.com/blog/2015/need-for-speed/",
183
+ "summary": "",
184
+ "content_text": "Internet speeds vary wildly across the world. In my cushy Oakland,California office, the Internet is zippy and every page loads within acouple seconds. On a recent trip to Indonesia, I got three, maybe fourwebsites to load over my myXL E connection. Ultimately, websites I used tovisit with frequency were completely unusable. I stopped going entirely.The culprit? HTTP/1.1 and all your goddamn JavaScript.HTTP/1.1First, HTTP/1.1. It’s outdated, and everyone knows it. Google came up withthe SPDY protocol which some webservers added support for and some sitesused, but it didn’t catch on. Over time, it morphed into today’sspecification for HTTP/2, a much needed iteration of the HTTP protocolevery website uses today to serve you its content. It is much faster, for avariety of reasons. See Mark McDonnell’s excellent write-up of all thebenfits of HTTP/2 for aholistic look at the best parts of HTTP/2.If I had to pick a favourite part, it’d be that HTTP/2 uses a single,persistent connection to each host. All those other resources, likeJavaScript, CSS, and images, served from the same host can be sent downone connection. This reduces overhead dramatically, especially for TLSconnections which take a considerable amount of time to perform thehandshake. In my view, this is the biggest win.Run a website? Support HTTP/2 today! Most web browsers now supportit out of the box, so do yourself and yourvisitors on slow connections a favour and upgrade!Too much JavaScriptSecond, all your goddamn JavaScript. Holy crap, what is the web comingto? Visit wired.com and open the web inspector. You’ll see a disturbing57 requests for JavaScript alone. FIFTY-SEVEN REQUESTS. As a user, I goto wired.com and I make ONE request and I have an expectation that it willbe fast. Little do I know that my favourite websites ship with dozens ofadditional JavaScript resources which much be loaded individually, eachusing up its own connection, negotiating TLS, then receiving either aredirect (which has to run the entire process again) or, finally, somecontent. In total, wired.com requests 276 resources on load, JavaScriptcontributing a fifth of the load. Of the 10 megabytes for a single page,JavaScript contributed 3.5 MB, or 35% of the total bytesize of the page.Heavy.Take a few different high-traffic websites and you’ll see a disturbingsimilarity: advertisements are the worst in this regard. You canrationalize to your Product Manager a few JavaScript files, maybe 1 or 2megabytes. But then Finance calls and says you’re moving to an ad-supportedplatform. You diligently hook up the ad network code to every page, ensureit’s pixel-perfect and ship it. All of a sudden, your site bloats from 4JavaScript files to 15 or 20. Every visitor’s browser and networkconnection becomes absurdly overloaded and many of your users on slowconnections simply don’t return. You start making money on every request,but fewer people are reading the content because the site takes so long toload and render. Your Finance team will be happy, but it’s a loss for everyother department.Don’t get me started on JavaScript-only websites. Ember, Angular, etc. areall curses on all our houses.KickerIf all you care about are folks in rich areas in first-world countries,then don’t do anything. You’re all set!If you care about folks on slow connections, support HTTP/2 and reduce theresources which your pages load. Most of Asia, Africa, and South America,and many in Europe and North America, too, will thank you.",
185
+ "content_html": "<p>Internet speeds vary wildly across the world. In my cushy Oakland,California office, the Internet is zippy and every page loads within acouple seconds. On a recent trip to Indonesia, I got three, maybe fourwebsites to load over my myXL E connection. Ultimately, websites I used tovisit with frequency were completely unusable. <strong>I stopped going entirely.</strong>The culprit? HTTP/1.1 and <em>all your goddamn JavaScript</em>.</p><h3 id=\"http11\">HTTP/1.1</h3><p>First, HTTP/1.1. It’s outdated, and everyone knows it. Google came up withthe SPDY protocol which some webservers added support for and some sitesused, but it didn’t catch on. Over time, it morphed into today’sspecification for HTTP/2, a much needed iteration of the HTTP protocolevery website uses today to serve you its content. It is much faster, for avariety of reasons. See <a href=\"http://www.integralist.co.uk/posts/http2.html\">Mark McDonnell’s excellent write-up of all thebenfits of HTTP/2</a> for aholistic look at the best parts of HTTP/2.</p><p>If I had to pick a favourite part, it’d be that HTTP/2 uses a <em>single,persistent connection</em> to each host. All those other resources, likeJavaScript, CSS, and images, served from the same host can be sent down<em>one</em> connection. This reduces overhead dramatically, especially for TLSconnections which take a considerable amount of time to perform thehandshake. In my view, this is the biggest win.</p><p>Run a website? <strong>Support HTTP/2 today!</strong> <a href=\"http://caniuse.com/http2\">Most web browsers now supportit</a> out of the box, so do yourself and yourvisitors on slow connections a favour and upgrade!</p><h3 id=\"too-much-javascript\">Too much JavaScript</h3><p>Second, <em>all your goddamn JavaScript</em>. Holy crap, what is the web comingto? Visit wired.com and open the web inspector. You’ll see a disturbing<strong>57 requests</strong> for JavaScript alone. FIFTY-SEVEN REQUESTS. As a user, I goto wired.com and I make ONE request and I have an expectation that it willbe fast. Little do I know that my favourite websites ship with dozens ofadditional JavaScript resources which much be loaded individually, eachusing up its own connection, negotiating TLS, then receiving either aredirect (which has to run the entire process again) or, <em>finally</em>, somecontent. In total, wired.com requests 276 resources on load, JavaScriptcontributing a fifth of the load. Of the 10 megabytes for a single page,JavaScript contributed 3.5 MB, or 35% of the total bytesize of the page.<em>Heavy.</em></p><p>Take a few different high-traffic websites and you’ll see a disturbingsimilarity: advertisements are the worst in this regard. You canrationalize to your Product Manager a few JavaScript files, maybe 1 or 2megabytes. But then Finance calls and says you’re moving to an ad-supportedplatform. You diligently hook up the ad network code to every page, ensureit’s pixel-perfect and ship it. All of a sudden, your site bloats from 4JavaScript files to 15 or 20. Every visitor’s browser and networkconnection becomes absurdly overloaded and many of your users on slowconnections simply don’t return. You start making money on every request,but fewer people are reading the content because the site takes so long toload and render. Your Finance team will be happy, but it’s a loss for everyother department.</p><p>Don’t get me started on JavaScript-only websites. Ember, Angular, etc. areall curses on all our houses.</p><h3 id=\"kicker\">Kicker</h3><p>If all you care about are folks in rich areas in first-world countries,then don’t do anything. You’re all set!</p><p>If you care about folks on slow connections, support HTTP/2 and reduce theresources which your pages load. Most of Asia, Africa, and South America,and many in Europe and North America, too, will thank you.</p>",
186
+ "url": "https://byparker.com/blog/2015/need-for-speed/",
187
+
188
+
189
+
190
+
191
+ "date_published": "2015-11-19T17:44:13+00:00",
192
+ "date_modified": "2015-11-19T17:44:13+00:00",
193
+ "author": {
194
+ "name": ""
195
+ }
196
+ },
197
+
198
+ {
199
+ "id": "https://byparker.com/blog/2015/assault/",
200
+ "summary": "",
201
+ "content_text": "I grew up in a small city in Western New York. It is a quaint, unassumingplace once home to incredible innovative companies such as Kodak. Until the1980’s, it was a booming metropolis and it seemed for a time that it wouldflourish forever. Then the 1982 stock market crash caused many companies toshutter. Over time, the city grew quiet. Folks moved out to the suburbs forthe white picket fence middle class dream.Once I graduated from college, I moved to San Francisco. This new placealso introduced a new kind of experience: sensory assault. I had lived in abig city before (Berlin), but never had I endured such a constant onslaughtof yelling, screeching, dinging, barking, and so on. The smells wereequally as jarring. Urine, it seemed, lined the streets of the city. Youcould smell the most delicious tacos one minute, then encounter the mostoffending body odor from an unfortunate fellow left to lie in the streets.At night, you could hear the pounding music from a club three blocks away.As you pass by a bar, you are momentarily deafened by the din emanatingfrom behind its doors. Lights of all colors flash through the openingdoors, nearly blinding me as I walk by.My new city was altogether too much to handle most days. I found myselfagitated very easily as I walked to and from the BART station closest to myapartment. Sirens, the loud conversations of tourists, and the roaring ofplanes overhead filled my ears. Any pause in the din was quickly filled byharsh winds blowing against my ears, as if the silence were too unbearable.Upon a recent trip to my old college campus, I was struck by its quietness;the only sounds I could hear were the occasional revving of an engine orthe laughter of a joyful patron of our beloved bagel shop. Folks movedquickly and with purpose, but did so without assaulting my senses. It wasrefreshingly peaceful.Every day, I wake up in a place that seems to flaunt its assault as a partof its “character” and “charm”, and it’s starting to rub me the wrong way.I yearn for a quieter home, calmer surroundings. I wonder if I will everfind silence again.",
202
+ "content_html": "<p>I grew up in a small city in Western New York. It is a quaint, unassumingplace once home to incredible innovative companies such as Kodak. Until the1980’s, it was a booming metropolis and it seemed for a time that it wouldflourish forever. Then the 1982 stock market crash caused many companies toshutter. Over time, the city grew quiet. Folks moved out to the suburbs forthe white picket fence middle class dream.</p><p>Once I graduated from college, I moved to San Francisco. This new placealso introduced a new kind of experience: sensory assault. I had lived in abig city before (Berlin), but never had I endured such a constant onslaughtof yelling, screeching, dinging, barking, and so on. The smells wereequally as jarring. Urine, it seemed, lined the streets of the city. Youcould smell the most delicious tacos one minute, then encounter the mostoffending body odor from an unfortunate fellow left to lie in the streets.At night, you could hear the pounding music from a club three blocks away.As you pass by a bar, you are momentarily deafened by the din emanatingfrom behind its doors. Lights of all colors flash through the openingdoors, nearly blinding me as I walk by.</p><p>My new city was altogether too much to handle most days. I found myselfagitated very easily as I walked to and from the BART station closest to myapartment. Sirens, the loud conversations of tourists, and the roaring ofplanes overhead filled my ears. Any pause in the din was quickly filled byharsh winds blowing against my ears, as if the silence were too unbearable.</p><p>Upon a recent trip to my old college campus, I was struck by its quietness;the only sounds I could hear were the occasional revving of an engine orthe laughter of a joyful patron of our beloved bagel shop. Folks movedquickly and with purpose, but did so <em>without</em> assaulting my senses. It wasrefreshingly peaceful.</p><p>Every day, I wake up in a place that seems to flaunt its assault as a partof its “character” and “charm”, and it’s starting to rub me the wrong way.I yearn for a quieter home, calmer surroundings. I wonder if I will everfind silence again.</p>",
203
+ "url": "https://byparker.com/blog/2015/assault/",
204
+
205
+
206
+
207
+
208
+ "date_published": "2015-08-25T23:05:42+00:00",
209
+ "date_modified": "2015-08-25T23:05:42+00:00",
210
+ "author": {
211
+ "name": ""
212
+ }
213
+ },
214
+
215
+ {
216
+ "id": "https://byparker.com/blog/2015/working-with-go/",
217
+ "summary": "",
218
+ "content_text": "Man, Go is damn nice to work with. I figured I wouldhold off writing about it until after I had used it seriously at work for acouple weeks. We wrote a couple projects in Go that never really got offthe ground, but the one I have been spending most of my time on nowadays isgoing the full 400 meters to production.The GoodFirst, the good. Structure and organization are key for me when developing.If the structure of the code isn’t uniform, it makes it immensely difficultto work with. This is one reason I get really angry with Node – there’s nouniformity at all. gofmt helps ease the tension between colleagues andmakes an easy case to follow “the Go way.” There are still tensions when itcomes to package organization but those arguments are fewer now. So interms of code cleanliness and organization, my inner OCD gives Go a bigthumbs up. And my inner peacemaker is grateful, too.The Go community is a really vibrant one. If you log onto the #go-nutschannel on IRC (Freenode), you’ll find lively conversation at all hours ofday. The golang-nuts mailing list is also a great place to ask questionsand to passively learn more about the language and its application invarious problem spaces. There are loads of talks by the Go Team at Googleas well; I would recommend talks by Rob Pike and Brad Fitzpatrick if you’reinterested in the technical deep-dives.I come from a background of PHP, Ruby, and JavaScript, where types feellike an afterthought. Working with Go’s strict typing system has been areally nice ease into the world of strict types. I tried my hand at Rust alittle while ago and got so frustrated by the type system that I ended upputting it down. Go’s type system feels like one that helps you out ratherthan holds you back. It doesn’t have generics, but I barely remembergenerics from my Java days (oh, high school) so I don’t miss them much.Generally, I find a way for interfaces to satisfy that need if there is theneed for generics. At any rate, Go’s type system gives me confidence thatthere won’t be some silly type error at runtime (as long as I stay awayfrom the dreaded interface{} non-type).Working with a compiled language is also a really nice change. I can builda binary with go build and ship that out to my production servers withouteven blinking. Hell, using scp or rsync to deploy?! You have thoseansible/capistrano folks weeping in their sleep. The compiler’s typechecking also really helps. If it builds, it probably runs – though itisn’t guaranteed that you hooked up all the bits correctly even if it doescompile. A file of empty methods is still valid in Go. At any rate, workingwith the compiler has been a marvelous change coming from Ruby andJavaScript where almost every error is a runtime error.It’s hella fast. A sizable test suite will often run in less than 30seconds. The Rubyist in me was off hiding in the corner, hoping I wouldn’tnotice that a similarly-sized test suite in Ruby would take 3 or 4minutes to run. Beyond tests, there has been so much optimization in thecompiler to make Go as fast as humanly possible – obviously in Google’sbest interests because at their scale, every CPU millisecond counts.Channels. Holy hell, channels are cool. Communicating between goroutinesusing channels instead of shared memory has changed my world for thebetter. If you don’t know what channels are, here’s a gentle introductionon Go By Example.I suppose there is more I could say here, but I imagine you’re satisfiedThe FrustratingI really, really miss Enumerable. There’s no reduce, no map – noneof that. Just for and a growable array type called a slice. I waswriting Ruby last night and loved how concisely I could operate over largearrays. I suppose concision and speed are at war here, so at this point I’mnot too broken up about it. For every step made easier by Ruby, there’s a200ms overhead it seems.Your code won’t compile unless it’s clean. Evan Miller famously wrote aboutthis in Four Days of Go,where he, amongst other things both good and bad, expresses his frustrationthat his code must be bereft of unused imports and variables before it willcompile. This makes just testing a quick fix a bit slower than usual. GivenGoogle’s cost structure, this makes sense: an extra few minutes a developerspends cleaning up the code saves a lot of money on CPU time later. Thisdoesn’t tend to frustrate me as much having some erroneous import orvariable which used to plague me when I was learning C. So all in all, itjust slows me down a bit.Go’s still a little young and the idea that you shouldn’t make breakingchanges in your library has not spread throughout the community a ton.go get simply fetches master of the repo. Without using somethird-party package manager (like my fave gpm),you’re stuck using master of everything. If someone breaks something,you’re spending your time debugging your integration with this bozo’s codeinstead of doing something interesting. That said, it’s nice that the“don’t break things” mantra is so strictly enforced as a byproduct of usingother libraries. We should stop breaking software so much.All In AllMy last few weeks writing Go every day have been marvelous. Our code is ofbetter quality, it’s more consistent, it’s faster, and we’re having fewerarguments about dumb shit like whether to use single quotes or doublequotes. Go gives you one way to do things – when working in anunpredictable, dynamic team environment, that’s a huge win.",
219
+ "content_html": "<p>Man, <a href=\"https://golang.org\">Go</a> is damn nice to work with. I figured I wouldhold off writing about it until after I had used it seriously at work for acouple weeks. We wrote a couple projects in Go that never really got offthe ground, but the one I have been spending most of my time on nowadays isgoing the full 400 meters to production.</p><h3 id=\"the-good\">The Good</h3><p>First, the good. Structure and organization are key for me when developing.If the structure of the code isn’t uniform, it makes it immensely difficultto work with. This is one reason I get really angry with Node – there’s nouniformity at all. <code class=\"highlighter-rouge\">gofmt</code> helps ease the tension between colleagues andmakes an easy case to follow “the Go way.” There are still tensions when itcomes to package organization but those arguments are fewer now. So interms of code cleanliness and organization, my inner OCD gives Go a bigthumbs up. And my inner peacemaker is grateful, too.</p><p>The Go community is a really vibrant one. If you log onto the <code class=\"highlighter-rouge\">#go-nuts</code>channel on IRC (Freenode), you’ll find lively conversation at all hours ofday. The golang-nuts mailing list is also a great place to ask questionsand to passively learn more about the language and its application invarious problem spaces. There are loads of talks by the Go Team at Googleas well; I would recommend talks by Rob Pike and Brad Fitzpatrick if you’reinterested in the technical deep-dives.</p><p>I come from a background of PHP, Ruby, and JavaScript, where types feellike an afterthought. Working with Go’s strict typing system has been areally nice ease into the world of strict types. I tried my hand at Rust alittle while ago and got so frustrated by the type system that I ended upputting it down. Go’s type system feels like one that helps you out ratherthan holds you back. It doesn’t have generics, but I barely remembergenerics from my Java days (oh, high school) so I don’t miss them much.Generally, I find a way for interfaces to satisfy that need if there is theneed for generics. At any rate, Go’s type system gives me confidence thatthere won’t be some silly type error at runtime (as long as I stay awayfrom the dreaded <code class=\"highlighter-rouge\">interface{}</code> non-type).</p><p>Working with a compiled language is also a really nice change. I can builda binary with <code class=\"highlighter-rouge\">go build</code> and ship that out to my production servers withouteven blinking. Hell, using <code class=\"highlighter-rouge\">scp</code> or <code class=\"highlighter-rouge\">rsync</code> to <em>deploy</em>?! You have thoseansible/capistrano folks weeping in their sleep. The compiler’s typechecking also really helps. If it builds, it probably runs – though itisn’t guaranteed that you hooked up all the bits correctly even if it doescompile. A file of empty methods is still valid in Go. At any rate, workingwith the compiler has been a marvelous change coming from Ruby andJavaScript where almost every error is a runtime error.</p><p>It’s hella fast. A sizable test suite will often run in less than 30seconds. The Rubyist in me was off hiding in the corner, hoping I wouldn’tnotice that a similarly-sized test suite in Ruby would take 3 or 4<em>minutes</em> to run. Beyond tests, there has been so much optimization in thecompiler to make Go as fast as humanly possible – obviously in Google’sbest interests because at their scale, every CPU millisecond counts.</p><p>Channels. Holy hell, channels are cool. Communicating between goroutinesusing channels instead of shared memory has changed my world for thebetter. If you don’t know what channels are, <a href=\"https://gobyexample.com/channels\">here’s a gentle introductionon Go By Example</a>.</p><p>I suppose there is more I could say here, but I imagine you’re satisfied</p><h3 id=\"the-frustrating\">The Frustrating</h3><p>I really, really miss <code class=\"highlighter-rouge\">Enumerable</code>. There’s no <code class=\"highlighter-rouge\">reduce</code>, no <code class=\"highlighter-rouge\">map</code> – noneof that. Just <code class=\"highlighter-rouge\">for</code> and a growable array type called a <code class=\"highlighter-rouge\">slice</code>. I waswriting Ruby last night and loved how concisely I could operate over largearrays. I suppose concision and speed are at war here, so at this point I’mnot too broken up about it. For every step made easier by Ruby, there’s a200ms overhead it seems.</p><p>Your code won’t compile unless it’s clean. Evan Miller famously wrote aboutthis in <a href=\"http://www.evanmiller.org/four-days-of-go.html\">Four Days of Go</a>,where he, amongst other things both good and bad, expresses his frustrationthat his code must be bereft of unused imports and variables before it willcompile. This makes just testing a quick fix a bit slower than usual. GivenGoogle’s cost structure, this makes sense: an extra few minutes a developerspends cleaning up the code saves a lot of money on CPU time later. Thisdoesn’t tend to frustrate me as much having some erroneous import orvariable which used to plague me when I was learning C. So all in all, itjust slows me down a bit.</p><p>Go’s still a little young and the idea that you shouldn’t make breakingchanges in your library has not spread throughout the community a ton.<code class=\"highlighter-rouge\">go get</code> simply fetches <code class=\"highlighter-rouge\">master</code> of the repo. Without using somethird-party package manager (like my fave <a href=\"https://github.com/pote/gpm\">gpm</a>),you’re stuck using <code class=\"highlighter-rouge\">master</code> of everything. If someone breaks something,you’re spending your time debugging your integration with this bozo’s codeinstead of doing something interesting. That said, it’s nice that the“don’t break things” mantra is so strictly enforced as a byproduct of usingother libraries. We should stop breaking software so much.</p><h3 id=\"all-in-all\">All In All</h3><p>My last few weeks writing Go every day have been marvelous. Our code is ofbetter quality, it’s more consistent, it’s faster, and we’re having fewerarguments about dumb shit like whether to use single quotes or doublequotes. Go gives you one way to do things – when working in anunpredictable, dynamic team environment, that’s a huge win.</p>",
220
+ "url": "https://byparker.com/blog/2015/working-with-go/",
221
+
222
+
223
+
224
+
225
+ "date_published": "2015-05-09T18:12:17+00:00",
226
+ "date_modified": "2015-05-09T18:12:17+00:00",
227
+ "author": {
228
+ "name": ""
229
+ }
230
+ },
231
+
232
+ {
233
+ "id": "https://byparker.com/blog/2015/thugs/",
234
+ "summary": "",
235
+ "content_text": "I am reminded of a quote I heard recently, given by Christopher Hitchens,where he states that to if one were to look at all politicians as ordinarypeople, one would find them to be thugs. But they are not ordinary people,he goes on, they are a wholly different kind of person; therefore, theycannot be judged as ordinary and cannot be classified as thugs.The latest two movies in my Netflix DVD queue were Inside Job and TheCorporation. The former discusses the 2008 financial collapse, whereas thelatter discusses the state of the corporation in America. While they bothseem thematically separate, they have a very interesting profound overlap.I was angry watching Inside Job. It really pissed me off to see recklessbehaviour without consequence and without remorse. To see the drunk driversof the financial industry speak as though they had done absolutely nothingwrong, whether legally or morally, set me off. I usually don’t attempt tointeract with movies much, save the laughter for comedic films and thestatements of disbelief for the stranger films, but in this case, I wasyelling at the screen, noticeably angry. These people had done wrong andcouldn’t give two shits about it.Thugs.I think The Corporation was a movie more of disbelief than anythingelse for me. America classifies a corporation as a legal person?Seriously?! So much of the film’s content left me flabbergasted. The writerof this film knew I would think this and systematically itemized thequalities of a corporation that separate it from normal personhood – thingslike empathy, remorse, reckless disregard for the welfare of theenvironment. Ask any CEO what they call how their company affects theenvironment, and they’ll say one word: “Externalities.” They write it offlike it’s someone else’s problem, accepting no responsibility for theiractions whatsoever.Thugs.It is shockingly clear that our political and economic systems cater to thewill and the benefit of these everyday thugs. Are they simply doing theirjobs? Are we holding them to the wrong standards?Ultimately, I disagree with Mr. Hitchens. All leaders, nay especiallyleaders, must be held to the same standard that the rest of our country’scitizens are. There are no excuses. The laws must reflect that whether it’sa CEO who caused the foreclosure of 200,000 homes through reckless tradingand predatory loans, or an 18-year-old kid who boosted a car, everyone mustdeal with the consequences of our actions.Think of the example this 2008 crisis sets: the key to being rich and(in)famous is to trade so recklessly that the government won’t let youfail, then at the right time, sail out with a multi-million dollarseverance package. Next time I hear someone complain about the youngergenerations not having enough self-responsibility, I’ll ask them who it wasthat created the world-wide financial disaster of 2008 and whether thesepeople have taken full responsibility for their actions.No, Mr. Hitchens, these people are thugs, and deserve that title, rapingand pillaging societal stability and equality for their own personal gain.Can humanity get more disgusting?",
236
+ "content_html": "<p>I am reminded of a quote I heard recently, given by Christopher Hitchens,where he states that to if one were to look at all politicians as ordinarypeople, one would find them to be thugs. But they are not ordinary people,he goes on, they are a wholly different kind of person; therefore, theycannot be judged as ordinary and cannot be classified as thugs.</p><p>The latest two movies in my Netflix DVD queue were <em>Inside Job</em> and <em>TheCorporation</em>. The former discusses the 2008 financial collapse, whereas thelatter discusses the state of the corporation in America. While they bothseem thematically separate, they have a very interesting profound overlap.</p><p>I was angry watching <em>Inside Job</em>. It really pissed me off to see recklessbehaviour without consequence and without remorse. To see the drunk driversof the financial industry speak as though they had done absolutely nothingwrong, whether legally or morally, set me off. I usually don’t attempt tointeract with movies much, save the laughter for comedic films and thestatements of disbelief for the stranger films, but in this case, I wasyelling at the screen, noticeably angry. These people had done wrong andcouldn’t give two shits about it.</p><p><em>Thugs.</em></p><p>I think <em>The Corporation</em> was a movie more of disbelief than anythingelse for me. America classifies a corporation as a legal person?Seriously?! So much of the film’s content left me flabbergasted. The writerof this film knew I would think this and systematically itemized thequalities of a corporation that separate it from normal personhood – thingslike empathy, remorse, reckless disregard for the welfare of theenvironment. Ask any CEO what they call how their company affects theenvironment, and they’ll say one word: “Externalities.” They write it offlike it’s someone else’s problem, accepting no responsibility for theiractions whatsoever.</p><p><em>Thugs.</em></p><p>It is shockingly clear that our political and economic systems cater to thewill and the benefit of these everyday thugs. Are they simply doing theirjobs? Are we holding them to the wrong standards?</p><p>Ultimately, I disagree with Mr. Hitchens. All leaders, nay <em>especially</em>leaders, <em>must</em> be held to the same standard that the rest of our country’scitizens are. There are no excuses. The laws must reflect that whether it’sa CEO who caused the foreclosure of 200,000 homes through reckless tradingand predatory loans, or an 18-year-old kid who boosted a car, everyone mustdeal with the consequences of our actions.</p><p>Think of the example this 2008 crisis sets: the key to being rich and(in)famous is to trade so recklessly that the government won’t let youfail, then at the right time, sail out with a multi-million dollarseverance package. Next time I hear someone complain about the youngergenerations not having enough self-responsibility, I’ll ask them who it wasthat created the world-wide financial disaster of 2008 and whether thesepeople have taken full responsibility for their actions.</p><p>No, Mr. Hitchens, these people <em>are</em> thugs, and deserve that title, rapingand pillaging societal stability and equality for their own personal gain.Can humanity get more disgusting?</p>",
237
+ "url": "https://byparker.com/blog/2015/thugs/",
238
+
239
+
240
+
241
+
242
+ "date_published": "2015-03-03T07:33:46+00:00",
243
+ "date_modified": "2015-03-03T07:33:46+00:00",
244
+ "author": {
245
+ "name": ""
246
+ }
247
+ },
248
+
249
+ {
250
+ "id": "https://byparker.com/blog/2015/language-agnostic-interfaces-for-software-development/",
251
+ "summary": "",
252
+ "content_text": "Don’t let the title fool you, the concept here is simple: provide simplescripts in your repositories so – no matter the language or tools used –a newcomer to the code base can get started quickly and easily.This is an idea I picked up from GitHub – they use it heavily throughoutthe company and in their open source projects. I have expanded on this abit and proposed it to my colleagues at VSCO. With sometweaking, we now have the following in almost all our projects my teamworks on: script/bootstrap script/build script/test script/cibuild script/serverFirst, script/bootstrap installs dependencies and gets your projectready for development. In a Ruby project, this would be bundle install.In a Go project, this might be a series of go get calls.Next, script/build builds your project. This ranges depending uponthe project. For a mobile app, it would be the compile &amp;amp; build step. For awebsite, it might be the minification step for your assets. If you’rerunning Jekyll, this would be equivalent to jekyllbuild.Then you have script/test. This runs your test suite, whatever it maybe. Notably, this step does not include setting up for tests, unless it’srequired for every single test run. Usually it’s just a call to rspec,mocha, or what have you.Naturally, script/cibuild follows. It’s used to setup and execute alltests. This could be seeding a database, running a linter, whatever. Itshould only pass if the code is production-ready.Last, we have script/server. My team works primarily on servertechnology, so this is of crucial importance to us. This allows one to runthe server for development purposes. It’s usually not used in production,but could easily be incorporated if another server (e.g. nginx or apache)weren’t being used.These scripts have saved us a lot of frustration, and a lot of timefighting with package managers, test suites, etc. The best part is thatwhen you clone a repo, you know immediately how to get started,regardless of the language.I have put these in most of my actively-maintained open source repos thatrequire these steps, projects like Jekyll (and its components), as well assome Golang servers I have built including gossipand ping.We see the power of common, language-agnostic interfaces all the time.Automating the installation from source of many packages is as simple aswget, tar, ./configure, make, make install. It’s not super easy the firsttime, but once you learn it, you have access to hundreds of utilities thathaven’t been added to your package manager for one reason or another.Language-agnostic interface scripts like what I describe above are allabout making it easier – reducing friction – to develop and iterate onsoftware. Try it out in your projects and see how much time and frustrationyou can save just by hiding project-level complexity.",
253
+ "content_html": "<p>Don’t let the title fool you, the concept here is simple: provide simplescripts in your repositories so – no matter the language or tools used –a newcomer to the code base can get started quickly and easily.</p><p>This is an idea I picked up from GitHub – they use it heavily throughoutthe company and in their open source projects. I have expanded on this abit and proposed it to my colleagues at <a href=\"https://vsco.co\">VSCO</a>. With sometweaking, we now have the following in almost all our projects my teamworks on:</p><ol> <li><code class=\"highlighter-rouge\">script/bootstrap</code></li> <li><code class=\"highlighter-rouge\">script/build</code></li> <li><code class=\"highlighter-rouge\">script/test</code></li> <li><code class=\"highlighter-rouge\">script/cibuild</code></li> <li><code class=\"highlighter-rouge\">script/server</code></li></ol><p>First, <strong><code class=\"highlighter-rouge\">script/bootstrap</code></strong> installs dependencies and gets your projectready for development. In a Ruby project, this would be <code class=\"highlighter-rouge\">bundle install</code>.In a Go project, this might be a series of <code class=\"highlighter-rouge\">go get</code> calls.</p><p>Next, <strong><code class=\"highlighter-rouge\">script/build</code></strong> builds your project. This ranges depending uponthe project. For a mobile app, it would be the compile &amp; build step. For awebsite, it might be the minification step for your assets. If you’rerunning <a href=\"http://jekyllrb.com\">Jekyll</a>, this would be equivalent to <code class=\"highlighter-rouge\">jekyllbuild</code>.</p><p>Then you have <strong><code class=\"highlighter-rouge\">script/test</code></strong>. This runs your test suite, whatever it maybe. Notably, this step does not include setting up for tests, unless it’srequired for every single test run. Usually it’s just a call to <code class=\"highlighter-rouge\">rspec</code>,<code class=\"highlighter-rouge\">mocha</code>, or what have you.</p><p>Naturally, <strong><code class=\"highlighter-rouge\">script/cibuild</code></strong> follows. It’s used to setup and execute alltests. This could be seeding a database, running a linter, whatever. Itshould only pass if the code is production-ready.</p><p>Last, we have <strong><code class=\"highlighter-rouge\">script/server</code></strong>. My team works primarily on servertechnology, so this is of crucial importance to us. This allows one to runthe server for development purposes. It’s usually not used in production,but could easily be incorporated if another server (e.g. nginx or apache)weren’t being used.</p><p>These scripts have saved us a lot of frustration, and a lot of timefighting with package managers, test suites, etc. The best part is thatwhen you clone a repo, you know <em>immediately</em> how to get started,regardless of the language.</p><p>I have put these in most of my actively-maintained open source repos thatrequire these steps, projects like Jekyll (and its components), as well assome Golang servers I have built including <a href=\"https://github.com/parkr/gossip\">gossip</a>and <a href=\"https://github.com/parkr/ping\">ping</a>.</p><p>We see the power of common, language-agnostic interfaces all the time.Automating the installation from source of many packages is as simple aswget, tar, ./configure, make, make install. It’s not super easy the firsttime, but once you learn it, you have access to hundreds of utilities thathaven’t been added to your package manager for one reason or another.</p><p>Language-agnostic interface scripts like what I describe above are allabout making it easier – reducing friction – to develop and iterate onsoftware. Try it out in your projects and see how much time and frustrationyou can save just by hiding project-level complexity.</p>",
254
+ "url": "https://byparker.com/blog/2015/language-agnostic-interfaces-for-software-development/",
255
+
256
+
257
+
258
+
259
+ "date_published": "2015-01-24T06:47:30+00:00",
260
+ "date_modified": "2015-01-24T06:47:30+00:00",
261
+ "author": {
262
+ "name": ""
263
+ }
264
+ },
265
+
266
+ {
267
+ "id": "https://byparker.com/blog/2015/ruhe/",
268
+ "summary": "",
269
+ "content_text": "Ruhe is one of my favourite German words. It means “quiet,” “still,” and“calm.” I think my most oft used German phrase could be, “Bitte, lass michin Ruhe.”I find the quiet compelling, the stillness electrifying every neuron in mybrain to a deeply pensive state. My ability to create is enhanced. Withoutnoise, without interruption, my mind is free to work. This is one reasonsome of my best work happens at night. Free from distraction, I amliberated from my limitations by this pervasive, beautiful Ruhe. All iscalm.Humans may be naturally social beings, but this doesn’t hold true to thesame degree for each of us. Our ability to think profoundly in the presenceof our peers’ gesticulations is not a solved matter. For some, such asmyself, we require an utter sense of Ruhe, an escape from cohabitation,in order to effectively contribute. But this requirement has become muchmore difficult since the dawn of wireless communication, both telephonicand beyond.My quest is to find calm in every-day places — finding silence in the din.Ruhe ist nicht ein Geist der Vergangenheit. Die ist überall — manmuss nur sie finden.",
270
+ "content_html": "<p><em>Ruhe</em> is one of my favourite German words. It means “quiet,” “still,” and“calm.” I think my most oft used German phrase could be, “Bitte, lass michin Ruhe.”</p><p>I find the quiet compelling, the stillness electrifying every neuron in mybrain to a deeply pensive state. My ability to create is enhanced. Withoutnoise, without interruption, my mind is free to work. This is one reasonsome of my best work happens at night. Free from distraction, I amliberated from my limitations by this pervasive, beautiful <em>Ruhe.</em> All iscalm.</p><p>Humans may be naturally social beings, but this doesn’t hold true to thesame degree for each of us. Our ability to think profoundly in the presenceof our peers’ gesticulations is not a solved matter. For some, such asmyself, we require an utter sense of <em>Ruhe,</em> an escape from cohabitation,in order to effectively contribute. But this requirement has become muchmore difficult since the dawn of wireless communication, both telephonicand beyond.</p><p>My quest is to find calm in every-day places — finding silence in the din.Ruhe ist nicht ein Geist der Vergangenheit. Die ist überall — manmuss nur sie finden.</p>",
271
+ "url": "https://byparker.com/blog/2015/ruhe/",
272
+
273
+
274
+
275
+
276
+ "date_published": "2015-01-07T08:13:09+00:00",
277
+ "date_modified": "2015-01-07T08:13:09+00:00",
278
+ "author": {
279
+ "name": ""
280
+ }
281
+ },
282
+
283
+ {
284
+ "id": "https://byparker.com/blog/2014/ruby-2-2-0-time-parse-localtime-regression/",
285
+ "summary": "",
286
+ "content_text": "I was working on adding Ruby 2.2 support to Jekyll, and discovered that thetest we have for the timezone option was failing, seemingly inexplicably.After some meandering through the Ruby source code and ChangeLog todetermine if the TZ variable was being respected differently, I foundno references explicitly to this change. When I walked through how Jekylluses Time#parse in IRB, I discovered what looks like a pretty majorchange in 2.2.In Ruby 2.1, the timezone is converted to the local time (set with the TZenvironment variable) automatically:&amp;gt;&amp;gt; require 'time'=&amp;gt; true&amp;gt;&amp;gt; ENV['TZ'] = 'Australia/Melbourne'=&amp;gt; &quot;Australia/Melbourne&quot;&amp;gt;&amp;gt; Time.parse(&quot;2014-12-29 20:16:32 -0400&quot;)=&amp;gt; 2014-12-30 11:16:32 +1100But in Ruby 2.2, this was not the case:&amp;gt;&amp;gt; require 'time'=&amp;gt; true&amp;gt;&amp;gt; ENV['TZ'] = 'Australia/Melbourne'=&amp;gt; &quot;Australia/Melbourne&quot;&amp;gt;&amp;gt; Time.parse(&quot;2014-12-29 20:16:32 -0400&quot;)=&amp;gt; 2014-12-29 20:16:32 -0400 # &amp;lt;== !!! Timezone remains unchanged.&amp;gt;&amp;gt; Time.parse(&quot;2014-12-29 20:16:32 -0400&quot;).localtime=&amp;gt; 2014-12-30 11:16:32 +1100Go update your gems! Go update your applications! Append #localtime callsanywhere you use Time#parse and want your system timezone respected.Tangent.Nobu rejected the above issue I filed, calling this change a bug fix. OK,that seemed weird to me but I could see how this might cause unintendedconsequences. I asked for a link to the issue that contains the discussionand patches for this change in behaviour. Akira wrote back, saying thatthere wasn’t one, but that the change was inspired by another bug.And so ensued the most disheartening experience in my Ruby existence.Issue #9794, the issue Akira referenced, is a bug report filed by a guynamed Felipe Contreras. It discusses a discrepancy between Time andDateTime in the #strptime method. While Time.strptime respectstimezones when parsing with &quot;%s %z&quot;, DateTime.strptime does not.I was looking for a revision which would explain my predicament and endedup reading through the comments, many of which were in Japanese (thanks andno thanks to Google Translate that did very little to help decipher them).One of the comments referenced Issue #7445,which is basically identical to the #9794. Hmm, weird. It turns out thatFelipe filed #7445 about 2 years ago, couldn’t get his point across toTadayoshi so Tadayoshi just marked it as Rejected and moved on. Felipe,understandably, was frustrated by this. He refiled a year and a half lateras #9794 and the argument, again, ensued. It was even discussed over themailing list.Eventually, after Matz stepped in and called it a ‘feature’, Tadayoshi wroteR45822,a patch for this behaviour. He included an unnecessarily snarky commit message: a new feature (not a bug fix) of strptime. applies offset even if thegiven date is not local time (%s and %Q). This is an exceptional featureand I do NOT recommend to use this at all. Thank you git community.Wow. Tadayoshi was rude, Felipe was rude, and the apparent disinterest infinding a common language was excruciating. Comments flew by one another,Felipe’s in English, others’ in Japanese. Tadayoshi ignored Felipe’srequests to use English. Felipe dismissed Japanese as unacceptable for an“international project”, assuming it must use the Lingua franca of Englishjust because it crosses nation-state borders.So it seems my problem arose from communication barriers, intensefrustration over inconsistency and the apparent lack of ability to seethis. And our result: a breaking change between MINOR versions of Ruby,violating SemVer. Ugh.",
287
+ "content_html": "<p>I was working on adding Ruby 2.2 support to Jekyll, and discovered that thetest we have for the <code class=\"highlighter-rouge\">timezone</code> option was failing, seemingly inexplicably.After some meandering through the Ruby source code and ChangeLog todetermine if the <code class=\"highlighter-rouge\">TZ</code> variable was being respected differently, I foundno references explicitly to this change. When I walked through how Jekylluses <code class=\"highlighter-rouge\">Time#parse</code> in IRB, I discovered what looks like <a href=\"https://bugs.ruby-lang.org/issues/10677\">a pretty majorchange in 2.2</a>.</p><p>In Ruby 2.1, the timezone is converted to the local time (set with the <code class=\"highlighter-rouge\">TZ</code>environment variable) automatically:</p><figure class=\"highlight\"><pre><code class=\"language-ruby\" data-lang=\"ruby\"><span class=\"o\">&gt;&gt;</span> <span class=\"nb\">require</span> <span class=\"s1\">'time'</span><span class=\"o\">=&gt;</span> <span class=\"kp\">true</span><span class=\"o\">&gt;&gt;</span> <span class=\"no\">ENV</span><span class=\"p\">[</span><span class=\"s1\">'TZ'</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">'Australia/Melbourne'</span><span class=\"o\">=&gt;</span> <span class=\"s2\">\"Australia/Melbourne\"</span><span class=\"o\">&gt;&gt;</span> <span class=\"no\">Time</span><span class=\"p\">.</span><span class=\"nf\">parse</span><span class=\"p\">(</span><span class=\"s2\">\"2014-12-29 20:16:32 -0400\"</span><span class=\"p\">)</span><span class=\"o\">=&gt;</span> <span class=\"mi\">2014</span><span class=\"o\">-</span><span class=\"mi\">12</span><span class=\"o\">-</span><span class=\"mi\">30</span> <span class=\"mi\">11</span><span class=\"p\">:</span><span class=\"mi\">16</span><span class=\"p\">:</span><span class=\"mi\">32</span> <span class=\"o\">+</span><span class=\"mi\">1100</span></code></pre></figure><p>But in Ruby 2.2, this was not the case:</p><figure class=\"highlight\"><pre><code class=\"language-ruby\" data-lang=\"ruby\"><span class=\"o\">&gt;&gt;</span> <span class=\"nb\">require</span> <span class=\"s1\">'time'</span><span class=\"o\">=&gt;</span> <span class=\"kp\">true</span><span class=\"o\">&gt;&gt;</span> <span class=\"no\">ENV</span><span class=\"p\">[</span><span class=\"s1\">'TZ'</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">'Australia/Melbourne'</span><span class=\"o\">=&gt;</span> <span class=\"s2\">\"Australia/Melbourne\"</span><span class=\"o\">&gt;&gt;</span> <span class=\"no\">Time</span><span class=\"p\">.</span><span class=\"nf\">parse</span><span class=\"p\">(</span><span class=\"s2\">\"2014-12-29 20:16:32 -0400\"</span><span class=\"p\">)</span><span class=\"o\">=&gt;</span> <span class=\"mi\">2014</span><span class=\"o\">-</span><span class=\"mi\">12</span><span class=\"o\">-</span><span class=\"mi\">29</span> <span class=\"mi\">20</span><span class=\"p\">:</span><span class=\"mi\">16</span><span class=\"p\">:</span><span class=\"mi\">32</span> <span class=\"o\">-</span><span class=\"mo\">0400</span> <span class=\"c1\"># &lt;== !!! Timezone remains unchanged.</span><span class=\"o\">&gt;&gt;</span> <span class=\"no\">Time</span><span class=\"p\">.</span><span class=\"nf\">parse</span><span class=\"p\">(</span><span class=\"s2\">\"2014-12-29 20:16:32 -0400\"</span><span class=\"p\">).</span><span class=\"nf\">localtime</span><span class=\"o\">=&gt;</span> <span class=\"mi\">2014</span><span class=\"o\">-</span><span class=\"mi\">12</span><span class=\"o\">-</span><span class=\"mi\">30</span> <span class=\"mi\">11</span><span class=\"p\">:</span><span class=\"mi\">16</span><span class=\"p\">:</span><span class=\"mi\">32</span> <span class=\"o\">+</span><span class=\"mi\">1100</span></code></pre></figure><p>Go update your gems! Go update your applications! <strong>Append <code class=\"highlighter-rouge\">#localtime</code> callsanywhere you use <code class=\"highlighter-rouge\">Time#parse</code> and want your system timezone respected.</strong></p><p><em>Tangent.</em></p><p>Nobu rejected the above issue I filed, calling this change a bug fix. OK,that seemed weird to me but I could see how this might cause unintendedconsequences. I asked for a link to the issue that contains the discussionand patches for this change in behaviour. Akira wrote back, saying thatthere wasn’t one, but that the change was inspired by <a href=\"https://bugs.ruby-lang.org/issues/9794\">another bug</a>.</p><p>And so ensued the most disheartening experience in my Ruby existence.Issue #9794, the issue Akira referenced, is a bug report filed by a guynamed Felipe Contreras. It discusses a discrepancy between <code class=\"highlighter-rouge\">Time</code> and<code class=\"highlighter-rouge\">DateTime</code> in the <code class=\"highlighter-rouge\">#strptime</code> method. While <code class=\"highlighter-rouge\">Time.strptime</code> respectstimezones when parsing with <code class=\"highlighter-rouge\">\"%s %z\"</code>, <code class=\"highlighter-rouge\">DateTime.strptime</code> does not.I was looking for a revision which would explain my predicament and endedup reading through the comments, many of which were in Japanese (thanks andno thanks to Google Translate that did very little to help decipher them).</p><p>One of the comments referenced <a href=\"https://bugs.ruby-lang.org/issues/7445\">Issue #7445</a>,which is basically identical to the #9794. Hmm, weird. It turns out thatFelipe filed #7445 about 2 years ago, couldn’t get his point across toTadayoshi so Tadayoshi just marked it as <code class=\"highlighter-rouge\">Rejected</code> and moved on. Felipe,understandably, was frustrated by this. He refiled a year and a half lateras #9794 and the argument, again, ensued. It was even <a href=\"http://article.gmane.org/gmane.comp.lang.ruby.general/371471\">discussed over themailing list</a>.Eventually, after Matz stepped in and called it a ‘feature’, Tadayoshi wrote<a href=\"https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/45822\">R45822</a>,a patch for this behaviour. He included an unnecessarily snarky commit message:</p><blockquote> <p>a new feature (not a bug fix) of strptime. applies offset even if thegiven date is not local time (%s and %Q). This is an exceptional featureand I do NOT recommend to use this at all. Thank you git community.</p></blockquote><p>Wow. Tadayoshi was rude, Felipe was rude, and the apparent disinterest infinding a common language was excruciating. Comments flew by one another,Felipe’s in English, others’ in Japanese. Tadayoshi ignored Felipe’srequests to use English. Felipe dismissed Japanese as unacceptable for an“international project”, assuming it must use the <em>Lingua franca</em> of Englishjust because it crosses nation-state borders.</p><p>So it seems my problem arose from communication barriers, intensefrustration over inconsistency and the apparent lack of ability to seethis. And our result: a breaking change between MINOR versions of Ruby,violating SemVer. Ugh.</p>",
288
+ "url": "https://byparker.com/blog/2014/ruby-2-2-0-time-parse-localtime-regression/",
289
+
290
+
291
+
292
+
293
+ "date_published": "2014-12-30T01:14:49+00:00",
294
+ "date_modified": "2014-12-30T01:14:49+00:00",
295
+ "author": {
296
+ "name": ""
297
+ }
298
+ },
299
+
300
+ {
301
+ "id": "https://byparker.com/blog/2014/moral-authority/",
302
+ "summary": "",
303
+ "content_text": "If you’ve every been told “you’re one to talk,” then you understand theimportance of moral authority in giving advice and offering leadership.What the Senate Report on the CIA’s Detainment and Interrogation Policies of the last decadetold me is that the United States of America has gone to extreme measuresto protect its security, and that these extreme measures have irreparablydamaged the U.S.’s moral authority.The kind of soft power that moral authority offers is not very cheap andtakes decades to build up. It’s about trust. It’s about consistency of wordand deed. America has failed to live up to its obligations to its owncitizens, and to its international partners.Soon, China will become the global hegemon. The interests of the Chinesewill direct the world’s stance on many issues, including trade, politicaldissonance suppression, and war. America will continue to fall intoobscurity, and other countries will continue distancing themselves from us.The weight of the United States will no longer matter nearly as much as itdid in the last 90 years. This could have been avoided if we had not beenso quick to erode our moral authority. Unfortunately, since Vietnam, ourmoral authority has been eroding, slowly but surely. Now, it is at itslowest point in the last 150 years.I, for one, am disgusted by most of what our government does, what itstands for, and the double-standard it lives by. If you follow the news,the tyranny in it all is plain to see: the big bucks political donors haveeven more control over the government than they did yesterday, the policeforces around the country continue to brutalize the citizens they purportto protect, the NSA reads and retains our every online communicationespecially if it is encrypted, and the CIA gets away with the mostdespicable, deplorable acts any human can convey upon another. It should beapparent to any onlooker that the moral legitimacy of the U.S. has collapsed.Much of the world regards America with resentment unparalleled. If anyonewere curious as to the reason, I believe the aforementioned does indeedshed some light on that matter.The behaviour is inexcusable, and I am pleased that these actions will bemet with contempt by the international community.",
304
+ "content_html": "<p>If you’ve every been told “you’re one to talk,” then you understand theimportance of moral authority in giving advice and offering leadership.</p><p>What the <a href=\"http://www.intelligence.senate.gov/sites/default/files/publications/CRPT-113srpt288.pdf\">Senate Report on the CIA’s Detainment and Interrogation Policies of the last decade</a>told me is that the United States of America has gone to extreme measuresto protect its security, and that these extreme measures have irreparablydamaged the U.S.’s moral authority.</p><p>The kind of soft power that moral authority offers is not very cheap andtakes decades to build up. It’s about trust. It’s about consistency of wordand deed. America has failed to live up to its obligations to its owncitizens, and to its international partners.</p><p>Soon, China will become the global hegemon. The interests of the Chinesewill direct the world’s stance on many issues, including trade, politicaldissonance suppression, and war. America will continue to fall intoobscurity, and other countries will continue distancing themselves from us.The weight of the United States will no longer matter nearly as much as itdid in the last 90 years. This could have been avoided if we had not beenso quick to erode our moral authority. Unfortunately, since Vietnam, ourmoral authority has been eroding, slowly but surely. Now, it is at itslowest point in the last 150 years.</p><p>I, for one, am disgusted by most of what our government does, what itstands for, and the double-standard it lives by. If you follow the news,the tyranny in it all is plain to see: the big bucks political donors haveeven <em>more</em> control over the government than they did yesterday, the policeforces around the country continue to brutalize the citizens they purportto protect, the NSA reads and retains our every online communication<em>especially</em> if it is encrypted, and the CIA gets away with the mostdespicable, deplorable acts any human can convey upon another. It should beapparent to any onlooker that the moral legitimacy of the U.S. has collapsed.</p><p>Much of the world regards America with resentment unparalleled. If anyonewere curious as to the reason, I believe the aforementioned does indeedshed some light on that matter.</p><p>The behaviour is inexcusable, and I am pleased that these actions will bemet with contempt by the international community.</p>",
305
+ "url": "https://byparker.com/blog/2014/moral-authority/",
306
+
307
+
308
+
309
+
310
+ "date_published": "2014-12-12T00:00:00+00:00",
311
+ "date_modified": "2014-12-12T00:00:00+00:00",
312
+ "author": {
313
+ "name": ""
314
+ }
315
+ },
316
+
317
+ {
318
+ "id": "https://byparker.com/blog/2014/jekyll-3-the-road-ahead/",
319
+ "summary": "",
320
+ "content_text": "First, I want to say that I have been blown away by the massive support from the Jekyllcommunity for me and for the project in ways innumerable. Every pull request reinvigoratesme to continue driving Jekyll forward as swiftly as possible. Even if I don’t accept thePR, room for improvement in the eyes of at least one user is enlightening and helps driveeach decision the Core Team makes. Thank you for your support, for your patience, andfor your continued excitement about Jekyll.We held a townhall-type Google Hangout meeting yesterday. It’s about an hour and goes intomuch more depth than what I will say here. We’ll be hosting more,tentatively on a monthly basis.Now, on to business.Jekyll 2.0 was a pretty big release.Last May, we announced Collections, native Sass support, YAML front matter defaults,and many other improvements and fixes in our effort to make Jekyll the best tool for makingstatic websites.With Jekyll 3.0, I want to take Jekyll back to its roots: simplicity, extensibility, and speed.1. SimplicityUsing JekyllJekyll should be easy to use, and problems should be easy to address. Cryptic warning messagesshould instead be replaced by coherent, direct verbiage. Creation of new content should be aseasy as running jekyll generate (and jekyll g for the truly lazy :wink:). Any changes weintroduce which are backwards-incompatible should be accompanied with a compatibility layerand a clear, direct deprecation message. We should be doing everything we can to ensure thatthe path to accomplishing a particular goal in Jekyll has as few steps as possible and is asstupid simple as possible.Key to this is that Jekyll is a content creation and publishing tool, and therefore should befocused on making creating and publishing as easy and direct as possible. Sane defaults pairedwith optional flexibility allow for the best possible mixture of customizability and out-of-the-boxfunctionality.Installing JekyllIf you’ve ever installed Jekyll, you know what it takes to get that beast up and running:Python, Ruby, usually a Ruby Version Manager, Ruby development headers, Xcode on the Mac,Node, etc. There are a lot of dependencies.I’d like to focus on: Removing most defaults, giving you just what you need for the average site Removing dependencies on other languages/runtimes – leaving just a couple C extensions Integration with Liquid C as optional for performance gains Simplifying the internals and the abstractions (posts will become a collection)2. ExtensibilitySometimes, Jekyll just doesn’t cut it. The core components work fine, but you have aparticular use-case that requires an extension to Jekyll. As of right now, you caneither write a Converter, Liquid Tag or a Generator. That’s it. But what if you couldhook into various parts of the pipeline, as your content is turned into a static site?What if you could create your own hooks? With Jekyll 3, we’re reimagining the plugininterface, while maintaining the old interfaces.To accomplish this, we’ll be writing new feature ideas as plugins andshipping them separate from the rest of Jekyll. If they are useful to thevast majority of users (&amp;gt; 85%), then we’d include that plugin as a runtimedependency. Nevertheless, the core idea here is that in order to create thebest possible plugin system, we need to be using it ourselves and iterating.I have been heavily influenced by the work of Brandon Mathis, the creator of Octopress.He managed to work around all the warts and pain points of Jekyll to create a fantasticdevelopment experience. I’d love to incorporate some of his ideas, like Octopress::Hooks,into Jekyll 3 so that everyone can take advantage of a hook-based plugin architecture.3. SpeedJekyll can be slow. Some blame Ruby, others blame Liquid – needless to say, there’splenty of blame to go around. 3.0 will feature some extraordinary speed-ups, with(optional) Liquid-C integration, incremental regeneration and optimized object handling.We’re running benchmarks on every piece of code we can think of to try to find ways tospeed up the generation process.So there are my thoughts on Jekyll 3’s driving principles. I’d love to see you around,and hear from you either on GitHub or at my personal Twitter account.We’re also going to try to put out more official video and written content.Our documentation website can use a lot of work. If you have the time, itwould be fantastic if you could pick a page and rewrite portions of it orrestructure it altogether to make it even more helpful. Submit those pullrequests to the master branch – the jekyllrb.com site source can be foundin the site/ folder on master.We have Jekyll 4.0 plans in the works as well (they were 3.0 plans… long story),and those are even grander, and I can’t wait to share them with you all.Happy Jekylling!",
321
+ "content_html": "<p>First, I want to say that I have been blown away by the massive support from the Jekyllcommunity for me and for the project in ways innumerable. Every pull request reinvigoratesme to continue driving Jekyll forward as swiftly as possible. Even if I don’t accept thePR, room for improvement in the eyes of at least one user is enlightening and helps driveeach decision the Core Team makes. <em>Thank you</em> for your support, for your patience, andfor your continued excitement about Jekyll.</p><p>We held <a href=\"https://www.youtube.com/watch?v=vZbvHsY1Oa8\">a townhall-type Google Hangout meeting</a> yesterday. It’s about an hour and goes intomuch more depth than what I will say here. <a href=\"https://github.com/jekyll/jekyll/issues/3190\">We’ll be hosting more</a>,tentatively on a monthly basis.</p><p>Now, on to business.</p><p><a href=\"http://jekyllrb.com/news/2014/05/06/jekyll-turns-2-0-0/\">Jekyll 2.0 was a pretty big release</a>.Last May, we announced Collections, native Sass support, YAML front matter defaults,and many other improvements and fixes in our effort to make Jekyll the best tool for makingstatic websites.</p><p><strong>With Jekyll 3.0, I want to take Jekyll back to its roots: simplicity, extensibility, and speed.</strong></p><h2 id=\"1-simplicity\">1. Simplicity</h2><h3 id=\"using-jekyll\">Using Jekyll</h3><p>Jekyll should be easy to use, and problems should be easy to address. Cryptic warning messagesshould instead be replaced by coherent, direct verbiage. Creation of new content should be aseasy as running <code class=\"highlighter-rouge\">jekyll generate</code> (and <code class=\"highlighter-rouge\">jekyll g</code> for the truly lazy :wink:). Any changes weintroduce which are backwards-incompatible should be accompanied with a compatibility layerand a clear, direct deprecation message. We should be doing everything we can to ensure thatthe path to accomplishing a particular goal in Jekyll has as few steps as possible and is asstupid simple as possible.</p><p>Key to this is that Jekyll is a content creation and publishing tool, and therefore should befocused on making creating and publishing as easy and direct as possible. Sane defaults pairedwith optional flexibility allow for the best possible mixture of customizability and out-of-the-boxfunctionality.</p><h3 id=\"installing-jekyll\">Installing Jekyll</h3><p>If you’ve ever installed Jekyll, you know what it takes to get that beast up and running:Python, Ruby, usually a Ruby Version Manager, Ruby development headers, Xcode on the Mac,Node, etc. There are a <em>lot</em> of dependencies.</p><p>I’d like to focus on:</p><ul> <li>Removing most defaults, giving you just what you need for the average site</li> <li>Removing dependencies on other languages/runtimes – leaving just a couple C extensions</li> <li>Integration with Liquid C as optional for performance gains</li> <li>Simplifying the internals and the abstractions (posts will become a collection)</li></ul><h2 id=\"2-extensibility\">2. Extensibility</h2><p>Sometimes, Jekyll just doesn’t cut it. The core components work fine, but you have aparticular use-case that requires an extension to Jekyll. As of right now, you caneither write a Converter, Liquid Tag or a Generator. That’s it. But what if you couldhook into various parts of the pipeline, as your content is turned into a static site?What if you could create your own hooks? With Jekyll 3, we’re reimagining the plugininterface, while maintaining the old interfaces.</p><p>To accomplish this, we’ll be writing new feature ideas as plugins andshipping them separate from the rest of Jekyll. If they are useful to thevast majority of users (&gt; 85%), then we’d include that plugin as a runtimedependency. Nevertheless, the core idea here is that in order to create thebest possible plugin system, we need to be using it ourselves and iterating.</p><p>I have been heavily influenced by the work of Brandon Mathis, the creator of Octopress.He managed to work around all the warts and pain points of Jekyll to create a fantasticdevelopment experience. I’d love to incorporate some of his ideas, like <code class=\"highlighter-rouge\">Octopress::Hooks</code>,into Jekyll 3 so that everyone can take advantage of a hook-based plugin architecture.</p><h2 id=\"3-speed\">3. Speed</h2><p>Jekyll can be slow. Some blame Ruby, others blame Liquid – needless to say, there’splenty of blame to go around. 3.0 will feature some extraordinary speed-ups, with(optional) Liquid-C integration, incremental regeneration and optimized object handling.We’re running benchmarks on every piece of code we can think of to try to find ways tospeed up the generation process.</p><hr /><p>So there are my thoughts on Jekyll 3’s driving principles. I’d love to <a href=\"https://github.com/jekyll/jekyll/issues\">see you around</a>,and hear from you either on GitHub or at <a href=\"https://web.archive.org/web/20141130040023/https://twitter.com/parkr\">my personal Twitter account</a>.</p><p>We’re also going to try to put out more official video and written content.Our documentation website can use a lot of work. If you have the time, itwould be fantastic if you could pick a page and rewrite portions of it orrestructure it altogether to make it even more helpful. Submit those pullrequests to the master branch – the jekyllrb.com site source can be foundin the <code class=\"highlighter-rouge\">site/</code> folder on <code class=\"highlighter-rouge\">master</code>.</p><p>We have Jekyll 4.0 plans in the works as well (they were 3.0 plans… long story),and those are even grander, and I can’t wait to share them with you all.</p><p>Happy Jekylling!</p>",
322
+ "url": "https://byparker.com/blog/2014/jekyll-3-the-road-ahead/",
323
+
324
+
325
+
326
+
327
+ "date_published": "2014-12-06T08:27:19+00:00",
328
+ "date_modified": "2014-12-06T08:27:19+00:00",
329
+ "author": {
330
+ "name": ""
331
+ }
332
+ },
333
+
334
+ {
335
+ "id": "https://byparker.com/blog/2014/citizenfour/",
336
+ "summary": "",
337
+ "content_text": "I guess I’m on sort of a movie kick.This movie is like no other I have ever seen. It is, simply, a chronologyof how the revelations about the NSA unfolded: how Ed (Snowden) firstcontacted Poitras and Greenwald; how Ed met them in Hong Kong; morefirst-hand details about how Ed came to the decision and the steps he tookto secure his person, his family and girlfriend, and to deliver the data tothe journalists. It interests me from a citizen perspective, and from atechnology perspective.The revelations are much more palpable in the theatre. To hear Ed and Glennprepare to reveal and post these stories is incredible. To see Ed in hishotel room, listening to the news about what he revealed is inconceivable.It really puts a human face on the issue, wrought with emotionalfrustration, principled anger and tantalizing fear that nothing will comeof it.The human rights lawyers, all gathered in a room in Berlin to discuss theissue is very interesting as well. The lawyer that whisks Ed away to safetyin Hong Kong – I can only imagine the courage and care that went into hisevery move. The thought that the law of the land – The Espionage Act of1917 – did not differentiate between a spy and a whistleblower isunthinkable. The help that the Assange of WikiLeaks provided wasincredible – to see so many powerful people all around the world rallybehind Ed was incredible to see.Think about the magnitude of this act. To reveal the secret inner-workingsof a tyrant. A tyrannical system that wants nothing but to beat any dissentthose it oppresses can muster. Its unilateral and singular mission is todetect threats to itself and its parent (the country) and deconstruct thethreat’s viability piece by piece. The NSA is not an organization that willgo down easily.The film leaves me wondering whether I value my own privacy. I have usedGoogle’s Mail since it came out in beta when I was in the 7th grade. I useTwitter and Facebook, Amazon and YouTube. Companies know exactly what I’mtalking about, with whom I’m talking, my network of colleagues,acquaintances, and friends, what I’m buying and when what I’m watching,when I’m watching it, and where I’m consuming all these services. I know Ican be tracked. I know many companies are actively tracking me to“serve me better.” How would I feel if the government knew all this aboutme? I’m definitely less scared than I would be if I had ever had a run-inwith a government official. Gladly, I have not. It is chilling to thinkthat they would know what I know insofar as I had expressed it in any way.Chilling. The film was chilling.",
338
+ "content_html": "<p>I guess I’m on sort of a movie kick.</p><p>This movie is like no other I have ever seen. It is, simply, a chronologyof how the revelations about the NSA unfolded: how Ed (Snowden) firstcontacted Poitras and Greenwald; how Ed met them in Hong Kong; morefirst-hand details about how Ed came to the decision and the steps he tookto secure his person, his family and girlfriend, and to deliver the data tothe journalists. It interests me from a citizen perspective, and from atechnology perspective.</p><p>The revelations are much more palpable in the theatre. To hear Ed and Glennprepare to reveal and post these stories is incredible. To see Ed in hishotel room, listening to the news about what he revealed is inconceivable.It really puts a human face on the issue, wrought with emotionalfrustration, principled anger and tantalizing fear that nothing will comeof it.</p><p>The human rights lawyers, all gathered in a room in Berlin to discuss theissue is very interesting as well. The lawyer that whisks Ed away to safetyin Hong Kong – I can only imagine the courage and care that went into hisevery move. The thought that the law of the land – The Espionage Act of1917 – did not differentiate between a spy and a whistleblower isunthinkable. The help that the Assange of WikiLeaks provided wasincredible – to see so many powerful people all around the world rallybehind Ed was incredible to see.</p><p>Think about the magnitude of this act. To reveal the secret inner-workingsof a tyrant. A tyrannical system that wants nothing but to beat any dissentthose it oppresses can muster. Its unilateral and singular mission is todetect threats to itself and its parent (the country) and deconstruct thethreat’s viability piece by piece. The NSA is not an organization that willgo down easily.</p><p>The film leaves me wondering whether I value my own privacy. I have usedGoogle’s Mail since it came out in beta when I was in the 7th grade. I useTwitter and Facebook, Amazon and YouTube. Companies know exactly what I’mtalking about, with whom I’m talking, my network of colleagues,acquaintances, and friends, what I’m buying and when what I’m watching,when I’m watching it, and where I’m consuming all these services. I know I<em>can</em> be tracked. I know many companies <em>are actively tracking</em> me to“serve me better.” How would I feel if the government knew all this aboutme? I’m definitely less scared than I would be if I had ever had a run-inwith a government official. Gladly, I have not. It is chilling to thinkthat they would know what I know insofar as I had expressed it in any way.</p><p>Chilling. The film was chilling.</p>",
339
+ "url": "https://byparker.com/blog/2014/citizenfour/",
340
+
341
+
342
+
343
+
344
+ "date_published": "2014-11-24T00:00:00+00:00",
345
+ "date_modified": "2014-11-24T00:00:00+00:00",
346
+ "author": {
347
+ "name": ""
348
+ }
349
+ },
350
+
351
+ {
352
+ "id": "https://byparker.com/blog/2014/minority-report/",
353
+ "summary": "",
354
+ "content_text": "I saw Minority Report for the first time today. Overall, it was a veryinteresting movie. For a movie which came out in 2002, largely before theInternet conveniences we have today like Facebook and Google, I almostthink the concept of Precrime is within our grasp. The NSA’s bulk datacollection programs are using algorithms – rather than “precogs” – todetermine future strikes. These programs aren’t being used to stop murdersof a single or handful of individuals, but rather to stop the murders ofhundred and thousands of innocent people, victims of horrific terroristattacks.The plot itself is heartbreaking. A man loses his child and joins theprecrime unit to prevent similarly heinous crimes. His unit ends uppreventing every murder in 6 years, until the protagonist, Anderton, isimplicated. But what the movie says about a society where murders don’texist is quite profound. First and foremost, it says that sinister peoplewill continue to plot sinister deeds. This speaks to the fallibility ofhumankind – that we will always have dark sides, that emotion can overrunany sensibility we may have.I’d be interested to see if precrime could become a reality. If the rightalgorithms are processing enough data, messages with certain trigger wordscould be used to begin a digital investigation. Humans would then receiveword when enough statistical data had surfaced to warrant a closer look.Communication technology is exclusively electronic, and generally over theInternet. It seems the ability to listen in on every conversation is there.It’s just a matter of putting the pieces together and offering lawenforcement unfettered access to it all. We certainly seem to be heading inthat direction.Or, perhaps I’m thinking of this only because I’m going to seeCitizenfour tomorrow. At any rate, it’s an interesting allegory.",
355
+ "content_html": "<p>I saw <strong>Minority Report</strong> for the first time today. Overall, it was a veryinteresting movie. For a movie which came out in 2002, largely before theInternet conveniences we have today like Facebook and Google, I almostthink the concept of Precrime is within our grasp. The NSA’s bulk datacollection programs are using algorithms – rather than “precogs” – todetermine future strikes. These programs aren’t being used to stop murdersof a single or handful of individuals, but rather to stop the murders ofhundred and thousands of innocent people, victims of horrific terroristattacks.</p><p>The plot itself is heartbreaking. A man loses his child and joins theprecrime unit to prevent similarly heinous crimes. His unit ends uppreventing every murder in 6 years, until the protagonist, Anderton, isimplicated. But what the movie says about a society where murders don’texist is quite profound. First and foremost, it says that sinister peoplewill continue to plot sinister deeds. This speaks to the fallibility ofhumankind – that we will always have dark sides, that emotion can overrunany sensibility we may have.</p><p>I’d be interested to see if precrime could become a reality. If the rightalgorithms are processing enough data, messages with certain trigger wordscould be used to begin a digital investigation. Humans would then receiveword when enough statistical data had surfaced to warrant a closer look.Communication technology is exclusively electronic, and generally over theInternet. It seems the ability to listen in on every conversation is there.It’s just a matter of putting the pieces together and offering lawenforcement unfettered access to it all. We certainly seem to be heading inthat direction.</p><p>Or, perhaps I’m thinking of this only because I’m going to see<strong>Citizenfour</strong> tomorrow. At any rate, it’s an interesting allegory.</p>",
356
+ "url": "https://byparker.com/blog/2014/minority-report/",
357
+
358
+
359
+
360
+
361
+ "date_published": "2014-11-23T00:00:00+00:00",
362
+ "date_modified": "2014-11-23T00:00:00+00:00",
363
+ "author": {
364
+ "name": ""
365
+ }
366
+ },
367
+
368
+ {
369
+ "id": "https://byparker.com/blog/2014/clearing-up-confusion-around-baseurl/",
370
+ "summary": "",
371
+ "content_text": "TL;DR: Use baseurl when you are building a site that doesn’t sit at theroot of the domain.Hey, so there’s been a bit of confusion about what the Jekyll configurationoption called baseurl is. Part of the beauty of open-source and of Jekyllis that there’s a lot of flexibility. Unfortunately, much of thisflexibility doesn’t apply to baseurl. Here’s a quick distillation of itsintentions, and how to use it.Mimic GitHub Pagesbaseurl was originally added back in 2010 to allow“the user to test the website with the internal webserver under the samebase url it will be deployed to on a production server”.1ExampleSo let’s say I come up with a cool new project. I want to makedocumentation for a project I’m working on called “example”, and I’ll bedeploying it to GitHub Pages as a repo under the “@jekyll” username. Itsdocumentation will be available at the URL http://jekyll.github.io/example.In this example, the term “base URL” refers to /example, which I place inmy _config.yml as:baseurl: /exampleWhen I go to develop my website, I run jekyll serve like normal,but this time I go to http://localhost:4000/example/. What this baseurlhas done is specified a base path relative to the domain at which the sitelives. If you navigate to just http://localhost:4000/, you will see anerror message. If you have hooked up all your links correctly, then youwill never see a URL in your testing without /example at the beginning ofthe path.You might see, for example:{{ page.path | prepend:site.baseurl }}Configuring Your Site Properly Set baseurl in your _config.yml to match the production URL withoutthe host (e.g. /example, not http://jekyll.github.io/example). Run jekyll serve and go to http://localhost:4000/your_baseurl/,replacing your_baseurl with whatever you set baseurl to in your_config.yml, and not forgetting the trailing slash. Make sure everything works. Feel free to prepend your urls withsite.baseurl. Push up to your host and see that everything works there, too!Now what the heck is site.url?site.url is used in conjunction with site.baseurl when you want a linkto something with the full URL to it. One common paradigmSuccess!You’ve done it! You’ve successfully used baseurl and the world iswonderful. https://github.com/jekyll/jekyll/pull/235&amp;nbsp;&amp;#8617; ",
372
+ "content_html": "<p><strong>TL;DR: Use baseurl when you are building a site that doesn’t sit at theroot of the domain.</strong></p><p>Hey, so there’s been a bit of confusion about what the Jekyll configurationoption called <code class=\"highlighter-rouge\">baseurl</code> is. Part of the beauty of open-source and of Jekyllis that there’s a lot of flexibility. Unfortunately, much of thisflexibility doesn’t apply to <code class=\"highlighter-rouge\">baseurl</code>. Here’s a quick distillation of itsintentions, and how to use it.</p><h2 id=\"mimic-github-pages\">Mimic GitHub Pages</h2><p><code class=\"highlighter-rouge\">baseurl</code> was <a href=\"https://github.com/jekyll/jekyll/commit/4a8fc1fa6e3fa5dc05c81ac5ac4ffed0b0818ac4\">originally added back in 2010</a> to allow“the user to test the website with the internal webserver under the samebase url it will be deployed to on a production server”.<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote\">1</a></sup></p><h2 id=\"example\">Example</h2><p><img src=\"/img/what-is-a-baseurl.jpg\" alt=\"graphic explaining jekyll's baseurl\" /></p><p>So let’s say I come up with a cool new project. I want to makedocumentation for a project I’m working on called “example”, and I’ll bedeploying it to GitHub Pages as a repo under the “@jekyll” username. Itsdocumentation will be available at the URL <code class=\"highlighter-rouge\">http://jekyll.github.io/example</code>.</p><p>In this example, the term “base URL” refers to <code class=\"highlighter-rouge\">/example</code>, which I place inmy <code class=\"highlighter-rouge\">_config.yml</code> as:</p><figure class=\"highlight\"><pre><code class=\"language-yaml\" data-lang=\"yaml\"><span class=\"s\">baseurl</span><span class=\"pi\">:</span> <span class=\"s\">/example</span></code></pre></figure><p>When I go to develop my website, I run <code class=\"highlighter-rouge\">jekyll serve</code> like normal,but this time I go to <code class=\"highlighter-rouge\">http://localhost:4000/example/</code>. What this <code class=\"highlighter-rouge\">baseurl</code>has done is specified a base path relative to the domain at which the sitelives. If you navigate to just <code class=\"highlighter-rouge\">http://localhost:4000/</code>, you will see anerror message. If you have hooked up all your links correctly, then youwill never see a URL in your testing without <code class=\"highlighter-rouge\">/example</code> at the beginning ofthe path.</p><p>You might see, for example:</p><figure class=\"highlight\"><pre><code class=\"language-liquid\" data-lang=\"liquid\"><span class=\"p\">{{</span><span class=\"w\"> </span><span class=\"nv\">page</span><span class=\"p\">.</span><span class=\"nv\">path</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">prepend</span><span class=\"p\">:</span>site.baseurl<span class=\"w\"> </span><span class=\"p\">}}</span></code></pre></figure><h2 id=\"configuring-your-site-properly\">Configuring Your Site Properly</h2><ol> <li>Set <code class=\"highlighter-rouge\">baseurl</code> in your <code class=\"highlighter-rouge\">_config.yml</code> to match the production URL <strong>withoutthe host</strong> (e.g. <code class=\"highlighter-rouge\">/example</code>, <em>not</em> <code class=\"highlighter-rouge\">http://jekyll.github.io/example</code>).</li> <li>Run <code class=\"highlighter-rouge\">jekyll serve</code> and go to <code class=\"highlighter-rouge\">http://localhost:4000/your_baseurl/</code>,replacing <code class=\"highlighter-rouge\">your_baseurl</code> with whatever you set <code class=\"highlighter-rouge\">baseurl</code> to in your<code class=\"highlighter-rouge\">_config.yml</code>, and not forgetting the trailing slash.</li> <li>Make sure everything works. Feel free to prepend your urls with<code class=\"highlighter-rouge\">site.baseurl</code>.</li> <li>Push up to your host and see that everything works there, too!</li></ol><h2 id=\"now-what-the-heck-is-siteurl\">Now what the heck is <code class=\"highlighter-rouge\">site.url</code>?</h2><p><code class=\"highlighter-rouge\">site.url</code> is used in conjunction with <code class=\"highlighter-rouge\">site.baseurl</code> when you want a linkto something with the full URL to it. One common paradigm</p><h2 id=\"success\">Success!</h2><p>You’ve done it! You’ve successfully used <code class=\"highlighter-rouge\">baseurl</code> and the world iswonderful.</p><div class=\"footnotes\"> <ol> <li id=\"fn:1\"> <p>https://github.com/jekyll/jekyll/pull/235&nbsp;<a href=\"#fnref:1\" class=\"reversefootnote\">&#8617;</a></p> </li> </ol></div>",
373
+ "url": "https://byparker.com/blog/2014/clearing-up-confusion-around-baseurl/",
374
+
375
+
376
+
377
+
378
+ "date_published": "2014-10-18T22:51:12+00:00",
379
+ "date_modified": "2014-10-18T22:51:12+00:00",
380
+ "author": {
381
+ "name": ""
382
+ }
383
+ },
384
+
385
+ {
386
+ "id": "https://byparker.com/blog/2014/finding-the-time-to-write/",
387
+ "summary": "",
388
+ "content_text": "It’s tough. Between your full time gig (whether a job, school, or somethingelse entirely) and taking time to unwind, it can be hard to find the timeto write. For most, writing is not of any significant importance, unlessstrictly necessary — this seems to be especially true of engineers.For those that find writing an important avenue through which to expressthemselves, not being able to find the time can be a very difficult, dailybattle of guilt versus obligation.I don’t write much publicly (mostly random thoughts on Twitter and Facebook —hardly proper writing), but I am a frequent letter-writer. I have beenfortunate enough to travel in recent years and, as a result, have friendsin many places around the world. It can be difficult to stay in contactwith these friends when time zones vary widely and an unspoken expectationof immediacy of response is present on Facebook and over email.Letter writing is a respite from thesepressures. When I receive a letter, I can take a day or two to think ofwhat it is I wish to send and send out the letter several days later. Thisis of no significant consequence to the recipient (time-sensitivecommunication is handled via electronic means), so I can take my time. Buthow do I find that time?I have a 9 to 6 job, so I am out of the house before 9 and not home before6:30 most days. When I get home, I like to cook dinner and catch up onGitHub issues for the various open source projects I follow. Before I knowit, the clock strikes 9pm and I have to decide what it is I ought to dowith my remaining hours awake that night. Often, it’s entirely devoted toresponding to open tickets on Jekyll or one of its related projects. I feelobligated to ensure that the project moves forward and that it’s not leftstagnant. The only trouble is this eliminates my writing time.When I write letters (and blog posts), I sit down for hours and write. Iwrite and write, editing along the way and at the end a bunch of times. Themessage must be right. The flow must be right. The word choice must beright. Rationalizing this quantity of time to put words to papercan be difficult. It would be easy for me to address 30 GitHub issues inthe time it takes me to write a letter.The key to my continued letter writing? It’s all about fun. I write becauseI have fun writing. I enjoy the challenge of putting words together into(mildly) coherent sentences. The key is to make writing a pleasantexperience. Will anyone really care about what it is you’re writing? For aletter, usually just two people. For a blog post, probably just you. But towrite for the hell of it — because it is an exciting exploration ofthe language — is a heck of a motivator. Little pressure, lots ofpotential waiting to be unraveled.So write for the fun of it. Find time to write because it’s fun. Don’t putpressure on yourself — that only makes it easier to avoid. That houryou spend watching TV? That could be spent writing. Your hour-long commute?Dictate a blog post to yourself and write it out once you’re home. Feed onthe excitement of crafting an idea’s form. Make it your own and just havefun.",
389
+ "content_html": "<p>It’s tough. Between your full time gig (whether a job, school, or somethingelse entirely) and taking time to unwind, it can be hard to find the timeto write. For most, writing is not of any significant importance, unlessstrictly necessary — this seems to be especially true of engineers.For those that find writing an important avenue through which to expressthemselves, not being able to find the time can be a very difficult, dailybattle of guilt versus obligation.</p><p>I don’t write much publicly (mostly random thoughts on Twitter and Facebook —hardly proper <em>writing</em>), but I am a frequent letter-writer. I have beenfortunate enough to travel in recent years and, as a result, have friendsin many places around the world. It can be difficult to stay in contactwith these friends when time zones vary widely and an unspoken expectationof immediacy of response is present on Facebook and over email.Letter writing is a respite from thesepressures. When I receive a letter, I can take a day or two to think ofwhat it is I wish to send and send out the letter several days later. Thisis of no significant consequence to the recipient (time-sensitivecommunication is handled via electronic means), so I can take my time. Buthow do I find that time?</p><p>I have a 9 to 6 job, so I am out of the house before 9 and not home before6:30 most days. When I get home, I like to cook dinner and catch up onGitHub issues for the various open source projects I follow. Before I knowit, the clock strikes 9pm and I have to decide what it is I ought to dowith my remaining hours awake that night. Often, it’s entirely devoted toresponding to open tickets on Jekyll or one of its related projects. I feelobligated to ensure that the project moves forward and that it’s not leftstagnant. The only trouble is this eliminates my writing time.</p><p>When I write letters (and blog posts), I sit down for hours and write. Iwrite and write, editing along the way and at the end a bunch of times. Themessage must be right. The flow must be right. The word choice must beright. Rationalizing this quantity of time to put words to papercan be difficult. It would be easy for me to address 30 GitHub issues inthe time it takes me to write a letter.</p><p>The key to my continued letter writing? It’s all about fun. I write becauseI have fun writing. I enjoy the challenge of putting words together into(mildly) coherent sentences. The key is to make writing a pleasantexperience. Will anyone really care about what it is you’re writing? For aletter, usually just two people. For a blog post, probably just you. But towrite for the hell of it — because it is an exciting exploration ofthe language — is a heck of a motivator. Little pressure, lots ofpotential waiting to be unraveled.</p><p>So write for the fun of it. Find time to write because it’s fun. Don’t putpressure on yourself — that only makes it easier to avoid. That houryou spend watching TV? That could be spent writing. Your hour-long commute?Dictate a blog post to yourself and write it out once you’re home. Feed onthe excitement of crafting an idea’s form. Make it your own and just havefun.</p>",
390
+ "url": "https://byparker.com/blog/2014/finding-the-time-to-write/",
391
+
392
+
393
+
394
+
395
+ "date_published": "2014-09-25T00:00:00+00:00",
396
+ "date_modified": "2014-09-25T00:00:00+00:00",
397
+ "author": {
398
+ "name": ""
399
+ }
400
+ },
401
+
402
+ {
403
+ "id": "https://byparker.com/blog/2014/stay-up-to-date-with-the-latest-github-pages-gem/",
404
+ "summary": "",
405
+ "content_text": "So you use GitHub Pages and you love that the github-pages gem allows youto keep your local dependencies in sync with the production code. Well,kind of. You seem to have to go check the GitHub Pages Versionspage all the time just to make sureyou’re in sync. This gets really frustrating.In their infinite wisdom, the Pages team began publishing a versions.jsonfile right alongside their /versions/ HTML page. This is a huge win forus because now I can do this in my Gemfile:source 'https://rubygems.org'require 'json'require 'open-uri'versions = JSON.parse(open('https://pages.github.com/versions.json').read)gem 'github-pages', versions['github-pages']By grabbing the github-pages version that GitHub Pages is currentlyrunning every time your Gemfile is evaluated, you’re good to go. Themoment the versions change in production, bundler will start complainingand you’ll know it’s time to upgrade.Hope this helps those who rely on the GitHub Pages platform for stablewebsite-making. Happy Jekylling!",
406
+ "content_html": "<p>So you use GitHub Pages and you love that the <code class=\"highlighter-rouge\">github-pages</code> gem allows youto keep your local dependencies in sync with the production code. Well,<em>kind of</em>. You seem to have to go check the <a href=\"https://pages.github.com/versions/\">GitHub Pages Versionspage</a> all the time just to make sureyou’re in sync. This gets really frustrating.</p><p>In their infinite wisdom, the Pages team began publishing a <code class=\"highlighter-rouge\">versions.json</code>file right alongside their <code class=\"highlighter-rouge\">/versions/</code> HTML page. This is a huge win forus because <em>now</em> I can do this in my <code class=\"highlighter-rouge\">Gemfile</code>:</p><figure class=\"highlight\"><pre><code class=\"language-ruby\" data-lang=\"ruby\"><span class=\"n\">source</span> <span class=\"s1\">'https://rubygems.org'</span><span class=\"nb\">require</span> <span class=\"s1\">'json'</span><span class=\"nb\">require</span> <span class=\"s1\">'open-uri'</span><span class=\"n\">versions</span> <span class=\"o\">=</span> <span class=\"no\">JSON</span><span class=\"p\">.</span><span class=\"nf\">parse</span><span class=\"p\">(</span><span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s1\">'https://pages.github.com/versions.json'</span><span class=\"p\">).</span><span class=\"nf\">read</span><span class=\"p\">)</span><span class=\"n\">gem</span> <span class=\"s1\">'github-pages'</span><span class=\"p\">,</span> <span class=\"n\">versions</span><span class=\"p\">[</span><span class=\"s1\">'github-pages'</span><span class=\"p\">]</span></code></pre></figure><p>By grabbing the <code class=\"highlighter-rouge\">github-pages</code> version that GitHub Pages is currentlyrunning <em>every time your Gemfile is evaluated</em>, you’re good to go. Themoment the versions change in production, bundler will start complainingand you’ll know it’s time to upgrade.</p><p>Hope this helps those who rely on the GitHub Pages platform for stablewebsite-making. Happy Jekylling!</p>",
407
+ "url": "https://byparker.com/blog/2014/stay-up-to-date-with-the-latest-github-pages-gem/",
408
+
409
+
410
+
411
+
412
+ "date_published": "2014-09-20T00:00:00+00:00",
413
+ "date_modified": "2014-09-20T00:00:00+00:00",
414
+ "author": {
415
+ "name": ""
416
+ }
417
+ },
418
+
419
+ {
420
+ "id": "https://byparker.com/blog/2014/header-anchor-links-in-vanilla-javascript-for-github-pages-and-jekyll/",
421
+ "summary": "",
422
+ "content_text": "The venerable Ben Balter, Esq. wrote earlier this year about how to add anchor links for headers in Jekyll. I thought I’d follow up that post with one of my own, as I take a slightly different approach.This solution is vanilla JavaScript with a little CSS and the Font Awesome web font.Font AwesomeFont Awesome is, well, awesome. It’s a font of icons that comes with a handy set of CSS classes.Download the Font Awesome distribution and pull out just the font files. They’re the files that end in .ttf, .woff, .svg, .otf, and .eot. Grab them all and put them in fonts/ in your Jekyll site.The JavaScriptAdd this JavaScript wherever is convenient:var anchorForId = function (id) { var anchor = document.createElement(&quot;a&quot;); anchor.className = &quot;header-link&quot;; anchor.href = &quot;#&quot; + id; anchor.innerHTML = &quot;&amp;lt;i class='fa fa-link'&amp;gt;&amp;lt;/i&amp;gt;&quot;; return anchor;};var linkifyAnchors = function (level, containingElement) { var headers = containingElement.getElementsByTagName(&quot;h&quot; + level); for (var h = 0; h &amp;lt; headers.length; h++) { var header = headers[h]; if (typeof header.id !== &quot;undefined&quot; &amp;amp;&amp;amp; header.id !== &quot;&quot;) { header.appendChild(anchorForId(header.id)); } }};document.onreadystatechange = function () { if (this.readyState === &quot;complete&quot;) { var contentBlock = document.getElementsByClassName(&quot;docs&quot;)[0] || document.getElementsByClassName(&quot;news&quot;)[0]; if (!contentBlock) { return; } for (var level = 1; level &amp;lt;= 6; level++) { linkifyAnchors(level, contentBlock); } }};The CSSLast, add this CSS to the css or _scss folder:/*! * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */@font-face { font-family: 'FontAwesome'; src: url('../fonts/fontawesome-webfont.eot?v=4.1.0'); src: url('../fonts/fontawesome-webfont.eot?#iefix&amp;amp;v=4.1.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.1.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.1.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular') format('svg'); font-weight: normal; font-style: normal;}.fa { display: inline-block; font-family: FontAwesome; font-style: normal; font-weight: normal; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;}.fa-link:before { content: &quot;\f0c1&quot;;}/* * This code is courtesy Ben Balter, modified by Parker Moore for jekyllrb.com * http://ben.balter.com/2014/03/13/pages-anchor-links/ */.header-link { position: relative; left: 0.5em; opacity: 0; font-size: 0.8em; -webkit-transition: opacity 0.2s ease-in-out 0.1s; -moz-transition: opacity 0.2s ease-in-out 0.1s; -ms-transition: opacity 0.2s ease-in-out 0.1s;}h2:hover .header-link,h3:hover .header-link,h4:hover .header-link,h5:hover .header-link,h6:hover .header-link { opacity: 1;}Enjoy the MagicNow refresh your site and voilà! It’s like magic. See it in action in the Jekyll docs.",
423
+ "content_html": "<p>The venerable <a href=\"http://ben.balter.com\">Ben Balter, Esq.</a> wrote earlier this year about <a href=\"http://ben.balter.com/2014/03/13/pages-anchor-links/\">how to add anchor links for headers in Jekyll</a>. I thought I’d follow up that post with one of my own, as I take a slightly different approach.</p><p>This solution is vanilla JavaScript with a little CSS and the Font Awesome web font.</p><h2 id=\"font-awesome\">Font Awesome</h2><p><a href=\"http://fortawesome.github.io/Font-Awesome/\">Font Awesome</a> is, well, awesome. It’s a font of icons that comes with a handy set of CSS classes.</p><p>Download the Font Awesome distribution and pull out just the font files. They’re the files that end in <code class=\"highlighter-rouge\">.ttf</code>, <code class=\"highlighter-rouge\">.woff</code>, <code class=\"highlighter-rouge\">.svg</code>, <code class=\"highlighter-rouge\">.otf</code>, and <code class=\"highlighter-rouge\">.eot</code>. Grab them all and put them in <code class=\"highlighter-rouge\">fonts/</code> in your Jekyll site.</p><h2 id=\"the-javascript\">The JavaScript</h2><p>Add this JavaScript wherever is convenient:</p><figure class=\"highlight\"><pre><code class=\"language-js\" data-lang=\"js\"><span class=\"kd\">var</span> <span class=\"nx\">anchorForId</span> <span class=\"o\">=</span> <span class=\"kd\">function</span> <span class=\"p\">(</span><span class=\"nx\">id</span><span class=\"p\">)</span> <span class=\"p\">{</span> <span class=\"kd\">var</span> <span class=\"nx\">anchor</span> <span class=\"o\">=</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">createElement</span><span class=\"p\">(</span><span class=\"s2\">\"a\"</span><span class=\"p\">);</span> <span class=\"nx\">anchor</span><span class=\"p\">.</span><span class=\"nx\">className</span> <span class=\"o\">=</span> <span class=\"s2\">\"header-link\"</span><span class=\"p\">;</span> <span class=\"nx\">anchor</span><span class=\"p\">.</span><span class=\"nx\">href</span> <span class=\"o\">=</span> <span class=\"s2\">\"#\"</span> <span class=\"o\">+</span> <span class=\"nx\">id</span><span class=\"p\">;</span> <span class=\"nx\">anchor</span><span class=\"p\">.</span><span class=\"nx\">innerHTML</span> <span class=\"o\">=</span> <span class=\"s2\">\"&lt;i class='fa fa-link'&gt;&lt;/i&gt;\"</span><span class=\"p\">;</span> <span class=\"k\">return</span> <span class=\"nx\">anchor</span><span class=\"p\">;</span><span class=\"p\">};</span><span class=\"kd\">var</span> <span class=\"nx\">linkifyAnchors</span> <span class=\"o\">=</span> <span class=\"kd\">function</span> <span class=\"p\">(</span><span class=\"nx\">level</span><span class=\"p\">,</span> <span class=\"nx\">containingElement</span><span class=\"p\">)</span> <span class=\"p\">{</span> <span class=\"kd\">var</span> <span class=\"nx\">headers</span> <span class=\"o\">=</span> <span class=\"nx\">containingElement</span><span class=\"p\">.</span><span class=\"nx\">getElementsByTagName</span><span class=\"p\">(</span><span class=\"s2\">\"h\"</span> <span class=\"o\">+</span> <span class=\"nx\">level</span><span class=\"p\">);</span> <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">h</span> <span class=\"o\">=</span> <span class=\"mi\">0</span><span class=\"p\">;</span> <span class=\"nx\">h</span> <span class=\"o\">&lt;</span> <span class=\"nx\">headers</span><span class=\"p\">.</span><span class=\"nx\">length</span><span class=\"p\">;</span> <span class=\"nx\">h</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span> <span class=\"kd\">var</span> <span class=\"nx\">header</span> <span class=\"o\">=</span> <span class=\"nx\">headers</span><span class=\"p\">[</span><span class=\"nx\">h</span><span class=\"p\">];</span> <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"k\">typeof</span> <span class=\"nx\">header</span><span class=\"p\">.</span><span class=\"nx\">id</span> <span class=\"o\">!==</span> <span class=\"s2\">\"undefined\"</span> <span class=\"o\">&amp;&amp;</span> <span class=\"nx\">header</span><span class=\"p\">.</span><span class=\"nx\">id</span> <span class=\"o\">!==</span> <span class=\"s2\">\"\"</span><span class=\"p\">)</span> <span class=\"p\">{</span> <span class=\"nx\">header</span><span class=\"p\">.</span><span class=\"nx\">appendChild</span><span class=\"p\">(</span><span class=\"nx\">anchorForId</span><span class=\"p\">(</span><span class=\"nx\">header</span><span class=\"p\">.</span><span class=\"nx\">id</span><span class=\"p\">));</span> <span class=\"p\">}</span> <span class=\"p\">}</span><span class=\"p\">};</span><span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">onreadystatechange</span> <span class=\"o\">=</span> <span class=\"kd\">function</span> <span class=\"p\">()</span> <span class=\"p\">{</span> <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"k\">this</span><span class=\"p\">.</span><span class=\"nx\">readyState</span> <span class=\"o\">===</span> <span class=\"s2\">\"complete\"</span><span class=\"p\">)</span> <span class=\"p\">{</span> <span class=\"kd\">var</span> <span class=\"nx\">contentBlock</span> <span class=\"o\">=</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">getElementsByClassName</span><span class=\"p\">(</span><span class=\"s2\">\"docs\"</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"o\">||</span> <span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">getElementsByClassName</span><span class=\"p\">(</span><span class=\"s2\">\"news\"</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">];</span> <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nx\">contentBlock</span><span class=\"p\">)</span> <span class=\"p\">{</span> <span class=\"k\">return</span><span class=\"p\">;</span> <span class=\"p\">}</span> <span class=\"k\">for</span> <span class=\"p\">(</span><span class=\"kd\">var</span> <span class=\"nx\">level</span> <span class=\"o\">=</span> <span class=\"mi\">1</span><span class=\"p\">;</span> <span class=\"nx\">level</span> <span class=\"o\">&lt;=</span> <span class=\"mi\">6</span><span class=\"p\">;</span> <span class=\"nx\">level</span><span class=\"o\">++</span><span class=\"p\">)</span> <span class=\"p\">{</span> <span class=\"nx\">linkifyAnchors</span><span class=\"p\">(</span><span class=\"nx\">level</span><span class=\"p\">,</span> <span class=\"nx\">contentBlock</span><span class=\"p\">);</span> <span class=\"p\">}</span> <span class=\"p\">}</span><span class=\"p\">};</span></code></pre></figure><h2 id=\"the-css\">The CSS</h2><p>Last, add this CSS to the <code class=\"highlighter-rouge\">css</code> or <code class=\"highlighter-rouge\">_scss</code> folder:</p><figure class=\"highlight\"><pre><code class=\"language-css\" data-lang=\"css\"><span class=\"c\">/*! * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */</span><span class=\"k\">@font-face</span> <span class=\"p\">{</span> <span class=\"nl\">font-family</span><span class=\"p\">:</span> <span class=\"s2\">'FontAwesome'</span><span class=\"p\">;</span> <span class=\"nl\">src</span><span class=\"p\">:</span> <span class=\"sx\">url('../fonts/fontawesome-webfont.eot?v=4.1.0')</span><span class=\"p\">;</span> <span class=\"nl\">src</span><span class=\"p\">:</span> <span class=\"sx\">url('../fonts/fontawesome-webfont.eot?#iefix&amp;v=4.1.0')</span> <span class=\"n\">format</span><span class=\"p\">(</span><span class=\"s2\">'embedded-opentype'</span><span class=\"p\">),</span> <span class=\"sx\">url('../fonts/fontawesome-webfont.woff?v=4.1.0')</span> <span class=\"n\">format</span><span class=\"p\">(</span><span class=\"s2\">'woff'</span><span class=\"p\">),</span> <span class=\"sx\">url('../fonts/fontawesome-webfont.ttf?v=4.1.0')</span> <span class=\"n\">format</span><span class=\"p\">(</span><span class=\"s2\">'truetype'</span><span class=\"p\">),</span> <span class=\"sx\">url('../fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular')</span> <span class=\"n\">format</span><span class=\"p\">(</span><span class=\"s2\">'svg'</span><span class=\"p\">);</span> <span class=\"nl\">font-weight</span><span class=\"p\">:</span> <span class=\"nb\">normal</span><span class=\"p\">;</span> <span class=\"nl\">font-style</span><span class=\"p\">:</span> <span class=\"nb\">normal</span><span class=\"p\">;</span><span class=\"p\">}</span><span class=\"nc\">.fa</span> <span class=\"p\">{</span> <span class=\"nl\">display</span><span class=\"p\">:</span> <span class=\"n\">inline-block</span><span class=\"p\">;</span> <span class=\"nl\">font-family</span><span class=\"p\">:</span> <span class=\"n\">FontAwesome</span><span class=\"p\">;</span> <span class=\"nl\">font-style</span><span class=\"p\">:</span> <span class=\"nb\">normal</span><span class=\"p\">;</span> <span class=\"nl\">font-weight</span><span class=\"p\">:</span> <span class=\"nb\">normal</span><span class=\"p\">;</span> <span class=\"nl\">line-height</span><span class=\"p\">:</span> <span class=\"m\">1</span><span class=\"p\">;</span> <span class=\"nl\">-webkit-font-smoothing</span><span class=\"p\">:</span> <span class=\"n\">antialiased</span><span class=\"p\">;</span> <span class=\"nl\">-moz-osx-font-smoothing</span><span class=\"p\">:</span> <span class=\"n\">grayscale</span><span class=\"p\">;</span><span class=\"p\">}</span><span class=\"nc\">.fa-link</span><span class=\"nd\">:before</span> <span class=\"p\">{</span> <span class=\"nl\">content</span><span class=\"p\">:</span> <span class=\"s1\">\"\f0c1\"</span><span class=\"p\">;</span><span class=\"p\">}</span><span class=\"c\">/* * This code is courtesy Ben Balter, modified by Parker Moore for jekyllrb.com * http://ben.balter.com/2014/03/13/pages-anchor-links/ */</span><span class=\"nc\">.header-link</span> <span class=\"p\">{</span> <span class=\"nl\">position</span><span class=\"p\">:</span> <span class=\"nb\">relative</span><span class=\"p\">;</span> <span class=\"nl\">left</span><span class=\"p\">:</span> <span class=\"m\">0.5em</span><span class=\"p\">;</span> <span class=\"nl\">opacity</span><span class=\"p\">:</span> <span class=\"m\">0</span><span class=\"p\">;</span> <span class=\"nl\">font-size</span><span class=\"p\">:</span> <span class=\"m\">0.8em</span><span class=\"p\">;</span> <span class=\"nl\">-webkit-transition</span><span class=\"p\">:</span> <span class=\"n\">opacity</span> <span class=\"m\">0.2s</span> <span class=\"n\">ease-in-out</span> <span class=\"m\">0.1s</span><span class=\"p\">;</span> <span class=\"nl\">-moz-transition</span><span class=\"p\">:</span> <span class=\"n\">opacity</span> <span class=\"m\">0.2s</span> <span class=\"n\">ease-in-out</span> <span class=\"m\">0.1s</span><span class=\"p\">;</span> <span class=\"nl\">-ms-transition</span><span class=\"p\">:</span> <span class=\"n\">opacity</span> <span class=\"m\">0.2s</span> <span class=\"n\">ease-in-out</span> <span class=\"m\">0.1s</span><span class=\"p\">;</span><span class=\"p\">}</span><span class=\"nt\">h2</span><span class=\"nd\">:hover</span> <span class=\"nc\">.header-link</span><span class=\"o\">,</span><span class=\"nt\">h3</span><span class=\"nd\">:hover</span> <span class=\"nc\">.header-link</span><span class=\"o\">,</span><span class=\"nt\">h4</span><span class=\"nd\">:hover</span> <span class=\"nc\">.header-link</span><span class=\"o\">,</span><span class=\"nt\">h5</span><span class=\"nd\">:hover</span> <span class=\"nc\">.header-link</span><span class=\"o\">,</span><span class=\"nt\">h6</span><span class=\"nd\">:hover</span> <span class=\"nc\">.header-link</span> <span class=\"p\">{</span> <span class=\"nl\">opacity</span><span class=\"p\">:</span> <span class=\"m\">1</span><span class=\"p\">;</span><span class=\"p\">}</span></code></pre></figure><h2 id=\"enjoy-the-magic\">Enjoy the Magic</h2><p>Now refresh your site and voilà! It’s like magic. See it in action in the <a href=\"http://jekyllrb.com/docs/home/\">Jekyll docs</a>.</p>",
424
+ "url": "https://byparker.com/blog/2014/header-anchor-links-in-vanilla-javascript-for-github-pages-and-jekyll/",
425
+
426
+
427
+
428
+
429
+ "date_published": "2014-08-02T03:36:54+00:00",
430
+ "date_modified": "2014-08-02T03:36:54+00:00",
431
+ "author": {
432
+ "name": ""
433
+ }
434
+ },
435
+
436
+ {
437
+ "id": "https://byparker.com/blog/2014/how-to-setup-your-own-github-pages/",
438
+ "summary": "",
439
+ "content_text": "GitHub Pages is a wonderful free platform GitHub has created to build and host your Jekyll sites for you. You push up any valid Jekyll site to a repo (on a special branch), and it’s built and published to a predictable URL. The only downside? You can’t use any custom Ruby code, which means no custom plugins. So what’s the best way to host a Jekyll site that requires plugins?Maybe you’re writing a huge website for your employer, or just something small for yourself. Either way, you need a plugin or two to get it just right. You could build locally and push the compiled site up to GitHub Pages, but that requires that you install all the dependencies locally and write a script to compile and jostle things in just the right way to make it all work. What if you could have the same workflow – just git push – for sites with custom plugins?You can. I do it every day. In fact, this very site is published with this method. Here’s a step-by-step guide to making your own GitHub Pages.1. Install and Configure DependenciesYou’ll need the following: A server with root access. I use a Rackspace CentOS 1GB Performance VM, but you can use any Linux system from any provider. A web server if you don’t have one already (Apache/Nginx). Ruby and RubyGems with the proper permissions to install new gems. Git GitoliteFirst, sudo su - root. Then install Ruby. I suggest using rbenv to keep your Rubies organized. Then ensure RubyGems is installed, and install the github-pages gem.Next, ensure you have a daemonized web server installed, like nginx or apache.Then ensure git is installed and create a new git user. Run su - git and install gitolite.Once you have gitolite installed, go back to your local machine and configure gitolite as described. You’ll need to add a new user for your SSH key and create the repo for your site.2. Add the post-receive hookRun sudo su - git and find the post-receive file in your repository. It’s usually at /home/git/repositories/MY_REPO.git/hooks/post-receive. Edit it so it looks like this:set -e # fail on error# ensure you have loaded git's environment with rbenv/ruby/jekyll in the pathsource /home/git/.bash_profile# this is only if you have rbenv installed# remove if you're using a stock rubyeval &quot;$(rbenv init -)&quot;# this shows you where the Jekyll executable can be found# it will also fail if jekyll can't be found, halting the build.which jekyll# this is the name of your repo, without the `.git`REPO_NAME=&quot;MY_REPO&quot;GIT_REPO=$HOME/repositories/$REPO_NAME.gitTMP_GIT_CLONE=/tmp/$REPO_NAME# Change this to wherever your server (nginx/apache) will look# for your compiled site. Usually called the document root.PUBLIC_WWW=/var/www/$REPO_NAMEgit clone $GIT_REPO $TMP_GIT_CLONE# Run Jekyll!cd $TMP_GIT_CLONE &amp;amp;&amp;amp; jekyll build -d $PUBLIC_WWW --tracerm -Rf $TMP_GIT_CLONEexitThis hook will clone your repo to /tmp and run jekyll build from your site source into the directory your server will serve from.3. Add the git remoteGo back to your local site and add the remote:$ git remote add publish git@example.org:MY_REPO.git4. TestNow, to test, just push!$ git push publish masterYou should see all the output of the Jekyll process in your terminal. Once you see ...done. and the process exits, you’re done! Refresh your browser and admire your handiwork.If you get a LoadError from Jekyll, then you don’t have a gem installed or it can’t access the _plugins directory. To install new gems, just run gem install GEM_NAME as root on your VM.",
440
+ "content_html": "<p><a href=\"https://pages.github.com\">GitHub Pages</a> is a wonderful free platform GitHub has created to build and host your Jekyll sites for you. You push up any valid Jekyll site to a repo (on a special branch), and it’s built and published to a predictable URL. The only downside? You can’t use any custom Ruby code, which means no custom plugins. So what’s the best way to host a Jekyll site that requires plugins?</p><p>Maybe you’re writing a huge website for your employer, or just something small for yourself. Either way, you need a plugin or two to get it <em>just right</em>. You could build locally and push the compiled site up to GitHub Pages, but that requires that you install all the dependencies locally and write a script to compile and jostle things in just the right way to make it all work. What if you could have the same workflow – just <code class=\"highlighter-rouge\">git push</code> – for sites with custom plugins?</p><p>You can. I do it every day. In fact, <em>this very site</em> is published with this method. Here’s a step-by-step guide to making your own GitHub Pages.</p><h2 id=\"1-install-and-configure-dependencies\">1. Install and Configure Dependencies</h2><p>You’ll need the following:</p><ol> <li>A server with <code class=\"highlighter-rouge\">root</code> access. I use a Rackspace CentOS 1GB Performance VM, but you can use any Linux system from any provider.</li> <li>A web server if you don’t have one already (Apache/Nginx).</li> <li>Ruby and RubyGems with the proper permissions to install new gems.</li> <li>Git</li> <li><a href=\"https://github.com/sitaramc/gitolite\">Gitolite</a></li></ol><p>First, <code class=\"highlighter-rouge\">sudo su - root</code>. Then install Ruby. I suggest using <code class=\"highlighter-rouge\">rbenv</code> to keep your Rubies organized. Then ensure RubyGems is installed, and install the <code class=\"highlighter-rouge\">github-pages</code> gem.</p><p>Next, ensure you have a daemonized web server installed, like <code class=\"highlighter-rouge\">nginx</code> or <code class=\"highlighter-rouge\">apache</code>.</p><p>Then ensure git is installed and create a new <code class=\"highlighter-rouge\">git</code> user. Run <code class=\"highlighter-rouge\">su - git</code> and install <code class=\"highlighter-rouge\">gitolite</code>.</p><p>Once you have <code class=\"highlighter-rouge\">gitolite</code> installed, go back to your local machine and configure <code class=\"highlighter-rouge\">gitolite</code> as described. You’ll need to add a new user for your SSH key and create the repo for your site.</p><h2 id=\"2-add-the-post-receive-hook\">2. Add the post-receive hook</h2><p>Run <code class=\"highlighter-rouge\">sudo su - git</code> and find the <code class=\"highlighter-rouge\">post-receive</code> file in your repository. It’s usually at <code class=\"highlighter-rouge\">/home/git/repositories/MY_REPO.git/hooks/post-receive</code>. Edit it so it looks like this:</p><figure class=\"highlight\"><pre><code class=\"language-bash\" data-lang=\"bash\"><span class=\"nb\">set</span> -e <span class=\"c\"># fail on error</span><span class=\"c\"># ensure you have loaded git's environment with rbenv/ruby/jekyll in the path</span><span class=\"nb\">source</span> /home/git/.bash_profile<span class=\"c\"># this is only if you have rbenv installed</span><span class=\"c\"># remove if you're using a stock ruby</span><span class=\"nb\">eval</span> <span class=\"s2\">\"</span><span class=\"k\">$(</span>rbenv init -<span class=\"k\">)</span><span class=\"s2\">\"</span><span class=\"c\"># this shows you where the Jekyll executable can be found</span><span class=\"c\"># it will also fail if jekyll can't be found, halting the build.</span>which jekyll<span class=\"c\"># this is the name of your repo, without the `.git`</span><span class=\"nv\">REPO_NAME</span><span class=\"o\">=</span><span class=\"s2\">\"MY_REPO\"</span><span class=\"nv\">GIT_REPO</span><span class=\"o\">=</span><span class=\"nv\">$HOME</span>/repositories/<span class=\"nv\">$REPO_NAME</span>.git<span class=\"nv\">TMP_GIT_CLONE</span><span class=\"o\">=</span>/tmp/<span class=\"nv\">$REPO_NAME</span><span class=\"c\"># Change this to wherever your server (nginx/apache) will look</span><span class=\"c\"># for your compiled site. Usually called the document root.</span><span class=\"nv\">PUBLIC_WWW</span><span class=\"o\">=</span>/var/www/<span class=\"nv\">$REPO_NAME</span>git clone <span class=\"nv\">$GIT_REPO</span> <span class=\"nv\">$TMP_GIT_CLONE</span><span class=\"c\"># Run Jekyll!</span><span class=\"nb\">cd</span> <span class=\"nv\">$TMP_GIT_CLONE</span> <span class=\"o\">&amp;&amp;</span> jekyll build -d <span class=\"nv\">$PUBLIC_WWW</span> --tracerm -Rf <span class=\"nv\">$TMP_GIT_CLONE</span><span class=\"nb\">exit</span></code></pre></figure><p>This hook will clone your repo to <code class=\"highlighter-rouge\">/tmp</code> and run <code class=\"highlighter-rouge\">jekyll build</code> from your site source into the directory your server will serve from.</p><h2 id=\"3-add-the-git-remote\">3. Add the git remote</h2><p>Go back to your local site and add the remote:</p><figure class=\"highlight\"><pre><code class=\"language-bash\" data-lang=\"bash\"><span class=\"gp\">$ </span>git remote add publish git@example.org:MY_REPO.git</code></pre></figure><h2 id=\"4-test\">4. Test</h2><p>Now, to test, just push!</p><figure class=\"highlight\"><pre><code class=\"language-bash\" data-lang=\"bash\"><span class=\"gp\">$ </span>git push publish master</code></pre></figure><p>You should see all the output of the Jekyll process in your terminal. Once you see <code class=\"highlighter-rouge\">...done.</code> and the process exits, you’re done! Refresh your browser and admire your handiwork.</p><p>If you get a <code class=\"highlighter-rouge\">LoadError</code> from Jekyll, then you don’t have a gem installed or it can’t access the <code class=\"highlighter-rouge\">_plugins</code> directory. To install new gems, just run <code class=\"highlighter-rouge\">gem install GEM_NAME</code> as <code class=\"highlighter-rouge\">root</code> on your VM.</p>",
441
+ "url": "https://byparker.com/blog/2014/how-to-setup-your-own-github-pages/",
442
+
443
+
444
+
445
+
446
+ "date_published": "2014-08-01T18:42:58+00:00",
447
+ "date_modified": "2014-08-01T18:42:58+00:00",
448
+ "author": {
449
+ "name": ""
450
+ }
451
+ },
452
+
453
+ {
454
+ "id": "https://byparker.com/blog/2014/always-moving-forward/",
455
+ "summary": "",
456
+ "content_text": " Today, I’m proud to announce that I have accepted a job offer from Visual Supply Co,a small and happenin’ start-up based in the Bay Area. Visual Supply Co,also known as VSCO, produces the well-loved VSCO Cam iPhoneand Android apps, as well as VSCO Film, VSCO Grid, and VSCO Keys.I’ll be working on all things web, including the Grid service and the API.Super stoked to begin this next chapter in my journey through life workingon a slick series of products with a stellar team. Follow my adventure onmy grid!",
457
+ "content_html": "<p><a href=\"https://parker.vsco.co/media/52d5e979726708dc7c00040f\" class=\"full-width\" title=\"A photo of mine taken with VSCO Cam, VSCO's seminal work. The photograph is of the bay at sunset in Emeryville, CA. I was standing in Marina Park, which inhabits a small peninsula immediately north of the Bay Bridge. It was taken during the time I spent interning at VSCO in January, 2014.\"> <img src=\"https://image.vsco.co/1/51c771649686d3572/52d5e979726708dc7c00040f/800x600/vsco_011414_24.jpg\" alt=\"A view of the sunset over the Bay from Marina Park in Emeryville, California.\" /></a></p><p>Today, I’m proud to announce that I have accepted a job offer from <a href=\"https://vsco.co/\">Visual Supply Co</a>,a small and happenin’ start-up based in the Bay Area. Visual Supply Co,also known as VSCO, produces the well-loved <a href=\"https://vsco.co/vscocam\">VSCO Cam</a> iPhoneand Android apps, as well as <a href=\"https://vsco.co/film\">VSCO Film</a>, <a href=\"https://grid.vsco.co\">VSCO Grid</a>, and <a href=\"https://vsco.co/vscokeys\">VSCO Keys</a>.I’ll be working on all things web, including the Grid service and the API.</p><p>Super stoked to begin this next chapter in my journey through life workingon a slick series of products with a stellar team. Follow my adventure on<a href=\"https://parker.vsco.co\">my grid</a>!</p>",
458
+ "url": "https://byparker.com/blog/2014/always-moving-forward/",
459
+
460
+
461
+
462
+
463
+ "date_published": "2014-04-03T20:28:07+00:00",
464
+ "date_modified": "2014-04-03T20:28:07+00:00",
465
+ "author": {
466
+ "name": ""
467
+ }
468
+ },
469
+
470
+ {
471
+ "id": "https://byparker.com/blog/2014/installing-command-t-with-os-x-mavericks-built-in-vim/",
472
+ "summary": "",
473
+ "content_text": "I was fortunate enough to, just today, pick up a new computer. My first hardwarein over 4 years, I had been holding off. Once my trusty MacBook Pro bit the dustlast night and I found out the repair cost was extraordinary, I bit the bullet.So, you’re probably in a similar place. You relatively recently got a shiny newMacintosh and you’re so excited to start writing code and making a differencewith those skillz of yours. Except one this is missing: Command-T.Lucky for you, sir, I am here to help. OS X Maverick’s built-in vim distributioncomes with Ruby support already (which it needs for Command-T) so you’re goodthere. Now you need to download and compile Command-T. Should be easy, right?Well, not quite.Mavericks was notable for Ruby users because it ships with Ruby 2.0. Allprevious versions that I had ever used shipped with 1.8.7 so this was a hugebonus. Problem is, your pre-installed vim wasn’t compiled with 2.0.0, it wascompiled with 1.8.7.To check this, run the following in vim in NORMAL mode::ruby puts &quot;#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}&quot;For me, that output 1.8.7-p358. So that means the Ruby verison that vim isusing is 1.8.7-p358, and we need to compile Command-T with that version. To doso, install it:$ rbenv install 1.8.7-p358Boom! Now download and install Command-T:$ git clone https://github.com/wincent/Command-T.git ~/.vim/bundle/Command-T$ cd ~/.vim/bundle/Command-T # for tpope's Pathogen$ rbenv local 1.8.7-p358$ rbenv rehash$ gem install bundler$ bundle install$ bundle exec rake makeAaaaand boom, you’re done. Open up vim and type your leaderkey then t (forme, that’s ,t) to launch the prompt.If you get a weird SIGTERM error when you launch vim, then you installedCommand-T with the wrong Ruby version. Remove ruby/command-t/ext.bundle andtry again.",
474
+ "content_html": "<p>I was fortunate enough to, just today, pick up a new computer. My first hardwarein over 4 years, I had been holding off. Once my trusty MacBook Pro bit the dustlast night and I found out the repair cost was extraordinary, I bit the bullet.</p><p>So, you’re probably in a similar place. You relatively recently got a shiny newMacintosh and you’re so excited to start writing code and making a differencewith those skillz of yours. Except one this is missing: <a href=\"https://github.com/wincent/Command-T\">Command-T</a>.</p><p>Lucky for you, sir, I am here to help. OS X Maverick’s built-in vim distributioncomes with Ruby support already (which it needs for Command-T) so you’re goodthere. Now you need to download and compile Command-T. Should be easy, right?Well, not quite.</p><p>Mavericks was notable for Ruby users because it ships with Ruby 2.0. Allprevious versions that I had ever used shipped with 1.8.7 so this was a hugebonus. Problem is, your pre-installed vim wasn’t compiled with 2.0.0, it wascompiled with 1.8.7.</p><p>To check this, run the following in vim in NORMAL mode:</p><figure class=\"highlight\"><pre><code class=\"language-text\" data-lang=\"text\">:ruby puts \"#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}\"</code></pre></figure><p>For me, that output <code class=\"highlighter-rouge\">1.8.7-p358</code>. So that means the Ruby verison that vim isusing is <code class=\"highlighter-rouge\">1.8.7-p358</code>, and we need to compile Command-T with that version. To doso, install it:</p><figure class=\"highlight\"><pre><code class=\"language-bash\" data-lang=\"bash\"><span class=\"gp\">$ </span>rbenv install 1.8.7-p358</code></pre></figure><p>Boom! Now download and install Command-T:</p><figure class=\"highlight\"><pre><code class=\"language-bash\" data-lang=\"bash\"><span class=\"gp\">$ </span>git clone https://github.com/wincent/Command-T.git ~/.vim/bundle/Command-T<span class=\"gp\">$ </span><span class=\"nb\">cd</span> ~/.vim/bundle/Command-T <span class=\"c\"># for tpope's Pathogen</span><span class=\"gp\">$ </span>rbenv <span class=\"nb\">local </span>1.8.7-p358<span class=\"gp\">$ </span>rbenv rehash<span class=\"gp\">$ </span>gem install bundler<span class=\"gp\">$ </span>bundle install<span class=\"gp\">$ </span>bundle <span class=\"nb\">exec </span>rake make</code></pre></figure><p>Aaaaand boom, you’re done. Open up <code class=\"highlighter-rouge\">vim</code> and type your leaderkey then <code class=\"highlighter-rouge\">t</code> (forme, that’s <code class=\"highlighter-rouge\">,t</code>) to launch the prompt.</p><p>If you get a weird SIGTERM error when you launch <code class=\"highlighter-rouge\">vim</code>, then you installedCommand-T with the wrong Ruby version. Remove <code class=\"highlighter-rouge\">ruby/command-t/ext.bundle</code> andtry again.</p>",
475
+ "url": "https://byparker.com/blog/2014/installing-command-t-with-os-x-mavericks-built-in-vim/",
476
+
477
+
478
+
479
+
480
+ "date_published": "2014-01-02T01:03:00+00:00",
481
+ "date_modified": "2014-01-02T01:03:00+00:00",
482
+ "author": {
483
+ "name": ""
484
+ }
485
+ },
486
+
487
+ {
488
+ "id": "https://byparker.com/blog/2013/fix-the-government-open-source-legislation/",
489
+ "summary": "",
490
+ "content_text": "The following post was first written for a class at Cornell University taughtby Phoebe Sengers called “Designing Technologies for Social Impact”.We have a rather significant problem in the U.S. Indeed, our government seems tobe malfunctioning in a rather obvious and irresponsible way. The question oftoday is simply: can it be fixed? If so, how?One must first examine the problem and its root cause. The problem ofmalfunction is most basically the conflict of multiple competing interestswithout proper ideological or procedural basis for dialogue. The root cause ofthis is that the existing platforms for dialogue (meetings, letters, rallies,news spots) are severely outdated. What worked pre-internet is not passing thetest of time.In particular, the legislative process is slow, dilapidated, and closed. Thisleads to laws with earmarks and loopholes, confusing language and unnecessaryprovisions. What if the law were made out in the open, for everyone to see, theway open-source software is made? Version control and online access to billsin-the-works as well as laws would certainly improve transparency. The Libraryof Congress runs a system called THOMAS which is updated about daily, but thebills aren’t organized logically and the user interface is fair at best.The open-source legislation system envisioned here is based on an open-sourcesoftware system called GitHub. GitHub is setup like so: users and organizationsown repositories of code, text or binary documents. Each repository contains theentire history of a particular set of documents as well as the “master” version,or the latest repository-owner(s)-approved version of the document(s). Eachrepository uses a version control system called git to keep track of theinformation about the documents it contains: current versions as well asprevious versions. What is unique about this system, and the incredible strengthit offers for open legislation, is the concept of a “diff”. A “diff” is simplythe difference between a document at one point in time (referred to as a“revision”) and the same document at a different point in time. Each repositorycan be “forked” (cloned to a user’s own profile for editing) by a user; thisoffers the most significant freedom of open-source, which is that anyone has thefreedom to modify a copy of the source and suggest changes to the main projectbased on those derivative works. In GitHub parlance, the suggestion for a changeis called a “pull request,” but this term need not be adopted by this newsystem.To illustrate the design of the ideal system: Use git derivative for prose editing, rather than (line-by-line) code editing Be online, accessible by anyone Offer input from anyone in any form (suggested changes or just comments) Do not make differentiation between users other than repository owner &amp;amp;non-owner (those with direct access to the repository and those who can forkand suggest changes, but can’t incorporate those changes themselves) Each repository is a proposed bill owned by the deciding body at the giventime during the legislative process as dictated by the U.S. Constitution.Each repository contains a text file for each sub-segment of the proposedbill as well as a rationale or goal, e.g. . (root) | |– README.txt (rationale, goal(s) of bill, and other meta info) |– section01.txt |– section02.txt | … The entire process of the creation and formulation of the law is public andopen insofar as the culture can push for this Moderator of some sort to ensure comments are productive (usually repoowner). All of the comments that are hidden still exist inline and can beshown by any reader of the comment thread Membership of individual lawmakers in committees and other larger bodiesreflected in membership of organization accounts on the platform, which givesthem access to directly changing the legislation they have access to throughtheir organizational memberships Offer “points of interest” as a means of discussion about a particular aspectof a bill without the need to suggest changes. Can ask anything from “why isthis section worded this way?” to “what are the implications of this onagricultural development in Upstate New York?” No question is too dumb andall of them require an answer insofar as they are productive and relevant. Easy citation of preexisting laws and other bills to allow for discussionsurrounding conflict or other interference Access to signing letters written by President (usually interpretations ofpieces of the law for purposes of execution of the law) Easy viewing of votes on final versions of bills (who, when, did it pass?,etc) Means of mentioning lawmakers in a comment if comment is directed at them,or question is asked directly of them Links to more information about execution by Executive &amp;amp; other relatedpolicy/law Comments and changes can only be created from user accounts, e.g. DavidSkorton can suggest a change, but Cornell University cannot. Users can subscribe to updates from a bill repository and receive allinformation about changes that are made and discussions that occur.One negative aspect of this approach is volume and the issues that cometherefrom (see: student’s answer on Piazza page linked to below). As the numberof collaborators grows, the ability for those with direct access to the bills tohandle suggestions for modification is greatly diminished. How are the interestsof the few vs. those of the many weighed (e.g. individual comment vs comment fromorganization such as NAACP)? From the perspective of the way government worksalready, aides of the legislators who have access to the repositories will alsohave mirrored access to accept and discuss changes and questions from citizens.As each law is its own repository, the load is distributed over the manyhundreds of bill repositories being considered. Additionally, Nissenbaum &amp;amp;Benkler discuss the idea of self-selection and volunteerism as an element ofopen-source. This applies very much so to the scalability of open-sourcelegislation and responses to citizens. If a citizen is not interested in aparticular bill, that citizen will not involve himself or herself with thecreation of that bill. This self-selection will greatly reduce the number ofindividuals with whom the maintainers of the bills will have to contend with indiscussion about a bill and suggestions for change.Ultimately, this idea is predicated on the idea that citizens, when given theright tools, can reach compromise and have productive discussions to “get thejob done” efficiently and accurately.",
491
+ "content_html": "<p><em>The following post was first written for a class at Cornell University taughtby Phoebe Sengers called “Designing Technologies for Social Impact”.</em></p><hr /><p>We have a rather significant problem in the U.S. Indeed, our government seems tobe malfunctioning in a rather obvious and irresponsible way. The question oftoday is simply: can it be fixed? If so, how?</p><p>One must first examine the problem and its root cause. The problem ofmalfunction is most basically the conflict of multiple competing interestswithout proper ideological or procedural basis for dialogue. The root cause ofthis is that the existing platforms for dialogue (meetings, letters, rallies,news spots) are severely outdated. What worked pre-internet is not passing thetest of time.</p><p>In particular, the legislative process is slow, dilapidated, and closed. Thisleads to laws with earmarks and loopholes, confusing language and unnecessaryprovisions. What if the law were made out in the open, for everyone to see, theway open-source software is made? Version control and online access to billsin-the-works as well as laws would certainly improve transparency. The Libraryof Congress runs a system called THOMAS which is updated about daily, but thebills aren’t organized logically and the user interface is fair at best.</p><p>The open-source legislation system envisioned here is based on an open-sourcesoftware system called GitHub. GitHub is setup like so: users and organizationsown repositories of code, text or binary documents. Each repository contains theentire history of a particular set of documents as well as the “master” version,or the latest repository-owner(s)-approved version of the document(s). Eachrepository uses a version control system called git to keep track of theinformation about the documents it contains: current versions as well asprevious versions. What is unique about this system, and the incredible strengthit offers for open legislation, is the concept of a “diff”. A “diff” is simplythe difference between a document at one point in time (referred to as a“revision”) and the same document at a different point in time. Each repositorycan be “forked” (cloned to a user’s own profile for editing) by a user; thisoffers the most significant freedom of open-source, which is that anyone has thefreedom to modify a copy of the source and suggest changes to the main projectbased on those derivative works. In GitHub parlance, the suggestion for a changeis called a “pull request,” but this term need not be adopted by this newsystem.</p><p>To illustrate the design of the ideal system:</p><ol> <li>Use git derivative for prose editing, rather than (line-by-line) code editing</li> <li>Be online, accessible by anyone</li> <li>Offer input from anyone in any form (suggested changes or just comments)</li> <li>Do not make differentiation between users other than repository owner &amp;non-owner (those with direct access to the repository and those who can forkand suggest changes, but can’t incorporate those changes themselves)</li> <li> <p>Each repository is a proposed bill owned by the deciding body at the giventime during the legislative process as dictated by the U.S. Constitution.Each repository contains a text file for each sub-segment of the proposedbill as well as a rationale or goal, e.g. . (root) | |– README.txt (rationale, goal(s) of bill, and other meta info) |– section01.txt |– section02.txt | …</p> </li> <li>The entire process of the creation and formulation of the law is public andopen insofar as the culture can push for this</li> <li>Moderator of some sort to ensure comments are productive (usually repoowner). All of the comments that are hidden still exist inline and can beshown by any reader of the comment thread</li> <li>Membership of individual lawmakers in committees and other larger bodiesreflected in membership of organization accounts on the platform, which givesthem access to directly changing the legislation they have access to throughtheir organizational memberships</li> <li>Offer “points of interest” as a means of discussion about a particular aspectof a bill without the need to suggest changes. Can ask anything from “why isthis section worded this way?” to “what are the implications of this onagricultural development in Upstate New York?” No question is too dumb andall of them require an answer insofar as they are productive and relevant.</li> <li>Easy citation of preexisting laws and other bills to allow for discussionsurrounding conflict or other interference</li> <li>Access to signing letters written by President (usually interpretations ofpieces of the law for purposes of execution of the law)</li> <li>Easy viewing of votes on final versions of bills (who, when, did it pass?,etc)</li> <li>Means of mentioning lawmakers in a comment if comment is directed at them,or question is asked directly of them</li> <li>Links to more information about execution by Executive &amp; other relatedpolicy/law</li> <li>Comments and changes can only be created from user accounts, e.g. DavidSkorton can suggest a change, but Cornell University cannot.</li> <li>Users can subscribe to updates from a bill repository and receive allinformation about changes that are made and discussions that occur.</li></ol><p>One negative aspect of this approach is volume and the issues that cometherefrom (see: student’s answer on Piazza page linked to below). As the numberof collaborators grows, the ability for those with direct access to the bills tohandle suggestions for modification is greatly diminished. How are the interestsof the few vs. those of the many weighed (e.g. individual comment vs comment fromorganization such as NAACP)? From the perspective of the way government worksalready, aides of the legislators who have access to the repositories will alsohave mirrored access to accept and discuss changes and questions from citizens.As each law is its own repository, the load is distributed over the manyhundreds of bill repositories being considered. Additionally, Nissenbaum &amp;Benkler discuss the idea of self-selection and volunteerism as an element ofopen-source. This applies very much so to the scalability of open-sourcelegislation and responses to citizens. If a citizen is not interested in aparticular bill, that citizen will not involve himself or herself with thecreation of that bill. This self-selection will greatly reduce the number ofindividuals with whom the maintainers of the bills will have to contend with indiscussion about a bill and suggestions for change.</p><p>Ultimately, this idea is predicated on the idea that citizens, when given theright tools, can reach compromise and have productive discussions to “get thejob done” efficiently and accurately.</p>",
492
+ "url": "https://byparker.com/blog/2013/fix-the-government-open-source-legislation/",
493
+
494
+
495
+
496
+
497
+ "date_published": "2013-10-22T19:45:00+00:00",
498
+ "date_modified": "2013-10-22T19:45:00+00:00",
499
+ "author": {
500
+ "name": ""
501
+ }
502
+ },
503
+
504
+ {
505
+ "id": "https://byparker.com/blog/2013/launching-a-rails-console-with-capistrano/",
506
+ "summary": "",
507
+ "content_text": "If you’re using the popular Capistrano web deployment framework, you will likelyhave wished you had an easy way to perform a quick task in the production railsconsole on one of your servers. Many thanks to@colszowka for thissolution:NOTE: This is for Capistrano v2. Things are different for v3.namespace :rails do desc &quot;Remote console&quot; task :console, :roles =&amp;gt; :app do run_interactively &quot;bundle exec rails console #{rails_env}&quot; end desc &quot;Remote dbconsole&quot; task :dbconsole, :roles =&amp;gt; :app do run_interactively &quot;bundle exec rails dbconsole #{rails_env}&quot; endenddef run_interactively(command, server=nil) server ||= find_servers_for_task(current_task).first exec %Q(ssh #{server.host} -t 'cd #{current_path} &amp;amp;&amp;amp; #{command}')endAnd, vòila! Run cap rails:console and you’re in business.",
508
+ "content_html": "<p>If you’re using the popular Capistrano web deployment framework, you will likelyhave wished you had an easy way to perform a quick task in the production railsconsole on one of your servers. Many thanks to<a href=\"https://github.com/colszowka\">@colszowka</a> for <a href=\"https://gist.github.com/benedikt/1115513#comment-576015\">thissolution</a>:</p><p><strong>NOTE</strong>: This is for Capistrano v2. Things are different for v3.</p><figure class=\"highlight\"><pre><code class=\"language-ruby\" data-lang=\"ruby\"><span class=\"n\">namespace</span> <span class=\"ss\">:rails</span> <span class=\"k\">do</span> <span class=\"n\">desc</span> <span class=\"s2\">\"Remote console\"</span> <span class=\"n\">task</span> <span class=\"ss\">:console</span><span class=\"p\">,</span> <span class=\"ss\">:roles</span> <span class=\"o\">=&gt;</span> <span class=\"ss\">:app</span> <span class=\"k\">do</span> <span class=\"n\">run_interactively</span> <span class=\"s2\">\"bundle exec rails console </span><span class=\"si\">#{</span><span class=\"n\">rails_env</span><span class=\"si\">}</span><span class=\"s2\">\"</span> <span class=\"k\">end</span> <span class=\"n\">desc</span> <span class=\"s2\">\"Remote dbconsole\"</span> <span class=\"n\">task</span> <span class=\"ss\">:dbconsole</span><span class=\"p\">,</span> <span class=\"ss\">:roles</span> <span class=\"o\">=&gt;</span> <span class=\"ss\">:app</span> <span class=\"k\">do</span> <span class=\"n\">run_interactively</span> <span class=\"s2\">\"bundle exec rails dbconsole </span><span class=\"si\">#{</span><span class=\"n\">rails_env</span><span class=\"si\">}</span><span class=\"s2\">\"</span> <span class=\"k\">end</span><span class=\"k\">end</span><span class=\"k\">def</span> <span class=\"nf\">run_interactively</span><span class=\"p\">(</span><span class=\"n\">command</span><span class=\"p\">,</span> <span class=\"n\">server</span><span class=\"o\">=</span><span class=\"kp\">nil</span><span class=\"p\">)</span> <span class=\"n\">server</span> <span class=\"o\">||=</span> <span class=\"n\">find_servers_for_task</span><span class=\"p\">(</span><span class=\"n\">current_task</span><span class=\"p\">).</span><span class=\"nf\">first</span> <span class=\"nb\">exec</span> <span class=\"sx\">%Q(ssh </span><span class=\"si\">#{</span><span class=\"n\">server</span><span class=\"p\">.</span><span class=\"nf\">host</span><span class=\"si\">}</span><span class=\"sx\"> -t 'cd </span><span class=\"si\">#{</span><span class=\"n\">current_path</span><span class=\"si\">}</span><span class=\"sx\"> &amp;&amp; </span><span class=\"si\">#{</span><span class=\"n\">command</span><span class=\"si\">}</span><span class=\"sx\">')</span><span class=\"k\">end</span></code></pre></figure><p>And, <em>vòila</em>! Run <code class=\"highlighter-rouge\">cap rails:console</code> and you’re in business.</p>",
509
+ "url": "https://byparker.com/blog/2013/launching-a-rails-console-with-capistrano/",
510
+
511
+
512
+
513
+
514
+ "date_published": "2013-08-07T20:36:00+00:00",
515
+ "date_modified": "2013-08-07T20:36:00+00:00",
516
+ "author": {
517
+ "name": ""
518
+ }
519
+ },
520
+
521
+ {
522
+ "id": "https://byparker.com/blog/2013/jekyll-1-dot-0-released/",
523
+ "summary": "",
524
+ "content_text": "Today, I’m proud to announce the release of Jekyll 1.0. There are a milliongoodies and fixes to enjoy, and we’re (the still-active Jekyll core teammembers: Tom, Matt and I) really excited to share this first major releasewith you. Be sure to follow @jekyllrb forupdates on future releases and links to cool plugins.Some quick highlights: New subcommands: new, build, serve, and import Amazing new docs at http://jekyllrb.com (thanks to @cobyism) jekyll new creates a new scaffold so you can get blogging even faster Drafts, i.e. posts without dates New “excerpt” feature on posts Timezone configuration ‘gist’ liquid tag Source directory protection… and so much more!We also have an Upgrading page that clarifiessome breaking changes and tips for upgrading to Jekyll 1.0.As many of you know, Jekyll lay mostly stagnant for quite some time. At 0.11.2 and0.12.0, it was pretty stable. It had some annoying bugs, but nothing much thatcouldn’t be worked around or monkey-patched.After using Jekyll last summer to help buildCornell’s College of Agriculture and Life Sciences website,I took a renewed interest in seeing this project move forward. Last December,Tom answered my offers to help with the development of Jekyll by adding me asa contributor. I’m happy to say that it has come a long way since then, andI’m very proud to be a part of a team that has pushed this project to new heights.Thank you to everyone who submitted a pull request, and/or gave me advice alongthe way. It has been great fun so far, and I look forward to working with youall to push out future versions!",
525
+ "content_html": "<p>Today, I’m proud to announce the release of Jekyll 1.0. There are a milliongoodies and fixes to enjoy, and we’re (the still-active Jekyll core teammembers: Tom, Matt and I) really excited to share this first major releasewith you. Be sure to follow <a href=\"https://twitter.com/jekyllrb\">@jekyllrb</a> forupdates on future releases and links to cool plugins.</p><p>Some quick highlights:</p><ul> <li>New subcommands: new, build, serve, and import</li> <li>Amazing new docs at http://jekyllrb.com (thanks to @cobyism)</li> <li><code class=\"highlighter-rouge\">jekyll new</code> creates a new scaffold so you can get blogging even faster</li> <li>Drafts, i.e. posts without dates</li> <li>New “excerpt” feature on posts</li> <li>Timezone configuration</li> <li>‘gist’ liquid tag</li> <li>Source directory protection</li></ul><p>… and <a href=\"https://github.com/mojombo/jekyll/blob/v1.0.0/History.txt\">so much more</a>!</p><p>We also have an <a href=\"http://jekyllrb.com/docs/upgrading/\">Upgrading</a> page that clarifiessome breaking changes and tips for upgrading to Jekyll 1.0.</p><p>As many of you know, Jekyll lay mostly stagnant for quite some time. At 0.11.2 and0.12.0, it was pretty stable. It had some annoying bugs, but nothing much thatcouldn’t be worked around or monkey-patched.</p><p>After using Jekyll last summer to help build<a href=\"http://cals.cornell.edu\">Cornell’s College of Agriculture and Life Sciences website</a>,I took a renewed interest in seeing this project move forward. Last December,Tom answered my offers to help with the development of Jekyll by adding me asa contributor. I’m happy to say that it has come a long way since then, andI’m very proud to be a part of a team that has pushed this project to new heights.</p><p>Thank you to everyone who submitted a pull request, and/or gave me advice alongthe way. It has been great fun so far, and I look forward to working with youall to push out future versions!</p>",
526
+ "url": "https://byparker.com/blog/2013/jekyll-1-dot-0-released/",
527
+
528
+
529
+
530
+
531
+ "date_published": "2013-05-06T00:59:00+00:00",
532
+ "date_modified": "2013-05-06T00:59:00+00:00",
533
+ "author": {
534
+ "name": ""
535
+ }
536
+ },
537
+
538
+ {
539
+ "id": "https://byparker.com/blog/2013/an-afterlife/",
540
+ "summary": "",
541
+ "content_text": "I am not a religious man, yet I find myself curious about the prospect of an afterlife. Isthere something beyond this life, in this dimension, in this universe? While I don’t believein the traditional conception of an afterlife (one’s soul ascends to a blissful place, whereit inhabits all space and time for eternity), I do like to think we live on beyond thetime we take our last breath.In ninth grade, I graduated to a Sunday School class which resembled a forum —discussion-based learning. A retired history teacher, a Public Defender, and a socialworker led the discussions in this class. The dialogue probed our most deeply held beliefsand asked profound questions about life, spirituality, goodness, happiness, beauty, andother similar topics.One day, we were discussing the afterlife. The normal answers dominated the conversation:“When one dies, one’s soul ascends into Heaven to be with one’s family members and withGod,” and “We exist everywhere and with everyone. We watch over those we love and helpthem live good lives.” When the question came to me, I wasn’t sure how to respond. Can anatheist believe in an afterlife? If so, did I?I hadn’t given it much thought before, but I pondered it for a moment and concluded, “Anindividual’s afterlife is the culmination of the memories others have of the individual.It is the legacy that individual leaves behind and the impact that individual had on thosehe or she encountered.”The more I thought about it, the more it made sense. If we don’t have souls, how do weexplain this legacy of the afterlife concretely? The afterlife is not something experiencedby the deceased individual, but by everyone else he or she impacted.I have not yet met anyone else who holds this belief I hold, but I invite you to exploreit and see of you can reconcile it with your beliefs about the afterlife. Banksy oncefamously said (paraphrased by a friend): They say you die twice, once when yourheart stops beating, and again when your name is said for the last time. I can’tbelieve there is something I will experience beyond my death, but I can believe thatothers will experience their memories of me beyond my departure from this world.",
542
+ "content_html": "<p>I am not a religious man, yet I find myself curious about the prospect of an afterlife. Isthere something beyond this life, in this dimension, in this universe? While I don’t believein the traditional conception of an afterlife (one’s soul ascends to a blissful place, whereit inhabits all space and time for eternity), I do like to think we live on beyond thetime we take our last breath.</p><p>In ninth grade, I graduated to a Sunday School class which resembled a forum —discussion-based learning. A retired history teacher, a Public Defender, and a socialworker led the discussions in this class. The dialogue probed our most deeply held beliefsand asked profound questions about life, spirituality, goodness, happiness, beauty, andother similar topics.</p><p>One day, we were discussing the afterlife. The normal answers dominated the conversation:“When one dies, one’s soul ascends into Heaven to be with one’s family members and withGod,” and “We exist everywhere and with everyone. We watch over those we love and helpthem live good lives.” When the question came to me, I wasn’t sure how to respond. Can anatheist believe in an afterlife? If so, did I?</p><p>I hadn’t given it much thought before, but I pondered it for a moment and concluded, “Anindividual’s afterlife is the culmination of the memories others have of the individual.It is the legacy that individual leaves behind and the impact that individual had on thosehe or she encountered.”</p><p>The more I thought about it, the more it made sense. If we don’t have souls, how do weexplain this legacy of the afterlife concretely? The afterlife is not something experiencedby the deceased individual, but by everyone else he or she impacted.</p><p>I have not yet met anyone else who holds this belief I hold, but I invite you to exploreit and see of you can reconcile it with your beliefs about the afterlife. Banksy oncefamously said (paraphrased by a friend): They say you die twice, once when yourheart stops beating, and again when your name is said for the last time. I can’tbelieve there is something I will experience beyond my death, but I can believe thatothers will experience their memories of me beyond my departure from this world.</p>",
543
+ "url": "https://byparker.com/blog/2013/an-afterlife/",
544
+
545
+
546
+
547
+
548
+ "date_published": "2013-04-30T19:00:00+00:00",
549
+ "date_modified": "2013-04-30T19:00:00+00:00",
550
+ "author": {
551
+ "name": ""
552
+ }
553
+ },
554
+
555
+ {
556
+ "id": "https://byparker.com/blog/2013/we-mustnt-idle/",
557
+ "summary": "",
558
+ "content_text": "Our legacies on this Beautiful Earth are inextricably tied to the work we do, theprinciples we stand for and the messages we spread. The apathetic nature of many of mypeers nowadays is heresy to the nth degree, and we can no longer stand idly by and watchyoung people refusing to talk about the hard issues. If we’re to make any progress andmaintain this More Perfect Union, we had better get our act together and stand and fightfor the things we believe in.It comes with a price, however. We must be informed. We must read the arguments of theother side, debate them and reformulate our stance given the new evidence. In the sameway Newton used this inductive methods to formulate his three famous Natural Laws, wemust start with a problem we observe in our society, generalize a solution in the formof legislation, judicial action or grassroots campaigning, and revise our message as newinformation becomes available.It is not enough to let Gov majors, English majors and law students run the country,making sweeping decisions about how we may live our lives. It is not enough to defer tothose with means and wealth – those with the ability to run a traditional campaign forpublic office and influence those in public office – in fact, it is the worst offense tothis Great Nation to allow the aristocracy of special interets to continue determiningthe rule of law. We must stand up, as citizens, and fight for what sparks fire in ourbellies! We must stand up, as citizens, and say “enough is enough” to special interestsand lobbyists who control Washington. Now is our time. If our country is to change forthe better, it will be because we – the citizens – made our voices heard and fought withmuch gnashing of teeth for what we believe in and what we know is right.This is the imperative of our generation. Let us act!This post was originally published on Medium.",
559
+ "content_html": "<p>Our legacies on this Beautiful Earth are inextricably tied to the work we do, theprinciples we stand for and the messages we spread. The apathetic nature of many of mypeers nowadays is heresy to the nth degree, and we can no longer stand idly by and watchyoung people refusing to talk about the hard issues. If we’re to make any progress andmaintain this More Perfect Union, we had better get our act together and stand and fightfor the things we believe in.</p><p>It comes with a price, however. We must be informed. We must read the arguments of theother side, debate them and reformulate our stance given the new evidence. In the sameway Newton used this inductive methods to formulate his three famous Natural Laws, wemust start with a problem we observe in our society, generalize a solution in the formof legislation, judicial action or grassroots campaigning, and revise our message as newinformation becomes available.</p><p>It is not enough to let Gov majors, English majors and law students run the country,making sweeping decisions about how we may live our lives. It is not enough to defer tothose with means and wealth – those with the ability to run a traditional campaign forpublic office and influence those in public office – in fact, it is the worst offense tothis Great Nation to allow the aristocracy of special interets to continue determiningthe rule of law. We must stand up, as citizens, and fight for what sparks fire in ourbellies! We must stand up, as citizens, and say “enough is enough” to special interestsand lobbyists who control Washington. Now is our time. If our country is to change forthe better, it will be because we – the citizens – made our voices heard and fought withmuch gnashing of teeth for what we believe in and what we know is right.</p><p>This is the imperative of our generation. Let us act!</p><p>This post was originally published on <a href=\"https://medium.com/i-m-h-o/d5bf40927b1a\">Medium</a>.</p>",
560
+ "url": "https://byparker.com/blog/2013/we-mustnt-idle/",
561
+
562
+
563
+
564
+
565
+ "date_published": "2013-04-22T02:12:12+00:00",
566
+ "date_modified": "2013-04-22T02:12:12+00:00",
567
+ "author": {
568
+ "name": ""
569
+ }
570
+ },
571
+
572
+ {
573
+ "id": "https://byparker.com/blog/2013/downtime-is-good/",
574
+ "summary": "",
575
+ "content_text": "I just started working as an intern at 6Wunderkinder a couple weeks ago.I am by no means an expert in devops (hell, I have only dabbled with a littlesysadmin in the past - nothing too serious) and I don’t really know what goesinto keeping a huge series of servers up and running. I can say, however, thatI know the customer’s side of things. I know what it’s like to be a user of aservice which periodically goes through downtimes of noticable lengths – don’twe all?So today there was a blip of downtime for Wunderlist, a really awesome task-management application by 6Wunderkinder. During this downtime, it occurred tome: downtime can help the visibility of an application or service.Hear me out: when the service is running smoothly, few will actually talk aboutit. When it goes down, Twitter blows up with complaints and “ZOMG MY LIFE ISOVER” tweets. These tweets, in a way, promote the service. The more frustratedthe tweet, the more apparent it is that the tweeter cares about this service.As one who sees these frustrated tweets often about many services, I can onlyconclude that a little downtime here and there is a great way for outsidersto gauge how awesome a service is: if it goes down and people are upset, thenthe service is probably worth trying out (once it goes back up again). If theservice goes down and no one cares, then it probably isn’t worth your time.So next time you see angry tweets, write down the name of that service andcheck it out once everything is back in order. In all likelihood, you willlike the service, too, and you’ll be angrily tweeting next time it goes down.It’s all about perspective.",
576
+ "content_html": "<p>I just started working as an intern at 6Wunderkinder a couple weeks ago.I am by no means an expert in devops (hell, I have only dabbled with a littlesysadmin in the past - nothing too serious) and I don’t really know what goesinto keeping a huge series of servers up and running. I can say, however, thatI know the customer’s side of things. I know what it’s like to be a user of aservice which periodically goes through downtimes of noticable lengths – don’twe all?</p><p>So today there was a blip of downtime for Wunderlist, a really awesome task-management application by 6Wunderkinder. During this downtime, it occurred tome: downtime can help the visibility of an application or service.</p><p>Hear me out: when the service is running smoothly, few will actually talk aboutit. When it goes down, Twitter blows up with complaints and “ZOMG MY LIFE ISOVER” tweets. These tweets, in a way, promote the service. The more frustratedthe tweet, the more apparent it is that the tweeter cares about this service.</p><p>As one who sees these frustrated tweets often about many services, I can onlyconclude that a little downtime here and there is a great way for outsidersto gauge how awesome a service is: if it goes down and people are upset, thenthe service is probably worth trying out (once it goes back up again). If theservice goes down and no one cares, then it probably isn’t worth your time.</p><p>So next time you see angry tweets, write down the name of that service andcheck it out once everything is back in order. In all likelihood, you willlike the service, too, and you’ll be angrily tweeting next time it goes down.</p><p>It’s all about perspective.</p>",
577
+ "url": "https://byparker.com/blog/2013/downtime-is-good/",
578
+
579
+
580
+
581
+
582
+ "date_published": "2013-02-11T22:43:00+00:00",
583
+ "date_modified": "2013-02-11T22:43:00+00:00",
584
+ "author": {
585
+ "name": ""
586
+ }
587
+ },
588
+
589
+ {
590
+ "id": "https://byparker.com/blog/2013/install-rbenv-on-ubuntu-12-dot-04/",
591
+ "summary": "",
592
+ "content_text": "So, I’ll admit it: I absolutely adore rbenv.In light of this, I’ve been using it at my work at 6Wunderkinder the past couple weeks.6W uses AWS like nobody’s business, and the Ubuntu EC2 instances I’ve been interactingwith are really bare-bones. So I wanted to write this script for you, the Ubuntu &amp;amp; Rubyuser, in order for you to very quickly get up and running with rbenv &amp;amp; the latest RubyMRI. Just copy it and run it.sudo apt-get install zlib1g-dev openssl libopenssl-ruby1.9.1 libssl-dev libruby1.9.1 libreadline-dev git-core make make-doccd ~git clone git://github.com/sstephenson/rbenv.git .rbenvecho 'export PATH=&quot;$HOME/.rbenv/bin:$PATH&quot;' &amp;gt;&amp;gt; ~/.bashrcecho 'eval &quot;$(rbenv init -)&quot;' &amp;gt;&amp;gt; ~/.bashrcexec $SHELL # Restart the shellmkdir -p ~/.rbenv/pluginscd ~/.rbenv/pluginsgit clone git://github.com/sstephenson/ruby-build.gitgit clone git://github.com/sstephenson/rbenv-gem-rehash.gitrbenv install 1.9.3-p362rbenv rehashrbenv global 1.9.3-p362",
593
+ "content_html": "<p>So, I’ll admit it: I absolutely adore rbenv.</p><p>In light of this, I’ve been using it at my work at 6Wunderkinder the past couple weeks.6W uses AWS like nobody’s business, and the Ubuntu EC2 instances I’ve been interactingwith are really bare-bones. So I wanted to write this script for you, the Ubuntu &amp; Rubyuser, in order for you to very quickly get up and running with rbenv &amp; the latest RubyMRI. Just copy it and run it.</p><figure class=\"highlight\"><pre><code class=\"language-bash\" data-lang=\"bash\">sudo apt-get install zlib1g-dev openssl libopenssl-ruby1.9.1 libssl-dev libruby1.9.1 libreadline-dev git-core make make-doc<span class=\"nb\">cd</span> ~git clone git://github.com/sstephenson/rbenv.git .rbenv<span class=\"nb\">echo</span> <span class=\"s1\">'export PATH=\"$HOME/.rbenv/bin:$PATH\"'</span> &gt;&gt; ~/.bashrc<span class=\"nb\">echo</span> <span class=\"s1\">'eval \"$(rbenv init -)\"'</span> &gt;&gt; ~/.bashrc<span class=\"nb\">exec</span> <span class=\"nv\">$SHELL</span> <span class=\"c\"># Restart the shell</span>mkdir -p ~/.rbenv/plugins<span class=\"nb\">cd</span> ~/.rbenv/pluginsgit clone git://github.com/sstephenson/ruby-build.gitgit clone git://github.com/sstephenson/rbenv-gem-rehash.gitrbenv install 1.9.3-p362rbenv rehashrbenv global 1.9.3-p362</code></pre></figure>",
594
+ "url": "https://byparker.com/blog/2013/install-rbenv-on-ubuntu-12-dot-04/",
595
+
596
+
597
+
598
+
599
+ "date_published": "2013-02-06T21:31:00+00:00",
600
+ "date_modified": "2013-02-06T21:31:00+00:00",
601
+ "author": {
602
+ "name": ""
603
+ }
604
+ },
605
+
606
+ {
607
+ "id": "https://byparker.com/blog/2013/connect-to-3g-on-simyo-in-germany/",
608
+ "summary": "",
609
+ "content_text": "I recently signed up for simyo, a German cell provider. After installing the Nano SIM into my phone,I noticed that the 3G connection to the mobile data network was failing. Got a weird error that saidI was not subscribed to a mobile data network. Which was obviously false.So, I tweeted about it. Expecting a several-day delay in my support query from simyo, I totally resignedto wait on mobile data until they got back to me. But luckily this new 6W family &amp;amp; friends totally cameto my rescue. Rafif Yalda, a former Wunderkind, totally came to my rescue ina tweet (which has since been removed).So if you ever run into a problem with your mobile network, ensure that your APN settings are correct.In this case:APN: internet.eplus.deusername: simyopassword: simyo:tophat: tip to Rafif Yalda for the tip. This surely saved me many hours of frustration.",
610
+ "content_html": "<p>I recently signed up for simyo, a German cell provider. After installing the Nano SIM into my phone,I noticed that the 3G connection to the mobile data network was failing. Got a weird error that saidI was not subscribed to a mobile data network. Which was obviously false.</p><p>So, I tweeted about it. Expecting a several-day delay in my support query from simyo, I totally resignedto wait on mobile data until they got back to me. But luckily this new 6W family &amp; friends totally cameto my rescue. <a href=\"http://rafifyalda.id.au/\">Rafif Yalda</a>, a former Wunderkind, totally came to my rescue ina tweet (which has since been removed).</p><p>So if you ever run into a problem with your mobile network, ensure that your APN settings are correct.In this case:</p><figure class=\"highlight\"><pre><code class=\"language-text\" data-lang=\"text\">APN: internet.eplus.deusername: simyopassword: simyo</code></pre></figure><p>:tophat: tip to Rafif Yalda for the tip. This surely saved me many hours of frustration.</p>",
611
+ "url": "https://byparker.com/blog/2013/connect-to-3g-on-simyo-in-germany/",
612
+
613
+
614
+
615
+
616
+ "date_published": "2013-01-30T18:10:00+00:00",
617
+ "date_modified": "2013-01-30T18:10:00+00:00",
618
+ "author": {
619
+ "name": ""
620
+ }
621
+ }
622
+
623
+ ]
624
+ }
625
+
626
+ ---
627
+
628
+ feed.format: json
629
+ feed.title: By Parker
630
+ feed.url: https://byparker.com/
631
+
632
+ feed.items[0].url: https://byparker.com/blog/2017/add-json-feed-to-your-jekyll-site/
633
+ feed.items[0].guid: https://byparker.com/blog/2017/add-json-feed-to-your-jekyll-site/
634
+
635
+ feed.items[1].url: https://byparker.com/blog/2017/the-internet-is-unstable/
636
+ feed.items[1].guid: https://byparker.com/blog/2017/the-internet-is-unstable/