Storypost | 2019.06.30

Borderlands Knoxx Crimson Causeway
Outside-ish

Mimosas pinkies out

The Women's World Cup and Gold Cup have offered some exciting and anxiety-inducing soccer.


It was time to drain and refill the pool.


I concreted in the light housing.

Gravity Heights Brewery patio weimaraner dog

The GBES event this month was Gravity Heights. Finally, an alternative to Karl Strauss in the Sorrento Area, dog friendly too.

Gravity Heights pizza peppers chili oil

The pizza is phenomenal.

Lightning Jacks San Diego bbq

I was shocked and dismayed to find that Lightning Jack's closed.
Risk of Rain 2

Risk of Rain 2 Salamander vendor item pot

Otherwise, the man cave has been a great place to stay cool and get in some pc and ps4 gaming.

Risk of Rain 2 Mercenary Stone Titan many strike drones

The lolbaters/RoR squad has made some progress on unlockables and secrets. We managed to find the Gilded Coast and Aurelionite on our first attempt:

Borderlands GOTY

Borderlands Dr Ned Jakobs Lumber Mill

J and I blasted through the Borderlands GOTY DLC. We were impressed, once again, by the ambition of the Knoxx DLC and the hilarity of the Claptrap saga.

thumbnail Borderlands GOTY Steele vault key thumbnail Borderlands GOTY Claptrap change poster Che thumbnail Borderlands GOTY crimson lance blurry thumbnail Borderlands GOTY hyperion factory
thumbnail Borderlands GOTY load screen Crawmerax lair
thumbnail Borderlands GOTY viva la robolution arena thumbnail Borderlands GOTY causeway secret final boss exit thumbnail Borderlands GOTY Hyperion satellite
thumbnail Borderlands GOTY Moxxi underdome
thumbnail Borderlands GOTY Scooters shop thumbnail Borderlands GOTY Cluck Trap

Fight for Sanctuary

Borderlands 2 Scooter sick ass jump space cowboy feels

From GOTY we rolled right into the Borderlands 2.5 DLC. We mostly played it for the story; our OP8 builds were pretty dominant. It was a pretty good ride, though it was a bit self-congratulatory (paging Mass Effect Citadel DLC). The dialogue was funny, as always, though I'm not sure I'll be able to handle the new Claptrap voice actor for a full game.

thumbnail Borderlands 2 rainbow rarity smg thumbnail Borderlands 2 Fight for Sanctuary Scooter picture thumbnail Borderlands 2 Fight for Sanctuary Tiny Tina dragon bomb shooting the moon thumbnail Borderlands 2 Fight for Sanctuary Butt Stallion
thumbnail Borderlands 2 Fight for Sanctuary Winging It Talon Mordecai

New PUBG strat




Storypost | 2019.06.12

E3 2019 Borderlands 3 Psycho swag mask

Between some great new releases and an attendee crew, this was a pretty fun E3.
Borderlands

E3 2019 Borderlands 3 statue Zane

Without a doubt, Gearbox/2K conducted a masterful exhibition of Borderlands 3. They checked all the boxes:
E3 2019 Gearbox 2k Borderlands 3 demos screen

There were ample demo stations and staff, and no media-only restrictions or such nonsense.

E3 2019 Gearbox 2k Borderlands 3 playable demo psycho mask

The game plays like its predecessor, but they seemed to have evolved most aspects of the experience. More skills, more items, more convenience features, more game modes.

E3 2019 Borderlands 3 Moze Zane Fl4K statues E3 2019 Borderlands 3 booth psycho mask E3 2019 Borderlands 3 booth dark side of the moon rainbow

Ultimately it seems the game's reception will hinge on how well Gearbox executed on the story and how much variety is offered by the interplanetary journey.
Exhibitors

E3 2019 xbox stage Star Renegades is that a mech farting

Once again, Microsoft bought out a theater separate from the convention center. It was a quality production but they didn't have much content.

E3 2019 Cyberpunk 2077 poster

After Keanu's Cyberpunk introduction (which was strangely reminiscent of Peter Dinklage's Destiny performance), there was plenty of hype around CDPR. We did not brave that line.

E3 2019 Techland Dying Light 2 poster

