Tag Archives: Essay

Black Swan

Nassim Nicholas Taleb outlines his black swan theory as:

  1. The disproportionate role of high-profile, hard-to-predict, and rare events that are beyond the realm of normal expectations in history, science, finance, and technology
  2. The non-computability of the probability of the consequential rare events using scientific methods (owing to the very nature of small probabilities)
  3. The psychological biases that make people individually and collectively blind to uncertainty and unaware of the massive role of the rare event in historical affairs

The high potential upside of an event can offset the low probability of its occurrence. 

A Possible Algorithm for Detecting Malicious Users

As requested, a soundtrack has been attached for your multisensory enjoyment: Algorhythm

A common situation in today’s tech world: you are a large tech company with a vast amount of user data. Some of those users are bots, scammers, or otherwise unsavory individuals. However, you often only know this once it is too late; another user reports him, someone gets scammed/cheated, someone gets malware, etc. As a gatekeeper/monitor of user interactions, how can you preempt such a situation?  The following is an example of how vector similarity might be used to give some indications, across a variety of metrics, that a user is a high-risk individual. I will use the term “scammer” for reductive purposes, but it is interchangeable with “predator”, “cheater”, “troublemaker”, or any other outlying user you wish to detect prior to that user’s perpetration of an activity that would reflect poorly on your site as a whole.

I should note that this is surely a concept that has been studied significantly by people interested in machine learning, security, etc; this is not a scientific paper, merely a bit of self-edification.

The Algorithm

Initially, there are no known scammers. We define a scammer as someone who has successfully perpetrated v, a violation of your site’s rules. It is important that v is unique and well-defined. Define a set of users U who exist on the site across a large time interval T. At the end of this time interval, some users will have committed scams and some will not. Ideally, the “corruption ratio”, or the ratio of scammers:nonscammers within the set should be similar to that of your site as a whole. Split the set U into two evenly divided sets U1{u10,u11…u1n} and U2{u20,u21…u2n}. Give U1 and U2 roughly equal corruption ratios.  Each user unm is defined uniquely in each time interval, unless he was discovered to be a scammer within a previous time interval.  In other words, after a user is discovered to be a scammer, his state is no longer considered relevant.

For now we will focus on U1. Define a series of equal time intervals across T{t0, t1…tn}. Define the set of users within U1 who were identified as scammers by the end of T as S1{s10,s11…s1n}.  Define the set of scammers who were discovered within ti as si.  Define a set of dimensions D{d0, d1…dm}, each of which is a value that has a likelihood of correlation with scamming.  A few potential values for a user dimension include:

Site with a social networking component:

  • amount of difficult-to-forge information
  • number of photos uploaded with the user’s face
  • strength of connectedness of relationships with known scammers
  • strength of connectedness of relationships with known nonscammers
  • age disparity between the user and the average person they contact (particularly relevant when tracking down MySpace predators)

Site with a commerce component

  • mean/median/mode/standard deviation transaction size
  • amount of positive/negative feedback from high-frequency/low-frequency users


  • rate of login/logout
  • variance of login location
  • various quantifications of legal enforcement within that user’s location

Define a set of prototype vectors, each having the m dimensions defined by D, P1{p10, p11…p1k} where p1i is the prototype vector composed from all the vectors within s1i.  In each case, p1i represents the prototypical scammer from U1 who was discovered within the time interval ti.

Note that this approach does not use weightings on any of these dimensions; how they could be used to achieve increased granularity is beyond the scope of this article.

Now we move our focus back to U2 and divide it using time intervals parallel to those used when evaluating U1.  Define the set of users within U2 who were identified as scammers by the end of T as S2{s20,s21…s2n}.  Define a set of prototype vectors for U2, P2{p20,p21…p2k}.

As a reminder, P1 and P2 are sets of prototypical scammers.  Define the set of values A{a0,a1…an} to be the vector similarity between P1 and P2 at time an.  an is also defined as the MOSNDS (measure of similarity necessary to determine similarity) over the time interval tn.  This is calculated to be a metric as to what a satisfactory degree of similarity it would take between, for example, prototype vector p1n and user u2k to predict whether u2k is a probable scammer.

Is this valid?

Cube Theory: Maintenance, Part I

With the huge growth in popularity of cube drafting over the past several years, much has been written about the format.  I haven’t read any of it, preferring to study through ChannelFireball videos and my own experience.  I have been cube drafting for three years, which began with Evan Erwin’s cube card-for-card.  With probably fifty drafts of that format, thirty drafts/sealed decks of a similar cube, several drafts of a tribal cube, and several drafts of various other man-made limited formats, I have formed many opinions about what makes a cube fun to play.  The objective of this article is to articulate and justify those opinions through the discussion of an iteration of cube maintenance.

I began work on my own cube several months ago with an overambitious, five-thousand count “complexity cube”, the modus operandi of which was to maximize the occurrence of unusual card interactions.  Were I to drop out of school and somehow have access to an entire card shop, I might be able to make this format adequately enjoyable, but in reality it was hopeless.  Aside from that, I quickly learned that being able to play a cube and being able to build one are very different things.  The size of the cube forced me to shift the mana cost bell curve to the left to avoid standard deviant distributions with all high casting cost creatures.  Picking a card as a high-upside gamble on getting another card with a highly synergistic interaction was rarely +EV compared to taking something that was effectively a Hill Giant or a Shock.  Pushing themes was really tough.  Etc.

The Graveyard Cube is born

Deciding I had a long way to go before I could design something as broadly defined as a “complexity cube”, I settled on making a thematic cube that had a lot of creative breathing room, but also had a narrow enough set of motifs to quickly rule out most cards in the Magic universe.  I settled on using the graveyard as a theme.  This was around the time Innistrad had just come out, and given that it was easily the most polished draft format ever design-wise, I didn’t have to do much of a paradigm shift–I could just look at what I appreciate about Innistrad and use that as my first iteration.

Austin Hambrick, my cube-design comrade, prefers to look through every card on Gatherer and order whatever he wants from Pat’s Games in order to perfect his cube.  This is a valid preference, but I like to take a more machine-learning style approach, looking through giant stacks of cards in order to build each iteration.  Not only do I get the nostalgic warm fuzzies from physically holding cards I haven’t played with in years, but it gives the cube a suboptimal roughness that can take it in unexpected directions.  For example, I was not proud of The Graveyard Cube 1.0 because it tried to do too much and wasn’t stressing any of the subthemes enough, but that’s because I was making due with the set of cards I had looked at.  At this point, after doing many drafts and looking through many cards, I have excised certain small themes such as emphases on enchantment and artifact recurrence and stressed others, such as 187s and soulshift.  This happened organically, largely based on the cards I have had immediate access to.  This is not to say they are gone for good.  On the contrary, the cards that get removed as Austin and I build cubes are cached in the “Mothership Cube”, a set of color-sorted 5000 count boxes cards that houses a wealth of chaff-free inspiration.  All of that being said, I can’t deny that some of the motivation for my iterative strategy is simply not wanting to go through the online parsing and purchasing process.  While I am obsessed with managing the construction and analysis of my cube as much as the actual games with it, I’ll leave the more surgical, measured approach to Austin.

