The Ultimate Productivity Tool

Its so easy to get distracted these days. Social media alone will take a big chunk of your time and attention at any given day.

I too, struggle with this on a daily basis, not necessarily about social media, but the web in general. I read stuff on hackernews, aspnet blogs, and other technology/software engineering blogs. Its easy to get lost down that rabbit hole. So the stuff I need to do for the day gets pushed down a bit.

Pomodoro technique for me is sometimes a hit and miss. Sometimes it works, sometimes it doesnt. Why is it not working?

One day I decided to blame it all on the pomodoro tools I use, and thought I should create one of my own.

Enter micromanager-timer.
form-timer

I took all my favorite features of all the pomodoro tools I ever tried and stole it to make this the ultimate productivity tool.

Features

“This app is nothing but a glorified timer”. Is what you would say. But wait, take a look at these features and reserve judgement for later:

Auto Screen Capture

One feature is its ability to capture your screen as you are in the pomodoro zone. Because sometimes, you want to document stuff that you were doing and taking notes while doing it is another distraction. You could be researching for a blog or a just want to add a journal/wiki entry – this feature is great for that.

Music Player (soon)

Some people can focus better when listening to music. So what would you say If your pomodoro timer plays your “in the zone” music while you are actually “in the zone”? I could image myself listening to death-metal during the 25 mins focus times, and then classical music for the breaks – or vice versa!

Why micromanager-timer?

Imagine your manager checking up on you every so often and then ask you to review your work. This is what I was thinking when I named this app.

That and because naming things is hard.

Architecture

I created this app in not more than about two hours (4 pomodoros), so the architecture is crap. I uploaded the source code to github so people can learn how to NOT DEVELOP an app.

Seriously, I needed a tool ASAP, so I fired up Visual Studio 2017 and created a WINFORMS app. It’s 2018 and I just created a windows forms app.

If I get some free time, I am going to over-engineer the shit out of this timer. I’m talking about external plugin architecture, unit tests, benchmarks, CI/CD, and all that crap.

Options

This is the options page. Right now the only ones that are working are Pomodoro duration and Screenshot intervals.

form-options

Every few seconds, screenshots are stored in a folder structure like this:

screenshot-folder

The app stores the screenshots inside a folder with a similar task name and that folder also resides inside a folder with the current date with format “yyyy-mm-dd”.

The Future

Right now I am using it as is for the time being. It still sucks but I get that 25 mins countdown organized into tasks with screenshots.

There is still a lot to be done but I promise to work on it in the coming days, and will be blogging about it.

Advertisements

How to Kickass at Work

On good days I know I am above average programmer. On bad days I am just the worst imposter.

But I know how to minimize those bad days. I would like to share it with you.

Know your app from the outside.

This is embarassing to admit. I build stuff outside of work and I really enjoy it. But when it comes to the stuff I am actually getting paid to build I tend to procrastinate or get ADHD.

You know how it was built but the technique is to intimately know how it’s used. This is embarassing befause this is the part where I slack off. I always depend on a tester for these kinds of stuff. In the end it always bites me back. Always. When I’m fixing a bug, I move very slow because I have to figure out how to navigate the app every fucking time.

Maybe I have to login as a different user, how do I create one? How to generate this type of report? How to display this field in the form. I scramble most of the time.

One tip I could give in this area is to create a new test data from the ground up for each bug. New user, new customer, new up everything. In no time you will know half the system by heart. This may not be applicable to some data-specific bugs but its worth a try.

Automate stuff.

We develop an electron app at work. In many scenarios we need to publish/package the app so we could replicate some bugs. Packaging an electron app means running a bunch of commands, several of which are long-running.

Some of those commands dont work when I have other processes in memory as well. I have to make sure to exit VSCode or kill the app.exe manually for example.

All of this is time consuming. Instead of doing them manually, put all the commands in a script file. Pro tip: powershell is great stop hating if you come from a Linux background. You can virtually do anything in Windows using powershell. I havent tried it on Linux but you could download powershell for Linux and try it out for yourself.

Here is an example of my automated script file.

<code>

Communicate.

For a time we needed to do the packaging of electron app to debug stuff. This is because of a limitation of the app combined with the chromium subsystem limitation which i didnt really spend time to look at (ADHD remember?)

This is where communications come in. In my case it was more of a commsplaining (50% complaining).

You see, I work with engineers from Madrid and I am from Manila. I have a very good relationship with them. The kind where I am comfortable to whine about anything. In one chat message I mentioned in passing that the whole packaging of electron while debugging is killing me, and then the dude just lit up saying he already has a fix for that.

I asked if he could share it so the whole team could benefit. Long story short – debugging just became more convenient.

The moral of the story? Go ahead, whine about stuff. JK.

Try to Finish Stuff in the AM

This is more of a note to self type of thing but I find when I need to concentrate, Its easier in the mornings. Most people usually come in later after lunch so I have a few minutes to scramble.

