Java 搞了些怪名词
JavaBean 对应 Windows COM 就是一种 dll 规范,在 web 中就是一个数据库表的字段对应一个类,在窗口应用程序中可能是一个控件,是用来标明一类事物。
EJB 对应 Windows COM+/DCOM 已经没人用了,现在都在用 web service
DAO 数据访问对象,就是一个类,里边处理数据库操作
MVC
model 就是 javabean 类型的类,一个数据库表的字段对应一个类。
view 就是网页模板,可以用 jsp 实现,也可以用 freemarker 实现,freemarker 好理解,好书写
controller 就是 servlet 用来,处理请求数据,调用DAO增删改查,输送返回数据,以及这些操作的 if else
java web 开发就简单了,
1. eclipse with javaee
2. tomcat
3. servlet => dao => model => freemaker
完事
java 没必要,php 本来就能做好,money
2016年12月17日星期六
2016年12月14日星期三
SSL TLS 客户端和服务器
SSLv3 TLSv1 TLSv1.1 TLSv1.2
服务器端
nginx 的 ssl/tls支持依赖于 openssl 库
centos5 => openssl/0.9.8e =>SSLv3 TLSv1
centos6 => openssl/1.0.1e =>SSLv3 TLSv1 TLSv1.1 TLSv1.2
centos5 可以通过升级 epel openssl 库到 1.0.1e 来让 nginx 支持 TLSv1.1 和 TLSv1.2
客户端
XP SP2 不支持 sha256 的证书
若要支持 XP SP2,需要 sha1 的证书
IE6 只支持 SSLv3
https://en.wikipedia.org/wiki/Template:TLS/SSL_support_history_of_web_browsers
nginx 1.9.1 以后默认没有开启 SSLv3
http://nginx.org/en/docs/http/configuring_https_servers.html
这样,若要让 nginx 1.9.1 支持 IE6 需要配置打开 SSLv3 支持
服务器端
nginx 的 ssl/tls支持依赖于 openssl 库
centos5 => openssl/0.9.8e =>SSLv3 TLSv1
centos6 => openssl/1.0.1e =>SSLv3 TLSv1 TLSv1.1 TLSv1.2
centos5 可以通过升级 epel openssl 库到 1.0.1e 来让 nginx 支持 TLSv1.1 和 TLSv1.2
客户端
XP SP2 不支持 sha256 的证书
若要支持 XP SP2,需要 sha1 的证书
IE6 只支持 SSLv3
https://en.wikipedia.org/wiki/Template:TLS/SSL_support_history_of_web_browsers
nginx 1.9.1 以后默认没有开启 SSLv3
http://nginx.org/en/docs/http/configuring_https_servers.html
这样,若要让 nginx 1.9.1 支持 IE6 需要配置打开 SSLv3 支持
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
加密算法支持
XP ie6/7/8 只支持 RC4 不支持 AES
https://github.com/client9/sslassert/wiki/IE-Supported-Cipher-Suites
2016年12月9日星期五
正则表达式 Unicode
http://www.regular-expressions.info/unicode.html
Perl, PCRE, Boost, and std::regex do not support the \uFFFF syntax. They use \x{FFFF} instead. You can omit leading zeros in the hexadecimal number between the curly braces. Since \x by itself is not a valid regex token, \x{1234} can never be confused to match \x 1234 times. It always matches the Unicode code point U+1234. \x{1234}{5678} will try to match code point U+1234 exactly 5678 times.
In Java, the regex token \uFFFF only matches the specified code point, even when you turned on canonical equivalence. However, the same syntax \uFFFF is also used to insert Unicode characters into literal strings in the Java source code. Pattern.compile("\u00E0") will match both the single-code-point and double-code-point encodings of à, while Pattern.compile("\\u00E0") matches only the single-code-point version. Remember that when writing a regex as a Java string literal, backslashes must be escaped. The former Java code compiles the regex à, while the latter compiles \u00E0. Depending on what you're doing, the difference may be significant.
JavaScript, which does not offer any Unicode support through its RegExp class, does support \uFFFF for matching a single Unicode code point as part of its string syntax.
squid zero sized reply
squid zero sized reply
squid 默认回源是持久连接
http://www.squid-cache.org/Doc/config/server_persistent_connections/
当回源持久连接超时或网络中断的时候会出现这个问题
如果回源改为非持久链接,会增大 squid 的 TIME_WAIT 数量,造成端口耗尽。
squid 回源与源服务器之间持久连接和 TIME_WAIT 关系
http://serverfault.com/questions/639521/relationship-between-tcp-state-time-wait-http-keep-alive
squid 默认回源是持久连接
http://www.squid-cache.org/Doc/config/server_persistent_connections/
当回源持久连接超时或网络中断的时候会出现这个问题
如果回源改为非持久链接,会增大 squid 的 TIME_WAIT 数量,造成端口耗尽。
squid 回源与源服务器之间持久连接和 TIME_WAIT 关系
http://serverfault.com/questions/639521/relationship-between-tcp-state-time-wait-http-keep-alive
2016年12月7日星期三
2016年12月5日星期一
windows 和 linux 大并发,避免端口耗尽
1.windows
参考:https://msdn.microsoft.com/zh-cn/library/aa560610(v=bts.10).aspx
1)
增加动态分配到客户端 TCP/IP 套接字连接的临时端口的上限。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
在“编辑”菜单中单击“新建”、“DWORD 值”,然后添加以下注册表值,以增加可以动态分配到客户端的临时端口的数量:
值名称
MaxUserPort
值数据
<在此输入一个 5000 到 65534 之间的十进制值>
2)
降低客户端 TCP/IP 套接字连接的超时值(默认值为 240 秒)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
在“编辑”菜单中单击“新建”、“DWORD 值”,然后添加以下注册表值,以缩短关闭连接时,该连接处于 TIME_WAIT 状态的时间。当连接处于 TIME_WAIT 状态时,套接字对无法重新使用:
值名称
TcpTimedWaitDelay
值数据
<在此输入一个 30 到 240 之间的十进制值。>
2.linux
1) 更改打开端口范围
net.ipv4.ip_local_port_range = 1024 65000
2)修改内核中 timewait 参数
重新编译内核,参考
https://wiki.centos.org/zh/HowTos/I_need_the_Kernel_Source
这样就解压缩了内核包
修改源代码
$KERNEL/include/net/tcp.h
#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT
TCP_TIMEWAIT_LEN 取值范围参考
https://mailman.nanog.org/pipermail/nanog/2012-December/054013.html
"There seems to be consensus around 20 seconds being safe, 15 being a
99% OK, and 10 or less being problematic."
修改后,进入内核源代码目录
make rpm
制作 rpm 包
参考:https://msdn.microsoft.com/zh-cn/library/aa560610(v=bts.10).aspx
1)
增加动态分配到客户端 TCP/IP 套接字连接的临时端口的上限。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
在“编辑”菜单中单击“新建”、“DWORD 值”,然后添加以下注册表值,以增加可以动态分配到客户端的临时端口的数量:
值名称
MaxUserPort
值数据
<在此输入一个 5000 到 65534 之间的十进制值>
2)
降低客户端 TCP/IP 套接字连接的超时值(默认值为 240 秒)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
在“编辑”菜单中单击“新建”、“DWORD 值”,然后添加以下注册表值,以缩短关闭连接时,该连接处于 TIME_WAIT 状态的时间。当连接处于 TIME_WAIT 状态时,套接字对无法重新使用:
值名称
TcpTimedWaitDelay
值数据
<在此输入一个 30 到 240 之间的十进制值。>
2.linux
1) 更改打开端口范围
net.ipv4.ip_local_port_range = 1024 65000
2)修改内核中 timewait 参数
重新编译内核,参考
https://wiki.centos.org/zh/HowTos/I_need_the_Kernel_Source
这样就解压缩了内核包
修改源代码
$KERNEL/include/net/tcp.h
#define TCP_TIMEWAIT_LEN (60*HZ) /* how long to wait to destroy TIME-WAIT
TCP_TIMEWAIT_LEN 取值范围参考
https://mailman.nanog.org/pipermail/nanog/2012-December/054013.html
"There seems to be consensus around 20 seconds being safe, 15 being a
99% OK, and 10 or less being problematic."
修改后,进入内核源代码目录
make rpm
制作 rpm 包
2016年11月20日星期日
中介的两边都是钱
受众 -> 中国好声音广告 -> 华为手机 -> 零件供应商
| -> 工人工资
| -> 广告费用
| -> 卖出受众
--> 演员
--> 评委
--> 场地...
广告效应和商业效应
| -> 工人工资
| -> 广告费用
| -> 卖出受众
--> 演员
--> 评委
--> 场地...
广告效应和商业效应
php sockets, pthreads, parse binary
sockets:
$fp = fsockopen('www,baidu.com', 80, $errno, $errstr, 30);
//$fp = stream_socket_client('tcp://www.baidu.com:80', $errno, $errstr);
if(!$fp) {
echo "{$errno}, {$errstr}\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.baidu.com\r\n";
$out .= "Connection: close\r\n\r\n";
fwrite($fp, $out);
$out = '';
while(!feof($fp)) {
$out .= fread($fp, 1024);
}
fclose($fp);
}
-----------------------------------------------------------------------
pthreads:
class T1 extends Thread {
function run() {
while(1) {
echo "T1\n";
sleep(1);
}
}
}
$t1 = new T1();
$t1->start();
$t1->join();
while(1) {
echo "T2\n";
sleep(1);
}
------------------------------------------------------------------------
parse binary
pack & unpack function
《PHP: 深入pack/unpack》
https://my.oschina.net/goal/blog/195749
$fp = fsockopen('1.1.1.1', 4661, $errno, $errstr, 30);
if(!$fp) {
echo "{$errno}, {$errstr}\n";
} else {
// login
$protocol_type = pack('C', 0xE3);
$message_type = pack('C', 0x01);
$user_hash = md5('abc', true);
$client_id = pack('V', 0);
$tcp_port = pack('v', 4661);
$tag_count = pack('V', 4);
$tag_name = pack('CvCva20', 0x02, 1, 0x01, 20, 'http://www.amule.org');
$tag_version = pack('CvCV', 0x03, 1, 0x11, 60);
$tag_port = pack('CvCV', 0x03, 1, 0x20, 285);
$tag_id = pack('CvCV', 0x03, 1, 0xfb, 50596992);
$message_body = $message_type . $user_hash . $client_id . $tcp_port . $tag_count . $tag_name . $tag_version . $tag_port . $tag_id;
$message_size = pack('V', strlen($message_body));
$message_header = $protocol_type . $message_size;
$message = $message_header . $message_body;
fwrite($fp, $message);
// server message
$out = '';
$out = fread($fp, 8);
$l = strlen($out);
$out = unpack('H2protocal_type/Vmessage_size/H2message_type/vstring_length', $out);
$out = fread($fp, $out['string_length']);
fclose($fp);
}
$fp = fsockopen('www,baidu.com', 80, $errno, $errstr, 30);
//$fp = stream_socket_client('tcp://www.baidu.com:80', $errno, $errstr);
if(!$fp) {
echo "{$errno}, {$errstr}\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.baidu.com\r\n";
$out .= "Connection: close\r\n\r\n";
fwrite($fp, $out);
$out = '';
while(!feof($fp)) {
$out .= fread($fp, 1024);
}
fclose($fp);
}
-----------------------------------------------------------------------
pthreads:
class T1 extends Thread {
function run() {
while(1) {
echo "T1\n";
sleep(1);
}
}
}
$t1 = new T1();
$t1->start();
$t1->join();
while(1) {
echo "T2\n";
sleep(1);
}
------------------------------------------------------------------------
parse binary
pack & unpack function
《PHP: 深入pack/unpack》
https://my.oschina.net/goal/blog/195749
$fp = fsockopen('1.1.1.1', 4661, $errno, $errstr, 30);
if(!$fp) {
echo "{$errno}, {$errstr}\n";
} else {
// login
$protocol_type = pack('C', 0xE3);
$message_type = pack('C', 0x01);
$user_hash = md5('abc', true);
$client_id = pack('V', 0);
$tcp_port = pack('v', 4661);
$tag_count = pack('V', 4);
$tag_name = pack('CvCva20', 0x02, 1, 0x01, 20, 'http://www.amule.org');
$tag_version = pack('CvCV', 0x03, 1, 0x11, 60);
$tag_port = pack('CvCV', 0x03, 1, 0x20, 285);
$tag_id = pack('CvCV', 0x03, 1, 0xfb, 50596992);
$message_body = $message_type . $user_hash . $client_id . $tcp_port . $tag_count . $tag_name . $tag_version . $tag_port . $tag_id;
$message_size = pack('V', strlen($message_body));
$message_header = $protocol_type . $message_size;
$message = $message_header . $message_body;
fwrite($fp, $message);
// server message
$out = '';
$out = fread($fp, 8);
$l = strlen($out);
$out = unpack('H2protocal_type/Vmessage_size/H2message_type/vstring_length', $out);
$out = fread($fp, $out['string_length']);
fclose($fp);
}
2016年11月16日星期三
C/C++ '\0' 空字符
https://zh.wikipedia.org/wiki/%E7%A9%BA%E5%AD%97%E7%AC%A6
malloc 字符串,需要多加一个字符 \0
malloc 二进制数据,不需要加 \0
字符串需要 \0
二进制数据不需要 \0
malloc 字符串,需要多加一个字符 \0
malloc 二进制数据,不需要加 \0
字符串需要 \0
二进制数据不需要 \0
2016年11月4日星期五
windows dmg 转换为 iso
1. 下载 dmg2img 工具
2. dmg2img -l xxx.dmg 列出 dmg 中的所有分区
3. dmg2img -p N xxx.dmg xxx.iso 将 Apple HFS+ 所在的分区导出 iso
2. dmg2img -l xxx.dmg 列出 dmg 中的所有分区
3. dmg2img -p N xxx.dmg xxx.iso 将 Apple HFS+ 所在的分区导出 iso
2016年10月27日星期四
CentOS 6 服务列表
[root@localhost ~]# chkconfig --list | grep 3:on
blk-availability 0:off 1:on 2:on 3:on 4:on 5:on 6:off
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
httpd 0:off 1:off 2:off 3:on 4:off 5:on 6:off
ip6tables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
pureftpd 0:off 1:off 2:off 3:on 4:off 5:on 6:off
rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
udev-post 0:off 1:on 2:on 3:on 4:on 5:on 6:off
blk-availability 0:off 1:on 2:on 3:on 4:on 5:on 6:off
crond 0:off 1:off 2:on 3:on 4:on 5:on 6:off
httpd 0:off 1:off 2:off 3:on 4:off 5:on 6:off
ip6tables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
pureftpd 0:off 1:off 2:off 3:on 4:off 5:on 6:off
rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
udev-post 0:off 1:on 2:on 3:on 4:on 5:on 6:off
新建窗口并刷新当前窗口代码
<a href="http://www.baidu.com/" target="_blank" id="dianwo">点我</a>
<script type="text/javascript"> var oDianWo = document.getElementById("dianwo"); oDianWo.onclick = function() { var szOldURL = oDianWo.href; oDianWo.href = "http://www.sogou.com/"; window.location.href = szOldURL; return true; }; </script> |
Linux用DD命令测试磁盘读写速度(转)
当然这篇文章是写给我这种小白的,高手请绕路!dd是Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换,所以可以用来测试硬盘的读写能力~
下面直接介绍几种常见的DD命令,先看一下他的区别~
dd bs=64k count=4k if=/dev/zero of=test
dd bs=64k count=4k if=/dev/zero of=test; sync
dd bs=64k count=4k if=/dev/zero of=test conv=fdatasync
dd bs=64k count=4k if=/dev/zero of=test oflag=dsync
这四条DD命令区别在于内存中写缓存的处理方式。
1.
dd bs=64k count=4k if=/dev/zero of=test
没有加任何参数,dd默认的方式不包括“同步(sync)”命令。也就是说,dd命令完成前并没有让系统真正把文件写到磁盘上。所以以上命令只是单纯地把这128MB的数据读到内存缓冲当中(写缓存[write cache])。所以你得到的将是一个超级快的速度。因为其实dd给你的只是读取速度,直到dd完成后系统才开始真正往磁盘上写数据,但这个速度你是看不到了。所以如果这个速度很快,没有什么作用。
实际运行结果:
268435456 bytes (268 MB) copied, 1.3529 seconds, 198 MB/s
2.
dd bs=64k count=4k if=/dev/zero of=test; sync
和前面1中的完全一样。分号隔开的只是先后两个独立的命令。当sync命令准备开始往磁盘上真正写入数据的时候,前面dd命令已经把错误的“写入速度”值显示在屏幕上了。所以你还是得不到真正的写入速度。
实际运行结果:
268435456 bytes (268 MB) copied, 0.522815 seconds, 513 MB/s
3.
dd bs=64k count=4k if=/dev/zero of=test conv=fdatasync
加入这个参数后,dd命令执行到最后会真正执行一次“同步(sync)”操作,所以这时候你得到的是读取这128M数据到内存并写入到磁盘上所需的时间,这样算出来的时间才是比较符合实际使用结果的。
实际运行结果:
268435456 bytes (268 MB) copied, 2.8046 seconds, 95.7 MB/s
4.
dd bs=64k count=4k if=/dev/zero of=test oflag=dsync
加入这个参数后,dd在执行时每次都会进行同步写入操作。也就是说,这条命令每次读取64k后就要先把这64k写入磁盘,然后再读取下面这64k,一共重复128次。这可能是最慢的一种方式了,因为基本上没有用到写缓存(write cache)。
实际运行结果:
268435456 bytes (268 MB) copied, 3.40069 seconds, 78.9 MB/s
一般来说,第四种方法是最严格的,可以模拟数据库的插入操作,所以很慢,也是用来测试vps硬盘性能标准的一条标杆,一般来说测试结果,如果超过10M,对正常建站就无影响。超过50M,就是非常给力状态,看了这个vps硬盘性能非常的好,DD速度达到了78.9MB/s。
在这几条命令中,bs=64k表示同时读入/输出的块大小为64k个字节,count=4k表示拷贝块的个数为4000个,如果测试再严格一点,我们运行1G数据量的DD:
dd if=/dev/zero of=test bs=64k count=16k oflag=dsync
表示每个块大小为64k个字节,测试16k个数量的块,实际测试结果:
1073741824 bytes (1.1 GB) copied, 18.9098 seconds, 56.8 MB/s
写到这里,我觉得利用DD命令测试硬盘应该很清楚了,通常我们测试用第四条命令即可,当然DD越快并不能代表服务器的性能好坏,普通硬盘的服务器执行DD命令结果在30M左右就不错了,另外,执行DD命令测试硬盘IO性能,对硬盘的损害很大,不建议多次或长时间尝试!
vmware 磁盘灯狂闪
关闭 windows 页文件
MemTrimRate = 0
MemTrimRate = 0
sched.mem.pshare.enable = "FALSE"
mainMem.useNamedFile = "FALSE"
在 VMX 中添加这几项
- 禁止内存整理
- 禁止虚拟机互相分享内存
- 禁止使用内存交换文件(狂闪的原因)
centos 恢复 grub mbr
1. linux rescue 引导, continue 挂载 sysimage 分区
2. chroot /mnt/sysimage 进入 /
3. grub
root (hd0,0) // 含有 /boot 内容的分区
setup (hd0) // 安装到第一块盘的mbr
4. mkinitrd xxx xxx // 更新启动内核驱动
2. chroot /mnt/sysimage 进入 /
3. grub
root (hd0,0) // 含有 /boot 内容的分区
setup (hd0) // 安装到第一块盘的mbr
4. mkinitrd xxx xxx // 更新启动内核驱动
ovftool 复制 vmware esxi 虚拟机
1. 关闭要复制的虚拟机
2. ovftool --overwrite -dm=thin -ds=datastore1 vi://192.168.1.1/centos5 vi://192.168.1.2/
3. ovftool 是中介,所有流量都会通过 ovftool 所在的操作系统网卡
4. 导出 ovf 文件
ovftool --overwrite -dm=thin -ds=datastore1 vi://192.168.1.1/centos5 out.ovf
2. ovftool --overwrite -dm=thin -ds=datastore1 vi://192.168.1.1/centos5 vi://192.168.1.2/
3. ovftool 是中介,所有流量都会通过 ovftool 所在的操作系统网卡
4. 导出 ovf 文件
ovftool --overwrite -dm=thin -ds=datastore1 vi://192.168.1.1/centos5 out.ovf
订阅:
评论 (Atom)