State of the Cube

Below is the entire cube, prior to the refurbishment that this article focuses on.  There were (and will always be) some glitches to iron out. Cards with an asterisk ended up being cut.

TOTAL:  84


Goretusk Firebeast
Firemaw Kavu
Flayer of the Hatebound
Rage Thrower
Charmbreaker Devils
Goblin Marshall
Slice and Dice
Chandra Ablaze

Ogre Savant
Zealous Conscripts
Reckless Wurm
Caldera Hellion
Jagged Lightning
Lightning Surge
Savage Beating
Pardic Arsonist

Avalanche Riders
Changeling Berserker
Seismic Mage*
Lavaborn Muse
Skyfire Kirin
Temporary Insanity
Seize the Day
Violent Eruption
Solar Blast

Brimstone Volley
Fiery Temper
Firecat Blitz
Rolling Temblor
Yamabushi's Flame
Volt Charge
Fires of Undeath
Knollspine Invocation
Arc Lightning
Unearthly Blizzard
Fire Imp
Hissing Iguanar
Rockslide Elemental
Mudbutton Torchling
Vithian Stinger
Ghitu Slinger
Arms Dealer
Bogarden Firefiend
Adamaro, First to Suffer
Arc Mage
Thunderthrash Elder
Orcish Bloodpainter
Gathan Raiders
Tuktuk the Explorer

Fiery Fall
Fiery Conclusion
Scorching Lava
Kaervek's Torch
Goblin Bombardment
Fire Whip
Desperate Ravings
Tin Street Hooligan
Mogg War Marshall

Lightning Axe
Pillar of Flame
Flame Jab
Lava Dart
Reckless Charge
Reckless Abandon
Magma Spray
Flame Slash
Kris Mage
Orcish Lumberjack
Mogg Fanatic

COLOR: White
Total:      72

Hour of Reckoning

Exclusion Ritual
Graven Dominator

Second Thoughts
Angel of Flight Alabaster
Changeling Hero
Belfry Spirit
Hundred-Talon Kami
Totem-Guide Hartebeest*
Night-Captain of Eos
Stormfront Riders
Gelestial Gatekeeper
Phantom Flock

Sigil of the New Dawn
Faith's Fetters
Ray of Distortion
Wrath of God
Cenn's Enlistment
Glimmerpoint Stag
Dust Elemental
Sanctum Gargoyle
Moonlit Strider
Windborn Muse
Celestial Crusader
Mausoleum Guard

Remember the Fallen
Crib Swap
Prismatic Strands
Oblivion Ring
Radiant's Judgment
Fiend Hunter
Kabuto Moth
Order of Whiteclay
Monk Idealist
Azorius Herald
Reborn Hero
Waxmane Baku
Nomad Decoy
Shrieking Gargoyle
Aven Mindcensor
Soulsworn Jury

Terash's Verdict
Feeling of Dread
Otherworldly Journey
Journey to Nowhere
Last Breath
Revoke Existence
Momentary Blink
Vengeful Dreams
Kami of Ancient Law
Angelic Page
Pteron Ghost
Spectral Rider
Patrol Hound
Ghost Warden
Loyal Cathar
Phantom Nomad

Cho-Arrim Alchemist
Doomed Traveler
Spurnmage Advocate
Benevolent Bodyguard

COLOR: Artifact
Total:      27

Clone Shell
Precursor Golem

Dingus Staff
Skull Catapult
Molten-Tail Masticore
Solemn Simulacrum

Eye of Yawgmoth
Cloudstone Curio
Pilgrim's Eye
Goblin Replica
Ticking Gnomes
Vulshok Replica
Moriok Replica

Culling Dais
Prophetic Prism
Prismatic Lens
Mask of Memory
Myr Retriever
Myr Sire
Perilous Myr

Sylvok Lifestaff
Chromatic Star
Horizon Spellbomb
Nihil Spellbomb

Color: LAND
Total:  17

Cephalid Coliseum
Centaur Garden
Shimmering Grotto
Lonely Sandbar
Temple of the False God
Ancient Zuggurat
Treetop Village
Barbarian Ring
Buried Ruin
Moorland Haunt
Tranquil Thicket
Forgotten Cave
Barren Moor
Terramorphic Expanse
Evolving Wilds
Ghitu Encampment
Terminal Moraine
Faerie Conclave

Color: GREEN
Total: 97 

Stone-Tongue Basilisk
Roar of the Wurm

Grim Flowering
Deadwood Treefolk
Phantom Wurm

Strength of Cedars
Arrogant Wurm
Grizzly Fate
Beast Attack
Acidic Slime
Venerable Kumo
Indrik Stomphowler
Aerie Ouphes
Metamorphic Wurm
Savage Conception
Dowsing Shaman
Seedguide Ash*
Spider Spawning
Golgari Grave Troll
Mitotic Slime*

Momentous Fall
Slice in Twain
Tribal Unity
Greater Mossdog
Symbiotic Elf
Centaur Chieftain
Krosan Beast
Oracle of Mull Daya*
Possessed Centaur*
Squirrel Wrangler
Burr Grafter
Phantom Centaur
Kodama of the South Tree
Algae Gharial*
Festerhide Boar
Springing Tiger
Simian Brawler

Elephant Guide
Unchecked Growth
Krosan Tusker
Holistic Wisdom
Primal Growth
Wild Hunger
Far Wanderings
Tilling Treefolk
Elder Pine of Jukai
Borderland Ranger
Wood Elves
Phantom Tiger
Kami of the Hunt
Yavimaya Granger*
Phantom Nantuko
Uktabi Orangutan*
Carven Caryatid
Citanul Woodreaders*
Mul Daya Channelers*

Evolution Charm
Travel Preparations*
Moment's Peace
Nostalgic Dreams
Life from the Loam
Rites of Spring*
Wirewood Herald*
Forcemage Advocate
Hermit Druid
Sakura-Tribe Elder
Multani's Acolyte
Nantuko Tracer
Loam Dweller
Woodland Changeling

