Bei Traumwetter, ein paar Bierchen und meinem Ausstand bei der Börsenmedien AG haben sich die üblichen Verdächtigen eingefunden. Zum 1.5. wird es für mich Zeit sich zu verändern. Ich kann auf 4 Jahre Projekte mit guten Kollegen zurücksehen. Auf lustige Partys, egal ob zum Bierfest einem Angrillen in der Mittagspause oder in lustiger Riege bei Matteo zur Weihnachtsfeier. Die ein oder andere Freundschaft ist dabei entstanden und nachdem ich nicht aus der Welt bin, versuche ich auch in Zukunft das ganze zu pflegen. Aber zunächst mal zur Abschiedsfeier. Mittwoch um 17:00Uhr wurden alle Stifte fallen gelassen, die Partyhütchen aufgesetzt und das Bier, das zuvor schon im Kühlschrank eingelagert wurde geköpft. Den Kicker haben wir ins Freie gestellt, bei diesem Wetter war einfach nichts anderes möglich und die ein oder andere Chips und Kinderriegelpackung wurde in großen Schüsseln tranchiert.
Inmitten des Getummels schaffte Steine einen kleinen Turnierplan um uns ein kleines Kickerturnier aufzuzeichnen und welch Wunder es hat dieses mal sogar funktioniert. Jeder hat bis zum Schluss mitgespielt und ein Sieger konnte auch ermittelt werden. Wir überspringen den Sieger einfach, nicht wahr Sebastian?? und fahren fort mit Bier und guter Unterhaltung. Chilliger Jazz und Soul aus den Lautsprecherboxen eines Firmenwagens untermalten die ganze Atmosphere. Bis 20:00Uhr und dem Beginn der Championsleague lichteten sich die Reihen etwas aber die hart gesottenen blieben und es war nicht mehr nötig die Reise nach Jerusalem zu spielen um sich von Zeit zu Zeit einen Sitzplatz zu erobern.
PS: Eggbert, Eibert und Dotti haben bereits ihr neues Zuhause bezogen und fühlen sich pudelwohl.
Gegen 23:00Uhr, die letzten Bierreserven gingen zu Ende und das ein oder andere Auge war auch nicht mehr gar so trocken. Langsam legte sich die aufbrausende Stimmung und die Grade am Thermometer ebenfalls. Jacken und Mäntel kamen zum Einsatz. Die Temperaturen waren knapp über null und trieben uns leider nach Hause.
Es war ein schöner Abend, ich bedanke mich bei allen die mir das schöne Präsent überreicht haben. Es kam sehr überraschend und hat mich natürlich gefreut.
Sehr häufig nutze ich mittlerweile das kleine App: Mehr Tanken auf meinem Android Smartphone. Es ist eine super Sache sobald auch die Preise regelmäßig von den Nutzern gepflegt werden. Ich selbst nutze es ziemlich intensiv und pflege regelmäßig aktuelle Preise ein. Fast täglich düse ich an meinen Favourites vorbei und pflege anschließend die Preise ein.
Dabei habe ich mich die vergangenen Tage etwas damit beschäftigt Seiten von Tankstellenbetreibern zu durchforsten und nach vernünftigen Seiten zu suchen. Leider sind sehr viele mit Captcha gesichert, es gibt ja nichts schlimmeres für einen Betreiber als seine Preise transparent darzustellen anscheinend. Leider hilft uns Vater Staat auch nicht dabei einen Überblick behalten zu können.
Ich habe mich mal ein paar Stunden hingesetzt in meiner Freizeit und den Spritpreistransparenz an Avia Tankstellen auf den Leib gerückt. Dabei habe ich festgestellt das man sehr schön das ganze System abgreifen kann und somit über meinen Blog ein kleine Seite eingerichtet. Der Avia Tankomat bietet euch mit Umkreissuche auf eurer Postleitzahl direkten Spritpreisverlgeich an. Leider derzeit nur auf Avia Tankstellen begrenzt.
Für alle die schon immer die Entertain Box wo anders nutzen wollten als der Router steht oder auch in nicht greifbarer Näher per Kabel erreichbar wäre. Habe ich jetzt eine sehr gute und einfache Lösung gefunden.
Derzeit nutze ich für mein TV Erlebnis per Internet die Telekom Entertain Box 301 mit integrierter Festplatte. Wenn es einmal funktioniert, ist es gar nicht mal so schlecht.
Zuerst habe ich einen günstigen WLan Repeater verwendet der nicht geeinget dazu war, die Entertainbox hat nach 5-10 Sekunden aufgehört. Das Bild war eingefroren und auch die Bedienung kurz nach dem Start der Box war mehr als hakelig. Schlechte Reaktionszeiten und schwer Bedienbar. Man konnte umschalten und für 5-10 Sekunden die Sendung erneut verfolgen. Alles halb so schlimm, ich habe eine andere günstige under super einfache Lösung gefunden.
Der Netgear WNCE2001. Ein super einfaches Gerät. Stromversorgung per USB an der Rückseite der Entertain Box und über den Ethernetport einklickbar.
Ein kurzer Klick an der Rückseite des Netgears und an der WLAN Taste eurer Fritzbox und die zwei Geräte synchronisieren sich innerhalb von 30 Sekunden. Keine 5 Minuten später hatte ich Entertain im Schlafzimmer. Super einfach einzurichten, sehr sparsam und vorallem spare ich mir weitere 80€ für den Telekom Repeater bzw. 2,50€ Miete/Monat die ich sonst an die Telekom abdrücken dürfte.
Es können Fehler beim installieren von Magento Themes entstehen. Wenn man z.B. nach der Installationsanleitung eine dump.sql einspielen will, kann es sein das bei einem MySql 5.1 Server ein Fehler im BTREE Error auftaucht.
ERROR 1064 (42000) at line 1561: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘USING BTREE, …
Eine einfache Lösung bietet hier wieder ein kleines Command in der Konsole.
sed -i -r 's/\(([^)]+)\) USING BTREE/USING BTREE (\1)/g' mydump.sql
Für alle die häufiger E-Mail Verläufe oder auch andere Textfiles Archivieren und Migrieren wollen für eine bessere Bestandsaufnahme oder einfach um es sauber ablegen zu können habe ich eine Möglichkeit gefunden mit Open Source Tools eine Migration von Textfiles in PDF’s vorzunehmen. Und das ganze in der Konsole.
Es ist zwar nicht alltäglich eine solche Aufgabenstellung aber man findet relativ wenig dazu im Netz, daher hat es jetzt ein paar Nächte gedauert bis wir einen guten Weg gefunden haben.
Zum einen nutzen wir, egal ob auf Windows oder Unix Systemen.
enscript
Ghostscript
Enscript erstellt uns aus einfachen Textdateien schöne PS Files um diese anschließend weiter zu verarbeiten.
Wie man enscript unter Windows zum laufen bekommt findet ihr hier. Es ist ein graus mit enscript. Aber sobald es läuft funktioniert es ohne Probleme.
Nachdem beide Programme zu unserer Zufriedenheit laufen, könnt ihr mit zwei einfachen Befehlen die PDF erzeugen.
Hi alle zusammen. Ich habe mich mal wieder etwas im Gewusel und Getümmel der Programmierung verloren. Dabei ist mir aufgefallen, das alle Parser die einen MT940 verarbeiten wollen Fehler haben und teilweise nicht funktionieren. Dem ganzen bin ich mal auf den Leib gerückt und präsentier euch hier einen freien MT940 Parser. Könnt ihr kostenlos hier downloaden.
Für alle die nicht wissen was der MT940 macht:
MT940 (MT=Message Type) ist der SWIFT-Standard (Banking Communication Standard) zur elektronischen Übermittlung von Kontoauszug-Daten. Bei verschiedenen Online-Banking-Programmen wird MT940 als Schnittstelle verwendet zu anderen Programmen (z. B. für die Buchhaltung), mit denen die Kontoauszug-Daten weiter verarbeitet werden.
Unterstütz werden alle nötigen Tag’s:
:21: Bezugsreferenznummer
:25: M Kontobezeichnung
:28C: M Auszugsnummer
:60a: M Anfangssaldo
:61: Umsatz
:86: Mehrzweckfeld
:62a: M Schlusssaldo
:64: Aktueller Valutensaldo
:65: Zukünftige Valutensalden
:86: Mehrzweckfeld
Das ganze gibt es in einem Netbeans Projekt als ZIP file zum Download.
Update 25.10.11
Ich habe für euch das Mehrzweckfeld :86: überarbeitet. Ihr findet im Projekt eine neue Klasse die Mehrzweckfeld heißt und in der alle nötigen Felder
Verwendungszweck
Name
BLZ
Kontonummer etc.
geparsed werden. Das ganze könnt ihr euch wieder in der Main ausgeben lassen. Ebenso unterstütze ich jetzt ein Mehrzweckfeld das sich über mehr als eine Zeile erstreckt.
Ich entwickle sehr gerne mit meinem Macbook, leider habe ich feststellen müssen das die Migration von einer Konakart Installation auf einen Glassfish etwas anders läuft als in der Dokumentation beschrieben.
Folgende Befehle können verwendet werden!
make_ear
In meinem zweiten Versuch mit make_ear hat es super funktioniert. Ich würde es mir fast sogar zutrauen das ich es beim ersten mal übersehen habe. make_ear erzeugt im Ordner ear/ eine konakart.ear file. Diese einfach nur auf dem glassfish deployen und viola it runs.
Dieser Befehlt ist ziemlich sinnfrei. Er erstellt unter dem MAC einen Ordner konakart.ear und nicht die File um es dem glassfish schmackhaft zu machen.
Alternative make_wars
Um die korrekten Dateien zu erstellen, geht in den Installationsordner von konakart und in den Subordner custon also: /konakart/custom hier drin befindet sich die build.xml die Konakart benötigt um alle weiteren Befehle auszuführen.
Anschließend führt ihr folgenden Befehl in der Konsole aus: ./bin/ant make_wars Es wird einen Moment dauern aber anschließend, bei korrekter Verarbeitung werdet ihr BUILD SUCCESS am Ende erhalten.
Am einfachsten ist, ihr erstellt die .war Files und ladet alle 3 im Admin Interface auf den Server. Alle generierten Files werden im Ordner /konakart/custom/war/ abgelegt:
birtviewer.war
konakart.war
konakartadmin.war
Nachdem Ihr die .war Files im glassfish deployed habt, geht es an die Datenbank. Soweit noch keine vorhanden ist. Hierzu ladet euch auf den Server am besten per FTP die konakart_demo.sql. Diese findet ihr unter: /konakart/database/MySql/
Geht in die Konsole und legt die Datenbank an:
# > mysql -u root -p
mysql > CREATE DATABASE konakart;
mysql > quit;
anschließend noch die konakart_demo.sql in die konakart datenbank importieren.
# > mysql -u root -p konakart < ./var/tmp/konakart_demo.sql
Nachdem ihr erfolgreich die Datenbank importiert habt, müsst ihr nur noch in den Application Ordner von Konakart die properties Files anpassen:
Also zurück in den domain Ordner des glassfisher z.B.
darin findet ihr schon die Einträge für die Datenbank. Einfach die Nutzer und das Passwort noch anpassen euren Glassfish neu starten und viola das System läuft.
Arbeiten mit dem Konakart Webservice kann einige Schwierigkeiten mit sich bringen. Ich war auch erst einmal ein paar Stunden und Tage darüber die passende IDE und den richtigen Weg zu wählen. Meine Lösung:
Eclipse mit einer virtuellen Maschine auf der eine Konakartinstallation läuft.
Netbeans RPC Webservices ist leider nicht möglich da sich Netbeans dagegen sträubt und scheinbar einige Teile der WSDL falsch übersetzt. Wie ich schon in ein paar Beiträgen vorher beschrieben habe wäre es sinnvoll die Serviceverbindung und Abarbeitung aller Daten in einem Eclipse Projekt durch zu führen.
Schritt 1: Verbindung zu Konakart
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.konakartadmin.ws.KKWSAdminIf;
import com.konakartadmin.ws.KKWSAdminIfServiceLocator;
/**
* KonakartService Class
* per extend in die Subklasse z.b. Kategorie einbinden und per aufruf init()
* zum webservice verbinden
**/
public class KonakartService {
public static Log log = LogFactory.getLog(KonakartService.class);
public static KKWSAdminIf eng;
/** Default credentials for accessing the KonaKart Application Engine */
private static String DEFAULT_USERNAME = "admin@konakart.com";
private static String DEFAULT_PASSWORD = "princess";
/** The session id returned by a successful login */
public static String sessionId;
/**
* @param args
*/
public static void init() {
try {
/*
* Instantiate a KonaKart Engine instance
*/
eng = new KKWSAdminIfServiceLocator().getKKWSAdmin();
eng.setEndpoint("MEINEIP"); // set ip address or hostname
sessionId = eng.login(DEFAULT_USERNAME, DEFAULT_PASSWORD); // get session id
log.info(DEFAULT_USERNAME + " logged in successfully and got session " + sessionId);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Wie schon angeschlagen im letzten Post, heute geht es um die ListView Optimierung in Android. In einem sehr interessanten Webcast von Google I/O 2010 gab es schon einiges sehr sinnvolles zu ListViews und auch wieder einiges was ich dazu gelernt habe.
Für alle die es interessiert: The World of ListView
Hier noch das Tutorial bzw. HowTo zu dem Video. Wozu ViewHandler gebraucht werden und wie man Speicherschonend die ListViews befüllt. Anschließend noch ein kleiner Ausschnitt wie man ListViews aktualisiert mit notifyDataSetChanged().
Ich gehe davon aus das jeder weiß wie man eine ListView in der Layout.xml definiert, daher fangen wir sofort an mit der implementierung der View im Code.
Der Adapter und somit das Herzstück des Tutorials. Wie definiere ich einen ViewHolder zum speichern der statischen Views für eine sinnvolle Speicherwiedernutzung.
import java.util.List;
import java.util.Random;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class ListeItemAdapter extends BaseAdapter {
private Context ctx;
private int rowResID;
private List itemList;
private LayoutInflater layoutInflater;
public String randomText = myRandomText();
private static class ViewHolder {
public static TextView text1;
public static TextView text2;
public static TextView text3;
public static ImageView status;
}
public ListeItemAdapter() { }
public ListeItemAdapter(final Context ctx, final int rowResID, final List itemList) {
this.ctx = ctx;
this.rowResID = rowResID;
this.itemList = itemList;
layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return this.itemList.size();
}
public Object getItem(int position) {
return this.itemList.get(position);
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public void setItemList(List itemList) {
this.itemList = itemList;
}
public View getView(int position, View v, ViewGroup vg) {
ViewHolder holder;
// prüfen ob eine view bereits existiert
if(v == null || v.getTag() == null) {
holder = new ViewHolder();
v = layoutInflater.inflate(rowResID, null); // inflate the item layout!
holder.text1 = (TextView) v.findViewById(R.id.text1);
holder.text2 = (TextView)v.findViewById(R.id.text2);
holder.text3 = (TextView)v.findViewById(R.id.text3);
holder.status = (ImageView) v.findViewById(R.id.status);
v.setTag(holder); // viewholder setzen
} else {
// laden der Views über den ViewHolder
holder = (ViewHolder) v.getTag();
}
// get item value
String item = itemList.get(position);
// Views füllen
holder.text1.setText(item);
holder.text2.setText(myRandomText());
holder.text3.setText(myRandomText());
holder.status.setImageResource(myRandomImage());
return v;
}
/**
* get random String value
* @return String
*/
public String myRandomText() {
String[] values = new String[] { "Hase","Hund","Katze","Maus","Schwein","Pferd","Esel","Kuh","Henne","Hahn","Vogel","Affe","Giraffe","Schlange" };
Random generator = new Random();
return values[generator.nextInt(values.length)];
}
/**
* get random Image Resource
* @return int
*/
private int myRandomImage() {
int[] values = new int[] { R.drawable.tick_green_00, R.drawable.tick_green_01, R.drawable.tick_green_02, R.drawable.tick_green_03 };
Random generator = new Random();
return values[generator.nextInt(values.length)];
}
}
Somit wäre eigentlich alles geklärt. Es ist fast selbst beschreibend für die, die sich schon mit ListViews auseinander gesetzt haben.
Wir werden jetzt mit einem Handler in der MainActivity noch ein delayed Handler aufrufen indem wir die Werte der Listview ändern.
Hier die veränderte Activity.
PART 2
Step1
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.widget.ListView;
public class ListActivity extends Activity {
private Context ctx;
private ListView liste;
private ListeItemAdapter adapter;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.liste);
this.ctx = this;
handler = new Handler();
Listitems = new ArrayList();
for(int i=0;i<100;i++) {
items.add(new ListeItemAdapter().randomText);
}
adapter = new ListeItemAdapter(this, R.layout.liste_item, items);
liste = (ListView) findViewById(R.id.liste);
liste.setAdapter(adapter);
Thread updateListViewThread = new Thread() {
@Override
public void run() {
super.run();
final Listitems = new ArrayList();
for(int i=0;i<100;i++) {
items.add(new ListeItemAdapter().randomText);
}
handler.postDelayed(new Runnable() {
@Override
public void run() {
adapter.setItemList(items);
adapter.notifyDataSetChanged();
}
}, 5000);
}
};
updateListViewThread.start();
}
}
Es ist ein Graus. Konakart Webshop Software arbeitet per SOAP Schnittstelle einfach nicht mit Netbeans zusammen. Die Java IDE ist sehr einfach und auch das Webservice einbinden ist mit ein paar Klicks erledigt. Ich werde euch, wenn ich noc eine andere Lösung finde darüber informieren. Aber derzeit ist es mir nicht möglich gewesen einen vernünftigen, vorallem schnellen Workaround für das Problem zu schaffen. Auch das anpassen der WSDL Files bringt keinen rechten Erfolg daher einen kurzen Tipp von mir.
Ladet euch Eclipse herunter und startet ein Java Projekt. Führt hierbei den den Webservice Client Punkt aus und includiert beide WSDL Files. Im Normalfall findet ihr sie unter:
Anschließend könnt ihr per Import in Netbeans das Projekt in euere IDE importieren. Die fehlenden JAR’s werden direkt verlinkt. Dieses könnt ihr in euer Hauptprojekt so einbinden und übernehmen. Es läuft ohne Probleme.
Es ist keine vernünftiger Workaround und eigentlich auch schade das es bisher auch noch keine vernünftige Lösung von Konakart gibt. Evtl. schaffe ich es noch die WSDL Files so anzupassen das sie auch vernünftig im Netbeans verarbeitet wird.
Die JAX-RPC Plugin Erweiterung im Netbeans macht schon einige Fortschritte.
Aber das gelbe vom Ei ist es noch nicht. Falls jemand schon andere Erfahrungen damit gemacht hat oder wie einfach es sich mit der RMI Schnittstelle arbeitet, lasst es mich bitte wissen.
Kleine Vorschau zum nächsten Blogeintrag:
Thema: Android – Listviews optimieren und mit Viewhandlern arbeiten. Recyceln von Views. Änderungen in Listviews darstellen. Das richtige Ansprechen von Feldern in Listviews. 2 verschiedene Möglichkeiten.