nginx php5.3+mysql5.1 redhat6.5 配置记录

nginx php5.3+mysql5.1 redhat6.5 配置记录

同步自:http://www.gejoin.com/2017/12/27/install-php-mysql-nginx-on-redhat6.5-linux-tips.html

一台没有联网但是有安装介质的rhel6.5-x86_64服务器。 计划安装部署上php+mysql 服务。由于有安装介质,光盘上的mysql版本5.1,php 版本5.3.3 ,没办法软件版本老就老了凑合用了。

1.首先挂载上iso光盘

# mount -o loop -t iso9660 /csys/rhel-server-6.5-x86_64-dvd.iso /mnt/vcdrom/

2.安装 php mysql

# cd /mnt/vcdrom/Packages/
# ls -rlt php* mysql*
# rpm -ivh mysql*.rpm --nodeps --force
# rpm -ivh php*.rpm --nodeps --force

3.编译安装nginx nginx 安装没什么说的,源码nginx-1.12.2编译安装。

# ./configure
# make & make install

4.安装一些php依赖包,rhel5.6介质中的包很少的,基本的php-fpm也是没有的。 可以从以下网站获取rpm包:

https://www.rpmfind.net
https://pkgs.org/download
http://rpm.pbone.net/

php-fpm-5.3.3-26.el6.x86_64.rpm
php-mbstring-5.3.3-26.el6.x86_64.rpm
php-mcrypt-5.3.3-5.el6.x86_64.rpm
libmcrypt-2.5.8-9.el6.x86_64.rpm

5.nginx.conf 配置

server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

6.php 配置 编辑/etc/php.ini

session.save_path = “/var/lib/php/session” 
session.auto_start = 1
​# chmod -R 777 /var/lib/php

7.设置服务开机启动

# chkconfig php-fpm on
# chkconfig mysqld on

8.启动服务

# service mysqld start
# service php-fpm start
# /usr/local/nginx/sbin/nginx
# mysqladmin -u root password ‘passwd’

9.验证nginx以及php服务

# echo “” > /usr/local/nginx/html/info.php

打开浏览器输入http://REMOTE/
打开浏览器输入http://REMOTE/info.php

10.安装phpMyAdmin 下载并解压phpMyAdmin-4.0.10.20-all-languages.tar.gz,建立到/usr/local/nginx/html/的软连接。 注意phpMyAdmin 支持的php版本。

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

好了。以后再继续。

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

其它废话也不说了…

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');

 

 
Chinese Developers Can Now Offer Paid Applications to Google Play Users in More Than 130 countries

Chinese Developers Can Now Offer Paid Applications to Google Play Users in More Than 130 countries

Source:http://android-developers.blogspot.com/2014/11/chinese-developers-can-now-offer-paid.html

Google Play is the largest digital store for Android users to discover and purchase their favorite mobile app and games, and the ecosystem is continuing to grow globally. Over the past year, we’ve expanded the list of countries where app developers can sign up to be merchants on Google Play, totaling 60 countries, including Lebanon, Jordan, Oman, Pakistan, Puerto Rico, Qatar and Venezuela most recently.

As part of that continued effort, we’re excited to announce merchant support in China, enabling local developers to export and sell their apps to Google Play users in more than 130 countries. Chinese developers can now offer both free and paid applications through various monetization models, including in-app purchasing and subscriptions. For revenue generated on Google Play, developers will receive payment to their Chinese bank accounts via USD wire transfers.
Google-Play-Store

If you develop Android apps in China and want to start distributing your apps to a global audience through Google Play, visit play.google.com/apps/publish and register as a developer. If you want to sell apps and in-app products, you’ll need to also sign up for a Google Wallet merchant account, which is available on the “Revenue” page in the Google Play Developer Console. After you’ve uploaded your apps, you can set prices in the Developer Console and later receive reports on your revenue. You’ll receive your developer payouts via wire transfer. For more details, please visit ourdeveloper help center.

We look forward to continuing to roll out Google Play support to developers in many more countries around the world.

中国开发者可以向全球130个国家的Google Play用户提供付费应用啦

发表者:Ellie Powers, Google Play产品经理

Google Play是一个可让Android用户发现和购买他们喜爱的移动应用程序和游戏的全球最大的应用商店,这个生态系统在全球迅速成长。过去一年中,我们已经扩展到60个国家,让应用程序开发人员可以注册成为 Google Play的商家,其中新近支持的国家包括黎巴嫩、约旦、阿曼、巴基斯坦、波多黎各、卡塔尔和委内瑞拉。

作为持续改进 Google Play努力的一部分,我们很高兴地宣布在中国增加了对商家的支持,让中国的开发者能售卖应用程序到130个国家的 Google Play 用户。中国的开发者现在可以提供通过各种盈利模式的免费和付费应用,包括应用内购买和订阅。在 Google Play 产生的营收将通过美元电汇的方式支付给开发者的中国的银行账户。

如果你在中国开发Android应用程序,并希望通过 Google Play 把应用程序推广到全球,请登录play.google.com/apps/publish并建立你的 Google Play 开发者账户。如果你想售卖付费的应用程序和应用程序内的产品,则需要再注册一个Google 电子钱包商家帐户,通过Google Play开发者控制台里的”营收”页面进行设置。上传应用程序后,你可以通过开发者控制台设定价格,之后就可以收到营收报告,你将会通过电汇的方式获得收入。

我们将继续增加更多 Google Play 商家支持的国家,敬请关注。

gSoap传递结构体数组之上网不易

