Category Archives: Productivity

Staying Organized in 2015

Every day I do my best to keep myself organized. I keep my files in their own folders, I keep my desktop clean, I keep my calendar free and relevant, I clean up my phone contacts fairly often, I keep a task list. However, after about a month, none of this seems to matter. I’m not sure how many people experience this, but it seems that no matter how hard I try, I always end up being lazy for about a week and that ruins everything. I save all my downloads to my desktop, I don’t put pictures in their correct folders, I don’t name files in my usual naming convention. All of this leads to chaos. My task list is currently running rampant with tasks that were never actually meant to be completed. I need to bring this to an end. Here’s how I plan on doing it.

E-mail

One of the main problems with my organization has been e-mail. For the past 6 or so years, I have been using Mozilla Thunderbird as my primary e-mail solution. All of my email accounts were imported into my portable version of Mozilla Thunderbird which was saved in my Dropbox so that it would be synced across all my devices. This, honestly, worked quite well. Recently, however, I have been running many operating systems (Android, Linux, Windows) and having all my files synced across these devices is a challenge, especially when one file is a .exe file. Thus, after months of searching for a solution, I have decided to go with a web-based solution. I have decided to use Gmail.

Although it’s not surprising in the least (everyone uses gmail), I never knew that you could import POP3 mail accounts into Gmail and send/receive mail as if they were your primary Gmail address. The integration is seamless and all of my mail goes into one easy-to-use unified inbox, just like in Thunderbird. I’m a happy camper. What makes this even better, though, is that it syncs with the Android Gmail app, so that all of my emails (and imported accounts) are synced to my Android device.

I have also made a commitment to myself to delete emails that I didn’t need immediately. This way, my email inbox is never cluttered with a bunch of stuff that I will get to eventually. That phrase is long gone.

Schedule Management

I love calendars. I’ve always had one of those little date-books where I wrote down what I needed to do and what was in store for me every day of the week. Today, however, carrying around a little pocketbook isn’t all that feasible. It is the digital age, and my calendar must correspond accordingly. Thus, I have become an avid user of Google Calendar. Another completely unique decision. I’ve tried Google Calendar in the past, but I never really kept up with it because I would forget to look at the calendar and/or schedule events on the calendar. To circumvent this, I use a few methods. First off, my calendar lives in a pinned tab in my Google Chrome, so it is always there watching me and alerting me of any upcoming events. On top of that, I’ve found that its icon actually reminds me to schedule events and keep track of what I should be doing. I’ve done the same sort of thing on my phone. I use Today Calendar to display a nice little Agenda widget on my homescreen so that whenever I look at my phone I see exactly what’s next on my plate. I now understand why people hang calendars on their walls. Having a calendar constantly staring you in the face really helps you stay focused and stay on top of the things that you want to accomplish.

Along with my calendar, I have also started heavily using task lists. Of course, there is a task list built into Google Calendar, Google Tasks. Why not use that? So I am. It’s perfectly simple. I simply type in what I need to do and it sits there, right next to my calendar, telling me that I need to do it. No gimmicks, no fancy user-interface, no fancy animations – Just a task list. It’s just what I need. On my phone, I use the Tasks app to follow my tasks. Of course, it’s the same deal on my phone.. it simply lists the tasks that I need to complete. Although it’s not much, it definitely helps me stay focused.

Item Organization

A big part of staying organized is staying clutter-free. This means organizing everything in your daily life. Whether it be having a special place to put pens or organizing books by author’s last name, anything can help. There are many things that I have decided to do to keep my stuff organized.

  • I make my bed every morning. I know this is more of a personal issue, but I am convinced that hopping into a completely made bed at night actually helps me sleep better. On top of that, it makes my room look clean and tidy even when it’s not.
  • I do my dishes every night. Again, this is a more personal issue, but it also helps me stay much more organized. When I wake up in the morning, I can get started with my morning routine almost immediately. I don’t need to worry about washing my bowl for cereal or not having a clean spoon to use. It’s great.
  • I control my phone’s files. Especially with pictures, my phone is a mess. All these photo apps (Snapchat, Instagram, Facebook, Twitter, etc.) all put their pictures in their own separate directories. This makes accessing photos very difficult if I am looking for a specific picture. Thus, I am using Redirect File Organizer to move all of my pictures to a single directory. It really helps. On my computers I am doing something very similar. I am making sure that I don’t save anything to my desktop and I put the files where they belong the first time. It’s amazing how much frustration this saves.
  • Notebooks are also a recurring problem for me. I love pens, I love stationary, and I love notebooks. I have a ton and they are very unorganized. Thus, I have decided to take the advice of the label-freaks around the world and label my notebooks and arrange them in alphabetical order. I have also done the same with my books. Say what you want, these small changes work wonders.
  • Music is another thing that I find myself being stressed about often. Instead of having my music collection neatly organized, I just have a list of songs. This is something that has been changing as of late. I am now an avid user of Spotify and I make sure to put all of the songs that I wish to keep into playlists that reflect when I want to listen to them. So far, things are going great.

