Uploading Images on Paste in Typora

Do you use Wordpress? Consider using Typora and the free image uploader “upgit” to make embedding images automatic.

I’m a big fan of using a very simple user interface for writing. It helps clear the mind.

I generally draft articles using Typora, and have increasingly turned to markdown format for my articles. When I’m ready to publish, I copy and paste them into my WordPress-powered blog. Since I work on both Mac and Windows, I like to keep my draft articles on a personal OneDrive, and then I can edit them on either a laptop or desktop when I want to.

With this system, adding text, heading, formatting and tables works really well, but images are one thing that doesn’t quite work out-of-the-box. That’s because as you write, Typora will save a pasted image locally to your hard disk, but when you go to paste it into WordPress, the links will of course still point to local files. That obviously will break these images when posted. Now, you can manually go through and upload them all, but that’s a hassle when it it comes to publish-time.

Luckily, Typora has a great feature which lets you customize what happens when an image is pasted into the editor. We’ll use this feature to tell it to call a utility called “upgit” to upload the image to a service provider.

Oh, and I’ve chosen Github to host these images — because they let you put a lot of stuff up there for free — but upgit supports a bunch of other image-hosts as well.

Upgit to the Rescue

Go to pluveto/upgit on Github to download and install the version appropriate for your operating system. There’s a configuration file you need to create in the folder you put it in.

I have a Mac and a Windows machine.

On my Mac, I put upgit into the /Applications folder. On Windows, I have a single folder I use for utilities, called “/bin”. I created a folder, “/bin/upgit” and placed the upgit executable in that folder.

If you’re a Mac user, you’ll need to rename your download to simply “upgit”, and then do the following, to make it executable:

You’re almost done, but you also need a config.toml file (the repo gives an example), which at a minimum needs your Github username and Personal Access token, and the name of the repository to which to save images. I created a public repo called “media” to save the media.

Once you’ve got upgit configured to upload images from your local directory, all you need to do is tell Typora to call out to “upgit” when an image is pasted into the file. To do this, go to Typora > Settings:

Go to the “Images” panel, and set the values as indicated here:

Voila! Now, when you paste in an image from the clipboard into Typora, there’s a very short delay and it automatically (1) uploads the image to your Github repo and (2) changes the link reference to that remote image! Fantastic. Simple, and (with the exception of the affordable Typora pricetag), free.

50+ Ideas for Your Socially Distanced Spring

At this writing in Seattle, amid the COVID-19 outbreak, nearly all schools have announced closure, and have gone (or are soon going) to remote learning. Many workplaces have also done the same, and public officials are encouraging people not to gather in large groups.

First, please read this excellent summary from Tomas Pueyo as to why we need to implement social distancing now, not in the future, but now.

I think it may be apocryphal, but I’m told that when the Chinese write the word “crisis,” they write it as two characters which literally mean “dangerous opportunity.”

What are the opportunities to be productive and happy while under “stay at home” restrictions? Here’s a starting list.

