justin․searls․co

I'm genuinely excited about this site's rewrite. I thought it'd be fun to make a video to explain my thought process about the redesign—both why I'm excited about finally publishing a linklog/linkblog/microblog and how all these various tools plug together to enable a (mostly) painless continuous deployment pipeline.

I hope you enjoy it!

There's something new coming in Ruby 3.2 this Christmas that I can't wait to start using in all my projects:

Ruby 3.1 [sic] adds a new core class called Data to represent simple immutable value objects. The Data class helps define simple classes for value-alike objects that can be extended with custom methods.

While the Data class is not meant to be used directly, it can be used as a base class for creating custom value objects. The Data class is similar to Struct, but the key difference being that it is immutable.

It'd be easy to look at this and conclude that this is just the same Struct we've been using for decades, with the added constraint that it's immutable. On the other hand, that's a pretty important constraint!

But if you read the pull request, there are some serious quality of life improvements over Struct, like built-in translation of positional arguments to keyword arguments, which allows for easy-to-define default values:

Measure = Data.define(:amount, :unit)

Measure.new(1, 'km') # => OK
Measure.new(amount: 1, unit: 'km') # => OK

Measure = Data.define(:amount, :unit) do
  def initialize(amount: 0, unit: 'cm')
    super
  end

  # imagine other elucidative methods here
  def metric?
    # …
  end
end

This is great news for people who go out of their way to separate their code into two categories: units that implement feature logic and things that represent values. The units implementing application behavior have no state and the values they receive and return are nothing but state. Adopting this approach rigorously transformed my programming practice, allowing for clearer thinking and making progress more predictable.

It's exciting to see Ruby core continue to make consistent iterative progress year after year!

I've been a VR gaming enthusiast for years (having owned the Rift DK1, the HTC Vive and Vive Pro, and the Valve Index before settling on a Quest 2), so I preordered the Meta Quest Pro to see what all the fuss was about.

The Quest Pro's resolution is 1800 x 1920 pixels per eye, roughly the same as the Quest 2's 1832 x 1920 pixels. In theory, it provides better contrast and a very slightly higher pixel density per eye, but comparing both devices head-to-head, I was hard-pressed to tell the difference. It's still grainy enough that images look all right, but small text is fuzzy.

I, for one, decided to return this thing within 5 minutes of unboxing it.

The $1500 Quest Pro makes trade-offs that add up to a significantly worse headset than its (until recently) $299 predecessor. The Pro's pancake lenses improve the field-of-view slightly, but they also magnify each pixel more, reducing the sharpness of the image. Placing the battery on the back helps balance the Pro's weight distribution, but it also forecloses the possibility of 3rd-party straps—which matters, because the Pro is much less comfortable than my Quest 2 with this excellent $35 strap. The Pro's open design (it barely obstructs the user's peripheral vision) makes it a statement piece that VR doesn't have to be antisocial, but its "wings" let in so much ambient light that it makes most games instantly nausea-inducing.

Do not buy the Meta Quest Pro.

Worlds and Workrooms are available for the Quest 2 and Quest Pro alike, but Workrooms is particularly aimed at Pro users. And—there's just no nice way to put it—it's one of the worst apps I've ever used.

This is what really kills me about this product, though. The hardware is pitched as one's entry point to "the metaverse", but there is no metaverse! Just a couple broken apps. They're so bad that management can't even force the programmers making the apps to try using them.

Superficially, sure, Horizon Worlds is a worse version of RecRoom and Horizon Workrooms is a much worse version of BigScreen VR. On a deeper level, though, this failure is emblematic of what large companies often get wrong when they undertake greenfield software projects. They dream big, staff big, and then start building.

Ready. Fire. Aim.

One way I think about this is that almost every stimuli that a very small team building a very small thing encounters amounts to direct product feedback in some form or another. Even if the team members themselves are the only users, the feedback loop couldn't be tighter. Change a thing. Try it out. Repeat.

