Archive for the ‘Life Musings’ Category

What counts as good belief?

January 29, 2018

We watched Yes, Virginia, there is a Santa Claus over the Christmas break. I’d never seen much of it and Karen’s interest in watching it again after a long hiatus encouraged me to sit down and watch it with her. Thanks Karen, it was well worth watching.

exhibits_online_yesvirginia_g14922

source: goo.gl/Xi5CDj

The true story and the TV adaptation we saw are both positive, moving tales. Eight year old Virginia’s friends tell her there is no Santa Claus so she writes a letter to the editor of The New York Sun asking for advice, since as her father tells her: “if you see it in the The Sun, it’s so”.

exhibits_online_yesvirginia_g4031

source: goo.gl/Xi5CDj

The author of the editorial: Francis Church, an atheist and cynic, having seen his share of suffering, writes an enduring letter that has inspired many since the editorial was first published in 1897. Here’s an excerpt (italics are mine):

Yes, Virginia, there is a Santa Claus. He exists as certainly as love and generosity and devotion exist, and you know that they abound and give to your life its highest beauty and joy. Alas! how dreary would be the world if there were no Santa Claus. It would be as dreary as if there were no Virginias. There would be no childlike faith then, no poetry, no romance to make tolerable this existence.

There is something beautiful in encouraging kids to imagine.

I admit to some internal conflict when our kids were young regarding what to tell them about Santa, the Easter bunny, the Tooth Fairy and so on. In the end we encouraged such beliefs for as long as the kids were willing to imagine playfully with us.

Interestingly, Virginia’s 1930 PhD thesis was entitled The Importance of Play.

Although as an atheist I generally prefer not to pretend to know things I don’t know, the kind of belief in Santa that was the subject of Virginia O’Hanlon’s letter and the The Sun editorial, is, I think, perfectly okay.

Even in recent times I’ve heard the same sort of “there is no Santa” comment that prompted Virginia’s letter to The Sun, expressed between young children, encouraged by adults, who at the same time profess belief in God.

That brings me to the question in this post’s title: what counts as good belief?

What’s the difference between these two statements?

  • I believe in Santa Claus
  • I believe in God

Other than that the first refers to a particular individual while the second to any one of a number of possible gods, their form is identical. We can remedy this remaining difference by reframing the second statement as:

  • I believe in Jesus (or Yaweh or Jeohvah or …)

Too often, the second form is accompanied by exclusive statements, such as:

Hmm…and here I was thinking that the reason for the season was axial tilt. Not to mention Saturnalia.

1503931_333096903500225_1694979872_n

sourcegoo.gl/1nFcUZ

The worst that can happen, in the child’s mind, for not believing in Santa or for being on the naughty list, is that they will receive no presents. True, there have been other harsher myths associated with Christmas, but I’m thinking broadly about the contemporary situation in the western world.

The worst that can happen, in the believer’s mind, for non-belief in God or being wicked (i.e. not accepting either salvation by faith or works) is eternal separation from God and loved ones or eternal torment in Hell.

So, again, what counts as good belief?

In my view, it’s the kind that doesn’t hold you ransom, that encourages you to imagine things not yet imagined while not making threats or requiring you to be dogmatic or to abandon critical thinking. In short, one that allows you to be creative but still allows you to think for yourself.

Take the risk of thinking for yourself. Much more happiness, truth, beauty, and wisdom will come to you that way. Christopher Hitchens

A key difference between encouraging a child to believe in a powerful being who can deliver presents to every house in a single night and childhood indoctrination into belief in a personal god, and the associated demands, is the exclusivity of the second. That and the lack of fun.

Here’s another excerpt (again, my italics):

Virginia, your little friends are wrong. They have been affected by the skepticism of a skeptical age. They do not believe except they see. They think that nothing can be which is not comprehensible by their little minds. All minds, Virginia, whether they be men’s or children’s, are little. In this great universe of ours man is a mere insect, an ant, in his intellect, as compared with the boundless world about him, as measured by the intelligence capable of grasping the whole of truth and knowledge.

I have some sympathy with Church’s view that:

They have been affected by the skepticism of a skeptical age. They do not believe except they see.

and especially:

In this great universe of ours man is a mere insect, an ant, in his intellect, as compared with the boundless world about him.

We have to be careful not to throw the baby out with the bathwater of course. As George Santayana says:

Scepticism is the chastity of the intellect, and it is shameful to surrender it too soon or to the first comer: there is nobility in preserving it coolly and proudly through long youth, until at last, in the ripeness of instinct and discretion, it can be safely exchanged for fidelity and happiness.

There is so much we don’t yet understand and we should approach the gulf between what we do and don’t know with humility. The universe as revealed through evidence by Science so far is stranger than anything we could have imagined:

  • We live in a universe in which everything we can see and touch makes up only a few percent of everything that is, the rest apparently being dark matter or dark energy.
  • On the smallest scales there exists a seething ocean of particle-antiparticle pairs coming into and out of existence.
  • If we travel fast enough, time will slow down and our mass will increase.

Alice’s world seems almost normal by comparison.

Science doesn’t claim to have the answer to all questions, yet the Scientific Method is the most successful and powerful form of knowledge acquisition we know. If new evidence comes to light to change our model of the world, then it will change after the dust has settled. That’s an important departure from dogmatic thinking, and skepticism is an important part of the Scientific Method.

There’s room for a child-like view of the world that encourages imagination and optimism, as well as an honest view of the world that requires careful thought and evidence regarding important questions, especially those with life-changing potential.

Kids will ask questions about early beliefs when they’re ready and that’s okay. Adults should encourage the fun aspects of early belief with a twinkle in their eye while accepting that questions will come.

It’s often been said that children are natural born scientists until society discourages them from asking honest, simple questions. I’d like to think that Francis Church the cynic and Virginia the child seeker-of-answers and adult teacher might have agreed.

In all affairs it’s a healthy thing now and then to hang a question mark on the things you have long taken for granted. Bertrand Russell

ACE, optimisation and an old friend

December 29, 2017

In late November I received an email from an old friend: Sean Miller. Sean was a member of the wonderful community that built up around ACE BASIC, a compiler for the Amiga I developed as a labour of love between 1991 and 1996. I’ve written about ACE in this blog before. Sean told me how his use of ACE influenced him over the years. It has been great to get back in contact with him.

