关于论坛
今天了解了几个开源的论坛: phpBB、MyBB、smf,简单写一下心得
这三个论坛在sae上都有修改后的,可以直接安装
mybb不是完全面向对象的实现,代码结构不太好看;
smf的代码更是完全的面向过程的写法,尤其把函数都放到一个数组里面,通过数组的方式来使用,是非常的不编辑器友好的;
mybb和smf都是国外的开源软件,都在持续的维护着呢。
mybb和phpbb都可以安装插件之后通过tabatalk这个手机app来访问,参看: http://tapatalk.com 但是,目前只有iphone上有这个app,而且这个app还是收费的。
mybb可以通过插件: http://www.mybbgm.com/download.php 实现手机友好的访问
关于PHP的session的失效机制
参考资料: http://www.jb51.net/article/26890.htm 这里有些是对的,有些是错的,稍后整理一下
PHP Soap 生成WSDL
缘起:
1. 开发一个http的webservice,接口定义是比较费时的,使用现成的webservice还是比较不错的
2. 常用的webservice有Soap和RPC,Soap是业界的标准,而RPC则比较轻量级
3. 使用Soap时,如果手动来写wsdl文件是非常糟糕的事情,下面提供自动生成wsdl的方法
4. 使用Soap时,编辑器很难提示类有什么方法,如果给编辑器一个soap的插件帮助提示,便是极好的,有没有呢?
一些参考资料:
http://stackoverflow.com/questions/12490298/perfect-soap-wsdl-web-service-in-php
一个可以生成wsdl的PHP类,参考资料: http://www.cnblogs.com/phpdragon/archive/2012/06/10/2544171.html
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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
<?php /** * Copyright (c) 2005, Braulio Jos?Solano Rojas * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * Neither the name of the Solsoft de Costa Rica S.A. nor the names of its contributors may * be used to endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * @version $Id$ * @copyright 2005 */ /** * SoapDiscovery Class that provides Web Service Definition Language (WSDL). * * @package SoapDiscovery * @author Braulio Jos?Solano Rojas * @copyright Copyright (c) 2005 Braulio Jos?Solano Rojas * @version $Id$ * @access public * */ class SoapDiscovery { private $class_name = ''; private $service_name = ''; /** * SoapDiscovery::__construct() SoapDiscovery class Constructor. * * @param string $class_name * @param string $service_name * */ public function __construct($class_name = '', $service_name = '') { $this->class_name = $class_name; $this->service_name = $service_name; } /** * SoapDiscovery::getWSDL() Returns the WSDL of a class if the class is instantiable. * * @return string * */ public function getWSDL() { if (empty($this->service_name)) { throw new Exception('No service name.'); } $headerWSDL = "<?xml version=\"1.0\" ?>\n"; $headerWSDL.= "<definitions name=\"$this->service_name\" targetNamespace=\"urn:$this->service_name\" xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\" xmlns:soap=\"http://schemas.xmlsoap.org/wsdl/soap/\" xmlns:tns=\"urn:$this->service_name\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns=\"http://schemas.xmlsoap.org/wsdl/\">\n"; $headerWSDL.= "<types xmlns=\"http://schemas.xmlsoap.org/wsdl/\" />\n"; if (empty($this->class_name)) { throw new Exception('No class name.'); } $class = new ReflectionClass($this->class_name); if (!$class->isInstantiable()) { throw new Exception('Class is not instantiable.'); } $methods = $class->getMethods(); $portTypeWSDL = '<portType name="' . $this->service_name . 'Port">'; $bindingWSDL = '<binding name="' . $this->service_name . 'Binding" type="tns:' . $this->service_name . "Port\">\n<soap:binding style=\"rpc\" transport=\"http://schemas.xmlsoap.org/soap/http\" />\n"; $serviceWSDL = '<service name="' . $this->service_name . "\">\n<documentation />\n<port name=\"" . $this->service_name . 'Port" binding="tns:' . $this->service_name . "Binding\"><soap:address location=\"http://" . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . $_SERVER['PHP_SELF'] . "\" />\n</port>\n</service>\n"; $messageWSDL = ''; foreach ($methods as $method) { if ($method->isPublic() && !$method->isConstructor()) { $portTypeWSDL.= '<operation name="' . $method->getName() . "\">\n" . '<input message="tns:' . $method->getName() . "Request\" />\n<output message=\"tns:" . $method->getName() . "Response\" />\n</operation>\n"; $bindingWSDL.= '<operation name="' . $method->getName() . "\">\n" . '<soap:operation soapAction="urn:' . $this->service_name . '#' . $this->class_name . '#' . $method->getName() . "\" />\n<input><soap:body use=\"encoded\" namespace=\"urn:$this->service_name\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" />\n</input>\n<output>\n<soap:body use=\"encoded\" namespace=\"urn:$this->service_name\" encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" />\n</output>\n</operation>\n"; $messageWSDL.= '<message name="' . $method->getName() . "Request\">\n"; $parameters = $method->getParameters(); foreach ($parameters as $parameter) { $messageWSDL.= '<part name="' . $parameter->getName() . "\" type=\"xsd:string\" />\n"; } $messageWSDL.= "</message>\n"; $messageWSDL.= '<message name="' . $method->getName() . "Response\">\n"; $messageWSDL.= '<part name="' . $method->getName() . "\" type=\"xsd:string\" />\n"; $messageWSDL.= "</message>\n"; } } $portTypeWSDL.= "</portType>\n"; $bindingWSDL.= "</binding>\n"; //return sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>'); //生成wsdl文件,将上面的return注释 $fso = fopen($this->class_name . ".wsdl", "w"); fwrite($fso, sprintf('%s%s%s%s%s%s', $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, '</definitions>')); } /** * SoapDiscovery::getDiscovery() Returns discovery of WSDL. * * @return string * */ public function getDiscovery() { return "<?xml version=\"1.0\" ?>\n<disco:discovery xmlns:disco=\"http://schemas.xmlsoap.org/disco/\" xmlns:scl=\"http://schemas.xmlsoap.org/disco/scl/\">\n<scl:contractRef ref=\"http://" . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . $_SERVER['PHP_SELF'] . "?wsdl\" />\n</disco:discovery>"; } } |
Ubuntu12.04升级之苦旅
缘起:
想在ubuntu上做一些实验,原来在virtualbox中安装的ubuntu12.04分配了8G的磁盘空间,而且没有分区,即将用完,于是考虑扩大一下磁盘容量,把/usr目录给移到一个单独的分区
开始
第一步: 使用virtualbox自带的工具给磁盘扩容,当然,扩容之后的磁盘会多一个未分区的空间,还需进一步的分区、格式化,才能使用,ubuntu的分区、格式化可以使用gpart软件
参考资料: http://hi.baidu.com/xuhuan_scu/item/83c93f426159d1f2a4c066d4
第二步: 因为系统运行期间移动 /usr 目录是不靠谱的,所以:
1. 使用virtualbox的功能把磁盘copy一份,新建一个虚拟机
2. 在新建的虚拟机上挂载要修改的虚拟机的磁盘
2.1 将主分区挂载到 /data_root 目录; 将新创建分区挂载到 /data_usr 目录
2.2 把 /data_root/usr/ 下的文件全部copy到 /data_usr/ 中,命令: cp -pr /data_root/usr/* /data_usr/
2.3 修改 /data_root/etc/fstab 文件, 将新的分区挂载到 /usr 目录上
3. 用修改后的磁盘启动系统,发现/usr 目录已经移动到了新的分区上了
第三步: 升级系统
1. 由于刚才一个系统上挂载了两个可以启动的磁盘,导致grub出问题,更新系统的时候会帮助修复grub
2. 系统升级后,重启系统,出现“The System is running in low graphics mode”的问题,解决办法: http://blog.csdn.net/love_world_/article/details/8644483
1 2 |
cd /etc/X11 sudo cp xorg.conf.failsafe xorg.conf |
3. 升级后的系统无法切换到“无缝模式”,重新安装“增强工具”,提示缺少内核头文件,其实不是这么回事儿,参考资料: http://blog.csdn.net/wzwind/article/details/6656331 虽然不在报错,但是安装后还是无法切换到“无缝模式”
1 |
sudo apt-get install dkms build-essential linux-headers-$(uname -r) |
关于JAVA内存
JAVA 内存模型
参考资料:
http://developer.51cto.com/art/201009/225071.htm
http://www.infoq.com/cn/articles/java-memory-model-1
http://baike.baidu.com/view/8657411.htm
JAVA内存大小设置:
http://www.rsky.com.cn/Article/java/201002/11289.html
http://developer.51cto.com/art/200907/135038.htm
问题: 如果设置的内存大小超过了系统的物理内存大小,则数据放到何处?
这样的话,虚拟机就跑不起来的
关于JAVA线程和线程池的学习
Java线程:
Java线程不等于系统线程,Java线程和系统线程也没有必然的映射关系。
1 2 |
java线程管理是JVM的一部分,虽然大部分JVM直接映射java线程到底层系统线程,但是还是java的线程管理决定谁有机会运行 The thread scheduler is the part of the JVM (although most JVMs map Java threads directly to native threads on the underlying OS) that decides which thread should run at any given moment, and also takes threads out of the run state. Assuming a single processor machine, only one thread can actually run at a time. Only one stack can ever be executing at one time. And it's the thread scheduler that decides which thread—of all that are eligible—will actually run. |
参考文档:
http://wenku.baidu.com/view/2ffaac1fa8114431b90dd8fe.html
java的线程概念与操作系统的线程概念是不同的,java的线程概念差不多与windows线程概念一致,但是java既然目标是跨平台语言,那么它的线程机制概念是在所有平台上都是一样的,但是实际实现又不是如此,这要从进程与线程的概念中谈起:
首先在windows系列系统中,进程所拥有的内存空间都是独立的,此进程所持有的内存其它进程是不可以直接访问的,而且在windows系统内部一个进程就是一个运行的运用程序,而为了解决应用程序内部的并行问题便有了线程的概念,线程没有自我独立的内存空间,在一个进程中所有的线程共享这个进程所持有的内存空间。
而在某些Unix系统当中,进程所持有的内存空间是可以被其他进程进行访问的,而且一个运用程序可能不止一个进程,这样的系统没有线程的概念,运用的并行问题有多个进程协调来解决。
java为了实现平台无关性,必须解决这样一个问题,因此java建立了一套自己的进程与线程机制,这套机制与windows系统的颇为相似,但是底层实现确实根据不同平台的机制进行实现,比如windows下的线程机制就是利用windows本身的线程机制加上某些改进进行处理的,而某些没有线程的Unix系统则是用进程来替代线程进行实现的,然后在其中确立一个主进程来替代自身进程。虽然这样的实现解决了大部分的线程平台无关性,但是也有些无法解决的,比如线程优先级,windows下线程是有优先级的,但是某些Linux系统,某些Unix系统,进程与线程直接不区分优先级,因此优先级在每个系统下的表现形式就不一样,例如低优先级的进程可能在windows下被饿死,但是在linux下,根本就无法感觉它优先级较低,还有,在建立一个线程与杀死一个线程运用所带来的开销也会不同,在windows下建立或杀死线程可能是不需要什么开销的,但是在没有线程概念的进程行操作系统中,杀死或者建立线程可能带来巨大开销
—————————————————————————————————————————————–
Java自带的线程池ThreadPoolExecutor详细介绍说明和实例应用
http://fulong258.blog.163.com/blog/static/17895044201082951820935/
http://www.cnblogs.com/jersey/archive/2011/03/30/2000231.html
Java线程示例
http://www.cnblogs.com/rollenholt/archive/2011/08/28/2156357.html
update-alternatives学习笔记
转自: http://blog.csdn.net/heyutao007/article/details/5441482
Linux 发展到今天,可用的软件已经非常多了。这样自然会有一些软件的功能大致上相同。例如,同样是编辑器,就有 nvi、vim、emacs、nano,而且我说的这些还只是一部分。大多数情况下,这样的功能相似的软件都是同时安装在系统里的,可以用它们的名称来执行。例如,要执行 vim,只要在终端下输入 vim 并按回车就可以了。不过,有些情况下我们需要用一个相对固定的命令调用这些程序中的一个。例如,当我们写一个脚本程序时,只要写下 editor,而不希望要为“编辑器是哪个”而操心。Debian 提供了一种机制来解决这个问题,而 update-alternatives 就是用来实现这种机制的。
1)首先要介绍的参数是 –display。它使我们可以看到一个命令的所有可选命令。执行:
update-alternatives –display editor
可以看到我的机器上的所有可以用来被 editor 链接的命令。
2)–config。这个选项使我们可以选择其中一个命令程序来作为editor,执行:
update-alternatives –config editor
首先,update-alternatives 在一般情况下是由postinst 和 prerm 这样的安装脚本自动调用的,所以一个 alternative 的状态有两种:自动和手动。每个 alternative 的初始状态都是自动。如果系统发现管理员手动修改了一个 alternative,它的状态就从自动变成了手动,这样安装脚本就不会更新它了。如果你希望将一个 alternative 变回自动,只要执行代码:
update-alternatives –auto editor
general name — 这是指一系列功能相似的程序的“公用”名字(包括绝对路径),比如 /usr/bin/editor。
link — 这是指一个 alternative 在 /etc/alternative 中的名字,比如 editor。
alternative — 顾名思义,这是指一个可选的程序所在的路径(包括绝对路径),比如 /usr/bin/vim。
-auto,–display 和 –config 跟的都是 link。我们要说的第三个概念是优先级。这个比较简单,当然优先级越高的程序越好啦。最后一个概念是主和从的 alternative。想想看,你将 /usr/bin/editor 链接到了 vim,可是当你执行 man editor 时看到的却是 emacs 的 manpage,你会做何感想呢?这就引出了主和从 alternative 的概念了:当更新主的 alternative 时,从的 alternative 也会被更新。
另外两个选项:
第一个是 –install。它的格式是: 代码:
update-alternatives –install gen link alt pri [–slave sgen slink salt] …
gen,link,alt,pri 分别是我们上面说过的。如果需要从的 alternative,你可以用–slave 加在后面。如果你在向一个已经存在的 alternative 组中添加新的 alternatives,该命令会把这些 alternatives 加入到这个已经存在的 alternative 组的列表中,并用新的可选命令作为新的命令;否则,将会建立一个新的自动的 alternative组。
呜呼!我加入了一个错误的 alternative。我不想要这个 alternative 了。在这种情况
下,可以执行下面的命令:代码:
update-alternatives –remove name path
ubuntu12.04安装JDK7
搭建一个微博系统
下载window版本redis:
https://github.com/dmajkic/redis
windows上让redis作为服务启动:
https://github.com/kcherenkov/redis-windows-service 可以直接下载里面编译好的二进制文件
下载retwis:
http://redis.googlecode.com/files/retwis-0.3.tar.gz 这个包中的redis协议不是最新的,可在下面地址下载:
http://phpor.net/download/retwis.zip
参考文档: