April 23, 2018

Simple way to check if CRON is working!

Recently, we moved from hosting our app on Amazon EC2 instances to Elastic Beanstalk Service. For those who had a go at hosting their apps on Elastic Beanstalk, you would know the struggles with .ebextensions. There are far more documentation and examples available now than when it was first released into the market. One of the most challenging things to do in Beanstalk is running Cron. The recommended way of doing it is via the creation of worker environment that processes long-running workloads on demand or performs tasks on a schedule. It makes use of other Amazon services like SQS queuing.

This is okay for some people who have genuinely long-running processes but our PHP application was pretty straightforward. Most of the CRON jobs would be completed in seconds. For us, running a separate worker instance with all its resources was pointless and a waste of resources. So we need to come up with another way. The other way of running CRON is using something called “leader_only” declarations in the .ebextension file. By using that, you are asking Beanstalk to run the CRON Jobs only on the first instance. This avoids multiple instances running the same CRON jobs because that would really screw things up.

Anyway, we need to get the YAML right and there is a neat little utility online that lets you validate your files. It’s called YAMLlint.com. Check it out. To see if your CRON is running as it should, here is a neat little way to test it. Obviously, the whole point of using Beanstalk is to avoid having to manually edit code on single instance so it takes away the need to setup FTP or sFTP. I suggest you do set it up for your first instance so you can check if the CRON is running and if everything is deploying as it should. There is no harm done in double checking right 😉

1. Edit your CRONTAB or in Beanstalk’s case, add it to the .ebextension folder.

$ crontab -e

2. Add the following line inside your CRON which basically will append the current date to a log file every minute. The 6 fields of the crontab file are minute, hour, the day of the month, month, the day of the week, and the actual command.

* * * * * /bin/date >> /tmp/cron_output

3. Exit the editor and you should see an output something similar to this.

crontab: installing new crontab

4. Check if the CRON is running every minute as it should through running this command which grabs the output of the file being stored in /tmp directory.

tail -f /tmp/cron_output

You should see something similar to this as the output.

Mon Apr 23 00:01:01 PDT 2018
Mon Apr 23 00:02:01 PDT 2018
Mon Apr 23 00:03:01 PDT 2018
Mon Apr 23 00:04:01 PDT 2018
...

If you don’t see it regularly running every minute, then you know something is not right with the CRON service. If you don’t see the file at all, then you know the CRON is not running. This narrows down things down to what is working and what isn’t. Saves you some hours on figuring out whether its Elastic Beanstalk file playing around or your actual CRON commands or something else. Hope this helps 🙂

I will be writing the way we setup CRON in the future blog post. Watch the space!

February 9, 2018

Restoring Google Authenticator 2-Factor Authentication Codes after iPhone Reset

Google Authenticator Iphone Restore

Recently Apple admitted to purposefully reducing the speed of an iPhone to conserve it’s battery life. In other words, they want people with older iPhones to go for a new one because the old ones seem slow and sluggish. As you would imagine, people didn’t take this in very well. There were tons of supporting and opposing articles around Apple’s decision to do this. Anyway, I have an older iPhone 6 Plus model and didn’t feel the need to upgrade (as of yet). And yes, it was slow and sluggish, so I decided to get my battery replaced hoping it would fix the problem. To my surprise, the wait time for a battery replacement of iPhone 6 Plus model was surprisingly long – close to 3 WHOLE months.

I couldn’t wait that long so I called up Apple and the nice guy on the phone ended up replacing my iPhone with a brand new one. He did charge me an out-of-warranty replacement fee but I was okay with that. The recommended procedure for moving your old phone’s data to the new phone is to use the iTunes back up and restore feature. I followed that and all the apps seem to be functioning the way they did.

If you have a lot of apps like I do, it does take quite a bit of time. You have to tap on each app for it to load as they get stuck sometimes. After the restore, it wasn’t amazingly fast but good enough to run the show. The only app that didn’t restore as it should be was the Google Authenticator app which is used for two-factor authentication. So heads up to all the developers out there moving their data to newer phones, Google Authenticator two-factor authentication codes would not be restored.

So you got two options…

  1. Log in to each of the sites you use 2FA on and switch off the 2FA
  2. If you have backup codes, you can reinstall Google 2FA and subsequent codes for each of the sites

Ps. To all the peeps wanting to get an iPhone 10/x, there are rumors that Apple would be releasing a plus version next year. I might or might not be waiting for that 😉

