Insane C# Development

Montag, Mai 25, 2009

Most valueable C# extension methods


A dump of my most valueable extension methods in C#:

public static bool IsNullOrEmptyTrimmed(this string value)
{
return (value == null || value.Trim().Length == 0);
}


// if( param.IsEither( “KTB”, “KTC”, “CTC”)) { … }
// <T> instead of just sticking to IComparable[] for type safety!

public static bool IsEither<T>(this T value, params T[] possibleValues) where T : IComparable
{
for (int i = 0; i < possibleValues.Length; i++)
{
if (value.CompareTo(possibleValues[i]) == 0)
{
return true;
}
}

return false;
}

// if( val.IsNeither( param1, param2, param3)) { … }
// <T> instead of just sticking to IComparable[] for type safety!

public static bool IsNeither<T>(this T value, params T[] possibleValues) where T : IComparable
{
return !IsEither(value, possibleValues);
}

// dataField = userString.GetAtMost( 30);
public static string GetAtMost(this string value, uint countCharacters)
{
return value.GetAtMost(0, countCharacters);
}


// dataField = userString.GetAtMost( 10, 30);
public static string GetAtMost(this string value, uint startIndex, uint countCharacters)
{
if (string.IsNullOrEmpty(value))
{
return string.Empty;
}
else
{
return value.Substring((int)startIndex,
Math.Min((int)countCharacters, value.Length - (int)startIndex));
}
}

// uint val = userString.SafeConvert( 0u);
public static uint SafeConvert(this string value, uint defaultValue)
{
uint outVal;
if (uint.TryParse(value, out outVal))
{
return outVal;
}
else
{
return defaultValue;
}
}


// int val = userString.SafeConvert( -1);
public static int SafeConvert(this string value, int defaultValue)
{
int outVal;
if (int.TryParse(value, out outVal))
{
return outVal;
}
else
{
return defaultValue;
}
}


// handy if you have to interface with non-generics code
// (LINQ won’t help you here!)

public static T[] ToArray<T>(this System.Collections.ICollection collection)
{
T[] retVal = new T[collection.Count];
collection.CopyTo(retVal, 0);
return retVal;
}

Labels:

Freitag, November 14, 2008

SQL: Select default row if no row matches

Heute stand ein Bekannter von mir vor einem relativ simplen, aber eigentlich auch gemeinen Problem. Gegeben sei folgende Tabelle:

FORM QUAL FARBE GROESSEVON GROESSEBIS Preis
3 334 0 36 47 39.99
3 334 0 48 50 49.99
3 334 370 48 50 49.99
3 334 370 36 47 39.99
3 334 714 48 50 55
3 334 714 36 47 45
3 334 736 48 50 55
3 334 736 36 47 45

Es handelt sich um Schuhe. Form & Qual ist sozusagen die Artikelnummer. Wenn für einen Artikel in einer bestimmten Farbe kein Preis hinterlegt ist, muss der Preis der "Defaultfarbe" (0) genommen werden. Die Größen spielen dabei keine Rolle, es müssen nämlich alle Rows zurückgeliefert werden.

Also für FORM/QUAL 3/334 und Farbe 736 wollen wir:

FORM QUAL FARBE GROESSEVON GROESSEBIS Preis
3 334 736 48 50 55
3 334 736 36 47 45

und für Form/Qual 3/334 in Farbe "80":

FORM QUAL FARBE GROESSEVON GROESSEBIS Preis
3 334 0 36 47 39.99
3 334 0 48 50 49.99

Soweit klar? Dann schreibt mal ein einzelnes SELECT Statement dafür! Wenn man auf der Leitung steht kann man relativ lange darüber nachdenken ;-)

Der erste Ansatz (wir vereinfachen Spaltennamen und ignorieren "Form"):

SELECT TOP 1 * FROM Preise WHERE ARTNR = 334 AND Farbe IN (0, 736) ORDER BY FARBE DESC

Leider falsch, denn so bekommt man nur 1 Resultset, also nur ein Größenrange. TOP 2, 3, 4 ist nicht möglich da man nicht weiß wieviele Ranges es gibt, und Filterung auf Applikationsebene ist aus verschiedenen Gründen auch nicht möglich!

Nach einigem Probieren, und einiger Zeit in der wir uns vorkamen als wären wir die dümmsten Idioten auf der Welt, fanden wir Lösung A:

SELECT *
FROM Preise WHERE ArtNr = 334 AND Farbe = 736
UNION
SELECT *
FROM Preise
WHERE Farbe = 0 AND NOT EXISTS ( SELECT * FROM Preise WHERE ArtNr = 334 and FARBE = 736)

Was uns die Resultate entweder aus dem ersten Teil der UNION oder aus dem zweiten Teil bringt, aber drei SELECTS verursacht. Zugegeben, auf einer guten DB mit richtig gesetzten INDICES (hier auf ArtNr+Farbe) wäre das kein Problem, aber richtig schön ist das auch nicht.

Wir haben es aber zunächst dabei belassen, bis uns eine zweite Lösung einfiel, die sehr einfach ist, und sowohl ohne temporäre Variablen als auch ohne temporäre Tabellen auskommt. Hier also Lösung B:

SELECT * FROM Preise WHERE ARTNR = 334 AND Farbe = ( SELECT MAX(FARBE) FROM Preise WHERE ArtNR = 334 AND FARBE IN (0, 736));

Eleganter, einfacher zu verstehen, und auch um einiges ressourcenschonender. Auch hier gilt: Sauber gesetzte Indices beschleunigen auch diese Abfrage. :)