Feel free to add your own in the comments section below.

  1. Organize office and filing cabinets
  2. Weed out closets for eventual donations
  3. Binge watch: I can heartily recommend Succession, OZARK, The Crown, McMillions$
  4. Read: for non-fiction, I can heartily recommend Bad Blood, United States of Arabia, Devil in the White City, Unbroken, and Battle Cry of Freedom. You?
  5. Master making bread. Have you tried making No Knead bread in a Dutch Oven? Amazing.
  6. Take an online course. Udemy.com has terrific online learning; I’ve done courses on Angular, Python, React, Swift and more. There’s always something to learn.
  7. Learn or improve your musical instrument skills. Piano? Guitar?
  8. Hand-write a letter or two to a friend or relative.
  9. Start that blog or podcast that you’ve always wanted to
  10. Organize a Google Hangout or WebEx/Zoom meeting to teach something you know to your kids’ class.
  11. Review documents you’ve stored in boxes, shred and purge
  12. Not to be morbid, but consider finally writing down that document of what loved ones should do if you should fall ill or be incapacitated for any reason, and make sure they know where it is.
  13. Start a video blog
  14. Purge T-shirts from previous years’ fun-runs that I will never wear for yard work.
  15. Eat dinner as a family and share stories. Maybe show the family slideshow.
  16. Break out the jigsaw puzzles.
  17. Check in on elderly and immune-compromised neighbors especially. Make sure they know how to reach you. Can you get them food or deliveries? Do they have a contact plan in place?
  18. Consider offering to advance-pay those whose businesses may be disrupted by this virus (dog-walkers, housecleaning, hell, even your favorite restaurants with gift certificate, etc.)
  19. Advance plan your Christmas or Holiday gift list for 2020. Your November/December self will thank you!
  20. Finally make that checklist of yearly home maintenance tasks, so you don’t forget anymore what needs to happen every October, December, or April.
  21. Build something cool with Raspberry Pi or Arduino, maybe with your kids if you have ’em. Here’s an Enchanted Rose with Falling Petals I made. And here’s a Photo Booth.
  22. Update that household budget, or do a pie chart of what you spend on what. Consider tools like Mint and SigFig.
  23. Organize your digital files, and finally get that backup strategy in place. What’s your backup strategy for photos, in particular?
  24. Enter your favorite family recipes on a tool like BigOven (https://bigoven.com) and share the link with family members.
  25. Start a garden
  26. Watch the upcoming Paris to Nice bike race this week, “The Race to the Sun”
  27. Fix any home technology that might not be working
  28. Move/ switch out the art on the walls. Makes your home feel fresh!
  29. Take long walks or a jog outside and enjoy the trees and flowers that are starting to bloom. You don’t have to be a shut-in, but you should keep a distance and avoid large groups, washing hands before and after.
  30. Thinking of all our “Grand Friends” that are now isolated and hunkered down [Editor’s note: these are assisted living residents that many of our kids made connections with via their school.] How about sending snail mail? Thinking kids can write letters and send art. Let’s spread some love.
  31. Print digital photos and put in frames/ photo books
  32. Wash the windows!
  33. Research family history
  34. Finally apply for citizenship if you’ve got a foreign parent
  35. Ask your favorite neighborhood restaurant if you can prebuy food, say, a gift certificate. If they say they don’t offer them, ask for the email contact of the owner and email them. They’ll likely appreciate it.
  36. Remember that hikes in the wilderness are (for now at least) totally fair game. Avoid surface contact at restrooms etc. AllTrails is terrific.
  37. Organize cupboards and pantry. Labels really help!
  38. Have your children wash your car
  39. Change passwords on online accounts and/or get a password manager like LastPass and deploy it
  40. Exercise
  41. Teach your kids important things they need time to study but don’t necessarily learn in school – the stock market, checkwriting, bank cards, billpaying, etc.
  42. Fix that nagging loose doorknob that’s been bugging you
  43. Document common home fixes or routine maintenance items via video recording, perhaps even put it into a blog
  44. Set up a Network Access Storage device like Synology and centralize ALL home photos and video on it, with an offsite backup strategy
  45. Look for items to donate in your home; you might not be able to bring them to Goodwill immediately, but get them put aside, bagged, boxed or labeled for easy donation later.
  46. Plan your next vacation, but maybe don’t yet book it
  47. Get your long-postponed earthquake preparedness kit together (yes, other disasters don’t care much about COVID-19)
  48. Figure out some key metrics of your household spending — e.g., how much do you spend on dining out? Do you know the percentage? You might be surprised.
  49. Write down five goals you’d like to achieve in the next ten years, and have your spouse/partner do the same. See how they compare.
  50. Write an encouraging note to your neighbor.
  51. A couple months after this COVID crisis has passed, I’ll be hosting a “Drink, Talk Learn” party. So I’ll be working on a presentation for that. Consider making a 3 minute Powerpoint deck on any subject you’re passionate about.
  52. Interview an older relative for StoryCorps via the StoryCorps app, on any aspect of their life.
  53. Donate to your favorite charities, or research new ones in the fields you’re most passionate about.
  54. Get the family bikes out one by one, and get them ready to ride.
  55. Clean out the garage (should be OK to do solo if not in contact with COVID surfaces.) Use mask and wipes to be sure; lots of surfaces to be sure.
  56. There are approximately one bazillion clever craft or make-at-home projects on Pinterest and Instructables. Choose one.
  57. Break out a great board game with the family or neighbor. Some good ones are Ticket To Ride, Settlers of Catan and Codenames.

Git and GitHub: Tips and Tricks

Using Git to manage your code? We all know about git init, commit, etc. But here are some handy git commands for common scenarios:

Clone from GitHub

git clone {github url}

Unlink your Local Repo from GitHub

Ever want to use an example app on GitHub as a starting point for your application or component, and want to unlink it from the original GitHub address?

This can be done in two steps:

git remote rm origin

This will delete the config settings from .git/config.

Then, issue

rm .git/FETCH_HEAD

to get rid of the FETCH_HEAD, which still points to GitHub.

Help with the Most Common Git Commands

git help everyday

Search your Change Log

Where was that checkin that I did which altered the “foo” class? 

git log -S foo

List all Conflicting Files

git diff --name-only --diff-filter=U

Reword the Previous Commit Message

git commit -v --amend

Deploying an Angular 6+ Web App to Azure

The process of deploying an Angular 6+ application to Azure is pretty Byzantine, but here are the basic steps to get it going.

I really like Microsoft Azure, but the process of deploying an Angular 6+ app is complex, and filled with some very big hidden gotchas. As of this writing, you cannot just spin up a web app instance, push Angular code to it from a repository and have it run; you need to take several steps first.

Here are the essential steps. Note that another and in many cases better approach is to use containers, such as Docker, but I’m not going to cover that here. In this post, I’ll walk through running your Angular app directly on an Azure web app instance.

Before you begin

Make sure your production build is working on your local machine:

ng build --prod

This command should create a dist folder right off the root of your Angular project. If it doesn’t build on your machine, it’s not going to build once it’s deployed to Azure. Normally in development you’re using:

ng serve

but this only runs Angular on the development server, which is not suitable for production environments.

Jot down a couple things from your local build machine. Let’s find out which version of Node you are running (and npm version), because you’ll want to replicate it on Azure. On your local machine, open up a command shell, and type:

node -v

In my case, I get: v10.6.0 at this writing. So I’ll be remembering “10.6.0” as a value when I tell Azure what version of Node I want it to use in the “Application Settings” step below.

Make these modifications to your local Angular app:

  • Azure’s going to need to know how to build your app. To do this, open up package.json and copy a few “devDependencies” into the main root “dependencies” section. Here are the ones that were important to my project’s successful on-Azure build:
    "dependencies": {
    "@angular-devkit/build-angular": "~0.6.8",
    "@angular/animations": "^7.2.2",
    "@angular/cdk": "^7.3.0",
    "@angular/cli": "^7.2.2",
    "@angular/common": "^7.2.2",
    "@angular/compiler": "^7.2.2",
    "@angular/compiler-cli": "^7.2.2",
    ... }

    While still in package.json, look at the “scripts” section toward the top of the file. Make you have an entry for “build” : “ng build –prod”. You’ll see in the deploy.cmd file below that we rely upon that command to do the actual build on Azure. You do not commit the dist folder to GitHub; rather, you commit the code source, and Azure first copies over the GitHub code, then it runs an ng build –prod, and it copies the results of the dist folder to the Azure production directory that you define in Application Settings.

    "scripts": {
    "ng": "ng",
    "build": "ng build --prod",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
    }

    Note too that the “start” command was removed, which seems to confuse Azure; you don’t want Azure trying to “ng serve” your application, because that would try to invoke the development server, which is not suitable for production.

Let’s Create an Azure App

We need a Web App instance to work with. We will then configure the Application Settings to tell it which version of Node to run, what kind of deployment script to run after it sucks in all those files from GitHub when you publish a commit, and we will tell Azure where to look for the app directory.

  1. Using the Azure Portal, create a web app.
  2. Once that’s deployed, go to the Azure Application Settings for that web app, and update two key variables:
    1. App setting name: “WEBSITE_NODE_DEFAULT_VERSION” Set this value to indicate what version of Node Azure should spin up for you. I like to match my local dev machine exactly (nope, folks, I’m not yet using Docker for small deployments.) You can find this value on your local machine by opening up a command prompt and typing “node -v”.For me, at this writing, it’s 10.6.0, so that’s what I set the value of this variable to in Azure.
    2. You also need to tell Azure where to find the code to run, and it’s not going to save in the default directory — it’s going to save in the default directory appended with your project name. At the very bottom of the Application Settings area, you’ll see a section called “Virtual applications and directories”. You need to tell Azure where to go for the main virtual path of your site. It will generally be site\wwwroot\{your-angular-project-name}   That is, that’s what it will be if you follow the custom DEPLOY.CMD command below.
  3. Next, you’ll need to teach Azure’s web service how to build and deploy your app, once it pulls in all that code from GitHub.

    To do this, you create two files — one called “.deployment” and the other called “deploy.cmd.”

    In root level of your Angular project, you’ll need to create a custom deploy.cmd file which builds the “dist” folder and uses that as the main production code.

    To do this, we want to use a custom deploy.cmd, not just the standard Azure one. It does a production build, and then uses the results of the standard Angular dist folder as the main website code.

    Here’s what the files look like. The first filename .deployment (note the period before the word), and it belongs in the root of your Angular project. This simply looks like this:

    [config]
    command = deploy.cmd

    The second filename is the actual deployment script, called deploy.cmd, and it looks like this below. Note in particular line 61, which copies from the dist folder after completing that production build.

    Note that this file below not the plain vanilla deploy.cmd — it’s been slightly modified.

    @if "%SCM_TRACE_LEVEL%" NEQ "4" @echo off:: ----------------------
    :: KUDU Deployment Script
    :: Version: 1.0.17
    :: ----------------------:: Prerequisites
    :: -------------:: Verify node.js installed
    where node 2>nul >nul
    IF %ERRORLEVEL% NEQ 0 (
    echo Missing node.js executable, please install node.js, if already installed make sure it can be reached from current environment.
    goto error
    )
    :: Setup
    :: -----
    
    setlocal enabledelayedexpansion
    
    SET ARTIFACTS=%~dp0%..\artifacts
    
    IF NOT DEFINED DEPLOYMENT_SOURCE (
    SET DEPLOYMENT_SOURCE=%~dp0%.
    )
    
    IF NOT DEFINED DEPLOYMENT_TARGET (
    SET DEPLOYMENT_TARGET=%ARTIFACTS%\wwwroot
    )
    
    IF NOT DEFINED NEXT_MANIFEST_PATH (
    SET NEXT_MANIFEST_PATH=%ARTIFACTS%\manifest
    
    IF NOT DEFINED PREVIOUS_MANIFEST_PATH (
    SET PREVIOUS_MANIFEST_PATH=%ARTIFACTS%\manifest
    )
    )
    
    IF NOT DEFINED KUDU_SYNC_CMD (
    :: Install kudu sync
    echo Installing Kudu Sync
    call npm install kudusync -g --silent
    IF !ERRORLEVEL! NEQ 0 goto error
    
    :: Locally just running "kuduSync" would also work
    SET KUDU_SYNC_CMD=%appdata%\npm\kuduSync.cmd
    )
    goto Deployment
    
    :: Utility Functions
    :: -----------------
    
    :SelectNodeVersion
    
    IF DEFINED KUDU_SELECT_NODE_VERSION_CMD (
    :: The following are done only on Windows Azure Websites environment
    call %KUDU_SELECT_NODE_VERSION_CMD% "%DEPLOYMENT_SOURCE%" "%DEPLOYMENT_TARGET%" "%DEPLOYMENT_TEMP%"
    IF !ERRORLEVEL! NEQ 0 goto error
    
    IF EXIST "%DEPLOYMENT_TEMP%\__nodeVersion.tmp" (
    SET /p NODE_EXE=<"%DEPLOYMENT_TEMP%\__nodeVersion.tmp"
    IF !ERRORLEVEL! NEQ 0 goto error
    )
    
    IF EXIST "%DEPLOYMENT_TEMP%\__npmVersion.tmp" (
    SET /p NPM_JS_PATH=<"%DEPLOYMENT_TEMP%\__npmVersion.tmp" IF !ERRORLEVEL! NEQ 0 goto error ) IF NOT DEFINED NODE_EXE ( SET NODE_EXE=node ) SET NPM_CMD="!NODE_EXE!" "!NPM_JS_PATH!" ) ELSE ( SET NPM_CMD=npm SET NODE_EXE=node ) goto :EOF :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Deployment :: ---------- :Deployment echo Handling node.js deployment. :: 2. Select node version call :SelectNodeVersion :: 3. Install npm packages IF EXIST "%DEPLOYMENT_SOURCE%\package.json" ( pushd "%DEPLOYMENT_SOURCE%" call :ExecuteCmd !NPM_CMD! install --production IF !ERRORLEVEL! NEQ 0 goto error popd ) :: 3. Angular Prod Build echo Building App next... echo DEPLOYMENT_SOURCE is %DEPLOYMENT_SOURCE% IF EXIST "%DEPLOYMENT_SOURCE%/angular.json" ( echo Building App in %DEPLOYMENT_SOURCE%… pushd "%DEPLOYMENT_SOURCE%" call :ExecuteCmd !NPM_CMD! run build :: If the above command fails comment above and uncomment below one :: call ./node_modules/.bin/ng build --prod IF !ERRORLEVEL! NEQ 0 goto error popd ) :: 1. KuduSync IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" ( call :ExecuteCmd "%KUDU_SYNC_CMD%" -v 50 -f "%DEPLOYMENT_SOURCE%/dist" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd" IF !ERRORLEVEL! NEQ 0 goto error ) :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: goto end :: Execute command routin that will echo out when error :ExecuteCmd setlocal set _CMD_=%* call %_CMD_% if "%ERRORLEVEL%" NEQ "0" echo Failed exitCode=%ERRORLEVEL%, command=%_CMD_% exit /b %ERRORLEVEL% :error endlocal echo An error has occurred during web site deployment. call :exitSetErrorLevel call :exitFromFunction 2>nul
    
    :exitSetErrorLevel
    exit /b 1
    
    :exitFromFunction
    ()
    
    :end
    endlocal
    echo Finished successfully.

    Key Gotcha: both .deployment and deploy.cmd need to go in the ROOT of your GitHub Repository. (e.g., if you’ve got an Angular app project that’s a subfolder of your GitHub repo, still make sure you put those files in the ROOT of your GitHub repo, not the root of the Angular sub project.)

    The last steps are fairly straightforward:

  4. Get your Angular App hosted in a GitHub repository. There are several articles about this, here’s one.
  5. Tell Azure to deploy the app from GitHub (article.) Essentially, you go to the the Azure Portal, choose the web app, go to “Deployment” and set up “Deploy from GitHub.” It’s pretty straightforward if you already have your code in GitHub.

