SFTP: Transferring files like a pro!

When I discussed setting up your own VPN server, we had an issue how to transfer client files from the cloud server to the client. If you are using local physical server, it is not a problem to just use USB drive and copy files there. However, you do not get this possibility, when you have no idea where your physical server might even be.

Sending such confidential document with email is not good idea, as email is not really secure way of sharing data. Hillary Clinton learned it hard way. FTP is even worse idea than email, as password to your FTP account is sent in plain text, so are the files. You can set up HTTP server, get a free SSL certificate from Let’s Encrypt and create a secure download page for your files. That is secure enough, but would not that be an overkill? For you, preparing that, and for your (possibly) tiny VPN server where you need to set up another role of web server?

Given all that, have you not dreamt of a protocol that will allow you to easily send files, as easily as FTP but with better security layer? If you have, you do not have to any more! Such technology exists! It is called SFTP.

“S” in SFTP does not stand for “secure” actually, but for “SSH”. SSH means “secure shell”. SSH was designed to provide secure access to remote servers running Unix-like systems. It uses strong encryption providing sufficient level of security. SFTP is pretty much FTP over SSH protocol. The simplicity of use known from FTP is enhanced with the security layer provided by SSH.

How to install SFTP server?

Many Linux-based servers already have SFTP server installed. However, if this is not the case, launch terminal and install openssh-sftp-client (name might slightly differ per distributino) using your favourite package manager. As soon as the package installs, you are good to go!

Setting up SFTP server on Windows is a bit more complicated, but was nicely presented in this article.

How to access my files?

You need to login to the SFTP server. On a Unix-like system or Linux shell available via Windows Subsystem for Linux, open terminal, navigate to the folder where you want to download files, or from which you want to upload files to the server. Then type in:
sftp username@serveraddress.com

Replace “username” with your username on that server and “serveraddress.com” with the address of the server. If connection is successful, you will be prompted for password. When connecting to the server for the first time, you will be also asked to verify the server fingerprint. This way your client enforces mechanism to prevent you from connecting to fake SFTP servers.

If connection and authentication succeeded, you should log in to a kind of a shell and be able to type commands. Commands do not differ much from regular bash commands. In the table below, you can find most important:

Command Meaning
cd change directory
ls list files
pwd print (i.e. display) working directory
put filename send file “filename” from the local computer to the server
get filename download “filename” file from the server to the current directory on your local computer
bye end SFTP session

As you can see, console interface is pretty straightforward, but you can look around for plenty of GUI applications. From those, I highly recommend SFTP plugin for Total Commander (also works well with open source Double Commander).

I wish you happy getting and putting!

Featured image from: https://davidpapp.com/wp-content/uploads/2011/01/transfer-files-to-new-computer.jpg

My First VPN: Own private network over public web, easily!

Why would I need it?

Most of you probably heard of VPN in some way. Maybe as a way to enter your corporate or academic network, while being in your bed at home or on the other side of the world. Or maybe as a way to enjoy content blocked in your home country due to legal restrictions.

So what actually VPN stands for? It is an abbreviation from Virtual Private Network. So this is a virtual local network, with limited access and encrypted connections, on the top of the public web. This should explain why you might be interested in VPN even when you do not need to bypass geographic blockades. VPN has three characteristics:

  1. All devices connected to VPN are not accessible from external web by default, but they are accessible from within the virtual network.
  2. All devices connected to VPN consider themselves part of a local network, even if they are physically far apart. This way, you can easily share resources between the devices, add them to workgroups, Active Directory etc.
  3. VPN connections are entirely encrypted. Only devices connected to the network are able to decrypt the network packets sent over VPN. This makes it easy, robust and secure way to allow external access to your private resources.

The abovementioned features should give the one more important reason why it is good to use VPN: improving your privacy. If you are connected to free WiFi at the airport, McDonald’s or even Starbucks, your connection is most of the time unencrypted. This means the individuals in charge of the hotspot are able to track data from your computer.

Current enforcement of SSL on the websites and email makes it harder to read packets you are sending from and receiving to your device, you are not hiding e.g. which websites or online services you are accessing. This might be enough to identify you and, combined with some unencrypted information your devices still send online, track your online activity.

What is the advantage of having my own, compared to generally available free or paid services?

Shortly speaking, improved privacy because of improved control. By signing up to the generally available VPN services you hide your activity from providers of your internet hotspot, but it can be still registered by no one else than… yes, your VPN provider. Why not become your own provider then?

