Uninteressantes von einem Anwendungsentwickler aus Linse
 

Beiträge in der Kategorie "Programmieren"

 
Seite 1 von 4

[Netbeans] "Fat" JAR-Archive - Abhängigkeiten mit packen

Kategorie "Programmieren" Programmieren  Verfasst am 25.08.2011 12:41 25.08.2011 12:41  1 Galeriebild 1 Galeriebild  3 Kommentare 3 Kommentare  

Netbeans bietet auf GUI Ebene keine Möglichkeit im Projekt verknüpfte JAR Libarys beim Build des Projektes mit in das JAR Archiv zu packen, sodass man alles was man für das Programm benötigt in einer Datei hat.

Standardmäßig wird im Projektunterordner dist/ immer ein Ordner lib/ angelegt, wo alle benötigten Libarys separat abgelegt werden.  

Um das zu ändern, muss man ein wenig Hand anlegen und die build.xml im Projektverzeichnis bearbeiten. Dazu verwendet man einfach das File-View, welches man unter Window » Files finden kann. Die build.xml kann dann einfach mit Netbeans geöffnet werden.

Nun muss am Ende der build.xml vor dem </project>-Tag folgendes eingefügt werden:

<target name="-unjar-and-copy-lib-jars">
   <unjar dest="${build.classes.dir}">
      <fileset dir="lib">
         <include name="**/*.jar"/>
      </fileset>
      <patternset>
         <exclude name="META-INF/**"/>
         <exclude name="/*"/>
      </patternset>
   </unjar>
</target>

<target depends="init,compile,-pre-pre-jar,-pre-jar,-unjar-and-copy-lib-jars" name="fat-jar">
   <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
   <jar destfile="${dist.jar}">
      <fileset dir="${build.classes.dir}"/>
      <manifest>
         <attribute name="Main-Class" value="${main.class}"/>
      </manifest>
   </jar>
   <echo>To run this application from the command line without Ant, try:</echo>
   <property location="${dist.jar}" name="dist.jar.resolved"/>
   <echo>java -jar "${dist.jar.resolved}"</echo>
</target>

<target depends="clean,fat-jar" name="clean-and-fat-jar"/>

Wie in Zeile 3 des Schnipsels festgelegt, müssen nun alle benötigten Libarys im Unterordner lib/ des Projektes abgelegt werden. Danach noch eventuell die Verknüpfung der Libs innerhalb des Projektes (via GUI, Libaries » Add JAR/Folder...) ändern.

Wenn man nun einen Rechtklick auf die build.xml macht, sollte man unter Run Target » Other Targets den Menüpunkt fat-jar finden. Genau das Run Target muss ausgeführt werden.

Run Target

Wenn man nun das JAR-Archiv, was sich in dist/ befindet, in einen anderen Ordner verschiebt, sollte es trotzdem noch lauffähig sein. :)

Ich find es sehr merkwürdig das Netbeans dieses Feature nicht auf GUI-Ebene mitbringt und finde, dass Oracle da dringend nacharbeiten muss!

via joshuaborn.info

 

PHP5, Debian Squeeze und $_ENV

Kategorie "Programmieren" Programmieren  Verfasst am 15.06.2011 13:32 15.06.2011 13:32  2 Kommentare 2 Kommentare  

Gerade habe ich php5-cgi auf einem frischen Debian Squeeze System installiert. Das Script was ich damit ausführen wollte, benötigt als Parameter eine Environment Variable. Nur wurde die nicht gesetzt. Das komplette $_ENV Array war leer.

Abhilfe schafft die Option variables_order in der entsprechenden php.ini.

/etc/php5/cli/php.ini

variables_order = "EGPCS" # (ENV, GET, POST, COOKIE, SESSION)

Das "E" am Anfang beschreibt, dass auch $_ENV gefüllt werden soll. Startet man nun das PHP Script funktioniert wieder alles. ;)

Beispielaufruf

network_id="iz-smart" php -f child.php

Innerhalb des Script gibt es dann ein Arrayfeld mit dem Namen "network_id" in $_ENV.

 

In einem MySQL Query select und update/insert

Kategorie "Programmieren" Programmieren  Verfasst am 03.04.2011 17:04 03.04.2011 17:04  2 Kommentare 2 Kommentare  