Sicherlich, wenn man die Datenbank mit Stored-Procedures abfrägt, oder das Statement sonst aufbohren kann, kann man sich vielleicht noch einen Seek sparen, vielleicht noch ein bißchen Performance rausholen, aber der Aufwand lohnt sich nicht, da das Statement auf diese Weise recht klein und fein ist.

Labels:

Freitag, Juni 06, 2008

VMWare and 3D accelleration

Da ich zur Zeit grad in Urlaub bin wollte ich einem Freund Monkey Island 4 zeigen, was leider daran scheiterte dass dieses Spiel unter WindowsXP-64 nicht mehr läuft.

Also "schnell" eine Windows-XP 32bit Maschine mit VirtualPC aufgesetzt - und wieder gescheitert. MI4 benötigt nämlich tatsächlich DirectX-7 oder OpenGL Support.

Mit WindowsME in einer VMWare (!) und OpenGL (MI4 Startmenü=>Einstellungen=>Performance) geht es, allerdings recht häßlich was der spärlichen OpenGL Unterstützung zuzuschreiben ist.

Nach LANGEM rumprobieren habe ich es nun geschafft DirectX vollständig in VMWare unterstützt zu bekommen.

(1) .vmx Datei in Notepad öffnen und folgende Zeilen hinzufügen:

mks.enable3d = "TRUE"
svga.vramSize = "XXXX"
vmmouse.present = "FALSE"
monitor.virtual_exec = "hardware"

XXXX durch die exakte Größe des Host-Graphikkartenspeichers in Byte ersetzen, sonst geht es nicht!

(2) Edit->Preferences->Input->Disable Grab/Ungrab

Nun XP installieren, ZUERST VMWare Tools installieren, danach XP Aktivieren, dann alle Updates einspielen. Dann microsoft.com/directx ansteuern und DirectX 9.0c + Updates runterladen (jepp, auch alle "SDK Updates").

Nun mit dxdiag überprüfen ob alles geklappt hat (Diagnose=>3D Test).

et voila!

Problem: Im Gegensatz zu VirtualPC unterstützt VMWare Hardware-Virtualisierung nicht wirklich wenn der Host 64bittig und der Gast 32bittig ist! :-(  Aber für MonkeyIsland 4 war dies zu verkraften!

Dienstag, Juni 03, 2008

Sony Ericsson W890i - Neat and feat

Juhu! Mein W890i ist angekommen. Leicht, schlank und natürlich nach 5 Minuten Bedienung abgestürzt.

Zum Glück hat SE bereits ein Online-Update über USB zum DL angeboten, ansonsten wär ich jetzt sauer.

Labels:

Montag, April 28, 2008

Proposed additions to HTML input type=file button

Was mich immer wieder bei HTML Upload Formularen stört ist der Umstand dass die Browser beim öffnen des "Durchsuchen..." Dialogs standardmäßig "*.*" als Dateifilter einstellen. Ist man nun auf einer Bilder-Galerie-Seite, so muss man sich dennoch durch alle möglichen Dateien durchwurschteln, um dann zu erfahren dass "PNG leider nicht unterstützt" wird.

Vorschlag #1: Ein Tag "filter". Entweder mit MIME-Types, und das OS mappt diese zu gültigen Dateiendungen, oder mit konkreten Filefiltern, im "Microsoft Format":

<input type="file" fileFilter="Bilder|*.jpg,*.png,*.tiff|Dokumente|*.doc, *.docx"/>

<input type="file" allowedMimeTypes="image/jpg,image/png,image/tiff; application/msword" />

Vorschlag #2: Der ursprüngliche RFC-Draft sah ein "compressable" Attribut vor. Dadurch konnten Browser entscheiden ob das zu übertragene File komprimiert übertragen werden soll oder nicht. Leider wurde das fallengelassen da Zitat: "Viele Modems den Datenstrom ohnehin komprimieren", was für 56k Modems sicher gilt, bei DSL jedoch Unfug ist. Vorschlag: Einführung dieses Flags!

Wer macht mit und schreibt ein FireFox Plugin? :)

Labels:

Montag, Februar 25, 2008

Installing Vista on nForce SATA Raid

Mein Gott... Nach ewigem rumprobieren habe ich diesen englischen Artikel (klicky) gefunden, mit dem ich in der Lage war mein Bockiges Vista64 auf einem SATA Raid-0 mit dem nForce4 Chipsatz zu installieren. Folgendes hat mir geholfen:

  1. Im BIOS Raid auch für alle IDE Geräte aktivieren. Regel unter VISTA Setup: Entweder alles SATA oder gar nichts SATA. Ich habe also Raid für meine IDE-CDROMS aktiviert, wodurch diese als SATA Geräte "erkannt" wurden.
  2. RAID konfigurieren, Platten die nicht im Raid drin sind separat als JBOD konfigurieren ("Spanning").
  3. WHQL Treiber von nVidia besorgen. Entweder über Link im Artikel, oder von der nVidia Seite indem man die nForce Treiber-EXE von nVidia entpackt und dann die Verzeichnisse IDE\SATARAID und IDE\SATA_IDE auf einen USB Stick kopiert
  4. VISTA Setup starten (ohne USB Stick!!)
  5. Im Festplatten-Dialog zuerst alle Treiber aus IDE\SATARAID und wenn nötig danach alle Treiber aus IDE\SATA_IDE laden. Wichtig ist hier wirklich alle Treiber mit CTRL+Click zu markieren. Wird nur ein einzelner markiert, oder einer vergessen, dann funktioniert es nicht!

