Monday, August 27, 2018

wideNES - Peeking Past the Edge of NES Games

http://prilik.com/blog/wideNES
At the end of each frame, the CPU updates the PPU on what has changed. This involves setting new sprite positions, new level data, and —crucially for wideNES— new viewport offsets. Since wideNES runs in an emulator, it’s really easy to track the values written to the PPUSCROLL register, which means it’s incredibly easy to calculate how much of the screen has scrolled between any two frames!

Hmm, what would happen if instead of painting each new frame directly over the old frame, new frames are instead painted overlapping the previous frame, but offset by the current screen scroll? Well, over time, more and more of the level would be left on-screen, gradually building up a complete picture of the level!

Friday, August 24, 2018

How I recorded user behaviour on my competitor’s websites

https://dejanseo.com.au/competitor-hack/
I spoofed the back button in Chrome and sent people to my version of search results and competitor websites where I recorded everything with Lucky Orange.

Friday, May 25, 2018

How Ikea took over the world

http://fortune.com/ikea-world-domination/
One way Ikea researchers get around this is by taking a firsthand look themselves. The company frequently does home visits and—in a practice that blends research with reality TV—will even send an anthropologist to live in a volunteer’s abode. Ikea recently put up cameras in people’s homes in Stockholm, Milan, New York, and Shenzhen, China, to better understand how people use their sofas. What did they learn? “They do all kinds of things except sitting and watching TV,” Ydholm says. The Ikea sleuths found that in Shenzhen, most of the subjects sat on the floor using the sofas as a backrest. “I can tell you seriously we for sure have not designed our sofas according to people sitting on the floor and using a sofa like that,” says Ydholm.

Monday, March 12, 2018

Smart homes and vegetable peelers

https://www.ben-evans.com/benedictevans/2018/1/4/smart-homes-and-vegetable-peelers

Wednesday, August 30, 2017

A history of branch prediction from 1500000 BC to 1995

https://danluu.com/branch-prediction/
One way you might design a CPU is to have the CPU do all of the work for one instruction, then move on to the next instruction, do all of the work for the next instruction, and so on. There’s nothing wrong with this; a lot of older CPUs did this, and some modern very low-cost CPUs still do this. But if you want to make a faster CPU, you might make a CPU that works like an assembly line. That is, you break the CPU up into two parts, so that half the CPU can do the “front half” of the work for an instruction while half the CPU works on the “back half” of the work for an instruction, like an assembly line. This is typically called a pipelined CPU.

Sunday, July 9, 2017

Intro

The Raspberry Pi has really come along nicely.  This year for Pi Day they released an version of the $5 Pi Zero, which has wifi and costs$10.  That's $10 for a full computer with wifi, and bluetooth, which is pretty amazing (you do have to find or buy a 8GB microSD card and a micro USB power supply, so actual costs are closer to$25, but still).

I bought one without any real purpose in mind.  Around the same time my girlfriend bought a cat toy call the "Bolt".  It's a laser which reflects off a mirror and makes a large arc on the floor, randomly changing directions.  There's a single button on the back to turn it on/off.

I figured the button was just shorting something to turn it off and on, and I could replicate that with a Pi to enable it to be web controlled.

Before I began, I had some requirements in mind:
• The finished product had to be fairly well polished.  It had to look, at least at first glance, like a consumer product.
• It had to just work when plugged in, I could spend as much time as I needed hardcoding wifi passwords ahead of time, but the end result had to be plugging it in and it working.
• The normal button the back of the toy had to work the same as always.
• The interface had to be relatively simple to use, I was ok with a page that could be bookmarked.

Hardware

The toy took 4 AA batteries which means it used around 5V and I could probably power it from the Pi as well.  The Pi uses 5.25 V, and while you can't power things from the GPIO pins, there is a 5.25 V pin that is a straight connection to your power supply.  The Pi power supplies are generally 1 or 2 amps, and the Pi Zero needs like 200 mA, so I figured I'd be fine on power.

So I got the toy and I cracked it open to see what was what.  It opened pretty well considering there were no screws.  The wiring was pretty simple.  Two wires supplying power from batteries, and then two wires connecting the button.

The first step was seeing if 5.25 V would even work.  AA batteries are nominally 1.5 V, which means it would be 6 V.  However, they drop off in voltage quickly, and rechargeable batteries are 1.2 V which would give 4.8 V, so it had to be fairly robust.  I hooked up a power supply, and set it to 5.25 V and confirmed everything worked.  Then I measured the voltage across the push button and confirmed it was just 5.25 V.

