Laden...

Forenbeiträge von Corpsegrinder Ingesamt 401 Beiträge

23.04.2010 - 13:52 Uhr

Also wie genau es implementiert ist weiss ich natürlich nicht, aber generell ist es folgendermaßen:

Du erstellt ein Delegate mit bestimmten Parametern. Z.B. object und EventArgs um mal ein Beispiel zu nennen. Nun legst du ein Event vom Typen des Delegates an. Wenn ein Event abonniert wird, dann wird quasi nur ein Eintrag zu einer Liste hinzugefügt, was man auch an dem += erkennen kann. Wenn jetzt innerhalb der Klasse ein Aufruf SomeEvent(this, new EventArgs()) getätigt wird passiert prinzipiell folgendes:


void SomeEvent(object sender, EventArgs e) {
  foreach(eventHandler in AnyEvent) {
    eventHandler.call(sender, e);
  }
}

Also ist ein Event eigentlich nur eine Liste und ein Aufruf gibt die Parameter an alle Elemente der Liste weiter.

23.04.2010 - 07:40 Uhr

Wenn es sich nicht nur um eine Formel handelt, kannst du die Berechnungen auch in ein F# Projekt auslagern. Dieses bietet im Vergleich zu C# mehr Möglichkeiten, bzw. dort sind diese einfacher und schneller umzusetzen. Einfach mal probieren.

Alerdings wird ihm das auch nichts bringen, wenn der Fehler aufgrund der Rundung auftritt.

22.04.2010 - 13:49 Uhr

zu 1: Wie du du die Performance erlangst ist deine Sache. Wenn du eine vernünftige Lösung mit Threads erstellt ist das natürlich super.

zu 2: Ja, das soll die Potenz sein

zu 3: pure bedeutet, dass die Methode keine Seiteneffekte hat, somit das eigentliche Objekt nicht verändert. Außerdem darf die Methode nicht auf irgendwelchen Werten basieren, die sich zur Laufzeit de Programms verändern können. Nur so kann sichergestellt werden, dass z.B. bei


int[] args = {1,2,3,4};
Matrix m = new Matrix(2, args);

m*5
m*5
m*5
m*5

immer das gleiche Ergebnis herauskommt. Siehe auch http://en.wikipedia.org/wiki/Pure_function

zu 4: ja, so zum Beispiel

Achso... der Einfachheit halber: Die Matrix ist quadratisch und fehlende Werte sind mit 0 aufzufüllen. z.B. sähe dann eine Matrix der größe 2, die nur den Wert 1 bekommt so aus:

1 0
0 0

Wie in meinem Beispiel schon zu sehen ist der erste Parameter die Größe der Matrix, der zweite ein Array mit den Werten.

22.04.2010 - 08:29 Uhr

Und da du die C++-lib selber geschrieben hast gebe ich dir hier schonmal den Tipp: benutze keine char*, sondern wchar_t*, dann bekommst du auch keine Probleme mit Unicode.

21.04.2010 - 12:58 Uhr

Zur Sicherheit wendet man sich trotzdem an einen Fachwanwalt für Arbeitsrecht. Selbst wenn das Ausb.v. regulär zu Ende gehen sollte, ist dennoch mit Ärger zu rechnen. Z.B. einer Kündigung mit entsprechend schlechtem Arbeitszeugnis im Hintergrund...

Da sollte man aber erstmal abwarten, ob es soweit kommt und es sich nicht schon vorher komplett mit der Firma verscherzen.

20.04.2010 - 19:35 Uhr

Also man kann einen Großteil der Anwendung in C/++ schreiben. Dann hast du schonmal einiges an Arbeit gespart. Außerdem kann man je nach Anwendung auch einiges in die Cloud verlagern. Es gibt viele Möglichkeiten Programme einfach auf mehrere Systeme zu portieren 😉

edit: Achja.. auch MonoTouch würde daran nichts ändern, da man auch da nur auf die Klassen des SDK zugreift. Auch da heißen die Klassen NSWhatever und UIWhatever... also kein Vorteil für das Portieren.

20.04.2010 - 18:00 Uhr

Und der Programmierstil ist insgesamt gar nicht übel. Egal wie gut man etwas macht, es geht fast immer noch ein bisschen besser. 😃

