Blog

(Re) Learning how to code in Python with Django – Part 1: Setting up my dev environment

So I’ve decided to come back to writing about my periodic forays into coding, and I wanted to see if I can make some actual progress this time. A good place to start is to share my experience in setting up the environment in my Windows system for developing in Python using Django.

I’ve been doing my (on/off) tinkering with development on Windows Subsystem for Linux (WSL), and I must say that Windows has come a long way from the days where dual booting was required for Linux and Windows to co-exist. While it’s not perfect, WSL certainly makes it much easier to have my development environment in Windows, and I want to share a little bit about how I set this up.

Installing WSL

This entire part is pretty well documented by Microsoft. Still, for completeness, I’ve documented the steps here as well.

First, in Windows 10, search for the “Turn Windows features on or off” function in the Control Panel. This opens up a window and you can check the box next to the folder for “Windows Subsystem for Linux”. Click on “Ok”.

Alternatively, you can use this script from Windows Powershell with Administrator rights:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

This will likely prompt you to reboot your computer so let it reboot.

Once back into Windows, open the Microsoft Store and search for Linux. You can see there will be a few distributions (flavours) of Linux you can select. I chose Ubuntu. Click on the App, then click on Install.

Once installed, it needs to be initialized once, which you can access directly from the Windows Start menu. Just click on the app you installed just like every other app. You only need to do this once. Again, instructions are available on Microsoft Docs, but I will step through this very quickly.

Launching the WSL app of choice will typically open up a terminal (bash). The first thing they will prompt you is to create a Linux user account. Since WSL works entirely separate from Windows, you don’t have to use the same user ID as in Windows, and this can be set as you wish. It will also prompt you for a password twice.

Once done, it would be best to quickly update your WSL, and you do this by keying in the following command:

sudo apt update && sudo apt upgrade

This concludes the setup.

Python and Virtual Environment

One of the things I learnt about Python is that there are many variations in installation. It comes by default in Linux based OSes, like MacOS or Ubuntu, but needs to be separately installed for Windows. And then there are versions, with a lot of people still doing development on Python 2 even though Python 3 is the latest version. It’s worth noting that there are differences in the environment setup for the two, and you can even install BOTH at the same time in one OS. This is why I said there are many variations to the installation.

I searched for quite a number of resources to learn how to set this up, and one of the best articles on this is on the Mozilla Developer Network. You can check it out here.

Since we are using WSL, we will need to set it up there rather than in Windows. It probably already has some version of Python installed, and maybe even more than one. It’s a good idea to check this:

python -V

and

python3 -V

If it is installed, it will display the version. I would recommend at this point to use Python 3 as it’s the latest version.

Next step, is to install pip which is the Python Package Installer.

sudo apt install python3-pip

Now that we have pip installed, it’s time to setup the rest of the environment. Bear in mind the complications I mentioned above on various versions of Python and OSes, so it is recommended to always use a virtual environment setup in developing. Install it by using pip3 like this:

sudo pip3 install virtualenvwrapper

Now you will need to modify the .bashrc file (which sets up the options for bash and can be used to create shortcuts). We do this to complete the installation of virtual environment, allowing you to use this in the folder you are working on. The .bashrc file is typically located in the home folder (/home/username). Since WSL automatically puts you in Windows folders, you can quickly jump to it by using the following:

cd ~

It is not recommended to access and modify Linux files via Windows, so we will use the built in text editor to modify the .bashrc file. Use:

vim .bashrc

This launches Vim in the terminal window. Press the “down” arrow key until you hit the end of the file. Press “i” so that you can insert the text, move to the end of the last line, press “Enter” to create a new line. Then paste the following code with CTRL-V:

#VirtualEnvWrapper
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export VIRTUALENVWRAPPER_VIRTUALENV_ARGS=' -p /usr/bin/python3 '
export PROJECT_HOME=/mnt/c/development
source /usr/local/bin/virtualenvwrapper.sh

Do note that you should replace PROJECT_HOME value to the windows folder where you will be putting your development projects in. In the case above, it is in C:\development.

Using Vim to complete Virtualenv install.

Double check everything, and then press “ESC” to exit the “Insert mode” in Vim. The Insert word will disappear. Then type “:x” to quit Vim. It automatically saves the file.

