Aside

顽固的守卫-36进制转换

不得不吐槽,什么年代了,还要用哪些过时的东西。
哪些人说,稳定,人家都在用,有现成原型….
这无非是盲从,懒惰,终是无能,然而却掌握了话语权。
吐槽完毕,锅最终还是要有人背。
有个中间件软件系统,对命名,配置,参数做了严格限制。比如配置名长度必须4位,通讯队列名必须小于8位,甚至于端口号的大小也自己做了控制(65535以内还不够小?)。这个就是大名鼎鼎长度IBM帮我们省的。掌握话语权的自认为有能力驾驭好这个古董,程序猿早已对这玩意深恶痛绝:好在哪?稳定吗,高效吗?未必吧!恐怕只是不敢尝试新的,或是只是手中唯一的救命稻草?
为何还在吐槽…正题呢?呃,不好意思。
今天的槽点主要是:32GB内存为何还以为我只有64K。省确是件好事,然而要看省在哪方面。
程序中需要用到中间件队列名来匹配请求应答,而且不能重复。然后唯一可用的是流水号,是12位的。
而对列名最长8位!这点没办法了,闭源收费,你能耐我何!只有一个思路了-压缩流水:
当年数制转化是这样学的,模运算再倒序重排。效率暂不研究:

   int len=0;
    int i=0;
    char d=' ';
    int m=0;
    while(num)
    {
        m=num%36;
        if(m>9)
        {
            d='a'+m-10;
        }
        else
        {
            d='0'+m;
        }
        sprintf(des,"%s%c",des,d);
        num=num/36;
    }

        len=strlen(des);
        for(i=0;i<len/2;i++)
        {
            d=*(des+i);
            *(des+i)= *(des+len-i-1);
            *(des+len-i-1)=d;
        }

 

Aside

TextWrangler和Vim配置GoLang 语法高亮

同步文章:http://www.gejoin.com/2016/05/20/golang-syntax-highlighting-for-vim-and-textwrangler.html

OSX 下配置VIM语法高亮