Apart from that, your own VPN network gives you freedom to set up your own DNS servers and connecting as many devices as you wish, while commercial services often force you to use DNS servers they provide (so they can better track your activity, sell data to marketing companies and deliver you customised advertising, for instance) or put limit on amount of devices you can connect simultaneously to a single network. It is not uncommon that number of devices allowed to connect simultaneously is as low as… 1.

However, if you need VPN to change your identity, especially with regards to location, and you want to be able to switch between multiple locations, commercial VPN services are a way to go.

So I want to improve my privacy! How do I start building my own VPN?

First of all, you need a VPN server. Pretty much every device capable of running Linux can do, like your old computer, Raspberry Pi or just a virtual server from your hosting provider. No excessive computational power or memory is needed. If you are going to buy hosting services only to run your VPN, go for the cheapest offer that allows you to run at least Linux container, if not the whole Linux virtual machine. The only important thing is bandwidth. Depending on how you plan to use your private network, you might need to adjust your internet or hosting plan accordingly.

Furthermore, if you have never used Amazon Web Service, take note they offer first year for free! Unfortunately, Amazon is not a sponsor of this post.

If you are planning to use your own device and connect it to the network, remember to check whether your network has public IP address. You also need to adjust port forwarding on your router and/or firewall. 1194 is the default port for OpenVPN we will be using in this tutorial. Dynamic DNS has to be applied, if you do not have a static IP address. I will cover all these in other articles. Right now, if this whole paragraph sounds overwhelming to you, you would be better off finding a cloud service that will offer you a possibility to set up your own VPN server.

You said something about Linux… Which distro?

If you read Quora, you many answers to this questions are similar to “For the love of god don’t begin with Arch”.

Actually, the tutorial below is recommended for Debian, Ubuntu, CentOS and their derivatives. Users of these distributions can benefit from the very good script (with slightly less good instruction) provided by nyr on GitHub.

Let us do it then!

So you have your server ready? Launch terminal and download the script by typing:
wget https://git.io/vpn -O openvpn-install.sh

Once download has finished, you need to launch it as root or with elevated priviliges (that is using sudo command):
bash openvpn-install.sh

If you are not logged in as root and you have sudo installed an configured, just add sudo at the beginning of the above command. You might be asked for your user password.

If you do not have sudo available on your system, you need to switch to root first. You can do that by first executing su - and then typing in your root password. After you successfully switch to root, you might need to navigate to the folder where you downloaded the script before executing the script.

The script will download OpenVPN (the open source VPN server), other necessary packages, install them, generate enryption keys and configure VPN server. The only thing you need to do is to follow instructions on screen.

After that, client file should appear in your home directory. It might also happen it will appear in root home directory (usually /root). With default settings, only one client file can be used simultaneously, so if you need more devices to access the your virtual network at the same time, run the script again and you should be able to easily add new clients.

If you need to revoke a client, for example when one of your client files leaked to the unauthorised person, you can also easily do that by executing again the script.

Client files need to be securely transferred to client devices. Securely means it is not a good idea to send them with email or share using file sharing services. You should consider saving them on memory card or USB stick, if possible, or using sftp when setting your VPN server in the cloud. Before using sftp, you might need to install it using your favourite package manager.

I have downloaded client files. How do I configure my clients?

You need to install OpenVPN client on your client devices. There is an official client for Windows you can get from here. Macs are a bit more troublesome and you might need external tool like Tunnelblick.

You are lucky if you want to set up your network to work with Android or iOS devices. They both have official OpenVPN client you can download from your store with applications. Search for OpenVPN Connect published by OpenVPN (Android edition) or OpenVPN Technologies (iOS edition).

Once you install the client, you need to import your client file, the one you downloaded from your server. On Windows, you should be good to go just by double-clicking on the client file each time you want to connect to the network.

Remember about disconnecting!

If you want to use your local resources, like WiFi printers, or you just do not need VPN connection at certain moment, remeber to disconnect from VPN! Just tap “Disconnect” in your mobile OpenVPN app, click “Disconnect” in the context menu after right-clicking OpenVPN icon in the system tray on Windows. You should be able to disconnect from your network on a Mac, when using Tunnelblick, in a similar manner to Windows.

Congratulations on your improved comfort and privacy! If you want to learn more about how OpenVPN works, what range of different configuration options it gives you and what nyr’s script actually does, check out this great Hak5 video!

In general, Hak5 is great channel to learn about online technologies and their applications. I highly recommend it to you! And no, this blog has no sponsoring so far.

