![]() |
|
|
#1 |
|
"Jason Goatcher"
Mar 2005
66638 Posts |
The following is a script used for a project called '3x+1' which is studying the Collatz Conjecture. It is a .vbs script.
What I'd like to be able to do is turn it into a script that can be run under a bash prompt that calls on Wine to run the Windows executable. What the program basically does is take the range given it, which is from the 'Const blockstart' number to that number plus the 'Const blockinterval' number. Basically, these numbers multiplied by 10^12 are considered to be the range. These numbers are changed to whatever is needed by the user. When the script is run, it looks for a log file to see if the program's been run previously. If it has, then it just starts the next "chunk" in that range. A chunk is basically a range of numbers from one multiple of 2^34 to the next multiple of 2^34. Technically, though the ranges are reserved in multiples of 10^12, they are completed in ranges of 2^34. Not sure if the rounding at the very beginning is always to the nearest multiple of 2^34, rounded up, or rounded down. It's in the script somewhere. The main goal of this script is to (1)determine what needs to be completed, (2) add the normal arguments to the script: idle process, a special command to make sure it's started properly, tell it what it needs to start at and where it needs to end(which is described as how many chunks need to be completed), and I'm not sure what else. (3) Lastly, it needs to send out the command, which in this case involves Wine. Any help is appreciated. (Even pseudocode that classifies the stuff in the .vbs script in such a way that Googling for the solution gets tremendously easier. I do want to become a computer programmer, but in this case the learning curve is a bit steep. Code:
option explicit
' ---- Change this constant for a new block! ----
Const blockstart = 58860
Const blockinterval = 20
' --------------------------------------
Const exefilename = "w422f.exe"
dim NTSystem, shell, fso, cmdfilename, logfilename
On Error Resume Next
set shell = wscript.createobject("wscript.shell")
set fso = wscript.createobject("scripting.filesystemobject")
logfilename = "w" & cstr(blockstart) & ".log"
NTSystem = RunningOnNT
If NTSystem Then
cmdfilename = "wondrous.cmd"
Else
cmdfilename = "wondrous.bat"
End If
makecmdfile NTSystem
If err.Number <> 0 then
msgbox err.description, vbexclamation, wscript.scriptname
else
shell.run cmdfilename
end if
wscript.quit
'------------------------------
Sub makecmdfile(Byval NTSystem)
dim ts
dim i, ch, lastline, s1, s2, s3
dim start, finish
dim startcount, finishcount, loopcount
dim Message, procspeed, calcdays
On error resume next
set ts = fso.opentextfile(logfilename)
if err <> 0 then ' -- New block, start from scratch
start = blockstart & "000000000000"
If not NTSystem Then
Message = "Warning: you are starting the program on a non-NT system." & VBNewLine
Message = Message & "Since the program can not be started in idle priority" & VbNewLine
Message = Message & "performance of normal applications on your system could be affected"
Message = Message & " (this message wil disappear automatically in 60 seconds)"
Shell.Popup Message, 60, "Class Record Search", VBExclamation
End If
ShowDuration
else ' -- Read last number from file
do
s1 = ts.readline
If Len(Trim(s1)) > 0 Then
lastline = s1
End If
loop until ts.atendofstream
s2 = ""
for i = 1 to len(lastline)
ch = mid(lastline,i,1)
if isnumeric (ch) then
s2 = s2 & ch
end if
if not isnumeric(ch) and ch <> "," and len(s2) > 0 then
exit for
end if
next
ts.close
start = s2
end if
on error goto 0
' ---- Calculate new loopcount
finish = (clng(blockstart) + clng(blockinterval) ) * 1.0e+12
startcount = int( cdbl(start ) / (2.0^32) )
finishcount = int( cdbl(finish) / (2.0^32) )
loopcount = finishcount - startcount + 2
' ---- Create batchfile
set ts = fso.createtextfile(cmdfilename, True)
if loopcount > 0 then
s3 = "start /min "
If NTSystem Then
s3 = s3 & " /low "
End If
s3 = s3 & exefilename & " /o /c" & cstr(loopcount) & " /f" & logfilename & " " & start
ts.writeline s3
end if
ts.close
end sub
Function RunningOnNT
Dim NTVersionKey, v
NTVersionKey = "HKLM\Software\Microsoft\Windows NT\CurrentVersion\CurrentVersion"
On Error Resume Next
Err.Clear
v = shell.RegRead(NTVersionKey)
RunningOnNT = (Err.Number = 0)
End Function
Sub ShowDuration
' -- Show info about length of calculation
Dim Message, procspeed, calcdays
On Error Resume Next
procspeed = shell.regread("HKLM\hardware\description\system\centralprocessor\0\~Mhz")
If Err.Number = 0 then
calcdays = cint (920.0 * blockinterval / procspeed)
Message = "Calculation time on this machine will probably take around "
Message = Message & calcdays & " days" & vbNewLine
Message = Message & " (this message wil disappear automatically in 30 seconds)"
Shell.PopUp Message, 30, "Class Record Search", VBInformation
Else
Err.Clear
End if
End Sub
' ---- end of script ----
|
|
|
|
|
|
#2 |
|
Jan 2005
Caught in a sieve
5×79 Posts |
Well, this chunk:
Code:
' -- Read last number from file
do
s1 = ts.readline
If Len(Trim(s1)) > 0 Then
lastline = s1
End If
loop until ts.atendofstream
s2 = ""
for i = 1 to len(lastline)
ch = mid(lastline,i,1)
if isnumeric (ch) then
s2 = s2 & ch
end if
if not isnumeric(ch) and ch <> "," and len(s2) > 0 then
exit for
end if
next
ts.close
start = s2
Code:
start = `tail -1 $logfilename | sed -e "s/^[^0-9,]*//;s/[^0-9,].*$//;s/,//g"` ![]() Of course, with the amount of math done in other places, you might want to use a different scripting language instead. Might I suggest Perl, where I believe that line would work almost identically? In Perl: Code:
$start = `tail -1 $logfilename`; $start =~ s/^[^0-9,]*//; $start =~ s/[^0-9,].*$//; $start =~ s/,//g"; |
|
|
|
![]() |
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Bash on Ubuntu on Windows | henryzz | Software | 11 | 2017-07-28 21:24 |
| Fedora gedit for bash has become useless | EdH | Linux | 11 | 2016-05-13 15:36 |
| bash and HTTP? | Dubslow | Information & Answers | 11 | 2011-12-14 21:07 |
| bash script for extracting primenet-status | gLauss | Linux | 0 | 2010-07-31 11:19 |
| Escape sequences in bash scripts? | CRGreathouse | Software | 16 | 2009-03-26 08:42 |