Fazal Majid's low-intensity blog

Sporadic pontification

Fazal Fazal

Virtual Reality for the people

I have been shooting stitched panoramas for almost 20 years. I have used manual panorama heads like the Kaidan Kiwi+ and more recently the pocketPANO Compact, robotic heads like the Gigapan EPIC 100 and the Benro Polaris, and four successive generations of the Ricoh Theta (Theta, Theta S, Theta V, Theta Z1).

Setting up and iterating a manual head is incredibly tedious. The Gigapan makes it less so, specially when using long lenses (my standard setup is a Leica M typ 240 or M10 with a 90mm f/2 Apo-Summicron-M ASPH). The Theta series was a major breakthrough in that it could produce nearly seamless 360° panoramas with no motion artifacts or ghosting. The Z1 with its large 1″ sensor finally yields image quality that I am happy with.

The viewing situation has also improved. In the early days you needed Java applets or dubious plug-ins. Nowadays, it can all be done in HTML5 with the aid of JavaScript libraries like Panellum. The user experience is still one of scrolling an image through a rectangular viewport in browser window. The experience on mobile is a bit better because it can use the accelerometer so you scroll by panning with your phone or tablet. It’s still not a fully immersive experience.

This Friday Facebook announced a price drop for its Oculus Go VR headset, the entry-level 32GB model being at a near-impulse purchase price of $150, and of course I yielded to the impulse. I had bought the original Oculus Rift to get a sense of what the potential of VR was, but tethered to a beefy PC, it made for impressive demos but not much more.

The Oculus Go changes this completely because it is standalone (it has the guts of a midrange smartphone circa 2018) and affordable. One of the ways they kept costs down is by removing motion tracking: it can detect angular motions of your head, but not when you are walking around, but for purposes of viewing 360° panoramic stills and videos, that is not required.

One of my concerns was how deeply it would be tied to the Facebook privacy-mangling machine. My New Year’s resolution for 2019 was to delete my FB account (my 2020 resolution was to switch all my digital camera clocks to UTC and never again bother with the abomination that is Daylight Saving Time)—underpromise and overdeliver, that’s my motto… Any requirement to have a FB account would be a total deal-breaker for me.

The second concern was how much of a hassle it would be to set up and use with my own photos. Camera-makers are not known for outstanding software and Ricoh is no exception. There is an Oculus third-party app for Theta cameras, but it hasn’t been updated in ages and only lists Theta S compatibility.

I was pleasantly surprised at how smoothly it went. You can avoid the FB account by using an Oculus account (I used mine from the Rift), and no additional apps are required. Just install the Android File Transfer utility if you are on a Mac, copy the files to the headset’s Pictures directory. I would recommend using subfolders because the built-in Gallery app is not smart about caching thumbnails and is very slow at regenerating the view if there are more than about 20 images or so in a folder.

The image quality is not exceptional. Mike Abrash, who worked on the ground-breaking 3D game Quake, and is now Chief Scientist at Oculus, says fully immersive VR requires resolution halfway between 4K and 8K in each eye (vs. 2.5K shared for both eyes on the Go), and is at least a decade away. The immersive nature of the Go does provide that elusive Wow! factor, however, and more than makes up for its designed-to-a-budget shortcomings. The 2560×1440 display with an apparent field of view of 100° yields 3.7MP in the FOV but spherical trigonometry calculations reveal the entire 360° sphere would require a 26MP image to cover it entirely, which is slightly more than the 23MP images the Theta Z1 delivers. Fully immersive VR requires very high resolutions!

It even handles video transparently (you do have to convert Theta videos from the native format to equirectangular projection video with Ricoh’s app, which is excruciatingly slow). Keep in mind that video sizes are large, and with a 32GB model, there are limits to how much you can store on the device. If you plan to view immersive videos, the 64GB model is highly recommended.

