Laden...

Forenbeiträge von cadi Ingesamt 308 Beiträge

15.03.2006 - 11:31 Uhr

Hi Svenson,

prinzipiell bin ich auch der Meinung, das KI (noch?) der völlig falsche Ausdruck für alles, was mit NLP zu tun hat ist.

Meistens handelt es sich im Statistik und Regeln.

Was Rechner sobald wohl kaum hinbekommen werden ist die eigentliche Intelligenzleistung im zusammenhang mit Sprache: Aus Fakten durch Wissen Assoziationen ableiten.

Bei dem was wir machen haben wir verschiedene Ansätze und Ziele.
Zum großen Teil geht es darum Texte (E-mails) zu klassifizieren.

Also entscheiden ob es eine Beschwerde oder Liefernachfrage etc. ist.
Das klappt ziemlich gut. Auch mit reiner Statistik schon.
Wenn man aber linguistische verfahren unterstützend hinzuzieht, dann werden die Ergebnisse nochmal deutlich besser. Wenn man weiss, was die Verbgruppe und was das Objekt ist, dann kann man schon viel besser klassifizieren.

Bei unbekannten Themen oder föllig abwegigen formulierungen versagt das System dann aber schon. Es hat halt nicht die Intelligenz aus dem Bekannten das Unbekannten einzuordnen.

Aber durch die zunehmende Rechenpower kann man dem Ziel immer näher kommen.

Alleine der POS-Tagger währe noch vor 5 Jahren so elend langsam gewesen, das er nur für Wissenschaftler interessant gewesen wäre, aber nicht für ernsthafte anwendungen.

Wenn man nun die linguistischen und grammatikalischen informationen noch um Ontologien (z.B. Hypernyme) anreichert kann man noch einen Schritt weiter kommen.

Aber bis man einem Computer beibringt Ironie zu erkenne (geschweige denn zu verstehen) dürften noch Jahre in's Land ziehen....

15.03.2006 - 09:50 Uhr

hi svenson,

wir versuchen es nun seit kanpp zwei jahren und aben immerhin einen funktionieren Pos-Tagger und lexical-Parser/chunker für Deutsch am start 😉

Und das ganze in c# und nicht perl, java, lisp oder prolog...

Und der nächste Schritt, information zu wissen zu machen ist auch schon geplant...

14.03.2006 - 21:37 Uhr

Hallo Progger,

hättest du ValueTypes (und nicht Objekte) dann wäre deine Aussage korrekt.
Bei Objekten wird (kann geändert werden...) nicht das Objekt geändert (also die properties) sondern gleich die Referenz auf ein völlig neues Objekt gesetzt.

Die Properties eines als Parameter übergebenen Objektes kann man aber auch ohne ref jederzeit in ändern.

14.03.2006 - 16:54 Uhr

Hallo sbrain,

dann würde ich es so machen:

RegKey currentKey =  UsersKey.OpenSubKey(Untereinträge[i], true); 
Schlüsselsammeln(currentKey); 
IrgendeineFunktion(currentKey); // hier die 2. funktion die den selben key benutzen soll 
14.03.2006 - 15:49 Uhr

Hallo sbrain,

Mir ist nicht ganz klar, was da nun per ref übergeben werden soll?

OpenSubKey liefert doch ein RegistryKey Objekt zurück.
Das Ergebnis wird keiner Variablen zugewiesen, die durch den Aufruf von Schlüsselsammeln ihren Wert verändern könnte.
Warum ein REF ?

Wieso nicht einfach ohne REF den Key übergeben und sammeln?

13.03.2006 - 13:19 Uhr

Hallo Kostas,

ADS ist eigentlich recht einfach von c# aus zu benutzen.
Ich habe leider keine Beispiele in C# da, ich habe sowas nur in c++ machen dürfen...

Dieser Artikel könnte dir evtl. helfen: LDAP, IIS and WinNT Directory Services

13.03.2006 - 13:13 Uhr

Da stimme ich dir zu. Die CeBit ist meiner Meinung nach auch ziemlich kommerziell, was den eigentlichen Grund, nämlich Neuheiten zu präsentieren und nicht Kunden locken, in die Ecke schiebt.

Wer sagt denn, das es nicht (für die Austeller) in erster Linie um Kunden geht?

Für mich war die CeBit immer der Ort, wo man die meisten Termine mit vielen Firmen in kurzer Zeit haben kann.

Man darf auch nicht vergessen, das die CeBit eigentlich keine Consumer Messe ist. Das zeigt sich schon darin, das man zu Hochzeit der CeBit die Consumer Produkte in die CeBit Home ausgelagert hat. (Die hat sich aber durch das Platzen der DotCom-Blase nicht wirklich halten können.)

Auf der CeBit werden ja nicht nur neue Handys, Flatscreens und Soundkarten vorgestellt.
Da werden vor allem Lösungen und Produkte für Unternehmen präsentiert.

Ein Oracle, Microsoft Dynamics, SAP, Siebel, IBM eServices, RedDot etc. richtet sich halt nicht an schlendernde Hobby IT-ler.