In einem Projekt stand ich vor dem Problem, dass über eine API verschiedene Clients auf die gleichen Tabellen zugreifen. Damit die Tabellen sauber bleiben, darf allerdings immer nur ein Client gleichzeitig schreibende Operationen ausführen. 

Auch muss es weiterhin möglich sein, dass interne Scripte die Tabellen lesen und schreiben dürfen. LOCK TABLES kommt dadurch also nicht in Frage.

Die einfachste Lösung war eine Tabelle mit zwei Spalten. Einem Identifier und dem Status. Der Identifier muss dabei natürlich einzigartig (UNIQUE) sein. Außerdem darf in der Tabelle nur ein Datensatz gleichzeitig den Status 1 (gesperrt) haben.

Folgendes Query führt dann alle nötigen Prüfungen und Aktionen aus:

INSERT INTO LockTable
   (name, status, createdBy, creationTime) 
SELECT 
   '$name', '$lock_status', '11', NOW() 
FROM 
   LockTable 
WHERE '1' NOT IN ( SELECT status
FROM LockTable
WHERE status = '1'
) OR '$lock_status'='0'
ON DUPLICATE KEY UPDATE status = '$lock_status',
lastModifiedBy='1', lastModifiedTime=NOW()

Das Query führt drei Aktionen auf einen Rutsch aus:

  • Ist für $name kein Datensatz vorhanden, wird dieser erstellt.
  • Ein Datensatz wird nur gesperrt, wenn es keinen anderen gibt, der gesperrt (auf 1 gesetzt) ist.
  • Existiert bereit ein Datensatz für $name, wird dieser aktualisiert.

Würde man diese Aktionen nun in einzelne Querys aufteilen, bestünde die Gefahr, dass sich zwischen SELECT und INSERT/UPDATE eine weitere Verbindung zwischen schaltet und sich dort als gesperrt markiert. Im schlimmsten Fall wären dann zwei Verbindungen gleichzeitig gesperrt.

In der Anwendung kann man dann über den Affected Rows Zähler (der muss >0 sein) sehen, ob die sperre erfolgreich gesetzt wurde.

Wichtig: In der Tabelle muss sich IMMER mindestens ein Datensatz befinden. Ansonsten funktioniert das erste Select, welches die Daten für den Insert zusammenbaut nicht!

 

Dockstar Keylistener 2.0

Kategorie "Programmieren" Programmieren  Verfasst am 06.03.2011 00:22 06.03.2011 00:22  6 Kommentare 6 Kommentare  

In den letzten Wochen habe ich mich wieder viel mit der Dockstar beschäftigt, und auch die nächste Generation meines Keylisteners entwickelt. Es sind einige neue Features hinzu gekommen.

  • Auswertung der Eingaben pro Zeichen
  • Keycodes können ohne [Enter] ausgelöst werden. (z.B. Einzeltasten)
  • Keycode Untergruppen

In Planung

  • Ausführung von Befehlen mit einem anderen Unix Benutzer

Speziell für die Steuerung eines MPD Servers ist die Auswertung von Einzelzeichen hinzu gekommen. Sprich wenn man das + drückt, soll die Lautstärke um 10% ansteigen, wenn man die 6 drückt soll der Player einen Titel vor spingen, und so weiter.

Weiterhin ist natürlich die Eingabe von mehrstelligen Keycodes mit anschließendem [Enter] möglich.

Wird ein Keycode aufgerufen, der eine Untergruppe enthält, werden alle Keycode Zuordnungen gelöscht und durch die innerhalb des Keycodes definierten ersetzt. Dies kann unendlich oft untereinander passieren. Um wieder eine Ebene höher zu kommen, tippt man einfach 3x [Enter].

Anwendungsbeispiel: Mit "/" schaltet mein Keypad auf die MPD Steuerung um. Dann sind die Tasten alle mit einem Einzelzeichen-Befehl belegt. Normal hört das Keypad nur auf dreistellige Codes die Netzwerkprofile usw umschalten.

Bisher ist der Keylistener und die neue Dokumentation dazu noch als unstable markiert. In den letzten Tagen sind immer mal wieder kleine Fehler aufgetaucht. Wer trotzdem mal testen möchte, oder auch einen Blick in den Quellcode werfen will: http://stuff.fiae.ws/php/dskeylistener/unstable/.

Bin für jegliche Kritik dankbar. Falls es also noch Fehler oder Ähnliches gibt: Nur raus damit. ;)

 

