Entwicklung

Wie man Assembler schreibt

Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!
Assembler ist gar nicht so schwer. Vorausgesetzt natürlich man hat es einmal verstanden. Und genau das soll dieser Artikel leisten: Verständlich machen, wie es grundsätzlich geht. In diesem Beispiel verwende ich *GNU Assembler* mit der *AT&T-Syntax*. Ein Programm besteht immer aus zwei Teilen: Dem data- und dem text-Bereich: {% highlight gas %} .section .data # hier kommt was hin .section .text # hier auch {% endhighlight %} Im data-Bereich werden die Variablen definiert und im text-Bereich steht das eigentliche Programm. Variablen ------ Wie jedes andere Programm braucht auch ein Assemblerprogramm (in Normalfall) Variablen. Diese werden mit Namen, Datentyp und Wert im data-Bereich definiert. Das Programm mit einer Variable sieht zum Beispiel so aus: {% highlight gas %} .section .data msg: .ascii "Ende!\r\n" .section .text {% endhighlight %} Zuerst wird der Name der Variable angegeben, in diesem Beispiel `msg`. Danach folgt der Datentyp und der Wert der Variable. In diesem Fall ist es ein String, angegeben durch `.ascii`. Programmlogik ---- Eine Variable zu definieren ist schön, aber bringt alleine noch nicht viel. Deshalb kommt jetzt die eigentliche Programmlogik. Es gibt verschiene Befehle, die auf einer sehr niedrigen Systemebene Befehle ausführen. Eine einfache Anfangsübung ist die Textausgabe in der Konsole über stdout. Wer jetzt mit einem einzelnen Befehl rechnet, der wird enttäuscht werden: Es braucht gleich fünf (!) davon. {% highlight gas %} .section .data msg: .ascii "Ende!\r\n" .section .text movl $4, %eax # 4 = Ausgabe movl $1, %ebx # 1 = stdout movl $msg, %ecx # String übergeben movl $7, %edx # Länge des Strings (\r = 1 | \n = 1) int $0x80 {% endhighlight %} Die benötigten Werte werden in die Speicher `%eax` bis `%edx` gelegt und dann das Betriebssystem mittels `int $0x80` aufgefordert den Befehl auszuführen. An dieser Stelle muss ich zugeben, dass ich auch noch nicht sehr viel mehr kann. Aber wer sich dafür interessiert, der dürfte bei [Wikibooks](http://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax) weitere Informationen dazu finden.
Security