That’s it! Once you do those steps, you should then be able to get code working locally, commit it to GitHub, wait for a few minutes as Azure fetches the code from GitHub and builds it, and then serves it up on request to users visiting your website. Note again that it’s doing a production build, which is a higher level of code quality checking than the debug builds, so if your build suddenly starts failing on Azure, it’s probably not Azure’s fault, it’s probably because your production build doesn’t build locally. Best to do an ng build –prod before deploying to GitHub.

Of course, this is not a “best practice” for production builds — you should be deploying to one or more staging slots, running your test suites on the staging site, and flipping the slots into production, among other things, but that’s not in the scope of this post.

Routing

If you’re hosted on IIS, you’ll also want this web.config file shipped up to your Azure host so that Angular can take over the routing.

Troubleshooting Tips

  1. In the “Deployment” blade for your app on Azure, you should see it fetching code from GitHub when you do a checkin to the configured branch. If it doesn’t you might try detaching the connection and re-attaching the GitHub deployment.
  2. If you see it building and then giving a “Failed” message, check the Logs link and scroll through the output. If it says it cannot find any files in the d:\…\dist directory, it means the build did not succeed on Azure. The log file, as cluttered as it sometimes can be, should tell you about component (or components) that are missing. Add those to the “dependencies” section of package.json and check in a new build. Sometimes the first deployment is a bit of an iteration dance, because it will usually fail after the first one and not report all the missing libraries. Think of Azure as basically starting from scratch in the build process — it starts with a clean working directory each time it pulls builds from GitHub, then runs an ng build –prod to build the dist folder.

