December 30, 2014
Two fawr the price awf one!
BEGIN
At the moment, I'm quite busy (new job, many interesting
projects, responsibilities) and unfortunately I lack time. That's
why I can't write a "full featured" article/script (which will be
probably sent to /dev/null
anyway), despite the fact
that my brain is full of ideas. But I still want to "feed" my
personal website with new content(s), this way I tell myself it's
not dead (yet).
One month ago, I switched from French AZERTY to UK QWERTY (ISO) and it was kinda painful. Not only because it is a totally new layout but also because I tried to forget my old habits. You could ask me why I chose to torture myself, that's a valid question. Well, the answer is pretty simple: AZERTY just sucks, especially when you regularly write code.
I still need/miss some chars when I talk to frenchies, like
à
or ç
. Maybe I should ignore those
dudes, but this solution is clearly unreasonable. So, I've decided
to create a custom layout for my (lovely) mechanical keyboards,
which is a mix of QWERTY + the nameless boring chars.
Enough talked boy, the topic is going to be irrelevant!
In this context, I "reduced" the verbosity of xev(1). Every time you push/release a key, a block of lines is printed. For my needs, it's useless. The ArchLinux wiki proposes me the following command:
xev | grep -A2 --line-buffered '^KeyRelease' | sed -n '/keycode /s/^.*keycode \([0-9]*\).* (.*, \(.*\)).*$/\1 \2/p'
grep
and sed
? Sexy isn't it? Too
much processes for me, sorry. I can't handle this. I invoke
awk
to rescue us. The required line is:
state 0x10, keycode 38 (keysym 0x61, a), same_screen YES,
I extracted 38
, 0x61
and
a
. The remaining output could be dropped. Here the
"ultimate" tiny tool:
xev | awk '
/keysym/ {
gsub(/[(),]/,"")
out = $4 $6 $7
if (out != oldout)
printf("%-9s%-6s%s\n", $6, $4, $7)
oldout = out
}
'
First we match the keysym
pattern. Then
(
, )
and ,
are removed.
The out
variable is defined to avoid printing the same
line over and over again. So if you spam the same key,
out
is equal to oldout
and nothing is
returned, except the first result.
0xfe03 108 ISO_Level3_Shift
0xffe3 37 Control_L
0x71 24 q
0x38 17 8
0xe9 26 eacute
0x5b 34 bracketleft
0x7a 52 z
There are three columns: keysym, keycode and the symbol name (it
can be also found in /usr/include/X11/keysymdef.h
).
Another thing: my script seems to be faster than the previous
one-liner, possibly due to --line-buffered
(cf.
grep(1)). When I use it, I can notice a
tiny delay, after I pressed the key. You could even do the "test"
yourself, if you don't trust me.
END
As the title says it, I will "share" two mini-scripts at once. The second snippet is about LOC. I tend to count lines inside my projects. The persons who talked to me already know that. If an optional functionality adds too many lines, I simply exclude it. But how to count them? A lazy man will install one of the existing tools (sloc or the other Perly things). Luckily, I'm not that lazy.
awk(1) is the perfect candidate to process files. For now,
almost all the languages I try to tame have the same comments,
starting by #
(I don't care about HTML, CSS or PHP).
Another regexes can be easily added. Therefore, the result is
basic:
BEGIN { x = 0; w = 0; l = 0 }
/^[\t ]*#/ {
x++
next
}
/^[\t ]*$/ {
w++
next
}
We initialize all the variables in BEGIN
. We make
sure it defaults to 0 and we will be able to display a value, when
nothing is found. If not, the script would return
foobar has 28 LOC, comments
instead of
0 comments
. Going forward, we "match" the pattern(s):
x
for comments and w
for empty lines.
With next
, we jump to the following line and we treat
the conditions.
END {
if (NR == 0)
printf("%s is empty!\n", ARGV[1])
else {
l = NR-x-w
printf("%s has %s LOC, %s comment(s), %s blank(s) & %s SLOC\n",
ARGV[1], NR, x, w, l)
}
}
When the entire file is parsed, a report is shown.
l
is equal to NR
minus comments and
whitespaces. As you can see LOC
≠ SLOC
.
I really don't know how the other tools count SLOC
(and I don't give a fuck). The final conclusion
looks like:
heyguys.sh has 138 LOC, 17 comment(s), 14 blank(s) & 107 SLOC
2nd script is sleeping on git. Those scripts aren't explosive, but thanks to them my life is cooler and less stressful.
Ohh before I forget: I wish you an early happy New Year, whoever you are.
P.S. Glad to see you found the website, after the URL "migration".