Featured image of a cat acting as a privacy filter acquired from https://img.haikudeck.com/mi/1f4c77323ac9161c0fc01d5896d3f7fa.jpeg

Let us start with GIT!

source: https://twodifferentgirls.files.wordpress.com/2013/11/mlwo999.jpg

You are working on your “once-in-a-lifetime idea™”. You wrote a lot of code. Your concept changed slightly though and you decided to rewrite huge parts of it. Then it turned out bad idea. You want to revert to what you had before.

“Oh no, I have not saved the last working version!”, you thought, “I would like to have it saved, but copying my files all over again and again… It takes so much time and I want/need to ship ASAP!”

There is someone in this world, who eradicated all your excuses for not having control version system and making regular backups. Meet The Right Honourable Grand Master Of The Linux Kernel, Linus Torvalds!

Linus Torvalds during TED Vancouver 2017 (source: linux.com)

Linus created GIT. Linus also created Linux. As Linux kernel grew over decades, due to contribution from multiple institutional and individual contributors, handling this input and deciding which code should be accepted and which not became very tiresome job for Linus. This is why Linus decided to shake the world once again with GIT. Even if huge project, such as Linux kernel, was an inspiration for GIT, this tool is useful for any size and kind of projects. Even your learning one!

You can download GIT from here, but most of the time it will be included in your Linux distribution. If you are using Windows, it is also available via “Bash on Ubuntu on Windows”, so you might not need to download separate GIT for Windows installer.

It is also good to know github.com. Create an account there and receive unlimited online storage for your code. Free, if you want to keep your code public. If you work on a project where you prefer not to share your code, consider paid account or just stick to local GIT repository, that is when following the guide below, do not go further than step 5.

Once you create your account, you need to create the project from your GitHub panel. After that, you are good to set up synchronisation with your local GIT setup.

Launch your terminal window and let me introduce you some commands by giving you this short quick start guide:

  1. Before you start commiting, let GIT know who you are! This way, you also share this information with other contributors of your project. It is quite useful for collaboration, when you need to figure out who wrote each line of code.

    git config --global user.name "My Name"
    git config --global user.email "user@domain.com"

  2. Initialise GIT in your project folder, i.e. create new local git repository: git init
  3. Add your project files to the folder in which you initialised GIT. If you do not have any project files yet, wait with the next steps until you have some.
  4. Add all your project files in the current folder to your repository. Let GIT watch them, so you do not have to:
    git add .

    Note there is a dot after “git add”!

  5. Commit your current version of project to GIT:

    git commit -m 'put some note here'

  6. Add remote repository to your project (i.e. GitHub in this case):

    git remote add origin https://github.com//.git

    The step above might require you signing in to GitHub. Follow the instructions displayed in your terminal window.

  7. Push your precious code to the master branch of your external repository (I will skip discussing branches for now):

    git push -u origin master

Yay, you made it! Now you see, all you need to know about GIT can be wrapped up with this picture:

source: https://xkcd.com/1597/

Now, remember these commands and remember to use them!

If you are curious about restoring previous versions and branching, see multiple additional resources about GIT, like this.

If you are seeking how to revert your commits, i.e. Reverting to the previous version of your code, this article explains it in much detail.

Now you can start enjoying your more beautiful coding world again!

Thank you, Linus!

Featured image from: https://twodifferentgirls.files.wordpress.com/2013/11/mlwo999.jpg

Got the job! How did it happen?

So after 5 weeks of search, I got the job!!!111oneoneone

I guess you are waiting to read about how did it all go, so I will give you this pleasure:

I started actively applying for jobs 2 days after my arrival. Before I came to Vancouver though, I worked on my résumé and cover letter to meet local standards. They are slightly different from European ones.

I looked for vacancies everywhere I could, which included LinkedIn, Craigslist, AngelList and good ol’ yellow pages. I used yellow pages to search IT companies nearby, check their websites and I was sending lots of application for all IT related positions and I ended up, during these 5 weeks, with an average of one interview per week. I guess it is a pretty good one.

First interview was complete disaster. A start-up seemed understand too little what web development is about. Assignment they gave me did not require any of the skills listed and any of the skills I had. It was purely about ability to use WordPress with their framework. I did it miserably and, obviously, did not get an offer.

Second job seemed much more interesting. It was about IT support and IT tutoring to senior citizens. The only drawback was they required me to have a car, as services are home-delivered. Interview went pretty smooth and I was asked to verify if my current permit allowed me to be a contractor (way they call self-employed people in Canada). On the same day, I checked it with Canadian Border Services Agency and sent an e-mail to the company confirming it is all fine. I have not heard back from that company since then…