13.03.2006 - 12:15 Uhr

Hallo Kostas,

mir war nicht klar, das du die Daten bereits in einer Firebird Datenbank hast.

Einen eigenen LDAP Server zu schreiben halte ich für extrem ambitioniert.
Das L steht zwar wür "Leightweight", das ist aber nur relativ zu x.400 zu sehen. Und das ist eines der aufgeblähtesten Protokolle, die ich kenne.

Ich denke du würdest auch keine SQL-Datenbank schreiben wollen?

Ich fürchte, der Weg die Daten in einen existierenden LDAP Server zu duplizieren ist kaum zu umgehen.

Wenn die Firebird Datenbank nur für die CTI Anlage brauchst solltest du überlegen das LDAP zum führenden System zu machen und die Firebird Datenbank zu verwerfen.

13.03.2006 - 11:40 Uhr

Hallo Kostas,

das einfachste wäre wenn du das Active Directory der Windows Server Varianten benutzen kannst. Wenn du da mit den gegeben Feldern auskommst kannst du sogar auf eine Schemaerweiterung verzichten (was beim Domänen mit mehreren Servern meistens keinen Spass macht und auch an den meisten Administratoren scheitert...).

Ansonsten musst du dir einen (freien?) LDAP Server suchen.
Der alte von Netscape (war?) mal frei zu bekommen.
Ansonsten ist der von CA extrem flexibel und Peformant.
Auch IBM hat einen guten LDAP Server.

Aber LDAP ist nicht ganz trivial. Je nach Server darf man das Schema ohne jegliche GUI mit Textdateien beschreiben. Das bedarf einiger Einarbeitung...

13.03.2006 - 11:35 Uhr

Hallo cmpxchg,

hast du das Problem auch, wenn du einen Release Build ohne Debugger laufen lässt (STRG+F5 im VS).

Die Ausführung von Programmen unter dem VS-Debugger kann dramatisch langsamer sein, als ohne.

Vorallem wenn man mit vielen Breakpoints, meheren Threads und Abfangen aller geworfenen Exceptions debuged.

Ich hatte da schon Code der auf 5% der Release-Geschwindigkeit lief (sehr nervig beim debuggen).

02.03.2006 - 19:26 Uhr

Wenn du wirklich einen Gina-Ersatz programmieren willst, solltest du auf c++ (nicht managed!) ausweichen.
Es gibt etliche GINA-Stubs, von denen aus man eigenen GINAs entwickeln kann (ich glaube beim Platform SDK war ein stub dabei, der alle funktionen 1:1 an Winlogon mit dem default Verhalten durchreicht).

Sowas in C# und .NET würde ich nicht versuchen....

02.03.2006 - 10:55 Uhr

Hallo LordK,

STRG+ALT+ENTF kann man nicht (alst Tastendruck) im User-Mode simmulieren, da diese Tastenkombination von Kernel abgefangen wird (sonst könnte man die ja recht einfach über eienen Windows-Hook lahmlegen).

Diese Tastenkombination ist eine sogenante SAS (Secure Attention Sequence) und wird normalerweise von der MSGina32.dll abgearbeitet.

Ich kenne nur eine Win32-API-Funktion die in diese Richtung (aber leider zu weit) geht.
LockWorkStation()

This function has the same result as pressing Ctrl+Alt+Del and clicking Lock Workstation.

Das clicking Lock workstation wolltest du ja eigentlich nicht mehr haben, oder?
(Diese Funktion ist auch nur ab XP/win2k verfügbar!)

Alternativ fällt mir sonst nur eine Custom GINA ein, damit währe das auf jeden Fall zu lösen. Das ist aber meisten nicht praktiabel, da die meisten Kunden/User sowas nicht wollen.

01.03.2006 - 13:06 Uhr

Hallo egrath,

die Entscheidung hängt eigentlich immer davon ab, was man genau machen will und was die Gegebenheiten sind.

Das hänglt letztlich davon ab, was do an Daten austauschen wills, ob es Synchron oder Asynchron sein muss. Wenn du z.B. transaktionale Kontrolle brauchst bietet sich MessageQueing an. In den meisten Fällen ist das aber overdone.

Manchmal machen auch NamedPipes, ClipBoard, SharedMemory, Window-Messages etc. Sinn.

Wenn es sehr schnell und asynchron sein soll bieten sich Dinge wie SharedMemory etc an.

Wenn du nur eine Notification schicken willst bieten sich Named Events an.

Was willst Du denn machen?

28.02.2006 - 17:13 Uhr

Ich würde ToBinary anstatt Ticks benutzen, da dort auch DateTime.Kind mit encoded wird.

byte[] bArr = BitConverter.GetBytes(date.ToBinary()); 
DateTime date = DateTime.FromBinary(BitConverter.ToInt64(bArr, 0)); 
24.02.2006 - 18:59 Uhr