Globaler Datenspeicher

Kategorie "Programmieren" Programmieren  Verfasst am 28.12.2010 00:29 28.12.2010 00:29  1 Kommentar 1 Kommentar  

Mit diesem kleinen PHP Schnipsel kann man einen recht eleganten Datenspeicher für global verfügbare Daten erzeugen. Mit der magischen Methode __callStatic() können Methoden erzeugt werden. In diesen Methoden werden dann die Daten gespeichert.

Schöner wäre dies natürlich noch mit __set() und __get(), allerdings sind diese Methoden im statischen Kontext nicht verfügbar. Und der Umweg über einen Singleton ist mir persönlich für sowas zu aufwändig.

Globals::einbeliebigername( "der Wert" ); // <-- Speichern
Globals::einbeliebigername(); // <-- Auslesen

Die Methode __callStatic() ist leider erst ab PHP 5.3.0 verfügbar. Wenn jemand eine bessere Lösung hat: Nur raus damit. Bin da Vorschlägen offen. ;)

Schnipsel: Globaler Datenspeicher

 

mysql_real_escape_string() in Java JDBC

Kategorie "Programmieren" Programmieren  Verfasst am 24.10.2010 15:24 24.10.2010 15:24  0 Kommentare 0 Kommentare  

Die JDBC Lib von MySQL bietet auch eine Klasse um Strings für die Nutzung in Statements escapen kann.

Die Klasse funktioniert ähnlich wie Zend_Db, allerdings wird hier zusätzlich noch der Datentyp berücksichtigt. Ein Beispiel wie das ganze funktioniert gibt es in meiner Schnipseldatenbank.

Have fun. ;)

 

DynDNS mit der INWX XML-RPC API

Kategorie "Programmieren" Programmieren  Verfasst am 20.09.2010 21:45 20.09.2010 21:45  2 Kommentare 2 Kommentare  

Der Domain Provider InterNetworX (kurz inwx) bietet eine XML-RPC Schnittstelle um alles mögliche an den Domains zu manipulieren. Man kann über die Schnittstelle sogar neue Domains registrieren.

Mit einem kleinen Shellscript habe ich für meinen OpenWRT Router ein DynDNS Script gebaut. Es wird alle fünf Minuten aufgerufen und aktualisiert eine Subdomain wenn sich die WAN IP geändert hat.

http://snippets.sim4000.de/show/35/

In der XML Datei müssen die Zugangsdaten zum Kundenbereich von inwx.de und die Unique ID des DNS Eintrags gesetzt werden. Die UID bekommt man aus der URL zum Bearbeiten eines DNS Eintrags. Hier ein Beispiel:

https://www.inwx.de/kunden/nameserver-updrec.php?recid=107779999

Wenn alles funktioniert sollte nun vom XML-RPC Server als Antwort "Command completed successfully" zurück liefern. Und dann sollte auch die aktuelle IP Adresse im DNS Record stehen.

 

[PHP] Mit foreach Arrays manipulieren

Kategorie "Programmieren" Programmieren  Verfasst am 17.08.2010 19:24 17.08.2010 19:24  0 Kommentare 0 Kommentare  

Gerade bei php.net gelesen: Man kann in einer foreach auch mit Referenzierung arbeiten. So kann man auch über eine foreach die Felder eines Arrays verändern.

<?php
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
unset($value);
?>

Das Snipsel ist dreister weise von php.net geklaut. :P

 

MySQL Dumpfiles verketten

Kategorie "Programmieren" Programmieren  Verfasst am 23.07.2010 23:21 23.07.2010 23:21  0 Kommentare 0 Kommentare  

Ein Datenbank Layout welches mit DBDesigner4 entwickelt wird, soll mit einigen Optionen importiert werden.

Da DBDesigner allerdings bei jedem Export die komplette SQL File überschreibt, müsste man bei jedem Export die Befehle erneut in das SQL File tippen. Hierfür stellt MySQL den Befehl source zur Verfügung.

Es lassen sich also über die MySQL Kommandozeile SQL Files importieren. So kann man auch mehrere Dumps miteinander verketten.

mydb_import.sql

drop database if exists mydb;
create database mydb;
use mydb;
SET foreign_key_checks = 0;

source mydbscheme.sql;

SET foreign_key_checks = 1;

mydbscheme.sql