Then another company contacted me, with Front-end Developer position, apologising for finding my email in junk, and had a telephone interview with me. Even though it seemed quite good, despite promises to give me response as soon as possible, nothing followed.

Yet another one has contacted me with similar position, but this just failed all the time – connections got broken, they promised to get back to me, but they… obviously did not.

I have visited also employment agencies and left my résumé there. One has reached out to me with a temporary assignment for data-entry job (unrelated to what I was looking for, but still considered it as a way to buy some more time). I passed their typing test with flying colours, but… have not heard from them ever since. I have sent them reminders (as well as to all others that have not reached out to me again), but without much success.

Then it came THE ONE. Position was related to IT support and server administration. I applied on Wednesday, October 11th. They called me for a phone interview on Thursday. I had an on-site interview on Friday, this time with not only HR person, but also head technician. He gave me two technical questions, which I managed to break down as much as I could, yet not being able to deliver complete solution to the second one. At the end of that interview, I was invited for “working interview” which took place on Tuesday. It was a demo assignment in virtual environment, which I had to solve. I could use all the help of internets and the team sitting on neighbouring cubicles working on their actual tasks.

I solved the whole assignment and got on well with the team. Wednesday morning, I was called I am accepted and can start on Thursday. So I did.

Currently I am in 1-week training and 3-month probation period. Wish me best of luck!

Now, time to find a better place to live – I will leave this for another post though!

Featured imaged sourced from: https://www.daysoftheyear.com/wp-content/images/happy-cat-month-1-e1472814679231.jpg

How To Containerise MEAN Stack?

In the previous parts we discussed what we need to start developing our web app in a simple and neat way. Just to remind you, it was all about getting Docker-compatible operating system and installing Docker. Ready? Let us prepare our test environment then, so we can see our work up and running!

You need to remain online for all the steps below!

Mac OS X, Linux and other *nix users might require root priviliges to execute Docker commands. Put sudo in front of each later mentioned commands or switch to root shell using su -, if sudo command is not available on your system.

  1. Create a directory where you will keep your project. In that directory create two subdirectories: frontend and backend. I hope this is pretty straightforward.
  2. Write down or copy to your favourite app for note-taking the path of that directory. We will need it later when creating container.
  3. Create the container with the database engine. The only thing you need is executing the following command:docker run --name myFirstAppDB -d -p 27017:27017 mongo-d parameter is shorthand for --detach. Port 27017 is the default connection port for MongoDB, database engine we use over this tutorial.

Thanks to how Docker works, after this step we do not need to think anything more about the database engine more than ensuring it is on.

  1. Create the container with back-end development environment and bind the “backend” directory to this container. We will need to be able to attach terminal output to that container in order to see errors, logs, etc.
    All you need to achieve all that is also to execute one command:docker run --name myFirstAppBack -v |your back-end folder|:/root/backend/ -it -p 9514:9514 node /bin/bashWe just created the container, attached to its bash terminal (as there is no -d parameter) and we can work from within the container now. There are some operations we need to conduct from there.
  2. Navigate to the /root/backend/ folder by executing commandcd /root/backend/
  3. Implement a small fix for permissions with npm (Node Package Manager). Let npm be set to act as root. You can change this with the following command:npm -g config set user rootParameter -g ensures the setting or installation is performed globally and not in the current directory only.
  4. Let us install Express framework, which we will be using when developing our server. This has to be done with npm, by executing:npm -g install express
  5. We also need the back-end to communicate with the database. For this purpose, MongoDB driver needs to be installed on the top of node.js. Similar to the previous step, we need to execute:npm install mongodbWatch out: no -g parameter this time!
  6. That’s it for now! Exit the container by pressing Ctrl+p+q.

Now it’s time to prepare front-end environment. It will be quite similar to what we have just done.

  1. Create the container with back-end development environment and bind the “frontend” directory to this container. We will need to be able to attach terminal output to that container in order to see errors, logs, etc.
    All you need to achieve all that is also to execute one command:docker run --name myFirstAppFront -v |your front-end folder|:/root/frontend/ -it -p 8080:4200 node /bin/bash
  2. Navigate to /root/frontend/ folder
  3. Again, fix the npm issue:npm -g config set user root
  4. Install Angular framework together with CLI (command-line interface) tools using npm:npm -g install @angular/cli
  5. Initialise project with ng new frontend
  6. You can test your project at any time with ng serve --host
    (parameter --host is necesssary for testing your app from the browser outside Docker container)
  7. Exit the container by pressing Ctrl+p+q.