I felt honoured and humbled when, on Christmas Eve, Sean released an episode about ACE on the Raising Awesome YouTube channel he and his son have created. In this episode (Retro Amiga Computing – ACE BASIC and Questions2.1 Development):

Sean shows how to use ACE on an Amiga emulator to compile and run a program he wrote more than 20 years ago (Questions).

Retro Computing with ACE

I’ve expressed this in email to Sean, but let me say it publicly: thank you Sean! It means more to me than I can say.

During the video, Sean comments on the progress of the compilation of Question, notes that there were around 4000 peephole optimisations (see screenshot from video above) and wonders whether I might explain what a peephole optimisation is. I’d be happy to of course. Now you’ve got me started! 🙂

ACE generates assembly code for the beautiful Motorola 68000 microprocessor. Compilation of some ACE language constructs generates sub-optimal assembly code instructions on the first pass. Assembly code is emitted as ACE parses the input source code without any knowledge of the broader context of the program.

Here’s a trivial ACE program:

x%=42
y%=x%*3

This simply stores 42 in the short integer variable x% (the type is denoted by %), multiplies x% by 3 and stores the product in the variable y%. I chose integer over floating point for this example because the generated assembly is more complex and would distract from the explanation. Speaking of distractions…

As an aside, unlike modern Intel, ARM and other processors, the 68000 didn’t have a floating point unit (FPU), so floating point operations were carried out by library code instead of hardware, such as a Motorola Fast Floating Point or IEEE 754 library. As an aside to my aside, the Amiga 500 had a 68000 processor whereas the Amiga 1200 (I owned both eventually) had a 68020. The 68020 could offload floating point instructions (which it did not know how to handle) to a co-processor. The 68040 was the first 68k processor with an on-board FPU. This is a whole topic by itself.

Back to the trivial example ACE program above…

Here’s the 68000 assembly ACE generates for the two line program without any optimisation (i.e. without the -O option):

    move.w  #42,-(sp)
    move.w  (sp)+,-2(a4)
    move.w  -2(a4),-(sp)
    move.w  #3,-(sp)
    move.w  (sp)+,d0
    move.w  (sp)+,d1
    muls    d1,d0
    move.l  d0,-(sp)
    move.l  (sp)+,d0
    move.w  d0,-(sp)
    move.w  (sp)+,-4(a4)

With optimisation we have 6 assembly instructions instead of 11:

    move.w  #42,-2(a4)
    move.w  -2(a4),-(sp)
    move.w  #3,d0
    move.w  (sp)+,d1
    muls    d1,d0
    move.w  d0,-4(a4)

Looking at the first two lines of the 11 unoptimised sequence:

    move.w  #42,-(sp)
    move.w  (sp)+,-2(a4)
lifo_stack1
Example stack operations (source: goo.gl/5EuhjG)

ACE examines this pair in a sliding window, or so-called peephole, onto the emitted instructions and notices that 42 is being pushed to the first-in, last-out stack then immediately popped from the stack and stored into the variable x%’s address, represented by an offset of two from an address stored in the register a4. The peephole optimiser reduces this push-pop pair to a single instruction:

    move.w  #42,-2(a4)

ACE stops short of taking the newly optimised pair:

    move.w  #42,-2(a4)
    move.w  -2(a4),-(sp)

then peephole optimising it and emitting this:

    move.w  #42,-(sp)

The reason is that the programmer has asked for 42 to be stored in the variable x%.

More ideally would have been this sequence:

move.w  #42,-2(a4)
move.w  -2(a4),d0
muls    #3,d0
move.w  d0,-4(a4)

which literally says:

  • move 42 into variable x%’s memory location
  • move the value stored at x%’s memory location into the 68k register d0
  • carry out a signed multiplication of 3 with the contents of register d0, storing the result in d0
  • move the contents of register d0 into variable y%’s memory location

If the constraints relating to use of x% and y% did not exist, the following would be sufficient to yield the product of 42 and 3 in 68k assembly:

move.w  #42,d0
muls    #3,d0

Notice that the 4 instructions after the multiplication (muls) in the unoptimised sequence are optimised during more than one pass over the assembly code to a single instruction that stores the product into y%, from this:

    move.l  d0,-(sp)
    move.l  (sp)+,d0
    move.w  d0,-(sp)
    move.w  (sp)+,-4(a4)

to this:

    move.w  d0,-4(a4)

So, ACE does better with this than the instruction sequence before the multiplication.

There are other simple optimisations carried out when the -O option is used, relating to numeric negation, but this example illustrates the key aspects.

Bernd Brandes later wrote a more powerful optimiser for ACE, the SuperOptimiser, that built upon this simple peephole optimisation approach.

Every instruction the processor doesn’t have to execute means fewer CPU cycles, so a run-time speed up. This matters a lot for example, when such instructions are part of a loop that iterates many times.

To revisit ACE’s code generation and optimisation implementation, I downloaded and Vidar Hokstad’s improvements to the ACE source (on GitHub) for compilation under Linux. I compiled that on my Mac OS X laptop and used it to generate 68k assembly code. Vidar contacted me several years ago to say that he was engaging in “software archaeology” (that made me feel a bit old, even then) with the ACE source code. I appreciate Vidar’s efforts. He sorted out some compilation problems under the GNU C compiler (gcc) that I would have had to otherwise.

It’s interesting to look at the Intel assembly generated by gcc for a similar C code fragment. The following would have to be embedded in a function:

int x,y;
x=42;
y=x*3;

The gcc compiler generates this sequence:

    movl    $0, -4(%rbp)
    movl    $42, -8(%rbp)
    imull   $3, -8(%rbp), %ecx
    movl    %ecx, -12(%rbp)

As with the ACE generated 68k assembly, only the relevant part is shown. There’s additional code generated just to start up and shut down a program (by gcc, ACE or any other compiler). The Intel assembly generated here is a bit better than the optimised 68k code ACE generated (4 vs 6 lines) although surprisingly, not very much better.

When I wrote ACE in the 90s, all components were written either in C or 68000 assembly and I went straight from an implicit parse tree to assembly code generation. These days I tend to use ANTLR or similar tools for lexical analysis (converting character streams to tokens) and parsing (checking against language grammar). I have yet to use The LLVM Compiler Infrastructure for language development, but that’s on my list too.

Creating an intermediate representation (such as abstract syntax trees) before code generation, provides additional opportunities for optimisation, something I’ve been exploring in recent times. I’ll write more about that in another post.

