These are the ramblings of Matthijs Kooijman, concerning the software he hacks on, hobbies he has and occasionally his personal life.
Most content on this site is licensed under the WTFPL, version 2 (details).
Questions? Praise? Blame? Feel free to contact me.
My old blog (pre-2006) is also still available.
See also my Mastodon page.
Sun | Mon | Tue | Wed | Thu | Fri | Sat |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
(...), Arduino, AVR, BaRef, Blosxom, Book, Busy, C++, Charity, Debian, Electronics, Examination, Firefox, Flash, Framework, FreeBSD, Gnome, Hardware, Inter-Actief, IRC, JTAG, LARP, Layout, Linux, Madness, Mail, Math, MS-1013, Mutt, Nerd, Notebook, Optimization, Personal, Plugins, Protocol, QEMU, Random, Rant, Repair, S270, Sailing, Samba, Sanquin, Script, Sleep, Software, SSH, Study, Supermicro, Symbols, Tika, Travel, Trivia, USB, Windows, Work, X201, Xanthe, XBee
Only recently, Adobe has started to (finally) support 64 bit Linux with its Flash plugin. I could finally watch Youtube movies (and more importantly, do some Flash development work for Brevidius).
However, this month Adobe has announced that it drops support for 64 bit Linux again. Apparently they "are making significant architectural changes to the 64-bit Linux Flash Player and additional security enhancements" and they can't do that while keeping the old architecture around for stable releases, apparently.
This is particularly nasty, because the latest 10.0 version (which still has amd64 support) has a couple of dozens (!) of security vulnerabilities which are fixed in a 10.1 version only (which does not have Linux amd64 support anymore).
So Adobe is effectively encouraging people on amd64 Linux to either not use their product, or use a version with critical security flaws. Right.
Recently I have been doing some Flash debugging for my work at Brevidius.
In a video player we have been developing (based on
work done by Jeroen Wijering) we needed to escape some url parameter,
since our flash code could not be certain what would be in the value (and
characters like & and = could cause problems). The obvious way to do this is
of course the escape
function in ActionScript. This function promises to
escape all "non-alphanumeric characters", which would solve all our problems.
However, afters implementing this, we find that there are spaces magically
appearing in our GET parameters. Upon investigation, it turns out that there
are plus signs in our actual values (it's Base64 encoded data, which uses
the plus sign). However, the escape
function apparently thinks a
plus sign is alphanumeric, since it does not escape it (note that the flash
10 documentation documents this fact). Which shouldn't be a
problem, since a plus sign isn't special in an url according to RFC1738:
Thus, only alphanumerics, the special characters "$-_.+!*'(),", and reserved characters used for their reserved purposes may be used unencoded within a URL.
(Note that RFC3986 does recommend escaping plus signs, since they might be used to separate variables, but that's not the case here).
However, the urls we generate in flash point to PHP scripts and thus pass
their variables to PHP. Unfortunately, PHP does not adhere to the RFC's
strictly: It interprets plus signs in an url as spaces. Historically, spaces
in an url were replaced by plus signs, while spaces should really be encoded
as %20 nowadays. There is of course a simple way get Flash (or any other
url-generating piece of code) work properly with PHP: Simply encode plus signs
in your data as %2B (which is the "official" way). This makes sure you get a
real plus in your $_GET
array in PHP, and the problem is resolved.
After some searching, and asking around in ##swf
on Freenode, I found
the encodeURIComponent
function, which is similar to escape
, but does
encode the plus sign. If we use this function, we can again send data with
spaces to PHP! And since encoding more than needed is still fine according to
the specs, there are no downsides (except that you need Flash >= 9.0).
So, if you're developing in Flash, please stop using escape
, and use
encodeURIComponent
instead.
I've recently been hacking a bit with Flash (or rather, with Adobe's Flex compiler. This is a freely available commandline compiler, which actually works on Linux as well.
However, out of the box the commandline compiler, mxmlc
, is obnoxiously
slow. It takes nearly 10 seconds to compile a simple Hello, world! example,
and compiling the video player I'm working on takes over 30 seconds. Not
quite productive.
This is a documented "flaw" in the mxmlc
compiler, caused by the fact
that it has to start up a big java program everytime, loading thousands of
classes and because it always recompiles the entire source.
The official solution to get faster compile times is to use the
Flex Compiler Shell (fcsh
), which is included with the Flex SDK.
Basically, it's a caching version of the mxmlc
compiler, that keeps running
in the background and caches compiled files.
fcsh
is intended to be used by IDEs. The IDE starts fcsh
and then
communicates with it through its stdin/stdout. This means fcsh
is really a
simple thing, without any support for listing on sockets or properly
daemonizing.
Using fcsh speeds up the build time from nearly 40 seconds to just a few seconds (depending on how many changes were made). The first compilation run is still slow, of course.
I've been trying to use fcsh
with the ant build system, which makes
things a bit tricky. Since there is no long-running process (like an IDE)
which can keep fcsh
running, this needs some way for fcsh
to be run in the
background, connected to some fifo or network socket so we can start it on the
first compilation run and then connect to it in subsequent compilation runs.
A quick google shows that there are already a few fcsh
wrappers to do this,
some of which intended to work with ant as well. At a quick glance, it seems
that the flex-shell-script-daemonizer seems the most useful one. It is
created in Java and runs as a daemon (unlike the alternatives I saw, which
were Windows-only due to some useless GUI). It has two modes: In server mode
it starts fcsh
and connects it to a TCP network socket and in client mode it
takes a command to run and passes it over the netowrk to the running server.
There is also some stuff to integrate make ant use fcsh
for compiling
actionscript files. However, this requires changing the build methods and
stuff in build.xml, which I don't want to do (I'm trying to minimize my
changes to the sources, since I'm modifiying someone else's project).
So, I created a small shell script that can be used as a drop in replacement
for mxmlc
. It simply takes joins together all its arguments to a single
command and passes that to the flex-shell-script-daemonize command. If the
fcsh
daemon is not yet running, it automatically starts it (and does some
half-baked daemonization, since neither fcsh
nor
flex-shell-script-daemonizer does that...)
While writing the script, I also found out that the fcsh
"shell", doesn't
have any way to quote spaces in arguments in the command (at least, I couldn't
find any and there was no documentation about it). This means that, AFAICS,
there is no way to support spaces in paths. How braindead is that... I guess
FlexBuilder, the official IDE from Adobe doesn't use fcsh
after all and
instead just includes the compiler classes directly...
Of course, just as I finished the script, I encountered flexcompile,
which basically does the same thing (and includes the network features of
flex-shell-script-daemonizer as well). It's written in python. However, it
does require the path to flex and the mxmlc
part of the path to be passed in
as arguments, so it's not a 100% drop-in replacement (which I needed due to
the way the build system I was using was defined). Perhaps it might be useful
to you.
Anyway, here's my script. Point the JAR
variable at the jar generated by
flex-shell-script-daemonizer and FCSH
to the fcsh
binary included with the
Flex SDK.
#!/bin/sh
# (Another) wrapper around FlexShellScript.jar to provide a mxmlc-like
# interface (so we can just replace the call to mxmlc with this script).
# For this, we'll have to call FlexShellScript.jar with the "client"
# argument, and then the entire mxmlc command as a single argument
# (whereas we will be called with a bunch of separate arguments)
JAR=/home/matthijs/docs/src/upstream/fcsh-daemonizer/FlexShellScript.jar
FCSH=/usr/local/flex/bin/fcsh
PORT=53000
# Check if fcsh is running
if ! nc -z localhost "$PORT"; then
echo "fcsh not running, trying to start..."
# fcsh not running yet? Start it (and do some poor-man's
# daemonizing, since the jar doesn't do that..)
java -jar "$JAR" server "$FCSH" "$PORT" > /dev/null 2> /dev/null <
/dev/null &
# Wait for the server to have started
while ! nc -z localhost "$PORT"; do
echo "Waiting for fcsh to start..."
sleep 1
done
fi
# Run the client. Note that this does no quoting of parameters, since I
# can't find any documentation that fcsh actually supports that. Seems
# like spaces in path just won't work...
# We use $* instead of $@ for building the command, since that will
# expand to a single word, instead of multiple words.
java -jar "$JAR" client "mxmlc $*" "$PORT"