Aside

ngnix and fastcgi and cicstg 开发环境搭建

一个搭建HTTP Server的项目需求,虽然方案没有最终确定,使用Ngnix做代理转发,后端使用使用开发语言无关的CGI应用进行业务逻辑处理,初步技术是可行的。但使用C语言开发WebServer 应用或许真不是什么好主意,那这样想啊,我们还用CICS这么古老的东西呢?–这里又忍不住想吐槽cics了..这个架构中的毒瘤!…. 进入正题吧,首先安装ngnix,ngnix的强大就不用叨叨了,安装也相当顺利。

  • 下载安装PCRE
# wget  ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz
# ./configure;make;make install;
# wget http://nginx.org/download/nginx-1.10.2.tar.gz
# ./configure;make;make install;

这样就可以启动nginx,默认安装在了/usr/local/nginx目录下.

  • 下载安装spawn-fcgi,可以从Github Lighthtpd项目中下载,也可以直接从lighttpd.net这里下载。同样可以编译出Spawn-fcgi这个可执行程序。ngnix是支持FastCgi的,但是没有这个CGI管理程序。
  • 接下来就可以写CGI程序了,可以使用一些现成开源库,当然也可以自己写。
  • 安装CICS TRANSACTION GATEWAY,!!!NOTE!!![这玩意基本上支持32系统,安装时也会各种水土不服的,你可能需要32位的jre..]安装开发中可能需要32位支持,比如:
libXp.i686 
glibc-devel.i686

–慢慢享受其中的酸爽吧%$%$%.

  • 顺利的话应该可以写代码测试一下了。以下代码片段是接受从浏览器提交的表单然后提交CTG请求,编写代码编译。
 while (FCGI_Accept() >= 0) {   
        memset(sBufIn,0,sizeof(sBufIn));
        FCGI_fread(sBufIn, sizeof(char), sizeof(sBufIn), FCGI_stdin);
        if(strlen(sBufIn)==0)
        {
            memcpy(sBufIn,sParmas,strlen(sParmas));
        }
        memset(&tHttpIn,0x00,sizeof(HttpReqT));
        rc=InitHttpIn(&tHttpIn,sBufIn);
        resultSize= URLDecode(tHttpIn.MsgIn, tHttpIn.MsgIn, sizeof(tHttpIn.MsgIn));
        rc=CallCtgSvr(&tHttpIn);
        if(rc != RC_OK)
        {
            printf("Content-type: text/plain\r\n"
                "\r\n"
                ""
                "QUERY_STRING :%s.\n"
                "REQUEST_METHOD : %s.\n"
                "CONTENT_TYPE : %s.\n"
                "CONTENT_LENGTH : %s.\n"
                "SERVER_PROTOCOL : %s.\n"
              ...
         }
         ...
     }
     // CTG 调用函数
     // CTG_openRemoteGatewayConnection();
     // CTG_ECI_Execute(gatewayToken, &eciParms);
     // Makefile libs -m64 -lctgclient -lfcgi
  • 配置nginx 端口转发处理FASTCGI.
 location ~ \.cgi$ {
        fastcgi_pass 127.0.0.1:8000;
        fastcgi_index index.cgi;
        fastcgi_param SCRIPT_FILENAME fcgi$fastcgi_script_name;
        include fastcgi_params;
    }
  • 配置nginx 端口转发处理FASTCGI.启动CGI程序。
     /usr/local/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 8000 -f /usr/local/nginx/cgi-bin/ctgcls
  • 使用浏览器测试或其他HTTP 客户端程序测试
 #!/usr/bin/env python
#coding=utf8
import httplib, urllib
httpClient = None
try:
    #params = urllib.urlencode({'name': 'tom', 'age': 22})
    params = '''TEST CTG..'''
    headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
    httpClient = httplib.HTTPConnection("192.168.101.181", 80, timeout=30)
    httpClient.request("POST", "/ctgcls.cgi", params, headers)
    response = httpClient.getresponse()
    print response.status
    print response.reason
    print response.read()
    print response.getheaders() #获取头信息
except Exception, e:
    print e
finally:
    if httpClient:
        httpClient.close() 
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了。

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;
}

好了。以后再继续。