REXX怎么保存”Find ALL”的结果

最近的项目经常跟MQ打交道,将输入数据填在一个dataset里面提交给MQ解析,字段之间用逗号隔开。所以在测试MQ接口的时候会经常一边对着FSD,一边嘴里面数着逗号的个数。其实我到今天才想起来可以用一个”FIND ALL”的ISPF命令的。

FIND ‘,’ ALL
这样,逗号的个数就不用数了,直接显示在屏幕右上角。

既然这样,REXX可不可以保存这个“FIND ‘,’ ALL’的结果呢? 研究了一番,居然让我找到ISREDIT有这个功能:

编辑 IBMUSER.REXX.EXEC(CHECK)这个member,输入如下的macro,

  ADDRESS  ISPEXEC                       
  "ISREDIT SEEK ALL ','"                 
  "ISREDIT (COUNT) = SEEK_COUNTS"        
  SAY "Comma number: "!! COUNT !! "'!'"  
 EXIT 0  

 

打开你的MQ输入的DATASET: IBMUSER.PROJ.MQ.INPUT
在command栏上面输入CHECK即可运行,也就比输入“FIND ‘,’ ALL”来得方便一点点…

分享到:

WordPress不用插件代码高亮

作为一个写博客的程序员,一个用wordpress写博客的程序员,就免不了要贴些代码。以前我都是用截图的,发现这样太麻烦了。可是wordpress自带的code标签又弱地可以啊,于是,各种代码高亮插件就来了:比如CodeColorer,比如WP-Syntax,比如WP-Code,Syntax Highlighter等等。用插件的好处显然易见,可是哪天你不用插件了,那么代码高亮也就没了。况且,后台”已安装的插件”里面已经够多插件的了,所以,今天我就介绍一些不用插件能让代码高亮的方法。

方法一:利用些在线网站的code to html功能
比较熟悉的有代码发芽网站:http://fayaa.com/code/new/tohtml.com 支持的语言很多,主流的非主流的都支持。用法很简单,直接贴代码,点击转换成html即可,然后将生成的html贴在你的文章中即可(记得切换到HTML模式)。
缺点:样子估计丑陋了点(如何丑陋请参考我的上一篇博文),而且对于主机开发人员来说,基本上很难找到JCL/PLI/REXX的语法高亮,所以此种方法我放弃

方法二:用文本编辑器的code to html功能
我知道的NotePad++和Vim都有这个功能。其中不得不说的是Vim生成的html比notepad++要美观得多,所以我选择了Vim(在windows下面我就用gvim方便些,记不住那么多的命令)

在使用Gvim的tohtml功能的时候记得注意一下:
1、记得在 _vimrc配置文件中添加:let g:html_use_css = 0,否则生成的html是默认带有css样式的,这样的话虽然减小了html的体积,却不能被wordpress准确地识别(也可能是我对HTML/CSS不熟悉的缘故,谁知道的话告诉我下啊)
2、在gvim中选择正确的配色方案,点击语法——>转换成HTML,将生成的HTML代码中body之间的部分放入以下pre之间,就完成了代码的完美嵌入了。


<div class="flyuphigh.com">
  <pre>
  </pre>
</div>


