MAC Adding Message to Terminal


In a previous post called powershell-profile-shortcuts   I showed you how I could customize my terminal (in that case PowerShell or Cmder) to print out a customized message (Sociable Geek) when I started it up in order to personalize it a bit. This of course is purely for show and serves no real purpose except for the fact that I like it.  Working on my Macbook Pro I wanted to do the same thing when I started up Terminal (or ITerm2).  This turns out to be really simple.  All you need to do is open up terminal and type the following command.

sudo pico /etc/motd  (which stands for message of the day)

next type in your machine admin password

When the file is open, all you need to do is paste in your message, or in my case, my large ascii art version of Sociable Geek.  I used this generator!online!asciiart

Then just save the file (^X)

Answer Yes to override the file, then enter.

When you close and open terminal, you will now have your custom message.


Installing Bash on Windows


Why I am installing it.

As you can see from by the direction of my blog, I have been working on the command line a lot.

I will have to admit, for someone who was a GUI man, it was painful at first.  But now I am used to it.  In addition to just command line, I have been working with Linux quite a bit.  There comes a point where you want to use the same commands wherever you are so that you don’t have to remember two commands for one thing (one on windows and another on linux).

During the //Build 2016 keynote, Microsoft announced that we would have Bash on Windows 10.  This is not Bash running as a VM but these are native bash Linux binarys running on Windows via Ubuntu.  This means that all of the commands that I find myself running on Linux I can run on Windows so as my vocabulary (command line vocabulary that is) increases, I can use it everywhere.  Now, I have been kind of doing this using Cygwin, which is a command line utility for Win32, but it was not the same.

How do I install it

First of all, you have to be on Windows 10.  Next you will have to be a part of the Windows Insider Program.  Make sure you sign up using the same Microsoft ID you use to sign onto windows 10.  Next, you want to change your Windows Update settings.

Hit the Windows Key, Type “Windows Update”  and select Check for Updates from the list



Next, click on the Advanced Options link at the bottom.



Under Get Insider Builds select Get Started.



It will warn you as to what you are about to do.  Please read this because of course this is beta.



It will prompt you to restart your PC.