To be honest, the more I think and write about this topic again, the more I want to.

Thanks again Sean.

15 years since the kindest, wisest, sanest of us died

August 17, 2017

It’s hard to believe that 15 years have passed since Mum died and as I’ve said before:

She was the kindest, wisest, sanest of us all. But she’s gone.

and

…she is still in my thoughts at some point of every day. I try to recapture the sound of her voice, her facial expressions, kind, caring, at times whimsical. And yes, I still miss her. The sense of loss reduces over time, but doesn’t leave. Not that I want it to entirely.

Karen and I have taken to lighting a candle on August 17 near the end of the day as a symbolic gesture, a focus of meditation.

 

Questionable church signs #2

May 11, 2017

Another church sign, same non-fundamentalist denomination, one month later:

So, there exists at least one Christian not opposed to marriage equality.

Hmm…

Fairly uncontroversial given the likely diversity of theological views in such a congregation.

I appreciate that this is an attempt to counter the opinions of those of a more conservative persuasion, but it’s not a terribly strong message.

The essential problem is that it suggests a house divided and says little about what Christianity has to offer to the problem.

How can inter-faith dialogue even at the highest level recognise world views that are fundamentally incompatible and in principle, immune to revision? The truth is it really matters what billions of human beings believe and why they believe it.
(Sam Harris, Letter to a Christian Nation)

 

Questionable church signs #1

May 9, 2017

An Adelaide church sign recently caught my attention:

I’ve omitted the border because I’m not interested in pointing to a particular congregation.

While cute, what struck me about the words is that it illustrates how we are able to create gods in our own image.

Is it really such a leap to go from this to considering the Ten Commandments or the golden rule as the possible product of a human community rather than divine inspiration?

Wouldn’t it be more effective just to point people to Carl Sagan’s Pale Blue Dot on YouTube?

Roy & I

March 11, 2017

Roy Austen (1953-2017), a former colleague, died a few days ago on March 5.

A friend recently told me that Roy had been diagnosed with cancer in January, although he had actually been unwell for months before then.

Not long after the diagnosis, Roy set up a GoFundMe page for medical expenses and for the ongoing care of his son, in preparation for the inevitable.

I really did mean to get in contact, but I got busy and Roy died before I did. At least there was still the fund…

Roy’s main line of work and his passion was photography, but that’s not how we got to know one another.

I bought my first Windows (3.1) PC from his family business, KM Computers.

Then, awhile later, he offered me a job and became my boss…

By the end of 1995 I was in search of my next job after 5 years at the University of Tasmania (UTAS) in Launceston as a computer systems officer then a junior academic in the Department of Applied Computing. A lot of university contracts weren’t being renewed around that time.

Luckily for me, Roy had recently started Vision Internet, one of a small but growing number of competing Internet Service Providers (ISPs) in Tasmania. It was a small business arising from KM Computers at a time when Internet access was still dial-up, ISDN/ISDL was the fastest you could hope for (128 Kbps), but most people just had a dial-up modem, giving up to around 56 Kbps, less in practice. Vision Internet started in Launceston but quickly added points of presence in other parts of the state, including an Internet Cafe.

In 1995 while still at UTAS, I had helped Roy out by writing a basic customer time accounting program in C that read utmp/wtmp logs and generated simple output when someone else had difficulty doing so.

By 1996, Roy needed a programmer and system administrator and I needed a job. Before accepting Roy’s job offer, I was up front with him that I would probably want to do something different after about 18 months. That happened with Karen and I moving to Adelaide in 1997 where I spent 10 years with Motorola. That move was more difficult than I expected, and at least as hard as Karen knew it would be. In the end, it was a good move.

Ironically, UTAS asked me to come back for some occasional part-time tutoring soon after I started working for Roy, which may have been less economical than if they’d just renewed my contract!

Vision Internet was good while it lasted. To be honest, for the first few months, I couldn’t believe I was being paid to write C  (and Perl) code, something I enjoyed doing anyway. 🙂

The compact machine room doubled as my office for the first year or so before we moved down the road to a more spacious building; not as cushy as my office at UTAS. I actually didn’t mind the machine room too much. A terminal with function key accessible “virtual consoles”, the vi editor, command-line shell, a C compiler, and a Perl interpreter kept me pretty happy. Roy was fine with me working from home occasionally as time went by too. He expected me to keep things rolling and solve problems as quickly as possible, but he was good to me and we got along pretty well.

There were only about half a dozen people working at Vision Internet, fewer early on. Everyone pitched in. Roy and I didn’t always see eye to eye though. For example, at one point we disagreed about who should have super-user privileges; more than I would have liked for a brief time. 🙂

I experienced a number of things during my time with Roy at Vision Internet and learned lessons from some:

  • Early mobile phones were fairly bulky. 🙂 Roy gave me my first mobile before I started in the job. Of course, this meant he could contact me whenever. He didn’t abuse that though. A former UTAS colleague took one look at the phone hanging off my belt and declared amusingly: “wanker phone”. 🙂 Even worse when a larger battery was added! Still, I appreciated Roy giving me my first mobile.
  • You can’t always spend time doing what you want in a job, even one you mostly like, unless you’re very lucky. I guess I already knew that from being a nurse in the 80s. I had no real interest in sysadmin tasks like applying security patches to BSD Unix kernels, maintaining backups, chasing hackers, worrying about what dodgy things people might be doing with our systems or customer sales, credit card transactions, help desk (shades of The IT Crowd: “is your modem plugged in?”). I mostly wanted to design, code, and test software. Still do. That’s largely why I told Roy I thought I’d want to move on after about 18 months. Having said that, a fair amount of my time was spent writing software in the form of a suite of customer time usage programs, each prefixed with tu, written in C and Perl. We also eventually sold tu to another local ISP.
  • The practical difference between code that uses a search-based processing algorithm over a linear data structure that runs in polynomial vs logarithmic time – O(n^2) vs O(n log n). This matters a lot as the number of customer records (n) increases when your task is to write a program that processes customer time usage once per day and obviously before the next day starts. To simplify: given a processing time of a second per customer, n≈300 can mean the difference between a run that takes a day instead of an hour. You can make incremental changes to the processing time per customer (t), but eventually you’ll hit a point where n is too large, e.g. when n=1000 and t is 0.1 seconds. Anyway, I don’t recall what our n and t were, but we hit such a limit with a tu program. When I realised what was going on and fixed it, Roy was delighted and relieved. I was pretty happy too and thanked my computer science education, in particular, the discipline of computational complexity.

