go to post Rob Tweed · Nov 26, 2020 It's pretty fast two - I do have a pretty fast micro SD in the RPi4 but it looks like you can set 0.5m global nodes/sec in a very simple test: USER>s s=$p($zts,",",2) f i=1:1:1000000 s ^rob(i)=$r(1000) i i=1000000 w $p($zts,",",2)-s2.072394 Not bad for a $35 computer :-)
go to post Rob Tweed · Nov 26, 2020 Bingo - nice find, Dmitry Here we go on Ubuntu Server 20.04 on my RPi4: ubuntu@ubuntu:~$ sudo docker run --name my-iris -it --rm -p 9091:1972 -p 9092:52772 -p 9093:52773 -p 9094:7041 store/intersystems/iris-community-arm64:2020.3.0.221.0[WARN] No init process detected! This container may accumulate zombie processes if run for a long time. Consider using "docker create --init ..." or equivalent.[INFO] Starting InterSystems IRIS instance IRIS...[INFO] This copy of InterSystems IRIS has been licensed for use exclusively by:InterSystems IRIS CommunityCopyright (c) 1986-2020 by InterSystems CorporationAny other use is a violation of your license agreementStarting IRIS 11/26/20-11:02:27:145 (361) 0 [Generic.Event] Global buffer setting requires attention. Auto-selected 25% of total memory.11/26/20-11:02:27:436 (361) 0 [Generic.Event] Allocated 449MB shared memory: 227MB global buffers, 80MB routine buffers11/26/20-11:02:27:588 (361) 0 [WriteDaemon.UsingWIJFile] Using WIJ file: /usr/irissys/mgr/IRIS.WIJ11/26/20-11:02:27:588 (361) 0 [WriteDaemon.CreatingNewWIJ] Creating a new WIJ file11/26/20-11:02:34:614 (361) 0 [WriteDaemon.CreatedNewWIJ] New WIJ file created11/26/20-11:02:34:629 (361) 0 [Generic.Event]Startup of InterSystems IRIS [IRIS for UNIX (Ubuntu Server LTS for ARM64 Containers) 2020.3 (Build 221U) Thu Oct 1 2020 15:11:45 UTC] in /usr/irissys/bin/ with mgr: /usr/irissys/mgr with wij: /usr/irissys/mgr/IRIS.WIJ from: /usr/irissys/mgr/ OS=[Linux], version=[#25-Ubuntu SMP PREEMPT Thu Oct 15 13:31:49 UTC 2020], release=[5.4.0-1022-raspi], machine=[aarch64] nodename=[b6deee189a6f]. numasyncwijbuf: 8, swdwrtmax: 64, wijdirectio: on, synctype: 3 System Initialized.11/26/20-11:02:34:642 (362) 0 [WriteDaemon.Started] Write daemon started.11/26/20-11:02:45:083 (373) 0 [Database.MountedRW] Mounted database /usr/irissys/mgr/ (SFN 0) read-write.11/26/20-11:02:45:216 (373) 0 [Utility.Event] Instance 'IRIS' starting on node b6deee189a6f by user irisuser11/26/20-11:02:45:216 (373) 0 [Utility.Event] Using parameters from file '/usr/irissys/iris.cpf'11/26/20-11:02:45:221 (373) 0 [Utility.Event] Loading DLLs11/26/20-11:03:31:951 (373) 0 [Database.MountedRO] Mounted database /usr/irissys/mgr/irislib/ (SFN 1) read-only. Database label is marked read-only.11/26/20-11:03:32:147 (373) 0 [Utility.Event] Switching to temporary %SYS Namespace11/26/20-11:03:32:340 (373) 0 [Utility.Event] Loading Locale enuw (English, United States, Unicode) from objects11/26/20-11:03:34:020 (373) 0 [Database.MountedRW] Mounted database /usr/irissys/mgr/iristemp/ (SFN 2) read-write.11/26/20-11:03:34:073 (373) 0 [Utility.Event] /usr/irissys/mgr/iristemp/ initialized as IRISTEMP11/26/20-11:03:34:080 (373) 0 [Utility.Event] Switching to default %SYS Namespace11/26/20-11:03:34:199 (390) 0 [Utility.Event] Log Monitor Started11/26/20-11:03:34:334 (391) 0 [Utility.Event] Clean Daemon Started11/26/20-11:03:34:382 (373) 1 [Utility.Event] Configuration file /usr/irissys/iris.cpf is not the same as when last shut down11/26/20-11:03:35:657 (373) 0 [Utility.Event] Updating configuration information from /usr/irissys/iris.cpf11/26/20-11:03:35:759 (373) 0 [Utility.Event] Performing Journal Recovery11/26/20-11:03:35:764 (373) 0 [Utility.Event] Graceful system shutdown, journal restore not required11/26/20-11:03:35:765 (373) 0 [Utility.Event] Graceful system shutdown, transaction rollback not required11/26/20-11:03:35:790 (373) 0 [Utility.Event] START: /usr/irissys/mgr/journal/20201126.00111/26/20-11:03:35:853 (373) 0 [Generic.Event] INTERSYSTEMS IRIS JOURNALING SYSTEM MESSAGEJournaling started to: /usr/irissys/mgr/journal/20201126.00111/26/20-11:03:35:855 (373) 0 [Utility.Event] Journaling to /usr/irissys/mgr/journal/20201126.001 started.11/26/20-11:03:35:979 (373) 0 [Utility.Event] Processing Startup section11/26/20-11:03:36:001 (392) 0 [Utility.Event] Purging old application errors11/26/20-11:03:36:246 (373) 0 [Utility.Event] Initializing Security system11/26/20-11:03:37:325 (392) 0 [Database.MountedRW] Mounted database /usr/irissys/mgr/irislocaldata/ (SFN 3) read-write.11/26/20-11:03:37:495 (373) 0 [Utility.Event] Processing Network section11/26/20-11:03:37:502 (373) 0 [Utility.Event] Activating Network11/26/20-11:03:37:756 (373) 0 [Utility.Event] Processing Databases section11/26/20-11:03:37:959 (373) 0 [Database.MountedRW] Mounted database /usr/irissys/mgr/irisaudit/ (SFN 4) read-write.11/26/20-11:03:37:978 (373) 0 [Utility.Event] Processing Namespaces section11/26/20-11:03:37:979 (373) 0 [Utility.Event] Namespaces are up to date11/26/20-11:03:37:979 (373) 0 [Utility.Event] Activating namespaces11/26/20-11:03:37:991 (373) 0 [Utility.Event] Activating new namespace map11/26/20-11:03:38:157 (373) 0 [Utility.Event] Namespace changes have been activated11/26/20-11:03:38:363 (373) 0 [Utility.Event] Starting Super Server on port 197211/26/20-11:03:38:406 (373) 0 [Utility.Event] Network Lock Upload Phase Starting11/26/20-11:03:38:410 (373) 0 [Utility.Event] Lock Upload Phase Complete11/26/20-11:03:38:410 (373) 0 [Utility.Event] Processing Miscellaneous section11/26/20-11:03:38:632 (397) 0 [Utility.Event] LMF Info: Licensed for 5 users.11/26/20-11:03:38:644 (398) 0 [Utility.Event] Starting Servers11/26/20-11:03:38:644 (373) 0 [Generic.Event] init_gcr_seed: gen_crypt_rand seeded from /dev/urandom: 64 bytes.11/26/20-11:03:38:644 (373) 0 [Utility.Event] Processing Devices section11/26/20-11:03:38:663 (373) 0 [Utility.Event] Processing DeviceSubTypes section11/26/20-11:03:38:664 (373) 0 [Utility.Event] Processing MagTape section11/26/20-11:03:38:684 (373) 0 [Utility.Event] Processing IO section11/26/20-11:03:38:691 (373) 0 [Utility.Event] Processing SQL section11/26/20-11:03:38:806 (373) 0 [Generic.Event] Auditing to /usr/irissys/mgr/irisaudit/11/26/20-11:03:38:978 (373) 0 [Utility.Event] Executing ^ZSTU routine11/26/20-11:03:38:984 (373) 0 [Utility.Event] Executing ^%ZSTART routine11/26/20-11:03:38:985 (373) 0 [Utility.Event] Enabling logons11/26/20-11:03:40:649 (398) 0 [Utility.Event] Private webserver started on 5277311/26/20-11:03:40:650 (398) 0 [Utility.Event] Processing Shadows section (this system as shadow)11/26/20-11:03:40:806 (373) 0 [Database.MountedRW] Mounted database /usr/irissys/mgr/user/ (SFN 5) read-write.11/26/20-11:03:40:812 (398) 0 [Utility.Event] Processing Monitor section11/26/20-11:03:41:242 (547) 0 [Utility.Event] Starting TASKMGR11/26/20-11:03:41:404 (548) 0 [Utility.Event] [SYSTEM MONITOR] System Monitor started in %SYS11/26/20-11:03:41:451 (398) 0 [Utility.Event] Shard license: 011/26/20-11:04:00:517 (373) 0 [Database.MountedRO] Mounted database /usr/irissys/mgr/enslib/ (SFN 6) read-only. Database label is marked read-only.11/26/20-11:04:00:527 (373) 0 [Utility.Event] Initializing Interoperability during system startup[INFO] ...started InterSystems IRIS instance IRIS and then in another process I can shell in and run iris terminal IRIS and access the IRIS shell and database! Amazing!
go to post Rob Tweed · Nov 26, 2020 Actually I think that might be the answer - uname -m on the RPi4 I've been using says armv7l which means 32 bit - it should say aarch64. The version of Raspbian is pretty old on that particular RPi4 and I'm not sure if they have now put out a 64-bit version of Raspbian? Now I have another RPi4 (I did say I had loads of them, right!) running Ubuntu Server 20.04 which I believe is a 64 bit version - I'll give it a try on that one and report back Rob
go to post Rob Tweed · Nov 26, 2020 The latest model RPi 4 running the standard Raspian OS. I have other Docker containers running fine on it - eg my rtweed/qewd-server-rpi and rtweed/mgweb-rpi ones (available on Docker Hub) I've not tried the 3, but really there shouldn't be any difference as far as Docker is concerned - all my RPi containers work fine on the 3 and 4.
go to post Rob Tweed · Nov 26, 2020 Dmitry What I see on the Raspberry Pi is this if I try to start it (in foreground mode so I can see the error): $ docker run --name my-iris -it --rm -p 9091:1972 -p 9092:52772 -p 9093:52773 -p 9094:7041 store/intersystems/iris-community-arm64:2020.3.0.221.0standard_init_linux.go:211: exec user process caused "exec format error"
go to post Rob Tweed · Nov 26, 2020 Thanks Vic. Yes that was my conclusion too - it seems to be for AWS EC2 ARM Graviton processors. The question is whether it ought to work on other ARM chips too? As far as ARM support for IRIS is concerned, Raspberry Pi would be really handy to have as it's a very low cost but extremely potent platform, and out there in huge numbers (eg you should see how many I have! :-). I know some work on an RPi/ARM port was done a while ago by an ISC intern but don't know what, if anything, became of it. Apple M1 would be the other obvious ARM platform of course :-)
go to post Rob Tweed · Nov 8, 2020 Be aware that there are Open Source alternatives available (for both Cache and IRIS), for not only Python, but also Ruby, Go and PHP https://github.com/chrisemunt?tab=repositories
go to post Rob Tweed · Oct 29, 2020 A quick update: I've modified our WebComponent-based wc-conduit RealWorld Client to optionally use the alternative WebSocket API interfaces supported by the qewd-conduit back-end. Furthermore, to make it easy for you to try out the wc-conduit front end and compare the REST and WebSocket APIs, a copy of the wc-conduit front-end is integrated into the qewd-conduit repository. I've updated the documentation to explain how to use the WebSocket version of wc-conduit if you want to try it out. It's very simple - just load a different URL to launch the wc-conduit front-end and it will automatically do the rest (no pun intended!). http:xx.xx.xx.xx:8080/conduit-wc (REST) http:xx.xx.xx.xx:8080/conduit-wc/index-ws.html (WebSockets) See if you notice any performance difference between the WebSocket and REST APIs. The back-end literally runs the same handler code regardless of the interface you choose, and the front-end WebComponents operate identically, so any difference in performance you see is network overheads of HTTP versus WebSockets, and the back-end interface overheads of HTTP (handled by the Node.js Express module) versus WebSockets (handled by the Node.js socket.io module). REST or WebSocket APIs with an IRIS back-end. What's not to like?
go to post Rob Tweed · Oct 21, 2020 So, step 2 along the road for qewd-conduit: this time focusing on the front-end. If you've noticed, most of the available front-ends for the RealWorld Conduit application are a real pain to install and configure. So, courtesy of the WebComponents and Module support that is now built-into modern browsers, I've created a version using my mg-webComponents framework. No bundled JavaScript, no heavy-weight frameworks like React, Angular, Vue etc. And a very simple configuration allowing you to change the Conduit back-end location in a matter of seconds. Read all about it and try it out here: https://github.com/robtweed/wc-conduit Let me know if you have any issues / questions / comments etc.
go to post Rob Tweed · Oct 11, 2020 I've updated the repository on Github to include files for IRIS running on Mac OS X. Here's how to get it working: - replace the /package.json file with /package.json.iris-osx (ie rename it to package.json) - replace the /configuration/config.json file with /configuration/config.json.iris.osx - Edit the /configuration/config.json file to ensure the database connection parameters are correct for your IRIS system. In particular you'll need to change the database.path property Then just follow the same instructions as provided for Windows in the README. HOWEVER!! IMPORTANT: When you start QEWD for the second (or subsequent) time, you need to have root privileges, so you need to do this: sudo npm start This is due to the root permissions needed to connect to IRIS's C interface It should then work according to the instructions I've provided for Windows.
go to post Rob Tweed · Oct 9, 2020 I'd need information on how you're supposed to customise the IRIS Docker container. From past experience it's a pretty complex process, but perhaps that's changed? To summarise what's needed for qewd-conduit, I'd need to be able to install Node.js on the running container, install a C++ compiler to its Linux environment, pull in the qewd-conduit repo files and modify the package.json and config.json files, then invoke npm install and npm start. The listener port used by the QEWD process would also need to be mapped via the Docker container's run command -p directive.
go to post Rob Tweed · Oct 9, 2020 For these to be "bonuses", they imply that there is something better about using them than doing the equivalent in other ways and using other technologies. They therefore rig the competition to favour solutions that use what's built-in to IRIS, and penalise systems that still use IRIS but use other technologies for achieving the same results just as effectively. So, for example, since qewd-conduit's logic is all in Node.js and not inside the IRIS programming environment, things like ZPM are not relevant, but I'm penalised for not using it. Ditto the REST API within the IRIS programming environment. And no, QEWD doesn't use the Native API for Node.js which is provided within IRIS, but uses the Open Source mg-dbx interface and the APIs it provides, so I guess that means qewd-conduit will be further penalised and lose that bonus too! :-) I suppose it comes down to what is trying to be demonstrated and promoted in the competition, but it doesn't seem to me to be a level playing field for demonstrating what's possible in terms of a full-stack application that makes use of IRIS for data storage.
go to post Rob Tweed · Oct 9, 2020 qewd-conduit could easily be set up to run in the Dockerised version of IRIS. For simplicity, the version I shipped assume you'd be running on a Windows machine on which IRIS was installed - the commonest set-up out there in my experience. It's somewhat mean to deny qewd-conduit a bonus for not using IRIS's built-in REST APIs - it clearly implements REST APIs against an IRIS system, just not using the proprietary IRIS-specific APIs. I'm not sure why their use warrants a bonus if REST APIs can be implemented just as effectively by other means.
go to post Rob Tweed · Oct 9, 2020 QEWD-Conduit is a QEWD application, which means it's a Node.js application - 100% JavaScript. As a QEWD application, it means it uses the mg-dbx connector to attach to an instance of IRIS or Cache. For simplicity and to make it easy and convenient for readers to try out, the version I've made available for the competition assumes it's going to be run on a Windows machine on which IRIS is installed - that's the most common set up out there. However, as a Node.js application, qewd-conduit is capable of running on any machine on which Node.js can be installed and run - so that means Linux, Unix, Mac OS and Windows. Since the Dockerised version of IRIS is based on a Linux OS, then yes, of course, qewd-conduit could be installed and run on it, eg by modifying the Dockerfiles setup, or simply shelling into the running container, installing Node.js, copying in the qewd-conduit repo files, running npm install and npm start. The key to modifying how/where qewd-conduit runs is just 2 configuration files: - the Node.js-specific package.json file. For Linux, Unix and MacOS systems, add "mg-dbx" as a dependency and make sure that the OS has a C++ compiler installed, since mg-dbx needs to be built from source during the npm install. For Windows, leave mg-dbx out as a dependency - QEWD will automatically download and install a pre-built Windows binary of mg-dbx when it is first run. - the QEWD-specific /configuration/config.json file which is used by QEWD to configure itself. In particular, the "database" section defines how the connection is to be made to IRIS or Cache, so that's where you define the path, namespace etc as appropriate for the instance of IRIS you want to connect. Note that the config.json file I've shipped assumes that you'll run qewd-conduit on the same physical machine as your instance of IRIS. However, you can change the settings to tell mg-dbx to connect to a separate IRIS (or Cache) instance via a network connection. Just explore the QEWD and mg-dbx documentation and you'll discover how to run qewd-conduit in any configuration you like on anything you like. It's a shame there's no publicly-available version of IRIS for a Raspberry Pi, because you could run qewd-conduit there too. You *could*, of course, run qewd-conduit on a Raspberry Pi and change the config.json to make a network connection to an IRIS system on a separate machine. QEWD really does provide the ultimate in flexibility for implementing IRIS/Cache REST services
go to post Rob Tweed · Oct 6, 2020 Yes, it would be possible to do so - it would be a simple matter of writing a process that invoked the appropriate Conduit REST APIs to create the articles, comments and links to authors/users from your data export. The one thing that might be tricky would be the user password property, which would be required for a user to log in and view/edit their own articles, and to follow other users and/or favourite their articles.
go to post Rob Tweed · Jun 2, 2020 Use QEWD instead - for example, if you want to build REST APIs with Cache + Windows: https://github.com/robtweed/qewd-microservices-examples/blob/master/WINDOWS-IRIS-1.md
go to post Rob Tweed · Apr 26, 2020 The Node.js-based QEWD-JSdb can be set up to work against IRIS. Here's how you can access its Global Storage: https://github.com/robtweed/qewd-jsdb/blob/master/REPL.md
go to post Rob Tweed · Apr 14, 2020 That depends on your definition of "REST API on the Intersystems IRIS side". That Intersystems IRIS provides the HTTP interface? and/or the code that does the work of the API is within IRIS and therefore ObjectScript? As far as QEWD is concerned, Intersystems IRIS is simply a persistent JSON store with no other role (though you still can invoke ObjectScript methods and access classes if you want), so a REST API is implemented in JavaScript and handled by Node.js/QEWD.
go to post Rob Tweed · Apr 13, 2020 So, provided Intersystems IRIS is used as the back-end database for the data persistence of the APIs, the competition allows the use of any other technologies in front of it? eg QEWD/Node.js + browser UI?