这是一段用gvim的tohtml功能生成的带语法高亮的Ruby代码,效果如下:


 begin
    Timeout::timeout(30do |timeout_length|
    $streamSock = TCPSocket::new(ipaddress, 43)
    $streamSock.send(domain+"\r\n",domain_len+2)
    $strs$streamSock.read
    #strs= streamSock.readpartial(2048)
    end
   rescue Errno::ECONNRESET                              
    puts "I got stucked in rescue-ECONNRESET, will retry in 5 secs\n"
    if $strs=="" then
     puts "I read nothing!\r\n"
     puts "The dead domain is:"+ domain
     end
    $streamSock.close
    sleep(3)
    retry                                                
                                                      
   rescue Timeout::Error
     puts "I got stucked in rescue-TIMEOUT, will retry in 5 secs\n"
     # $streamSock.close
     sleep(3)
   retry                                      
   # ensure                                                           
 end


分享到:

如何去掉程序的第72至80列

我个人不是很喜欢ISPF 3.13提供的两个Dataset比较的功能,总觉得看得不是很直观。平时,我还是比较习惯用winmerge这个软件来比较。但是有个问题,就是比较的两个程序经常在第72列至80列的行号不一致,导致没法比较。所以,这篇文章我就来总结一下,如何去掉DATASET的第72列至80列内容。

方法一:直接在ISPF下面用命令去掉
这是最直接最快的办法。去掉第72列至80列的命令有下面两个:

NUM ON; UNNUMB
C P'^' ‘ ‘ 73 80 ALL /* Changes all non-space characters to spaces in col 73 to 80*/

方法二:用第三方脚本实现
上面的方法如果是只有少数几个程序,那么手动命令去掉第72列至80列没什么。但是如果你一下子需要对几百个dataset或者同一个PDS下面的所有member去掉第72列至80列,则最好最快的办法是将所有代码通过FTP下载到本地,然后用第三方脚本语言(如VB,Phthon,Ruby,JS等)来解决了。以下就附上一段我自己写的Ruby脚本,该脚本的作用是将C:\prod文件夹下面的所有程序的第72列至80列内容置空,然后输出到文件夹C:\prod72col下面。可以看到,用第三方脚本实现批量的任务是很方便的。

01 def cutto72col(file_in,file_out)
02    file_in=File.new(file_in,‘r’)
03    file_out=File.new(file_out,‘w’)
04    oneline=file_in.gets
05    while(oneline != nil)
06      oneline=oneline.chomp
07      oneline=oneline[0..71]
08      file_out.puts oneline
09      oneline=file_in.gets
10    end
11 end
12
13 path_in=‘C:\prod\\’
14 path_out=‘C:prod72col\\’
15
16 Dir.foreach(path_in){ |file|
17 if file != ‘.’ && file != ‘..’
18 then
19    file_in = path_in + file
20    cutto72col(file_in,path_out + file)
21 end                }

 

当然,你还可以直接在大机上面,用REXX脚本直接对整个PDS操作,移去所有member的第72列至80列内容。以下也附上我自己写的REXX脚本,该脚本的内容是将IBMUSER.TEST.PRGM这个PDS下面所有的member的第72列至第80列的行号都去掉:
(暂时没找到如何比较完美地在这里贴REXX语法高亮的代码,等我找到方法了再帖上来)

PS:今天找到怎么比较好地在wordpress贴带有Rexx代码高亮的方式了,续上,代码如下:


/***********************REXX******************************************/
/*Loop PDS to remove whatever between col72 to col80 for each member */
/**********************************************************************/
/* Trace i  */                                                          
pdsname = 'TEST.PRGM'          /*Check if pds is exsited */       
if sysdsn(pdsname)<> "OK" then                                          
    do                                                                  
       say "Error: Specified PDS not found:" pdsname                    
       say "Error: " pdsname " > " sysdsn(pdsname)                      
       say "Press Enter to continue"                                    
       pull uresp                                                       
       exit 8                                                           
    end                                                                 
                                                                        
call outtrap "mbrs."       /*call outtrap to capture LISTD output */
"LISTD" pdsname "MEMBERS"  /*List member list*/                     
call outtrap "off"         /*Turn off outtrap*/                     
                                                                    
do i=1 to mbrs.0                                                    
 /*SAY "mbrs." !! i !! ": " !!   mbrs.i */                          
  if mbrs.i = "--MEMBERS--" then                                    
   do                                                               
     leave                                                          
   end                                                              
end                                                                 
                                                                    
/*start to loop on each member*/                                    
i = i+1                                                             
do j=to mbrs.0   /*mbrs.0 is the total line num of LISTD */       
 /*SAY "mbrs." !! j !! ": " !!   mbrs.j */                             
   parse value mbrs.j with mem /*split mbrs.j*/                        
   mem =strip(mem)            /*remove leading and trailing character*/
   pds = 'IBMUSER.TEST.PRGM'                                     
   mpds = pds !!'(' !! mem !! ')'                                      
   "ISPEXEC EDIT DATASET('"mpds"') MACRO(MACRO01)"                     
 end                                       


 

这是上面主Rexx程序调用的MACRO01:


/*****************************REXX***********************************/
ADDRESS  ISPEXEC 
"ISREDIT MACRO"  
"ISREDIT RES"    
"ISREDIT NUM ON" 
"ISREDIT UNNUM"  
"ISREDIT SAVE"   
"ISREDIT END"    

分享到: