Laden...
Avatar #avatar-3152.png
TheBrainiac myCSharp.de - Member
Lehramt Informatik & Mathe - Student /dev/null Dabei seit 17.12.2006 795 Beiträge
Benutzerbeschreibung

Forenbeiträge von TheBrainiac Ingesamt 795 Beiträge

14.12.2016 - 10:52 Uhr

Hallo alle.

Habe mich lange nicht mehr im Forum beteiligt, aber nun brauche ich eure Ideen für einen Produktnamen.

Ich habe eine Web-Platform erstellt, die ein TicketSystem (eine Art Forum) und eine Zeiterfassung und -abrechnung beinhaltet. Die Platform ist außerdem so ausgelegt, dass ich in Zukunft leicht weitere Module (geplant ist z.B. ein Mitarbeiter-Lob-Management) hinzufügen kann.

Der "Code-Name" der Platform ist z.Zt. "Indigo", ich hatte auch hier schon einmal eine ähnliche Frage gestellt.

Natürlich sind alle Domains, die in diese Richtung gehen und halbwegs sinnvoll sind belegt.

Nun meine Frage: Habt ihr eine Idee für einen Namen? Mir geht es dabei ausdrücklich nicht um rechtliches oder Patente oder Richtlinien, sondern ausschließlich um eine Art "Brainstorming" zur Namensfindung, da ich absolut keine Idee habe, die noch "verfügbar" ist.

Gruß, Christian.

21.03.2016 - 09:26 Uhr

So wie das in deinem Code-Beispiel aussieht, rufst du einen Indexer X[0] auf. Diese werden (wie Properties auch) beim Debuggen automatisch übersprungen, wenn das entsprechend Konfiguriert wurde. Das kannst du in den Debugger-Einstellungen irgendwo ausstellen.

LG,
Christian.

11.03.2016 - 15:34 Uhr

Du bist hier in Entwicklerforum (und stackoverflow ist auch so'n) daher ist deine Frage absolut OT.

Weis ich. Deswegen auch meine Frage, wo ich meine Frage besser stellen könnte, da ich wie schon gesagt kein gutes Netzwerk-Forum kenne...

Ich habe sowohl "Reconnect at Logon" und "Connect using different Credentials" angehakt.

LG, Christian.

11.03.2016 - 12:17 Uhr

Hallo

@t0ms3n
Deswegen habe ich auch gefragt, wo ich mir ansonste Hilfe holen könnte. Kenne kein entsprechendes Forum o.ä.

@Coffeebean
Danke, dass man Fehlermeldungen extra hervorheben kann war mir neu

@vbprogger
Habe die Share "ganz normal" über die UI im Explorer eingebunden. Und Persistent kommt leider nicht in Frage, da (leider) verschiedene Benutzer am gleichen Client-Konto arbeiten, aber unterschiedliche Berechtigungen für die Share haben sollen. Dementsprechend wäre es legitim, wenn die Share nach jedem Boot nach den Credentials fragt. Aber so wie es aktuell ist muss ich leider die Share jedes mal trennen und neu verbinden.

11.03.2016 - 11:05 Uhr

Hi @ All.

Habe ein Problem mit einer Windows Share auf einem Windows Server 2012 R2.

Habe den Server als DomainController eingerichtet, der auch mehrere Shares hostet. Wenn ich auf die einzelnen Shares verbinde, funktoniert alles korrekt (Authentifizierung mit DomainCredentials, Berechtigungen, etc). Starte ich allerdings den Client neu, bekomme ich folgende Fehlermeldung:

Fehlermeldung:
Fehler bei der erneuten Verbindungsherstellung von Z: mit \MyServer\MyShare
Microsoft Windows Network: Der angegebene Benutzername ist unzulässig.

Die Verbindung wurde nicht wiederhergestellt.

Das Problem ist: Der Benutzername IST KORREKT (hat ja vorher funktioniert). Auch wenn ich die Share manuell trenne und neu hinzufüge, funktioniert alles wie es soll. So lange bis der Client neu startet.

Ich habe die gleiche Frage auch schon hier gepostet, da wurde sie allerdings als OffTopic markiert (warum auch immer)...

Hat jemand eine Idee woran das liegen könnte? Oder wo ich fragen könnte?

LG, Christian.

06.01.2016 - 08:19 Uhr

Also mir geht es eher um letzteres. Ein Patent werde ich mit dieser Anwendung sicherlich nicht erfinden...

Danke schon mal für den Tipp 😃

05.01.2016 - 21:22 Uhr

Hast du den Button korrekt zu irgendeinem Control hinzugefügt? d.h. siehst du den button?

05.01.2016 - 20:31 Uhr

Hi @ All.

Ich stehe kurz davor, eine kommerzielles Produkt zu veröffentlichen. Es handelt sich um eine modularisierte IntraNet-Lösung für Pflegedienste (TicketSystem, Zeiterfassung, später Fuhrpark, Dienstplanung, DMS, etc.).

Ich stehe jetzt vor dem Problem der Namensgebung. Bislang hat das Produkt einen Entwicklungs-Namen. "Indigo"... sehr kreativ.

Wie geht ihr bei sowas vor? Gibt es da Richtlinien? An was muss ich mich da halten?

LG, Christian.

13.11.2015 - 13:32 Uhr
SELECT b.`account`, SUM(b.`test`)
FROM `bookings` AS b
INNER JOIN (SELECT `account`, `month`, MAX(`date`) AS `date`
	FROM `bookings`
	GROUP BY `account`, `month`) AS t
	ON t.`account` = b.`account`
    AND t.`month` = b.`month`
    AND t.`date` = b.`date`
GROUP BY b.`account`

Danke!

13.11.2015 - 11:21 Uhr

verwendetes Datenbanksystem: MySQL

Hi @ All.

Ich habe folgende Tabellenstruktur für Buchungen:

| account | date       | month   | test | ...
| 1       | 2015-01-01 | 2015-01 | 1    | ...
| 1       | 2015-01-02 | 2015-01 | 1    | ...
| 1       | 2015-03-03 | 2015-01 | 1    | ...
| 1       | 2015-02-01 | 2015-02 | 2    | ...
| 1       | 2015-03-01 | 2015-03 | 4    | ...
| 1       | 2015-03-02 | 2015-03 | 4    | ...
| 2       | ...        | ...     | ...  | ...

Ich brauche ein Query, das so gruppiert, dass ich pro account eine Zeile habe mit Summen der übrigen Spalten. Allerdings darf pro month nur die Zeile mit dem höchsten date mit in die Summe einbezogen werden. Das entsprechende date muss nicht zwingend im jeweiligen month liegen.

So soll zum Beispiel hier folgendes raus kommen:

| account | test | ...
| 1       | 7    | ...
| 2       | ...  | ...

Was ich bräuchte wäre so etwas wie folgendes. Nur bin ich mir nicht sicher, wie ich die HAVING-Klausel Formulieren muss, bzw. ob das mit HAVING überhaupt realisierbar ist.

SELECT SUM(test)
FROM bookings
GROUP BY account, month
HAVING date = MAX(date)

LG, Christian.

Test-Umgebung:

CREATE TABLE `bookings` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `account` int(11) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  `month` date DEFAULT NULL,
  `test` int(11) DEFAULT NULL,
  PRIMARY KEY (`ID`)
);
INSERT INTO `bookings` (`ID`, `account`, `date`, `month`, `test`) VALUES (1,1,'2015-01-01 00:00:00','2015-01-01',1);
INSERT INTO `bookings` (`ID`, `account`, `date`, `month`, `test`) VALUES (2,1,'2015-03-02 00:00:00','2015-03-01',4);
INSERT INTO `bookings` (`ID`, `account`, `date`, `month`, `test`) VALUES (3,1,'2015-01-02 00:00:00','2015-01-01',1);
INSERT INTO `bookings` (`ID`, `account`, `date`, `month`, `test`) VALUES (4,1,'2015-03-01 00:00:00','2015-01-01',1);
INSERT INTO `bookings` (`ID`, `account`, `date`, `month`, `test`) VALUES (5,1,'2015-02-01 00:00:00','2015-02-01',2);
INSERT INTO `bookings` (`ID`, `account`, `date`, `month`, `test`) VALUES (6,1,'2015-03-01 00:00:00','2015-03-01',4);
01.04.2015 - 20:46 Uhr