vine.co only supports RC4 ciphers

Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!
Due to the well-known problems with the RC4 cipher i recently disabled all ciphers that use RC4 in my web browser. I have not experienced any problems until a week ago. Maybe some old websites will not support ciphers without it. That is what i thought. So days ago one of these short videos from [vine](http://vine.co), a service of Twitter, showed up in my Twitter timeline. I clicked it and got this: ![Fehlermeldung]({{site.baseurl}}/assets/img/picture_102.png) (This means the SSL handshake failed as a result of lack of common ciphers.) To be more precise: vine.co does not support **any** cipher without RC4 ([SSL-Check](https://sslcheck.globalsign.com/en/sslcheck?host=vine.co)). Twitter itself even supports [elliptic curve crypto](https://blog.twitter.com/2013/forward-secrecy-at-twitter-0). So why not vine? Twitter, please explain me that.
In eigener Sache

Mein erster Beitrag zum Firefox-Quellcode

Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!
Heute wurde meiner erster Beitrag zum Quellcode von Firefox in den Source-Baum eingefügt. [Bug 956678 - Replace TaskUtils.spawn() by Task.spawn() in Session Restore. r=yoric](http://hg.mozilla.org/integration/fx-team/rev/77d90521f46f) Dadurch habe zu meinem Lieblingsbrowser auch etwas beigetragen!
Security

ELGA am Start

Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!
Seit heute ist die neue elektronische Gesundheitsakte, kurz ELGA, in Betrieb. Auch wenn noch keine Gesundheitsdaten gespeichert werden (können), kann man sich ab heute davon abmelden. Gerade in Zeiten der Totalüberwachung durch die NSA und ständiger Hackerangriffe sollte jeder von uns überlegen, ob er Daten zu seiner Gesundheit dort ablegen lassen will. Ich jedenfalls habe mich heute abgemeldet. Dazu nötig ist eine Bürgerkarte oder Handysignatur und der Besuch von . Alternativ kann man die Verwendung auch schriftlich sperren lassen. Weitere Informationen dazu befinden sich [hier](http://www.elga.gv.at/index.php?id=55).
Software

Zeit sparen mit Grunt

Dieser Artikel ist älter als zwei Jahre und womöglich veraltet!
Mit dem Tool [Grunt](http://gruntjs.com/) ist es möglich wiederkehrende Aufgaben beim Entwickeln von JavaScript-Bibliotheken zu automatisieren. ![Grunt-Logo]({{site.baseurl}}/assets/img/picture_101.png) Beim Entwickeln meiner [Strichcode-Bibliothek](https://github.com/joushx/jQuery.EAN13) bin ich auf Grunt gestoßen und will es jetzt nicht mehr missen. Installation ----------- Unter der Voraussetzung von [Node.js](http://nodejs.org) kann man Grunt einfach mit dem folgenden Befehl installieren: {% highlight js %} npm install -g grunt-cli {% endhighlight %} Konfigurationsdatei ----------- Zur Konfiguration wird eine Datei namens Gruntfile.js angelegt, in der die Aufgaben definiert werden. Hier ist ein Beispiel einer Konfigurationsdatei, wie ich sie aktuell in meiner Strichcode-Bibliothek verwende: {% highlight js %} module.exports = function(grunt) { // Project configuration grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), uglify: { options: { banner: '/*\n* Copyright (c) <%= grunt.template.today("yyyy") %> Johannes Mittendorfer (http://johannes-mittendorfer.com)\n* Licensed under the MIT License (LICENSE.txt).\n*\n* Version <%= pkg.version %> <%= grunt.template.today("yyyy-mm-dd") %> \n*/\n\n' }, build: { src: 'src/<%= pkg.name %>.js', dest: 'dist/<%= pkg.name %>.min.js' } }, coffeelint: { app: ['src/<%= pkg.name %>.coffee'], options: { 'max_line_length': { 'level': 'ignore' }, 'arrow_spacing': { 'level': 'warning' }, 'line_endings': { 'level': 'warning' }, 'no_empty_param_list': { 'level': 'warning' } } }, jshint: { options: { curly: true, eqeqeq: true, eqnull: true, browser: true, globals: { jQuery: true }, }, uses_defaults: ['src/**/*.js'], }, qunit: { all: ['tests/**/*.html'] }, jquerymanifest: { options: { source: grunt.file.readJSON('package.json'), overrides: { name: "ean13", title: "jQuery EAN 13", author: { name: "Johannes Mittendorfer", url: "http://johannes-mittendorfer.com" }, homepage: "https://github.com/joushx/jQuery.EAN13", demo: "http://demo.johannes-mittendorfer.com/jquery-ean13", docs: "https://github.com/joushx/jQuery.EAN13/blob/master/README.md" } } }, coffee: { compile: { files: { 'dist/<%= pkg.name %>.js': 'src/<%= pkg.name %>.coffee' } } } }); // Load the plugin that provides the "uglify" task. grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-qunit'); grunt.loadNpmTasks('grunt-jquerymanifest'); grunt.loadNpmTasks('grunt-contrib-coffee'); grunt.loadNpmTasks('grunt-coffeelint'); // Default task(s). grunt.registerTask('default', ['coffeelint', 'coffee', 'jshint', 'qunit', 'uglify', 'jquerymanifest']); }; {% endhighlight %} Dadurch wird die Coffeescript-Datei mit coffeelint überprüft, in Javascript umgewandelt, diese Datei geprüft, verkleinert und mit den Copyright-Headern ausgestattet. Außerdem werden die definierten Unit-Tests ausgeführt und eine Konfigurationsdatei für das jQuery-Plugin-Verzeichnis erstellt. Ausführen --------- Ausführen lassen sich die Aufgaben anschließend einfach mit {% highlight js %} grunt {% endhighlight %}