The Oculus Go also has a “Cast” feature that will stream what the person wearing the headset is seeing to the phone it is paired with. You can have a friend wear the headset and narrate what they are seeing, I tried this with my architect mother-in-law as I was showing her the sights in Jerusalem, much to her delight (her master’s thesis at SOAS was on the Dome of the Rock). The Go has a unique sound projector developed by Oculus that means the user doesn’t have to wear earbuds, and can hear you speak. I would recommend you change the default display sleep time from the ridiculously short 15 seconds to 3 to 5 minutes, so you can swap the headset without losing the cast session or resetting the app. Sadly, the battery life is nothing to write home about. I would guesstimate it at 1 to 2 hours, tops.

I still need to figure how to share my 360° VR photos using WebVR so other people can view them from their own Oculus Go (or other headsets).

One essential accessory for the Z1 or another similar 360° camera is a selfie stick or similar implement, otherwise your hands will appear prominently in the final panorama. Ricoh sells three models.

The TM-1 is a very well designed tripod (rumored to be made by Velbon) with a magnetic quick-release mount. It’s easy to deploy with one click, unlike a conventional tripod, and fully extended the camera is at eye height for a natural perspective.

The TM-3 is a short telescopic stick. It’s long enough that your hands no longer appear in the picture but low-profile enoough that the TM-3 itself is invisible. It is well-made, unlike most generic Chinese selfie sticks, unlocks and locks with a simple twist, and the TS-2 case for the Z1 has an opening at the bottom so you don’t need to detach it before putting the camera back in its case, a nice touch.

The TM-2 is a longer version of the TM-3 with an unnecessary swivel head, I haven’t tried it but the swivel head would defeat the invisible factor.

The battle of the Tech Dopp kits

Most travelers pack toiletry bags, known in the US as Dopp kits, to organize their toiletries and prevent them from leaking into their luggage. We need much the same to hold the vast assortment of chargers, cables, dongles and other technological paraphernalia required to function in this day and age.

Sadly, the state of quality design in tech dopp kits is sorely lacking at the moment. Many are overbuilt with heavy and stiff fabric that is unnecessary for a bag that will live inside another bag. Furthermore, too often there are many pockets that are just too small to hold anything, but contribute bulk and weight, and reduce the usable space. Things like loops to hold cables are not alternated so cables don’t jam together because it is easier to just bartack a single strip of elastic material in a row. In a wallet-style split organizer, no attention is paid as to how items on either side will mesh together when the organizer is zipped shut.

My daily loadout includes:

  • 13″ M1 MacBook Air 12″ MacBook (2015 model)
  • 63W Anker PowerPort III Slim charger (2x USB-C 2x USB-A) 29W Apple USB-C
  • 1m and 2m Apple USB-C charging cable (the third version is the one you want)
  • USB-A to Lightning cable. I can’t wait for the death of Lightning along with micro-USB and other legacy connectors
  • 10,000mAh Nitecore NB10000 battery pack 10,000 mAh Xiaomi with a whip-style USB-A to Lightning/USB-C/micro USB universal charging cable
  • Etymotic ER-4SR reference-grade in-ear monitors. More effective than active noise-canceling headphones and amazing sound quality. Some people find the earplug-like experience uncomfortable, however.
  • Ricoh GRIIIx and/or GRIII pocket cameras (large APS-C sensor and outstanding lenses in a tiny package)

When traveling I add:

  • Apple USB Type-C Digital AV Multiport Adapter (the latest version with 4Kp60 and HDR support)
  • Onkyo DP-X1 high-resolution audio player
  • 4-port Anker USB charger
  • a few proper TB3 or USB4 rated USB C-C cables, 0.3m
  • Apple’s 1m thin USB-C charge cables
  • 2 USB-A to Lightning cables (one for my iPhone, one for my wife). The USB-A connectors add a surprising amount of bulk, I wish Anker would make a charger with some sort of built-in octopus cable and cable management.
  • 1 USB-A to micro-USB cable
  • 20,000 mAh Mophie Powerstation XXL USB-C Power Delivery battery pack (can be used to charge the MacBook or iPad Pro or expand their battery life). Much lighter and convenient than the Anker 26,800 mAh boat anchor it replaced.
  • Ricoh Theta Z1 360° panoramic camera and TM-3 stick
  • Novoflex Mikrostativ mini-tripod
  • spare batteries for whatever camera I packed
  • Watson travel camera battery charger and whatever interchangeable battery plates are needed. Fortunately my newer cameras (Ricoh GRIII and GRIIIx, Nikon Z7, Leica M11) can all be charged using USB-C so more often than not I just skip this.
  • Samsung T3 256GB USB-C SSD
  • SanDisk Extreme 4TB USB-C SSD
  • a 18650 flashlight (BLF FW3A or Zebralight SC600FcIV+) and Olight USB-powered 18650 battery charger

