我的原创技术文章,讨论Web应用开发与服务器架构等
FreeBSD 9.0 Release版本放出了
[
2012/01/06 19:33 | by 袁旭东 ]
2012/01/06 19:33 | by 袁旭东 ]
刚刚在FreeBSD.org上看到,FreeBSD 9.0 Release ISO文件已经可以下载了。不过,网站页面还是显示的RC3。
AMD64下载地址CD:ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/9.0/FreeBSD-9.0-RELEASE-amd64-disc1.iso
AMD64下载地址DVD:ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/9.0/FreeBSD-9.0-RELEASE-amd64-dvd1.iso
AMD64下载地址CD:ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/9.0/FreeBSD-9.0-RELEASE-amd64-disc1.iso
AMD64下载地址DVD:ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/ISO-IMAGES/9.0/FreeBSD-9.0-RELEASE-amd64-dvd1.iso
PHP现Hash冲突漏洞,本站更新至5.3.9
[
2012/01/05 21:01 | by 袁旭东 ]
2012/01/05 21:01 | by 袁旭东 ]
最近几天,网上公布了PHP的Hash冲突漏洞,具体就是hash表碰撞漏洞,不仅仅是PHP,JAVA、Python等语言均受影响。PHP 5.3.9 RC4及以上版本不受影响,虽然还是RC版本,但是为了不受此漏洞影响,还是决定将PHP升级至5.3.9 RC4。
解决Android中文乱码的问题
[
2011/09/30 08:48 | by 袁旭东 ]
2011/09/30 08:48 | by 袁旭东 ]
前几天解决了PHP与Android中DES加密一致性的问题,昨天遇到了访问Web中文乱码的问题。我在服务端编写了一个PHP程序,Android通过http访问。我的网站编码是UTF-8的,而由于Android的编码是iso-8859-1的,所以导致了中文乱码的问题。知道了原因,解决起来就简单了。在获取得到的返回结果后,对数据进行编码转换就可以了。代码如下:
如果你的网站是GB2312或者GBK的,那么就把以上代码中红色的部分改成GBK就可以了,如:
其他编码依此类推。
引用
strResult = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
如果你的网站是GB2312或者GBK的,那么就把以上代码中红色的部分改成GBK就可以了,如:
引用
strResult = EntityUtils.toString(httpResponse.getEntity(), "GBK");
其他编码依此类推。
FreeBSD 9.0 beta 3发布
[
2011/09/28 17:42 | by 袁旭东 ]
2011/09/28 17:42 | by 袁旭东 ]
昨天,FreeBSD 9.0 beta3发布了,按照计划,这个版本应该是最后一下beta版了,接下来应该是RC1了。FreeBSD 9.0比计划的时间表延后了一个多月。大概估算,9.0正式版本应该会在今年的10月底左右发布。
我的测试服务器会在最近一两天内更新至FreeBSD 9.0 beta3,之前的版本是FreeBSD 9.0 beta2。由于只在其上配置了nginx,所以除了安装以外,还无法去发现在其他使用方面与8.x的不同。
我的测试服务器会在最近一两天内更新至FreeBSD 9.0 beta3,之前的版本是FreeBSD 9.0 beta2。由于只在其上配置了nginx,所以除了安装以外,还无法去发现在其他使用方面与8.x的不同。
Android与PHP互通的DES加密解密
[
2011/09/26 00:25 | by 袁旭东 ]
2011/09/26 00:25 | by 袁旭东 ]
正在做一个Android手机的一个小应用,并且需要与网站有信息交互,网站使用PHP开发,所以需要一个Android与PHP互通的DES加密解密代码。
Android代码如下:
Android代码如下:
引用
import java.security.Key;
import java.security.spec.AlgorithmParameterSpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import android.util.Base64;
public class DES2
{
public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";
/**
* DES算法,加密
*
* @param data 待加密字符串
* @param key 加密私钥,长度不能够小于8位
* @return 加密后的字节数组,一般结合Base64编码使用
* @throws CryptException 异常
*/
public static String encode(String key, String data) throws Exception
{
return encode(key, data.getBytes());
}
/**
* DES算法,加密
*
* @param data 待加密字符串
* @param key 加密私钥,长度不能够小于8位
* @return 加密后的字节数组,一般结合Base64编码使用
* @throws CryptException 异常
*/
public static String encode(String key, byte[] data) throws Exception
{
try
{
DESKeySpec dks = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
//key的长度不能够小于8位字节
Key secretKey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
AlgorithmParameterSpec paramSpec = iv;
cipher.init(Cipher.ENCRYPT_MODE, secretKey,paramSpec);
byte[] bytes = cipher.doFinal(data);
return Base64.encodeToString(bytes, 3);
}
catch (Exception e)
{
throw new Exception(e);
}
}
/**
* DES算法,解密
*
* @param data 待解密字符串
* @param key 解密私钥,长度不能够小于8位
* @return 解密后的字节数组
* @throws Exception 异常
*/
public static byte[] decode(String key, byte[] data) throws Exception
{
try
{
DESKeySpec dks = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
//key的长度不能够小于8位字节
Key secretKey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
AlgorithmParameterSpec paramSpec = iv;
cipher.init(Cipher.DECRYPT_MODE, secretKey,paramSpec);
return cipher.doFinal(data);
}
catch (Exception e)
{
throw new Exception(e);
}
}
/**
* 获取编码后的值
* @param key
* @param data
* @return
* @throws Exception
*/
public static String decodeValue(String key,String data)
{
byte[] datas;
String value = null;
try
{
datas = decode(key, Base64.decode(data, 3));
value = new String(datas);
}
catch (Exception e)
{
value = "";
}
return value;
}
}
import java.security.spec.AlgorithmParameterSpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import android.util.Base64;
public class DES2
{
public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";
/**
* DES算法,加密
*
* @param data 待加密字符串
* @param key 加密私钥,长度不能够小于8位
* @return 加密后的字节数组,一般结合Base64编码使用
* @throws CryptException 异常
*/
public static String encode(String key, String data) throws Exception
{
return encode(key, data.getBytes());
}
/**
* DES算法,加密
*
* @param data 待加密字符串
* @param key 加密私钥,长度不能够小于8位
* @return 加密后的字节数组,一般结合Base64编码使用
* @throws CryptException 异常
*/
public static String encode(String key, byte[] data) throws Exception
{
try
{
DESKeySpec dks = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
//key的长度不能够小于8位字节
Key secretKey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
AlgorithmParameterSpec paramSpec = iv;
cipher.init(Cipher.ENCRYPT_MODE, secretKey,paramSpec);
byte[] bytes = cipher.doFinal(data);
return Base64.encodeToString(bytes, 3);
}
catch (Exception e)
{
throw new Exception(e);
}
}
/**
* DES算法,解密
*
* @param data 待解密字符串
* @param key 解密私钥,长度不能够小于8位
* @return 解密后的字节数组
* @throws Exception 异常
*/
public static byte[] decode(String key, byte[] data) throws Exception
{
try
{
DESKeySpec dks = new DESKeySpec(key.getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
//key的长度不能够小于8位字节
Key secretKey = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance(ALGORITHM_DES);
IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());
AlgorithmParameterSpec paramSpec = iv;
cipher.init(Cipher.DECRYPT_MODE, secretKey,paramSpec);
return cipher.doFinal(data);
}
catch (Exception e)
{
throw new Exception(e);
}
}
/**
* 获取编码后的值
* @param key
* @param data
* @return
* @throws Exception
*/
public static String decodeValue(String key,String data)
{
byte[] datas;
String value = null;
try
{
datas = decode(key, Base64.decode(data, 3));
value = new String(datas);
}
catch (Exception e)
{
value = "";
}
return value;
}
}
让你开发的Android程序支持多语言
[
2011/09/21 22:48 | by 袁旭东 ]
2011/09/21 22:48 | by 袁旭东 ]
在开发Android程序时,很可能您想要您的用户群不止是简体中文用户,很可能还有英语用户或者繁体中文用户。这时候,我们就需要让Android程序支持多语言了,并且程序会根据系统的当前语言来自动转换程序的显示语言。
下面我就以创建缺省语言为英语,另外支持简体中文的Android程序为例,说一下Android的多语言支持。
首先,在res目录下建立values-zh-rCN目录,并新建一个名为strings.xml文件。此文件将存储简体中文字符串资源。
然后,将res目录下的values目录下的string.xml中的内容复制出来,假定文件内容为:
复制后,将标签值翻译成简体中文,修改后内容如下:
应该可以注意到,修改的只是红色的部分,标签的name不要修改。
最后,您只要在您的Android程序中使用这些字符串资源id就可以了。例如程序中按返回按键时显示的确认退出对话框,代码如下:
这样,您开发的Android程序就支持多语言了。
下面我就以创建缺省语言为英语,另外支持简体中文的Android程序为例,说一下Android的多语言支持。
首先,在res目录下建立values-zh-rCN目录,并新建一个名为strings.xml文件。此文件将存储简体中文字符串资源。
然后,将res目录下的values目录下的string.xml中的内容复制出来,假定文件内容为:
引用
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Seller Assistant</string>
<string name="exit_msg_title">Tips</string>
<string name="msg_cancel">Cancel</string>
<string name="msg_OK">OK</string>
<string name="msg_exit_content">Do you want to quit Seller Assistant?</string>
</resources>
<resources>
<string name="app_name">Seller Assistant</string>
<string name="exit_msg_title">Tips</string>
<string name="msg_cancel">Cancel</string>
<string name="msg_OK">OK</string>
<string name="msg_exit_content">Do you want to quit Seller Assistant?</string>
</resources>
复制后,将标签值翻译成简体中文,修改后内容如下:
引用
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">淘宝卖家助理</string>
<string name="exit_msg_title">温馨提示</string>
<string name="msg_cancel">取消</string>
<string name="msg_OK">确定</string>
<string name="msg_exit_content">您确认退出卖家助理吗?</string>
</resources>
<resources>
<string name="app_name">淘宝卖家助理</string>
<string name="exit_msg_title">温馨提示</string>
<string name="msg_cancel">取消</string>
<string name="msg_OK">确定</string>
<string name="msg_exit_content">您确认退出卖家助理吗?</string>
</resources>
应该可以注意到,修改的只是红色的部分,标签的name不要修改。
最后,您只要在您的Android程序中使用这些字符串资源id就可以了。例如程序中按返回按键时显示的确认退出对话框,代码如下:
引用
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if(keyCode == KeyEvent.KEYCODE_BACK)
{
// 退出时提示确认是否退出
showExitMessage(R.string.msg_exit_content);
return true;
}
return super.onKeyDown(keyCode, event);
}
/**
* 退出App时提示窗口
* @param msg 提示文字信息
*/
private void showExitMessage(int msg_id)
{
new AlertDialog.Builder(this)
.setTitle(R.string.exit_msg_title)
.setMessage(msg_id)
.setPositiveButton(R.string.msg_OK, new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialoginterface, int i)
{
finish();
}
})
.setNegativeButton(R.string.msg_cancel, new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialoginterface, int i)
{
//
}
}).show();
}
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if(keyCode == KeyEvent.KEYCODE_BACK)
{
// 退出时提示确认是否退出
showExitMessage(R.string.msg_exit_content);
return true;
}
return super.onKeyDown(keyCode, event);
}
/**
* 退出App时提示窗口
* @param msg 提示文字信息
*/
private void showExitMessage(int msg_id)
{
new AlertDialog.Builder(this)
.setTitle(R.string.exit_msg_title)
.setMessage(msg_id)
.setPositiveButton(R.string.msg_OK, new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialoginterface, int i)
{
finish();
}
})
.setNegativeButton(R.string.msg_cancel, new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialoginterface, int i)
{
//
}
}).show();
}
这样,您开发的Android程序就支持多语言了。
FreeBSD 9.0 beta2发布了
[
2011/09/09 22:05 | by 袁旭东 ]
2011/09/09 22:05 | by 袁旭东 ]
作为一名FreeBSD的忠实粉丝,自开始使用FreeBSD那一刻起,就始终专注着FreeBSD。我的所有服务器,包括开发服务器也都是安装着不同版本的FreeBSD,并且它们都稳定而高效地运行着。特别是生产服务器,已经稳定运行两年了,FreeBSD是一个非常值得信赖的服务器操作系统。
随着FreeBSD 9.0 beta版本的发布,FreeBSD为我们带来了很多新的特性,我摘抄如下:
自FreeBSD 9.0开始,FreeBSD开始使用了一种新的安装程序——BSDInstall,较之前的sysinstall有什么变化呢,趁放假期间,我下载下来FreeBSD 9.0 beta2安装体验一下。
FreeBSD 9.0正式版或许会在今年10月份发布吧,我们还是耐心等待吧。到时候可以再安装一台FreeBSD 9.0的开发服务器了。
随着FreeBSD 9.0 beta版本的发布,FreeBSD为我们带来了很多新的特性,我摘抄如下:
引用
将ZFS作为默认的文件系统;
SSD TRIM 支持;
802.11n 高流量支持;
更多的ATA/CAM 改进;
PCI热插拔支持;
S4休眠支持;
Xen dom0支持;
重新启动更快,等等
SSD TRIM 支持;
802.11n 高流量支持;
更多的ATA/CAM 改进;
PCI热插拔支持;
S4休眠支持;
Xen dom0支持;
重新启动更快,等等
自FreeBSD 9.0开始,FreeBSD开始使用了一种新的安装程序——BSDInstall,较之前的sysinstall有什么变化呢,趁放假期间,我下载下来FreeBSD 9.0 beta2安装体验一下。
FreeBSD 9.0正式版或许会在今年10月份发布吧,我们还是耐心等待吧。到时候可以再安装一台FreeBSD 9.0的开发服务器了。
Android 获取网页内容
[
2011/09/02 05:53 | by 袁旭东 ]
2011/09/02 05:53 | by 袁旭东 ]
想要开发一个与网站互动的Android程序,首先就是要能访问网页并获取返回的内容。访问网页有两种方式,即GET和POST。首先说一下GET,代码如下:
至于 POST 方式,与 GET 方式类似,只是将 HttpGet 类改为 HttpPost 类即可。不过,单单只有这些访问网络的代码还是不能真正的访问网络,还需要为你的程序设置访问网络的权限。此时就需要在 AndroidManifest.xml 文件中的<manifest>标签内加入下面的代码:
这样,你的程序就能正常访问网络了。而在制作成的安装包apk在安装时,Android系统也会以红色的字提示你,此程序有完全访问网络的权限。
下面是演示程序的完整代码:
下载文件
引用
HttpGet httpRequest = new HttpGet("http://blog.jiqila.com/index.php");
try
{
HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);
if(httpResponse.getStatusLine().getStatusCode() == 200)
{
String strResult = EntityUtils.toString(httpResponse.getEntity());
textViewInfo.setText(strResult);
}
else
{
textViewInfo.setText(httpResponse.getStatusLine().toString());
}
}
catch (ClientProtocolException e)
{
textViewInfo.setText(e.getMessage().toString());
e.printStackTrace();
}
catch (IOException e)
{
textViewInfo.setText(e.getMessage().toString());
e.printStackTrace();
}
catch (Exception e)
{
textViewInfo.setText(e.getMessage().toString());
e.printStackTrace();
}
try
{
HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);
if(httpResponse.getStatusLine().getStatusCode() == 200)
{
String strResult = EntityUtils.toString(httpResponse.getEntity());
textViewInfo.setText(strResult);
}
else
{
textViewInfo.setText(httpResponse.getStatusLine().toString());
}
}
catch (ClientProtocolException e)
{
textViewInfo.setText(e.getMessage().toString());
e.printStackTrace();
}
catch (IOException e)
{
textViewInfo.setText(e.getMessage().toString());
e.printStackTrace();
}
catch (Exception e)
{
textViewInfo.setText(e.getMessage().toString());
e.printStackTrace();
}
至于 POST 方式,与 GET 方式类似,只是将 HttpGet 类改为 HttpPost 类即可。不过,单单只有这些访问网络的代码还是不能真正的访问网络,还需要为你的程序设置访问网络的权限。此时就需要在 AndroidManifest.xml 文件中的<manifest>标签内加入下面的代码:
引用
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
这样,你的程序就能正常访问网络了。而在制作成的安装包apk在安装时,Android系统也会以红色的字提示你,此程序有完全访问网络的权限。
下面是演示程序的完整代码:
下载文件
在Ubuntu/Linux下做淘宝SDK模板开发
[
2011/05/03 16:45 | by 袁旭东 ]
2011/05/03 16:45 | by 袁旭东 ]
做淘宝SDK模板的开发,需要一个开发环境,这种开发环境有两个版本,一个是Windows安装版,另一个就是无Java压缩包版。前者当然只能用于Windows环境了,相信大多数淘宝SDK模板开发者使用的是此版本。而后者就是我们要在Linux下搭建开发环境的主角。
首先,我们下载SDK压缩包:
然后将压缩包解压到某个目录,比如解压到用户的根目录。这样,在用户根目录中就有了DC_SDK这个目录。进入到DC_SDK/bin中,编辑startServer.sh,将以下内容替换原有内容:
首先,我们下载SDK压缩包:
引用
http://download.taobaocdn.com/software/supershop/DC_SDK-1.1.5-WITHOUT-JRE.zip
然后将压缩包解压到某个目录,比如解压到用户的根目录。这样,在用户根目录中就有了DC_SDK这个目录。进入到DC_SDK/bin中,编辑startServer.sh,将以下内容替换原有内容:
nginx发布了1.0.0,终于正式版了
[
2011/04/21 09:41 | by 袁旭东 ]
2011/04/21 09:41 | by 袁旭东 ]
前两天就看到nginx官网发布了nginx升级到1.0.0的消息,并且还说,这是nginx诞生9年来首个正式版本。按理说,我们没有理由不升级。不过,我看了一下更新日志,其实nginx 1.0.0是nginx 0.9.7自然而然的产物(修复了少量bug,与0.9.6到0.9.7的升级没什么区别),并没有质的飞跃。而且,我是从nginx 0.9.x上降级到了nginx 0.7.x,因为我发现,nginx 0.9.x的效率要稍低于nginx 0.7.x(具体到我这里是nginx 0.7.68),所以,我想既然nginx 0.7.x效率高一些,并且到目前为止完全满足我的要求,最主要其一直稳定运行着,也就没有理由更换了。
我想,在nginx 0.7.x出现重大bug,并且没有后续补丁的话,我们才应该考虑升级到nginx的新版本。
我想,在nginx 0.7.x出现重大bug,并且没有后续补丁的话,我们才应该考虑升级到nginx的新版本。