gSoap传递结构体数组之上网不易

每次需要用到网络,无论PC,Mac或是移动设备,一阵愤怒涌上来。Google全线被封,Dropbox被封,Line被封,Amazon WS 被封,One Drive 被封,手机上百分之八十应用挂了……就在墙内死去吧!F**k GFW!!顺便祝福Fang Sir。如今的封锁已经到了丧心病狂的地步,当局没有任何下线和尺度!我的这个日记本也快挂了。不说了,我要砸电脑了……
GFWcomic

——————图片引自http://factsanddetails.com/

现在见到最多的已经不是”Connection is reset(连接被重置)”,而是”This webpage is not available”,果然没有最牛最有最傻X。
最近用到强大的C版本gSoap库处理Web service服务端和客户端。虽然以前用过,但这次需要用到数据库,需要返回结果集,这里就直接贴出代码,分别返回单条结构体和多条的结构体数组。
接口interface.h是这样定义的:

//interface.h
//soapcpp2 -c -L -S -x  interface.h 
//soapcpp2 -c -C -L -x   interface.h 
struct  OnlWS__FuckGFWResp
{
   char *Google;
   char *MrFang;
   char *GreatWall;
   char *Blocks;
   char *DnsPollution;
   char *CNShit;
};

struct  OnlWS__GetFreeNet
{
    char *Free;
    char *FreeAgain;
    char *FreeEver;
};

struct OnlWS__GetFreeNetResp
{
    struct OnlWS__GetFreeNet * __ptr;
    int  __size;
}; 
int OnlWS__GetShitGFW(char *option,struct OnlWS__FuckGFWResp  *resp);
int OnlWS__GetFreeInfo(char *option,struct OnlWS__GetFreeNetResp  *resp);

接口定义好后使用gsoap提供的工具生成服务端代码:

soapcpp2 -c -L -S -x  interface.h

接下来实现服务端代码和接口的逻辑:(略去一些代码),接口处理逻辑需要返回结构体数组,因此需要开辟一定长度的空间,这里使用链表来动态开辟。

    //........
    resp->__size=nRecCnt;
    resp->__ptr= soap_malloc(soap,(resp->__size+1)*sizeof(*resp->__ptr));
    
    pLink->ptAnyNode= soap_malloc(SOME_DATA_STRUCT);
    pLink->pNext=NULL;
    tAnyLink *p ,*phead=pLink;
    for(i=0;i<resp->__size-1;i++)
    {
        p=(tAnyLink *)soap_malloc(soap,sizeof(tAnyLink));
        p->ptAnyNode=(SOME_DATA_STRUCT *)soap_malloc(soap,sizeof(SOME_DATA_STRUCT));
        p->pNext=NULL;
        phead->pNext=p;
        phead=p;
    }

进行赋值操作,返回结果。

客户端实现比较简单,因为可以直接取到结构体数组的长度,直接使用数组下标即可获取到结果。这里列出Python的测试程序:使用suds 包来完成客户端处理web service .

# -*- coding: utf-8 -*-
import suds
import logging
import sys

def main():
    print sys.stdout.encoding
    url="http://192.168.101.181:11080" 
    client=suds.client.Client(url)
    rst=client.service.GetShitGFW('WALL')
    print client.last_received()
    rs=client.service.GetFreeInfo('FREE')
    print rs
    print client.last_received()
    
if __name__=='__main__':
    main()


看看返回的情况:

(GetFreeNetResp){
   item[] = 
      (GetFreeNet){
         Free = "01"
         FreeAgain = "A"
         FreeEver = "2014-07-18 07:37:51.110000"
      },
      (GetFreeNet){
         Free = "10"
         FreeAgain = "B"
         FreeEver = "2014-07-18 07:37:51.110000"
      },
      (GetFreeNet){
         Free = "15"
         FreeAgain = "G"
         FreeEver = "2014-07-18 07:37:51.110000"
      },
      (GetFreeNet){
         Free = "20"
         FreeAgain = "C"
         FreeEver = "2014-07-18 07:37:51.110000"
      },
 }

好了,上网不易,且行且珍惜。

Can not dragging[solved] :Chyrp博客部署Tips

Can not dragging[solved] :Chyrp博客部署Tips

Q1:  Cannot allocate memory: couldn’t create child process: /opt/suphp/sbin/suphp …..

解决:联系主机商,并自行更改php.ini

memory_limit = 512M

chyrp

Q2: modules-not-dragging,Debugging :404 Not found
在官方讨论中没有结果http://chyrp.net/discuss/topic/modules-not-dragging/,在chyrp后台管理界面,设置项不能拖动,因而无法完成拖动。调试发现,明明文件目录都很正常,javascript也存在,子目录访问总是报出404错误,经检查后台日志是这样的:
SoftException in Application.cpp:629: Directory “/home/XXX/public_html/t/admin/themes” is writeable by group, referer:
由于改网站架设在之前有的子目录下,怀疑.htacess文件设置,结果走了弯路..

解决:将admin/themes/default等目录权限都设置为755,而不是777!所以遇到modules-not-dragging 去官网貌似没有正确解答的。
please note here:change  the permissions for that directory to 755.

Chmod default 755
chmod /**  755

Q3:官方版本为V2.5 下载地址:http://cl.ly/0S1Z112Q1t45。安装部署方法参照这里:
http://help.chyrp.net/kb/getting-started/quick-start-guide   Linux, Apache, MySQL, PHP. If you want to install Chyrp 2.5 Needed..