CREATE TABLE groups (
  group_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  group_name INTEGER UNSIGNED NULL,
  group_description TEXT NULL,
  group_active ENUM('Y', 'N') NULL DEFAULT 'N',
  PRIMARY KEY(group_id)
)
TYPE=InnoDB;

Erspart eine Menge Zeit während der Entwicklung des Datenbank Layouts. ;)

 

HashMap - Das assoziative, dynamische Array in Java

Kategorie "Programmieren" Programmieren  Verfasst am 20.07.2010 16:28 20.07.2010 16:28  0 Kommentare 0 Kommentare  

Die HashMap aus Java ist vergleichbar mit einem normalen Array in PHP. Sie ist dynamisch in der Anzahl der Einträge und ist in der Lage assoziative Feldnamen zu nutzen. Man muss sich nur beim Index und beim Inhalt auf jeweils einen zentralen Datentyp festlegen.

http://snippets.sim4000.de/show/33/

Als alternative gibt es auch noch ArrayList. Ist an einigen Stellen bestimmt auch interessant. Hier hat man allerdings keine assoziativen Feldnamen. Aber immer noch ein Array mit dynamischer Länge. (via schafix)

http://snippets.sim4000.de/show/34/

Eine echt tolle Sache, wie ich finde. ;)

Seite 1 von 4

Tag Cloud

28c3   3D   ASCII   Akismet   Allgemein   Animation   Apache   Arbeit   Arch Linux   Archos 5   Asterix & Obelix   Audio   Auto   BOINC   Bash   Bitlbee   Blog v2.0   Bluetooth   Bodenwerder   Bouncer (BNC)   Bundestagswahl 09   Bücher   CCC   Chromium   Comics   Computerspiele   Content Managment System   Creative Commons   CyanogenMod   Cybton   DAU Alarm   DLRG   Datenbanken   Datenschutz   Debian   Deutsches Rotes Kreuz   Domains   EZFlash Vi   Eclipse   Eingabegeräte   Ekelhaft   Email   Essen   Ethernet   Evernote   Facebook   Fanartikel   Feiertage   Fernsehn   Firefox   Flash   Flattr   Fotografie   Fritz!Box   Fun   Fußball   GEZ   GPS   Gameboy Advance   Games   Gnome   Google   Google Android   Google Android Hacking   Google+   Grafiken   Grand Theft Auto IV   HTC   HTC Desire Z   HTML   Handhelds   Handy   Handy Apps   Hardware   Homebrew   ICQ   IRC   ImapFilter   Internet   Internet Explorer   Internet Relay Chat (IRC)   Internetzensur   Java   JavaScript   JeeGeek   Justiz   Kino   Konzert   Kultur   Kumpels   Legend of Zelda   Linux   MS SQL Server   Marilyn Manson   Microsoft .NET   Minecraft   Mobile   Mozilla   Music Player Daemon (MPD)   Musik   MySQL   NPD   Natur   Netbeans   Netbooks   Netzwerk   Nintendo   Nintendo DS   Nintendo DSi   Nintendo Wii   Notebook   OpenOffice   OpenOffice Impress   OpenWRT   PC Hardware   PHP   Pandora   Papierkorb   Patentrecht   Pidgin   Piratenpartei   Piwik   Politik   Privat   Programmieren   Projekte   PulseAudio   QR-Code   RSS   Rammstein   Root   SOGo Scalable OpenGroupware   SSH   SVN   Schlüsselband   Schule   Seagate Freeagent Dockstar   Server   Serversicherheit   Sesamstraße   Shellscripting   Shopping   Shortlinker   Skype   Social Networks   Software   Spam   Spenden   Spongebob   Straßenverkehr   Support   TV   Technik   Textverarbeitung   Thunderbird   Truecrypt   Twitter   Typo3   UMTS   USA   USB   Ubuntu   Underground Shopping   Urheberrecht   Urlaub   VMWare   VNC   Vereine   Verkaufen   Verstärker   Videorecorder   Viren und andere Schädlinge   Virtual Box   Vorratsdatenspeicherung   WLAN   Wahlen   Webspace   Wehrdienst   Weserbergland   Willkommen   Windows   Windows 7   X11   XFCE   XML   XStylus   Zeitschriften   Zensur   bind9   ffmpeg   netcup   openSSL   r0ket   sim4000.de   vim   Überwachung   Überwachungsstaat   üäx.de   1337