Networking between containers

As you have maybe noticed, we have three containers that are able to provide all the necessary services for our app. However, we have three separate, isolated environments, but they need to be working together. How this can be achieved?

Docker provides solution for this too!

It is possible to connect our three containers into one bridged virtual network. First, the network needs to be created

docker network create myFirstAppNet

This way we have created the network for our app and called it myFirstAppNet. We still need to connect the containers to that network. For each of the containers we created, we need to execute the following command:

docker network connect myFirstAppNet |container name|

Now, let us note the IP addresses of each container in our new network. They can be found by inspecting each of the container. Look for the section named with the name of our new network at the end of the output of the following command:

docker inspect |container name|

This section contains field “IPAddress”. Value of that field is the IP address of the container to be used when communicating with other containers.

If you cannot see the value in “IPAddress” field, please ensure your container is running and start it if necessary. Write them down. We will need them when putting them in a code.

Congratulations! You have just set up the development environment for your first web app! Now we are just left with writing the code of our app.

Credits for the featured image go to: https://kittybloger.wordpress.com/2012/05/29/cats-love-computers-20-great-pictures/

Containing it all! – What Docker is for?

Docker is an open source tool that became pretty hot in IT world recently. There is a good reason for it – it is a really good tool! In this post, I will explain you what containers are all about and that they are not such dark magic as they seem.

Container is an isolated part of your computer’s resources, where you can run separate environment, like software and services, for your own project.

Sounds complicated still? Let me further break this down with an example.

Imagine you are working on a modern app using the newest available technologies. For this purpose you upgraded all your software, libraries, IDEs and what not to support your new fantastic project. However, you just realised there is still this legacy project you have to keep maintaining for you customer for some period of time. Rewriting this project using new technologies is not feasible for you. Conflicts will arise on your computer once you have two different versions of the same compilers and frameworks. What to do?

Contain it!

We are containing software, not cats!
Source: http://i.pinimg.com/736x/b8/e6/f5/b8e6f54e24379cd890ee0fd93321e7b8.jpg

Instead of installing the frameworks on your computer and try to keep them in order (you would lose much time for that and time is money, right?), create two isolated environments: one with modern frameworks and other with legacy stack. Each time you need to work on one or another, you can easily switch between them with a single command. No need to think about conflicts, separate locations and what not! Sounds good?

Then install Docker Community Edition for your platform from https://store.docker.com!

Now let us check if it works by opening your favourite terminal or command prompt and typing in (keep your computer online!):
docker run hello-world
Note: Root privileges might be required in Linux and Mac OS X environments. If this is the case, put sudo in front of each command, or first execute su - to switch to root user, if sudo command is not installed on your system (case for e.g. Fedora and plain Debian). User password or root password will be required in majority of cases.

You should get hello message back from Docker. Got it? Mission accomplished!

What does the command do?

run implies creating new container, while hello-world is the base image for your container that (in this case) will be pulled from Docker Hub.

Now type in docker ps -a to see the list of all available containers. By removing parameter -a, only currently running containers will be displayed.

You might have noticed your container has been assigned a funny name. Docker does it for you if you do not specify your custom name yourself. More about how this assignment takes place here (an easter egg involved). You can give name to your container yourself, by adding parameter --name |container name goes here| to docker run command.

As we are going to get our server running, it would be preferable to connect to it from outside the container. In order to do this, container’s ports need to be opened with parameter -p |host port|:|container port| added to docker run command.

Since we will be developing our app on the host machine and just testing it within Docker, parameter -v will prove useful. It works as following: -v |host location|:|target location| and allows for sharing given directory between host and container, reducing the need to copy your project each time inside the container for test purposes.

Last but not least, we will need to connect (or “attach”, in the Docker’s language) to our container and execute certain operations from within. You need to imply that when creating the container with adding -it parameter (it enables interactive mode) and adding location of shell binary to the end of the command. Do not worry -it is not as complicated as it seems, but I will get to that in more detail later!

Once interactive mode is enabled, you get attached to the container straightaway (you can prevent that by adding –detach parameter). You can leave the shell within the container by pressing Ctrl+p+q and return to it by executing docker attach |container name|.

Other useful commands are quite straightforward:
docker start |container name|
docker stop |container name|
docker pause |container name|
docker unpause |container name|
docker remove |container name|

These are the basics of Docker. This introduction already gives you enough knowledge to develop your software neatly using the power of containers! In the next post, we will apply this know-how and actually start developing back-end of our app with MongoDB, Express and node.js.

