Saturday, 17 January 2015

[Book Review] - Technical Blogging by Antonio Cangiano

Title: Technical Blogging
Author: Antonio Cangiano
Publisher: Pragmatic Bookshelf
Publish Date: March 1, 2012

As part of my new years resolution to more blog more regularly I started reading this book on the train into work on my iPad, finishing it within a week. As I mentioned in my post last week this book is great and has been a real motivator for me to take my blogging more seriously.

Book cover - image taken from the Pragmatic Bookshelf

I highly recommend this book to anyone who is a keen blogger or even someone who has a website or app who wants to increase their exposure to their product as the tips given in the book are transferrable. Antonio Cangiano is the author of many blogs - most famously Zen and the art of Programming and Math-Blog so he know's what he's talking about.

The book covers the following key topics:
  • Determining what kind of blog you are running (personal, company, general, niche etc)
  • The technicalities on how to create a blog
  • Creating content and maintaining your pace of blogging
  • Promoting your blog
  • Making money from your blog
The book focusses mainly on the Wordpress platform, but most of it is transferrable to other platforms (e.g. I use Blogger). 

The big takeaway I took from the book which I could instantly put into action were tips on how to ensure your blog more regularly (e.g. have blog entries in reserve in case you suffer writers block) and how to make your blog reach more readers. It's amazing what can happen if you just publish your best content onto reddit for example.

Has the book made any measurable difference to my blog? YES! 
  1. My number of posts has increased dramatically. More importantly I have a backlog of potential blog posts ready to get out there.
  2. Previously my record number of page views in a day was 54. This week I had 2500 in one day! 
  3. I've started to contribute back to the programming community which feels really good. Reading and commenting on other people's contents helps broaden my knowledge and get me more enthused in the industry.
Well worth picking up for the motivation alone.

Thursday, 15 January 2015

Privacy Policy

This Privacy Policy governs the manner in which MacKenzie Software collects, uses, maintains and discloses information collected from users (each, a "User") of the http://www.mackenziesoftware.com/ website ("Site"). This privacy policy applies to the Site and all products and services offered by MacKenzie Software.

Personal identification information

We may collect personal identification information from Users in a variety of ways, including, but not limited to, when Users visit our site, subscribe to the newsletter, and in connection with other activities, services, features or resources we make available on our Site. Users may be asked for, as appropriate, email address. Users may, however, visit our Site anonymously. We will collect personal identification information from Users only if they voluntarily submit such information to us. Users can always refuse to supply personally identification information, except that it may prevent them from engaging in certain Site related activities.

Non-personal identification information

We may collect non-personal identification information about Users whenever they interact with our Site. Non-personal identification information may include the browser name, the type of computer and technical information about Users means of connection to our Site, such as the operating system and the Internet service providers utilized and other similar information.

Web browser cookies

Our Site may use "cookies" to enhance User experience. User's web browser places cookies on their hard drive for record-keeping purposes and sometimes to track information about them. User may choose to set their web browser to refuse cookies, or to alert you when cookies are being sent. If they do so, note that some parts of the Site may not function properly.

How we use collected information

MacKenzie Software may collect and use Users personal information for the following purposes:
  • - To improve customer service
    Information you provide helps us respond to your customer service requests and support needs more efficiently.
  • - To personalize user experience
    We may use information in the aggregate to understand how our Users as a group use the services and resources provided on our Site.
  • - To improve our Site
    We may use feedback you provide to improve our products and services.
  • - To send periodic emails
    If User decides to opt-in to our mailing list, they will receive emails that may include company news, updates, related product or service information, etc. If at any time the User would like to unsubscribe from receiving future emails, we include detailed unsubscribe instructions at the bottom of each email or User may contact us via our Site.
How we protect your information

We adopt appropriate data collection, storage and processing practices and security measures to protect against unauthorized access, alteration, disclosure or destruction of your personal information, username, password, transaction information and data stored on our Site.

Sharing your personal information

We do not sell, trade, or rent Users personal identification information to others. We may share generic aggregated demographic information not linked to any personal identification information regarding visitors and users with our business partners, trusted affiliates and advertisers for the purposes outlined above.We may use third party service providers to help us operate our business and the Site or administer activities on our behalf, such as sending out newsletters or surveys. We may share your information with these third parties for those limited purposes provided that you have given us your permission.

Third party websites

Users may find advertising or other content on our Site that link to the sites and services of our partners, suppliers, advertisers, sponsors, licensors and other third parties. We do not control the content or links that appear on these sites and are not responsible for the practices employed by websites linked to or from our Site. In addition, these sites or services, including their content and links, may be constantly changing. These sites and services may have their own privacy policies and customer service policies. Browsing and interaction on any other website, including websites which have a link to our Site, is subject to that website's own terms and policies.