The next step was cutting out the battery compartment, and confirming that 3.2 V from the GPIO pins would turn it on.  I measured the current draw of the toy at about 200 - 400 mA, which would be easily handled by my power supply.  Finally, I confirmed that the actual 5.25 V pin on the Pi could power the toy.  At this point I figured the hardware was settled, I just had to figure out how to send a command to a Pi.

Software

This is where I ran into some troubles.  While I knew a lot of ways I could do this in theory, I didn't want to have to mess with routers and port forwarding.  My first plan was to use Twilio and use SMS to control it.  However, looking into it, Twilio just converts SMS into API calls, I'd still need an API, and some way for the Pi to connect to it.

The low tech way of doing that is to just poll the API constantly.  That works, but it lacks elegance, and I'm all about elegance.

It turns out that Rails 5 supports websockets, which is the ideal way of doing this.  Websockets are just an extension to http.  Essentially websockets start as a http request, and the server just leaves the connection open.  There's more to it than that, but it's really just a standard around leaving connections open so that servers can send messages to clients without the client having to request it each time.

Websockets API

I got to work on making a Rails API, which was pretty straight forward.  The websockets stuff was also pretty easy, as Rails tends to be.  However, when it came time to make a client, I couldn't get the format of the requests right.  I was attempting to use Python, and whatever their websockets library is, but I decided to look for implementations that were designed with the Rails websockets server in mind.

I ended up using this project, which is designed to work with Rails.  Once I switched to that, the rest of the API work went quite fast.

Websockets Client

Next I made the Pi client that would listen for websocket events and turn on the cat laser.  The basic idea was simple: I found a Ruby gem to do GPIO stuff, and set it to drive my pin high for half a second.  I tested it with the hardware and everything worked (amazingly).  The hard part came in making the client robust.  This thing had to be very user friendly.  It had to just work.

The gem I was using had some hooks for unsubscribed, but I quickly learned they weren't reliable.  Further investigation revealed that there was a ping that came through every 3 seconds.  My plan was to record that and attempt to reconnect when it got old.  However, I couldn't get that gem to reconnect successfully.  My final plan was just to write the ping timestamps to a file, and then have the script end when they got old.  A separate script would check for ping age and restart the main script when it saw them old.  I set up a ramdisk for the ping file so it wouldn't kill my SD card.

This felt pretty hacky, but worked very well.  Every method of artificial connection problems I could simulate were handled by this.  It could take up to a minute to reconnect, but that was fine, and was mainly due to me running this as a cron job.  If reconnecting faster were really an issue I could do it in a loop.

Hardware, part II

With that I had a pretty solid setup.  I began to plan on how I would wire this all up.  While the hardware was simple, I was most worried about messing something up there.  It was around this time that I realized there was a flaw in my hardware plans.  I was planning on hooking a GPIO pin directly up to the low side of the push button.  I would raise it to 3.2 V and that would turn on the toy.  You could also press the button and it would raise it to 5.25 V as it normally would.  This let you use the normal button the same as always.  However, the button would also short 5.25 V to the GPIO pins, which would kill the Pi (or at least the pin).  My first thought was to use a diode, which basically act as a one way valve for voltage, but they also drop the voltage across them, and it was already lower than it should be at 3.2 V.  My tests showed the diode was unreliable.

 The failed setup

My next plan was a transistor.  Transistors are both sophisticated and simple, but for my purposes I could treat them as a voltage controlled switch.  I used an NPN transistor I had laying around and connected the collector to the high side of the switch, and the emitter to the low side.  I could then supply 3.2 V to the base to send 5.25 V to the low side of the switch and turn the toy on.  Pressing the button normally would short the emitter and collector, which would be fine.  I tested this set up and it seemed to work, although it was getting difficult to test all these connections with the toy physically moving around when it turned on, and the Pi having no headers to plug stuff into securely.

 The winning setup

