|
|
|
|
Ich hab gerade mal geschaut. Auch für ADO.NET gibt es einen ODBC DataProvider. Also kann ich deine Frage definitiv mit ja beantworten.
|
|
|
|
|
|
|
Ich nerde im GS während ich bei meiner Freundin in der Wohnung darauf warte, dass sie von der Uni heimkehrt!
Laaaaaaaaaaaaaaaaaaaaaaaaaaaaaaangweilig.
|
|
|
|
|
|
|
Heute ist mal wieder soein "Mein-Rücken-Bringt-Mich-Um"-Tag
|
|
|
|
|
|
|
Heute ist ein Tag irgendwo zwischen "ich bring mich um" und "ich bring alle anderen um" Ich bin müde und total verpeilt.
|
|
|
|
|
|
|
Ich wäre auch erschöpft, wenn ich mit einer psychiopathin zusammenwohnen würde.
|
|
|
|
|
|
|
Die ist eh seit zwei Tagen verschwunden.
|
|
|
|
|
|
|
Ach, ich hol mir doch ein Netbook. Was will ich mit einem Laptop.
|
|
|
|
|
|
|
Hol dir lieber ein Macbook-Air. Hat einen viel größeren -Faktor.
|
|
|
|
|
|
|
Das Portemonaie wird sich bedanken
|
|
|
|
|
|
|
So viel Geld hab ich nicht. Außerdem bin ich kein Designer, ich bin Programmierer. Was will ich mit einem Mac?
|
|
|
|
|
|
|
Linux oder Windows drauf installieren? Naja schaut schon porno aus das Air. Aber is doof, wie ich grad seh hat das noch garnicht das neuste Trackpad wie die anderen. Da pennt Apple wieder. Wird bestimmt bald ne neue Revision geben.
|
|
|
|
|
|
|
Wobei, das stell ich mir schon lustig vor.
Ich so: *Macbook auspack*
Linuxer so: *Für Hasstirade Luft hol*
Ich so: *Linux starte*
Linuxer so:
|
|
|
|
|
|
|
Machen doch alle Powergeeks. Entweder Thinkpad oder Macbook (am besten schwarzes altes mit $hacker_sticker hintendrauf).
|
|
|
|
|
|
|
Naja, ist mir egal, ich brauch sowas einfach nicht.
|
|
|
|
|
|
|
| Zitat von Teufel
| Zitat von Ashtray Ok, ich muss zugeben ich bin neugierig geworden, hat jemand noch ne GoogleWave-Einladung übrig? | |
Ich war mal so frei
| |
\o/
Ich bedanke mich!
8 weitere Einladungen frei!
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Ashtray am 26.11.2009 15:30]
|
|
|
|
|
|
| Zitat von damisau
Thinkpad T-Series, alles andere ist Geldverschwendung!
| |
X Junge, X ist was du willst.
|
|
|
|
|
|
|
| Zitat von Morgil
Ich gebe mir alle Mühe. Danke.ü
Anderes Thema: Was für ein Netbook soll ich kaufen?`
| |
Kuck dir die Samsung Netbooks an. Sind durchaus interessante dabei.
Leider fehlt mir bei den Netbooks immer irgendwas. Das Netbook das für mich passt hab ich noch nicht wirklich gefunden. Heute kam von notebooksbilliger ne Nachricht rein: MSI Wind U200-S2743W7P Black
Auch nicht uninteressant wie ich finde und 12" sind noch gut an der grenze zwischen sehr mobil und erträglich beim drauf arbeiten.
|
|
|
|
|
|
|
| Zitat von Floder
Linux oder Windows drauf installieren? Naja schaut schon porno aus das Air. Aber is doof, wie ich grad seh hat das noch garnicht das neuste Trackpad wie die anderen. Da pennt Apple wieder. Wird bestimmt bald ne neue Revision geben.
| |
Das Ding schaut scheisse aus und man kann nichts dran anschließen. Wie mehrere USBs? Hat doch Wlan! Wie VGA oder DVI? Hat doch WLan? Wie Erweiterungskarten? Hat doch Wlan! etc...
Das kann das entsprechende Thinkpad in gleicher größer eleganter und besser.
|
|
|
|
|
|
|
|
|
|
|
| Zitat von Achsel-des-Bösen
| Zitat von Renga
In welcher Sprache schreibst du das? Darf man da eventl. den Code mal sehen ... irgendwann? wuerde mich irgendwie interessieren.
| |
Java. Ich lade den Code dann mal morgen hoch...erinner mich dran
| |
Hab mich selbst dran erinnert.
Ich poste einfach mal den relevanten Code und den rest findet ihr hier.
|
Code: |
import java.io.IOException;
import javax.net.DataLinkLayer;
import javax.net.ReadFromLowerLayerTimeoutException;
public class SimpleDataLinkLayer extends DataLinkLayer {
/**
* Zeit in ms in der ein gesendetes Paket bestätigt sein muss
*/
private static final int ACK_TIMEOUT = 300;
/**
* Druchschnittliche Transferzeit (wird beim Sender gemessen) mit Hilfe eines
* MovingAverage
*/
private MovingAverage transmitTime = new MovingAverage(20);
/**
* Gesamtzahl aller Frames die beim Empfänger ankommen (inklusive nicht angekommen)
*/
private int receiverTotalFrames = 0;
/**
* Gesamtzahl aller Frames die beim Empfänger nicht ankommen (wird mit Hilfe des
* Resent-Couters gezählt)
*/
private int receiverLostFrames = 0;
/**
* Gesamtzahl aller defekten Frames
*/
private int receiverDamagedFrames = 0;
/**
* Sequenznummer die das nächste zu sendende Paket bekommt
*/
private int sequence = 0;
/**
* Sequenznummer des zuletzt empfangen Paketes
*/
private int lastSequenceReceived = Integer.MIN_VALUE;
public void send() {
boolean continueSend = true;
while(continueSend) {
try {
// auf Daten von der höheren Schicht warten
byte from_upper[] = new byte[Packet.MAX_FRAME_LEN];
int len = readFromUpperLayer(from_upper, Packet.MAX_FRAME_LEN);
Packet dataPacket = Packet.withPayload(from_upper, len);
// Header setzen & Checksumme berechnen
dataPacket.setSequence(this.sequence);
dataPacket.setResentCounter(0);
dataPacket.makeCRC();
setReadFromLowerLayerTimeout(ACK_TIMEOUT);
boolean packet_send = false;
do {
// daten senden
byte[] data = dataPacket.getBytes();
writeToLowerLayer(data, data.length);
// notieren des Sendenzeitpunkt des Datenpaketes und zählen des Pakets
long sendTime = System.currentTimeMillis();
try {
// auf Bestätigungspaket warten
byte ack[] = new byte[Packet.MAX_FRAME_LEN];
int len_ack = readFromLowerLayer(ack, Packet.MAX_FRAME_LEN);
Packet ack_packet = Packet.fromRawData(ack, len_ack);
// empfangenes Paket prüfen
if(!ack_packet.isCRCokay()) continue;
if(!ack_packet.isAckPacket()) continue;
if(ack_packet.getSequence() != this.sequence) continue;
// die Transferzeit ist (näherungsweise) die halbe roundtripzeit
long transferTime = (System.currentTimeMillis() - sendTime) / 2;
// die durchschnittliche Transferzeit updaten
this.transmitTime.update(transferTime);
//System.out.printf("\nsend(): Packet %d:%d sent\n", this.sequence, dataPacket.getResentCounter());
packet_send = true; // das Paket wurde erfolgreich gesendet
} catch (ReadFromLowerLayerTimeoutException e) {
/*
* es wurde keine Bestätigungspaket innerhalb der gesetzten Zeit
* erhalten der resentcounter des Pakets wird erhöht und es wird
* beim nächsten schleifen durchlauf neu gesendet
*/
//System.out.printf("\nsend(): Packet %d:%d failed\n", this.sequence, dataPacket.getResentCounter());
dataPacket.setResentCounter(dataPacket.getResentCounter()+1);
dataPacket.makeCRC();
}
} while(!packet_send);
// das Paket wurde erfolgreich gesendet und bestätigt
this.sequence++;
} catch( IOException e) {
continueSend = false;
System.err.println("IOException in send()");
e.printStackTrace();
}
System.out.printf(
"Avg. Transfertime : %5.2f ms\n", this.transmitTime.getAverage());
}
}
public void receive() {
boolean continueReceive = true;
while (continueReceive) {
// es wird unendlich lange auf daten gewartet
setReadFromLowerLayerTimeout(0);
try {
// daten aus der daruterliegenden Schicht lesen
byte from_lower[] = new byte[Packet.MAX_FRAME_LEN];
int len = readFromLowerLayer(from_lower, Packet.MAX_FRAME_LEN);
Packet receivedPacket = Packet.fromRawData(from_lower, len);
this.receiverTotalFrames++;
// CRC prüfen. Wenn das Paket defekt ist, wird es gezählt
if(!receivedPacket.isCRCokay()) {
this.receiverDamagedFrames++;
//System.out.printf("receive(): Packet %d:%d damaged\n", receivedPacket.getSequence(), receivedPacket.getResentCounter());
continue;
}
if(receivedPacket.getSequence() == this.lastSequenceReceived) {
/*
* auch wenn das Paket ein Dublikat ist, müssen wir es nochmal
* bestätigen, sonst bekommen wir es immer wieder
*/
//System.out.printf("\nreceive(): Packet %d:%d dublicate\n", receivedPacket.getSequence(), receivedPacket.getResentCounter());
sendAck(receivedPacket);
continue;
}
else if(receivedPacket.getSequence() < this.lastSequenceReceived) {
System.out.printf("\nreceive(): Packet %d:%d IN WRONG ORDER. Previous SequNr was %d\n",
receivedPacket.getSequence(), receivedPacket.getResentCounter(), lastSequenceReceived);
continueReceive = false;
break;
}
else if(receivedPacket.getResentCounter() > 0) {
/*
* wenn der resentcounter im empfangenen Paket größer als 0 ist, wurde
* es so oft gesendet wie der resentCounter anzeigt
*/
this.receiverLostFrames += receivedPacket.getResentCounter();
this.receiverTotalFrames += receivedPacket.getResentCounter();
}
/*
* Datenpakete werden an die höhere Schicht gegeben, bestätigt und die
* Sequenznummer wird als empfangen markiert
*/
if(receivedPacket.isDataPacket()) {
byte[] data = receivedPacket.getPayload();
writeToUpperLayer(data, data.length);
//System.out.printf("\nreceive(): Packet %d:%d received\n", receivedPacket.getSequence(), receivedPacket.getResentCounter());
sendAck(receivedPacket);
this.lastSequenceReceived = receivedPacket.getSequence();
}
}
catch (ReadFromLowerLayerTimeoutException e) {
// das kannn nicht eintreten
}
catch (IOException e) {
continueReceive = false;
System.err.println("IOException in receive()");
e.printStackTrace();
}
if(receiverTotalFrames > 0) {
// zahl der tatsächlich erhaltenen pakete (abzüglich verlorener)
int totalReceived = receiverTotalFrames - receiverLostFrames;
System.out.printf("Receiver lost Frames : %5.2f%% (%d of %d)\n",
receiverLostFrames*100.0/receiverTotalFrames,
receiverLostFrames, receiverTotalFrames);
System.out.printf("Receiver damaged Frames : %5.2f%% (%d of %d)\n",
receiverDamagedFrames*100.0/totalReceived,
receiverDamagedFrames, totalReceived);
}
}
}
/**
* sendet ein Bestätigungspaket für ein gegebenes Paket
* @param toAck das Paket für das die Bestätigung gesendet werden soll
* @throws IOException wenn Fehler beim schreiben auf den unteren Schicht auftritt
*/
private void sendAck(Packet toAck) throws IOException {
Packet ack_packet = toAck.createACK();
ack_packet.makeCRC();
writeToLowerLayer(ack_packet.getBytes(), ack_packet.getBytes().length);
}
}
|
|
Die readFrom.../writeTo... Methoden kommen aus der abstrakten Basisklasse gegen die wir programmiert haben und simulieren quasi die OSI-Schichten 1 und 3. Unser Code wurde dann von jeweils einmal aufgerufen (siehe die Batchdatei/das Shellscript) und die send() und die receive() Methode tauschten dann über eine simuliertes Netzwerk Daten miteinander aus. Die simulierte Bitübertragungsschicht hat dabei dann eine Menge Packetloss und Fehler eingebaut, damit es interessanter wird. Die eigentlich Aufgabestellung findet ihr übrigens in dem PDF auf Seite 8 oder 9.
Achso und diese lustige Packet Klasse hab ich mir gestrickt, damit ich im eigentlich Code nicht mit irgendwelchen Byte rumdüdeln muss.
|
|
|
|
|
|
|
Yay, putty gibt's auch für Symbian!
|
|
|
|
|
|
|
| Zitat von SirSiggi
| Zitat von damisau
Thinkpad T-Series, alles andere ist Geldverschwendung!
| |
X Junge, X ist was du willst.
| |
R pwnt!
|
|
|
|
|
|
|
Squeezebox ist bis jetzt schonmal Godlike!
Kurz WLAN konfiguriert, zieht automatisch ein Firmware-Update und sammelt gerade alle Daten der Webradios die es so gibt
Als nächstes mal die lokalen Radiosender auf die Kurzwahltasten und dann den Squeezebox-Server auf dem NAS starten \o/
|
|
|
|
|
|
|
| Zitat von Ashtray
| Zitat von SirSiggi
| Zitat von damisau
Thinkpad T-Series, alles andere ist Geldverschwendung!
| |
X Junge, X ist was du willst.
| |
R pwnt!
| |
R ist für die Leute die sich goldene Wasserhähne unter ihre Brücke bauen.
|
|
|
|
|
|
|
Ihr verwirrt mich
|
|
|
|
|
|
|
| Zitat von SirSiggi
| Zitat von Ashtray
| Zitat von SirSiggi
| Zitat von damisau
Thinkpad T-Series, alles andere ist Geldverschwendung!
| |
X Junge, X ist was du willst.
| |
R pwnt!
| |
R ist für die Leute die sich goldene Wasserhähne unter ihre Brücke bauen.
| |
Ich schwanke noch ob ich das als Kompliment oder Beleidigung auffassen soll!
|
|
|
|
|
|
|
Im Zweifelsfall Beleidigung.
|
|
|
|
|
|
Für mehr Musik im GS
|
np: Frei.Wild - Stueck fuer Stueck
|
|
|
|
|
|
|
| Zitat von Achsel-des-Bösen
Braucht hier jetzt noch jemand einen Google Wave Account?
| |
hier, bitte.
|
|
|
|
|
|
|
Wir brauchen mal dringend eine neue Seite. Dieser Riesencodeblock da oben killt mir das Layout.
|
|
|
|
|
|
Thema: Gehirnsalat ( wir unter uns ) |