My First MEAN Web App: What MEAN Stack Is About?

“Wait, why do you want my first app to be mean?”

If you have just asked yourself this question, you are in more than right place. This series aims to bring people like you to the world of developing web apps. Congratulations for your first step and keep reading! MEAN app does not have to be actually mean to anyone or anything!

“So what is this mean thing about?”

Okay, let me clarify first things first: MEAN (entirely in capitals) is an acronym of the development stack we are going to use in this project and has little to do with anyone’s personality. I personally do not like mean people, but developing on MEAN stack is quite enjoyable! I hope you will share the enthusiasm with me.

Development stack is, following a definition from chrchm.ag, “nothing more than few pieces of software working together to provide a foundation on which you can build your project”. So what MEAN consists of?

M – MongoDB; modern no-SQL database engine, which our app will use to store its data
E – Express; a framework for node.js (explained later) that allows us to simply manage our web server
A – Angular; another framework for node.js that allows us to manage how our app will be displayed to the user (for more advanced readers, keep in mind we will be using Angular 4)
N – Node.js; engine that allows for JavaScript code to be executed on server side and provides output to the client.

All the mentioned software is free and open-source, so no need to worry about using them for any kind of project.

“Do I need anything else to start developing?”

Well… text editor would be nice to have. I will be personally using Visual Studio Code, multi-platform free and open source editor from Microsoft (yes, I know how awkward it sounds, but it is true), only because I am currently testing it. In the past I was using Notepad++ (on Windows) and gEdit (on Linux). You are actually free to use any of the mentioned ones, as well as vi(m), Emacs, even good ol’ Windows’ Notepad, or whatever else you like.

However, I promised you we will be developing our app in a neat way. For this reason, we will need Docker. Docker is a containerisation engine. It allows to run your apps in the isolated from your everyday environment containers. This way, you do not bloat your current system with resource-consuming software. Containers can be easily added, removed, switched on and off. This way you do not have to worry about doing damage to your everyday environment. It is also much easier to start over again, if you do any damage to your isolated development environment.

Virtual machines provide similar level of protection, but are much more resource-consuming, as they virtualise not only software, but also hardware. Apart from that, configuring them takes much more of your precious time and you would preferably like to develop your web app in no time, right?

There is a case, where you might need a virtual machine. Consult notice below for further information.

Notice for Windows users only:
It is highly advised for you to use Windows 10 Professional, Enterprise or Education for this (or any other) web development project. If you are a student or academic teacher, you should be able to obtain Windows 10 Education for free from your university or Microsoft Imagine (former DreamSpark and MSDN AA) website.

Other desktop or server versions of Windows might work well enough too with few workarounds. They will be described in another post at later time. If you are using the newest Insider Preview of Windows Server, you should be fine without workarounds. If you are unsure about using workarounds, create a virtual machine with Linux distribution of your choice using e.g. VirtualBox instead, or run live Linux environment from an optical disc or USB. Most of major distributions (Ubuntu, Debian, Fedora, Mint, etc.) should be good enough.

“Where do we go from here?”

In the next post, we will build some containers with our development stack using Docker.


Credits for the featured image go to lolworm.com.

Canadian Bureaucracy Part 2 – About SINning for credit and first ride with SkyTrain

In the previous part I discussed the immigration procedure at YVR. Now as I successfully became resident of Canada, time to get all other necessary formalities done. In order to proceed, I started with SINning.

SIN stands for Social Insurance Number and is a 9-digit number, something similar to Social Security Number in the United States. Similar to the U.S., it used to be issued on plastic cards, but Canada moved on and no longer does it this way as they do not want SIN card to be used as a form of (non-photo) ID. SIN should be produced only to the employer, federal offices and banks, as far as I understood during my visit to Service Canada.

To get SIN, I had to go to Service Canada. Canadian Federal Government provides easy way to check out where is your closest one. For me, it was one next to Coquitlam City Hall. I went there next day after my arrival, still fighting jet lag. My uncle gave me a lift (oh, if you don’t know, currently I’m staying at my relatives’ place in Coquitlam) and went inside with me, precisely at 8:30am when they opened. Very nice and cheerful lady at the reception asked how she can help me. I said I need SIN and directed me to counter 5.

Also nice gentleman took my passport and work permit and asked me whether I need SIN for myself, probably seeing I came to the office with my uncle. I responded him positively, and added “my uncle is already a citizen of Canada for 20 years”.

“Don’t worry, you’ll become one soon too!”, the official told me. I found his approach quite surprising.