Rofmia Shift Utility Pouch

Extremely expensive but the perfect size and ultra-light thanks to Dyneema, and avoiding unnecessary material, unlike most pouches that are overbuilt.

I keep the Anker 4-port charger, Apple AV multiport adapter, cables and one short IEC C7 (figure 8) to obnoxiously oversized British BS1363 plug cable.

Lihit Labs Compact Pen Case

A very small zippered case available in a pleasant yellow-green colorway. I keep a 256GB Samsung T3 and 4TB SanDisk Extreme USB SSD along with fast USB-C cables and an USB-C Ethernet adapter. They have larger sizes as well, but those are designed primarily for pens.

Eagle Creek Etools Organizer Pro

Unfortunately discontinued, and the replacement bearing the same name is twice as large. This bag is A5 sized, it can hold a 10.5″ iPad Pro. The fabric is thin and pliant, and the gusseted pockets large but thin. This is a much better option for me as I can put larger but flat items like battery packs, calculators, music players and so on. If it were ever slightly larger, it would also be a great bag to carry necessities on a flight so you don’t have to rummage for them in the overhead bin.

Limitless Equipment EDC-XS

Limitless Equipment make these very nice military EDC XS utility pouches in the UK. They are perfect to hold a charger, cables, pens and other paraphernalia. It’s probably a bit overbuilt for in-bag use, though, so you are paying a penalty in weight and bulk as well as for the MOLLE. They also have a larger version I turned into a portable toolbox.

In the US you can get similar stuff from Maxpedition or Skinth.

Waterfield Designs Air Caddy

This is what I use for in-flight use or on Eurostar. Holds my iPad Pro, DP-X1 music player, Etymotic earbuds, eye mask for a good night’s sleep, pen, chocolate bar and other travel necessities yet still fits in the tiny seat-back compartment. I used to have their Tech Folio but it is overbuilt for this use case.

Great Useful Stuff TechAway Travel Roll

Designed in the San Francisco Bay Area and very good value for the build quality. Mine has a different kind of fastener, not the AustriAlpin Cobra buckles shown on the product page, but still high-quality metal hardware (and probably lighter to boot). The simple triptych folding design with 2-1-1 compartments doesn’t provide a lot of organization but it is versatile.

DSPTCH Cable case

A well-thought cable organizer, if a bit on the large side. It’s what I pack in my carry-on for extended trips.

Incase Nylon accessory organizer

This organizer is recommended by The Wirecutter in their 2019 roundup. The fabric is thin and more flexible than overengineered ones in Cordura or ballistic nylon, which helps keep bulk down and increases the pockets' carrying capacity. The assortment of pockets is very well designed, at least for my needs, and it’s near ideal for a flight (it won’t hold an iPad, though).

Incase City Accessory Pouch

A simple, lightweight and inexpensive pouch with decent capacity for the size, thanks to a lack of excess internal organization. Sadly seems to be discontinued.

Muji hanging toiletry kit

I used this around 2008 when I got the first-generation MacBook Air, to hold its charger and the Sanho Hyperdrive, an early battery pack that had a MagSafe connector until Apple sicced their lawyers at them. It has room for the two and the video dongles, not much else.

Capra Leather Small Gear Pouch

An elegant A5 sized organizer with good depth. Very good leather and high craftsmanship (saddle-stitched). I got it in green with leather rather than linen lining for durability and with the optional handle. I don’t use it much, however, as it is larger than I need.

