<< 五月 2015 | 首页 | 七月 2015 >>

使用lsof处理文件恢复、句柄以及空间释放问题 - SegmentFault

曾经在生产上遇到过一个df 和 du出现的结果不一致的问题,为了排查到底是哪个进程占用了文件句柄,导致空间未释放,首先在linux上面,一切皆文件,这个问题可以使用lsof这个BT的命令来处理(这个哈还可以来查询文件句柄泄露问题,应用程序的进程未关闭文件句柄)

1.文件句柄以及空间释放问题

  • 注:在生产环境常见的问题就是,有维护人员或者开发同事使用tail命令实时查看日志。然后另外的人使用rm命令删除,这有就好导致磁盘空间不会真正的释放,因为你要删除的文件,还有进程在使用,文件句柄没有释放,即tail

模拟场景1:

你创建一个文件testfile

touch testfile 

然后使用tail命令一直查看

tail testfile 

这个时候另外一个同事使用rm命令来删除了该文件

rm testfile 

正式使用lsof命令排查

如果你知道文件名,那就可以直接使用如下命令

lsof |grep  testfile 

但是如果你不知道是哪个文件,或者是很多文件都有这样的情况,那你需要使用如下命令

lsof |grep deleted 注:这个deleted表示该已经删除了的文件,但是文件句柄未释放,这个命令会把所有的未释放文件句柄的进程列出来 

注:有些系统你没有配置环境变量的话,直接lsof是会报错没有该命令,你可以直接/usr/bin/lsof 或者是/usr/sbin/lsof,根据你的系统环境自己查看

然后上面命令出来的结果会出来如下结果

root 123 12244 0 14:47 pts/1 01:02:03  tail testfile 

然后你可以使用kill 命令来释放文件句柄从而释放空间

kill 123 

2. 文件恢复问题

在说明问题之前,先介绍下一些文件的基本概念:

  • 文件实际上是一个指向inode的链接, inode链接包含了文件的所有属性, 比如权限和所有者, 数据块地址(文件存储在磁盘的这些数据块中). 当你删除(rm)一个文件, 实际删除了指向inode的链接, 并没有删除inode的内容. 进程可能还在使用. 只有当inode的所有链接完全移去, 然后这些数据块将可以写入新的数据.
  • proc文件系统可以协助我们恢复数据. 每一个系统上的进程在/proc都有一个目录和自己的名字, 里面包含了一个fd(文件描述符)子目录(进程需要打开文件的所有链接). 如果从文件系统中删除一个文件, 此处还有一个inode的引用:
/proc/进程号/fd/文件描述符 
  • 你需要知道打开文件的进程号(pid)和文件描述符(fd). 这些都可以通过lsof工具方便获得, lsof的意思是”list open files, 列出(进程)打开的文件”. 然后你将可以从/proc拷贝出需要恢复的数据.

1.创建一个测试文件并且备份下,方面后续验证

touch testfile cp testfile testfile.backup.2014 

2.查看文件的相关信息

stat testfile  File: 'testfile' Size: 343545 Blocks: 241 IO Block: 4096 regular file Device: fd00h/64768d Inode: 361579 Links: 1 Access: (0664/-rw-rw-r–) Uid: ( 505/ zhaoke) Gid: ( 505/ zhaoke) Access: 2014-11-09 15:00:38.000000000 +0800 Modify: 2014-11-09 15:00:34.000000000 +0800 Change: 2014-04-09 15:00:34.000000000 +0800  

没问题, 继续下面工作:

3.删除文件

rm testfile  

4.查看文件

ls -l testfile ls: testfile: No such file or directory 
stat testfile stat: cannot stat 'testfile': No such file or directory 

testfile文件删除了,但不要终止仍在使用文件的进程, 因为一旦终止, 文件将很难恢复.

现在我们开始找回数据之旅,先使用lsof命令查看下

lsof | grep testfile tail 5317 root 4r REG 253,0 343545  361579  /root/testfile (deleted) 
  • 第一个纵行是进程的名称(命令名), 第二纵行是进程号(PID), 第四纵行是文件描述符

  • 现在你知道5317进程仍有打开文件, 文件描述符是4. 那我们开始从/proc里面拷贝出数据.

  • 你可能会考虑使用cp -a, 但实际上没有作用, 你将拷贝的是一个指向被删除文件的符号链接:

ls -l /proc/5317/fd/4 lr-x—— 1 root root 64  09 15:00 /proc/5317/fd/4 -> /root/testfile (deleted) 

使用cp -a命令测试恢复

 cp -a /proc/5317/fd/4 testfile.backup 

使用ls命令来查看


ls -l testfile.backup lrwxrwxrwx 1 root root 29 09 15:02 testfile.backup -> /roor/testfile (deleted)

通过上面的命令我们发现,使用cp -a命令,其恢复的是一个指向被删除文件的符号链接

使用file命令分别查看文件和文件描述符

  • 1.查看文件
file testfile.backup testfile.backup: broken symbolic link to '/root/testfile (deleted)' 
  • 2.查看文件描述符
file /proc/5317/fd/4  /proc/5317/fd/4: broken symbolic link to '/root/myfile (deleted)' 

根据上面的file结果,可以使用cp拷贝出文件描述符数据到一个文件中,如下:

cp /proc/5317/fd/4 testfile.new 

使用上面的命令恢复后,我们需要最终确认一下文件是否恢复,以及文件内容是否正确:

 ls -l testfile.new 

然后把新旧的两个文件对比

diff testfile.new myfile.backup

阅读全文……

标签 : ,

Linux服务器中高负载现象故障排查指南 - 51CTO.COM

技术支持分析师们常常接到用户对服务器高负载的控诉。事实上cPanel软件及其安装的应用很少引发服务器高负载情况。服务器拥有者、系统管理员或者服务器供应商应当对高负载状况进行初步调查,并在确认情况复杂后再向分析人士求助。

服务器高负载因何而起?

下列项目的过度使用会直接导致高负载问题:

  • CPU
  • 内存(包括虚拟内存)
  • 磁盘I/O

该如何检查这些项目?

这取决于大家是要审查当前资源使用情况还是历史资源使用情况。当然,在本文中我们将从这两方面进行探讨。

关于sar的简要说明

历史资源使用情况可通过sar工具查看,该工具在默认情况下应该通过sysstat软件包安装在所有cPanel服务器当中。只要通过cron命令对sysstat进行周期性执行(/etc/cron.d/sysstat),服务器的运行状态数据就会被收集起来。如果cron没有运行,sysstat将无法收集历史统计结果。

要在sar中查看历史资源使用情况,我们必须为文件提供与统计数据相符的路径。

举例来说,如果大家打算查看本月23号以来服务器的平均负载状况,可以运行以下命令:

代码:

  1. [user@host ~]$ sar -q -f /var/log/sa/sa23 

以上命令中的-q用于获取平均负载信息,而-f则用于指定sar从哪个文件中获取信息。请注意,sar可能无法使用一周之前乃至更早的运行信息。

如果大家打算查看当前日期的统计信息,则不必为其指令具体时间。输入以下命令即可显示今天的平均负载情况:

代码:

  1. [user@host ~]$ sar -q 

我们强烈建议大家阅读sar说明文档:

代码:

  1. [user@host ~]$ man sar 

它所提供的统计信息能够帮助我们确切掌握服务器的运行状态。

当前CPU使用情况

运行top,并在Cpu(s)一行中检查%id部分所显示的闲置CPU百分比。该数字越高结果越好,说明CPU的工作负载不强。处于99%闲置状态下的CPU几乎没有处理任何实际任务,而处于1%闲置状态下的CPU则意味着接近满载。

代码:

  1. [user@host ~]$ top c 

提示:可加写P根据消耗CPU资源的多少对进程加以分类。

历史CPU使用情况

查看“%idle”列:

代码:

  1. [user@host ~]$ sar -p 

当前内存使用情况

代码:

  1. [user@host ~]$ free -m 

提示:运行top c并加写M可查看哪个进程占用的内存量最大。

历史内存使用情况

根据sar版本的不同,命令内容也有所区别。早期版本通过添加“-r”参数显示内存使用百分比与虚拟内存使用百分比,但新版本则改用“-s”参数显示虚拟内存使用百分比。

Check %memused and %swpused:

代码:

  1. [user@host ~]$ sar -r 

或者:

代码:

  1. [user@host ~]$ sar -r 

代码:

  1. [user@host ~]$ sar -S 

内存使用情况提示:服务器内存占用量较高的情况其实非常正常。这是因为内存的读写速度及效率远高于服务器磁盘,因此操作系统倾向于将内存作为缓冲机制预先载入数据,从而提高数据读取速度。

同样,内存使用百分比也并不是什么大问题(除非大家没有设置虚拟内存分区,但这也与内存本身无关)。大家真正需要关注的是虚拟内存使用百分比,因为只有在服务器的物理内存被全部占用后、虚拟内存才会接替而上发挥作用。这一数字越低,就说明服务器的运行状态越好。如果虚拟内存使用率为0%,则意味着我们的服务器能够完全利用物理内存执行任务。

那么虚拟内存使用率达到多少才算过高?这取决于大家自己的感觉。一般来说,如果虚拟内存使用率一直不高、那么我们的服务器的运行状态还是比较理想的。如果大家发现虚拟内存使用率随时间不断提升(例如由1%到7%再到32%),这就代表服务器上的某些进程正在疯狂吞噬内存,我们需要及时展开调查以了解具体情况(而不该直接安装更多内存)。一旦服务器用尽了所有物理内存与虚拟内存,那么整套系统的运行将变得极为缓慢,需要经过重启才能暂时恢复正常。

当前磁盘I/O使用情况

注意:这一项对于OpenVZ/Virtuozzo容器不起作用。

以下命令将以每秒一次的频率连续显示十次磁盘使用率统计。请大家关注显示结果中的%util列:

代码:

  1. [user@host ~]$ iostat -x 1 10 

历史磁盘I/O使用情况

代码:

  1. [user@host ~]$ sar -d 

优秀的系统管理员能够准确把握服务器负载的基准线,并在当前负载超出基准时立即做出判断。这样做的主要目的(除了防止服务器陷入半瘫痪并不得不重新启动之外)是为了及时了解负载高企时服务器正在运行哪些项目。快速反应能帮助大家在发现问题后第一时间进行故障排查。