Now we need to re-initialize .bashrc:

source ~/.bashrc

This loads a bunch of stuff and gets bash ready. Now you can navigate to your working directory (again, I recommend /mnt/c/development/django or something similar) and create a virtual environment (you can name it what you want).

mkvirtualenv my_django_environment

The command automatically creates the virtual environment and activates it. You will be able to notice this the bracketed environment name at the start of the bash prompt (left hand side).

Every time you start working on your development, you should activate the Virtual Environment first. You can practice / note these commands:

  • deactivate — Exit out of the current Python virtual environment
  • workon — List available virtual environments
  • workon name_of_environment — Activate the specified Python virtual environment
  • rmvirtualenv name_of_environment — Remove the specified environment.

Essentially, the two key ones are “workon” and “deactivate”. It is important to always be working on the correct Virtual Environment.

Installing Django

Now that we have setup Python and Virtual Environment, we can proceed to install Django. Do note, we do not install Django without first activating the Virtual Environment.

pip3 install django

That’s it. Now, let’s see if we can start a Django project. In this case, we use new_django_project as the folder where we store project files, and mydjangosite as the project name, but you can change it to anything you want.

mkdir new_django_project
cd new_django_project
django-admin startproject mydjangosite
cd mydjangosite
python3 manage.py runserver

That’s it, now we have setup Python and Django and we are ready to start building something great!

Reflections of a 30+ “Youth”

As I’m nearing my mid 30s, I’m forced to consider that I am perhaps not as young as I would like to think. Sure, I know I’m not old, but I am no longer the inexperienced, green, young upstart trying to figure out my way around life. I’ve read a lot of articles with titles like “Things you should accomplish by 30” etc, and honestly I feel that it’s worth having my own personal reflections on what it means to be in my 30s.

Generation Gap

For the first time in my career, I’m actually feeling a generation gap. I’ve always thought of myself as a newcomer to the working world, but having fresh graduates in the team and trying to relate to them has proven a bit of a challenge. I’m painfully aware of how I am in a different phase of my career and life, and they are all new and a little wet behind the ears when it comes to the working world. It actually caused me to pause and reflect as I was probably just as positive and hopeful once, and I need to occasionally curb my cynical side a little more. Naturally, I tell myself that I’m being “realistic”, but it is also possible that I am just being pessimistic about things.

Expecting a certain level or professionalism may seem like a high expectation, but I have discovered that smart, young talents are usually hungry to learn and grow, if they are given a certain amount of guidance. Most of them seem to appreciate what we are trying to accomplish, but it is also true that many of them have been fed the myth of “landing that dream job”, but don’t seem to have any idea what it is they actually enjoy or what that “dream job” looks like. In these instances, it can be an exercise in futility to motivate them, even if it is just to stay and finish the project so they can discover for themselves whether this is truly what they like or not like.

As much as I hate labels, I must admit that many of them are a little on the soft side, and calling them the strawberry generation is quite apt in my opinion. Undoubtedly, this does not apply to all of them, but when you see so many of them give up the moment things get a little bit challenging, you start to wonder how things would be so much better if they had cultivated just a little bit of grit. It might not be a fair comparison since circumstances were different back when we graduated, but if things are as challenging as claimed in this generation, with most not able to enjoy the same privileges as their parents, then they shouldn’t give up so easily. I’d like to think a lot of things can be considered learning experiences, but this is not a generation of people who will hunker down and push through. Some might, if a lot of time and effort is invested into them first, and it might be a symptom of the lack of trust they have with current establishments.

Inert Stability

Aiming to transition from “young upstart” to “mid career” has been a great motivator because it allows me to have an ever curious, ongoing desire to learn. I do not ever feel that I have arrived, and this has helped me to grow so much over the years. However, I’ve recently realized I have had to, with increasing frequency, remind myself that I have a lot of experience under my belt and to tap into that when necessary. This is especially true as I am building my team, and while there is still a lot to learn, I need to have a stronger mindset of confidence and self assurance in the work that I have done over the past 10 years.

On hindsight, I realized that my initial few years of working was a time when things were quite uncertain, and despite that, I was quite bullish on taking on new challenges as long as I had the appropriate support. This has always scared me a little because I had no experience to rely on, and pushed through with just a hunch and willpower most of the time. Now however, things are different because problems are solved strategically, based on sound advice and experience. Although there are always new challenges, the approach to tackle them seem to stem more from building on past experiences rather than pure speculation and guts.