Kleiner Tipp: STRG+F10 öffnet ein Command-Window

Dienstag, Februar 05, 2008

Decoding punch cards in .NET

[UPDATE: Ich habe doch noch weitergearbeitet und die Verzerrungen des Scans entfernt, der Text ist jetzt vollständig abrufbar]

Wie mehrere Leute in ihren Blogs berichten (Blog1, Blog2, Blog3, Blog4) erhalten viele Leute zur Zeit Lochkarten in Holzboxen zugeschickt. Dazu eine auf Schreibmaschine gedruckte Anweisung die "anderen Leute" zu finden um die Karten zu decodieren.

Ich habe zwar keine dieser Karten erhalten, aber einer der Blogger war so freundlich uns allen einen Scan zur Verfügung zu stellen:

lochkarte

Ein kurzes Googeln ergab folgende Seite Doug Jones's punched card codes. Da ich natürlich nicht manuell die Karten dekodieren wollte, schrieb ich in .NET ein kleines Programm.

Schritt 1: PSP7 nehmen, Bild nach Grayscale, Histogramm Anpassungen, und Contour Trace. Danach die nicht benötigten Stellen ausschneiden

lochkarte

Schritt 2: Nach 8bit Indexed Bitmap konvertieren und einige Farben zur Palette hinzufügen

Schritt 3: Im .NET Programm das Raster ermitteln:

grid

Wie man sieht stimmt das ermittelte Raster ab der 30sten Spalte nicht mehr 100%ig, deswegen decodieren wir im ersten Schritt auch nur die ersten 30 Buchstaben.

Schritt 4: Programm die Bounding Boxen nach markierungen scannen lassen:

bounds

Man sieht hier auch schon zwei Scanfehler, in den hinteren Reihen wurden zwei Boxen falsch erkannt. Dies könnte ich noch korrigieren, ist aber nicht notwendig wie man gleich sieht. [UPDATE: Ich habe doch noch weitergearbeitet und die Verzerrungen des Scans entfernt, der Text ist jetzt vollständig abrufbar]

Schritt 5: Boxen in ushort Array überführen, die ersten beiden Zeilen sind Bits 12 und 11, die restlichen 0-9

Schritt 6: Die Textbeschreibung von Doug's Seite textuell parsen und ebenso in ushort Array überführen, dabei eine Character-Map aufbauen

Schritt 7: Ausgabe: UHGVFWKHQNJLADSWHHKHHETHUILGHQIWGYNAWIMJBAXZCNLKIOPXLEMVGLPBLNRMXJ

Wie man sieht ergibt dies rein GAR NIX. Ein manueller Decodierversuch der ersten 4 Buchstaben kam leider zu exakt denselben Ergebnis, also hat das Program keinen Fehler gemacht.

Einer der Blogger berichtete von einer ähnlichen Zeichenkette (er hatte jedoch eine leicht andere Karte).

Was wohl das Geheimnis hinter diesen Karten ist? Eventuell muss man nur die gemeinsamen Löcher betrachten? Tja... virales Marketing eben.

Wer will kann mir ja seine Karte scannen und schicken, ich lese sie dann auch im Programm ein!

Labels:

Mittwoch, Januar 16, 2008

How to remove a DVD-RAM disc from the cartridge

Für alle die sich immer schon gefragt haben wie man eine DVD-RAM Disc aus der Cartridge bekommt folgt hier eine kleine Anleitung. Krux sind die beiden Haltepins, die müssen entfernt werden. Die Haltepins können nicht ersetzt werden, sind aber in der Regel auch nicht notwendig. Wenn man einen DVD-Ram Brenner ohne Cartridge-Load-Mechanismus hat sind sie ohnehin sinnlos.

Schritt 1: Auf Seite A drehen und die beiden Haltepins lokalisieren (Seite A ist bei Dual-Layer beschriftet und bei Single-Layer die Seite mit dem Logo)

Dsc00554

Schritt 2: Fest auf den Haltepin drücken der nach vorne raussteht, der Pin muss rausbrechen.

Dsc00555

Schritt 3: Umdrehen und das selbe mit dem anderen Pin erledigen

Dsc00556

Schritt 4: Releasemechanismus betätigen

Dsc00557

Schritt 5: DVD-RAM vorsichtig rausnehmen

Dsc00558

Die DVD kann danach wieder in der Cartridge sicher aufbewahrt werden.

Montag, Januar 14, 2008

Prio-Neer

Gestern hatte ich ein seltsames Erlebnis. Das nagelneue L632D Multi-Super-Duper-Mega DVD-Brenner Laufwerk in meinem D820 Laptop konnte selbst mit der neuesten Firmware eine Leih-DVD nicht abspielen. Es handelte sich dabei um "Das Bourne Ultimatum", seineszeichen eine Dual-Layer-DVD-Video-Rom. Normalerweise habe ich keine Probleme damit DualLayer DVDs auszuleiehen und am Laptop anzusehen (zusammen mit Asiatischem Essen), aber gestern wäre ich fast wieder zur Videothek getandelt um die DVD zurückzugeben. Nachdem ich dann nach 2 Stunden rumprobieren, neustarten, Firmware suchen, etc. am Ende war, habe ich "scherzhafterweise" die DVD in meinen PC eingelegt. Dort ist ein 10 Jahre altes Pioneer 16x Slot-in DVD Laufwerk verbaut - und siehe da, obwohl das LW sonst keine Dual-Layer-DVDs liest, der Film lies sich tadellos abspielen!!!