Thrill of the Hunt*
Quirion Ranger
Crop Rotation
Elvish Skysweepter*
Basking Rootwalla
Diligent Farmhand
Tinder Wall

Color: GOLD
Total: 54

Phantom Nishoba

Cauldron Dance
Vengeful Rebirth
Drooling Groodion*

Slave of Bolas*
Marrow Chomper
Giant Ambush Beetle*
Izzet Chronarch

Vanish into Memory
Hellhole Rats*
Murderous Redcap
Kathari Remnant*
Desecrator Hag
Grazing Kelpie

Goblin Trenches*
Mercy Killing
Savage Twister*
Selkie Hedge-Mage
Kathari Bomber*
Restless Apparition
Teysa, Orzhov Scion
Geist of Saint Traft
Wistful Selkie*
Rendclaw Troll
Hag Hedge-Mage
Orzhov Pontiff
Shambling Shell
Centaur Safeguard
Jund Sojourners*
Plaxcaster Frogling

Turn to Mist
Agony Warp*
Glimpse the Unthinkable
Hull Breach
Mask of Riddles*
Lightning Helix
Eladamri's Call
Lurking Informant
Cavern Harpy
Coiling Oracle*
Mistmeadow Witch
Gruul Guildmage
Dimir Guildmage
Selesnya Guildmage

Seedcradle Witch

Color: BLACK
Total: 99

Pus Kami
Absorb Vis*

Pull Under
Dark Withering
Kami of Lunacy
Abyssal Horror*
Extractor Demon
Grixis Slavedriver

Cruel Revival
Torrent of Souls
Screams of the Damned*
Unburial Rites
He Who Hungers
Treacherous Vampire
Scuttling Death
Coffin Puppets
Morkrut Banshee
Nested Ghoul

Makeshift Mannequin
Seize the Soul
Sever the Bloodline
Death Pulse
Ritual of the Machine
Childhood Horror
Highway Robber*
Braids, Cabal Minion
Falkenrath Noble
Horobi, Death's Wail
Lingering Tormentor
Infernal Kirin
Phyrexian Defiler*
Mausoleum Turnkey
Moan of the Unhallowed
Razorjaw Oni
Faceless Butcher
Bala Ged Scorpion*
Disease Carrier*
Shambling Swarm

Last Rites*
Dark Banishing
Footsteps of the Goryo
Buried Alive
Rotlung Reanimator
Searchlight Geist*
Dusk Urchins
Pawn of Ulamog*
Plague Spitter*
Stinkweed Imp
Lord of the Undead
Kami of the Waning Moon
Infernal Caretaker
Phyrexian Rager
Putrid Raptor
Doomed Necromancer
Mercenary Knight*

Skeletal Scrying
Suffer the Past
Diabolic Intent
Diabolic Edict
Animate Dead
Last Gasp
Grasp of Darkness
Disturbed Burial*
Viscera Dragger
Gempalm Polluter
Toxic Stench
Stitch Together
Dregscape Zombie
Blind Creeper*
Mesmeric Fiend*
Ravenous Rats*
Crypt Creeper
Apprentice Necromancer
Nether Traitor
Nezumi Graverobber
Cruel Deceiver

Ghastly Demise
Fade from Memory
Bloodchief Ascension
Coffin Purge*
Fume Spitter
Festering Goblin
Plagued Rusalka
Putrid Imp
Ghost-lit Stalker
Carrion Feeder
Vampire Lacerator

Color: BLUE
Total: 94

Kederekt Leviathan

Phyrexian Ingester

Skaab Goliath
Ethereal Usher

Ancestral Memories
Followed Footsteps*
Shinx of Lost Truths
Mnemonic Wall
Murder of Crows
Riptide Shapeshifter
River Kelpie
Teller of Tales

Mystic Retrieval
Chamber of Manipulation
Careful Consideration
Mystical Teachings
Choking Tethers
Cytoplast Manipulator
Mist Raven
Makeshift Mauler
Troublesome Spirit
Wormfang Crab
Faerie Mechanist

Esper Sojourners*
Flash of Insight*
Ghostly Flicker
Oona's Grace
Forbidden Alchemy
Circular Logic
Compulsive Research
Three Wishes*
Civilized Scholar
Scrapskin Drake*
Armored Skaab
Callous Oppressor
Raven Familiar
Wurmfang Drake
Lantern Spirit
Drift of Phantasms
Cephalid Looter*
Frontline Sage*
Latch Seeker
Aether Adept
Brackwater Elemental
Stormbound Geist
Stitched Drake
Kathari Screecher*

Drifting Djinn
Peel from Reality
Consuming Vortex
Trade Routes
Call to Heel
Screeching Skaab
Cephalid Vandal*
Surveilling Sprite
Voidmage Prodigy
Deranged Assistant*
Thought Courier
Alchemist's Apprentice*
Merfolk Looter*
Looter il-Kor

Silent Departure
Saving Grasp
Mark of Eviction
Seal of Removal*
Chain of Vapor
Trickster Mage
Hedron Crab
Enclave Cryptologist*
Drowned Rusalka


At the beginning of this iteration, I had my cube, a 5000-count box half-full of sorted Cube Mothership, and three or four 100-count boxes of unsorted cards that needed to be merged with the Mothership.  I began by sorting the 100-count boxes by color as I looked through them for cards that could potentially go into my cube.  Then I set the sorted piles aside and began going through the Mothership by color, taking out any cards that caught my fancy as a potential inclusion to this iteration.  After finishing each individual color, I added the corresponding color from the previously unsorted 100-count boxes.

Order of Operations

At that point, there were many options for how to go about adding and removing cards.  I tried to think about what macro-cubic issues I was trying to solve.  For example, I have one problem that can plague any cube that tries to push a theme while also including inherently solid cards. I believe that lots of gold cards and fixers lead to players taking cards due to their power level in a vacuum as opposed to how they might interact synergistically with other cards of variable value.  I wanted to strengthen the incentive to gamble on high-upside jank with early picks.  Nobody ever ends up with too few playables because the base card quality is so high, but people would rather spend their gamble on an early Lightning Helix they might not end up playing because of mana restrictions than on an Ichorid they might not end up playing because Ichorid is a pretty serious hit-or-miss depending on what support cards you get.  The difference between these gambles is that if players are steered in the direction of volatile jank, the decks end up characterized by that jank, giving the draft a more unique flavor.  Put another way: gold cards generally have a higher quality-to-converted-mana-cost ratio, and if players can cast a 3cc gold card like Naya Charm with an average mana base, they have no reason to take Footsteps of the Goryo over it early on.