We are fairly new team in the office and I want to know the team by joining in lunches, coffees, and everything. This bites me back in the end because it leaves me with less time than I started with but in the long run, I know it will pay off. To build a high performing team you have to know each other well.

Thats it. Thanks for reading.

Paluwagan

I have been working on something during the past few weekends, and I will be posting about it soon. But the link is here:

https://reportwriterpro.azurewebsites.net/

username: manager
password: manager

I just need to add a few things to the app so I can publish it. Stuff like landing page and multi-tenant feature, etc. The source code is privately hosted on VSTS, I have no plans yet of open-sourcing it but maybe someday.

But now my ADHD is kicking in and I want to make something else. This time, I will make it in the open. I initially planned to have it as a team side-learning project at Amaris and host it in corporate VSTS, but I decide we can still make it a team-thing but hosted openly at GitHub.

The Paluwagan System

What is it? Here is a few links that will do a better job of explaining it than I probably could.

https://www.mabzicle.com/2015/08/is-paluwagan-system-good-or-bad-method.html

https://chinkeetan.com/2017/10/20/paluwagan-chinkee-tan-wealth-coach/

Existing Apps

There are no Android apps in Google Play store. There might be something similar to it but named differently. Paluwagan is after all, a Filipino term.

Over at Github, there are five other people who also had the same brilliant idea:

github-paluwagan

I haven’t tried any of these yet, but I’m sure they’re all good.

Mine will be better because I will make it. I joke but the experience is gonna be sweet.

 

 

Why I’m Going Back to WordPress from Ghost

I opened an AWS (Amazon Web Services) account. Purchased a domain name. I decided to write a weekly blog. I was going to conquer the world.

One year later, my debit card expired.

Along with my ambition.

So why I came crawling back to WordPress? Two words:

Cognitive Burden.

Now that I committed to a hosted setup, I felt like I need to deliver quality content. Because this would reflect towards me and my own identity. Which was not the effect I was looking for. What I really wanted was to just write my thoughts down for my future self mostly.

Subconsciously, I was also planning about doing all kinds of stuff like separating the blog with my future personal profile. For example, my blog would be at blog.jfaquinojr.com, personal website at jfaquinojr.com, side-learning stuff would be at x.jfaquinojr.com. I guess those unconverted to-do tasks that kept looming at the back of my mind also added to the cognitive burden already building up.

I just wanted to write a blog.

I rant. The last time I thought WordPress would slow me down. So I decided to host my own Ghost platform. I was wrong. Let the ‘I told you so’ from my friends and colleagues commence.

My move to hosted Ghost was probably just a way for me to scratch my own itch of setting up a hosted AWS environment so I could tell my friends, hey my blog is hosted at AWS. That’s my lame excuse.

I will rule the world with WordPress.

My world. Like I mentioned earlier, I will write a blog for my future self. Hopefully, there will be a time when I am searching for stuff, I will come across my own. And then I will be my own savior. My own kingdom where I rule over just myself. It’s going to be sweet. And if somebody else comes across anything useful I post here, that’s just going to be the cherry on the cake.

Why I’m Leaving WordPress for Ghost

This was originally published at my new blog here 
http://blog.jfaquinojr.com

WordPress is so awesome. It has tons of resources and contributors from its very large community. From themes to plug-ins, free and paid, you will have no problems finding what you need.

Its Success becomes its Downfall

WordPress has grown into something else. It has evolved from a blogging platform, into a CMS, and then into whatever it is now. People are doing all kinds of stuff with it. That kind of success attracts malicious folks. If you host your own wordpress site, you better be updating it once every path comes up.

Fortunately for me I didn’t host my own so I dont have to deal with security and upgrades. My previous blog was in jfaquinojr.wordpress.com.

I Just Want to Write my Blog

I don’t need all that cruft. I just want to write whats in my mind and be done with it.

WordPress is like a Swiss Army Knife with all the knives out.

Enter Ghost

Initially I wanted to move to a static site generator such as Jekyll or some other shit. But I wanted to try Ghost as well so here we are. And so far, everything is peachy.

Ghost is a blogging platform period. Its dedicated to doing one thing: Publishing.

I’m not completely ignoring Jekyll. If I find benefits to moving to Jekyll or similar over Ghost, maybe I will.

Amazon AWS

I am hosting my new Ghost blog on Amazon AWS. I find it much cheaper than hosting on Azure. Even with my free 100 USD Azure credits that comes along with the company MSDN subscription, I still decided to host on Amazon but that’s another story for some other time. But that might change in the future.

Probably more useful to me than to you but IDC.
https://desiredpersona.com/how-to-create-a-static-website-with-ghost/

https://help.ghost.org/hc/en-us/articles/224410728-Markdown-Guide

ScrapySharp: C# Web Scraping Library

