ChristseinReal LifeMartin Richter - Fr 05 Feb 2010 18:39

Seit 2006 Muhammad Yunus für seine Arbeit und seine Grammeen Bank den Friedensnobelpreis bekommen hat, habe ich auch immer mal wieder über Mikrokredite und gerechte Geldanlage nachgedacht.

Durch einen Artikel in der OJC-Zeitschrift Salzkorn bin ich jetzt wieder einmal auf solch eine alternative Bank gestoßen, die Geldanlage nach anderen Maßstäben betreibt:
Oikocredit http://www.oikocredit.org

Ich denke, dass wir uns oft genug hinter dem Gedanken verstecken, dass man alleine nichts machen kann. Aber man kann :!:
Mit 200 Euro, die man für einem Genossenschaftsanteil investiert können viele andere Menschen in dieser Welt, zu gerechten Konditionen, eine neue Perspektive für ihr Leben erhalten.

Also warum nicht auch ein paar Euro investieren bei einer ganz anderen Art von Bank und dabei auch noch immerhin 2% Dividende zu erhalten :?: Es muss nicht immer eine Spende sein :!: ;)

Siehe auch http://www.ethische-geld-anlage.de, wen das Thema noch mehr interessiert.

  • Add to favorites
  • Google Bookmarks
  • del.icio.us
  • MisterWong.DE
  • Technorati
  • Facebook
  • Live
  • Twitter
ProgrammierenSonstigesVista / Windows 7Martin Richter - Mo 01 Feb 2010 20:02

Das meine Software auf allem läuft was Windows XP und später heißt war mir schon lange klar ;) aber ein offizielles “Kompatibel für…” ist ja schon noch was anderes.
Jetzt habe ich die kostenlose Zertifizierung für die Windows 7 Kompatibilität hinter mich gebracht.
In Klartext ganz offiziell: AG-VIP SQL in der Version 1.20.008 ist kompatibel mit Windows 7 :!:

Verglichen mit der Vista Zertifizierung, die wir bei einem 3rd Party Unternehmen (VeriTest) durchgeführt haben, muss ich sagen: Windows 7 kompatibel zu werden ist nicht schwer
Es war wirklich kein großer Aufwand!

Wer sich die Spezifikationen durchgelesen hat wird sehen, dass sich gegenüber der Vista Zertifizierung kaum was geändert hat. Wer also seine Software bereits Vista kompatibel hat, kann gleich einen Durchstart machen und es für Windows 7 auch probieren. Und das schöne: Es kostet nichts!
Ich habe es nicht versucht, aber ich vermute mal, dass genau die Version die ich für Vista eingereicht habe auch durch die Windows 7 Zertifizierung gekommen wäre.

