Bolinao

We along with James decided to go on a midweek trip to Bolinao to take advantage of the APEC holidays. Of course, it had to be up north because the south is gridlocked also because of APEC activities.

We decided to use Google Maps and Waze to guide us. I had deleted Waze a few months ago because of its tendency to lead me off the road (literally and figuratively) but James is still using it. Of course, both apps then proceeded to direct us to all the wrong places (as usual). We reached Bolinao a bit later than expected and it was almost lunch.

We checked out Puerto del Sol first. The tide was low and we were informed by the staff that it is rather low this time of the year. Optimistic, and having no real choice since we’re there already, we decided to push further on, bypassing resorts that had brown low-tide shores. Eventually we reached Treasures of Bolinao where we decided to have lunch. While there, we saw that the beach adjacent the resort was pretty good even at low tide.

After lunch we checked out the remaining resorts. GResort, which is well-recommended was unfortunately fully-booked. We checked out other beach resort (mostly basic huts and/or camping areas) until we stumbled upon La Parola who offered us a “transient” (essentially a house with kitchen) for the price of a room (P2500).  Since it was right beside Treasures of Bolinao and right smack at the pretty good beach we saw earlier, we decided to take it.

It was already siesta time and we were all tired from the long trip so everyone took a nap. Once we woke up, we immediately dressed up (down?) and went to the beach. The sand was soft, a bit coarse but not a problem. The water was clean and cool. And the sunset, the sunset was awesome!

There was no restaurant so we had to drive a short distance to the nearest “restaurant” for dinner. It’s actually walkable but it was dark and unfamiliar plus we had kids. The restaurant is basically just a small shed with a few tables (4?). But prices are reasonable and the food is what I’d call authentic. They don’t sell drink buts there are nearby stores that do.

After dinner, we went back and checked out the beach for anything interesting. Nothing aside from a few people drinking. Even the torches set up along the beach were not lit. We went back to our accommodations and very quickly slept.

The next morning, it was back to the beach for a quick dip before breakfast (at the same restaurant the night before) and departure.

We dropped by other sights along the way:

  • The Bolinao lighthouse which sits on top of a hill that offers a wide view of the coast. The lighthouse itself doesn’t seem to be operational.
  • The Enchanted Cave which charges P150 for entry. We didn’t take go in since we weren’t planning to swim inside the cave anyway
  • Bolinao church which is a Spanish-era church at the town proper
  • Maxine by the Sea where we had lunch. It is also by the Alaminos wharf which is the jump-off point for trips to the islands. The restaurant has a good, albeit far, view of the Hundred Islands where we had lunch. Food was fine but a bit expensive.

We didn’t go to Bolinao Falls anymore as it was a bit out of the way.

We got home almost midnight, tired but happy with the short adventure.

 

 

 

iOS 9 and the Firebase REST API

I was playing around with the Firebase REST APIs when I encountered the following SSL error:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL...

After some research, I found out that iOS 9 enforces App Transport Security or ATS which, according to Apple, “enforces best practices in the secure connections between an app and its back end”.

But I am using secure connections! After further research I found out that problem with the Firebase servers, specifically the SSL ciphers they allow.

By default, apps use only a specific set of ciphers for SSL communications:

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

Setting the NSAppTransportSecurity option will include the following ciphers, which the Firebase servers do allow:

TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
TLS_DHE_RSA_WITH_AES_256_CBC_SHA
TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
TLS_DHE_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_GCM_SHA384
TLS_RSA_WITH_AES_128_GCM_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA256
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA256
TLS_RSA_WITH_AES_128_CBC_SHA

Setting the NSAppTransportSecurity option entails adding the following into the app’s Info.plist:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>firebaseio.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>

DHE stands for Diffie-Hellman Exchange. ECDHE stands for Elliptic-Curve Diffie Hellman Exchange. They both offer forward secrecy but ECDHE is just faster. So the NSThirdPartyExceptionRequiresForwardSecrecy is a bit of a misnomer.

Now I wonder why Firebase doesn’t just add support for ECDHE?

More at StackOverflow.

FoneScan is Out!

FoneScan is a simple and easy-to-use barcode scanning app for your iPhone or iPad:

  1. Create data file
  2. Scan items: capture code and count
  3. Manual entry or correction
  4. Export scanned data to CSV format and email
  5. Merge or update your master spreadsheet with the scanned data

Supports the following barcode types:

  1. QR Code
  2. Data Matrix
  3. UPC E
  4. UPC A
  5. EAN 8
  6. EAN 13
  7. Code 128
  8. Code 39
  9. ITF

Do check it out!

Reading A Vernier Caliper

vernier caliper - 1

I got a plastic vernier caliper for measuring watch parts. I got a plastic one because it’s (1) cheaper and (2) it will not scratch the watch.

A caliper is a device used to measure the distance between two opposite sides of an object. A vernier scale is a device that lets the user measure more precisely than could be done unaided when reading a uniformly-divided measurement scale (such as a ruler). A vernier caliper is therefore a caliper equipped with a vernier scale for precision measurements.

It has a main scale (in this case, in mm), a sliding vernier scale (in this case, with graduations that correspond to 0.05mm), inside jaws (upper, smaller jaws on picture) or the outside jaws (lower, bigger jaws on photo).

vernier caliper - 2

The inside jaws is for measuring the distance from inside of objects like lug widths (inside distance between the lugs of a watch). The outside jaws is used for measuring from outside of objects like length, width, height, case diameter, and lug-to-lug distance (distance between the tip of the top lugs to the tip of the bottom lugs).

vernier caliper - 3

Simply slide and position the jaws lightly on the object to be measured and read the scale. In this case, the “0” index on the vernier scale points a bit over 41mm on the main scale. How much is a bit over? Find the index on the vernier scale that lines up with the index on the main scale. In this case, it’s 2. Thus the distance is 41mm + 0.2mm or 41.2mm (with a ±0.05mm error).

That’s all there is to it :)