Danke 😉, muss auch sagen, dass ich aus C# voll raus bin, da ich momentan fast nur noch mit Scala oder Objective-C arbeite. Und Concurrency unter C# habe ich auch noch nicht gemacht. Naja.. nun mal zu meiner nächsten Aufgabe:

Es soll eine möglichst performante Matrix-Klasse erstellt werden. Es sollen die normalen Matrix-Operationen (+, -, * und ^) implementiert werden. Wichtig ist, dass die Matrix absolut Threadsafe und alle Methoden pure sind (d.h. egal wie oft man sie aufruft, es kommt immer das gleiche Ergebnis heraus). Achso... eine schicke ToString() ist natürlich auch gerne gesehen 😉

20.04.2010 - 16:58 Uhr

So, hier nun die von herbivore abgesegnete Lösung 😉



using System;
using System.Collections.Generic;
using System.Threading;
using System.Diagnostics;

namespace SyncQueueTest
{

	//*****************************************************************************
	public class SyncQueue <T>
	{
		   //--------------------------------------------------------------------------
		private Queue <T> _q   = new Queue <T> ();
		private volatile int _maxSize;
		public int MaxSize { 
			get { 
				return _maxSize; 
			} 
			set {
				lock(this) {
					if(value < 0) value = 0;
					int oldSize = _maxSize;
					_maxSize = value;
					if(_maxSize > oldSize || _maxSize == 0)
						Monitor.PulseAll(this);
				}
			} 
		}
		
		public SyncQueue (int maxSize)
		{
			MaxSize = maxSize;
		}
	
		//==========================================================================
		// <summary>
		// Trägt einen Eintrag und wartet dabei nötigenfalls
	  // solange bis wieder Platz vorhanden ist.
		// </summary>
		public void Enqueue (T tItem)
		{
			lock (this) {
				while (_q.Count >= MaxSize && MaxSize != 0) {
					Debug.WriteLine (Thread.CurrentThread.Name + " Wait");
					Monitor.Wait (this);
				}
				_q.Enqueue (tItem);
				Monitor.PulseAll(this);
				Debug.WriteLine (Thread.CurrentThread.Name + " Enqueue ==> " + _q.Count);
			}
		}
	
	   //==========================================================================
	   // <summary>
	   //    Holt einen Eintrag aus der Queue heraus und wartet dabei nötigenfalls
	   //    solange bis wieder ein Eintrag vorhanden ist.
	   // </summary>
	   public T Dequeue ()
	   {
	      lock (this) {
	         while (_q.Count == 0) {
	            Debug.WriteLine (Thread.CurrentThread.Name + " Wait");
	            Monitor.Wait (this);
	         }
			 Monitor.PulseAll(this);
	         Debug.WriteLine (Thread.CurrentThread.Name + " Dequeue ==> " + (_q.Count - 1));
	         return _q.Dequeue ();
	      }
	   }
	}
}


20.04.2010 - 16:51 Uhr

Hi,

es gibt ja mehrere Stufen dieser Zertifikate von Microsoft und die sind auch für Arbeitgeber aussagekräftig, da sie wiederspiegeln, was diese Person kann. Nach meinem Wissen sind diese Zertifikate je nach Stufe auch recht anspruchsvoll.

20.04.2010 - 15:31 Uhr

Es gibt auch gute Gründe FÜR das aussperren fragwürdiger Software. Z.B. gab es im Android Store mal eine App, die Kontodaten der Anwender ausgespäht hat. Und sowas kann dort immer wieder passieren. Was ist außerdem mit jugendgefährdenden Inhalten? Ich finde es gut, dass Apple und Microsoft etwas acht darauf geben, was in die Stores kommt. Außerdem ist es ein Smartphone, kein PC, da brauch ich nicht unbedingt die gleichen Features. Und wer damit Probleme hat kann sich entweder sein Telefon jailbreaken, oder sich z.B. ein Android Phone kaufen.

20.04.2010 - 15:27 Uhr

Es gibt direkt von Microsoft Zertifikate für Entwickler. Hier kannst du dich schlau machen.

20.04.2010 - 14:47 Uhr

Apple verbietet MonoTouch auf dem iPhone (lässt aber Opera-Mobile zu), und dann auch noch so was.

Was hat denn Opera mit MonoTouch zu tun? Das sind zwei grundverschiedene Sachen. MonoTouch bzw. Cross-Compiler wurden ausgeschlossen, weil Apple fürchtet, dass durch die hinterherhinkende Entwicklung dieser Tools neue Features des iPhones nicht so häufig genutzt werden.