Monitor Shell Status Remotely with Seashells.io

Now that I’m knee-deep in machine learning models, I’m finding there are several times where I need to let my CPU/GPU crank away on a long-running “training” task for hours at a time, and I’d like to be able to check their status from afar.

The handy, free and cleverly-named tool seashells.io (“See shells”) makes this easy.

then you can pipe any terminal output as follows, via netcat:

echo 'Hello, Seashells!' | nc seashells.io 1337

You’ll get back a short seashells.io URL, and if you visit that URL from any web browser (including on your mobile phone of course), you can see the output status.

Even simpler, get the handy seashells client written by Anish Athalye through pip install:

pip install seashells

And then, for instance, a long-running command like:

python train.py | seashells

will send the training log to a URL that you can bookmark, and monitor status. Before you leave your machine, simply grab the URL via the handy QR Code Generator.

Netgear ORBI – This is the WiFi You Are Looking For

Steve, the wifi is down.” As the go-to guy in the house for all tech issues, I’ve been hearing that call, and reading that SMS text from family members for more than a decade. I’ve come to dread those words. In recent years, it’s been all-too-frequent. And since the longest-running wifi configuration in our house has been not one but three different SSID’s, the chances that one or more zones were down at any given time were high. To get fast wifi throughout the home, some approaches I’ve taken in the past have included:

  • One router and multiple access points
  • One router with repeaters range extenders
  • A combination of the above
  • Replacing the entire system with the AMPLIFI Mesh Network