Before I left to go work at Motorola, I made sure Roy wasn’t going to be left without someone in my role. This gave one of my former UTAS students (Craig Madden) the opportunity he needed to break into the industry; it turned out well for Roy and Vision too.

At the height of Vision Internet, I remember occasional staff gatherings at Roy’s. He was a good host and I think he mostly enjoyed that period, despite the worry that must’ve accompanied running a business. He was generally optimistic and trusted those he employed. He had his moments, like the rest of us, when he was unhappy or angry, but mostly, he was a good guy to be around.

If I could do so, I’d tell him this:

Roy, I’m really sorry you’re gone and that I didn’t make the time to get in contact. In recent years, I should have told you how much I appreciated the opportunity you gave me a long time ago. Upon reflection, after time spent together at Vision and elsewhere, I think we would have used the word “friend” (now distorted by social media) to describe our relationship, not just “colleague”, even if we didn’t say so. I should have told you that too.

On porting an ACE program to HTML5 (among other things)

March 1, 2017

In recent times I’ve been thinking about ACE BASIC, a compiler for the Amiga I stopped working on just over 20 years ago; nostalgia’s setting in I guess. A few years ago wrote a bit about ACE in relation to BASIC’s 50th; there’s more in these 1994 and 1997 articles.

As mentioned in the 50th post, a wonderfully thriving community built up around ACE between 1991 and 1996 centred upon an active mailing list and contributions of ideas, example programs and tools. I have been mildly (but pleasantly) surprised by a couple of things since I stopped development:

  1. Continued use of ACE on Amiga hardware and emulators for at least a decade afterward.
  2. An project to modify the code generator for post mid-90s Amiga operating systems and additional targets such as PowerPC and Intel.

Among other things, I’ve been thinking about a re-write for a modern platform or target, e.g. HTML5. The world of the 90s was still very platform-centric, but in the same year I stopped developing ACE, version 1.0 of the Java Development Kit was released, putting the power of Java and its  virtual machine into the hands of eager programmers. Java and JavaScript helped to consolidate the browser as an important platform and to define the shape of web development in a post-CGI (Common Gateway Interface, not Computer Generated Imagery) world.

A new compiler or interpreter is a non-trivial task, especially in my current spare-time-poor state, but I wanted to explore how an ACE program could be rewritten for an HTML5 context.

One of my favourite ACE programs was an implementation of IFS (Iterated Function Systems) to generate simple 2D structures such as ferns, trees, the Sierpinski Triangle and so on. So I started with this. It’s simple yet complex enough to allow for a comparison of approaches.

Here are a few observations on the original IFS ACE source code (ifs.b) and my initial HTML5 port of the code.

  • JavaScript in the browser appears to be faster than ACE on the Amiga. Sure, processors and clock speeds have improved since the mid-90s but ACE generated native 68000 assembly code. Then again, to think of JavaScript as an interpreted language is very simplistic with just in time compilation in widespread use.
  • The ACE code is quite data-centric. DATA statements containing comma-separated values are read into two dimensional arrays, so the original data is not close to where it’s used and it’s not clear what the numbers are associated with. I could have taken this approach in the port, but chose instead to create a data object, a map, close to the point of use, copying the original array names (bad in some cases: a, b, c, okay in others: xoffset, yscale) from the ACE program for use as map key names, to make a correspondence easier to see.
    • This meant first transposing the data (in Excel) so that DATA columns became rows.
    • Preserving the existing DATA organisation could be accomplished by introducing functions such as data() and read() that create and read, respectively, a pool of data values. For future DATA-centric ACE program ports, I’ll try that approach.
  • In ACE, the creation of a menu and its items is simple as shown by the creation of the Special menu below; this menu name is an Amiga convention. Shortcut key letters are optional.
    • menu 1,0,1,"Project"
      menu 1,1,1,"Sierpinski Triangle"
      menu 1,2,1,"Square"
      menu 1,3,1,"Fern"
      menu 1,4,1,"Tree #1"
      menu 1,5,1,"Tree #2"
      menu 1,6,1,"Sunflower"
      menu 1,7,0,"-------------------"
      menu 1,8,1,"Help...","H"
      menu 1,9,1,"About...","A"
  • Compare this with the odd combination of HTML, CSS and JavaScript in this initial attempt at a port.
  • On the other hand, ACE’s (and so AmigaBASIC’s) reliance upon numeric identifiers is almost as unreadable as a collection of DATA statements. The MENU statements above declare the Project menu to be the first (from the left of a menu bar), with each menu item numbered in order of desired appearance and 1 or 0 enabling or disabling the menu item. Subsequent enable/disable operations on menus must refer to the same combination of numeric IDs, e.g. menu 1,2,0 would disable the Square item. Also, menu item selection handling is a bit awkward in ACE.

The code eventually morphed into what I’ve dubbed ACEjs, in the spirit of some other JavaScript library/frameworks. I’m not claiming any novelty here. The idea was to answer the question: how might ACE code look in a modern context? I’m less concerned with slavishly preserving the look and feel of the program, i.e. I’m not trying to make it look like it’s running on an Amiga. I just want to make it functionally equivalent.

Here’s a screenshot of the simple example ifs.b program in ACEjs form:

IFS in ACEjs

I don’t currently have a screenshot of ifs.b running on an Amiga or an emulator.

In any case, the outcome so far is that I have made progress toward an ACE-inspired JavaScript library for HTML5. Here are some key aspects:

  • CSS, DOM, jQuery (so JavaScript) as web assembly language but only JavaScript code needs to be written.
  • Functions like menu(), window(), dialog() manipulate the DOM to add elements (canvas, list etc) via jQuery under the hood.
    • A menu declaration corresponding to the ACE code’s Project menu (with Help and separator items omitted) follows, a key difference being that menu items are paired with callback functions (e.g. see sierpinski below), another being that there is no support for shortcut keys currently:
      • acejs.menu("Project", [
            ["Sierpinski Triangle", sierpinski],
            ["Square", square],
            ["Fern", fern],
            ["Tree #1", tree1],
            ["Tree #2", tree2],
            ["Sunflower", sunflower],
            ["About...", about]
        ]);
    • A window declaration that adds a framed canvas looks like this:
      • wdw_id = acejs.window("IFS", 640, 400);
    • and operations on the window make use of an ID:
      • acejs.clear(wdw_id);
      • acejs.pset(wdw_id, outX, outY, pixelColor);
    • Multiple menus and windows can be created.
    • acejs.css is almost non-existent currently. I’m sure someone who delights in CSS could make it look suitably dark and brooding with their eyes closed. I make no claim to have any special talent in web design.