Noch ein paar Anmerkungen:

  • Ich kann jeden ermutigen, den Test zu machen, wenn man sowieso schon ein Code Signing Zertifikat und einen 64bit Rechner zur Verfügung hat. Wenn man auf dem man 64bit Windows 7 virtualisieren kann ist die Zertifizierung wirklich einfach. Ich habe VMWare benutzt und das ist einfach ein super Werkzeug für so etwas.
  • Wie bei vielen Zertifizierungen wird viel zu viel Gewicht auf Installation und Deinstallation gelegt. Das war bei der Vista Zertifizierung auch schon so.
  • Bei der Vista Zertifizierung war noch klar, wie und wo man Waiver (Freistellungen) bekommt, z.B. für Komponenten von Drittherstellern, die Ihre DLLs nicht signieren. Dazu gehört ja auch Microsoft mit den DLLs der MFC ;)
    In diesem Zertifizierungsprozess, erfährt man, dass man sie evtl. benötigt, aber nicht wo man sie bekommt…
  • Manche in meinen Augen wertvolle Tests in der Vista Zertifizierung, wie zum Beispiel, die korrekte Behandlung von Crashes, scheinen vollkommen entfallenzu sein.
  • Der Test bei dem 3rd Party Unternehmen war weitaus tiefer als das was man bei dem Selbsttest macht. Jetzt genügt ja die Software zu starten und wieder zu beenden. Bei den Tests zu Vista sind wir beim ersten mal durchgefallen, weil hier ein Bug in der MFC mit dem Application Verifier gefunden wurde, der uns beim Testen nicht aufgefallen war  (Siehe 1, 2, 3
    Ich empfinde den Selbsttest als zu schwach um dann ein Windows 7 kompatibel Logo zu bekommen.
  • Man muss versichern, dass man keine Spyware zertifiziert oder andere böse Software erzeugt… gelinde gesagt ein Scherz. Bei einem 3rd Party Tester würde solche Spyware (hoffentlich) nicht durchkommen. Das hoffe ich doch wirklich mal! Jetzt muss man nur einen Haken setzen, und sich selbst bestätigen, dass man es nicht tut, obwohl man es evtl. doch tut… ;)
    Das mindert den Wert dieses Logos ungemein.
  • Wenn man früher Geld investierte für eine Zertifizierung, hieß das nicht, dass man deshalb bessere Software produziert. Aber 1000$ waren dennoch eine Schwelle über die nicht jeder Hanswurst mit seiner Mickey-Maus-Software gegangen ist.
    Jetzt bleibt als Schwelle nur noch der Kauf eines Code-Signing Zertifikates bei VeriSign und so was kostet ca. 500$ im Jahr.
  • Ich vermisse schon lange das Verbot anderer Techniken, zum Beispiel ein Verbot von Systemweiten Hooks, wenn man Windows X kompatibel sein will. Wenn dann sollte so etwas auch nur mit einem Waiver und klarer Begründung erlaubt werden.
    Nicht wenige dieser mies programmierten Hooks sorgen für Instabilität, unnützes Aufblähen von Prozessen und manchmal auch miese Performance.

Als Fazit bleibt für mich die Frage:
Was nützt ein Logo, dass man zu leicht bekommen kann?

Es bleibt eine Marketing-Aktion und genauso wurde die Vista und jetzt auch die Windows 7 Zertifizierung auch bei uns in der Firma eingestuft. Technischen Nutzen hat das ganze nicht wirklich.

  • Add to favorites
  • Google Bookmarks
  • del.icio.us
  • MisterWong.DE
  • Technorati
  • Facebook
  • Live
  • Twitter
ProgrammierenSonstigesWindows APIMartin Richter - Sa 23 Jan 2010 20:39

Was macht man, wenn man keine Wait-Funktionen verwenden will, aber dennoch möchte, dass ein anderer Thread weiterarbeiten kann. Zum Beispiel, weil man einen Spinlock implementieren will.

Nun es gibt insgesamt vier Methoden die durch das Netz geistern.
Ich gehe mal der Häufigkeit nach, die so in manchen Code-Samples finde:

1. __noop;

Wenn der Lock kurz ist, scheint es das beste zu sein, einfach die Schleife weiterlaufen zu lassen und zu hoffen, dass der ein Thread auf einem anderen Prozessor, die Ressource freigibt. Das eignet sich wirklich nur, wenn die Zeitdauer der Sperre als extrem kurz anzusehen ist und eine hohe Anzahl von Prozessoren zur Verfügung steht.
Nach allen Test, die ich gemacht habe, sollte man aber von dieser Art des Wartens bei einem Spinlock absehen. Es schiebt die Leistung des Kerns auf 100% und bringt nichts.

2.  Sleep(0);

Lies sich gut. Schlafe aber eben nicht lange. Man hat auch schon irgendwo gelesen, dass durch diese Methode der Rest der Zeitscheibe dieses Threads aufgegeben wird und ein anderer Thread an die Reihe kommt.
Leider stimmt das nicht ganz :!:
Liest man die Doku genau steht da aber:

A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If there are no other threads of equal priority ready to run, the function returns immediately, and the thread continues execution.

:eek: Threads mit höherer oder niedriger Prio haben also nichts davon.

Besonders eklig wird das ganze gerade wenn man Threads unterschiedlicher Prio hat, die hier gegeneinander laufen. Sleep(0); führt in diesem Fall zu einerunnötigen Prozessorlast und eben nicht dazu, dass die Zeitscheibe abgegeben wird. Der Prozess kommt sofort wieder an die Reihe und spin-t weiter.