Gegen Ende hin musste ich CyberLink DVD allerdings neustarten, konnte den Film danach aber zu Ende sehen. Es hat mich erstaunt, denn zum Produktionsdatum des DVD Laufwerks gab es noch gar keine Dual-Layer DVDs !! Es handelt sich hier übrigens um das Pioneer DVD-A05S, das erste 16x DVD Laufwerk auf dem Markt, damals 1997, und dann auch noch Slot-In! :) Ich habe damals 3000 Schilling dafür bezahlt, was etwa 220 Euro entspricht, und habe den Kauf nie bereut.

Vielleicht wird es aber langsam mal an der Zeit meinen CD-RW Brenner gegen einen Super-Multi Brenner auszutauschen, dann kann ich auch ohne Angst zu haben Dual-Layer-DVDs lesen. Ich denke ich warte aber noch bis die Blu-Ray Brenner billiger werden, der günstigste ist zZ für 399 Euro bei K&M zu haben (klicky).

Labels:

Freitag, November 23, 2007

Why I hate VBA

VBA

Wer auch immer Funktionen mit [Arg1], [Arg2], [Arg3], [Arg4], [Arg5], [Arg6], [Arg7], [Arg8], [Arg9], ..., [Arg30] definiert hat gehört wirklich verprügelt. Wenn man diese API nun mit C# aufrufen würde, man würde folgendes schreiben müssen:

object oAddress = "nikole123@bla.com";
object oMissing;
oMissing = Type.Missing;
Dialog(xyz).Show(ref oAddress, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);

Labels: ,

Mittwoch, November 21, 2007

Phase Oriented Programming

Heute bin ich über Jon Skeets Blog gestolpert und auf eine Interessante Idee zu "Phase-Oriented-Programming" gestoßen.

http://msmvps.com/blogs/jon.skeet/archive/2007/02/28/wacky-ideas-3-object-life-cycle-support.aspx

Es geht im Prinzip darum die Initialisierung-, Verwendungs- und Dekompositionsphasen eines Objektes festzulegen und Methodenaufrufe nur in denjenigen Phasen zuzulassen für die diese designed wurden.

So entfallen dauernde Überprüfungen ob das Objekt bereits initialisiert ist, dies wird automatisch durch ein AOP-Framework durchgeführt. So spart man sich viel Code und viele potentielle Fehler in Situationen in denen ein Objekt beispielsweise nicht benutzt werden darf bevor Connect() aufgerufen wurde, oder nicht mehr nach Dispose() verwendet werden darf.

Ihr werde dies mal ein wenig weiterverfolgen und mit PostSharp implementieren. Scheint ein interessanter Aspekt zu sein, könnte Super-Statefull-Klassen in Zukunft einfacher zu entwickeln machen.

Hier der interessante Codeausschnitt aus seinem Blog: Es geht darum eine Klasse zu designen in welcher "normale" public Methoden nur in "Phase 2" ohne Exception aufrufbar sind, und in welcher eine bestimmte Methode eine Transition von Phase 1 nach 2 triggert:

[Phased(defaultRequirement=2, initial=1)]
class Sample
{
IAuthenticator authenticator;

public IAuthenticator Authenticator
{
[Phase(1)]
[Phase(2)]
get
{
return authenticator;
}
[Phase(1)]
set
{
authenticator = value;
}
}

[Phase(1)]
[PhaseTransition(2)]
public void ValidateAndInitialize()
{
if (authenticator==null)
{
throw new InvalidConfigurationException("I need an authenticator");
}
}

public void DoSomething()
{
// Use authenticator, assuming it's valid
}

public void DoSomethingElse()
{
// Use authenticator, assuming it's valid
}
}

Dienstag, Juli 17, 2007

PDF417 on Lufthansa eTix

 Heute bin ich von FRA nach KLU geflogen, zu meinen Eltern - ein Mordsspass - und wunderte mich über das in den letzten 4 Monaten installierte PDF417 System auf dem FRAport. Was heißt wundern, ich freute mich dass die häßlichen IATA Tickets aus den 70er Jahren (!!) endlich durch moderne Varianten ersetzt, bzw. aufgepeppt wurden. Diese haben zwar noch den selben Formfaktor, haben aber mittlerweile zusätzlich zum nun nicht mehr notwendigen Magnetstreifen einen PDF417 Barcode aufgedruckt:

_Dsc00157

(Nachname und Barcode-EQU zensiert)

Da ich ja notorisch neugierig bin habe ich sofort meine K800i Cam gezückt, Bild gemacht, meine ATALA Barcode Library hervorgekramt (brauchte ich für meine Geburtstagsparty - Bericht folgt), und den Barcode dechiffriert. Im Prinzip steht da nichts anderes drauf als auf dem Ticket und dem Magnetstreifen auch:

M1NACHNAME/STEFAN MR  EX2K3TU FRAKLUOS 0290 198M3C  012  3010

Das Boarding geht aber um LÄNGEN schneller da der Barcode nur kurz gescannt werden muss und der Bordkartenabschnitt von der Stewardess manuell entfernt werden kann. Wer schon mal geflogen ist weiß dass das alte System der Magnetstreifen fürchterlich ineffizient war und auf einem Flug mit 200 Leuten bei mindestens 5 die Karte hängen blieb. Grauslich!

Für Inhaber eines etix(tm) Tickets mit PDF417 Code gibt es sogar einen eigenen Quick-Boarding Zugang!

Fazit: Darauf hat die Welt gewartet, endlich wird der IATA Müll mal ein bißchen reformiert. Natürlich war klar dass der BARCODE wieder mal mit ASCII und fixed-space Feldern arbeitet, wär ja ansonsten zu modern ;-). Tipp für 2012: Gerade PDF417, aber auch sonst alle 2D Barcodes, unterstützen BINARY, UTF-8 und Field/Group-Seperatoren.