Overall, being organized is a great thing. It eases a lot of stress and makes daily life a lot smoother. I highly recommend taking a week of your time to sit down and really organize everything. You won’t regret it.

Building an Offline Program with Online Syncing

As I become more and more experienced with software development, I am very quickly discovering the limitations of the web. Having a desktop application that constantly needs to retrieve large amounts of data from the Internet is very, very slow. Sometimes, when network speeds are spotty, a simple interaction can take up to 30 seconds, which is definitely unacceptable for the end-user.

In order to solve this problem, I decided to restrict myself from looking at online solutions. I wanted to create a solution on my own.

First, I wanted to create a robust system for managing a database for an offline program. I looked into several different services, including Microsoft’s SQL Stack and a local MongoDB server. However, I found that most of these solutions were either too difficult to learn (I was used to setting up a MySQL server using cPanel and phpMyAdmin) or that they over-complicated the issue. Then, I came across SQLite, which happened to be exactly what I was looking for. It was a lightweight, speedy, local replica of MySQL. After spending about an hour reading the documentation, I realized that it was also super easy to setup. I began working on a library that would make working with a local SQLite database super easy.

Thus, SQLiteDatabaseManager was born. The project was meant to house functionality that would be used in all of my projects, and here are some of the key features that were packed into it:

  • The ability to quickly create a local database
  • The ability to quickly insert, delete, and update records knowing the table names, the fields, and the new values.
  • The ability to have a small table-verification system that allowed the user to define table schemas and check the existing SQLite tables against these schemas for integrity verification.
  • The ability to retry operations when they fail (the fail could be a result of a spontaneous locked file and a retry could fix everything)

SQLiteDatabaseManager worked well because all you needed to do was create a new instance of it, and everything worked out of the box. A new SQLite database was setup and managed by the library. After rigorous testing, this worked perfectly. Of course, the library still needs major work and many more features, but it does what it was intended to do at the moment. My offline data management system worked.

Now the problem was not just managing data offline, but getting it to sync to an online counter-part when a network was available (In a perfect world, all operations would be done on the local SQLite database (fast) and then they would be replicated on the duplicate remote MySQL database (slower) on a background thread). The idea was simple.
Local SQL and Online SQLThe SQLite database and the MySQL database would communicate with eachother via a simple REST API. The databases would be identical and the ID numbers created by the SQLite database would simply be moved to the MySQL database.

 

Creating the REST API for the remote MySQL portion of this project was rather simple. Relying on the methods of the LAMP stack, I used a set of PHP files that would receive GET, POST and DELETE requests so that data could be managed and manipulated fairly easily. Using PHP’s json_encode() function also proved very useful for creating readable responses.

Thus, with the creation of a working SQLite local database and a working and accessible remote MySQL database, I went ahead with the first iteration of implementing this idea. So far, I have run into a few problems.

 

An easily-solvable problem arose when thinking about how to handle many, many clients. Since there was only one remote MySQL database and many, many instances of the local SQLite database, it was a pain tracking when the local client’s changes actually had to be applied or if the remote version was actually newer. This problem was solved by creating a dateAltered field in both the remote and local databases that would contain the last date of modification of the data that it pertained to. Thus, the data with the latest dateAltered value was put permanently into the remote MySQL database.

But what about when there are many, many clients creating information. Surely, some of the client’s SQLite databases will assign ID numbers that coincide with other clients’ SQLite databases. Thus, when information is uploaded to the remote server, different pieces of information may have the same ID numbers. But since all data is modifiable, how is this detectable? This is a problem that I have not yet worked out a solution to since the first implementation of this design has a one-client one-server relationship. However, at the moment, I am hypothesizing that each data-entry contain a unique hash of its original state. Thus, database operations can be performed by referencing the ID of the element, but conflict-resolutions will use this hashed code. Thus, we will always be able to track if a certain piece of information has been modified from its original form or not. Thus, when uploading to the remote server, the server will manage some conflict resolutions and return the ID number of the object. The local clients will then reassign the ID number of the object to that ID number in order to match with the remote MySQL database.

 

