Archives

Blog index

Blog

  • A Crystemas Goman

    Yesterday I threw down a challenge to the Praxis community: 12 Days of Christmas Blogging. Blog every day from the 13th until Christmas. Flex that shipping muscle in the face of holiday obligations and time constraints. Stay on that grind when it is easy to let it slip.

    I’m playing with fire here because I have to ship, too. Like all good challenges, the blade has to cut both ways in order for it to be any fun.

    Here is yesterday’s post: How can I come up with more ideas?Archived Link

    This reminds me of my favorite Christmas story: Sir Gawain and the Green Knight.

    Sir Gawain

    The story opens with at King Arthur’s court where he and his men are exchanging gifts and getting ready to feast. A gigantic green figure atop a green horse rides into the court with an axe and a piece of holly. He challenges the court to “a Crystemas Goman” – someone can strike him with his axe and he will return the stroke in a year and a day. Sir Gawain rises to the challenge and promptly lops off the knight’s head with his own axe. Not missing a beat, the knight picks his head up off of the floor, reminds Sir Gawain that they have date at the Green Chapel in a year and a day, then rides off as abruptly as he arrived.

    I won’t ruin the rest for you. Give it a read this Christmas! The story teems with vivid, meaningful descriptions, double meanings, alliteration, imagery, and symmetry. It is a wonderful read.

    To mark the occasion of my own Crystemas Goman, here is a translation I did of my favorite passage. I used Casey Finch’s Complete Works of the Pearl Poet for the text and the Oxford English Dictionary for reference of word meanings.

    'Nay, frayst I no fyȝt, in fayth I þe telle;				279 Hit arn aboute on þis bench bot berdlez chylder. If I were hasped in armes on a heȝe stede, Here is no mon me to mach, for myȝtez so wayke. Forþy I craue in þis court a Crystemas gomen, For hit is Ȝol and Nwe Ȝer, and here ar ȝep mony: If any so hardy in þis hous holdez hymseluen, Be so bolde in his blod, brayn in hys hede, Þat dar stifly strike a strok for an oþer, I schal gif hym of my gyft þys giserne ryche, Þis ax, þat is heué innogh, to hondele as hym lykes, And I schal bide þe fyrst bur as bare as I sitte.			290 
    “Nay, on my word, I seek no fight;					279 There are about these benches but beardless children. If I were fastened in armor on a noble steed, There is no man here to match me, for their strength is weak. And so I ask in this court for a Christmas game, For it is Yule and the New Year, and here are many agile fellows. If any in this hall holds himself hardy enough, Be so bold in his blood, mad in his mind, That dare swiftly strike one stroke for another, And I shall give him as my gift this well-wrought guisarme, This axe, that is plenty heavy, to handle as he likes, And I shall endure the first blow as bare as I sit.			290 

    Details

    • Frayst: (verb) Ask, seek, try, or test. From Fraisten. (a) To seek or search for (something), esp., to seek adventure or combat, go in quest of; (b) to seek or indulge in (worldly things). – I chose “seek” here because each definition had this in common and because “to seek” is an attempt to find something, which captures the uncertainty of the Green Knight barging in to Arthur’s court, even if he were seeking a fight, because he must be uncertain he will find one. Unfortunately, this translation does not preserve the alliteration in the line (frayst, fyȝt, fayth) but I think using the sequence (to seek, fight, on my word) better preserves the meaning, albeit at the sacrifice of some beauty.
    • fyȝt: (verb) to fight, contend. From Fighten: to contend with weapons, engage in armed conflict (en masse or singly), do battle. Or, (noun) hostile engagement, fight, spiritual or moral struggle. – I think “fight” works best here because just a few lines earlier in the poem uses a different word (batayl) which can mean battle or contend, so if the poet wanted to repeat that, he could have. He instead used “fyȝt” (likely to alliterate). Also, “fight” is more personal than “battle.” Since the Green Knight came alone looking for trouble, he would be looking for a fight, not a battle (which implies large groups fighting.) Also, “contend” today means to struggle with something or engage in a competition, which could have been the case for the Green Knight, but I think “fight” fits better with the other words in the line.
    • Finch’s translation throws in “have I come” at the end of this line which does not appear in the ME. While that phrase seems to be implied in the ME, it is not stated, so it does not make a lot of sense to add it in to the translation. Finch seems to add a lot of unnecessary words in this translation.
    • fayth: (noun) belief, religion, word of honor. From Feith. A formal pledge, assurance, or promise. Also, ‘a confidence’ in someone, so it’s both an outward motion and an inward stance. – I chose “on my word” here to reflect the tradition of and emphasis on oral oaths that knights had and to take into account the phrase “I þe telle” at the end of the line. “On my word” conveys the idea of a spoken pledge, which takes into account both “fayth” and “telle.” To give one’s word is a verbal pledge that someone must take in faith.
    • telle: (verb) from Tellen. tell, speak, say, describe, express, utter, report – See explanation for “fayth” above.
    • Hit: it, there, etc. – Paired with “arn” it is appropriate to translate this as “there are” since the line is about all of the men (plural) on the benches.
    • Aboute: (adv) about, around, towards every side, in all directions, in every part of something, everywhere, throughout – About gives the idea that they are on and all around instead of just around the benches. Also, “about” is a concise way to both alliterate with “are” and to portray the idea that the only people the Green Knight sees on and all around the benches around the table are “berdlez chylder.”
    • Bot: but, only quite, except; Alternate definition: a parasite affecting the skin. – I chose “but” here as it seems the most likely translation for “bot” and it alliterates with “benches” and “beardless.” I found it interesting, though, that “bot” is also a skin parasite. It is possible, if this parasite was common, the Pearl poet could have a little laugh at the idea of beardless youth/puny men being parasites upon Arthur’s benches. I think it is unlikely that this is the first meaning of the line, but it is interesting nevertheless. “But” better fits the idea that the only men around Arthur’s bench are “berdlez chylder” and the Green Knight is poking fun at them.
    • Berdlez: (adj) Without a beard, beardless, not having reached manhood, underage. – “Beardless” is both alliterative and a concise way to call out Arthur’s men as being puny and not worthy to fight a real man like the Green Knight. Calling a man beardless is a pretty good jab at him. It implies – “You must not be a man because you can’t grow a beard.” This leads to the next word.
    • Chylder: (noun) youth, child, a youth of noble birth, esp. an aspirant to knighthood – The Green Knight does not actually mean there are children sitting around Arthur’s table. He is poking fun at the strength and size of the men. They are all likely around the Green Knight’s physical age, but he is saying he is stronger than they are and they are not worthy to be called men. Using “children” here is more of a jab in modern language at the men around the table than calling them “youth.” Calling a losing football team “youths” will get you yelled at. Calling them “children” will probably get you beat up. When the Green Knight says these first two lines, he is basically saying he is not seeking a fight because there are only little boys here, not men worthy enough to fight him.
    • Hasped: (verb) from Haspen: To fasten (a door) shut; to fasten (a helmet), buckle or lace; to wrap (oneself) in a garment; enclose (in armor, clothing); to embrace (someone’s neck), clasp. – Taken together with “in armes” I translated this as “fastened in armor” because being wrapped or enclosed in armor does not make much sense. A warrior or knight fastens his armor in preparation for a fight to make sure it does not fall off.
    • Armes: arms, armor. Taken together with “hasped in arms” would then mean to be fastened or buckled in one’s armor. (See previous explanation.)
    • Heȝe: (adj) high, lofty, noble, excellent, tall, great. – “noble” – See explanation for “stede” below.
    • Stede: A splendid, noble, spirited horse; a riding horse, a steed; (b) a war horse, charger; – I preserved what this word becomes in modern language, “steed.” Paired with the previous word, I translated this to “noble steed.” The Green Knight is a big, powerful knight and thus should be paired with a large, noble steed on which to pursue glory. The word “noble” encompasses high, tall, and lofty in itself, so I think it appropriate.
    • Note: This line is somewhat factious because the Green Knight just charged into the room on his massive steed in his armor. The “were I” is a conditional and a roundabout way to say that he can beat anyone in the room. Since he is in armor on his steed, he is saying that no one in the room is as powerful as he is. Also, a note on Finch’s translation: “on a heȝe stede” does not really match up to “warlike on steed.” Heȝe refers to the steed, not the Green Knight. Finch takes a lot of liberty with this line.
    • Mach: (verb) from macchen: To be an adequate opponent for, equal; be equal to, to match. Or: To marry; to become familiar with; to be paired with, work for, serve. Or: To fight, oppose, attack; also, to attack and overcome. – I chose “to match” here, but with the different definitions it could go multiple ways. Referring back to a hypothetical fight, “to match” works well here because it can mean an opponent that the Green Knight is paired with or that there is literally no one in the court to match the Green Knight’s skill and strength. The word play is interesting here, though: the “work for,” or “serve” can mean that there is no one in the court that the Green Knight would even let work for or serve him. Basically, the idea I tried to capture is that there is no one in this court, by the Green Knight’s opinion, as great as he is.
    • Myȝtez: from myȝt: might, can, may, will. Or: physical energy, vitality, vigor; exhausted, unconscious; very vigorous; physical strength. – I chose “strength” here because, paired with “so wayke,” “may” does not make sense and the idea of “feeble physical energy” is not very appealing. The idea that no one can match the Green Knight because their strength is so weak makes a lot more sense and fits in with the storyline. Also, see part of the explanation for “wayke.” The potential word play here is interesting, though, if “exhausted” or “unconscious” is taken to be the translation of myȝtez, because we get the line to mean something like: “There is no man here to match me, for they will be exhausted because they are so weak.” It adds a little different meaning. I think “strength” here fits better, though, because the Green Knight is continuing his jabs at them by calling their strength weak.
    • Wayke: (adj) Weak, feeble. Of combative strength: ineffectual; deficient in bodily or muscular strength – I picked “weak” as it has the connotation of the rest of the possible definitions. “Deficient bodily or muscular strength simply means “weak” in modern usage. (This also strengthens the case for using myȝtez to mean “strength.”) Calling someone’s strength weak in modern language has a little more of a sting to it than calling their strength feeble or ineffectual. See part of the explanation above.
    • Note: Finch’s translation of this previous line is intriguing, especially since he takes the last part to mean: “though mighty and sure.” The mighty part works well, but nowhere did I find wayke to mean “sure” – Finch in the back does not even translate it that way. In the back, it is translated similarly to above.
    • Forþy: (conj) For that, on that account, therefore, consequently, accordingly, and so. – I chose to translate forþy as “and so.” This one was somewhat difficult for me because I think the meaning of “therefore” might have changed from ME to modern english. When I think of “therefore,” I think of something logically following from the previous statements. This does not: I am not here for a fight, therefore I am here for a game. “And so” captures the idea that the Green Knight is not here for a fight, “and so” he will reveal what he is actually here for. This is one spot where I really like Finch’s translation. Finch translates it as “No! I come to this court…” This captures the idea that the Green knight is reaffirming that he is not there for a fight and he reveals what he, therefore, is there for. (Ha, couldn’t resist.)
    • Craue: (verb) From craven: to ask or beg for. Or: To long for, desire. Or: (noun) neck; throat; crop of a bird or fowl, craw. – Given the context, I think the neck/crop of a bird meaning is right out. In this case, I think it is either to ask, beg, or desire. I translated it as “ask” because it fits in with coming to the court to “seek” something… ask and seek go hand in hand. There is potential word play here and it can go multiple directions. For example, if craue is taken as “beg,” we get a very different situation with the Green Knight. Instead of the GK being in charge of the given situation, he is at the mercy of Arthur if he is begging. Also, if we take craue as “desire” we get another meaning (explained in gomen below.)
    • Crystemas: Christmas
    • Gomen: game, festivity, revelry; a pastime, amusement; or joy, happiness. – I chose “game”here for the mystery associated with “Christmas game” that gets the reader wondering what this game is. There is wordplay going on, however. Should we take gomen to mean festivity or revelry, we get a different meaning because Christmas festivities and revelries are exactly what is going on at the court. Of course, when we read ahead, we understand that he is looking for more than revelries, but a game which he will spell out. If we take gomen to mean joy, we get yet another meaning, especially if we choose craue to be desire and gomen to mean joy. In this case, the Green Knight would have came to the court desiring Christmas joy, which could be a number of things. Again, if we read ahead and find out what he is really looking for, the “Christmas joy” must be a very strange notion of joy. I think game fits best.
    • Ȝol: Yule, the Christmas season generally, Yuletide or Christmastime; specif. the festival season from Christmas Eve to Epiphany
    • Nwe Ȝer: New Year
    • Ȝep: Physically agile, skilled at a physical activity, adroit; nimble, active, quick; vigorous, lively; also, youthful in appearance or manner Or: Mentally agile, sharp-witted, astute, clever; also, as noun: clever fellows; full of stratagems, wily; also, full of sleights, crafty, cunning – I chose “agile” here to preserve the poet’s open-ended meaning. Agile can refer to either mentally or physically agile – we will only know when the Green Knight reveals the game. (When he does, we realize it is a sense of both.) For either mental or physical, agile covers the other possible ways of translating this word. There is also a word play going on here with relating the mental or physical agility of the men to the season. A new year is seen to be lively, vigorous, and agile. Also, strangely, the poet says in this line that there are agile or lively men in this court, right after he pokes fun at them for being “berdlez chylder.” I haven’t quite figured out what to make of this except that he is possibly tempting them into his “game” with this statement.
    • Mony: many, many a one; Or money; Or moon. – I was unsure about this word because I could not find a clear definition of it. There are a number of words in the MED that looked like they could work, but none of them made sense in the context (like money or moon.) I just settled on many because that is what the reference in the back of Finch used and it works well with the the idea that there are many agile fellows in Arthur’s hall. I suppose the translation could be something like “and here is cunning money” but I am not sure that fits in the poem.
    • Hardy: (adj) Physically tough, hardy, enduring, brave, bold; of actions, faith: requiring resolution or courage, firm, fierce; Or: Audacious, presumptuous, rash, foolhardy – I translated this as “hardy” – the same as in ME, because it preserves the open-ended meaning of the word. The word play here is interesting… it could mean bold, tough, brave, or firm on one hand, or presumptious and rash on the other hand. Of course, these seemly different meanings go hand in hand–pride is a double-edged sword.
    • Hous: (noun) house, building, hall, etc. Or a covering for the back and flanks of a horse, horsecloth; also, a saddle cloth; a protective covering, case, sheath; – I translated this as “hall” since these scene takes place in Arthur’s hall. Also, I wanted to preserve alliteration here: (hall holds himself hardy.) Another possible meaning emerges if we takes this as either a protective covering or a saddle cloth: the Green Knight could be poking fun at the men that act bold when protected from blows by armor or when they sit high on a horse, but would get defeated easily.
    • Holdez: holds, claims, thinks, views. – I chose “holds” for holdez in order to preserve the alliteration in this line. Changing from holds to claims, thinks, or views has a slight change in meaning, but nothing of depth. Since these have close to the same meaning in the context of the line, I chose the one that alliterates the best to preserve the alliteration from the ME.
    • Hymseluen: himself
    • Bolde: bold, valiant, daring. Of persons: brave, courageous, daring, fearless. Or: overconfident, forward, rash; brazen, presumptuous, shameless, impudent; – I chose “bold” here because bold has multiple meanings in modern language, just as it does in ME. Again, there is good word play here with the line between boldness and overconfidence.
    • Blod: blood, emotion, anger, passion, (sexual) desire; courage, mettle, spirit; temperament, nature; Or: A living being, a creature, a person. – I chose “blood” here for two reasons: alliteration with bold and one of its modern meanings: temperament or disposition. We can choose any of these words and get the line to mean something slightly different, but having a bold temperament pretty much covers most of these. The poet could be pulling in a critique of knights under the rug if he had in mind that bolde in blod could mean bold or shameless in sexual desire.
    • Note: It is important to keep in mind that tweaking any of the words in a line could give the line a different meaning every time. Since each of these words in ME has multiple meanings, the meaning of each line (not to mention how each line interacts with each other line) starts to cover a wide range very quickly.
    • Brayn: (adj) mad, reckless, insane. (noun) brain (body part) – This has two different meanings depending on if we use it as an adjective or a noun. If a noun, then we get the end of the line to be: “brain in his head”-which is a fact, but not very insightful. We all have brains in our heads. If we take it as an adjective, however, we get “mad in his head,” which points to insanity. I chose to treat it as an adjective and translate it as “mad in his mind” in order to preserve the alliteration of the line (though as Ms instead of Hs) and so that it adequately reflects the beginning of the line. (boldness and insanity can be different sides of the same coin.)
    • Hede: head, the seat of the mind; the mind; heart and mind; headstrong rashness; impetuously, rashly, unadvisedly. – I chose “mind” here in order to create some alliteration and to help convey the idea of insanity. Given the other possible meanings of “hede,” I think this is justified. (headstrong rashness; impetuously, rashly, unadvisedly)
    • Dar: (verb) dare, to have the courage to, to be able to, or shrink, cower, bow down, submit. – I chose “dare” here to portray the idea that someone might be mad enough to have the courage (read: dare) to take the Green Knight up on his offer. The interesting possible word play here is that instead of dare, one might be mad enough to “bow down,” “shrink,” or “submit” to the Green Knight’s game. This could be pointing back to the beginning of the Green Knight’s monologue where he makes fun of the men for being weak. He could be suggesting that if they give in to his game they are weak in yet another way and can be easily manipulated.
    • Note: What is intriguing here is that the one who is “mad in his mind” and “dares” to take the Green Knight up (or is manipulated by him) initially is only King Arthur…
    • Stifly: Staunchly, steadfastly; unwaveringly; without ceasing, persistently; also, refractorily, stubbornly; boldly, swiftly, valiantly, courageously; also, proudly; also, loyally. – I chose “swiftly” here for alliterative purposes and to portray the motion of swinging a large axe through words. Also, it gives the connotation of someone stepping up without hesitation to exchange one blow for another (because stifly has more than one meaning in this situation and I tried to preserve that.)
    • Strok: (noun) A stroke, a blow delivered with a weapon; a slash, cut; a thrust or stab – I chose “stroke” here because a stroke is just one swing, which preserves the rules of the Green Knight’s game–one stroke for another.
    • Anoþer: another, a second. – Though there is not much here, I think choosing “another” over “a second” needs an explanation. One strike for another gives conveys the idea of that “another” being a reciprocal strike rather than a second strike from the hand that struck first. Though “a second” would have added to the alliteration, I don’t think the meaning was clear enough to warrant using it.
    • Schal: (verb) shall, will, must. – I chose “shall” here because the meaning of shall in modern language expresses a strong assertion. The Green Knight is giving his word (back again to the importance of oaths) and will not break it. This is a theme in the rest of the poem.
    • Giserne: A long-shafted battle ax or halberd with a knife-like point rising from the blade – or the gizzard of a fowl; the liver of a fowl or a hare; the entrails of a fowl. – I chose guisarme here because that is the modern word for the weapon the Green Knight had and gives the reader a definite idea of what it is. If giserne did, in fact, also mean the entrails of a fowl, then this line has comical undertones–the Green Knight giving one of Arthur’s men gizzards as a gift. It is almost certain the GK meant his axe, but the potential double meaning is comical.
    • Ryche: (adj) rich, splendid, ornate, fine, noble, costly, precious, well-wrought, well-made. – I chose “well-wrought” here because it assumes and subsumes the other adjectives I found for ryche.
    • Heué: heavy, serious, grievous. – I chose “heavy” here as I wanted to put the emphasis on the axe’s weight (see explanation for innogh below.) The poet had word play going on here, though, because the two other definitions for heué give the line different meanings. A serious or a grievous axe have darker, more chilling undertones than a heavy one. This possibly forebodes what might happen later in the poem.
    • Innogh: (adj or adv) enough, plentiful, generous, abundant, great, very. – I chose “plenty” here because not only is the Green Knight expressing the weight of the axe, but he is making another statement here as well. Earlier he said it is “noble” or “well-wrought.” The weight of it could be a sign of its authenticity. “Plenty” is the Green Knight’s way of assuring the men that it is indeed well-wrought and its weight alone might be sufficient to display that.
    • Hondele: (noun) A handle of a container, implement, etc.; a grip or hilt of a sword.
    • Lykes: likes, pleases, wishes, chooses, approves
    • Schal: (verb) shall, will, must. – Again, I chose “shall” here because the meaning of shall in modern language expresses a strong assertion. The Green Knight is sure he will endure the blow and he is making a promise to his hosts that this is the case.
    • Bide: (verb) remain, wait, stay, endure; from Biden: to experience or undergo (sth.); to suffer or bear (hardship, etc.); to enjoy – I chose “endure” here to express the idea that not only will the Green Knight take the blow, but he will patiently take it, he will not be harmed by it, and he will wait a while year before he retaliates (as we find out a few lines later.) To change “endure” to suffer or bear would be to irretrievably lose some of this meaning.
    • Bur: (noun) from burre: onslaught, blow, force, or strike. – I chose “blow” for alliterative purposes.
    • Bare: (adj) bare, naked, without armor, unprotected, or open. Also, unadorned, unornamented; simple, plain, crude, laid waste, destitute, or poor. – I chose to keep this as “bare” because it portrays the idea that the Green Knight is not going to have extra protection, pull any tricks, or try to defend himself. Bare can mean without armor and unprotected, but also open, which helps the idea that he will not protect himself. He will be under the axe just as Arthur’s men see him.
  • How can I come up with more ideas?


    The old saying, “You are what you eat”, applies to the creative process. If you want to be creative and come up with ideas, the best thing you can do is engage the creative ideas that are already out there. Not because you want to copy or emulate them, but because creative ideas catalyze other creative ideas. https://discoverpraxis.com/more-ideas/Archived Link

  • My BTC, BCH, and Ripple Strategies


    The past few days have been quite a ride in the crypto world! This rollercoaster is reminiscent of late 2013, except now there is much more skin in the game. My latest piece on Yours.org covers my history with BTC, BCH, and Ripple, and my investment and use strategies for the currencies. Read this piece over at https://www.yours.org/content/my-btc–bch–and-ripple-strategies-cb2b3d401e30.

  • Does the Environmental Case Against Bitcoin Have Merit?


    I’m not sure that we have a bitcoin-caused environmental energy crisis on our hands. This piece on Yours.org points out some of the issues with the articles going arount about bitcoin and the environment. Read this piece over at https://www.yours.org/content/does-the-environmental-case-against-bitcoin-have-merit–656fd7d75c0f.

  • Selling Photos on Yours.org


    This afternoon I decided to try Yours.org, a site where you can write articles, decide what to charge for them, and get paid in bitcoin cash. I had an idea: If you pay and then a section is revealed to you, that doesn’t have to be just for articles. It can be used for anything digital!

    A few ideas:

    • Podcasts
    • Photo filter packs for Lightroom
    • Digital art
    • eBooks
    • Word and Powerpoint templates
    • Photoshop and Illustrator files
    • Music
    • Videos
    • WordPress themes

    So, I decided to test it out. I packaged up four sets of national parks photos, put a thumbnail grid in the preview, and put a download link in the paid section:

    I’m testing three different price points: $15, $10, and $5.

    I also wrote a piece on how to use Yours.org for selling digital products. I priced it at $2.

    In just a few hours I made over $40 in bitcoin cash! It is super exciting seeing the notifications come in while you are reading other articles. I think that the notifications are tied to transaction verifications because they come in waves. That must be when blocks get processed and transactions verified.

    Yours.org articles

  • Bulk Clearing Expiration Dates in Restrict Content Pro


    At Praxis we use Restrict Content Pro as the membership system for our curriculum portal. We decided that all grads get access for life, not just during the program. So, I needed a way to clear over 200 member expiration dates. The only bulk method available through the WordPress interface is to set the expiration dates to another date in the future, which would just kick my problem further down the road. So I needed to dust off my SQL knowledge and directly edit the database.

    Step 1: Back up the database.

    Don’t be a fool. Back up your database and test the queries on a local development version first. Never run queries for the first time on production. The backup is also a failsafe that you can restore if something goes wrong despite your testing.

    Step 2: Find the data.

    I saw that all data related to Restrict Content Pro usually had rcp somewhere in the table, column, or key. So I started with the rcp tables. They had nothing to do with expiration dates, so I checked the wp_usermeta table since RCP extends the WordPress users with more functionality. Bingo. There was a column called meta_key with rcp_expiration in it with corresponding date values.

    Step 3: Make sure you are editing the correct data by running a SELECT statement first.

    Sure, you could run your UPDATE statement first, but I like to make sure I am editing the correct data by running a SELECT statement first and then using the same WHERE clause for my UPDATE statement.

    After a few stupid syntax errors, here is the SELECT statement that got exactly what I wanted. This shows the user ID so I can spot check, restricts searching to the rcp_expiration meta key, and looks for values that are not none.

    SELECT user_id, meta_key, meta_value FROM wp_usermeta WHERE meta_key = 'rcp_expiration' AND meta_value != 'none';

    This returned 176 results. When I changed it to show only meta values that were none, I got 31 values. 31+176=207, which is the total number of users. Looking good.

    Step 4: Craft your UPDATE statement.

    Now that we know we selected the correct data with our previous statement, it is time to craft our UPDATE statement.

    Here I’m updating the wp_usermeta table and setting the meta_value to none where the meta_key is rcp_expiration and the corresponding meta_value is not none.

    UPDATE wp_usermeta SET meta_value = 'none' WHERE meta_key = 'rcp_expiration' AND meta_value != 'none';

    I tested this on my local machine and it updated 176 rows. Just like we wanted.

    Step 5: Run the same query on production.

    Now that we’ve tested the query in our development environment and verified that we got the results we wanted, we can run the query on the production database. If you use phpmyadmin and want to triple check that you aren’t messing anything up, you can click the “Simulate Query” button first. (I did.)

    Step 6: Verify things worked.

    Log in to WordPress and check the RCP membership area. Verify that all expiration dates are now set to none. Also verify that your users can still log in. You should have a few user test logins specifically for this purpose. You can also check your site logs throughout the day to make sure people are still logging in. You can’t count on them always letting you know when something doesn’t work. More often than not they will just stop using it. It is up to you to verify everything works as it should!

  • Adding Months to a Calculated Date in Salesforce


    Adding dates is tricky. Months have different numbers of days, so you can’t rely on just adding 30 days to get an extra month. You also can’t just add a certain number of months because formulas in Salesforce don’t auto increment the year. The solution is modular arithmetic and conditionals.

    The goal here was to make a set of fields to send out emails on the first day of each month for 6 months, given a specific month to start with.

    What I’m doing here is:

    • Year: Figuring out the month number, adding one less than the number of months over all, dividing it by 12, and rounding down to add either a 0 or 1 to the year. You have to subtract one from the month because 12/12 = 1 and you don’t want December adding an extra year.
    • Month: If the resulting month is December, return 12. Otherwise return the month number modulo 12. (12 mod 12 is 0, hence the conditional).
    • Day: Always returning 01, the first day of the month.
    DATE(   YEAR( date ) + FLOOR( ( MONTH ( date ) + number_of_months - 1 ) / 12 ),   IF( MONTH ( date ) + number_of_months = 12, 12, MOD( MONTH ( date ) + number_of_months, 12 )),   01 ) 

    How to use this: the date variable should be the date field you are starting with. You should replace number_of_months with the number of months you want to add to the original date. If the date is 07/01/2017 I want this to go out on 08/01/2017, I’d set number_of_months to 1. If 09/01/2017, I’d set it to 2, etc.

    Note: This only works for the first of each month. If you need it to work on any day of the month, use this more complicated solution to account for months having different lengths.

  • Automating MySQL Backups with Gulp


    As I mentioned a few days ago, I’m using Gulp on a new WordPress project. I like to back up my work every night, and since a lot of WordPress config and customization happens in the WordPress editor and widgets, that means backing up the mysql database as well as the code.

    Why not use this newfound tool? Let’s do it.

    I did some searching and found Gulp WordPress Backup, but it was overkill for what I wanted. But I saw that it used an npm package named mysqldump, for the export, so I grabbed that and started setting up a new task in gulpfile.js:

    // add mysqldump as a dependency var mysqlDump = require('mysqldump');  // dumpDatabase gulp.task('dumpDatabase', () => { return new Promise((resolve, reject) => { mysqlDump({ host: 'localhost', user: 'user', password: 'pass', database: 'wp_database', dest: 'backup.sql' }, (err) => { if (err !== null) return reject(err); }); }) .catch((err) => { console.log(err); }); });

    Next step: Defining the filename. I just wanted to use today’s date because I intend on running this at the end of each work day. Since gulp is all javascript, this is easy:

    var today = new Date(), dd = today.getDate(), mm = today.getMonth()+1 //January is 0! yyyy = today.getFullYear(); if(dd<10) { dd = '0'+dd } if(mm<10) { mm = '0'+mm } today = mm + '-' + dd + '-' + yyyy;

    Add this to the gulp task and you are good to go!

    gulp.task('dumpDatabase', () => { var today = new Date(), dd = today.getDate(), mm = today.getMonth()+1 //January is 0! yyyy = today.getFullYear(); if(dd<10) { dd = '0'+dd } if(mm<10) { mm = '0'+mm } today = mm + '-' + dd + '-' + yyyy;      return new Promise((resolve, reject) => {         mysqlDump({             host: 'localhost',             user: 'user',             password: 'pass',             database: 'wp_database',             dest: 'SQLBackups/' + today + '.sql' // Outputs to the folder named SQLBackups and uses today's date as the filename.         }, (err) => {             if (err !== null) return reject(err);         });     })     .catch((err) => {         console.log(err);     });  });

    Make sure you add mysqldump to your project’s package.json, or at least run npm install mysqldump before using!

  • Fixing s3_website Java 9 Error with jEnv


    When I updated to macOS High Sierra, a bunch of necessary stuff broke: Jekyll, Homebrew, Node.js, and a bunch of gems. s3_website, the tool I use to deploy my Jekyll site to S3, was one of the gems that just completely disappeared. When I went to reinstall it, I got an error that I didn’t have Java installed. Against my better judgment, I went to the URL listed and installed it. Then I ran s3_website push.

    After about 30 seconds, I got an error saying that s3_website doesn’t work with Java 9, which was the most recent version at the link. And also the version you get with brew cask install java. Well, shit.

    Exception in thread "main" java.lang.ExceptionInInitializerError 	at org.jruby.Ruby.newInstance(Ruby.java:266) 	at s3.website.Ruby$.rubyRuntime$lzycompute(Ruby.scala:4) 	at s3.website.Ruby$.rubyRuntime(Ruby.scala:4) 	at s3.website.model.Config$$anonfun$15.apply(Config.scala:229) 	at s3.website.model.Config$$anonfun$15.apply(Config.scala:227) 	at scala.util.Try$.apply(Try.scala:192) 	at s3.website.model.Config$.erbEval(Config.scala:227) 	at s3.website.model.Site$$anonfun$2.apply(Site.scala:28) 	at s3.website.model.Site$$anonfun$2.apply(Site.scala:27) 	at scala.util.Success.flatMap(Try.scala:231) 	at s3.website.model.Site$.parseConfig(Site.scala:27) 	at s3.website.model.Site$.loadSite(Site.scala:100) 	at s3.website.Push$.push(Push.scala:62) 	at s3.website.Push$.main(Push.scala:40) 	at s3.website.Push.main(Push.scala) Caused by: java.lang.RuntimeException: unsupported Java version: 9 	at org.jruby.RubyInstanceConfig.initGlobalJavaVersion(RubyInstanceConfig.java:1878) 	at org.jruby.RubyInstanceConfig.(RubyInstanceConfig.java:1585) 	... 15 more

    After lots of searching, I came across a kind soul on Github suggesting that we use jEnv to define which java environment to use in the directory.

    When I first installed jenv, I couldn’t add versions to the tool. I kept getting this error:

    ln: /usr/local/opt/jenv/versions/oracle64-9.0.1: No such file or directory

    The fix is described here: https://github.com/gcuisinier/jenv/wiki/Trouble-Shooting. Once I added version 8 as well, I switched to version 8 locally with this:

    jenv local oracle64-1.8.0.151

    Then I opened a fresh Terminal window and ran s3_website again and everything pushed up to s3 without an issue.

  • Making line height work with spans


    The line-height attribute doesn’t work on span by default. If you need to use line-height on a span, you’ll need to set display:block; on the span element to make it display as a block element (like

    ).

  • d3.nest


    While working on the 51 Line Charts for my Opioid Crisis data visualization, I ran into an issue with generating all 51 charts at the same time: The data was either in 51 rows stacked and I couldn’t access the dates effectively, or 306 rows unstacked and I had 6x as many objects as I needed when I did a join.

    The solution was to use D3.nest. Nesting allows elements in an array to be grouped into a hierarchical tree structure; think of it like the GROUP BY operator in SQL, except you can have multiple levels of grouping, and the resulting output is a tree rather than a flat table. The levels in the tree are specified by key functions.

    When I used the state as a key, it grouped each state’s data together in a tree.

    Input:

    state,code,year,deaths,adjrate Alabama,1,2010,547,11.8 Alabama,1,2011,552,11.8 Alabama,1,2012,562,12.1 Alabama,1,2013,598,12.7 Alabama,1,2014,723,15.2 Alabama,1,2015,736,15.7 Alaska,2,2010,83,11.6 Alaska,2,2011,107,14.2 Alaska,2,2012,129,17.4 Alaska,2,2013,105,14.4 Alaska,2,2014,124,16.8 Alaska,2,2015,122,16 Arizona,4,2010,1098,17.5 Arizona,4,2011,1071,16.9 Arizona,4,2012,1134,17.7 Arizona,4,2013,1222,18.7 Arizona,4,2014,1211,18.2 Arizona,4,2015,1274,19 Arkansas,5,2010,350,12.5 Arkansas,5,2011,355,12.6 Arkansas,5,2012,373,13.1 Arkansas,5,2013,319,11.1 Arkansas,5,2014,356,12.6 Arkansas,5,2015,392,13.8

    D3 code:

    d3.nest()   .key(function(d) { return d.state; })   .entries(data);

    Output:

    [   {     "key": "Alabama",     "values": [       {         "state": "Alabama",         "code": "1",         "year": "2010",         "deaths": "547",         "adjrate": "11.8"       },       {         "state": "Alabama",         "code": "1",         "year": "2011",         "deaths": "552",         "adjrate": "11.8"       },       {         "state": "Alabama",         "code": "1",         "year": "2012",         "deaths": "562",         "adjrate": "12.1"       },       {         "state": "Alabama",         "code": "1",         "year": "2013",         "deaths": "598",         "adjrate": "12.7"       },       {         "state": "Alabama",         "code": "1",         "year": "2014",         "deaths": "723",         "adjrate": "15.2"       },       {         "state": "Alabama",         "code": "1",         "year": "2015",         "deaths": "736",         "adjrate": "15.7"       }     ]   },   {     "key": "Alaska",     "values": [       {         "state": "Alaska",         "code": "2",         "year": "2010",         "deaths": "83",         "adjrate": "11.6"       },       {         "state": "Alaska",         "code": "2",         "year": "2011",         "deaths": "107",         "adjrate": "14.2"       },       {         "state": "Alaska",         "code": "2",         "year": "2012",         "deaths": "129",         "adjrate": "17.4"       },       {         "state": "Alaska",         "code": "2",         "year": "2013",         "deaths": "105",         "adjrate": "14.4"       },       {         "state": "Alaska",         "code": "2",         "year": "2014",         "deaths": "124",         "adjrate": "16.8"       },       {         "state": "Alaska",         "code": "2",         "year": "2015",         "deaths": "122",         "adjrate": "16"       }     ]   },   {     "key": "Arizona",     "values": [       {         "state": "Arizona",         "code": "4",         "year": "2010",         "deaths": "1098",         "adjrate": "17.5"       },       {         "state": "Arizona",         "code": "4",         "year": "2011",         "deaths": "1071",         "adjrate": "16.9"       },       {         "state": "Arizona",         "code": "4",         "year": "2012",         "deaths": "1134",         "adjrate": "17.7"       },       {         "state": "Arizona",         "code": "4",         "year": "2013",         "deaths": "1222",         "adjrate": "18.7"       },       {         "state": "Arizona",         "code": "4",         "year": "2014",         "deaths": "1211",         "adjrate": "18.2"       },       {         "state": "Arizona",         "code": "4",         "year": "2015",         "deaths": "1274",         "adjrate": "19"       }     ]   } ]

    A few useful tools and resources for understanding d3.nest:

  • Giving Atom a try


    I’ve used Coda by Panic as my IDE of choice for 10 years now, but I think it is starting to fall behind other tools. It isn’t updated often and there aren’t nearly as many community-built packages as other tools have. So I’m giving both Atom and Sublime a try. I’m trying Atom first.

    In my first few days of use, here are some things I love:

    • d3-snippets package – The D3 is super powerful, but unless you use it every day, it is easy to forget the syntax for its huge array of features. I usually need to keep the documentation open in another window. With this package I just need to start typing what I need and I get a list of options with useful snippets.
    • language-liquid package – Finally, highlighting liquid syntax! Coda didn’t have this.
    • platformio-ide-terminal package – Yeah, opening terminal.app in another window is easy. But having everything in one place is great.
    • It is so easy to find and install new packages for Atom. And there are so many!
    • Git integration – I usually use the command line for git, but I love being able to see which files in the sidebar are new, modified, and staged. Then with the click of a button I can commit and push them.
    • Easy customization – Within seconds I was able to switch themes and default fonts.
    • Multi line editing. Protip: On a Mac go to System Preferences > Mission Control and turn off the Control + Shift + Up Arrow and Down Arrow keyboard commands, which you can then use in Atom for multi line selection and editing.
  • Gulp and Sketch first use notes


    I’m working on a new WordPress theme development project and using Gulp and Sketch for the first time. Here are my first use notes:

    Gulp

    • Toolkit for automating tasks. Tons of packages available for things like minifying JS, compiling Sass, linting, packaging into zip files, pushing content to S3 and external servers, watching and automatically rendering changes in the browser, etc.
    • Pain to install. Dependencies all the way down.
    • Everything important goes in gulpfile.js

    Here are the tasks I’m using:

    • gulp styles — Compile, autoprefix and minify Sass files.
    • gulp scripts — Minify javascript files.
    • gulp images — Compress and optimize images.
    • gulp watch — Compile assets when file changes are made, start BrowserSync
    • gulp — Default task – runs all of the above tasks.
    • gulp zip — Package theme into zip file for distribution, ignoring node_modules.

    Sketch

    • I love being able to take layers, merge them, and export them as different image formats. This makes exporting background content a breeze.
    • No longer do I need to toil with eyeballing buttons and trying to figure out their padding, background gradients, and border radius. Code export is a gift from above.
    • I like their price model. Use the app for life, free updates for a year, resubscribe when you need more updates.

  • TLDR pages – Simplified man pages with practical examples. Probably covers 80% of your daily use cases. Looks super cool.

  • Great email from Paul Jarvis’s Sunday Dispatches this week. The relationship doesn’t end once you make the sale. That is just the beginning. Don’t be the hot tub guy.

  • Fixing “Media kit reports not enough space on device” error in Disk Utility


    I got this error today when trying to partition a Western Digital My Passport 4TB:

    Volume erase failed: Media kit reports not enough space on device

    Nothing I could do inside Disk Utility worked. Thanks to some kind soul on Reddit, here is how I solved the issue from the command line:

    $ diskutil list
    $ diskutil unmountDisk force disk2  #replace disk2 with your disk number

    and then write zeros to the boot sector:
    $ sudo dd if=/dev/zero of=/dev/disk2 bs=1024 count=1024

    Attempt to partition it again:
    $ diskutil partitionDisk disk2 GPT JHFS+ "My External HD" 0g

  • Get Back On Track


    Sometimes I get off track. This is what I need to do to get back on track:

    1. Turn off social media. Remove apps from phone, turn on the 1Blocker (iPad and iPhone) and WasteNoTime (Mac) rules.
    2. Wash your face.
    3. Drink a full glass of water and eat a healthy snack if you need one.
    4. Get your keys and headphones, put on a podcast, go for a walk around the building. Breathe deeply the whole time. Check the mail when you come back in.
    5. Clean off your desk, clean off the dining table, and empty/load the dish washer.
    6. Turn off the podcast and turn on music (Jazz Vibes, Hundred Days Off, or Tycho). Sit down at the dining table with your notebook and make a list of the most important things that need to get one. Evaluate each item and block out a time on the calendar to knock it out over the next few days.
    7. Pick one thing to start work on immediately. Start working.
  • Venkatesh Rao on Big Data, Machine Learning, and Blockchains


    ,

    Venkatesh Rao had a good take on the big data/machine learning/blockchain mania in Breaking Smart a few weeks ago:

    Many people, database experts among them, dismiss Big Data as a fad that’s already come and gone, and argue that it was a meaningless term, and that relational databases can do everything NoSQL databases can. That’s not the point! The point of Big Data, pointed out by George Dyson, is that computing undergoes a fundamental phase shift when it crosses the Big Data threshold: when it is cheaper to store data than to decide what to do with it. The point of Big Data technologies is not to perversely use less powerful database paradigms, but to defer decision-making about data — how to model, structure, process, and analyze it — to when (and if) you need to, using the simplest storage technology that will do the job.A organization that chooses to store all its raw data, developing an eidetic corporate historical memory so to speak, creates informational potential and invests in its own future wisdom.

    Next, there is machine learning. Here the connection is obvious. The more you have access to massive amounts of stored data, the more you can apply deep learning techniques to it (they really only work at sufficiently massive data scales) to extract more of the possible value represented by the information. I’m not quite sure what a literal Maxwell’s Historian might do with its history of stored molecule velocities, but I can think of plenty of ways to use more practical historical data.

    And finally, there are blockchains. Again, database curmudgeons (what is it about these guys??) complain that distributed databases can do everything blockchains can, more cheaply, and that blockchains are just really awful, low-capacity, expensive distributed databases (pro-tip, anytime a curmudgeon makes an “X is just Y” statement, you should assume by default that the(X-Y) differences they are ignoring are the whole point of X). As with Big Data, they are missing the point. The essential feature of blockchains is not that they can poorly and expensively mimic the capabilities of distributed databases, but do so in a near-trustless decentralized way, with strong irreversibility and immutability properties.


  • Sometimes you have to stop what you are doing and climb out on the roof to take a #ManhattanSkyline photo because the sunset is so beautiful. #nofilter

  • Video: How Panobook is Made


    Studio Neat put together a cool video showing how the Panobook is made. I preordered three Panobooks and can’t wait for them to arrive.

    Studio Neat makes some of my favorite products: Neat Ice KitArchived Link, Highball, and the Glif. I love the way they document their work through videos like this, their weekly newsletter, and their podcast, Thoroughly Considered.

     

  • Inhibiting Email Tracking

    A lot of email services track you by putting a tiny transparent image in your email and logging when you load it. You can prevent this by turning off autoloading of remote images in your favorite email app’s settings. If your app doesn’t have that setting, consider switching. I’m currently using Airmail across all of my devices and the setting is under Settings > Advanced.

  • Quick iPad Sketches


    ,

    One evening last week I had the idea to draw some quick sketches to illustrate some concepts in the Praxis curriculum. I used my iPad, Apple Pencil, Procreate, Paper by 53Archived Link, and Pixelmator.


  • A quick vacation sketch a few weeks ago at a diner after seeing many buoys along the Maine coast.

  • New Wes Anderson Trailer: Isle of Dogs


    Wes Anderson and his team are so good. Their attention to detail is extraordinary. Every single one of the dogs in this animation have a deep level of emotion and personality. I’m looking forward to seeing this in theaters next year.

  • EYES by Lucas Zanotto


    This is a super cool short film documenting a series of art installations by Lucas Zanotto. Simple colors, shapes, and movements can convey so much emotion and character.