代码非原创,fix了bug,完善的还是需要再思量:
/**
* 通过拼接的方式构造请求内容,实现参数传输以及文件传输
* @param actionUrl
* @param params
* @param files
* @return
* @throws IOException
*/
public static String post(String actionUrl, Map<String, String> params,
Map<String, File> files) throws IOException {
String BOUNDARY = java.util.UUID.randomUUID().toString();
String PREFIX = "--" , LINEND = "\r\n";
String MULTIPART_FROM_DATA = "multipart/form-data";
String CHARSET = "UTF-8";
URL uri = new URL(actionUrl);
HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
conn.setReadTimeout(5 * 1000); // 缓存的最长时间
conn.setDoInput(true);// 允许输入
conn.setDoOutput(true);// 允许输出
conn.setUseCaches(false); // 不允许使用缓存
conn.setRequestMethod("POST");
conn.setRequestProperty("connection", "keep-alive");
conn.setRequestProperty("Charsert", "UTF-8");
conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY);
// 首先组拼文本类型的参数
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
sb.append(PREFIX);
sb.append(BOUNDARY);
sb.append(LINEND);
sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND);
sb.append("Content-Type: text/plain; charset=" + CHARSET+LINEND);
sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
sb.append(LINEND);
sb.append(entry.getValue());
sb.append(LINEND);
}
DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());
outStream.write(sb.toString().getBytes());
// 发送文件数据
if(files!=null){
int i = 0;
for (Map.Entry<String, File> file: files.entrySet()) {
StringBuilder sb1 = new StringBuilder();
sb1.append(PREFIX);
sb1.append(BOUNDARY);
sb1.append(LINEND);
sb1.append("Content-Disposition: form-data; name=\"file"+(i++)+"\"; filename=\""+file.getKey()+"\""+LINEND);
sb1.append("Content-Type: application/octet-stream; charset="+CHARSET+LINEND);
sb1.append(LINEND);
outStream.write(sb1.toString().getBytes());
InputStream is = new FileInputStream(file.getValue());
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
is.close();
outStream.write(LINEND.getBytes());
}
}
//请求结束标志
byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
outStream.write(end_data);
outStream.flush();
//得到响应码
int res = conn.getResponseCode();
InputStream in = null;
if (res == 200) {
in = conn.getInputStream();
int ch;
StringBuilder sb2 = new StringBuilder();
while ((ch = in.read()) != -1) {
sb2.append((char) ch);
}
}
return in == null ? null : in.toString();
}
* 通过拼接的方式构造请求内容,实现参数传输以及文件传输
* @param actionUrl
* @param params
* @param files
* @return
* @throws IOException
*/
public static String post(String actionUrl, Map<String, String> params,
Map<String, File> files) throws IOException {
String BOUNDARY = java.util.UUID.randomUUID().toString();
String PREFIX = "--" , LINEND = "\r\n";
String MULTIPART_FROM_DATA = "multipart/form-data";
String CHARSET = "UTF-8";
URL uri = new URL(actionUrl);
HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
conn.setReadTimeout(5 * 1000); // 缓存的最长时间
conn.setDoInput(true);// 允许输入
conn.setDoOutput(true);// 允许输出
conn.setUseCaches(false); // 不允许使用缓存
conn.setRequestMethod("POST");
conn.setRequestProperty("connection", "keep-alive");
conn.setRequestProperty("Charsert", "UTF-8");
conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY);
// 首先组拼文本类型的参数
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
sb.append(PREFIX);
sb.append(BOUNDARY);
sb.append(LINEND);
sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND);
sb.append("Content-Type: text/plain; charset=" + CHARSET+LINEND);
sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
sb.append(LINEND);
sb.append(entry.getValue());
sb.append(LINEND);
}
DataOutputStream outStream = new DataOutputStream(conn.getOutputStream());
outStream.write(sb.toString().getBytes());
// 发送文件数据
if(files!=null){
int i = 0;
for (Map.Entry<String, File> file: files.entrySet()) {
StringBuilder sb1 = new StringBuilder();
sb1.append(PREFIX);
sb1.append(BOUNDARY);
sb1.append(LINEND);
sb1.append("Content-Disposition: form-data; name=\"file"+(i++)+"\"; filename=\""+file.getKey()+"\""+LINEND);
sb1.append("Content-Type: application/octet-stream; charset="+CHARSET+LINEND);
sb1.append(LINEND);
outStream.write(sb1.toString().getBytes());
InputStream is = new FileInputStream(file.getValue());
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
is.close();
outStream.write(LINEND.getBytes());
}
}
//请求结束标志
byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
outStream.write(end_data);
outStream.flush();
//得到响应码
int res = conn.getResponseCode();
InputStream in = null;
if (res == 200) {
in = conn.getInputStream();
int ch;
StringBuilder sb2 = new StringBuilder();
while ((ch = in.read()) != -1) {
sb2.append((char) ch);
}
}
return in == null ? null : in.toString();
}
刚弄了个70-300的,特意跑公园逛逛,拍了几张感觉还是不错
不过光线不好就不太行了,平民镜头就是如此这般了。。抖了就不行啊