December 5, 2017

10 Reasons Why It Is Best To Date a Software Engineer

Recently I landed on a Quora answer for why software engineers make up the best people to date. I found it so relevant that I thought of making a post about it here. This is not my answer – all credit goes to Nishant Neeraj on Quora for What are 10 reasons why it is best to marry a software engineer compared to someone from other professions?

He says this applies to all software engineers irrespective of their gender and I agree. I was surprised at how closely they match me and what I would do 😮 😮

1) They are logical.
Come on, this is a job requirement.

2) They need you.
They need you. Whole day banging head in cubical in figuring out complex concurrency bug, your soft pretty face is all they want to see.

3) They love to do activities with you. 
Unlike many other professions, software engineering is basically a sitting job. Most devs want to do some outdoor activity. So, you wouldn’t end up with a spouse that wants to sleep in the weekends. They’d love to take you for a long drive and not talk about the work.

4) They buy you expensive gifts.
Software engineering earns well. Not extremely well, but better than average. Expect a car key when you were expecting a necklace or a watch.

(I can hear someone saying, “R, This is too much!”)

5) They do not forget dates.
Most of the software engineers know how to use any scheduler. They will probably have a cronjob setup on a test server that reminds them how to behave during your PMS cycle or not to call you when you are watching your favorite sports.

6) They love gadgets (and fix them too).
Software engineers love gadgets. One would argue that everyone loves them. The difference here is they know why they love a particular gadget. They will tell you why Android is better than iPhone and why you should get an iPhone while they should get an Android.

7) You will learn something new.
Software engineering involves stuff that can mostly always be done on a laptop. So, you wanted to build a website for a social cause that you are working on? They will tell you how simple it is to put together a simple PHP project that she/he can teach you over the weekends. And hey! work with him/her over next weekend. She/He will tell you how to integrate it with Facebook, Twitter, SMS, and add a payment gateway too!

8) All-nighters for you.
Apart from all the usual stuff *wink* that keep them up with you all night, they are usually good at pulling all-nighters for important stuff. So, if you cannot sleep because your friend got promoted undeservedly, wake ’em up, and talk some.

9) They make good parents.
So, the daycare is not taking your kids and you have a guys/ladies-day-out? Ask your spouse to WFH (Work from Home).

10) Free computer wiz for all your needs.
This is an obvious one. Use your computer like it is never gonna break. Because when it does, help is just a flirt-talk away.

Pull a discussion from movies, comics, music, business, politics, science, technology, medical, or any other place. They usually have a point of view that is not a dumb one. They love to listen and then research on the topic and come back with more on the topic. On a bad day, they will like to criticize holes in your theories with citations. And pester you till you get teary; then guilty feeling takes over them and very soon you get a gift with an apology.

December 4, 2017

Deleting Magento Customer Address Programmatically

When upgrading Magento for one of our customers, we’ve realized somehow all the shipping information were half complete. It either had a region filled out without address or zip code. When you enter that customer’s profile and try to save it, it wouldn’t save because these are required fields. This was causing these old customers to purchase stuff from the store because they assumed their address was saved.

The best thing to do when you encounter such an issue with Magento is to clear saved addresses altogether. Our team has written a neat little script that would delete all the saved addresses given that you know their email addresses. This is easy to find out if you were to just export all customer profiles through Magento panel. Some might argue that you can do this Data Profiles Import/Export function. Unfortunately, Magento has a function to replace only if the value contains something. If you leave it blank, it wouldn’t touch that field. So you would still have the customers whose addresses are half filled with missing information.

I hope this helps someone in need 🙂

<?php
  include('app/Mage.php');
  Mage::app();  
  
  $customer_emails = array(
    "user1@example.com",
    "user2@example.com"
);
  
  foreach($customer_emails as $customer_email){
    
    echo $customer_email . "</br>";
    $customer = Mage::getModel("customer/customer");
    $customer->setWebsiteId(Mage::app()->getWebsite()->getId());
    $customer->loadByEmail($customer_email); //load customer by email id
    $customer_id = $customer->getId();
    
      echo $customer_id. "</br>";
      foreach ($customer->getAddresses() as $address)
      {
         $customerAddress[] = $address->toArray();
         
         $address->delete();
      }
      
    echo '<pre/>';print_r($customerAddress );
  }
  
  
?>

 

Older Posts