I state this specific problem not because it informs the entire remainder of my procedure, but because it is an example how I develop rules for  the framework of cutting/adding cards.  With a pile of cards to add and a rough set of alteration rules in my head, I made a roadmap for refurbishment:

1. Add in all artifact, gold, and land; they were sparingly, judiciously selected from the Mothership for high impact
2. Add in all red and white cards because they have the lowest counts among the five colors
3. Cut white, green, blue, and black cards liberally because there are plenty of replacements to put in; red is the limiting reagent at 101 cards
4. Add in green, blue, and black cards until their counts are up to 101
5. Cut artifact, land, and gold cards liberally
5. Cut cards from everywhere, maintaining equal color distribution, until everything fits in the box


My intent was to get the cards equilibrated across colors, compare the size of all cards to the size of the box, and begin cutting.  This process is all about speed and intuition, and I don’t want to give the impression that I was following a recipe.  Not only would that be impractical, it would spoil the experience.  My method is messy and heuristic. I had many piles, sorted and unsorted, around the table.  I cached cards I removed from the cube and went through the caches every once in awhile to see if my fancies had changed in the minutes or hours since removing them.

Notable Exclusions/Excisions

In the above paragraphs, I made an effort to describe the deconstruction process in the abstract.  As the contents of the cube became increasingly defined, so did the pile of cards that came very close to making the cut.  What follows is a log of changes which exemplify more specific directions, subtle and not, that I am taking the cube in, with respect to those cards I left out:

Seedguide Ash: the cube is more about cheap beaters and the board state should evolve quickly, so the high end needs to be more about creatures with high-impact board presence/187 or very high-impact leave-play abilities

Somberwald Spider: morbid can be awkward to trigger and I don’t want to have too much of it, so I’m opting for just Festerhide Boar and Ulvenwald Bear since they are more closely aligned with the aggression level

Possessed Centaur: most of the drafts I do are heads up, and given that he’s 2GG to cast, you are probably the only base green player, making his activated ability irrelevant

Oracle of Mul Daya/Channelers of Mul Daya: interesting with mill but ultimately too off-theme

Mitotic Slime: usability issues; this card is an example of great top-down design but is very annoying to play with in practice due to the confusing variety of slime sizes

Borderland Ranger: Fertilid, Kodama’s Reach, Krosan Tusker, and Harrow all fill similar functions while interacting more copacetically with current themes

Battle Screech: flashback cards in this cube should be readily castable upon being discarded or milled

Spiketail Hatchling: dreams of activating morbid with this guy were misleading; it’s hard to use this guy to leverage Raise Dead effects and threshold proactively

Courier’s Capsule/Etherium Astrolabe: nice with Sanctum Gargoyle, Remember the Fallen and not much else; relics from an earlier iteration where artifacts were more important

Three Wishes: who has time to read all the text on this card?

Merfolk Looter/Cephalid Looter/Cephalid Broker: redundant, not aggresssive enough

Cloudseeder: there’s not a great reason this card couldn’t make it in later; I almost cut Thought Courier for it; this is a good example of a card happening to strike me in the gut the wrong way for whatever reason, and clearly belongs in a cache

Preordain/Brainstorm: I’m trying to cut cards with almost pure upside in favor of a high jank quota

Pestermite/Deceiver Exarch: they belong in too many decks; a reminder that players should be rewarded for archetypal picks, not general-purpose picks

Enclave Cryptologist: I want early turns to be spent developing board position, not leveling up an 0/1; also adds unneeded complexity to a format that presses the limit of enjoyable board complication levels

Followed Footsteps: optimistically, a really cool card for creating an engine of some sort; in practice, a 5cc do-nothing

Extract: if I end up with more spellshapers in the cube, I will put this back in since it can be pitched late game; it can also be very strong vs. a deck with Genesis or Life from the Loam, particularly if you have no other exiling

Palinchron: I’ll leave the theme-agnostic powerhouses to other cubes

Cephalid Vandal: the cube is currently more about aggression than crazy, creative engines that this guy can enable

Mark of Eviction: wasn’t seeing any play; kind of a 1cc Followed Footsteps

Flash of Insight: this cut was mostly about keeping decks cohesive and having cards consistently agree with the objective they wanted to accomplish; once I feel like the cube is polished and the decks are running very smoothly, I could add cards such as this that compels a player to do something antithetic to the rest of the cube (that is, removing cards from their graveyard); another highly cached card

Deranged Assistant: simply not good enough; the cube might need a higher end to make this guy have enough value in the later stages of the game

Scrapskin Drake: there are enough blue zombies already

Esper Sojourners/Jund Sojourners: these guys fulfilled an interesting role of being a trick that put a spin on the value of Raise Dead effects, but I didn’t like the aesthetic of having them come up when a pack was being laid out during a Rochester draft, especially knowing that they were the only two of a five-sojourner cycle

Kathari Screecher: if only it were a bird zombie

Krovikan Sorcerer: a sweet looter, but a little too expensive

Seismic Mage: the one red card I cut, but I don’t think I need to go into detail why

Vivid lands: goes along with the anti-fixer argument above

Psychatog/Goblin Trenches/Vish Kal, Blood Arbiter: goes along with the anti-gold argument above

I have now outlined the deconstruction process in gratuitous detail.  In the next article, I intend to focus on what cards I ended up adding and why, as well as the updated cube list in its entirety.  Thank you for reading.

Lessons from Spiceworks

Friday was my last day as a Software Engineer in Test Intern at Spiceworks.  If I wanted to work in Austin as a software tester, I absolutely would have stayed, but it is not a pursuit I currently have in mind.  I recommend anyone looking for a software internship in Austin to consider applying there. It was a memorable, influential experience and I am grateful to the company for providing me with the opportunity.   I learned a lot there, which I want to put into words.

Understanding the Company   

At Spiceworks, no matter what role you play, you have to understand the high-level mission of the company to some degree.  At its core, Spiceworks is two goals cohered together: to provide free high-quality network monitoring software and to provide a niche social network for IT professionals to interact.  My job was to help test the “Community” side which is a sort of Facebook-esque forum.  I wrote and edited automated tests using Ruby and Watir (Web Application Testing In Ruby) within the Rails framework.

Understanding my Role

After a part of the site is released or updated, a manual tester goes through the different potential user flows and tries to discover bugs.  Then, a software engineer automates those tests, writing out the flows so that they can be run nightly as regression tests.  I only did this once, and it took me the duration of Winter break.  Most of my time at Spiceworks was spent editing regression tests that had already been written and were failing due to an ID change in the DOM or the addition of a lightbox somewhere.  Occasionally the changes were more complex, such as when the user profile pages were overhauled, but most of the changes were minute.