Hi @ All.

Habe mal eine Klasse geschrieben, die genau dieses Problem mit Hilfe des GNU Linear Programming Kit löst.

using System;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;
using System.Text.RegularExpressions;
using System.Collections.Generic;

namespace WPUProWo.Logic
{
	public class GLPKSolver
	{
		private ICourse[] m_Courses = null;
		private IStudent[] m_Students = null;
		private Dictionary <string, ICourse> m_CoursesDict = new Dictionary<string, ICourse> ();
		private Dictionary <uint, IStudent> m_StudentsDict = new Dictionary<uint, IStudent> ();

		public GLPKSolver (ICourse[] courses, IStudent[] students)
		{
			m_Courses = courses;
			m_Students = students;

			foreach (var course in courses) {
				m_CoursesDict.Add (TextHelpers.ValidLettersOnly (course.ID).ToUpper (), course);
			}

			foreach (var student in students) {
				m_StudentsDict.Add (student.ID, student);
			}
		}

		public ISolution Solve ()
		{
			var lpFileName = Path.Combine (Application.StartupPath, "min.lp");

			if (File.Exists (lpFileName)) {
				File.Delete (lpFileName);
			}
			
			var lp = GenerateLP ();
			File.WriteAllText (lpFileName, lp, Encoding.ASCII);

			var psi = new ProcessStartInfo {
				FileName = "glpsol",
				Arguments = "--lp min.lp -o min.sol",
				WorkingDirectory = Path.GetDirectoryName(lpFileName)
			};

			var p = Process.Start (psi);

			while (!p.HasExited) {
				Thread.Sleep (10);
			}

			if (p.ExitCode != 0) {
				return null;
			}

			var sol = File.ReadAllText (Path.Combine (Path.GetDirectoryName (lpFileName), "min.sol"), Encoding.ASCII);

			return ParseSolution (sol);
		}

		private string GenerateLP ()
		{
			var sb = new StringBuilder ();

			GenerateMinimizePart (sb);

			sb.AppendLine ();
			sb.AppendLine ();

			GenerateSubjectToPart (sb);

			sb.AppendLine ();
			sb.AppendLine ();

			GenerateGeneralPart (sb);

			sb.AppendLine ();
			sb.AppendLine ();

			GenerateBinariesPart (sb);

			sb.AppendLine ();
			sb.AppendLine ();

			sb.AppendLine ("END");

			return sb.ToString ();
		}

		private void GenerateMinimizePart (StringBuilder sb)
		{
			sb.AppendLine ("Minimize");
			sb.AppendLine ("\t\\Sum of each student's penalty value");

			sb.Append ("\t");

			foreach (var student in m_Students) {
				sb.AppendFormat ("P_{0} + ", student.ID.ToString ().PadLeft (3, '0'));	
			}

			sb.Remove (sb.Length - 3, 3);
		}

		private void GenerateSubjectToPart (StringBuilder sb)
		{
			sb.AppendLine ("Subject To");
			sb.AppendLine ("\t\\Each student is assigned to exactly one course");

			foreach (var student in m_Students) {
				sb.Append ("\t");

				foreach (var course in m_Courses) {
					sb.AppendFormat ("{0}_{1} + ", TextHelpers.ValidLettersOnly (course.ID).ToLower (), student.ID.ToString ().PadLeft (3, '0'));
				}

				sb.Remove (sb.Length - 3, 3);

				sb.AppendLine (" = 1");
			}

			sb.AppendLine ();
			sb.AppendLine ("\t\\ Define the number of students in each course");

			foreach (var course in m_Courses) {
				sb.Append ("\t");

				foreach (var student in m_Students) {
					sb.AppendFormat ("{0}_{1} + ", TextHelpers.ValidLettersOnly (course.ID).ToLower (), student.ID.ToString ().PadLeft (3, '0'));
				}

				sb.Remove (sb.Length - 3, 3);

				sb.AppendFormat (" - {0}", TextHelpers.ValidLettersOnly (course.ID).ToUpper ());
				sb.AppendLine (" = 0");
			}

			sb.AppendLine ();
			sb.AppendLine ("\t\\ Limit the number of students in each course (min, max)");

			foreach (var course in m_Courses) {
				sb.AppendFormat ("\t{0} >= {1}", TextHelpers.ValidLettersOnly (course.ID).ToUpper (), course.MinAttendants);
				sb.AppendLine ();
				sb.AppendFormat ("\t{0} <= {1}", TextHelpers.ValidLettersOnly (course.ID).ToUpper (), course.MaxAttendants);
				sb.AppendLine ();
			}

			sb.AppendLine ();
			sb.AppendLine ("\t\\Define the penalty of each student based in his wished");

			foreach (var student in m_Students) {
				sb.Append ("\t");

				foreach (var course in m_Courses) {
					var penalty = 1000;

					if (course.ID == student.ThirdChoice) {
						penalty = 100;
					} else if (course.ID == student.SecondChoice) {
						penalty = 10;
					} else if (course.ID == student.FirstChoice) {
						penalty = 1;
					}

					sb.AppendFormat ("{2} {0}_{1} + ", TextHelpers.ValidLettersOnly (course.ID).ToLower (), student.ID.ToString ().PadLeft (3, '0'), penalty);
				}

				sb.Remove (sb.Length - 3, 3);

				sb.AppendFormat (" - P_{0}", student.ID.ToString ().PadLeft (3, '0'));

				sb.AppendLine (" = 0");
			}
		}