15.04.2010 - 19:06 Uhr

Hi herbivore,

ich habe mal eine Lösung erstellt. Ich hoffe sie entspricht deinen Anforderungen.



using System;
using System.Collections.Generic;
using System.Threading;
using System.Diagnostics;

namespace SyncQueueTest
{

	//*****************************************************************************
	public class SyncQueue <T>
	{
		   //--------------------------------------------------------------------------
		private Queue <T> _q   = new Queue <T> ();
		public int MaxSize { get; set; }
		public SyncQueue (int maxSize)
		{
			MaxSize = maxSize;
		}
	
		//==========================================================================
		// <summary>
		// Trägt einen Eintrag und wartet dabei nötigenfalls
	  // solange bis wieder Platz vorhanden ist.
		// </summary>
		public void Enqueue (T tItem)
		{
			lock (this) {
				while (_q.Count >= MaxSize && MaxSize != 0) {
					Debug.WriteLine (Thread.CurrentThread.Name + " Wait");
					Monitor.Wait (this);
				}
				_q.Enqueue (tItem);
				Monitor.Pulse (this);
				Debug.WriteLine (Thread.CurrentThread.Name + " Enqueue ==> " + _q.Count);
			}
		}
	
	   //==========================================================================
	   // <summary>
	   //    Holt einen Eintrag aus der Queue heraus und wartet dabei nötigenfalls
	   //    solange bis wieder ein Eintrag vorhanden ist.
	   // </summary>
	   public T Dequeue ()
	   {
	      lock (this) {
	         while (_q.Count == 0) {
	            Debug.WriteLine (Thread.CurrentThread.Name + " Wait");
	            Monitor.Wait (this);
	         }
			 Monitor.Pulse(this);
	         Debug.WriteLine (Thread.CurrentThread.Name + " Dequeue ==> " + (_q.Count - 1));
	         return _q.Dequeue ();
	      }
	   }
	}
}


Habe das ganze getestet, indem ich vorab die Liste gefüllt habe, danach die MaxSize drastisch verringert habe und dann einfach deinen ursprünglichen Test habe laufen lassen. Lief bei mir ohne Probleme durch.

Gruß

Dario

15.04.2010 - 16:18 Uhr

Hi herbivore,

keine Einwände.

Gruß

Dario

12.04.2010 - 18:10 Uhr

fährst du das Macbook mit Mac OS oder Windows?

Ich habe auf meinem MacBook Pro Mac OS X 10.6.3 laufen, aber hatte auch schon Windows drauf. Die Treiber liefert Apple direkt mit. Das ganze lässt sich super einfach über BootCamp installieren. Nicht, dass jetzt wer denkt, dass wäre ne VM... das läuft alles direkt auf der Hardware 😉. Zur Akkulaufzeit unter Windows kann ich leider nichts sagen, da er bei mir unter Windows nur die 9600M GT erkannt hat, die natürlich wesentlich mehr Strom zieht. Sollte aber mit der 9400M kein Problem sein. Ansonsten geh einfach mal zu Media Markt oder Saturn... die haben im Normalfall ne Apple Ecke, wo ein richtiger Apple Genius (die heissen so) arbeitet und frag den... oder Google 😉

12.04.2010 - 11:38 Uhr

Vor kurzem ist meine Akku-Laufzeit von echten 5h, ja so lang hielt er am Anfang, auf ca. 70 Minuten abgestürzt, doch die Garantie ist auf nur ein Jahr beschränkt. Deshalb bekomme ich keinen Neuen. :-\

Da der Akku ein Verschleissteil ist würdest du eh nur bei einem Produktionsfehler einen neuen bekommen, auch bei bestehender Garantie.

@padi89

Wie wäre es denn mit einem MacBook White? Kostet beiNotebooksbilliger.de 839,-,

Core 2 Duo 2,26 GHz
2GB DDR3 RAM
250GB Platte
GeForece 9400M mit 256 MB

und einer Akkulaufzeit von 7 Stunden (in der Praxis meistens sogar mehr, mit Displayhelligkeit unten).

Einziger Punkt, der für dich nicht passt ist das Glare Display, kann aber aus eigener Erfahung sagen, dass das kein Problem ist. Habe selber ein MacBook Pro und bin sehr zufrieden. Das Glare Display hat mich nie gestört.

