StayOnTop – Application to keep any application window always on top

alwaysontopFor former windows versions there was an application (I don’t remember the name) which was able to keep any window on top of the others. That was pretty helpful while copying text or watching movies during work. For Windows 7 I did not find a free one so I wrote one myself. It is a .NET application so you need the runtime. The application starts as tray icon. When you click it with the right mouse button it shows all processes that have a visible interface. If you click it the window is set on top, if you click it again the window is sent to the background again. The application is not too smart and does not remember the top most windows if you close it. Just set and reset the window again if you accidently closed the application. Hope you like it and consider it as helpful as I do.

You can download it here for free.

Wichtelwald – Contest entry for Devmania 2015

Last weekend we wrote a game for the over-night contest of the Devmania game jam in Mainz. Collect wood and snowballs at day time to be able to defend your hut at night against the evil goblins. The gameplay is a funny mixture of isometric collectable and first person tower defence.

Download it here.

HDFS – setgid and setuid still not possible in Hadoop 2.7.1

I faced the requirement to set the setgid and/or the setuid for directories in a customer’s HDFS so that I spent the last 10 minutes searching the internet for news on a possibility to do so. Long story short: results were bad. Last time I tried with Hadoop 2.2.0 without success, today I tried with 2.7.1 but there were no changes at all. So commands like the following are NOT possible:

hdfs dfs -chmod g+s /tmp
hdfs dfs -chmod u+s /tmp

As a matter of fact, files created in HDFS receive the group of the parent directory and hence act as if the setgid flag is set. The uid a newly created referes always to the user that created the file.

Update: When mounting an HDFS as NFS Gateway the behavior is different since the file system acts as if the setgid was NOT set. Which is strange since same file operations return different results depending on on which interface the operation is executed on. Furthermore, the NFS Gateway does not take secondary groups into account when evaluating permissions to write into the mounted HDFS. The only options to achive an allowance is a user mapping as described at the bottom of the page of the Hadoop Permissions Guide.

If you face the need to make use of the flags think about using a posix compliant alternative to HDFS like Spectrum Scale/GPFS.

 

setuid_setgid

Short Eclipse proxy guidelines

If you consider yourself as developer and if you use Eclipse as IDE you might at least once faced that problem that you sat behind a proxy in some customers network and need to use to connect to the internet downloading either maven dependencies or plugins for your IDE. Since I struggle with the configuration of the proxy in nearly every project I decided to write these few facts down in case they might help you, too.

In Eclipse → Window → Preferences → General → Network Connections you find the following view. The combobox named Active Provider lists three options to configure a proxy. Native uses the native OS settings, Manual allows you to enter a proxy host, port, user name and password yourself and Direct connects directly to the desired URL.

ProxyEclipse

As a first step you might want to edit the proxy settings for a manual setup and enter the proxy server properties as provided by your network administrator. Then follow these two simple rules for your later work in Eclipse:

  • When downloading software from an online repository or the Eclipse marketplace – Set the proxy to Manual
  • When downloading maven dependencies – Set to proxy to Native

That’s it!

 

Deploy a web application to an embedded Tomcat 8

I’ve found various tutorials on creating an embedded tomcat programatically and deploy a web application to it. Unfortunately, non of the tutorials was up to date using Tomcat 8 and actually non was showing how to deploy anything else but a servlet so I decided to write a short tutorial on how to create the server and deploy either a WAR file or a folder containing a non archived web application.

Create a simple Java project in ecplipse, enable maven and add the following dependencies:

<dependencies>
  <dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-catalina</artifactId>
    <version>8.0.21</version>
  </dependency>
  <dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-util</artifactId>
    <version>8.0.21</version>
  </dependency>
  <dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-core</artifactId>
    <version>8.0.21</version>
  </dependency>
  <dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <version>7.0.8</version>
  </dependency>
</dependencies>