如果服务器负载过高的状况出现在凌晨两点到四点之间,那么正在熟睡中的我们肯定无法马上展开调查。虽然sar会一直守护在服务器身边,帮我们收集这段时间内到底哪些资源的使用率居高不下,但却无法揭示问题出现的实际原因。引发负载过高的原因多种多样,其中包括DoS攻击、垃圾邮件攻击、php脚本设计不当、网络蜘蛛在绘制网络图谱时太过积极、硬件故障、针对用户MySQL数据库的磁盘写入量暴增等等。

好消息是,大家可以利用工具收集这些信息,并在负载过高后将结果自动发送过来。如何实现?从进程列表入手:

代码: 

  1. [user@host ~]$ ps auxwwwf 

我创建了一个shell脚本,以我曾经管理过的服务器上的一套perl脚本为基础。这套脚本与其它服务器监控工具(例如Nagios)配合起来给我的工作带来诸多便利。它能检查六种不同项目(下面将详细介绍),并在进程列表中的条目超出阈值时向我发送邮件通知。

注意:cPanel公司对该脚本的开发、维护或技术支持不承担责任。请不要就这款脚本提出服务申请。如果您在使用中遇到任何问题,请到相关论坛上发帖或请教有经验的系统管理员。cPanel不提供与此脚本相关的任何支持。

它所检查的具体资源对象如下:

  • 一分钟平均负载
  • 虚拟内存使用数量(单位为KB)
  • 内存使用数量(单位为KB)
  • 每秒接收数据包数量
  • 每秒发出数据包数量
  • 进程总数

如何使用脚本

要自动运行此脚本,大家需要设置一项cron任务并根据实际情况设定运行频率。我发现每五分钟运行一次是个不错的选择。该脚本无需使用root身份运行,既然如此我们也就不必为其分配高权限。

如果上述监控资源对象中的某一项超过用户自定义的阈值,脚本会自动发送一封电子邮件,其中包含当前进程列表内容。

电子邮件的主题行如下所示:

代码:

  1. server.example.com [L: 35] [P: 237] [Swap Use: 1% ] [pps in: 54  pps out: 289] 

下面我们一一解释其中的条目:

  • L代表一分钟平均负载
  • P代表当前进程列表中的进程数量
  • Swap Usage代表虚拟内存使用百分比
  • pps in代表每秒接收数据包数量
  • pps out代表每秒发出数据包数量

 

脚本使用前的注意事项

重要事项:大家需要根据自己的理解来调整脚本中的数值。完美的默认值设定并不存在,因为不同的服务器环境在实际运行中所应遵循的标准也不一样。举例来说,拥有十六个CPU核心的服务器在一分钟平均负载方面肯定要高于只拥有一个CPU核心的服务器。

注意:大家需要将自己的电子邮箱地址添加到EMAIL变量当中,如下所示:

代码:

  1. EMAIL=you@example.com 

以下五项也需要根据实际情况加以调整:

  • MAX_LOAD
  • MAX_SWAP_USED
  • MAX_MEM_USED
  • MAX_PPS_OUT
  • MAX_PPS_IN

代码:

  1. #!/bin/sh 
  2. export PATH=/bin:/usr/bin 
  3. ########################################################################## 
  4. #                                                                        # 
  5. #  Copyright Jeff Petersen, 2009 - 2013                                  # 
  6. #                                                                        # 
  7. #  This program is free software: you can redistribute it and/or modify  # 
  8. #  it under the terms of the GNU General Public License as published by  # 
  9. #  the Free Software Foundation, either version 3 of the License, or     # 
  10. #  (at your option) any later version.                                   # 
  11. #                                                                        # 
  12. #  This program is distributed in the hope that it will be useful,       # 
  13. #  but WITHOUT ANY WARRANTY; without even the implied warranty of        # 
  14. #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         # 
  15. #  GNU General Public License for more details.                          # 
  16. #                                                                        # 
  17. #  You should have received a copy of the GNU General Public License     # 
  18. #  along with this program.  If not, see <http://www.gnu.org/licenses/>. # 
  19. #                                                                        # 
  20. ########################################################################## 
  21. ############################################################################### 
  22. # START USER CONFIGURABLE VARIABLES 
  23. ############################################################################### 
  24. EMAIL="[email protected]" 
  25. # 1 minute load avg 
  26. MAX_LOAD=3 
  27. # kB 
  28. MAX_SWAP_USED=1000 
  29. # kB 
  30. MAX_MEM_USED=500000 
  31. # packets per second inbound 
  32. MAX_PPS_IN=2000 
  33. # packets per second outbound 
  34. MAX_PPS_OUT=2000 
  35. # max processes in the process list 
  36. MAX_PROCS=400 
  37. ############################################################################### 
  38. # END USER CONFIGURABLE VARIABLES 
  39. ############################################################################### 
  40. IFACE=`grep ETHDEV /etc/wwwacct.conf | awk '{print $2}'` 
  41. if [[ "$IFACE" =~ "venet" ]] ; then 
  42. IFACE=venet0 
  43. fi 
  44. IFACE=${IFACE}: 
  45. ############################################################################### 
  46. # 1 min load avg 
  47. ############################################################################### 
  48. ONE_MIN_LOADAVG=`cut -d . -f 1 /proc/loadavg` 
  49. echo "1 minute load avg: $ONE_MIN_LOADAVG" 
  50. ############################################################################### 
  51. # swap used 
  52. ############################################################################### 
  53. SWAP_TOTAL=`grep ^SwapTotal: /proc/meminfo | awk '{print $2}'` 
  54. SWAP_FREE=`grep ^SwapFree: /proc/meminfo | awk '{print $2}'` 
  55. let "SWAP_USED = (SWAP_TOTAL - SWAP_FREE)" 
  56. echo "Swap used: $SWAP_USED kB" 
  57. ############################################################################### 
  58. # mem used 
  59. ############################################################################### 
  60. MEM_TOTAL=`grep ^MemTotal: /proc/meminfo | awk '{print $2}'` 
  61. MEM_FREE=`grep ^MemFree: /proc/meminfo | awk '{print $2}'` 
  62. let "MEM_USED = (MEM_TOTAL - MEM_FREE)" 
  63. echo "Mem used: $MEM_USED kB" 
  64. ############################################################################### 
  65. # packets received 
  66. ############################################################################### 
  67. PACKETS_RX_1=`grep $IFACE /proc/net/dev | awk '{print $2}'` 
  68. sleep 2; 
  69. PACKETS_RX_2=`grep $IFACE /proc/net/dev | awk '{print $2}'` 
  70. let "PACKETS_RX = (PACKETS_RX_2 - PACKETS_RX_1) / 2" 
  71. echo "packets received (2 secs): $PACKETS_RX" 
  72. ############################################################################### 
  73. # packets sent 
  74. ############################################################################### 
  75. PACKETS_TX_1=`grep $IFACE /proc/net/dev | awk '{print $10}'` 
  76. sleep 2; 
  77. PACKETS_TX_2=`grep $IFACE /proc/net/dev | awk '{print $10}'` 
  78. let "PACKETS_TX = (PACKETS_TX_2 - PACKETS_TX_1) / 2" 
  79. echo "packets sent (2 secs): $PACKETS_TX" 
  80. let "SWAP_USED = SWAP_TOTAL - SWAP_FREE" 
  81. if [ ! "$SWAP_USED" == 0 ] ; then 
  82. PERCENTAGE_SWAP_USED=`echo $SWAP_USED / $SWAP_TOTAL | bc -l` 
  83. TOTAL_PERCENTAGE=`echo ${PERCENTAGE_SWAP_USED:1:2}%` 
  84. else 
  85. TOTAL_PERCENTAGE='0%' 
  86. fi 
  87. ############################################################################### 
  88. # number of processes 
  89. ############################################################################### 
  90. MAX_PROCS_CHECK=`ps ax | wc -l` 
  91. send_alert() 
  92. SUBJECTLINE="`hostname` [L: $ONE_MIN_LOADAVG] [P: $MAX_PROCS_CHECK] [Swap Use: $TOTAL_PERCENTAGE ] [pps in: $PACKETS_RX  pps out: $PACKETS_TX]" 
  93. ps auxwwwf | mail -s "$SUBJECTLINE" $EMAIL 
  94. exit 
  95. if   [ $ONE_MIN_LOADAVG -gt $MAX_LOAD      ] ; then send_alert 
  96. elif [ $SWAP_USED       -gt $MAX_SWAP_USED ] ; then send_alert 
  97. elif [ $MEM_USED        -gt $MAX_MEM_USED  ] ; then send_alert 
  98. elif [ $PACKETS_RX      -gt $MAX_PPS_IN    ] ; then send_alert 
  99. elif [ $PACKETS_TX      -gt $MAX_PPS_OUT   ] ; then send_alert 
  100. elif [ $MAX_PROCS_CHECK -gt $MAX_PROCS ] ; then send_alert 
  101. fi 

需要注意的是,进程列表的输出内容中包含一些有用的数列,涉及各个进程的CPU与内存使用情况:

  • %CPU
  • %MEM
  • VSZ
  • RSS
  • TIME (显示一个进程的存在时间)

我们可以通过多种方式剖析服务器负载高企的原因。下面我们列出几项常用方案--仅供参考,并不全面:

  • 利用mysqladmin processlist (或者简写为'mysqladmin pr')检查MySQL进程列表
  • 利用mytop检查MySQL进程列表
  • 查阅日志文件。了解服务器自身的反馈意见也很重要。您的服务器是否遭遇暴力破解?
  • 运行dmesg以检查可能存在的硬件故障
  • 利用netstat查看服务器连接

下面则是值得关注的日志文件及其保存路径:

  • 系统日志: /var/log/messages, /var/log/secure
  • SMTP日志: /var/log/exim_mainlog, /var/log/exim_rejectlog, /var/log/exim_paniclog
  • POP3/IMAP日志: /var/log/maillog
  • Apache日志: /usr/local/apache/logs/access_log, /usr/local/apache/logs/error_log, /usr/local/apache/logs/suexec_log, /usr/local/apache/logs/suphp_log
  • 网站日志: /usr/local/apache/domlogs/ (use this to find sites with traffic in the last 60 seconds: find -maxdepth 1 -type f -mmin -1 | egrep -v 'offset|_log$')
  • Cron日志: /var/log/cron