11.04.2010 - 15:30 Uhr

ich will GENAU die methode von PHP in C# nachahmen...

Ruhig bleiben... Du solltest erstmal rausfinden, welchen Hashing-Algo dein Server benutzt. Wie du der Doku von crypt() entnehmen kannst entscheidet der sich selber, welchen er nimmt. Je nachdem, welche auf dem System zur Verfügung stehen und welche PHP Version du hast nimmt er entweder DES, MD5, SHA-256 oder SHA-512. Schreib dir doch einfach ein einfaches PHP-Script, welches einen String mit crypt() verschlüsselt und das gleiche dann für alle Hashing-Algos. Dann solltest du sehen, welche Methode er benutzt.

11.04.2010 - 01:10 Uhr

Salt (engl. „Salz“) bezeichnet in der Kryptographie eine zufällig gewählte Bitfolge, die an einen gegebenen Klartext vor der Verwendung als Eingabe einer Hashfunktion angehängt wird, um die Entropie der Eingabe zu erhöhen.

Was gibt es daran nicht zu verstehen? Anhängen heisst im Normalfall dahinter. Allerdings ist es vollkommen irrelevant, ob man den Salt vorne, oder hinten, oder nach den ersten 3 Buchstaben einfügt. Er erfüllt immer seinen Zweck. Das sollte man dem Artikel auch entnehmen können.

08.04.2010 - 09:28 Uhr

Meiner Meinung nach könnten sich Frameworks wie Java/.NET durchsetzen; jedoch nicht mit Runtime, sondern eher so eine Mischung aus C++/C#/.NET. Mit einer C#-vergleichbaren Syntax, fest in jedes System integriert (also ohne, dass zusätzliche Prozesse laufen bzw. installiert werden müssen; plattformübergreifend, aber dennoch nativ), ohne die "Kompliziertheiten" / Ecken und Kanten von C++, dafür mit den Vorteilen von .NET wie GC, mit einer mit der von .NET vergleichbaren Standardbibliothek, ...

Es gibt schon Sprachen, die zu Maschinencode kompiliert werden und trotzdem einen GC haben (siehe Objective-C und D) und zumindest bei Objective-C ist auch mit Cocoa ein schönes Framework vorhanden. Leider haben beide Sprachen Nachteile, denn Objective-C ist zwar für Windows/Linux/Unix/Mac verfügbar, jedoch nur unter Mac komfortabel verwendbar. Und D hat afaik leider noch nicht so eine umfassende Library. Aber das ist auch alles kein Problem, da die Prozessoren eh immer leistungsfähiger werden und somit nur noch für Systemprogrammierung Sprachen wie ASM und C benutzt werden müssen.

07.04.2010 - 10:36 Uhr

So, ich hol den Thread mal wieder hoch, damit er nicht verloren geht 😉

Hallo zusammen,
Eine solche Liste immutable zu implementieren, macht in meinen Augen zwar für den praktischen Einsatz nicht viel Sinn, weil es den Aufwand der Hinzufüge- und Löschoperationen unnötig auf die Aufwandsklasse O(n) erhöht, aber das soll für das Spiel mal egal sein.

Das macht Sinn, wenn man auf Multicore Systemen arbeitet, da ansonsten nach jeder Änderung jede CPU ihren Cache aus dem Arbeitsspeicher aktualisieren muss, was ggf. mehr Zeit verbraucht als bei immutable Listen.

So, da scheinbar keiner Lust hat die Aufgabe zu lösen stell ich hier mal eine Lösung in Scala rein. Wer Lust hat kann auf Basis dessen gerne noch eine Lösung in C# erstellen.



// EmptyNode.scala
import java.lang.IndexOutOfBoundsException

case class EmptyNode[A] extends Tree[A] {
  override def isEmptyNode = true
  def toList[B >: A]: List[B] = List()
  def get[B >: A](i: Int): B = {
    throw new IndexOutOfBoundsException
  }

  def get[B >: A](i: Int, parentIndex: Int): B = {
    throw new IndexOutOfBoundsException
  }
}


//Leaf.scala

case class Leaf[A](data: A, index:Int) extends Tree[A] {
  def toList[B >: A]: List[B] = List(data)
  def get[B >: A](i: Int): B = {
    if(i == index)
      data
    else
      throw new IndexOutOfBoundsException
  }

  def get[B >: A](i: Int, parentIndex: Int): B = {
    val realIndex = parentIndex + index
    if(realIndex == i)
      data
    else
      throw new IndexOutOfBoundsException
  }
}


