Beiträge von Scrayos


    #push: Lange ist es her, dass dieses Thema aktualisiert wurde. Nun wurde der erste Post an unser neues PDF-Design angepasst und die Informationen sind ebenfalls auf dem neuesten Stand. Dabei haben wir uns von einer Menge Text getrennt und versucht die Informationen weiter aufzubereiten und auf das Wichtigste herunter zu brechen. Für das Thema wurde die PDF zudem in ein Bild konvertiert. Für die optimale Ansicht empfehlen wir jedoch die PDF im Original über einen Klick auf die Grafik oder das Banner oberhalb zu öffnen. Wir wollen dieses Thema ab sofort wieder häufiger mit Neuigkeiten versorgen und freuen uns mit dem aktualisierten Thema nun den Grundstein dafür gelegt zu haben!

    Äh, ...

    auch ich scheine deiner Argumentation nicht ganz folgen zu können. Meine Verwunderung über deine Argumentationskette begründet sich vor Allem darin, dass ja von der verlinkten Hytale-News-Seite auf das Hytale-Forum von MCSEU verlinkt wird, und nicht andersherum. Entsprechend wundert mich, dass du beklagst, dass im Impressum von MCSEU nichts hierzu vermerkt ist. Aber das wäre doch auch der falsche Ort, oder nicht?

    Ich könnte durchaus verstehen, wenn du eine Ungereimtheit in dem Fehlen eines Hinweises auf das externe Forum seitens der News-Seite sehen würdest. Es erschließt sich mir allerdings nicht, welchen Fehler MCSEU hier – abgesehen von dem falschen Routing beim Hytale-Forum und dem dadurch verschuldeten Nichtvorhandensein des Impressums – gemacht haben soll. Vielleicht könntest du da die Sachlage aus deiner Perspektive noch einmal näher darlegen.

    Heyho,


    die Zielgruppe besteht hauptsächlich aus denjenigen, die bereits eine der vielen "Bukkit-Tutorial-Reihen" angeschaut haben. Es geht mir also definitiv nicht darum Bukkit geschweige denn Java neu zu vermitteln, sondern viel mehr vorhandene Fehler oder schlechte Angewohnheiten auszubügeln, die sich durch die Tutorial oder im Laufe der Zeit eingeschlichen haben. Darüber hinaus möchte ich noch einige Ebenen auf das Tutorial-Wissen drauflegen. Das sieht man zum Beispiel an den Erklärungsvideos zu den Tools (Git, Checkstyle). Es geht mir hier also darum Menschen, die schon regelmäßig im Bukkit-Kontext agieren mit Wissen darüber zu versorgen, wie sie ihren Workflow optimieren können, bzw. wie in der Software-Entwicklung außerhalb von Minecraft gearbeitet wird.


    Ich habe also nicht den Anspruch "einsteiger-freundlich" zu sein, sondern viel mehr engagierte Entwickler dazu zu verhelfen weiter besser zu werden. Für solche Einstiegstutorials kann ich da zum Beispiel die Tutorials von BiVieh empfehlen.


    Vielen Dank für dein Feedback!

    Im Zuge meiner Update-Agenda, die ich für diesen Thread angekündigt habe, poste ich mal wieder das Video dieser Woche. Neue Videos erscheinen immer Sonntags gegen 12:00:



    Vielen Dank auch noch einmal für die Aufmerksamkeit und den anhaltenden Support!

    Vielen Dank für das nette Feedback!

    Und die Alarmglocken-Sache gibt es ja leider in Bezug auf viele Praktiken in der Bukkit-Szene. Und bei den Dingen, bei denen die Alarmglocken wirklich Sturm klingeln sollten (Reflection zum Beispiel), da werden falsche Dogmen gepredigt. Und das ist ja eben auch eine der Motivationen, die ich für dieses Projekt verfolge.


    Bezüglich deines Fun-Facts scheine ich etwas auf dem Schlauch zu stehen; kannst du das näher ausführen? Ich wäre mir keines "Überschreibens statischer Methoden" bewusst. Es sei denn, du meinst das Shadowing (Überdeckung) oder Overloading (Überladung). Bei statischen Methoden ist ja wegen des fehlenden Polymorphismus' zur Laufzeit sogar bei dieser Konstellation mit keiner Überschreibung zu rechnen:


    Vermutlich meintest du eines der oberhalb genannten Szenarien, aber beschreib' gerne nochmal genauer was du damit meinst. :)

    Guten Tag liebe Dev-Tek-Community,


    ich liebäugle schon seit geraumer Zeit mit dem Gedanken eine YouTube Leitfaden-Reihe zu kreieren. Nun habe ich mich endlich dazu motivieren können diesen Gedanken in die Tat umzusetzen. Getauft habe ich das Projekt Bukkit: Done The Right Way und es wird wie geplant auf YouTube publiziert. In diesem Beitrag möchte ich euch das grundsätzliche Projekt vorstellen, ein wenig über meine Motivation, die Eckdaten und die Ideen für die Zukunft sprechen.

    Motivation

    Meine Motivation für die Videoreihe begründet sich hauptsächlich in den vielen Fragen die ich in der Vergangenheit zu IntelliJ IDEA, Maven und Bukkit erhalten habe, sowie den Eindrücken, die ich beim "durchzappen" der bereits existierenden YouTube-Bukkit-Tutorials gewinnen durfte. Deshalb wähle ich für diese Reihe häufig einen vergleichenden Ansatz, bei dem ich mich bemühe externe, weiterführende Quellen und Literatur einzubinden und Bezüge zu falschen Programmier-Paradigmen und Common-Pitfalls herzustellen. Ich beschränke mich bei diesen Tutorials größtenteils auf den Java/Bukkit-Bereich, werde allerdings versuchen hier auch den Ausblick bzw. die Brücke zu Java zu schaffen.

    Eckdaten

    Da ich nicht alle Build-Systeme, IDEs, Minecraft-Versionen, Bukkit-Forks und Java-Versionen abdecken kann, habe ich mich gleich zu Anfang auf ein Set aus Versionen und Tools festgelegt, dass ich möglichst konstant über die Video-Reihe hinweg pflegen möchte. Ich verwende als BuildSystem Maven v3, die IDE meines Vertrauens ist IntelliJ IDEA (immer auf neuester Version), es wird mit Minecraft 1.13 auf dem Bukkit-Fork PaperSpigot gearbeitet und dafür nutze ich Java 11. Sobald die Tutorials sich in Richtung weiterer Technologien wie Datenbanken, Collections oder Networking bewegen, werde ich auch hierfür Versionen festlegen, bei denen ich versuche den Grad zwischen Stabilität und Modernität abzuwägen. Gerichtet ist diese Leitfaden-Reihe primär an Personen die schon ein wenig Erfahrung mit Java haben und ggf. sogar schon ein bisschen in die Bukkit-Programmierung hineingeschnuppert haben. Dennoch ist natürlich jeder eingeladen sich die Videos anzuschauen, hier ist dann ggf. nur ein wenig eigene Recherche nötig

    Pläne für die Zukunft

    Der Plan den ich hierbei verfolge sieht es vor, besonders jene Themen zu beleuchten, die häufig ausgelassen, ignoriert oder falsch interpretiert werden. Ich hege den Anspruch an mich selbst, bei den Themen die ich anspreche ein ausgewogenes Gesamtbild zu vermitteln und damit niemanden mit der "Erklärung" abzutun: "Ja, das kopierste halt so rein. Ist nicht wichtig warum.". Denn das Warum ist das eigentlich wichtigste und ist der Grundstein für jegliches eigenständiges Lernen. Obwohl mein Ziel natürlich ist, Wissen zu vermitteln und einen offenen Dialog über die verschiedenen Technologien zu starten, habe ich dennoch kein Problem damit, wenn jemand den im Video erstellten Code einfach kopiert. Ob man hieraus etwas lernen möchte, oder einfach schnell ein Problem beheben möchte ist jedem selbst überlassen und ich würde es mir niemals anmaßen jemandem vorzuschreiben, wie er meinen Content zu konsumieren hat. Deshalb stelle ich den Code nach jeder Folge auf Github und markiere die einzelnen Episoden mit Git-Tags.


    Für die Zukunft sind Themen wie beispielsweise: Maven: Extended Cut (also mehr als Basis-Informationen), Git, IntelliJ IDEA: Poweruser (also Produktivitäts-/Setup-Kniffe), Unit-Testing, Quality Assurance mit Checkstyle, Spotbugs und PMD sowie SonarQube und weitere angedacht. Aber natürlich werden auch die Basis-Themen wie Commands, Datenbanken, Networking, etc. abgedeckt und ich werde so gut es geht versuchen zusätzliche, über den Standard hinausgehende Informationen zu vermitteln.


    Hier findet ihr die Video-Reihe auf YouTube: YouTube-Playlist
    Hier ist die Organisation auf Github: https://github.com/BukkitDTRW

    Und hier sind die ersten Videos als Einbettung:





    Solltet ihr Lob, Kritik oder einfach neutrales Feedback hierzu loswerden, meldet euch gerne in den Kommentaren. Ich freue mich bereits von euch zu hören und werde vermutlich wöchentlich neue Videos hochladen!


    Ich bedanke mich ganz herzlich für das Lesen dieser Vorstellung und wünsche euch viel Spaß beim Schauen!

    Du kannst aber auch den https://... Link nutzen der geht bei den JetBrains Produkten.

    Gut möglich, dass das als Workaround funktionieren mag, ich arbeite in IntelliJ IDEA und CLion aber mit der SSH-Referenz und es funktioniert dennoch fantastisch. Ich denke es ist daher wichtig hier klar zu stellen, dass es eben nicht ausschließlich mit den HTTP(S)-Referenzen funktioniert (sollten sie denn funktionieren), sondern dass der Fehler eine andere Ursache hat, und keine schlichte Limitation der Software ist.

    #push: Während andere nun vollends im sogenannten "Sommerloch" angekommen sind, sich in den Ferien befinden oder der Urlaubsplanung frönen, wird gerade die neue Version unseres internen Networkings, des Berechtigungssystems sowie der Nutzerstruktur fertiggestellt. Ich habe mich vor einigen Monaten dazu entschlossen diese Bereiche grundlegend zu überarbeiten, da ich möchte, dass Entwickler bei uns den Umgang mit unseren APIs als konsistent, verlässlich und einfach wahrnehmen. Und auch wenn dies schon im Vorhinein teilweise der Fall war, so mussten Entwickler bei uns dennoch noch einiges über die bloße Nutzung der API bedenken. Durch unsere nun nahezu 100% abdeckende – äußerst umfangreiche und (hoffentlich) präzise – Dokumentation und die voranschreitende, konsistentere Trennung zwischen API und Implementation dürfte das Entwickeln in Zukunft wesentlich einfacher, übersichtlicher und – aus eigener Erfahrung – spaßiger ablaufen!


    Die diesmalige Grafik – die auch ein ungewöhnliches Format mit sich bringt – ist ein Screenshot des "Structure"-Views auf IntelliJ IDEA eines Markdown-Dokuments, an dem ich gerade – wenn ich nicht selbst programmiere – erstelle, um außenstehenden sowie Bewerbern unseren Workflow, unsere Einstellung sowie unsere Tools näher zu bringen. Die Titel können sich sicher noch ändern, und es kommt noch einiges dazu, als kleine Übersicht kann es aber auch jetzt schon genommen werden.




    Ich freue mich bereits darauf in einiger Zeit das fertige Dokument präsentieren zu können. Da ich hier allerdings detailliert auf die einzelnen Bereiche, unsere Arbeitsweise und unsere Ideale eingehen möchte, kann dies sicherlich noch ein wenig dauern! Bis dahin möchte ich aber schon einmal allen ein schönes Rest-Wochenende wünschen!

    Hab' den Thread jetzt nur überflogen, würde dir aber langfristig einen Pool wie zum Beispiel HikariCP nahelegen. Klar kann ich auch verstehen, dass du es "mal selbst ausprobieren" möchtest, aber für Anwendungen die Irgendwann produktiv ausgeführt werden sollen, kann ich nur davon abraten selbst etwas zu konstruieren. Man kann sehr kleine Pools nutzen (theoretisch selbst mit einer Verbindung, ich empfehle allerdings minimal zwei, damit Verbindungen erneuert werden können, ohne dass diese Operation blockt) und wird damit den kompletten Wartungsaufwand los.


    Connection-Pooling ist - ob man es nun glauben mag, oder nicht - ein recht komplexes Thema und sollte daher nach Möglichkeit in eine Lib ausgelagert werden. Pooling liefert dir zudem den Vorteil, dass du in asynchronen Umgebungen - ohne gesonderte Rücksicht nehmen zu müssen - auch einfach Verbindungen vom Pool beziehen kannst. Die Wartung findet asynchron statt und die Verbindungen werden vor der Rückgabe geprüft, ggf. erneuert und zurückgesetzt.


    Zusätzlich profitierst du von einer einfachen Config um deine Verbindungen mit bestimmten Properties initialisieren zu lassen - was du ggf. auch tun solltest. Properties erlauben dir die Session auf deinen Usecase abzustimmen, Server-Optionen nur für diese speziellen Verbindungen zu überschreiben und eleganter mit der Datenbank interagieren zu können. Ich kann verstehen, wenn du erst einmal "nur" mit MySQL irgendwie arbeiten möchtest, würde dir jedoch wirklich nahelegen diesen Schritt irgendwann zu wagen. MySQL (und im speziellen MariaDB) hat so viele Möglichkeiten um das Maximum aus deiner Applikation rauszukitzeln und dir das Leben leichter zu machen, da sollte man dies nicht einfach ignorieren.


    Ich wünsche dir viel Erfolg mit deinem Vorhaben!



    PS: Die Nutzung sähe mit einem Pool dann beispielsweise so aus:

    Java
    1. try (final Connection conn = JCLibrary.getInstance().getMysqlHandlerProxy().getConnection()) {
    2. PreparedStatement stmt = conn.prepareStatement("UPDATE players_servers SET lastseen = ?, experience = ? WHERE playerID = ? AND serverID = ?");
    3. stmt.setInt(1, (int) (System.currentTimeMillis() / 1000L));
    4. stmt.setInt(2, user.getTotalPlayTime());
    5. stmt.setString(3, user.getID().toString());
    6. stmt.setByte(4, (byte) ServerType.getThisByPort().getID());
    7. stmt.executeUpdate();
    8. } catch (SQLException ex) {
    9. JCLibrary.getInstance().getSLF4JLogger().error("Es ist ein Fehler beim Speichern des JCUsers \"{}\" aufgetreten.", user.getID(), ex);
    10. }

    Erstaunlich wie da die Interessen auseinander zu gehen scheinen. Diese Funktion war immer die Erste, die ich deaktiviert habe. Der Kommentar liefert doch - sofern er nicht im Copyright integriert ist - keinen echten Mehrwert, oder? Ich meine die Informationen kann man doch auch Problemlos aus Git ziehen und der Kommentar wirkt sich - so wie er standardmäßig ist - ja nicht einmal aufs JavaDoc oder so aus.


    Ist das ausschließlich persönliche Präferenz oder hat das bei dir/euch einen echten Workflow-Hintergrund? Ich frage einfach aus Interesse, nicht als Kritik. Soll sich jeder Kommentare generieren lassen wo er mag, aber es interessiert mich eben :)

    #push: Da hier auf Dev-Tek ja der Vorstellungsbereich gestrichen wurde und innerhalb des Themas noch auf den ehemaligen Vorstellungsbeitrag verwies, habe ich mich heute mal der Einpflegung dieses Beitrages in diesen Thread angenommen. Der Startpost ist hierdurch unglücklicherweise nochmal ein gutes Stück länger geworden, dafür gibt es nun einen einzigen Thread indem so ziemlich alles steht und von dem zentral alle Verweise ausgehen. Außerdem habe ich die Hinweise auf den tl;dr-Teil verdeutlicht, damit sich hoffentlich niemand davon abschrecken lässt. Konkret hinzugefügt zu diesem Beitrag habe ich die Abschnitte "Vorstellung", "Konzept" und "Team".


    Ich halte gerade den Bereich "Konzept" für lesenswert, da hier nun erstmal konkret auf eines unserer Konzepte (in diesem Fall den PvP-Server) eingegangen wird und auch die Motivationsgründe für einige Design-Entscheidungen genannt werden.


    Als Grafik habe ich dieses Mal einen Work-in-Progress Tabellen-Auszug zu unserer neuen Rang-Struktur ausgewählt. Wir haben innerhalb der letzten Team-Besprechung besprochen unsere Ränge einer Generalüberholung zu unterziehen (Mehr zum neuen System im Bereich "Team") und das ist das Ergebnis. Die Ränge stehen nun soweit fest, die Beschreibungen werde ich aber wohl noch weiter verbessern müssen. Sie sollen auch für Personen die mit der typischen Minecraft-Rang-Struktur nicht vertraut sind, intuitiv zu verstehen sein und müssen zwischen 260 und 300 Zeichen umfassen (das passt jetzt schon).




    Ich freue mich, hier nach wie vor auf viel Unterstützung zu treffen und wünsche allen ein schönes Wochenende!

    Das könntest du zum Beispiel über ein Platzhalter-GameProfile realisieren. GameProfiles sind essenziell ja eigentlich nur UUID + Name + Properties. Du kannst allerdings zum Beispiel auch nur die UUID setzen. Wenn das GameProfile mit dieser UUIDdann dem FakePlayer zuweist, kannst du ihn daran erkennen.

    Mit dieser Methode kannst du die Leerzeichen in einem String entfernen.

    Äh, nein. Diese Methode entfernt lediglich anführende und nachfolgende Whitespaces.


    Returns a string whose value is this string, with any leading and trailing whitespace removed.

    If this String object represents an empty character sequence, or the first and last characters of character sequence represented by this String object both have codes greater than '\u0020' (the space character), then a reference to this String object is returned.

    Otherwise, if there is no character with a code greater than '\u0020' in the string, then a String object representing an empty string is returned.

    Otherwise, let k be the index of the first character in the string whose code is greater than '\u0020', and let m be the index of the last character in the string whose code is greater than '\u0020'. A String object is returned, representing the substring of this string that begins with the character at index k and ends with the character at index m-that is, the result of this.substring(k, m + 1).

    This method may be used to trim whitespace (as defined above) from the beginning and end of a string.

    Das würde also in dem von dir genannten Fall rein gar nichts ändern. Hier würde man wohl am ehesten auf die replace-Methode zurückkommen: myString.replaceAll("\\s+","");

    Uns ist natürlich durchaus bewusst, dass kein Minecraftserver der Welt einzigartig ist.

    Ich wollte mich als du den Post veröffentlicht hast eigentlich schon dazu äußern, habe es dann allerdings aus den Augen verloren. Deshalb möchte ich dies nun nachholen:

    Ich denke das ist eine sehr pessimistische (nahezu nihilistische) Interpretation des Begriffs einzigartig. Ich denke viel mehr, dass jeder Server auf seine Art einzigartig ist. Selbst wenn sich 100% der angebotenen Spielmodi doppeln sollte, so machen sie die abweichenden Maps, die andere Interpretation des Spielmodus oder einfach der Support-Umgang einzigartig. Natürlich gibt es Server, deren Alleinstellungsmerkmal ausgeprägter ist, und Server, die eher dazu neigen anderen Servern zu gleichen. Nichtsdestotrotz halte ich es für uninspiriert und falsch, hier jegliche Einzigartigkeit von vornherein auszuschließen.


    Um meine Beweggründe für diesen Kommentar mal ein wenig zu beleuchten: Es geht mir hier tatsächlich darum, dass ich denke, mit Aussagen wie diesen Verkauft ihr euch unter Wert und findet vermutlich nicht die Bewerber die euch zustehen. In den sechs Jahren, die ich meinen Server mittlerweile betreibe, habe ich immer wieder festgestellt, dass das Wichtigste zur Gewinnung von Teammitgliedern und Spielern, die Begeisterungsfähigkeit der Verantwortlichen ist. Mit »niemand ist einzigartig « wird weder jemand begeistert, noch sagt dies irgendetwas Gutes über euch aus. Mir sagt es zum Beispiel: "Hey, da setzt jemand den Anspruch an sein Projekt aber niedrig an, wenn er Einzigartigkeit schon einmal ausschließt". Und das ist genau das Problem bei solchen Äußerungen.


    Versteht mich nicht falsch, ich verstehe den Zwang der Relativierung in der heutigen Serverszene. Sobald man seinem Projekt in einer Ausschreiben einen hohen Wert beimisst, läuft man Gefahr hierfür kritisiert zu werden (siehe: „potential“). Aber wenn nicht ihr von der Qualität, Einzigartigkeit und Arbeit schwärmt, die euer Projekt vereint, wer denn bitte dann?! Wenn ihr jemanden davon überzeugen möchtet, bei euch zu programmieren, dann müsst ihr ihm das Gefühl geben, dass seine Zeit hier sinnvoll investiert ist. Besser noch: Ihr gebt ihm das Gefühl, das er an etwas Großartigem mitwirkt, einem absoluten Novum. Und das bewirkt man eben nicht mit »niemand ist einzigartig«.

    da MongoDB schneller

    Solche pauschalisierten Aussagen lehne ich strikt ab. Zu dieser Thematik gibt es hier im Forum schon sehr umfangreiche Posts, weshalb ich es mal bei: "Es ist absolut Use-Case-abhängig was hier besser performed" und "Die Art und Weise wie die datenbankspezifischen Tools genutzt werden und die Konfiguration erfolgt ist, entscheidet maßgeblich über die Performance der verwendeten Datenbank." belassen möchte.

    ob man Potential hat(te) oder nicht, ist nun mal die Zukunft

    Ich schließe mich deiner übergeordneten Aussage an, denke jedoch, dass das Potential eben nichts ist, was nur in der Retrospektive nachvollzogen werden kann. Schließlich wird hier kein Ausgang der Situation als Determinismus vorgegeben, sondern lediglich eine Aussage darüber getroffen, dass hier ein Ausgang im Sinne der Erwartungen möglich ist. Das dies bei praktisch allen Projekten der Fall ist, die nicht von vornherein ausschließen mehr als zehn Spieler draufzulassen, und deren Potential dann auf die Möglichkeit ein Riesen-Netzwerk zu werden geprüft wird, möchte ich hier natürlich auch nicht anfechten. Potential eignet sich also keinesfalls als Alleinstellungsmerkmal, wohl aber als Aussage darüber, dass noch alle Wege offen sind ("Alles kann, nichts muss").


    In sofern sehe ich tatsächlich eigentlich kein Problem mit der Bezeichnung "Der Server mit Potenzial", obgleich der bestimmte Artikel natürlich irgendwo einen Ausschluss des Potentials anderer Server impliziert, worüber man sich natürlich wieder streiten könnte. Dennoch stimme ich - wie bereits eingangs erwähnt - aber natürlich mit der Grundthese überein, dass sich das realisierte, genutzte Potential (Erfolg) jetzt noch nicht ablesen lässt.

    Sofern diese Stelle hier gemeint ist:

    5102561251543240a91a332e1815e2ae.png


    geht das natürlich. Du musst aber in der Tat prüfen, ob die Länge hier über 2 liegt. im If-Else-Teil hast du sonst nur die Garantie, dass es sich um mindestens ein Argument handelt. Du hast allerdings keinerlei Zusicherung eines zweiten Arguments. Daher kann dein Code natürlich so bleiben, du musst allerdings vor dem Statement Player target = Bukkit.getPlayer(args[1]) sicherstellen, dass hier mindestens zwei Argumente vorhanden sind.

    Ich hab ein Framework geschrieben der mir es erleichtert Command und Subcommands zu erstellen:

    Ah. Ich habe so etwas Ähnliches für uns geschrieben:





    Ist zudem vollständig auf Exceptions ausgelegt. Fehlermeldungen werden also wie du im Beispiel sehen kannst geworfen und Zentral beim Command-Handling verarbeitet/formatiert/geloggt. Aber schön auch mal die Ansätze anderer zu sehen.


    Frei verfügbar dürfte https://github.com/aikar/commands vermutlich für einige interessant sein.