Vim原生不支持golang语法高亮,因此要借助插件。功能强大又好用的插件有很多,这里就只简单介绍一种。
vim-go插件,github在[这里](https://github.com/fatih/vim-go).
我们来使用vim-plug[🌺 Minimalist Vim Plugin Manager]来安装,安装方法:

1.下载plug.vim .
并放置到~/.vim/autoload 目录下,点击[这里下载].
也可以直接使用curl下载。

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

2. 编辑~/.vimrc 文件,添加以下内容:

 call plug#begin('~/.vim/plugged')
 Plug 'fatih/vim-go', { 'tag': '*' }
 call plug#end()

3. 打开vim,输入命令:

  :PlugInstall

go-vim
4. 完成,vim打开一个*.go 文件看看。

配置TextWrangler或BBEdit

BBEdit官方网站给出了配置方法,当然测试了免费的TextWrangler ,也是可行的。
官方给出了好多可用的语言供选择,地址在[这里].可供选择的包括了Erlang,Haskell,Go等等..

>BBEdit plugin library

1. 在该页面找到Go下载地址下载,或点击这里 [直接下载]

2. 下载的文件Go.plist.zip 解压成Go.plist。

3. 将该文件放置到/Users/{USERNAME}/Library/Application Support/TextWrangler/Language Modules, 重新打开TextWrangler。一切OK了。

命令行参数-Command-Line Flags

命令行参数-Command-Line Flags

原文: [Go by Example:Command-Line Flags]  –注意正确的上网姿势..

命令行标识(参数)是一种常用的指定命令行程序选项的方法,例如,在`wc -l`中 “-l” 就是一个命令的参数。

golang
Go提供了一个支持基本的命令行参数解析的flag package(包)。我们将使用这个package来实现我们的命令行程序示例。

package main

import "flag"
import "fmt"

func main() {

    // 基本的标识可以声明为string,integer以及bool类型。
    // 这里我们什么了一个字符串参数word,它有一个默认值“foo”,
    // 还有一个简短的描述。
    // flag.String函数返回一个字符串指针(不是字符串值);
    // 下面将看到如何来使用这个指针。
    
    wordPtr := flag.String("word", "foo", "a string")

    // 类似于前边的'word' flag,这里声明了numb和fork标识.
 
    numbPtr := flag.Int("numb", 42, "an int")
    boolPtr := flag.Bool("fork", false, "a bool")

    // 还可以使用在程序成任何地方声明过的var变量来声明一个选项。 
    // 注意,我们需要为函数传递指向这个flag的指针。
    
    var svar string
    flag.StringVar(&svar, "svar", "bar", "a string var")

    // 一旦所有的声明完成,还需要调用flag.Parse()来执行命令行解析。
    
    flag.Parse()

    // 接下来,我们打印输出解析的选项还有其它紧接位置的参数。
    // (注:Trailing positional arguments怎么翻译呢?)
    // 还要注意,我们需要用形如*wordPtr的指针指向值,来获取参数实际值。
    
    fmt.Println("word:", *wordPtr)
    fmt.Println("numb:", *numbPtr)
    fmt.Println("fork:", *boolPtr)
    fmt.Println("svar:", svar)
    fmt.Println("tail:", flag.Args())
}

最好先编译下,然后直接运行生成二进制程序来测试这个带参数的命令行程序。

$ go build command-line-flags.go

首先用所有flag都有值来测试下这个编译好的程序。

$ ./command-line-flags -word=opt -numb=7 -fork -svar=flag
word: opt
numb: 7
fork: true
svar: flag
tail: []

注意,忽略的flag参数将被自动赋予他们的默认值。

$ ./command-line-flags -word=opt
word: opt
numb: 42
fork: false
svar: bar
tail: []

紧随参数可以为提供给任意flag

$ ./command-line-flags -word=opt a1 a2 a3
word: opt
...
tail: [a1 a2 a3]

注意,flag package需要所有的flag都要在位置参数之前出现(否则这些flag将会被位置参数中断调掉)

$ ./command-line-flags -word=opt a1 a2 a3 -numb=7
word: opt
numb: 42
fork: false
svar: bar
trailing: [a1 a2 a3 -numb=7]

使用 -h 或者 –help 参数可以自动为命令行程序生成帮助信息

$ ./command-line-flags -h
Usage of ./command-line-flags:
  -fork=false: a bool
  -numb=42: an int
  -svar="bar": a string var
  -word="foo": a string

如果提供的flag不是falg package中指定。程序将打印出错信息并显示帮助文本。

$ ./command-line-flags -wat
flag provided but not defined: -wat
Usage of ./command-line-flags:
...

接下来我们将看到环境变量-另一种常用参数化程序方法。

Aside

CentOS Minimal 安装和配置TIPS


同步[GEJOIN.COM]

Linux 各种发行版虽然和Unix系非常相近,但还是有许多差别的。Linux更有趣吧.最近需要学习和测试,就在OSX平台下VirtualBox重新安装CentOS 7.由于机器本身性能原因,另外个人觉得Minimal安装不仅节约资源,而且可以更好的锻炼动手能力。再次把这次安装配置记录下来。

1.安装媒体介质是CentOS-7-x86_64-DVD-1511.iso(4.3GB.)
2.选择Minimal最小化安装。不包含KDE/GOME.
3.安装完成后进行配置,首先网络,试了ifconfig..(minimal不包含net-tools),需要自行安装,选择以CDROM(ISO)为安装源。
挂载光盘镜像:

# mkdir -p /mnt/cdrom
# mount /dev/cdrom  /mnt/cdrom

2.设置源
为了使用光盘镜像安装源,配置yum.repo:
暂时将/etc/yum.repos.d目录下文件备份,新建CentOS-Iso.repo,添加下面内容:
# vi CentOS-Iso.repo

[base]
name=iso
baseurl=file:///mnt/cdrom
gpgcheck=0

3.安装设置网络
# yum install net-tools
虚拟机设置NAT和HOST-ONLY两个网卡,配置静态IP,配置文件:
# vim /etc/sysconfig/network-scripts/ifcfgX

YPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.56.100
NETMASK=255.255.255.0
NETWORK=192.168.56.0
IPV4_FAILURE_FATAL=no
NAME=enp0s3
UUID=ad60e4e1-c250-47f2-a0d2-fa1fbdbb0bd2
DEVICE=enp0s3
ONBOOT=yes

配置好后重启网络,测试内外网是否正常。
# service network restart
4.关闭防火墙,CentOS 7 不是直接设置iptables
# systemctl stop firewalld.service && sudo systemctl disable firewalld.service
5.安装一些必备的软件如wget,php等看个人需要。
6.安装pip
# wget https://bootstrap.pypa.io/get-pip.py
# python get-pip.py

7.设置时区和时间
查看当前时区 date -R
修改设置时区 tzselect
# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
或在profile(/etc/bashrc)添加环境变量
TZ='Asia/Shanghai'; export TZ
设置时间更新同步
# yum install -y ntpdate
# ntpdate us.pool.ntp.org
8.设置管理员sudoers
# vim /etc/sudoers 添加:

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
gwang   ALL=(ALL)       ALL

9.其它
终端ssh连接后警告:

-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
[gwang@localhost ~]$ locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LC_CTYPE=UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

修复:

sudo vi /etc/environment

LANG=en_US.utf-8
LC_ALL=en_US.utf-8

10.继续..

Aside

汉字使用默认解码出现问题

–同步自GEJOIN.COM

老生常谈的一个问题,汉字编码与解码问题,各种编码就不再复制粘贴了,需要的话维基百科捡起来再看看。

名称 第一字节 第二字节
GB2312 0xB0-0xF7(176-247) 0xA0-0xFE(160-254)
GBK 0x81-0xFE(129-254) 0x40-0xFE(64-254)

遇到一个问题,一字符串以‘|’ 分隔,解析后出现各种乱码。这显然是编码重叠导致的。 举例来看: “王文弢|赵珅|刘颖弢|田東|孙炜韡” 查看这些汉字的编码,可以看到高位中正好有|这个相同编码。

那么就需要对汉字进行必要解码而不是默认。

       unsigned char ch1 = (unsigned char) *s;
       unsigned char ch2 = (unsigned char) *(s+1);
       if (ch1>=129 && ch1<=254 && ch2>=64 && ch2<=254)
       {
        ...
       }

查看其代码原来使用库函数strchr,于是重新写写这个函数:

char *StrChr (char *s,char c)
{
   while(*s!='\0'&&*s!=c)
    {
       unsigned char ch1 = (unsigned char) *s;
       unsigned char ch2 = (unsigned char) *(s+1);
       if (ch1>=129 && ch1<=254 && ch2>=64 && ch2<=254)
       {
            ++s;
        }
        ++s;
    }
    return *s==c ? s: NULL;
}

好了。以后再继续。

关于某支付公司近日某些风波的思考

关于某支付公司近日某些风波的思考

以下吐槽内容均不代表个人观点,一切风险和责任本人概不承担。
传言有时候真是略显荒唐。事件的原因就暂且不提了。某吧我是从不去的,渣浪也基本不感兴趣,所以对于那些传言从Boss的言行以及近日惨绝人寰的加班中读出四五分的真实~

事件具体产生成了什么样的影响?社会和企业以及个人,前两者自有人琢磨,对于个人,对资深苦逼的印象是深刻和值得深思的。
因此,结合本次事件反思下,主要分析项目管理上的问题。
首先,作为一个大的金融交易系统项目,没有做出具体详尽的需求分析,建设中没有业务参与,管理层的急功近利,顾此失彼,盲目乐观…有限的工期内每一环节出问题都是致命的,我认为导致系统建设问题的根本是管理层的失误。
其次,忽略服务。第三方支付系统是面向商户,给商户提供服务的,商户要的不是一个简单交易成功 ,交易的承兑和资金的通畅才是商户关心的。忽略了个性化服务而盲目追求原型中的稳定或成熟,这本身就是舍本逐末。不同于银行,商户在第三方支付中要个性的多。没有充分评估商户清算环节的重要性,未作必要的评审分析,导致清算问题突出。
第三,系统设计存在问题,不同系统之间差异天壤之别。报文+通信协议构造的联机交易系统可能大同小异,但清算系统的个性不可同日而语。联机中计费或个性处理本质没有问题,但如果这一环节出现问题,补救的难度将是巨大的。
过分依赖中间键和原型系统势必限制新系统的灵活和创新,导致建设中举步维艰,架构设计多次推翻,浪费大量时间。
引入账户体系一直作为Boss自豪的资本,可是,它居然没有用!这几乎成为一个笑话。商户个性多元的服务诉求,这个账户系统似乎不够完备暂时无法满足,于是,账户系统对于线下商户作为摆设还显得刺眼。某种意义上这样不完备的账户体系成了一块巨大的包袱。打脸-它真的没用!还是再考虑考虑完善吧~
四,沟通。管理层和各成员,信息并不能真实的被传递。过分的乐观完全压过下面反对的声音。当然领导有自己的压力,压力传递到各成员后,只有加班~没有意见~没有建议~疯狂
五,风险。一刀切,要么生,要么死,结果残了。
码到这里累了,无力吐槽。个人拙见,但愿来日不再像今日,新年后的良心发现。

个人拙见,谢绝转载。

SHELL 字符串分隔然后..

SHELL 字符串分隔然后..

废话不说,直接上代码:
方案一:

divStrArry () {
    str=$@;
    OLD_IFS="$IFS"
    IFS="/"
    arr=($str)
    IFS="$OLD_IFS"
    num=${#arr[@]}
    for i in ${arr[@]}
    do
      echo $i
    done 
}

方案二:

divStrArry () {
    str="$@";
    set -A arr $(echo $str|tr '/' ' '|tr -s ' ')
    num=${#arr[@]}
    for i in ${arr[@]}
    do
      echo "$i"
    done
}

那么有一个需求:使用shell脚本FTP 建立多级目录:包括子目录。不支持mkdir -p的。
同样直接上代码

funnc() {
    local r
    local a
    r="$@"
    while [[ "$r" != "$a" ]] ; do
        a=${r%%/*}
        echo "mkdir $a"
        echo "cd $a"
        r=${r#*/}
    done
}
ftp -inv 0.0.0.0 < < EOF
user username pass
bin
$(funnc Misc/Sub/acct/${host_date})
mput xw.TXT
bye
EOF

其它废话也不说了…

Remix OS 一款全新的桌面操作系统

Remix OS 一款全新的桌面操作系统

Remix OS 一款全新的桌面操作系统,你所需的只有一个PC或Mac再加上一个USB3.0的U盘。
–已些内容都直接复制自官网。详细的就直接去这里看吧:
mmexport1453220433693

mmexport1453220451303
http://www.jide.com/remixos-for-pc

直接下载尝试再说:—–>前往

  • Remix OS for PC Package (Legacy)  [国际版][中国版]
  • Remix OS for PC Package (EFI)[国际版][中国版]

系统配置要求

  • 存储容量 8GB 及以上,存储格式为 FAT32,且支持 USB 3.0 的闪存设备(建议写入速度大于 20MB/s)
  • 一台64位CPU的个人电脑

Remix OS PC 版安装方法(PC 产品)

  1. 下载 Remix OS PC 版镜像文件以及 Remix OS USB Tool 写入工具至 PC 电脑;
  2. 将 U 盘接入 PC 电脑;
  3. 打开 Remix OS USB Tool 写入工具,跟随引导项将 Remix OS PC 版镜像烧录至 U 盘;
  4. 重启电脑并进入 BIOS 菜单;
  5. 将 “USB存储设备” 调整为第一启动项;
  6. 保存设置并重启电脑;
  7. 待系统启动后,选择“Guest Mode(访客模式)”或“Resident Mode(普通模式)”即可运行 Remix OS PC 版。

* 不同品牌和型号电脑进入 BIOS 菜单以及调整启动项的方法存在差异,请根据实际情况自行查阅

Remix OS PC版安装方法(Mac 产品)

  1. 下载 Remix OS PC 版镜像文件以及 Remix OS USB Tool 写入工具至 PC 电脑;
  2. 将 U 盘接入 PC 电脑;
  3. 打开 Remix OS USB Tool 写入工具,跟随引导项将 Remix OS PC 版镜像烧录至 U 盘;
  4. 将 U 盘接入 Mac 产品;
  5. 点按电源键,并长按 option 键进入启动菜单;
  6. 选择并进入 U 盘内容;
  7. 待系统启动后,选择“Guest Mode(访客模式)”或“Resident Mode(普通模式)”即可运行 Remix OS PC 版。

安卓电脑的又一次革命

在 Android-x86 项目的基础上,开发并推出了 Remix OS PC 版。这是 Remix OS 的一个新阶段,也将成为安卓电脑的又一座里程碑。
Remix OS PC 版能够运行在超过半数的现存 Intel PC 中(包含部分 Mac 产品)。即便是老旧配置的个人电脑,也能焕发新的青春活力。
凭借整体基于 Android 系统深度定制的优势,Remix OS PC 版继承了安卓生态中多达 160 万的 App 资源,相对于传统 Windows 应用来说有着更快的更新节奏,而相对于 iOS 系统则有着明显的量级优势。
便携,重新定义
Remix OS PC 版依附于闪存设备的特性,令其更适于随身携带。试想,当运行 Remix OS PC 版的个人电脑与搭载 Android 系统的智能手机形成绝配之势,移动体验将变得更加不可思议。而在占据全球个人电脑绝大多数的 x86 架构产品中寻找一台宿主,似乎也不是一件困难的事。

 

Install Scrapy on OSX|mac OSX 上安装Scrapy[SYN:gejoin.com]

Install Scrapy on OSX|mac OSX 上安装Scrapy[SYN:gejoin.com]

注:文章同步自我的[SYN:gejoin.com]

顺利的话,一句命令搞定:
sudo pip install Scrapy
OSX还是需要额外一些包或升级的,包括:

cssselect, queuelib, six, w3lib, lxml, Twisted, characteristic, pyasn1, pyasn1-modules, service-identity

幸运的是pip或者easy_install 可以自动为你安装,但是其中的问题:

Found existing installation: six 1.4.1
DEPRECATION: Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
Uninstalling six-1.4.1:

OSError: [Errno 1] Operation not permitted: ‘/tmp/pip-qeBchm-uninstall/System/Library/Frameworks/Python.framework/
Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.egg-info’

python

显然升级six是出错了,使用sudo
pip install six --upgrade 或者 pip uninstall six
都会遇到同样的错误。无论什么用户,多大权限。想必下载包安装也会同样问题。我只能这么认为:这都是pip的错。
好吧,那就easy_install试试吧。

sudo easy_install –upgrade six
Searching for six
Reading https://pypi.python.org/simple/six/
Best match: six 1.10.0
Downloading https://pypi.python.org/packages/source/s/six/>six-1.10.0.tar.gz#md5=34eed507548117b2ab523ab14b2f8b55
Processing six-1.10.0.tar.gz

Installed /Library/Python/2.7/site-packages/six-1.10.0-py2.7.egg
Processing dependencies for six
Finished processing dependencies for six

继续使用easy_install 安装Scarpy吧:…

sudo easy_install Scrapy

看起来挺顺利..
可是….

In file included from src/lxml/lxml.etree.c:323:
src/lxml/includes/etree_defs.h:14:10: fatal error: ‘libxml/xmlversion.h’ file not found
#include “libxml/xmlversion.h”
^
1 error generated.
Compile failed: command ‘cc’ failed with exit status 1
/tmp/easy_install-U7v3Lb/lxml-3.5.0/temp/xmlXPathInitxO27oS.c:1:10: >fatal error: ‘libxml/xpath.h’ file not found
#include “libxml/xpath.h”
^
1 error generated.

看来libxml2 需要额外安装的

xcode-select --install

以下就顺利完成安装

sudo pip install Scrapy
OR
sudo pip easy_install Scrapy

CICS配置管理TIPS

CICS配置管理TIPS

配置CICS

Forked from http://gejoin.com/2016/01/02/CICS-management-tips.html

配置 CICS REGION:

cicscp -v start sfs_server SFS_NAME	
cicscp -v create region REGION_NAME DefaultFileServer=

配置 RD:

cicsupdate -c rd -r REGION_NAME XPRecvTimeout=300 
cicsupdate -c rd -r REGION_NAME MinServer=30 
cicsupdate -c rd -r REGION_NAME MaxServer=80 
cicsupdate -c rd -r REGION_NAME MaxRegionPool=62914560 
cicsupdate -c rd -r REGION_NAME MaxTaskPrivatePool=20971520 
cicsupdate -c rd -r REGION_NAME MaxTSHPool=41943040
cicsupdate -c rd -r REGION_NAME TraceFlagMaster=on 
cicsupdate -c rd -r REGION_NAME TraceFlagSystem=on 
cicsupdate -c rd -r REGION_NAME TraceFlagUser=on AllowDebugging=yes

其中 REGION_NAME 需更改为您的 CICS REGION 名称。

配置 LD:

cicsadd -c ld -r REGION_NAME LD1 TCPAddress="backend_server" TCPService="tran-host" SNAServerTransport=TCP

其中 backend_server 是后端服务器的 IP 地址。
添加以下行以编辑 /etc/services 文件:

tran-host port_number/tcp

其中 port_number 是端口号。请确保此端口号与 /etc/services 文件中的其他端口号不冲突。

配置环境变量:

添加以下行,编辑/var/cics_regions/REGION_NAME/environment

COBPATH=/user/bin:/usr/lpp/cobol/bin:/etc:/usr/sbin:/usr/ucb:$HOME/bin:/usr/bin/X11
CICS_PROGRAM_PATH=/home/cbod/cbodload/load:/usr/lpp/cics/lib:.
DB2INSTANCE=db2inst1
COB_CPM_SIZE_MAX=0
EXTSHM=ON
DB2NOEXITLIST=ON

配置 WD:

cicsupdate -c wd -r REGION_NAME MDCL Permanent=no RecoverTerminal=no
cicsupdate -c wd -r REGION_NAME MDCI Permanent=no RecoverTerminal=no 配置WD

配置 TD:

cicsadd -c td -r REGION_NAME TCCZ ProgName="DFHMIRS" Timeout=5 TWASize=32767
cicsadd -c td -r REGION_NAME INQY ProgName="GCCBINQY" Timeout=5 TWASize=32767
cicsadd -c td -r REGION_NAME TCCA ProgName="GCCBMMN" Timeout=5 TWASize=32767 TWASize 大小不能忽略。

配置 PD:

cicsadd -c pd -r REGION_NAME GCCBMMN PathName="GCCBMMN" RSLKey=public
cicsadd -c pd -r REGION_NAME GCCBINQY PathName="GCCBINQY" RSLKey=public
cicsadd -c pd -r REGION_NAME GCCBCOP PathName="GCCBCOP" RSLKey=public 添加PD 查看和删除PD方法类似。

配置 XAD

cicsadd -c xad -r REGION_NAME cicsdb2 SwitchLoadFile="/usr/lpp/cics/bin/db21pc" XAOpen="DBNAME,USER_ID,PASSWORD"

其中 REGION_NAME、DBNAME、USER_ID 和 PASSWORD 需相应地替换为您环境中的信息。

配置 CTG:

要配置 ctg.ini 文件,请在 /opt/IBM/cicstg/bin/ctg.ini 文件中添加以下行:

SECTION SERVER = REGION_name
            UPPERCASESECURITY=N
            PROTOCOL=TCPIP
            NETNAME=IP_address
            PORT=port_number
            CONNECTTIMEOUT=0
            TCPKEEPALIVE=N
ENDSECTION
  • 其中 REGION_name、IP_address 和 port_number 需相应地替换为您环境中的信息。
  • 使用 root 用户帐户完成以下步骤以重新启动 CTG:
    • 运行 cicscli -s 命令以启动 CTG。
    • 可选: 要验证是否已成功启动 CTG,请运行 cicscli -l 命令。

停启CICS

cicscp -v stop region REGION_name
cicscp -v start region REGION_name StartType=cold

——–
IPC支持
EXTSHM=ON

DB2NOEXITLIST=ON

Db2中出现的超时产生core : Transaction ‘CPMI’, Abend ‘A147’, at ‘???’.
以及对于一些莫名产生core信息只能看到数据库断开信息如:
IOT/Abort trap in pthread_kill at 0xd0540a14
0xd0540a14 (pthread_kill+0xb4) 80410014            lwz   r2,0x14(r1)
pthread_kill(??, ??) at 0xd0540a14
_p_raise(??) at 0xd053fe64
raise.raise(??) at 0xd0120c20
SupOS_CicsCOREDump() at 0xdc9eedb4
SupOS_TurnSignalToException(??, ??, ??) at 0xdc9ed5dc
sqleUCdisconnect(??) at 0xd86743b0
sqleUCtermAllCtx(??, ??) at 0xd8673ef0
sqleterm(char,sqlca*)(??, ??) at 0xd8cec01c
sqle_ctx_exit_function()() at 0xd88f1e7c
sqle_myexitlist_function()() at 0xd88f1cf0
sqleExitApplicationEnvironment(unsigned int)(??) at 0xd88f12d0
sqloipdc.sqlo_execute_list@AF34_4(??) at 0xd8804858
sqlo_execute_list() at 0xd88047ac
exit(??) at 0xd017cf70
bde_thread_TaskExit(??) at 0xdc323b18
bde_Exit(??) at 0xdc333dc4
SupOS_Exit(??) at 0xdc9ed494
....
可以尝试添加环境变量 DB2NOEXITLIST=ON
有两种方法可以达到这个目的:
1. Set the environment variable DB2NOEXITLIST=ON for the DB2 client environment on the system with the TXSeries region.
a) db2set DB2NOEXITLIST=ON
b) db2 terminate
c) re-start CICS region
2. Set DB2NOEXITLIST=ON in the region's environment and re-start the region.
Refer to DB2 manual for more information on the DB2NOEXITLIST environment variable.
设置成yes似乎也可以,未验证...
Set the environment variable DB2NOEXITLIST=yes in DB2 client env.
1.Set db2set DB2NOEXITLIST=yes.
2.Terminate DB2 and restart the region.
Set DB2NOEXITLIST=yes in region's environment