Montag, Juli 02, 2007

Java3D

Da das K800i einen 3D-Graphikchip von nVidia eingebaut hat (ja, kein Scherz! Java3D Chip!!) hat o2 bei allen neueren K800i Ausgaben "3D Games" beigelegt. Das Ding hat eine bessere Graphikleistung als mein Desktop-Rechner daheim!! Gott was für geile Spiele!

Donnerstag, Juni 28, 2007

We're In the Money, Come on, my honey!

DSC00001 

Unser neuer Farb-A0-Plotter/Drucker von HP. Wir haben's ja! ;-) Der stand früher im GF-Raum, aber da einer von der GF "Umstrukturierungsmaßnahmen" zum Opfer gefallen ist steht er jetzt öffentlich verfügbar. Natürlich mit Netzwerkanschluß und Pie-Pa-Poh.

Amüsant ist natürlich: Egal wie groß die Dinger sind, alle Drucker von HP kann man vorne an der Klappe aufmachen, wodurch der Druckkopf in die Mitte fährt :)

Wofür wir den brauchen? Mal von Vollfarb-Kapitalismus-Pro-Parolen abgesehen drucken wir damit UML-Diagramme und Prozessmodelle. Kein Wunder dass den im GF-Raum niemand vermisst hat ;-)

Dienstag, Juni 26, 2007

+/-/R/RW/RAM/Foo/Bar

Mein Bruder benötigt einen neuen DVD-Brenner. Es hat mich erschrocken wie billig diese Dinger heutzutage sind. Ein Ding das alles mit 32x beschreibt und eine S-ATA Schnittstelle hat kostet in der Tat nur 45-50 Euro! Da kann man fast schon blind das nächst beste kaufen!

Erinnert mich an mein 16-fach Slot-In DVD-Laufwerk von Pioneer. Damals Ende der 90er für 3000 Schilling gekauft, und ist immer noch schneller als so manch anderes möchtegern 16-fach heute auf dem Markt. Es dauerte natürlich noch einige Zeit bis ich wirklich DVD Medien dafür hatte, über ein Jahr lang begnügte es sich mit CDs und den mitgelieferten DVD-Spielen "Baldur's Gate" und "X-Files" :) Beide habe ich übrigens aufgrund von Software-Bugs nie durchspielen können! :-(

Und was soll ich sagen, im Gegensatz zu den Prophezeiungen eines Freundes hat es niemals eine CD zerkratzt oder sonst wie gemuckt, es läuft perfekt, auch nach 8 Jahren Betriebsdauer!

Samstag, Juni 16, 2007

The moment of truth

Bin ich eigentlich der einzige der jedes Mal ein Kreuz macht bevor er massive Änderungen das erste Mal komplett durchkompiliert, mit allen abhängigen Projekten?

Netstumbler and Windows VISTA

Da ich bei mir zu Hause einige Probleme mit der WLAN Performance hatte wollte ich mal überprüfen auf welchen Kanälen meine Nachbarn so senden, denn leider unterstützt meine Fritz.Box! weder Channel Listing noch Auto-Channeling.

Mein erster Versuch scheiterte kläglich, denn Windows VISTA zeigt standardmäßig nicht die Kanäle der gefundenen Netzwerke an, und Netstumbler funktioniert leider nicht unter VISTA (deswegen konnte ich auch nach 2 Jahren immer noch keine Netstumbler Karte für Freiburg anfertigen - für Köln und Mannheim existieren die schon).

Aber, halleluja, wie auf Windowsconnected.com (klicky) gefunden gibt es "Poor man's netstumbler" unter Windows VISTA, und zwar einfach mit meinem Lieblingstool "netsh.exe":

netsh wlan show networks mode=bssid

=> et voilá.

Das Ergebnis ist übrigens dass die meisten meiner Nachbarn auf Kanal 6 rumdümpeln, nur ich bin auf 1, und ein anderer Schlaufuchs auf 13.

Montag, Juni 11, 2007

BlueFS & Speculator

Unter http://notrump.eecs.umich.edu/group/group.html erfährt man neues zum BlueFS und zu Speculator, einer Erweiterung für Linux die Prozessausführungen dahingehend optimiert indem sie das Ergebnis von Dateisystem-Operationen vorhersagt anstatt auf das echte Resultat zu warten. Im Prinzip funktioniert das so dass ein Copy-On-Write Snapshot des Prozess angefertigt wird, die Operation angetriggert wird, und der Prozess basierend auf den Vorhersagen weiterläuft. Sollte die Vorhersage nicht eintreffen wird der Prozess wieder zurückgespult.

Um keine Inkonsistenzen zu verursachen blockiert man den Prozess dann doch bei Netzwerk I/O oder Bildschirmausgaben, es wäre sonst sehr verwirrend für den Benutzer ;-)

Vorteile bringt diese Technik hauptsächlich bei Netzwerk-Dateisystemen, denn die Latenz über das Netzwerk um viele viele Größenordnungen höher als alles was sich in der CPU abspielt.

Ob man so eine Technologie auch in unseren Produkten einführen könnte? :)

Mittwoch, Mai 30, 2007

WinXP freezing

Wer schon mal das Problem hatte dass er seit Wochen keine Windows XP Updates bekommt, svchost.exe auf 99% hochschnellt und immer noch keinen IE6 vom Update verplättet bekommen hat, der sollte mal auf heise.de folgenden Artikel (klicky) ansehen.