		private void GenerateGeneralPart (StringBuilder sb)
		{
			sb.AppendLine ("General");

			foreach (var student in m_Students) {
				sb.AppendFormat ("\tP_{0}", student.ID.ToString ().PadLeft (3, '0'));
				sb.AppendLine ();
			}

			foreach (var course in m_Courses) {
				sb.AppendFormat ("\t{0}", TextHelpers.ValidLettersOnly (course.ID).ToUpper ());
				sb.AppendLine ();
			}
		}

		private void GenerateBinariesPart (StringBuilder sb)
		{
			sb.AppendLine ("Binaries");

			foreach (var course in m_Courses) {
				foreach (var student in m_Students) {
					sb.AppendFormat ("\t{0}_{1}", TextHelpers.ValidLettersOnly (course.ID).ToLower (), student.ID.ToString ().PadLeft (3, '0'));
					sb.AppendLine ();
				}
			}
		}

		private ISolution ParseSolution (string text)
		{
			var lines = GetLines (text);
			var penalties = new Dictionary<uint, Line> ();
			var choices = new Dictionary<uint, List<Line>> ();
			var courses = new Dictionary<string, Line> ();
			var penaltyRegex = new Regex (@"^P_(?<ID>\d+)$", RegexOptions.Compiled);
			var choiceRegex = new Regex (@"^\w+_(?<ID>\d+)$", RegexOptions.Compiled);
			var courseRegex = new Regex (@"^\w+$", RegexOptions.Compiled);

			foreach (var line in lines) {
				var penaltyMatch = penaltyRegex.Match (line.RowName);
				var choiceMatch = choiceRegex.Match (line.RowName);

				if (penaltyMatch.Success) {
					var studentID = Convert.ToUInt32(penaltyMatch.Groups ["ID"].Value);

					penalties.Add (studentID, line);
				} else if (choiceMatch.Success) {
					var studentID = Convert.ToUInt32(choiceMatch.Groups ["ID"].Value);					

					if (!choices.ContainsKey (studentID)) {
						choices.Add(studentID, new List<Line>());
					}

					choices[studentID].Add (line);
				} else if (courseRegex.IsMatch (line.RowName)) {
					courses.Add (line.RowName, line);
				}
			}

			foreach (var pair in penalties) {
				m_StudentsDict [pair.Key].Penalty = pair.Value.Activity;
			}

			foreach (var pair in choices) {
				var course = "";

				foreach (var line in pair.Value) {
					if (line.Activity == 1) {
						course = line.RowName;

						break;
					}
				}

				course = course.Substring (0, course.IndexOf ("_")).ToUpper();

				m_StudentsDict [pair.Key].Assigned = m_CoursesDict [course].ID;
			}

			foreach (var pair in courses) {
				m_CoursesDict [pair.Key.ToUpper()].RealAttendants = pair.Value.Activity;
			}

			return new Solution {
				Courses = m_Courses,
				Students = m_Students
			};
		}

		private Line[] GetLines (string text)
		{
			var lines = text.Replace ("\r\n", "\n").Replace ("\r", "\n").Split ('\n');
			var list = new List<Line> ();			
			var headersFound = 0;
			var headersRegex = new Regex (@"^(-|\s)+$", RegexOptions.Compiled);

			foreach (var line in lines) {
				if (headersRegex.IsMatch (line)) {
					headersFound++;

					continue;
				}

				if (headersFound == 2 && line.Trim () != "") {
					var parsed = ParseLine(line);

					if (parsed != null) {
						list.Add(parsed);
					}
				} else if (headersFound == 2 && line.Trim () == "") {
					headersFound++;
				}
			}

			return list.ToArray ();
		}

		private Line ParseLine (string text)
		{
			var lineRegex = new Regex (@"^\s*(?<Number>\d+)\s*(?<RowName>\w+(_\d+)?)\s*\*\s*(?<Activity>\d+)\s*(?<LowerBound>\d+)\s*(?<UpperBound>\d*).*?$", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
			var match = lineRegex.Match (text);

			if (match.Success) {
				return new Line {
					Number = Convert.ToInt32(match.Groups ["Number"].Value),
					RowName = match.Groups ["RowName"].Value,
					Activity = Convert.ToInt32(match.Groups ["Activity"].Value)
				};
			}

			return null;
		}

		private class Line
		{
			public int Number { get; set; }
			public string RowName { get; set; }
			public int Activity { get; set; }
		}

		private class Solution : ISolution
		{
			public IStudent[] Students { get; set; }

			public ICourse[] Courses { get; set; }
		}
	}

	public interface IStudent {
		uint ID { get; }

		string FirstChoice { get; }
		string SecondChoice { get; }
		string ThirdChoice { get; }

		string Assigned { set; }
		int Penalty { set; }
	}

	public interface ISolution {
		IStudent[] Students { get; }
		ICourse[] Courses { get; }
	}

	public interface ICourse {
		string ID { get; }
		int MinAttendants { get; }
		int MaxAttendants { get; }
		int RealAttendants { set; }
	}