I have yet to determine whether this is necessarily a good or bad thing, and I think the truth is that being open to both the risky, YOLO-style approach as well as the calm, collected and conservative approach gives me a depth and flexibility in facing and solving new challenges that I never had before.

Overall, it is very rewarding to mentor someone and watch them grow, and the experience, knowledge and expertise gained has been invaluable in helping groom someone else. Replicating yourself has its perks and I can see why many successful people feel the need to coach and mentor others. I’ve had the privilege to be mentored by others as well, and I can truly say it is one of the key things to help a person grow in his/her career.

Humility

I think I’m quite self effacing, but I also know that with a lot of experience comes a certain amount of pride. In the right doses, pride can be a good thing as confidence and knowing who you are and what you can accomplish builds you to face more and future challenges. However, it is also easy to fall too far, thinking that we have done so much, that we sometimes forget that humility is where we learnt and gained those that makes us so proud of. I’m happy to say that I have not done everything myself, but by standing on the shoulders of those who are older, more experienced than I.

Seeing many who are young, energetic, hungry and hopeful, helps me realize that I cannot rest on my laurels and become a cynical old man (as many “more experienced colleagues” I’ve had are wont to be). I was once like them, and while I might not be in the same position as them now, I remind myself to always retain that drive and persistence. I have never looked down on those who are young, but I do pity those who seem to waste those youthful times. It is a time of opportunities and unlimited potential, and what I wouldn’t give to retain what I know now, turn back time, and do it all over again.

So I have to stay humble, as it is with having these young ones around that I can learn those lessons again, be reminded again, and keep that youthful enthusiasm going. The moment I find myself looking down at a whole generation for being young is when I know I have lost my own edge.

Conclusion

I know I’m not as young anymore, but that is just relative. I am naturally still much younger than many others, with a long journey still ahead of me in my career and in life. Growing and maturing is one of my key tenets in life, and I never want to stop doing that. It’s definitely the easiest to keep it up by framing your thoughts and identity as being “young”, because then you will never feel the need to stop learning.

In the meantime, I’ll just enjoy the fact that I’m doing decently in my career, while still young enough to be gaming, and thoroughly loving it.

Now, if only my wife could see it the same way…

Challenges and benefits of setting up your home network

In an effort to make my home a more comfortable and enjoyable place, I’ve endeavoured to make the best of technology. I’ve previously posted about setting up my home network, and the experience was enlightening, but at the same time disappointing, as I realized that the current home solutions don’t quite work as well together as I would have liked.

LAN issues

Firstly, despite trying my best to plan out the entire network, it is not possible to plan for every contingency. Unfortunately, one of my LAN connections had issues which can only be attributed to a problem during the cabling. Now that everything is nicely hidden, it is simply not possible to replace / repair it without major hacking and rework… all for just one piece of wire.

The sad part is that this end point was exactly where my desktop is located, and so the most important piece of hardware that requires a LAN connection ended up without, which was truly frustrating for me.

Thankfully, my multiple wireless access points approach worked well, and I simply connected my desktop to my 5G network by getting a USB Wireless Access dongle (because desktops don’t come with that built in usually). I ended up with at least a solid Wireless AC connection for my desktop. Since my UniFi Wireless Access Point sat just outside the door, the results were more than satisfactory.

Having too many devices

I started adding more and more devices to my network, starting with my new Samsung Smart TV. Smart TVs are advanced enough now that they have built in software that covers Netflix, DLNA playback and even a web browser. However, after using it for a while, I discovered that the built in options were less than ideal as I had problem streaming some videos that don’t support mobile browsers. The thing that did work well was Plex streaming, but that required me to keep the Plex server running (and in my case it was my desktop which is not exactly power efficient).

I also had my Mio TV Set Top Box courtesy of Singtel, and it had to be connected directly to me router as there were special settings for IPTV to work. Thankfully, my router came with those settings built in, and I had to use up one of the LAN ports for my router.

I also added a few CCTV cameras, but because I wanted to record what was captured, had to get a device to store what was streamed.

I still have a PS3 in my TV console.

