Hosting a Meteor app on Ubuntu using Node, Mongo, and PM2

 

meteor

Recently I had to start hosting a Meteor app on Ubuntu.  The process is pretty straightforward however there are a few gotchas.  This post is really just to help me remember in the future.

First, clone your repo on the target server or move the source files there before you compile/build the app.  This is important if you are using a different OS than what your server is.  I ran into issue when compiling it on OSX and moving it to Ubuntu.

After moving the files, install meteor.

Then compile your app

It will create a archive for you.

Extract it to the directory you will host the app

cd into the server folder

install node modules

install pm2

cd back to the app bundle dir

create a process.json file

add your configuration

create a shell script

add bash script

make it executable

run the bash script

run pm2 startup

this will output a command to run, run it

save current process

All set! Check the status of your app

You should see something similar to this

 

Also, here is a sample nginx site configuration using Let’s Encrypt SSL

 

Connecting Physical to Virtual with my Raspberry Pi

Over the last few weeks I have tinkered with a Raspberry Pi 2 and I have to say it has been pretty fun.  I built my Pi with a Zebra case, 32GB micro sd card, a few heat sinks, and a bread board kit so I can easy connect things to my GPIO.  I also picked up a TP-LINK TL_WN725N USB NIC for WiFi.  I chose this one specifically because it has drivers for both Linux and Windows.

I have gone back-and-forth on which operating system I am going to run on this little device.  I have tested Raspbian and Windows 10 IoT core.  I ended up settling on both.  I have 2 microSD cards, one with Windows 10 IoT core, and one with Raspbian, RetroPie, and OSMC.  I used BootBerry boot loader to install multiple version of Linux on the second microSD card.

So far I am sticking with Windows 10 IoT Core, a few reasons:

  • I am much more proficient at C# than I am python or any other compiled language
  • Windows 10 IoT can run python and even Nodejs if I choose
  • Using Visual Studio to deploy and debug directly to my Raspberry Pi is awesome – I am use to this workflow from developing Windows 8/10 and Windows Phone apps

This isn’t an exhaustive list nor is it meant to help anyone make any decisions on what to use, it is just my preference – for the moment at least. We’ll see how things go.

I am hoping to build an LED panel that I can push messages to over http.  I have made progress over the last 2 weeks.  You can check out some of my code here:

My GitHub Repos

Here are some videos of my progress

 

Turning on a light for the first time

 

Scrolling text on my small LED panel

 

 

Windows 10 Launches Tomorrow. Get It Free Today.

This my Tech PSA for everyone out there not following Windows 10 or tech news in general.  Windows 10 launches tomorrow and if you are running Windows 7 or 8, you get it free. So how do you get it?  Easy.

Look in the system tray for the Windows logo.  For those less tech savvy, that’s the area in the lower right next to the clock.

Click on the Windows logo and follow the prompts to reserve your copy.

Windows 10 should start downloading in the background and as soon as it is released tomorrow you will be able to start the upgrade.

If you’re not sure if Windows 10 is right for you, you can check out all the new features here.  My answer is: If you’re running Windows, yes, you want Windows 10.

Delete cookies for a single site or domain in all browsers

Cookies-Delete

Sometimes when debugging a web site you are working on, you want to clear out cookies for a single site however you don’t want to clear out all of your cookies.  Some cookies you want to leave there, like your cookies that are set by Gmail/Facebook/Twitter/Outlook.com for 2 factor authentication or many other reasons.  Up until now I have cleared them all out each time I need to clear cookies for a single web site I am working on.  Here’s how you can clear cookies for a single domain and keep those time saving cookies.

IE

  • Hit F12
  • Click on Network
  • Click Clear Cookies for domain

Chrome

  • Click the Chrome menu Chrome menu on the browser toolbar.
  • Select Settings.
  • Click Show advanced settings.
  • In the “Privacy” section, click the Content settings button.
  • In the “Cookies” section, you can change the following cookies settings:
  • To delete a specific cookie, hover over the site that issued the cookie with your mouse, then click the X that appears on the right corner.

