实际上,如果能知道TLP 2844条码打印机的指令集的话,我想我当初是不会在这上面浪费这么多时间的。各个帖子上都说斑马的条码打印机是采用的ZPL的指令集,照着ZPL的指令集开发,无论如何都没办法让打印机动起来,直到在其资料上看到其指令集是 EPL2并采用EPL2指令尝试一次。采用EPL2指令,非常容易的,条码打印机就动了。
下面是我封装EPL指令常见的一些操作:
实际上,如果能知道TLP 2844条码打印机的指令集的话,我想我当初是不会在这上面浪费这么多时间的。各个帖子上都说斑马的条码打印机是采用的ZPL的指令集,照着ZPL的指令集开发,无论如何都没办法让打印机动起来,直到在其资料上看到其指令集是 EPL2并采用EPL2指令尝试一次。采用EPL2指令,非常容易的,条码打印机就动了。
下面是我封装EPL指令常见的一些操作:
今天登录上一台服务器进行检查,偶然发现一个事实,日志提示计划任务从来没有执行成功过,日志信息如下:
tail /var/log/cron 如下:
May 15 05:23:13 localhost crond[1943]: CRON (root) ERROR: cannot set security context May 15 05:23:14 localhost crond[1945]: CRON (root) ERROR: cannot set security context May 15 05:23:14 localhost crond[1946]: CRON (root) ERROR: cannot set security context May 15 05:25:01 localhost crond[1974]: Bad item passed to pam_*_item() May 15 05:25:01 localhost crond[1974]: CRON (root) ERROR: failed to open PAM security session: Success May 15 05:25:01 localhost crond[1974]: CRON (root) ERROR: cannot set security context May 15 05:31:15 localhost crond[1975]: Bad item passed to pam_*_item() May 15 05:32:09 localhost crond[1975]: CRON (root) ERROR: failed to open PAM security session: Success May 15 05:32:15 localhost crond[1975]: CRON (root) ERROR: cannot set security context May 15 05:32:17 localhost crond[1976]: Bad item passed to pam_*_item() May 15 05:32:17 localhost crond[1976]: CRON (root) ERROR: failed to open PAM security session: Success May 15 05:32:17 localhost crond[1976]: CRON (root) ERROR: cannot set security context May 15 05:38:56 localhost crond[1978]: Bad item passed to pam_*_item()
依据上面的错误提示,google最可能的结果是,用户密码已过期或者已被删除。不过,这里我这里是root用户,貌似这是不可能的
tail /var/log/secure:
Aug 4 00:30:01 localhost crond[2618]: pam_env(crond:setcred): pam_putenv: delete non-existent entry; ulimit -n 65535 Aug 4 00:30:01 localhost crond[2619]: pam_env(crond:setcred): pam_putenv: delete non-existent entry; ulimit -n 65535 Aug 4 00:30:01 localhost crond[2618]: pam_env(crond:setcred): pam_putenv: delete non-existent entry; ulimit -n 65535 Aug 4 00:30:01 localhost crond[2619]: pam_env(crond:setcred): pam_putenv: delete non-existent entry; ulimit -n 65535 Aug 4 00:35:01 localhost crond[2620]: pam_env(crond:setcred): pam_putenv: delete non-existent entry; ulimit -n 65535 Aug 4 00:35:01 localhost crond[2620]: pam_env(crond:setcred): pam_putenv: delete non-existent entry; ulimit -n 65535 Aug 4 00:40:01 localhost crond[2621]: pam_env(crond:setcred): pam_putenv: delete non-existent entry; ulimit -n 65535 Aug 4 00:40:01 localhost crond[2622]: pam_env(crond:setcred): pam_putenv: delete non-existent entry; ulimit -n 65535 Aug 4 00:40:01 localhost crond[2621]: pam_env(crond:setcred): pam_putenv: delete non-existent entry; ulimit -n 65535 Aug 4 00:40:01 localhost crond[2622]: pam_env(crond:setcred): pam_putenv: delete non-existent entry; ulimit -n 65535 Aug 4 00:45:01 localhost crond[2623]: pam_env(crond:setcred): pam_putenv: delete non-existent entry; ulimit -n 65535 Aug 4 00:45:01 localhost crond[2623]: pam_env(crond:setcred): pam_putenv: delete non-existent entry; ulimit -n 65535
google 是最好的老师,阅读了n篇文章之后,终于在这里找到了答案 http://www.linux-archive.org/red-hat-linux/553249-crontab-jobs-not-running.html
不知道哪个人在 /etc/environment 加了一行 ulimit -n 65535 ,它导致了计划任务无法执行,并且导致了 sshd 频繁的提示 :
Aug 4 00:27:54 localhost sshd[2594]: pam_env(sshd:setcred): pam_putenv: delete non-existent entry; ulimit -n 65535 Aug 4 00:28:18 localhost sshd[2592]: pam_env(sshd:setcred): pam_putenv: delete non-existent entry; ulimit -n 65535
清楚掉上面那一行,重启计划任务 service crond restart ,从此计划任务正常执行。
育秧的水田:

