Ich code grade was für ein Uniprojekt. Das Institut verwendet immer noch svn und lässt sich nicht dazu überreden, ein git Repository als Abgabe zu akzeptieren. Jeder einzelne Commit soll in svn auftauchen.
git-svn ist scheiße. Jedes Mal, wenn ich was ins svn Repo committen will, zerhauts mir meine History.
Java hat kein unsigned long. Wenn ich das Netzwerkprotokoll korrekt implementieren wollte, müsste ich ein BigInteger verwenden. Ich hoffe jetzt einfach mal, dass mir niemand SO große Dateien andrehen will.
Im RFC für das Protokoll sind immer noch diverse Inkonsistenzen. Mal wird der Typ einer Nachricht in Caps geschrieben, mal nicht. Teilweise fehlen Angaben, welchen Wertebereich bestimmte Felder haben dürfen, teilweise ist man dann aber überspezifisch.
Ich code grade was für ein Uniprojekt. Das Institut verwendet immer noch svn und lässt sich nicht dazu überreden, ein git Repository als Abgabe zu akzeptieren. Jeder einzelne Commit soll in svn auftauchen.
git-svn ist scheiße. Jedes Mal, wenn ich was ins svn Repo committen will, zerhauts mir meine History.
Java hat kein unsigned long. Wenn ich das Netzwerkprotokoll korrekt implementieren wollte, müsste ich ein BigInteger verwenden. Ich hoffe jetzt einfach mal, dass mir niemand SO große Dateien andrehen will.
Im RFC für das Protokoll sind immer noch diverse Inkonsistenzen. Mal wird der Typ einer Nachricht in Caps geschrieben, mal nicht. Teilweise fehlen Angaben, welchen Wertebereich bestimmte Felder haben dürfen, teilweise ist man dann aber überspezifisch.
...
Das Problem kenn ich, allerdings anders rum. In einem Kurs dieses Semester waren alle abgaben per git zu erledigen. Auf die Frage am Ende der LVA, was denn das größte Problem war gab es eine fast einstimmige Antwort: git
Kennt irgendwer was brauchbareres als TortoiseGit? Ich will nicht jedesmal bei einem Push das von Google generierte Passwort nachschlagen und einfügen müssen oder irgendwelche Keys konfigurieren.
Naja, ich finde git ist super für das was es tun soll. Man muss eben sich auch reinlesen wie es geht und vor allem sollte man nicht mit irgendeiner GUI anfangen sondern mit kommandozeile (Das musste ich auf die harte Tour lernen.). Du kannst in git deine Credentials sichern wenn du magst oder du nutzt halt https (was ich lieber mache ) da musst du maximal deine Userdaten eingeben.
Es gibt mittlerweile auch Aufgaben die ich über gui erledige (commits z.b. oder checkouts. WebStorm integriert git ziemlich awesome). Allerdings gibt es immernoch Sachen die ich lieber über Kommandozeile mache, wie etwa rebases. Die Komandozeile von git sagt einem auch immer was man machen muss daher ist das ganz cool.
TortoiseGit kann man gut zum commiten, shell visualisierung in Ordnern und zum Anzeigen des logs nutzen. Ich hab damit auch pushen können aber sobald branches ins Spiel kommen ist das ziemlich nutzlos gewesen. GitExtenstions und GitHub App scheinen ganz nett zu sein.
Ich finde ja es sollte an Unis einen Kurs für Versionskontrolle geben da das heutzutage total wichtig ist. Zumindestens wichtiger als so manche Kurse die ich hier belegen muss (Kein Witz einer meiner Prüfungsleistungen ist ein Gemälde vorstellen...). Da könnte man mit so einfachen Sachen wie SVN anfangen und dann zu git wechseln, evtl noch Perforce erwähnen da es sich ja gut für Assets eignet.
Was halt viele auch nicht so richtig verstehen ist das man Konflikte in binärdateien nur schlecht lösen kann, schließlich weiß git im Standard ja nicht was das für eine Datei ist... Hab schon viele auf der Uni gesehen die deswegen gemeckert haben, als wenn ein Programm durch magie jeden Dateityp kennt und weiß wie er Konflikte lösen kann... Als wenn es so schwer ist einen neuen branch zu erstellen xD
Ich finde ja es sollte an Unis einen Kurs für Versionskontrolle geben da das heutzutage total wichtig ist. Zumindestens wichtiger als so manche Kurse die ich hier belegen muss (Kein Witz einer meiner Prüfungsleistungen ist ein Gemälde vorstellen...). Da könnte man mit so einfachen Sachen wie SVN anfangen und dann zu git wechseln, evtl noch Perforce erwähnen da es sich ja gut für Assets eignet.
...
Auf der Schule, wo ich war, gibt es nen kleinen Kurs bezüglich SVN. In den Programmier-Übungen sollten wir auch zeigen, dass wir mit SVN umgehen können. Mir mussten also z.B. absichtlich ein Konflikt erzeugen und zeigen, wie man diesen wieder behebt. Zusätzlich git wäre aber auch nicht schlecht gewesen, schon mal die meisten Dozenten Linux-Fanatiker sind.
Zitat von R.D.
Was halt viele auch nicht so richtig verstehen ist das man Konflikte in binärdateien nur schlecht lösen kann, schließlich weiß git im Standard ja nicht was das für eine Datei ist... Hab schon viele auf der Uni gesehen die deswegen gemeckert haben, als wenn ein Programm durch magie jeden Dateityp kennt und weiß wie er Konflikte lösen kann... Als wenn es so schwer ist einen neuen branch zu erstellen xD
...
Wieso sollte man ein Branch erstellen, nur weil es einen Konflikt gibt? Oftmals passieren grad beim Merging Konflikte, die man nicht mit einem Branch lösen möchte.
Hier in der Firma benutzen wir noch Visual Sourcesafe für die Versionsverwaltung. Das ist historisch bedingt und soll wohl bald gegen TFS ausgetauscht werden.
Bei Visual Sourcesafe gibt es ein exklusives Auscheck-Recht. D.h. nur eine Person kann an einer Datei arbeiten, was ein Vorteil ist, um eben Konflikte ein wenig aus dem Weg zu gehen. Hat aber auch den Nachteil, dass eben nur einer an einer Datei basteln kann. Möchte ein weiterer an dieser Datei schrauben, so muss er warten, oder er muss den Schreibschutz der Datei entfernen und später selbst zu sehen, wie er seine Änderungen in die Datei bekommt.
Hier in der Firma benutzen wir noch Visual Sourcesafe für die Versionsverwaltung. Das ist historisch bedingt und soll wohl bald gegen TFS ausgetauscht werden.
...
Das höre ich bei uns seit ich in der Firma bin. SourceSafe zu benutzen ist Zwang bei uns.
Privat hab ichs mehrfach mit SVN-Zeugs versucht, Turtoise afair, hab aber immer wieder aufgegeben weil ich es nervig fand. Gibt es für dieses Git-Zeugs irgend eine Gui, die das ganze einfach und unkompliziert macht? ( Im Sinne von "verwöhnter Windowsnutzer-einfach" )
Hier in der Firma benutzen wir noch Visual Sourcesafe für die Versionsverwaltung. Das ist historisch bedingt und soll wohl bald gegen TFS ausgetauscht werden.
Bei Visual Sourcesafe gibt es ein exklusives Auscheck-Recht. D.h. nur eine Person kann an einer Datei arbeiten, was ein Vorteil ist, um eben Konflikte ein wenig aus dem Weg zu gehen. Hat aber auch den Nachteil, dass eben nur einer an einer Datei basteln kann. Möchte ein weiterer an dieser Datei schrauben, so muss er warten, oder er muss den Schreibschutz der Datei entfernen und später selbst zu sehen, wie er seine Änderungen in die Datei bekommt.
...
Haben wir auch noch, migrieren aber inzwischen zu git. Unter anderem, weil es manchmal schwer nachzuvollziehen war, was denn nun zu einer Version gehört. VSS speichert die History ja für jede Datei einzeln. Außerdem gab es immer wieder Helden, die abends vergessen haben, ihre ausgecheckten Dateien wieder freizugeben.
Ich hab quasi den ganzen November letztes Jahr damit zugebracht, diverse Git-Tutorials zu einem Crashkurs für die Kollegen zusammenzufassen und es scheint zu funktionieren. Ich werd bei Gelegenheit mal nachfragen, ob ich das Ding veröffentlichen darf.
Ich hab übrigens inzwischen eine "Lösung" für mein Git-SVN Problem gefunden. Wenn ich zwischen master und trunk nur mittels Cherry-Picking Commits hin und her schiebe, krieg ich keine großartigen Probleme, höchstens eine hässliche History.
Edit @Corti
Es gibt einen ganzen Batzen GUIs für git, mit denen zumindest die Basics recht einfach sind. Beispielsweise TortoiseGit, GitExtensions, QGit und SmartGit. Wenn du wirklich effizient arbeiten willst, solltest du dich aber mal damit beschäftigen, wie Git intern funktioniert und das geht am leichtesten, indem man mal auf der Kommandozeile damit rumspielt. Schau dir mal Pro Git an. Ist ein schönes E-Book, das gleichzeitig einen Teil der offiziellen Dokumentation darstellt. Für den Anfang sind die Kapitel 1, 2, 3 und 5 interessant. Kapitel 4 brauchst du nur, wenn du einen Server aufsetzen willst und alles ab Kapitel 6 ist für fortgeschrittene User.
Folgendes Gedankenspiel, Aufgabe aus der Matheklausur:
Ihr steht an der Straße und beobachtet ein Glücksspiel. Der Spieler setzt einen Geldbetrag als Einsatz, der Dealer wirft eine Münze. Wenn die Seite der Münze mit dem Tipp des Spielers übereinstimmt, so bekommt er sein Einsatz ausgezahlt. Er hat dann doppelt so viel wie vorher. Sollte der Tipp falsch sein, geht der Einsatz an den Dealer. Ihr beobachtet das Spiel und stellt fest, dass es bei 20 Würfen zu einer normalen Verteilung kam: 9 mal Kopf, 11 mal Zahl. Ein Passant kommt dazu und setzt einen Betrag, tippt auf Zahl. Es fällt Kopf. Der Passant setzt erneut einen Betrag und tippt wieder Zahl. Es fällt wieder Kopf. Nun setzt der Passant wieder einen Betrag, und setzt diesmal auf Kopf. Eine Person aus der Menschenmenge um das Pult herrum schüttelt den Kopf: "Das ist dämlich! Es ist viel wahrscheinlicher, dass die Zahl oben liegt!" - Stimmt das?
Folgendes Gedankenspiel, Aufgabe aus der Matheklausur:
Ihr steht an der Straße und beobachtet ein Glücksspiel. Der Spieler setzt einen Geldbetrag als Einsatz, der Dealer wirft eine Münze. Wenn die Seite der Münze mit dem Tipp des Spielers übereinstimmt, so bekommt er sein Einsatz ausgezahlt. Er hat dann doppelt so viel wie vorher. Sollte der Tipp falsch sein, geht der Einsatz an den Dealer. Ihr beobachtet das Spiel und stellt fest, dass es bei 20 Würfen zu einer normalen Verteilung kam: 9 mal Kopf, 11 mal Zahl. Ein Passant kommt dazu und setzt einen Betrag, tippt auf Zahl. Es fällt Kopf. Der Passant setzt erneut einen Betrag und tippt wieder Zahl. Es fällt wieder Kopf. Nun setzt der Passant wieder einen Betrag, und setzt diesmal auf Kopf. Eine Person aus der Menschenmenge um das Pult herrum schüttelt den Kopf: "Das ist dämlich! Es ist viel wahrscheinlicher, dass die Zahl oben liegt!" - Stimmt das?
...
Ernsthaft? ^^""
Nein.
@ Tako: Oh Gott, wer macht sowas? XD
Das ist noch schräg-cooler, als der 3D-Shooter in Forth, den eine Gruppe bei mir auf der Uni in einer VL gemacht hat. XD
--
A human is a system for converting dust billions of years ago into dust billions of years from now via a roundabout process which involves checking email a lot.
Folgendes Gedankenspiel, Aufgabe aus der Matheklausur:
Ihr steht an der Straße und beobachtet ein Glücksspiel. Der Spieler setzt einen Geldbetrag als Einsatz, der Dealer wirft eine Münze. Wenn die Seite der Münze mit dem Tipp des Spielers übereinstimmt, so bekommt er sein Einsatz ausgezahlt. Er hat dann doppelt so viel wie vorher. Sollte der Tipp falsch sein, geht der Einsatz an den Dealer. Ihr beobachtet das Spiel und stellt fest, dass es bei 20 Würfen zu einer normalen Verteilung kam: 9 mal Kopf, 11 mal Zahl. Ein Passant kommt dazu und setzt einen Betrag, tippt auf Zahl. Es fällt Kopf. Der Passant setzt erneut einen Betrag und tippt wieder Zahl. Es fällt wieder Kopf. Nun setzt der Passant wieder einen Betrag, und setzt diesmal auf Kopf. Eine Person aus der Menschenmenge um das Pult herrum schüttelt den Kopf: "Das ist dämlich! Es ist viel wahrscheinlicher, dass die Zahl oben liegt!" - Stimmt das?
...
Nein.
Die Frage ist, worauf willst du hinaus?
1. "Münzen neigen generell dazu, Zahl zu zeigen."
Nein. Einzelne Münzen vielleicht, aber ohne die Angabe, um was für eine Münze es sich handelt, könnte es auch umgekehrt sein.
2. "Diese spezielle Münze neigt dazu, Zahl zu zeigen."
Nein. Wir haben bis jetzt 11 mal Kopf und 11 mal Zahl gesehen, also ein genau ausgeglichenes Verhältnis. Davon abgesehen, kann man nach 22 Würfen noch nicht sonderlich viel über eine Münze sagen, wenn sie nicht grade ein ganz extremes Verhältnis zeigt.
3. "Es muss langsam Zahl kommen, weil gerade zweimal Kopf kam."
Nein. Münzen haben kein Gedächtnis. Jeder Wurf ist ein unabhängiges Zufallsexperiment, das durch die vorherigen Experimente nicht beeinflusst wird.
Mein bisheriger Aufruf war:
Allerdings wirft dieser Code mit der Version 7 Update 21 folgende Exception:
Ohne die Anführungszeichen funktioniert das nicht, denn da wird der Pfad nicht gefunden, weil er dann
und den Rest als Argumente aufrufen will. Die Leerzeichen einfach zu escapen geht auch nicht.
Laut dem Changelog soll man über Runtime.exec sein Programmname und Argumente über ein Array übergeben.
Folglich kann ich über
das Programm mit den Argumenten aufrufen. Allerdings muss wirklich jedes Argument in ein neues Element des Arrays, denn alle Argumente in ein Element zu packen funktioniert nicht.
Der nun elegantere Weg ist es den ProcessBuilder zu nutzen, da man den Konstruktor sein Programmname und Argumente als "String..."-VarArgs übergeben kann.
Ich frag mich was für DAUs die Entwickler von Java sind, dass sie solch eine Änderung in eine Sicherheits-Update rein machen, statt wie zu erwarten das erst mit dem Release von Java 8.
PS: Funktionen mit VarArgs eines Typs kann man auch ein Array des gleichen Typs übergeben.
PPS: Wenn's nicht in den Thread passt, dann bitte ein eigenen Thread daraus machen.
Ich frag mich was für DAUs die Entwickler von Java sind, dass sie solch eine Änderung in eine Sicherheits-Update rein machen, statt wie zu erwarten das erst mit dem Release von Java 8.
...
Da Java 8 nicht vor 2014 zu erwarten ist (Verschiebungen haben bei Java Tradition), wäre dies ein richtiger Schritt. exec(String command) empfinde ich als Krücke, da man hier wirklich mit dem Escapen aufpassen muss.
startet ja nicht die "main.java", sondern "toller". Das kann man durchaus als Sicherheitslücke betrachten. Da ist eine String-Array Variante deutlich besser, und wenn mich nicht alles täuscht, gabs die vorher ja auch schon.
Also ich möchte, dass man einen String[][] in Java auf der Festplatte speichern und wieder lesen kann.
Ich habe für das Speichern also folgendes:
die Variable contactList ist ein String[][].
Wie kann ich diese nun wieder in das Programm einlesen?
Ich finde irgendwie keine geeignete Methode dafür. In der Schule hatten wir bisher nur das Laden/Speichern von einfachen Objekten.
Ich frage mich immer wieder, was du mit den Arrays hast.
Da der Name contactList schon verrät, dass es eine dynamisch wachsende Liste ist, wäre es auch angebracht die Liste auch als Liste zu behandeln und die Daten stattdessen in eine ArrayList zu packen
Ich frage mich immer wieder, was du mit den Arrays hast.
...
Vielleicht wurden Listen noch gar nicht im Unterricht durchgenommen?
@ Engel der Furcht:
Ich würde dir auch wie Whiz-zarD empfehlen auf eine ArrayList umzusteigen, dann musst du dir keine Sorge wegen Größe, etc. machen. Außerdem stehen dir auch zusätzlich nützliche Methoden bereit, die die "Verwaltung" der Liste leichter machen. Falls du aber häufig Einfüge- oder Löschoperationen durchführst, würde ich zu einer LinkedList zurückgreifen, die sind nämlich performanter als ArrayLists.
Vielleicht wurden Listen noch gar nicht im Unterricht durchgenommen?
...
Und genau das hasse ich am Informatikunterricht an Schulen, wenn die Lehrer keine Kompetenz aufweisen, dann sollen sie es gleich lassen. Den Schülern das Programmieren falsch beibringen kann nicht das Ziel der Übung sein.
Arrays verwendet man nur, wenn man zur Laufzeit exakt die Anzahl der Elemente kennt, und die Anzahl sich auch nicht mehr ändert. Eine Veränderung der Arraygröße ist immer sehr problematisch, da ein Array als ganzer Block im Speicher liegt. Bei einer Vergrößerung muss ein neues Array erzeugt, und das alte in das neue kopiert werden, was bei vielen Änderungen sehr inperformant wird. Es macht also kein Sinn, eine Adressverwaltung mittels eines Array zu implementieren, da man eben die Anzahl der Adressen nicht kennt, die gespeichert werden sollen. Nutzer A hat vielleicht nur 3 Adressen, aber Nutzer B möchte 30.000 Adressen speichern.
Ich schätze auch mal, dass die zweite Dimension des 2D-Arrays wohl die Daten des Kontaktes bereithält. Schon in den Anfängen der Informatik hat man erkannt, dass dies sehr bescheiden ist, und hat dafür ein Record/eine Struktur entwickelt, die die Daten ansprechender machen. In der objektorientierten Welt wäre dies einfach nur eine Klasse, die lediglich nur Getter- und Setter-Methoden für die Klassenvariablen bereitstellen. In der objektorientierten Welt nennt man sowas auch Geschäftsobjekt.
Dann hätte man anstatt String[][] ein LinkedList<Contact>. Und wer ganz schlau ist, kapselt LinkedList<Contact> in eine Klasse:
Dies wäre dann eine Liste von Geschäftsobjekten. Der Vorteil bei diesen Objekten ist nun, dass ich jeweils für die Kontakte, als auch für die Kontaktliste eigene Logik-Methoden implementieren kann, wie z.B. das Laden oder Speichern, und ContactList ist ansprechender als LinkedList<Contact>, weil es mich nun nicht mehr interessiert, wie die Kontaktliste implementiert ist. Sie ist einfach da und ich benutze sie.
Zitat von Engel der Furcht
Ich hab einfach keine Ahnung von diesen ArrayLists.
Der Name klingt als würden die nur eindimensional und nicht mehrdimensional sein :<
...
ArrayList<ArrayList<ArrayList<String>>>
Eine Drei-Dimensionale Liste mit Strings
Du kannst es auch beliebig weiterführen. hab doch keine Angst, damit zu experimentieren. Es gibt doch im Internet genug Tutorials, die Listen erklären.