大家也可以在评论栏中反馈您在工作中遇到的问题、对本篇文章的评论及其它任何希望与朋友们分享的信息。作为一篇独立的指导性文章,我们不可避免会存在遗漏或者疏忽,期待您提出宝贵意见、也希望大家能从中受到一点启发。

原文链接:

http://forums.cpanel.net/f34/troubleshooting-high-server-loads-linux-servers-319352.html

阅读全文……

标签 : , ,

为最佳性能调优 Nginx - 博客 - 伯乐在线

配置:

1
2
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.orig
    vim /etc/nginx/nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# This number should be, at maximum, the number of CPU cores on your system.
# (since nginx doesn't benefit from more than one worker per CPU.)
# 这里的数值不能超过 CPU 的总核数,因为在单个核上部署超过 1 个 Nginx 服务进程并不起到提高性能的作用。
worker_processes 24;
 
# Number of file descriptors used for Nginx. This is set in the OS with 'ulimit -n 200000'
# or using /etc/security/limits.conf
# Nginx 最大可用文件描述符数量,同时需要配置操作系统的 "ulimit -n 200000",或者在 /etc/security/limits.conf 中配置。
worker_rlimit_nofile 200000;
 
# only log critical errors
# 只记录 critical 级别的错误日志
error_log /var/log/nginx/error.log crit
 
# Determines how many clients will be served by each worker process.
# (Max clients = worker_connections * worker_processes)
# "Max clients" is also limited by the number of socket connections available on the system (~64k)
# 配置单个 Nginx 单个进程可服务的客户端数量,(最大值客户端数 = 单进程连接数 * 进程数 )
# 最大客户端数同时也受操作系统 socket 连接数的影响(最大 64K )
worker_connections 4000;
 
# essential for linux, optmized to serve many clients with each thread
# Linux 关键配置,允许单个线程处理多个客户端请求。
use epoll;
 
# Accept as many connections as possible, after nginx gets notification about a new connection.
# May flood worker_connections, if that option is set too low.
# 允许尽可能地处理更多的连接数,如果 worker_connections 配置太低,会产生大量的无效连接请求。
multi_accept on;
 
# Caches information about open FDs, freqently accessed files.
# Changing this setting, in my environment, brought performance up from 560k req/sec, to 904k req/sec.
# I recommend using some varient of these options, though not the specific values listed below.
# 缓存高频操作文件的FDs(文件描述符/文件句柄)
# 在我的设备环境中,通过修改以下配置,性能从 560k 请求/秒 提升到 904k 请求/秒。
# 我建议你对以下配置尝试不同的组合,而不是直接使用这几个数据。
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
 
# Buffer log writes to speed up IO, or disable them altogether
# 将日志写入高速 IO 存储设备,或者直接关闭日志。
# access_log /var/log/nginx/access.log main buffer=16k;
access_log off;
 
# Sendfile copies data between one FD and other from within the kernel.
# More efficient than read() + write(), since the requires transferring data to and from the user space.
# 开启 sendfile 选项,使用内核的 FD 文件传输功能,这个比在用户态用 read() + write() 的方式更加高效。
sendfile on;
 
# Tcp_nopush causes nginx to attempt to send its HTTP response head in one packet,
# instead of using partial frames. This is useful for prepending headers before calling sendfile,
# or for throughput optimization.
# 打开 tcp_nopush 选项,Nginux 允许将 HTTP 应答首部与数据内容在同一个报文中发出。
# 这个选项使服务器在 sendfile 时可以提前准备 HTTP 首部,能够达到优化吞吐的效果。
tcp_nopush on;
 
# don't buffer data-sends (disable Nagle algorithm). Good for sending frequent small bursts of data in real time.
# 不要缓存 data-sends (关闭 Nagle 算法),这个能够提高高频发送小数据报文的实时性。
tcp_nodelay on;
 
# Timeout for keep-alive connections. Server will close connections after this time.
# 配置连接 keep-alive 超时时间,服务器将在超时之后关闭相应的连接。
keepalive_timeout 30;
 
# Number of requests a client can make over the keep-alive connection. This is set high for testing.
# 单个客户端在 keep-alive 连接上可以发送的请求数量,在测试环境中,需要配置个比较大的值。
keepalive_requests 100000;
 
# allow the server to close the connection after a client stops responding. Frees up socket-associated memory.
# 允许服务器在客户端停止发送应答之后关闭连接,以便释放连接相应的 socket 内存开销。
reset_timedout_connection on;
 
# send the client a "request timed out" if the body is not loaded by this time. Default 60.
# 配置客户端数据请求超时时间,默认是 60 秒。
client_body_timeout 10;
 
# If the client stops reading data, free up the stale client connection after this much time. Default 60.
# 客户端数据读超时配置,客户端停止读取数据,超时时间后断开相应连接,默认是 60 秒。
send_timeout 2;
 
# Compression. Reduces the amount of data that needs to be transferred over the network
# 压缩参数配置,减少在网络上所传输的数据量。
gzip on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml;
gzip_disable "MSIE [1-6].";

 

1
vim /etc/sysctl.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Increase system IP port limits to allow for more connections
# 调高系统的 IP 以及端口数据限制,从可以接受更多的连接
net.ipv4.ip_local_port_range = 2000 65000
 
net.ipv4.tcp_window_scaling = 1
 
# number of packets to keep in backlog before the kernel starts dropping them
# 设置协议栈可以缓存的报文数阀值,超过阀值的报文将被内核丢弃
net.ipv4.tcp_max_syn_backlog = 3240000
 
# increase socket listen backlog
# 调高 socket 侦听数阀值
net.core.somaxconn = 3240000
net.ipv4.tcp_max_tw_buckets = 1440000
 
# Increase TCP buffer sizes
# 调大 TCP 存储大小
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_congestion_control = cubic

每次修订配置之后都需要执行以下命令使之生效.

1
sysctl -p /etc/sysctl.conf

 

阅读全文……

10部史上票房最高的动画片 - 电影 - 英语学习站_爱词霸

\

《超能陆战队》在今年的奥斯卡颁奖典礼上斩获最佳动画长片奖,该片在美国狂揽2.2亿美元票房。这个数字固然不错,但如果对照《财富》扣除通胀因素,重新发布的史上票房成绩最高的动画电影榜单,它真的不算什么。那么,史上票房最高的动画电影是哪一部呢?

Big Hero 6 was the big winner of the Academy Award for Best Animated Feature on Oscar night Sunday. The story of an inflatable personal healthcare robot with a heart of gold, it's already taken in $220 million at the domestic box office, according to Box Office Mojo, making it the 20th highest grossing animated movie of all time.

电影《超能陆战队》(Big Hero 6 )在今年的奥斯卡颁奖典礼上斩获最佳动画长片奖。据票房魔咒网统计,有一颗金子心的充气机器人大白凭借卖得一手好萌,在美国国内狂揽2.2亿美元票房,使这部影片成为有史以来票房收入第20高的动画电影。

All fine and good, but after you adjust box office totals for inflation, its haul is a lot less impressive. Fortune combed through Box Office Mojo's list of highest-grossing animated movies and adjusted their domestic totals for inflation, and some of the movies that now appear in the top 10 may be surprising. It's also worth noting that all box office totals are adjusted to 2014 dollars, because the federal Bureau of Labor Statistics, which tracks inflation, doesn't release its 2015 figures until the end of this week.

这个数字固然不错,但如果你把历年各大动画电影的票房收入用通胀率进行调整后,它就显得不那么犀利了。《财富》选取了票房魔咒网给出的史上票房成绩最高的几部动画电影,然后根据通胀率对其美国国内票房成绩进行了一番调整。扣除通胀因素后,在排在前十名的几部电影中,有几部电影的票房收入高得令人咂舌。特别要指出的是,本文所有票房数字均是基于2014年的美元币值计算而出,因为截止到上周末,联邦劳工统计局尚未发布2015年的通胀数据。

Having said that, Fortune presents a list of the highest-grossing animated movies of all time.

闲话少叙,请看《财富》为您奉献的史上最高票房收入动画电影排行榜。

10. Toy Story 2

《玩具总动员2》

The 1999 sequel to 1995's critically and commercially acclaimed Toy Story, this second installment finds Buzz Lightyear and the gang trying to rescue their pal Woody from the clutches of a remorseless toy dealer.

由于1995年推出的首部《玩具总动员》(Toy Story)叫好又叫座,制片方于1999年拍摄了该电影的续集。在本片中,巴斯光年和他的朋友们试图从一个冷酷的玩具商手中营救出他们的朋友胡迪。

While the first movie had won accolades from critics and audiences alike, the sequel was a huge step forward in terms of story and characterization, and raised the bar for what a children's movie could do. It took in $246 million as the 20th Century wrapped up, for a total of $350 million after inflation.

《玩具总动员1》获得了影评人和观众的一致赞誉,《玩具总动员2》则在历史和角色刻画上都向前迈了一大步,为以后的儿童电影树立了更高的标杆。该片出品方20世纪公司狂揽2.46亿美元,经通胀调整后约为3.5亿美元。

\

9. Shrek

《怪物史莱克》

In 2001, a hideous ogre with a Scottish accent voiced by Mike Meyers made his big-screen debut. Children everywhere were delighted, and the flagship effort in a highly profitable franchise was born.

2001年,一只由迈克•麦耶斯配音,操苏格兰口音的搞笑怪兽登上大银幕,并一下子征服了全球各地的小朋友。一个利润丰富的商业主题就此诞生。

Full of tongue-in-cheek references to other films, it kept mom and dad amused while junior reveled in the glorious fart humor. It raked in $268 million at the domestic box office, or $358 million today.

由于片中时常出现对其它电影的恶搞桥段,该片在吸引儿童的同时,也让陪同看片的父母们忍俊不禁。该片当时的美国票房为2.68亿美元,折合现在的3.58亿美元。

8. Shrek the Third

《怪物史莱克3》