There’s arguably no need for a compiler or interpreter. JavaScript’s iteration, selection, and expressions are adequate. Having said that, ACEjs could form the basis of a target if I ever chose to write another ACE compiler or interpreter (with all that spare time of mine).

With ACEjs you only have to write an app.js source file for your application and use a standard index.html that brings in your code and whatever else is needed, in particular acejs.css (trivial right now) and acejs.js. The only special thing you have to do is to define an init() function in app.js to be invoked by the framework. The best way to see how this works is to look at the example.

You can either download the contents of the public_html directory and open index.html in your browser or see the example application running here.

In early 2000 I wrote an article for Sky & Telescope (S&T) magazine’s astronomical computation column entitled Scripting: a programming alternative which proposed JavaScript as a suitable alternative to BASIC for astronomical computation, long used by S&T and others to disseminate programs. Even at that time, JavaScript was arguably the only programming language interpreter available on almost every personal computer, by virtue of the ubiquity of web browsers.

In essence, JavaScript had become the equivalent of the BASIC interpreter every old personal computer (formerly called microcomputers, especially in the 80s) once had. I made the example programs from the article available and experimented further; some examples show the original BASIC listing along with the JavaScript implementation.

A variant of the ideas that led to ACEjs are revealed in what I said on this page:

Peter Girard has suggested the creation of an ECMAScript code library for astronomical algorithms.

An idea I’ve had is to write a BASIC (which dialect: GWBASIC, QBasic, etc?) to ECMAScript translator, written in ECMAScript or Java. One could paste BASIC code into a text area on a web page, and have ECMAScript and HTML code generated on the fly. This would make the BASIC code on Sky & Telescope‘s web site available as interactive programs. Or, it could generate a listing, making Peter Girard’s idea of a code library easier to achieve.

Of course, there are now plenty of examples of BASIC interpreters written in JavaScript, e.g. here’s a QBasic implementation that generates bytecode and uses canvas. Then again, as I have noted, my aim was not to slavishly recreate the exact look & feel of the original platform.

S&T showed some initial interest in JavaScript, again in 2005 regarding an orbit viewer page I wrote that combined JavaScript, a Java applet and cross-domain AJAX while Internet Explorer allowed it, and before CORS was a thing.

Of course since then and for all kinds of reasons, JavaScript has come to dominate rich client browser applications, especially after the introduction of AJAX, and has generally become the assembly language of the web. More recently we’ve seen the rise of Node.js, an explosion of JavaScript web frameworks (Angular, React, …), and mobile JavaScript development frameworks like Apache Cordova. JavaScript has good points and bad along with detractors aplenty, but it’s hard to argue with its success.

History has shown that a programming language does not have to be perfect to succeed. I love C, but it’s far from perfect and holes in its type system allow one to, as the saying goes, “shoot one’s foot off”. Additionally, these same holes are responsible for security vulnerabilities in the operating systems we rely upon. Notice, I’m not saying that C itself is responsible (it’s not a person or a company) for exploits of those vulnerabilities; that’s attributable to the moral barrenness of the people involved. It’s unlikely that we’ll see the sum total of mainstream OS-land rewritten in safer languages (Rust, Haskell, …), to save us from ourselves, anytime soon.

But I digress…

I could repurpose ACE to generate JavaScript, but we are living in a time of “programming language plenty”. Creating a new language today should be considered a last resort. Domain Specific Languages, sure. Libraries and frameworks, perhaps. New languages? Looking at what’s available first before reinventing the wheel should be considered a responsibility. Also, a language is no longer enough by itself. You need an ecosystem of tools (IDE, debugger at least) and libraries for anyone to care enough to want to use your shiny new language beyond very simple programs. ACE had a couple of IDEs but no debugger. Heck, I didn’t even use a debugger when writing the compiler! Now I seem to live in source level debuggers. I’m obviously getting soft. 🙂

When I was a junior academic in the computing department at UTAS in the mid-90s, upon learning about my development of ACE, a senior and sometimes less-than-tactful colleague remarked that creating a new language was, as he so delicately put it, “a wank”. I disagreed. ACE was about providing the power of a compiled language for a particular platform (Amiga) to people who knew an interpreted language (AmigaBASIC), wanted to leverage that experience and existing code and didn’t feel confident enough to learn the dominant systems-level language of the time (C). It was also about improving the precursor language.

Now, I would agree that the decision to create a new programming language or library requires some circumspection, at the very least. But the programming language landscape has expanded a lot since the mid-90s. There is of course value in writing an interpreter or compiler, just for the learning as an end in itself and every computer science or software engineering student should do so.

So, in the end: why ACEjs?

In part because I wanted to explore simple ways to write or port a certain class of application (e.g. old ACE programs) to client-side web applications.

Partly out of a sense of nostalgia.

In part because I want to learn more JavaScript, Canvas, jQuery and jQuery-ui and the subtle differences between JavaScript versions.

Mostly, I wanted to get a bundle of ideas out of my system, which I’ve more or less done.

ACEjs is a simple starting point and if it’s useful to me, I’ll continue to improve it; if not, it will happily fade away. So far, I’ve tested it using Chrome version 56 and Safari version 9 and ECMAScript (the underlying JavaScript standard) 5 and 6.

Finally, look in the About box of the example application for a small dedication, also present in the even simpler About box of ifs.b; my wife spent far too long listening to me talk about programming languages and compilers in the 90s. Now the talk is more likely to be about variable stars. Thanks Karen. We both like ferns as well, IFS generated or natural. 🙂

In any case, enjoy. Feedback welcome.

The Arrival, linguistic determinism, and programming languages

January 1, 2017

My son and I recently saw The Arrival, a movie that at first reminded me of Arthur C. Clarke’s Childhood’s End. The trailer suggested more action than was delivered, not a bad thing; the impact was primarily psychological.

Spacecraft arrive in several locations, hovering just above the ground. As you might guess, each country’s military forces quickly take control. The focus is on the US contingent (of course), although Australia, China and other countries are initially in frequent communication to collectively figure out what’s going on.