Firefox

  • Click the menu button and choose Options
  • Select the Privacy panel.
  • Set Firefox will: to Use custom settings for history.
  • Click Show Cookies…. The Cookies window will appear.
  • In the Search: field, type the name of the site whose cookies you want to remove. The cookies that match your search will be displayed.
  • Select the cookie(s) in the list to remove and click Remove Cookie.

Safari

  • Choose Safari > Preferences, and then click Privacy.
  • Click Details.
  • Select one website that stores cookies, and then click Remove
  • When you finish removing websites, click Done.

Our trip to Banff, Alberta Canada

A little off topic but I just wanted to share some pictures and a video of our trip to Banff.  We flew in to Edmonton, drove to Banff, Lake Louise, and stayed on Canmore.  We go to see quite a bit the few days we were there.  After a long weekend, we flew back to the States out of Calgary, Alberta.

 

 

 

This is a collection of videos from my phone that I captured while in Banff, Alberta – Canada.  Everything was taken using my Lumia 1020 Windows Phone.

 

How to Cache Output in ASP.NET Web API 2

ASP.NET Web API is a simple way to create a pretty nice and robust API.  I have a need for a simple API and ASP.NET fit the bill.  I created an API for my Space Weather application for all of my clients to connect to.  The API is pretty simple, it just feeds the clients objects in JSON for them to parse and bind to the UI.  After rebuilding my Azure virtual machine, I decided to add some caching to the results.  Since Web API doesn’t include an easy way to cache output like MVC did I had to find a solution. For me, the best (an easiest) solution was OutputCaching.  It’s super simple to set up.

Get the NuGet Package

Grab Filip W’s CacheOutput library.  I am using WebAPI 2.  I used package manager to get it:

This handles 90% of it.

Add the Attribute

The rest is just decorating your controllers just like you would for MVC.

In my example,  I am telling it to cache the results for both client and server-side for 600 sec (10 min).  There isn’t a whole lot of science behind choosing 10 minutes, and I could have written some fancy code to figure out when my scheduled job ran last but I wanted to keep it simple.

Test

So, did it really work?  Let’s fire up Fiddler and find out. Hit your web endpoint, and take a look:

Sure enough, you can see the client is told to cache for a max of 600 and you can see the ETag letting you know that the server is caching.

Conclusion

So why do I choose to cache my output?  Simple.  I have a micro virtual machine on Azure and I didn’t want each and every web request to retrieve results from my database creating lots of churn and processing resulting in more disk activity and slower results.  Before going and implementing this I suggest you first evaluate your needs.  My needs are to return slow changing results to mobile clients as fast as possible without creating a lot of churn on the server.  I don’t want my customers to wait for results, especially if the result is the same.  My results change 4 times an hour and so caching this is the right thing to do in my scenario.  With that being said, I think this NuGet package help me meet this goal.

(Hanselman recommends Cache.Cow, although I like the simplicity and familiarity of decorating my Web API controllers with attributes using CacheOutput.)

Did a recent Windows update break setting an iframe source in Windows 8.1 apps?

I have a Windows 8.1 application that is a wrapper around a web site. I have 3 versions of the site that the user can switch between with a control I built. The control sets the iframe source to the respective site.  It seems like a recent Windows update  broke this (not sure if it was 05/2014 or 06/2014). Here is how I set the iframe’s source:

Nothing odd here.  Just some plain old JavaScript setting the window location.  The window location never changes but I do see an error.

Here is the error I get in the JavaScriptConsole:

APPHOST9624: The app cant use script to load the https://www.example.com/ url because the url launches another app. Only direct user interaction can launch another app.

I have even tried adding the site to the ApplicationContentUriRules in the manifest but it didn’t fix it.

Truth be told, the user is not interacting with the app on this specific event, the control is in a settings flyout and is invoked when the selection changes.  BUT, technically it is not launching another app (if I take the error message as is).  I’m not  launching a new window with that location, I am setting the current window to a new location. It works when the app loads for the first time but not when I hook into an event that is driving from a selection control item changed event.  It still works if I target Windows 8.0.  I am hoping this is a bug and it will be reversed, otherwise I will have to come up with another solution for changing sites.

Is anyone else setting an iframe source this way in a Windows 8.1 app?  Is there a better way to do this?