	public static class TextHelpers
	{
		public static string ValidLettersOnly(string text) {
			var normalized = text.Normalize(NormalizationForm.FormKD);
			var sb = new StringBuilder();

			foreach (var chr in normalized) {
				var info = CharUnicodeInfo.GetUnicodeCategory (chr);

				if (info == UnicodeCategory.LowercaseLetter || info == UnicodeCategory.UppercaseLetter) {
					sb.Append(chr);
				}
			}

			return sb.ToString();
		}
	}
}

@zommi:

Nochmal VIELEN DANK! Ich hätte das alleine nie hinbekommen bzw. wäre nie auf die Idee gekommen, GLPK zu verwenden...

Gruß,
Christian.

31.03.2015 - 20:27 Uhr

Hi, Zommi.

Erstmal: WOW...

Habe das ganze jetzt nur überflogen, da ich schon von der Arbeit zuhause bin, aber ich werde mich morgen dann mal da rein fuchsen.

Schon mal im voraus TAUSEND DANK für dein Bemühen!

Liebe Grüße,
Christian.

30.03.2015 - 20:05 Uhr

Hi @ All.

Nachdem ich lange nicht mehr im Forum aktiv war, habe ich mal wieder eine Frage an die Community.

Folgende Problemstellung:

Ich habe eine Liste von Kursen mit Bedingungen (Maximale / Minimale Anzahl an Teilnehmern) und eine Liste von Teilnehmern, die jeweils eine Erstwahl, Zweitwahl und eine Drittwahl angeben können.

Jetzt möchte ich jeden der Teilnehmer in genau einen Kurs einteilen, bestenfalls natürlich in seine Erstwahl. Ebenso sollen bestenfalls alle Kurse stattfinden (d.h. jeder Kurs soll mindestens seine Minimale Anzahl an Teilnehmern haben).

Meine Vorgehensweise bisher:

Ich weise zunächst jedem Teilnehmer seine Erstwahl zu und schaue dann, was ich ändern muss. Hierbei suche ich mir Kurse, die mit der Erstwahl überbelegt sind und werfe (zufällig) Personen raus, bis der Kurs eine gültige Teilnehmerzahl hat. Die rausgeworfenen Personen bekommen nun ihre Zweitwahl zugeteilt und der Spaß beginnt von vorne. Problem hierbei: Die Zweitwahl kann wieder dafür sorgen, dass (andere) Kurse zu voll sind. Dafür gibt es zum Glück die Drittwahl. Was mache ich aber, wenn die Kursbelegung auch nach der Drittwahl immer noch nicht stimmt?

Meine Frage: Gibt es für solche Probleme schon bestehende Schemata / Algorithmen (bestimmt), wenn ja, nach was muss ich suchen?

Wenn nein, kann mir jemand einen Tipp geben, wie ich das besser handhaben kann?

Mit freundlichen Grüßen,
Christian.

06.02.2015 - 09:44 Uhr

Grafiktreiber?
Stecker (DVI/HDMI) kaputt?
Grafikkarte kaputt?

01.02.2015 - 19:51 Uhr

Hallo, herbivore.

Auch von mir ein herzliches Dankeschön für dein Engagement. Ich bin inzwischen seit fast 9 Jahren Mitglied in diesem Forum (und zwar inzwischen berufsbedingt nur noch sehr selten hier unterwegs) und habe deine konstruktiven Beiträge schon von Anfang an immer sehr wertgeschätzt.

Ich glaube auch, dass mit den vier neuen Administratoren eine gute Wahl getroffen wurde. Ihr packt das!

Liebe Grüße,
Christian.

23.09.2014 - 17:34 Uhr

Genauere Infos:

Die Ursprüngliche Anwendung für das Gerät liefert folgenden Output:

Device (1) - Connect tcpip    [192.168.178.123]    [5005]
    success

Device (1) - Lock
    success

Device (1) - Download Data
    2014-08-01 to 2014-09-23
    get to memory (1)
    User ID(1)    Date Time(2014-09-19 12:57:11)    Direction(in)    (no record)    (database)
    User ID(1)    Date Time(2014-09-19 12:57:17)    Direction(in)    (no record)    (database)
    User ID(1)    Date Time(2014-09-19 12:57:22)    Direction(out)    (no record)    (database)
    User ID(1)    Date Time(2014-09-19 12:57:28)    Direction(out)    (no record)    (database)
    User ID(1)    Date Time(2014-09-19 13:46:44)    Direction(in)    (no record)    (database)
    User ID(3)    Date Time(2014-09-22 12:38:58)    Direction(in)    (no record)    (database)
    User ID(3)    Date Time(2014-09-22 12:39:01)    Direction(in)    (no record)    (database)
    User ID(3)    Date Time(2014-09-22 12:39:02)    Direction(in)    (no record)    (database)
    User ID(4)    Date Time(2014-09-22 12:39:04)    Direction(in)    (no record)    (database)
    User ID(4)    Date Time(2014-09-22 12:39:06)    Direction(in)    (no record)    (database)
    User ID(3)    Date Time(2014-09-22 12:39:09)    Direction(in)    (no record)    (database)
    User ID(3)    Date Time(2014-09-22 12:39:11)    Direction(in)    (no record)    (database)
    User ID(4)    Date Time(2014-09-22 12:39:14)    Direction(in)    (no record)    (database)
    User ID(3)    Date Time(2014-09-22 12:39:16)    Direction(in)    (no record)    (database)
    User ID(3)    Date Time(2014-09-23 13:31:27)    Direction(in)    (no record)    (database)
    User ID(3)    Date Time(2014-09-23 13:31:31)    Direction(in)    (no record)    (database)
    User ID(3)    Date Time(2014-09-23 13:47:30)    Direction(in)    (no record)    (database)
    User ID(3)    Date Time(2014-09-23 13:47:31)    Direction(in)    (no record)    (database)
    User ID(3)    Date Time(2014-09-23 13:47:32)    Direction(in)    (no record)    (database)
    User ID(3)    Date Time(2014-09-23 13:47:33)    Direction(in)    (no record)    (database)
    done (0)

Device (1) - Set Time
    2014-09-23 13:48:03

Der TCP/IP-Data-Traffic sieht wie folgt aus (Jeweils Request und Response):

55aa0180000000000000ffff00000100
aa550101000000000000

55aa0113000000000000000030000200
aa55010100000000000055aa0201300035092804ee0400000201010201010101b80b0000b80b0000b80b0000e8030000a086010002010201020000000121

55aa0181000000000000ffff00000300
aa550101000000000000

55aa01b4080000000000ffff00000400
aa550101140000000000

55aa01a40000000014000000f0000500
aa55010100000000000055aa0221000b01000000de9793e502a1001101000000de9793e50261001601000000de9793e502e1001c01000000de9793e50121002c01000000de97b3b90121003a03000000de9796990121000103000000de97969d0121000203000000de97969d0121000404000000de97969d0121000604000000de97969d0121000903000000de97969d0121000b03000000de97969d0121000e04000000de97969d0121001003000000de97969d0121001b03000000de97b77d0121001f03000000de97b77d0121001e03000000de97b7bd0121001f03000000de97b7bd0121002003000000de97b7bd0121002103000000de97b7bd0000

55aa01b300000000000000000800060055aade070917020d30030000
aa550101000000000000

55aa0181010000000000ffff00000700
aa550101000000000000

Meine Daten oben stammen aus der 5. Response (abzüglich der Konstante [aa55010100000000000055aa0221]am Anfang).

23.09.2014 - 17:23 Uhr

Hi @ All 😃

Habe ein kleines Problem:

Ich lese von einer TCP/IP-Verbindung (FixedWidth-)Daten aus einem Gerät aus.

Die Datensätze sehen wie folgt aus:

