Fantastic Android application for LaTeX users


Detexify: I downloaded this today – an application that allows you to draw a symbol and it tells you the LaTeX code for it. How cool is that?

Though I haven’t actually found a need to use it ‘in anger’, I just love the idea!

Advertisements

“Hacker culture” drove out women from computer science


I have no difficulty for even a second in believing this:

There were many reasons for the unusual influx of women into computer science. Partly, it was just a result of the rise of the commercial computer industry in general. There was a tremendous need to hire anyone with aptitude, including women. Partly, it was the fact that programming work itself was not yet fully defined as a scientific or engineering field. In fact, many computer science programs were first housed within a variety of departments and colleges, including liberal arts colleges where women had already made cultural inroads. Not least of all — and you knew this was coming — women quickly noticed that some programming work could be done at home while the children were napping.

And then the women left. In droves.

From 1984 to 2006, the number of women majoring in computer science dropped from 37% to 20% — just as the percentages of women were increasing steadily in all other fields of science, technology, engineering, and math, with the possible exception of physics. The reasons women left computer science are as complex and numerous as why they had entered in the first place. But the most common explanation is that the rise of personal computers led computing culture to be associated with the stereotype of the eccentric, antisocial, male “hacker.” Women found computer science less receptive professionally than it had been at its inception.

You don’t have spend much time reading the collected works of Chairman Eric S Raymond to understand why “hacker culture” turns so many women off.

Though perhaps the one thing that the article misses is that women were employed in computing, and lots of other “new industries” of the 1960’s, because they were cheap. That drive into the suburbs, tapping the large reservoir of skilled, but lower-cost, labour, profoundly shaped American (and to a lesser extent, European) society and we are still living in a world that has been shaped by it, even if women have given up on geekdom.

The article goes on to say more women are now entering computing than for some time, quoting one of Google’s VPs, Marissa Mayer – but her posed photograph just reminds me of all the reasons to be deeply suspicious of Google – they are just a more socialised version of ESR and another sign of how the right have colonised the libertarian legacy of 1968.

See for yourself…

 

(As spotted via here)

Nasty computer scientists


Bertrand Meyer
Image via Wikipedia

I am having a particularly bad day with the MSc project report – finding it difficult to motivate myself to write more and unconvinced the examiners will be impressed by my work – so maybe I should not dwell on this, but it is interesting, so what the hell.

Computer science, it can feel, is not taken quite seriously by other scientists – or indeed, by the world in general. Perhaps that explains the low level of graduate employment for those with computer science degrees (or perhaps the graduates explain why others do not take it quite as seriously as other scientific disciplines?). Or maybe it is to maths as engineering is to physics – insufficiently pure and for the artisan and not the gentleman?

Well, Bertrand Meyer has another possible explanation – it is because computer scientists are too rude about one another. This extract says it all:

The particular combination of incompetence and arrogance that characterizes much of what Naughton calls “bad refereeing” always stings when you are on the receiving end, although after a while it can be retrospectively funny; one day I will publish some of my own inventory, collected over the years. As a preview, here are two comments on the first paper I wrote on Eiffel, rejected in 1987 by the IEEE Transactions on Software Engineering (it was later published, thanks to a more enlightened editor, Robert Glass, in the Journal of Systems and Software, 8, 1988, pp. 199-246 External Link). The IEEE rejection was on the basis of such review gems as:

  • I think time will show that inheritance (section 1.5.3) is a terrible idea.
  • Systems that do automatic garbage collection and prevent the designer from doing his own memory management are not good systems for industrial-strength software engineering.

“Let’s enhance that” might work after all


This video has amused and fascinated many because it displays a fundamental ignorance of a basic rule of the – universe – a consequence of the second law of thermodynamics – that one cannot extract more information out of a picture than went into it at the time of creation:

But, according to the “Communications of the ACM” (subscription required), researchers at Carnegie Mellon University may have developed better ways to extract the information that is in an image.

That seems to be one of the consequences of new algorithms they have developed to deliver faster solutions to certain classes of linear systems (linear equations with many – perhaps billions – of variables).

To quote a small bit of the article (my emphasis added):

The researchers say the algorithm, which applies to a class of problems known as symmetric and diagonally dominant (SDD) systems, not only has practical potential, but also is so fast it might soon be possible for a desktop PC to solve systems with one billion variables in just seconds. “The main point of the new algorithm is that it is guaranteed to work and to work quickly,” says Gary L. Miller, a professor of computer science at CMU and a member of the three-person team that developed the
new algorithm.
SDD systems, characterized by system matrices in which each diagonal element is larger than the sum of the absolute values of all the other elements in the corresponding row, are used for a wide range of purposes, from online recommendation systems to industrial simulations, materials modeling, and image processing. Algorithms used for this type of linear system fall into two broad classes: direct solvers, such as Gaussian elimination, and iterative solvers. In contrast to direct solvers, which compute exact solutions, iterative solvers produce a series of approximate solutions. Direct methods are usually memory-hungry, a limitation that makes iterative solvers, such as the kind developed by the CMU team, more effective for the large data sets generated by today’s applications.