For several reasons, there were many nonworking Community regression tests when I began working for the company in November.  While the Community and the monitoring software are both crucial to Spiceworks, development priority seems to be given to the software, and deservingly so.  Most (or at least, a very large portion) of the Community members also used Spiceworks to monitor the network where they worked, and if the monitoring software they are using doesn’t work, they have no reason to go to the Community and talk about the product.  More importantly, while the Community tests were breaking, they were usually due to subtle errors that rarely affected user experience.  Nonetheless, they needed to be fixed, making them the perfect job for an intern.

Ruby is Fun and Powerful

In a nutshell, my job was to look at static HTML in Internet Explorer and prod the page to make it simulate a user’s experience.  This is performed by wrapping a browser and manipulating it like you would any object.  I performed experimentation using interactive Ruby (irb) to make sure my code worked before putting it in the unit test file itself.  It can be a real game to find the most reliable and efficient way to identify an object.  For example, after using Watir to make a browser object that represents your IE instance, you can do something like:

ie.div(:class, “Jeff”).link(:id, “blog”).click

You can also use regular expressions:

ie.link(:text, /Jeff’s Blog/).click

While seemingly elegant, this is frequently a more volatile approach than going through the DOM tree because the order that text appears on a page can be nondeterministic when dealing with forums.  If there was a hyperlink with the text “Jeff’s Blog” at the bottom of the page, and someone made a post above it containing a hyperlink with the text “This page is not Jeff’s Blog”, the latter would be selected.

If I do any HTML scraping in the future I will probably use Watir because I find the syntax very intuitive.  The trickier issues arise when you want to do advanced things like mess with a predictive search bar, binary search a list of pages, or tinker with Javascript.

Creative Scope

Many people including myself select a career as a programmer because they want a job with creative freedom and individuality.  In contrast to this, working at a company usually puts you in a position where team members rely on you to act predictably so that they can black-box whatever project dependency you are working on and assume it is going to function.  I felt valued at Spiceworks because once I had proved I was reliable enough to fix small problems during my first couple months, I asked for and was provided a bigger assignment that allowed more creative freedom.  I got to spend Winter break writing my own test.  It was some of the most gratifying programming I’ve done, and since it was from scratch, I got to automate it however I wanted to.

The Value of Culture

As a company full of tech-savvy people making software for an audience of tech-savvy people, Spiceworks derives a lot of value from being human and outwardly facing.  This symbiosis between Spiceworks employees and product users requires a consistent, positive image that’s only attainable by being a great place to work.

I’ve thought a lot about whether a stated company culture shapes the personality of its employees or rather if the company personality is a natural composition of that of its employees.  I know at least the first is true; Spiceworks has left a lasting impression on me.


Several nights ago I had an idea for a game I’m going to write in Java .  I wrote down the main concepts and have been fleshing them out since then in a rules spec.  At the same time, I’ve started coding some of the necessary classes.

The source  code is available at: https://www.assembla.com/code/Supercompute/git/nodes/master/src

The current rules spec is sparse and inconsistent.  For example, “Action” is still mentioned several times, but it is no longer keyworded.  I was using it as a root class for Function objects until I realized that everything that extended “Action” also extended “Function”


Objective: Reduce your opponent’s fault tolerance to 0.

Fault Tolerance

A player starts with a fault tolerance of 100.  Certain events throughout the game have a higher probability of adversely affecting a player with a low fault-tolerance, so losing fault tolerance can cause a negative feedback loop.

//challenge will be to make the negative momentum for the less fault tolerant player surmountable


Players begin with three random concealed functions in their function bag, which are taken from their function library.  Players may use any number of functions per turn as long as they provide the proper parameters.  When a function has finished, it moves to the back of its owner’s degradation queue.  Once a turn, any parametric action of your choice can be queued for degradation(put in the back of the degradation unit) in exchange for instantiating a generic foundational unit of any type of specific basic resource that function takes as a parameter.

//use parameters such as CPU power, genome

Constructions: initializes some data instance that has an adhesion number

Instance Attributes

Adhesion: if an amalgam is disrupted for x, its top level extension loses x adhesion; if an extension has no adhesion, it falls off and moves to the back of the player’s degradation queue; at the end of the turn, an extension’s adhesion is refreshed.

Disruptive Capacity:   Disruptive capacity is a number representing how much an instance can disrupt a target during a routine disruption.  Unless stated otherwise, an instance can only use its disruptive capacity during one of the two routine disruption phases of its controller’s turn.  If an object is disrupted for x, its top-level extension loses x adhesion; if an extension has no remaining adhesion, it falls off whatever instance it was built upon.   By default, objects can be disrupted only at top-level.  Also by default, if an instance disrupts a target for x, and the target instance’s adhesion is less than x, the extraneous disruption has no effect.  However, if the disruptive instance has disruption cascade, the extraneous disruption disrupts the highest-level extension beneath the initial target of the disruption. If you have an instance with remaining disruptive capacity at the end of a Routine Disruption and there are no legal adhering targets, you may decrement a player’s fault tolerance by that much.

Nullness: A null instance will not have value extracted from it, cannot be disrupted by routine disruption unless it is the root instance(see “Disruptive Capacity” above) and cannot have any actions used; all abstractions on a higher level than it are also rendered null

Productivity: a productive instance is extracted by default during preparation.



Anything instantiated by a construction action is an instance.  Any abstraction and any semaphore is an instance. Any actions that are defined as instantiated are instances.  Null instances still count as instantiated.

Foundational Units

-genetic: extracts for g


//need generic semaphores for generic extensions

Semaphore: A resource counter.  For the sake of simplicity, there are currently only two types of semaphores, both basic: CPU power and genome.  Both are associated with the generic instances “evolute” and “byte”.  Semaphores don’t lose their resources at end of turn and can accumulate an unlimited amount unless otherwise specified.

//may have to limit the amount they can accumulate to encourage action

Before the game begins, players declare a concealed number and reveal it at the same time.  The player who reveals the higher number loses that much fault tolerance and takes the first turn.  If there is a tie, repeat this process.  If there is another tie after that, decide who goes first randomly.

Taking a turn:

//during each defined phase, all instances are checked for “phase actions”


-add a random parametric action from your actions library to your action bag


-extract value from all your productive instances; they yield x semaphoric value where x is the lowest-cost action on each of their top-level abstractions that .  Increment by a total of x any number of semaphores that provide resources that the extracted instance’s parameters could take.