 ?  |uid | ?  | date    | ?  
000B 0100 0000 DE97 93E5 02A1
0011 0100 0000 DE97 93E5 0261
0016 0100 0000 DE97 93E5 02E1
001C 0100 0000 DE97 93E5 0121
002C 0100 0000 DE97 B3B9 0121

003A 0300 0000 DE97 9699 0121
0001 0300 0000 DE97 969D 0121
0002 0300 0000 DE97 969D 0121
0004 0400 0000 DE97 969D 0121
0006 0400 0000 DE97 969D 0121
0009 0300 0000 DE97 969D 0121
000B 0300 0000 DE97 969D 0121
000E 0400 0000 DE97 969D 0121
0010 0300 0000 DE97 969D 0121

001B 0300 0000 DE97 B77D 0121
001F 0300 0000 DE97 B77D 0121
001E 0300 0000 DE97 B7BD 0121
001F 0300 0000 DE97 B7BD 0121
0020 0300 0000 DE97 B7BD 0121
0021 0300 0000 DE97 B7BD 0000

Darin stecken folgende Informationen (die UserID's stimmen auch in den jeweiligen Zeilen überein und zwischen entsprechenden Zeilen mit Sprung im Datum gibt es auch im Hex-Code einen entsprechenden Sprung):

uid | date              | dir
1    2014-09-19 12:57:11 in   
1    2014-09-19 12:57:17 in   
1    2014-09-19 12:57:22 out  
1    2014-09-19 12:57:28 out  
1    2014-09-19 13:46:44 in   

3    2014-09-22 12:38:58 in   
3    2014-09-22 12:39:01 in   
3    2014-09-22 12:39:02 in   
4    2014-09-22 12:39:04 in   
4    2014-09-22 12:39:06 in   
3    2014-09-22 12:39:09 in   
3    2014-09-22 12:39:11 in   
4    2014-09-22 12:39:14 in   
3    2014-09-22 12:39:16 in   

3    2014-09-23 13:31:27 in   
3    2014-09-23 13:31:31 in   
3    2014-09-23 13:47:30 in   
3    2014-09-23 13:47:31 in   
3    2014-09-23 13:47:32 in   
3    2014-09-23 13:47:33 in   

Allerdings finde ich keine Möglichkeit, das Datum zu parsen. Ich vermute, dass es irgendwie in den ersten beiden der letzten drei 4-Tupel eines jeden Datensatzes steckt, allerdings kriege ich es nicht geparst.

Ich habe auch leider keine Spezifikation des Geräts, das auf das verwendete Datumsformat schließen lässt. Habe schon einiges (wie Unix-TimeStamps etc.) probiert.

Hat von euch jemand einen Tipp / eine Anregung?

Gruß, Christian.

08.07.2014 - 17:20 Uhr

Hallo. Habe das Problem beseitigt.

Du musst an deine TextBox zwei EventHandler mit folgendem Code anhängen:

private void textBox1_Enter(object sender, EventArgs e)
{
	m_Shortcuts.SuppressKeyPress = false;
	m_Shortcuts.SetHandled = false;
}

private void textBox1_Leave(object sender, EventArgs e)
{
	m_Shortcuts.SuppressKeyPress = true;
	m_Shortcuts.SetHandled = true;
}

Download im ersten Post angepasst.

Gruß, Christian.

09.04.2014 - 16:30 Uhr

absolut empfehlenswert.

Habe die Tastatur jetzt auch schon über 3 Jahre im Einsatz, bin nach wie vor sehr begeistert von ihr.

02.10.2013 - 12:46 Uhr

Ahhhhh,

PARTITION BY war das Stichwort...

Danke!

01.10.2013 - 11:44 Uhr

Was du machen könntest, wäre den Ordner in dem die DB liegt, fest in einen lokalen Ordner zu mounten.

01.10.2013 - 11:22 Uhr

.Net-Anwendungen haben nicht immer die Berechtigungen, auf Netzlaufwerke zuzugreifen. Kann also ein generelles Berechtigungsproblem sein und nix mit SQLite zu tun haben.

01.10.2013 - 10:24 Uhr

verwendetes Datenbanksystem: TSQL

Hi @ All.

Kleines Problem. Habe eine Abfrage, die schematisch etwa Folgendes liefert:

ID	Value
1	a
1	b
2	c
3	d
3	e

Nun brauche ich aber Folgendes:

ID	Value	Number
1	a	1
1	b	2
2	c	1
3	d	1
3	e	2

Wie kann ich die letzte Spalte bewerkstelligen? Ich brauche praktisch irgendwas, dass die Zeilen mit der gleichen ID hochzählt...

Gruß, Christian.

08.08.2013 - 22:42 Uhr

Das entsprechende RegEx sollte so aussehen:

^
P
(
(?<Years>\d+Y(?<N>))?           # If matched, Push To "N"-Stack
(?<Months>\d+M(?<N>))?          # If matched, Push To "N"-Stack
(?<Days>\d+D(?<N>))?            # If matched, Push To "N"-Stack
)
(
T
(?<Hours>\d+H(?<N>))?           # If matched, Push To "N"-Stack
(?<Minutes>\d+M(?<N>))?         # If matched, Push To "N"-Stack
(?<Seconds>\d*.?\d+S(?<N>))?    # If matched, Push To "N"-Stack    
)
$
(?<-N>){1}                      # Decrement "N"-Stack by one (Cause Match to fail if not at least once pushed to)

Gruß, Christian.

01.06.2013 - 16:42 Uhr

Das kommt darauf an, wie du das Modul ausgeliefert bekommst. Meistens sind es nur ganz normale Assemblies und die entsprechenden ASPX-Dateien. Diese kannst du einfach so öffnen. Für die Assemblies musst du dann schon einen (geringfügig) größeren Aufwand auf dich nehmen und diese mit Reflector oder ähnlichem dekompilieren. Allerdings kannst du von den meisten DNN-Modulen auch die SourceCode-Variante herunterladen oder für einen Aufpreis erwerben.

Gruß, Christian.

26.05.2013 - 11:40 Uhr

Wie wäre es mit sowas (sehr verkürzte Form):

public interface IProject {
    string Path { get; }
    string Active { get; }
}

private class ConcreteProject : IProject {
    public string Path { get; set; }
    public string Active { get; set; }
}

public class Logic {
    public IProject CreateProject(string path) {
        return new ConcreteProject { Path = path; Active = false; };
    }
    public void SetProjectActiveStatus(IProject p, bool a) {
        ((ConcreteProject)p).Active = a;
    }
}

Gruß, Christian.

29.04.2013 - 11:09 Uhr

Hi @ All 😃

Ich hänge gerade an folgender Aufgabe:

Bei einer Testgruppe stellte man fest, dass 42% der Personen noch nie Ski gelaufen sind, dass 58% der Personen noch nie geflogen sind und dass 29% der Personen schon geflogen und Ski gelaufen sind.

Welche Wahrscheinlichkeit ist höher?*Jemanden zu treffen, der Ski gelaufen ist aus der Gruppe der noch nie geflogenen *Jemanden zu treffen, der geflogen ist aus der Gruppe der noch nie Ski gelaufenen

Meine bisherigen Überlegungen:


S := Die Leute, die Ski gelaufen sind (in %)
G := Die Leute, die geflogen sind (in %)

!S      = 42%
!G      = 58%
 S ^  G = 29%
!S v !G = 100% - S ^ G = 71%

Gesucht:

a :=  S ^ !G = ?
b := !S ^  G = ?

Irgendwie komme ich jetzt nicht weiter...

Hat vllt jemand von euch einen Tipp für mich?

Gruß, Christian.

14.04.2013 - 14:08 Uhr

Mach mal Rechtsklick auf die Solution, dann "Clean Solution", dann "Rebuild Solution".

Wenn das nicht funktioniert, lösche mal die Referenz von "Core" in server_app und füge sie neu hinzu.

Wenn das nicht funktioniert... Vllt sind die Framework-Versionen der beiden Projekte inkompatibel (Core ist .Net 4, server_app .Net 2) oder sowas?

Im Error-Fenster werden noch 4 Warnungen angezeigt, die aber ausgeblendet sind. Was besagen die?

Gruß, Christian.

28.03.2013 - 09:26 Uhr

Ist vllt. MinimumSize der Form gesetzt?

18.03.2013 - 18:33 Uhr

Du könntest dir ein Tool schreiben, dass den automatischen Sync von der DropBox an/ausschaltet und das im PRE-/POST-Build aufrufen...

Google-Suche nach dropbox programatically pause sync

Gruß, Christian.

08.02.2013 - 11:15 Uhr

Ein Timer ist denke ich das, was du suchst.

Außerdem solltest du das Wait-Fenster nicht immer neu instanzieren...

Gruß, Christian.

13.12.2012 - 23:17 Uhr

Danke 😃

Geht jetzt in der Tat einwandfrei!

Geänderter Server-Code:

ZyanComponentHost.LegacyBlockingEvents = true;

using (ZyanComponentHost host = new ZyanComponentHost("MessageService", 48879))
{
    // Alles andere wie oben
}

Gruß, Christian.

07.12.2012 - 11:08 Uhr

Nein, daran liegts nicht, habs gerade ausprobiert. Hätte mich auch sehr gewundert, da ich eigentlich auch der Meinung von Peter bin.

Gruß, Christian.

03.12.2012 - 11:38 Uhr

leider habe ich einmal pro Halbjahr das Problem dass das Headset anfängt zu Summen...

Das Headset hat unten eine Reset-Taste, die man mit ner Büroklammer betätigen kann. Das Problem hatte ich auch mal, aber nach einem Reset hat sich das gegeben.

02.12.2012 - 23:06 Uhr

Logitech G930 Gaming HeadSet

Alle Bereiche 5 Punkte 😃

Gruß, Christian.

01.12.2012 - 16:08 Uhr

Hi @ All.

Heute hab ich mal ein bisschen mit dem Zyan Framework rumgespielt.

Habe versucht, das MiniChat-Beispiel-Projekt nachzubauen. Funktioniert aber nicht ganz, da Folgendes passiert:
1.Server startet, alles okay 1.Erster Client startet, User meldet sich an, alles okay, User kann Nachrichten senden und diese werden auch beim User angezeigt. 1.Zweiter Client startet, User meldet sich an 1.Jetzt werden aber alle Nachrichten nur noch beim zweiten Client doppelt (?!) angezeigt, und beim ersten Client gar keine mehr...

Das ist der Code von Client, der mehrmals ausgeführt wird:

m_Connection = new ZyanConnection("tcp://localhost:48879/MessageService");

m_MessageService = m_Connection.CreateProxy<IMessageService>();
m_MessageService.MessageReceived += AppendText;

private void AppendText(string nickname, string message)
{
    if (InvokeRequired)
    {
        Invoke(new Action<string, string>(AppendText), nickname, message);
        return;
    }

    m_tbxChatHistory.AppendText(String.Format("[{0}] {1}{2}", nickname, message, Environment.NewLine));
}

private void btnSendMessage_Click(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(x =>
    {
        m_MessageService.SendMessage(m_NickName, GetTextAndClear());
    });
}

Hier der Server (Konsolen-Anwendung)

using (ZyanComponentHost host = new ZyanComponentHost("MessageService", 48879))
{
    host.RegisterComponent<IMessageService, MessageService>(ActivationType.Singleton);

    Console.WriteLine("Starting Server");

    while (true)
    {
        Console.ReadKey(true);
    }

    Console.WriteLine("Shutting down Server");
}

Und zuguterletzt der Service selbst:

public void SendMessage(string nickname, string message)
{
    Console.WriteLine("[{0}] {1}", nickname, message);

    if (MessageReceived != null)
    {
        MessageReceived(nickname, message);
    }
}

public event Action<string, string> MessageReceived;

Ist m.M.n. genau der gleiche Code wie im Beispiel, nur dass er nicht funktioniert...

Hat jemand eine Idee, warum?

Gruß und danke schonmal, Christian.

27.11.2012 - 11:26 Uhr

Vielleich hilft dir das hier AppDomain.AssemblyResolve Event in Verbindung hiermit Activator.CreateInstance Method (AppDomain, String, String) weiter?

Gruß, Christian.

19.11.2012 - 22:00 Uhr

Ein toller Artikel zum im Titel genannten Thema, den ich euch nicht vorenthalten wollte: Fun With .NET Regex Balancing Groups

Gruß, Christian.

30.10.2012 - 15:02 Uhr

Darf man bei Ungleichungen der Form a^m>=b^m auf beiden Seiten die m-te Wurzel ziehen?

Gruß, Christian.

28.10.2012 - 11:35 Uhr
using System;
using System.IO;
using System.Collections.Generic;

public class MyClass
{
    public static void Main()
    {
        string path1 = @"C:\temp\1.ini",
               path2 = @"C:\temp\2.ini",
               path3 = @"C:\temp\3.ini";

        using (Stream file1 = File.OpenRead(path1),
                      file2 = File.OpenRead(path2),
                      file3 = File.OpenWrite(path3))
        using (TextReader reader1 = new StreamReader(file1),
                          reader2 = new StreamReader(file2))
        using (TextWriter writer = new StreamWriter(file3))
        {
            GetDifferences(reader1, reader2, writer);

            writer.Flush();
            writer.Close();
            reader1.Close();
            reader2.Close();
        }
    }

    static void GetDifferences(TextReader reader1, TextReader reader2, TextWriter writer)
    {
        Dictionary<string, Dictionary<string, string>> file1 = new Dictionary<string, Dictionary<string, string>>(),
                                                       file2 = new Dictionary<string, Dictionary<string, string>>(),
                                                       diff = null;

        ReadIni(reader1, file1);
        ReadIni(reader2, file2);

        diff = DiffIni(file1, file2);

        WriteIni(writer, diff);
    }

    static void ReadIni(TextReader r, Dictionary<string, Dictionary<string, string>> d)
    {
        string line = null,
               category = null;

        while ((line = r.ReadLine()) != null)
        {
            if (line.StartsWith("[") && line.EndsWith("]"))
            {
                category = line.Substring(1, line.Length - 2);

                d.Add(category, new Dictionary<string, string>());
            }
            else if (line.Contains("="))
            {
                string key = line.Substring(0, line.IndexOf("=")),
                       value = line.Substring(line.IndexOf("=") + 1);

                d[category].Add(key, value);
            }
        }
    }

    static Dictionary<string, Dictionary<string, string>> DiffIni(Dictionary<string, Dictionary<string, string>> f1, Dictionary<string, Dictionary<string, string>> f2)
    {
        Dictionary<string, Dictionary<string, string>> result = new Dictionary<string, Dictionary<string, string>>();

        foreach (KeyValuePair<string, Dictionary<string, string>> category in f2)
        {
            if (f1.ContainsKey(category.Key))
            {
                foreach (KeyValuePair<string, string> key in category.Value)
                {
                    if (!f1[category.Key].ContainsKey(key.Key) || f1[category.Key][key.Key] != key.Value)
                    {
                        if (!result.ContainsKey(category.Key))
                        {
                            result.Add(category.Key, new Dictionary<string, string>());
                        }

                        result[category.Key].Add(key.Key, key.Value);
                    }
                }
            }
            else
            {
                result.Add(category.Key, category.Value);
            }
        }

        return result;
    }

    static void WriteIni(TextWriter w, Dictionary<string, Dictionary<string, string>> d)
    {
        foreach (KeyValuePair<string, Dictionary<string, string>> category in d)
        {
            w.WriteLine("[{0}]", category.Key);

            foreach (KeyValuePair<string, string> key in category.Value)
            {
                w.WriteLine("{0}={1}", key.Key, key.Value);
            }
        }
    }
}
10.10.2012 - 23:45 Uhr

In der Form ist ein TabControl, und in einer von den TabPages eine RichTextBox? Dann setze einfach Dock von der RichTextBox auch auf Fill.

Gruß, Christian.

30.09.2012 - 20:26 Uhr

Die (0,0) Koordinate ist in WinForms oben links in der Ecke und X wird nach rechts bzw. Y nach unten größer.

Und PictureBoxen sind für Spiele ne Schlechte Idee. Siehe hier:[Tutorial] Zeichnen in Windows-Forms-Programmen (Paint/OnPaint, PictureBox)

Gruß, Christian.

27.09.2012 - 18:42 Uhr

Hi 😃

Für DNN gibt es eine (sehr) große Community und bereits Module für die unterschiedlichsten Sachen. Eigtl alles, was du dir vorstellen kannst. Guck dir da vllt mal SnowCovered an.

Im speziellen gibt es bereits fertige Module, die mit Reports umgehen können. Diese können aus einem WebService, einer Xml-Datei, einer DB direkt oder woher auch immer kommen.

Ich denke, dass du für deinen Verwendungszweck schon was fertiges finden und um die Programmierung wahrscheinlich komplett drum herum kommen wirst.

Insbesondere vllt was davon: DNN Suche nach "dynamic report"

Gruß, Christian.

24.09.2012 - 16:27 Uhr

EDIT: Habe IComparable sowie Vergleichsoperatoren implementiert.

24.09.2012 - 00:18 Uhr

Beschreibung:

Angeregt von Präzises Rechnen mit Nachkommastellen habe ich ein bisschen rumgebastelt und dabei "zufällig" 8) eine Klasse zur Rechnung mit Brüchen erstellt. Wollte sie euch nicht vorenthalten.

public struct Fraction : IFormattable, IEquatable<Fraction>, IComparable<Fraction>
{
    private BigInteger m_Sign;
    private BigInteger m_Numerator;
    private BigInteger m_Denominator;