I used this as an excuse to buy something I had my eyes on for quite some time.  This fancy third hands tool.  You can get these things for like $5, but this one has a reputation for being very versatile and well thought out. Plus they included a bag of Swedish Fish in the box, which made me happier than anything else in recent memory. At this point I had three wires. One I had soldered to the low side of the switch, and then the 5.25 V and ground supplies coming from the Pi. I shrink tubed the solder joints to protect them (after one broke). I began thinking about how the Pi would fit inside. The Pi zero is very small, and there was a good amount of empty space inside the toy, particularly where the batteries had gone, so fitting it wasn't a problem. However, I wanted it to be secured in there so I wouldn't have to worry about it coming lose and putting stress on the wires. There were four screw posts where the battery compartment had been attached. I decided this would work perfect to attach one of the corners of the Pi. I spent a while going over the possibilities. There were a lot of ways the Pi almost fit, but there seemed to be one choice that was the best out of the ways it did fit. I soldered the wires to the pins on the Pi, and I attempted to drill a hole for the cord, only to discover the plastic was having none of that. I resorted to using pliers to cut and twist the plastic apart. This actually worked far better than I would have expected, and the end result was pretty presentable looking. I plugged it all in and tested it with the API hosted on Heroku. Amazingly it worked. I tested rebooting the server and killing the wifi and other permutations, and the client consistently reconnected. Alexa The API worked well, although it was a bit clunky to use, having to bookmark a page with the basic auth username and password built in. This gave a warning on most browsers that you had to click through. Ultimately a legitimate front end would solve this, but in the short term I decided to bring in yet another technology I was aware that Alexa had an API to perform custom actions. Setting it up took a few hours, mainly due to how cryptic Amazon is about everything they do. First you need to create a lambda function. Lambda functions are just short scripts you write in Javascript or Python and Amazon runs them when you hit some endpoint. They're pretty straight forward. I used Python 2.7, and set up a "role" (Amazon's permissions model) with whatever basic preset was available. I then set the trigger to be "Alexa Skills Kit". My code was just the color sample code, with all my code in the get_welcome_response method. That method gets called when the Alexa runs the lambda and all I had it do was hit my API. At this point you get an ARN which is what you need the Alexa to call to run your lambda. The second half was much more confusing. First, for some reason all the Alexa stuff is not in AWS, but rather the "Developer Console". Once I found that I created a new Alexa skill. There is a ton of configuration for the skills, but for the most part I either left it as defaults, or googled values to enter for things like "Intents". The only real configuration I had to do was to enter my ARN as the endpoint, and enter what I wanted to say to turn it on as "Invocation Name". Once I got to the testing step I enabled that and it worked. I didn't have to fill out Publishing or Privacy details. While the skill worked for me, I wanted to make it available to other users, while not actually publishing it. After hunting around I discovered you can invite users to be developers in Settings > User Permissions. They then have to accept, and go into the developer console and enable testing in the skill. It will then show up as a custom skill in the Alexa app. With this, the command "Alexa, laser" would turn it on/off, and it worked pretty well. The only hiccups have been in Alexa failing to understand what is being said. How's it work? This setup has been running for 3 months now, and has been amazingly robust. There has been exactly one case of the API and client not working, and that was caused by the Pi losing its wifi connection for some reason and then failing to reconnect. Unplugging the Pi fixed it. I then set up another script to run on the Pi to check the last ping timestamp and restart the Pi if that is a few minutes old. The code for the controller and client are on Github: https://github.com/StephenWetzel/pi-controller https://github.com/StephenWetzel/pi-client Saturday, June 3, 2017 Network Protocols https://www.destroyallsoftware.com/compendium/network-protocols TCP has no special "I lost a packet!" message. Instead, ACKs are cleverly reused to indicate loss. Any out-of-order packet causes the receiver to re-ACK the last "good" packet – the last one in the correct order. In effect, the receiver is saying "I received packet 5, which I'm ACKing. I also received something after that, but I know it wasn't packet 6 because it didn't match the next sequence number in packet 5." If two packets simply got switched in transit, this will result in a single extra ACK and everything will continue normally after the out-of-order packet is received. But if the packet was truly lost, unexpected packets will continue to arrive and the receiver will continue to send duplicate ACKs of the last good packet. This can result in hundreds of duplicate ACKs. When the sender sees three duplicate ACKs in a row, it assumes that the following packet was lost and retransmits it. This is called TCP fast retransmit because it's faster than the older, timeout-based approach. It's interesting to note that the protocol itself doesn't have any explicit way to say "please retransmit this immediately!" Instead, multiple ACKs arising naturally from the protocol serve as the trigger. Tuesday, May 16, 2017 MP3s as a litmus test for good journalism The MP3 format was invented by a German group in the early 90s. They patented it, and licensed it out to companies. This is the reason many open source programs force you to download MP3 libraries separately. The last patents for mp3 expire this year (2017). Now anyone can use it without having to worry about licenses. The group that created it announced they would stop licensing it (since they can't) and suggested people move to AAC (since they still own patents on that). The result is news organizations running stories with headlines like "MP3 is Dead". This presents and interesting look into which sources are reliable sources for tech news, and which use hyperbolic headlines for the sake of clicks. I went to Google News and searched for recent articles that mentioned 'MP3'. Some of these were pretty obvious, but some were surprising. To be fair, some are technically correct, in saying the creator declared it dead, vs saying it actually is dead, but merely parroting a press release is still going under the 'Bad' category. The BBC was close, but I put it in good because it didn't feel clickbaity to me, feel free to disagree. Finally, I won't pretend like this single example is some end all test for who you should and shouldn't trust, it's just and interesting source of some empirical data. Bad NPR: The MP3 Is Officially Dead, According To Its Creators The Atlantic: The End of the MP3 Gizmodo: Developers of the MP3 Have Officially Killed It The Register: MP3 'died' and nobody noticed Quartz: Say goodbye to the iconic MP3 CNBC: The MP3 is dead, say creators after terminating licensing The Telegraph: Creators of the MP3 declare it dead Tech Radar: RIP MP3 - the sound file that changed the world is declared dead Good Washington Post: Your MP3s are going to be just fine Mashable: The MP3 isn't dead yet, but it's now on its last digital legs Vice: The MP3 Is Not Dead CNET: MP3 isn't dead, it's just sleeping BBC: It might be time to say goodbye to the MP3 - so let's look back at its life Friday, May 12, 2017 Are Pop Lyrics Getting More Repetitive? https://pudding.cool/2017/05/song-repetition/ This is some good data, but the presentation is very interesting as well. Tuesday, April 25, 2017 Github has all the best cat stories https://gist.github.com/lossyrob/a663186ccf37ea613a6b9ccb78de2cd1 In broad daylight, we could see why this was street cat utopia. What used to be a deli or some other food store collapsed in what looks like the 80s. A tree had grown through the inside where the roof had collapsed, a branch somehow punching through brick wall and completely enveloping a piece of old metal shelving. There was no way into this place past the first few steps. The roof was collapsed with a capital C. You could see through the busted rafters towards the middle of the (what was now) one big room of the first floor, and to the street cats that were lazily napping in the sun, protected by their fortress. Tuesday, March 14, 2017 MediTech I've been reading through these replies about "MediTech" trying to determine if it's some sort of elaborate inside joke I'm not picking up on. There is a company called MediTech in Massachusetts that uses a derivative language of MUMPS called Magic. I know several programmers that have worked there. There are thousands of engineers writing in this language as we speak. From what I can remember: -Only global variables -Variables must only be capital letters, maximum length 6. If you run out of variables, you must cleverly use them in a routine and set them back to what they are. This means you can't use a name like myVar - you use AAAFD, ZBVCXZ, etc. -System functions are usually things like ., >, ', ], so code looks like .'AAAF]{\;:.. -Meditech writes all of their own languages, databases, operating systems, tools, etc. You can only write in a non-Meditech language if you get approval from a multi-tiered architectural design board, which barely ever happens -The founder hated C with undying passion. No one is ever allowed to use C -All programming hires go through a 6 to 12 month training process to learn the tools, languages, and systems. As they almost exclusively hire non-CS majors, such as math and physics majors, they don't typically have a programming background and don't realize how bizarre the MediTech stack is Monday, March 6, 2017 A Good Overview of How Trump Operates I try not to post a lot of political or topical stuff here, but this is a very good overview of Trump and how he operates. It goes into a lot more background and detail than just the current Russia story. Whenever he is under fire for something in a sustained way, he makes a shocking claim or provocative declaration about something else to change the subject. He is a master practitioner at the politics of distraction. These five examples might jog your memory: • After struggling during the first GOP primary debate to explain his disparaging comments about women, he attacked Megyn Kelly. “There was … blood coming out of her wherever,” he said, ensuring that the media focused on the new Trump-Kelly “feud.” • In November, the morning after agreeing to settle a fraud lawsuit against Trump University for$25 million, he demanded that the cast of “Hamilton” apologize to Mike Pence.
• Perturbed when critics pointed out that he lost the popular vote, he claimed that 3 million to 5 million people voted illegally.