By 2007, the Shrek franchise had already proven itself a highly profitable commodity, making a third trip back to the well mandatory. Featuring the voices of Monty Python alumni John Cleese and Eric Idle, as well as that of radio host Larry King as Doris the Ugly Stepsister, the third installment did even better than the original, with domestic box office receipts of $323 million, or $369 million today.

到2007年,史莱克早已成为一块金字招牌,其第三部电影也就顺理成章地上映了。除了电台主持人拉里•金为“丑陋的继姐”配音外,英国知名喜剧团体Monty Python成员约翰•克里斯和埃里克•爱都也为本片倾情献声。该片的反响甚至超过了第一部,美国国内票房收入达到3.23亿美元,折合现在的3.69亿美元。 

\

7. Despicable Me 2

《卑鄙的我2》

Released in 2010, the original Despicable Me took in $252 million. Naturally, this meant that there had to be a sequel, which was delivered to salivating children in the summer of 2013.

2010年上映的《卑鄙的我》(Despicable Me )获得了2.52亿美元的票房成绩。如此佳绩当然意味着必然要拍续集。2013年夏天,《卑鄙的我2》终于火爆上映。

Adorable tykes across this great nation returned to the multiplexes to delight in the antics of Gru (Steve Carell) and the Minions, who could be seen gracing pajamas, cookies and other merchandise everywhere you looked. The movie earned $368 million, or $374 million in today’s dollars, and was also nominated for a Best Animated Feature Oscar. It lost, but the filmmakers could console themselves by crying into a pillow made of money.

全美的小朋友再次进入电影院,欣赏格鲁(由史蒂夫•卡莱尔配音)和小黄人们的滑稽搞笑。穿着背带裤的小黄人继续各种卖萌耍宝。该片获得3.68亿美元票房,折合现在的3.74亿美元。《卑鄙的我2》也被提名为当年的奥斯卡最佳动漫长片奖,虽然最后未能成功抱得奥斯卡小金人,但当制片方流下伤感的泪水时,他们至少可以抱着赚来的一大堆美金擦擦眼角。

6. Monsters, Inc.

《怪兽公司》

Monsters, Inc. is the story of two creatures that help power their hometown of Monstropolis with the screams of the children they scare. It features the voices of John Goodman, Billy Crystal and Steve Buscemi, and is the rare children’s film that parents could actually enjoy along with their kids.

《怪兽公司》(Monsters, Inc)讲述了在一个靠小孩子恐惧的尖叫声提供能源的怪兽世界里,两只小怪兽如何成为怪兽公司头牌恐吓者的故事。本片的配音演员有约翰•古德曼、比利•克里斯托和史蒂夫•布西密等,它也是少数父母可以与孩子共同享受观影乐趣的儿童片之一。

It opened to huge box office totals in November 2001, with only the first Harry Potter and Lord of the Ringsmovies able to knock it off its lofty perch. It earned $290 million in its theatrical run, or $388 million in today's dollars.

该片在2001年11月一经上映就获得巨额票房,当时只有《哈利波特》(Harry Potter )第一部和《指环王》(Lord of the Ring)系列电影能把它拉下票房榜首宝座。该片的票房收入达到2.9亿美元,约合现在的3.88亿美元。

5. Frozen

《冰雪奇缘》

If you are the parent of a girl under age 10 or so, then you do not need the plot of 2013's Frozen encapsulated for you. The musical fantasy, which raked in $400 million ($406 million today), is the subject of maniacal fandom, and your daughter – or maybe even your son – has probably been more than happy to talk your ear off about it since its release.

如果你有一个十岁以下的女儿,那你完全不必担心没看过《冰雪奇缘》(Frozen )。这部狂揽4亿美元(折合现在的4.06亿)的音乐幻想片是孩子们的狂热话题。自从这部片子上映以来,你的女儿,甚至你的儿子可能早已不厌其烦地向你描绘了多次片中的情节。

Frozen reached its box office total through repeat viewings, and it spawned sing-along events at theaters that became the kiddie equivalent of The Rocky Horror Picture Show. The plethora of Frozen-themed birthday parties and little girls dressed up as Princess Elsa at Halloween should be a big hint to parents that their children are not about to "let it go" any time soon.

《冰雪奇缘》不仅吸引了许多儿童反复观看,而且它还衍生了一批以此为主题的音乐剧,后者就相当于是孩子们的《洛基恐怖秀》。各地冒出的一大堆《冰雪奇缘》主题生日会,以及万圣节上无数扮演埃尔莎公主的小女孩,充分说明了“冰雪热”短时间内难以消退,父母们还是“随它吧”。

\

4. Toy Story 3

《玩具总动员3 》

Coming 11 years after Toy Story 2, moviegoers could have been forgiven for wondering what more the franchise could possibly have to say. However, critics and moviegoers alike were stunned to find that the third installment was in fact the best of the series, and it took in $415 million, the equivalent of $451 million today.

在《玩具总动员2》播出11年后,很多观影者可能好奇《玩具》系列是否还有进一步挖掘的空间。不过等《玩具3》上映后,观影者和影评人惊奇地发现,第三部其实是整个系列中水准最高的一部。该片获得了4.15亿美元的票房收入,约合今天的4.51亿美元。

Like Big Hero 6, it won the Academy Award for Best Animated Feature. Also like Big Hero 6, there may have been more than a few parents in the theater who did not expect it to be as tearful as it was. Despite the movie ending on a note that seemed to rule out another sequel, a fourth installment is currently scheduled for 2017.

像《超能陆战队》一样,该片也获得了奥斯卡最佳动画长片奖。另外很多父母没有想到,这部片子最后也像《超能陆战队》一样有泪点。尽管在片子末尾的彩蛋处表明制片方可能会再次推出续集,但目前看来,第四部《玩具总动员》可能要到2017年才会推出。

3. Finding Nemo

《海底总动员》

Finding Nemo is like Bambi, in that it belongs to the long, proud tradition of Disney films in which the main character's mother gets killed, thereby necessitating years of therapy for the little children who saw it.

和《小鹿斑比》(Bambi)一样,《海底总动员》(Finding Nemo)的故事情节也沿用了迪斯尼多年来屡试不爽的桥段:主角的母亲惨死后,目睹这一幕的孩子需要多年的心理建设才能恢复过来。

The story of a lost clownfish from the Great Barrier Reef, the 2003 film took in $380 million at the domestic box office, or $489 million after inflation. It was the highest-grossing G-rated film ever made until Toy Story 3conquered it with its unadjusted box office gross.

本片讲述了一只小丑鱼在大堡礁被抓走,小丑鱼的父亲为爱寻子的冒险历程。这部2003年的电影获得了3.8亿美元的国内票房,约合现在的4.89亿美元。在《玩具总动员3》上映之前,它一直是美国电影史上票房最高的G级片,直至前者凭借未经通胀调整的票房收入打破了它的纪录。

2. Shrek 2

《怪物史莱克2》

Shrek 2 was released in 2004 and followed the adventures of the unsightly ogre and his newly betrothed wife Fiona. It parodies such well-known children's stories as The Wizard of Oz and The Little Mermaid, and also introduced Puss in Boots, a swashbuckling Mexican cat voiced by Antonio Banderas.

《怪物史莱克2》上映于2004年,它继续讲述了史莱克与妻子费欧娜的冒险故事。片中也恶搞了《绿野仙踪》和《小美人鱼》等知名童话故事。同时本片还加入了一个新角色——由安东尼奥•班德拉斯配音的墨西哥“靴子猫”。

The most popular film in the entire franchise, it earned $441 million at the domestic box office, the equivalent of a staggering $553 million today. A fourth film, Shrek Forever After, was released in 2010, but the status of a much hinted-at fifth film remains shrouded in mystery.

作为《怪兽史莱克》系列中最受欢迎的一部,该片在美国获得了4.41亿美元的票房收入,约合现在的5.53亿美元。该系列的第四部也于2010年推出,但目前还不知道第五部的制作进展情况。

\

1. The Lion King

《狮子王》

It should come as no surprise that The Lion King is the highest-grossing animated film of all time. A stone cold classic beloved by children for over 20 years – and maybe a few of their parents too – the 1994 movie inspired three video games and a musical now in its 18th year on Broadway.

史上票房最高的动画电影被《狮子王》(The Lion King )摘得,应该是名至实归的,谁也不会感到意外。这部里程碑式的经典大片被孩子们深深热爱了20多年,当年最早的一批辛巴小粉丝如今也为人父母了。这部摄制于1994年的电影已经被改编成三种视频游戏和一部音乐剧,后者已经在百老汇上演了18年。

The movie's domestic box office take of $423 million is impressive even before it's adjusted for inflation, at which point it reaches a Titanic-esque $676 million. It leaves every other animated movie on this list in its dust, with the cruel and unrelenting force of a wildebeest stampede.

该片的票房收入高达4.23亿美元,即便不用通胀率进行调整,这个数额也是相当惊人了,而在用通胀率调整后,它的票房数字折合现在的6.76亿美元,达到了《泰坦尼克号》(Titanic)的高度,像非洲大草原上迁徙的角马一样,无情地将其它所有上榜电影甩在了它扬起的尘埃里。

阅读全文……

标签 :

Java nio的一个严重BUG,导致cpu 100% - 代码之美 - 博客频道 - CSDN.NET

 

 

这个BUG会在linux上导致cpu 100%,使得nio server/client不可用,具体的详情可以看这里http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6403933  。令人失望的是这个BUG直到jdk 6u4才解决,sun的拖沓让人难以相信。这个BUG在server端容易出现,因为server端有频繁地接入断开连接。 
    使用jdk 6u4之前版本的nio框架都有这个隐患,除非你的框架很好地处理了这个可能的隐患。Grizzly的处理方式比较简单,也就是BUG报告里面提到的方式,在SelectionKey.cancel()之后马上进行了一次select调用将fd从poll(epoll)中移除: 
Java代码:

this.selectionKey.cancel();
try {
            // cancel key,then select now to remove file descriptor
            this.selector.selectNow();
 } catch (IOException e) {
         onException(e);
        log.error("Selector selectNow fail", e);
}

 实际上这样的解决方式还是留有隐患的,因为key的取消和这个selectNow操作很可能跟Selector.select操作并发地在进行,在两个操作之间仍然留有一个极小的时间窗口可能发生这个BUG。因此,你需要更安全地方式处理这个问题,jetty的处理方式是这样,连续的 select(timeout)操作没有阻塞并返回0,并且次数超过了一个指定阀值,那么就遍历整个key set,将key仍然有效并且interestOps等于0的所有key主动取消掉;如果在这次修正后,仍然继续出现select(timeout)不阻塞并且返回0的情况,那么就重新创建一个新的Selector,并将Old Selector的有效channel和对应的key转移到新的Selector上。