Ich kenne das Problem.
Ich habe einen einfachen Workaround gefunden.
Einfach in die Projekt-Properties des projektes gehen, das nicht geschrieben werden kann, da dan im Build-Tab das Output-Verzeichnis von bin\debug\ in bin\debug2 (oder umgekehrt) umbenennen.
Dann läuft es zumindest während dieser VisualStudio session ohne Probleme.

Schein ein VisualStuido bug zu sein, der aber erst ab einer gewissen komplexität auftritt. Meine größte Hoffnung war, das in 2005 der bug endlich raus sein würde... was eine entäuschung. Und meine Support-Anfragen bei Microsoft sind alle abgeschmettert worden. Ich müsste ein kostenpflitiges ticket öffen! Das bei einem BUG! Dankeschön!

24.02.2006 - 10:12 Uhr

@Eisbär
Sowas habe ich auch mal erlebt, da war ich mit einer kleinen Butze als partner auf dem Microsoft Stand. Gab dann halt auch so ein schönes Schildchen mit Microsoft (und klein drunter Partner, das hat man aber wohl gerne überlesen) und dem eigenen Namen drauf.

Auf einmal wurden einem an jedem Stand alle Fragen beantwortet und es wurde dann auch genre mal der Geschäftsführer für ein Gespräch gerufen.

Der Nachteil war, das man sich ständig von Windows Usern anhören musste, was für ein sch... system Windows doch sei. Weil ja der super 7-Nadel Matrix Drucker, der doch seit 10 Jahren so gute Dienste geleistet hatte, einfach keine Treiberunterstützung von Microsft mehr erfahre.... (alternativ auch ein singlespeed CD laufwerk von einer NO-Name Firma aus Fernost etc....) Die waren kaum abzuschütteln. Auch der Verweis, man sei nur Partner und habe mit Windows eigentlich nix am hut half da nix, die wollten einfach mal Microsoft anmotzen.
Da hatte ich das erste mal echtes mitleid mit Microsoft 😉

24.02.2006 - 09:06 Uhr

Ich weiss noch nicht ob ich da sein werde. Wahrscheinlich schon, da es die beste Möglichkeit ist alte Kontakte zu pflegen und sich mit vielen Leuten zu treffen.

Ein Tipp noch für alle, die vorhaben als Besucher auf die Messe zu gehen und an Ständen gerne ernst genommen werden würden.
Aus meiner eigenen Erfahrung als Austeller kann ich nur sagen, das es nix schlimmeres gibt als Hobby IT'ler und Beutelratten (Habt's mal ein paar Kugelschreiber oder CD's?). An denen verdienst du nix und die nerven unheimlich.
Wenn Ihr euch ernsthaf mit Austellern unterhalten wollt solltet ihr unbedingt im Anzug kommen. Das macht einen riesen Unterschied in der Wahrnehmung bei Ausstellern aus.

23.02.2006 - 12:23 Uhr

Was willst du genau wissen?
Als Austeller oder Gast?

22.02.2006 - 12:54 Uhr

Hallo bini,

ich selber habe eine zeitlang komplett als Freiberufler gearbeitet.
Hatte Vorteile, aber auch ein paar entschiedende Nachteile.

Mein grösstes Problem war immer die Zahlungsmoral der Firmen. Und ich rede da jetzt nicht von irgendwelchen kleinen Mittelständlenrn oder Einzelpersonen, sondern leider von großen Konzernen. Die lassen sich gerne mal drei oder mehr Monate Zeit bis sie Zahlen (gerade die großen schreiben sowas sogar in die Verträge und das ist selten verhandelbar.)

Man verdient auf dem Papier ziemlich gut (sogar wenn man an rente etc. denkt) aber der cash-flow ist katastrophal wenn man kein vernünftiges Startkapital hat!
Drei Monate Arbeit, dann kommt die Abnahne: alles super. Dann die Rechnung und keine Reaktion mehr... drei Monate später das Geld, d.h. man braucht also Reserven um 6 Monate überbrücken zu können.

Und Mahnungen sind leider auch selten eine gute idee. Ausser man will auf keinen Fall mehr mit diesem Kunden zusammen arbeiten. Man mag es kaum glauben, aber die sind beleidigt, wenn man sie darauf hinweist, das man ja noch geld bekommt!

Dann kann es einem durchaus ja auch mal passieren, das kein passender Auftrag reinkommt. Da sind schon wieder Reserven gefragt.

Letztlich will ich damit sagen, das man als selbständiger gut leben kann, wenn man genug Reserven hat um sich den Einstieg leisten zu können.

Ich habe meine Selbständigkeit zu einer Nebentätigkeit gemacht, da dir als Selbständiger leider kaum eine Bank vernünftige Kredite geben will (weder für deine Selbständigkeit noch für private dinge wie Haus oder Auto).

Spass hat's aber auf jeden Fall gemacht.

Aber jetzt habe ich es besser:
Home-Office mit der Erlaubnis zum nebenher Freiarbeiten.

04.02.2006 - 12:02 Uhr

Hallo Venlox,

wenn ich das richtig verstanden habe, hast du einen Hintergrundtask und willst im Vordergrund auf eine Statusänderung von dem Hintergrundtask warten?