    public Fraction(BigInteger numerator, BigInteger denominator)
    {
        if (denominator == BigInteger.Zero)
            throw new DivideByZeroException();

        if (numerator != BigInteger.Zero)
        {
            var n = BigInteger.Abs(numerator);
            var d = BigInteger.Abs(denominator);

            var gcd = GreatestCommonDivisor(n, d);

            m_Numerator = n / gcd;
            m_Denominator = d / gcd;
            m_Sign = GetSign(numerator) * GetSign(denominator);
        }
        else
        {
            m_Numerator = BigInteger.Zero;
            m_Denominator = BigInteger.One;
            m_Sign = BigInteger.One;
        }
    }

    public BigInteger Sign { get { return m_Sign; } }
    public BigInteger Numerator { get { return m_Numerator; } }
    public BigInteger Denominator { get { return m_Denominator; } }
    public bool IsPositive { get { return m_Sign == BigInteger.One; } }
    public bool IsNegative { get { return m_Sign == BigInteger.MinusOne; } }
    public bool IsZero { get { return m_Numerator == BigInteger.Zero; } }
    public bool IsRational { get { return m_Denominator != BigInteger.One; } }
    public bool IsInteger { get { return m_Denominator == BigInteger.One; } }
    public decimal DecimalValue { get { return (decimal)m_Numerator / (decimal)m_Denominator; } }

