I think have a good analogy of how I feel, which is a good thing and a step in the right direction. Here goes:
Imagine that for your entire life, you’ve known what the color orange is. Then one day, someone says, “Actually, this is the color orange.” And as this person says that, he holds up a bluish looking color swatch. You ask around and indeed, what you thought was orange is really this blue looking color. Now imagine that orange was/is your favorite color.
That’s how I feel…i think.
Jeff says he gay, but that’s not what I’ve known for all my life. Here is one of my best friends contradicting something I’ve thought was true all my life.
So after talking with Hanway last night until about 3 in the morning (my time), I chatted with Peter. Thus far, only a handful of people know and I surmise that it will be like this for some time. Peter was also the one responsible for “dragging Jeff out.” I don’t know how Peter figured it out, but somehow he did. Peter has also been present when Jeff told a majority of the people he has told, at least within the confines of mutual friends. Peter and I talked about other peoples reactions and who would freak out the most. Quinn and Annie win there.
I don’t think I’m over the initial shock. Although, I have started to think of humors things to do with Jeff (not to him). That seems to be a good sign.
I’m also debating on the whole timing thing. At least the bad timing on my part, being finals week and all. Although, I suppose it was two months on the making, with asking Peter and Jeff and Liz what the Hell was going on. I suppose I have no one but myself to blame.
This does bring up an interesting line of thought though. Jeff and Liz haven’t been talking since last summer. The past few months I’ve been getting more and more information leading up to statement: Jeff lied to Liz. Jeff obviously took it a different direction.
Sorry if these sentences seem random. I’m pretty much just typing out what’s in my head right now…mostly in an effort to get it out so I don’t have to mull over it.
Over the next few days, and maybe even a week or so, I will be blogging about event with the title “Didn’t See That One Coming.” These blogs will be encrypted and may never be decrypted. I have been given information which is rather interesting, however it’s not my prerogative to talk about. All I can say is that the right people know what needs to be known at this time. If you have any questions or comments, feel free to leave them on this blog. I will not be divulging anything else at this time.
There really is no point in beating around the bush on this one, so I’m just going to say it. Jeff Hanway just told me he was gay. There. I said it.
Jeff is, has been, and always will be an awesome friend. I’ve never been in a situation like this before, so for the most part, I’m rather stunned. I can honestly say I had no reason, what so ever. I think the oddest thing is there are people I know who are homosexual and there are people I know who have delt with someone they know being homosexual (usually a family member). They’ve blogged about it, I’ve read it, and that’s that. But now to be on the other side. It’s very surreal.
Having said that. Jeff is an awesome guy. We went to high school together, are in the same Bible Study, and have shared many a laughs and what not. For all intensive purposes, he is my brother and one of the few people I will trust with my life.
JHan has known he was officially gay since freshman year of HS, or there abouts. He even had a few boyfriends, which no one knew about (thus now earning Fergs "Super Sneaky Award").
I like to think that I notice quite a bit. In retrospect, I suppose there might have been a few tip-offs. But nothing conclusive.
Perhaps the most ironic thing about this whole bit is that theBS discused homosexuality on many occations.
I’m really not sure where I’m trying to go with this. I have a lot flowing through my head right now and I really just want to get it out.
The prime reason the Google home page is so bare is due to the fact that the founders didn’t know HTML and just wanted a quick interface. Infact it was noted that the submit button was a long time coming and hitting the RETURN key was the only way to burst Google into life.
Due to the sparseness of the homepage, in early user tests they noted people just sitting looking at the screen. After a minute of nothingness, the tester intervened and asked ‘Whats up?’ to which they replied “We are waiting for the rest of it”. To solve that particular problem the Google Copyright message was inserted to act as a crude end of page marker.
One of the biggest leap in search usage came about when they introduced their much improved spell checker giving birth to the “Did you mean…” feature. This instantly doubled their traffic, but they had some interesting discussions on how best to place that information, as most people simply tuned that out. But they discovered the placement at the bottom of the results was the most effective area.
The infamous “I feel lucky” is nearly never used. However, in trials it was found that removing it would somehow reduce the Google experience. Users wanted it kept. It was a comfort button.
Orkut is very popular in Brazil. Orkut was the brainchild of a very intelligent Google engineer who was pretty much given free reign to run with it, without having to go through the normal Google UI procedures, hence the reason it doesn’t look or feel like a Google application. They are looking at improving Orkut to cope with the loads it places on the system.
Google makes changes small-and-often. They will sometimes trial a particular feature with a set of users from a given network subnet; for example Excite@Home users often get to see new features. They aren’t told of this, just presented with the new UI and observed how they use it.
Google has the largest network of translators in the world
They use the 20% / 5% rules. If at least 20% of people use a feature, then it will be included. At least 5% of people need to use a particular search preference before it will make it into the ‘Advanced Preferences’.
They have found in user testing, that a small number of people are very typical of the larger user base. They run labs continually and always monitoring how people use a page of results.
The name ‘Google’ was an accident. A spelling mistake made by the original founders who thought they were going for ‘Googol’
Gmail was used internally for nearly 2years prior to launch to the public. They discovered there was approximately 6 types of email users, and Gmail has been designed to accommodate these 6.
They listen to feedback actively. Emailing Google isn’t emailing a blackhole.
Employees are encouraged to use 20% of their time working on their own projects. Google News, Orkut are both examples of projects that grew from this working model.
This wasn’t a technical talk so no information regarding any infrastructure was presented however they did note that they have a mantra of aiming to give back each page with in 500ms, rendered.
Quote: Give Users What They Want When They Want It
Well, it’s happened again. Something completely and (almost) totally unexpected has come out from left field and hit me smack in the face. Similar to the “Didn’t See That One Coming” series from last May (and on), Out of Left Field deals with a completely different social group and a completely different issue.
This is my version of a Christmas Letter. I’ve had a rather interesting time thinking about what I want to put in this summary, mostly because my year starts and end around August 20th. So I have to adjust how I think about time. In any event, this is the month by month report of 2005:
I randomly stumbled1 onto a FREE (!) class teaching Intro to Printed Circuit Board (PCB) design. It may shock you to know that even as an Electrical Engineer I never learned how to make PCBs and it’s always been something I’ve wanted to do.
Astute readers may remember that I tried making a PCB several years ago, but it never worked2 and I abandoned it.
I can’t rave enough about the class, it’s been a wonderful experience, I learned a lot, made some new friends, and I look forward to taking some other class offerings through TeachMePCB.com!
The goal of the class was learn about PCB design (including designing footprints and symbols), design the PCB itself (including how to use hierarchical layouts), learn about design rule check (DRC) and design for manufacture (DFM), have the PCB fabricated, and then assemble the PCB.
Everyone in the course made a macro keyboard of some sort. The core “requirements” were:
Raspberry Pi Pico microcontroller
10 MX-style key switches
2 Rotary Encoders with RGB LEDs
VEML7700 Ambient Light Sensor (I2C)
NLSF595 LED Driver (SPI)
10 NeoPixel lights (1-wire)
Don’t make a rectangular PCB
I made a couple of changes:
Swapped PCA9745B for NLSF595
Added ePaper display (because why not make my first project harder)
I actually jumped the gun and started laying out my board in Week 3 because I thought this was the best way to figure out what items I needed for my Bill of Material (BOM). Creating the schematic this way was an — interesting — exercise, and it turned out I was over complicating what that weeks assignment was.
Note for example how I’ve repeated the NeoPixel LEDs ten times (grid ref: A1 to A5), as well as the pushbutton switches ten times (located just below the LEDs). As I would later learn, there’s no need to do that; just make the switch (or NeoPixel) once and then duplicate it (pointing the copy the same schematic so updates propagate correctly). Et voilà!
Once I stopped over complicating it, schematic layout was relatively simple for this particular board.
I think the hardest part was making sure I got the eInk circuit right3. The design seems to be a prototypical DC-DC Boost Converter and was the same circuit design used by both the manufacturer (Pervasive Displays) as well as Adafruit’s eInk Breakout Friend.
After I put together my schematics, I would discover (and have corrected in the latest design files) several mistakes
I initially had my pins reversed (Pin 1 was Pin 24, Pin 2 was 23, etc), fortunately I caught that before I had sent my PCB off to be fabricated.
I was less fortunate with the following issues, which I didn’t catch until after the PCB had been fabricated and I started assembly:
Not shown (and fixed via software):
S3001 (Bottom Rotary Encoder) Pin 01 (red LED) and Pin 04 (blue LED) are swapped, so they got mapped as BGR instead of RGB.
Flipped pin GPIO assignments on U2801:
Pin 15 should be labeled as GPIO11 and connect to J2901 Pin 09 (BUSY signal for eInk)
Pin 16 should be labeled as GPIO12 and connect to J2901 Pin 11 (Command/Data signal for eInk)
I also ended up removing the rotary encoders I had got from SparkFun (P/N COM-15141) and replacing them with Bourne P/N PEL12T-4225S-S1024 (which I got from Mouser, since they had them in stock) because the red LEDs weren’t really working (they were really, really dim) and the rotary function was very finicky.
Not so much error, per se, but after I printed my paper doll (a scaled 1:1 print) I switched to a different Flat Flexible Cable (FFC) connector so I would have a little more space to hand solder.
Coming up with a design was challenging and I went through several design ideas:
Several of my earlier designs had fewer keys and rotary encoder since I wasn’t sure I really had a use for a 10-key and two rotary encoders. But I eventually got to a design I liked and then expanded to be a 10-key with two encoders.
I also went from a guarded momentary switch to more of an e-stop button with deflector shroud. Originally I was trying to source once, but then realized I could probably just as easily design one and have it 3D printed—so I did that.
I designed the button assembly in FreeCAD and had it printed in nylon by JLCPCB. The files are up on Thingiverse so go grab it! I originally was going to paint it, but then realized I could let the NeoPixel shine through the nylon—and I didn’t have the paint I needed.
Getting the PCB outline from my head and into KiCAD was rather difficult process, in my opinion. I thought about using Inkscape, but I’m not super familiar with it and so I went with FreeCAD and ended up spending almost an entire day on it.
I was able to export my outline as a DXF and import it in to KiCAD and then lay everything out.
Layout was incredibly fun and it was hard to stop—there’s always something that can be tweaked. I did a two layer board. I probably spent way to much time adding fun little things. See if you can spot them all!
Most of the parts I used had footprints (either provided by the class, from the vendor, or through Ultralibrarian). I did have to make a couple footprints, such as for the Amphenol connector:
Going from the schematic to the layout might be a confusing, so I put together this graphic showing how the NeoPixel schematic and the switch schematic end up as looking on the laid-out PCB:
Also potentially confusing is that most of the time I’m working without the filled-in areas shown. In reality though, all the empty space is actually filled in as part of the ground plane.
The final design looks something like this:
One of the nice things about KiCAD is that is does a pretty decent render which I think is helpful for doing spacing checks on components
I order most of my component parts through DigiKey, but some from Mouser and SparkFun as well. All total, it was about $51.87+tax (in reality the total is a bit more because I bought some extras of certain components). I also had to make several orders because of course I forgot things.
The PCB was ordered from JLCPCB4. It’s amazing how inexpensive PCBs can be! I opted for Electroless nickel immersion gold (ENIG) plating because of aesthetics, so my board was $27.90 + S&H — and that includes 5 copies of the PCB (their minimum order). However, if I did the basic PCB manufacturing it would have been about $9.20 + S&H!
I also had JLCPCB print the e-stop button and deflector should since they could do it in nylon and it only cost $1/each + S&H.
Assembly was pretty straight forward, I printed out my BOM and started soldering. My approach was to solder in stages, doing the most difficult soldering first, and then do it by sub-system (starting with the NeoPixels) so I could do integration testing as I progressed.
While this was my first PCB design, this was not my first PCB assembly and I feel pretty comfortable with the soldering iron. The passive components are Surface Mount Device (SMD) size 2012 (0805 imperial), which means they 2.0 mm (not cm) long and 1.2mm wide. That is very tiny. Ideally I would use solder paste and a reflow oven, but I don’t have one…yet.
I had a flux pen, but I found getting some liquid flux was extremely helpful — especially with the PCA9745B IC and FPC connector, which have a lot of fine pitch legs. I spent a lot of time trying to get the FPC connector soldered without the liquid flux and it was a nightmare.
I also ended up getting a stereo inspection microscope (which has been on my wishlist for ages) and that was helpful in inspecting some of my solder joints for any bridging. Having a good and bright light source is key though.
Board Bring Up
Bringing up the board was pretty easy for the most part.
This was my first foray into CircuitPython and had I RTFM, I would have known that while “some of the CircuitPython compatible boards come with CircuitPython installed. Others [such as the Pico] are CircuitPython-ready, but need to have it installed.”
The two most challenging things were the eInk display and the PCA9745B LED driver (which I used for the RGB LEDs on the rotary encoders). The biggest issue: there was no CircuitPython module for either of those.
I ended up writing a module for both, which you can find on GitHub for now and hopefully PiPy in the future:
The PCA9745B was probably the easiest and least complex. I was also able to find a micropython library for the PCA9745B written by Mirko Vogt at Sensorberg GmbH that was helpful to validate some of my assumptions with.
The Pervasive Display eInk display was more challenging and involved a fair amount of integration hell. Between flip-flopped Busy and Command/Data lines, not having a RESET line (which I’m still not convinced I need), and using the wrong resistor on the current sense line for the DC-DC booster, I was never really sure if my problems were software or hardware or both.
The eInk display was a reach goal and I had to step away from it many times because of the often head-banging frustration.
I was eventually able to find an Arduino library from Pervasive Display, and so I was able to use that to verify if my hardware was correct — it wasn’t.
I actually ended up ordering their development breakout kit (which has all the hardware needed to run the board, including—crucially—the DC-DC booster, and another Pico so I do development with known-good hardware (best $20 spent).
Adafruit/CircuitPython (by way of micropython) has a displayio.EPaperDisplay class that I was able to extend, so I didn’t have to write much of the code from scratch.
One of the interesting things about the Pervasive Display eInk display I was using is that it’s part of their Spectra line which has a chip on glass (CoG) and internal timing circuitry instead of a separate controller (such as the IL0373 or SSD1608). In theory it’s easier to drive since you don’t have to deal with complicated look up tables (LUT), you just send it the bitmap data you want and it handles the rest.
I have an MSO-19, which is a USB oscilloscope and logic analyzer and that was incredibly helpful as well.
The code running on the keypad is CircuitPython, an open source version of Python for tiny, inexpensive computers called microcontrollers.
I may be new to CircuitPython, but not Python. So it’s a pretty natural fit for my programming.
As a learning exercise in making my own PCB this has been a resounding success for me and I can’t thank the TeachMePCB facilitators (Mark and Jesse) enough! I managed to get everything working (despite my several snafus) and I’m pretty pleased with it.
Adding the eInk was a good challenge and I’m glad I got it working.
I have lots of ideas for other things I’d like to make, so who knows what will show up next in a Show and Tell.
As a bonus, I also got to show off an almost completed version a couple weeks ago (26 January 2022) at Adafruit’s Show and Tell (I’m at the very end, start at 22m24s):
As we’ve been doing more video and audio conferencing lately, I’ve been experimenting with temporally hyper-near servers to see if it results in a better experience. TL;DR…not really for most purposes.
Temporally hyper-near servers differ from geographically near servers in that it doesn’t matter how close the server is physically in miles, just packet transit transfer time in milliseconds…basically low-latency.
AWS calls these Local Zones and they’re designed so that “you can easily run latency-sensitive portions of applications local to end-users and resources in a specific geography, delivering single-digit millisecond latency for use cases such as media & entertainment content creation, real-time gaming…”, but they only have them in the Los Angeles region for now.
Azure calls them Edge Zones, but they aren’t available yet.
Google doesn’t have a specific offering, but instead provides a list of facilities within each region you can choose from, though none of them are near Seattle.
I went back my notes when I was looking at deploying some servers that I knew would generally only be accessed from the Seattle area and I found that Vultr could be a good solution1.
With Vultr (in Seattle), I’m getting an average round-trip time (RTT) of 3.221ms (stddev 0.244 ms)2
Compare to AWS (US West 2), which was an average RTT of 10.820 ms (stddev 0.815ms)3
After doing some traceroutes and poking around various peering databases , I think that Vultr is based at the Cyxtera SEA2 datacenter in Seattle and shares interconnections with CenturyLink, Comcast, and AT&T (among others).
I setup a Jitsi server, but didn’t notice anything perceptibly different between using my server and a standard Jitsi public server (the nearest of which is on an AWS US West 2 instance).
However, for Jamulus (which is software that enables musicians to perform real-time jam sessions over the internet) there does appear to be huge difference and I’ve received several emails about the setup I have, so here goes:
Jamulus on Vultr
Deploy a new server on Vultr4, here’s the the configuration I used:
–serverinfo: update with your location as [name];[city];[[country as QLocale ID]];5
–welcomemessage: if you want one
#### Change this to set genre, location and other parameters.
#### See https://github.com/corrados/jamulus/wiki/Command-Line-Options ####
ExecStart=/usr/local/bin/Jamulus --server --nogui --recording /var/jamulus/recording/ --servername $(uname -n) --centralserver jamulusallgenres.fischvolk.de:22224 --serverinfo "NW WA;Seattle, WA;225" -g --welcomemessage "This is an experimental service and support is not guaranteed. Please contact email@example.com with questions" --licence
Give the unit file the correct permissions:
chmod 644 /etc/systemd/system/jamulus.service
Start and verify Jamulus:
systemctl start jamulus
systemctl status jamulus
You should get something like:
● jamulus.service - Jamulus-Server
Loaded: loaded (/etc/systemd/system/jamulus.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2020-07-08 10:57:09 PDT; 4s ago
Main PID: 14220 (Jamulus)
Tasks: 3 (limit: 1149)
└─14220 /usr/local/bin/Jamulus --server --nogui --recording /var/jamulus/recording/ --servername -n) --centralserver jamulusallgenres.fischvolk.de:22224 --serverinfo N
Jul 08 10:57:09 myserver.example.com jamulus: - central server: jamulusallgenres.fischvolk.de:22224
Jul 08 10:57:09 myserver.example.com jamulus: - server info: NW WA;Seattle, WA;225
Jul 08 10:57:09 myserver.example.com jamulus: - ping servers in slave server list
Jul 08 10:57:09 myserver.example.com jamulus: - welcome message: This is an experimental service and support is not guaranteed. Please contact firstname.lastname@example.org with questions
Jul 08 10:57:09 myserver.example.com jamulus: - licence required
Jul 08 10:57:09 myserver.example.com jamulus: *** Jamulus, Version 3.5.8git
Jul 08 10:57:09 myserver.example.com jamulus: *** Internet Jam Session Software
Jul 08 10:57:09 myserver.example.com jamulus: *** Released under the GNU General Public License (GPL)
Jul 08 10:57:09 myserver.example.com jamulus: Server Registration Status update: Registration requested
Jul 08 10:57:09 myserver.example.com jamulus: Server Registration Status update: Registered
And that’s it! Enjoy the server and let me know how it goes!
9 July 2020 Update:
If you update jamulus.service unit file then run this:
service jamulus restart
Also, thanks to Brian Pratt testing, feedback, catching a couple typos, and suggesting using the --fastupdate command line option paired with Vultr’s High Frequency Compute (instead of regular Compute) even better performance.
One of my professors said something yesterday that stuck with me. He said, “There are some people who say there are no stupid questions…we know this is patently untrue. However, the stupid question is not asked from ignorance on grounds of seeking understanding. The stupid question is that which is asked to make oneself seem intelligent.” We then made an informal agreement as a class to avoid such questions.
Asking questions is important; and I don’t think there should be shame or embarrassment in asking questions. If something is unclear, I think you have a duty to get understanding about it. This has been a hard thing for me to learn — and I’m still learning it. But I love asking questions and I try to make a lot of what I do about asking questions, there are very few better ways to learn.
One of the stories that has inspired me is Richard Feynman’s experience at Los Alamos. When I’m talking to young engineers, or really anybody, about asking questions, I like to recall this story. Feynman is overseeing some work at Los Alamos, helping design nuclear weapons and such:
I sat down and I told them all about neutrons, how they worked, da da, ta ta ta, there are too many neutrons together, you’ve got to keep the material apart, cadmium absorbs, and slow neutrons are more effective than fast neutrons, and yak yak — all of which was elementary stuff at Los Alamos, but they had never heard of any of it, so I appeared to be a tremendous genius to them.
The result was that they decided to set up little groups to make their own calculations to learn how to do it. They started to redesign plants, and the designers of the plants were there, the construction designers, and engineers, and chemical engineers for the new plant that was going to handle the separated material.
They told me to come back in a few months, so I came back when the engineers had finished the design of the plant. Now it was for me to look at the plant.
How do you look at a plant that isn’t built yet? I don’t know. Lieutenant Zumwalt, who was always coming around with me because I had to have an escort everywhere, takes me into this room where there are these two engineers and a loooooong table covered with a stack of blueprints representing the various floors of the proposed plant.
I took mechanical drawing when I was in school, but I am not good at reading blueprints. So they unroll the stack of blueprints and start to explain it to me, thinking I am a genius. Now, one of the things they had to avoid in the plant was accumulation. They had problems like when there’s an evaporator working, which is trying to accumulate the stuff, if the valve gets stuck or something like that and too much stuff accumulates, it’ll explode. So they explained to me that this plant is designed so that if any one valve gets stuck nothing will happen. It needs at least two valves everywhere.
Then they explain how it works. The carbon tetrachloride comes in here, the uranium nitrate from here comes in here, it goes up and down, it goes up through the floor, comes up through the pipes, coming up from the second floor, bluuuuurp — going through the stack of blueprints, down-up-down-up, talking very fast, explaining the very, very complicated chemical plant.
I’m completely dazed. Worse, I don’t know what the symbols on the blueprint mean! There is some kind of a thing that at first I think is a window. It’s a square with a little cross in the middle, all over the damn place. I think it’s a window, but no, it can’t be a window, because it isn’t always at the edge. I want to ask them what it is.
You must have been in a situation like this when you didn’t ask them right away. Right away it would have been OK. But now they’ve been talking a little bit too long. You hesitated too long. If you ask them now they’ll say, “What are you wasting my time all this time for?”
What am I going to do? I get an idea. Maybe it’s a valve. I take my finger and I put it down on one of the mysterious little crosses in the middle of one of the blueprints on page three, and I say, “What happens if this valve gets stuck?” — figuring they’re going to say, “That’s not a valve, sir, that’s a window.”
So one looks at the other and says, “Well, if that valve gets stuck –” and he goes up and down on the blueprint, up and down, the other guy goes up and down, back and forth, back and forth, and they both look at each other. They turn around to me and they open their mouths like astonished fish and say, “You’re absolutely right, sir.”
So they rolled up the blueprints and away they went and we walked out. And Mr. Zumwalt, who had been following me all the way through, said, “You’re a genius. I got the idea you were a genius when you went through the plant once and you could tell them about evaporator C-21 in building 90-207 the next morning,” he says, “but what you have just done is so fantastic I want to know how, how do you do that?”
I told him you try to find out whether it’s a valve or not.
Feynman clearly is wanting to know what that thing is! And so he asks, although in a definitively roundabout way. But he asks the question. And so should you.0