3. SwitchToThread();

OK. Seit Windows 2000 gibt es diese nette neue Funktion. Damit wird ein anderer Thread aktiv. Egal was für eine Prio er hat. Aber auch diese Funktion tut evtl. nicht genau das was man will.
Auch hier stecken die Tücken im Detail der Doku:

The yield of execution is limited to the processor of the calling thread. The operating system will not switch execution to another processor, even if that processor is idle or is running a thread of lower priority.

Sollte also der Thread, auf den man wartet auf dem anderen Prozessor laufen, so profitiert der nicht von dem Aufruf von SwitchToThread.

4. Sleep(1):

Hiermit erreicht man wirklich was man möchte. Man gibt seine Timeslice auf und erstmal sind die anderen dran.

Mein persönliches Fazit:

Nach meinen Recherchen ist Sleep(1); der vernünftigste Weg seine Zeitscheibe abzugeben. Und nach meinem Dafürhalten ist ein __noop; strickt zu vermeiden. Die Performance ist grottenschlecht.
Das ganze Verhalten hängt extrem auch von den Umständen ab: Zahl der Theads, Häufigkeit der Kollision, Anzahl verfügbare Prozessoren, Verteilung der Prioritäten, Allgemeine Belastung des Systems, Zeitdauer der Sperre etc.

Ich habe mit einigen Parametern gespielt und auch ein kleines Sample gebaut, dass alle 4 oben genannten Funktionen durchprobiert und in dem man auch mit anderen Faktoren (Priorität etc.) spielen kann.
Es zeigte sich, dass Sleep(1); am effektivsten war. Aber dicht auf gefolgt von Sleep(0);, was mich doch etwas überraschte.

Allerdings führen schon kleinste Änderungen (Lockdauer, Zahl der Prozessoren, Spielen mit der Priorität) zu anderen Ergebnissen.
Interessant ist vor allem das Spielen mit den Prioritäten. Man soll nicht glauben, das ein Thread selbst mit niedrigster Prio noch relativ häufig Arbeit bekommt.

Viel Spaß beim Spielen mit dem Code SleepTest

  • Add to favorites
  • Google Bookmarks
  • del.icio.us
  • MisterWong.DE
  • Technorati
  • Facebook
  • Live
  • Twitter
ATLProgrammierenSQLWindows APIMartin Richter - Mo 18 Jan 2010 20:19

Wie bekommt man eigentlich einfach eine Liste aller verfügbaren SQL-Server im Netz?

In der MSDN findet sich schnell ein Artikel How to enumerate available instances of SQL Server by using the SQLDMO components. Allerdings ist dieser Artikel wenig nützlich, denn SQL-DMO findet man nur noch selten auf einem Rechner.

Dabei ist es doch relativ einfach, denn OLE-DB sieht hierfür Enumeratoren vor. Aber auch die sind nicht sonderlich gut dokumentiert. In der SQL-2000 Server Doku findet sich noch ein Eintrag für den SQLOLEDB Enumerator. Für den neuen nativen OLE-DB Clienst für den SQL-Server finde ich nichts mehr dazu.

ATL stellt direkt Klassen zur Verfügung, die die Nutzung von Enumeratoren zu einem Kinderspiel machen.

Anbei ein Codeschnippsel der alle bekannten MS-SQL Server enumeriert. Ich beginne dabei mit dem neuesten Client (2008) und gehe die Schleife weiter bis zum ältesten Server Client (2000).
Wird ein Enumerator gefunden, und dieser lieferte Ergebnisse, dann wird die Schleife abgebrochen. Denn alle Enumeratoren liefern im Allgemeinen das gleiche Ergebnis.

Code:

 
//////////////////////////////////////////////////////////////////////////
// Main function to enumerate all servers with the appropriate
// known enumerators.
 
typedef std::set  TSET_CString;
 
