-
The best, underutilized and poorly implemented accessibility feature
[Update - October 21, 2015: It looks like the issues with News have been fixed with the iOS 9.1 update. Yeah!]
iOS 7 brought a feature called dynamic type which moves away from developers specifying exact point sizes for text and instead uses a number of descriptions for fonts.
From UIFontDescriptor.h:
// Font text styles, semantic descriptions of the intended use for a font returned by +[UIFont preferredFontForTextStyle:] UIKIT_EXTERN NSString *const UIFontTextStyleTitle1 NS_AVAILABLE_IOS(9_0); UIKIT_EXTERN NSString *const UIFontTextStyleTitle2 NS_AVAILABLE_IOS(9_0); UIKIT_EXTERN NSString *const UIFontTextStyleTitle3 NS_AVAILABLE_IOS(9_0); UIKIT_EXTERN NSString *const UIFontTextStyleHeadline NS_AVAILABLE_IOS(7_0); UIKIT_EXTERN NSString *const UIFontTextStyleSubheadline NS_AVAILABLE_IOS(7_0); UIKIT_EXTERN NSString *const UIFontTextStyleBody NS_AVAILABLE_IOS(7_0); UIKIT_EXTERN NSString *const UIFontTextStyleCallout NS_AVAILABLE_IOS(9_0); UIKIT_EXTERN NSString *const UIFontTextStyleFootnote NS_AVAILABLE_IOS(7_0); UIKIT_EXTERN NSString *const UIFontTextStyleCaption1 NS_AVAILABLE_IOS(7_0); UIKIT_EXTERN NSString *const UIFontTextStyleCaption2 NS_AVAILABLE_IOS(7_0);
When developers use these instead of say Helvetica Neue 12, a user can change the font size in Settings->Display & Brightness->Text Size.
This is generally thought of as an accessibility feature as it helps people who have trouble seeing. However, for people like me who can see well with glasses, larger type is just more comfortable to read. Implementing this is quite easy, but requires a few extra steps like listening for changes to the fonts and making sure that table rows resize to accommodate the text. These steps aren't rocket science and don't take much effort, but many developers are constrained by what their designers give them and many designers are still used to specifying exact fonts as well as spacing. This needs to change as it is hurting those that want to increase the font size and also makes it harder to adapt to different screen sizes.
I've implemented dynamic type in a few of the apps I've done and it worked out well; the extra effort was worth it in my opinion. Some developers just don't care and other developers including Apple make an attempt, but fall short.
Here are images from the Apple News app. The first image is the standard text size; the second is the largest text size (largest before going into Accessibility and moving it to super large).
(I never knew there were images with the posts because they aren't seen with the large text.) You can see that the text resizes along with the cells, but the title collides with the first part of the article. That's pretty sloppy.
The next example is in Calendar. This one is worse than the first because the row is a fixed height and it looks like each row of text is also a fixed height so that when a larger font is used, it looks awful.
For a company that pays so much attention to accessibility, these examples show that individual teams making the apps aren't doing enough to look at their apps. Maybe all the engineers have great eyes and can see the text, but this does need to get fixed. (Filed as Apple Radar 23196322.)
Outside of Apple, developers need to pay more attention to this; accessibility is hard and I'll be the first to admit that I don't do enough on accessibility. Handling dynamic type is an easy first step in making apps more accessible and easier for everyone to use.
-
Recovering from a hack
At the end of last week, I got a message from my sister about a problem with her email account. It is a Google Apps for your Domain account and luckily, I don't manage it! Around the same time I got her message, I received email from Google that her account was suspended. Turns out when I setup the Google account, I added an admin account for me and had email forwarded to my main email address. This turns out to be a good thing as I was able to reset her password and get her going again. My sister explained that she had checked her email from her work Windows machine and it had some type of virus/malware on it and that caused her account to be compromised. Ouch. Like a good brother, I helped get things going again and told her (and the rest of my family) to enable 2 factor/2 step authentication everywhere it was available. In addition, I told her never to check her Google email from her work computer and just use her phone. That's probably good advice; don't use machines that aren't under your control if you can help it. Email can wait and with a smartphone, it is easy enough to check mail on the phone.
Her email address (not the account) was then used to send a bunch of spam. Unfortunately, there isn't much that can done about it. However, since I have control over the DNS for her domain, I setup SPF and DKIM so that any service that implements either or both of these will mark any mail that doesn't originate from Google servers as spam. Email that originates from a server not identified by SPF will have something like this in the header:
Received-SPF: fail (google.com: domain of person@example does not designate 185.27.28.62 as permitted sender) client-ip=185.27.28.62; Authentication Results: mx.google.com;
-
Looking for my next car
[Updated @ 3:50 pm with a line I forgot about changing needs.]
I currently drive a 2003 Toyota Highlander that has been treating me well since I bought it. I don't drive that much and the car hasn't had any problems. However, I'd like to get a new car before I start running into problems (based on my low mileage, that could be a long way off) and to get some more modern features found in cars. Another major reason to move away from the Highlander is that my needs have changed since I got it; I don't haul around stuff and don't usually haul people around besides my family. Earlier this year, I installed a new stereo which has been great and has breathed some new life into my car. Ever since my wife got her Honda CR-V 8.5 years ago, I've been interested in the Acura RDX which is kind of the luxury version of the CR-V. I had convinced myself that I was going to get this car and this was going to be the year. However, when the 2016 model came out, it didn't have Apple's CarPlay, so I put off getting a new car for another year.
A few months ago, I saw a post that Audi was going to start shipping it's A3 plug-in hybrid in the US in October. I hadn't thought about a hybrid, let alone a plug-in hybrid, but it looked interesting. As I don't drive much and the touted range of this car on electric was about 30 miles, I could possibly do most of my driving on electric. (In a few years I'm going to look at solar which would make charging a plug-in a lot less.) I have been driving an SUV for a long time, so going back to a sedan was going to be a change. All the features on the Audi look like it would meet my needs (luckily it isn't diesel :-)), except that it doesn't have CarPlay and Audi won't give me a straight answer on if the A3 will be upgradeable to it next year; other Audi models will get CarPlay, so I'd hope it is possible.
The styling on the A3 e-Tron isn't bad and I've been noticing more and more of the older A3 sport backs on the road. A few weeks ago, I noticed I was driving behind an A3 and saw the e-Tron logo with Michigan plates. Interesting because the car hadn't been released, yet. After a search online when we got home, I found out that Audi was test driving the A3 in San Diego and anyone could sign up. So the next day I took the car for a drive. Driving the car wasn't bad, but I'm not used to a sedan. It was quiet in all electric and seemed to perform OK, but the Audi guy just had me go in a big circle and I didn't get a chance to take it on the highway. I'm going to need more time with this car to see if it is all that I want; it didn't wow me out of the gate, so maybe that is a bad sign.
Some plug-in hybrids have federal tax credits available and in looking at the chart, I can see that most of the manufacturers don't make the plug-in hybrids every year. The number of choices for plug-in hybrids is quite small, so I may have to look elsewhere for my ideal car.
At the same time, I started looking at the gas mileage on the Acura RDX and it basically stinks. As I mentioned, I don't drive much, but it pains me to spend money on a new car that gets gas mileage only slightly better than my 13 year old Highlander (thanks to my Automatic, I can see I get around 20 mpg on average). So now I've crossed the Acura off the list and my list of cars to look at consists of just the Audi. Looking at other plug-in hybrids (they really seem to make a lot of sense), they're all ugly (what is up with this one)?
My needs are simple, my wants are more extensive. I definitely don't need a new car, but my wife keeps saying that I deserve one (I'm not going to argue with her :-)).
The San Diego International Auto Show is coming in January, so I'll use that opportunity to check out what cars could be on my short list.
Unfortunately I have a feeling that I'm not going to find exactly what I want and then I won't get anything; that will be fine for my wallet, but my wife said I deserve a new car, so I can't lose the opportunity!
-
VLAN on a home network
When I first setup IP cameras over 2 years ago, I purchased a Cisco PoE switch. I didn't need a managed switched, but at the time, it was the only PoE switch I could find without a fan (I probably should have looked harder). The switch has so many options like locking down ports based on MAC address, VLAN tagging, even some routing capabilities.
I thought about setting up a VLAN to isolate the camera traffic so that only the server recording the video could access the cameras, but decided against it as I couldn't quite figure out all the pieces and didn't see the point in doing so.
After purchasing the EdgeRouter Lite, I had to setup a VLAN for my guest network in order to prevent guest users from having access to the rest of my network. I don't have too many guests over, but I figured it was a good idea and in order to emulate my Time Capsule, I set it up.
Over the past few weeks, I've been testing out an enterprise grade WiFi access point (more on this in a future post) and one of the features it has is the ability to assign a VLAN to a wireless network. Since I already had experience setting up a VLAN, I started playing with this feature and thought about using a VLAN for my WLAN traffic. Why would I do this? That's a really good question. As this is my home network, I wanted the wireless clients to be able to access resources on the wired network and vice versa. A VLAN is designed to isolate traffic and by trying to combine the networks, I was basically defeating a main reason to use a VLAN. However, I went ahead with my experimentation and was able to put wireless clients on a VLAN. The setup was easy and my clients connected. However, I couldn't use auto discovery like mDNS and UPnP that many services use on a home network.
mDNS was solved using:
configure set service mdns reflector commit save exit
and this post got UPnP discovery working. I did have some high CPU load on my router with this however.
I got everything working and was fairly pleased (except for the high CPU usage on the router). A Ubiquiti employee pointed out the obvious to me that doing what I wanted defeated the purpose of a VLAN, so I really started thinking about what I was trying to do. I love statistics, so I guess I really just want to know how much traffic is going over the wireless network.
The other reason for doing VLANs is to handle more than 254 (or so) devices on a network. My home network currently has 38 devices, so I haven't hit this limit, yet. If I was running a small business, I'm sure that I could hit this limit fairly quickly and VLANs would make a lot of sense. In that case, the mDNS reflector and UPnP broadcasting could bog down the router. In addition, in order to route traffic to a VLAN, the traffic has to go through a router and that will increase load on the router.
So, I've learned a bit about VLANs, UPnP, and mDNS. I haven't accomplished anything in this experiment as my network still works the same way as it did before I started this.