I will continue to work on this project in the coming weeks, and I plan on making some detailed blog posts about it, so stay tuned! Eventually, I hope to have this process wrapped up in an easy-to-install and easy-to-implement library. We will see how that turns out.

 

CODE Keyboard: First impressions

Let me preface this post by saying that I am by no means a typer. I have never really took time to look into what keyboards were good, what keyboards I liked the best, or what keyboards allowed me to type the best. To further prove my point, all of my previous typing was done on the Microsoft Sidewinder X4, a keyboard that I am almost positive lacks merit in the land of keyboards that are “typing” boards.

The world of mechanical keyboards has interested me for quite some time now. Their clicky nature, their claims for faster speeds, the way that they feel while typing. Everyone always had good things to say about mechanical keyboards, and I’ve never had one. Thus, it only made sense that I got one. Following the recommendations of a few friends and of Jeff Atwood himself, I decided that I would go ahead and get the CODE keyboard without a number pad and with Cherry MX clear switches. What this meant, I had no clue. I was more than excited to get started.

I have been using this keyboard for about a day. So far, I love it. Typing feels great, the sound is very satisfying, and the amount of tactile feedback really is incredible. There is no question as to whether or not I hit a key or I just kinda-pressed it. The keys actually depress as you press them, and I think that’s awesome.

The CODE with LEDs turned off.

The CODE with LEDs turned off.

Build Quality

As far as the keyboard itself goes, it feels great. It’s a little on the heavy side, but I don’t think that anyone ever expects a keyboard to be comparable to a feather. After all, all it really does is sit on the desk. The material feels solid, the keys look beautiful, and the paint gives the keyboard a classic look when the LEDs are toggled off, but a beautiful modern look when the LEDs are toggled on. In fact, when I first opened the box for the keyboard, I was a little underwhelmed. Without knowing what it was, it looked just like a normal keyboard. However, as soon as I held it, flipped a couple optional switches, ran the USB wire in its dedicated slot, and began typing, I knew this was no ordinary keyboard. It felt great. It still does.

The Sound

One thing that always interested me about mechanical keyboards was their sound. They sound as if you’re actually typing. Because of that, I was very concerned when picking out a keyboard. Now, I know nothing about the different color switches and which ones are loud and silent and soft, but I wanted to make sure that the keyboard I got had a satisfying sound, while not keeping my roommates awake. This keyboard (with the help of the MX Clear switches) does exactly that. It definitely isn’t too loud, and actually doesn’t require the keys to “click” in order for them to be pressed. The most noise is produced when the keys are fully depressed. However, while typing one will quickly realize that isn’t necessary. A keypress is registered about halfway down. Thus, there is no need to actually “click” the key. Not only does this provide a non-irritating sound profile, but it also gives the typer a little bit of control as to whether or not they want to be a quiet typist or the most annoying computer user in the library (of course, this means that you would have to bring the keyboard with you to the library).

The Feel

So many people raved about this keyboard because they felt “pleasured” to type on it. It was relaxing and it felt great. Honestly, as someone who is not a typing enthusiast, I don’t feel much “pleasure”. So far, I find that it is actually fairly tiring typing on this device. Now, keep in mind that I come from the world of chiclet laptop keyboards, so I definitely do not appreciate the levels of effort required to type on such a well-built device; however, all of the wild claims about this being the “best feeling” keyboard ever made do not resonate with me. As of right now, at least, I do not feel anything special.

Of course, I am not trying to say that the device doesn’t feel good. It feels good. I enjoy typing on it because of its sleek design, it’s clicky-clack nature, and it’s beautiful LEDs. However, I do not think that I would find myself carrying this keyboard around because using anything else would be an abomination and a sign of disrespect to my fingers. If anything, my fingers will need a bit of a break after typing on this device for so long. However, for a typing enthusiast, I can definitely see how this device has potential to feel great. I just don’t notice anything super outstanding.

 

The CODE with LEDs turned on.

The CODE with LEDs turned on.

 

Overall, I am very pleased with my purchase. Keep in mind that I have only been using it for a day, so I can’t comment on much, but I am not suffering from any buyer’s remorse, which is always a good sign. If anything, this keyboard is making me want to type more and learn how to actually type properly (I currently type in a strange fashion where 75% of the keys are typed using my index fingers. I will work on changing this soon!) There will be more comments to come regarding the CODE keyboard!

Home Automation

If you have seen the latest addition to my code page, it is my first project that deals with hardware other than standard computers. It deals with the Chromecast. Take a look at the project here.

One of the goals of this project is to make life with roommates easier. In my opinion, it’s the modern alternative to keeping a grocery list pinned to the fridge. I want to make an app in which everyone can add tasks to a task list and everyone can see them just as easily as they appear on the television screen.

