Montag, 11. Januar 2016

Compile Git on Solaris 10

To compile Git 2.7.0 on Solaris the Makefile must be changed to use gcc

CC = gcc

After that Git compiles, when I disable gettext, iconv and Tcl/Tk. I did not need curl but it seems to work.

NO_GETTEXT=1 NO_ICONV=1 NO_TCLTK=1 CURLDIR=/usr/local \
gmake prefix=/my/git install

Freitag, 8. Januar 2016

Diablo III Beta 2.4 PTR: Delseres Opus Magnum

Normalerweise bin ich kein Freund von Online-Services, die einem den Eindruck vermitteln, sie würden die tollste Erfindung seit geschnitten Brot sein, obwohl sie nur mit ein paar OpenSource-Tools zusammengeschustert sind. Aber in diesem Fall muss ich eine Ausnahme machen. Wenn man "mal schnell" ein Video zu einer animierten GIF-Grafik machen will, ist Ezgif.com ein prima Webseite. Man sollte natürlich tunlichst nur völlig öffentliche Videos dort hoch laden.

Das folgende GIF meiner Zauberin Horima aus der Diablo III PTR Beta 2.4 ist mit Hilfe des Dienstes entstanden. Aufgenommen habe ich mit OBS. Ezgif hat konvertiert, zugeschnitten und skaliert. Und mit Gimp habe ich das Fine-Tuning der Frames gemacht, damit die Animation sauber loopt.

Es ist meine erste Melee-Sorc seit Diablo I, die wirklich funktioniert. Alle Zauberinnen, die ich bislang geskillt habe, mussten sich schön weit von den Gegnern fernhalten. Auch die Experimente mit dem Sturmschild in Diablo II waren nicht wirklich effektiv. Aber mit dem 2.4er Patch hat Blizzard endlich mal ein Set mit ein paar praktischen legendären Ergänzungen geschaffen, mit denen man sich auch als Zauberin an die Gegner ran trauen kann. Es ist das Set "Delseres Opus Magnum". Das Set an sich ist nicht neu.

Und der dazu gehörige Helm ist es auch nicht.

Aber die neuen beziehungsweise überarbeiteten Zusatzgegenstände haben es in sich. Da wäre zuerst dieser Ring, der eine Schadensreduktion von 60% bietet. Und damit nicht genug: außerdem castet er quasi ständig Frost-Nova. Der Ring zusammen mit dem Helm lassen alles um einen herum so gut wie zum Stillstand kommen.

Als weitere Unterstützung gibt es die folgende Armschiene, die die Schilde verdoppelt.

Aber so richtig genial sind erst die nächsten Teilchen. Fragment der Bestimmung gibt eine 50% erhöhte Angriffsgeschwindigkeit für Spektralklinge und eine Erhöhung des Schadens von 200%. Damit alleine wäre Spektralklinge schon super schnell. Aber es kommt noch besser.

Der folgende Gürtel gibt nochmal eine Erhöhung der Angriffsgeschwindigkeit von Primärfertigkeiten um 50%. Damit ist Spektralklinge 100% schneller und geht ab wie eine Nähmaschine.

Das alleine ist angesichts der 2000% Schadenserhöhung durch das Set schon recht knackig. Aber so richtig knallt es erst mit dem neuen Triumvirat. Der erhöht nämlich den Schaden von Arkankugel um satte 200%. Und das ist auch noch drei mal stapelbar. Zusammen mit der 100%igen Geschwindigkeitserhöhung von Spektralklinge hat man die drei Stapel quasi sofort.

Und wem das immer noch nicht reicht: es gibt noch ein Sahne-Häubchen: Instabiles Zepter. Das lässt Arkankugel doppelt explodieren und steigert zusätzlich noch den Schaden von Arkankugel um 65%. Zusammen mit den 600% vom Triumvirat und den 2000% vom Set knallt man damit alles um, was nicht bei drei auf den Bäumen ist.

Damit habe ich gerade relativ entspannt im Solo ein Level 60 Portal beendet. Zugegeben am Ende hat mich der Steinsänger mit seinem Sprungangriff ein paar mal umgehauen aber bis dahin war alles problemlos.

Ich bin mal gespannt, wie schnell die Items nach der Beta droppen. Die Zeiten des Überflusses dürften in Kürze vorbei sein.

T_T

Freitag, 11. Dezember 2015

Screencast an X11 window by keyboard events

