Button for getting a PDF back (Zend/PHP)

When using PHP with Zend, the requests for having a button that creates a PDF are like a train that’s never late. Often there are two cases:

  1. Easy: The PDF is created on the backed and stored there. Just pick your favorite PDF library (I use tcpdf). Then the file can be saved on the server, and you can keep track of it by creating a database table for it. For the purpose of downloading it, just make a route (and action) on Zend that handles the request, normally by ID.
  2. Easier but with a catch. The PDF is created every time and not stored on the server. Once that you verify that the PDF object was created, TCPDF has an output method that makes the response for you. The catch is that on the controller you need to set the return view model to terminal (via setTerminal(true)), and directly get out of the controller’s action via return $this->getResponse(); Otherwise, the PDF will contain (after EOF) some HTML, which is not clean, and it could trigger errors (such as unable to find the phtml for the action).

For option 1, consider having a separate class for handling the PDF files together with their corresponding database table, because, if later you have other sections that will make PDFs, you would not want to be repeating such code again and again.

Please upload this excel file to the database

An occasional request to a website I maintain at a non-for-profit organization is to upload records to a MySQL database. The data is given to me as an attachment in an Excel file. These are the steps that get the task done in the fastest time.

  1. Make sure that I get the file to my Gmail account (either directly, or I just forward it from my .edu email to my personal Gmail).
  2. Click on the attachment (in Gmail), not the download, but the “Edit with Google Sheets” button.
  3. As needed, “fix” data, such as date values, and remove formatting (if any).
    1. Arrange the columns to match those of the table into which you want to load the records to.
  4. Download (from Google Sheets) as tab-separated values. “File” -> “Download as” -> “Tab-separated values (.tsv, current sheet)”
    • The benefits are:
      • not having to open Excel locally at all (or OpenOffice, LibreOffice)
      • not having to deal with windows/unix line endings upon exporting from your favorite (local) spreadsheet
  5. Open the terminal (ideally OSX, or Linux, but cywin gets the job done too under Windows).
  6. Get rid of the first line, which usually is the header line.
  7. “Copy” the file to the linux box where MySQL is located (such as via scp, or sftp).
  8. Login to the linux box where MySQL is located.
  9. Backup the database (and copy the backup to another linux box before the next step)
  10. Login to MySQL, and use the command LOAD DATA INFILE to load the data
    • Example: Load data infile ‘/tmp/strains.txt’ into table strains;
    • Pay attention to the message indicating how many records were inserted. It should match the number of records that you expected to insert.
    • Pay attention to the other messages such as “Warnings”. When “Warnings” is not a zero, then do a command: “Show warnings;” to help you identify what the problem was. It could be that lines are truncated because the field in the table was too small, or that you don’t have a value in a column that does not accept nulls.
  11. Check your data. Then tell your boss (or yourself) that the task is “done”.
  12. Disadvantages of this approach:
    • Your google-sheets will be cluttered with the opened excel files. (Not easy to get rid of those things, I’ve tried and just decided not to bother; if needed, just rename the file to something that starts with “z_useless_” so that it is listed alphabetically at the end, and you can remember that you don’t need it).
    • You may have to read the additional options of the LOAD DATA command, when you have columns that have values that depend on other fields. However, MySQL is quite powerful, with functions for strings, and simple arithmetic.

Installing Ubuntu on an old Macbook

I have an old macbook (year 2006) that had a crashed hard-disk over two years ago. At the time, the new disk with a clean install of OSX was very fast to start up, and it was not even a SSD.

The laptop was functional in my secondary office, at which I go maybe once at week. Normally, I’d use it to connect to a random linux server via the terminal.

However, it was clear that the laptop was unusable for web browsing due to the lack of software updates available.

