2016年12月17日星期六

Java Servlet/JavaBean/EJB/DAO/MVC 的简单说明

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月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 支持
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

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 包



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);
}

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

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

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

新建窗口并刷新当前窗口代码

<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性能,对硬盘的损害很大,不建议多次或长时间尝试!

centos raid1 恢复

  1. 先 wipe 新盘,成为 MSDOS label
  2. 建立一个 Linux RAID 分区,分区号 fd
  3. 把这个 Linux RAID 分区添加到阵列中

CentOS 网卡 IRQ 软中断问题

将网卡的 IRQ 绑定到每个 CPU 核上
cat /proc/interrupt

vmware 磁盘灯狂闪

关闭 windows 页文件

MemTrimRate = 0
sched.mem.pshare.enable = "FALSE"
mainMem.useNamedFile = "FALSE"

在 VMX 中添加这几项
  1. 禁止内存整理
  2. 禁止虚拟机互相分享内存
  3. 禁止使用内存交换文件(狂闪的原因)

url 编码

1. 网址 url 编码,除了 _-. 用 rawurlencode
2. query string 编码,除了 _-.空格,用 urlencode

linux 下文件去重复和切割

cat file.txt | sort | uniq > uniq.txt
split -l 50000 uniq.txt

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 // 更新启动内核驱动

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