Er beschreibt die Probleme von WindowsXP Update, und erklärt auch wie man sie lösen kann. Ist mir schon auf vier (!!) Windows XP Rechnern passiert. Daheim, in der Firma (der wird eigentlich über SuS gewartet), bei einem Kumpel und bei meinem Bruder.

Im Kurzen:

  1. "Automatisches Update" und "Intelligenter Hintergrund-Übertragungsdienst" über Systemsteuerung -> Verwaltung -> Dienste beenden, eventuell zuerst problematische svchost.exe über Taskmanager abschießen (wenn sie mal wieder auf 99% rödelt).
  2. C:\Windows\SoftwareDistribution löschen (%WINDIR%\SoftwareDistribution)
  3. Windows Installer 3.0 Update installieren (klicky)
  4. WindowsXP Update Hotfix installieren (klicky)
  5. Neustarten

 

Danach funktioniert wieder alles prima, und man sollte gleich über http://windowsupdate.microsoft.com ein Update ziehen. Am Besten auch gleich auf "Microsoft Update" wechseln (kleiner Link in der Mitte der oberen Navigationsleiste), dann hält man nämlich nicht nur Windows sondern automatisch auch Office, etc. up-to-date. Bei mir waren es so gleich 16 Updates.

Danach kann man ohne schlechtes Gewissen die Updateeinstellungen in der Systemsteuerung auf "Automatisch" oder zumindest auf "Benachrichtigen" setzen.

PIC alive

Ich hab meinen PIC nicht zerschossen, es stellte sich heraus dass sich einfach nur ein Kabel leicht gelockert hatte und ich dadurch falsche Ergebnisse bekam. Wer viel misst misst viel Mist ;-).

CMOS ist trotzdem böse... BÖSE!

Mein PIC Parport Programmer funktioniert tadellos, das Testprogramm wird korrekt gebrannt, zurückgelesen und funktioniert in der Testschaltung. Das Configuration Word bekomme ich zwar programmiert aber nicht mehr korrekt ausgelesen - weiß der Geier warum - interessiert mich jetzt um 01:20 aber auch nicht weiter.

Jetzt kann ich weiter, meinen USB Brenner über den Parport brennen, und dann schlussendlich Projekte Alpha-1 bis Beta-7 durchführen.. MUAHAHAHAHAHA!

Dienstag, Mai 29, 2007

Shit on MOS

Scheiß Unipolartechnik! Ich habe am Wochenende 2 MOSFETs und einen PIC zerschossen weil ich sie berührt habe und einige Zeit offen schwingen lassen habe. Diese Drecksdinger fliegen einem aber auch wegen JEDEM Scheiß um die Ohren. *grml*

Dienstag, Mai 22, 2007

PNP-NPN!

Glaubt ihr bipolare Transistoren nehmen eher Neuroleptika oder eher Antidepressiva ein?

Dienstag, März 27, 2007

New PIC project

Paul hat mir einen Floh ins Ohr gesetzt, und nun habe ich mit ihm ein neues privates Hardwareprojekt, welches hoffentlich auch mal in eine kleine Serie gehen wird. Leider habe ich ihm versprochen nicht zuviel zu verraten, aber hier sind die Komponenten um die ich mich kümmern muss:

x) Berührungssensor (am besten kapazitiv gekoppelt und mit wenig Leistungsaufnahme)
x) Microcontroller
x) 7-Segment LCD Anzeige (2 Ziffern)
x) LCD Controller
X) PCB-Board

Für den Prototypen habe ich mich umgesehen und spontan den PIC16F913 von Microchip gefunden. Er hat einen integrierten LCD Treiber der auch im Sleep Modus arbeitet (LCD Controller fällt weg) ist dank "nanoWatt Technologie" (bla!) sehr leistungssparsam, hat einen integrierten Oszillator (+/- 1% Deviation bei 8 Mhz), und scheint auch in Serie sehr günstig zu sein.

Eine Firma die LCDs nach eigenen Matrizzen fertigt habe ich auch gefunden, einige Leute die PCBs nach eigenen Layouts ätzen auch, und die eine oder andere Berührungssensorschaltung bekomme ich auch noch hin.

Allerdings fehlt dem ganzen noch der letzte Schliff, ich fühle mich so als ob ich nur Kompromisse eingegangen bin. Zum Beispiel hat der PIC zuviel Zeug drauf welches ich nicht brauche! Ich brauche weder CAPCOM, noch 3 Timer, noch PWM, noch USART noch SSI, etc. Was das wieder kostet!!!

Auch bei den LCDs kommt es mir so vor als würde das billiger gehen!

Zumindest wenn ich die kleine Serie fertigen lassen will muss ich mich um Kostenreduktion kümmern, also einen µC finden mit weniger nicht benötigten Komponenten darauf, eine Firma die kostengünstig PCBs herstellt (oder selbst ein Labor bauen ;-)), jemanden der das Zusammenlötet, etc.

Wegen GS, CE und TÜV Labels will ich gar nicht erst nachdenken ... *seufz*. Wenigstens sind wir RoHS "kompatibel" :-)

Sollte hier jemand einen Tipp für einen µC oder CPLD haben, oder sich mit den anderen Dingen auskennen: Her damit! :)

Freitag, Februar 23, 2007

Catch 22

Uh fies, gerade eben bei "Wer wird Millionär" kam folgende Frage: "Wofür steht M & P bei MP3?". Es handelte sich um die 500.000 Euro Frage. Der Kandidat nahm den 50:50 Joker, es blieb übrig: "Music & Portable" und "Moving & Picture".