Saturday, February 11, 2017

Top mentioned books on stackoverflow.com

http://www.dev-books.com/

We analysed more than 40 000 000 questions and answers on stackoverflow.com to bring you the top of most mentioned books (5720 in total)

How we did it:
• We got database dump of all user-contributed content on the Stack Exchange network (can be downloaded here)
• Extracted questions and answers made on stackoverflow
• Found all amazon.com links and counted it
• Created tag-based search for your convenience
• Brought it to you

Saturday, January 28, 2017

Overjustification effect

https://en.wikipedia.org/wiki/Overjustification_effect
The overjustification effect occurs when an expected external incentive such as money or prizes decreases a person's intrinsic motivation to perform a task. The overall effect of offering a reward for a previously unrewarded activity is a shift to extrinsic motivation and the undermining of pre-existing intrinsic motivation. Once rewards are no longer offered, interest in the activity is lost; prior intrinsic motivation does not return, and extrinsic rewards must be continuously offered as motivation to sustain the activity.

Sunday, January 15, 2017

The Line of Death

https://textslashplain.com/2017/01/14/the-line-of-death/
The Metro/Immersive/Modern mode of Internet Explorer in Windows 8 suffered from the same problem; because it was designed with a philosophy of “content over chrome”, there were no reliable trustworthy pixels. I begged for a persistent trustbadge to adorn the bottom-right of the screen (showing a security origin and a lock) but was overruled. One enterprising security tester in Windows made a visually-perfect spoofing site of Paypal, where even the user gestures that displayed the ephemeral browser UI were intercepted and fake indicators were shown. It was terrifying stuff, mitigated only by the hope that no one would use the new mode.