Using multiple access points and networks has the problem of complexity — we end up with various networks in our house and devices which need to hop onto their local “best” signal. Some client devices tend to get confused finding the best signal, and it gets frustrating. The second approach is simplest, with a single broadcast and multiple “range extenders”, but it comes at the cost of speed. Since part of the 2 or 5Ghz radio spectrum is used to relay the signal back to the base router, performance can easily halve with every repeater in the chain. And the reliability there, too, has not been good — frequently a repeater will go offline or seem to “forget” its state of the world, especially when a base unit reboots. So I’ve also given the AMPLIFI mesh network a try. And, while it’s a great product, it didn’t seem to get along well with SONOS.

Enter NETGEAR Orbi

I’ve finally found what I think is the best wifi system for our home: the NETGEAR Orbi Ultra-Performance Whole Home Mesh WiFi System.

NETGEAR’s Orbi Base-Satellite Combination is Easy to Set up and Fast

Easy Onboarding, Great signal.

I was very impressed by the onboarding, and one day in at least, these speeds are amazing. I’ll update this post in a few weeks/months to tell you whether it’s working well. The NETGEAR Orbi Ultra-Performance Whole Home Mesh WiFi system is off to a terrific start, and couldn’t be happier. These things have very strong signals, and they use just one SSID (network name) throughout the entire network, meaning your phone or device stays connected no matter where you move in the house. I’m very impressed by Internet speeds I’m getting off of “satellite” stations — right now in my office I’m seeing speeds north of 190Mbps, which is two to three times faster than I was getting before.