void EnumSQLServer(TSET_CString &setSQLServer)
{
  // We may need the local server name. 
  // We replace the token (local) with the current computer name.
  CString strCompLocal;
  DWORD dwLen = MAX_COMPUTERNAME_LENGTH+1;
  ::GetComputerName(CStrBuf(strCompLocal,dwLen),&dwLen);
 
  // Loop over all enumerators we know
  static const PCWSTR aEnumerator[] =
  {
    L"SQLNCLI10 Enumerator",    // SQL 2008
    L"SQLNCLI Enumerator",      // SQL 2005
    L"SQLOLEDB Enumerator"      // SQL 2000
  };
 
  // Try all enumerators
  for (int i=0; i < _countof(aEnumerator); ++i)
  {
    // Check if we have an enumerator
    bool bFoundAny = false;
    HRESULT hr;
    CLSID clsid;
    hr = CLSIDFromProgID(aEnumerator[i],&clsid);
    if (SUCCEEDED(hr))
    {
      // Open enumerator and loop over all entries
      CEnumerator enumrator;
      hr = enumrator.Open(&clsid);
      if (SUCCEEDED(hr))
      {
        while ((hr=enumrator.MoveNext())==S_OK)
        {
          CString strServerName(enumrator.m_szName);
 
          // Skip empty server names 
          // (older enumerators return sometimes an empty name)
          if (strServerName.IsEmpty())
            continue;
 
          // Some enumerators return (local) for a local main
          // SQL server instance
          if (strServerName.CompareNoCase(_T("(local)"))==0)
          {
            ATLTRACE(__FUNCTION__ " found local computer\n");
            strServerName = strCompLocal;
          }
 
          // get uppercase server name
          strServerName.MakeUpper();
 
          // Insert in list and avoid duplicates with this, if
          // developer decides not to break the loop after the first
          // enumerator.
          if (setSQLServer.insert(strServerName).second)
            ATLTRACE(__FUNCTION__ " found server %s\n",
                  CT2A(strServerName.GetString()));
          bFoundAny = true;
        }
      }
 
      // After we have found data in one enumerator. There is no need
      // to do this again.
      // But a developer might decide to do this for every enumerator
      if (bFoundAny)
        break;
    }
  }
}

Ein lauffähiges Projekt kann man hier herunterladen: EnumSQLServer.zip.

  • Add to favorites
  • Google Bookmarks
  • del.icio.us
  • MisterWong.DE
  • Technorati
  • Facebook
  • Live
  • Twitter
MFCProgrammierenSoftwareWindowsWindows APIMartin Richter - Do 14 Jan 2010 20:10

Ich habe eine relativ komplexe UI, die auch dynamisch Controls erzeugt. In diese Controls werden auch zum Teil Massen an Daten hineingeschoben. Damit alle Controls zeitgleich erst die Daten präsentieren verwende ich eine einfache Methode, die aus alten Windows Tagen stammt: CWnd::SetRedraw/WM_SETREDRAW. Man verwendet diese Nachricht zum Beispiel um das Flackern von Listboxen und Comboboxen zu verhindern, wenn man viele Daten einfügt.
Diese Nachricht wird von allen Fenstern unterstützt oder sollte unterstützt werden ;)