Tuesday, December 20, 2016

Popcorn

I really like popcorn.  I often find myself watching TV just as an excuse to eat popcorn.  I've gone months where I had it every night.  A while ago I decided to buy an air popper.  I've built up quite a recipe around the air popper, and I'd like to outline it here.

Why an air popper?
Air poppers are like $20 and the popcorn is much cheaper than the microwave bags. They are a bit faster than a microwave, and you can never burn it. There is nothing to clean because you only put dry popcorn in them, the oil is added afterwards. Air Popper I did a fair bit of research into air poppers, as I tend to do before buying anything. Long story short, they're all the same, and you should get a cheap one. This one is about$20.  It has a built in measuring cup, you dump the dry kernels in the top, and plug it in.  Set a large bowl next to it, and wait a few minutes.  The last 10 or so kernels never pop, so give up on them.  Unplug and that's it.

Kernels
A few people recommended Orville Redenbacher for air poppers.  I started out buying at the grocery store, but you can get a giant jug on Amazon for cheap

Bowl
It sounds silly, but you do need a large bowl.  I always ate popcorn straight from the bag, so I didn't have one.  I just got a 7 L one from Walmart.  Make sure it's at least 6 liters.

Salt
You can just use regular salt, but finer salt will stick better.  Generally you'll waste tons of salt no matter what.  After much research I found this movie theater style salt which is great, and will last like 30 or so bowls.

Salt Shaker
You can just use any regular shaker.  But I'm generally looking for one that has a few, well-separated, smaller holes.  The popcorn salt is much finer, so it comes out very fast of normal sized holes.  This is the best I've found so far, it works, but the holes could be a bit smaller.

Oil
You need oil, basically to make the salt stick.  I've just been buying this generic popcorn oil.  Don't expect much flavor from the oil, it's basically just soybean oil.  I've heard coconut oil is the best flavor, but it's difficult to spray on.

Sprayer
It's basically impossible to drizzle oil evenly.  I bought this spray bottle, which is crazy expensive, but is designed for oil.  There are cheaper oil sprayers but the reviews say they clogged, whereas I've been using this one for months and it's fine.  A word of warning, they spray in a flat fan pattern, which means you have to move the sprayer as you spray.

Saturday, November 19, 2016

This just in: Lightning bugs have different flash patterns based on species and sex

https://legacy.mos.org/fireflywatch/images/MOS_FFW_Firefly_Flash_Chart.pdf

Thank you for subscribing to bug facts

How many fireflies would it take to match the brightness of the Sun?

Saturday, October 1, 2016

Body Cameras Are Betraying Their Promise

http://www.theatlantic.com/technology/archive/2016/09/body-cameras-are-just-making-police-departments-more-powerful/502421/
In case after case, police departments say officers did not have their body cameras activated when it counted. It can seem as though incidents where body-cam footage helped secure an indictment—such as in Marksville, Louisiana, last November, or as in Cincinnati last July—are more rare than the cases where they don’t.

These are breaches of protocol—incidents where events didn’t happen as the law would require. Often, these violations are never significantly punished. This is the second major threat to body-camera accountability: If there’s not significant discipline for officers who fail to follow local policies—as the officers failed in D.C., Chicago, and Charlotte—then it doesn’t matter what’s in the policy.