Once rebooted, you will need to set the builds to the “Fast Ring” in order to get Bash. You do this by sliding the slider all the way to the right. (In Update Advanced Options




Once you do this, you are on your way to using Bash on Windows.



GitHub Continuous deployment to a Raspberry Pi


So, Im still playing with the Raspberry Pi while working on the wackcoon project (more to come on that) and I have the need to work in a group.  Instead of just using SCP to get files over to my device, I wanted to be able to have my Raspberry Pi update whenever there was an update to the master branch of the node project I was working on.  This would facility being able to work with a remote team (where the pi is in my network) and theoretically, if I had multiple wackcoon devices (although I have not thought about how to implement that yet.


To accomplish this, we will need the following.

  • A GitHub hook on the repository
  • A node app on the pi listening for messages from GitHub
  • A way for the pi to be reached from the internet

Github hook

The first thing we want to do is set up a hook on our github repository.  To do this, go to your GitHub repository click on the settings tab –> Webhooks & services –> Add webhookpideploy1


In the Add webhook screen we need to add just a few things :

  • Payload URL –  This is where it will send the information to whenever events happen on your master branch.  I will show you how I set this up in the next step.
  • Content type – You can select application/json (what I am using) or  application/x-www-form-urlencoded
  • Secret (not required) – this is a secret you supply to verify on the sender
  • Events – Which events you want to trigger this hook. The default is the push event and is what I am using for this example but there are many to choose from depending on your needs

(NOTE:  To learn about webhooks in depth, check out the documentation )

Fill out this information and click on Add webhook



A node app on the Pi

The next step is to set up an application on the pi that will receive the event.  You can see what I have set up by looking at the wackcoon-hook project

All of the code is in the app.js file (check project for full code) .  It is a node site using express that has a route for a post on /payload.   So for instance, in this app it will be listening on http://localhost:5000/payload  (yes… localhost, we will get to that in a minute)






so lets look inside my express route for post.


The first thing I do is look through the JSON that the webhook sent me for a couple of pieces of information (there is a ton, I will post an example at the bottom of this post, or look in the docs)  I am just pulling out who did the push, and what repository they pushed to.

console.log( + just pushed to +;

Next, after writing a simple message to the console, I am using a core node module called child_process that will allow me to run commands on the machine it is running on.

I call git, the folder I want to run it on, the command, and any flags i want.  Since I might be using SCP to send files over the the Pi when testing, I hard reset it, clean it, pull, and then do a npm install in case any modules were added ( an added step could be to look through the JSON to see if the package.json was modified before running that last one, but I am not doing that), and finally running tsc since we are using typescript in the project.

	// reset any changes that have been made locally
	exec('git -C ~/projects/wackcoon-device reset --hard', execCallback);

	// and ditch any files that have been added locally too
	exec('git -C ~/projects/wackcoon-device clean -df', execCallback);

	// now pull down the latest
	exec('git -C ~/projects/wackcoon-device pull -f', execCallback);

	// and npm install with --production
	exec('npm -C ~/projects/wackcoon-device install --production', execCallback);

	// and run tsc
	exec('tsc', execCallback);

Obviously, make sure you run this project on your pi using  node app.js from the terminal

Again, you can see see the entire project looking at the wackcoon-hook project

A way for the pi to be reached from the internet

Since this site is running on localhost, we need a way for GitHub to access this site. There are quite a number of ways for you to accomplish this. You could use port forwarding on your router to make it accessible to the outside world.  Or you could use one of two dev tools that I have used.

localtunnel –  localtunnel is an npm module that will run on your pi (or other devices ) that allows you to set up a “tunnel” from your local port to a mapped url that you can use point git hub to.   This is an opensource free npm module. I have used it but it is a bit flaky, it will shut down periodically and you have to re-run it.  If you need help setting this up, here is a great tutorial to help you.

ngrok – –  This is a free teir, paid tier serves that, in there words helps you create “Secure tunnels to localhost” to answer the question ”I want to expose a local server behind a NAT or firewall to the internet.”  If you need help with this, you can check out this tutorial

That’s it, that is all you need.  Now you can work as a team and have them push to your master branch on GitHub and it will automatically push it to your pi.  If you have any questions fell free to ask them in the comments.



As promised, here is the JSON that is sent from the webhook

########## Headers ##########

Request URL:
Request method: POST
content-type: application/json
User-Agent: GitHub-Hookshot/0b0c52f
X-GitHub-Delivery: 7507b280-318c-11e6-9322-eaaef242aa6c
X-GitHub-Event: push

############ Body #########

Webhook –

  • {
      "ref": "refs/heads/master",
      "before": "3d23741be4de283f6bbfc10634c6b6ca909b8efc",
      "after": "0035745ae9ef481ac1477da1296b5253a2d22c0a",
      "created": false,
      "deleted": false,
      "forced": false,
      "base_ref": null,
      "compare": "",
      "commits": [
          "id": "0035745ae9ef481ac1477da1296b5253a2d22c0a",
          "tree_id": "5d2e67e1235f175b93332125379924814cc357f3",
          "distinct": true,
          "message": "swapping out resemblejs for node-resemple-js",
          "timestamp": "2016-06-15T10:56:04-07:00",
          "url": "",
          "author": {
            "name": "Daniel Egan",
            "email": ""
          "committer": {
            "name": "Daniel Egan",
            "email": ""
          "added": [
          "removed": [
          "modified": [
      "head_commit": {
        "id": "0035745ae9ef481ac1477da1296b5253a2d22c0a",
        "tree_id": "5d2e67e1235f175b93332125379924814cc357f3",
        "distinct": true,
        "message": "swapping out resemblejs for node-resemple-js",
        "timestamp": "2016-06-15T10:56:04-07:00",
        "url": "",
        "author": {
          "name": "Daniel Egan",
          "email": ""
        "committer": {
          "name": "Daniel Egan",
          "email": ""
        "added": [
        "removed": [
        "modified": [
      "repository": {
        "id": 60712114,
        "name": "wackcoon-device",
        "full_name": "DanielEgan/wackcoon-device",
        "owner": {
          "name": "DanielEgan",
          "email": ""
        "private": false,
        "html_url": "",
        "description": "",
        "fork": false,
        "url": "",
        "forks_url": "",
        "keys_url": "{/key_id}",
        "collaborators_url": "{/collaborator}",
        "teams_url": "",
        "hooks_url": "",
        "issue_events_url": "{/number}",
        "events_url": "",
        "assignees_url": "{/user}",
        "branches_url": "{/branch}",
        "tags_url": "",
        "blobs_url": "{/sha}",
        "git_tags_url": "{/sha}",
        "git_refs_url": "{/sha}",
        "trees_url": "{/sha}",
        "statuses_url": "{sha}",
        "languages_url": "",
        "stargazers_url": "",
        "contributors_url": "",
        "subscribers_url": "",
        "subscription_url": "",
        "commits_url": "{/sha}",
        "git_commits_url": "{/sha}",
        "comments_url": "{/number}",
        "issue_comment_url": "{/number}",
        "contents_url": "{+path}",
        "compare_url": "{base}...{head}",
        "merges_url": "",
        "archive_url": "{archive_format}{/ref}",
        "downloads_url": "",
        "issues_url": "{/number}",
        "pulls_url": "{/number}",
        "milestones_url": "{/number}",
        "notifications_url": "{?since,all,participating}",
        "labels_url": "{/name}",
        "releases_url": "{/id}",
        "deployments_url": "",
        "created_at": 1465402669,
        "updated_at": "2016-06-08T16:26:28Z",
        "pushed_at": 1466013392,
        "git_url": "git://",
        "ssh_url": "",
        "clone_url": "",
        "svn_url": "",
        "homepage": "",
        "size": 212,
        "stargazers_count": 0,
        "watchers_count": 0,
        "language": "TypeScript",
        "has_issues": true,
        "has_downloads": true,
        "has_wiki": true,
        "has_pages": false,
        "forks_count": 0,
        "mirror_url": null,
        "open_issues_count": 0,
        "forks": 0,
        "open_issues": 0,
        "watchers": 0,
        "default_branch": "master",
        "stargazers": 0,
        "master_branch": "master"
      "pusher": {
        "name": "DanielEgan",
        "email": ""
      "sender": {
        "login": "DanielEgan",
        "id": 6954533,
        "avatar_url": "",
        "gravatar_id": "",
        "url": "",
        "html_url": "",
        "followers_url": "",
        "following_url": "{/other_user}",
        "gists_url": "{/gist_id}",
        "starred_url": "{/owner}{/repo}",
        "subscriptions_url": "",
        "organizations_url": "",
        "repos_url": "",
        "events_url": "{/privacy}",
        "received_events_url": "",
        "type": "User",
        "site_admin": false

Remote Debugging Node on a Raspberry Pi

raspberry-logoI have been working on a project called Wackcoon (more on that later) that uses Node and runs on a Raspberry pi.  Like all development projects, I needed to debug not only my work but sometimes errors being thrown from node modules that I am using. Wrapping up my code in Try/Catch blocks and sending the error to console.log() got old really fast.  Since I could not test locally since I am running Linux on the raspberry pi,  I wanted to use Visual Studio Code to remote debug my project on the raspberry pi device itself.

The raspberry pi is on my network at home so on the pi I rand a ifconfig command to get the ip address of the device.

Then I went to Visual Studio Code and clicked on the debug icon (little bug in figure below)  I also made sure that Attach was selected in the debug dropdown on top.


Next I modified my launch.json file.  This is created the first time you run debug ( the green arrow ) .  In the launch.json file there are two sections.  One configuration is for launch ( debugging locally) and the other is for attaching to a already running process.  I put in the IP address that I got in the last step.


Now on the raspberry pi, I open a terminal and run the app using the –debug-brk option.  I can also just use the –debug option but the first one will have the application pause and wait for me on the first line of my code.


Now when I start my debug in Visual Studio Code (green arrow) you can see that it is sitting in break mode at line one.


I can set breakpoints, step in, step over, Step out, add watches, etc.. since this is being streamed from the pi, I cannot modify it on the fly like you can when you debug locally but still pretty cool.

Hope this helps




Syncing my PowerShell profile between machines



Ok.. once again we are on the topic of PowerShell.  This is a simple tip but is helpful if you use different machines for your development. I use three different machines, and as you can see by a few of my posts, I have a few modifications to my PowerShell Profile.


So it is import for me to have all of my machines use the same profile in order to keep them in sync.  In order to do this I have a profile named SharedPowershell_profile.ps1 located in my dropbox (one drive others will work as well).  Then in the profile on my local machine, my profile looks like this.






I do this on all of my machines, and so whenever I make a change to the shared profile all of the machines get the change.

That’s it :)

If you are looking at doing this in a more secure way, or on a file share, check out the post by Jason Helmick



More PowerShell Function Hacks



Following up on my last post (PowerShell Profile Shortcuts), I have another really cool hack if you, like me, are creating many github repositories for hackathons or demos.


Wouldn’t it be cool if you could use the following from the command line

createrepo mynewrepo

And it would

  1. Create a repo on git hub
  2. Clone it locally
  3. CD into that directory
  4. Create a file
  5. Create a package.json
  6. Create a basic gitignore file
  7. Add all files using git add .
  8. Create a commit
  9. Push back up to your repo

Well you can, just create a function in my powershell profile to do all of this. (See below)

There are three prerequisites:

  1. Install gh —   (npm install -g gh)
  2. Install gig       (npm install -g gig)
  3. Set up npm init defaults (
  4. change references to your own github account (says YourGitHubAccount in code now)

To modify your powershell profile

If using VS Code  just type code $profile from your powerhell command line. Otherwise, there are plenty of tutorials on how to modify your profile like this one (

Either way, once you get it open, just paste this in (after prerequisites above) and change the github account to yours.

Function createrepo($reponame){
  #need to install gh --- npm install -g gh
  gh re --new $reponame -B false
  git clone$reponame.git
  cd $reponame
  #need to install gig npm install -g gig
  gig gen node
  #need to have defaults set up for this (
  npm init -y
  #now add a readme file
  echo "# $reponame" >>
  echo "## Synopsis" >>

  echo "At the top of the file there should be a short introduction and/ or overview that explains **what** the project is. This description should match descriptions added for package managers (Gemspec, package.json, etc.)" >>

  echo "## Code Example" >>

  echo "Show what the library does as concisely as possible, developers should be able to figure out **how** your project solves their problem by looking at the code example. Make sure the API you are showing off is obvious, and that your code is short and concise." >>

  echo "## Motivation" >>

  echo "A short description of the motivation behind the creation and maintenance of the project. This should explain **why** the project exists." >>

  echo "## Installation" >>

  echo "Provide code examples and explanations of how to get the project." >>

  echo "## API Reference" >>

  echo "Depending on the size of the project, if it is small and simple enough the reference docs can be added to the README. For medium size to larger projects it is important to at least provide a link to where the API reference docs live." >>

  echo "## Tests" >>

  echo "Describe and show how to run the tests with code examples." >>

  echo "## Contributors" >>

  echo "Let people know how they can dive into the project, include important links to things like issue trackers, irc, twitter accounts if applicable." >>

  echo "## License" >>

  echo "A short snippet describing the license (MIT, Apache, etc.)" >>
  git add .
  git commit -m "first commit"
  #if you dont want it to prompt you for credentials every time run this : git config --global credential.helper wincred 
  git push -u origin master

Powershell profile shortcuts


Since I have been using the MEAN stack and node quite a bit lately, I have found my self to be using the command line all of the time.  Not just in using node and git, but also to create files (touch), launch my editor (code or subl), and work with mongodb (mongo).  My command line of choice for my windows machines is cmder (you can find it at ).  I will do another post as to why  I like it but in this post I wanted to show you just a few of the things I have added to make life easier from the command line.


First, cmder uses conemu ( ) which is not a shell, but adds features to the shell you prefer to use, in this case powershell.  The small additions to my profile that I am going to show you will work with powershell and so, in essence with cmder.

The first one is purely cosmetic.  When I load up powershell, I want it to do two things.

  1. start up in the folder that I choose
  2. show my branding on top of the screen


In powershell, anything not wrapped in a function will run when powershell is loaded.  So at the top of my profile file I have the following

When I start up PowerShell, it is branded with TheSociableGeek on top, and starts in my c:\projects folder.  To create the ascii text, you can use any online ascii art editor like

Here is what it looks like when PowerShell starts.


The next thing I wanted was the ability to create a directory and cd into it at the same time, which you can on mac terminal or Linux using the && characters. PowerShell does not like the  && characters.

So for this I created a function called mcd in which I pass the name of the folder I want to create.




as you can see, running the mcd command just calls the md (make directory) and cd (change directory) commands with the name I pass it.

Next, one of the things that happens all the time is that I use the clear command when the command window gets too cluttered.  I wanted something that not only cleared the window, but put my branding back up at the top like it does when it starts. Again, purely cosmetic, but I like it.

So I created a function called cl that clears the screen and prints out the ascii again.  I know, I could have used a variable and used this for both start up and the cl function, but I was lazy. (I also stole this idea from Jeremy Foster who has helped me with everything commandline.. thanks Jeremy)


Finally, the last one I will show you is just launching a browser.  Since I am working with node all of the time, I wanted a quick way to launch the browser from the command line.  I am not always using browsersync in my projects or demos, so I wanted a quick way to launch different browsers.  I created two functions for each browser. One for a default url, and the other to open a localhost port with a ability to name the port I wanted.

That way I can easily type something like chromelocal 8000  to launch the browser and get to testing things out.

Anyway, that’s all I wanted to share of my profile for now.  Hope this helps someone.

Daniel – TheSociableGeek



Node.js intellisense

node-jsWorking in my node projects and presentations I pop back and forth between both Sublime Text 3 and VS Code but I find myself increasingly just using VS Code.  One of the reasons is that I am able to get great intellisense using the node and express typescript definition files.

As you can see by the screenshots below, even when I am just creating a simple server using the node http module, with VS Code, I get that great “.” intellesense.


This is invaluable for any developer but especially for developers new to the stack that might not have all of the methods available stored in their head.

Getting node and express intellisense in VS Code

In order to get specific package intellisense in vs code you will need to install a couple of things.  There are a number of ways to do this but I am just going to use the command line (powershell or Terminal in OSX).  The first thing you need to do is to install TSD globally.

npm install -g tsd

When installing this will tell you that TSD is deprecated in favor of Typeings(  but I use TSD anyway.  Both will work similar with this a bit of a syntax difference when installing the tsd’s.

Once tsd is installed globally.  Make sure you are in the project folder that you need the intellisense in and run the following commands.

tsd query node --action install
tsd query express --action install

This will install the type definition files for both node and express. If you need tsd files for other things you can see what is available either at the github repository (where tsd pulls these files) or the website


I have tried to find a way to do this with sublime.

I checked and found under IDE tools sublime-typescript but it said it was not maintained anymore and sent me here : which itself is no longer maintained, which directed me here : which is a fork of the last one and seems to be maintained but when I install it, I don’t see it giving me the intellisense I am looking for.

So at this point, I cant seem to get this in Sublime. If someone knows a way to implement this through a plugin, please let me know.