//Unlike Magic, actions can take place during this phase


-active player can use construction

-use functions for whatever their parameters

-use actions of objects

Routine Disruption

-use functions for whatever their parameters unless they say that they can’t be used during routine disruption

-use actions of objects unless they say that they can’t be used during routine disruption

-objects can disrupt for their disruption capacity

-at the end of routine disruption, extensions with no adhesion and all of their higher level classifications are put in the degradation unit


Evaluation and Routine Disruption

-use functions for whatever their parameters unless they can’t be used during routine disruption

-use actions on objects

-objects can use disruption actions

-active player can use construction

-players can use actions of objects

-at the end of routine disruption, extensions with no adhesion and all of their higher level classifications are put in the degradation unit



-environment modifications that say “ends upon turn finalization” end

-the front item in the degradation queue gets degraded




I feel like I made progress developing this song.  I’m gradually getting a sense of proportionality when working with wave forms and arpeggios.  On one synth, you can have panning oscillating at 1/2 beat periods, volume oscillating at 3 beat periods, and a five-tone ascending arpeggio playing over a 4 beat period.  This song is the product of doing that type of thing on too many different synths.  The mix shows improvement from previous songs because I stopped using Maximus simply as a set of presets and started using it as the weapon of multiparameter madness that it deserves to be treated as.


Another Failure in EQ

Feliz Cumpleanos

I need to develop some standards of design for how I work with EQing my songs.  It’s a balancing act between meticulously EQing everything to perfection as I go along and throwing caution to the wind in favor of quick, impulsive macro development.  Actually, when I put it that way, doing anything except keeping the mix sounding crisp and well-defined at every stage seems ludicrous and haphazard, but when I am in the heat of the moment and musing rhythmic and melodic, tweaking thresholds on every band of every mixer track while listening to the same eight-bar loop over and over again is such a chore.  Plus I discovered a really cool stereo separation plugin a couple months back, which fills out the mix far more pleasurably than the stereo separation knob built into each mixer track on FL Studio.  Oh well, first world problems.

Abstraction and MagicStove Beta

This is a continuation of the project I first discussed in: How Many Hill Giants?

While I’ve been programming my experimental husk of what Magic is for the purposes of my Hill Giant question, there has been a recurring abstraction question:  what is a player?  The definition of a player is different depending on who you ask.  To WotC and perhaps tournament organizers, a player is a consumer.  To the head judge and the DCI, a player is a rating, a set of qualifications, a history of warnings.  To the unseen force that propels a game forward (which I refer to as a Game), a player is an agent of change within a continually progressing system.  Thus, we have a notion of the variable scope that a player can exist in.

For the purposes of the Hill Giant problem, a player consists of the following:

  • a deck
  • lands in hand
  • creatures in hand
  • untapped lands
  • tapped lands
  • untapped creatures
  • tapped creatures
  • life total
  • player name

The implementation of this was not difficult, but navigating a player through the different levels of the experiment’s abstraction has proved cumbersome.  The objective of the project is to be able to run vastly different tests based on the simple alteration of several global variables; a basic design pattern.  But the responsibility of data crunching is passed between different aspects of the program, and at some points the buck must be passed while the passer maintains a copy of the buck he is passing, lest its integrity be lost.  For example, one bug that had to be ironed out recently had to do with the necessity of copying the original player object, whose deck had 50 Hill Giants, the starting number.  If he wasn’t copied before the buck was passed, the passed deck would be mutated by the fact that, during Magic, a player draws spell cards, putting them in a different zone.  This would make it impossible to tell the starting contents of a match iteration’s decklists, and therefore make it impossible to gather stats on different overall decklists, muddling the entire experiment.

Not only do I have to maintain a clone as I pass a player from the main method to the match, but also as I pass him from the match to each game within it.  Which brings me to a more recent problem:

Turn: 3; Active player: Clarence

Clarence has 9 untapped lands and 9 untapped creatures.

Clarence draws Grey Ogre*. Clarence has 2 lands in hand and 13 Grey Ogres in hand.

Clarence plays a land.

Clarence plays 3 dude(s).

Clarence attacks with 9 Grey Ogres

Danielle blocks with 2 Grey Ogres.

2 trades occur and Danielle takes 14 damage.

End turn. Clarence is at 20 /// Danielle is at -6

Clarence draws land. Clarence has 2 lands in hand and 13 Grey Ogres in hand.

Clarence draws Grey Ogre. Clarence has 2 lands in hand and 14 Grey Ogres in hand.

*The change from Hill Giants to Grey Ogres occurred during a code refactoring courtesy of Andrew Gray.  GreyOgre extends Card, the abstract class he created to encapsulate card data such as power, toughness, and casting cost, which I was putting in the deck class.

From this transcript, it’s not difficult to understand that something is wrong with the program.  The players’ life total fails to reset after each game and their hands and the board stays the same–and it’s pretty pointless to play a game of Magic in which your opponent can play three Grey Ogres on turn three while you start at less than one life.

My first thought was that it had to do with the player object I was pointing to within the game affecting variables that should only have been in the scope of the match, which would mean I hadn’t cloned the players properly into the game during each iteration of the match’s for loop.  This is a problem that would prevent the players from being adequately refreshed.  But as Andrew pointed out while looking at the code, we hadn’t put “creaturesInHand- -;” under the playCreatures() method.  This allowed a player to play as many Grey Ogres a turn as he wanted to as long as he had one Grey Ogre in his hand, because deploying a Grey Ogre did not actually cause a Grey Ogre to leave your hand.  This also explains why Clarence is holding 13 Grey Ogres at one point.  The bug was solved when Andrew and I were running early tests and noticed an inordinate number of games being won by the deck with 1 Grey Ogre and 99 Mountains–10%.

But that doesn’t solve the question as to why the life totals weren’t replenishing after the game.  Andrew noted that it was probably negative damage being dealt somehow.  I confirmed this when I noticed a game in which a player attacked with 2 Ogres and the opponent blocked with 3.  After that, the output read that defending player had gained 2 life during the exchange.  This required a minor change in combat logic, which is in the Player class within his attack(creaturesWithoutSummoningSickness, defendingPlayer) method.  There was also a bug that was letting players continue living despite being at negative life, under some circumstances.  I cleaned that up at some point.

When we started abstracting away the game state details and looking at the match-up percentages themselves, Andrew and I eventually had some decisive results, which I give an example of below.  The data in the first column represents Clarence’s starting count of Hill Giants within his deck for each game that he plays during a 65,000 game series.  The difference between that and 100 is the number of Mountains Clarence plays (which would be 80 for the first row).  The second column is Clarence’s win percentage vs. the field and the third column is his loss percentage vs the field.

