Dieser Beitrag ist auf Englisch verfasst, da es mir leichter fällt über das Thema zu schreiben.
Now it’s again already some time since the new C++ standard got officially released then again many new features are not new at all. A few things got already introduced with the Technical Report 1 (TR1) from back in 2007 but it wasn’t directly built into the standard. In some way you could call the TR1 the alpha version of C++11. Then there is boost, the most popular non-standard library of which many ideas got copied and standardized.
But let us first back up a bit and look at a short timeline:
1979 – Bjarne Stroustrup began working on C with Classes.
1983 – The name of C with Classes got changed to C++ where the ++ represents the increment operator on C.
1985 – The first commercial release happened and a few small iterations followed.
1998 – The C++ standard committee published the first official ISO standard for C++.
2003 – After five years of getting experienced with C++ the committee released a corrected version of the old standard.
2005 – Getting closer to a completely new standard the committee pushed out the Technical Report 1 which wasn’t directly part of the standard but showed already features which happen to be in the standard now.
2011 – Some might have already given up but the new standard then got finally release and that with a lot of new features.
2012 – People working on compilers now, are trying to catch up with the new standard.
This timeline shows that C++ advances very slowly. For developer wanting portability and lot of different features it’s annoying but the same developer will then be glad, C++ doesn’t change quickly and guarantees stability and speed. Who would want to rewrite thousand lines of code just because the standard did change? Also how would you be able to catch up with all the changes? The long time between the two C++ standards, which is 14 years for the ‹flawed› version and 7 years for the corrected one, let the committee and all the people around the world think about what C++ does and what’s missing and over the years, technology evolved too. Stuff like parallelization which wasn’t a big topic 14 years ago but look at it nowadays, it’s about the most important one, since we hit the wall where processors can’t get faster and we have to divide the work onto multiple processors and conquer our tasks.
So you get it – C++11 is great but what is so great about it? There is a good maintained list over at Wikipedia, so I won’t go much into anything here, but let me just highlight from my naive perspective the most important change. Whenever you talk about C++ with other developers who don’t use C++ they’ll often start joking about C++’s Access Violation and Memory Leaks and they are not that wrong. They are common errors with C++ but many of those could be prevented by disallowing certain things or by using garbage collectors. Then again when you look at the ‹philosophy› behind C or C++ you notice that they never were about restricting things. Specially not for a reason like: ‹The programmers nowadays are just so dumb and can only write messy code, so let’s restrict everything so one can only do what we think is best for them.› No C++ is about unlimited freedom and possibilities. But how can the obvious problems with false memory management and overused pointers be solved? The new standard introduces with its Standard Template Library (STL) smart pointers. Whenever you allocate some memory on your own, you have to delete it at some point again, if you forget to do so or if a function throws an exception or returns before it reaches the delete statement, the memory won’t get freed. shared_ptr and unique_ptr got solve these problems. They automatically delete the object once the smart pointer object reaches its destructor hence gets destroyed. Additionally with the use of smart pointers over normal pointers you won’t run into the problem of a wild pointer, they either holds a valid object or are set to nullptr which is the new way of setting a pointer to NULL. In future C++ code it will be very common to never see the keywords new and delete, instead there will be a lot of make_shared() or make_unique().
But this example is just one part and there is so much more. Coming from the knowledge of the old C++ basics to the new C++11 you can only agree to the words of Bjarne Stroustrup:
"C++ feels like a new language"
Everyone interested in C++ programming should start reading and learning more about C++11 just because it holds so much more than C++03. For that reason I can recommend you to browse through the videos of Channel 9. The two videos embedded below are a must for every C++ programmer, also who would want to miss a talk from Bjarne Stroustrup himself or even Herb Sutter? Although I have to warn you, those videos are not YouTube videos. They don’t go two minutes but mostly two hours. Enjoy and happy C++11 programming! 🙂
For the geeks: Unfortunately the ISO doesn’t let you download the standard for free but you’d have to pay a few hundred bucks. But there’s close to the official release draft which holds about everything. I can’t compare it but people on the internet say the differences as minor as only people who are trained to read such gazing stuff will understand them. Anyways here you go:
Ich nutze das Internet nun schon seit ein paar Jahren ohne Werbungsanzeigen und bin immer überrascht, wenn ich an einem öffentlichen PC oder bei einem Freund auf z.B. Youtube plötzlich mit Werbung überflutet werde. Dann stelle ich mir immer wieder die Frage, wieso lassen Leute sich überhaupt noch mit stupiden Texten, Bildern oder sogar Videoclips überfluten, wenn man doch auch alles ohne haben könnte. Vielleicht finden die einen Werbung ja gerade interessant und können von einigen positiven Situationen erzählen, wieder andere wollen den Service unterstützen und klicken mitunter vielleicht sogar extra auf Werbung und dann gibt es vielleicht noch solche Nutzer, welchen die Werbung längst nervt, sie aber nicht genügend Erfahrung mit “solchen” Dingen haben und vielleicht nicht einmal wissen, dass man Werbung blockieren kann. Für die Letzteren soll dieser Beitrag etwas Hilfe verschaffen.
Ihr wisst ja sicher, dass Google ein grosser Teil seiner Einnahmen durch Werbung erzeugt, doch wusstet ihr, dass es 28’236’000’000 Dollar im Jahr 2010 waren? (Google financial)
Um nun Werbung zu blocken wird ein einfaches AddOn für den Browser verwendet. Das Ganze ist ziemlich einfach und ich werden im folgenden einfach ein per Links posten:
Wobei ich ja eigentlich froh bin, dass es noch so viele Nutzer gibt, welche auf Werbung klicken, ansonsten müsste man wahrscheinlich zahlen für Google, Facebook, Youtube, … Wenn man nun doch gewisse Webseiten unterstützen möchte, lässt sich bei den meisten AddOns eine Whitelist erstellen, welche gewisse Seiten ignoriert und die Werbung trotzdem anzeigt.
Nebst dem blockieren von Werbung, verringert ein AdBlocker den Traffic (weniger Werbebilder –> weniger Traffic) und hilft einem sich auf den wirklichen Inhalt zu konzentrieren.
Viele träumen immer noch von einem papierlosen Büro, doch ich denke, dass es nie kommen wird, denn Papier im klassischen Sinn ist die einfachste und schnellste Form etwas fest zu halten. Es werden zwar immer mehr Geräte entwickelt, als ‹elektronisches› Papier dienen sollen, doch die Bedienung und der Preis sprechen meist gegen sie.
Somit bleibt einem oft nur der Entscheid zwischen den drei folgenden Punkten:
Analog = Papier und Stift
Digital = Alles wird in einem Computer mit Computerformaten festgehalten (geschriebenes zu Textdaten)
Semi-Digital = Man digitalisiert seine analogen Daten (geschriebenes zu Bilddaten)
In der Realität wird man dann meist Kompromisse von Kombinationen der beiden eingehen. In der Utopie möchte man jedoch die Vorteile des Digitalen und die Simplizität des Analogen nutzen. Für mein Studium versuche ich so viel wie möglich digital zu halten und somit stellt sich die Frage nach guter Software, denn im ersten Semester des Informatikstudium habe ich drei mathematische Vorlesungen und eine zur Einführung in die Programmierung. Doch die Ansprüche dafür sind hoch. Während man bei der Programmier Vorlesung gut mit einem einfachen Texteditor umgehen kann (Programmiersprachen sind ja eine Abstraktion der Maschinensprache, lesbar gemacht für Menschen), so kommt man bei der simpelsten mathematischen Formel schon zu Problemen. Meine Suchkriterien bezogen sich somit praktisch nur auf Programme, welche Formeln darstellen können. Das Ergebnis war vorerst eine Vielzahl solcher Programme, doch keine bietet eine einfache Eingabemethode an.
Keine bis auf Math-o-mir. welche es dem Nutzer ermöglicht auf eine einfache Art Mathematik digital festzuhalten.
Das Programm wird von Danijel Gorupec entwickelt mit der folgenden Leitidee, welche genau meinen vorig erwähnten Problem entspricht:
Why can’t I use my PC as simple as I am using pencil when writing mathematical equations?
Wieso kann ich mein PC nicht gleich einfach verwenden um mathematische Formeln zu schreiben wie mit Papier und Stift?
In den meisten andere Programmen muss jedes mathematische Symbol oder Formelkonstrukt aus einer Liste mit der Maus ausgewählt werden, was sehr sehr mühsam ist und für ein flüssiges Schreiben viel zu langsam. In Math-o-mir gibt es zwar immer noch Listen, doch zum einen ist diese logisch angeordnet und kann mit Tastenkombinationen versehen werden und zum anderen gibt es viele intuitive und vordefinierte Kombinationen. Zum Beispiel wird aus => automatisch ein ≥ oder aus -> wird ein richtiges Pfeilsymbol →. Weiter lassen sich Matrizen schön darstellen, freihändige Zeichnungen tätigen, Formeln direkt berechnen, das Ganze oder einzelne Formeln als MathLM, LaTeX Code oder als Bild exportieren, und und und… Das Beste am Ganzen ist, dass ich im Moment mit dem Entwickler in Kontakt stehe und ihm helfe die Software (nach meinen Wünschen) zu verbessern. Natürlich gibt es auch ein paar negative Punkte, z.B lassen sich ’nur› 26 Zeichen lange Wörter/Variablen festhalten oder dass in den verwendeten standardschriftarten keine Zahlenmengensymbole vorkommen, doch im Vergleich zu den angebotenen Features kann man mal gut darüber hinweg schauen.
Die Geeks werden sich den ganzen Artikel durch gefragt haben, was für ein Problem ich denn hätte schliesslich gibt es ja LaTeX, da braucht man nichts anderes. Ja dies mag wohl wahr sein und stellt gleichzeitig ein grosses Problem dar. Die Nachfrage nach einem guten mathematischem Editor besteht gewiss, doch alle die wirklich die Möglichkeit hätten diese Nachfrage zu stillen, fühlen sich mit LaTeX vollumfänglich versorg und ‹zwingen› es somit praktisch jedem auf. LaTeX ist mächtig für alles was mit Text zutun hat, doch es ist überhaupt nicht benutzerfreundlich und leicht zu erlernen. Deshalb bin/war ich auf der Suche nach etwas benutzerfreundlichem und einfachem, was Math-o-mir durchaus bietet.
Das Utopia, im welchem es keine analogen Informationsspeichermedien mehr gibt, wird erst dann eintreffen, wenn es möglich wird jegliche Information, sei es Text, Audio oder Video, aus unserer Welt (praktisch) fehlerfrei als digitale Datenstruktur abzubilden. Persönlich würde ich mich jedoch auch schon mit einer starken Vereinfach zu frieden geben. 😉
Ein Entwurf des Beitrags liegt auch schon seit einiger Zeit auf meiner Festplatte und hat es nun doch endlich auch noch in die Freiheit des Internets geschafft!
Wenn man Spiele programmiert sind die Begriffe wie Zeit, Frame und Pixel sehr wichtig, denn möchte man eine Bewegung eines Objektes darstellen, sollte man diese Begriffe in der richtigen Reihenfolge zusammen bringen können, um z.B. die Geschwindigkeit fest zulegen.
Hier ein bisschen Theorie über einzelne Begriffe. Ein Frame entspricht einem vollen Bild, das an einem Bildschirm dargestellt wird. Dies geschieht aber nicht einmal in der Sekunde sondern normalerweise etwa sechzig Mal. Also hat man sechzig Frames pro Sekunde und ‘Frame pro Sekunde’ wird meist zu FPS zusammengefasst. Mit der 3D Technologie, oder umgekehrt, kommen nun wieder mehr Bildschirme mit einer Aktualisierungsrate von 120FPS auf den Markt. Ein durchschnittlicher Bildschirm zeigt jedoch ‘nur’ 60FPS an, doch die FPS welche nun oft bei Spielen angegeben werden, hat nicht immer direkt etwas mit der Darstellung am Bildschirm zu tun, sondern sagt meist lediglich aus wie viele Bilder berechnet werden können pro Sekunde. So kann ein Spiel (wohl nicht ein 3D intensives Spiel) mit 2000FPS laufen, der Bildschirm stellt jedoch immer noch nur sechzig Bilder pro Sekunde dar. Mit 2000FPS sollte man unbedingt eine Frameratelimit setzten, da man die CPU bzw. GPU nur unnötig belastet, denn obwohl eine hohe Framerate einen präzisere Berechnung von Objekte zu lässt, so ist alles über 120FPS wohl schlicht Wegs übertrieben und unnötig!Vielleicht gibt es Personen, welche einmal etwas von VSync gehört haben oder es in irgend einem Spielen aktivieren musste. VSync steht für ‘Vertical Synchronisation’ und bedeutet dass die Ausgabe von Frames immer schön wartet bis der Bildschirm wieder ein neues Bild zu zeichnen beginnt. Somit kann diese Option zu einem Bremsklotz führen, je nach dem wie Spiellogik aufgebaut wurde, doch gewisse Bildschirme und Grafikkarte vertragen sich nicht so gut und würde dies nicht aktiviert werden, käme es zu sogenanntem ‘Tearing’ (Horizontale Streifen). Einen interessanten Englischen Beitrag zu VSync und DirectX findet ihr auch auf Erik McClure’s Blog.
Obwohl FPS eine zentrale Rolle spielt, so würde sich doch keine Spielfigur so bewegen wie wir es gerne hätten, würde man nicht bestimmte Geschwindigkeiten einhalten. Wie der Programmierer den Animationsapparat nun baut ist ihm überlassen und trotzdem wird er sich einmal damit beschäftigen müssen mit welche Geschwindigkeit seine Objekte sich bewegen und dafür gibt es dann die Möglichkeit das Ganze zu abstrahieren und ‘natürliche’ Einheiten wie m/s zu verwenden, oder man kann eine direkte Einheit wie Pixel pro Sekunde. Nebst der Pixel pro Sekunde gibt es die ‘Einheit’ Pixel pro Frame, welche doch eigentlich auch ganz praktisch ist, doch obwohl man bei der Entwicklung mit einer einigermassen stabilen Framerate arbeitet, so ist Leistung einer anderen Grafikkarte um vieles höher und anstatt die langsamen 100FPS produziert die andere Hardware 1000 Bilder pro Sekunde und lässt das Objekt somit 10 Mal schneller bewegen. Pixel pro Sekunde bleibt somit dann konstant, egal was für Hardware das Spiel vorfindet.
Hier nun noch einmal die Definition der einzelnen Variablen:
FPS – F/s – frames per second – Bild pro Sekunde – Bildwiederholung pro Sekunde
PPF – p/F – pixel per frame – Pixel pro Bild – relative Geschwindigkeit zum Bild
PPS – p/s – pixel per second – Pixel pro Sekunde – absolute Geschwindigkeit
Berechnung der einzelnen Variablen (links P für pro/per – rechts / für pro/per)
Während ein ‘normaler’ Linux-Nutzer mit dem Terminal sehr gut umzugehen wissen muss, kommt ein Windows-Nutzer auch ohne Kenntnis von dessen Existenz aus. Ich selbst nutze praktisch nur Windows. Die Gründe dafür sind sehr vielfältig, anfechtbar und oft unklar. Projekt Linux hatte ich bereits zwei Mal. Das erste Mal scheiterte es schnell, da es halt einfach nicht das gleiche wie Windows ist und es mein erster Versuch war. Beim zweiten Mal kam schon recht viel weiter und fing sogar an öfters die Ubuntu Distribution anstatt Windows zu starten. Dann installierte ich jedoch Windows neu – ja liebe Linux-Nutzer lacht ruhig – und der Bootloader war verschwunden. Seither habe ich mir die Mühe noch nicht gemacht, diesen wieder hervor zu zaubern. Doch nicht nur unter Linux lässt sich mit einem Terminal arbeiten. Ich öffne desöfteren ein Terminalfenster und Windows um bestimmte Dinge in einer spezifischen Weise zu bearbeiten, als dies mein GUI Programm ermöglicht, oder weil das Programm halt kein GUI hat.
An der Schule belege ich das Wahlkursfach Informatik. Kürzlich wählte/bekam ich den Auftrag einen Vortrag über einen Algorithmus für das “Travelling Salesman Problem” oder auf Deutsch “Problem des Handlungsreisenden” vorzustellen. Doch ich konnte nicht einfach einen “normalen” Brute-Force Algorithmus wählen sondern musste das Problem mit Hilfe Dynamischer Programmierung lösen, was die Aufgabe um einiges erschwerte. Denn als bald ich mich dann hinter das Problem machte, musste ich feststellen, dass ich das Dynamische Programmieren immer noch nicht wirklich beherrschte und auch kein fertiger Algorithmus ausser in Pseudocode im Internet zu finden ist.
Hab gedacht, dass ich gleich einen neuen Post schreibe anstatt den alten zu updaten!
Wie im Kommentar vielleicht schon bemerkt, hat es bereits einige Änderungen gegeben ohne, dass ich es gemerkt habe. Die Hashliste wird nun komplett eingelesen.
Da wollte ich doch eigentlich nur die “num-Option” einbauen und dann kommt da ein Fehler hervor gekrochen. Bis jetzt ist es mir rätselhaft, an was dass es liegen könnte, aber ich nehme an, dass nun das “Stack smashing” Problem jetzt auch auf dem Windows auftritt. Hier noch ein kleines Video um zu sehen, von was dass ich spreche:
Vorerst hab ich nun die “num-Option” noch weggelassen, da ich den Fehler noch nicht finden konnte. Weiter hab ich noch das Problem behoben, was die Reihenfolge der Optionen angeht, bis anhin konnte man nur “–dict –hashes” angeben, jetzt geht es auch umgekehrt.
Ansonsten gibt es bis jetzt keine weiteren Änderungen.
Nachdem ich im Internet schon öfters nach einem vernünftigen MD5 Cracker gesucht habe, welcher persönlich angepasst werden kann und ich bis auf Cain & Abel nicht viel gefunden, hatte ich die Idee mit einem Freund selbst einen zu schreiben.
Wie der Titel schon sagt, das ganze Projekt ist noch nicht abgeschlossen, aber die Hauptfunktionen sind geschrieben und funktionieren (unter Windows) sehr gut. (Unter Linux gibt es noch “Stack smashing” Probleme, welche wir nicht ergründen konnten.)
Der Funktionsumfang ist wie gesagt sehr beschränkt:
Dictionary Attack mit Single Hash
Dictionary Attack mit Hash List
Die Qualität des Crackers hängt momentan nur von der Qualität des Dictionary ab, aber irgendwann kommt vielleicht noch ein Brute Forcer (obwohl dies ab fünf Zeichen schon eine halbe Ewigkeit dauert…).
Was auch noch fehlt ist eine Option um die einzelnen Einträge des Dictionary zu modulieren. Z.B.:
Dict: Hallo Modulationen:
hallo
HALLO
hallo1
hallo2
hAllo
haLlo
halLo
…
Der Cracker kann im Moment nur 100 Hashes in einer Hashliste verarbeiten, aber dies soll auch noch durch eine Option veränderbar gemacht werden.
Am Schluss möchte ich noch auf einen Blog verweisen, welcher uns die Inspiration und die MD5.cpp & MD5.h geliefert hat und einen Dank an n00bor aussprechen: http://n00bor.org/