I’m very pleased with it so far — the app has a handy display of network topology and connected devices. The web-based admin panel has far more control, and appears to have all the features of a typical high-end NETGEAR router (port forwarding, blocking, DDNS, etc.)

A key difference between the ORBI system and range extenders is that ORBI has its own private 5Ghz backchannel that it uses for “backhaul” to the router, so you don’t lose any significant speed at the satellite location. And I love the fact that we’re now back to a single SSID through the whole house — you can move from room to room, even outside, and the SSID stays the same.

As for the Satellites, at this writing they are all connected in a wireless topology to the base station. I haven’t yet tried the “backhaul via Ethernet” configuration — right now I have a base station and three satellites (the maximum allowed.) Everything appears to be running smoothly.

Here’s a good video review:

https://www.youtube.com/watch?v=56U6DkoxHv8

(I was not paid anything for this endorsement; I simply love the product so far, as it appears to be finally solving a long-running headache.)

RECOMMENDED. The Orbi Ultra-Performance Whole Home Mesh WiFi System.

Update: One Week In

Wow! Super-fast speed and NO problems. So far, so good. Strong recommendation. Very happy that I might finally have found the solution which works.  

Two Weeks In

Not a single restart, nor disconnect, nor satellite “forgetting” its state. I love this product! Strong recommendation.