The article also has some real world examples of how the algorithm is being used to improve medical software.

Cannot immediately point you to a good book on this, though Amazon have an expensive DVD.

Email: the first social medium


icon for mailing lists
Image via Wikipedia

I have written about what I see as a crisis of survival of email before – I do so from the heart because email is still my favourite social medium (read John Naughton in A Brief History of the Future to understand why).

Being on holiday with the kids has, though, re-enforced my fears for the future of this communication means – as it meant listening to the repeated ‘pling’ of a Facebook conversation: my daughters both have email addresses but make little use of them. I doubt they have ever rationalised why, though I know my eldest did give up when her first account was overwhelmed with spam (plainly because her address was sold or passed on by ‘legitimate’ mailing lists she signed up to).

So, it is enormously heartening to read that email plays an important part in the internal life of Microsoft. Even if you are not a Microsoft fan read the article, it is full of insights about the company works and thinks.

Holiday all but over


London by SPOT Satellite
Image via Wikipedia

So, back to work tomorrow.

Been back in London for 24 hours now, having returned to make sure we were here for the eldest’s GCSE results. Turned out to be un-needed as she sailed through them (not that I ever doubted it): even getting a B grade in an exam – Chemistry – she was convinced she’d failed.

I have made a lot of progress with the MSc project report (at least in my mental map of what it will look like when completed), so that is good too. Lost just over a day in a panic about s0ome results I had which seemed to cast doubt on the correctness of the software I had written – essentially it looked as though it was not plotting a substantial part of the memory accesses of programs under test, until I realised it was all correct and I had just set some of the graph parameters badly: this late the day I do not quite know what I would have done it had indeed been all wrong.

The MSc cast a bit of a pall on the holiday (for me – the rest of the family enjoyed themselves without a problem) – but now I am making progress with the write-up that seems not so bad.

The single moment highlight? Getting to see M13 on a dark clear night (Saturday?) – the air was still enough that individual stars seemed were visible (though the ripples in the air could also be seen). I know it is a bit of a cliche as these things go, but it is still magnificent.

Same night I also used the “goto” technology on the mount to pick up M5 – which (unlike M13) I had never seen before.

Fixing the problem with XSLT 2.0


Wot, no namespaces?
Image by psd via Flickr

I asked about my XSLT issues on the Gnome XSLT mailing list and got this reply, which neatly summarises where I was going wrong… (though the being ‘shouted at’ part tells you a lot about the dysfunctional aspects of a lot of online software development, but I am used to that by now)

The name of the element is a complex object with a
namespace and a local name.