一些错误分析:
LINK和START调用的主要返回值解释如下:
1、LINK错误码分析
 
INVREQ(请求非法)
交易状态不对(有无SYNCONRETURN混用)
TRANSID全空
 
LENGERR
DATALENGTH选项为负值
DATALENGTH选项比LENGTH选项长
 
NOTAUTH
权限问题
使用了SYSID选项,但是RSLCheck没有设置为NONE
 
PGMIDERR
PD不存在
PD被disabled.
 
ROLLEDBACK
被LINK的程序无法执行syncpoint
 
SYSIDERR
CD不存在或错误
对方域不存在或已经宕机
网络不通
在本地TD:timeout时,远端交易还在队列
通信错误码:15a00002/15a00102
 
TERMERR
会话失败,TRANSID不存在
在本地TD:timeout时,远端交易还在运行。通信错误码:15a00007/a0000100
RD:MaxTClassLim引起的Reject。通信错误码:15a00007/84b6031
 
2、START错误码分析
 
INVREQ(请求非法)
Hours超范围
Minutes超范围
Seconds超范围
指定REQID但是该TSQ已经存在(在Pool不足时可能出现)
 
IOERR
SFS满
 
ISCINVREQ
ISC失败
 
LENGERR
使用LENGTH(0).
 
NOTAUTH
权限不足
使用了SYSID选项,但是RSLCheck没有设置为NONE
 