The field consists of lists with 20-85 Hill Giants and vs. each of those opponents 1000 games were played.  When Andrew and I were at the cusp of getting numerical results, he argued that playing matches actually adds variance and abstracts away a degree of statistical accuracy, so we effectively abandoned them (although there are always sideboarding experiments to be had).  This was convenient since we were still having logical issues with the way a match was an abstracted set of games.  Finally, the optimum creature count vs. a random deck from the defined field is listed at the bottom of these stats.  And with that, the program I have dubbed MagicStove has “solved” its first problem:


































































The optimum creature count for HillGiant: 55

Total time: 34830ms



Basic Magic AI: How Many Hill Giants?

Andrew and I recently had a debate.  In a 100 card minimum deck size format with Mountain, Hill Giant, and no other cards, how many Hill Giants would be correct if there is no limit to how many you can play (the Relentless Rats mechanic)?  I decided to write a crude program to “solve” it, leaving modularity to run similar experiments if I so chose.  At this point, the program’s classes are defined and it will run, but will take some debugging to produce meaningful results.  Since the fickleness of my interests sometimes lead to unfinished projects such as this, I want to at least outline my program in English while I am in the thick of it.

I start off both players with 50 Hill Giant and 50 Mountain, and give them both the same simple set of parameters to produce plays that are strategically sound enough to simulate reality.

  • There are no mulligans.  This won’t be logically difficult to implement later on, but it will be a bit time consuming given the way I have implemented the program so far.  I realize it is a crucial element, but I need to keep the horse before the carriage if I ever want to get decisive results at all.
  • There is no discard step.  I guess this hedges against the lack of mulligans a bit.
  • First game of each match is decided randomly.  If you lose a game within a match, you always play first the next game.
  • If you have a land you must play it.
  • You must play as many Hill Giants in your precombat main phase as possible.
  • If you have more life than an opponent, you must attack with all of your Hill Giants every turn.
  • If you have less life than your opponent, you must attack with X Hill Giants every turn, where X is the number of Hill Giants you control minus the number of total Hill Giants your opponent controls.
  • Defending player must block as many Hill Giants as he can every turn.

This may seem like a watered-down form of Magic, but I think its combative interaction encourages attrition wars, which I think is the best way to delay a game for as long as possible and give the decks a chance to expose as many cards as possible and maximize the match’s turn sample size.  I’m not saying this is the best set of rules that will promote attrition, but it is a set nonetheless, and one that I think captures some basic methodical heuristics perhaps practiced by middle schoolers playing Magic on a cafeteria lunch table.  As a caveat, there might be attacking strategies that include swinging out every turn despite being at lower life than your opponent, perhaps based on your deck proportions vs. average proportions (or specific proportions, if I was to give the players each others’ decklists).

Every match consists of a variable number of games.  Once the program is debugged it will be easy to run tests for decks with Grizzly Bears, Norwood Ranger, Scathe Zombies, Trained Orgg, and any number of vanilla favorites from throughout Magic’s history.  I will also be able to change the amount of games per match and the starting life totals, and make deck size as big as I want, so there can be a finer gradation for decklist changes, since taking one Hill Giant out of a deck with 50 Hill Giant and 50 Mountain is different than taking one Hill Giant out of a deck with 100 of each.

One thing that’s difficult is deciding how to make decklist changes.  Although I can’t get WordPress to format it in a less-than-hideous fashion, here is one way I could do it:

Random rand = new Random();