长焦拍细节很有优势

拍小鸟是个好工具

随便往草丛里一照,似乎也能出个相片,哎。。

叶子脉络清晰,锐度还是可以

拍小花很方便,背景一下子就糊了
不过光线不好就不太行了,平民镜头就是如此这般了。。抖了就不行啊
长焦拍细节很有优势
拍小鸟是个好工具
随便往草丛里一照,似乎也能出个相片,哎。。
叶子脉络清晰,锐度还是可以
拍小花很方便,背景一下子就糊了
主要是另外增加一个HOST节点即可,便捷的查找方式:
找到以下节点
在前面加上:
name 是域名,appBase是根目录
日志选项也可以定义。
找到以下节点
</Engine>
在前面加上:
<Host name="www.aslibra.com" debug="0" appBase="/home/jsp/www.aslibra.com" unpackWARs="true" autoDeploy="true">
<Context path="" docBase="."/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="aslibra_access_log."
suffix=".txt" pattern="common" resolveHosts="false"/>
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="aslibra_log." suffix=".txt" timestamp="true"/>
</Host>
<Context path="" docBase="."/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="aslibra_access_log."
suffix=".txt" pattern="common" resolveHosts="false"/>
<Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="aslibra_log." suffix=".txt" timestamp="true"/>
</Host>
name 是域名,appBase是根目录
日志选项也可以定义。
Android崛起 Google未必
引用
基于Linux的Google手机平台Android正在全球范围内快速扩张。最近的报告显示,在手机互联网用户众多、商业增长潜力巨大的中国,Android有望成为主导的手机操作系统。
乍一看,这无疑是Google的胜利,然而情况并不如此简单。这里有很重要的一点,就是理解中国手机市场的状况——他们在制造自己的Android变体Ophone。这个平台架空了Google中间者的身份。传统上Google用来执行平台控制的许可政策以及技术机制,都被Ophone提供给手机生产商和使用者的自治权绕过了。
像大多数基于Linux的手机平台一样,Android并非完全开源。它的核心操作系统包含GPL授权的Linux内核以及Apache授权的中间设备和用户空间堆栈。平台高层的几个关键部分——尤其是Android市场(下载应用程序之地——译注)和几个Google品牌的软件是有专利的。设备制造者如果需要在自己产品中包含以上部分,需要得到Google的软件商业许可。
。。。
实际上,OPhone背后的公司和其他定制版在扩大其份额的过程中,也可能为Google自己的代码库(甚至是上游的Linux内核本身)的改进作出贡献。Google决定使用更自由的Apache许可证就意味着OPhone开发者不必公开自己用户空间的改进,不过开发者会想得到上游代码,减少对维护的担忧。
随着中国移动互联网用户的增长,我们可以看到,Android日渐成为焦点,并在塑造这个国家移动科技方面扮演了重要角色。在中国,Android注定是要普及的,但发号施令的,明显不会是Google。
乍一看,这无疑是Google的胜利,然而情况并不如此简单。这里有很重要的一点,就是理解中国手机市场的状况——他们在制造自己的Android变体Ophone。这个平台架空了Google中间者的身份。传统上Google用来执行平台控制的许可政策以及技术机制,都被Ophone提供给手机生产商和使用者的自治权绕过了。
像大多数基于Linux的手机平台一样,Android并非完全开源。它的核心操作系统包含GPL授权的Linux内核以及Apache授权的中间设备和用户空间堆栈。平台高层的几个关键部分——尤其是Android市场(下载应用程序之地——译注)和几个Google品牌的软件是有专利的。设备制造者如果需要在自己产品中包含以上部分,需要得到Google的软件商业许可。
。。。
实际上,OPhone背后的公司和其他定制版在扩大其份额的过程中,也可能为Google自己的代码库(甚至是上游的Linux内核本身)的改进作出贡献。Google决定使用更自由的Apache许可证就意味着OPhone开发者不必公开自己用户空间的改进,不过开发者会想得到上游代码,减少对维护的担忧。
随着中国移动互联网用户的增长,我们可以看到,Android日渐成为焦点,并在塑造这个国家移动科技方面扮演了重要角色。在中国,Android注定是要普及的,但发号施令的,明显不会是Google。
Dnsmasq是一个很实用的小工具,解决局域网的需求看来非常合适,特别是网关和防火墙上。
它可以提供如下几个实用的功能:
1 提供dns服务
2 优先使用本地自定义dns
3 提供dhcp服务
一般情况下,我们可以用bind解决dns的问题,dhcpd解决dhcp的问题,另外,还可以用ypbind解决自定义hostname解析的ip(当然还有用户的功能),它都解决了!很实用吧?这真的很吸引人,况且它一直在更新维护,最新版本是6月份的。
安装过程很简单:
运行起来就可以解决第一个问题:
默认情况下,作为dns服务,第一个问题解决了。
我们尝试解决第二个问题,可以说是dns劫持?没有那么严重,用好了其实很实用。
有如下几个问题比较棘手:
1 局域网有很多机器希望使用一份一样的hosts定义一批名称对应的ip,你需要经常维护这份列表
2 你希望局域网的人访问某个域名时,拦截下来到指定的ip,做缓存节省带宽或者其它用途都可以
3 禁止某个域名的正常解析
这个更改涉及两个文件:
1 /etc/hosts
2 /etc/dnsmasq.conf
我们先在hosts文件里加入两行:
编辑dnsmasq.conf,找到如下代码:
重启dnsmasq即可,下面我们在局域网另外一个机器用dig命令测试一下:
它可以提供如下几个实用的功能:
1 提供dns服务
2 优先使用本地自定义dns
3 提供dhcp服务
一般情况下,我们可以用bind解决dns的问题,dhcpd解决dhcp的问题,另外,还可以用ypbind解决自定义hostname解析的ip(当然还有用户的功能),它都解决了!很实用吧?这真的很吸引人,况且它一直在更新维护,最新版本是6月份的。
安装过程很简单:
wget http://www.thekelleys.org.uk/dnsmasq/dnsmasq-2.55.tar.gz
tar xfz dnsmasq-2.55.tar.gz
cd dnsmasq-2.55
make
make install
cp dnsmasq.conf.example /etc/dnsmasq.conf
tar xfz dnsmasq-2.55.tar.gz
cd dnsmasq-2.55
make
make install
cp dnsmasq.conf.example /etc/dnsmasq.conf
运行起来就可以解决第一个问题:
[root@aslibra dnsmasq-2.55]# dnsmasq
[root@aslibra dnsmasq-2.55]# netstat -nlp|grep dnsmasq
tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN 25584/dnsmasq
tcp 0 0 :::53 :::* LISTEN 25584/dnsmasq
udp 0 0 0.0.0.0:53 0.0.0.0:* 25584/dnsmasq
udp 0 0 :::53 :::* 25584/dnsmasq
[root@aslibra dnsmasq-2.55]# netstat -nlp|grep dnsmasq
tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN 25584/dnsmasq
tcp 0 0 :::53 :::* LISTEN 25584/dnsmasq
udp 0 0 0.0.0.0:53 0.0.0.0:* 25584/dnsmasq
udp 0 0 :::53 :::* 25584/dnsmasq
默认情况下,作为dns服务,第一个问题解决了。
我们尝试解决第二个问题,可以说是dns劫持?没有那么严重,用好了其实很实用。
有如下几个问题比较棘手:
1 局域网有很多机器希望使用一份一样的hosts定义一批名称对应的ip,你需要经常维护这份列表
2 你希望局域网的人访问某个域名时,拦截下来到指定的ip,做缓存节省带宽或者其它用途都可以
3 禁止某个域名的正常解析
这个更改涉及两个文件:
1 /etc/hosts
2 /etc/dnsmasq.conf
我们先在hosts文件里加入两行:
192.168.1.3 server1
192.168.1.2 www.aslibra.com
192.168.1.2 www.aslibra.com
编辑dnsmasq.conf,找到如下代码:
# Add local-only domains here, queries in these domains are answered
# from /etc/hosts or DHCP only.
local=/localnet/
# Add domains which you want to force to an IP address here.
# The example below send any host in doubleclick.net to a local
# webserver.
#address=/doubleclick.net/127.0.0.1
address=/baidu.com/127.0.0.1
# from /etc/hosts or DHCP only.
local=/localnet/
# Add domains which you want to force to an IP address here.
# The example below send any host in doubleclick.net to a local
# webserver.
#address=/doubleclick.net/127.0.0.1
address=/baidu.com/127.0.0.1
重启dnsmasq即可,下面我们在局域网另外一个机器用dig命令测试一下:
目的:对某些用户进行登录ip限制
proftp配置:
限制以下两个用户只能从某两个ip段登录
默认情况下proftp没有这个模块,会提示出错:
从源码编译,可以选择编译进来的,比如可以类似这样:
参考:http://blog.chinaunix.net/u/6098/showart_237162.html
proftp配置:
限制以下两个用户只能从某两个ip段登录
<IfUser user1 user2>
<Limit LOGIN>
Order allow,deny
Allow from 1.2.3.0/24 2.3.4.0/24
DenyAll
</Limit>
</IfUser>
<Limit LOGIN>
Order allow,deny
Allow from 1.2.3.0/24 2.3.4.0/24
DenyAll
</Limit>
</IfUser>
默认情况下proftp没有这个模块,会提示出错:
Checking syntax of configuration file
- Fatal: unknown configuration directive '<IfUser>' on line 24 of '/Data/apps/proftpd/etc/proftpd.conf'
- Fatal: unknown configuration directive '<IfUser>' on line 24 of '/Data/apps/proftpd/etc/proftpd.conf'
从源码编译,可以选择编译进来的,比如可以类似这样:
./configure --prefix=/Data/apps/proftpd \
--enable-shadow \
--enable-autoshadow \
--with-modules=mod_ratio:mod_readme:mod_wrap:mod_ifsession \
&& make && make install
--enable-shadow \
--enable-autoshadow \
--with-modules=mod_ratio:mod_readme:mod_wrap:mod_ifsession \
&& make && make install
参考:http://blog.chinaunix.net/u/6098/showart_237162.html