Advertising

Ads appearing on our site may be delivered to Users by advertising partners, who may set cookies. These cookies allow the ad server to recognize your computer each time they send you an online advertisement to compile non personal identification information about you or others who use your computer. This information allows ad networks to, among other things, deliver targeted advertisements that they believe will be of most interest to you. This privacy policy does not cover the use of cookies by any advertisers.

Google Adsense

Some of the ads may be served by Google. Google's use of the DART cookie enables it to serve ads to Users based on their visit to our Site and other sites on the Internet. DART uses "non personally identifiable information" and does NOT track personal information about you, such as your name, email address, physical address, etc. You may opt out of the use of the DART cookie by visiting the Google ad and content network privacy policy at http://www.google.com/privacy_ads.html

Views Expressed in Blog
The views expressed in this blog are of MacKenzie Software only, and not that of anybody else including any current employers. MacKenzie Software is not responsible for views added to comments on this site, but will proactively monitor comments and remove any which are not acceptable.

Changes to this privacy policy

MacKenzie Software has the discretion to update this privacy policy at any time. When we do, we will post a notification on the main page of our Site, revise the updated date at the bottom of this page. We encourage Users to frequently check this page for any changes to stay informed about how we are helping to protect the personal information we collect. You acknowledge and agree that it is your responsibility to review this privacy policy periodically and become aware of modifications.

Your acceptance of these terms

By using this Site, you signify your acceptance of this policy. If you do not agree to this policy, please do not use our Site. Your continued use of the Site following the posting of changes to this policy will be deemed your acceptance of those changes.

Contacting us

If you have any questions about this Privacy Policy, the practices of this site, or your dealings with this site, please contact us at:
MacKenzie Software
http://www.mackenziesoftware.com/

This document was last updated on January 15, 2015

Privacy policy created by Generate Privacy Policy

Can someone from a non-programming background successfully manage or lead a team of programmers?

This is a question I have asked myself a few times over the last few years, and it can be a bit controversial:

Can someone from a non-programming background successfully manage or lead a team of programmers?

It's a good question. Of course, ultimately if you go up a few layers in an organization, the person at the top is invariably not from a programming background. I'm talking about direct leaders of the development team; the technical lead, the development manager, the scrum-master.

Over the years I've been managed by various different people from different backgrounds with varying success. I've also managed or led various development teams. Here's my general views on this:

Projects tend to fail, over-run or be massively underestimated in occasions when someone from a non-programming background leads a project. The following issues commonly arise:

    • The development team aren't involved in the work estimation and so it is hugely under-estimated. 
    • Requirements are not communicated effectively. Typically the initial requirement is paraphrased to the development team with key points which may hugely affect design omitted. This leads to rework or worse starting again. 
    • The lead may try to impose a bad design onto the development team, and due to their position the development team have to persevere with it.
Great example of bad design from Donald Norman's book - a great book for UI design. (Image from Amazon)

Some of the points above can be counter-acted with a strong development team - a team who are not scared to question decisions coming from the top. Additionally, agile teams can fair better where the development team are getting far more exposure to the end customer and the end requirements. 

Another thing which can commonly come up is that if the person leading the team does not have a good technical background, the development team can run over the top of them as they always delegate decisions to the team. I find good teams have strong leaders who will have a good technical vision but who will delegate some (or a lot) of decisions to the team. However, ultimately they have a vision and can quickly determine if the project is going off track. 

In conclusion, I think that having a development team led by someone not from a programming background is extremely dangerous, and from experience very rarely works. Adopting agile methodologies can help with mitigating some of the problems above, and strong minded development teams can overcome hurdles and ensure projects stay on track. 

I appreciate this is a generalisation, a bit controversial and every case is different so I'd like to hear your experiences - if you want to share please add a comment.

Monday, 12 January 2015

Android - Check for internet connectivity.

It's common to check for connectivity to the Internet within your Android app before you try and perform an operation. For example, if you were about to call an external REST call, you may want to check internet connectivity before performing the operation.

To perform the check I use the following utility method:

private boolean isNetworkAvailable() {
           ConnectivityManager connectivityManager
                 = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
           NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
           return activeNetworkInfo != null;

}

Remember you need the following in your AndroidManifest.xml in order for your app to connect to the Internet:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Sunday, 11 January 2015

[FIX: Eclipse - Android layout file] - Incorrect line ending: found carriage return (\r) without corresponding newline (\n)