Optionally, you can enable the maven-assembly-plugin to package your application as JAR at the end and have maven include all dependencies you specified. As build goal you’ll have to use assembly:single.

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <configuration>
    <archive>
      <manifest>
        <mainClass>de.jofre.embeddedtc.runtime.Main</mainClass>
      </manifest>
    </archive>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
  </configuration>
</plugin>

Now create the class de.jofre.embeddedtc.runtime.Main (The name is arbitrary) and add write the code according to the next listing:

package de.jofre.embedded.runtime;
 
import java.io.File;
import java.util.logging.Logger;
 
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;
 
public class Main {
  private final static Logger LOGGER = Logger.getLogger(Main.class.getName());
  private final static String mWorkingDir = System.getProperty("java.io.tmpdir");
  private static Tomcat tomcat = null;
 
  public static void main(String[] args) {
 
    tomcat = new Tomcat();
    tomcat.setPort(8080);
    tomcat.setBaseDir(mWorkingDir);
    tomcat.getHost().setAppBase(mWorkingDir);
    tomcat.getHost().setAutoDeploy(true);
    tomcat.getHost().setDeployOnStartup(true);
 
    try {
      tomcat.start();
    } catch (LifecycleException e) {
      LOGGER.severe("Tomcat could not be started.");
      e.printStackTrace();
    }
    LOGGER.info("Tomcat started on " + tomcat.getHost());
 
    // Alternatively, you can specify a WAR file as last parameter in the following call e.g. "C:\\Users\\admin\\Desktop\\app.war"
    Context appContext = Main.getTomcat().addWebapp(Main.getTomcat().getHost(), "/app", "C:\\Users\\admin\\Desktop\\app\\");
    LOGGER.info("Deployed " + appContext.getBaseName() + " as " + appContext.getBaseName());
 
    tomcat.getServer().await();
  }
}

The last question is how the directory in C:\\Users\\admin\\Desktop\\app\\ respectively the C:\\Users\\admin\\Desktop\\app.war looks like. Well, it contains a simple HTML file…

<html><body>Test</body></html>

… and another folder called WEB-INF containing the web.xml with the following content:

<?xml version="1.0" encoding="ISO-8859-1"?>
 
<!DOCTYPE web-app 
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
    "http://java.sun.com/dtd/web-app_2_3.dtd">
 
<web-app>
 
    <display-name>Test App</display-name>
    <description>A test app</description>
 
	<welcome-file-list>
			<welcome-file>index.html</welcome-file>
	</welcome-file-list>
 
    <session-config>
      <session-timeout>30</session-timeout>
    </session-config>
 
</web-app>

Now if you start the java application you call http://localhost:8080/app and the content of index.html should be displayed. Hope this helps you!

Unix – id does not show group names from groups in LDAP

I recently faced the challenge that group names are not displayed calling e.g. id jonas when managing my groups in LDAP which is connected via SSSD. My fault was that I forgot to add the following lines to my domain in /etc/sssd/sssd.conf:

ldap_group_object_class = posixGroup
ldap_group_search_base = ou=groups,dc=example,dc=com
ldap_group_name = cn
ldap_group_member = memberUid

Hope this hint helps here and there.

Auflösen von Oracle TNS Namen schlägt fehlt

Ich arbeite seit einigen Tagen mehr oder weniger freiwillig mit Oracle und bin fast verrückt geworden, als ich daran gescheitert bin, über sqlplus eine einfache Verbindung zu einer Datenbank herzustellen. Das übliche Vorgehen ist, dass man in der Datei %ORACLE_HOME%/network/admin/tnsnames.ora einen Alias für eine Verbindung anlegt und diese dann bei der Verbindungsherstellung angibt. Ein solcher Alias sieht wie folgt aus:

myAlias=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myhost.jofre.de)(PORT=1234))(CONNECT_DATA=(SERVICE_NAME=mysrv)(SERVER=DEDICATED)))

Um nun über Command-Line und sqlplus eine Verbindung zu der Datenbank herzustellen, führt man folgenden Befehl aus:

sqlplus user/password@myAlias