Eine fiese Falle, denn in der Tat hat das MP hier nichts mit Musik zu tun, MP3 wurde als Audio-Codec für das MPEG1 Videoformat entwickelt, und heißt vollständig "Moving Picture Experts Group v1 - Audio Layer 3".

Der Kandidat hat zum Glück nicht gezockt und ist mit 125.000 heim gegangen.

Dienstag, Dezember 05, 2006

Unix and Word 2007



Ja, wie man an den grünen Kringeln sehen kann ist es kein Rechtschreib, NEIN!, es ist ein grammatikalischer Fehler UNIX "normal" zu schreiben! Zumindest für Word 2007 :-)

Dienstag, November 21, 2006

VISTA & Word 2007 Final Impressions

Netter Save As... Dialog von VISTA, nettes Interface von Word 2007. (Bilder öffnen sich als größere Versionen bei click!)






Google Translato Phun

Mir war in der Mittagspause etwas langweilig, also hatte ich ein bißchen Spass mit Google Translator:

I am a lesbian!
Je suis une lesbienne !
Ich bin eine Lesbe!
Sono una lesbica!
Eu sou um lesbian!
¡Soy una lesbiana!
انا مثلية!

Das es ein arabisches Wort für Lesbe gibt und Google Translator das kennt ist ja schräg! :-)

Montag, November 20, 2006

OpenMP 2.0

Ich bin heute durch Zufall über OpenMP 2.0 gestolpert. Ich muss mal an einem Wochenende auf meiner 2 Kern Maschine ein bißchen damit rumspielen! Es erlaubt in C++ direkt mit #pragmas Codestellen in mehreren Threads auszuführen, ohne dabei mit den OS APIs hantieren zu müssen. Der Compiler übernimmt dann das Spawnen der Threads, das erzeugen von TLVs, das syncen von Speicher, das Joinen, etc.

Mehr unter in der Microsoft Hilfe (klicky, installierte MSDN erforderlich), oder in eurem bevorzugtem Bücherladen.

Samstag, November 18, 2006

Arrrrrcor!

Kleine Information für bestehende ARCOR Kunden: Ab 6.12. gelten neue Tarife, DSL 2000 ist z.B. 10 Euro billiger. Die Umstellung erfolgt nicht automatisch, muss also entweder telefonisch über die ARCOR Hotline 01810/70010 (von 06:00 bis 22:00 Uhr -- 24 Cent/Min. aus dem deutschen Festnetz) oder kostenlos online über Arcor.de gemacht werden. Eigentlich eine Frechheit. Ich werde mir aber überlegen auf DSL 6000 umzusteigen, die hat nämlich 640 kbit/sec Uploadbandbreite, und kommt zum selben Preis daher wie meine aktuelle DSL 2000 Flatrate. Aber Achtung: wer diesen Schritt geht geht eine 24 monatige Verpflichtung ein! Wie mir gerade ein Sales-Typ gesagt hat startet dann nämlich der Vertrag neu!

Es ist irgendwie amüsant. 1997 war ich On-The-Cutting-Edge mit meinem Kabelmodem von UPC Österreich. Flatrate, 300 kbit/sec Download, always on, kein Einwählen, feste IP (die kenn ich noch immer auswendig; genauso wie die des UPC DNS Servers). Das Kabelmodem war so groß wie ein Siemens Bürotelefon mit riesigen Kühlriffeln drauf :-). Ich habe nur über alle anderen, besonders die Deutschen, gelacht, die immer noch mit Piepsern einwählten und die Telefonleitung blockierten. Das Ganze war sogar bezahlbar, 50 Euro pro Monat wenn man schon einen Kabelanschluss hatte (wer hat den nicht?), und in Klagenfurt, Graz, oder Wien wohnte.

So kam ich auch zu Linux, denn SuSE Linux 6.3 konnte man zum ersten Mal damals richtig komfortabel über das Netzwerk installieren. Und da das Internet für mich nichts weiter als ein großes Netzwerk war (keine Einwahl bei Kabelmodems, die agieren ja nur als Bridge!), startete ich einfach die Installation und legte mich schlafen, oder ging ins Kino, sah ein bißchen fern, ... nach einigen Stunden war es unten. Upload war 128 kbit/sec, also konnte ich über ICQ prima Dateien an zwei meiner 56kbit Kumpel schicken, und trotzdem nett weitersurfen, während deren Leitungen absolut blockiert waren :-)

Und heute? 190 Kabelbetreiber agieren in Österreich, um auch noch das kleinste Kaff (außer Villach, amüsanterweise) mit Kabel und Internet zu versorgen, in Deutschland blüht DSL 16000 und sogar DSL2+ mit 24000, Städteweise auch Q-DSL mit 6Mbit Upload,  was früher Linux-CDs waren, sind heute Linux-DVDs, und selbst die sind in 35 Minuten runtergeladen und mit 16fach Brennern in 3 Minuten gebrannt. Und selbst Microsoft bringt mit Windows Vista bringt vorinstalliertes IPv6 und QoS Scheduling mit (verhindert das wie in WinXP ein großer Upload die Downloads bremst).

640 kbit/sec Upload, das bedeutet das virtuelle Ende des Upload Bottlenecks! Es wird erstmals für mich keine Relevanz mehr haben ob ich eine Datei selbst runterlade, oder sie mir ein Kumpel sendet, denn umgerechnete 80 kByte/sec sind arg schnell, wenn man keine ISOs austauscht, und selbst ein CD Image wär in 2.2 Stunden übertargen. "Mal schnell das MP3 des coolen DJs den man kennt übermitteln" wird wirklich "mal schnell" sein, und Videokonferenzen sind mit entsprechendem Codec in VGA Auflösung möglich (nicht das ich sowas bräuchte).

