Scott Whittaker over at scottwhittaker.net posted the exact information I was looking for.
I recently installed zsh and oh-my-zsh on one of my Macs, and was looking for where to put an alias. I looked in ~/.zshrc, and saw that it noted that if I was running oh-my-zsh, I should place the alias in $ZSH_CUSTOM, which, on my machine is a directory located at /Users/kgreenwell/.oh-my-zsh/custom (you can check this on your own machine with ‘echo $ZSH_CUSTOM’).
Which is fine, but then it left the question: “What should the file inside $ZSH_CUSTOM holding the aliases be called?” Scott’s post answers this quite nicely:
You can call the file anything you like as long as the file extension is
.zshand the file is immediately under the
.oh-my-zsh/customdirectory, for example
.oh-my-zsh/custom/my-aliases.zsh. I found the answer to this in this thread.
He also goes on to note that you can create as many .zsh files in this directory as you’d like, and they’ll all get read, e.g. project1.zsh, project2.zsh, etc. The $ZSH_CUSTOM directory also contains an example.zsh file that gives an idea of what you can do with your .zsh files here. Very handy.
Thank you Scott, for spelling it all out so clearly!
Ever end up with messages like these in your Linux system’s system log? (/var/log/messages or journalctl or whatever system log system you’re using)?
Apr 1 08:09:27 machinename kernel: ProcessNameThatCrashed: segfault at 00000000e5c5e000 rip 00000000081473d0 rsp 00000000e5c5aa30 error 4
In my case, error 4 means “The cause was a user-mode read resulting in no page being found.”
As commenter “LittleAncientForestKami” explains, maybe not rocket science, but since I had no idea how to figure this out, really appreciated.
So, I thought I’d figure out what “rip” and “rsp” meant. “rsp” is probably a little hard to use, but “rip” is the address of the instruction where the crash occured, and you can figure out what function it points to using this technique described by StackOverflow user qrtt1:
- Dump the addresses of the crashing application by saying “
objdump -d ProcessNameThatCrashed | less” (where “ProcessNameThatCrashed” is the name of the crashing app)
- Search for the address in ‘less’ by typing “/”, then entering the address name (in this case, the address I’m searching for is ‘81473d0’).
A few (or maybe many) lines up from the line matching the address in question, you should see the name of the function that crashed:
81473c4: 55 push %ebp
81473c5: 89 e5 mov %esp,%ebp
81473c7: 83 ec 18 sub $0x18,%esp
81473ca: 8d 55 fc lea 0xfffffffc(%ebp),%edx
81473cd: 8b 45 08 mov 0x8(%ebp),%eax
81473d0: 8b 00 mov (%eax),%eax
In this case ‘fourBytesNetworkToHost’ is the name of the function that crashed.
Assuming you have Homebrew installed already:
- Launch Terminal
- “brew install boost” (without the quotes). Notice errors. Try updating brew by doing a ‘brew update’. Failures. Notice by looking at /Users/<userid>/Library/Logs/Homebrew/boost/01.bootstrap.sh that “brew” is at version 0.95 on my machine. Research brew and see it’s on version 1.4.0. Reinstall Brew as though it’s never been installed (even though it is). Notice install says success despite printing a couple of errors during the install. Use “sudo rm /usr/local/share/man/man1/brew.1” and “sudo rm /usr/local/share/doc/homebrew” and re-install brew: /usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” to fix.
- Retry “brew install boost”. Success! And brew has installed the latest Boost (1.66.0); under the old version of brew it was trying to install version Boost 1.59.0.
So I installed IPython today. It was a bit of an adventure, so thought I’d document it here, in case it helps anyone else (including my future self, heh):
- Installed Python 3.6 (the default, 2.7, included with macOS, isn’t new enough). This puts the “python3” executable on your machine, which you can invoke similarly to “python” (which will invoke the default OS-supplied Python, probably 2.7).
- Got ‘pip‘. Note this was a convoluted process that involved copying some text from the pip website, pasting it into a text file, then executing that text file from python3 like so: ‘python3 get-pip.py’ (without the quotes). This yielded the ‘pip3.6’ executable, located here: /usr/local/bin/pip3.6
- Used the ‘pip3.6’ executable to download ‘ipython’: /usr/local/bin/pip3.6 install ipython
- Noticed that IPython looked like it installed correctly, but ‘ipython’ didn’t run from the command line immediately after that, and the installation path wasn’t noted anywhere in the installation output. Turns out, IPython added its installation location to my PATH via my .bash_profile file, but didn’t tell me. I reloaded my .bash_profile like this, and all was good: source ~/.bash_profile
- Now I’ve got IPython! Invoke like this from the command line like this: ‘ipython’. Output looks like this:
- Macintodffeb798:local me$ ipython
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08)
Type ‘copyright’, ‘credits’ or ‘license’ for more information
IPython 6.2.1 — An enhanced Interactive Python. Type ‘?’ for help.In :
- Macintodffeb798:local me$ ipython
Simple! Just create an SSH tunnel. Or a couple of them.
Create SSH tunnel to MySQL server running on port 3306 on 192.168.213.207 so that server appears to be running locally on port 3307:
ssh -L 3307:127.0.0.1:3306 email@example.com -NnT
Create SSH tunnel to MySQL server running on port 3306 on machine2 so that server appears to be running locally on port 3308:
ssh -L 3308:127.0.0.1:3306 root@machine2 -NnT
Compare the fancyDatabaseName database on each machine using the
mysqldbcompare tool (part of the
/usr/local/bin/mysqldbcompare --firstname.lastname@example.org:3308 --email@example.com:3307 fancyDatabaseName
Explanation of flags to ‘ssh‘:
Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side. This works by allocating a socket to listen to port on the local side, optionally bound to the specified bind_address. Whenever a connection is made to this port, the connection is forwarded over the secure channel, and a connection is made to host port hostport from the remote machine. Port forwardings can also be specified in the configuration file. IPv6 addresses can be specified with an alternative syntax:
[bind_address/]port/host/hostport or by enclosing the address in square brackets. Only the superuser can forward privileged ports. By default, the local port is bound in accordance with the GatewayPorts setting. However, an explicit bind_address may be used to bind the connection to a specific address. The bind_address of ”localhost” indicates that the listening port be bound for local use only, while an empty address or ‘*’ indicates that the port should be available from all interfaces.
-N will disable the ability to execute a remote command.
-n will prevent reading from stdin.
-T will disable the pseudo-terminal allocation.
My 2009 27″ iMac is starting to show its age. So when its hard drive started crunching this morning (and bringing the machine to a crawl), I wanted to know a little more. The command-line utility fs_usage is good if there’s not much going on, but if there’s a lot, the information flies by far too quickly to get good sense of what’s going on.
fseventer — donation-ware by Robert Pointon of fernLighting — is a great way to figure out what’s going on. It provides the interesting information from
fs_usage, but it does so in a fun, visual, animated way. Highly recommended.
This set of instructions for turning on syntax highlighting in vi (vim, in fact) worked like a charm.