After a zombie-filled reveal last year, I was hoping to get my hands on Dying Light 2. Unfortunately, Techland only had an appointment-only(ish) conference room with a cinematic demo.

E3 2019 Forza Horizon Lego Senna McLaren E3 2019 Ubisoft booth Ghost Recon
Final Fantasy

E3 2019 lobby Final Fantasy VII Remake banner

Jeff - along with most other attendees - was excited about Final Fantasy VII Remake.
Others

thumbnail E3 2019 crowd to get in thumbnail E3 2019 Trails of Cold Steel thumbnail E3 2019 Grave Digger thumbnail E3 2019 monster truck outside Watch Dogs thumbnail E3 2019 Monster Hunter dragon statue
thumbnail E3 2019 Catherine thumbnail E3 2019 Lego Han Solo carbonite thumbnail E3 2019 Monster Jam demo

As usual, there were plenty of smaller titles that were easy to get our hands on.

G4M3R DR1NKS!!!

E3 2019 Rockstar Cotton Candy flavor has science gone too far

It wouldn't be E3 without new energy drink brands that will soon be out of business or new flavors from existing brands that should have never been conceived. There were a few powder additive options this time around as well as champagne-flavored Bang with creatine.
Swag

E3 2019 Watchdogs photobooth pig mask

It also wouldn't be E3 without collectibles, photobooths, and swag.

E3 2019 FFVII figurines E3 2019 Wolfenstein Youngblood photobooth E3 2019 Mr Gutsy statue
13-0

E3 2019 Yard House soccer USA Thailand World Cup

Tuesday stepped out to Yard House to catch the WWC match. Rumor has it Dr. Disrespect was also there, prior to his infamous incident.

E3 2019 US Womens National Team billboard Nike
Accommodations

E3 2019 scootering downtown Doom Eternal Lime

We had an airbnb Tuesday night. Pool, pizza, Mario Party. Perfect

E3 2019 air bnb view



Review | 2019.06.03

Power King 7hp wood chipper

Review time. Well, review + how-to. Written like I might copy and paste it as a product review.
Research

Great Circle wood chipper shredder product image

Source.

I bought a wood chipper because I have lots of long, 0.5"-5" thick branches with leaves to dispose of - enough that taking them to yard waste recycling is not an attractive proposition. A lot of chipper/shredders seemed to have a separate feed for chipping (pictured above), one that is small enough that they appear to require thinning the branches out to pass them through. I don't know how true this is, but it's why I went for the single, conical feed where I could theoretically feed a bushy tree branch. Importantly, having usable mulch wasn't a goal of mine, so I was willing to risk chunkier output that might come with a single chipping function.

Power King 7hp wood chipper shredder crated

So I bought the Power King 7hp for about $1000.

Power King 7hp tires Power King 7hp assembly Power King 7hp prop Power King 7hp assembled

Assembly was a reasonably-straightforward hour or so. The machine is basically a Kohler engine strapped to a chipping chassis that's of different build quality. On a positive note, no welds or fittings appeared unsound, but the thing is covered with the absolute minimum-effort paint process. Breathing on it wrong will scratch the orange paint right off. While it's not particularly concerning for my low-mobility purposes, the wheels are held on to the axle with just a cotter pin, so they slide left and right as you pull the thing.

Power King 7hp wood chipper shredder OSHA curtain

As many others did, I immediately removed the 'OSHA curtain', as it looked like it would inhibit the feeding process. I later found that it does indeed have the purpose of blocking much of what the PK throws back out of the hopper - so eye protection is critical, curtain or no.
Usage

Power King 7hp branch size guide hopper

Using the PK is a matter of learning curve. I jammed it a half-dozen times in my first few hours of use and have since gotten considerably better at it.
Power King 7hp wood chipper shredder leaf jam

Problem solving requires removing two nuts for the hopper, exhaust, and/or the shaft cover. A quick release mechanism for these would significantly improve user experience, but after getting used to the limitations of the PK, it's not too bad. Manually turning the shaft to expel branches caught between the chipper drum and chamber works most times, but if it's really bad you'll just strip the shaft.

Power King 7hp wood chipper shredder stuck branch blade

