php字符编码转换类:支持ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom 互相转换

php 字符编码转换类,支持ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom 互相转换。

四种常见文本文件编码方式

ANSI编码:

无文件头(文件编码开头标志性字节)
ANSI编码字母数字占一个字节,汉字占两个字节
回车换行符,单字节, 十六进制表示为0d 0a

UNICODE编码:

文件头,十六进制表示为FF FE
每一个字符都用两个字节编码
回车换行符, 双字节,十六进制表示为 000d 000a

Unicode big endian编码:

文件头十六进制表示为FE FF
后面编码是把字符的高位放在前面,低位放在后面,正好和Unicode编码颠倒
回车换行符,双字节,十六进制表示为0d00 0a00

UTF-8 编码:

文件头,十六进制表示为EF BB BF
UTF-8是Unicode的一种变长字符编码,数字、字母、回车、换行都用一个字节表示,汉字占3个字节
回车换行符,单字节,十六进制表示为0d 0a

转换原理:先把字符编码转为UTF-8,然后再从UTF-8转换为对应的字符编码。

CharsetConv.class.php

发表在 BS架构后台语言 | 标签为 , | 留下评论

通过nginx实现动态代理解决方案

需求:动态调整转发策略
公司最近在布署fastdfs分布式文件系统,需要根据SDK来动态获取可使用的服务器信息,并将用户请求转发给可用的服务器。
比如A用户(001)的请求转发到A服务器(192.168.1.101),B用户(002)的请求转发到B服务器(192.168.1.102),C用户(003)的请求转发到A服务器(192.168.1.103),等等。

1、服务器上下文

前端nginx服务器 + N台后端应用服务器。准备用单台服务器模拟。
前端:192.168.1.101:80
后端:192.168.1.101:81

2、技术头脑风暴

程序员们脑袋里开始有好几个方案了,有的是直觉,有的是经验,如下:

a、写nginx模块,模块里实现读数据库或nosql,根据数据值做转发。
b、找现成的模块,看能不能直接改根据或脚本就可以解决。据说ngx_lua很强大,可以考虑。
c、服务器必须保证不能有任何阻塞,模块实现时得用nginx的subrequest机制。
d、blalala…

3、程序员的脑袋里装的什么呢?

简单

任务1:web程序员A,写个http api接口,返回具体的服务器信息(ip+port)。
任务2:系统工程师B,做个nginx配置,根据A的api让nginx根据返回信息实现动态转发。

4、开始实现:

任务1:分分钟搞定,写个php脚本呗。
任务2:继续拆解
任务2.1:实现最简单转发

任务2.2:实现动态转发

看下源码proxy_pass能不能使用变量

改下配置,测试ok,继续往下走

任务2.3:根据api设置变量$url的值

好像没有现成的模块,脑袋里过滤了一遍,有的话必须是跟subrequest有关的模块,想起了 auth_request 模块,它可以配置一个http请求,根据http请求的返回结果决定给客户端是否正常访问,去看下源码先。

从源码我们掌握两个信息:1、api返回状态码要为200 2、ngx_http_auth_request_set_variables 可能有我们要的信息,继续查看:

代码逻辑很简单,遍历这个模块的配置的某个成员,肯定是跟变量有关的了,找配置信息了

整理一下,就是当接收到api的返回信息后,模块处理了设置变量。so配置为如下,测试ok,继续

任务2.4:让$url的值从api返回信息里获取

(请不要在2.3里一步搞定整个模拟,保持每步正确和简单,是不是很像代码重构的原则)

我们要解决这个:auth_request_set $url 192.168.1.101:81;

nginx有什么变量可以让我们获取请求的返回信息呢,头部信息也可以(其实这里心里已经判断肯定只能从头部信息里获取,以对nginx的代码熟悉了解程度)。去看下获取变量值的函数吧。

到这里心里已经很有数了,写php代码,并且直接访问测试正常

api.php

改nginx配置:

搞定,心情特好 ,预期半个小时验证方案,提前5分钟完成。

5、整个方案整理:

a、> ./configure –with-http_auth_request_module && make && ./objs/nginx

b、nginx.conf

c、api.php

发表在 BS架构后台语言, CS架构后台语言, 应用工具软件, 操作系统相关 | 标签为 , | 2条评论

将powerdesigner中PDM导出为word,html和excel的方法

powerdesigner导出word/html文档方法:

安装PDMReader软件,然后加载.pdm文件,导出word/html文档即可。

powerdesigner导出excel方法:

打开powerdesigner,在视图界面按ctrl+shift+x快捷键,执行以下脚本即可:

发表在 应用工具软件 | 标签为 , | 留下评论

PHP base64_decode+gzinflate压缩编码和解码代码

PHP目前在网络中被用的越来越多,加密解密的话题也一直没有停息过。下面简单介绍一下base64_decode+gzinflate压缩编码和解码代码方法,就是通常我们在程序中见的eval(gzinflate(base64_decode(‘加密代码’))); 形式的加密方法。
网山有此类方法,但是由于局部缺少了某些字符,导致了加密后无法使用的情况,大家有兴趣可以去试试看,本人在原基础上做了简单修改,经本人测试无错。
注意:解密时请不要用汉语及带空格的名字做文件名
压缩编码(加密)代码:

压缩解码(解密)代码:

发表在 BS架构后台语言 | 标签为 , , , , | 留下评论

在nginx中出现上传错误413 Request Entity Too Large的解决办法

默认情况下使用nginx反向代理上传超过2MB的文件,会报错413 Request Entity Too Large,解决这个方法很简单,修改配置client_max_body_size值即可

修改nginx.conf

如果需要上传更大的文件,那么client_max_body_size改成更大的值即可,这边改成了10MB

重启nginx

默认情况下proxy_max_temp_file_size值为1024MB,也就是说后端服务器的文件不大于1G都可以缓存到nginx代理硬盘中,如果超过1G,那么文件不缓存,而是直接中转发送给客户端.如果proxy_max_temp_file_size设置为0,表示不使用临时缓存。

在大文件的环境下,如果想启用临时缓存,那么可以修改配置,值改成你想要的。

修改nginx配置

重启nginx

发表在 应用工具软件 | 标签为 , , | 留下评论

Nginx Rewrite 实现泛域名匹配规则

Nginx 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。 Igor 将源代码以类 BSD 许可证的形式发布 1、为了确保能在 Nginx 中使用正则表达式进行更灵活的配置,安装之前需要确定系统是否安装有 PCRE(Perl Compatible Regular Expressions).

此例说明:
访问域名:http://beijing.zzstudio.net rewrite: http://www.zzstudio.net/city.php?ename=beijing
http://shanghai.zzstudio.net rewrite: http://www.zzstudio.net/city.php?ename=shanghai

此处只是举2个例子,因为以后要涉及到很多城市站点,不能一一罗列,所以希望重写的规则能兼容到后期城市的增加

发表在 应用工具软件 | 标签为 , , | 留下评论

如何才能成为软件界的能工巧匠

软件工艺宣言是这样说的:

作为有追求的软件工匠,我们正在通过实践不断地提升专业软件开发水平,并帮助其他人学习这门工艺。在工作过程中我们总结了以下的价值观:

不仅要让软件工作,更要精益求精。

不仅可以响应变化,更要稳步增加价值。

不仅要有个体与交互,更要形成专业人员的社区。

不仅要与客户合作,更要建立卓有成效的伙伴关系。

也就是说,左项固然值得追求,右项同样不可或缺。

Chris ODell在博客上发表了一篇名为the codesmith(代码匠)的文章,分享了他对工匠定义的看法:

“按照我的理解,工匠不仅仅是拿选定的材料从无到有地创造出一些什么东西,而是通常会把属于他们自己的一些什么东西融入进去。一名好的工匠会花时间和精力去做些优秀的东西,它们值得我们这样去做,在精心打造出来产品之后有些方法仍然可以传承下去。优良的工艺就是高质量产品的代名词。”

仿照金匠和铁匠,Chris杜撰了一个名词叫作代码匠,他说“这代表工艺达到了一定的水准,代表着从学徒走向大师之旅中的一种进展。”他后续又在博客中发表了一篇名为任何人都可以成为代码匠的文章,他说明了代码匠可以如何自我提升以成为代码巨匠:

“成为代码匠的门槛应该要低一些。这也就是为什么我说无论以什么形式写代码的人都可以称之为代码匠的原因。我们应该追求工艺的理想,并具有适度的实用主义,花时间去学习技能并且进行实操练习以成为好的编码者。”

今年早些时候,关于敏捷技术实践的重要性,参与工艺运动的几个人强调了技术实践的重要性:

Matt Badgley:“我们需要重申敏捷工程良好实践的重要性,并且拥抱工艺的理念——没有这个,就不可能实现敏捷。”

Robert Martin:“如果你们不使用极限编程的13个初中,那么你们最好使用一些别的好实践甚至是更好的实践。你们使用的实践定义了你们的文化,表现了你们的价值。”

Ruud Wijnands:“很多公司应用敏捷时采用了所有有价值的、已实现的技术实践,我看到了他们在这一方面取得的成功。不这么做的公司很少有成功的。”

程序员如何开发他们的技能以成为一个软件工匠呢? John Sonmez 写了一篇名为为什么我不使用编码招式的博客,在这篇文章中,他说程序员重复做同样的事情无法提升他们的技能。你要去学些什么,水平必须要持续地提升:

反复不断地重复写代码去解决同样的编程问题,这就是在做完全相同的事,除非新的约束和变化给你带来了新的挑战,你只能从第一次的经验中有所收获,而从第二次开始基本就是简单地重复了。

(……)如果你想要做得更优秀,重复实践是远远不够的。你必须在实践中增加更多的难度和挑战。

按照John的说法,实操是提升技能的好方法。程序员必须去写程序才能成为软件工匠:

我收到了很多邮件,他们咨询我学习编程的最佳方式是什么,或者如何提升他们的技能。最近,我收到很多邮件询问我如何学习安卓开发。你知道我是如何回复这些好奇的心灵的吗?