Waterfield Design gear pouches

Waterfield Designs was one of the first companies to make iPod cases, and they later added a larger pouch to accommodate an iPod and a bunch of other accessories. They have padded neoprene pockets and are very well made, but the padding adds a tremenoud amount of bulks, and they are also quite large.

Unfortunately they seem to have discontinued these pouches and replaced them with new ones in waxed canvas and leather that might arguably look a little better, but are less practical.

Bond Travel Gear Lochby EDC organizer Escapade gear pouch

On paper this is an interesting option. Unfortunately it is quite stiff, which makes it hard to pack, and overengineered with too many small pockets that reduce the effective carrying capacity because there is too much stitching, webbing, zippers, padding and other organizational overhead for the actual contents.

Triple Aught Design OP10

This tacticool pouch replete with mil-spec MOLLE attachments is better designed than the Bond, but still too small and with too many pockets and loops to maximize utility. It’s best used for those who want to carry an assortment of long thin objects like knives, tools, flashlights or cables. I would guesstimate the number of mall ninjas to operators owning this pouch is 10:1.

Peak Design Tech Pouch

This pouch has an interesting accordion design with alternating compartments that solves the problem of thick items like chargers bunching together and causing a pouch to bulge. Unfortunately it is so grotesquely large it can only reasonably be used inside checked luggage.

Aer Slim Pouch

Relatively light for Aer and not over-organized. I just haven’t found a place for it in my packing routine.

Aer Cable Kit 2

Poor design. Very bulky, stiff, one half doesn’t open fully and is hard to pack.

Native Union Stow Organizer

Relatively light for its bulk. Clearly meant to carry two laptop chargers and accessories. Fairly stiff.

Eagle Creek Pack-It Reveal E-tools Organizer Mini

Eagle Creek was acquired and rebooted after initially being slated to be shut down by VF Corporation. Some of their lines are gone, like the excellent Pack-It Specter line made of silnylon or their amazing No Matter What packable duffels. The Reveal line is not as good. This organizer is very light. Unfortunately excess padding means the usable capacity is not great, if they ditched it it would be an outstanding pick.

Eagle Creek Pack-It Reveal Org Convertible Pack

An intriguing concept: an organizer that can turn into a packable backpack. The organizer bit is actually the organizer of the pack turned inside out in packed mode. Capacity as an organizer is limited, but it is a decent packable backpack, doesn’t look as crumpled as most.

Conclusions

The old Eagle Creek E-tools Organizer Pro is the best option. It doesn’t add too much weight and maximizes carrying capacity to space. No one has yet solved the problem of organizing cables so they don’t devolve into a Gordian knot, however.

My top 100 things to eat in San Francisco