At one point I was using a drill and sawzall to unstick the chipper. Another design flaw - there are bolts sticking out where you have to manually turn the shaft, so your wench can only hit it from certain positions and for a very small rotation.



Infopost | 2019.06.02

Java programming coding Duke parallelism

A short story from graphics to parallelism to lambda to mapreduce to hadoop to Spliterator to ParallelStream.

As my graphics library has been growing slowly, but the building blocks are there for slightly interesting things. Solved things, but not always so customizable when bought off the shelf. Elegant designs have won out for the most part, and that's brought creeping overhead. So you get to the thumbnail algorithm that would take seconds to complete. For my baseline image, it was 3.61 seconds (we'll come back to this at the very end). That's not bad for hitting go on a blog post (which chugs on ftp so who cares about some slow graphics processing) or a background batch operation, but not great for the realtime case.

Of course in the modern era you want to farm graphics processing out to the GPU. In addition to the difficulty of connecting the CUDA layer (in Windows), there are some conceptual concerns that kept me from driving down this path. For one, there's overhead moving data for incremental graphics operations. And while GPUs are superb, there are limited gains vs an x-core high clock rate CPU when you're talking about general purpose code (with branching) on a single image. There's absolutely a use case for shipping stuff off to my still-awesomeish graphics card, but I don't think photo processing is it - with the side comment that the GPU is used by the JVM for the actual rendering.

Having some experience with distributed processing, I know that applying a pixel transform to 800x600 = 480,000 pixels is a large and very parallelizable task. For example converting RGB to luminance is the same operation, with zero state or dependencies, executed 480,000 times. It's also a prime counter example to my conclusions from the above paragraph, but let's suspend disbelief because this is about Java parallelization, not throwing my hands up at Windows/CUDA and installing Ubuntu then refactoring code into something that works with a graphics API.

The old school approach to the luminance conversion would be:

convert(int pixels[][])
   foreach(pixel)
      value = (pixel & 0x00ff0000 * 0.2126 + pixel & 0x0000ff00 * 0.7152 +
      pixel && 0x000000ff * 0.0722) / 3;
      pixel = value | value << 8 | value << 16;

Simple, sequential.

The functional programming approach would be to map the function to the data. Your lambda function is just:

convert(int pixel)
      value = (pixel & 0x00ff0000 * 0.2126 + pixel & 0x0000ff00 * 0.7152 +
      pixel && 0x000000ff * 0.0722) / 3;
      pixel = value | value << 8 | value << 16;     
...
convert->map(pixels[][]) // or however your language's syntax prefers

... and the means by which it is applied to the data is left unspecified.

The unspecified means of application left me wondering if there was a way to leverage this for parallelism. In Java. I quickly found that 1.8 had introduced the Spliterator interface. The silly portmanteau name (plus the context by which I got to it) led me to believe this might be the way to iterate over elements in an distributed way. It was even more encouraging that Collection had implemented the interface, so Lists and Sets could be natively split. The docs and StackOverflows had examples like:

Spliterator it = list.spliterator();
it.forEachRemaining(lambdaFunction);

This would behave just like an iterator with bonus of contextual properties like Lists are sequential and Sets are not. Okay, nice, but still serial processing. I was hopeful when I read
"Java example to split the elements to two groups and iterate independently." But the example was:

ArrayList<String> list = new ArrayList<>();
         
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
 
Spliterator<String> spliterator1 = list.spliterator();
Spliterator<String> spliterator2 = spliterator1.trySplit();
 
spliterator1.forEachRemaining(System.out::println);
 
System.out.println("========");
 
spliterator2.forEachRemaining(System.out::println);

Oh, independently/sequentially, not independently/concurrently. Damn. What I was learning is well-articulated here:

Spliterator itself does not provide the parallel programming behaviour ? the reader might be interested in experimenting with a Collection type holding a vastly larger number of objects and then look to implement a parallel processing solution to exploit the use of the Spliterator. A suggestion is that such a solution may incorporate the fork/join framework and/or the Stream API.

Source.

