admin 的blog

祝你愉快

8f24191f5a6c11e6e1fe0b47 c18a571f2951d404304e15a9 

天空海阔是无尽美梦
可惜只得一个破天空
寻求人间仅有的希望
骤觉得到了又已失去了
不懂欢笑像留下缺陷
哥哥可否知道我的心
常常埋怨仿似不长大
是你给予我留我一点真
默默悼念默默愤怒埋怨
一生充满了斗志永不倦
怎可终止
他的生命是真理
他的生命没扭转
但愿在你的远方
可听得到我这歌
常欠缺了你在旁
陪伴上路多么不安
但愿用这一阙歌
来冲洗心中我苦楚
来叫喊我对你未忘
含泪说声
祝你愉快
看天空可变改

技术交流

My House RC4

昨天把装修公司定了,选的的是大兴本地的一家装修公司,主要是他们活比较细致,价格比较合理。这是他们给的效果图。

卧室柜 客厅

电脑桌 背景墙副本

 过道 门厅

阳台 书柜

卧室

Tomcat 6支持的Comet

今天在测试中无意中看到Tomcat 6的新特性Comet,使用Comet技术可以轻松实现一个Pushlet的功能,让我看了着实兴奋不已,而其官方网站还给出了一个Messenger的例子。

  1. public class ChatServlet
  2. extends HttpServlet implements CometProcessor {
  3.  
  4. protected ArrayList<HttpServletResponse> connections =
  5. new ArrayList<HttpServletResponse>();
  6. protected MessageSender messageSender = null;
  7. public void init() throws ServletException {
  8. messageSender = new MessageSender();
  9. Thread messageSenderThread =
  10. new Thread(messageSender, "MessageSender[" + getServletContext().getContextPath() + "]");
  11. messageSenderThread.setDaemon(true);
  12. messageSenderThread.start();
  13. }
  14.  
  15. public void destroy() {
  16. connections.clear();
  17. messageSender.stop();
  18. messageSender = null;
  19. }
  20.  
  21. /**
  22. * Process the given Comet event.
  23. *
  24. * @param event The Comet event that will be processed
  25. * @throws IOException
  26. * @throws ServletException
  27. */
  28. public void event(CometEvent event)
  29. throws IOException, ServletException {
  30. HttpServletRequest request = event.getHttpServletRequest();
  31. HttpServletResponse response = event.getHttpServletResponse();
  32. if (event.getEventType() == CometEvent.EventType.BEGIN) {
  33. log("Begin for session: " + request.getSession(true).getId());
  34. PrintWriter writer = response.getWriter();
  35. writer.println("<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">");
  36. writer.println("<head><title>JSP Chat</title></head><body bgcolor=\"#FFFFFF\">");
  37. writer.flush();
  38. synchronized(connections) {
  39. connections.add(response);
  40. }
  41. } else if (event.getEventType() == CometEvent.EventType.ERROR) {
  42. log("Error for session: " + request.getSession(true).getId());
  43. synchronized(connections) {
  44. connections.remove(response);
  45. }
  46. event.close();
  47. } else if (event.getEventType() == CometEvent.EventType.END) {
  48. log("End for session: " + request.getSession(true).getId());
  49. synchronized(connections) {
  50. connections.remove(response);
  51. }
  52. PrintWriter writer = response.getWriter();
  53. writer.println("</body></html>");
  54. event.close();
  55. } else if (event.getEventType() == CometEvent.EventType.READ) {
  56. InputStream is = request.getInputStream();
  57. byte[] buf = new byte[512];
  58. do {
  59. int n = is.read(buf); //can throw an IOException
  60. if (n > 0) {
  61. log("Read " + n + " bytes: " + new String(buf, 0, n)
  62. + " for session: " + request.getSession(true).getId());
  63. } else if (n < 0) {
  64. error(event, request, response);
  65. return;
  66. }
  67. } while (is.available() > 0);
  68. }
  69. }
  70.  
  71. public class MessageSender implements Runnable {
  72.  
  73. protected boolean running = true;
  74. protected ArrayList<String> messages = new ArrayList<String>();
  75. public MessageSender() {
  76. }
  77. public void stop() {
  78. running = false;
  79. }
  80.  
  81. /**
  82. * Add message for sending.
  83. */
  84. public void send(String user, String message) {
  85. synchronized (messages) {
  86. messages.add("[" + user + "]: " + message);
  87. messages.notify();
  88. }
  89. }
  90.  
  91. public void run() {
  92.  
  93. while (running) {
  94.  
  95. if (messages.size() == 0) {
  96. try {
  97. synchronized (messages) {
  98. messages.wait();
  99. }
  100. } catch (InterruptedException e) {
  101. // Ignore
  102. }
  103. }
  104.  
  105. synchronized (connections) {
  106. String[] pendingMessages = null;
  107. synchronized (messages) {
  108. pendingMessages = messages.toArray(new String[0]);
  109. messages.clear();
  110. }
  111. // Send any pending message on all the open connections
  112. for (int i = 0; i < connections.size(); i++) {
  113. try {
  114. PrintWriter writer = connections.get(i).getWriter();
  115. for (int j = 0; j < pendingMessages.length; j++) {
  116. writer.println(pendingMessages[j] + "<br>");
  117. }
  118. writer.flush();
  119. } catch (IOException e) {
  120. log("IOExeption sending message", e);
  121. }
  122. }
  123. }
  124.  
  125. }
  126.  
  127. }
  128.  
  129. }
  130.  
  131. }

Archived in

64位RedHat AS5安装PHP JSON模块

最近安装了一台RedHat AS5 64bit的服务器,但是在安装完后返现默认安装的PHP中居然没有装载JSON模块。在PHP的官方网站上看到可以使用PECL安装PHP的模块。

#pecl install json

安装编译很顺利但是到后面的模块测试时出错,错误如下:

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 143 bytes) in /usr/share/pear/PEAR/PackageFile/v2.php on line 1058

在此执行pecl install json系统提示已经安装过json模块,使用php -m系统给出如下错误:

PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/json' - /usr/lib64/php/modules/json: cannot open shared object file: No such file or directory in Unknown on line 0

于是查看/etc/php.ini文件,返现extension=json,将其改为extension=json.so,运行

#php -m
发现json安装正常,不知道是不是PHPJSON大意将extension=json.so写成了extension=json

Archived in