Finde den versteckten Goldschatz

Hallo lieber Besucher!

In einzelnen Artikeln dieses Blogs befinden sich Hinweise zu einem verborgenem Piratenschatz aus dem 17. Jahrhundert.

Du wirst in den Artikeln diverse Indizien finden, die sich zu einer schlüssigem Schatzkarte zusammensetzen.

Wir haben Dir dieses Rätsel nicht besonders leicht gemacht, daher sind bereits viele Deiner Vorgänger gescheitert.

Dies ist kein Gewinnspiel, sondern eine echte Schatzsuche!

Ich wünsche Dir viel Erfolg beim Suchen.

Viele Grüße
Björn Karpenstein

IBM Doors DXL: Be resistent against hard coded module paths and names with uniqueID and itemFromID / Vorbeugung von DXL Fehlern durch Verschiebung von Modulen anhand der uniqueID

Problem

In the source code, you can find modulenames with full qualified path+name, what leads to DXL errors in case of a module movement.
Im DXL Code werden Module oft mit ihrem vollem Pfad und Namen hart codiert. Wird das Modul später verschoben, kommt es zu DXL Fehlern.

Ansatz – Approach

– Find out the uniqueID of the Module (here a fictive ALM and UIT Module) / Ermitteln Sie die uniqueID des Moduls
– get the full qualified name of the module / Vollständigen Modulnamen mit Pfad mit itemFromID ( uniqueID ) ermitteln
– open module / Modul laden

Solution – Lösung

Ermittlung der unique ID eines Moduls:

  • Öffnen des Moduls / Open module
  • Öffnen des DXL Fensters / Open DXL window (Menu — Tools — Edit DXL)

Von Modul zu Item ID:

Module m = current;
print uniqueID(m) "";

Von Item ID zu Modul

Item i= itemFromID("4a8aa49d0b7c007e-000424e6");
print fullName i;

Loading of the module / Laden des Modules

// UIT Module ID: 00005771
// ALM Module ID: 0000576e
string moduleID="00005771"; // Es soll das UIT Module geladen werden
string modulePath = fullName itemFromID(moduleID) "";
Module selectedModule=read(modulePath, true, true);

C#.NET: ZIP Dateien entpacken und im Zielverzeichnis ggf. überschreiben / Uncomrpess ZIP to a folder and overwrite existing

Problem

Die ZipFile.ExtractToDirectory(zip,target)-Methode in C# überschreibt keine vorhandenen Dateien, sondern schmeisst eine Exception.
The ZipFile.ExtractToDirectory(zip,target)-method in c# is not overwriting existing files, but throws an exception

Vorraussetzung – Prerequirements

.NET Framework der Version 4.5
Referenzen/References:
System.IO.Compression.dll
System.IO.Compression.FileSystem.dll

You have to import the using

using System.IO.Compression;

Ansatz – Approach

Durch die Iteration über das ZIP-Archiv lassen sich die einzelnen Dateien entpacken, wobei die Methode System.IO.Compression.ZipArchiveEntry.ExtractToFile(string path, bool overwrite) ein Überschreiben erlaubt.

The iteration on System.IO.Compression.ZipArchive with System.IO.Compression.ZipArchiveEntry.ExtractToFile(string path, bool overwrite) allows to overwrite existing files.

Lösung – Solution

public void ZipFileExtractToDirectory(string zipPath, string extractPath)
{
  using(System.IO.Compression.ZipArchive archive = ZipFile.OpenRead(zipPath))
  {
    foreach(ZipArchiveEntry entry in archive.Entries)
    {
      string completeFileName = Path.Combine(extractPath, entry.FullName);
      string directory = Path.GetDirectoryName(completeFileName);

      if (!Directory.Exists(directory))
      {
        Directory.CreateDirectory(directory);
      }
      entry.ExtractToFile(completeFileName, true);
    }
  }
}

ASP.NET asp:GridView gruppieren von identischen Spalten oder nach einer bestimmten Spalte / grouping identical GridView Rows/Cells or by column

Problem

Ein vorsortiertes asp:GridView (Screenshot: Original) soll nach einer Spalte (Screenshot Algorithmus 1) oder nach identischem Inhalt (Screenshot Algorithmus 2) sortiert werden.

Prämisse / Vorraussetzungen

  • Das GridView sollte vorher (z.B. mit ORDER BY-Klausel) vorsortiert werden um die bestmöglichen Ergebnisse zu erzielen.
  • Wenn nach einer Spalte gruppiert wird, sollte diese Spalte erstrangig (also erste Erwähnung in ORDER BY-Klausel) stattfinden.

Ansatz – Approach

  • Erschaffung eines Algorithmus, welcher über die RowSpan-Eigenschaft Zellen miteinander verbindet.
  • Vergleich ob der Text der Vorgängerspalte der gleiche ist
    • JA:
      • Unsichtbarschalten der aktuellen Zeilen
      • inkrement des RowSpan-Wertes der Vorgängerzeile
      • Vorgängerzeile ist nun die einzig Sichtbare
    • Nein: Weitermachen

Lösung – Solution

Vorgehensweise

1.) Auf das GridView klicken
2.) Im Objekt-Inspektor auf „Events/Ereignisse“ (also der Blitz) klicken
3.) Doppelklick auf das Ereignis „OnDataBound“
4.) in die erzeugte Methode kann der folgende Code kopiert werden

Algorithmus 1: GridView-Gruppierung nach einer Spalte

/****************************************
* ASP:GridView Grouping Algorithmus
* Quelle https://www.capri-soft.de/blog
****************************************/
// Nach dieser Spalte soll gruppiert werden
int k = 1;

// Für alle Zeilen (VON UNTEN NACH OBEN)
for (int i = GridView1.Rows.Count - 1; i > 0; i--)
{
  GridViewRow row = GridView1.Rows[i];
  GridViewRow previousRow = GridView1.Rows[i - 1];
  // Für alle Spalten
  for (int j = 0; j < row.Cells.Count; j++)
  {
    if ((row.Cells[k].Text == previousRow.Cells[k].Text) && (row.Cells[j].Text == previousRow.Cells[j].Text))
    {
      if (previousRow.Cells[j].RowSpan == 0)
      {
        if (row.Cells[j].RowSpan == 0)
        {
          previousRow.Cells[j].RowSpan += 2;
        }
        else
        {
          previousRow.Cells[j].RowSpan =
          row.Cells[j].RowSpan + 1;
        }
        row.Cells[j].Visible = false;
      }
    }
  }
}

Algorithmus 2: GridView-Gruppierung für alle identischen Zellen einer GridView-Spalte

/****************************************
* asp:GridView Grouping Algorithmus
* Quelle: https://www.capri-soft.de/blog
****************************************/
// Für alle Zeilen (VON UNTEN NACH OBEN)
for (int i = GridView1.Rows.Count - 1; i > 0; i--)
{
  GridViewRow row = GridView1.Rows[i];
  GridViewRow previousRow = GridView1.Rows[i - 1];
  // Für alle Spalten
  for (int j = 0; j < row.Cells.Count; j++)
  {
    if (row.Cells[j].Text == previousRow.Cells[j].Text)
    {
      if (previousRow.Cells[j].RowSpan == 0)
      {
        if (row.Cells[j].RowSpan == 0)
        {
          previousRow.Cells[j].RowSpan += 2;
        }
        else
        {
          previousRow.Cells[j].RowSpan =
          row.Cells[j].RowSpan + 1;
        }
        row.Cells[j].Visible = false;
      }
    }
  }
}