Spliterator doesn't do much unless you want to add the code to kick off threads/processes to leverage its real contribution: chopping up the work nicely and with thread safety. And so this is a solution to the luminance problem, but it's a bad one. To get parallelism, I would need to explicitly split my data into a specific number of subsets and then kick off threads for each. This is both laborious, verbose, and full of overhead. I want to parallelize, but more than that I want to map the function, that is, semantically convey that the data is processed independently.

This led to a brief digression into MapReduce - the concept of mapping a function and then performing a lassoing of results. That led to Hadoop; an Apache platform for farming out large MapReduce and similar distributed processes. Neat, but overkill for this.

Things were looking grim, but then I at last checked up on another type that had popped up in some of my queries. Stream. You know, that vague supertype that your grandpappy used for IO and de/serialization Turns out this isn't it. InputStream and OutputStream and their many descendents actually are just subclasses of Object. Stream was introduced in 1.8.

The tutorial page had this MapReduce example:

double average = roster
    .parallelStream()
    .filter(p -> p.getGender() == Person.Sex.MALE)
    .mapToInt(Person::getAge)
    .average()
    .getAsDouble();

Okay so they're pulling a parallel stream from the roster Collection and performing a bunch of steps on it. That actually looked good.
The code is straightforward and the documentation seemed to indicate it'd be a parallel effort with width determined by the platform. It was worth a try, so I decided to see if I could feed my thumbnailer code into Stream. Pardon my switching of example horse mid-stream, so to speak, but this one had that nice 3.61-second benchmark.

The baseline code just took a user-specified number of areas and did a bunch of computations on them. The area size would be inversely proportional to the number of areas, so we're talking generally the same amount of work regardless of the client code.

foreach (area)
   area.computeInterest(); // Does a lot of pixel math.

I fumbled a bit with how to back into the area.computeInterest() call:

areas.parallelStream()
   .mapToInt(a -> a.computeInterest());

This and similar formulations gave me errors that seemed to understand how badly I was abusing their interface. I calmed down and read a bit more, oh there's a foreach:

areas.parallelStream()
   .foreach(a -> a.computeInterest())

Boom, 1.10 seconds. And tighter code that more deeply conveys the independence of each operation.



Storypost | 2019.06.01

Borderlands Sledges Safehouse load screen bandit

After travel and catching up, things are getting back to normal.
Activities

Tree trimming

A couple wildlife/roof incidents convinced me to push tree trimming to the front of the queue. There is lots of greenery to clear out.

Vote Kerry playing cards 2004 Barack Obama deuce

At poker night at Ryan's, he scrounged for a second deck and found a rather vintage option.

Red Not Chili Peppers Belly Up

Jes took me out to see some tribute bands at Belly Up.
MD

American Brewing Company Maryland motorcycle posters fish tank

A little while back there was an MD trip. I don't remember the name of the joint, but I was impressed by their moto art and Flying Dog selection.

BWI Southwest airport Flying Dog pint Steadman
Borderlands GOTY

Borderlands Skag Gully Firestone

The long-awaited re-release of Borderlands 1 on PS4 has given J and I a huge wave of nostalgia. The game definitely holds up.


We blitzed a couple of playthroughs and have started Moxxi's Underdome and the excellent Knox DLC.

Borderlands GOTY new character Borderlands GOTY Steele tentacle impaled Borderlands GOTY Lilith SMG
Borderlands GOTY The Destroyer intro screen Borderlands GOTY Old Haven Borderlands GOTY Kroms Canyon Borderlands GOTY ADS BadMutha Spiderant Infector
Borderlands GOTY rakk hive Borderlands GOTY achievement gigawatts Borderlands GOTY load screen trash coast
PUBG

PUBG Vikendi Dino Park rollercoaster night aurora

There's been a bit of PUBG action. I don't remember dropping dino park during an aurora, it's very pleasant.

PUBG Dino Park t-rex PUBG Dino Park parking lot

Risk of Rain

Risk of Rain 2 Commando Beetle Queen screenshot

When we get four, we are still having a blast with ROR2.

Risk of Rain 2 salamander vendor

CattleDecapitation looked up some of the secret areas, such as the giant salamander vendor.

Risk of Rain 2 magma worm Risk of Rain 2 beetle queen bubbles Risk of Rain 2 character select Huntress Risk of Rain 2 clay dunestrider boss teleporter