Fazit: Der Umstieg auf 6000 bei gleichen Kosten würde sich schon lohnen, die 24 Monate Bindung ist allerdings sogar eher ein Kündigungsgrund, und ein Anreiz mir einen anderen Anbieter (eventuel mit VoIP) zu suchen.

Donnerstag, November 16, 2006

The finals are here!

Ich halte sie in meinen Händen, die Final von Microsoft Office 2007 Professional, und morgen folgt die Final von Windows Vista! Ahh! Als MSDN Subscription Inhaber hat man ein süßes Leben :-)

Benötigt werden die Versionen dringend. Nicht weil ich finde das Vista installierenswärt wäre, sondern weil wir dringend die Final Version mit unseren Produkten gegentesten müssen. Zwar wird zwar schon seit den ersten Betas getestet, Microsoft hatte aber immer die unangenehme Angewohnheit plötzlich irgendwelche Dinge zu ändern, womit wir dann nachziehen mussten.

Zum Glück kommen Endanwender frühestens 2007 an Vista dran!

HSUPA

Während ich mit meinem K800i immer noch auf lahmes Normalo-UMTS angewiesen bin, ist man in Österreich, wie immer, schon wieder einen Schritt vorraus (klicky). Mit HSUPA und HSDPA hat man mobil eine Downlink Bandbreite von 3.6 Mbit/sec, und eine Uplink Bandbreite von 1.4 MBit/sec. So wäre es natürlich möglich nicht nur das tägliche Bild in meinem PictureBlog (klicky) mobil zu veröffentlichen, sondern eben auch MobiVideos! Während sich die Blog Now! Funktion meines K800i zwar toll für Industriespionage eignet, würde man mit "VideoBlog Now!" wunderbar zum Mobilen Pornoproduzenten :-) Und das ohne 30 Minuten wegen der geringen Upload Bandbreite warten zu müssen... :-)

Dienstag, November 14, 2006

Ms. Dewey

Wer schon immer mal von Janina Gavankar (klicky) beim Suchen von englischen Begriffen im Internet beleidigt oder schräg angemacht werden wollte, der sollte von Google auf Ms. Dewey (klicky) wechseln. Einfach genial! :-)

Ich empfehle folgende Suchworte einzugeben: "Slut", "You are boring", "You are hot", "Britney Spears", "Janina Gavankar", "So you think you can dance?", "Sleepless" :-)

Die Ergebnisse werden übrigens von der Microsofts "Windows Live!" Suche geliefert.

Montag, November 13, 2006

Fire, fox!

Wer schon immer von einer Seite massiv Trailer, Clips oder Videos kopieren wollte, diese sich aber hinter irgendwelchen eingebetteten Objekten auf den Seiten versteckt haben, der wird das FireFox Plugin Videodownloader (klicky) toll finden. Damit lassen sich die Videos von News Portalen, MySpace, YouTube, Google Video, und vielen anderen Seiten runterladen und offline geniesen!!!

Besonders interessant ist dies nicht für den Video-Klau, sondern weil gerade YouTube oftmals Aussetzer hat. Je nach Seite sind die heruntergeladenen Videos entweder im AVI, MPG, MP4 oder (wie bei YouTube) im FLV Format. Wer keinen FLV Player (klicky) installiert hat, kann sich die Videos aber auf alle Fälle mit dem VLC Player (klicky) ansehen. Der spielt so ziemlich alles auf allen Plattformen. Als Alternative kann man sich auch einen FLV Konverter runterladen, z.B. ebenfalls von der FLV Seite, oder über Google zu suchen.

Übrigens ist FireFox 2.0 seit einiger Zeit drausen! Jeah. Wer's noch nicht hat soll's sich schnell holen! Ich finde den eingebauten Phishing Filter recht praktisch, dass hierfür aber jede besuchte URL an die Server von Mozilla geschickt und zur Überprüfung verarbeitet wird finde ich genauso problematisch wie die Anti-Phishing Funktion des Internet Explorer 7, dort sind es aber die Server von Microsoft, und denen vertraue ich noch weniger! :-)

Montag, Oktober 23, 2006

BluTuuf

Ahh, meine neue Bluetooth Maus, V270 von Logitech! Funk, langlebige Batterien (Wird von mir mit NiMH Akkus bestückt), klein und schmal, und dank Bluetooth auch ohne externen Empfänger am Laptop zu verwenden. Dadurch stylisch und Akkuschonend :-)

Die 800dpi Auflösung sind natürlich auch ganz nett ;-)

OBEX for C#

Nachdem meine Bemühungen OpenOBEX unter VisualStudio.NET 2005 zum compilieren zu bewegen gescheitert sind bin ich nun auf der Suche nach einer OBEX Implementierung für .NET. Auf CodeProject.com habe ich zwar zwei Libraries gefunden, diese sind aber entweder sehr "kindlich" geschrieben, oder funktionieren nicht mit meinem K800i.

Vielleicht stürze ich mich wieder auf OpenOBEX, und versuche das veraltete C (welches wohl nur der GCC frisst) durch modernes C++ zu ersetzen. Nich das der VS.NET Compiler im C++ Emu-modus das C9x von OpenOBEX fressen würde, aber wer Funktionsdeklarationen ohne Typen schreibt und ausliefert gehört meiner Meinung nach standesrechtlich erschossen. *grml*