去做安卓应用。

但是,嗯,我应该去看什么书呢?

不需要看什么书,只需要迸发一个想法然后去尝试实现它。一步步实践,解决过程中遇到的问题。当你卡壳时,就去找找答案或者寻求帮助。

Steve Ropa写了一篇关于培养软件工匠的文章。大学传授了软件开发的理论。为成为程序员工匠需要增加“现实世界的经验和知识的应用实践”,Steve说。学徒工计划能够为此做出准备:

我的建议是让时间倒流,我们穿越回一百年前,把你们的工作间变成一个车间。我们需要把工匠安置到车间中。开始的时候我们可是没有这么多工匠,所以我们需要培训和锻炼他们。应用学徒工计划并且使用针对未来职业生涯的工匠模型就可以做到这一点。

如何从软件开发学徒成为工匠呢,Steve在他的博客中谈了五个方面:

1.代码工艺——使用一个或多个程序设计语言的艺术去创建清晰的、构造良好的代码。(……)

2.实用的原则——(……)一个学徒需要理解类似于SOLID这样的原则,并且知道如何去应用它们。

3.技术和工具——虽然程序员需要有能力去实践像手工重构这样的做法,但是他们也需要了解如何使用专门的工具,如何针对特定的任务去选择适当的工具。

4.工作习惯——(……)我们需要围绕某些活动培养肌肉记忆,比如TDD、持续集成等等。软技能——(……)软件学徒需要学习如何在团队中开展工作,如何与其他人进行交流,以及一些其他的软技能。

5.在传统学习环境中这些软技能渐渐地都被忽略掉了。

英文原文:Becoming Software Craftsmen

发表在 生活随笔 | 标签为 , | 留下评论

如何在WinForm中实现md5密码的加密

最近在做一个C#小程序时用到了MD5加密,发现WinForm中没有现在的方法?
后来在微软官方网站上找到了相应的方法,现收藏一下。希望能帮到有同样需求的你。

兼容版本信息

.NET Framework
受以下版本支持:2.0、1.1、1.0
.NET Compact Framework
受以下版本支持:2.0

示例

下面的代码示例计算字符串的 MD5 哈希值,并将该哈希作为 32 字符的十六进制格式字符串返回。此代码示例中创建的哈希字符串与能创建 32 字符的十六进制格式哈希字符串的任何 MD5 哈希函数(在任何平台上)兼容。

发表在 CS架构后台语言 | 标签为 , , , , | 留下评论

php日期加减处理函数

<?php
echo “今天:”,date(‘Y-m-d H:i:s’),”<br>”;
echo “明天:”,date(‘Y-m-d H:i:s’,strtotime(‘+1 day’));
?>
上一行输出当前时间,下一行输出明天时间

这里+1 day
可以修改参数1为任何想需要的数  day也可以改成year(年),month(月),hour(小时),minute(分),second(秒)

date(‘Y-m-d H:i:s’,strtotime(“+1 day +1 hour +1 minute”);
可以随便自由组合,以达到任意输出时间的目的
注:该方法之针对1970年以后试用,也就是时间戳的适用范围。

php 常用日期相函数[日期加减,两日期之差,日期转换时间截]

下面这些代码是一些常用的日期处理函数了,可以两个时间的日期加减,两日期之差,日期转换时间截等。

echo date(‘Y-m-d’,strtotime(‘+1 d’,strtotime(‘2009-07-08’)));//日期天数相加函数

echo date(“Y-m-d”,’1246982400′);
echo ‘<br>’;
echo date(“Y-m-d”,’1279123200′);
die();

$d   =   “2009-07-08 10:19:00”;
echo   date(“Y-m-d”,strtotime(“$d   +1   day”));   //日期天数相加函数

function dateToTime($d)//把日期转换成时间堆截
{
$year=((int)substr(“$d”,0,4));//取得年份

$month=((int)substr(“$d”,5,2));//取得月份

$day=((int)substr(“$d”,8,2));//取得几号

return mktime(0,0,0,$month,$day,$year);
}

/*

下面函数计算两日期之差

*/

$Date_1=”2009-07-08″;

echo $Date_1+1;

$Date_2=”2009-06-08″;
$Date_List_a1=explode(“-“,$Date_1);

$Date_List_a2=explode(“-“,$Date_2);

$d1=mktime(0,0,0,$Date_List_a1[1],$Date_List_a1[2],$Date_List_a1[0]);

$d2=mktime(0,0,0,$Date_List_a2[1],$Date_List_a2[2],$Date_List_a2[0]);

$Days=round(($d1-$d2)/3600/24);

echo “两日期之前相差有$Days 天”;

发表在 BS架构后台语言 | 标签为 , , | 留下评论

如何获得winform程序集信息内容

最近,做了几个winform小程序,需要获得winform程序集信息内容。

以下为主要代码

获取标题

获取版本号

获取描述内容

获取产品

获取版权信息

获取公司

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

发表在 应用工具软件 | 标签为 , , | 留下评论