Friday, April 26, 2019

No Nonsense Marketing

The Marines are excellent at no-nonsense marketing. It's about being direct and setting the expectation. 


In June 1985, there was a TWA terrorist hijacking which was my Pearl Harbor moment. That was the moment when I pledged to join the Marines. I knew nothing about the military; not even the difference between the enlisted and officer ranks. But I wanted to do my part to make a difference. 

The local recruiting office housed all four military services. The Marines' office was in the back, so I had to pass by the Army, Navy, and Air Force offices on my way. As soon as I walked in the front door, a soldier stopped to offer me help.

"I'm looking to join the Marines or something," I said, shrugging my shoulders as I said the last word.

"Or something? Have you considered the Army?" he asked as he guided me into his office. He could tell I was looking for a challenge so he fired up a 12" LaserDisc to show me exciting clips of Ranger and Airborne training. For about two hours, that afternoon, this Army recruiter told me about what the Army could be. He convinced me take the ASVAB military entrance exam, later that week.

After we finished, I left the Army office and headed to the Marines' recruiting office where I met SSgt Meehan; a Marine I remained in touch with to this very day. The SSgt, who, at 27 years of age seemed to have the wisdom and experience of a senior citizen. He sat me down next to his desk, lit his pipe, and said, "I don't have any fancy LaserDiscs to show you videos. At this point, I have no idea what you're qualified to do, so I can't make any promises. First you need to take the ASVAB. Before you do that, you have to take my 30 minute practice exam."

SSgt Meehan led me to a small room where a couple other potential recruits were taking exams. I don't recall the details of the exam, but it wasn't too difficult. When I completed it, the SSgt reviewed my answers and told me that we could proceed to official ASVAB as soon as he could schedule it.

"Can the same ASVAB exam results be used for all the military services?" I asked the SSgt.

"Yes."

I explained to him about my soft commitment with the Army.

"If you want to be a Marine then I would like you to schedule that test with me," replied SSgt Meehan.

As I headed out of the building, I stopped by the Army's office and gently backed out of my ASVAB commitment.

"I can tell," said the soldier I had spent two hours with, earlier that day. "You're gonna be a Marine."

In my mind, I was committed to joining the Marines and the SSgt's direct and practical approach was the icing on the cake.

Thursday, April 18, 2019

The Entire Mueller Report in a Single Page

The Mueller Report has been made public; all 448 pages. Known formally as the Report On The Investigation Into Russian Interference In The 2016 Presidential Election, it's a bit redacted.

You can download the entire report, in a single, legible page, here:

High resolution (145.4 MB): http://mobile.joemoreno.com/mueller-report-highres.pdf 


Low resolution (16.9 MB): http://mobile.joemoreno.com/mueller-report-lowres.pdf 


How did I make this PDF?

Seeing the full report on a single page gives us an idea of how much text was redacted. Each redaction tells us why the text was redacted, i.e., to protect someone's privacy, to hide an investigation technique, etc.


Change the Layout option to 16 Pages per Sheet. Repeat.

To create this single page PDF:
1. Change the Layout option to print 16 Pages per Sheet.
2. Open the new PDF in Preview.
3. Repeat.

After doing this about three times, I had the entire report on a single page PDF that was fully legible, albeit very large (145.4 MB).

To reduce the size of the PDF, for the low res version, I choose File ––> Export, in Preview, and, under the Quartz Filter pop-up, I  chose Reduce File Size.

Now, we just need someone to read the entire report and turn it into a podcast.

Update: Here's the entire Mueller Report read, verbatim, in 12 hours: https://youtu.be/G73iRRgoLKg

Monday, April 8, 2019

Timer Objects for Network Latency

The heart of the Timer class.
I left out a simple tip from my "Tricks I Learned At Apple: Steve Jobs Load Testing" piece about timer objects. Below, is a complete, yet simple, Timer object class I wrote shortly after leaving Apple when I was working with SMS Hayes AT commands and RESTful APIs.


Exponential Notification

Timer objects do nothing more than measure the time it takes for a server's request/response loop to complete. Since this type of call is made over a network, it might finish very quickly (as expected) or, if the network is down or congested, it could take along time. If it takes a long time, the system admins will want to know. A good notification method is not to send an e-mail update or text message every single minute, or so – that ends up flooding people's inboxes. Instead, an exponential notification would be a much better idea. For example, notify the system administrators immediately, then wait one minute before the next notification, then wait two minutes, four minutes, eight minutes, etc. Finally, send a last notification once the issue's fixed.

Initiating the timer is simple...

Timer timer = Timer.startNewTimer();
NSLog.debug.appendln("Start time = " + timer.startTime());
Response response = saleTransaction.submitTransaction();
timer.stop();
NSLog.debug.appendln("Stop time = " + timer.stopTime());


And, lastly, the complete Java timer class is anticlimactic.


package com.woextras;

import com.webobjects.foundation.NSTimestamp;

public class Timer
{
private NSTimestamp _startTime = null;
private NSTimestamp _stopTime = null;

public static Timer startNewTimer()
{
Timer timer = new Timer();
timer.start();
return timer;
}
public void start()
{
_startTime = new NSTimestamp();
}

public void stop()
{
_stopTime = new NSTimestamp();
}
public NSTimestamp startTime()
{
return _startTime;
}
public NSTimestamp stopTime()
{
return _stopTime;
}
public Long elapsedTime()
{
long completionTime = -1;
if (_startTime != null)
{
long startTime = _startTime.getTime();
long stopTime;
if (_stopTime != null)
{
stopTime = _stopTime.getTime();
} else
{
stopTime = new NSTimestamp().getTime();
}
completionTime = (stopTime - startTime) / 1000L;
}
return completionTime;
}
}