Versuch das doch mal mit einem AutoResetEvent.
Wenn der Hintergrundtask ein public AutoResetEvent (z.B. EvtNewEventAvail) hat, dann kannst du im Vordergrund auf das setzen dieses Events warten.
Dieses warten kostetn 0 Resourcen.

Beispiel:
Hintergrundthread:


public class BackgroundWorker
{
  public AutoResetEvent EvtNewEventAvail= new AutoResetEvent(false);

  public void Runer()
  {
      while(!aborted)
      { 
        DoSomeComplexStuff();
        // set done 
        this.EvtNewEventAvail.Set();
      }
  }
..... 
}

Vordergrund:


...
BackgroundWorker worker = new BackgroundWorker();
worker.Start();

while(worker.EvtNewEventAvail.WaitOne())
{
   System.Console.Out.WriteLine("Got some event from worker..."):
}

Das jetzt ziemlich simplifiziert, sollte aber das Prinzip zeigen.

31.01.2006 - 15:08 Uhr

Hi,

nur mal was grundsätzliches zu beweglichen Feiertagen.

Die hängen alle von Ostern ab. Und Ostern kann man berechen. Das legt nicht der Staat fest (hat eher mal die Kirche gemacht).

Die definition von Ostersonntag:
Der erste Sonntag nach dem ersten Frühlingsvollmond.
Und die Mondphasen lassen sich auch berechnen.

Genaueres hier: wiki - Osterdatum

Wer nicht rechnen mag: Tabelle der bewewglichen Feiertage

Was man allerdings braucht ist eine liste der Feiertage, die für eine region gelten. egal ob beweglich oder fix.

31.01.2006 - 12:37 Uhr

hi afrokalypse,

