Installing Fish Shell on OSX

For the last few years I’ve been using Fish Shell as my shell of choice in my Centos and OpenSuse development environments. Recently I had to switch to using OSX for development and so of course I installed Fish. I used this page as a starting point but I did run into a few small issues, so I figured I’d document here in case anyone else runs into these.

General Steps:

  1. Prerequsite: Have homebrew installed. (Google it if you don’t know)
  2. Install fish using homebrew
    brew install fish
    Make sure you note where the install goes. On my system it went to /usr/local/Cellar/fish/3.6.1/bin/fish but on the page i reference above it goes to /opt/homebrew/bin/fish
  3. Add fish to the list of shells on the system
    sudo sh -c ‘/usr/local/Cellar/fish/3.6.1/bin/fish >> /etc/shells’
  4. Set fish as the default shell run the command: chsh -s /usr/local/Cellar/fish/3.6.1/bin/fish
  5. Restart your terminal

Customization:

  1. Install fisher for package management
    brew install fisher
  2. Install a theme. I recommend either bob the fisher or tide:
    fisher install IlanCosman/tide@v5
  3. Install autocomplete for kubectl:
    mkdir -p ~/.config/fish/completions
    cd ~/.config/fish
    git clone https://github.com/evanlucas/fish-kubectl-completions.git
    ln -s ../fish-kubectl-completions/completions/kubectl.fish completions/
  4. Install fasd
    fisher install fishgretel/fasd

Troubleshooting:

  • Issue: After installing fasd you get the error `grep: invalid option — P`
    Solution:
    1. brew install grep
    2. modify ‘/Users/mangel/.config/fish/conf.d/__fasd_run.fish’ and change grep to ‘ggrep’
    Comment: osx’s grep no longer supports -P. This will install ‘ggrep’ which supports it and doesn’t conflict with the system grep
  • Issue: ‘path command not found’
    Issue: ‘string shorten invalid subcommand’
    Solution: you have an older version of fish installed. In my case I had 3.4.1 installed.

Things mom never told you about C++ CLI

For the last few months I’ve been working on a project that utilizes C++/CLI to bridge some legacy code with new code written in C#. A good chunk of that time has been spent running repeatedly into walls, pitfalls, quirks, and “known issues.” I figured I’d document some of the issues I’ve encountered in case someone out there to hopefully save people out there a few hours of frustration.

0) Preparation

  • The following are the books I’ve located dedicated to C++ CLI. The biggest problem with these books is they cover very simple scenarios and assume things “just work” when in reality they DON’T quite often and you end up on Google and Stack overflow trying to figure out some cryptic error message.

1) Avoid Visual Studio 2012 Update 2

If you’re doing C++/CLI work Update 2 is the devil! It breaks the mixed mode debugger. Relevant links:

As a side note, XP Compatibility compilation is now broken:

And last but not least uninstalling Update 2 *may* leave your Visual Studio install crippled:

 

1) Compile time and link time errors

Some of these could depend heavily on exactly what you are doing so though you may get the same error you may have a completely different problem/solution. Contact me if you have an issue+solution you’ve discovered and want added.

A) Error: “String cannot be of zero length. Parameter name: frameworkName”

Cause: incorrectly created file located at C:\Users\YOURNAME\AppData\Local\Temp\.NETFramework,Version=v4.0.AssemblyAttributes.cpp

Fix1: The file should be written every build, so just delete teh file

Fix2: Open the file and confirm first parameter is empty string ( L""). If so then add appropriate framework to first parameter, as shown below in red:

#using <mscorlib.dll>
[assembly: System::Runtime::Versioning::TargetFrameworkAttribute(L".NETFramework,Version=v4.0", FrameworkDisplayName=L".NET Framework 4")];

Answer found here: http://stackoverflow.com/questions/13315940/apps-exe-file-missing-net-targetframework-but-only-on-clean-builds

 

B) Error: “String cannot be of zero length. Parameter name: frameworkName”

Cause: incorrectly created file located at C:\Users\YOURNAME\AppData\Local\Temp\.NETFramework,Version=v4.0.AssemblyAttributes.cpp

Commandline-fu

Derping around a GUI is all fine and good for many things but sometimes you really just need to get things done and your GUI just won’t cut it. Having a powerful command line interface and being knowing how to use it are critical skills. I’ve recently found myself having to use the command line a bit more than usual, so below are some of the learned or re-learned tidbits of knowledge that might help others.

Note: I’m a Windows developer, but the commands below all use bash in Cygwin.

Q: How can I generate a file of an arbitrary size with random data?

A: Use dd in conjunction with /dev/urandom

# 2 Megs
dd if=/dev/urandom of=a.log bs=1M count=2

# 2 Gigs (1 Meg * 2 * 1024)
dd if=/dev/urandom of=a.log bs=1M count=2K 
Note that 1kB = 1000 and 1K = 1024, 1MB = 1000 * 1000 while 1M =1024 * 1024, and so on.
Credit for this protip goes to the Linux Commando blog: http://linuxcommando.blogspot.com/2008/06/create-file-of-given-size-with-random.html

 

Q: How can I sort a file, remove duplicate elements, and do it all in-place?

