Cheap Macbook Pro Docking Solution for about $30
I typically preferĀ developing on my desktop and large dual screen monitor setup as opposed to my Macbook. Recently, I’ve gotten into more PHP development and developing on the Mac is proving to be a more enjoyable experience only because Windows is still a second class citizen for most PHP libraries/tools. I still wanted a larger screen setup, soĀ I considered buying a docking station to hook up to a larger monitor but I soon learned they feature the ‘Mac Penalty’ in that they cost more than they should just because it’s for Apple products.
I already have two large monitors and figured my Macbook could serve as third screen. Then I did some thinking and realized I could use one of the monitors for both computers. AssumingĀ you have two HDMI screens already hooked up to your desktop, this would save you $150+ and still allow you to be more productive.
- Get a copy of Synergy (http://symless.com/) for $10. It’s open source and can be built if you have the time, but a one time fee of $10 saves me the hassle of doing so. With this, you can share your desktop keyboard across all your computers with the one license and it’s cross platform so Linux support is included too.
- Purchase an auto HDMI switcher. I purchased theĀ PORTTA PET0301S 3×1 Port HDMI Switch/Switcher for about $9.
- Be sure to get 2 HDMI cables if you don’t already have them on hand. I don’t like the Amazon Basic brand for these as I’ve had problems with the Mac and those cables hooking up to larger screens.
- Install Synergy on the desktop as a server. Install on the Macbook as a client and it should autoconnect.
- Plug the HDMI cable from the computer into the HDMI switcher, and plug the spare into the Macbook pro. Plug the “Out” end into the monitor.
When you plug your HDMI cable into the Macbook, the HDMI switcher will automatically switch to it and project the Macbook. Synergy will auto-connect as long as it’s running on both and you can share the mouse and keyboard between both and work seamlessly.
If you have an iPad and want to turn that into an additional screen, grab a copy of Duet DisplayĀ on your desktop/Macbook and install on your iPad for $15.99, and viola, instant portable second screen!
How to repair permissions on Linux Apache /var/www/html folder
I recently ran into an issue where I could no longer FTP files to my Linux droplet when multiple users were uploading to the server. The server kept the user as the owner despite me adding them to the www-data group. This fix comes from my ex-boss, James TomasinoĀ who was kind enough to provide some help since I was stumped.Ā I’m sharing in case anyone else runs into the same issue and finds it useful.
You’ll need to fire up terminal, ssh to the server, and then execute these commands:
cd /var/www sudo chmod 775 html sudo chgrp www-data html sudo chmod g+s html
+s makes permissions sticky so that all files will inherit from the parent directory. This was the setting I was missing.
Open upĀ /etc/ssh/sshd_config. I use nano so:
sudo nano /etc/ssh/sshd_config
Hit CTRL+W and look for “subsystem” which is typically located near the bottom of the file. Change
subsystem sftp /usr/lib/openssh/sftp-server
to
subsystem sftp /usr/lib/openssh/sftp-server -u 0002
If you already have files in the HTML folder, you’ll want to run these commands to reset the permissions:
cd /var/www/ sudo chgrp -R www-data html find . -type f -exec chmod 664 {} \; find . -type d -exec chmod 775 {} \;
Regex to parse date formats when unknown
I’m working on an appĀ that willĀ parse different file sources and aggregate it for a report.Ā Of course, each format has a different date format and trying to parse it all has proved to be a pain. I wrote a regex that’ll parse out just about every datetime format I’ve run into that I am sharing in case someone else finds it useful. I’ve put it on a Github gistĀ along with a sample of the various dates I’ve tested it against and confirmed to work. If you find a format not covered by the regex,Ā post a comment and I’ll update the gist.
Just a note that I haven’t finished parsing the timestamp (e.g. 1997-07-16T19:20:30+01:00) format. The date portion does get extracted correctly so I left it in.
(98)Address already in use: AH00072: make_sock: could not bind to address [::]:80 – error
IĀ recently got handed a new Ubuntu droplet at work to setup and work on. I was going through the typical configuration to lock down the server and go to installing Apache when I suddenly ran into the error
(98)Address already in use: AH00072: make_sock: could not bind to address [::]:80 – error
I was a little surprised considering I had only run 4 commands total on a brand new installation.Ā If you’re getting this error like me, you’ll need to find out what’s being bound to port 80 and then stop it. Use this command to get a list of anything that’s running on port 80.
sudo lsof -i:80
For me, it turned out nginx was running and bound to port 80. If you have the same problem, run thisĀ command to stop it:
sudo service nginx stop
Now you should be able to start apache.
Copy File Context to Clipboard via Command Line, Git Bash (Mingw64), or Terminal
I’ve been spending more timeĀ switching from SVN to Git and learning the command line options. I’m finding a lot of the Mac Git terminal commands I run aren’t the same in Git Bash (Mingw64). One of the commands I use is the pbcopy command to copy the ssh key to the clipboard to paste into Github and Bitbucket accounts. I’m starting to use it more as I am learningĀ managing LinuxĀ servers and adding my key to login. I’m adding it here as a cheatsheet for myself but I thought others may find it useful.
On Windows, you can run this command to copy your ssh key to the clipboard:
clip < ~/.ssh/id_rsa.pub
On Mac:
pbcopy < ~/.ssh/id_rsa.pub
or if you want to view it in the terminal window:
cat ~/.ssh/id_rsa.pub
How to Copy and Paste into the Digital Ocean VNC Console
I recently signed up for Digital Ocean to test droplets for my development and linux management testing. I was securing the server and setup fail2ban, disabled the root login, and created a user account but forgot to change the user name from root to the user name I selected in my SSH client profile. I ended up locking myself out of the server and had to resort to logging into the admin panel on Digital Ocean’s website and use their browser embedded VNC client to restore my access. I quickly discovered that one of the downsides of using this panel is that you can’t copy and paste commands. Luckily there’s a workaround and you can use the browser console to do sendkeys through Javascript.
Bring up the console in the browser developer tools. Here’s a cheat sheet for keyboard shortcuts:
Browser | Description | Windows | Mac |
---|---|---|---|
Chrome | Open Developer Tools and bring focus to the console | Ctrl + Shift + J | Cmd + Opt + J |
Firefox | Open Console | Ctrl + Shift + K | Cmd + Opt + K |
Internet Explorer | After hitting F12, you have to click the console tab. There’s no direct shortcut to the console tab. | F12 | N/A |
!function(){function t(){window.rfb.sendKey(e.shift().charCodeAt()),e.length>0&&setTimeout(t,10)}var e=prompt("Enter text to be sent to console").split("");t()}();
Update 9-21-16
Ruden and Sebastiaan’s pointed out there was a bug in the code above. This updated snippet has support for characters when using shift characters like !@#$%^&*()_+
!function(){function t(){function n(t,e){s=s.concat(RFB.messages.keyEvent(t,e))}var o=e.shift(),s=[],i=o.charCodeAt(),c=-1!=='!@#$%^&*()_+{}:"<>?~|'.indexOf(o),r=XK_Shift_L;c&&n(r,1),n(i,1),n(i,0),c&&n(r,0),rfb._sock.send(s),e.length>0&&setTimeout(t,10)}var e=prompt("Enter text to be sent to console").split("");t()}();
You’ll receive a dialog prompt to enter the copy to paste in. Please note that you need to click on the VNC console and hit enter to execute the command.
If you need to enter more than one command, just hit the up arrow on your keyboard in the console to get the script again for easy reuse.
Sitecore 8 Install Error: “The name you entered is not unique.”
I was working on my business partner’s computer to help him fix errors with his Sitecore instance for his certification class. He experiencedĀ multiple issues with the Sitecore 8 installer on Windows 8 and we went the manual route ofĀ deleting Sitecore to install clean and start from scratch. In the process, we:
- Deleted the IIS website instance in the IIS Manager
- Deleted the databases used by the instance
- Deleted the root folder in the filesystem
After launching theĀ installer again, it kept returningĀ the error “The name you entered is not unique.” when naming the Sitecore instance to one previously used. After checkingĀ the IIS metabase and a few other typical locations, couldn’t figure out where the SitecoreĀ installer was finding the name since we deleted everything manually. It turns out that the Sitecore executable installer creates a registry entry under HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Sitecore CMS which is used to display information in Windows Programs and Features. ThisĀ registry keyĀ is also checked during the installation process and if a child key with the same nameĀ as the one being installed is found, the above error message is shown.
To fix this:
- Start -> Run (or Windows Key + R)
- Type regedit
- Navigate toĀ HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Sitecore CMS.
- Delete the registry keys containing the information about the previously installed instance.
NOTE: You’ll need to relaunch the installer as it apparently caches the key information.
When updating Office 2011 for Mac, you are prompted that you must close “Microsoft Database Daemon” and “SyncServicesAgent”
If you’re trying to update your install of Microsoft Office 2011 for Mac, you may get the following message:
“These applications must be closed before the software can be installed:
Microsoft Database Daemon
SyncServicesAgent
Close these applications and try again”
If you try to kill the apps using activity monitor, you’ll find they keep getting restarted. The only way I found that worked to stop them is by following the instructions below.
- Open a terminal window and enter the following command:
launchctl unload ~/Library/LaunchAgents/com.microsoft.LaunchAgent.SyncServicesAgent.plist
This will unload the SyncServicesAgent. Unfortunately the Daemon kept running for me after the latest update. To stop that, do the following:
- Open activity monitor
- Scroll down until you find Microsoft Database Daemon in the list of active applications.
- Click on Microsoft Database Daemon and click on the Quit Process button in the toolbar
Go back to the install utility and you should now be able to proceed with the install. Once the install is finished, you’ll want to restart the Sync Services Agent, so do the following:
- Go back to the terminal window and enter this command:
launchctl load ~/Library/LaunchAgents/com.microsoft.LaunchAgent.SyncServicesAgent.plist
Now you should be all set with updates and can close terminal.
Steam is having trouble connecting to the Steam servers.
If youĀ use Steam and Ā suddenly find yourself unable to connect receiving the error “Steam is having trouble connecting to the Steam servers.”, check and see if you have Peerblock installed and running. I wasted a lot of time trying to figure out why the connections wouldn’t go through and finally went through apps running in the background one by one, until I closed Peerblock and discoveredĀ Steam suddenly started working. If youĀ would like to continue to use Steam while Peerblock is open, follow these instructions for a workaround:
1. Start PeerBlock
2. Click List Manager
3. Click Add
4. Put something in the description like steam-allow
5. click add url and paste this: “http://list.iblocklist.com/?list=steam” (no quotes)
6. Choose type: allow
7. Click Ok then close the List Manager.
This will download a list that adds exceptions for Steam and should let you connect with no issues.
How to Get Browser Name and Version via JavaScript
Today I ran into a strange issue where Firefox version 28 and below rendered style widths different than Firefox 29 and above. Firefox 29 and above appear to have fixed the issue and render sizes to match Chrome/IE8+/Opera/Safari. Unfortunately, as old as Firefox 28 is, our client’s legal review team is stuck on that version as IT refuses to let them upgrade. As such, we needed to add a kludge fix to the site to add a style to fix the issue for those running older Firefox versions. JQuery removed the version support from version 1.9 so here’s a handy script that will allow you to detect the browser and version without any extra dependencies.
function get_browser_info(){ var ua=navigator.userAgent,tem,M=ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; if(/trident/i.test(M[1])){ tem=/\brv[ :]+(\d+)/g.exec(ua) || []; return {name:'IE ',version:(tem[1]||'')}; } if(M[1]==='Chrome'){ tem=ua.match(/\bOPR\/(\d+)/) if(tem!=null) {return {name:'Opera', version:tem[1]};} } M=M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?']; if((tem=ua.match(/version\/(\d+)/i))!=null) {M.splice(1,1,tem[1]);} return { name: M[0], version: M[1] }; }
Usage is very simple:
var browser=get_browser_info(); console.log(browser.name); console.log(browser.version);
BONUS: If you need to detect a specific version and add special classes, here’s a quick snippet that will allow you to add a class to the HTML tagĀ using plain old vanilla.js.
var browser=get_browser_info(); if(browser.name == 'Firefox' && browser.version <= 28) { var root = document.documentElement; root.className += " firefox28"; }