He was verifying all the information, asking difficult questions (“What’s your date of birth?”), we also had a bit of small talk. He asked me about my plans for future and recommended me postgraduate in Canada instead of England. I told him it is a bit more expensive and got recommended studying in Quebec, which is free or very cheap and I do not even need to speak French (I told him I know zero French), as at Montreal universities they also use English.

So, I got another letter-sized piece of paper with my SIN and confirmation of address, as well as information leaflets on privacy protection and instructions regarding who can request SIN from me (mainly employers, banks, federal government institutions and credit rating agencies). I have also received a welcoming handshake.

When I was done, me and my uncle moved towards exit, when we were approached by the cheerful lady at the reception, asking me “So you got your SIN?”

“Yes, ma’am”, I responded.

“Congratulations!”, she said and gave me another handshake. She seemed so happy and cheerful that, I think, if she could, she would have hugged me.

Since, despite our discussion with the official who issued me SIN, it was still early, we had to wait a bit before second important thing could be arranged, that is a local phone number. We approached BestBuy once it opened as first customers on that day. I did my research on mobile providers in BC, but even though, I ended up with different one than I expected. BestBuy offers all providers and it is possible to easily compare the offers and pick the most suitable one.

Important to mention, unlimited worldwide texting is rather a standard for any mobile plan in Canada. Still didn’t get used to that…

To sign my contract, they needed to verify my credit rating and that meant I had to give consent to, ehm, Equifax to make a check on my credit score. This meant I had to give my SIN to Equifax. Remember, first get SIN, then your SIM card (opposite to alphabetical order). I was lucky to get a number that is easy to remember.

Since now I had access to cellular data and could check public transit, after getting a Compass card (public transit card for Metro Vancouver) at the nearest ticket machine, my uncle was no longer afraid to leave on my own. I returned home and started researching banks.

Conventional banks charge monthly fees here. I find that ridiculous, as why should I pay the bank to keep money with them and let them, in fact, invest them for their own profit. There are many online banks and FinTech banking start-ups in Canada, where there are no fees. Unfortunately, very few of them wants to open an account without Canada-issued photo ID, which I do not have yet. Gentleman at Service Canada told me to apply for B.C. Services Card, a form of photo ID, after three months of living in the province. The only bank I found that could open me an account using my passport and work permit is being restructured at the moment and was not accepting new customers until November.

I had to look deeper and found some banks give discounts to the new residents. I finally decided to open my account with a conventional bank, which gives first year free of charges for people who just arrived to Canada to work or became permanent residents.

I have found the nearest bank office and went there, this time alone, to open the account. I was received by Johnny, who turned out to be born in Vietnam. He brought me through the whole process of opening the account, gave me a debit card on the spot and together we cashed in some money I had, which Johnny used as an opportunity to show me how to use the Instant Teller machine and set up PIN for my new debit card. Honestly speaking, they are a bit outdated, compared to Europe, which he admitted and said the new, more modern one, will arrive soon.

In Canada, it is also very important to build your credit score, if you want to e.g. to rent an apartment. For this reason, one needs a credit card. In opposition to Europe, it is very easy to get credit here. Johnny offered me $500 limit just like that, but to issue me a credit card, he needed, well… Canada-issued photo ID.

Fortunately, he has given me a better hint than gentleman from Service Canada. Apparently it is possible to get one within a month, instead of three, for $35. He told me to pay a visit at ICBC, a crown company of British Columbia insuring cars and issuing driving licenses in the province, and request B.C. identification card.

Since it was already too late, I went there next day. The closest ICBC office was in Metrotown, where I had to get with SkyTrain, entirely autonomous (yes, completely unmanned) metropolitan rail of Metro Vancouver, or, as called by my friend Deby, “very very slow rollercoaster”.

SkyTrain, or world’s biggest and slowest rollercoaster. Source: http://vancouversun.com/news/local-news/skytrain-commuters-face-delays-due-to-mechanical-issue [last access: 17 September 2017]
The office was in huge mall called Metropolis. I have never been in so big shopping centre before. I managed to get lost few times, admired how many shops and institutions have been brought in a single place, and paid a visit to ICBC. With my passport and work permit, I was able to apply for the photo ID against the mentioned fee. I did not even need a picture – they were taking pictures at the place.

Using the occasion, I have asked about exchanging my driving licence to local one (I have to do that within six months, if I want to drive) and was given a free preparation book for the exam (I need to take the theory and driving exam again).

