Archiv verlassen und diese Seite im Standarddesign anzeigen : IM IN YR LOOP\n VISIBLE FOO\n IM OUTTA YR LOOP - Der Programmierer-Spamthread #2
Zumindest im Golem-Forum (http://forum.golem.de/kommentare/applikationen/open-source-font-source-code-verschoenert-source-code/67267,list.html) (auch wenn dort viel Trolling herrscht, eine Grundtendenz ist immer festzuhalten) wird die Font eher negativ angenommen, v.a. wegen des Hinting in kleiner Schriftgröße. Viele schwören da eher auf Monospace unter Linux... Ich für meinen Teil nutze unter Linux Inconsolata (http://levien.com/type/myfonts/inconsolata.html), was mir noch einen Tick besser gefällt als Monospace...
Whiz-zarD
27.09.2012, 19:37
Viele schwören da eher auf Monospace unter Linux...
Wenns nach den meisten Linux-Nutzern geht, würden wir heute immer noch PCs ausschliesslich im Text-Modus verwenden, weil den Grafik-Modus keiner braucht und nur Resourcen verschwendet ;)
SHELL=/bin/bash
sandwich:
@ if [ `id -u` != "0" ]; then \
echo "What? Make it yourself."; \
else \
echo "Okay."; \
fi
Mir war grade danach. (Wehe dem, der die Anspielung nicht kriegt)
Edit: etwas erweitert, um enger an der Vorlage zu bleiben
SHELL=/bin/bash
me:
@ echo "me" > .sandwich.last
a:
@ if [ `cat .sandwich.last` != "me" ]; then \
exit 1; \
else \
echo "a" > .sandwich.last; \
fi
sandwich:
@ if [ `cat .sandwich.last` != "a" ]; then \
exit 1; \
fi
@ if [ `id -u` != "0" ]; then \
echo "What? Make it yourself."; \
else \
echo "Okay."; \
fi
@ rm .sandwich.last
Warum schreibt hier keiner? Oo
Naja.
Ich hab gerade festgestellt dass LINQ cooler ist als ich dachte.
Dim heightOffset As Integer = (From b In {ls.ShowDefaultSearchChekbox, ls.ShowHomepageCheckbox, ls.ShowNewTabCheckbox} Where b).Sum(Function(b) 12)
Eine Zeile. Bewirkt dass ls.ShowDefaultSearchChekbox, ls.ShowHomepageCheckbox, ls.ShowNewTabCheckbox jeweils auf True überprüft wird (da alle Werte Booleans sind entspricht "Where b" hier "Where b = True") und für jedes davon, was True ist, wird 12 zu heightOffset dazugezählt.
Naja, also im Prinzip hab ich so angefangen:
Dim heightOffset As Integer = 0
If ls.ShowDefaultSearchCheckbox Then heightOffset += 12
If ls.ShowHomepageCheckboxThen heightOffset += 12
If ls.ShowNewTabCheckbox Then heightOffset += 12
Dann wurde draus:
Dim heightOffset As Integer = 0
For Each b As Boolean In {ls.ShowDefaultSearchChekbox, ls.ShowHomepageCheckbox, ls.ShowNewTabCheckbox}
heightOffset += 12
Next
Und am Schluss eben die eine Zeile. :)
Lesbarer wird der Code dadurch halt nich.
Ich könnte grade höchstens ausgiebig motzen:
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.
Just my two cents.
nudelsalat
22.01.2013, 20:34
Lesbarer wird der Code dadurch halt nich.
Ich könnte grade höchstens ausgiebig motzen:
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 :D) 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
Whiz-zarD
23.01.2013, 08:29
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.
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 (http://git-scm.com/book) 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.
Gutes Ebook, danke dafür, hab bisher nur kurz reingelesen aber das gefällt mir schonmal.
http://www.haskell.org/haskellwiki/Frag
Desmulator
02.02.2013, 16:12
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?
drunken monkey
02.02.2013, 18:25
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 (http://www.complang.tuwien.ac.at/anton/lvas/stack-abgaben/07w/glforth/), den eine Gruppe bei mir auf der Uni in einer VL gemacht hat. XD
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.
4. "Der Typ schummelt."
Das schon eher.
Desmulator
02.02.2013, 22:05
Es war eine Fangfrage. Natürlich ist jedes Sequenz von Ereignissen mit gleicher Länge gleich wahrscheinlich. Simple Antwort: Nein. Es ging aber hier um die subjektive Erwartungshaltung eines Beobachters, der an die gleiche Verteilung der Ereignisse glaubt und kausale Zusammenhänge dort versucht zu sehen wo sie eigentlich nicht sind. Mathematisch natürlich non-sens aber irgendwie geht es mir zumindest auch so, wenn ich sowas tippe, dass ich dazu neige nach drei mal Zahl, eher auf Kopf zu tippen ...
Gut, ich denke, damit war die Frage hier einfach an der falschen Stelle. Ich gehe davon aus, dass jeder, der diesen Thread liest, sich zumindest einigermaßen mit Wahrscheinlichkeitstheorie auskennt und sowas weiß.
Ich experimentiere grade mit SDL 2.0 (http://wiki.libsdl.org/moin.fcg/Introduction) und bin begeistert. Endlich bekomme ich die ganzen Features, die ich in SDL 1.x immer vermisst habe oder von Hand mit OpenGL lösen musste:
Skalierte und rotierte Sprites
Gleichzeitige Verwendung von Per-Surface-Alpha und Per-Pixel-Alpha
Mehr Blending Modes als nur einfaches Alpha Blending
Abstraktionslayer für Threads (sonst hab ich halt immer Pthread genommen)
Und noch viel mehr.
Und um mal eben einen Screenshot von eben jenem Projekt zu posten:
17158
Meine Implementierung von RGSS, die nativ auf Mac und Linux läuft. Auf dem Screenshot zu sehen: Sprite mit Skalierung und Alphatransparenz. Rotation ist auch schon implementiert, hab ich nur grade nicht aktiv gehabt, als der Screenshot entstanden ist.
Sobald ich den Viewport Renderer drin hab, sollte man die meisten RPG Maker XP Spiele zumindest mal starten können.
Unter euch gibt’s doch sicher auch ein paar Leute, die Google Reader nutzen. Google hat ja letztens announced, dass sie den Service Mitte des Jahres killen, daher die Frage: Kennt/benutzt irgendwer von euch gute Alternativen? Mir geht’s eigentlich nicht um das Webinterface, sondern um den Syncing-Kram – ich will auf meinem Recher und auf meinen iOS-Devices Feeds lesen können und jedes Device sollte wissen, was auf den anderen schon gelesen wurde. Und zumindest für iOS will ich eigentlich auch kein reines Web-App (am Desktop-OS könnte ich damit leben).
Fastladder ist afaik inzwischen auch außer Dienst gestellt. Ich hab daher vor geraumer Zeit mal angefangen, mir selbst was zu implementieren.
nudelsalat
31.03.2013, 09:41
Scheint so als würde Microsoft mit WebGL im Internet Explorer experimentieren:
How to enable WebGL in Internet Explorer 11 (http://withinwindows.com/within-windows/2013/3/30/blues-clues-how-to-enable-webgl-in-internet-explorer-11)
Wir haben wieder ein Weekly Update für euch!
Weekly Update #13 Next steps after the TechDemo++ (http://www.radicalfishgames.com/?p=461)
Wir haben mal wieder ein Weekly Update für euch! Wir haben diese Woche das Pathfinding eingebaut das es sogar erlaubt das Entities anderen Entities hinterherspringen!
Link: Click hard on me! (http://www.radicalfishgames.com/?p=471)
Hi, beim letzten Java Update auf 7 Update 21 gab es eine Änderung an der Klasse java.lang.Runtime, Methode exec(), siehe http://www.oracle.com/technetwork/java/javase/7u21-relnotes-1932873.html#jruntime .
Mein bisheriger Aufruf war:
Runtime runtime = Runtime.getRuntime();
try{
runtime.exec("\"D:\\irgend ein Ordner\\irgendein Programm.exe\" /argument1 bla /argument2");
} catch(IOException e){
e.printStackTrace();
}
Allerdings wirft dieser Code mit der Version 7 Update 21 folgende Exception:
Exception in thread "main" java.lang.IllegalArgumentException: Executable name has embedded quote, split the argument
Ohne die Anführungszeichen funktioniert das nicht, denn da wird der Pfad nicht gefunden, weil er dann
D:\\irgend 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
runtime.exec(new String[]{"D:\\irgend ein Ordner\\irgendein Programm.exe", "/argument1", "bla", "/argument2"});
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.
ProcessBuilder pb = new ProcessBuilder("D:\\irgend ein Ordner\\irgendein Programm.exe", "/argument1", "bla", "/argument2");
try{
pb.start();
} catch(IOException e){
e.printStackTrace();
}
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. :)
Whiz-zarD
20.04.2013, 14:16
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.
exec("C:\\toller ordner\\main.java");
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.
Path-finding in CrossCode:
http://www.youtube.com/watch?v=J7mFjlyScHA
Engel der Furcht
03.05.2013, 18:30
Heyjo, ich hoffe ihr könnt mir helfen :>
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:
FileOutputStream fos = new FileOutputStream(contactFile);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(contactList);
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.
@Engel der Furcht: Analog zum ObjectOutputStream gibt es auch einen ObjectInputStream (http://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html). :D
Whiz-zarD
03.05.2013, 19:37
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.
Engel der Furcht
03.05.2013, 22:10
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 hab einfach keine Ahnung von diesen ArrayLists.
Der Name klingt als würden die nur eindimensional und nicht mehrdimensional sein :<
Hab das Ding jetz mit einem cast gelöst.
FileInputStream fis = new FileInputStream(contactFile);
ObjectInputStream ois = new ObjectInputStream(fis);
contactList =(String[][]) ois.readObject();
Ich werd mir das mal mit den ArrayLists mal durchlesen...
Whiz-zarD
03.05.2013, 22:12
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 (http://de.wikipedia.org/wiki/Geschäftsobjekt).
public class Contact
{
private String firstname;
private String lastname;
...
public getFirstname()
{
return this.firstname;
}
public setFirstname(String firstname)
{
this.firstname = firstname;
}
...
}
Dann hätte man anstatt String[][] ein LinkedList<Contact>. Und wer ganz schlau ist, kapselt LinkedList<Contact> in eine Klasse:
public class ContactList extends LinkedList<Contact>
{
...
}
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.
;)
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.
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.
In diesem Fall würde ich gleich anstatt der ArrayList zu einer LinkedList greifen, da bei einer Löschung eines Elements in einer ArrayList die ganze hintere Liste um eine Position nach vorne gerückt werden muss. Und in deinem Fall mit den 30.000 Adressen ist das sicher nicht zu vernachlässigen.
EDIT: Oh, hab gerade gesehen, dass du eh eine LinkedList verwendest. ^^
Whiz-zarD
03.05.2013, 22:49
EDIT: Oh, hab gerade gesehen, dass du eh eine LinkedList verwendest. ^^
Ja, da du schon recht hast, dass eine LinkedList besser wäre ^^
Engel der Furcht
07.05.2013, 18:24
Vielen Dank für eure Hilfe :>
Hab da noch ne Frage (ich fühl mich so n00by hier :D)
Ich hab eine Klasse. In dieser Klasse wird ein Objekt einer anderen Klasse erzeugt.
Jetzt wird in diesem Objekt eine Methode aufgerufen und diese Methode soll aber in eine TextArea aus der ersten Klasse (also der Objekt-Erzeuger-Klasse) schreiben.
Geht das irgendwie? :>
Whiz-zarD
07.05.2013, 18:27
Ja.
Würde ich aber nicht machen, da dies gegen das Model-View-Controller-Prinzip verstößt.
Zeige doch mal konkret, was du vor hast.
Engel der Furcht
07.05.2013, 18:32
Woah, mein Lehrer hat sogar mal davon gefaselt :D
Er meinte, dass das für uns zu kompliziert sei, die einzelnen Dinge zu trennen.
Whiz-zarD
07.05.2013, 18:35
So kompliziert ist das gar nicht. Gerade in Sprachen, wie Java oder C# ist das recht einfach einzuhalten. In Sprachen, wie php sieht es schon wieder ein wenig anders aus, ist aber auch möglich.
Sag also konkret, was du vor hast, und ich könnte dir da auch weiterhelfen.
Woah, mein Lehrer hat sogar mal davon gefaselt :D
Er meinte, dass das für uns zu kompliziert sei, die einzelnen Dinge zu trennen.
Er soll nicht nur davon faseln, sondern es euch auch beibringen.
Ob was kompliziert zu trennen oder nicht ist, hängt ganz von der Programmierweise ab und natürlich von der Sprache selbst.
EDIT: Whiz-zarD war schneller. ^^
Engel der Furcht
07.05.2013, 18:40
So kompliziert ist das gar nicht. Gerade in Sprachen, wie Java oder C# ist das recht einfach einzuhalten. In Sprachen, wie php sieht es schon wieder ein wenig anders aus, ist aber auch möglich.
Sag also konkret, was du vor hast, und ich könnte dir da auch weiterhelfen.
Nunja, wie ich gesagt hab: Ich hab eine Klasse (die von Frame erbt), in dieser Klasse wird ein Objekt erzeugt. Dieses Objekt soll in eine TextArea aus der ersten Klasse schreiben.
Whiz-zarD
07.05.2013, 19:27
Direkt nach TextArea würde ich nicht schreiben, dann wäre die Instanz eines erzeugten Objektes abhängig von deiner Frame-Instanz, und genau das will das Model-View-Controller-Prinzip verhindern.
Klassen, die die Daten bereitstellen, sollen unabhängig von Klassen sein, die die Anzeige bereitstellen. Angenommen, du erzeugst eine Tabelle und willst sie sowohl in Tabellenform, als auch als Diagramm darstellen. Es wäre dann sehr unklug, wenn die Klasse, die die Tabelle (= Model) erzeugt, abhängig von der jeweiligen View ist.
Schreib die Methode so, dass sie dir die Informationen liefert, die du benötigst und gib diese Daten als Rückgabewert zurück.
Dann kannst du mit Hilfe dieser Daten den String zusammenbauen (in deiner Frame-Instanz), der in der TextArea angezeigt werden soll.
Engel der Furcht
09.05.2013, 20:53
Ich hab das ganze mit einem Interface gelöst.
UNd stehe gerade vor einem erneuten Problem:
Ich hab 'ne Klasse, in der ein Objekt erzeugt wird, das von Thread erbt.
In diesem Thread wartet ein Socket auf Empfang von Daten.
Ich kann den Thread nicht schließen/killen/terminieren/whatever.
Ich kann von der Oberklasse auch nicht auf das Socket zugreifen und es schließen.
Hier mal mein Programmcode:
package UDP;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.util.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class UDPTransceiver extends Frame implements ActionListener,
ReceiverInterface
{
private Label adressnumber;
private TextArea history;
private TextArea sendArea;
private Panel centerPanel;
private Button sendButton;
private Receiver receiver;
private InetAddress address;
private byte[] data;
public boolean receiverON = false;
private DatagramSocket socket;
private DatagramPacket packet;
private String name;
MenuBar mb;
Menu logMenu;
MenuItem openLog;
public UDPTransceiver(String name, InetAddress address)
{
super(name);
this.address = address;
this.name = name;
makeGUI();
setSize(500, 500);
sendButton.addActionListener(this);
setVisible(true);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent windowEvent)
{
if (receiverON)
{
receiver.status = false;
System.out.println(receiver.status);
receiver.socket.close();
receiver.interrupt();
}
dispose();
}
});
runReceiver();
}
private void makeGUI()
{
mb = new MenuBar();
logMenu = new Menu("Log");
openLog = new MenuItem("Logdatei öffnen");
logMenu.add(openLog);
mb.add(logMenu);
setMenuBar(mb);
adressnumber = new Label();
history = new TextArea();
sendArea = new TextArea();
centerPanel = new Panel();
sendButton = new Button("Senden");
setLayout(new BorderLayout());
centerPanel.setLayout(new GridLayout(2, 1));
centerPanel.add(history);
centerPanel.add(sendArea);
add("North", adressnumber);
add("Center", centerPanel);
add("South", sendButton);
history.setEditable(false);
}
public void actionPerformed(ActionEvent event)
{
if (event.getSource() == sendButton)
{
send();
}
}
private void runReceiver()
{
receiverON = true;
receiver = new Receiver(address, this);
}
private void send()
{
try
{
logMessage("Du - " + new GregorianCalendar().get(Calendar.HOUR_OF_DAY)
+ ":"
+ new GregorianCalendar().get(Calendar.MINUTE) + ":"
+ new GregorianCalendar().get(Calendar.SECOND) + ":\n "
+ sendArea.getText()
+ "\n");
socket = new DatagramSocket();
data = new byte[sendArea.getText().length()];
data = sendArea.getText().getBytes();
packet = new DatagramPacket(data, data.length, address, 4711);
try
{
socket.send(packet);
}
catch (IOException ex)
{
System.out.println(ex);
}
}
catch (SocketException ex)
{
System.out.println(ex);
}
}
public void logMessage(String message, InetAddress receiveIp)
{
history.append(receiveIp + " - "
+ new GregorianCalendar().get(Calendar.HOUR_OF_DAY) + ":"
+ new GregorianCalendar().get(Calendar.MINUTE) + ":"
+ new GregorianCalendar().get(Calendar.SECOND) + ":\n" + message);
}
public void logMessage(String message)
{
history.append("\n" + message + "\n");
}
public static void main(String args[]) throws UnknownHostException
{
new UDPTransceiver("Lokal", InetAddress.getByName("localhost"));
}
}
package UDP;
import java.io.IOException;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Receiver extends Thread implements Runnable, ReceiverInterface
{
private InetAddress receiveIp;
public DatagramSocket socket;
public DatagramPacket packet;
private byte[] buffer;
private String message;
public boolean status = true;
ReceiverInterface receiverInterface;
public Receiver(InetAddress receiveIp, ReceiverInterface receiverInterface)
{
message = "";
this.receiverInterface = receiverInterface;
this.receiveIp = receiveIp;
run();
}
public void run()
{
while (status)
{
buffer = new byte[4098];
packet = new DatagramPacket(buffer, buffer.length);
try
{
socket = new DatagramSocket(4711);
try
{
socket.receive(packet);
logMessage(new String(buffer), receiveIp);
socket.close();
}
catch (IOException ex)
{
System.out.println(ex);
}
}
catch (SocketException ex)
{
System.out.println(ex);
}
}
interrupt();
}
public void logMessage(String message, InetAddress receiveIp)
{
receiverInterface.logMessage(message, receiveIp);
}
}
Is das mit dem WindowAdapter eigentlich so richtig, ich kriege immer eine NullpointerException(der receiver existiert doch?)
Jedenfalls kann ich den Thread nicht schließen und habe irgendwie auch sonst keinen Zugriff auf Attribute etc.
Ich kann also receiver.socket.close() nicht anwenden und receiver.status kann ich auch nicht auf false setzen.
receiver.interrupt(), .stop() etc. kann ich auch nicht anwenden.
Als Test ist Sender/Empfängeraddresse auf Localhost gesetzt. "Senden" und "Empfangen" kann ich wohl und auch die ganze Zeit.
Whiz-zarD
10.05.2013, 08:46
Ich hab das ganze mit einem Interface gelöst.
Für so ein Problem sind Interfaces nicht gedacht. ;)
UNd stehe gerade vor einem erneuten Problem:
Ich hab 'ne Klasse, in der ein Objekt erzeugt wird, das von Thread erbt.
Und hier wäre es nun schlauer, du machst dich mit dem Model-View-Controller-Prinzip vertraut.
Ein Fenster, dass ein Thread startet und auf UDP-Daten wartet ist ein absolutes No-Go.
Dies muss der Controller übernehmen und nicht die View, oder möchtest du in jedem Fenster die selben Methoden implementieren?
IdR wird hierfür ein eigener Thread gestartet, der rein nur fürs Empfangen der Daten zuständig ist. Fenster, die auf empfangene Daten reagieren wollen, registrieren sie sich dann mittels eines Listeners und der Thread gibt dann dem Fenster die nötigen Informationen. Beim Schließen des Fensters muss aber tunlichst darauf geachtet werden, dass sie sie wieder deregistrieren.
In diesem Thread wartet ein Socket auf Empfang von Daten.
Ich kann den Thread nicht schließen/killen/terminieren/whatever.
Ich kann von der Oberklasse auch nicht auf das Socket zugreifen und es schließen.
Threads sind sowieso sehr böse, wenn man nicht weiß, was man da tut. Als Einführung kannst du dir ja mal den Wiki-Artikel über das Philosophenproblem (http://de.wikipedia.org/wiki/Philosophenproblem) durchlesen.
Is das mit dem WindowAdapter eigentlich so richtig, ich kriege immer eine NullpointerException(der receiver existiert doch?)
Ich kann das hier nur überfliegen, aber der Thread wird ja auch erstmal gar nicht gestartet.
Die Methode windowClosing() erzeugst du ja in einer anonymen Unterklasse. Die Unterklasse hat aber einen anderen Namensraum, als deine Oberklasse, und deswegen ist für die Unterklasse reveicer gleich Null. Es gibt nun mehrere Wege:
Du benutzt in der Unterklasse ein qualifiziertes this. also anstatt receiver.socket.close(); schreibst du dann UDPTransceiver.this.receiver.socket.close();. Dann weiß die anonyme Unterklasse, dass es auf die umschließende Oberklasse zugreifen soll.
Du deklarierst receiver als statisch. Wohlmöglich sogar als final static.
Jedenfalls kann ich den Thread nicht schließen und habe irgendwie auch sonst keinen Zugriff auf Attribute etc.
Ich kann also receiver.socket.close() nicht anwenden und receiver.status kann ich auch nicht auf false setzen.
receiver.interrupt(), .stop() etc. kann ich auch nicht anwenden.
Um überstürzt einfach versuchen, irgendwelche Methoden aufzurufen, solltest du dich einfach mal kontrollieren, ob die Objekte überhaupt existieren. Wenn du eine Null-Pointer-Exception bekommst, dann heißt das schon, dass da schon irgendwas nicht existiert. Hast du dich eigentlich schon mal mit dem Debugger beschäftigt?
Als Test ist Sender/Empfängeraddresse auf Localhost gesetzt. "Senden" und "Empfangen" kann ich wohl und auch die ganze Zeit.
Das heißt also, du weißt es nicht? Bei Netzwerk-Programmierung ist es immer vom Vorteil, man hat einen Netzwerk-Sniffer ala WireShark zur Hand und schaut sich die Datenpakete an, die verschickt werden.
Mal ganz doof gefragt ( ich hab mit Java nie groß was gemacht ).
Was bringt es von Thread zu erben? Tut man das in Java so? Oder ist hier mit "Thread" was anderes gemeint als das was man von C# System.Threading.Thread bzw. C++ boost::thread kennt?
Mal ganz doof gefragt ( ich hab mit Java nie groß was gemacht ).
Was bringt es von Thread zu erben? Tut man das in Java so? Oder ist hier mit "Thread" was anderes gemeint als das was man von C# System.Threading.Thread bzw. C++ boost::thread kennt?
Ja, das tut man so in Java. Die Thread-Klasse implementiert nämlich das Interface Runnable, welche die Methode run() implementiert.
Ah stimmt, Java hat's ja nicht so mit Funktionszeigern/Delegaten/ähnlichen Konstrukten.
Delegaten hat Java aber doch o.o Nur nicht nach Definition von C/C++. Man löst das dann halt über Interfaces oder so. Allerdings wünschte ich mir oft eine Methode direkt angeben zu können.
Man muss btw nicht von einem Thread erben. ein Thread Objekt stellt ein Runnable bereit allerdings kann man auch sein eigenes angeben (etwa im C'Tor). Man muss also nicht immer gleich vererben wenn man nur einen kurzen Task ausführen will.
@Topic
Ich arbeite gerade an WebAudio Kram für CrossCode. Ich glaube das ist die Beste Audio API die ich bisher hatte. Für Spiele ist es eben nicht nur wichtig einen Sound abzuspielen oder ein Musikstück (So wie das viele Engines eben tun, also für Spiele), sondern nutzt ein Graphen über den ein Sound/Musikstück bis zum "Destination"-Knoten wandert. dadurch ist es super einfach global volume oder effekte einzubauen. Stellt euch vor ihr habt einen Track der sich mit der Umgebung anpasst. Halt wie bei Zelda. Das ist mer API relativ einfach möglich. Man nimmt einfach die einzelnen Instrumente und spielt alles gleichzeitig ab, dann faded man zwischen den Instrumenten schön hin und her.
@Web-Audio
Wird das außerhalb von Chrome schon unterstützt?
@Web-Audio
Wird das außerhalb von Chrome schon unterstützt?
Das? (http://caniuse.com/audio-api)
Ja in Safari.
Ich bin immer dafür die neuen Sachen zu pushen. Es stört mich schon das andere Browser bestimmte Sachen so langsam implementieren aber es ist nur eine Frage der Zeit.
Edit:
Bei Firefox ist immer alles geplant xD Aber vllt wollen sie auch erstmal die JavaScript Execution verbessern. Die ist in Chrome imho am Besten.
@Deamonic
Mh, eigentlich unterstützt Chrome die volle WebAudio API. Nicht nur "teilweise". Aber es kann auch daran liegen das die ChromeDevs immer noch sagen das es "beta" ist.
Bei Firefox scheint auch in "naher" Zukunft was zu kommen: https://wiki.mozilla.org/WebAudio_API_Rollout_Status
Edit: Oh, wobei, Nightly 23 ist ja schon verfügbar :)
Ah das ist doch schon mal gut. Hoffentlich machen dir nicht wieder ihr eigenes Ding wie bei der Gamepad API. Die müssten sie auch mal an den Standard anpassen, dann würde ich das auch in CrossCode einbauen.
@Deamonic
Mh, eigentlich unterstützt Chrome die volle WebAudio API. Nicht nur "teilweise". Aber es kann auch daran liegen das die ChromeDevs immer noch sagen das es "beta" ist.
Hm, wie wird es in Sachen Kompatibilität aussehen, wenn Chrome von der WebKit-Engine auf die neue Blink-Eninge wechselt?
Hm, wie wird es in Sachen Kompatibilität aussehen, wenn Chrome von der WebKit-Engine auf die neue Blink-Eninge wechselt?
Bei Blink geht es primär um um das Rendering (von Grafiken). Mit Audio hat das wenig zu tun, Zumal die WebAudio API ein Standard ist. Das ist nichts webkit spezifisches. Für dich als Entwickler bleibt wohl alles gleich. Es wird immer noch den Präfix webkit geben. Vllt markieren sie es auch als deprecated und man soll in Zukunft blink als Präfix verwenden. werden wir ja in den kommen Wochen sehen.
Jesus_666
11.05.2013, 15:00
Bei Blink geht es primär um um das Rendering (von Grafiken). Mit Audio hat das wenig zu tun, Zumal die WebAudio API ein Standard ist. Das ist nichts webkit spezifisches. Für dich als Entwickler bleibt wohl alles gleich. Es wird immer noch den Präfix webkit geben. Vllt markieren sie es auch als deprecated und man soll in Zukunft blink als Präfix verwenden. werden wir ja in den kommen Wochen sehen.
Es wird keinen blink-Präfix geben. Blink wird neue Features über versteckte Konfigurationsparameter stellen. Du mußt also in deinem Browser einschalten, daß er Feature XYZ verwenden soll. Sobald die Spezifikation für das Feature von W3C als fertig definiert wird und Blink diese Spezifikation voll unterstützt, wird das Feature dann standardmäßig aktiviert. (Zum Zeitpunkt des Forks bereits existierende webkit-Angaben werden allerdings weiter unterstützt.)
Mit anderen Worten: Wir kommen endlich aus der aktuellen Situation raus, wo alle möglichen Leute in ihren Webseiten Kram verwenden, der noch gar nicht fertig spezifiziert ist, aber dank webkit- in Chrome schon mehr oder weniger läuft. Bonuspunkte, wenn die finale Syntax dann abweicht. Doppelte Bonuspunkte, wenn man so geil war und für keine andere Engine Präfixe angegeben hat, weil zu dem Zeizpunkt kein anderer Browser das Feature hatte. Vendor prefixes waren für ihre Zeit eine gute Idee, aber Webkititis hat dem Web als Plattform doch eher geschadet.
Jo wie gesagt 'vllt'. Hab jetzt nicht so genau da rein gelesen. Zumal mir das eigentlich auch egal ist so lange das Feature funktioniert. Ist auch kein Problem das als Entwickler zu ändern finde ich. Das ist ne Sachen von einige Minuten. Ich hab nichts dagegen wenn Browser einheitlich namen für ihre Features haben. Dann hat man nicht mehr diese dummen abfragen in denen Vendor-Präfixe abfragt :D
Jesus_666
11.05.2013, 17:00
Gut, du kannst einfach keine Präfixe verwenden; dann verzichtest du halt auf das Feature, bis es fertig ist. So funktioniert's in Zukunft mit Blink.
Oder du benutzt -prefix-free, dann ist das auch kein Problem.
Mein Quote of the day von David Heinemeier Hansson (Erfinder von Ruby on Rails):
Back in 2003, Java was actually a real thing that people non-ironically wrote.
https://jira.mongodb.org/browse/PYTHON-532
(...)Step 7. DISCOVER PYMONGO DOES NOT CHECK RETURN VALUES IN MULTIPLE PLACES. DISCOVER ORIGINAL AUTHOR SHOULD NOT BE ALLOWED NEAR COMPUTER(...)
Hilfe :hehe:
Bugfixchaos!
Ich habe ein Projekt in mein privates Gitlab (Open Source Github Klon) geladen und festgestellt, dass die README.txt fehlerhaft dargestellt wird
Ich habe das als Bug in deren Bugtracker auf Github reportet und direkt einen Tipp bekommen, woran es liegen könnte
Ich habe das Ganze gefixt, getestet und einen Pull Request aufgemacht. Dummerweise hatte ich vom falschen Branch aus gefixt, weshalb in dem Pull Request ein paar Commits mehr waren, als geplant
Ich habe den Fix nochmal über das Github Web Interface gemacht und einen weiteren Pull Request geschickt. Dummerweise hat Github dabei wohl irgendwas zerschossen und glaubt, ich hätte sämtliche Zeilen der Datei verändert
Ich habe einen Bug Report an Github gesendet, mit der Bitte, sie mögen ihren online Texteditor reparieren.
Während ich also eigentlich nur meine Seminararbeit in Git verwalten wollte, habe ich mal eben Bugs in zwei verschiedenen Git Webinterfaces entdeckt.
Mein Fazit zu JavaFX 2.2 (im folgenden auch nur "JavaFX" genannt): Schöne Lösung um sowohl RIAs zu schreiben als auch Desktop-Anwendungen zu schreiben.
Pro:
Seit Version 2 ist das normales Java statt eine eigene Scriptsprache.
Man kann GUIs zusätzlich mit FXML- und CSS-Dateien definieren. Das ist wesentlich angenehmer als GUIs komplett im Quellcode zu schreiben.
In FXML-Dateien kann man einen Controller angeben, der beim Parsen der FXML-Datei automatisch instantiiert wird. MVC ist somit schon fast build-in.
Den Zugriff zwischen FXML und Java-Klassen läuft über Annotations beim Controller.
Lässt sich direkt in AWT/Swing und sogar SWT embedden.
In JRE 7 Update 6 wurde JavaFX integriert, NetBeans unterstützt JavaFX in neueren Versionen und für Eclipse Indigo/Juno gibt's einen Plugin namens e(fx)clipse.
Kontra:
Leider noch nicht Feature-komplett: Schönstes Beispiel ist der HTMLEditor, wo man nur mit etwas rumtricksen Buttons in der Kontroll-Leiste ausblenden kann.
Das Binding von (nicht statischen, z.B. aus einem POJO kommende) Daten an die Spalten einer Tabelle oder als Inhalt einer Liste ist ohne 3rd-Party-Library noch sehr umständlich.
Einige Layout-Panes verhalten sich im Zusammenspiel mit z.B. ScrollPanes unerwartet recht merkwürdig.
nudelsalat
12.06.2013, 23:41
Yeah, High Quality Splatting von Punktwolken in WebGL mehr oder weniger fertig. \o/
18025 (http://potree.org/demo/lion/lion_takanawa.html)
Schonmal so als Vorwarnung: am Wochenende ist Molyjam Deux (http://www.molyjam.com/), ein Gamejam mit aus dem Kontext gerissenen Zitaten von Peter Molyneux als Thema.
Drüber gestolpert bin ich durch einen Aushang bei uns an der Uni. Da wird wohl das ganze Wochenende über in den Rechnerräumen der Informatikfakultät gemeinsam gebastelt. Ich werd aber wohl wenn überhaupt von daheim aus teilnehmen.
Du meinst Molydeux, nicht Molyneux.
Die Sprüche sind dieses Jahr wohl tatsächlich vom Original. Zumindest ist jeweils eine entsprechende Quelle angegeben.
Die Sprüche sind dieses Jahr wohl tatsächlich vom Original. Zumindest ist jeweils eine entsprechende Quelle angegeben.
Ah, kontext-freie Sprüche von ihm. Brilliant^^
Desmulator
24.11.2013, 12:27
Kruze Frage: Wir sollen an der Uni den Push-Relabel-Algorithmus von Tarjan implementieren. Um die Kanten eines Knotens im Residualgraphen zu ermitteln, füge ich momentan nicht wirklich eine neue Kante in den Graphen ein, sondern betrachte alle ausgehenden und eingehenden Kanten im ursprünglichen Graphen und ermittle die freie Kapazität (u(e) - f(e) für ausgehende Kanten). Dabei muss man nur beachten, dass bei eingehenden Kanten, die Kapazität einfach nur der aktuelle Flusswert über die Kante ist ( Wert der rückläufigen Kante im Residualgraph hat genau diese Kapazität ). Kanten die voll ausgelastet sind, werden im Graphen nicht gelöscht, beim durchlaufen stelle ich einfach nur fest, ob die "freie Kapazität" größer null ist. Frage jetzt: Währe es schneller wenn ich den Graphen wirklich jedes mal manipulieren würde bzw. ändert das etwas an der Laufzeit von O(n²m)?
Einfach, weil ich es mal in der Form schreiben wollte:
Hash.new{|h,k|h[k]=k<2?k:h[k-2]+h[k-1]}
Na, wer erkennt, was das tut?
Jesus_666
25.11.2013, 18:20
Riecht stark nach Fibonacci.
*schlägt die Formel nach*
Yep, Fibonacci.
Die wahrscheinlich kürzeste Variante, Fibonacci mit Caching zu implementieren. Ich bin aber gerne für Alternativen zu haben.
Moyaccercchi
07.05.2014, 14:33
Heyo. =)
Ich sollte eigentlich für eine Klausur lernen (Compilerdesign, woohoo!) die morgen stattfindet, aber stattdessen schau ich Game of Thrones und habe lustige Ideen... ist ja klar.
Eine solche lustige Idee ist, dass mir gerade die wohl schlechteste Methode in den Sinn kam, zu überprüfen, ob eine Nummer wohl eine ganze Zahl sei oder nicht; das ganze in Javascript, weil ich damit täglich zu tun habe, und man damit so herrlich viel Spaß haben kann:
isInt = function (x) {
arr = [i = -999];
for (; !arr[-1000];) {
arr[i < 1001 ? i++ : -1000] = 1.0;
}
if (arr[x] == true) {
return true;
} else {
return false;
}
}
Die Funktion gibt true zurück, wenn man sie mit einer ganzen Zahl füttert (oder irgendwas, das ganzzahlig ausschaut, zum Beispiel auch für 4.0), und false ansonsten.
Was ich daran toll finde ist, dass:
es nur von -1000 bis 1000 funktioniert - andere Zahlen sind sowieso unwichtig;
magic numbers genutzt werden, um genau -1000 bis 1000 zu erreichen (also -999 und 1001);
die lustigen Verhaltensweisen von Javascript, die man am besten vermeiden sollte, gnadenlos ausgenutzt werden (arrays mit negativem Index? Jupp... arrays mit floats adressieren? Jupp...);
die ternary-Kontrollstruktur um den for-loop zu verlassen sehr - und grundlos - unübersichtlich ist;
es vollkommen grundlos den == Operator verwendet, um floats mit booleans vergleichen zu können, nur um alles noch unübersichtlicher zu machen;
i und arr implizit global deklariert werden - dabei kann ja gar nichts schiefgehen!;
arr jedesmal, wenn die Funktion aufgerufen wird, neu angelegt wird (wenn schon global, dann sollte man das doch wenigstens... ach, was soll's);
am Ende eine unnötige if-Struktur steht, bloß um das Ergebnis des ifs auszugeben - das könnte man auch in einer Zeile haben
Mir ist schon klar, dass man sicherlich noch viel mehr Idiotie in noch viel weniger Zeichen stecken kann, und daher meine Frage an euch alle:
Was ist der schlimmste Code den ihr in ein paar kurzen Zeilen schreiben könnt? Nehmt ruhig die Programmiersprache eurer Wahl; ich bin gespannt, mit was für Unsinn man in den verschiedensten Sprachen so durchkommt. =)
Das schönste was ich je mit C verzapft hatte war eine Rekursion ohne Rekursionsanker, Prozesse quasi-rekursiv zu forken und innerhalb einer Rekursion nach dem Allozieren von Speicher das Freigeben zu vergessen .
Alles schöne Sachen die man erst zur Programmzeit merkt, weil die Speicher- und Prozessorauslastung recht schnell in die Höhe geht.
Was ich auch immer wieder lustig finde, ist wenn man in C/C++ mit Pointern in Arrays rum stochert, statt über den Index zu zu greifen.
Das schrägste was ich mal in einem Quellcode gesehen habe war folgendes:
... (irgendein Code) ...
if(1 == 1)
return();
... (irgendein Code, der aber nie ausgeführt wird) ...
Programmiersprache war da Java, einfach schlechter Programmierstil. Was man nicht braucht, sollte man auskommentieren oder gleich entfernen, sonst wird das Kompilat bei schlechten Compilern größer.
Dee Liteyears
25.06.2014, 13:53
Ich hab mir die Tage das Retro BASIC Sonderheft zugelegt. Ich bin zwar totaler ein programmier Analphabet, aber ich habe so eben mein erstes Listing in meinen MSX getippt^^
20590
20591
Leider endete der 2. Screen in einer Fehlermeldung, was mich veranlasst hat meinen Code mit dem aus dem Heft und dem vom Ursprungsposting zu vergleichen. Und siehe da! Ich hab meinen ersten Code debuggt*g der Fehler lag darin, dass wo bei mir und im Heft
B:WITH32:
steht,
B:WIDTH32:
hätte stehen müssen.
Jedenfalls bin ich neugierig wie das Ergebniss sein wird wenn ich korrigierte Fassung eingebe.
Ziel des ganzen ist übrigens ein Spiel bei dem man am oberen Bildschirmrand seine Spielfigur nach links und rechts steuern kann und den von unten etgegenscrollenden Sternen ausweichen muss. Je länger man durchhält desto höher ist die Punktzahl und es ist möglich die Spielfeldbreite einzustellen.
Für die Neugierigen, hier ist der Originalpost
http://www.msx.org/forum/development/msx-development/tweetable-msx-basic-game
Schon Schade, dass das alles vor meiner Zeit war. Ich hätt da bestimmt Spaß dran gehabt^^
Whiz-zarD
25.06.2014, 15:08
Das erinnert mich an die ganze Abtipperei auf dem C64 :D
Für Menschen jüngeren Alters: Früher veröffentlichen Programmier-Magazine ihre Programme per Quellcode in Papierform, die man dann abtippen musste.
Es gab dann die Möglichkeit die Programme auf einer Diskette/Datasette zu bestellen. Später gab es dann zwei Ausführungen des Magazins. Entweder mit Diskette oder ohne. Die mit Diskette war dann deutlich teurer.
Irgendwo müsste ich noch ein Buch für den C64 haben, mit Spielen zum Abtippen. ^^
Wollte jetzt keinen extra Thread dazu aufmachen, aber ich habe diese Aufgabe hier gekriegt:
Entwickeln Sie für eine fiktive Onlinecommunity folgende Datenstrukturen:
eine Datenstruktur für Personen
eine Datenstruktur für Gruppen
Jede Datenstruktur muss mind. ein elementares Datum der Typen String, Integer, Real, Boolean und Char enthalten. Zudem sollte jede Datenstruktur eine Liste und ggf. eine weitere Datenstruktur (z.B. Datum oder Bild) enthalten.
Definieren Sie zudem einen Algorithmus um herauszufinden, welche Gruppe am meisten Personen mit dem Interesse "Spiele" hat.
Ich soll das hier nachbearbeiten, hab ich gemacht und war natürlich falsch. Ich habe sowas definiert:
TYPE Person IS RECORD OF
vorname: String
nachname: String
alter: Integer
END
allePersonen : LISTE MIT Personen
alleGruppen : LISTE MIT Gruppen
Person BESTEHT AUS Gruppe BESTEHT AUS
vorname: String gruppenName: String
nachname: String thema: String
alter: Integer beschreibung: String
anwesend: Bool anzMitglieder: Integer
groesse: Real mitglieder: LISTE MIT Personen
geschlecht: Char oeffentlich: Bool
interessen: LISTE MIT Strings
interessen: LISTE MIT Strings
Bei interessen habe ich einfach einen String eingegeben den man auch in der Gruppe finden soll, damit es einfacher ist die Gruppe mit den meisten Spielern zu finden. Prof. Assisten schrieb mir:
"Das Attribut "Interesse" in der Datenstruktur "Gruppe" abzufragen, ist der falsche Ansatz." Ja was wäre den der richtige Ansatz...?
Whiz-zarD
21.11.2014, 07:37
Das Attribut "Interessen" an der Gruppe ist ja kein Indikator dafür, ob es nun die Gruppe ist, mit den meisten Personen, die die Interesse "Spiele" haben.
Das Attribut kann höchstens nur zur besseren Übersichtlichkeit dienen, welche Gruppen überhaupt welche Interessen besitzen, damit eine Person diese Gruppe auch findet.
Man kann ja aber dennoch eine Gruppe erstellen, die die Interesse "Spiele" besitzt, aber keine Person in dieser Gruppe hat in seinem eigenen Profil "Spiele" als Interesse angegeben.
Um nun herauszufinden, welche Gruppe die meisten Personen besitzt, die als Interesse "Spiele" besitzt, musst du nun durch die Liste der Mitglieder iterieren, und die Personen zählen, welche diese Interesse besitzt.
Darüber hinaus ist das Attribut "anzMitglieder" redundant und fehleranfällig. Die Anzahl der Mitglieder ergibt sich schon aus der Liste der Mitglieder. "anzMitglieder" ist in dem Sinne Fehleranfällig, weil dieses Attribut jedes Mal aktualisiert werden muss, wenn eine Person sich aus der Gruppe ein- oder austrägt. Diese Implementierung vergisst man schnell im Eifer des Gefechts, oder man muss ein Datenbank-Korrektur-Script ausführen, das dies nicht beinhaltet, und schon hat man inkonsistente Daten.
Das Attribut "Alter" würde ich auch gegen "Geburtsdatum" austauschen, da sich das Alter jedes Jahr ändert. Geburtsdatum hingegen nicht und daraus lässt sich ja bekanntermaßen das Alter berechnen ;)
Das Geburtsdatum ließe sich ja auch über die Unix Time (https://de.wikipedia.org/wiki/Unixzeit) als Integer abbilden. (Vorausgesetzt man ist nicht früher als 1.1.1970 geboren ^^)
Whiz-zarD
29.04.2015, 18:43
Microsoft hat auf der derzeit stattfindenden Build 2015 (http://www.buildwindows.com/) den Code-Editor Visual Studio Code (https://code.visualstudio.com/), u.a. auch für Linux und OS X, vorgestellt. Damit wollen sie die Cross-Plattform-Entwicklung weiter vorantreiben. Dies ist aber ein reiner Editor und keine Entwicklungsumgebung mitsamt Compiler. Kompilieren müsste man dann schon selber (z.B. mit Mono wer C# unter Linux verwenden möchte). Da der Code-Editor aber nicht nur C# versteht, sondern mehrere Sprachen (darunter auch PHP, Python, JavaScript, HTML, CSS) könnte der Editor auch für Webentwicklung eingesetzt werden. Für JavaSript gibt es sogar eine IntelliSense-Unterstützung, und für ASP.NET 5- und Node.js Applikationen gibt es auch Debugging-Möglichkeiten.
Jesus_666
29.04.2015, 21:27
Hm. Einerseits hat VS einen guten Ruf, andererseits klingt "es ist wie VS, nur daß es keine IDE ist" etwas merkwürdig (und ich mag es, in einer IDE zu arbeiten) und Microsoft hat sich in den letzten Jahren einen Ruf für bizarre User Interfaces erarbeitet. Daß VS Code in den Screenshots ein wenig wie Sublime Text mit einer unbeschrifteten Iconleiste an der Seite aussieht, hilft da nicht.
Könnte gut sein, vielleicht auch nicht. Ich denke, ich warte erst mal ein Jahr oder so und sehe dann, was die Leute sagen.
Ich habs am Donnerstag mal ganz kurz ausprobiert. Das ist im Wesentlichen ein Atom Klon. Davon kann man jetzt halten, was man will.
Auch ausprobiert, die Menüleiste von VS Code verträgt sich mit dem KDE(5)-Theme Breeze nicht und ist somit fast gar nicht lesbar (graue Schrift auf grauen Hintergrund).
Ich habe es aber einen Augenblick später wieder deinstalliert.
Ich bin mir nicht ganz sicher, ob folgendes hier was zu suchen hat. Ich probiers trotzdem:
Zachtronics hat ein Programmier-Spiel namens TIS-100 (GoG-Link (http://www.gog.com/game/tis100), Steam-Link (store.steampowered.com/app/370360), jeweils Windows- und Linux-Version) veröffentlicht, in welcher man mit einer Assembler-ähnlichen Programmiersprache Aufgaben erfüllen darf. Es fängt schon stilecht damit an, dass man sich ein ca. 14-seitiges PDF-Dokument, in der die Syntax erklärt wird, bestenfalls ausdrucken soll^^.
Das Spielprinzip sieht ungefähr so aus, dass bestimmte Patterns von einem IN-Port kommen, diese der Aufgabenstellung gemäß bearbeitet und dann nach OUT-Ports weitergeleitet werden müssen. Mangels Assembler-Erfahrung kann ich nicht sagen, wie akkurat die Bearbeitung wirklich abläuft, aber soviel kann ich schon sagen: Das Spiel macht verdammt viel Spaß und lässt tatsächlich den Kopf rauchen. Ist IMHO wert, es mal gespielt zu haben, wenn man sich selbst mindestens Hobbyprogrammierer schimpft^^...
Das ist megageil, sollte sich jeder jemals zulegen!
Gekauft und direkt die ersten paar Levels gespielt. Gefällt.
Hey, danke für den Tipp. Von der Spielbeschreibung alleine hätte ich nicht gedacht, dass es so viel Laune macht.
Warum gibt es org-mode nur für emacs /o\
Warum fühlt sich emacs mit evil-mode immer noch nicht gut an /o\
Warum ist vimscript so blöd und elisp so cool /o\
Warum kann es keinen coolen emacs- oder vim-fork geben, der die gute Textverarbeitung vom vim mit der krassen Erweiterbarkeit (von mir aus auch nur org-mode, ich bin nicht wählerisch) von emacs kombiniert /o\
Der Buddhismus hat recht, das Leben ist von Leid geprägt.
Der Buddhismus hat recht, das Leben ist von Leid geprägt.
Sublime Text ausprobiert? Soll einen brauchbaren vim-mode haben.
Sublime Text ausprobiert? Soll einen brauchbaren vim-mode haben.
Ja, aber kein org-mode. Ich will entweder org-mode in vim oder einen emacs, der sich verhält wie vim.
Ja, aber kein org-mode. Ich will entweder org-mode in vim oder einen emacs, der sich verhält wie vim.
https://github.com/danielmagnussons/orgmode
Das mal angesehen? Oder tut das nicht alles was du willst?
https://github.com/danielmagnussons/orgmode
Das mal angesehen? Oder tut das nicht alles was du willst?
Nicht mal ansatzweise :hehe:
Ich habe die schon alle durchprobiert. Von dem Kaliber gibt es auch diverse direkt für vim.
Übrigens: Rest In Peace - Ian Murdock, Gründer des Debian-Projekt, hat sich für basisdemokratische Software-Entwicklung stark gemacht
Die Umstände wie er zu Tode gekommen ist, sind noch nicht aufgeklärt worden. Die letzten archivierten Tweets von ihm: http://archive.is/OPlI7
Bevor man daraus Spekulationen zieht folgendes:
Murdocks Familie bittet, im Respekt für seine Privatsphäre Spekulationen über die Todesursache zu unterlassen. (Quelle http://heise.de/-3057053)
Debian ist die Linux-Großmütterchen-Distribution schlecht hin, besonders die Stable-Version. Die einzige Version mit recht aktueller Software ist das instabile Debian Sid, aus welcher Ubuntu damals abgespalten wurde.
Das Debian-Projekt ist bekannt für lange, ausschweifende - und imho nicht immer über der Gürtellinie stattfindende - Diskussionen und diversen Abspaltungen.
Frohes Neues Jahr 2016 dem Progforum. Auf das das neue Jahr uns mehr Aktivitaet bringt.
Whiz-zarD
03.01.2016, 15:04
Auch noch ein frohes neues Jahr von mir :)
Ich hab zu Weihnachten nun ein 7" Touchscreen für mein Raspberry Pi bekommen.
Hat einer eine Idee, was man dafür basteln könnte?
Ebenfalls Frohes Neues Jahr. :)
Ich hab zu Weihnachten nun ein 7" Touchscreen für mein Raspberry Pi bekommen.
Hat einer eine Idee, was man dafür basteln könnte?Ich für meinen Teil hab ein 2.8"-Touchdisplay für den Pi und mir eine Benutzeroberfläche zusammengehackt/programmiert, mit dem ich diverse Serveraufgaben steuere. Hab quasi eine Art "Taschenserver" dabei, mit dem durch einen Fingerzeig DHCP-/DNS-/NTP-Server etc. starten und konfigurieren kann. Wenn ich mich ein wenig in Samba eingelesen habe, hoffe ich, auch einen AD-Server damit konfigurieren zu können... Das Ding wird natürlich keinen Server ersetzen, aber es reicht, um IT-Interessierten diverse Serverdienste zeigen und erklären zu können, ohne sie vor einem Windows-Server oder einer Linux-Kommandozeile hinsetzen zu müssen... Und, weil ich sowas gerne zusammenhacke/programmiere^^.
Beim 7"-Display hab ich mir auch schon überlegt, ob ich mir eines zulegen soll. Interessant finde ich da v.a. die Multitouch-Funktion (10 Klicks gleichzeitig können erkannt werden, oder?). Im Endeffekt war das genau der Grund, weshalb ich es mir noch nicht geholt habe: Außer einem Digitalen Bilderrahmen weiß ich ebenfalls nichts, was ich damit machen könnte^^...
KingPaddy
18.01.2016, 12:51
Die Frage eines unbedarften Laien:
Was bedeutet es, wenn bei einer Versionsnummer an den Build-Teil noch ein Buchstabe angehängt wird, also 1.1.0.0006f bspw.?
Whiz-zarD
18.01.2016, 13:56
Die Frage eines unbedarften Laien:
Was bedeutet es, wenn bei einer Versionsnummer an den Build-Teil noch ein Buchstabe angehängt wird, also 1.1.0.0006f bspw.?
Das können nur die Entwickler selbst beantworten ;)
Da hat jede Firma seine eigene Philosophie, wie sie die Builds durchnummerieren.
KingPaddy
18.01.2016, 14:11
Das können nur die Entwickler selbst beantworten ;)
Da hat jede Firma seine eigene Philosophie, wie sie die Builds durchnummerieren.
Ich hatte mich gefragt, wenn Builds schon eher die kleinsten Einheiten darstellen, was drückt man denn dann methodisch aus, wenn man dann noch einen Buchstaben anhängt? Alternierende Versionen des gleichen Builds?
Whiz-zarD
18.01.2016, 14:42
Naja, wie gesagt, das kann dir nur die Firma selbst sagen. Da gibt es keine pauschale Antwort.
Vielleicht wird ja auch kein Buchstabe drangehängt, sondern sie benutzen das Hexadezimalzahlensystem (https://de.wikipedia.org/wiki/Hexadezimalsystem). Dann hast du auch Buchstaben von A bis F.
Samsung verwendet z.B. Buchstaben als Code, wann das Build gebaut wurde. So lässt sich anhand der Buildnummer erkennen, in welchem Jahr und in welchem Monat das Build gebaut wurde.
Vielleicht steht das f bei dir auch für eine Plattform, oder ob es eine 32- oder 64-Bit-Anwendung ist, etc.
*Staub wegpust*
Habe mir vor kurzem den neuen Raspberry Pi 3 (sowie ein Gehäuse, SD-Karte und USB-Netzteil) bestellt, mal schauen wann das ankommt. Ich werde da denke ich mal den ARM-Port von Arch Linux als Basis-System installieren.
Das wird einfach meine Kiste zum Herumexperimentieren sein. Ein Glück hat das Teil nun WLAN und Bluetooth.
Whiz-zarD
06.06.2016, 14:56
Eine C#-Klasse mit über 15.000 LoC. Da kommt Freude auf ...
Hehe, einen RPi3 nutze ich derzeit für Retropie (https://retropie.org.uk/) (eine Linuxdistro, die rund um Retroarch gebaut wurde - damit lassen sich alle möglichen Spiele bis inkl. PS1 ohne große Probleme emulieren)... Das Ding hat mich zwar einige Nerven gekostet und ist definitiv nichts für einen Linux-Anfänger, aber wenn es mal läuft (wofür ich erstmal 2-3 Tage brauchte, um mich endlich einzuarbeiten), läuft es butterweich... Und Basteln gehört nunmal dazu ;)
Und ich hatte das Riesenglück, einen Pi Zero (https://www.raspberrypi.org/products/pi-zero/) zu ergattern. Bin gespannt wann das Teil ankommt^^...
Ich habe mir ein Bluetooth-Keyboard für mein Pi3 geholt. Das Verbinden, Pairing und Authentication war eine kleine Odyssee, aber jetzt kann ich darauf tippen und es erscheint tatsächlich auf meinem Bildschirm - gut soweit.
Aber leider funktionieren die F-Tasten noch nicht, also F1 bis F12. Mit meinem MBP funktioniert die Tastatur einwandfrei.
Docker ist ein •••••••••.
Whiz-zarD
07.11.2016, 07:22
foreach(...)
{
if(...)
{
foreach(...)
{
foreach(...)
{
if(...)
{
foreach(...)
{
if(...)
{
foreach(...)
{
foreach(...)
{
...
}
}
}
}
}
}
}
}
else
{
throw new Exception();
}
}
Manchmal könnte ich hier einige Entwickler echt in den Arsch treten ... >:(
Hey, mit O(N^6) bist du noch in P, also tractable. Und ohne das wirre Exception Handling wäre Java Programmieren doch glattwegs langweilig. So fühlt man sich wie ein Indiana Jones, der jederzeit mit allerlei Fallen rechnen muss.
Vor einiger Zeit wurde hier ja mal als Tipp das Programmierspiel TIS-100 von Zachatronic gepostet.
Der Entwickler hat jetzt sein neues Projekt Shenzen I/O (Link) (http://store.steampowered.com/app/504210/?l=german) veröffentlicht. Diesmal geht es darum fiktive Mikrocontroller zu programmieren. Habe die ersten paar Puzzles gespielt und es sieht schon wieder sehr unterhaltsam aus - das Spiel kombiniert das Programmieren aus TIS-100 mit dem "Reaktorlayout"-Konzept aus Space Chem. Man darf erwarten dass es später wie auch in den anderen Zachatronic-Spielen wohl wieder sehr knifflig wird.
starlight86
23.11.2016, 08:32
easyrpg (spiele rpgmaker-games auf u.a. android), tttool (tiptoi-reverse-engineering) sind 2 coole Projekte
(und eigentlich wollte ich nur irgendein Lebenszeichen mal hier lassen)
easyrpg (spiele rpgmaker-games auf u.a. android), tttool (tiptoi-reverse-engineering) sind 2 coole Projekte
(und eigentlich wollte ich nur irgendein Lebenszeichen mal hier lassen)
Warum macht sich jemand die Mühe einen obskuren Rätselstift (https://www.tiptoi.com/start/index.html) zu analysieren? In der Zeit könnt man doch einige Assemblersprachen zu nicht mehr gebauten System lernen.
Wow, dein letzter Post hier war vor Chromes Release. xD
starlight86
01.12.2016, 10:14
Warum macht sich jemand die Mühe einen obskuren Rätselstift (https://www.tiptoi.com/start/index.html) zu analysieren? In der Zeit könnt man doch einige Assemblersprachen zu nicht mehr gebauten System lernen.
Wow, dein letzter Post hier war vor Chromes Release. xD
Ja, ich war lange nimmer hier.
Multimediaxis war meine digitale Heimat zum RPGMakern als Jugendliche (ok, ein Teil, ich war noch in einem anderen Forum). Damals hiess es noch anders (und ich war auch auf Parallactic (oder so ähnlich)). Draus geworden ist kein Spiel, aber eben ein wenig die Lust am Programmieren. Dann habe ich Abi gemacht, studiert, Familie gegründet, Berufseinstieg (ok, da bin ich noch dran, so richtig im Beruf angekommen fühle ich mich nicht) - und derweil halt immer mehr vom Makern entfernt. Jetzt kam die jährliche Geburtstagsmail, und da dachte ich 'mal sehen, wer noch so da ist'.
EasyRPG ist cool, weil RPGMaker Spiele fürs Smartphone halt einfach ideal sind - und die ganzen Klassiker doch immer noch cool sind (UiD, VD, Tara...) - man wieder neue finden kann (ich war nur im deutschsprachigen Raum unterwegs, anderssprachige Communities haben doch deutlich andere Spiele gemacht). - kurz, das ist ein bisserl Nostalgie - da ich aber leider keine Zeit habe, da Energie reinzustecken, hoffe ich, hier wen zu begeistern ^^
tiptoitool ist deswegen was cooles, weil man damit eben coole Sachen machen kann. Und viele Leute in meinem Alter (Geburtsjahr im Nick ^^), die beruflich programmieren, Kinder haben (oder bald bekommen) und da so einen Stift gerne an ihre Kinder verschenken - und dann damit ohne viel Aufwand kleine Personalisierungen machen können. Von Projekten damit weiss ich:
1) Monkey Island physikalisch
2) neuvertonung von bestehenden tiptoi-Sachen
3) Geschenkkarten an Weihnachtsgeschenke, sodass ein Kindergartenkind verteilen kann (ohne lesen können zu müssen)
4) Schatzsuche
Also ist das für Eltern durchaus sinnvoll, da man damit zwar seinen Technikspieltrieb nachgehen kann, aber eine halbe Ausrede hat, warum das doch für die Kinder gut ist. Ehrlich gesagt, fehlt mir eine Idee, was man cooles mit machen kann, um mich wieder dran zu setzen.
Jeden Tag ein kleines Programmierpuzzle gibt es wie letztes Jahr wieder im Advent of Code Adventskalender:
http://adventofcode.com (http://adventofcode.com/2016/day/1)
Docker ist ein •••••••••.
Docker ist doch kein •••••••••.
Docker ist doch kein •••••••••.
Docker ist doch ein •••••••••, aber nur auf Windows.
Docker ist doch ein •••••••••, aber nur auf Windows.
Volle Zustimmung. Ich hab mal eine Woche damit zugebracht, einen Docker-Container zusammenzubauen, der ein Buildsystem für C#-Projekte auf Basis von GitLab CI und Visual Studio 2017 Community Edition zur Verfügung stellt. Es ist eine wahnsinnige Quälerei und ich hab ihn wenige Tage, nachdem er produktiv war, wieder durch eine vollwertige VM ersetzt.
Könntet ihr wenigstens kurz elaborieren, was Docker ist, wenn ihr schon darüber schimpft ?
Irgendwo zwischen chroot und Minimalvirtualisierung. Du kannst dir Container bauen, die den gleichen Kernel nutzen, wie das Betriebssystem, aber ansonsten vollkommen voneinander isoliert sind. Eigenes virtuelles Dateisystem, eigener RAM, ggf. eigener Netzwerkstack. Im Vergleich zu echten VMs ist das ressourcensparend genug, dass man jedem Programm seinen eigenen Container geben kann. Die Hauptvorteile sind, dass man die Containerimages für extrem viele Programme fertig konfiguriert runterladen kann und dass das im Serverbetrieb sehr viel sicherer ist, als alles direkt im gleichen Kontext laufen zu lassen. Wenn jemand eine Sicherheitslücke in meinem Datenbankserver findet, dann kann er sich höchstens in dem Container austoben, in dem die Datenbank läuft und reißt nicht gleich die ganze Maschine mit.
Zusätzlich gibt es auch noch recht komfortable Lösungen, um Docker Container automatisch auf die Knoten in einem Cluster zu verteilen und viel viel mehr. Das würde den Umfang dieses Posts jetzt sprengen.
Das Problem mit Docker unter Windows ist, dass die Container keine grafische Oberfläche haben, sondern man alles (inklusive der Softwareinstallation) über PowerShell oder CMD machen muss. In der Theorie mag das funktionieren, in der Praxis ist es ein furchtbares Gefrickel.
Jemand schonmal in VBA programmiert? Vorneweg, hört niemals darauf, wenn jemand sagt, das Ding kann OOP (https://de.wikipedia.org/wiki/Objektorientierte_Programmierung). Irgendwie kann es das, aber nur in einer grausam-frickeligen, überhaupt nicht durchsichtigen und pervers verdrehten, Gehirnzellen-zerstörenden Variante. Wäre H.P. Lovecraft Programmierer gewesen, er hätte OOP in VBA erfunden.
Man kann in VBA - wie mit jedem anderen GUI-Toolkit ja auch - Buttons (etc.) eine "Methode" (Anführungszeichen sind absichtlich eingefügt worden) zuweisen, was aufgerufen werden soll, wenn man draufklickt.
In Microsofts VBA-Welt muss diese "Methode" aber ein Unterprogramm einer Prozedur sein. Aber was ist, wenn man eine echte Methode innerhalb des Objekts aufrufen will? Tjoar, ähm... geht nicht. Es ist nicht möglich, es gibt schlicht keinen Befehl dafür. Wie, du willst nach dem Button-Druck irgendwas an dem Objekt verändern? Pech gehabt, geht heutzutage nur in gefühlt 99,9% aller Sprachen mit OOP, aber nicht in VBA... Also darf man irgendwelche Workarounds benutzen die Programmierer besonders (un)glücklich machen, etwa globale Variablen... Und in allen VB-Foren dieser Welt bekommst du verwunderte User, die fragen, weshalb man sich überhaupt mit Klassen beschäftigen soll, wenn eh alles so gut in Prozeduren läuft...
(EDIT: Nur der Vollständigkeit halber: "Me" (Äquivalent zu "this" in Java und "self" in Python) lässt sich per Parameter auch nicht übergeben, sodass der Umweg über eine Prozedur, die besagte Methode am Objekt aufruft, auch nicht klappt. :gah2:)
Ich installier mir jetzt Python und darauf irgendein Excel-Binding...
---
Trotz des Rants grade wünsch ich jedem Frohe Weihnachten und einen guten Rutsch ins Neue Jahr! :)
Whiz-zarD
26.12.2017, 00:16
VBA darf man nicht mit VB verwechseln. Das sind im Grunde zwei unterschiedliche paar Schuhe, auch wenn beide die selbe Syntax teilen und da liegt die Falle: Während VB doch objektorientiert ist, ist VBA für prozedurale Entwicklung gedacht. Es gibt zwar in VBA sowas wie Klassen und Objekte aber es gibt keine Vererbungen oder keine Interfaces.
In Microsofts VBA-Welt muss diese "Methode" aber ein Unterprogramm einer Prozedur sein.
Nein, es ist eine Prozedur. Die nennen sich nur Unterprogramm. Methoden werden in zwei Arten unterteilt:
- Unterprogramme: Sie haben keinen Rückgabewert
- Funktionen: Sie haben einen Rückgabewert
Aber was ist, wenn man eine echte Methode innerhalb des Objekts aufrufen will? Tjoar, ähm... geht nicht.
Ich verstehe nicht, was du meinst. Das geht doch.
Wie, du willst nach dem Button-Druck irgendwas an dem Objekt verändern? Pech gehabt, geht heutzutage nur in gefühlt 99,9% aller Sprachen mit OOP, aber nicht in VBA...
Das ist nicht korrekt. Wie auch in allen anderen OOP-Sprachen, muss das Objekt existieren. Also muss es auch irgendwo instanziiert und gehalten werden. In anderen OOP-Sprachen spricht man von Klassenvariablen oder Klassenmember und du kannst pro Modul solche Variablen/Member anlegen, die auch nur im Modul sichtbar sind und nicht global.
Und in allen VB-Foren dieser Welt bekommst du verwunderte User, die fragen, weshalb man sich überhaupt mit Klassen beschäftigen soll, wenn eh alles so gut in Prozeduren läuft...
Wie gesagt, VBA ist keine richtige objektorientierte Sprache. VBA wird auch nicht wirklich von Softwareentwicklern verwendet, sondern überwiegend von Endanwender, die sich damit irgendwas zurecht frickeln und sich auch gar nicht mit Objektorientierung auskennen. Wir haben da inzwischen auch einige Projekte am Laufen, weil unsere Kunden die Aufforderung bekommen, ihre Prozesse, die sie überwiegend mit Excel-Makros gelöst haben, in eine standardisierte und dokumentierte Software zu überführen und was man da sieht, ist echt gruselig.
Ich installier mir jetzt Python und darauf irgendein Excel-Binding...
Microsoft prüft gerade, ob sie Python nicht als offizielle Sprache in Excel einführen wollen:
https://www.bleepingcomputer.com/news/microsoft/microsoft-considers-adding-python-as-an-official-scripting-language-to-excel/
Trotz des Rants grade wünsch ich jedem Frohe Weihnachten und einen guten Rutsch ins Neue Jahr! :)
Gleichfalls. :)
Docker ist doch ein •••••••••, aber nur auf Windows.
docker/wordpress ist ein •••••••••.
Ich verzichte freiwillig auf 10% Gehalt, wenn das heißt, dass ich NIE WIEDER mit einem User reden muss.
Alle User müssen brennen. Dasselbe gilt für IT. My life is strictly a developer only space now.
Surface Dweller
16.04.2020, 18:31
Der Ton hier ist genau der gleiche wie im IRC-Channel unserer Sysadmins.
Docker ist doch ein •••••••••, aber nur auf Windows.
Docker ist überall ein •••••••••. "sudo apt-get install •••••••••" <- installiert Docker. Es gibt 2 Arten von Entwicklern: Entwickler noch nichts gescheites mit Docker gemacht haben und Entwickler die Docker scheiße finden.
Stattdessen kann ich normale LXC-Container mit Orchestrationsoftware (um schnell mal einen Dev-Container zu bauen) empfehlen; hat sich einigermaßen bewährt.
wer ist eigentlich auf die enorm kluge idee gekommen, dass C-c in GUI Kopieren ist und auf CLI Prozess killen
Ich verlasse mich nie mehr auf irgendwas, was ich im Internet lese.
Internet: Python ist gut! Tatsächlich leider: Python ist nicht gut.
Internet: Perl ist nicht gut! Tatsächlich aber: Perl ist gut.
Und jetzt soll ich mich auf das verlassen, was ich von dir im Internet lese?
Und jetzt soll ich mich auf das verlassen, was ich von dir im Internet lese?
http://cherrytree.at/misc/smilies/032gruebel.gif
sollten wir in this.next() (#) besprechen
Ich verlasse mich nie mehr auf irgendwas, was ich im Internet lese.
Internet: Python ist gut! Tatsächlich leider: Python ist nicht gut.
Internet: Perl ist nicht gut! Tatsächlich aber: Perl ist gut.
Ne stimmt nicht. Python ist gut.
boah weiß nicht
virtualenv is a very popular tool that creates isolated Python environments for Python libraries. If you're not familiar with this tool, I highly recommend learning it, as it is a very useful tool, and I'll be making comparisons to it for the rest of this answer.
It works by installing a bunch of files in a directory (eg: env/), and then modifying the PATH environment variable to prefix it with a custom bin directory (eg: env/bin/). An exact copy of the python or python3 binary is placed in this directory, but Python is programmed to look for libraries relative to its path first, in the environment directory. It's not part of Python's standard library, but is officially blessed by the PyPA (Python Packaging Authority). Once activated, you can install packages in the virtual environment using pip.
pyenv is used to isolate Python versions. For example, you may want to test your code against Python 2.7, 3.6, 3.7 and 3.8, so you'll need a way to switch between them. Once activated, it prefixes the PATH environment variable with ~/.pyenv/shims, where there are special files matching the Python commands (python, pip). These are not copies of the Python-shipped commands; they are special scripts that decide on the fly which version of Python to run based on the PYENV_VERSION environment variable, or the .python-version file, or the ~/.pyenv/version file. pyenv also makes the process of downloading and installing multiple Python versions easier, using the command pyenv install.
pyenv-virtualenv is a plugin for pyenv by the same author as pyenv, to allow you to use pyenv and virtualenv at the same time conveniently. However, if you're using Python 3.3 or later, pyenv-virtualenv will try to run python -m venv if it is available, instead of virtualenv. You can use virtualenv and pyenv together without pyenv-virtualenv, if you don't want the convenience features.
virtualenvwrapper is a set of extensions to virtualenv (see docs). It gives you commands like mkvirtualenv, lssitepackages, and especially workon for switching between different virtualenv directories. This tool is especially useful if you want multiple virtualenv directories.
pyenv-virtualenvwrapper is a plugin for pyenv by the same author as pyenv, to conveniently integrate virtualenvwrapper into pyenv.
pipenv aims to combine Pipfile, pip and virtualenv into one command on the command-line. The virtualenv directory typically gets placed in ~/.local/share/virtualenvs/XXX, with XXX being a hash of the path of the project directory. This is different from virtualenv, where the directory is typically in the current working directory. pipenv is meant to be used when developing Python applications (as opposed to libraries).
As of writing, pipenv has not seen a release on Pypi since November 2018, and there are no commits on GitHub since November 2019. The documentation website pipenv.org is down (#4137), and users are posting issues asking whether pipenv is dead
(*_*)
tooling so anstrengend wie bei javascript
Surface Dweller
12.05.2020, 09:05
Perl ist wegen den ganzen CPAN-Modulen und der immer noch relativ guten Geschwindigkeit ganz brauchbar aber ein größeres Perl-Projekt bei dem mehr als 3 Personen Code schreiben würde ich heute nicht mehr anreißen (den ganzen Wahnsinn um $_, @_, Skalar/Listenkontext,... und den 1000 Möglichkeiten um genau die gleichen Standardroutinen zu implementieren würde ich mir nicht ohne guten Grund antun). Vielleicht Ist Raku/Perl 6 in der Hinsicht besser; hat zumindest mal vielversprechend ausgesehen.
Ja, was Großes würde ich damit auch nicht anfangen, aber ich glaube das ist jetzt meine Lieblings-"Kurz was scripten"-Sprache.
Jesus_666
12.05.2020, 10:33
Ich muss aber auch sagen, dass Python keinen Spaß macht. Ja, es ist für gewisse Use-Cases wahnsinnig schnell, aber das Tooling ist echt einfach nur grauenhaft, insbesondere wenn man Python als Abhängigkeit von irgendwas in ein anderes Projekt einbindet und nicht ein reines Python-Projekt macht. Da wäre etwas wie Composer eine Million mal angenehmer zu benutzen als Pythons obskurer Salat aus venv, pip, pro-Projekt-Runtimes und weiteren Dingen, die mich nicht interessieren, wenn ich einfach nur einen in Python geschriebenen PDF-Renderer mit seinen Abhängigkeiten in meiner C#-Anwendung verwenden will.
Ich habe das Gefühl, dass Python so eine polarisierende Sprache ist. Entweder geht man voll darin auf oder man findet sie furchtbar.
Ja, was Großes würde ich damit auch nicht anfangen, aber ich glaube das ist jetzt meine Lieblings-"Kurz was scripten"-Sprache.
Das ist für mich in der Regel der Punkt, wo ich zu Ruby greife, das ja ursprünglich genau für diesen Anwendungsfall als Perl-Nachfolger entwickelt wurde.
Ja stimme zu, Tooling ist katastrophal.
Ich dachte die Aussage bezog sich auf die Sprache an sich, die ist nämlich sehr schön.
pyenv funktioniert an sich problemlos, aber was die 30 venv Varianten angeht ist es ein wenig die Suche nach dem geringsten Übel. Wer ein Lockfile für dependencies braucht, kommt um pipenv wohl nicht herum, es sei denn man möchte die dependencies selbst resolven. poetry ist vielleicht ein Hoffnungsschimmer, verfügt aber noch nicht über die essentielle pipenv install --deploy Funktion.
Jesus_666
12.05.2020, 22:36
Meine Lösung war, den ganzen Kram inklusive Runtime zu einer monolithischen DLL zu kompilieren. Manchmal kommt man mit sowas durch...
(Ich mag die Sprache selbst tatsächlich auch nicht, aber das ist persönlicher Geschmack und kein Problem der Sprache an sich.)
Ich sehne den Tag herbei, an dem WSL einfach mal funktioniert.
Maturion
12.06.2021, 16:55
Ich nicht. Bin schon seit Jahren mit dem Original unterwegs. ;)
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.