An Archetypal Analysis of The Peanut Butter and Jelly Sandwich

This classic sandwich, undoubtedly part of your, the readers’, childhood and life, contains with them much symbol on which to reflect. In this we will explore the depths and the heights of what will once have seemed mundane. Peanut butter and (the traditionally grape-based) jelly represent the earth and the sky respectively, opposites each containing the seed of the other, combined between two slices of (our daily) bread.

Peanuts (called in many places “groundnut”) are just that, from the ground, downward, cthnonic, of the underworld. To be able to partake in what of-value they do contain requires a stripping away of the outer element to reveal the fruit within. Note that this element does not preclude the peanut of all value, rather the opposite: it is a self-apparently worthy goal to break apart the hellish armor to reveal what of-value lies inside.

On the other hand the grape represents sky, the heavens, the ouranic presence of the higher values towards which we strive. Grapes themselves cannot touch the ground in development lest they become tarnished by the hazards of being too close to the earth. They dangle, tantalizingly and seductively round and smooth and deeply colored (contrasting with the peanuts’ pale and gruff outward demeanor), enticing one to eat them and taste their vulnerable round flesh. Furthermore, grapes contain the impression of the cosmos around them: a tuned palette can detect the specific year of origin from the effects of the sun and rain, and other elements of Nature in a given growing season. In this way the grape also symbolizes Indra’s Net, an endless fabric of jewels, each reflecting every other, representing the interconnectedness of the cosmos.

The grape of course contains at its core an inedible seed, a pit, curiously in our language both a word for seed as well as for The Abyss; making it the topological opposite of the peanut: while the hazard of the grape is within, the hazard of the peanut is without. In both, this must be discarded–indeed, overcome–in order to gain the flesh (and the power) of the fruit itself.

With a peanut butter and jelly sandwich encompasses this eternal balance between ouranic and cthnoic, heaven and hell, air and earth, within the comfortable (and indeed palatable) context of bread: that most powerful symbol of civilization itself. Nearly every organized people across history has produced seemingly independently a bread or bread-equivalent, the product of harnessing nature to grow grain, exhibiting at least partial dominance over nature by pulverizing the grain and firing it. Bread of course is a neutralizing element, the substrate on which the sandwich is built, at once giving it form as well as adding almost nothing–bread in itself is not and can not be a sandwich. The sandwich must be created by combining the vessel with the substance (which in our case is a duality, reflecting polar opposites). The peanut butter sandwich resists any other form, two slices of bread are necessitated by the characteristics of our fillings (have you ever tried spreading jelly on top of peanut butter?). Contradictarians will be quick to point out the obvious: folding a single slice of bread in half, a sure route to a tasty (successful) half-sandwich. Alas, half a sandwich has never made anyone full, only longing for more, wistfully dreaming for the other half. Dreaming of what it would’ve been like to partake and become whole.

A final metaphorical touch is that the peanut butter jelly sandwich does not even contain the ‘raw’ forms of our heaven and hell actors, they too have been civilized into butter and jelly, thus providing us with a tasty snack, hazard-less, yet containing the full brunt of our civilization in order to produce.

Author’s note: I actually prefer strawberry to grape in my PBJs.


Road to Wigan Pier

(For context, this book was published in 1937.)







On the contradiction of trying to build a utopia:






On Marxism’s failures to relate to reality:





On worshipping the Machine (as socialism does):



On combatting Fascism:



On Socialism needing to get its shit together:


tweetstorms about #bitcoin and #crypto

Lots of good blockchain related content here…


~ @desantis


Bonus link

The Four Layers of the Blockchain

Why Tokens Signal the End of an Era

View at

Adding spheres to a scene using ARKit

Just some spheres floating above my bed


First we’ll want to set up the basic ARKit scene. All this is boilerplate provided if you create an ARKit project in XCode

//  ViewController.swift

import UIKit
import SceneKit
import ARKit

class ViewController: UIViewController, ARSCNViewDelegate {

    @IBOutlet var sceneView: ARSCNView!

