TableColumn and ObservableValue

Today I learned a couple of things that they don’t tell you in the official documentation or on Stack Overflow. If you want to display some information in a table and that information updates and you want to display those updates, then you have to hook things up the hard way, and not the way everyone tells you to do it.

Continue reading “TableColumn and ObservableValue”

More MIME Tricks

Several days and a lot of testing later, I think I have the answer: don’t try to build a play-by-email service in Google AppEngine. The limitations imposed by the environment make it a bad place to do a lot of email traffic that requires anything other than text/plain or text/html. Because Google has defined javax.mail.Transport to use the AppEngine mail service, you can’t choose to connect to a different SMTP host; if you specify an external SMTP server (such as SendGrid or Pobox) in the Session, Google’s Transport implementation ignores it and still uses the AppEngine mail service. When you try to use a web API to send your message through SendGrid, that screws up the MIME headers and your message won’t validate (if it’s even readable) at the receiver’s end.

That said, I have finally figured out how to prepare and send a PGP signed MIME message such that it arrives and validates properly. Since nobody else has written that down on the web (that I could find), I’ll detail the recipe here.

Continue reading “More MIME Tricks”

Stupid Email Tricks

I’ve been working on adding play-by-email support to my turn-based game server. The first problem I hit was that the PGP signatures on the server’s messages were invalid when I checked them on my email client. This led to lots of debugging and unit tests in my crypto utility. That’s not really wasted effort, but it also wasn’t the problem.

It turns out that even though the RFC limit on line length is 1000 characters and there are well-known implementation limits that are only slightly lower, there exists somewhere in the chain from Google AppEngine to Apple Mail some chunk of code that inserts newlines into lines that are much shorter. I didn’t do exhaustive testing, but it seems to happen before 80. The perfectly valid signatures were being rendered invalid because somebody was altering the message after the server signed it and handed it off to the transport agent.

The solution I chose was to use WordUtils from commons-text and to wrap the message at 70 characters before signing. This seems to work. It’s just kind of dumb that it’s necessary, but it’s a good reminder that the thing in your inbox may not actually be the thing sent to you by whomever, and that PGP signing your messages is a good idea even if you don’t encrypt them.

Why I Don’t Write Native Apps

Xcode sucks. That’s why.

Seriously.

This evening I thought, “Hmm, maybe for my next project I’ll see about writing an iOS client for my turn based game server.” So I started looking at a Swift tutorial (the language irritates me so far, but that’s just because so far all the syntactic sugar is solving problems I don’t actually have) and it didn’t seem too difficult. So then I went looking for a PGP library that would work with Swift, and I found one.

So then I cloned the project to my Mac and tried to build it. Build failed. Why? Well, it turns out that I needed to install a utility called xcpretty. No idea why, but that was easily solved. Then the build failed again. Why? Because some $@%! Ruby script wouldn’t execute. (Ruby? WTF? I thought this was an Objective C or maybe Swift compiler!) So then I had to get all comfortable looking for what Ruby wanted. Three scenes of Thor: Ragnarok later, I figured out to gem install xcodeproj and now the build goes a bit farther, but now I’ve got another cryptic error message about how the link failed because the linker couldn’t find the OpenPGP ObjectivePGP framework. The framework that the project is supposed to build.

You know what happens if I have a project open in IDEA and it’s missing a dependency? The missing dependency is underlined in red and the IDE will pop open a window where I could locate the missing thing. You know what happens in Eclipse, with the same situation? Same thing. MPW? Xcode? Nah. Apple’s developer tools reckon that it’s enough just to say, “Nah, that didn’t work.” User-hostile and user-abusive interface.

So.

Xcode sucks.

Sweet, It Works!

Last post I wrote about wanting to write a text-only Twitter client. So, now I’ve done that. It’s not 100% functional and there are still aspects of JavaFX UI that I’m wrestling with (getting buttons to line up the way I want seems to be way harder than it ought to be), but I reckon the application’s ready for people to try out. Currently I’m only building a MacOS installer, but if you’re interested and you want to give it a whirl, you can grab it at https://keybase.pub/sbeitzel/. I’m calling it “TwitterCrank”, since it’s sort of a Twitter client for cranky people (me). Things it does: read your feed, posts tweets, reply to tweets, retweet tweets. Things it doesn’t do (yet): handle direct messages. Things it doesn’t do (and won’t): display inline images, autoplay video, insert promoted tweets in your feed.

OAuth, twitter4j, and JavaFX

I’ve started developing a text-only client for Twitter. The impulse came from getting fed up with all the auto-playing promoted tweets that were clogging my timeline. I looked around and found a library to handle all the Twitter API calls and started coding. The example code was all a bit bare-bones, but mostly it was straightforward. The one thing so far that I think could use a bit more explanation is the login process, and that’s the point of this post.Continue reading “OAuth, twitter4j, and JavaFX”

Once Again, Most Documentation Sucks

I have been having fun, recently, programming a couple of services that run in Google’s App Engine. One thing they do is maintain some data in that cloud’s version of a database, so one of the important aspects of the services is controlling just who, exactly, is allowed to see or modify the data. I’ve actually got a solution in place that means it all works just fine for me.

Continue reading “Once Again, Most Documentation Sucks”

Buncha Thoughts at Evening

  1. I’m a jerk.
  2. Dogs are awesome, and also jerks.
  3. Siri is useless for my life.

It’s creature dinner time, so I’m getting out the dishes and the food and starting to portion out everybody’s share. Some of the creatures are old and sedentary, some are young and boisterous, and not all are of the same species. Thus, portions are specifically assigned. And what am I thinking as I do this? That’s right: “Okay, who’s ready for dinner? Are all of my dogs who are good dogs going to get a dinner? Yes, yes they are!”

Continue reading “Buncha Thoughts at Evening”

Credit Where Credit Is Due

It seems to me that I’ve been seeing lots and lots of social media posts which assert that [artist | intellectual] predicted [dystopian future that looks just like one aspect of today’s world] and did it [years ago]. I have to wonder what that’s in aid of. I mean, the second half of the 20th century was all about living with the constant threat of nuclear annihilation or environmental collapse, to say nothing of national existential threats (as the US and the USSR engaged in worldwide political destabilization and regime change) and obvious corporate misandry. The stories of my youth in the 70s and 80s were all dystopian nightmares of one kind or another, each one based on the reductio ad absurdum of some then-current phenomenon.

Continue reading “Credit Where Credit Is Due”

Why Crypto?

I know a few people who are concerned about their online privacy, but who don’t have a good handle on what to do about it. There is always some story about some company leaking private data, or some government spying on people, or some “hackers” stealing information for nefarious purposes. So people are worried, but the defensive measures they might take aren’t always clear or easy to understand, let alone implement. I thought I’d write some easier to understand instructions and analysis for my less technically inclined friends.Continue reading “Why Crypto?”