long before=now;
                    int selected=selector.select(wait);
                    now = System.currentTimeMillis();
                    _idleTimeout.setNow(now);
                    _timeout.setNow(now);

                    // Look for JVM bugs
                    // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6403933
                    if (__JVMBUG_THRESHHOLD>0 && selected==0 && wait>__JVMBUG_THRESHHOLD && (now-before)<(wait/2) )
                    {
                        _jvmBug++;
                        if (_jvmBug>=(__JVMBUG_THRESHHOLD2))
                        {
                            synchronized (this)
                            {
                                _lastJVMBug=now;
                                                    // BLOODY SUN BUG !!!  Try refreshing the entire selector.
                                final Selector new_selector = Selector.open();
                                for (SelectionKey k: selector.keys())
                                {
                                    if (!k.isValid() || k.interestOps()==0)
                                        continue;
                                    
                                    final SelectableChannel channel = k.channel();
                                    final Object attachment = k.attachment();
                                    
                                    if (attachment==null)
                                        addChange(channel);
                                    else
                                        addChange(channel,attachment);
                                }
                                _selector.close();
                                _selector=new_selector;
                                _jvmBug=0;
                                return;
                            }
                        }
                        else if (_jvmBug==__JVMBUG_THRESHHOLD || _jvmBug==__JVMBUG_THRESHHOLD1)
                        {
                            // Cancel keys with 0 interested ops
                            for (SelectionKey k: selector.keys())
                            {
                                if (k.isValid()&&k.interestOps()==0)
                                {
                                    k.cancel();
                                }
                            }
                            return;
                        }
                    }
                    else
                        _jvmBug=0;

这个方案能比较好的在jdk 6u4之前的版本上解决这个BUG可能导致的问题。Mina和Netty没有看到有处理这个BUG的代码,如果我看错了,请留言告诉我。Yanf4j一直采用的是grizzly的方式,准备加上jetty的处理方案。当然,最简单的方案就是升级你的JDK。

俺实际上被这个BUG害的很惨, 因为降到了jdk 6u4 CPU仍然会时不时的增高, 原因是低版本的Jetty同样在这方面处理的不是很合理. 
    Jetty关于这个BUG的描述:http://jira.codehaus.org/browse/JETTY-937, 用JETTY做为应用, JETTY1.6.22 + JDK 6U4俺现在测下来, CPU基本正常.

另外nio还有几个严重的bug,在实际运行中碰到了,sun在u18才修复,而现在u18还没正式发布。


http://download.java.net/jdk6/6u18/promoted/b01/changes/JDK6u18.b01.list.html
例如:http://bugs.sun.com/view_bug.do?bug_id=6693490
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6670302 这个BUG跟我这里描述的相似,解决的方法也是一样。

http://bugs.sun.com/view_bug.do?bug_id=6693490 这个BUG,一个间接影响也是关闭的channel一直有ready事件,select不阻塞并立即返回0,也就是导致CPU 100%,同样也是可以通过这里描述的方案解决的。

 

参考:

http://www.infoq.com/cn/articles/practice-of-java-nio-communication-framework

https://github.com/netty/netty/issues/327

阅读全文……

标签 : , ,

How To: Make Sure /etc/resolv.conf Never Get Updated By DHCP Client

Option # 3: Configure dhclient.conf

/etc/dhclient.conf or /etc/dhcp/dhclient.conf file contains configuration information for dhclient. You can turn on or off DNS update and other options for specific interface or all interface using this file. The man pages for DHCLIENT.CONF and DHCP-OPTIONS point out that in dhclient.conf, you should add this:

supersede domain-name-servers 202.54.1.2, 199.2.3.4;

OR

prepend domain-name-servers 1.2.3.4, 1.2.3.5;

Here is a sample config for you:

       timeout 60;
       retry 60;
       reboot 10;
       select-timeout 5;
       initial-interval 2;
       reject 192.33.137.209;
       interface "eth0" {
           send host-name "laptop-area51.nixcraft.net.in.home";
           send dhcp-client-identifier 00:30:48:33:BC:32;
           send dhcp-lease-time 3600;
           supersede domain-search "net.in.home", "cyberciti.biz", "vpx.nixcraft.net.in";
           prepend domain-name-servers 8.8.8.8, 127.0.0.1;
           request subnet-mask, broadcast-address, time-offset, routers,
                domain-search, domain-name, domain-name-servers, host-name;
           require subnet-mask, domain-name-servers;
       }
 #ifdown eth0 && ifup eth0
 
Ubuntu Static Dns With Dhcp :

Parent: Internet and Networking

The default setup of Ubuntu does not make it easy to use static DNS servers while using DHCP. If you use the standard ubuntu way of networking (ifupdown), you can edit /etc/network/interfaces

In that file you find the entry for your interface. If your interface is eth0, then look for the following lines:

auto eth0
iface eth0 inet dhcp

Add one line, so it looks like:

auto eth0
iface eth0 inet dhcp
dns-nameservers ip.address.of.nameserver

Run

sudo invoke-rc.d networking restart

To make the changes effective

If you do not use ifupdown, you need to edit /etc/dhcp3/dhclient.conf

Find the lines

#prepend domain-name-servers 127.0.0.1;
request subnet-mask, broadcast-address, time-offset, routers,
        domain-name, domain-name-servers, host-name,
        netbios-name-servers, netbios-scope;

And change them to

prepend domain-name-servers 1.2.3.4, 1.2.3.5;
request subnet-mask, broadcast-address, time-offset, routers,
        domain-name, host-name,
        netbios-name-servers, netbios-scope;

Replace 1.2.3.4 and 1.2.3.5 with the addresses of your DNS servers.

Run

sudo invoke-rc.d networking restart

To make the changes effective:

阅读全文……

标签 : ,

netty/MemcacheClient.java at master · netty/netty · GitHub

/*
  * Copyright 2014 The Netty Project
  *
  * The Netty Project licenses this file to you under the Apache License,
  * version 2.0 (the "License"); you may not use this file except in compliance
  * with the License. You may obtain a copy of the License at:
  *
  * http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  * License for the specific language governing permissions and limitations
  * under the License.
  */
  package io.netty.example.memcache.binary;
   
  import io.netty.bootstrap.Bootstrap;
  import io.netty.channel.Channel;
  import io.netty.channel.ChannelFuture;
  import io.netty.channel.ChannelInitializer;
  import io.netty.channel.ChannelPipeline;
  import io.netty.channel.EventLoopGroup;
  import io.netty.channel.nio.NioEventLoopGroup;
  import io.netty.channel.socket.SocketChannel;
  import io.netty.channel.socket.nio.NioSocketChannel;
  import io.netty.handler.codec.memcache.binary.BinaryMemcacheClientCodec;
  import io.netty.handler.codec.memcache.binary.BinaryMemcacheObjectAggregator;
  import io.netty.handler.ssl.SslContext;
  import io.netty.handler.ssl.SslContextBuilder;
  import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
   
  import java.io.BufferedReader;
  import java.io.InputStreamReader;
   
  /**
  * Simple memcache client that demonstrates get and set commands against a memcache server.
  */
  public final class MemcacheClient {
   
  static final boolean SSL = System.getProperty("ssl") != null;
  static final String HOST = System.getProperty("host", "127.0.0.1");
  static final int PORT = Integer.parseInt(System.getProperty("port", "11211"));
   
  public static void main(String[] args) throws Exception {
  // Configure SSL.
  final SslContext sslCtx;
  if (SSL) {
  sslCtx = SslContextBuilder.forClient()
  .trustManager(InsecureTrustManagerFactory.INSTANCE).build();
  } else {
  sslCtx = null;
  }
   
  EventLoopGroup group = new NioEventLoopGroup();
  try {
  Bootstrap b = new Bootstrap();
  b.group(group)
  .channel(NioSocketChannel.class)
  .handler(new ChannelInitializer<SocketChannel>() {
  @Override
  protected void initChannel(SocketChannel ch) throws Exception {
  ChannelPipeline p = ch.pipeline();
  if (sslCtx != null) {
  p.addLast(sslCtx.newHandler(ch.alloc(), HOST, PORT));
  }
  p.addLast(new BinaryMemcacheClientCodec());
  p.addLast(new BinaryMemcacheObjectAggregator(Integer.MAX_VALUE));
  p.addLast(new MemcacheClientHandler());
  }
  });
   
  // Start the connection attempt.
  Channel ch = b.connect(HOST, PORT).sync().channel();
   
  // Read commands from the stdin.
  System.out.println("Enter commands (quit to end)");
  System.out.println("get <key>");
  System.out.println("set <key> <value>");
  ChannelFuture lastWriteFuture = null;
  BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  for (;;) {
  String line = in.readLine();
  if (line == null) {
  break;
  }
  if ("quit".equals(line.toLowerCase())) {
  ch.close().sync();
  break;
  }
  // Sends the received line to the server.
  lastWriteFuture = ch.writeAndFlush(line);
  }
   
  // Wait until all messages are flushed before closing the channel.
  if (lastWriteFuture != null) {
  lastWriteFuture.sync();
  }
  } finally {
  group.shutdownGracefully();
  }
  }
  }

阅读全文……

标签 :

(8)刘良华家庭教育100条建议_教育现象学_新浪博客

1.      影响孩子成绩的主要因素不是学校,而是家庭。在学校和家庭之间,家庭是人成长的根本,家庭教育是“培根教育”。家庭不仅是孩子成长的根本,也是父母本人生活的根本。无论父母有多大的成就,孩子的教育一旦失败,整个人生就陷入悲剧。

2.      在学校教育、家庭教育和社会教育三者之间,家庭教育比学校教育更重要,社会教育比家庭教育更重要。学校教育相对而言是最不重要的。