Meine Software macht nun folgendes:

  • Zuerst hat meine Ladeprozedur für die Daten, zuerst alle Controls erzeugt, oder überflüssige vernichtet und positioniert, oder evtl. nur ausgeblendet (ShowWindow(SW_HIDE). D.h. nach dem ersten Laden der Daten ändert sich am Layout evtl. nichts mehr.
  • Anschließend wurde an alle Controls CWnd::SetRedraw/WM_SETREDRAW mit FALSE gesendet.
  • Dann die Daten geladen.
  • Nach dem Laden wird einfach wieder CWnd::SetRedraw/WM_SETREDRAW mit TRUE gesendet und ein Invalidate durchgeführt.

Das funktioniert für alle Controls, mit einer Ausnahme: Das RTF Control. Wenn man WM_SETREDRAW TRUE an ein RTF Control sendet, das nicht sichtbar ist, dann wird dieses sichtbar. Der Stil WS_VISIBLE wird also verändert. :eek:

Um das Problem zu isolieren habe ich hier ein kleines Testprogramm geschrieben. Der kritische Code sieht so aus. Das gesamte Projekt kann man hier auch herunterladen: Demoprojekt.

void CTestRTFSetRedrawDlg::OnBnClickedBtDoit()
{
 bool bWasVisible = (m_wndEdRTF.GetStyle() & WS_VISIBLE)!=0;
 m_wndEdRTF.SetRedraw(FALSE);
 m_wndEdRTF.SetWindowText(_T("Line 1\r\nLine 2\r\nLine 3\r\nLine 4"));
 m_wndEdRTF.SetSel(0,0);
 m_wndEdRTF.SetRedraw(TRUE);
 m_wndEdRTF.Invalidate();
 bool bIsVisible = (m_wndEdRTF.GetStyle() & WS_VISIBLE)!=0;
 
 // Check if the visible state changed
  if (bIsVisible!=bWasVisible)
  AfxMessageBox(_T("The visible state of the RTF control changed!"));
}

Nachtrag 16.01.2010 (Danke Sven für Deinen produktiven Kommentar):
Auch andere Controls wie Button-, Static- und Edit-Controls verändern den Visible Status wenn WM_SETREDRAW angewendet wird. Einzig Listbox- und Combobox-Controls behalten den Visiblestatus korrekt bei :!:

  • Add to favorites
  • Google Bookmarks
  • del.icio.us
  • MisterWong.DE
  • Technorati
  • Facebook
  • Live
  • Twitter
SoftwareVistaWindows 7Martin Richter - Do 07 Jan 2010 08:20

Alleine der Name macht einen ja schon neugierig…

Was verbirgt sich dahinter?
Nichts anderes als eine Explorer Ansicht, die alles aus den Systemsteuerungspanels in einer Liste anzeigt. Nett…

Wie macht man das?

  1. Man legt auf dem Desktop (oder sonst wo) ein neues Verzeichnis an.
  2. Dieses Verzeichnis benennt man dann um in GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}
    Wobei der Name vor dem Punkt keine Rolle spielt. Es geht nur um die Extension und die GUID.
  3. Fertig! Das Symbol verändert sich dann auf das Symbol der Systemsteuerung.

Gefunden in: Understanding Windows 7’s ‘GodMode’

Nachtrag 1: Das Ganze geht sogar unter Vista 32bit!
Nachtrag 2:
Es gibt Meldungen, dass dieser Link auf dem Desktop eines Vista 64bit Systems den Explorer zum Absturz bringt!
Evtl. sollte man den Ordner testweise in diesem Fall erstmal in einem Unterordner anlegen.
Nachtrag 3:
Auch Kay Giza berichtete ausführlich über diesen Modus, ich hatte dies allerdings übersehen.
http://www.giza-blog.de/Windows7VistaErweiterteSystemsteuerungAktivierenED7BA4708E54465E825C99712043E01C.aspx

  • Add to favorites
  • Google Bookmarks
  • del.icio.us
  • MisterWong.DE
  • Technorati
  • Facebook
  • Live
  • Twitter
C++MFCProgrammierenSonstigesWindows APIMartin Richter - Mo 04 Jan 2010 17:43

Die Frage um die Eingabe-Taste in Dialogen und wie man diese “missbraucht” (sage ich mal provokant) ist eine regelmäßige Frage in allen Foren.

Die Intention ist oft klar. Man möchte mit der Eingabetaste eine bestimmte Aktion verbinden, die evtl. sehr oft ausgeführt werden soll und nicht den Dialog schließen.
Die üblichen Wege sind schon mehrfach diskutiert worden und auch in meinem Blog finden sich dazu ein Artikel .

Zu kurz kommt bei dieser Diskussion die Funktion CDialog::SetDefID bzw. DM_SETDEFID Nachricht.
Was macht diese Funktion/Nachricht?
Sie definieren die Button-ID, die als Default-Aktion in einem Dialog ausgelöst werden soll und das ist nichts anderes als die Aktion die geschehen, soll wenn die Eingabe-Taste gedrückt wird.
Viele Entwickler definieren einfach OnOK um. Aber das eigentlich tolle ist mit SetDefID den Button in Abhängigkeit der Daten umzusetzen und das hat auch einen visuellen Effekt für den Nutzer.

