For an in-house web server I can give you a few advantages with Pharo not easily available in other environments:
You can enable monitoring using munin or nagios compliant daemons, which allows things like HP network tools to monitor the process and restart it if it goes down for any reason.
Magritte provides a declarative syntax for the UI, which will create a web UI (using jQuery widgets primarily) and a rich client UI. The jQuery widgets are generated and the code specifically stops event propagation once the event is consumed, which is the #1 reason for slow web pages. You can also limit event propagation to a given scope by using an announcer within that scope.
Other web frameworks can be used, but not with the declarative syntax. However NPM search can be integrated to Spotter from the built in Pharo Catalog
Phobos allows a Seaside web app to run on the desktop (like Electron, with the difference that it actually works).
Pharo has watchdog processes, allowing it to restart threads in the event of problems.
It can listen for notifications and pull new updated code from GIT, and instantiate it without restarting.
Tealight/Teapot are built in, monitored microservices (rather cutely, you put pots in a cupboard to monitor them), I used them on a project last year that served jQuery widgets to a JavaEE based portal. Since it was a high security environment (the government’s network) the widget and associated microserice had a preshared key created when both were created.
Using a landlord lease pattern, the moment the user leaves the page the associated pot is recycled.
Teacup is a built in tester for them.
The web server can start in 300 milliseconds, a microservice in 40 milliseconds. An Express.js microservice, by contrast, takes 1.5 s, while a SpringBoot microservice takes 3–5 seconds.
In development mode, a Helios code browser is available at the bottom of the browser screen, allowing quick code edits from the browser which take effect immediately. When you go back to the Pharo environment, the code changes are there.
You can lock down the UI, but make it accessible remotely via VNC, while leaving the code tools and debugging tools in the VM in a way that only you can access them, very useful for problems you can’t reproduce in dev or test. The full environment with virtually all libraries is under 250 MB.
The concurrency is phenomenal compared to node, Rails, or any JVM based framework. I was using it for monitoring provider edge routers, with a suitable machine it was analyzing data on the fly from 25 streams with a total throughput of over 70 MB/s.
The project had been attempted and failed in Java, Scala and Python, in each case it blew up at less than 1/10th of that. Scala has great language constructs, but once precompiled to JVM bytecode it looks nearly identical to Java using the concurrent package and the streaming API, so it doesn’t buy much at runtime.
The deployment machine was a network-specific PC appliance with four x 8 thread i7’s, 8 x 100 Gbps ports and 32 GB RAM, but it was monitoring 25 Cisco ASR-9010’s, which use a customized Linux with 7 kernels, each with their own memory, disks and ports, the admin port runs at 100 Gbps. All data is in verbose XML, and only XML queries exist, so there’s little you can do to prelimit the responses, as you could with XPath for instance. The ASR-9010 is a 6.4 Tbps aggregated service router, and monitoring BGP events results in 55–60 million events per minute.
Roassal agile visualizations can be used on the web via GraphViz integration.
It can be deployed with a simple bash script and zeroconf.
Debug logs are readable, and correspond pretty much one to one with your actual code. A small sample from a debug log is below:
THERE_BE_DRAGONS_HERE
Debug
26 November 2017 2:32:15.457907 am
VM: Win32 — IX86–10.0 — CoInterpreter VMMaker.oscog-eem.2254 uuid: 4f2c2cce-f4a2–469a-93f1–97ed941df0ad Jul 20 2017
StackToRegisterMappingCogit VMMaker.oscog-eem.2252 uuid: 2f3e9b0e-ecd3–4adf-b092-cce2e2587a5c Jul 20 2017
VM: 201707201942 https://github.com/OpenSmalltalk/opensmalltalk-vm.git $ Date: Thu Jul 20 12:42:21 2017 -0700 $ Plugins: 201707201942 https://github.com/OpenSmalltalk/opensmalltalk-vm.git $
Image: Pharo6.0 [Latest update: #60520]
Process>>debugWithTitle:
Receiver: a Process in nil
Arguments and temporary variables:
title: ‘Debug’
context: Process>>debugWithTitle:
Receiver’s instance variables:
nextLink: nil
suspendedContext: nil
priority: 40
myList: nil
name: ‘Morphic UI Process’
env: a WeakArray(nil nil nil nil nil nil nil a Job nil nil)
effectiveProcess: nil
terminating: false
Process>>debug
Receiver: a Process in nil
Arguments and temporary variables:
Receiver’s instance variables:
nextLink: nil
suspendedContext: nil
priority: 40
myList: nil
name: ‘Morphic UI Process’
env: a WeakArray(nil nil nil nil nil nil nil a Job nil nil)
effectiveProcess: nil
terminating: false
Job>>debug
Receiver: a Job
Arguments and temporary variables:
Receiver’s instance variables:
block: load
RPackageSet
withCacheDo: [ | version |
version := versions fi…etc…
currentValue: 0
min: 0
max: 100
title: ‘Loading ConfigurationOfTestsUsageAnalyser-BenoitVerhaeghe.1503412210’
children: an OrderedCollection(a Job)
isRunning: true
parent: a Job
process: a Process in nil
JobProgressMorph>>debug
Receiver: a JobProgressMorph(555060992)
Arguments and temporary variables:
Receiver’s instance variables:
bounds: (31.0@65.0) corner: (469.0@98.0)
owner: a SystemProgressMorph(135007232)
submorphs: an Array(a StringMorph(252225280)’Loading ConfigurationOfTestsUsageA…etc…
fullBounds: (31@65) corner: (469@98)
color: Color transparent
extension: a MorphExtension (19710976) [other: (announcer -> an Announcer)]
bar: a JobProgressBarMorph(867591168)
endValue: nil
hasResult: false
job: a Job
labelMorph: a StringMorph(252225280)’Loading ConfigurationOfTestsUsageAnalyser-…etc…
lastRefresh: 0
lock: a Semaphore()
result: nil
startValue: nil