3.      每一个孩子的健康成长,将影响整个国家的发展。推动摇篮的手,也推动国家的发展。国民的命运,与其说是操在掌权者手中,倒不如说是握在母亲的手中。

4.      你要看一个国家的文明,只消考察三件事:第一,看他们怎样待小孩子;第二,看他们怎样待女人;第三,看他们怎样利用闲暇的时间。

5.      培育一个贵族需要三代人的努力。富裕是一种高级的教育资源,但是,高级的教育资源需要父母有高级的教育方法。如果孩子因家庭富裕而四体不勤、傲慢虚荣,那么,富裕不仅不是孩子成长的资源,反而成为孩子成长的祸害。中国的民间经验是:“富不过三代”。

6.      如果孩子在家庭生活中没有养成“三好孩子”(身体好、性格好、生活习惯好),那么,这个孩子就很可能成为学校的“差生” 。或者说,如果孩子在家庭里养成了坏身体、坏性格和坏习惯,那么,无论学校的教师和校长多么能干,他们很难改变孩子在学校成为“差生”的命运。

7.      最不幸的人是那些既没有爱又没有安全感的人。孩子的安全感来自他的父母的陪伴。父母在哪里,哪里就是他的家。在这个地方,风可进,雨可进,国王不可进。对亚当而言,天堂是他的家;然而对于亚当的后裔而言,家是他们的天堂。

8.      儿童是人类之父。

9.      不要简单地把教育孩子的责任转交给祖父母,更不能简单地把教育孩子的责任转交给保姆,这样会让孩子处于成长的危险之中。

10.     如果孩子的学习出了问题,不妨从孩子的情感或身体那里寻找解决问题的办法。父母苦口婆心地给孩子讲学习的重要性并责令孩子努力学习,类似园丁把水分和养料直接抛洒给“枯黄的树叶”。

11.     劳动和运动是教育的故乡。教育原本从活动中产生,教育的最初形态就是活动、生活。后来印刷书出现,学校出现,教育逐步演化为某种“语言说教”。语言说教是一个进步,但也隐藏了危险和危机。当教育出现危险和危机时,可以尝试回到教育的原点,用劳动和运动的方式来解决问题。

12.     运动的真正目的在于增进健康,增长力量。它让人因此而有强健的“行动能力”与“冒险精神”。它让人不至于成为思想的巨人、行动的懦夫;它让人自信满满、雷厉风行、决策果断、敢于冒险,而不只是沉于幻想、优柔寡断。所谓“受过教育的人”,就是使身体趋向强健、强悍甚至野蛮,使人趋向健全、勇猛、锐利、热烈。

13.     力量和优美的经典案例是古希腊人的“投掷铅球”和“投掷标枪”图案。健康状态是雷厉风行的生活习惯、高高地扬起铁锤砸碎石块的劳作状态。“身体强健”不只是“四肢发达”,它让神采飞扬,活力四射;让勇气充沛,敢于冒险;让意志发达,承受困顿与锤炼而笑声朗朗。家庭教育不能只关注学生的脑袋,不能贬低、压制、压迫脑袋以下的部分。“健康的乞丐比有病的国王更幸福。”

14.     在药店永远找不到最好的营养品,因为最好的营养品在劳作的田野里或奔跑的运动场上。不要指望学校教育能够训练孩子的身体。孩子整天坐在教室里,像坐牢。偶尔有体育课,那是“放风”。体育老师不敢让孩子做任何所谓的危险的动作,因为孩子的身体如果受到一点点意外的伤害,学校就会成为被告。既然学校体育课不能训练孩子的身体,孩子的身体发展就只能由家长亲自负责。

15.     要想小儿安,三分饥和寒。不能从粗糙的木桶中饮到甘露的人是不幸的。对于经济条件较差的家庭来说,父母需要想办法让孩子尽可能吃饱、穿暖。但是,对于经济条件较好的家庭来说,必须让孩子有“饥饿感”和“抗寒力”。

16.     让孩子建立健康的饮食习惯。不必完全禁止孩子吃糖果、巧克力,那样剥夺了孩子的欢乐感,也容易引起孩子的自卑感,但是,父母需要引导孩子尽量少吃糖果、饼干或巧克力等甜食,尤其要禁止孩子饭前吃零食。

17.     对于已经解决温饱问题的家庭来说,最大的问题是孩子缺乏饥饿感。保护身体的基本策略是让孩子在饥饿状态下进食,不让孩子因吃零食而整天处于饱和状态。

18.     培养竞争与合作最适宜的地方是家庭。中国民间的说法是:“憨老大,金老二,刁老三。”

19.     如果你的孩子总是宽容他人,请不要嘲笑你的孩子软弱。千钧之弩不为鼷鼠发机,万石之钟不以莛撞起音。

20.     人和人的差异、一个民族和另一个民族的差异,往往显示为意志力的强弱。所谓“意志力”,就是不服输、不放弃的品质。

21.     好的饮食起居习惯显示为三个特征:一是狼吞虎咽地吃饭(不是细嚼慢咽);二是每天一次大便;三是早睡早起。

22.     让孩子多吃有利于消化的五谷杂粮。土豆、芋头、红薯、大豆、面粉、绿叶菜、水果就是理想的食品。

23.     可以选择“全食物”的办法。有些食品可以连皮带籽地吃,“吃完整食物”,尽量摄取保持完整的原生状态。但,这样做的前提是,全食族的食物必须是绿色纯天然的,不打农药和上蜡的,以免对人体造成任何急性或慢性危害。

24.     如果没有特殊的原因,不要让孩子一个人吃饭。如果没有特别的困难,父母最好每天赶回家和孩子一起进餐。

25.     “餐桌教育”(以及“耕读教育”)是中国人最重要的传统。家庭的共同价值观,就在全家人围着一个桌子吃饭的过程中建立起来。全家人围着一个桌子吃饭,彼此牵挂着对方的饮食习惯,聊一些轻松愉快的话题,杯盘之间偶尔发出清脆的响声,这就是最好的教育。

26.     父母和孩子没有共同语言,常常是因为父母长期不和孩子围着一个桌子吃饭的缘故。很多人是在家庭的餐桌上学会了怎样做一个风趣的讲话者和一个好听众。

27.     引导孩子在固定的时间排便。早晨起来第一件大事,就是“朝拜”厕所。一天一次排便最健康,两天一次则说明可能“有病”(身体处于亚健康状态),三天一次则说明病得比较严重,四天以上一次则是“妖怪”。

28.     让孩子“身体好”的最古老而经典的办法是“早睡早起”。富兰克林的说法是:“早睡,早起,是使人富有、健康和聪明”

29.     为了孩子养成早睡早起的习惯,全家人最好少看电视,并尽量控制孩子看电视的时间。父母有时抱怨自己的孩子看电视的时间太多,其实,凡是家里有一个看电视的“小东西”,这个家里一定有一个或几个看电视的“老东西”。

30.     父母可以让孩子接触电脑游戏,但必须严格限制玩游戏的时间并监视游戏的主题。如果孩子不幸染上了“网瘾”,要么因为父母没有为孩子制定上网的规则,要么因为孩子在电脑游戏之外找不到足够的成就感。

31.     让孩子多接近自然,让孩子有足够的户外活动。

32.     不仅让孩子参与家庭决策,也让孩子参与家务劳动,让孩子在家务劳动中珍惜父母的劳动并因此而对所有帮助过自己的人心怀感恩,也让孩子在家务劳动中形成独立生存的技能。

33.     孩子会从父母帮自己耐心地修补衣物或玩具的过程中体验到父母的爱与责任。邀请孩子缝补衣物、修理玩具和家具的好处不只是培养孩子和父母的亲密关系,更重要的是,如果孩子小时候养成了缝补衣物、修理玩具的习惯,长大之后,他就学会了“缝补生活”和“修理生活”。

34.     智慧的父母会把培养孩子的劳动习惯当做教育孩子的头等大事。如果富裕的家庭不能为孩子提供高级的教育方法,倒不如让孩子过节制的、低调的比较贫穷的生活。

35.     自己的自由不能以干涉或破坏他人的自由为前提。如果你想开快车,就必须保证你有非常好的煞车。你不能给孩子太多自由,除非你有办法限制他们,让他们的行为举止守规矩。如果做不到这些自由生活的“金规则”,倒不如让孩子接受某种权威的教育。

36.     在当今的社会中,劳动对孩子的成长尤其重要。父母需要考虑的问题是:如何防止、阻止那些已经“衣食无忧”、获得“自由”的人走向身体的堕落和智力的堕落?

37.     人获得“解放”(政治解放和劳动解放)并因此而获得自由之后,人不仅不会由此而全面发展,反而会走向堕落。不仅身体堕落,智力也堕落,成为尼采所厌恶的“末人”或福山所谓的“最后的人”。

38.     若指望阻止身体的持续的败落,唯一的办法是返回手工劳动。劳动必须显示为生产,如果不以谋生为目的,如果不以生产某种生活必需品为目的,那么,人的好逸恶劳的本性就会拒绝劳动。

39.     只有真实的劳动才能阻止人的衰落。人一旦持久地放弃劳动,人的身体和精神就会衰落。

40.     除了培养孩子动的习惯,父母需要帮助孩子建立静的习惯:从给孩子讲故事开始,让孩子先学会听故事,然后邀请孩子自己讲故事,最后让孩子自己读故事和阅读相关的书。

41.     给孩子讲故事是家庭教育的远古传统。从来不给孩子讲故事的父母,是不负责任的父母。

42.     最好让孩子尽早建立健康的审美观。不要让孩子的审美观陷入低级、病态。不要以为小的、有病的,就是好的。不要以为强大的,就是坏的。不要以为小麻雀、小绵羊、小狗都是可爱的,也不要以为狮子、老虎、狼,狗,都是坏的。

43.     表面看,人的工作成就取决于人的专业水平,实际上,人对工作中是否有持久的热情,人在工作中是否能够与周围同事保持积极的人际关系,主要取决于人的业余爱好而不是专业技能。

44.     父母最好在孩子小的时候就开始引导孩子有自己最喜欢的学科,有自己最擅长的艺术技能和运动技能。

45.     不用过于担心孩子偏科或片面发展。相反,如果孩子对每门学科都平均用力,无所谓喜欢或者不喜欢,如果孩子在所有学科那里全面发展,这倒是一个问题。