Updating PLEX Media Server

Here’s how to update Plex Media Server on a server running Ubuntu.

Make sure you replace the URLs and packages with the latest release.

  • Find the URL for the latest Plex Media Server package here.
  • SSH into your server. 
  • Download the latest package (replace filename with the latest), then install it:
wget https://downloads.plex.tv/plex-media-server/0.9.13.4.1192-9a47d21/plexmediaserver_0.9.12.4.1192-9a47d21_amd64.deb
sudo dpkg -i plexmediaserver_0.9.12.4.1192–9a47d21_amd64.deb

Following installation, remove the installer file with this command:

rm plexmediaserver_0.9.12.4.1192–9a47d21_amd64.deb

Remember that you don’t have to type the entire filename, just the first few letters and press <tab> to complete it.

Use QR Code Generator to Easily Share Web Links to iPhone

My primary development machine is a desktop Windows PC, and I’m an iPhone user. Often, I’ll want to share a website that I’ve discovered on my desktop PC via the iPhone’s Messaging app, and as of this writing, the world of iMessage is still completely isolated from Windows, likely for strategic reasons on Apple’s part. So how do you get a link from your desktop Windows machine to an iPhone? Here are a few different methods I’ve tried:

  • Re-type on your iPhone: This is the most obvious but it’s a pain.
  • Send it in in an email to your phone: This used to be my method, but that too is a pain.
  • Use a notes sharing app like OneNote, Evernote or Google Keep: Seems a recipe for digital clutter if they’re not links you want to preserve over time. 
  • Use an app like PushBullet or QPush: While these apps are good, I’ve found their reliability to be spotty.

Each of these has their drawbacks. The method I now prefer is to use the QR code feature of iOS as follows:

  • Install the free Chrome extension Quick QR Code Generator
  • Any time you visit a website you want to share, simply click the toolbar button: 
  • then, simply get your iPhone out, launch the Camera app, and you should get a handy link to the website right at the top of the screen:

Tap the “Website QR Code” banner at the top of the screen on your iPhone, and you’ll have the URL you were visiting on your desktop ready to share via iMessage, email or more.