A sliding “door” periodically opens in the underside of each craft and personnel enter to try to make contact. Artificial gravity inside the atrium in which the humans stand makes things a little easier. A mostly opaque rectangular window separates them from the aliens and their atmosphere. The military personnel quickly realise that they need outside help so they enlist a linguist and a physicist. Apparently only America has competent linguists and physicists. 🙂

1

I won’t say more about the plot because I want to focus on one aspect and head off on a tangent. After a lot of puzzling by the main protagonists over the strange circle-based language in which the aliens try to communicate, the linguist eventually understands, with the help of a close encounter, why they have come. Nothing sinister as it turns out.

Along the way, the linguist talks to her physicist colleague and friend about the now somewhat outmoded Whorf-Sapir hypothesis (or just Whorfianism) of language or in which the structure of language is thought to affect the world view or cognition of its speakers. The weak form of this, linguistic relativity, says that a language merely influences thought, whereas the strong form, known as linguistic determinism, suggests that language determines what can be thought.

As the philosopher Ludwig Wittgenstein put it in his Tractatus Logico Philosophicus:

The limits of my language mean the limits of my world.

and

About what one cannot speak, one must remain silent.

The Arrival adds an interesting twist to this by allowing the linguist, who understands and internalises the alien language, to experience the world in a way that is, shall we say: temporally flexible.

The tangent has almost arrived; just a couple more paragraphs… 🙂

There is research suggesting that languages with names for particular colour shades make it easier for its speakers to remember those shades. This is an example of the weak form. However, we know that it is possible to perceive and describe shades, even if we have no explicit names for them, evidence against the strong form of the hypothesis.

Another example of the weak form would seem to be the fact that the Greek language has a different words for love: for God, friendship, the love of a parent for a child, and love between intimate partners.

I have not researched this enough to know whether there really are plausibly deterministic examples in natural languages, but I’d be interested in seeing some.

EDIT: It occurred to me today that I had heard of and recently read (here) about a culture whose language has only the number words one and two with many being the catch-all for other quantities. This most definitely places constraints upon the worldview of its people. In particular: the ability to count to specific numbers beyond two. It may be that in such a culture, this is all that’s required for enumeration in daily life, but it’s difficult to argue that growth is not limited by this, in particular: the discovery and use of mathematics. This is an example of linguistic determinism in natural languages.

Now finally, the tangent…

This all got me thinking about linguistic relativism and determinism in programming languages. To what extent does a programming language influence or determine what a programmer can think or limit his/her world view?

Whereas a language like assembly, C or C++ gives complete access to the hardware of a computer, Virtual Machine based languages like Java don’t, so too for explicit memory de-allocation vs garbage collection and other “unsafe” operations.

For example, not being able to express the thought in code: “write 42 to memory address 673416” limits what can be thought (programmed) in that language, an example of the strong form, so linguistic determinism.

There are of course many applications for which it is completely unnecessary (and dangerous) to be able to express such thoughts, so type systems that rule out whole classes of dangerous “code thoughts”, do us a great service, but at the cost of limiting our world and forcing us to be silent about certain things, as Wittgenstein might say, and possibly but not necessarily at the cost of performance.

Similarly, a language with even simple intrinsic data structures such as lists and maps permits more complex code with less effort. So long as suitable language constructs exist, i.e. pointers and dynamic memory allocation, such data structures (and algorithms to operate over them) can be created by the programmer, albeit at a greater cost and cognitive effort, and made available as libraries for use by others. Here we are closer to linguistic relativity I think. It was not uncommon to find myself, especially in the 90s, writing custom list data structures and search or sort algorithms from scratch when coding in the C programming language.

Perhaps the strongest encounter I had with the idea of language-as-influencer-of-thought was when learning Perl 20 years ago while working for a dial-up era Internet provider. The combination of regular expressions, lists, and maps in particular provided new ways to think about text processing, beyond simple character-by-character or sub-string comparisons.

If you had asked me 15 years ago which languages I could “think fastest” in, I would have said Perl and Java. Before them, the answer would have been C. The Perl experience translated to similar scripting languages all of which have been only incrementally better or worse, including Python.

At University I had studied and taught programming paradigms,  written a couple of compilers (e.g. ACE), engaged in some language design; I spent a lot of time in the 90s and early 2000s on the latter two.

The impact of object-oriented languages like Java and C++ (in fact, embodying multiple paradigms) was longer-lasting than most, especially with respect to the design and maintenance of large code bases. In recent years I’ve had increasing sympathy with the functional programming paradigm and strongly statically typed languages that limit the set of “legal” programs (for my own good).

As I have said in a different post, all programming languages are crude approximations of some Platonic ideal of a coming together of minds, artificial and natural, and there are very few languages yet that make communion with the machine or, just as important, with other programmers, a beautiful experience.

The idea of a programming language that doesn’t just place limits on my world, but one that radically changes the way I think about the world, as the alien language did for the linguist in The Arrival, is alluring.

I remain in search of such a language (and its ecosystem of libraries and tools), one that of course can only ever be asymptotically approached.

Writing this has scratched an itch that has been irritating me for a long time. Perhaps I’ll have more to say about particular languages and how they live up to the “ideal” in future posts.

Musings on lecture by Vatican Astronomer

October 28, 2016
cq5dam-web-1280-1280
Vatican Observatory, Arizona (source: goo.gl/cl7EpF)

Jesuit priest and Vatican observatory director Brother Guy J. Consolmagno visited Adelaide in August and gave a public lecture at UniSA.

1442916802171
Guy J. Consolmagno (source: goo.gl/Sxui6h)

I arrived early to have a meal at the Mawson Lakes hotel. Paul Curnow (ASSA vice president) and I spotted each other. He was at a table with a group of people, two of whom wore clerical collars, so I assumed one was Brother Guy. Paul invited me to eat with the group, a mixture of amateur astronomers (ASSA members) and Catholic church members, and in some cases, possibly both.

During dinner I asked Guy about the forthcoming southern edition of his book, Turn Left at Orion. He recently co-authored another book, Would you Baptize an Extraterrestrial? Whatever my pre-conceptions may have been, he seemed smart and witty, hard not to like.

His talk was titled The Heavens Proclaim: Astronomy and the Vatican after a now out of print book. It quickly became clear that he was a very good Science communicator (in 2014 he was recipient of the Carl Sagan Medal for excellence in education and public outreach) and a long-time practitioner of the Scientific Method. He also writes an interesting blog. The talk ranged widely from the Vatican Observatory‘s roots in the Gregorian Calendar reform of 1582 to the work of the Jesuit astronomers at the observatory’s current (and surprising!) location in Arizona.