// MyList.scala

object MyList {
  def create[A](objects: A*): Tree[A] = {
    def creator(data: List[A], index: Int): Tree[A] = {
     data.size match {
       case 0 => EmptyNode[A]
       case 1 => Leaf(data.head, index)
       case 2 => Node(data(1), Leaf(data.head, -1), EmptyNode[A], index)
       case _ => {
        val split = data.splitAt(data.size / 2)
        Node(split._2.head, creator(split._1, ((split._1.size+1) / 2) * -1 ), creator(split._2.tail, (split._2.tail.size+1) / 2), index)
       }
     }
    }
    creator(objects.toList, objects.size / 2)
  }
}


// Node.scala


case class Node[A](data: A, left: Tree[A], right: Tree[A], index: Int) extends Tree[A] {
  def toList[B >: A]: List[B] = left.toList ++ List(data) ++ right.toList
  def get[B >: A](i: Int): B = {
    if(index == i) {
      data
    } else if(index > i) {
      left.get(i, index)
    } else {
      right.get(i, index)
    }
  }

  def get[B >: A](i: Int, parentIndex: Int): B = {
    val realIndex = parentIndex + index
    if(realIndex == i) {
      data
    } else if(realIndex > i) {
      left.get(i, realIndex)
    } else {
      right.get(i, realIndex)
    }
  }
}


// Tree.scala


trait Tree[A] {
  def toList[B >: A]: List[B]
  def isEmptyNode = false
  def addToHead[B >: A](o: B): Tree[B] = MyList.create[B]((List(o) ++ toList):_*)
  def addToTail[B >: A](o: B): Tree[B] = MyList.create[B]((toList ++ List(o)):_*)
  def removeFirst[B >: A]: Tree[B] = MyList.create[B](toList.tail:_*)
  def removeLast[B >: A]: Tree[B] = MyList.create[B](toList.dropRight(1):_*)
  override def toString = {
    val str = toList.toString
    str.substring(5, str.length -1)
  }

  def get[B >: A](i: Int): B
  def get[B >: A](i: Int, parentIndex: Int): B
}

Gruß

Dario

07.04.2010 - 10:29 Uhr

Also wenn dein Service nicht viel machen soll, dann solltest du eventuell als erstes überprüfen, ob vielleicht dein Code Fehler enthält, bzw. du die Aufgaben nicht optimal gelöst hast. eine hohe CPU-Last entsteht ja nicht aus heiterem Himmel 😉

02.04.2010 - 12:44 Uhr

Auf The Daily WTF wurde heute die neueste Errungenschaft auf den Gebiet der Datenbanktechnologie vorgestellt, die APDB, eine Nicht-Relationale Datenbank, die direkt via JavaScript angesprochen werden kann, damit man sich die Serverprogrammierung bei Webanwendungen spart 😉.


>

Ist zwar von denen ein Scherz, gibt es aber wirklich: http://de.wikipedia.org/wiki/CouchDB#Architektur_und_Schnittstellen

02.04.2010 - 10:49 Uhr

siehe: http://de.wikipedia.org/wiki/MUD

Gibt immernoch eine lebhafte Community.

01.04.2010 - 14:50 Uhr

Dann extrahiere das, was du vergleichen willst und mach darauf ein switch case. Oder wo ist dein Problem?

01.04.2010 - 14:46 Uhr

Ganz wichtig ist: Es gibt keinen selbstdokumentierenden/selbstkommentierenden Code! Kommentare sollten überall da geschrieben werden, wo es nicht eindeutig ist was, oder warum man etwas tut. XML-Doku über den Methoden ist sowieso selbstverständlich, um nachher ne gute Doc zu bekommen.

01.04.2010 - 10:30 Uhr

Ich schätze hier ist das Problem:


FOREIGN KEY([ID])
REFERENCES [Settings].[Group] ([ID])

Du referenzierst Group.ID auf Setting.ID. Das sollte sicherlich Setting.GroupID sein. Da Setting.ID der Primary Key ist und Primary Keys generell Unique sind kann er höchstens 1 mal in der Tabelle auftauchen, von daher 0..1.

Ich hoffe das hilft Dir.

Gruß

Dario

31.03.2010 - 23:56 Uhr