46.     最好让孩子在3岁前后就开始训练某一门艺术技能,某些艺术技能的学习虽然不至于越小越好,但也有最佳起始年龄。比如,学习钢琴的最佳起始年龄一般在5岁前后。如果错过了起始年龄,孩子学习艺术技能时就会比较困难。

47.     在所有艺术项目中,“书法”是一个不错的选择,这需要父母有一定的耐心和激励的策略。很少有人天生喜欢书法,但对中国人来说,书法既可以增进孩子的艺术修养,又对孩子将来参加“笔纸”类的测试有帮助。

48.     让孩子掌握竞技类运动之所以重要,主要因为人在成长的过程中需要获得一些“被承认”(被赏识)的高峰体验。而且,孩子在与他人竞技比赛的过程中可以逐渐学会既竞争(争强好胜)又合作(包括协同竞争以及学会接受失败)的人格魅力。

49.     在鼓励孩子运动时,家长最好让孩子保持业余爱好的状态,不要让孩子走专业运动员的道路。

50.     孩子的成长虽然是一个连续的过程,但也显示出三个比较特别的关键年龄。或者说,孩子的成长有三个关键期:第一个关键期在3岁前后。第二个关键期是9岁前后;第三个关键期在13岁前后。

51.     孩子在每一个关键年龄都需要有关键能力的发展。如果错过了“成长的关键期”,孩子的某些潜能就会长期被压抑甚至终身丧失某种能力。

52.     3岁前后(尤其是3岁之前)的孩子处于无忧无虑的、天真无邪的无自我意识的状态。他与整个世界融为一体,没有边界意识,没有规则意识,他不接受任何禁忌。

53.     大自然希望儿童在成人以前就要像儿童的样子。如果我们打乱了这个次序,我们就会造成一些早熟的果实,它们长得既不丰满也不甜美,而且很快就会腐烂。

54.     不仅不应当争取时间,而且还必须把时间白白地放过去。最初几年的教育应当纯粹是消极的。你开头什么也不教,结果反而会创造一个教育的奇迹。

55.     孩子3岁前后,父母需要为这个年龄段的孩子提供三个关键教育。一是语感的教育。二是情感教育。三是感觉教育。

56.     在孩子9岁前后,家长需要为孩子提供三个“父亲的课程”:一是自食其力的独立教育。二是严慈相济的规则教育。三是劳逸结合的情绪教育。3岁前后的教育更多地显示出成长的自由与自然,而9岁前后孩子的教育更多地显示出“成长的残忍”和“成长的壮美”。

57.     13岁前后的三个关键教育是,第一,精神独立,鼓励孩子参与家庭决策,鼓励孩子独立思考。第二,学会自学,鼓励孩子以课外自学的方式走在老师的前面,让孩子学会“超前”学习。第三,设计自己喜欢的职业并尝试“职业生涯规划”。

58.     在孩子3岁前后,他的身边最好有一个放任型父母,不要对孩子构成太多的控制和干涉;在孩子9岁前后,他的身边最好有一个权威型父母,让孩子因权威而建立规则意识;在孩子13岁前后,他的身边最好有一个民主型父母,让孩子独立思考、亲自决策。

59.     9岁前后是孩子成长的关键期的关键。9岁前后的孩子开始出现比较明晰的自我意识,这是孩子走向“懂事”的关键阶段,也是孩子能否形成某些好习惯和改变某些坏习惯的关键期。如果错过了这个关键期,父母想改变的坏习惯,会比较困难。

60.     在孩子3岁前后,母亲的作用大于父亲,历史上有不少寡母能够把孩子培养成为“重要人物”,但很少有重要人物是由“父亲”一个人带大的(除非这位父亲能够扮演母亲的角色)。但是,孩子9岁前后,父亲的作用越来越重要。

61.     在放任型家庭中长大的孩子很难与其他人合作或者相处,在民主型家庭中长大的孩子没有决断能力,在权威型家庭中长大的孩子成为适应能力最强的人,他们能够自己做决定、遵守规则、善于与他人合作。

62.     成功的家庭教育总是让孩子的身边有一个或几个最喜爱又最敬畏的人。好家长就是让孩子既“敬畏”又“喜欢”的那个人。坏家长就是只让孩子畏惧而不让孩子喜欢的人。一两“威信”,胜过一公斤“说教”。

63.     给孩子的成长留出自由的时间,不要时时刻刻“盯”着孩子的考试成绩,也不要用太多的“兴趣班”把孩子的时间全部挤满。农民种庄稼,他们会让秧苗有足够的空隙,并享受充分的光照。如果没有足够的空隙,又没有享受充分的光照,秧苗长大之后,只能结出干瘪的谷穗。自由的时间不仅对孩子的成长重要,它对所有人都重要。

64.     一直忙碌的人是可耻的,腾不出时间娱乐的人,早晚会被迫腾出时间生病。

65.     除了带领孩子亲近自然,也让孩子亲近他的同龄人,让孩子寻找自己的玩伴。让孩子有自己的朋友,但不要有太杂乱的伙伴。孟子的母亲三次搬家,卢梭则把爱弥儿带到了乡村。在孩子没有形成成熟的理性和判断力之前,不让孩子有过多的伙伴,警惕孩子沾染同伴的坏习惯。

66.     不要借口“人是理性的动物”,也不要借口“非反思的生活是不值得过的生活”,就让孩子处于无休止的思考与训练之中。除了思考,人必须过不思考的生活。思虑太多,就会失去做人的乐趣。

67.     除了玩和活动,最好以美好的文学艺术培养9岁前后孩子的情趣生活。不重视情趣、文艺的民族,是野蛮的民族。缺乏情趣、文艺含量的教育,是野蛮的教育。

68.     过审美的生活,就是过有情趣的生活,过休闲的生活。

69.     经典的文学艺术作品是儿童遥远的精神导师。童话是孩子建立健康人格的“成长之桥”。

70.     不要小看童话的价值。童话让孩子领会如何成为受人欢迎的人,童话让孩子在内心深处建立“好人”的标准形象。

71.     如果说孩子9岁前后的关键教育是严慈相济的规则教育、劳逸结合的情绪教育和自食其力的独立教育,那么,这些教育在13岁前后的孩子那里则聚拢为比较彻底的独立生活,尤其独立自学。

72.     让孩子在参与家庭决策的过程中建立自信心和责任感,让孩子成为独立思考的、有主见的人。有修养的父母是伏尔泰主义者:我不同意你的观点,但我誓死捍卫你说话的权利。从孩子出生的那天就开始跟孩子讲道理,耐心地征求孩子的意见。不要指望打骂孩子就能够让孩子学会服从。杀鸡给猴看的结果是,猴子也学会了杀鸡。

73.     在孩子13岁前后,父母逐步做孩子的朋友。有效的教育是先严后松,无效的教育是先松后严。如果在孩子9岁前后纵容孩子,而在孩子13岁前后严格要求孩子,会遭到孩子的强力反抗。给青春期的孩子定规则是最危险的事情。

74.     父母最好让这个年龄段的孩子逐步由自理生活习惯发展为自学习惯。自学是让孩子在学校不掉队的唯一可靠的办法。

75.     一般而言,孩子长到13岁,整个“早期教育”差不多就已经完成。甚至可以认为,孩子长到13岁,整个“教育”就已经完成了。如果孩子成长顺利,13岁之后,孩子不需要再接受父母的教育,他自己会往前走,父母只需要站在孩子的后面,看着孩子走向远方。对于那些在13前后还没有形成自理生活的习惯和自学习惯的孩子来说,他需要的已经不是教育,而是“治疗”。

76.     每个儿童都有自己的成长的秘密,这些秘密构成了儿童之间的差异:一是性格上的差异;二是智力上的差异;三是性别上的差异,即男人(男孩)和女人(女孩)的差异。

77.     每个孩子都有自己的性格优势,也有自己的性格弱点。父母不要急于改变孩子的性格弱点。父母与其急于改变,不如先坦然地接受。如果父母坦然地接受孩子的性格弱点,那么,孩子的性格弱点会逐渐转化为高贵气质。

78.     长善救失或扬长补短是有意义的,但是,“长善”比“救失”更重要,“扬长”比“补短”更重要。不要让孩子放弃自己的长项而长时间地郁郁寡欢地补救自己的短处。特长发展比全面发展更重要。让孩子充分发挥他的“特长”和“优势”,以自己的特长发展带动自己的全面发展。

79.     用“书山有路勤为径”来鼓励孩子,但不要用“学海无涯苦作舟”来恐吓孩子。勤奋是必要的,但不必过于刻苦。在自己感兴趣的地方努力,那是勤奋;在自己不感兴趣的地方努力,那是刻苦。千万不要在你没兴趣的领域追求成功,因为你得跟那些真有兴趣的人竞争。没有兴趣,你怎么争得过人家?

80.     所谓的“片面发展”不仅不是成长的障碍,反而是成长的基本秘密。 家长和老师需要考虑的教育思路是:如果孩子已经显示出自己的特长,那么,家长和老师应该尊重和爱护孩子的特长。在尊重和爱护的前提下引导他顺便学习其他的科目。如果孩子尚未显示出自己的特长,那么,家长和老师应该鼓励他发展“多方面兴趣”,通过“多方面兴趣”逐步聚拢、聚焦,从“多方面兴趣”中选择一项或几项兴趣,作为自己的特长和优势。

81.     智慧的父母往往给孩子提供三种“赏识”:一是关注;二是赞扬;三是信任。表面看来,最强烈的赏识是表扬,实际上,信任的赏识效果可能最强烈且最持久。

82.     赏识孩子并不意味着不要批评。赏识并不与批评或惩罚对立,赏识的反面不是批评或惩罚,赏识的反面是“不善于赏识”。赏识是一门高级的教育技艺。如果父母善于赏识,掌握的赏识的技艺,就完全不必考虑所谓的批评或惩罚的问题。

83.     作为一门高级的教育技艺,赏识需要遵循一些基本原则。一是真诚而及时地给予赞扬,而且多赞扬孩子努力的过程或方法而不是赞扬他的结果或运气。二是以关注和信任为主而以奖励为辅。三是以赏识孩子的生活习惯或交往行为为主,而不要仅仅赏识孩子的学业成就。