Incomplete,never finished, and probably completely out of date after the aftermath of coronavirus. Check out my foodie map instead (although most likely just as out of date).

  1. The caramelized onion and sesame baguette at Noe Valley Bakery
  2. The chocolate-cherry breakfast bread at Noe Valley Bakery
  3. The combination seafood salad at Swan’s Oyster Bar
  4. The clam chowder at Ferry Plaza Seafood
  5. The mushroom pizza at Delarosa
  6. The salted caramel ice cream at Bi-Rite Creamery
  7. The “crunchy sticks” (sesame-poppyseed-cheese twists) at Esther’s German Bakery (available at Rainbow Grocery and on Thursdays at the Crocker Galleria)
  8. The El Rey chocolate toffee semifreddo at Bix (seasonal)
  9. The pistachio macaroons at Boulette’s Larder
  10. The burnt caramel and chocolate covered hazelnuts at Michael Recchiuti
  11. The chocolate feuilletine cake at Miette
  12. The belly buster burger at Mo’s Grille
  13. The hazelnut hot chocolate at Christopher Elbow
  14. The princess cake at Schubert’s Bakery
  15. The ricciarellis (soft bitter-almond macaroons) at Arizmendi
  16. The Charlemagne chocolate feuilletine cake and chocolate chip financiers at Charles Chocolates, when they have them
  17. The chocolate hazelnut tarts at Tartine
  18. The croissant at Tartine
  19. The caramelized hazelnut financier at Craftsman and Wolves
  20. The bordeaux cherry ice cream at Swensen’s, in a cone and dipped in chocolate (the ice cream itself, not the cone)
  21. The flatbread at Universal Café
  22. The Umami truffle burger
  23. Captain Mike’s smoked tuna (Ferry Plaza farmer’s market)
  24. The mushroom empañadas at El Porteño
  25. The Tcho chocolate liquid nitrogen ice cream at Smitten
  26. The macarons at Chantal Guillon
  27. Pine nut Bacetti (Howard & 9th)
  28. The Atomica pizza at Gialina’s
  29. The salted hazelnut and chocolate shortbread at Batter Bakery
  30. The chocolate velvet cupcake at Kara’s Cupcakes
  31. The lobster roll at Woodhouse Fish Co.
  32. The gianduja and pistachio at Coletta Gelato
  33. The croissants and pains au chocolat at Arsicault (Arguello & Clement)
  34. The lasagna served bubbling hot from the oven at Pazzia
  35. The wild mushroom benedict at Mission Beach Café
  36. The farm egg ravioli at Cotogna
  37. The cioppino (spicy tomato-fish stew) at The Tadich Grill
  38. The sada (plain) dosa at Dosa Fillmore
  39. The French and Fries burger at Roam Artisan Burgers
  40. The lasagna at Trattoria di Vittorio
  41. The oyster fish & chips at Pacific Catch
  42. The croissants and kouingn amann at B Pâtisserie
  43. The Gianduja (chocolate hazelnut mousse) cake at Café Madeleine
  44. The funghi misti (wild mushroom) pizza at Beretta
  45. The pistachio ice-cream at Marco Polo
  46. The crab cioppino at Sotto Mare
  47. The foccacia at Liguria Bakery
  48. The almond cookies at Victoria Pastry Co.
  49. The Grandma Mary’s pizza at Slice House
  50. Pretty much everything at Hook Fish Co.
  51. Hand-made pasta at A Mano
  52. Hand-made pasta at Barzotto, specially the pappardelle with braised beef ragu if they have it
  53. The Belgian fries with dips, served in a cone, at Frjtz
  54. The daily ice cream flavors at Mr & Mrs. Miscellaneous
  55. The deli sandwiches at Cheese Plus
  56. The deli sandwiches at Blue Fog Market
  57. The deli sandwiches at Canyon Market
  58. The deli sandwiches at Le Beau Mob Hill
  59. The deli sandwiches at The Sentinel
  60. Brunch at Petit Crenn
  61. The sandwiches at B To Go, offshoot of B Pâtisserie
  62. The sandwiches at Rhea’s, on Valencia
  63. The quiches and pot pies at Café Madeleine
  64. The ice cream at Humphry Slocombe

Migrating to Hugo

I have been meaning to move away from Wordpress to a static site generator for a very long time, due to:

  • The slowness of WP, since every page request makes multiple database calls due to the spaghetti code nature of WP and its plugin architecture. Caching can help somewhat, but it has brittle edge cases.
  • Its record of security holes. I mitigated this somewhat by isolating PHP as much as possible.
  • It is almost impossible to follow front-end optimization best-practices like minimizing the number of CSS and JS files because each WP plugin has its own

My original plan was to go with Acrylamid, but about a year ago I started experimenting with Hugo. Hugo is blazing fast because it is implemented in Go rather than a slow language like Python or Ruby, and this is game-changing. Nonetheless, it took me over a year to migrate. This post is about the issues I encountered and the workflow I adopted to make it work.

Wordpress content migration

There is a migration tool, but it is far from perfect despite the author’s best efforts, mostly because of the baroque nature of Wordpress itself when combined with plugins and an old site that used several generations of image gallery technology.

Unfortunately, that required rewriting many posts, specially those with photos or embedded code.

Photo galleries