The larger a human organization surrounding a product grows—especially when it outpaces the maturation of the product—the less attention will be paid to the product itself. That attention will instead be diverted to the superlinearly-growing needs of all the humans (logistics, consensus-building, rework) and the affordances they demand of the product to accommodate so many people (modularized design patterns, internal tooling, service orchestration).

Big teams don't result in successful products, but successful products sometimes result in big teams.

Connecting a gaming PC to Apple Studio Display

…You're right, it shouldn't be this hard

I'll never forget when I bought the first 5K Retina iMac. Almost as soon as I ripped it out of the box, I booted it while holding down Command-F2, assuming it would support Target Display Mode, with the intention of using its one-of-a-kind display with my gaming PC. I was heartbroken when Mac OS X booted anyway and I slowly realized that Target Display Mode hadn't survived the transition to retina resolutions. And it never came back, either. (I haven't really been happy with my setup ever since.)

Well, here we are, 8 years later and Apple has introduced the 5K Studio Display. I ordered one the minute that they hit the store in the hope I would receive what I thought I had purchased in 2014: a single 5K Apple display that could drive both a Mac and a PC desktop. (Nevermind the fact that it's damn near the exact same panel that I bought 8 years ago.) When my Studio Display arrived, I tore it out of its environmentally-friendly origami box and excitedly plugged it into one of my Nvidia RTX 3090's DisplayPorts with a DisplayPort-to-USB-C cable.

I booted up the PC: nothing happened.

What happens next will shock you…

Tabelogged: 清水 HANARE

I visited this restaurant on July 28, 2020, and gave it a 3.3 on Tabelog.

Name: 清水 HANARE
Description: 新橋、汐留、内幸町/もつ焼き、もつ鍋、居酒屋

Which Google translates into English as:

Name: Shimizu Hanare
Description: Shinbashi, Shiodome, Uchisaiwaicho/Motsuyaki, Motsunabe, Izakaya

Tabelogged: Bar K6

I visited this restaurant on July 4, 2020, and gave it a 3.7 on Tabelog.

Name: Bar K6
Description: 京都市役所前、三条、三条京阪/バー、ダイニングバー

Which Google translates into English as:

Name: Bar K6
Description: Kyoto City Hall, Sanjo, Sanjo Keihan/Bar, Dining Bar

Tabelogged: 心斎橋かわぐち

I visited this restaurant on June 28, 2020, and gave it a 4.0 on Tabelog.

Name: 心斎橋かわぐち
Description: 心斎橋、長堀橋、四ツ橋/焼き鳥、鳥料理、創作料理

Which Google translates into English as:

Name: Shinsaibashi Kawaguchi
Description: Shinsaibashi, Nagahoribashi, Yotsubashi/Yakitori, chicken dishes, creative cuisine

Tabelogged: まるや本店 名駅店

I visited this restaurant on June 21, 2020, and gave it a 4.0 on Tabelog.

Name: まるや本店 名駅店
Description: 名鉄名古屋、近鉄名古屋、名古屋/うなぎ、郷土料理

Which Google translates into English as:

Name: Maruya Main Store Meieki Store
Description: Meitetsu Nagoya, Kintetsu Nagoya, Nagoya/Eel, local cuisine

Tabelogged: Kreis

I visited this restaurant on June 21, 2020, and gave it a 4.4 on Tabelog.

Name: Kreis
Description: 伏見、丸の内、国際センター/バー

Which Google translates into English as:

Name: Kreis
Description: Fushimi, Marunouchi, International Center/Bar

Tabelogged: 世界の山ちゃん 名鉄メンズ館テイクアウト専門店

I visited this restaurant on June 20, 2020, and gave it a 3.1 on Tabelog.

Name: 世界の山ちゃん 名鉄メンズ館テイクアウト専門店
Description: 近鉄名古屋、名鉄名古屋、名古屋/郷土料理、鳥料理、串揚げ

Which Google translates into English as:

Name: Yamachan Of The World Meitetsu Men's Building Takeout Specialty Store
Description: Kintetsu Nagoya, Meitetsu Nagoya, Nagoya/local cuisine, chicken dishes, skewers