    public Fraction Inverse()
    {
        return new Fraction(m_Sign * m_Denominator, m_Numerator);
    }

    public override string ToString()
    {
        return ToString("");
    }

    public string ToString(string format, IFormatProvider provider = null)
    {
        var sign = IsNegative ? "-" : "";

        switch (format)
        {
            case null:
            case "":
                if (IsZero)
                    return "0";

                if (IsInteger)
                    return sign + m_Numerator.ToString();

                goto case "F";
            case "D":
                return sign + DecimalValue.ToString();
            case "F":
                return sign + m_Numerator.ToString() + "/" + m_Denominator.ToString();
            default:
                throw new FormatException(String.Format("\"{0}\" is not a valid format for fractions!", format));
        }
    }

    public override bool Equals(object obj)
    {
        if (obj is Fraction)
        {
            return Equals((Fraction)obj);
        }

        return false;
    }

    public bool Equals(Fraction other)
    {
        return this == other;
    }

    public int CompareTo(Fraction other)
    {
        if (this > other)
        {
            return 1;
        }
        else if (this < other)
        {
            return -1;
        }
        else
        {
            return 0;
        }
    }

    public override int GetHashCode()
    {
        var signBytes = m_Sign.ToByteArray();
        var numeratorBytes = m_Numerator.ToByteArray();
        var denominatorBytes = m_Denominator.ToByteArray();
        var allBytes = new byte[signBytes.Length + numeratorBytes.Length + denominatorBytes.Length];

        Array.Copy(signBytes, 0, allBytes, 0, signBytes.Length);
        Array.Copy(numeratorBytes, 0, allBytes, signBytes.Length, numeratorBytes.Length);
        Array.Copy(denominatorBytes, 0, allBytes, signBytes.Length + numeratorBytes.Length, denominatorBytes.Length);

        return new BigInteger(allBytes).GetHashCode();
    }