    override func viewDidLoad() {

        // Set the view's delegate
        sceneView.delegate = self

        // Show statistics such as fps and timing information
        sceneView.showsStatistics = true

        // Create a new scene
        let scene = SCNScene()

        // Set the scene to the view
        sceneView.scene = scene

    override func viewWillAppear(_ animated: Bool) {

        // Create a session configuration
        let configuration = ARWorldTrackingSessionConfiguration()
        configuration.planeDetection = .horizontal

        // Run the view's session

    override func viewWillDisappear(_ animated: Bool) {

        // Pause the view's session

One nice thing to add when developing with ARKit is the debug point thingies:

// Goes in viewDidLoad()
sceneView.debugOptions = ARSCNDebugOptions.showFeaturePoints


Now, we’ll create a separate sphere class to abstract away the SCNNodes which will contain the sphere:

//  Sphere.swift

import Foundation
import ARKit

class Sphere: SCNNode {

    static let radius: CGFloat = 0.01

    let sphereGeometry: SCNSphere

    // Required but unused
    required init?(coder aDecoder: NSCoder) {
        sphereGeometry = SCNSphere(radius: Sphere.radius)
        super.init(coder: aDecoder)

   	// The real action happens here
    init(position: SCNVector3) {
        self.sphereGeometry = SCNSphere(radius: Sphere.radius)


        let sphereNode = SCNNode(geometry: self.sphereGeometry)
        sphereNode.position = position


    func clear() {


Now, when we want to add a sphere, we can do something like this

    func addSphere(position: SCNVector3) {
        print("adding sphere at point: \(position)")
        let sphere: Sphere = Sphere(position: position)
// if we keep an array of these babies, then calling
// sphere.clear() on each will remove them from the scene

Insert into scene

Now for the interseting bit. To calculate the position at which we’d like to place the sphere, we can take the position of the camera and add a transform in the direction the camera is facing. All this code could be executed in a button press handler, for instance.

I found this handy screenSpacePosition function in a stack overflow post, it’ll do the vector math addition along the z axis. The distance is negative because we want to go further into the scene.

    func sceneSpacePosition(inFrontOf node: SCNNode, atDistance distance: Float) -&gt; SCNVector3 {
        let localPosition = SCNVector3(x: 0, y: 0, z: -distance)
        let scenePosition = node.convertPosition(localPosition, to: nil)
        // to: nil is automatically scene space
        return scenePosition

then, in the button press handler:

if let cameraNode = self.sceneView.pointOfView {

	let distance: Float = 0.3 // Hardcoded depth
    let pos = sceneSpacePosition(inFrontOf: cameraNode, atDistance: distance)    

    addSphere(position: pos)


Another way to do this would be to try to add the object “into” the scene, at a depth which is the location in z space of the object in front of the camera. We can do this with a hit test:

if let cameraNode = self.sceneView.pointOfView {

	let width = sceneView.frame.size.width;
	let height = sceneView.frame.size.height;

	let distance = sceneView.hitTest(CGPoint(x: width, y: height), types: [.existingPlaneUsingExtent, .featurePoint]).first!.distance;
	let pos = sceneSpacePosition(inFrontOf: cameraNode, atDistance: Float(distance))

    addSphere(position: pos)

And that’s all for this post!

LSTM Adventures

Following this as a guide:

1: Started by training with the single-layer LSTM

model = keras.models.Sequential() 
model.add(kl.LSTM(256, input_shape=(X.shape[1], X.shape[2]))) 
model.add(kl.Dense(y.shape[1], activation="softmax")) 


  • final loss after 20 epochs: 1.9054
  • time to train (approx): 1hr
  • mostly gibberish words, but word lengths and spacing look right!
  • can handle opening and closing quotation marks
  • sometimes gets ” ‘?’, said the . “

the mort of the sorts!’ she katter wept on, ‘and toene io the doer wo thin iire.’

‘io she mo tee toete of ther ’ou ’ould ’ou ’ould toe tealet ’our majesty,’ the match hare seid to tee jury, the was aoling to an the sooeo.

‘he d crust bi iele at all,’ said the mock turtle.

‘ie doersse toer miter ’hur paae,’ she mick turtle replied, ‘in was a little soiee an in whnl she firl th the kook an in oare

the rieet hor ane the was so tea korte of the sable, bnt the hodrt was no kently and shint oo the gan on the goor, and whnn hes lene the rueen sas so aeain, and whnn she gad been to fen ana tuiee oo thin shaee th the crrr asd then the was no toeeen at the winte tabbit wat she wiite rabbit wat she mitt of the gareen, and she woole tee whst her al iere at she could,

*note: I tried this again with a 512 unit single layer LSTM, the results were along these lines:

‘i con’t sein mo,’ said alice, ‘ho would ba au all aare an ierse then and what io the bane af in eine th the bare aadi in the cinrsn, and she was soit ion hor horo aerir the was oo the cane and the was oo the tanl oa teing the was soie in her hand

and saed to herself, ‘oh tou dane the boomer ’fth the semeen at the soiee tf the bareee and see seat in was note go the pine afd roe banl th the grore of the grureon,

Training time was slightly longer, and the results are not meaningfully different. One observation here is that training for 20 epochs might be too short…

2:  Added another LSTM layer

model = keras.models.Sequential()


  • final loss after 20 epochs: 1.5144
  • time to train (approx): 2hrs
  • seems to fall into loops
  • closer to ‘english’ words

and mowte it as all, and i dan see the that was a little boom as the soog of the sable it as all. and the pueen was a little boowle and the thing was she was a little boowle and the that was a little boowle and the that was a little boowse and the thing was the white rabbit say off and the thing was she was a little boowle and the that was a little boowle and the that was a little boowse and the thing was the white rabbit say off and the thing was she was a little boowle and the that was a little boowle and the that was a little boowse and the thing was the white rabbit say off and the thing was she was a little boowle and the that was a little boowle

3: Trying again with 3 LSTM layers

model = keras.models.Sequential()
model.add(kl.LSTM(256, return_sequences=True))


  • final loss after 20 epochs (took much longer!):
  • time to train (approx): 2.5 hrs
  • real words, better sentence structure… but it’s also falling into pretty small loops.
  • Different seed text results in the first line being quite different but then quickly devolving into the same loop of the hatter and the mock turtle going back and forth.
at the way that the was to tee the court.

‘i should like the dormouse say “ said the king as he spoke. 
‘i don’t know what it moog and she beginning of the sea,’ the hatter went on, ‘i’ve sat a little sable. 
‘i don’t know what you con’t think it,’ said the mock turtle.



4: Single Layer GRU (for comparison with the single layer LSTM)

model = keras.models.Sequential()
model.add(kl.GRU(256, input_shape=(X.shape[1], X.shape[2])))


  • final loss (20 epochs): 1.87897 (approx the same as the 1 layer LSTM)
  • time to train: 40 minutes (faster!)

tone of the hoore of the house, and the whrt huon a little crrree the sabbit say an in oish of the was soiereing to be a gooa tu and gerd an all, and she whrt huow foonnge to teyerke to herself, ‘it was the tait wuinten thi woils oottle goos,’

‘hht ser what i cen’t tamling,’ said alice, ‘ih’ le yhit herseree to teye then.’

‘i shanl sht me wiitg,’ said alice,

‘what ie y sheu wasy loteln, and teed the porers oaser droneuse toe thet, and the tored harden wo cnd too fuor of the word the was soteig of the sintle the white rabbit, and the tored hard a little shrenge the fab foott of the was sotengi th theee th the was soe tabdit and ger fee toe pame oo her loot ou teie the was soee i rher to thi kittle gorr, and the tar so tae it the lad soe th the waited to seterker

Still gibberish, though more english words. Training for more than 20 epochs might be the key!

Here’s a graph of the loss dropoff over time



Personal Goodreads Ranking Method

This is how I rank books I’ve read.

[link to my goodreads account]

Goodreads uses a scoring system where you can give a book a number of stars out of 5. The usefulness of a scale like that is in using its full range, for instance if I were to rank all books 3, 4, or 5, the scale has really become a 3 point scale and has lost some resolution.

So I’ve been scoring books based off these semantics:

1 star: “Did not like it”. Really not a fan. Wouldn’t recommend, and would probably actively recommend against reading it. Some books have this score, which is surprising because it likely means that I finished reading it (and probably shouldn’t have). Either not worth the time I spent reading it, or made me upset for having wasted my own time.

2 stars: “It was okay”. Reasonable. Not life changing. Not going to recommend it. Pretty much totally neutral. Most recently I read a book about ‘tips for sleeping better’ which I gave a 2. It’s pulp, probably pretty good pulp, but pulp nonetheless.

3 stars: “Liked it”. Worth the read, probably wouldn’t recommend it readily. Most books get this score. High quality average book.

(4 and 5 I’d both call “favorite” or “top books”)

4 stars: “Really liked it”. Really good, I would recommend this to a friend looking for a read. This book will stick with me and become good intellectual fodder to chew over, or a story which I still think about. Probably if you know me you’ve heard me spout some knowledge or something from this book.

5 stars: “It was amazing”. 10/10, everyone should read this book. I’ve never read a book twice but I should really probably read this book twice. Or thrice. This score means the book has drastically changed my worldview, broadened my imagination irreversibly, and/or given me whole new language for thinking and talking about certain ideas.

One-Straw Revolution


This book is Zen and the Art Of Motorcycle Maintenance-esque, in that the first half is about this Japanese guy’s life work and discipline of running a self-sustaining farm, and the second graduates into his life philosophies (as farming has taught him) at length.

Of course, I haven’t ever read ZatAoMM, so I could be off on the comparison.

Fukuoka’s got a pretty small farm (by modern industrial farming standards), an acre for grains and veggies, and 5 or so acres for a mandarin orange orchard. People come to live on his farm to be disciples of his way of life, the farm sustains about 15 people at a time. It’s mostly self sufficient apart from a few purchased goods: soy sauce and vegetable oil, things which would be impracticle to self-produce, and I’m sure some amount of salt/spices/tools, etc are also purchased. They sell a mandarin oranges for profit.

Fukuoka was a research scientist in microbiology and agriculture before falling ill, and while in the hospital realizing that western agriculture was bullshit and that he was going to go do it differently.

He calls his practice do-nothing farming, his mentality is that letting the natural systems do their work means that the farmer can do less. He doesn’t use pesticide to kill insects eating the plants, which allows other insects higher up the food chain to stop the ones eating the plants, and other animals to eat those in turn. Avoiding pesticides allows the whole food chain to reach a happy fixed point, a dynamic equilibrium. Pesticides also have side effects of burning nutrients out of the soil over time. So letting nature run its course means that the farmer doesn’t have to spend the time applying pesticides, and the soil is allowed to grow strong as well. Win-win.

The numerical yield from his farm is the same or higher than that of comparable farms using much more labor-intensive processes.

His grain planting practice was particularly interesting, rice in the warm season and rye/barley in the cool. He doesn’t do any of the complex flooding and transplanting process usually associated with rice farming, instead scattering (he calls it ‘broadcasting’, which I quite like) rice seed in spring among the previous season’s rye and barley, harvesting the rye/barley and letting the rice grow, scattering rye seed, harvesting the rice and letting the rye/barley grow, and so on. All the while he also scatters clover seed, which forms a nice low base layer to help the soil retain moisture and help keep the seeds from being eaten by birds.

Fukuoka’s life philosophies are largely that humans have created a whole bunch of extra work for themselves (see pesticide example), which then begets more work to sustain the side effects, etc.

He says we’ve lost touch with what tastes good, with our natural ability to determine what foods are healthy and what foods our body needs at a given time. He says that really, food straight from the gardens simply prepared is truly delicious, but we’ve convinced ourselves that we need more complex preparations for food to be worthwhile.

I found the book in a list of permaculture/no-till farming authors, this certainly fits the bill. Last week I broadcasted some spinach seed in my vegetable patch in the backyard, as the most accessible version of an experiment of his technique. So we’ll see if the birds eat it or what.