Recently I had the requirement to generate a screen cast of a keyboard interaction. There are many full featured application for Windows or Linux to generate screen casts, but they generate often big MPEG files, because they capture 30 or 60 screens per second and use lossy compression algorithms to minimize the file size. This is fine for video games and OBS does a pretty fine job, I have used it recently myself to capture a Diablo III PTR 2.4 session. But all this is not necessary, if one wants to capture keyboard interactions.

Keyboard interaction is triggered by pressing any keys. On Linux running a X11 server xinput can be used to capture keyboard events. And the standard X11 tool xwd can capture a window. And the ImageMagic can be used to combine several images into an animated GIF. This makes it possible to illustrate a keyboard interaction by pretty small GIF images.

I wrote a simple tool called xscreencast, which implements the above idea. It is hosted on GitHub. I have used it to illustrate the difference of the cursor color of a terminal window and Emacs on Stackexchange. This are the screen casts generated by the Perl script.

This is the terminal.

And this is Emacs.

Automatically follow IFRAME wrapper in Google's image search

Google adds a wrapper around the search result of image searches. They say that this might add some kind of convenience, which is by no means obvious to me. I would say that this is just another way to monitor your internet usage.

In order to get rid of it, you need Tampermonkey, if you use Chrome. The following script automatically follows the IFRAME in the search result.

// ==UserScript==
// @name         Follow IFRAME in Google image search
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @include      *://images.google.*/imgres?*
// @grant        none
// ==/UserScript==
/* jshint -W097 */
'use strict';

location.replace(document.querySelector('iframe').src)

By default Tampermonkey uses the @match option, which is quite limited, because it is not possible to match any top level domain. Instead of @match you have to use @include, which supports a more general globing.

Dienstag, 1. Dezember 2015

Selecting the schema of a Sqlite database

The interactive Sqlite command line tool offers the command .schema to read the Schema of a database. This works fine, but of course it is not a valid SQL query. The following query returns the whole schema in one string and is a valid SQL query.
SELECT group_concat(sql, ';' || char(10)) || ';'
FROM sqlite_master
WHERE name NOT LIKE 'sqlite_%';

Mittwoch, 14. Oktober 2015

Using the last command in the Bash prompt

Today I had the idea that it might be useful to have the return value of the last command in the PUtty title. And next step is to put also the last command into the title.

The command history 1 prints the last command from the Bash history of commands. The Output is prefixed by a number and two spaces. The following Bash expression removes the prefix and prints just the command.

$(h=$(history 1);n=${h/% */};echo "${h#$n }")

First h is initialized with the whole history line. Then n is set to the remaining part of h after the longest match from the right up the a space is removed from h. And in the end h without the prefix stored in n is printed.

Donnerstag, 8. Oktober 2015

Limit the length of the path in a Bash prompt

It is possible to define the Bash prompt by setting the PS1 variable. A typical prompt definition is a combination of user name, host name and working directory:

# export PS1='\u@\h:\w\$ '
root@server:/tmp/aaa/bbb/ccc/ddd/eee/fff/ggg/hhh/jjj/kkk# 

But this makes it difficult to dive into really deep directory tries. If the directory gets longer than the width of the terminal, the prompt will span two lines. And if you have to use a limited terminal on a Solaris system, the screen gets totally messed.

For this situations it is possible to define the prompt in that way, that only the last directory is part of the prompt.

# export PS1='\u@\h:\W\$ '
root@server:kkk# 

But having only one directory is often not enough. If you have some source packages, each containing a src directory, it not possible any more to distinguish them.

The best solution for the problem would be to clip the path to a maximum length and indicate the clipping by some kind of special character. That can be done by the following prompt definition.

# export PS1='\u@\h:$(p=${PWD: -30};p=${p:+<$p};echo ${p:-$PWD})\$ '
root@server:<cc/ddd/eee/fff/ggg/hhh/jjj/kkk# 

The definition uses Bash's parameter expansion feature in three steps. First a variable p is defined and 30 characters of PWD are taken from the right. If PWD is less than 30 characters p is an empty string. Otherwise p is the clipped part of PWD. In the next step p gets prefixed with the '<' character, if it is set. Otherwise it will be still undefined. And in the last step either p will be printed, if it is set, or PWD, if p is still undefined. This means that either the clipped and prefixed part of PWD gets printed, if it is longer than 30 characters, or PWD is printed without any modifications.