Ich nehme mal an, dass ein Fehler in der Modellierung der Datenbank vorliegt. Kannst du mal das SQL-Create Script posten?

31.03.2010 - 14:42 Uhr

Würde auch PayPal sagen. Wird meistens darüber gemacht. Eine Spende auf freiwilliger Basis ist imho steuerlich erstmal unbedenklich, da es ja eine Kleinstspende ist und damit kein Geld "verdient" wird, sondern mehr die Unkosten (Server etc.) gedeckt werden. Ich möchte aber drauf hinweisen, dass das nur meine Meinung ist und keine rechtliche Beratung darstellt 😉. Wenn du es genau wissen möchtest informiere dich doch beim Finanzamt oder einem Anwalt.

25.03.2010 - 11:13 Uhr

Weil hier zwei Mal Skype genannt wurde - ich dachte, Skype läuft im T-Mobile-Netz nicht?

Skype hat aktuell noch kein VoIP im 3G, aber übers WLAN gehts. Außerdem bin ich nicht bei T-Mobile 😉. Hab mir das iPhone in Italien gekauft und bin bei Vodafone.

23.03.2010 - 22:39 Uhr

Und dann kann das Potenzial der Hardware nichtmals richtig genutzt werden weil Multithreading eh zu uncool für heutige Smartphones ist.

Also erstmal habe Smartphones keine großartige Leistung, die man irgendwie ausnutzen könnte und zweitens ist Multithreading sehr wohl möglich. Es kann zwar kein Prozess (außer die des Herstellers, zumindes bei Phone 7 und iPhone OS) im Hintergrund laufen, aber es können mehrere Threads in einem Prozess laufen.

22.03.2010 - 23:14 Uhr

Meine Liste (ungeordnet):

  • teXXas (TV-, Kino- und Event-Programm)
  • Skype (sollte man kennen 😉 )
  • Meebo (kostenloser Multi-IM)
  • Twitterrific (Twitter eben)
  • Aurora Feint II - Arena Demons (Nettes Puzzlegame)
  • I Dig It (Boulder Dash artig, aber doch irgendwie anders)
  • ZugInfo (wann fährt die Bahn? 😉 )

Das sind so meine meistgenutzten.

20.03.2010 - 22:14 Uhr

\0 ist ein einzelnes Steuerzeichen und zwar um einen String zu terminieren. In C gibt es eben keine Strings, sondern nur Char-Arrays und die werden mit einem \0 terminiert.

20.03.2010 - 21:43 Uhr

Guck doch mal im Debugger in den String, ob es wirklich Leerzeichen sind. Vielleicht sind es auch andere Steuerzeichen, die nicht dargestellt werden.

20.03.2010 - 21:22 Uhr

Klar funktioniert das nicht. Strings sind in .Net immutable, das heisst, dass sie nicht verändert werden können. Sämtliche "Mutators" auf Strings geben eine neue Instanz zurück. Also muss dein Code so aussehen:


buffer = buffer.Trim();

Gruß

Dario

edit: zu langsam, aber trotzdem mal zur Klarstellung, warum das so ist gepostet 😉

19.03.2010 - 22:52 Uhr

Oder anders gesagt: Wer misst, misst Mist. -)

Kann man nicht besser ausdrücken 😉.

Das was wirklich wichtig ist in Sachen Performance sind Big-O und Big-Theta... Das Big-O ist bei beiden Methoden gleich. Das Theta ist bei der abgeleiteten Klasse durch den Aufruf von base.f() geringfügig (um 1) größer, da ein weiterer Methodenaufruf vorgenommen wird.

19.03.2010 - 22:35 Uhr

Also da hat Microsoft sich echt mal wieder was geleistet... Dass dieses OS eine absolut billige Kopie vom iPhone OS ist fällt ja schon nem Blinden auf... Einfach ein weiterer kläglicher Versuch von MS Apple zu kopieren... Windows Vista und 7 haben denen wohl noch nicht gereicht. Ich denke, dass die Mobilen Betriebssysteme von MS weiterhin ein Nischendasein führen werden.

17.03.2010 - 14:24 Uhr

Hoher Blutdruck, naja.. 150 zu irgendwas hab ich normalerweise, ist aber durch meinen Koerperbau bedingt ganz gut so 😉