Will Raccoons Trump Rats as the Ultimate Urban Mammal?

http://www.slate.com/articles/health_and_science/science/2016/09/raccoons_are_taking_over_urban_environments.html
And I heard from a friend who works in the State Department about a raccoon that snuck into her building while it was under construction, and then walked across ceiling tiles until it got to her office and hung out above her desk, visible through the mesh-type ceiling panels, perhaps attracted by the scent of her sandwich.

Saturday, September 3, 2016

Replacing a modded Xbox with a Raspberry Pi, as a classic game emulation station

As you're likely aware, I'm a big fan of using orginal Xboxes modded to allow playing various NES and SNES (and sometimes N64) games.  Xboxes are cheap, and the software that runs on them has a pretty good UX.  That being said, they are getting pretty long in the tooth, and while the finished product is pretty slick, the process of modding them is annoying enough that I pretty much refuse to actually do it.  They are also rather huge and unwieldy in the age of tiny single board computers that are more powerful and draw far less power.

I have a few Pi 3s so I'd figured I give RetroPie a shot.  This will be less of a how to, and more of a review/comparison to modded Xboxes.

What you need

This is probably the biggest draw back of the Pi vs Xbox.  An Xbox can be had for $40 pretty reliably, or probably free from somewhere. They generally come with everything you need to play, including at least one controller. The Pi costs$40 by itself.  You then need a power adapter, a HDMI cable, a case, and an SD card.  Then you'll need controllers, 2 SNES knock offs will cost $30, or you can use XBOX360 ones if you want wireless and joysticks, but that'll bump the cost up$70 more.

 Name Cost Link Pi 3 $36 https://smile.amazon.com/dp/B01CD5VC92/ Power$10 https://smile.amazon.com/dp/B00MARDJZ4/ Case $8 https://smile.amazon.com/dp/B01F1PSFY6/ SD Card$10 https://smile.amazon.com/dp/B010Q57T02/ 2 Controllers $25 https://smile.amazon.com/dp/B002B9XB0E/ HDMI$6 https://smile.amazon.com/dp/B014I8SSD0/ Total \$95

You might have some of this stuff, but I don't think it's fair to assume you do for the price calculations.  So the cost is at least double an Xbox, probably more if you want joysticks.

Install

I won't give a full install guide here, you can follow the official guide easily enough.  However, I will say the install is far easier than an Xbox.  Download the image, write it to the SD card, pop the card in the Pi, attach controllers, and power it on.  It autodetects the controllers, and lets you configure them.  FTP in (u: pi, p: raspberry) and put roms in the ~/RetroPie/roms/* folders.  Restart and the systems where it finds roms will show up in the list.

Config

There isn't much to config, you can pretty much just play out of the box, however, there were some things I wanted to change.  For example, I found the layout of NES buttons to be annoying.  A bit of research told me that while the initial global controller set up is easy, there is no way to edit per system controls without editing the cfg files.  For NES the file is at /opt/retropie/configs/nes/retroarch.cfg

You can SSH into the Pi with ssh pi@192.168.1.125 (change the IP to yours), then cd to there, and use nano to edit that file.  Alternatively, you can FTP the file back and forth. The config is very confusing due to the fact that you have the labels on the controller and in the file which may not match.  The numbers refer to the position of the physical button on your controller.  The letters refer to what that button should do.  For the Buffalo SNES knock offs this was my config for NES:

input_player1_b_btn = 3
input_player1_a_btn = 1
input_player1_y_btn = 2
input_player1_x_btn = 0

Thoughts

I think it works pretty well.  There are some rough edges, but I guess those are mainly a concern for someone like me that wants to configure everything.  All the games I tested work well.  The one exception was N64, where they stuttered quite a bit.  The Xbox was never great at N64 either, but it feels like it did better than the Pi.  Perhaps that's just the few random games I tested, or maybe because the Pi doesn't actually have a video card.

Also there is no easy way to turn the Pi on and off, you just unplug it.  For what it's worth, I measured the Pi as using about 2 watts (compared to the Xbox at about 50 w), so leaving it turned on 24/7 isn't a bad idea.

I was kind of disappointed at how poor N64 performance was.  If that were better I'd spend the money for a set of wireless controllers and be quite happy.  Each release of the Pi see a pretty significant speed bump, but at the same time I don't know if that is going to actually help, I think it's more the software and lack of video card.

Prelude