小路:

水杉:


桃树:

已经将近10年不在老家了,不知不觉,感觉我已经落伍了。每次回家,我总会搞错表妹们的年龄,忘了我已经毕业几年了,她们也从原来小学升入了高中了,在我心目中,家乡好像从来都没有变过,依然是那么的安宁、干净。
柚子树:

含苞待放的乳桔树:

半开的桔花:

未开的桔子树:

门前小河(杨水河)边:

门前小河(杨水河)边【向下游看】:



门前小河(杨水河)向上游看(山上那个白房子是稻花香的万头养猪场):


河边的桔子树:

路边的杨树:

路边的槐树:

河水(杨水河):


河上游(许家岩方向):

橡子树(栎树,跑马岗村路边):

盛开桔花:


樱花楼:

太湖上:

三国影视城:

工商银行的查询支付接口需要客户端也需要SSL证书(双向SSL)。用PHP处理起来还是挺方便的(PHP默认不检查对方的证书,这点对测试环境来说尤为重要)。
对PHP5来说,这种事情相当简单:
$context= stream_context_create(array(
'http'=> array(
'method'=> 'POST',
'header'=> "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.98 Safari/534.13\r\nContent-type: application/x-www-form-urlencoded\r\n",
'content'=> $data
),
'ssl'=> array(
'local_cert'=> '本地PEM格式的证书'
)
));
echo file_get_contents('https://corporbank3.dccnet.com.cn/servlet/ICBCINBSEBusinessServlet', null, $context);
就可以了。
问题的关键在于,怎么生成 本地PEM格式的证书上。
工行提供的证书一般有以下几个: 公司名.crt 、公司名.key、公司名.pfx。这里我们使用的是 公司名.pfx 、找一台Linux 主机,上传上去,用openssl 处理一下就可以了,命令如下:
openssl pkcs12 -in 公司名.pfx -out 公司名.pem -nodes
Enter Import Password:(这里输入私钥密码)
MAC verified OK
就可以了,就会看到 公司名.pem 就放在目录下了,拷贝这个 证书到任意需要的地方供PHP使用就好了(可以看到,这个证书还是挺重要的,请保管好您的证书)
阅读全文 >>好歹咱现在也是做电子商务的,生成Excel是绕不过的一个课题。大Excel,我以前的做法是使用JXL生成,但是,现在需要使用Excel的地方太广了,不可能再一个人英雄主义的做下来了,必须整出一个大家都能很简单的使用的方案。当然,PHP扩展应该来说是一个相当优秀的方案。
前天,我看到了一个C++的Library, ExcelFormat,昨天晚上下班后,我花了3个小时wrap了一下(包装的类很多),效果挺让人满意的。
生成一个 6000 行,25列的Excel,每一个单元格内容都是 I 'am Chinese ,在我的笔记本上(Windows 7 Home Basic、Visual Studio 2008、PHP5.3.5 VC9) 运行约 0.5秒完成,CPU占用低于 25%(生成 60000 行时观察)。在测试机器上(CentOS Linux 5.5、gcc、PHP5.2.14),生成同样的内容约耗时 0.44 秒。
这个扩展性能应该来说还是远超现在的PHP实现(PHPExcel 约耗时 10 ~ 12 秒,内存占用 97M 左右),这个扩展内存占用也较少(生成同样的内容,峰值内存占用小于 65M)
阅读全文 >>项目文件 qtdll.pro,编译器为 cl ,编译测试,加载到PHP里,一切正常(Qt Creator 在常用功能方面,代码提示能力方面远优于 Visual Studio 2008、本地调试方面做到了和Visual Studio 2008一致的地步,还是非常不错的),强烈建议各位童鞋试试,装 Visual Studio 2008 Express(需要 cl 编译器)、然后安装 Qt Creator就可以了。
QT -= gui core
TEMPLATE = lib
PHP_SOURCE_DIR = D:\\c++\\php-5.3.6
INCLUDEPATH += $${PHP_SOURCE_DIR} \
$${PHP_SOURCE_DIR}\\TSRM \
$${PHP_SOURCE_DIR}\\win32 \
$${PHP_SOURCE_DIR}\\Zend \
$${PHP_SOURCE_DIR}\\main
PHP_BINARY_DIR = "D:\\Program Files\\Apache Software Foundation\\php"
LIBS += -L$${PHP_BINARY_DIR}\\dev \
-lphp5ts
HEADERS += \
php_qtdll.h
SOURCES += \
qtdll.c
QMAKE_CFLAGS_DEBUG += /D ZEND_WIN32 \
/D PHP_WIN32 \
/D ZEND_DEBUG=1 \
/D HAVE_QTDLL \
/D ZTS=1 \
/D COMPILE_DL_QTDLL
QMAKE_CFLAGS_RELEASE += /D ZEND_WIN32 \
/D PHP_WIN32 \
/D ZEND_DEBUG=0 \
/D HAVE_QTDLL \
/D ZTS=1 \
/D COMPILE_DL_QTDLL