    private static BigInteger GetSign(BigInteger a)
    {
        return a < BigInteger.Zero ? BigInteger.MinusOne : BigInteger.One;
    }

    private static BigInteger GreatestCommonDivisor(BigInteger a, BigInteger b)
    {
        BigInteger t;

        if (a > b)
        {
            t = b;
            b = a;
            a = t;
        }

        while (b != 0)
        {
            t = a % b;
            a = b;
            b = t;
        }

        return a;
    }

    public static Fraction operator -(Fraction a)
    {
        return new Fraction(BigInteger.MinusOne * a.m_Sign * a.m_Numerator, a.m_Denominator);
    }

    public static Fraction operator +(Fraction a, Fraction b)
    {
        return new Fraction(a.m_Sign * a.m_Numerator * b.m_Denominator + b.m_Sign * b.m_Numerator * a.m_Denominator, a.m_Denominator * b.m_Denominator);
    }

    public static Fraction operator -(Fraction a, Fraction b)
    {
        return a + -b;
    }

    public static Fraction operator *(Fraction a, Fraction b)
    {
        return new Fraction(a.m_Sign * b.m_Sign * a.m_Numerator * b.m_Numerator, a.m_Denominator * b.m_Denominator);
    }

    public static Fraction operator /(Fraction a, Fraction b)
    {
        return a * b.Inverse();
    }

    public static bool operator ==(Fraction a, Fraction b)
    {
        return a.m_Sign == b.m_Sign && a.m_Numerator == b.m_Numerator && a.m_Denominator == b.m_Denominator;
    }

    public static bool operator !=(Fraction a, Fraction b)
    {
        return !(a == b);
    }

    public static bool operator >(Fraction a, Fraction b)
    {
        var diff = a - b;

        return diff.IsPositive && !diff.IsZero;
    }

    public static bool operator <(Fraction a, Fraction b)
    {
        var diff = a - b;

        return diff.IsNegative && !diff.IsZero;
    }

    public static bool operator >=(Fraction a, Fraction b)
    {
        var diff = a - b;

        return diff.IsPositive || diff.IsZero;
    }

    public static bool operator <=(Fraction a, Fraction b)
    {
        var diff = a - b;

        return diff.IsNegative || diff.IsZero;
    }
}

Gruß, Christian.

Schlagwörter: Bruch Fraction Bruchrechnung

23.09.2012 - 14:24 Uhr

...Der Grundgedanke dahinter ist eine Flashseite anzusteuern, bzw. einen Button auf einer Flashseite zu finden!...

In dem Fall kannst du die Windows-API dann wohl leider vergessen, da Flash keine nativen Controls benutzt.

Gruß, Christian.