I hit this annoying issue today - I think due to copy and pasting code. Within my layout file in Android I'm getting the following error:

Incorrect line ending: found carriage return (\r) without corresponding newline (\n)



Closing the layout and deleting the problematic elements did not help. However, the fix is easy:


  1. Open your layout file. 
  2. Press Ctrl + Shift + F
  3. Save the layout file. 

Hope this saves someone time in the future!

Friday, 9 January 2015

The three key factors in an effective developer desk setup

Setting up your desk for efficient working is a vital step for any software developer, whether working from their home or in an office environment. In this post I set out a few tips on how to make your environment as effective as possible.

Note: This post is slightly different to my usual content, but I've been reading a book just now - Technical Blogging by Antonio Cangiano (responsible for Zen and the Art of Programming and Math-blog) - which stresses the importance of keeping up your pace of blogging when you start out. So while I've been too busy to blog as I've been building a new desk for my developer setup, I realised it formed a great subject for a blog post. I plan on writing a review post on the book (great so far) so look out in the future. 

To my knowledge there is no known ideal setup. There are three key factors you should consider when considering your setup:
  • Cost - what equipment can you buy
  • Space - how much space do you have (not to mention are you in a corner, open space, against a wall...)
  • Hardware requirements - some developers need one laptop, some need multiple machines, some need other devices attached such as mobile phones for app developers. 
As you can see in this post there is a huge development environment setup variety even in a workplace like Google. With that in mind you should focus on the three key factors above. 

When working with cost I recommend prioritising a good chair and desk. You will spend a lot of time (most likely multiple hours per day) so comfort is key. No matter what other equipment you buy, if you aren't comfortable you'll never sit at your desk and work. 

Space is the one you can't really impact. However, a good desk can help you manage your space effectively. You want a clear working area but you want everything close. When worried about space, I find using TeamViewer to remote onto other machines can be a really good space saver. In my desk environment, I like to use only one monitor as I find additional screens distracting; however, I'm usually switching between my windows desktop, a windows laptop and a Macbook Pro (I'm looking at attempting iphone app development in addition to Android now...) so using TeamViewer to control the two laptops works great for me and keeps my desk clear. 


The problem with hardware is that it again impacts cost and space. Cluttering up your desk can lead to loss of comfort and distractions. I suggest where possible, you use remote desktop or something like TeamViewer and store the hardware elsewhere.

A few other things to consider if you are planning a new setup:
  • Remember you'll probably need multiple power sockets!
  • Some speakers are well worth it if you like to listen to music as you work.
  • Can you get rid of a desk phone and use services like Lync or Skype?
  • Can you go paperless, so you don't need space for a printer.
  • If you run your own business remember to keep receipts for all equipment (desk, mouse, keyboard, computers) so you can claim them off your tax submissions.
As always additional ideas are always welcome so please leave a comment below.

Sunday, 4 January 2015

Top 5 free tools to help publish a mobile app

You have created your app, tested it and are happy with your end product. That isn't you done though, you need to make sure you have the right icons, screenshots, feature graphics etc. This last hurdle can be a pain but here's a few free utilities I've found over the years which are a huge help.

GIMP - [FREE] Image creation and manipulation.

GIMP is a great free application for creating and touching up your images. Need to tweak your screenshots, create a feature graphic or an advertisement? GIMP is your tool. It's a great free alternative to Adobe Photoshop.



Syncfusion MetroStudio - [FREE] Icons for your app

Metro Studio comes with over 4000 pre-made icons which you can customize to meet your needs - change the colors, change the size and export them to any format you want. See my Syncfusion MetroStudio tutorial for help in getting started.




Paint - Simple image software

Paint is a great simple tool for quickly cropping images and tweaking screenshots.

Image Resizer for Windows - [FREE] Change the size of your images and icons

You'll notice each app store has different image sizes for feature graphics and screenshots which is another pain when uploading your app to the store. Image Resizer for windows however is a quick and easy tool for resizing your images - simply right click in windows and choose your new dimensions and the tool generates a copy of the file with the new dimensions.


Android Feature Graphic Generator - [FREE] Create quick feature graphics 

This great website allows you to simple enter the text you want in your feature graphic and it will generate a nice feature graphic for you. Tweak the colors, fonts and even add images. A really quick win if you want to get your app uploaded quickly and Google Play now requires you have a feature graphic. 



If you have any other tools you recommend please add a comment and I'll check them out. If you found this post useful subscribe via email using the link at the top of this site.

Covid-19 impact on mobile applications - a quick case study

Amidst everything that's been going on over the last few months, checking on how my apps have been doing has been low down my priorities...