go to post Julius Kavay · Mar 13 There is a somewhat "simple" method too /// search for the superserver job /// return the OS Username for that job ClassMethod OSUsername() { new $namespace set $namespace="%SYS" set job="" for {set job=$zj(job) quit:job="" set prc=##class(%SYS.ProcessQuery).%OpenId(job) if prc, prc.JobType=24 ret prc.OSUserName } ret "" }
go to post Julius Kavay · Mar 13 Try this method Class DC.Util Extends %RegisteredObject { /// Return: the OS username for this Cache/IRIS instance /// /// First, get the port of the superserver /// then search, which job owns that port /// then return the OSUsername for that job /// ClassMethod OSUsername() { new $namespace set $namespace="%SYS" if ##Class(Config.Startup).Get(.par),$d(par("DefaultPort"),port) { set job="", pattern=".e1""|TCP|"_port_"*"".e" for set job=$zj(job) quit:$v(-1,job)?@pattern||(job="") if job { set proc=##class(%SYS.ProcessQuery).%OpenId(job) ret:proc proc.OSUserName } } ret "" } } A note:- I know of a $zu(...) function which works and returns the superserver port but $zu() functions are deprecated/discouraged - and this one is not in the replacement list - why?
go to post Julius Kavay · Feb 20 in the above answer, after "...spiral way is this" and "You start..." there should be a picture - it seems, something is went wrong with the upload. I try it a second time...
go to post Julius Kavay · Feb 19 I think he didn't made it clear. The examples Test1x1Matrix() and TestAllSameCharacters() are exaples without any information. And by the way, a 1x1 and 2x2 matrices aren't the best examples to show a spiral way!
go to post Julius Kavay · Feb 19 In absence of clear rules, it's wasting time to write a code. Or one makes his own rule and writes a code which confirms to this rule. My perception of travelling along the cells of a quadratic matrix in a clockwise spiral way is this You start at the big red point (1,1) and go along the cells until the last cell. Of course, you can start at any point, including the last one (then is your start and endpoint are the same and no motion is requered). If you start, for example in a 4x4 matrix at (1,3), this means, you skip the first two cells: (1,1) and (1,2) and if you reached the last point (3,2) there is no way (I mean, no sense) to came back to (1,1)
go to post Julius Kavay · Feb 18 Exactly, that's the correct way (according to my opinion, and it seems, you go with me).In the above example, a 'H' never may be followed by an 'A', that would make a full circle but we want a spiral...
go to post Julius Kavay · Feb 17 I absence of welldefined rules, it's a matter of opinion, how one does a "clockwise spiral walk" in a quadratic matrix.First, I would define the TOP-LEFT corner as point (1,1) with the addition, that (1,1) is always the top-left corner.For a 1x1, 2x2, 3x3, 4x4 and 5x5 matrix I would go this way (I use the 25 letters to show my clockwise spiral way, starting at top-left with the letter 'a'): 1x1 2x2 3x3 4x4 5x5 a-a a-d a-i a- a-y a ab abc abcd abcde dc hid lmne pqrsf gfe kpof oxytg jihg nwvuh mlkji Matrix: 4x4, starting points: (1,1) --> abcdefghijklmnop (1,2) --> bcdefghijklmnop (2,3) --> nop (2,4) --> efghijklmnop (3,1) --> klmnop (3,2) --> p (3,3) --> op You always go from the starting point to the endpoint (in the center) All odd matrices (1x1, 3x3, 5x4,...) have a middle-point at (N+1\2, N+1\2) According to original constraints #2 "The starting position is always valid within the matrix". I interpret that as one can start at any point a clockwise spiral reading, for example, reading the 4x4 matrix, starting at (3,4) gives you: 'fghijklmnop' The sequence 'abcde' is skipped. A reading like: 'fghijklabcdenm' gives a clockwise spiral but never touches 'op' on the other hand, reading like: 'fghijklabcdenopm' is not clockwise-spiral because at the sequence 'eno' suddenly takes an counterclockwise turn!
go to post Julius Kavay · Feb 13 You talk about a multidimensional matrix but obviously mean a two dimensional matrix - right?You talk about a matrix of size: N x N but neither the given code signaure nor the task description specify where the value N is given. In your examples you create the matrix by continuous incrementing the root node of matrix - the root node is equal to N, is this always valid or just in your examples or in other words, would this be a valid call: kill box set box(1)="A,B" set box(2)="C,D" do ##class(codeGolf.ClockwiseWord).Solution(.box,1,1) I know, I one can obtain the value for N with a simple $order() set N = $order(matrix(""),-1) You expect a correct solution, we expect correct a descriptionjustmy2cents
go to post Julius Kavay · Feb 10 Before you start reading, set the lineterminator property to the desired value do myStream.Rewind() set myStream.LineTerminator=$c(13,10) // or $c(10) // or more general set myStream.LineTerminator=$case($zversion(1), 2:$c(13,10), 3:$c(10), :"") // now start reading set line = myStream.ReadLine() ... ...
go to post Julius Kavay · Feb 7 And do not forget, if the application has/uses parts of "older code" then the so called "naked syntax" may also be a issue (of course not, if you just want to know the name of the global). Classmethod Test() { kill ^myGlobal kill ^yourGlobal set ^myGlobal(2)="some data" do ..moreData("data1") set ^yourGlobal(3)="other data" do ..moreData("data2") // Now, the globals look like // // ^myGlobal(2)="some data" // ^myGlobal(9)="data1" // // ^yourGlobal(3)="other data" // ^yourGlobal(9)="data2" } ClassMethod moreData(data) { set ^(9)=data } Beside all the "nice" combinations of direct sets, indirections, naked synates etc. do not forget, your application may call routinies/methods which are in deployed mode (third party APIs and utilities - hopefully with documentation)
go to post Julius Kavay · Feb 7 You are right, using the hash value of a line solves the problem of long lines (hence the hint in my answer: 'similar (short) solution') but does NOT solve the second requirement, the sorting.Hash values do not keep the sort order of the original values! set a="Sara",b="John" write $system.Encryption.SHA1Hash(a)]$system.Encryption.SHA1Hash(b),!,a]b 1 1 set a="SSSS",b="JJJJ" write $system.Encryption.SHA1Hash(a)]$system.Encryption.SHA1Hash(b),!,a]b 0 1 If I remember correctly, I developed a method for sorting long lines a few years ago. I'll look into it this weekend.
go to post Julius Kavay · Feb 6 In case, your file contains lines NO LONGER than 500 characters than you can drop duplicated lines and sort them in one go: ClassMethod RemoveAndSort(inpFN = "json.txt") { kill ^||tmp set inpStr=##class(%Stream.FileCharacter).%New() set outStr=##class(%Stream.TmpCharacter).%New() do inpStr.LinkToFile(inpFN) do inpStr.Rewind() while 'inpStr.AtEnd { // put the JSON lines into a tmp global set line=inpStr.ReadLine() // duplicates are overwritten, all lines are sorted if $match(line,"[\{\[].+[\}\]]") { set ^||tmp(line)="" } // ignore non-JSON lines } set line="" for {set line=$o(^||tmp(line)) quit:line="" do outStr.WriteLine(line) } quit outStr // save the new stream or just use it } A similar (short) solution exists for removing duplicated lines until MAXSTRING line lengths.
go to post Julius Kavay · Feb 4 With the help of a standard editor only - that will be a difficult and cumbersome task, for example, in the below snippet try to find the "^Test" global (not the routine ^Test): set value = ^Test // take a value from the global ^Test do ^Test // call the routine ^Test // a more complex case // set ref = "^Test" // in this case you are lucky set ref = "^" _ "Test" // this could be a stumbling stone // few lines later set value = @ref // get the value of ^Test global do @ref // call the routine ^Test You will need some kind of an "intelligent" editor which can make a difference between a call (do) like operation and a "get-value" like operation. The one I know of (but I have never used it, so I don't know how good it works) is the RE/parser of GJS. Asking Google is a good starting point.
go to post Julius Kavay · Jan 19 Some comments (and please excuse the rude comments) before my answer1) in general, it's never a good idea, to enforce a "new coding standard" for an old code. This is especially valid for old MUMPS and old ObjectScript code - except, you redesign or at least rework, the entire codebase.2) use the Codesnippet button to write a more readable code (it's not necessary, but it helps us)3) include only relevant parts/lines of code, in the above code, all that ^OLIVERs are completely irrelevant and makes the reading and understanding of an foreigen code more difficult, with other words, help us to help you! And now to your problem. The old code is written in a mode, which we call "non procedural" code, i.e. all variables are public except the NEWed (which are invisible). The original code changes or kills at least the OLDIO543 variable, somewhere in the called part (do @CALL), and this fact is considered with the N TMPFILE,OLDIO S OLDIO=$IO I $G(^TMP("RMPV","SILENT"),1) S IOP="NULL",%ZIS=0 D ^%ZIS I '$G(POP,1) U IO D INIT^@DRVNAME D ; scope variables .N (DUZ,CALL) ; Protect %response // <-- save all except DUZ and call .S IOF="""""",IOM=80,U="^" .D @CALL U OLDIO To move all commands from argumentless DO into a classmethod is OK, but you can't change a "non procedural" flow to a "procedural"!So the solution is, you leave the old NEW as is and define your class method as: ClassMethod doCall() [ ProcedureBlock=0 ] { ... } If you want to keep your procedural code then you have to rework the code, which is called by "do @CALL" too and probably the code which is called from inside of "DO @CALL". Good luck!
go to post Julius Kavay · Jan 17 This is the rare case where the statement “RTFM” leads you down the wrong path or, better said, reading the documentation confuses you more than informs. So you have to change your viewpoint. And that depends on, what do you do.If you work with ObjectScript (and of course, with objects) then your first citation "Case-sensitive: variable names..." holds. But if you are more that SQL guy, who day in, day out busy with Updates, Inserts and Selects, then you will say, "No, no, my table and field names aren't case sensitive". And now we sit in the middle of those two worlds, where a case sensitive Objectscript meets a case insensitive SQL world. So what is the status quo? All the (persistent) classes can be seen (and used) as SQL tables, but this freedom has its price (or, better, its consequence): you must be aware, that the two worlds (ObjectScript and SQL) do not use the same case-rule. An ObjecScript class Test.Person can be named in SQL as Test.Person, as TEST.Person, as TEST.PERSON or even as TeSt.PeRsOn. To de-escalate the resulting confusion, the following rule was added: It's forbidden to have two ObjectScript classes, which have the same spelling but (somewhere) a different case (the Studio wizard checks this). I hope, this helps a bit...
go to post Julius Kavay · Jan 15 and, by the way, it's chainable USER>zw [1,2,3].addAll([4,5,6]).addAll([7,8,9]) [1,2,3,4,5,6,7,8,9] ; <DYNAMIC ARRAY>
go to post Julius Kavay · Dec 6, 2024 instead of "*.int" you could try to compile in parts, i.e."a*.int", "b*.int", ... "z*.int"
go to post Julius Kavay · Dec 4, 2024 set sts = ##class(%Routine).CompileList("*.int") write $system.OBJ.DisplayError(sts) should do the trick
go to post Julius Kavay · Dec 3, 2024 Class DC.Bundle Extends (%RegisteredObject, %XML.Adaptor) { Property Entries As list Of Entry(XMLNAME = "Entry", XMLPROJECTION = "ELEMENT"); ClassMethod Test() { s bnd=..%New() s ent=##class(Entry).%New(),ent.Name="John",ent.Age=40 d bnd.Entries.Insert(ent) k ent s ent=##class(Entry).%New(),ent.Name="Paul",ent.Age=45 d bnd.Entries.Insert(ent) k ent d bnd.XMLExportToString(.xx) q xx } } Class DC.Entry Extends (%RegisteredObject, %XML.Adaptor) { Property Name As %String; Property Age As %Integer; } The test output is: USER>set xml=##class(DC.Bundle).Test() USER>write xml <Bundle><Entry><Name>John</Name><Age>40</Age></Entry><Entry><Name>Paul</Name><Age>45</Age></Entry></Bundle> USER> USER>zzxs xml <Bundle> <Entry> <Name>John</Name> <Age>40</Age> </Entry> <Entry> <Name>Paul</Name> <Age>45</Age> </Entry> </Bundle> USER>