That’s enough bureaucracy for now. The only thing left is to wait for the BCID (arrives within 30 days) and apply for the credit card with it. Then I can fully enjoy life in Canada.

On working with technologies and paradigms

In my “Hello” post, I declared this is going to be an IT blog. I think it is high time to write something about IT then.

Most people, once they hear about IT-people, they often perceive all of them as coders, hackers and BestBuy’s Geek Squad employees at once. This is very hurtful, once you realise your friend who works as a programmer might be unable to fix your laptop and another who is able to break into your smartphone is not able to help you with your blog. Understanding of this issue is even more important these days, when global demand for IT professionals largely exceeds their supply. In case of the Netherlands, each junior or mid-career on the labour market has 12 job openings to choose from!

Labour market for junior and mid-career IT professionals in the Netherlands.

Since my goal for now is to become a programmer, in this post I will explain what this one is about.

These days, coding bootcamps are popping up one after another, charging money or not for preparing you for your dream job of a programmer. They either require you to attend classes and workshops offline, or conduct their operations entirely online.

The companies behind bootcamps promote the idea coding is for everyone, regardless of social background and education. Furthermore, they claim everyone should know how to code and that everyone, sooner or later, will. Promoting coding as the crucial skill for every decent job position in the near future, they attract future participants, who do not want to lag behind their colleagues.

Very often, it is assumed that the knowledge of programming languages is enough to be a programmer. In this article, I will explain why this is not the case, thus what programming is actually about. Personally, I find it annoying when people I told I am programming ask “Which languages you code in?”.

In my previous job, I have not sticked to a single programming language. Furthermore, I have not known them before starting this job! So how did I get it? During the interview at Yorizon, my future (at that time) boss asked me whether I know JavaScript and jQuery. I responded I do not. He followed up “From your CV I see you have experience with C++ and Java. Can I assume it should not be a problem for you to learn JavaScript and jQuery then?”. “Of course, sir” was my response.

Why did I respond like this, if I have never dealt with JavaScript and jQuery, never did anything about developing web apps other than installing and configuring WordPress? To understand this, let us forget about programming for now.

Welcome to planet Earth, where every human being is using a language on everyday basis. Each of you reading this article knows English, and probably many know some other languages as well. Furthermore, if English is not your first language, you are more fluent in some other language than English. Multilingual people can tell you certain languages are easier to learn than others. They also know that ease of learning a certain language depends on the already known languages.

In Europe, where multiple languages are used within small area, and often within the same country, such relations between languages are commonly known. Most Europeans are aware it is easier for German-speaker to learn Dutch and Swedish than Polish, for Polish-speaker to learn Russian and Serbian than English, while Romanians and Moldovans are eager to emigrate to Italy, since Italian is closely related to their mother tongue. For this reason, linguists split languages spoken around the world into language groups. Each language group shares similar assumptions and patters, which we can call, for the purpose of this article, paradigms.

Language tree is a good way to compare how languages relate with each other. Source: sssscomic.com [last access: 17 September 2017]
Because of differences between paradigms, multilingual people admit certain thoughts are easier to express in one language rather than another. I have observed this myself during my stay in Malta this year.

Malta has two official languages: English and Maltese. Very little related to each other. Local population is fluent in both. I was taking pictures in the park just outside Valletta’s old town, where two local teenage girls were sitting on a bench having a talk. Every few minutes they kept switching between English and Maltese. They were so fluent in both languages that these switches happened without notice. Conversation I was able to overhear became not understandable for me within a second, to become understandable again after a minute or two. Paradigms come from cultural differences between the nations using certain language. This should not be surprising that issues not common among the nations using one language are easier to be explained in another, if more advanced social development of the nations using that another language resulted developing issue-specific vocabulary.

Computer scientists are aware of paradigms too. They apply them when describing programming languages. Some computer scientists also draw trees. Unfortunately, they do not look as pretty as those from linguists.

Language tree for programmers. Source: http://www.aistudy.com/program/images/programming_language_family_tree.gif [last access:
17 September 2017]
This brings us to the conclusion that the programmer needs not to know the languages themselves (even though, it is a useful skill to certain extent). To become a programmer you need to be a quick-learner and be able to find which technology will be the most optimal for desired solution. Given how dynamic technology is evolving, including programming languages, people who know certain technologies now but do not follow their evolution are not able to succeed in the long run. This means:

quick learning + understanding technology > knowing technology

I hope this post gave you a picture why not all IT professionals are the same, what actually is expected from the programmer and contributed to the global peace by increasing the mutual understanding between technical and non-technical individuals.