Mal ein Beispiel:
Wir haben einen Dialog mit zwei List Views. Links Elemente die zur Auswahl stehen, rechts die Elemente in der Reihenfolge, die der Benutzer ausgewählt hat.
Der Mausschubser wird einfach die Einträge auf der linken oder rechten Seite doppelklicken und damit auswählen oder entfernen. Entsprechende Buttons für Hinzufügen und Entfernen wird es auch geben. Man kann also auch links oder rechts markieren und dann den Hinzufügen oder Entfernen Schalter nutzen.

Dem Tastaturnutzer können wir helfen indem wir intelligent CDialog::SetDefID / DM_SETDEFID verwenden. Die Vorgehensweise ist einfach.

  • Wir richten uns nur danach in welchem List View wir uns befinden, d.h. befinden wir uns im linken List View steuern wir den Hinzufügen Schalter, und im rechten List View steuern wir den Entfernen Schalter.
  • Wird also im linken List View ein Item ausgewählt, setzen wir mit CDialog::SetDefID / DM_SETDEFID die ID des Hinzufügen Schalters.
  • In dem Moment wird der Hinzufügen Schalter zum Default-Button. Der Nutzer kann nun die Eingabe-Taste drücken und die Items werden in die rechte Box verschoben.
  • Links liegt jetzt nun noch der Fokus, aber es sind keine Items mehr markiert. D.h. wir setzen nun den Default Button zurück auf IDOK.
  • Jetzt kann der Nutzer erneut ein Item markieren. Der Default-Button wird wieder der Hinzufügen/Entfernen Schalter und die Eingabetaste macht was der Nutzer gerne hätte.
  • Ist kein Item mehr markiert schließt die Eingabetaste wieder über IDOK den Dialog.

Ohne Maus kann man also mit den Pfeiltasten, der Leertaste (evtl. Strg-Taste) und der Eingabetaste diesen Dialog bedienen. Und das sogar intuitiv, denn der entsprechende Default Button wird ja in der UI schön umrandet und hervorgehoben.
Das freut jeden Tastaturfreund. Und man muss gar nichts groß machen mit der Behandlung Eingabetaste.

Damit das Ganze nicht so abstrakt ist, habe ich ein kleines Sample gebaut, dass diese Anwendung zeigt. Es hat keine Implementierung für Drag&Drop aber es macht deutlich, wie man dem Tastaturnutzer entgegen kommen kann indem man die Controls geschickt aktiviert.

  • Add to favorites
  • Google Bookmarks
  • del.icio.us
  • MisterWong.DE
  • Technorati
  • Facebook
  • Live
  • Twitter
HardwareMartin Richter - Mo 28 Dez 2009 16:16

Ich habe schon seit langer Zeit einen MD 81335 HD/DVD-Recorder (Baugleich LG RH188). Ich liebe das Ding, weil ich dann das sehen kann was ich will, ohne Werbung und dann, wenn es in meinen Zeitplan passt.
Den DVD Recorder habe ich nie benutzt, aber den DVD-Player.
Seit einiger Zeit dauerte es immer länger bis DVDs erkannt wurden. Besonders neuere DVDs mochte das MD 81335 gar nicht mehr lesen. Sehr zum Leidwesen meiner Tochter.

Nach etwas Recherche im Netz kam ich zu dem Schluss, dass man DVD Laufwerk einfach vergessen kann. Defekt :!:

Ein entsprechendes Original-Laufwerk war nicht aufzutreiben und auch nicht über den Elektronik-Fachhändler meines Vertrauens. Wenn man aber weiß, dass das MD 81335 ein baugleiches LG-RH188H ist, dann findet man im Netz doch einige hilfreiche Tipps zu diesem Gerät.

Auf der Seite http://ifndef.altervista.org/index_eng.html habe ich dann einige Anleitungen gefunden, wie man das DVD-Laufwerk tauschen kann gegen andere LG kompatible Laufwerke. Ich habe mich bei den vorgeschlagenen Möglichkeiten für ein LG-GSA-H44N entschieden, dass ich für ein Paar Euros auf Ebay ersteigern konnte.