I heard about ScrapySharp in dotnetrocks and I have been meaning to play around with it ever since. It is an excellent open source library for .NET that may have been a port of scrapy.

As for this exercise, I decided to scrape TipidPC (TPC). TPC is an online buy and sell community website for PCs, laptops, computer accessories, and similar gadgets.

My goal is to list all of the new items for sale (IFS) and then do something with those data later on.

When I browse TPC website, there is a button there that allows me to browse the catalog under Items For Sale. Clicking on it redirects me to this page:

This is a list of all items for sale, arranged by most recent first.  Perfect! Just what I need to achieve my goal. Take note of the URL as we will need this later.

Now lets open up developer tools in the browser by hitting F12 and do some dissecting. Looking closer, the particular list that we want is a <ul> with an id of “item-search-results”. This list is composed of items with all the goodies which can lead us to more goodies, all of them ready for harvesting. Again, mind the URLs. I cant wait to get my hands dirty, and I hope you are as excited as I am.

tpc-dissection

Fig 2: Goodies!

 

Roll up your sleeves and fire up Visual Studio. Create a new console app and enter the following in the Package Manager Console:

PM> Install-Package ScrapySharp

Once you have that installed, we can now create an instance of HtmlWeb and call the Load() method.

var web = new HtmlWeb();
web.Load("https://tipidpc.com/catalog.php?cat=0&sec=s");

It’s that easy! The Load method returns an instance of HtmlDocument that represents the target webpage in its entirety. Note that ScrapySharp can also load HTML via ScrapingBrowser as shown in the official repository page. I just use the above because I find it much easier and cleaner.

But the party is just getting started. If you like JQuery, and by extension, CSS, you would be comfortable with the next piece of code.

 var nodes = document.DocumentNode.CssSelect("#item-search-results li").ToList();
 foreach (var node in nodes)
 {
 Console.WriteLine("Selling: " + node.CssSelect("h2 a").Single().InnerText);
 }

CssSelect() method accepts CSS syntax to process the target HtmlNode. In the above code, the first CssSelect gets all the <li> items under the <ul> named “item-search-results” (see Fig 2 above). The second CssSelect call simply gets all the h2 links so the program can write them to the console.

The complete code listing is below

static void Main(string[] args)
{
  var url = "https://tipidpc.com/catalog.php?cat=0&sec=s";
  var webGet = new HtmlWeb();
  if (webGet.Load(url) is HtmlDocument document)
  {
    var nodes = document.DocumentNode.CssSelect("#item-search-results li").ToList();
    foreach (var node in nodes)
    {
      Console.WriteLine("Selling: " + node.CssSelect("h2 a").Single().InnerText);
    }
  }
  Console.ReadLine();
}

Running the above results to:

scrapyboy-console

Using ScrapySharp is so convenient! If you have attempted scraping before, using plain HtmlAgilityPack or some other .NET library, I feel your pain.

Now go and play around with it and let me know what cool projects you are and will be working on.

VS2017 Introduces Go To All

In addition to the already existing phenomenal search and navigation features in Visual Studio, the VS team finally implemented the Go To All.

gotoall

The ‘Go To All’ Popup

Prior VS versions attempted this feature in the form of ‘Navigate To…’. But it was too slow to even be usable specially in large solutions. People usually end up using ‘Find in Solution’ – the proverbial hammer to solve all navigation problems.

NavigateTo.png

Navigate To.. is slow specially in large solutions

If you have used Jetbrains Resharper before (and other Jetbrains products), you will definitely appreciate this feature. This is perhaps the main reason why I use Resharper. Now that it landed on Visual Studio 2017, I can be free from Resharper. In many ways, the VS version even feels superior.

resharper-vs-nativegotoall

Reshaper (Left) and Visual Studio 2017 Go To All (Right)

In my current keyboard mapping scheme (Visual C# 2005), I needed to configure the shortcut for this – but maybe that’s just me. My co-worker reported that Ctrl+T worked for him out of the box. In any case, its super easy to set it up. Just hit Ctrl+Q and enter “keyboard” to take you to Keyboard Mapping options. Then search Edit.GoToAll and assign Ctrl+T. OK your way out of the boxes and you’re golden! Why Ctrl+T? No reason. I just followed Resharper’s lead. You can choose any shortcut key you want though.

AssignCtrlT

Assign Shortcut Key

By default, the ‘Go to All’ popup searches all occurrences of the string. Filter it even further to clean up the results and its very easy. For example, if you want to search the file /Web/Controllers/HomeController.js, just enter “f homecontroller”. Other search options are below.

# Symbols
: LIne
? Shows this list
f Files
m Members
t Types

Conversely, if you want to be more visual about it, you can click on the icons on the top of that nice Go To All popup to achieve the same results. Two buttons on the side allow you to personalize your overall experience.

gotoall_buttons

How do you find this Go To All feature? Is it useful for you or not really? Let me know your thoughts in the comments section below.