if(winsAlice > winsBob){


Alice.makeChanges(NUM_CHANGES, “land”);


Alice.makeChanges(NUM_CHANGES, “creature”);




Bob.makeChanges(NUM_CHANGES, “land”);


Bob.makeChanges(NUM_CHANGES, “creature”);


NUM_CHANGES is a global variable defined before the main method to indicate the number of changes that will be made after each match.  If NUM_GAMES is 5, and Bob wins a 5 game match, Bob will make NUM_CHANGES changes to his deck before the next match, which will all be in the same direction (more lands or more creatures).  With the above methodology, the deck change would be completely random.  This should still drive deck construction in the proper direction in the long term as long as NUM_CHANGES is a reasonably small percentage of overall deck size.  The program runs for NUM_MATCHES.

To be frank, as interested as I am in this problem, I’m pessimistic about getting decisive results.  I have a suspicion that metagame will damn this entire exercise since deck strength is completely relative.  This is something I don’t know how to deal with, but perhaps I can graph it.  I’ll need to really show my programming chops to get anywhere.  As a gauge to show where I’m at right now, here is some sample output to show where I am at bug-wise:

Turn 0: Bob has 0 Hill Giants

Bob has 3 lands in hand and 5 Hill Giants in hand.

After playing permanents, Bob has 1 lands and 0 Hill Giants

Bob is at 20

Alice is at 20


Turn 1: Alice has 0 Hill Giants

Alice has 4 lands in hand and 3 Hill Giants in hand.

After playing permanents, Alice has 1 lands and 0 Hill Giants

Alice is at 20

Bob is at 20


Turn 2: Bob has 0 Hill Giants

Bob has 3 lands in hand and 5 Hill Giants in hand.

After playing permanents, Bob has 2 lands and 0 Hill Giants

Bob is at 20

Alice is at 20


Turn 3: Alice has 0 Hill Giants

Alice has 4 lands in hand and 3 Hill Giants in hand.

After playing permanents, Alice has 2 lands and 0 Hill Giants

Alice is at 20

Bob is at 20


Turn 4: Bob has 0 Hill Giants

Bob has 2 lands in hand and 6 Hill Giants in hand.

After playing permanents, Bob has 3 lands and 0 Hill Giants

Bob is at 20

Alice is at 20


Turn 5: Alice has 0 Hill Giants

Alice has 4 lands in hand and 3 Hill Giants in hand.

After playing permanents, Alice has 3 lands and 0 Hill Giants

Alice is at 20

Bob is at 20


Turn 6: Bob has 0 Hill Giants

Bob has 1 lands in hand and 7 Hill Giants in hand.

After playing permanents, Bob has 4 lands and 1 Hill Giants

Bob attacks with 0 Hill Giants.

Alice blocks with 0 Hill Giants.

0 trades occur and Alice takes 0 damage.

Bob is at 20

Alice is at 20


Turn 7: Alice has 0 Hill Giants

Alice has 4 lands in hand and 3 Hill Giants in hand.

After playing permanents, Alice has 4 lands and 1 Hill Giants

Alice is at 20

Bob is at 20


Turn 8: Bob has 1 Hill Giants

Bob has 0 lands in hand and 8 Hill Giants in hand.

After playing permanents, Bob has 4 lands and 2 Hill Giants

Bob attacks with 1 Hill Giants.

Alice blocks with 1 Hill Giants.

1 trades occur and Alice takes 0 damage.

Bob is at 20

Alice is at 20


Turn 33: Alice has 5 Hill Giants

Alice has 0 lands in hand and 10 Hill Giants in hand.

After playing permanents, Alice has 13 lands and 8 Hill Giants

Alice attacks with 5 Hill Giants


Alice attacks with 2 Hill Giants.

Bob blocks with 3 Hill Giants.

3 trades occur and Bob takes 6 damage.

Alice is at 20

Bob is at 20



Bob wins! His deck contained 46 Hill Giant

Several Hands of High Stakes Poker II

I’m in the mood to think about poker.  Time to live vicariously through my teenage self.  This is from a 2008 2+2 post.  Ah, the memories:

villain is a good reg, although i admittedly have little experience with him. I can’t think of many hands he is repping here…If I fold, does that mean I shouldn’t have raised in the first place?

Full Tilt Poker Game #6821913519: Table Larson (6 max) – $10/$20 – No Limit Hold’em – 12:25:07 ET – 2008/06/14
Seat 1: plastikcards ($3,138.50)
Seat 2: dreamofsuccess ($1,991)
Seat 3: Skyline985 ($2,007)
Seat 4: jcreachbaum1 ($2,012)
Seat 5: HAAANH ($3,591)
Seat 6: Kinetica ($410)
Kinetica posts the small blind of $10
plastikcards posts the big blind of $20
The button is in seat #5
*** HOLE CARDS ***
Dealt to HAAANH [6s 7h]
dreamofsuccess folds
Skyline985 folds
jcreachbaum1 folds
HAAANH has 15 seconds left to act
HAAANH raises to $70
Kinetica folds
plastikcards calls $50
*** FLOP *** [Js 9d 9h]
plastikcards checks
HAAANH bets $111
plastikcards calls $111
*** TURN *** [Js 9d 9h] [8s]
plastikcards checks
HAAANH has 15 seconds left to act
HAAANH checks
*** RIVER *** [Js 9d 9h 8s] [5s]
plastikcards bets $279
HAAANH has 15 seconds left to act
HAAANH has requested TIME
HAAANH raises to $821
plastikcards raises to $2,957.50, and is all in

My current thoughts:  preflop was a standard button raise, flop was a standard c-bet.   The turn is an interesting spot.

Arguments in favor of bluffing the turn

  • He’s never coming over the top unless I am drawing dead.
  • If he flat calls, it gives me credibility to bluff if the river is a blank.  His hand will be face up at that point as usually Jx, and A9 at best, which he will fold many rivers at least some % of the time assuming I fire a third barrel.
  • I probably have outs.
Arguments against bluffing the turn
  • There are so many semibluffing hands I could have, he will almost always call with Jx, and a good percent of the time will call any blank river as well since the pot is not too big and it is a chance to get some idea of how I play.
  • I might not have any outs at all, and if he check calls and then I hit on the river, I probably won’t make much unless I hit a 4.
  • If I had AT or KT or spades I would check the turn a good percentage of the time, so I can credibly represent those if they have a straight or flush on the river.
  • If I check, I get to see the river, as well as how he responds to it.  All things being nebulously equal, I might as well make my bets with a little more information.  In a macro sense, I would prefer to hold off on a risky triple barrel until I knew more about the opponent I was up against.
In summary, checking doesn’t mean giving up the pot, but firing probably isn’t too bad either.
The river illustrates a problem with going for thin value when you have shown confirmable weakness in a hand and your opponent has not.  I am going to fire the turn 100% of the time with a full house or quads.  Therefore I should never raise the river here for value.  I am giving him carte blanche to use his deep stack leverage to push me off of my entire range.
Villain is very aggressive. He’s trying to win every pot and for the most part succeeding. I played back at him once and got it in with 66 vs his KK on our other table (we were just 100bbs deep there). He’s called me down extremely light with A high twice (losing once), and snapped me off the first time I ran a big bluff. He’s been repopping me really small, just 3x, and I’ve been calling a decent amount since we are so deep.$2000.00 NL Texas Hold’em – Saturday, June 21, 02:57:31 2008
Table Newman (deep hu) (Real Money)
Seat 2 is the button
Seat 1: Sleepy_Hippo ( $5974.50 )
Seat 2: HAAANH ( $4368.50 )
HAAANH posts the small blind [$10.00].
Sleepy_Hippo posts the big blind [$20.00].
** Dealing down cards **
Dealt to HAAANH [ 9d Jh ]
HAAANH raises [$50.00]
Sleepy_Hippo raises [$160.00]
HAAANH calls [$120.00]
** Dealing Flop ** [ Th, 8h, 4d ]
Sleepy_Hippo bets [$240.00]
HAAANH calls [$240.00]
** Dealing Turn ** [ 7c ]
Sleepy_Hippo bets [$500.00]
HAAANH raises [$1500.00]
Sleepy_Hippo calls [$1000.00]
** Dealing River ** [ 2h ]
Sleepy_Hippo bets [$3840.00]2500 to me
I posted this in the 2+2 high stakes forum and was ridiculed by several winning players for even questioning whether to call.  In retrospect I should not have posted on 2+2 so much, especially about HU hands where there is a great deal of subjectivity.
Preflop is completely standard.  When playing 200 BBs deep, there is no reason to fold any hand you have raised with from the button to a reraise by your opponent when it’s only $120 to enter a pot with $200 already in it.  Any player that worked his way up to high stakes knows this, so it’s clear my opponent is an amateur since he keeps setting up a situation where there is a big pot and he is out of position.  Also, as I said, he is aggressive.  And I do have the nut straight.  For the people on the forums, that is apparently enough to call.
The problem is that a straight has relative worth, and my opponent is never betting a worse hand for value; all of those hands (sets, two pair, AA perhaps) would have rather shoved on the turn.  On the river, my hand might as well be pocket kings, or AT, because they effectively have the same worth as a bluffcatcher.  If he had T9, 89, or 79, he would just check the river because there is a chance I bluffed the turn, and his hand has showdown value.  He could have A9 or K9, or be turning a pair + busted straight draw into a bluff, but I’m not going to give someone who plays so amateurishly credit for being capable of that.  It’s clear that his most likely hand is two hearts.  I folded.