Kaffee erhöht den Blutdruck nur temporär zur Leistungssteigerung. Dass Kaffee für einen anhaltenden zu hohen Blutdruck verantwortlich ist, ist ein Irrglaube. Nur wer ohnehin einen zu hohen Blutdruck hat sollte natürlich nicht unbedingt noch viel Kaffee trinken 😉

16.03.2010 - 20:12 Uhr

Okay, dann hätte ich gerne eine einfache Listenklasse, die als binärer Differenzbaum implementiert wird. Es sollen Elemente vorne und hinten angefügt werden können und ein Zugriff auf die Elemente über den Index soll möglich sein. Natürlich soll auch eine hübsche ToString() Methode vorhanden sein 😉

zum binären Differenzbaum:

mal angenommen wir haben 7 Elemente, dann sieht er so aus:

        4
      /   \
    -2    +2
   /  \   /  \
 -1   +1  -1  +1

Das erste Element ist das mittlere der Liste und hat somit auch den Index dieses Elements in der Liste. Sämtliche andere Knoten enthalten immer als Index einen relativen Wert zum vorherigen Knoten. Also der linke Knoten vom Root-Element enthält -2, also ist der wahre Index 4 - 2 = 2.

nach außen soll es eine Liste sein. Nur INTERN soll es ein Baum sein.

ToString sieht bei einer Liste z.B. so aus, dass für alle Elemente ToString ausgegeben wird.


interface IList<T> {
  int Count { get; }
  IList<T> Add(T item); // fügt das Item am Ende der Liste an
  IList<T> AddToHead(T item); // fügt das Item am Anfang der Liste an
  IList<T> RemoveFirst(); // entfernt das erste Element
  IList<T> RemoveLast(); // entfernt das letzte Element
  T Get(int index); // liefert das entsprechende Element zum Index
  String ToString(); // gibt für jedes Element ToString aus
}

So, habe gleich die Gelegenheit genutzt und wie aus dem Interface hervorgeht soll die Liste Immutable sein 😉

Also, da die Liste Immutable sein soll muss bei einem "Mutator" immer eine neue Liste, sprich IList<T> zurückgegeben werden.

16.03.2010 - 19:40 Uhr

Geht bestimmt schöner, aber funktioniert 😄


public class Queue<T> : IQueue<T>
	{
		QueueItem<T> _items;
		object _lock;
		public Queue ()
		{
			_lock = new object();
		}
		
		public int Count
		{
			get{
				lock(_lock) {
					if(_items != null) {
						return _items.Count;
					} else {
						return 0;
					}
				}
			}
		}
		
		public T Dequeue() {
			T item = default(T);
			lock(_lock) {
				if(Count > 1) {
					item = _items.Data;
					_items = _items.Next;
					_items.Parent = null;
				} else if(Count == 1) {
					item = _items.Data;
					_items = null;
				}
			}
			return item;
		}
		
		public void Enqueue(T elem) {
			lock(_lock) {
				if(_items != null)
					_items.Add(elem);
				else
					_items = new QueueItem<T>(null, elem);
			}
		}
		
		public bool Contains(T elem) {
			lock(_lock) {
				if(_items != null)
					return _items.Contains(elem);
				else
					return false;
			}
		}
	}

public class QueueItem<T>
	{
		object _lock = new object();
		public QueueItem<T> Parent {
			get; set;
		}
		public T Data {
			get; set;
		}
		public QueueItem<T> Next {
			get; set;
		}
		public QueueItem (QueueItem<T> parent, T data)
		{
			if(parent != null) {
				Parent = parent;
				Parent.Next = this;
			}
			Data = data;
		}
		public void Add(T item) {
			lock(_lock) {
				if(Next != null) {
					Next.Add(item);
				} else {
					Next = new QueueItem<T>(this, item);
				}
			}
		}
		
		public int Count {
			get {
				if(Next != null) { 
					return 1 + Next.Count;
				} else {
					return 1;
				}
			}
		}
		
		public bool Contains(T item) {
			if(Data.Equals(item)) {
				return true;
			} else if(Next != null) {
				return Next.Contains(item);
			} else {
				return false;
			}
		}
	}


edit: kleinen Fehler behoben, der eine Exception beim Aufruf von Dequeue auf eine leere Liste erzeugt hat... danke @ MarsStein

16.03.2010 - 11:47 Uhr