84.     男孩的身上的雄性激素使男孩天生就喜欢破坏、冒险,具有攻击性,他必须处于活动之中。女孩与男孩不同。女孩可以整天逛街,她们愿意在百货商店里来回穿梭。

85.     不见得一定要采用所谓“男孩穷养,女孩富养”的办法,出色的父母只是“顺木之天,以致其性”,以不同的方式养育男孩和女孩。

86.     由于双性化的人既具有男性特质又具有女性特质,他们在各种情况下能应付自如。在学业优秀的小学和中学生中,双性化特质的个体比例最高,而学业不良者中未分化特质的个体占了绝大多数。双性化特质的学生不仅成绩优秀,而且兴趣广泛、全面发展,在班级、院系和学校中担当学生干部。

87.     正当的家庭教育虽然显示为“性格-身体本位”,但是,家长也需要关注孩子的学习习惯,尤其需要帮助孩子逐步建立强大的自学习惯。限于篇幅,这里主要讨论家长如何帮助孩子建立语文、数学和外语学习的自学习惯。

88.     有效的语文学习往往显示为三个特点:一是课外自学。语文出色的学生很少来自“上课认真听讲”,更多来自学生课外大量阅读。二是整体学习。语文出色的学生很少来自课堂教学中的细读、精读,更多来自课外的“好读书,不求甚解”的整体泛读。三是有主见的学习。语文出色的学生不仅因为大量阅读,而且因为大量写作,以写带读。

89.     有效的数学学习往往显示为三个特点:一是超前学习,不能亦步亦趋地跟在教师的后面学习数学,最好走在教师的前面自学数学,不让自己因偶然的开小差而掉队。二是整体学习,尽可能进入“高观点下的初等数学”的状态,尽可能站在整体的高度俯视具体的数学问题,尽可能经由超前学习之后而回头来理解前面的简单数学。三是基于问题解决的学习,尽可能使数学显示为生活数学,同时又需要建立稳定的“数感”,使生活问题“数学化”。

90.     学习外语的第一个秘密是“听领先”。学习外语的第二个秘密是,不仅“听领先”,而且“整体地听”。如果期望孩子学会外语,家长或老师所要做的事情其实很简单:寻找适合孩子听的外语材料(最初最好是视听材料而不是纯粹的录音材料)。让孩子在看外文电影或电视剧的过程中听纯正的外语。

91.     所谓“问题儿童”,常常是正常儿童,只是因为成人的某种偏见而对某些特别的孩子贴上的标签。而且,恰恰是所谓的问题儿童,他们的身上可能蕴含了人类的最宝贵或最高贵的元素。

92.     最幸福的人,是那些有游戏精神的人。如果家长没有引导孩子以古典的方式展开学习生活或以古典的方式展开游戏生活,那么,孩子拥有网络游戏的生活,也好过那种没有任何游戏感的乏味的生活。

93.     即使不必提倡恋爱从小学就开始,但至少应该从小学就开始有正式的或非正式的“情感教育”课程,包括爱异性和爱一切他人。从初中开始,就应该为孩子提供坦然的、科学的“性教育”课程。既让孩子了解“性”的美好,也让孩子了解“性”的危险。

94.     给孩子提供一个温暖的家庭环境,只有那些夫妻关系混乱、家庭生活异常的孩子才容易发生所谓的“早恋”,只有那些在家庭生活中找不到爱的孩子才容易发生所谓的“早恋”。如果一个女孩在家庭中享受了足够的父爱,她就不会因为某个男孩轻轻触碰她的头发而发生触电般的兴奋和颤栗。如果一个男孩在家庭生活中感觉足够的天伦之乐,他就不会轻易在别的地方寻找慰藉和温暖。

95.     在孩子小的时候就尽可能带孩子游览外面的世界,让孩子开阔眼界。让孩子从小积累“一览众山小”的高峰体验。视野开阔的孩子会逐步领会:任何美好的事物都是值得等待的,而且,只有那些有见识的、视野开阔的人才知道什么是美好的事物。只有那些视野狭窄的人在说话或做事时才会容易走极端;只有那些没有见识美好事物从来不知道何为高贵生活的孩子才会容易发生所谓的“早恋”。

96.     轻度的“自闭”不仅不是某种疾病,相反,它是人类的美好生活的基本需要。在以“躁动不安”、“心浮气躁”为特征的现代社会中,适度的“自闭”即便不是拯救现代性的唯一出路,至少也是一个悬隔杂念、维护宁静的重要方案。

97.     自然的,就是好的。比较自然的,就是比较好的。最自然的,就是最好的。当人类对高科技依赖成瘾之时,灾难将接踵而至。科技越高深、高速发展,人类越灾难深重。

98.     警惕转基因食品。即便我们无法避免,也最好尽可能少吃转基因食品。

99.     生病很正常,无论动物还是植物,都会在某个时候生病。生病并不意味着一定要吃药,更不意味着一定要看医生。因为人体有强大的免疫系统,人体的免疫系统可以对抗绝大部分疾病(少数疾病例外)。由于每个人的体内都有强大的免疫系统,时间就成为治病最好的医生。人生病之后,需要的主要是等待而不是吃药。时间能够医治绝大部分疾病。如果希望孩子健康,那么,最好让孩子多运动,多吃五谷杂粮。五谷杂粮和运动是最好的营养品。

100.   教孩子学会考试。第一,从埋头的“模拟考试”到抬头的“胸有成竹”。第二,建立强大的意向性。第三,保持舒适的饮食与睡眠

阅读全文……

标签 :

使用Mahout基于用户和物品相似度进行协同过滤推荐内容

基于用户User协同过滤

package mahout;

 

import java.io.File;

import java.io.IOException;

import java.util.List;

 

import org.apache.mahout.cf.taste.common.TasteException;

import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;

import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;

import org.apache.mahout.cf.taste.impl.recommender.CachingRecommender;

import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;

import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;

import org.apache.mahout.cf.taste.model.DataModel;

import org.apache.mahout.cf.taste.model.JDBCDataModel;

import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;

import org.apache.mahout.cf.taste.recommender.RecommendedItem;

import org.apache.mahout.cf.taste.recommender.Recommender;

import org.apache.mahout.cf.taste.similarity.UserSimilarity;

  

/**

 * 基于用户相似度进行推荐

 * mahout基于协同过滤(CF)的推荐 

 * 用户对物品进行评分,对于无评分只有喜欢、不喜欢的,可以将喜欢置为5分,不喜欢置为1分

 * @author itindex

 *

 */

public class Mahout {  

    public static void main(String[] args) throws TasteException, IOException {  

          

        //(1)----连接数据库部分  

//        MysqlDataSource dataSource = new MysqlDataSource();  

//        dataSource.setServerName("localhost");  

//        dataSource.setUser("admin");  

//        dataSource.setPassword("admin");  

//        dataSource.setDatabaseName("mahoutDB");  

//      //(2)----使用MySQLJDBCDataModel数据源读取MySQL里的数据  

//        JDBCDataModel dataModel = new MySQLJDBCDataModel(dataSource, "table1", "userId", "itemId", "preference", "date");  

          

        //(3)----数据模型部分  

         //把MySQLJDBCDataModel对象赋值给DataModel  

//        DataModel model = dataModel;  

   

   

    DataModel model = new FileDataModel(new File("D:/intro.csv"));

        //用户相似度UserSimilarity:包含相似性度量和邻居参数  

        UserSimilarity similarity = new PearsonCorrelationSimilarity(model);  

        //相邻用户UserNeighborhood  

        UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model);  

        //一旦确定相邻用户,一个普通的user-based推荐器被构建,构建一个GenericUserBasedRecommender推荐器需要数据源DataModel,用户相似性UserSimilarity,相邻用户相似度UserNeighborhood  

        Recommender recommender = new CachingRecommender(new GenericUserBasedRecommender(model, neighborhood, similarity));  

        //向用户1推荐2个商品  

        List<RecommendedItem> recommendations = recommender.recommend(1, 2);  

        for(RecommendedItem recommendation : recommendations){  

            //输出推荐结果  

            System.out.println(recommendation);  

        }  

    }  

  

}  

 

基于物品Item进行协同过滤:

package mahout;

 

import java.io.File;

import java.util.Collection;

import java.util.List;

 

import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;

import org.apache.mahout.cf.taste.impl.recommender.CachingRecommender;

import org.apache.mahout.cf.taste.impl.recommender.GenericItemBasedRecommender;

import org.apache.mahout.cf.taste.impl.similarity.EuclideanDistanceSimilarity;

import org.apache.mahout.cf.taste.impl.similarity.GenericItemSimilarity;

import org.apache.mahout.cf.taste.model.DataModel;

import org.apache.mahout.cf.taste.recommender.RecommendedItem;

import org.apache.mahout.cf.taste.recommender.Recommender;

import org.apache.mahout.cf.taste.similarity.ItemSimilarity;

/**

 * 基于Item 物品相似度进行推荐

 * 用户对物品进行评分,对于无评分只有喜欢、不喜欢的,可以将喜欢置为5分,不喜欢置为1分

 * @author itindex

 *

 */

public class RecommenderIntro {

 

    public static void main(String[] args) throws Exception {

        //装载数据文件,实现存储,并为计算提供所需的所有偏好,用户和物品数据

        DataModel model = new FileDataModel(new File("D:/intro.csv"));

        

        //基于物品的推荐

        Recommender recommender1 ;

        

        ItemSimilarity otherSimilarity = new EuclideanDistanceSimilarity(model);  

        GenericItemSimilarity similarity2 = new GenericItemSimilarity(otherSimilarity, model);  

        recommender1 = new CachingRecommender(new GenericItemBasedRecommender(model, similarity2));  

            

        //为用户1推荐一件物品1,1

        List<RecommendedItem> recommendedItems = recommender1.recommend(1, 2);

        

        //输出

        for (RecommendedItem item : recommendedItems) {

            System.out.println(item);

        System.out.println(item.getItemID());

System.out.println(item.getValue());

        }

    }

}

 intro.csv文件格式:

用户id,物品id,评分

1,10,5

1,12,5

1,14,1

2,12,5

3,10,5

3,12,5

3,13,5

3,14,1

4,10,5