A number of slides in the talk were devoted to Galileo. Guy admitted that while the whole sordid business was more nuanced than is sometimes realised, the church should not have gone after Galileo in the way it did. Contrast this to Mother Theresa who said she would have sided with the church over Galileo! It should of course be still further admitted that the fact that it took 350 years for the Catholic church to pardon Galileo (not until 1992, and assuming he needed pardoning at all!) of the charge of heresy should be more than a bit embarrassing to the Church. I don’t want to dwell on this here though.
Guy mentioned religion at various points during the talk, quoting scripture a handful of times, citing for example the number of occurrences of “star” in the Bible. He didn’t justify why he thought Christianity and the Catholic denomination in particular was the correct one out of all the possible religions (or none at all). Given the convictions of a substantial part of the audience, I suspect he didn’t feel the need to do so.
He wittily reversed the atheist quip about believing in only one less god than a monotheist, saying that he believed in only one more god than Richard Dawkins; not a valid move of course, but funny.

I wondered whether Guy’s view of the relationship between Science and Religion would align with the late evolutionary biologist Stephen J. Gould’s Non-overlapping Magesteria:

Here, I believe, lies the greatest strength and necessity of NOMA, the nonoverlapping magisteria of science and religion. NOMA permits—indeed enjoins—the prospect of respectful discourse, of constant input from both magisteria toward the common goal of wisdom. If human beings are anything special, we are the creatures that must ponder and talk. Pope John Paul II would surely point out to me that his magisterium has always recognized this distinction, for “in principio, erat verbum”—”In the beginning was the Word.”

In his talk, Guy said that Science brings him closer to God. According to his wikipedia page:

He believes in the need for science and religion to work alongside one another rather than as competing ideologies. In 2006, he said, “Religion needs science to keep it away from superstition and keep it close to reality, to protect it from creationism.”

The relationship Guy espouses seems more strongly aligned with Science than does NOMA, with a focus on preventing religion from going off the rails, yet still it’s clear (and not surprising since he’s a Jesuit priest) that for Guy, religion acts to inspire his relationship with Science.

Guy commented upon Georges Lemaître, the Belgian Catholic priest who published a paper in 1927 titled A homogeneous Universe of constant mass and growing radius accounting for the radial velocity of extragalactic nebulae, and later the idea of a “primeval atom”, making him the father of Big Bang theory. In the paper he proposed a value for the estimated rate of universal expansion subsequently confirmed by Edwin Hubble, now called the Hubble Constant. There’s an argument to be made that it should have been the Lemaître Constant after the less widely published Belgian scientist.

lemaitre

Georges Lemaître (source: goo.gl/BN6EKm)

Although Lemaître may have been sympathetic to the essence of NOMA, he helped to persuade Pope Pius XII to stop making proclamations about the relationship between science and religion, stating that there was neither a connection nor a contradiction between religion and his hypotheses.

During question time at the end of the talk, someone asked Guy how young people could be encouraged not to abandon religion as they learn more about Science. Guy responded by agreeing that adopting a scientific world view doesn’t mean abandoning religion, reiterating that Science brings him closer to God, and suggesting that an atheistic worldview was unnecessary and perhaps even a little further, at least to him and the questioner, not tasteful.

As an atheist and secular humanist, I obviously disagree with this viewpoint. It’s possible to retain a sense of wonder and a hunger for knowledge without the need for a deity.

Guy spoke about the fact that Lemaître understood the importance of allowing the data to speak, to provide evidence in support of (or not) an hypothesis.

In relation to the god hypothesis, that is all an atheist claims.

What I don’t understand is why the god hypothesis is different from any other. Is there supporting evidence for a deity of a particular kind, the god(s) of the Bible, for example? Shouldn’t the Scientific Method be applied here? Does Guy consider this valid? That’s the question I would ask if I spoke with him again, I think.

My only other criticism was the brief mention Guy made about how the Catholic church helps the poor, arguably not appropriate for a talk about astronomy, but not surprising when you accept that it was part lecture, part sermon. I’ve sat through (and given enough in my misguided past) sermons to know one when I hear one. I’ve written more about the relationship between the church and the poor elsewhere.

There’s no doubt that Brother Guy Consolmagno and the other Jesuit astronomers at the Vatican Observatory are doing good Science. In particular, Guy’s research explores connections between meteorites, asteroids, and the evolution of small solar system bodies and he employs the observatory’s 1.8 metre telescope to observe Kuiper Belt objects.

Of course, you need math, science, and a telescope or at least data from someone else’s telescope to do astronomy. You don’t need religion to do astronomy.

To borrow the title of the 2009 Intelligence Squared debate, “is the Catholic Church a force for a good in the world” insofar as astronomy is concerned? It would seem so, but in the end, I can’t help but feel that the Vatican Observatory and its astronomers stand in stark contrast to the Catholic church’s irresponsible prohibitions against contraception, the scandal of child abuse by clergy, and the extravagance of beatification.

Mother Teresa: saint?

September 18, 2016

The September 2016 Richard Dawkin’s Foundation newsletter highlighted an article by Joe Nickell titled: St. [Mother] Teresa and the Miracles Game:

Around the world, the Catholic faithful clamor for their beloved late priest, nun, or other personage to be added to the roster of saints. Pope John Paul II (1920–2005) heard them and lowered the requirement from three verified miracles to two (one for beatification, another for canonization), creating numerous saints and beatifying over 1,300 others—more than had all his predecessors together.

mother-teresa-blog-yaaree-com-1

Source: Mommy dearest, Mother Teresa not so saintly

Mother Teresa’s canonisation (confirmation as a saint) occurred on September 4 after the “necessary” two miracles were “identified”, the first for beatification (in which the Pope declares the dead saint-to-be as being in a state of bliss) in 2003, the second for sainthood.

For the beatification, the case of an Indian tribal woman was selected. Monica Besra claimed to have been cured in 1998 of stomach cancer, in the form of a tubercular tumor, after she placed a locket with a picture of Mother Teresa on her abdomen.

Nickell goes on to say that the doctors treating the woman said the cyst (not tumor) had continued to receive treatment even after the death of Mother Teresa. Mrs Besra’s husband is quoted as saying: “It is much ado about nothing. My wife was cured by the doctors and not by any miracle.” He conceded that his wife “…felt less pain one night when she used the locket, but her pain had been coming and going. Then she went to the doctors, and they cured her.”