I attempted to install Elementary.io but it only works for 64 bits. On the other hand, Ubuntu works, and here are a few of my notes:

  • Etcher is quite amazing for making a bootable USB drive: select the image file, then the destination USB drive, and click on the “flash” button.
    • This video was very useful: link
  • Etcher would not do the trick when trying to make a bootable USB for Unbuntu. Then I tried UNetbootin, which would not display the USB disk.
  • I had to “fix” the USB disk (erase volume, unmount, erase partition) via command line usage of diskutil
    • diskutil list: shows you the list of disks
    • diskutil eraseDisk: did not work, gave me an error on: Unable to begin erase operation: The target disk is too small for this operation (-69771)
    • diskutil eraseVolume FAT32 ABCD /dev/disk2: did the trick
    • diskutil unmount disk2: this is needed for the next step to work
    • sudo diskutil partitionDisk disk2 1 MBR FAT32 ABCDE R
    • Kudos to a stackExchange response (great, as usual) that was key to solve this
  • The USB drive then showed up on UNetbootin, for which I recommend downloading separately the .iso file (before using UNetbootin).

Cooking meals for an epsilon

My Statistics professor at graduate school said that stats scientists refer to their children as epsilon, because they are tiny.

Main dishes:

  • Turkey corn dog
  • Pasta (with/without beef)
  • Chicken nuggets
  • Steak fingers
  • Meatballs with gravy
  • Turkey and cheese roll ups
  • Fish sticks
  • Meatlof
  • Diced chicken
  • Spaghetti with meatballs
  • Soft beef tacos
  • Baked chicken strips
  • Salmon
  • Mac and cheese (avoid it)
  • Pizza (avoid it)

Sides:

  • Baked fries
  • Tator tots
  • Bread
  • Rice
  • Pinto beans
  • Mashed potatoes
  • Corn

Veggies/Fruits:

  • Mixed veggies
  • Salad
  • Green beans
  • Steamed broccoli
  • Fruit slices

Let’s talk while my daughter is at ballet, it is 1 whole hour!

tl;dr It is the spontaneous and unexpected that often make for nice memories.

“If your flight gets canceled, call me to pick you up” said my cousin after dropping me off at the airport. One hour later my flight was canceled due to snow in Atlanta. “We can arrange for a flight but you’ll get there at 9pm, unless you would like a first class seat on tomorrow’s flight.” said the airline employee. Yep, she said “first class”, I remember it very well, but this was at a city bordering Mexico, maybe she care more about getting the message communicated quickly. I took the “first class” option, and in a minute they printed my ticket (it was the first time I got a ticket with a row number consisting of 1 digit).

Instead of calling my cousin, I took the city bus back to downtown. Then I called a friend on the Mexico side of the border (using the US 800 number that his company has, and then just typing his 5-digit extension number). He picked me up on the Mexico side (after I walked across one of the bridges that connects US to Mexico). Then we went back to his (cubicle) office. “Can you wait 1 hour before going for lunch?” he said. The idea was that we would go for lunch with other three people, all of whom I’ve met before when I was also a cubicle-employee. We went to a good restaurant, affordable to them because they were single with no kids, and to me because I had US dollars paying for food in Mexico (I was on a graduate student budget).

Good friends, good food, good times. It was a great excuse to have a long lunch break for them because I was there. We talked about where other friends got jobs at,  who was finally dating, and so on and so forth. All thanks to the spontaneous and unexpected flight cancellation due to snow in Atlanta airport. Would any of this be possible 10 years later? unlikely. People have kids, busy kids. (Caterina Fake’s post is highly recommended). Among my friends that have kids, only the “least responsible”, or artsy, or with fewer “resources” are the ones that do not have their schedule affected by kids activities. These friends are the best for scheduling play-dates though.

I’ve heard stories of people missing their flight, which then brought nice experiences of exploring whatever city they were stuck at for a day. If given the choice of which connecting city to be stuck at for a day, I’ll likely choose the city where I have more friends that have no children, just to increase the chance that such friends are available. Otherwise, I’m stuck with just a coffee break, or with this comment by a friend that said: “let’s talk while my daughter is at ballet, it is 1 whole hour!”. On the other hand, I do not flight often anymore.

Athens to Altanta train recurring dream

tl;dr  personal note, just skip reading it.

I’ve had several dreams (throughout the years) that have something to do with a train that goes from Athens to Atlanta. It would be fun if some day I could take such a train just to say “I’ve dreamed this before”.

There’s some planning about building such a commuter train though.