Hugo does not (yet) support image galleries natively. I started looking at the HugoPhotoSwipe project, but got frustrated by bugs in its home-grown YAML parser that broke round-trip editing, and made it very difficult to get galleries with text before and after the gallery proper. The Python-based smartcrop for thumbnails is also excruciatingly slow.

I wrote hugopix to address this. It uses a simpler one-way index file generation method, and the much faster Go smartcrop implementation by Artyom Pervukhin.

Broken asset references

Posts with photo galleries were particularly broken, due to WP’s insistence on replacing photos with links to image pages. I wrote a tool to help me find broken images and other assets, and organize them in a more rational way (e.g. not have PDFs or source code samples be put in static/images).

It also has a mode to identify unused assets, e.g. 1.5GB of images that no longer belong in the hugo tree as their galleries are moving elsewhere.

Password-protected galleries

I used to have galleries of family events on my site, until an incident where some Dutch forum started linking to one of my cousin’s wedding photos and making fun of her. At that point I put a pointed error message for that referrer and controlled access using WP’s protected feature. That said, private family photos do not belong on a public blog and I have other dedicated password-protected galleries with Lightroom integration that make more sense for that use case, so I just removed them from the blog, shaving off 1.5GB of disk in the bargain.

There are systems that can provide search without any server component, e.g. the JavaScript-based search in Sphinx, and I looked at some of the options referenced by the Hugo documentation like the Bleve-based hugoidx but the poor documentation gave me pause, and I’d rather not run Node.js on my server as needed by hugo-lunr.

Having recently implemented full-text search in Temboz using SQLite’s FTS5 extension, I felt more comfortable building my own search server in Go. Because Hugo and fts5index share the same Go template language, this makes a seamless integration in the site’s navigation and page structure easy.

Theme

There is no avoiding this, moving to a new blogging system requires a rewrite of a new theme if you do not want to go with a canned theme. Fortunately, Hugo’s theme system is sane, unlike Wordpress’, because it does not have to rely on callbacks and hooks as much as with WP plugins.

One pet peeve of mine is when sites change platform with new GUIDs or permalinks in the RSS feeds, causing a flood of old-new articles to appear in my feed reader. Since I believe in showing respect to my readers, I had to avoid this at all costs, and also put in place redirects as needed to avoid 404s for the few pages that did change permalinks (mostly image galleries).

Doing so required copying the embedded RSS template and changing:

<guid>{{ .Permalink }}</guid>

to:

<guid isPermaLink="false">{{ .Params.rss_guid | default .Permalink }}</guid>

The next step was to add rss_guid to the front matter of the last 10 articles in my legacy RSS feed.

How big can a panorama get?

I use the Kolor AutoPano Giga panorama-stitching software, recently acquired by GoPro, but I have yet to produce a gigapixel panorama like those they pioneered. This brings up an interesting question: given a camera and lens, what would the pixel size of the largest 360° stitched panorama be?

Wikipedia to the rescue: using the formula for the solid angle of a pyramid, the full panorama size of a camera with m megapixels on a sensor of a x b using a focal length of f would be:

m * π / arctan(ab / 2f / sqrt(4f2 + a2 + b2))

For single-strip panoramas of height h (usually a or b), the formula would be:

m * π * h / 2f / arctan(ab / 2f / sqrt(4f2 + a2 + b2))

(this applies only to rectilinear lenses, not fisheyes or other exotics).

Here is a little JavaScript calculator to apply the formula (defaults are for the Sony RX1RII, the highest resolution camera I own):

MP
mm actual 35mm equivalent

MP
MP
MP

The only way I can break through the gigapixel barrier with a prime lens is using my 24MP APS-C Fuji X-T2 with a 90mm lens.

Update (2020-01-21):

Now I could reach 171 gigapixels with my Nikon Z7 and the Nikkor 500mm f/5.6 PF.

Update (2021-01-30):

There was an error in the JavaScript that implements the calculator, it used 4f instead of 4f2, and for telephoto focal lengths, the difference is dramatic. Thanks to users ZS360 and GerladDXB at DPReview for pointing out my error.