ich deute den Fehler 0x2 mal als Windows Error Code. Dann bedeuted der "Datei nicht gefunden"
(um Windows Error Codes in eine Meldung umzuwandeln einfach in der Console NET HELPMSG <errno>" eingeben.)

Handelt es sich um einen DebugBuild? Benutzt du managed C++ oder irgendwelche Assemblies die im GC sind und die du nicht kopiert hast?

Schau dir mal deine Applikation auf dem Rechner auf dem sie nicht läuft mit "depends.exe" und dem Reflector an.

19.01.2006 - 08:08 Uhr

Er... Sorry... zuviel ge-copied...
das ist schon ||... aber nur:


bool bAlpha = ((img.Flags || ImageFlags.HasAlpha) ==img.Flags)

bAlpha ist dann wahr, wenn imgFlags mit gesetztem ImageFlags.HasAlpha bit gleich dem aktuellen Wert von img.Flags ist.

d.h. mann testet ob imgFlags das HasAlpha bit gesetzt hat oder nicht.
Darum ging es doch, oder?

18.01.2006 - 21:16 Uhr

Recht simpel geht es auch so:


bool bAlpha = ((img.Flags || ImageFlags.HasAlpha) ==img.Flags)== ImageFlags.HasAlpha; 

03.01.2006 - 19:15 Uhr

Hallo RAMses,

egrath hat recht, das man mit einem Gina32.dll-replacement an den anmeldibildschirm kommt. allerdings nicht den von XP!
Wenn man auf XP einen Gin32.dll hooked hat man wieder den altbekannten NT/W2K STRG+ALT+ENTF Dialog...

Wenn dich das nicht stört, dann ist eine Gina genau das richtige.

Zum XP-Login Screen habe ich, als ich was ähnliches brauchte, keine vernünftige doku finden können. Ich kann mich nur noch erinnern das dieser per HTML on COM realisiert war.

01.01.2006 - 20:18 Uhr

Hallo DerHulk,

eitenlich geht das nicht.
Aber Sony hat uns gezeigt, wie es geht 😉
Installier den XCP-"Kopier Schutz" von Sony und nenne dein Programm sys$irgendwas.exe 😉

Im Ernst... Windows sieht soetwas nicht vor. Ein User-Prozess ist nie hidden.
Da müsstest du schon das System ziemlich verbiegen.

Wenn du gut in c und win32 programmierung sein soltest, mach es wie Sony und schreibe dein eigenes RootKit (Mark's Blog / Sony RootKit)

01.01.2006 - 20:07 Uhr

Hallo MjReaper,

copy&paste fehler:
for (int j=0;i<7;i++)
solte aber
for (int j=0;j<7;j++)
heissen...

30.12.2005 - 22:44 Uhr

Hallo acid,

du startest erst den thread und erzeugst dann erst das WaitForm handle mit WaitForm.ShowDialog();
Das WaitForm muss existieren, bevor du den thread startest.

der unterschied zwischen Debug und StandAlone scheint zu sein, das dein thread etwas verzögert startet (warum im detail auch immer) und somit das fenster dann schon erzeugt wurde.

23.12.2005 - 14:47 Uhr

Dein wchar_t ist ja noch MultiByte und nicht Unicode!

Dann versuch doch mal (in deiner DLL)
MultiByteToWideChar(CP_UTF8, 0, source, sourceLen, dest,destBufferSize)

und gib dest zurück.

23.12.2005 - 12:42 Uhr

er... Hex? oder als zip in den anhang?

23.12.2005 - 12:32 Uhr

Hallo Eisbär,

ich würde an deiner stelle als erstes schauen, welche klassen du benutzt, die IDisposable implementieren.
Dann checken ob du die auch immer sauber frei gibts.

Wenn du noch das 1.1er Framework benutzt solltest du mal schauen, ob unter 2.0 das Problem immer noch da ist.
Ich hatte extreme probleme mit der GarbageCollection von 1.0 (große objecte kommen direkt in Generation 2 und werden erst sehr spät freigegeben. wenn man viele große Objekte erzeugt wächst die WorkingSetSize von dem .NET prozess extrem an. Ich habe drei Tage gebraucht, um da ein Workaround zu finden, der funktioniert (mit win32 Api aufrufen etc...)
Unter 2.0 ist der Speicherhunger meiner Anwendung radikal gesunken.
Die GC scheint da mit großen objekten viel besser umgehen zu können!
(unter 1.1 habe ich die 1.2GB maximum mem für .NET geknackt, unter 2.0 komme ich nicht über 300MB!)

23.12.2005 - 12:18 Uhr

Hallo Joerg,

was kommt denn bei c# im Stringbuilder an?
hast du dir mal die bytes angeschaut?
Wenn der buffer die richtigen bytes nur im falschen Encoding enthält kann man es ja konvertieren.

22.12.2005 - 16:36 Uhr

Hallo Joerg,

Eigenartig, dass die DLL einen wchar_t zurückgibt.
Das NEMA Protokoll doch ASCII ist.

Spiel doch mal mit dem CharSet = CharSet.Auto rum.

22.12.2005 - 12:44 Uhr

Hallo Mr. C#,

meiner Meinung nach sollte es für dich, da du ja etwas c++ Erfahrung hast, kein Problem sein in die Syntax von C# einzusteigen.
Dafür lohnt ein Buch selten. Die MSDN-Hilfe sollte da schnell den Eins

Viel wichtiger als die Syntax ist allerdings das .NET Framework mit all seinen Klassen.
Wenn man da keinen Überblick hat beginnt man schnell vorhandene Dinge (meist schlechter) selber zu basteln.

Da lohnt sich ein Buch sicherlich. Ich habe mich, als ich vor der selben Frage stand, für O'Reily's C# in a Nutschell entschiden.

Gut Einführung in die besonderheiten von .NET und c# und eine schöne Referenz des Frameworks.

Das meiste habe ich aber dann doch aus der Hilfe und dem Internet erfahren 😉

22.12.2005 - 11:26 Uhr

Hallo Dexter,

was heisst versenden?
Per e-Mail, per HTTP, per SOAP oder direct per TCP/UDP (oder gar per Post)?
Die Blockgrößen richten sich da nach dem Protokol und nach der Leitung (LAN, WAN).
Ausserdem kommt dann noch die Frage des Protokoll overheads. Muss für jeden Block ein neuer, eventuell großer, Header gesendet werden?

21.12.2005 - 21:10 Uhr

moin atmosfear,

ich würde es relativ simpel umsetzen.
Zwei ListViews (DetailsView).

  1. ListView füllen mit den Alben (als tag das Album Object)
    Wenn das was ausgewählt wird, 2. ListView mit den Covers füllen.
21.12.2005 - 20:51 Uhr

Hallo BernhardS,

Application.Run startet eien neuen MessageLoop für das Form.
Erst wenn das Formular geschlossen wurde werden die Zeilen nach Application.Run abgearbeitet.
Du solltest die zuweisung textBox.Text in den Constructor der Login-Forms packen.

18.12.2005 - 14:47 Uhr

Hallo sswtw,

das ist nur ein Ausschnitt. Läuft so nicht, aber zeigt, was man machen kann...

Die Byte[] arrays kann man leicht einen Stream mit Write schreiben bzw. mit Read lesen.

Mit dieser lösung bekomme ich die 700.000 Worte in 50MB gepackt!
das sind ca. 70byte pro Eintrag (mit dem BinaryFormatter komme ich schon auf mehr für den Header!)

Bei Fragen... Frag! 😉


namespace ObjectDB
{
   public interface ICustomSerializer
   {
        byte[] Serialize(object value);
        object Deserialize(byte[] bytes);
   }
}


using System;
using System.Collections.Generic;
using System.Text;
using ObjectDB;
using System.ComponentModel;
using System.IO;

namespace Test.Grammar
{


    [Serializable]
    [CustomSerializer(typeof(LexemSerializer))]
    public class Lexem
    {
        [ObjectDB.Indexed(true)]
        internal int m_LexemId;


        [ObjectDB.Indexed(false)]
        [ObjectDB.StringIndexDescrptior(29, typeof(System.Text.Hubasco.wordsEncoder), false, BinaryCompare = true)]
        internal string m_Word;

        [ObjectDB.Indexed(false)]
        [ObjectDB.StringIndexDescrptior(28, typeof(System.Text.Hubasco.stemsEncoder), false, BinaryCompare=true)]
        internal string m_Stem;


        internal int m_LemmaId = -1;

        internal WordType m_WordType;
        internal LexemType m_LexemType;
        internal Komparationstyp m_Komparationstyp;

        internal Deklination[] m_Deklinationen;
        internal Konjugation[] m_Konjugationen;
        internal Kasus[] m_ValenzenNP;
        internal Kasus[] m_ValenzenPP;
        

        public int LexemId
        {
            get { return this.m_LexemId; }
            set { this.m_LexemId = value; }
        }

        public string Word
        {
            get { return this.m_Word; }
            set { this.m_Word = value; }
        }

        public string Stem
        {
            get { return this.m_Stem; }
            set { this.m_Stem = value; }
        }


        public static Lexem LexemFactory(LexemType type)
        {
            switch (type)
            {
                case LexemType.Adjektiv:
                    return new Adjektiv();
                case LexemType.AdjektivPartizipPerfekt:
                    return new AdjektivPartizipPerfekt();
                case LexemType.AdjektivPartizipPerfektZu:
                    return new AdjektivPartizipPerfektZu();
                case LexemType.AdjektivPartizipPraesens:
                    return new AdjektivPartizipPraesens();
                case LexemType.Adverb:
                    return new Adverb();
                case LexemType.AdverbKausal:
                    return new AdverbKausal();
                case LexemType.AdverbLokal:
                    return new AdverbLokal();
                case LexemType.AdverbModal:
                    return new AdverbModal();
                case LexemType.AdverbTemporal:
                    return new AdverbTemporal();
// zu viele für das forum ;)                ....
                case LexemType.Verb:
                    return new Verb();
                case LexemType.VerbAux:
                    return new VerbAux();
                case LexemType.VerbModal:
                    return new VerbModal();
                case LexemType.VerbVoll:
                    return new VerbVoll();
                case LexemType.Wortform:
                    return new Wortform();
                default:
                    return new Lexem();
            }
        }


    }

    public class LexemSerializer : ICustomSerializer
    {
        private static Encoding wordEnc = new System.Text.Hubasco.wordsEncoder();
        private static Encoding stemEnc = new System.Text.Hubasco.stemsEncoder();

        [Flags]
        [TypeConverter(typeof(EnumConverter))]
        private enum UsedFeatures : byte   {None=0, Deklinationen = 1, Konjugationen = 2, ValenzenPP = 4, ValenzenNP = 8, Lemma = 16, KomparationsType = 32};
        #region ICustomSerializer Members

        public byte[] Serialize(object value)
        {
            Lexem lexem = value as Lexem;
            if (lexem == null)
                throw new ArgumentException("value is not of type Lexem");

            UsedFeatures features = UsedFeatures.None;
            if ((lexem.m_Konjugationen != null) && (lexem.m_Konjugationen.Length > 0))
                features |= UsedFeatures.Konjugationen;
            if ((lexem.m_Deklinationen != null) && (lexem.m_Deklinationen.Length > 0))
                features |= UsedFeatures.Deklinationen;

            if ((lexem.m_ValenzenNP != null) && (lexem.m_ValenzenNP.Length > 0))
                features |= UsedFeatures.ValenzenNP;
            if ((lexem.m_ValenzenPP != null) && (lexem.m_ValenzenPP.Length > 0))
                features |= UsedFeatures.ValenzenPP;
            if (lexem.m_LemmaId != -1)
                features |= UsedFeatures.Lemma;

            if (lexem.m_Komparationstyp != Komparationstyp.Error)
                features |= UsedFeatures.KomparationsType;

            using (MemoryStream result = new MemoryStream())
            {
                result.WriteByte((byte)lexem.m_LexemType);
                result.WriteByte((byte)features);

                ObjectDB.DataStore.StreamHelpers.Write7BitEncodedInt(result, lexem.m_LexemId);
                ObjectDB.DataStore.StreamHelpers.WriteStringWithEncoding(result, lexem.m_Word, wordEnc);
                ObjectDB.DataStore.StreamHelpers.WriteStringWithEncoding(result, lexem.m_Stem, stemEnc);
                result.WriteByte((byte)lexem.m_WordType);

                if ((features & UsedFeatures.KomparationsType) != 0)
                    result.WriteByte((byte)lexem.m_Komparationstyp);

                if ((features & UsedFeatures.Lemma) != 0)
                {
                    ObjectDB.DataStore.StreamHelpers.Write7BitEncodedInt(result, lexem.m_LexemId);
                }

                if ((features & UsedFeatures.Deklinationen) != 0)
                {
                    result.WriteByte((byte)lexem.m_Deklinationen.Length);
                    foreach (Deklination dekl in lexem.m_Deklinationen)
                        result.Write((byte[])dekl, 0, 3);
                }

                if ((features & UsedFeatures.Konjugationen) != 0)
                {
                    result.WriteByte((byte)lexem.m_Konjugationen.Length);
                    foreach (Konjugation konj in lexem.m_Konjugationen)
                        result.Write((byte[])konj, 0, 3);
                }

                if ((features & UsedFeatures.ValenzenPP) != 0)
                {
                    result.WriteByte((byte)lexem.m_ValenzenPP.Length);
                    foreach (Kasus val in lexem.m_ValenzenPP)
                        result.WriteByte((byte)val);
                }

                if ((features & UsedFeatures.ValenzenNP) != 0)
                {
                    result.WriteByte((byte)lexem.m_ValenzenNP.Length);
                    foreach (Kasus val in lexem.m_ValenzenNP)
                        result.WriteByte((byte)val);
                }


                int len = (int)result.Position;
                result.Position = 0;
                byte[] buffer = new byte[len];
                result.Read(buffer, 0, len);

                return buffer;
            }

        }

      

        public object Deserialize(byte[] bytes)
        {

            using (MemoryStream ms = new MemoryStream(bytes))
            {
                LexemType type = (LexemType)ms.ReadByte();

                Lexem result = Lexem.LexemFactory(type);
                result.m_LexemType = type;
                UsedFeatures features = (UsedFeatures)ms.ReadByte();

                result.m_LexemId = ObjectDB.DataStore.StreamHelpers.Read7BitEncodedInt(ms);
                result.m_Word = ObjectDB.DataStore.StreamHelpers.ReadString(ms);
                result.m_Stem = ObjectDB.DataStore.StreamHelpers.ReadString(ms);
                result.m_WordType = (WordType)ms.ReadByte();
                if ((features & UsedFeatures.KomparationsType) != 0)
                    result.m_Komparationstyp = (Komparationstyp)ms.ReadByte();

                if ((features & UsedFeatures.Lemma) != 0)
                {
                    result.m_LexemId = ObjectDB.DataStore.StreamHelpers.Read7BitEncodedInt(ms);
                }


                byte[] buf = new byte[3];
                
                int num;
                if ((features & UsedFeatures.Deklinationen) != 0)
                {
                    num = ms.ReadByte();
                    if (num > 0)
                    {
                        result.m_Deklinationen = new Deklination[num];
                        for (int i = 0; i < num; i++)
                        {
                            ms.Read(buf, 0, 3);
                            result.m_Deklinationen[i] = (Deklination)buf;
                        }
                    }
                }

                if ((features & UsedFeatures.Konjugationen) != 0)
                {
                    num = ms.ReadByte();
                    if (num > 0)
                    {
                        result.m_Konjugationen = new Konjugation[num];
                        for (int i = 0; i < num; i++)
                        {
                            ms.Read(buf, 0, 3);
                            result.m_Konjugationen[i] = (Konjugation)buf;
                        }
                    }
                }


                if ((features & UsedFeatures.ValenzenPP) != 0)
                {
                    num = ms.ReadByte();
                    if (num > 0)
                    {
                        result.m_ValenzenPP = new Kasus[num];
                        for (int i = 0; i < num; i++)
                        {
                            result.m_ValenzenPP[i] = (Kasus)ms.ReadByte();
                        }

                    }
                }

                if ((features & UsedFeatures.ValenzenNP) != 0)
                {
                    num = ms.ReadByte();
                    if (num > 0)
                    {
                        result.m_ValenzenNP= new Kasus[num];
                        for (int i = 0; i < num; i++)
                        {
                            result.m_ValenzenNP[i] = (Kasus)ms.ReadByte();
                        }

                    }
                }

                return result;
            }
        }
        #endregion
    }
}


18.12.2005 - 14:24 Uhr

Hallo sswtw,

speichere die wirklich nur einen Short o.ä. Wert enthällt... werden dan auch wirklich nur 2 Byte in die Datei geschrieben

Nein, es wird mehr geschrieben.
Der Serializer schreibt erstmal den Vollen TypeName des gespeicherten objectes (Namespace.Name, Assembly (Incl. version, key etc..)
Dann kommen die Namen der gespeicherten Felder und dann deren Werte.
Hinzu kommen noch ein paar andere Dinge wie länge des Datensatzes etc...

Das schöne ist, man kann so ziemlich alles serialisieren (z.B. verschachtelte Klassen, Hashtables und Strings jeglicher länge).
Der Nachteil ist halt, das es recht Platzraubend ist.

Ich habe mir für ein Datenbank-Projekt (eine proprietäre Datenbank für das Speichern von Objekten und auslesen über Keys) ein ICustomSerializer Interface geschaffen, das die daten As Kompakt As Possible speichern kann.
In meiner Anwendung geht es um das speichern von 700.000 Wörten der deutschen Sprach mit ihren Flexionen etc. Da macht ein Angepasstes serialisieren schnell mal ein paar zig MB aus.

Bei interess kann ich den Code vom einer ICustomSerializer Implementation posten!?

18.12.2005 - 14:07 Uhr

Hallo sswtw,

Was das strukturierte Speichern angeht würde ich dir einen Blick auf das Serializable Attribut sowie die Interfaces ISerializable und IDeserializationCallback als auch den System.Runtime.Formatters Namespace empfehlen.

Simples Beispiel für's Serialisieren:


using System;
using System.Collections.Generic;
using System.Collections;
using System.IO;
using System.Reflection.Emit;
using System.Runtime.InteropServices;

namespace Test
{

	[Serializable]
	public class UCanSaveMe
	{
		private int m_SomeInt;
		private string m_SomeString;
		[NonSerialized]
		private bool m_NonStoredState;
	}
	
	
	static void Main(string[] args)
	{
		UCanSaveMe testObject = new UCanSaveMe();
		
		// save it
		using (StreamWriter sw = new StreamWriter("testFile.ser"))
		{
			BinaryFormatter bf = new BinaryFormatter();
			bf.Serialize(sw,testObject);
		}
		
		// load it 
		using (StreamReader sr = new StreamWriter("testFile.ser"))
		{
			BinaryFormatter bf = new BinaryFormatter();
			testObject = bf.Serialize(sr) as UCanSaveMe;
		}
	}
}

Das Persitenzmodel von .NET ist zwar extrem flexibel, d.h. alle nötigen TypenInformationen werden mit gespeichert, aber dadurch leider auch etwas aufgeblasen.

Der Unterschied von Class und Struct ist der unterschied zwischen ReferenceType und ValueType.
RefrenceTypes werden immer als Referenz auf das Objekt übergeben (pointer).
ValueTypes immer als Kopie.

16.12.2005 - 13:30 Uhr

Relativ einfach mit:


double value = -123.12;
System.Console.Out.WriteLine("{0}{1}",System.Math.Abs(value), value < 0 ? "-" : "");

15.12.2005 - 22:26 Uhr

Keine ahnug, ob es daran liegt, aber...

Du willst ja pbStatus ansprechen. Warum fragst du dann btnCompile nach InvokeRequired und rufst Invoke für das Form auf?


if (this.pbStatus.InvokeRequired)
{
        PerformProgressBarStepCallback d = new PerformProgressBarStepCallback(PerformProgressBarStep);
        this.pbStatus.Invoke(d, new object[] {  });
}

15.12.2005 - 18:29 Uhr

Hallo Herbivore,

zwar sind zeichen per default Unicode, aber wenn man einen string nur aus Zeichen der CodePage 1252 (standard windows, deutsch) enthält bekommt man mit Encoding.Default.GetBytes(unicodeString) ein Byte-Array in dem jedes Zeichen ein Byte belegt.

Für Verschlüsselungen arbeitet man eh (fast) immer mit Byte- oder Bit-Streams und nicht mit Strings....

Wie man allerdings das problem mit den Primzahlen löst!?

ok, ich würde cheaten! einfach links mit Nullen padden! Steht doch nirgendwo, dass das Most-Significant-Bit das 1024. sein mus, oder?! Die Zahl Null ist als byte acht bit, als Int32 32 bit etc....
d.h.
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 * 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001

1*1 = 1
Gelöst!!!

15.12.2005 - 18:15 Uhr

Hallo deerhunter,

herbivore hat recht.

versuch es so:

....


Console.Write("\\nEingabe eines Such-Buchstabens: ");
string such_BuchstabeEingabe = Console.ReadLine();
if (such_BuchstabeEingabe.Length == 0)
  break;
char Such_Buchstabe = such_BuchstabeEingabe[0];
char[] array = Eingabe_2.ToCharArray();

...

15.12.2005 - 12:57 Uhr

Hallo Snible,

schau dir mal die TimeSpan Structure an....

15.12.2005 - 12:13 Uhr

double.Parse nimmt auch einen IFormatProvider als parameter.
In diesem Fall würde sich System.Globalization.InvariantCulture anbieten.

14.12.2005 - 12:57 Uhr

Hallo Keimax,

nur eine Anmerkung zum GarbageCollector und -NET.
Der kümmert sich nur um sog. gemanagte Objecte.
Bei allen Objekten, die (nicht gemanagte) Systemresourcen benutzen sollte man darauf auchten diese gezielt wieder freizugeben.
(Solche Resource sind Filehandles, Handles auf Events, aber auch GDI Objekte).
Diese Klassen sollten IDisposable implementieren.
Man sollte jedes Objekt, nachdem es nicht mehr gebraucht werden mittels Dispose() wieder freigeben oder einen using Block benuzen.

14.12.2005 - 02:24 Uhr

Das ist nicht das Include-Verzeichnis vom Platform SDK.
Das kann man bei microsoft aber auch (umsonst) downloaden.

13.12.2005 - 22:56 Uhr

Die findest du im Platform SDK in den Header-Dateien.
In diesem Fall in WinUser.h und ScrnSave.h.
(default Pfad C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\Include, wenn man das VisualStuido mit c++ installiert)

11.12.2005 - 20:42 Uhr

Hallo herbivore,

danke für den Tipp mir dem Forumsparser.
So genau lese ich meine Antworten in der Vorschau dann doch nicht korrektur.

Dachte schon meine regex's etc. seien mies....