This, I believe, is my first step into the realm of “home automation”. Ever since I started toying around with making the tv screen display my things when I want them displayed, I have begun thinking about the possibilities of home automation. One of the things that I would really like to happen is a system in which I tap my phone on an NFC tag and everything turns on. The TV turns on and displays tasks that I need to complete. My computer turns on and becomes ready to use. Coffee is brewed. I imagine a place where I am truly the master of the house.

As I gain more and more knowledge in software development, this is exactly what I will be experimenting with. Right now, I am working on getting my Chromecast to display a task list that is editable from anywhere. The concept is really simple and pretty straightforward, but not knowing most of the technologies behind it makes it challenging. Basically, the following process needs to happen:

“Launcher App” –> Chromecast App –> Node.js App –> Data from MongoDB

This launcher app needs to be launched manually. However, as long as the launcher app exists as a mobile app, I can make it launch when the phone detects a specific NFC tag. Adding tasks is a little more straight forward.

AngularJS –> ExpressJS –> Node.js –> MongoDB

Also known as the MEAN stack, this is the process that I plan to use to power the backend of the task management. As the project progresses, hopefully I will be smart enough to make it into a deployable package so that anyone with a Chromecast and roommates has the ability to setup a communal living room task list.

During the development of this small system, I’ve been listening to a lot of older songs, especially those featured on Radio New Vegas. Here’s one of my favorites:

I Dislike The Mouse

 

My Desktop

The above picture is a screenshot of my Linux machine. What is unique about it? Well, everything is controlled by the keyboard. I have a tiling window manager (i3) and do all of my text editing in vim. What does this mean? It means that I rarely touch the mouse.

I grew up using Windows. It was my primary operating system for the past 10 or 11 years. I got very used to it, its semantics, and using the mouse+keyboard combo in order to navigate around my Windows machine. There was nothing wrong with it. As I got more into computers, however, I got bored of using Windows. There’s nothing wrong with the operating system – I just got bored of using the same thing for 10 straight years. Because of this, I installed Linux.

When I first install Linux, I tried to emulate my Windows experience as much as possible. I installed LXDE as my desktop environment and Openbox as my window manager. I used these just like I used Windows.

As I used Linux more and more, though, I realized that most of the power of Linux was not in the interface, but rather, the terminal. This led me to be in the terminal a lot more than I ever was. I no longer needed a file manager as I did all of my file operations in the terminal. I no longer needed desktop icons because I launched everything in the terminal. Eventually, I no longer needed my mouse to switch Windows, as I just used keyboard shortcuts. I no longer needed my mouse to open terminals because I used keyboard shortcuts.

What did I need my mouse for, then? I decided to experimentally ditch the mouse entirely and switch to a tiling window manager that allowed me to manipulate my windows and their positions by just using the keyboard. At first, I used Awesome. However, Awesome felt very static. In order to move windows around, I had to switch the layouts entirely. I wanted something more dynamic, so I switched to i3.

It definitely took some getting used to. I had to train myself to not reach for my mouse every time that I wanted to do something. Eventually, however, I got used to it. Once I did, it felt awesome. It made me feel like a whole new breed. I was able to rearrange windows, launch applications, and do everything from my keyboard. Not to mention that when my mouse isn’t around, it has the added bonus of keeping people from using my computer since they don’t know how to use things.

As I practiced more and more, I felt that I was getting faster and faster. In fact, I felt that I was doing things faster than if I needed to reach for my mouse. Need to listen to Spotify and type some notes at the same time? Easy.
<WINDOWS>+3 – Switch to a new Desktop
<WINDOWS>+D – Open the app-launcher
‘spotify’              – Launch spotify
<WINDOWS>+B – Open the next window to the right of Spotify
<WINDOWS>+<ENTER> – Open a terminal window
‘vim notes.txt’   – Launch vim and write some notes
Of course, this is a lot of steps, but they can be executed very quickly without reaching for the mouse to resize the windows in order to get the right proportions between the vim and Spotify windows.

Of course, as time goes on, I will only get faster and faster. However, this experience has made me realize that I really dislike using the mouse. Of course, this experience is only on my laptop, where I often find myself reaching for my touchpad because it is easy to reach with the keyboard so close. However, I plan on getting a new Desktop soon and installing Linux on it with my i3 setup. I am excited to see how everything will end up working out on my setup with two monitors and so much screen space. I will report back.

If you’re wondering whether or not you want to take a shot at using a computer without the mouse, try it. It’s a great experience and it looks super awesome whilst doing it.