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): 

Low resolution (16.9 MB): 

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.

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();
NSLog.debug.appendln("Stop time = " + timer.stopTime());

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

package com.woextras;


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

public static Timer startNewTimer()
Timer timer = new Timer();
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;