Der Umbau ging dank der tollen bebilderten Anleitung perfekt. Alleine der erste Start des Rekorders klappte nicht. Der alte Recorder hatte keinen Jumper auf dem Master/Slave Selektor gesetzt. So habe ich auch das neue LG-GSA-H44N eingebaut. Dann startet der Rekorder allerdings nicht. Nachdem ich dann erst dachte ich habe einen Fehler beim Zusammenbauen gemacht hatte, habe ich doch noch mal den Jumper gesetzt auf der Master Position. Siehe da, alles geht wieder und DVDs können auch wieder abgespielt werden.

  • Add to favorites
  • Google Bookmarks
  • del.icio.us
  • MisterWong.DE
  • Technorati
  • Facebook
  • Live
  • Twitter
C++ProgrammierenVS 2008VS 2010VS-Tipps&TricksWindows APIMartin Richter - Mo 21 Dez 2009 20:05

Wer sich schon durch die Windows Header gekämpft hat um herauszufinden warum welche Definition einer Struktur oder Funktion in irgend einer Windows Version so oder gar nicht vorhanden ist, der weiß auch wie einem #if, #elif, #else und #endif das Leben schwer machen können, was die Orientierung betrifft.

Netterweise hilft einem eine Funktion, die man nur von Blöcken und verschachtelten Funktionen her kennt Strg+´ (Edit.GotoBrace). Wichtig! Man darf nicht auf der Variable oder Bedingung stehen, sondern muss auf dem Schlüsselwort stehen.

Wenn man auf einer Präprozessor Direktive kann man mit den Tasten die einem zur passenden Klammer bringt zur nachfolgenden Direktive. Und mit dem Festhalten der Umschalttaste kann man den entsprechenden Block auch markieren.

  • Add to favorites
  • Google Bookmarks
  • del.icio.us
  • MisterWong.DE
  • Technorati
  • Facebook
  • Live
  • Twitter
HardwareReal LifeMartin Richter - Fr 18 Dez 2009 16:12

Letzte Woche ist mir ja eine Festplatte kaputt gegangen.
http://blog.m-ri.de/index.php/2009/12/10/mist-festplatte-hinueber/

Das muss ich jetzt korrigieren:
Die Festplatte war nicht defekt, Sie hatte nur einen Defekt im BIOS.

Sven hatte mich in einem Kommentar auf Probleme mit Seagate Festplatten vom Typ Baracuda 7200.11. Genau diesen Typ habe ich (ST3500620AS). Ich hatte auch bereits einen Case beim Fujitsu-Siemens Support eröffnet. Aber einen Versuch die kompletten Daten wieder zu erhalten wäre es ja wert.

Also habe ich bei Seagate angefragt und anhand der Seriennummer war schnell festgestellt, dass die Festplatte betroffen sein könnte. Der Seagate Support hat die Abholung per TNT-Express arrangiert und Montagabend war die Festplatte schon in Amsterdam bei i365. Am Donnerstag war die Platte zurück bei mir. Kostenlos!
Heile mit allen Daten :!: Seagate hat nur die Firmware geflasht.

Wäre es ein anderer Defekt gewesen, hätte Seagate mir ein kostenpflichtiges Angebot für eine Festplattenreparatur gemacht.
Schade, dass mich der Fujitsu-Siemens Support nicht auf diese Möglichkeit hingewiesen hat.

BTW: Mit der Hilfe eines Prüfprogrammes von Seagate habe ich auch alle anderen 6 Festplatten geprüft und anschließend geflashed. Allehatten den den selben fehlerhaften BIOS verwendet.
http://seagate.custkb.com/seagate/crm/selfservice/search.jsp?DocId=207931&NewLang=de&Hilite=

PS: Und nochmal vielen Dank an Sven für seinen sehr nützlichen und hilfreichen Kommentar :!:

  • Add to favorites
  • Google Bookmarks
  • del.icio.us
  • MisterWong.DE
  • Technorati
  • Facebook
  • Live
  • Twitter

Nächste Seite »