A: sort temp.txt -o temp.txt

Q: How can I pipe the output from foo.exe to bar.exe if bar.exe does not accept input from stdin?

A: The obvious answer is to redirect stdout to a file then use the file as an input parameter.
(Note: md5sum *does* accept stdin input. Ignore that for the sake of the example)

echo -n hello > temp.dat
md5sum temp.dat
rm temp.dat

The command below can skip the intermediate step.

md5sum <(echo -n hello)
I wasn’t familiar with this syntax till recently. I discovered it in this bash redirections cheat sheet: http://www.catonmat.net/download/bash-redirections-cheat-sheet.pdf

My Reading List

I’ve been on a big reading spree this year. By genre, but otherwise in no particular order:

Non-fiction

Coding Related:

Career & Self:

Fiction

  • Dark Swan Series (Richelle Mead)
    • Storm Born
    • Thorn Queen
    • Iron Crowned
    • Shadow Heir
  • The Wise Man’s Fear (Patrick Rothfuss)
  • A Dance with Dragons (George R.R. Martin)
  • The Farseer Trilogy (Robin Hobb)
    • Assassin’s Apprentice
    • Royal Assassin
    • Assassin’s Quest
  • Southern Vampire Mysteries (Charlaine Harris)
    • Dead in the Family
    • Dead Reckoning
    • Deadlocked

 

Today I learned: HOWTO trim WinSXS size

The C:WindowsWinSXS directory can get way too big for comfort. On my Win2k8 VMWare image it was 10.9 gigs. On a VMWare image that’s just wasted space. After a little research I settled on a few steps to help me trim the fat down to 6.72 GB:

  1. Issued the command: dism /online /cleanup-image /spsuperseded
  2.  Install and run CCleaner
  3. Delete all the files in C:windowswinsxsBackup
I also experimented with WinSxs Lite — but it was taking too long for me to be able to see what a difference it makes. I’ll leave it running overnight at some point and report back. By the way, you’d be crazy to try using WinSxSLite on a real machine. I’m doing it because if it hoses my VMWare I restore with the press of a single button.

 

Using your domain for OpenID

Logging in to Stack Overflow today my curiosity about using OpenID got the better of me. I wanted to use my domain name as my login identifier. I quickly found instructions on using my domain with Google as my OpenID provider but I wanted to use myopenid.com

Turns out the process is really easy. The process is covered here: https://www.myopenid.com/help#own_domain

You just add the following tags to your page’s head tag.

<link rel="openid.server" href="http://www.myopenid.com/server" />
<link rel="openid.delegate" href="http://youraccount.myopenid.com/" />
<link rel="openid2.local_id" href="http://youraccount.myopenid.com" />
<link rel="openid2.provider" href="http://www.myopenid.com/server" />
<meta http-equiv="X-XRDS-Location" 
    content="http://www.myopenid.com/xrds?username=youraccount.myopenid.com" />

Voila! You can now use your domain as your login for OpenID!

WinDBG !locks is broken

This is old news, but I just discovered it today.

Apparently WinDbg !locks command is broken in the last stand-alone release of Debugging Tools for Windows. To fix the issue you need to download the WDK or downgrade to the previous version (6.10).

Found via http://www.voyce.com/index.php/2009/06/03/windbg-locks-command-broken/ while trying to track down a deadlock. I forgot how fun crash analysis can be . I say that both seriously and sarcastically at the same time. When your tools are broken it can lead to hours of wasted time. 🙁

-Angel

Personal note for later lookup: MS Symbol server path (for easy pasting):
SRV*W:Symbols*http://msdl.microsoft.com/download/symbols;c:temp

Dump any spare symbols you need in temp (not a best practice!)

MongoDB Notes

Some notes I took as I went through trying to compile the C++ driver for mongodb under win32.

  • Hit up MongoDB C++ Page
    • http://www.mongodb.org/pages/viewpage.action?pageId=133409
  • Downloaded driver linked from Driver Download Page & some other prerequisites
    • http://downloads.mongodb.org/cxx-driver/mongodb-linux-x86_64-v2.0-latest.tgz
    • http://www.mongodb.org/download/attachments/12157032/boost_1_42_vs2010_partial_prebuilt.7z
  • Went to C++ Driver Compiling and Linking and scrolled down to Windows
    • http://www.mongodb.org/pages/viewpage.action?pageId=21266598
  • Hrm. I’d rather not have to mess with scons … so how do I build the lib?
  • WTF? I want to try including client/mongo_client_lib.cpp in my project but IT’S NOT IN THE FRAKING ARCHIVE!
  • OK. Fine. Let’s fire up git and clone the full git source.
  • Ahh…. ok, found mongo_client_lib.cpp. Why the hell even bother putting up the tar ball?
  • Loaded simple_client_demo into visual studio.
  • Boost missing. Ok .. Let’s set up project to point to proper includes and precompiled libraries
  • Holy shit that compiled.
  • Fired up MongoDB Shell and created a collection.
  • Ran through the debugger. Everything works, but how come code references test.foo but in the shell it shows name is just ‘foo?
  • Apparently didn’t need perl regex files? (referenced elsewhere)
  • bo and bob? really?! (in bson seralization class)