Martin Lantzsch
Software Entwickler
30. September 2013

Einen JavaScript Array erkennen

30. September 2013 - Geschrieben von Martin - Keine Kommentare

Gerade habe ich beim Code Review folgenden Code gesehen:

typeof [1, 2, 3] === 'array'

Von der Logik her okay, aber halt! Ein JavaScript Array ist doch ein Objekt? Und ja ein schneller Hack auf der Konsole sagt uns

typeof [1, 2, 3]
=> "object"

Ergo müssen wir prüfen ob das Objekt eine Instanz von Array ist

[1, 2, 3] instanceof Array
=> true

29. August 2013

ExtJS Store AJAX Proxy HTTP Basic Authorization

29. August 2013 - Geschrieben von Martin - Keine Kommentare

Um Daten von einem Webservice abzurufen, der mittels HTTP Basic Authorization gesichert ist muss dem AJAX Proxy ein Header mitgegeben werden, der die Base64 encodeten Zugangsdaten enthält. Dies habe ich bei meinem Store direkt in den Konstruktor geschrieben:

constructor: function(config) {
    this.proxy.headers = {
        'Authorization': 'Basic ' + window.btoa(config.username + ':' + config.password)
    };
    this.callParent(config);
}

im Gesamten dann etwa so:

Ext.define('Resi.stores.Mails', {
    proxy: {
        type: 'ajax',
        url: 'api/mails'
    },
    constructor: function(config) {
        this.proxy.headers = {
            'Authorization': 'Basic ' + window.btoa(config.username + ':' + config.password)
        };
        this.callParent(config);
    }
});

Die verwendete window.btoa ist leider nur in neuen Browsern verfügbar, sollten auch ältere Browser später diese Anwendung nutzen sollen, muss hier eine Base64 Bibliothek eingebunden werden.

var Mails = Ext.create('Resi.stores.Mails', { 
    username: 'Resi',
    password: 'Mein sicheres Passwort'
});

25. August 2013

Standard PHP Library (SPL) Beispiele

25. August 2013 - Geschrieben von Martin - Keine Kommentare

Ich habe festgestellt das viele Leute kaum Bestandteile aus der SPL (Standard PHP Library) nutzen. Wahrscheinlich weil die Dokumentation auf php.net ein wenig zu wünschen übrig lässt. Aus diesem Grund habe ich vorhin begonnen ein paar Beispiele zu schreiben, die den korrekten Einsatzzweck von SPL Klassen nicht nur erahnen lassen sondern auch an teilweise Real World Szenarien zu verstehen helfen.

Das ganze ist auf GitHub in meinem Repository SPL-Examples zu finden.

9. Juli 2013

EntityFramework Code First POCO Schnelleinstieg

9. Juli 2013 - Geschrieben von Martin - Keine Kommentare

1. per NuGet das Entity Framework Paket nachinstallieren
EntityFramework NuGet

2. Datenquelle (Connectionstring) in der App.config hinterlegen

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- schnipp -->
  <connectionStrings>
    <add name="UserDatabase"
         providerName="System.Data.SqlServerCe.4.0"
         connectionString="Data Source=User.sdf"/>
  </connectionStrings>
</configuration>

3. Model erstellen

class User
{
    public int Id { get; set; }
    public String Firstname { get; set; }
    public String Lastname { get; set; }
}

4. Context erstellen

class UserContext : DbContext
{
    public UserContext() : base("UserDatabase")
    {}
 
    public DbSet<User> Users { get; set; }
}

5. Verwendung des Contextes zum erstellen eines Datensatzes

using (var context = new UserContext())
{
    User user = new User { Firstname = "Martin", Lastname = "Linux" };
    context.Users.Add(user);
    context.SaveChanges();
    Console.WriteLine(user.Firstname);
    Console.ReadLine();
}

EntityFramework Ausgabe

6. Daten einsehen über den Server Explorer

  • Server Explorer über Ansicht – Server-Explorer öffnen
  • Rechtsklick auf Datenverbindungen dann Verbindung hinzufügen
  • Datenbankdatei aus dem Projektbinverzeichnis wählen

EntityFramework Verbindung hinzufügen
EntityFramework Server Explorer

6. Juli 2013

SQL für Fortgeschrittene

6. Juli 2013 - Geschrieben von Martin - Keine Kommentare

Eine Zeile ohne Kollisionen durch andere möglicherweise Zeitgleiche Abfragen ändern und zugleich noch die ID dieser bekommen?

SET @update_id := NULL;
UPDATE residata_jobs_jobs AS job
SET
	job.inProgress = TRUE,
	job.id = (SELECT @update_id := job.id)
WHERE
	job.id = (
		SELECT id FROM (
			SELECT subjob.id
			FROM residata_jobs_jobs AS subjob
			WHERE
				subjob.inProgress = FALSE
			ORDER BY subjob.queueTime ASC
			LIMIT 1
		) AS T
	);
SELECT @update_id;

Jetzt muss ich das nur noch per Native Query in Doctrine2 einbauen… DQL (Doctrine Query Language) habe schon abgeschrieben als ich festgestellt habe, dass anonyme Subquerys nur sehr sehr eingeschränkt funktionieren.

26. Juni 2013

Tickets to Berichtsheft

26. Juni 2013 - Geschrieben von Martin - Ein Kommentar

Diese grandiose Idee sollte ich mal mit in meine *To-Develop-List* aufnehmen. Würde sicher vielen Auszubildenden da draußen helfen, die im Ticket Strom untergehen und aufgrund eng gesteckter Deadlines keine Zeit zum Berichtsheft schreiben haben.

6. Juni 2013

Umlaute über MySQL Query fixen

6. Juni 2013 - Geschrieben von Martin - Keine Kommentare

Fehlerhafte Kodierungen wie ü oder ö können direkt im Query folgendermaßen korrigiert werden:

CONVERT(BINARY CONVERT([FIELD] USING latin1) USING utf8)

27. Mai 2013

PlayFramework 2.1 use Global in the complete application

27. Mai 2013 - Geschrieben von Martin - Keine Kommentare

While building the new Resigame game server I noticed, that I need a persistent Class for the complete lifetime of my application for storing tasks and other useful things like cached objects (e.g. socket connection to internal communication backend).

So I used the „Global“ class for this purpose. The only steps I had to do was adding the Global.java to a package (otherwise you can’t import it).
Global.java
Afterwards I added a reference to the application.conf:

application.global=core.Global

Now the Global object is accessible in all parts of my application. For example I added a static property called tasks for an object of my TaskScheduler, which is instantiated on application startup.

public class Global extends GlobalSettings {
    public static TaskScheduler tasks;
    public void onStart(Application app) {
        // start task scheduler
        Global.tasks = new TaskScheduler();
        Global.tasks.add(new UserSessionEndExpired());
        Global.tasks.start();
    }
}

this TaskScheduler is now controllable by my REST API:

public static Result stop(Integer taskId) {
    JsonResult result = new JsonResult();
    if(Global.tasks.stop(taskId))
        result.status = 200;
    else
        result.status = 400;
    return result.send();
}