To find a good replacement, the most important to know is a reason, why you need this information in the browser?

The first sample looks like you are looking for a default printer in the system.

And the second one, looking for a specific disk drive, with the letter U, and it should be network drive.

How are you going to use this information after that? Maybe the best way will be to completely change the way how you doing it or just forget about it.

Anyway, this happens due to a wish from browsers vendors, to increase a security level, so, they completely declined to use NPAPI and ActiveX. And as a side-effect of it, it's now impossible to use Java applets as well. And usually, to fix it, the simplest way was to create own simple application, which has to be installed on the users machine, and web-application application was able to connect to locally installed application through WebSockets or simple rest API in that application. 

ps. I can help you with development if you need any help.

What would you recommend, if the amount of data which have to be checked is quite large, let's say 100TB? For sure, it's not one solid database file, split by many files with sizes up to about 6TB. But most of the data is alive.

Dmitry Maslennikov · Aug 24, 2020 go to post

menu.mac

ROUTINE menu
menu(routine) {
  Set rtn = ##class(%RoutineMgr).%OpenId(routine_".mac")
  Quit:'$IsObject(rtn)
  Set menu = ""
  While 'rtn.Code.AtEnd {
    Set line = rtn.Code.ReadLine()
    Continue:$Char(9,32,35)[$Extract(line)
    Continue:line'[" ; "
    Set label = $Piece($Piece(line, " "), "(")
    Set title = $Piece(line, " ; ", 2, *)
    Set menu = menu _ $Listbuild($Listbuild(label, title))
  }
  Quit menu
}
asLine(menu, pos) public {
  Set menuItem = $Listget(menu, pos)
  Quit:menuItem="" """"""
  Set $Listbuild(label,title) = menuItem
  Quit "$Char(13,10)_""" _ $Justify(pos, 4) _ ". " _ title_ """"
}

menu.inc

ROUTINE menu [Type=INC]

#Execute Set menu = $$^menu(rtname)

  Write !,"--------Menu---------"
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))
  write ##Expression($$asLine^menu(menu,$Increment(menuLineNum)))

  Write !!
  do {
    Write $Char(13),"Option? ",*27,"[0K"
    Read menuOption
    Quit:menuOption=""
    Quit:"qQ"[$Extract(menuOption)
    Quit:$Listget(menu,+menuOption)'=""
  } while 1
  Write !
  if (+menuOption) {
    Set label = $Listget($Listget(menu, menuOption))
    Do @label
  }
  Quit 

And some routine which will have to have menu

ROUTINE test
#; just include menu, at the place where you need it
#Include menu
  quit

task1 ; Task 1
  Write !,"Some work 1"
  quit
task2 ; Task 2
  Write !,"Some work 2"
  quit
task3 ; Task 3
  Write !,"Some work 3"
  quit
task4 ; Task 4
  Write !,"Some work 4"
  quit
task5 ; Task 5
  Write !,"Some work 5"
  quit
task6 ; Task 6
  Write !,"Some work 6"
  quit
task7 ; Task 7
  Write !,"Some work 7"
  quit
task8 ; Task 8
  Write !,"Some work 8"
  quit
task9 ; Task 9
  Write !,"Some work 9"
  quit
task10 ; Task 10
  Write !,"Some work 10"
  quit

and call it

USER>d ^test

--------Menu---------
   1. Task 1
   2. Task 2
   3. Task 3
   4. Task 4
   5. Task 5
   6. Task 6
   7. Task 7
   8. Task 8
   9. Task 9
  10. Task 10

Option? 1

Some work 1

Menu list changed after compile, but routine should be saved as MAC. The final INT code contains the generated menu.

Dmitry Maslennikov · Aug 21, 2020 go to post

As I don't know your version of Caché, I'll suggest that it's quite new. So, I got this code working for IRIS in docker(Ubuntu). Did not check Windows.

auto
  Set fs = ##class(%Stream.FileCharacter).%New()
  Set a = $Random(100)
  Set b = $Random(100)
  Do fs.WriteLine(a)
  Do fs.WriteLine(b)

  Set ccontrol = $Select($ZVersion["IRIS": "iris", 1: "ccontrol")
  Set ccontrol = ccontrol _ $Select($$$isWINDOWS: ".exe", 1: "")
  Set ccontrol = ##class(%File).NormalizeFilename(ccontrol, $System.Util.BinaryDirectory())
  Set instance = ##class(%SYS.System).GetInstanceName()
  ZWrite a,b

  Set stdin = fs.Filename
  Set stdout = ##class(%File).TempFilename()
  Set sc = $zf(-100, "/STDIN="""_stdin_"""/STDOUT="""_stdout_"""", ccontrol, "session", instance, "-U", $Namespace, "TestRun^test")
  ZWrite ^zparas
  Quit 
TestRun
  Write !,"Enter First Variable Name: " R a
  Write !,"Enter Second Variable Name: " R b
  Set ^zparas=a_" "_b
  Quit 

And The output like this

a=17
b=62
^zparas="17 62"
Dmitry Maslennikov · Aug 21, 2020 go to post

I did not find any mention of ECDSA in InterSystems products, so, not sure if it's supported natively. I would look at some external tools which could help you with it. And you can start from openssl. And If I undestood correctly, you'll also need a public certificate, which used to make such a signature.

Dmitry Maslennikov · Aug 19, 2020 go to post

First of all, classes code stored completely differently with plain routines. So, the best way to compare two namespaces is to export all the code in UDL format, which in fact the same as in Studio, usually it was just XML.

From my side I would recommend using VSCode for this task, there you can export any kind of source from InterSystems products with any version since 2016.2. How this process would look there. 

  • open any empty folder in VSCode
  • Configure it to desired server and namespace
  • export source code from InterSystems Explorer view
  • do, git init, and commit all exported files
  • delete all sources
  • switch to another namespace, in the same explorer view, by just opening another namespace.
  • export all sources again.

git will show the differences.

As I'm a developer of VSCode extension for InterSystems, you can contact me directly, or through public issues

Dmitry Maslennikov · Aug 17, 2020 go to post

On Windows with cterm.exe you can write special terminal scripts.

on Linux, as I know terminal scripts not available, so, you just prepare the list of answers, if it's fixed. and just send it to stdin.

csession -U MYNAMESPACE ^MyRoutine < myanswers.txt

or

cat myanswers.txt | csession -U MYNAMESPACE ^MyRoutine

 

Dmitry Maslennikov · Aug 17, 2020 go to post

I've found that folder, but it twice less in size, then the same files on hl7. And as I understood correctly, it was loaded when FHIR server created, but it does not help.

Dmitry Maslennikov · Aug 16, 2020 go to post

I have a configuration with Caché 2018.1 as an ECP Data server and a few ECP Application servers on Ensemble 2012.2. The code is compiled and deployed for 2012, only, but stored on 2018.1. The data server even does not have a namespace for an application. It only mounts databases, and code databases just like any other data, which used by application servers. Ensemble Production works on a separate application server. And ECP Data server uses mirroring, so, my ensemble production and integrations does not care about IP migration at all, they work in the same place all the time.

In case of when ECP Application server may work on different versions, I would recommend storing all the versions of code in one place anyway on ECP Data Server. Just mount a specific code version on different platforms.

Dmitry Maslennikov · Aug 10, 2020 go to post

what do you mean by integrating with IS? Is it just Integrating with application working on IS? Years ago, I've implemented some of the video services into our application. So, I have some experience. But this time it could be even less complex, or completely different. And anyway depends on how exactly you would like to see it. I can help you with it, please contact me directly dmitry@caretdev.com, I co-founder of a company, where we can help you to implement this or anything else.

Dmitry Maslennikov · Aug 10, 2020 go to post

0.8.8 now when you save your code locally changed on the server, should warn you about it, and should offer to review, just load from the server or overwrite changes on server.

There is no full synchronization, yet at the moment. Could you fill the issue, if you would need exactly this feature? And explain how would you like to see it?  

If you don't care about your local changes, and want to get the latest server's version of code, just export needed from Explorer view, or export everything by the command `Export sources` from command palette. You have to have correct `objectscript.export` settings, so, your exported sources will overwrite your local files correctly.

Vitaly did not explain this magic number, I'll do. An important thing to now about Base64 is that any thee bytes of data encoded to four bytes. So, if you need encode data you have to read in length devisable by 3 (5700/3=1900), and when you decode data, read divisible by four. But decoded data may contain line endings, which should be omitted and not counted.

So, you can use 24573 if you'd need to encode, and 32764 to decode data.

24573 appears as 32764/4*3.

24573 bytes becomes 32764 after encoding, so, it will not be more than the default string limit if no long string activated.

Muni, 

First of all, you have to copy all of your journals, you currently have, so, they will not be purged by schedule.

Next, it depends, on how that data was deleted. If it happened in the transaction, so, you are lucky. It will be possible to restore that data, if not, again depends on how it was killed. Just Kill ^Global,  outside of the transaction, just kills it, with no useful information for restore.

I think you can actually do what you with ^ZJRNFILT. But I prefer direct access to journals through their API, in %SYS.Journal classes.

Dmitry Maslennikov · Jul 24, 2020 go to post

Looks like you solving the issue wrong way. 

If you have multiple servers that can listen for connections, and allowed to do so, and you just need one external address that would use any of them for the clients. I would recommend using HAProxy, it's a load balancer tool, which may work for HTTP, and for plain TCP as well. In this case, clients will use HAProxy's address and port, and it will establish a connection to one of the backends. It may check if the backend is available, use backup backends if all primary backends died, and many other features. I'm using this in one of the projects for years, for HTTP with thousands of concurrent users, and 10 backends.

Dmitry Maslennikov · Jul 16, 2020 go to post

The error says almost everything, you have a permission issue. While you have Windows, it's kind of a common issue.

You have to check permission flags. 

But, I would not recommend using Durable %SYS at all. I suppose you use it in development right now, so, no reasons to use Durable %SYS. Ready for development image should be prepared with Dockerfile.

Dmitry Maslennikov · Jul 11, 2020 go to post

This is explorer view, supposed to be only to view the source of code on the server and read-only. There are two ways

  • Preferable, store any code locally, and when you save it, it will upload to server and compile it there. If you already have some of your code on server, you can export it from the explorer view.
  • Use virtual filesystem named isfs, in this case, all of your code stored only on server. Documentation

You can find some useful videos on youtube on Developer Community channel, for instance

In addition to already mentioned options, System will help to organize compilation order. You can prioritize some kind of system classes, which by any case have to be compiled first. By using System, DependsOn, or CompileAfter, you can correctly organize your compilation order, CompileAll should work correctly with flags `ck-u`.

In OS X, X is just a version 10, which in fact already replacing by 11 this year (after many years), and it's not just OS X, it's macOS.

And anyway, I would not recommend macOS for a production server, it's only suitable and supported for development.

Supported Server Platforms

As Kai, already mentioned, this icon, will appear only if you have any folder opened. Such a folder is a kind of project in VSCode. And, while Server Explorer view, which can be opened available by this icon, is supposed to be as just a server explorer, without editing. So, there are no reasons to make it available until any project will be opened.

Dmitry Maslennikov · Jun 21, 2020 go to post

First of all, you have to open this .code-workspace file with VSCode, it should offer to do it if you did not. Next, path is relevant to .code-workspace file location, and should contain own .vscode/settings.json. If all conditions are met, but behaviour not expected, please fill the issue, with examples, and screenshots, I'll try to reproduce and find the solution.

Dmitry Maslennikov · Jun 20, 2020 go to post

That’s very good to hear. As for the latest question, work in progress, and update should be available soon