In der Firma, für die ich vor meinem Studium gearbeitet habe gab es Filterkaffee, der meistens okay war, sowie Wasser (verschiedene Sorten auch mit Geschmack), Säfte, Cola, Fanta, Sprite etc. alles kostenlos. Besonders gut fand ich, dass es auch verschiedene Frühstückscerealien kostenlos gab.

15.03.2010 - 01:16 Uhr

Unter MacOS kann man sowas wunderbar mit AppleScript machen.

12.03.2010 - 16:47 Uhr

Am einfachsten ist es mit Cocoa#. Das ist bei der MacOS Version von mono gleich dabei und du kannst das Interface einfach mit dem Interface Builder, der bei XCode dabei ist, bauen.

hier noch ein kleines Tutorial: http://www.mcmillan.cx/simpletutorial/

10.03.2010 - 23:53 Uhr

Zwei Links seien mir noch erlaubt um deine Aussagen etwas zu entkräftigen:

http://www.m4gic.net/touchscreen-des-iphone-wesentlich-genauer-als-konkurrenz-von-motorola-und-htc/

http://www.displaymate.com/Nexus_One_ShootOut.htm

edit: Das Motorola Milestone heisst in den USA Droid, nur um Verwirrung zu vermeiden 😉

10.03.2010 - 14:55 Uhr

Du hast dir also Android noch nicht mal angeschaut.){gray}

Du versuchst irgendwie in jedem Thread die Leute von Android zu überzeugen. Ich selber habe Android mehrfach im Einsatz erlebt um muss sagen, dass es mir bei weitem nicht so gut gefällt wie das iPhone. Das iPhone (ich hab ein 3GS) war bisher schneller als alle anderen Smartphones, die ich gesehen habe und vor allem hat das iPhone den besten Bildschirm (nicht von der Auflösung, aber von der Qualität und der Genauigkeit beim Touch).

@Topic:

Ich würde mir einen richtigen Mac kaufen (Mac mini ist ja nicht so teuer und reicht vollkommen). Alleine schon, weil du dir für das Installieren von MacOS auf anderer Hardware eine veränderte Version von MacOS aus dem Netz laden musst, was illegal ist.

08.03.2010 - 21:01 Uhr

Also ich habe mir ein iPhone 3GS in Italien gekauft und einen Vertrag bei Vodafone. Internet ist überhaupt kein Problem, das Ding ist sehr schnell und der Akku hält auch locker 3 Tage bei normalem Gebrauch mit Surfen über 3G, ohne Push. Das iPhone mit 32GB hat 719,- gekostet und für einen Vertrag mit Internet-, Festnetz- und D2-Flat bezahle ich 35,-. Zusätzlich habe ich noch 1 Jahr Flat in ein Fremdnetz kostenlos dazu bekommen.

10.02.2010 - 09:43 Uhr

Hi,

also Qt ist ziemlich einfach. Es hat im Prinzip alles was man braucht schon im Framework (ähnlich wie bei .Net) und ist auch ansonsten sehr gut handzuhaben. Natürlich sollte man etwas Erfahrung oder zumindest verständnis für C++ mitbringen. Für Graphiken hat Qt auch einiges. Unter anderem kannst du OpenGL in den Forms verwenden.

Ansonsten kannst du natürlich für Plattformunabhängigkeit auch auf Java oder andere Sprachen auf der JVM zurückgreifen. Mein Favorit ist hier z.B. Scala, welches die Vorteile funktionaler Sprachen mitbringt. Der Code wird kürzer und man kann Multicore Systeme effektiver nutzen. Und es ist weniger fehleranfällig!

07.02.2010 - 02:18 Uhr

Das geht mit JavaScript. Schau dir einfach mal die CSS overflow Eigenschaft an, dann musste einfach nur noch das Dragging mit JavaScript bauen und fertig 😉

05.02.2010 - 11:17 Uhr

In den von Dir genannten ( z.b. auch bei WPF ) hat sich dann eher etwas wie MVVM durchgesetzt.

Also WPF habe ich zwar nicht genannt, aber in den von mir genannten ist es kein MVVM (MVVM wurde von Microsoft festgelegt und ist auch fast ausschlielich dort zu finden), sondern MVC und zwar hat es sich da nicht durchgesetzt, sondern ist das Standardverfahren, welches die Entwickler der SDKs vorschlagen. Sowohl der QtCreator, als auch XCode bieten dir mit dem Interface Builder keine andere Möglichkeit. Ist jetzt aber auch egal, da dass langsam ausartet.