SYSIDERR
CD不存在或错误
对方域不存在或已经宕机
网络不通
通信错误码:15a00002/15a00102
 
TERMIDERR
TERMID选项非法
 
TRANSIDERR
TRANSID选项非法
 when ('NORMAL')       return ('0');
    when ('ERROR')        return ('1');
    when ('RDATT')        return ('2');
    when ('WRBRK')        return ('3');
    when ('EOF')          return ('4');
    when ('EODS')         return ('5');
    when ('EOC')          return ('6');
    when ('INBFMH')       return ('7');
    when ('ENDINPT')      return ('8');
    when ('NONVAL')       return ('9');
    when ('NOSTART')      return ('10');
    when ('TERMIDERR')    return ('11');
    when ('DSIDERR')      return ('12');
    when ('FILENOTFOUND') return ('12');
    when ('NOTFND')       return ('13');
    when ('DUPREC')       return ('14');
    when ('DUPKEY')       return ('15');
    when ('INVREQ')       return ('16');
    when ('IOERR')        return ('17');
    when ('NOSPACE')      return ('18');
    when ('NOTOPEN')      return ('19');
    when ('ENDFILE')      return ('20');
    when ('ILLOGIC')      return ('21');
    when ('LENGERR')      return ('22');
    when ('QZERO')        return ('23');
    when ('SIGNAL')       return ('24');
    when ('QBUSY')        return ('25');
    when ('ITEMERR')      return ('26');
    when ('PGMIDERR')     return ('27');
    when ('TRANSIDERR')   return ('28');
    when ('ENDDATA')      return ('29');
    when ('INVTSREQ')     return ('30');
    when ('EXPIRED')      return ('31');
    when ('RETPAGE')      return ('32');
    when ('RTEFAIL')      return ('33');
    when ('RTESOME')      return ('34');
    when ('TSIOERR')      return ('35');
    when ('MAPFAIL')      return ('36');
    when ('INVERRTERM')   return ('37');
    when ('INVMPSZ')      return ('38');
    when ('IGREQID')      return ('39');
    when ('OVERFLOW')     return ('40');
    when ('INVLDC')       return ('41');
    when ('NOSTG')        return ('42');
    when ('JIDERR')       return ('43');
    when ('QIDERR')       return ('44');
    when ('NOJBUFSP')     return ('45');
    when ('DSSTAT')       return ('46');
    when ('SELNERR')      return ('47');
    when ('FUNCERR')      return ('48');
    when ('UNEXPIN')      return ('49');
    when ('NOPASSBKRD')   return ('50');
    when ('NOPASSBKWR')   return ('51');
    when ('SYSIDERR')     return ('53');
    when ('ISCINVREQ')    return ('54');
    when ('ENQBUSY')      return ('55');
    when ('ENVDEFERR')    return ('56');
    when ('IGREQCD')      return ('57');
    when ('SESSIONERR')   return ('58');
    when ('SYSBUSY')      return ('59');
    when ('SESSBUSY')     return ('60');
    when ('NOTALLOC')     return ('61');
    when ('CBIDERR')      return ('62');
    when ('INVEXITREQ')   return ('63');
    when ('INVPARTNSET')  return ('64');
    when ('INVPARTN')     return ('65');
    when ('PARTNFAIL')    return ('66');
    when ('USERIDERR')    return ('69');
    when ('NOTAUTH')      return ('70');
    when ('VOLIDERR')     return ('71');
    when ('SUPPRESSED')   return ('72');
    when ('WRONGSTAT')    return ('73');
    when ('NAMEERROR')    return ('74');
    when ('CCERROR')      return ('76');
    when ('NOSPOOL')      return ('80');
    when ('TERMERR')      return ('81');
    when ('ROLLEDBACK')   return ('82');
    when ('END')          return ('83');
    when ('DISABLED')     return ('84');
    when ('ALLOCERR')     return ('85');
    when ('STRELERR')     return ('86');
    when ('OPENERR')      return ('87');
    when ('SPOLBUSY')     return ('88');
    when ('SPOLERR')      return ('89');
    when ('NODEIDERR')    return ('90');
    when ('TASKIDERR')    return ('91');
    when ('CONTAINERERR') return ('110');
    when ('TOKENERR')     return ('112');
    when ('CHANNELERR')   return ('122');
    when ('CCSIDERR')     return ('123');