Mrs Besra herself still believed in the miracle, while admitting she was treated by doctors in hospital. “I took the medicines they gave me, but the locket gave me complete relief from the pain.” It is of course not outside of the realm of possibility that the placebo effect could account for the pain relief. In any case, it appears that the claim that Mother Teresa cured Mrs Besra, is unfounded.

As a an aside, why do some consider it acceptable to thank God for the honest, hard work of doctors and nurses? The fact is that God can’t lose. If a patient dies, it was His will. If they live, He is praised. If only gods were held to the same account as people…

The second case, the one that took Mother Teresa over the line to sainthood was that of a Brazillian man who had lapsed into a coma due to some kind of brain infection (the details differ with the source). His priest prayed for Mother Teresa to intervene with God, and the man supposedly awoke suddenly as a result. As Nickell points out, it may of course simply be that the treatment he was undergoing was effective, after all.

Again from Nickell:

In both cases “miracle” was defined as it always is in such matters as “medically inexplicable.” The evidence is therefore not positive but negative, resulting in a logical fallacy called argumentum ad ignorantiam “an argument from ignorance”—that is, a lack of knowledge. One cannot draw a conclusion from “we don’t know”—least of all that a miracle (supposedly a supernatural occurrence) was involved.

and

Doctors—including Catholic doctors—should refuse to play the miracles game. If the Church wishes to honor a doctrinaire nun, let it do so without an affront to science and reason.

Miracles, like the existence of gods, should be treated with the same scrutiny as any other phenomenon. As Gregory A. Clark wrote in The Salt Lake Tribune, Sainthood for Mother Teresa exposes the delusion of religion:

Seeking intellectual respect, Pope Francis recently declared that God is not “a magician, with a magic wand.” But as the pope’s canonizing Mother Teresa shows, he’s happy to promote God’s magic when it makes for good PR.

and in response Clarke points out that:

One miracle is as possible — or impossible — as another. Preach that an omnipotent deity can perform miracles, and you also preach that at other times He chooses not to.

Apart from the more well publicised evils, especially of late, the corruption of the Catholic Church is again revealed in a casual disregard of evidence and abuse of logic.

But just suppose for a moment that the idea of sainthood made sense. What kind of a saint is Mother Teresa?

In her 1979 Nobel Peace Prize acceptance speech, Mother Teresa had this to say:

And I feel one thing I want to share with you all, the greatest destroyer of peace today is the cry of the innocent unborn child. For if a mother can murder her own child in her womb, what is left for you and for me to kill each other?

The Catholic News Agency provides the transcript of a 1954 speech by Mother Teresa to the National Prayer Breakfast, some of which is eerily similar to the Nobel Peace Prize speech 25 years later. After similar sermonising about abortion, we see this, also shared as a quote by the Faithful Catholics website:

Once that living love is destroyed by contraception, abortion follows very easily.

It is bit of a stretch to see how the conclusion follows from the premise of either of the statements:

  • if a mother can abort a pregnancy then we are more likely to commit murder.
  • if (some form of) love is destroyed by contraception then abortion easily follows.

Indeed, the nature of the “living love” that is “destroyed by contraception” is unclear and seems vaguely reminiscent of Monty Python’s “every sperm is sacred” song from the Meaning of Life.

To those of a less dogmatic persuasion, there are surely greater “evils” than abortion, as a child affected by the Zika virus attests to.

Preceding this in the 1954 speech we have the following pearl of wisdom:

I know that couples have to plan their family and for that there is natural family planning. The way to plan the family is natural family planning, not contraception. In destroying the power of giving life, through contraception, a husband or wife is doing something to self.

There’s nothing surprising about this stance from the viewpoint of a Catholic worldview of course, but there are well-known problems that can be directly linked to religious sanctions against contraception, e.g. the spread of HIV, poverty, overpopulation.

Arguably, aside from the abuse of children by priests, the command to the faithful not to use contraception is one of the greatest evils of the Catholic Church.

Mother Teresa founded the Missionaries of Charity in 1950. Visitors to the Home for the Dying in Calcutta have reported that patients were placed on basic stretcher beds (indeed, video footage shows this), strong pain relief was rarely used (in a “hospice”, where people are dying in significant pain), so too for antibiotics, and needles were observed being rinsed under running water rather than sterilised. There were also reports of patients who could have recovered with proper treatment not being sent to a hospital, including the case of a 15 year old boy with a kidney infection that went untreated by antibiotics; a transfer to hospital was prevented.

This despite associating with and receiving prizes from shady individuals such as Jean-Claude Duvallier, the right-wing Hatian dictator and amassing funds from corrupt individuals such as Charles Keating, who sent Mother Teresa millions and lent her his private jet when she visited the United States. Instead of creating world-class medical facilities with such funds, the Missionaries of Charity spread to more than 100 countries.

Yet when sick later in life, for example when she required a pacemaker, Mother Teresa herself received top medical care in the West.

Although she and her missionary sisters and volunteers no doubt provided some comfort to the sick and dying, there was a cult-ish element to the work of Mother Teresa. For example, she is quoted as saying:

I think it is very beautiful for the poor to accept their lot, to share it with the passion of Christ. I think the world is being much helped by the suffering of the poor people.

and of telling a terminal cancer patient in extreme pain:

You are suffering like Christ on the cross. So Jesus must be kissing you.

Mother Teresa seemed at least as interested in using the poor and their suffering as an opportunity for conversion to Christianity as anything else, the ultimate point of missionary activity after all.

Watching the short (24 minute) film by Christopher Hitchens, Hell’s angel (YouTube), provides a quick way to revise your pre-conceptions about Teresa of Calcutta.

Coincidentally, a few weeks before the canonisation, I finally made time to listen to the audio version of Hitchen’s book: The Missionary Position: Mother Teresa in Theory and Practice, which provides further insight.

Hitchens visited the Missionaries of Charity in Calcutta and acted as a Devil’s Advocate in the case for her canonisation, giving testimony to the Archdiocese of Washington. As is so often the case, he says it best:

Mother Teresa was not a friend of the poor. She was a friend of poverty. She said that suffering was a gift from God. She spent her life opposing the only known cure for poverty, which is the empowerment of women and the emancipation of them from a livestock version of compulsory reproduction.