Propeller Applications (.net 2.0? etc.) - Cross-Platform Test Fest Time!
jazzed
Posts: 11,803
I like writing Propeller applications in SPIN/PASM. I also like writing applications for the Propeller that will run on a user's "Host PC" as a Propeller client interface and would like to support all PC types: Mac, Linux, Windows, etc....
To continue supporting Propeller applications written for the user's PC, I have to consider directions of the market and product maintainability to serve the community.
Can you (forum participants) enlighten me as to how many people do or don't have Mono or other .net implementations installed on their Linux or Mac Host PC? If you don't have it, perhaps you can explain why not?
I'm having a hard time understanding the "resistance" to .net on platforms other than Windows (beyond the oligopolist power of Microsoft and others). As a user I am very annoyed that I have to put up with the .net startup time ... which is caused by the just in time JIT compiler used in application deployment. The JIT is used so that .net can deliver your application in your native language on your selected micro-processor (not just Intel x86).
There are of course cross-platform development environments other than .net. Java is fine, but also requires installing some minimal version engine and as I understand it will does not allow internationalization for the user. Perl has CPAN, but that for me was a 2 hour download/install and I won't push that on anyone. Python has a self-contained application deployment ability but that looks like a longer term development investment whose value is questionable. If there are other cross-platform development environments I have not mentioned, please tell me.
The application I do have out there that uses .net 2.0 and does not try to install .net has had many downloads and I get comments from users who appreciate my effort. Whatever I do for the Propeller community, I want to serve useful software to as many people as is possible. Does .net 2.0 serve that need for anyone except Windows users?
Edit: Changed thread title.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
--Steve
Propeller Tools Post Edited (jazzed) : 9/20/2009 6:54:42 PM GMT
To continue supporting Propeller applications written for the user's PC, I have to consider directions of the market and product maintainability to serve the community.
Can you (forum participants) enlighten me as to how many people do or don't have Mono or other .net implementations installed on their Linux or Mac Host PC? If you don't have it, perhaps you can explain why not?
I'm having a hard time understanding the "resistance" to .net on platforms other than Windows (beyond the oligopolist power of Microsoft and others). As a user I am very annoyed that I have to put up with the .net startup time ... which is caused by the just in time JIT compiler used in application deployment. The JIT is used so that .net can deliver your application in your native language on your selected micro-processor (not just Intel x86).
There are of course cross-platform development environments other than .net. Java is fine, but also requires installing some minimal version engine and as I understand it will does not allow internationalization for the user. Perl has CPAN, but that for me was a 2 hour download/install and I won't push that on anyone. Python has a self-contained application deployment ability but that looks like a longer term development investment whose value is questionable. If there are other cross-platform development environments I have not mentioned, please tell me.
The application I do have out there that uses .net 2.0 and does not try to install .net has had many downloads and I get comments from users who appreciate my effort. Whatever I do for the Propeller community, I want to serve useful software to as many people as is possible. Does .net 2.0 serve that need for anyone except Windows users?
Edit: Changed thread title.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
--Steve
Propeller Tools Post Edited (jazzed) : 9/20/2009 6:54:42 PM GMT
Comments
I don't care for .net, mostly because of the control by Microsoft (oligopolist power, etc.) I don't know enough about the internals to judge it technically. I would prefer not to have to use Mono or .net 2.0, but that's not realistic. It would be nice for you (and others) to test whatever you release on more than one operating system. It's too easy to use .net 2.0 features that don't work right in Mono, etc.
ViewPort, PropScope and 12Blocks all use .net 2.0. My windows users haven't had any problems with it. I have tried ViewPort on my Mac and under Linux using mono.net. I'm currently using Propellent, which is only available as a windows dll, so it's not currently possible to get the complete ViewPort experience on non-windows platforms. Many people prefer non-windows (like me), but since they're still missing support for a handful of applications they have a windows pc/virtual pc around for that. ViewPort has run nicely on Mac/Linux under emulation for the last 2 years that's good enough for me.
Hanno
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Download a free trial of ViewPort- the premier visual debugger for the Propeller
Includes full debugger, simulated instruments, fuzzy logic, and OpenCV for computer vision. Now a Parallax Product!
I could start my traditional one hour long rant against all thing Microsoft/.Net/Java but I will restrain myself.
Instead I'd like to point out that as far as I know mono/.net is not "done" on Linux. I could be wrong but I don't think the state of the art is such that any and all Mono/.Net apps will work on Linux.
Also, as you must be aware there are many other alternatives. Eg...
BradC has done a great job creating a cross platform Propeller IDE in Pascal/Lazarus. Small, fast, it works. My company has had similar success with Lazarus.
There are many cross platform GUI libraries. Just recently I have been doing professional work in Qt for the first time. I'm quite impressed with it and amazed at the fact that it compiles and runs on Linux/Windows/Mac and elsewhere so easily. I'm looking forward to seeing some of these apps running on the Nokia M900 Linux based phone in the near future.
A big question here is, are you willing to provide the source?
The big plus of Java/Mono etc is that you can provide the same closed binary blob to everyone and expect it to run. If the runtime is available for that platform. How well that works in practice I'm not sure. Sometimes I think that keeping the source closed is the only possible reason for such systems.
If you distribute the source then someone will get it compiled and running taking care of different library versions etc etc. So Qt would be a sure winner.
An overlooked option is the Win32 API itself strangely enough. LTspice is a great spice circuit simulator package from Linear Technology written for Windows. It runs perfectly under Wine on Linux. I get the feeling Linear are purposely sticking to that subset of Windows that works faultlessly under Wine.
www.linear.com/designtools/software/
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
For me, the past is not over yet.
Cheers!
Paul Rowntree
Do you ever run Python based GUI programs as either scripts or "frozen binaries" on a Mac ?
Python seems like a good option because it has language features that I use often and applications can be built as frozen binaries so that users have the option to run an executable program rather install this, that, and the other blah feature. I'm not at all thrilled by the Tkinter GUI maker though. and Python itself is pretty strange.
@heater, I tried mono on Suse Linux a couple of years ago and I never got it working after trying for days. I've yet to load it on Ubuntu and have honestly been afraid to do that out of fear of the unknown. The topic was not intended as some can of worms; if it becomes that, I will ask it to be removed. As far as giving away the source goes, well I'm more inclined to do what is of benefit to most people (including me). If it is of benefit to me as an investment or otherwise, I act accordingly. So far Propeller has been an interesting intellectual investment, and some day there may be fiscal value in it.
This is not some kind of an attack on .net or programs that use it. As an experienced .net developer it is very attractive for various reasons including the best in class GUI tools and multiple programming language choices. As a user however I'm confounded when I launch a program and it does not provide immediate feedback because of JIT compiling.
Anyway, there are only so many options I will consider going forward. I've produced CLI based binaries that will work on any PC (per binary WIN32, Cygwin, x86 Linux), but the truth is that GUI is king. I'm a big fan of Java because it and C# are the application languages I enjoy the most.
Any negative user experiences with Python would probably dissuade me very quickly, but Python is worth more study at this point.
Thanks to all of you who have taken time give feedback.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
--Steve
Propeller Tools
It's available for Windows, Mac, Linux and others. Just recently the licensing has been changed, there is an LGPL option, so you can be as closed or open as you like.
Comes with an excellent IDE, tons of excellent documentation and piles of excellent examples and demos.
I have no agenda with Qt except that I am impressed with it and the ulterior motive of wanting nice cross platform tools for the Prop [noparse]:)[/noparse]
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
For me, the past is not over yet.
at least you have options. [noparse]:)[/noparse]
I liked working with Trolltech's Qt - that might be a good option. (not sure why it's now on nokia, however.)
Python's pretty light weight - and it will be around for a long time. There are TONs and TONs of libraries out there - all are simple to pull in.
Java ... well, what to say? other than its quite the standard.
I'd lean toward Python, but that's my personal preference - since you've got options - maybe just go with what you *like* to code in.
- H
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
I am fairly firmly anti-mono for a number of reasons, but the main one is any time someone else starts to get ahead Microsoft starts waving around a patent portfolio. It's only a matter of time until they do that again and render your investment in cross-platform worthless.
WINE is an interesting option but fairly limited to x86 32bit. I used to write a lot of Delphi programs targeting Win95OSR2 that would run nicely under WINE (there are a few tweaks, tips and traps to avoid to ensure they behave nicely and consistently however and these are a moving target as WINE evolves). Problem with that is you leave Mac PPC users out in the dark, and evidently there are still a few of them (/us) around.
There is always C and a cross-platform widgetset. As heater said, Qt is now LGPL.
I'm a fan of native development. It's a lot easier to optimise for size/speed when you know precisely what the low level stuff is doing. It does mean managing multiple toolchains (and in my case multiple widget sets).
It's never an easy thing to chose a platform. If you are a big fan of Java, why not target that instead? At least there is no danger of your VM being sued out of existence.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
lt's not particularly silly, is it?
Personally I prefer the native code development in like Delphi, Java or C++ over .net for Prop tools. Microsoft can stick .net where the sun doesn't shine.
Honestly, I haven't done much programming for my Mac (or Windows for that matter) for a couple of years. I've used Python and AppleScript (and some shell scripts) for small GUI-like tasks with some Mac-only GUI interfaces. Most of the programming I've done lately has been for the Propeller. At one point I did a lot of PalmOS programming in Pascal and C, but that platform is on its way out.
Mike
Looking at the Qt option the LGPL seems to be saying if I distribute my application with Qt shared libraries and not statically linked, I get to keep my intellectual property investment (sources) however I choose or give it away if that has value. It doesn't resolve needing to maintain multiple platform setup methods. I do like the Qt IDE and GNU tools (177MB download eek[noparse]:)[/noparse] and the IDE has lots of examples for getting started. The build/startup process was a little consuming. More to explore in Qt obviously.
At this point, I think Java really suits my goals for ease of use and deployment near term. Java may seem a little goofy to Windows users, but it is fine as an application (not an applet except in client-server situations) for using system resources like serial ports.
I'm still working on the OctoProp infrastructure, but will have some cycles to dedicate to a program ... hmm, will that be ???
Cheers.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
--Steve
Propeller Tools
I have a few specific programs that I use that only run under windoze. So I have to use windoze, period.
I don't want overheads in running under another operating system.
I hate being locked in, but they are the facts of life I suppose.
If I had a choice, I would not use .net
If I had a choice, I would use a Mac
I want a GUI interface. I hate command lines and scripts.
A note to Jobs: Please license your operating sytem... There is still time to kill msoft !
FWIW: Yesterday I was forced (no workie otherwise) by msn to download the latest version which is supported by flash adverts. It also sets defaults to use their new Bing search engine and msn? homepage. I chose to not accept the new defaults. Big Brother at work !!!
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Links to other interesting threads:
· Home of the MultiBladeProps: TriBlade,·RamBlade, RetroBlade,·TwinBlade,·SixBlade, website
· Single Board Computer:·3 Propeller ICs·and a·TriBladeProp board (ZiCog Z80 Emulator)
· Prop Tools under Development or Completed (Index)
· Emulators: Micros eg Altair, and Terminals eg VT100 (Index) ZiCog (Z80) , MoCog (6809)
· Search the Propeller forums·(uses advanced Google search)
My cruising website is: ·www.bluemagic.biz·· MultiBladeProp is: www.bluemagic.biz/cluso.htm
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Links to other interesting threads:
· Home of the MultiBladeProps: TriBlade,·RamBlade, RetroBlade,·TwinBlade,·SixBlade, website
· Single Board Computer:·3 Propeller ICs·and a·TriBladeProp board (ZiCog Z80 Emulator)
· Prop Tools under Development or Completed (Index)
· Emulators: Micros eg Altair, and Terminals eg VT100 (Index) ZiCog (Z80) , MoCog (6809)
· Search the Propeller forums·(uses advanced Google search)
My cruising website is: ·www.bluemagic.biz·· MultiBladeProp is: www.bluemagic.biz/cluso.htm
These days time is something I must manage. I'm most often on a WinXP machine, and it's got most all the latest goodies installed on it.
JIT is kind of a bummer. Always wondered if it were not possible to write a small win32 API wrapper that gives the feedback, then launches the .net mess?
Put simply, none of this is a significant worry for me at this time. Thanks for asking. When I can afford to worry, I do things where I can run them on open OSes and that operate with open standards.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Propeller Wiki: Share the coolness!
Chat in real time with other Propellerheads on IRC #propeller @ freenode.net
Safety Tip: Life is as good as YOU think it is!
The reason Nokai bought Trolltech/Qt is that they want to use on their next generation phones/tablets etc which are currently ARM based. I'm looking forward to splashing out on the new N900. It's not often I go crazy for the latest shiny thing.
When Nokia bought Trolltech they promptly released Qt under the LGPL removing most peoples worries about it's "open sourcedness" thus guaranteeing it wide developer support and a long life. For serious closed commercial app development there is still a commercial licence with support etc etc. for a price...
As my old project manager at Nokia said "I don't want any more of Bill Gate's fingers in my project than absolutely necessary".
Java: May seem goofy to windows users it also seems very goofy to me. Big, slow, and basically a pain on Linux. Can any one point me to an example of a realistic modern Java app that I can just drop and go with on Linux and Windows and Mac?
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
For me, the past is not over yet.
Perl is just as easily reployed in a single-executable file as Python. Both (and other languages) suffer from the fact that you'll need to build binaries for each platform still. Not the end of the world, but in my experience doing development of a *desktop* Python app on one OS and deploying to others involves a lot of testing, some headaches, and a lot of if statements to handle where the app is running. While the interpreter and many GUI toolkits for Python, C, Perl, Ruby, Lua, Io, and a dozen other languages are cross platform the entire system isn't in the way that you can just check a box to say "spit out Windows and Mac apps, too!" An interpreter running on multiple platforms isn't the same as the entire language and library being built for multiple platforms.
With regards to OS X on PCs: It'll never happen, but it is just a matter of licensing. OS X can run on PCs already- it's run on PCs since 1996 or so. [noparse]:)[/noparse] You might have to have a supported video, network, sound card, etc but nothing else terribly special beyond that. Runs on my Eee PC, though not perfectly.
As far as languages in wide use that'll do cross platform with the kind of ease you want the only real choice is Java. I say that as someone who would much rather be coding in Smalltalk, Python, or Ruby... But one option that no one has mentioned thus far is to use Jython or JRuby. Both provide to you the language, but with full access to what Java can do- all the libraries, etc.
As far as deploying anything Java based- it isn't that big of a deal on Windows as some folks in the thread may think. You don't have to leave your users with an installation of th JRE- you can give them one ZIP that has it all rolled up and ready to run. Or an installer. At least on Windows and OS X. Want a great example? Go download the Arduino IDE at arduino.cc. It'll run, and run right, whether or not you have a JRE installed; or whether you have the right version.
Packaging the VM with the app is something you can't do on .NET.
@waltc: Native development with Java? Java isn't any more native than .NET; in fact, it's considerably less so all told. Both use a virtual machine to run non-native bytecode.
That all said, I've no love for Java. If it were me, I'd do it in Squeak Smalltalk. Truly cross platform, none of the slow start up times of Java or .NET- the app is stored as a memory snapshot; more like waking your computer up from hibernation than doing a reboot. But I'm getting too old to try to play forum language zealot... [noparse]:D[/noparse]
Aaron
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
For me, the past is not over yet.
Microsoft never told me what theirs is for, nor how to use it, and the name sure is confusing,
and I know it is slow and expensive and doesn't do anything I need done, so why would I buy it?
My friend "Lemming" says:"Cuz everybody else is DOING IT!"
That's why two people I know warned their bosses not to switch from Lotus to Outlook, but they did anyway.
Then they were all laid off because their businesses went to hell.
Also, I have a general No-EULA policy, and Microsoft is the rule, not the exception.
Yes! I don't know why I forgot it. Wow Rev!
I about fell out of my chair seeing all four of those in one post [noparse]:)[/noparse])··· Io and Squeak are my top favorite languages.
@Steve - Jython might give you the best of both worlds.· You'd just have to try it/java to see what the worst case scenario does RE the JIT.
Would you consider putting out a really simple·mockup/prototype in a couple of these flavors - and let us try them out for you?· The contributors to this thread represent a good mix of platforms.
- H
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
And that's kind of a bizzare thing really. These days it's rare to just go and buy an OS. I thought it was kind of fun.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Propeller Wiki: Share the coolness!
Chat in real time with other Propellerheads on IRC #propeller @ freenode.net
Safety Tip: Life is as good as YOU think it is!
That's an interesting idea in some form. I'm afraid a Propeller related PC application would take time for all the flavors so something simple and comparable should be used. Maybe all the contributors who are application developers can post some simple GUI program?
A "Cross-Platform Test-Fest" Challenge
I'll do the Java Application. Others should sign-up for their favorite method with a post.
Adventurous Propeller programmers can produce a similar Propeller GUI "Graphical User Interface"
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
--Steve
Propeller Tools
That's the unfortunate thing about Linux, in general. Folks who aren't willing to dink around a bit would find much of it a waste of their time. A Python app that could be packaged cleanly for Windows or OS X typically isn't for Linux. My personal guess is that this has a lot more to do with the fact that most Linux users are willing to spend some of their time in exchange for the flexibility and smaller download of a package that only has the project itself, not an entire JVM, SDK, etc.
To get a newer version of the ERIC Python IDE going on an Ubuntu 9 machine I wasn't just able to download and run one file. It involved a similar amount of rigamarole.
And since I didn't have (and don't use) KDE, this involve a LOT of time spent downloading and installing- there are a lot of dependencies not listed there. Quite a bit more than the Arduino IDE did. Ended up having to add symlinks as well, though I didn't have the benefit of handy instructions, as in your Arduino IDE example- it just didn't work, and I had to figure out how to get it to work.
My goal isn't to refute heater, just point out that Python and Java deployment both present their own headaches. Both can be packaged for a relatively pain-free deployment on OS X and the Mac; Java will be the easiest, but it's quite possible for either. I just installed a perl + gtk personal wiki app on my Windows machine with only a few clicks, no different than a native app.
@CounterRotatingProps: Really? Awesome! I used to be very active with the Squeak community, mostly working on WinCE and Linux PDAs and mobiles. Dyapad was my thing. Done some stuff for Alan Kay for the OLPC, though it's been a while since I had the time to contribute much. Love to encounter fellow Squeakers in the wild! Io is a lot of fun- seemed like it had a lot of momentum at first- is that still going? Couldn't get any Flux examples to work last time I checked out what was going on in SVN. All the same, good stuff.
Aaron
Running the JavaSum program:
Google Chrome makes the JavaSum.jar file download as JavaSum.jar.zip ... not what you want.
You must change the name to JavaSum.jar after opening the download folder.
With Internet Explorer 7 or FireFox, just click on the attachment and allow the program will run [noparse]:)[/noparse]
For the Java 6 Virtual Machine:
The first page to try is http://java.com ... Click the big blue "Free Java Download" button.
Java 6 was installed on my Ubuntu Linux box by default, so I clicked the "Verify Now" link.
The java.com download page should detect your computer O/S automatically. There is a page with
links/instructions for download/install for the four major PC systems if the page above doesn't work:
http://java.com/en/download/manual.jsp
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
--Steve
Propeller Tools
- Propalyzer: Propeller PC Logic Analyzer
- BMA: An on-chip PASM Debugger
- SPUD: Spin Source Level Debugger
Post Edited (jazzed) : 9/19/2009 4:20:47 AM GMTRe Jazzed "...users have the option to run an executable program rather install this, that, and the other blah feature"
Yes! I agree. I have three machines all running XP that I do most of my coding on. But no matter what I do, .net refuses to install on one of them. And it is very slow on all three.
I just realised, Brad's BST program we are using for the zicog is a self contained program that didn't need any installing. Sweet. I have a handful of others collected over the years. I really like the idea of a single program that is self contained and does not need any external .dll files (ie the program still works if another program decides to update that dll), and is self contained to the point it runs instantly rather than needing the user to go off to some site and download more files/install programs (which get blocked by the corporate firewall).
There is a version of winzip for instance that zips up files so they are self extracting.
I'm not sure I have the answer, but thanks++ to the posts above as I see some interesting things I'll be downloading and testing.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
www.smarthome.viviti.com/build
I use PureBasic which has ports for Windows, Linux and MacOS. For such simple Apps no adaption of the source code is necessary to port it to other platforms.
I have no MAC, so only Windows and Linux versions are in the ZIP.
Tooks me 10 minutes to program the Windows version (Visual Editor, then searching the right properties in the Help file, then compiling ). And another 5 minutes to port it to Linux (including start up my EEE-PC and transfer via SD card).
No Installing is necessary, no download of Frameworks, RunTimeLibraries or whatelse... just run it.
On Linux GTK2-library is necessary, but I think this is included in every Linux distribution.
PureBasic is not free (gratis), but for simple programs there is a Trial version without time limit. Only code size is limited and optimazion is disabled: www.purebasic.com/download.php
Andy
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
--Steve
Propeller Tools
Works here on Ubuntu 8.04
Took _ages_ to load though as java was not in the pagecache and I've got a slow 4800 RPM disk in this machine. Was ok the second time around.
<edit>
Tested Andy's linux app too. Nice and small. Loads fast.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
lt's not particularly silly, is it?
So far it reminds me how much I hate Java [noparse]:)[/noparse]
Here is how I got JavaSum running on my Debian Lenny. Baring in mind that I already have a working Java install. Starting as a naive user...
1) java -jar JavaSum.jar
FAILED something about missing javax.swining.GroupLayout not found.
Lets see what Java package we need ...
2) su
3) apt-cache search java
4) apt-get install sun-java6-bin
FAILED - unable to fetch some archive or other.
OK Lets up date our package list as suggested in the failure message..
5) apt-get update
Wait, wait, wait....
and try again
6) apt-get install sun-java6_bin
Wait, wait, wait...
7) Agree to obnoxious pop up license form.
8) Then again "Do you agree with the ....." Yes.
Wait, wait, wait....
9) exit su.
10) java -jar JavaSum.jar
FAILED
Go to Google and look for some advice...
11) update-java-alternatives -j java-6-bin
FAILED "alternative does not exists"
12) apt-get install sun-java6-jdk
Wait, wait, wait....
13) exit su.
14) java -jar JavaSum.jar
SUCCESS.
Total time 25 minutes and one cup of tea. Not bad for Linux really [noparse]:)[/noparse]
Now to see what this has broken in my set up...
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
For me, the past is not over yet.