Archive for July 2012
Working with git
a lot I decided I needed some git
status
in my prompt.
I searched the web and some solutions where almost what I wanted
and this one by Sebastian Celis
came very close.
But it didn't work with my version of zsh
, because that didn't seem
to understand the =~
operator.
I also think Sebastian makes things over complicated and so I changed
some things aroud.
This is what I came up with:
First make sure this code is included in your ~/.zshenv
file
prompt_git_info()
{
unset __GIT_BRANCH
unset __GIT_BRANCH_STATUS
unset __GIT_BRANCH_DIRTY
local st="$(git status 2>/dev/null)"
if [[ -n "$st" ]]; then
local -a arr
arr=(${(f)st})
if [[ $arr[1] = *Not\ currently\ on\ any\ branch.* ]]
then
__GIT_BRANCH='no-branch'
else
__GIT_BRANCH="${arr[1][(w)4]}"
fi
if [[ $arr[2] = *Your\ branch\ is* ]]
then
if [[ $arr[2] = *ahead* ]]
then
__GIT_BRANCH_STATUS='ahead'
elif [[ $arr[2] = *diverged* ]]
then
__GIT_BRANCH_STATUS='diverged'
else
__GIT_BRANCH_STATUS='behind'
fi
fi
if [[ $st = *nothing\ to\ commit* ]]
then
__GIT_BRANCH_DIRTY='0'
else
__GIT_BRANCH_DIRTY='1'
fi
fi
if [[ -n "$__GIT_BRANCH" ]]
then
local s="("
s+="$__GIT_BRANCH"
case "$__GIT_BRANCH_STATUS"
in
ahead) s+="↑" ;;
diverged) s+="↕" ;;
behind) s+="↓" ;;
esac
if [[ "$__GIT_BRANCH_DIRTY" = "1" ]]
then
s+="⚡"
fi
s+=")"
printf " %s%s" "%{${fg[yellow]}%}" $s
fi
}
and set your prompt to something like this
PS1=$'$C_CYAN%n@%m$(prompt_git_info) $C_WHITE%2~$ $C_OFF'
When I now switch to a directory that is under control of git
I get gt status
messages in my prompt, like
tonk@mach (master⚡) ~/dir$ git commit -a
[master fca5ac3] Nice, new stuff.
6 files changed, 88 insertions(+), 12 deletions(-)
tonk@mach (master↑) ~/.dir$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
tonk@mach (master↑) ~/.dir$
When installing a minimal CentOS 6 system, minimal really, really means
minimal. After a reboot the network interfaces do not start, so network
connectivity is non existing.
Looking into that I noticed that the file
/etc/sysconfig/network-scripts/ifcfg-eth0
contained
DEVICE=eth0
HWADDR=11:22:33:44:55:66
NM_CONTROLLED=yes
ONBOOT=no
BOOTPROTO=dhcp
TYPE=Ethernet
USERCTL=no
PEERDNS=yes
IPV6INIT=no
The lines that mess things up are NM_CONTROLLED=yes
meaning the interfaces
are managed with NetworkManager, which isn’t actually installed as part of a
minimal install. You want a minimal install, you get a minimal install. And
ONBOOT=no
, meaning "do not start the interface on boot". How stupid is
that!
The trick is to run something like system-config-network-tui
to set the IP
addresses manually, but as you might imagine, that's not installed either.
So you best edit /etc/sysconfig/network-scripts/ifcfg-eth0
by hand and set it
to:
DEVICE=eth0
HWADDR=11:22:33:44:55:66
NM_CONTROLLED=no
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
USERCTL=no
PEERDNS=yes
IPV6INIT=no
IPADDR=192.168.0.1
NETMASK=255.255.255.0
GATEWAY=192.168.0.254
DNS1=192.168.0.254
The USERCTL=...
line is optional: If set to yes
it lets non-root users
control the interface.
After setting this a service network restart
will do the trick.
Today I released version 0.8 of We-Blog.
I created a Google project and a Google
discussion group.
Version 0.8 is now the stable branch and 0.9 the development branch.
What's new?
Well, to be really honest, not that much. I fixed some minor bugs and did a lot
of code cleanup. Although the original code of Jaromir was very nice, there was
some room for improvement. I removed a lot of double functions and variables
and put them all together in a We.pm
Perl module. Saves a lot of work with an
update.
It often happens that I get into a situation
where I need to know key codes of pressed
keys. On my Mac that's simple. Just use the
Key Codes
by Many Tricks.
But on Linux I constantly was trying to find
out which key produced what.
So I ended up writing a program for that. I started
of in the shell, but that ended up being rather
tricky and unnecessary complicated. So I redid the
whole thing in C.
This is the result
/*
* Program : code.c
* Author : Ton Kersten
*/
#include <stdio.h>
#include <curses.h>
#define DONE 'q'
#define ESC 0x1b
#define SPC 0x20
char ch;
main()
{
printf("Press '%c' to quit!\n\n", DONE);
/*
* Put the terminal in raw mode, with no echo
*/
system("stty raw -echo");
/*
* Print the header
*/
printf("%4s\t%4s\t%4s\t%4s\r\n", "Char", " Hex", " Oct", " Dec");
printf("%4s\t%4s\t%4s\t%4s\r\n", "----", "----", "----", "----");
/*
* Set the initial loop value to something odd
*/
ch = DONE-1;
while ( ch != DONE )
{ ch = getchar();
/*
* Character read. Display it. Look out for < 0x20
*/
if ( ch < SPC )
{ if ( ch == ESC )
{ /*
* Esc. Just say 'Esc'
*/
printf("%-4s\t0x%02x\t%04o\t%04d\r\n",
"Esc", ch, ch, ch);
}
else
{ /*
* < ' '. Print Control character
*/
printf("^%-c\t0x%02x\t%04o\t%04d\r\n",
ch-1+'A', ch, ch, ch);
}
}
else
{ /*
* Normal character. Display it normally
*/
printf("%-4c\t0x%02x\t%04o\t%04d\r\n",
ch, ch, ch, ch);
}
}
/*
* Put the terminal back to something usefull
*/
system("stty sane echo");
}
And this is an example of the output
Press 'q' to quit!
Char Hex Oct Dec
---- ---- ---- ----
Esc 0x1b 0033 0027
O 0x4f 0117 0079
P 0x50 0120 0080
Esc 0x1b 0033 0027
[ 0x5b 0133 0091
2 0x32 0062 0050
4 0x34 0064 0052
~ 0x7e 0176 0126
q 0x71 0161 0113
During one of my teaching sessions a student
asked me if it was possible to find the number
of spaces in a variable.
As with all questions in Linux and UNIX the answer is
a simple
Of course that's possible. In UNIX and Linux everything
is possible.
With some sed
or awk
this can be done within
seconds. But I wanted it done completely within
the shell, in this case bash
.
This is what I came up with
P="John and Paul and Ringo and George where the Beatles"
R=${P//[! ]/} # Remove everything that is NOT a space
echo ${#R} # Show the number of characters (spaces) that are left
And this also works in the Korn shell (ksh
) and the Z-shell (zsh
).
I was trying to burn a folder with a VIDEO_TS
directory onto a DVD. But in a
way that it will start in a normal DVD player as well as starting
automagically. And this all had to be done on Apple's OSX.
I googled a little and tried some things and this is what I can up with:
hdiutil makehybrid -udf \
-udf-volume-name DVD_NAME \
-o MY_DVD.iso \
/path/to/VIDEO_TS/parent/folder
Make sure that /path/to/VIDEO_TS/parent/folder
is the path to the folder
containing the VIDEO_TS
folder, not the VIDEO_TS
folder itself.`
After that, the resulting MY_DVD.iso
can easily be burned with
burn