To make it easier to stream stuff, I decided I needed a laptop as a central hub connected via HDMI to my TV.

Despite having 8 LAN ports on my router, I was already maxed out. I had:

  1. One used to connect to my second Wireless Access Point
  2. One reserved for my phone (router settings – can’t be changed if I have #3)
  3. One connecting to Mio TV in the living room
  4. One connecting directly to my living room TV
  5. One connecting to my master bedroom TV
  6. One for my CCTV recording device
  7. One for my PS3
  8. One for my Laptop hidden in the TV console

I had to get a network switch to alleviate the issue of too many cables running from my TV console to router, and free up a few of the LAN ports at my router to make room for future expansions. I haven’t even factored in the LAN points around the house, and some are currently not connected to the router, which is fine for now since it’s not used. I managed to find a TP Link 8-port switch for $35 from Amazon Prime Now, which I think is a pretty good deal, but they, sadly, no longer sell them.

One System to Rule Them All

In my setup, I was trying to make the living room TV the focal point. Whether it was games, watching a show, accessing CCTV footage, all of them required a system to manage, and so the best way to do everything was to have an actual computer connected directly to the TV. Thankfully my company gave me an old laptop, so I set it up as the system in the TV console that could do everything, from streaming dramas and movies to gaming.

Of course, the system was not really powerful and was more so not built for gaming, but thanks to Steam Home Streaming, I could run games from my desktop to the TV, allowing me access to my entire catalogue of Steam games at my TV. Suddenly, I could enjoy many of the X-box to PC releases, and Steam even allowed me to connect a PS4 controller directly, making it a perfect setup! Games like Final Fantasy 7/8, Tomb Raider, Broken Age, Lego Marvel Super Heroes, and the Bioshock series, all played on my couch!

What’s Next

I really wanted my place to have an awesome system to enjoy both solo and with others, and as a gamer, it is obviously exciting for me to be able to build it!

Building a small form factor PC is what I’m looking forward to next to enhance my current setup. Replacing the laptop with a powerful system that runs a GeForce 1080 TI would make the setup VR ready! Plus, 4K resolutions for games and movies are would be no problem!

And then there’s the NAS drive to keep data available on the network. It would lessen the need for my wife to worry about space for her photos and videos.

But until then, at least I know that the time and resources invested into setting up my current network and systems have been worth it. If nothing else, I’m enjoying this aspect of making my house a better home.

Python with Django pointers – Part 2: Apps, MVC(T) and Models

Django Apps

A Django project is typically formed from several Apps, each pertaining to a certain function within a website. Usually, I would expect to create one App for say, site updates and announcements, another App for commercial transactions with a shopping cart and checkout functions, yet another App for a forum etc.

Django comes with a built in Admin Site App, allowing trusted site administrators to quickly create, edit, delete and otherwise manage content. This is considered a common function that is required for just about ANY website, and covers things like management and authentication of users, display and management of forms, input validation, and translating all that into SQL statements for updates into the database. Having this by default really saves a lot of hassle when building a website and is a key feature available in the Django Framework.

Overall, since Apps can be made up of other Apps, it is easy to take a top down approach in designing the overall website functions, as breaking them down into Apps (or smaller Apps within an App) would make it much easier to architect the entire system. The team can then focus on individual Apps which will generate the functionalities required.

Key things for Apps:

  1. Use “python manage.py startapp name_of_app”
  2. Edit “settings.py” at the INSTALLED_APPS line with name_of_app.apps.Name_of_appConfig

Every App typically embodies the MVC structure which is what makes Apps so powerful because it is “self-sufficient” and can thus be replicated and utilized in different projects, with some minor tweaks done to the settings.

The MVC Structure

One of the coolest things about frameworks, is the ability to manage data separately from the logical layer, as well as the presentation layer. The MVC structure really makes things easier as you can split the management of all three layers making it cleaner and faster to make changes.

Edit: I previously stopped at describing Django as using the MVC concept above, but would like to correct it by saying that in there is a difference from a typical MVC structure as opposed to Django’s MVT structure. I think this explains the concept a lot better!

Models

Models are the foundation for data that drives your website. Every piece of dynamic data has to be defined in a model and stored in the database. Being able to manage how data is structured is quite typical in a framework, and Django does this very well by providing migration functions. Changes to the database level structure can be affected by using the “check”, “makemigrations” and “migrate” commands. This ensures consistency while developing where you can choose to update a column of a table for example by simply running these commands.

Of course, Django’s models can also have additional attributes which is on top of the database layer, making them extremely flexible.

Recap

So just a few key things for me:

  1. In models.py of an app, use following syntax
    class Name(models.Model):
    field = models.TypeField()
  2. Add this to Model Class to display human readable objects in models
    def __str__(self):
    return self.field
  3. To add a model to Django Admin, in admin.py, use following syntax
    from .models import Modelname
    admin.site.register(Modelname)
  4. For date, time and numbers data types (non-string), to allow blank fields, use
    field = models.TypeField(blank=True, null=True)

Having a growth mindset

I've been thinking recently about how I haven't been progressing as much as I would have liked to these past few years. Part of it could simply be attributed to the fact that I've had a pretty eventful few years getting hitched, getting my own place etc. However, a conversation today triggered my memory of how I told myself I would keep growing and keep improving, and I need to make sure I get all the help I can get to do that.

One of the key factors for growth (and I mean the kind of growth that includes the expansion and maturity of your mind and soul) to me, is actually what you constantly feed your mind with. This is one of the reasons I love reading. It expands your thinking and mind, and encourages new ideas, new perspectives. I love it so much, that I quite often hear complaints from the wife that I'm too engrossed in reading, and "neglecting" her (and I assure you I have absolutely no intention of doing so).

The challenge with reading, though, is that once you reach the end of the article / book / text, you are usually stuck with the "what now?" question. For example, block chain is the newest topic that's hot everywhere, and reading up about it is really interesting and insightful, but after you have read and understood it (at least a bit more than before you read it), what do you do now?

To me, I always reflect on how this can impact me. In the case of block chain, the obvious answer to "what now", is "so should I start investing in Bitcoin / Etherium?" Coming to this point is something that I can definitely do fairly consistently, but it's the next step that stumps me quite often.

You see, I have done a lot of introspection, and knowing myself, I always need to talk to someone about these new ideas, and gain further perspective on how / why we can consider pursuing them further. The problem, however, is that you can only have those levels of sharing with someone who has the same level of interests or thinking as you do, and that requires you to have a group of forward thinking, worldview challenging, and matured people around you, consistently interacting and influencing you. It's very true that you should choose who you hang out with because they will either challenge you to grow, or cause you to stagnate in your thinking.

In a way, I seek assurance in any new venture by bouncing my ideas off of others, and it is therefore crucial and essential for me, as a person, to always have people to talk to who can elevate my thinking and perspectives. I need mentors in my life to be able to help me grow in many areas. It is this understanding of myself that leads me to feel fairly frustrated at this point because I feel I don't really have many people like that in my life now, and it is not for the lack of trying.

Just to clarify, I'm not talking about getting someone to tell me step by step what to do, but in any kind of mentoring or discipleship, a lot is imparted simply in the constant interaction because the reinforcement of new ideas happens then. For me personally, I need a certain level of reinforcement to induce an action on my part – again because I understand myself not to be someone who can throw myself into something just like that. A lot of thought needs to go into it first.

So now comes the most difficult part: Actually finding the right people with the mindset and thinking who can, and more importantly, are willing, to build that relationship and connection. It might sound a little selfish, but I'd really like to be able to find someone to encourage me and help me grow. All I can say is that on my part, I think I can also help others grow and sharpen their minds and thinking as well, assuming we can find that common ground.

It would be an investment of time and effort from both sides, but I do believe it is well worth it, if growth is a priority.

Python and Django pointers – Part 1: Using Virtualenv and Context Syntax

So I’ve decided to try (again) to learn how to code a full Web Application in Python using Django as the framework.

The number of false starts in my endeavour is enough to make me discouraged, but I just can’t totally let it go and I seem to keep coming back to it. Somehow, the desire to actually build something is still there, and I’m just hoping that this time I get somewhere. I’m blogging this experience in part to keep myself in check, and to also document some of my learnings so that I can always come back to it.

I would’ve loved to be coding on a MacBook, but I don’t have one and until I reach a stage where it would be more productive for me to get one, it would make more sense for me to continue using the existing Windows based laptops I have.

First, a few things I’ve (re)learned:

  1. Use pip to install virtualenv in Windows Subsystem for Linux (WSL or Windows Bash). Using Virtual Environment to manage Python Environments and versions are essential to making sure your development environment is consistent. It should essentially be part of your workflow.
  2. Context syntax for multiple variables is as follows: { ‘var_name’: ‘value’, ‘var_name2’: var}
  3. Context syntax for dictionary is as follows: {‘dictionary_name’: {‘var_name’: ‘value’}}
  4. Use “django.shortcuts import render” and then “return render(request, ‘template.html’, {‘context’: bar})”

Ok that’s about as far as I got. Considering it’s only a few hours in, with so much more to go, I really needed to put this down so I can make sure I keep going. At least it’s a start.

Next step is Apps and Migrations within a Project.

Setting up my home network

One of the cool things about doing up your new place, is the opportunity to plan out how you would like your home to be. This applies to the look and feel, but I think also the functionality that you can get out of it. When we purchased our place, I wanted to also try and fix some of the prevailing problems I’ve had ever since I started renting my first room – namely how to minimize running wires around the place. I decided to seriously explore how to go about setting up a home network.

The first thing I did was to think about what I actually needed. I definitely wanted to wire up my desktop directly to my router to minimize latency. I also wanted to make sure I could access the internet anywhere around the house as it was a persistent problem at my previous place. To address these main points, and future proof the house, I decided to try and setup structured cabling at my new place.

Image from Singtel Website
Image from: http://info.singtel.com/personal/internet/broadband-at-home/fibre-broadband-installation/

When I was planning all these out, I tried to find some references or research others with similar experience in Singapore. Most resources online seem to cater more for large houses, or for locals, BTO units which come with structured cabling already more or less setup. I struggled to find points of references for my HDB resale flat. Here are a few things I learned from my experience which will hopefully help others exploring the same path.

The hub

The first thing was deciding on where to place the “hub” or heart of the network. This will be the place where the main router would be setup in the home, and would be where most of the network points end up. A good setup would be something similar to an office network.

I decided on placing my hub near my TV console, keeping the main router exposed for WIFI coverage, but hiding most of the other devices (ONT, switches, power sockets etc) in the built in cabinet. Once this was decided, I had basically decided the “end” point of all my cables to be laid.

Cabling

Image from: http://premiumwires.blogspot.sg/2016/07/cat5e-vs-cat6-vs-cat6e-vs-cat6a-vs-cat7.html
Image from: http://premiumwires.blogspot.sg/2016/07/cat5e-vs-cat6-vs-cat6e-vs-cat6a-vs-cat7.html

Next is the simple part which you can work with your contractors on: cabling. Most contractors at the bare minimum have Cat6 cables, and although there are even Cat7 cables now, it is not worth the price as the additional isolation for a Cat7 cable isn’t really relevant for home use.

Most contractors charge cables by the number of termination points, rather than by foot run, and as mentioned, the cool thing about doing up your house is you can choose how to conceal and run the cables. In my case, everything is largely nice and hidden, so I only see the RJ45 sockets on my wall.

Termination points

Choosing where and how many points to get depends largely on your needs. You have to look at your layout and determine where the points will be in each room depending on your needs. It is best to have as many points as you can afford, but in my case, I opted for just one point in each room.

There are two end points for each cable, and you will plan for the end points from each room, but the other end should be right at the hub. My contractor initially had RJ45 female points for each of the rooms, and gave me male points at the other end, which I was not too happy about.

While it is definitely “easier” to just plug all the male points into the router / switch, the fact remains that I have that moving cable running through the house concealed, and if that moving part were to spoil (unlikely I know but I didn’t want to take the chance) I could not re-run the wire unless I was to hack the concealed ceiling and replace it.

I made some noise and they eventually replaced the male points with a wall mounted RJ45 female plate which housed 4 points each. This was fixed to the wall, making the chance of each point failing due to cable movements much lower. I just needed to get a regular Cat6 patch cable to connect each of the points to my router, and I was set!

WIFI considerations

Another key thing to think about your setup is the kind of devices you will be using in your home. If you have more devices that will be connected by WIFI, and they are spread out in the house, then you will need to cater for them.

In a city like Singapore, it is unfortunate that your WIFI signal will get constant interference from other WIFI devices. Due to how saturated the WIFI signals are, it seems that there will always be “dead spots” in the house with a standard WIFI router. Of course, you could opt for a wireless mesh network solution like EeroOrbi or if you can get a parallel import, Google Wifi, but that doesn’t help to reduce the traffic.

Instead, I would highly recommend you get an additional access point (unless you are staying in a studio sized unit). Every WIFI device will then connect to your network via the access point(s), preserving the bandwidth of communicating between your main router and the access point. I did this by running an additional data point to the ceiling where I wanted to place my other access point.

Router selection

The new routers from most service providers are pretty good, although they lack the flexibility and configuration options that some power users might need. Still, as long as you are just intending to have a decent connection and are not looking to setup a VPN, remote file server etc just stick with the router provided. I use Singtel and the new wireless AC router works just fine.

A key thing note is the number of ports you might need for your cables. Most routers come with up to 4 ports, and if one of them is used for your secondary Wireless Access Point (WAP), then you are left with only 3 which you could use to connect to the other rooms in your unit. If you also want to connect your TV / Game Console / NAS / HTPC via cables, then you would likely need to invest in a switch. This is the main reason you would want to plan out the kind of devices you would like to use.

ASUS routers can be quite expensive, and there is one model that has up to 8 ports (RT-AC88U). Asus routers in general are not too difficult to maintain and there is a lot of support available, but I would say most users would not need to go there unless you have a specific need for your network.

You can also explore Ubiquiti products, which is very powerful, scalable and provides the most options, but it is pricey and typically meant for business / commercial use, so it may not be worth it for home use. That said, they do have a powerful WAP that is affordable and can save you the hassle of an additional power socket, because they make use of Power Over Ethernet (POE) which allows your data cable to also power the WAP. I personally went for the Unifi AP AC Lite which came with POE adapter which makes the WAP positioning much cleaner.

Summary

Overall, while I am not the most network savvy person, I am quite happy with how my network is now setup and can kiss goodbye to cables running across my house. Having most devices hooked up by cables ensures that I do not get as much signal interference, and gives you more options to expand your network usage. As we are moving towards the age of the Internet of Things, having a better connection at home would be very helpful as more and more smart devices can be effortlessly connected to your network.

If you ever want to make your home somewhat smarter, and you have the opportunity to do up your place, then consider the points that I listed above. Or, drop a comment below with your questions and I will see if I can help.

Integration of the Web

Image by OSTI {http://www.osti.gov}
Image by OSTI {http://www.osti.gov}

If you are like me, you would be sick of having to sign up with an email, username and password for every new web service that you would like to consume. It’s also a pain because almost all of these services require a verification of your email as part of the process. I am thankful that more and more services are adopting single sign on, allowing you to sign up for their services using either your Twitter, Google or Facebook accounts. By doing so, it really saves me the hassle of that whole process since I’m likely to be already signed on to some/all of these accounts. You just click Sign in with Google, authorize the web service, and voila, you have just established a link between Twitter, Google or Facebook to this web service.

Welcome to the integration of the Web!

Historical context

The Web has evolved from being a huge encyclopedia of information, to now a medium for services to be delivered to every corner of the world. What used to display only static webpages, now delivers fully interactive applications allowing everyone to communicate, attend classes, conduct financial transactions, organize and host meetings, and provide interactive entertainment and more. With the smartphone, this has extended even further, transforming it into your personal trainer, navigator, organizer, and informer, anywhere, anytime. We call this new marketplace of services “the cloud”, where we can consume web provided services such as email and office productivity suites, all with just a web browser.

Image by prn.fm {http://www.prn.fm}
Image by prn.fm {http://www.prn.fm}
It is inevitable that the cloud, with all the services available to anyone and everyone, would touch many areas of our lives. This diverse ecosystem raises an interesting conundrum: how do we manage all of them in our online interactions and transactions? I believe that as the market is made more diverse and complex, we will eventually need to reduce the complexity of having so many different services by collapsing into a few focal points in the ecosystem, simplifying and unifying where possible. Right now, that appears to be the likes of Twitter, Google and Facebook.

Expanding the idea
The integration is not just limited to logins. Web services enhance their capabilities by integrating with other web services. For example, my very first encounter with web service integration was when I connected my Twitter account with Facebook, allowing me to update both simultaneously by posting on Twitter. This essentially reduced my maintenance and usage of two different web services to one.

Image by AVLView {http://www.avlview.com}
Image by AVLView {http://www.avlview.com}
How this is done, is through what we call Application Program Interfaces (APIs). Both Twitter and Facebook have built external facing “hooks”, which any developer can make use of to leverage its services, and it is in the web services best interest to build these as it further ties down users onto their platform. By opening and allowing everyone to easily post and “like” things Facebook ensures it does not go the way of MySpace and Friendster. After all, if the service is already so entrenched into your life, it is unlikely you will ever think of migrating to another platform.

APIs really make the web much easier to manage and navigate as it brings together web services to make them work better and more efficiently. There are even services like IFTTT that serve mainly to do this.

Conclusion

As I type this, I get excited about the prospects of the future. As more web services hit the web, they are going to be tied and integrated to some other services we are using, making the web seem like it is evolving and expanding features rather than trying to get you to go with “new” stuff. We would start seeing new services as adjustments of usage rather than whole new adoptions, and it makes the learning curve less steep. I look forward to all the cool new stuff that 2015 and beyond will bring to make our web experience that much sweeter.

Taming the Mammoth

Taming the Mammoth

This article really struck a chord with me. To quote the article, we all have “an irrational and unproductive obsession with what other people think of us.” Especially in Asian culture, inclusiveness and minding what others think dominate so much of what we do. It’s a really good article and I’m not going to repeat it here. You should go read it. You should read it, now.

Plus, the cartoons are cute!

Selling that pen

sell-me-this-penIn my role as a pre-sales consultant, I’m always on the lookout for ways to improve my skills and myself. Reading this article has been enlightening, allowing me think objectively about how I can improve the way I work. The points mentioned in this article really resonate with my experience and interaction with customers, and while I may not be a true salesman (thank God), they are fundamental to any sales interaction.

The article urges us to cover these four points in our sales interactions:
1) Gather information
2) Respond to information
3) Deliver information (building on the response)
4) Ask for a response (close)

These four points are steps or techniques that tell the listener that you are not only listening to them, but can help them identify and address needs that they have (even if they might not know it at the start). It jives with my personal belief that selling is more about meeting needs and showing value where people can benefit, rather than just hitting numbers.

To a significant degree, I still grapple with this delicate balance of addressing needs and achieving targets. While I enjoy the interaction, mobility and flexibility that a sales role provides, I still struggle to be fully comfortable with selling. Perhaps it is because of my own experiences with salesmen that my perception of sales is fundamentally skewed to the negative. Having seen this, this and this among many other sources and articles I’ve read over the years, I find it hard to think of the smooth talker who is motivated mainly by numbers, as someone who is making the world a better place, and bringing value to others.

I think it boils down a lot to our internal motivation. To me, I am personally motivated to see needs identified and addressed, which often leads to closure of sales. This is my preferred method of selling, and I would rather underachieve and do a good job meeting needs than to hit my numbers but compromise on my beliefs. I am very uncomfortable misleading (not necessarily lying) customers with the sole intention of closing a deal while knowing that what I am selling is unlikely to meet their needs. I know that others would probably have much less scruples, and the internal motivation of wanting to achieve their numbers might drive them to mislead, and even lie, to do so. It is this attitude that I find most repugnant, and the prime reason I can never be totally at ease in my role.

MBTI3I’ve written a little about personality types before, and based on mine, I have a strong value system, living according to what I feel is right. To me, FEELING RIGHT is very important, and I find it difficult to compromise on my ideals. This might explain why I don’t have an easy time reconciling the “grey areas” of selling where I am unsure if I am pure in my intentions. I have high expectations of myself, and if I cannot be sure that my internal moral compass is correctly aligned, I would not be at peace with myself and my actions.

Reading articles like this makes me wonder if the “problem” lies with me. Naturally, I don’t think I’m cut out for a full sales role, at least not from a temperament / personality perspective. However, I must admit being able to earn a good commission is exciting and can be a good motivator, at least for a period. Thus far, I find my situation tolerable, although things may not be the same in a more challenging market. For now, I’m still going to try to sell that pen the best way I know how, and make sure I help others know that I can help them.

That’s the kind of sales I want to do.