KDC Menu

Wednesday, February 21, 2018

Expired To Be: A Chrome Browser Extension

Expired To Be

A Chrome Browser Extension

Set and be reminded of expiration dates.

'Expired To Be' is a Chrome extension available on the Chrome Web Store.

Get notified of expiring items for things you don't think about too often; like butter, medicine, or the supplies under your sink.

As a developer, I spend most of my life in Chrome, which is why I decided to create this app as a browser extension. This was my 2nd Chrome Extension (the first being "Character Counts", which I wrote as my Final Project in Harvard's CS50 course).

Although I built the extension primarily for personal use, I also wrote it for continued JavaScript practice: It is open source on GitHub, and I'm completely open to feedback as well as PRs. And I'm especially open to looking into any bugs.

Development time took just over 2 weeks. This was one of my more tedious projects I've worked on in awhile (migrations with Laravel, Nov 2016, actually), but then I was a tad sick through part of it as well (I know, excuses, excuses!). I also delved into about a half dozen development areas I'd not touched much, or at all, prior. Complete development history details provided on GitHub.

I might make a SPA version, if I find myself needing one, or perhaps if there were outside interest. Creating a FireFox extension would make for a good fork and school or side project for someone.

Expired To Be: Chrome Web Store: https://chrome.google.com/webstore/detail/expired-to-be/kamjiblbgmiobifooelpmlkojmadmcan

GitHub: Expired To Be: https://github.com/KDCinfo/expired-to-be

GitHub: Character Counts: https://github.com/KDCinfo/character-counts

Monday, February 05, 2018

Character Counts V2

The Chrome Web Extension "Character Counts" has been updated.

Current Features:

1. Count the number of selected characters on a page.
2. Convert an ASCII(char) string* between normal ASCII, ASCII (Int), and Binary.

* A string is represented by characters, words, and/or entire sentences.

New Feature:

1. Choose if your conversion input (source) string is ASCII(char) (default), ASCII(int), or Binary. The 'Convert' link will then cycle through the 3 conversions (although really 2; one converted output will always be the same as one source input).

  For Example:
  - ASCII(char) = ABC
  - ASCII(int) = 65 66 67
  - Binary = 01000001 01000010 01000011

Character Counts is available for free in the Chrome Web Store.

Character Counts is also Open Source on GitHub.

Wednesday, January 31, 2018

I··C··D··O··T··S (––and––lines––)

I··C··D··O··T··S··: A Web App Game

tl;dr - take me to the game already!

ICDots is a board game for 2-7 players who will take turns selecting lines to form boxes. Scoring is 1 point per box pinned. Line colors have no distinction other than one is horizontal and one is vertical, and the alternating colors felt visually appealing.

Game Reference

The Game:
  1. Board is between 2 and 7 (represented as 1 row of boxes).
  2. Number of players is between 2 and [Board] size.
  3. Players take turns.
  4. If a player pins a box, they go again.

Application URLs

Technology History

  • Inspired by a Codewars kata, the original kata solution was written with just JavaScript.
  • In making the game interactive, the first version of ICDots was written with JavaScript Prototypal Inheritance (e.g., let myGame = new Game() and Game.prototype.createBoard = function() { }). This was my first prototype-based coding project.
  • I then converted that version of the game to React with TypeScript. With this project, I added TypeScript alongside/during the conversion to React (as it should be done).

Tech Stack

Working on this project provided me a more in-depth look into
  • - JavaScript (ES5, ES2015 (ES6)) (+ downgrading ES7 .includes())
  • - React (16.2.0)
  • - TypeScript (2.13.0)
  • - Local component state and props


[JavaScript] [react] [reactjs] [typescript] [coding practice] [coding fun]

Tuesday, January 30, 2018

Dances with Vars

Dances with Vars:

Spans... Spans... Your name is Spans? Spans Div... Spans with Divs... Your name is "Spans with Divs"!?!

>Testing Dark Humor:

```describe(‘psychotic’, () => { 
    it(‘puts’, () => { 
        basket: “lotion” 

I had originally posted this on Google+, but thought it fitting for my blog as well. I would also share on Twitter, but you can't format Twitter messages, so it'd lose it's coded `unit testing` humor hook.

Tuesday, January 09, 2018

Foundation 6 Install - 2018-01

[2018-01-07 / 08 - Sun / Mon]

Setting up a new VirtualBox VM with Ubuntu 16.04.3 (guest) on a Windows 10 MSI laptop (host/parent).

I was recently reintroduced with Foundation 6, and I decided it would be a good opportunity for a little redesign of my portfolio. This guide became a byproduct of my setup process.

Note: In this guide, 'ubuntuuser' will be the local Ubuntu username you choose when creating your VirtualBox Ubuntu VM (bullet item #2). Also, I tried to put all the important commands to run in bold - hopefully this translates when I publish from Evernote to Blogger. :)

VM with Foundation 6 from Scratch:

     - Downloaded Ubuntu Server Latest (16.04.3) ISO

     - Created a new VirtualBox VM (named "F18").
          Apply the ISO, run through the Ubuntu installation (I accept near, if not all, defaults).
          LAMP server | Mail server | Samba file server | OpenSSH server | Basic Ubuntu server
               (names and passes are just suggestions; please don't use them verbatim.)
               Server Name: [myubuntu]
               Ubuntu Admin User & Pass: [ubuntuuser][aweSumPas^sW8rk]
               MySQL Root User: [giv#AGoodPawswd]
                    (^^^ watch this; it kind of looks like it wants a pass for
                    your Ubuntu root user, but it's for the MySQL root user.)
          sudo apt-get update
          sudo apt-get upgrade (new install; could take a little while)
          sudo apt-get update

     - We need Git
          sudo apt-get install git
          git config --global user.email "your@gitemail.com"
          git config --global user.name "Your GitHub or BitBucket or XyZ Name"

     - Created GitHub Public Repo
          No license (implied self-copyright)
          Updated Readme.md to reflect WIP

     - We need the framework
               - Didn't install Foundation CLI (just did the clone thing...)
          git clone https://github.com/zurb/foundation-zurb-template kdcF6
          Edited package.json to be my own name, Git location, etc.

     - Setup WinSCP connection
          [connect to SFTP:22 myubuntu|ubuntuuser]
          [chmod] (d-755/f-644) to all files/folders* inside kdcF6 (wherever you put your F6 files)
               *I left the .git folder alone.
               (Selective multi-file and folder selection inside GUI is easier than via cmd line.)

     - Ran through setting up 'nvm' and node

               nvm - creationix
               wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash

               libssl-dev build-essential / build-essential
               sudo apt-get -y install libssl-dev build-essential
               sudo mkdir /tmp/node-install
               cd /tmp/node-install
               sudo wget {paste}

               node-install - Beware pipe ( | ) command separators | Inserted only for brevity.
               sudo tar -zxf {tab} | cd {tab} | sudo chmod -R 770 /tmp/node-install/{tab} |  
               sudo ./configure | sudo make (takes awhile) | sudo make install |  
               node -v | cd / | sudo rm -r /tmp/node-install/

          Current Node at time of downloading from "Source Code"

     - Ran: sudo npm install
          The moment we've all been waiting for...
          Failed! Permissions issue.

          First I found and tried:
               sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}

          That condensed cmd did not behave well, so ended up doing them separately:
               sudo chown -R $(whoami) /usr/local/lib/node_modules/
               sudo chown -R $(whoami) /usr/local/bin/
               sudo chown -R $(whoami) /usr/local/share/

          Then I found and ran:
               sudo npm cache clear
               sudo npm cache verify
               sudo npm cache clear --force
               sudo chgrp -R root /home/ubuntuuser/.npm/
               sudo chown -R ubuntuuser /home/ubuntuuser/.npm/
               ll /home/ubuntuuser/.npm/

          Last thing, should go ahead and do before npm install...
               When [npm install] is run first, it will end with a message suggesting:
               sudo chown -R $USER:$(id -gn $USER) /home/ubuntuuser/.config

     npm start
          ^--- Look ma, no sudo!!!

We've got take-off!

Note: Because I did not install the Foundation-CLI, you may notice I'm not running "foundation watch", but "npm start". These are the same thing ('foundation watch' is an alias).

Note: In the 2+ years I've been running these Ubuntu setups, this is the first time in an Ubuntu environment I've been able to, (had to, in fact,) run 'npm' without 'sudo'.

Running in a server-only terminal.
     - Looking into turning off BrowserSync (or see if I can enable it to run outside of my headless server).
     - Or I can install Ubuntu Desktop as I did on my (old?) primary VM.
     Suggestion was to set: open = false

     Found it! (added open: false)
function server(done) {
server: PATHS.dist, port: PORT,
open: false

And we've got an even Better Take-Off !!! (ran this from my Win 10 host - BrowserSync connected!!!)

And we've got control over our take-offs !!!

Setup Samba Sharing:
     sudo vi /etc/samba/smb.conf
path = /var/www/html/
available = yes
valid users = ubuntuuser
read only = no
browsable = yes
public = no
writable = yes
     sudo smbpasswd -a ubuntuuser
     sudo service smbd restart

Initial Issues: I had major issues with my first VirtualBox VM (named "Foundation") whereby I set up the hard drive to be dynamic, but it set itself to 10GB. Even after updating it to 20GB via the VM Media Manager, Ubuntu would not see the changes.
     - Spent Sunday going over documentation, watched 6 videos, and got initial VM with Foundation 6 setup.
          Problem came when trying to setup a 2nd Foundation project.
     - Ran out of space on 2nd install of Foundation (tried 5+ times).
     - Spent most of Monday trying to get drive expanded in initial "Foundation" VM.
          Used often: sudo npm cache clear

Editors Note: You will see that I used multiple tenses, and I apologize for that, but I primarily just wanted to get the overall (but primary) gist of it all documented.

A little further: In addition to using Foundation 6, because React requires its own server, I may be introducing a little Vue into these otherwise static LAMP pages. Maybe... Hopefully...

Some References:

Warning: Please do not blindly copy and paste any of this code. Always know what you're entering, even if it means looking up every other word until you grasp it. Or, ask. Although I'm only a mid-level Front-End Engineer, comments and questions are still welcome.

Friday, December 29, 2017

A Little Node...

Figured I'd take a break from my daily JavaScript adventures (w/ Codewars) and learn a little Node with Express and MongoDB. Although it says 30 minutes, after downloading, creating an account, and installing Postman, learning what it is and how it works, then doing all the same with mLab (MongoDB), then figuring out why MongoDB wouldn't connect (was a v2 vs. v3 thing), it took me a tad longer than I'd hoped. But it was still an excellent run-through for the basics of a CRUD app.

In my 'time it took' defense, as it took me a couple days, on and off, it was in between my reading through dozens of pages derived from my initial reading of MDN Object Prototypes and MDN Prototypal Inheritance (all of which is making more and more 'foundational' sense). Speaking of MDN, it was also fun reading through the MDN Closure page recently... another page that took me 'days' (er, or maybe it was weeks, ...or months...) to thoroughly read through, run tests on CodePen, and comprehend.

Anyways, if you're into learning a little Node, give it a shot. I've still got to go through the remaining 'RUD' :)


-Keith D Commiskey

Sunday, November 19, 2017

Front-End Development Certification Achieved!

291 Coding challenges later... Free Code Camp Front-End Development Certification achieved!

The last project assignment was to build a Simon Game: I built Simon 20 - complete with 3 speed levels, and a cheat mode! Initial functional development was completed in 8 hours. But follow-up tweaks and enhancements cost another 2 days, so it went about 3 days in total.

My Free Code Camp public profile indicates I began the course on Oct 18, taking one full calendar month.

The course was fun and helped a lot with keeping with practical everyday exercises.

Next up: Well, I was going to start into exercism.io, but looks like their site isn't as secure as one would hope (no SSL cert for HTTPS). I had to sign out and revoke my API Key :'( Strange I didn't notice when I signed up - it's one of the first things I typically check on with a site I intend to work with.

-Keith D Commiskey

Friday, November 17, 2017

A little... Tic Tac Toe?

I'm near complete with the Free Code Camp Front-End Development Certification course. 291 coding challenges and I'm on my last... Haven't read through the specs yet, but based on my last four projects, I'm guessing it'll run me another 3-4 days.

My last project was a Tic Tac Toe game, in which you can play person-to-person, or you can play against the computer.

If playing against the computer;
- The computer will try to win, where possible; and try to block where it can.
- Winning tiles highlight.
- You can switch sides (between X's and O's).
- Keeps score (scores swap when sides are swapped).
- Has a random wait time for while computer is 'thinking'.

Play Tic Tac Toe on CodePen:

I dare say it wasn't as much fun as creating Guess Right (and be happy), but games are fun to create in any case.

-Keith D Commiskey

Saturday, October 14, 2017

CS50 Final Project

Character Counts (a Chrome web extension)

My Final Project for Harvard's CS50 course.