Nun hatte ich immer das Problem, dass mir dabei die Fehlermeldung TNS-03505 Failed to resolve name angezeigt wurde. D.h. dass Oracle den Alias myAlias nicht auflösen konnte, da der Inhalt von tnsnames.ora scheinbar nicht bekannt war. Des Rätsels Lösung war nun die Umgebungsvariable TNS_ADMIN zu setzen, sodass diese auf tnsnames.ora zeigt.

set TNS_ADMIN=%ORACLE_HOME%/network/admin/tnsnames.ora

Natürlich muss ORACLE_HOME im Vorfeld ebenso gesetzt worden sein. Hoffe das hilft dem ein oder anderen.

Devmania 2014 – Derp in Trouble

Die Devmania ist eine Veranstaltung in Mainz, auf der sich Spieleentwickler aus ganz Deutschland treffen, um in einem Overnight-Contest gegeneinander anzutreren und zu einem bestimmten Thema ein Spiel zu entwickeln. Dieses Jahr war das Thema Memes. Nils und ich haben mit unserem Projekt Derp in Trouble den dritten Platz belegt. Das Spiel könnt ihr hier herunterladen, ein kurzes Video gibt es am Ende des Posts. Zwar ist der Umfang mit einem einzelnen Level recht gering, dafür sind aber sämtliche Inhalte in etwa 12 Stunden entstanden. Einzige Ausnahme ist der Soundtrack, für den mal wieder ein Dank an Ruben geht 🙂

Pencil – Kostenloses Tool zum Erstellen von Mock-Ups

PencilMock-Ups sind ein unerlässliches Planungsinstrument wenn es darum geht, Prototypen von Views einer Anwendung zu erstellen, sei es nun für mobile Geräte, Desktop- oder Web-Anwendungen. Vor einigen Jahren wurde ein Tool Namens Balsamiq vorgestellt, dass diesen Bereich ungemein belebte. Auch die Entwickler bemerkten den User-Ansturm recht schnell und setzten den Preis für Balsamiq mit 79$ sehr hoch an, sodass ich und viele meiner Kollegen sich entscheiden mussten das Tool entweder zu kaufen, oder sich eine Alternative zu suchen.

Lange Zeit tat sich nichts auf dem Freeware-Markt doch heute in einer Schulung habe ich Pencil entdeckt. Pencil bietet ein Baukastensystem für oben genannte Anwendungstypen wobei die Komponenten, z.B. für Android-Apps, exakt so aussehen, wie man es von seinem Smartphone kennt. So kann man sich leicht ansehnliche Muster zusammenklicken, die die Entwickeler bei der Umsetzung der Anforderungen an eine Applikation unterstützen. Freunde von Balsamiq können ebenso auf das gewohnte Sketchy-Style zugreifen.

Java Fehler – Archive for required library could not be read or is not a valid ZIP file

mavenArbeitet man mit einem Team an einem Java-Projekt, dass Maven nutzt, kann es vorkommen, dass bestimmte Abhängigkeiten referenziert werden, ohne, dass sie auf der Platte vorhanden sind. Eclipse (oder das entsprechende Maven-Plugin) tendiert in dem Fall dazu die Fehlermeldung Archive for required library could not be read or is not a valid ZIP file auszugeben. Dies geschieht auf Basis der Annahme, dass die referenzierten Bibliotheken nicht vorliegen.

Um dieses Problem zu lösen, müssen Sie lediglich alle Ordner in Ihrem Maven-Repository löschen, dieses befindet sich bei mir (Ich verwende das Maven-Plugin für Eclipse) im Ordner C:\Users\padmalcom\.m2\repository. Starten Sie im Anschluss Eclipse neu und Maven wird die benötigten Dependencies beim nächsten Start nachladen. Unter Umständen ist es nötig, dass Sie über einen Rechtsklick auf das betroffene Projekt die Option Maven -> Update Project… auswählen. Der Fehler sollte dann im Regelfall verschwunden sein.