With <svg width=”1000px” height=”800px” version=”1.1″
xmlns=”http://www.w3.org/2000/svg“>, the element’s name is
{http://www.w3.org/2000/svg}svg.  With <svg width=”1000px”
height=”800px” version=”1.1″>, the element’s name is {}svg.  These are
NOT THE SAME, and XSLT that works to transform one will not transform
the other.  You may as well ask why changing <svg> to <gvs> does not work.

There is a neat answer to this, specifying xpath-default-namespace="http://www.w3.org/2000/svg" in the xsl tag at the start of the stylesheet (I have to lose the non-standard indent attribute too) – giving this:

<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://www.w3.org/2000/svg">
<xsl:param name="colour">yellow</xsl:param>
<xsl:template match="/">
	<xsl:apply-templates select="svg"/>
</xsl:template>
<xsl:template match="svg">
	<xsl:copy>
		<xsl:for-each select="@*">
			<xsl:copy/>
		</xsl:for-each>
		<xsl:text>
</xsl:text>
		<xsl:apply-templates select="rect"/>
		<xsl:apply-templates select="line"/>
		<xsl:apply-templates select="text"/>
		<xsl:apply-templates select="circle"/>
	</xsl:copy>
</xsl:template>
<xsl:template match="line">
	<xsl:copy>
		<xsl:for-each select="@*">
			<xsl:copy/>
		</xsl:for-each>
	</xsl:copy>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="rect">
	<xsl:copy>
		<xsl:for-each select="@*">
			<xsl:copy/>
		</xsl:for-each>
	</xsl:copy>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="text">
	<xsl:copy>
		<xsl:for-each select="@*|node()">
			<xsl:copy/>
		</xsl:for-each>
	</xsl:copy>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="circle">
	<xsl:if test="@stroke=$colour">
		<xsl:copy>
			<xsl:for-each select="@*">
				<xsl:copy/>
			</xsl:for-each>
		</xsl:copy>
		<xsl:text>
</xsl:text>
	</xsl:if>
</xsl:template>
</xsl:stylesheet>

This is only supported in XSLT 2.0, an accepted standard, but more or less orphaned by the big software houses and, in particular, the browser builders. But help is at hand in the form of the Saxonb XSL processor, so a command line like this:

saxonb-xslt -xsl:pickcolour.xsl -s:memmap.svg -o:test.svg colour=green does the job.

The most expensive computer I ever bought


This item has reminded me that the most expensive computer I ever bought was an Amstrad 386 machine – with 1MB of RAM and a 40MB hard disk for £1000 for the late-great Morgan Computers shop on New Oxford Street in, I think, 1991.

At today’s prices that is about £1700 and back then Lorraine and I had to take a loan out to afford it – repaid over two years. Lorraine was desperate to get it to write her masters dissertation on it (twenty years ahead of me) – on police policy on domestic violence.

The thing was, its hardware bus (ISA) was very broken and when I attempted to install a bigger disk and a SCSI card to run the beta of Windows NT in 1993, it wouldn’t work at all. Then I upgraded to a 486SX 25MHz job with, eventually, 32MB of RAM. It cost about £750 in today’s money and by then we were both earning enough to afford it without taking out a special loan.

XSL problem solved (sort of)


I half remembered doing something like this before … and it works: though I don’t know if this is a bug in xsltproc or what…

To get the stylesheet to work I have to delete the namespace declaration in the svg tag in the graph – ie change

<svg width="1000px" height="800px" version="1.1" xmlns="http://www.w3.org/2000/svg">

to this:

<svg width="1000px" height="800px" version="1.1">

and then run xsltproc with --novalid specified.

Will enquire further on the appropriate mailing list.

XSL problem


W3c's SVG logo
Image via Wikipedia

A while back I wrote some XSL to manipulate the SVG files my Groovy programs were outputting.

Now either I did something fancy back then that I have forgotten or else some piece of code has broken in the last couple of months (or maybe become less tolerant of my bad XML?) – because it doesn’t work now.

The XSL reads:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" indent="yes"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="colour">yellow</xsl:param>
<xsl:template match="/">
	<xsl:apply-templates select="svg"/>
</xsl:template>
<xsl:template match="svg">
	<xsl:copy>
		<xsl:for-each select="@*">
			<xsl:copy/>
		</xsl:for-each>
		<xsl:text>
</xsl:text>
		<xsl:apply-templates select="rect"/>
		<xsl:apply-templates select="line"/>
		<xsl:apply-templates select="text"/>
		<xsl:apply-templates select="circle"/>
	</xsl:copy>
</xsl:template>
<xsl:template match="line">
	<xsl:copy>
		<xsl:for-each select="@*">
			<xsl:copy/>
		</xsl:for-each>
	</xsl:copy>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="rect">
	<xsl:copy>
		<xsl:for-each select="@*">
			<xsl:copy/>
		</xsl:for-each>
	</xsl:copy>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="text">
	<xsl:copy>
		<xsl:for-each select="@*|node()">
			<xsl:copy/>
		</xsl:for-each>
	</xsl:copy>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="circle">
	<xsl:if test="@stroke=$colour">
		<xsl:copy>
			<xsl:for-each select="@*">
				<xsl:copy/>
			</xsl:for-each>
		</xsl:copy>
		<xsl:text>
</xsl:text>
	</xsl:if>
</xsl:template>
</xsl:stylesheet>

While the SVG (rather a small fraction of it) reads:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="1000px" height="800px" version="1.1" xmlns="http://www.w3.org/2000/svg">
<rect x='0' y='0' width='1000' height='800' fill='white' />
<text x='100' y='800' style='font-family: Helvetica; font-size: 10; fill: black'>Page size: 4096: 0 to 2% memory</text>
<line x1='90' y1='705' x2='905' y2='705' stroke='black' stroke-width='10' />
<line x1='95' y1='705' x2='95' y2='100' stroke='black' stroke-width='10' />
<line x1='100' y1='715' x2='100' y2='100' stroke='lightgrey' stroke-width='1' />
<text x='95' y='720' style='font-family: Helvetica; font-size:10; fill: maroon'>0</text>
<line x1='80' y1='100' x2='900' y2='100' stroke='lightgrey' stroke-width='1' />
<text x='30' y='105' style='font-family: Helvetica; font-size:10; fill: maroon'>7bb0</text>
<line x1='300' y1='715' x2='300' y2='100' stroke='lightgrey' stroke-width='1' />
<text x='295' y='720' style='font-family: Helvetica; font-size:10; fill: maroon'>75341312</text>
<line x1='80' y1='250' x2='900' y2='250' stroke='lightgrey' stroke-width='1' />
<text x='30' y='255' style='font-family: Helvetica; font-size:10; fill: maroon'>6cc4</text>
<line x1='500' y1='715' x2='500' y2='100' stroke='lightgrey' stroke-width='1' />
<text x='495' y='720' style='font-family: Helvetica; font-size:10; fill: maroon'>150682624</text>
<line x1='80' y1='400' x2='900' y2='400' stroke='lightgrey' stroke-width='1' />
<text x='30' y='405' style='font-family: Helvetica; font-size:10; fill: maroon'>5dd8</text>
<line x1='700' y1='715' x2='700' y2='100' stroke='lightgrey' stroke-width='1' />
<text x='695' y='720' style='font-family: Helvetica; font-size:10; fill: maroon'>226023936</text>
<line x1='80' y1='550' x2='900' y2='550' stroke='lightgrey' stroke-width='1' />
<text x='30' y='555' style='font-family: Helvetica; font-size:10; fill: maroon'>4eec</text>
<line x1='900' y1='715' x2='900' y2='100' stroke='lightgrey' stroke-width='1' />
<text x='895' y='720' style='font-family: Helvetica; font-size:10; fill: maroon'>301365249</text>
<line x1='80' y1='700' x2='900' y2='700' stroke='lightgrey' stroke-width='1' />
<text x='30' y='705' style='font-family: Helvetica; font-size:10; fill: maroon'>4000</text>
<text x='25' y='300' transform='rotate(90, 25, 300)' style='font-family: Helvetica; font-size:10; fill:red'>PAGES</text>
<text x='100' y='750.0' style='font-family:Helvetica; font-size:10; fill:red'>INSTRUCTIONS (376706 per pixel)</text>
<text x='800' y='90' style='font-family:Helvetica; font-size:10; fill: black'>html</text>
<rect x='910' y='120' width='5' height='5' fill='red' stroke='black' stroke-width='1' />
<text x='920' y='125' style='font-family:Helvetica; font-size:10; fill:black'>Instructions</text>
<rect x='910' y='150' width='5' height='5' fill='green' stroke='black' stroke-width='1' />
<text x='920' y='155' style='font-family:Helvetica; font-size:10; fill:black'>Modify</text>
<rect x='910' y='180' width='5' height='5' fill='blue' stroke='black' stroke-width='1' />
<text x='920' y='185' style='font-family:Helvetica; font-size:10; fill:black'>Load</text>
<rect x='910' y='210' width='5' height='5' fill='yellow' stroke='black' stroke-width='1' />
<text x='920' y='215' style='font-family:Helvetica; font-size:10; fill:black'>Store</text>
<circle cx='100' cy='700' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='100' cy='699' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='101' cy='699' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='102' cy='699' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='103' cy='699' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='104' cy='699' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='105' cy='699' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='106' cy='699' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='107' cy='699' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='108' cy='699' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='109' cy='699' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='110' cy='699' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='111' cy='699' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='112' cy='699' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='699' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='700' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='698' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='697' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='676' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='683' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='678' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='674' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='675' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='679' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='680' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='682' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='685' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='684' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='687' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='686' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='694' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='689' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='690' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='692' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='693' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='677' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='113' cy='681' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='114' cy='699' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='114' cy='700' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='114' cy='698' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='114' cy='697' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='114' cy='679' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='114' cy='674' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='114' cy='660' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='114' cy='659' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='114' cy='689' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='114' cy='694' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='114' cy='680' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='114' cy='683' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='114' cy='681' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='114' cy='682' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='114' cy='676' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='115' cy='698' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='115' cy='697' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='115' cy='699' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='115' cy='700' r='1' fill='none' stroke='red' stroke-width='1' />
<circle cx='106' cy='687' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='107' cy='697' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='107' cy='687' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='108' cy='697' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='108' cy='687' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='109' cy='697' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='109' cy='687' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='110' cy='697' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='110' cy='687' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='111' cy='697' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='111' cy='687' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='112' cy='697' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='112' cy='687' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='112' cy='671' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='112' cy='698' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='113' cy='698' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='113' cy='697' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='113' cy='671' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='113' cy='687' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='113' cy='659' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='113' cy='658' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='114' cy='671' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='114' cy='659' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='114' cy='658' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='114' cy='698' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='114' cy='697' r='1' fill='none' stroke='yellow' stroke-width='1' />
<circle cx='894' cy='658' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='894' cy='698' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='895' cy='657' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='895' cy='671' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='895' cy='653' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='895' cy='658' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='896' cy='657' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='896' cy='671' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='897' cy='671' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='897' cy='657' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='897' cy='653' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='897' cy='656' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='898' cy='657' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='898' cy='671' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='899' cy='657' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='899' cy='671' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='899' cy='653' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='899' cy='656' r='1' fill='none' stroke='green' stroke-width='1' />
<circle cx='900' cy='657' r='1' fill='none' stroke='green' stroke-width='1' />
</svg>

But using xsltproc generates an empty output…