Some years ago-never mind how long precisely-having little money in my purse, and nothing particular to interest me on shore, I thought I would set about to fix a friend's computer.  I can't recall what was actually wrong with it, but at some point, I figured I might try to flash the BIOS for no real reason.  The long story short is I used the wrong BIOS file and ruined the computer.

Since then "Flashing the BIOS" has become an inside joke.  That being said, I've learned a lot of lessons over the years, and would not make the same mistakes today.  As an example, let me regale you with this tale:

A New Router

I recently moved, and my best internet option here was xfinitywifi which is broadcast in the area.  However, I needed to be able to connect any device to that without going through their web portal, and be able to hook up wired devices.  Simple enough, I bought a router, and installed DD-WRT on it.  There was the potential for bricking the router, but I did my research and found a version of DD-WRT with numerous confirmed successful installs on the internet.

The install went fine, and as an added bonus, the antennas on my router picked up the xfinitywifi signal much better than my laptop.

Premonitions

All was well in the world.  But then my internet started going down.  It turns out my router would lock up and crash, and need to be restarted.  This seemed to be happening with increasing frequency.  The solution seemed obvious.  I bought a 120 V relay and wired it to a Raspberry Pi.  I then wrote some code to ping some sites to see if the internet was still up, and if not, to restart the router.  This was an iterative process, as I discovered the router would sometimes allow pings to IPs (like google's DNS 8.8.8.8), even in its frozen state.  I also noted that pings to the router would occasionally still work, even when the router refused to serve the status page.  So I changed the script to check the status page via wget.

This worked pretty well.  I set it up to run every 30 seconds, and to restart the router as soon as it couldn't get the status page.

Discontentment

Searching online though, it seemed like no one else was having this problem.  I figured this may just be because I was using the less common repeater mode, but it may have also been because I was using an older release of DD-WRT, since I wanted to find one with plenty of confirmation it wouldn't brick the router.  I found one or two people who said they were running the latest version on that router so I decided to upgrade the firmware to the newest version.

I carefully found the correct file, and plugged directly into the network so there was no chance of being disconnected during the update.  When I figured I was ready, I hit upgrade.  As soon as I clicked the button I realized my mistake.  My router was still hooked up to my crazy Raspberry Pi contraption.  Within the next 30 seconds the Pi would try to get the router status page, fail, and then cut the power to the router.

There was nothing I could do.  Pulling the plug on the Pi would cut the power to the relay and cause it to open.  My only chance was to SSH into the Pi and kill the process.  That, of course, relied on the network being up.  As soon I hit enter on the SSH command I heard the click of the relay turning off.

And with that, my router was bricked.

I tried a few recovery methods I found online, but it didn't matter.  My router had a half installed firmware, there was no way for it to boot, so it looped endlessly.

Excursion

While connecting directly to xfinitywifi gave me some internet, it was unreliable and I wanted to get this resolved.  I convinced myself just to get a new router, one that would hopefully not have the freezing problem.  Walmart was the only place that was open so I found that they carried the Netgear Nighthawk router and set off to buy it.  I arrived at 12:01 am to discover that the Walmart I was at closed at midnight.  I drove to another Walmart to discover they didn't have any in stock (despite their site claiming they did).  I bought a lesser router, figuring it might be better than nothing.

A New Hope

When I got home I thought more about what to do with the broken router.  I, of course, considered switching out the guts, but I didn't have any of the packaging, and knew I couldn't just put the old router in a new box since the serials wouldn't match.

I did more research and discovered two more advanced recovery methods.   The first involved setting up a TFTP server, and connecting directly to the router, with a static IP that it would check for a certain file and then flash itself with.  I set this all up, and as luck would have it, it got the file from my computer and started to flash itself.  Then it rebooted, and rebooted.  I guess it didn't have enough firmware written to get through the firmware update steps before it rebooted.

A New Hope, Part 2

The more involved method, as these things so often do, required opening the router and soldering some pins onto the board.  While my new apartment is pretty barren, one thing it does not have a dearth of is random electrical components.  I had pin headers, male to female jumpers, even a USB to UART breakout board.  It was about 3 am at this point, which seemed like the ideal time to begin the next phase of this project.

I opened the router, found the through-holes, broke off three headers and placed them in the correct holes.  Hooked up Rx, Tx, and Ground to my UART, plugged that into my laptop, and attempted to connect via PuTTY, and got nothing.  It was pretty odd as I was sure the connections were right.  I have done USB serial communication stuff before though, and I know it's very easy to get the connection details wrong.  That being said, usually that would result in gibberish, not nothing.  After much experimentation I noted I could sometimes get gibberish if I moved the connections around.  This led me to believe perhaps the connections actually needed to be soldered, and not just placed there.

At this point, I feel it's worth noting that while I have a nice large table in my living room, I only get internet via my laptop in my bedroom.  I did buy a large corner desk for my room, but have yet to assemble yet, despite sitting around in my apartment every day with nothing to do.  As such, all this work was being done with me in bed with the parts in bed with me.

Dawn

It was about 4am when I turned on the soldering iron (which I did do in the living room, not in bed).  I soldered the headers on, and as is tradition, discovered I soldered it wrong, so had to unsolder everything and redo it.  I hooked everything up, and still got nothing.  I suspected my router had so little firmware on it, that it couldn't even communicate over serial.  I checked and rechecked the connections, but there were only 3 wires.  Ground to ground, Rx to Rx, and Tx to Tx.  Then I realized, how could Rx connect to Rx?  Both sides can't be receiving.  Sure enough, the directions I was following clearly stated Rx to Tx.  At 4:45 am I fliped the Tx and Rx wires and immediately got communication.  As I said, I've done this USB serial communication before, and I made this same exact mistake before.

Flashing the firmware was a few simple commands, it grabbed the file from my TFTP server, via ethernet, and rebooted.  It worked fine.  I figured I might as well reflash it with the DD-WRT firmware while it was in this disassembled state.  That was done in a few minutes, and the router was reassembled (with pin header conveniently left soldered on for future endeavors) by about 5:15 am.  Just in time to watch the sun rise while browsing reddit.

Monday, May 16, 2016

Dean Karnazes: the man who can run for ever

http://www.theguardian.com/lifeandstyle/the-running-blog/2013/aug/30/dean-karnazes-man-run-forever
When running, you break down glucose for energy, producing lactate as a byproduct and an additional source of fuel that can also be converted back into energy. However, when you exceed your lactate threshold, your body is no longer able to convert the lactate as rapidly as it is being produced, leading to a buildup of acidity in the muscles. It is your body's way of telling you when to stop – but Karnazes never receives such signals.

"To be honest, what eventually happens is that I get sleepy. I've run through three nights without sleep and the third night of sleepless running was a bit psychotic. I actually experienced bouts of 'sleep running', where I was falling asleep while in motion, and I just willed myself to keep going."

Monday, April 4, 2016

Will minimum wage hikes lead to a huge boost in automation? Only if we're lucky.

http://www.vox.com/2016/4/2/11348148/minimum-wage-robots
What about the workers thrown out of jobs by the new robo-waiters? Many would get new jobs, though the way this would work is often ignored.
• Most restaurants would keep longer hours (they're paying for the rent and the robots anyway), meaning many workers would get a raise and change shifts.
• The advanced robo-restaurant technology would itself be a valuable American export good, and people would be employed in designing and selling it.
• Some low-wage work would be reallocated out of the relatively low-social-value restaurant sector and into things like child care and home health assistance, for which there is ample demand.
• Since poor people are now making more money, there will be opportunities to sell them things — things like restaurant meals! — that they couldn't previously afford, which in turn creates demand for new jobs.

Tuesday, March 15, 2016

Primitive Technology

This guy's videos are quite mesmerizing, and his descriptions are quite interesting to read.

Making Charcoal

Building a tiled roof hut

Sling

Sunday, March 6, 2016

When U.S. air force discovered the flaw of averages

https://www.thestar.com/news/insight/2016/01/16/when-us-air-force-discovered-the-flaw-of-averages.html
He decided to find out. Using the size data he had gathered from 4,063 pilots, Daniels calculated the average of the 10 physical dimensions believed to be most relevant for design, including height, chest circumference and sleeve length. These formed the dimensions of the “average pilot,” which Daniels generously defined as someone whose measurements were within the middle 30 per cent of the range of values for each dimension. So, for example, even though the precise average height from the data was five foot nine, he defined the height of the “average pilot” as ranging from five-seven to five-11. Next, Daniels compared each individual pilot, one by one, to the average pilot.
Before he crunched his numbers, the consensus among his fellow air force researchers was that the vast majority of pilots would be within the average range on most dimensions. After all, these pilots had already been pre-selected because they appeared to be average sized. (If you were, say, six foot seven, you would never have been recruited in the first place.) The scientists also expected that a sizable number of pilots would be within the average range on all 10 dimensions. But even Daniels was stunned when he tabulated the actual number.

Zero.