背景

过去两年多来,我们的网站一直运行Apache+mod_php模块,大多数时候这个组合应付得过来,但随着流量的增加,我们注意到Apache已经显得很吃力了,它开始疯狂地吃内存,CPU也被全部抢占去了,我们需要找到一个更快的方法来解决问题。

Nginx是一个不错的选择,很多指标都超过了Apache,如I/O、CPU、内存和请求数/秒等,如果需要,随时可以从Google搜索相关信息。从我个人的测试结果来看,Nginx和Apache之间的差异是很明显的,不好意思,因为是非正式测试,因此相关数字我就不公布了,这也不是本文的重点。让我更自信的是,我只需要几个步骤就可以让性能远超Apache。

PHP-FPM?

很多人配置Nginx时可能都会选择来自LightTPD项目的spawn-fcgi解析PHP,但使用spawn-fcgi有些问题,因此我打算放弃它另觅别的办法。PHP-FPM是PHP FastCGI Process Manager的缩写,即PHP FastCGI进程管理器,实际上它是PHP的一个补丁,旨在将FastCGI进程管理整合进PHP包中。

注意:即使你坚持使用Apache,也有很多原因跳过mod_php,直接通过FastCGI解析PHP。使用mod_php时,Apache处理载入PHP的每个请求会载入所有的库,这是一个巨大的无畏开销。如果使用FastCGI,PHP的行为更象应用程序服务器,PHP-FPM以及spawn-fcgi按需要载入和杀掉PHP实例,这样做有很多好处,其中很重要的一点就是减少内存开销。
〈一〉如何实现C中调用C++
如何用c语言调用c++做成的动态链接库, 转至
http://blog.donews.com/xzwenlan/archive/2005/05/31/405799.aspx
链接库头文件:

//head.h
class A
{
        public:
        A();
        virtual ~A();
        int gt();
        int pt();
private:
        int s;
};
.cpp
//firstso.cpp
#include <iostream>
#include "head.h"
A::A(){}
A::~A(){}
int A::gt()
        {
s=10;
                }
int A::pt()
        {
      
                std::cout<<s<<std::endl;
        }

编译命令如下:
g++ -shared -o libmy.so firstso.cpp
这时候生成libmy.so文件,将其拷贝到系统库里面:/usr/lib/
进行二次封装:
.cpp

//secso.cpp
#include <iostream>
#include "head.h"
extern "C"
{
int f();
int f()
{
A a;
a.gt();
a.pt();
return 0;
}
}

编译命令:
gcc -shared -o sec.so secso.cpp -L. -lmy
这时候生成第二个.so文件,此时库从一个类变成了一个c的接口.
拷贝到/usr/lib
下面开始调用:
//test.c

#include "stdio.h"
#include "dlfcn.h"
#define SOFILE "sec.so"
int (*f)();
int main()
{
void *dp;
dp=dlopen(SOFILE,RTLD_LAZY);
f=dlsym(dp,"f");
f();
return 0;
}

编译命令如下:
gcc -rdynamic -s -o myapp test.c

运行Z$./myapp
10
$
关于这个文章的一点补充,转至http://blogs.sun.com/lirincy/
这篇blog写了怎样用C调用C++的库,我试验了一下,在linux上成功,
有两个地方要改一下,最后的编译语句应该是:

gcc -rdynamic -s -o -ldl myapp test.c

还有就是test.c最后应该加上:
dlclose(dp);
否则会CoreDump。
实际上他是把类的方法变成了一个可以外部调用的C函数,用extern C。
二〉C++程序如何调用C语言写的库,如a.lib等,有对应的库头文件a.h。假设a.h中定义了函数:
int WhyCoding(int a, float b);
做法是,

extern "C" {
#include "a.h"
}



extern "C" {
int WhyCoding(int a, float b);
}

从上面可以看出,extern "C" 是用在C和C++之间的桥梁。之所以需要这个桥梁是因为C编译器编译函数时不带
函数的类型信息,只包含函数符号名字,如C编译器把函数int a(float x)编译成类似_a这样的符号,C连接器只要
找到了调用函数的符号,就可以连接成功,它假设参数类型信息是正确的,这是C编译连接器的缺点。而C++
编译器为了实现函数重载,编译时会带上函数的类型信息,如他把上面的a函数可能编译成_a_float这样的
符号为了实现重载,注意它还是没有带返回值得信息,这也是为什么C++不支持采用函数返回值来区别函数
重载的原因之一,当然,函数的使用者对函数返回值的处理方式(如忽略)也是重要原因。

基于以上,C调用C++,首先需要用封装函数把对C++的类等的调用封装成C函数以便C调用,于是extern "C" 的
作用是:让编译器知道这件事,然后以C语言的方式编译和连接封装函数.(通常是把封装函数用C++编译器按C++
方式编译,用了extern "C" 后,编译器便依C的方式编译封装接口,当然接口函数里面的C++语法还是按C++方式
编译;对于C语言部分--调用者,还是按C语言编译;分别对C++接口部分和C部分编译后,再连接就可以实现C
调用C++了).

相反,C++调用C函数,extern "C" 的作用是:让C++连接器找调用函数的符号时采用C的方式,即使用_a而不是
_a_float来找调用函数。

chai, zheng 1:20 AM, Nov 29, 2006 at nanjing, China
D:\Windows动态链接库;D:\Dev-Cpp\mingw32\bin;D:\Qt\4.2.1\bin
byte------表示段的开始地址为字节地址
word-----表示段的开始地址为字地址,也就是从2、4、6字节地址开始dword----
bit-表示位

1word=2bytes
1byte=8bits

1K=1024B
1M=1024K
1G=1024M

byte是字节,bit是位
1个字节等于8个位
一个汉字占两个字节。

bit,通常指一个二进制位,
byte,通常包含8bit,
word,与系统硬件(总线、cpu命令字位数等)有关,如数据总线为16位,则1word为2byte。32位 1word为4byte。

存储容量通常用byte表示,因为与系统硬件无关。

word 字
byte 字节
bit  位
1word=2byte
1byte=8bit

如果总容量是32Mbit,总线是16位宽的.如果按8位用,容量是不是可以说成是4M字节?如果按16位用,是不是可以说是2M字节? 和字word如何换算? 请各位指导指导,谢谢!
NoSQL的火热让人们似乎看到关系型数据库即将崩溃一样,不过在数据库领域有着Oracle和IBM这样的“房地产开发商”,他们是不希望关系型数据库如同现在的中国房价一样出现“拐点”的。在WEB领域,NoSQL已经开始在Digg和Reddit这样的大网站投入实战。
---

Apache Cassandra正式获商业支持 NoSQL或将实现跨越式发展



很多人队nosql有不同的看法,下面是从csdn上摘抄的评论,很有意思:
SQL造成的一个不合理的现象就是,催生了一个DBA职业,而且令人震惊的是,DBA的收入竟然比开发者还要高!
C++造成的一个奇怪的现象就是,造就了一大批意淫奇技淫巧的人,而且令人震惊的是,这些人竟然以这些歪门邪道来彰显自己比别人厉害!

支持NoSQL,,我认为,SQL和C++是当今社会两大毒瘤!必须予以清除!
一个开发者如果连NoSQL都不会用或者用不好,那他就该马上转行。
一个开发者如果脱离了实际而沉浸于C++的奇技淫巧,那他 就应该立马滚蛋

NoSQL当然能解决所有SQL能解决的问题,这点常识都没有。就像C语言能解决C++语言所有到问题,汇编语言能解决所有高级语言的问题一样!@

一直穿衣服,明天开始都不穿了,可能吗?世界再变,技术再高,都是基于需求的。大众的,才是真正胜利的

SQL最初目标就是用人类自然语言查询方式来查询数据,让使用数据库的人能快速上手,不需要懂得程序开发,但是现在来看SQL本身居然比编程语言更复杂,培养一个精通SQL的人比培养一个程序员代价要大的多,现在的SQL完全是本末倒置,那索性就让程序语言来完成数据查询算了。

楼主此言差矣!
从机器硬件层面上来讲,功能最强劲的,当然是二进制码,难道因此就不需要高级语言,而是使用二进制码吗?当然不是.
二进制码虽然可以使用硬件提供的所有功能,但它并不适合用于软件工程当中,因为根本没办法维护.之所以由汇编发展出C,由C发展出C++,原因也在于此.


很多人很不懂得珍惜,C/C++还没有好好发展,就这样看不起、甚至想丢弃。。。很是悲哀!
用粗俗的眼光当然看不出C语言适合做ERP。今天的C,可以动态编译,可以与脚本语言结合,所能够便利、快捷、高效的处理很多事情,超乎很多人的想象!

不要认为一项技术就能代替另一项技术,技术的选择是要看当时的场景的,而不是一味的追求这样那样的技术,这个社会本来就应该百家争鸣,百花齐放,SQL是毒瘤,NoSQL能解决所有SQL能解决的问题吗!?



楼主!任何新东西出来都是在早些时候的东西上演变或者发展而来的,在现在各种高级语言盛行的时代,我相信没有那个程序员能否认C/C++或者VB等(中)低级语言曾经的辉煌,出新是任何事物发展的必然趋势。NoSQL也需要一段时期的考验和磨砺,我们不否认它的优势,但是也不会认为他会完全代替SQL,我们都是“玩”高科技的,要用理智的头脑去考虑问题、看待事物!


NoSQL还是有不少问题的。 事务能力,数据的一致性,没有类似SQL这样方便的操作语言,性能差等等。
NoSQL的优势是分布式,保存对象简单。
我认为NoSQL在一些项目上会有些优势。 但大部分项目还是SQL更加合适。
SQL对于海量数据有些问题。能够处理海量数据的数据库和计算机非常贵。
面临分布式海量数据时,可能NoSQL有些优势。 数据库集群总是很麻烦,很多东西不能用。即使能用也会造成性能的大幅下降。
但这些问题只有少数大公司需要经常面对。


◆Flash会耗尽移动设备的电池;

◆不太适合多触控操作;

◆其性能、可靠性和安全性都不好。

◆此外,Flash还是一个专用系统,由Adobe独立把持。

◆网络标准应该是开放的,就像 HTML5、CSS和JavaScript那样。虽然乔布斯承认苹果的手机操作系统也是专用系统。

◆最重要的是,苹果不希望“一个第三方软件层介入平台和开发者之间”。

<?php  
/**  
* 使用共享内存的PHP循环内存队列实现  
* 支持多进程, 支持各种数据类型的存储  
* 注: 完成入队或出队操作,尽快使用unset(), 以释放临界区  
*  
* @author wangbinandi@gmail.com  
* @created 2009-12-23  
*/  
class SHMQueue  
{  
    private $maxQSize = 0; // 队列最大长度  
      
    private $front = 0; // 队头指针  
    private $rear = 0;  // 队尾指针  
      
    private $blockSize = 256;  // 块的大小(byte)  
    private $memSize = 25600;  // 最大共享内存(byte)  
    private $shmId = 0;  
      
    private $filePtr = './shmq.ptr';  
      
    private $semId = 0;  
    public function __construct()  
    {          
        $shmkey = ftok(__FILE__, 't');  
          
        $this->shmId = shmop_open($shmkey, "c", 0644, $this->memSize );  
        $this->maxQSize = $this->memSize / $this->blockSize;  
          
         // 申請一个信号量  
        $this->semId = sem_get($shmkey, 1);  
        sem_acquire($this->semId); // 申请进入临界区          
          
        $this->init();  
    }  
      
    private function init()  
    {  
        if ( file_exists($this->filePtr) ){  
            $contents = file_get_contents($this->filePtr);  
            $data = explode( '|', $contents );  
            if ( isset($data[0]) && isset($data[1])){  
                $this->front = (int)$data[0];  
                $this->rear  = (int)$data[1];  
            }  
        }  
    }  
      
    public function getLength()  
    {  
        return (($this->rear - $this->front + $this->memSize) % ($this->memSize) )/$this->blockSize;  
    }  
      
    public function enQueue( $value )  
    {  
        if ( $this->ptrInc($this->rear) == $this->front ){ // 队满  
            return false;  
        }  
          
        $data = $this->encode($value);  
        shmop_write($this->shmId, $data, $this->rear );  
        $this->rear = $this->ptrInc($this->rear);  
        return true;  
    }  
          
    public function deQueue()  
    {  
        if ( $this->front == $this->rear ){ // 队空  
            return false;  
        }  
        $value = shmop_read($this->shmId, $this->front, $this->blockSize-1);  
        $this->front = $this->ptrInc($this->front);  
        return $this->decode($value);  
    }  
      
    private function ptrInc( $ptr )  
    {  
        return ($ptr + $this->blockSize) % ($this->memSize);  
    }  
      
    private function encode( $value )  
    {  
        $data = serialize($value) . "__eof";  
        if ( strlen($data) > $this->blockSize -1 ){  
            throw new Exception(strlen($data)." is overload block size!");  
        }  
        return $data;  
    }  
      
    private function decode( $value )  
    {  
        $data = explode("__eof", $value);  
        return unserialize($data[0]);          
    }  
      
    public function __destruct()  
    {  
        $data = $this->front . '|' . $this->rear;  
        file_put_contents($this->filePtr, $data);  
          
        sem_release($this->semId); // 出临界区, 释放信号量  
    }  
}  


使用的样例代码如下:
// 进队操作  
$shmq = new SHMQueue();  
$data = 'test data';  
$shmq->enQueue($data);  
unset($shmq);  
// 出队操作  
$shmq = new SHMQueue();  
$data = $shmq->deQueue();  
unset($shmq);

来源:http://blog.csdn.net/ChaoticLife/archive/2009/12/23/5064172.aspx
 今天晚上又看了一遍功夫。这应该是我大概第4遍看了吧。再次细细观赏或者说体会了一遍,又发现了一些以前没有发现的东西,而更加的发觉这部电影的好了。
  其他的好先不说了,这次又看发现了一些周星驰表演中细腻的地方。以前好像有影评说过,这个故事中周星驰的转变有些牵强。但如果仔细去看,可以从他的表演中发现许多东西。一个地方就是他们强了黄圣依的冰淇淋后,跳上一辆公车,他站在车后近乎疯狂的笑。他为什么笑的这么疯狂呢?首先是因为他强冰淇淋得逞,那种得意的笑,然后更深一层的,我们可以听出,作为一个社会底层的小人物,只能去欺负比他更底层更弱小的人的那种无奈,然后是虽然心底有着种种报复,心底仍然藏着善良,却要去作这种勾当的那种绝望,都在这次笑里面了。
  另一次的表演,是他们再一次强了黄圣依的摊子,黄拿波板糖给他看的时候,那一段特写,谁都可以看出他内心的复杂。这一段的演出也另我非常感动,在这里接下来可以看出他对自己的憎恨,于是他只好把这种恼怒发泄在林子聪身上,而林子聪一次次跟上来,只为了分他一瓶波子汽水。
  当然这只是电影中的两个小地方,也许需要认真去看才能体会到。从整部电影来说,我认为多少年后,功夫将会成为电影中的经典。在这部电影中,周星驰的导演水平已经达到了一个很高的境界。不论是镜头的走位、衔接还是剧情的节奏感,都令人十分舒服,至于电影的配乐,只能说无懈可击了。刚看过一个评《疯狂的石头》的影评,说疯狂的石头中的配乐“对于音乐的把握也不行,整部电影的音乐风格乱七八糟的,没有整体感,似乎就是想到个什么音乐就用上了,单就那个场景可能很不错,但合起来一看就不是那么回事儿了,拼贴痕迹太重,......”,那么功夫中的配乐就是一个完美的典范。
  
  至于《疯狂的石头》,我认为比《功夫》至少差了十个档次。
  另外,这次终于听清了阿鬼临死之前对包租公包租婆说的那句洋文,是"What are you prepare to do"。是“你们准备怎么做”吗?我英语不好,也不知道这句话的语法对不对。

 what are you...prepared...to do?
  这句台词有它的出处
  

 出自这里:肖恩死的时候
  http://www.douban.com/subject/1292532/

总体计划,读一本微观经济学入门书籍,一本金融学入门书籍,一本会计学中级书籍,一本历史书。

目前的读书书目有:

《经济学原理》作者 曼昆 豆瓣链接

《经济漫谈录》作者:历以宁 豆瓣链接

《财务会计 — 概念、方法与应用》 作者 豆瓣链接

《思考与回忆》 作者:俾斯麦 豆瓣链接

《佛罗伦萨史》作者:尼科洛·马基雅维里  豆瓣链接
链接:
http://www.qingran.net/2010/05/2010%e5%b9%b4%e8%af%bb%e4%b9%a6%e8%ae%a1%e5%88%92/
http://labs.adobe.com/downloads/flashplayer.html

Download Flash Player for Opera and Chromium based applications – PPAPI :
https://fpdownload.macromedia.com/pub/labs/flashruntimes/flashplayer/install_flash_player_ppapi.exe


IE6: 只要把flash所在层的z-index属性设为-1即可;

IE7和IE8: 再给flash的<object>对象增加一个"womde"参数,参数的值为"transparent"或"opaque"都行;

FF、Chrome、Opera: 在IE8的基础上再在<embed>标签内添加属性wmode="transparent"或wmode="opaque"。

完整的实例代码如下:



<div style="z-index:-1;">
    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="900" height="150">
    <param name="movie" value="i/banner.swf" />
    <param name="quality" value="high" />
    <param name="wmode" value="transparent">
    <embed src="i/banner.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="900" height="150" wmode="transparent"></embed>
    </object>
</div>
http://tiaozhanshu.net/flash-player-for-chrome.html
安装了新电脑:windows7 64的,想装个盗版的防范毒,windows7感觉还行,不要钱嘛,不错的,哈哈!
今天NOD32激活码之窗为大家带了一个小小的NOD32相关教程:那就是去除NOD32开机激活向导.这个方法很古老也很有效的哟.也许网上已经很多了.本站只是整理下.还是否请大家多多支持:大家可以将下面的代码另存为BAT批处理文件即可.请大家注意.双击运行即可.代码如下:


@ ECHO OFF
@ ECHO.
@ ECHO.
@ ECHO.                            说   明
@ ECHO ———————————————————————–
@ ECHO 如果安装了NOD32激活版而没有激活,开机后激活程序会自动弹出,本批处理就
@ ECHO 是方便用户解决此问题。
@ ECHO                   http://www.nod32id.com                        
@ ECHO ———————————————————————–
PAUSE
reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v essact /f
nsession.sql
===========================================================================
create table mysession(
session_key char(32) not null,
session_data text,
session_expiry int(11),
primary key(session_key)
);


session_inc.php
============================================================================

<?php

function mysession_open($save_path, $session_name)
{
//echo ''save_path ''.$save_path.''<br />'';
//echo ''session_name ''.$session_name.''<br />'';
@mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器
or die("数据库服务器连接失败");
@mysql_select_db("test") //选择数据库mydb
or die("数据库不存在或不可用");
return true;
}

function mysession_close()
{
return true;
}

function mysession_read($key)
{
//echo ''key ''.$key.''<br />'';
// @mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器
// or die("数据库服务器连接失败");
// @mysql_select_db("test") //选择数据库mydb
// or die("数据库不存在或不可用");
$expiry_time = time(); //获取Session失效时间
//执行SQL语句获得Session的值
$query = @mysql_query("select session_data from mysession "
."where session_key = ''$key'' and session_expiry > $expiry_time")
or die("SQL语句执行失败");
if($row = mysql_fetch_array($query))
return $row[''session_data''];
else
return false;
}

function mysession_write($key, $data)
{
//echo ''write: ''.$key.''<br />'';
//echo ''data ''.$data.''<br />'';
// @mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器
// or die("数据库服务器连接失败");
// @mysql_select_db("test") //选择数据库mydb
// or die("数据库不存在或不可用");
$expiry_time = time() + 5; //获取Session失效时间
//查询Session的键值是否已经存在
$query = @mysql_query("select session_data from mysession "
."where session_key = ''$key''")
or die("SQL语句执行失败");
//如果不存在,则执行插入操作,否则执行更新操作
if(mysql_numrows($query) == 0)
{
//执行SQL语句插入Session 的值
$query = @mysql_query("insert into mysession values(''$key'', ''$data'', $expiry_time)")
or die("SQL语句执行失败");
}
else
{
//执行 SQL语句更新Session的值
$query = @mysql_query("update mysession set "
."session_data = ''$data'', session_expiry = $expiry_time "
."where session_key = ''$key''")
or die("SQL语句执行失败");
}
return $query;
}

function mysession_destroy($key)
{
// @mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器
// or die("数据库服务器连接失败");
// @mysql_select_db("test") //选择数据库mydb
// or die("数据库不存在或不可用");
//执行SQL语句删除Session
$query = @mysql_query("delete from mysession where session_key = ''$key''")
or die("SQL语句执行失败");
return $query;
}

function mysession_gc($expiry_time)
{
// echo "gc called ";
// @mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器
// or die("数据库服务器连接失败");
// @mysql_select_db("test") //选择数据库mydb
// or die("数据库不存在或不可用");
$expiry_time = time();
//执行SQL语句删除Session
$query = @mysql_query("delete from mysession where session_expiry < $expiry_time")
or die("SQL语句执行失败");
return $query;
}
// $domain = '''';
//不使用 GET/POST 变量方式
ini_set(''session.use_trans_sid'', 0);
//设置垃圾回收最大生存时间
ini_set(''session.gc_maxlifetime'', 5);
//使用 COOKIE 保存 SESSION ID 的方式
//ini_set(''session.use_cookies'', 1);
//ini_set(''session.cookie_path'', ''/'');
//多主机共享保存 SESSION ID 的 COOKIE
//ini_set(''session.cookie_domain'', $domain);
//设置用户自定义Session存储
ini_set(''session.save_handler'', ''user'');

session_set_save_handler(''mysession_open'',
''mysession_close'',
''mysession_read'',
''mysession_write'',
''mysession_destroy'',
''mysession_gc'');
?>


test.php
================================================================================

<?php
include(''session_inc.php''); //包含session_set_save_handler定义的文件
session_start();
$_SESSION[''passed''] = true;
echo $_SESSION[''passed''];
?>

爱上游戏私服网,23yx.com
目前基本可用,但sess_gc没有被执行,不知为何。。。
sess_gc是按一定的概率被调用的。可以设置
session.gc_probability 与 session.gc_divisor 合起来用来管理 gc(garbage collection 垃圾回收)进程启动的概率。默认为 1。详见 session.gc_divisor。
session.gc_divisor与 session.gc_probability 合起来定义了在每个会话初始化时启动 gc(garbage collection 垃圾回收)进程的概率。此概率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每个请求中有 1% 的概率启动 gc 进程。
session.gc_divisor 默认为 100。
ini_set(''session.gc_probability'', 50);
ini_set(''session.gc_divisor'', 100);


还发现PHP牛的一点,如果客户端禁用 cookie,只要
ini_set(''session.use_trans_sid'', 1);
它会自动把session id 附在链接后。Session 就可以正常使用了。
来源:http://www.23yx.com/Article_View.asp?id=43
http://baike.baidu.com/view/1193094.htm?fr=ala0_1
Java中:
用了enctype="multipart/form-data"  
  就不能getParmeter了因为  
  他是一个特殊的标记啊  
  只能通过特殊的方法得到需要的数值啊

你的这种方法我没试过,我是用jspSmartUpload上传的,enctype="multipart/form-data"和 request.getParameter()确实不能同时使用,但这个组件提供了替代的方法:new   SmartUpload().getRequest()返回一个Request类型对象,这个对象提供了替代的方法,有兴趣可以参考一下.

PHP:
评优系统用到了Excel表的上传:


<FORM METHOD="POST" ACTION="3231313.jsp" ENCTYPE="multipart/form-data">
<INPUT TYPE="FILE" NAME="FILE1" SIZE="50"><BR>
<input type="SUBMIT" value="上传" />
</FORM>


代码解释:

ENCTYPE="multipart/form-data"用于表单里有图片上传。
表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application /x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作:
enctype="multipart/form-data"是上传二进制数据; form里面的input的值以2进制的方式传过去,所以request就得不到值了。 也就是说加了这段代码,用request就会传递不成功,取表单值加入数据库时,用到下面的:

SmartUpload su = new SmartUpload();//新建一个SmartUpload对象

su.getRequest().getParameterValues();取数组值

su.getRequest().getParameter( );取单个参数单个值


原因:
一旦在网页post中加入了ENCTYPE="multipart/form-data"就是以二进制传输,而不加入就直接传输,php会自动根据这个bondary去做二进制的解析,而Java不会,所以,我们在上传图片的时候必须加入这个form-data,图片是以二进制形式上传的,所以,我们必须加入,否则就没法传到服务端去做解析。服务端就那么编写的,就这个原因,无它。
sshfs -p 36000 gastonwu@172.25.38.70:/home/gastonwu ~/dev70

samba服务mount方法:

mount -t smbfs -o username=peter,password=hello //192.168.7.123/ok



直接yum得了,安装麻烦啊:
[root@localhost fuse-2.7.4]# yum -y install sshfs
Loaded plugins: fastestmirror
Determining fastest mirrors
* addons: mirrors.163.com
* base: mirrors.163.com
* extras: mirrors.163.com
* updates: mirrors.163.com
addons                                                                                                       |  951 B     00:00    
base                                                                                                         | 2.1 kB     00:00    
extras                                                                                                       | 2.1 kB     00:00    
extras/primary_db                                                                                            | 180 kB     00:00    
updates                                                                                                      | 1.9 kB     00:00    
updates/primary_db                                                                                           | 616 kB     00:00    
Setting up Install Process
No package sshfs available.
Nothing to do



还是不行:接着弄
yum -y install kernel-devel

[root@localhost fuse-2.7.4]# ls -l /usr/src/kernels/
drwxr-xr-x 19 root root 4096 05-10 22:32 2.6.18-164.15.1.el5-i686
drwxr-xr-x 19 root root 4096 01-05 21:47 2.6.18-164.el5-i686
[root@localhost fuse-2.7.4]# ./configure --with-kernel=/usr/src/kernels/2.6.18-164.15.1.el5-i686;make;make install

由于工作需要,需将一台windows2008主机硬盘挂载到一台CentOS主机上,网上查找资料经整理测试,步骤如下:

1、yum -y install sshfs       //下载安装sshfs

2、mkdir /mnt/test              //创建一个挂载点test

3、在windows2008主机上下载安装SSH工具(如F-Secure SSH Server)

4、在windows主机上开启SSH服务

5、sshfs administrator@192.168.1.112:/ /mnt/test      //挂载远程主机(假设远程主机的用户名是administrator,之后提示输入密码时,输入windows密码)

6、cd /mnt/test                //进入挂载目录

7、ls                           //查看目录文件

8、umount /mnt/test    //卸载挂载目录

注意: sshfs是基于fuse模块的,如果在安装sshfs后无法运行,请下载编译这个模块(很多linux系统内核中基本都编译过了)

wget http://voxel.dl.sourceforge.net/sourceforge/fuse/fuse-2.7.4.tar.gz
tar zxpfv fuse-*.gz
cd fuse*
./configure

参考:http://crazytoon.com/2008/10/07/sshfs-how-do-you-install-sshfs-and-fuse-centoslinuxredhat/

windows之外的世界比想像中要大得多呢,几乎天天都在用ssh,却到今天才知道有sshfs这个好东西,前几天还在为ZendStudio可以远程编辑文件欣喜,惭愧啊,终于有比vi scp://hostname//path/to/file更方便的方式了。

sshfs,就是可以把ssh连接到的主机资源,映射到本机的文件系统当中,然后用户可以像操作本地文件一样操作,而实际的文件改动将通过ssh传输到远程主机当中。类似于mount了一个windows共享目录,或者另外一台linux主机的samba共享,或者是nfs共享,只是“共享协议”变成了ssh通道罢了。

ubuntu源中已经包含了sshfs了,以及所需的fuse包,直接apt安装就可以了,一共是三个包:“fuse-utils libfuse2 sshfs”,不大,加起来才179k。安装的时候会自动创建用户组fuse,要使用sshfs的用户需要先加到这个用户组里才行(记得完成后还要重新登录),不然会没有权限执行fusermount:

fuse: failed to exec fusermount: Permission denied

使用就简单的多了,一般来说,连接远程主机到本地用户:

sshfs user@hostname:path mount_point

需要输密码就输密码,当然配置成自动登录的ssh更方便了。用完之后要umount,可以:

fusemount -u mount_point

都是在普通用户非sudo的环境下使用,非常方便的。如果想每次开机都自动挂载,可以在/etc/fstab中加入:

sshfs#user@hostname:path mount_point fuse defaults,auto,allow_other 0 0

这就要求必须先把ssh自动登录配置好了,让root用户能够使用user身份登录远程主机,另外allow_other这个参数很重要,没有这个参数的话,挂载过来的目录只有root能够访问。

关于自动挂载,参考文章中andot用脚本实现的方式也不错,建议大家看看去。
来源:http://www.fwolf.com/blog/post/329
 南方网讯 风险投资者将努力寻求七种基本素质,这不意谓他们在寻求七种素质不同的人,而是希望其寻求的人在这些方面应该高质量。如果你在这些方面质量很高,即使其它方面有严重缺陷,对方也可原谅。由于不同的风险投资者对企业家的素质要求可能各有不同,而且行业不同对企业家基本素质的要求也各具特色,因此,这里只能粗略介绍对企业家的基本素质要求,并不是说每个企业家都必须具备一切良好素质。但每一个都应有自己的特长所在。综合分析以下七种素质,多数风险投资者以为,忠诚正直应居首位。阅读全文
//这位台湾的高手把GTK+, Qt, wxWidgets比较分析得相当到位。

GUI toolkit

先讲 GTK+
GTK+ 主要用在 X Window 上,整个设计的架构和许多概念和 MFC 以及一般 Windows 上
的程式开发大异其趣,入门门槛较高,而且最主要的特色是,他用不具有物件功能的纯
"C" 语言,模拟物件导向。 所以写起来比较复杂艰涩,而且充满大量巨集,使用和除错
都不是很容易,但优点则是可以用 C,不需 C++,如果和 Win32 SDK 比较,不会难学
多少,缺点是不易上手使用,而且文件比较缺,架构又非常复杂,且提供的东西比起其他
无所不包的 library,是简陋了一点,函数命名又臭又长。 对於简单的程式,GTK+ 会
显得太复杂,但是当你开始想扩充其他 library 也都没提供的进阶功能,就会开始赞叹
GTK+ 的架构严谨,还有超乎想像的高度弹性。 同样的东西要用 MFC 来做反而会要人命
并且多国语言的支援良好,内部也全面使用 UTF-8,相容性好,又是 unicode
能够习惯的话,GTK+ 值得推荐,但没有很建议学,毕竟不好学,要用到熟会需要比
较久,而且那样很多 C++ 的功能会用不到。 GTK+ 有 C++ 版本叫做 GTK--,没用过
但看文件觉得,并没有比 gtk+ 简单到哪里去。 因为 gtk+ 本来就是物件导向,所以
即使换了 c++ 语言,写起来架构还是差不多的。 另外,gtk+ 有 Windows 版本,但缺
点是,执行缓慢,不稳定,而且介面是使用 gtk+ 自己的,不是使用 Windows 内建的
"Native" 原生图形介面,看起来会不太习惯。 Mac OS X 下可用 X11 来执行 gtk+
但那样出来的程式是长得像 UNIX 程式,而不是美美的 OS X Aqua 外观

wxWidgets 和 MFC 最接近,命名习惯或架构都高度相似,会 MFC 几乎不用重新学习
有十余年历史,此外,他的物件封装比 MFC 要好,提供的功能也多上太多,又跨平台
一般知名的 MFC 程式都会选择用 wxWidgets 改写,来快速移植原程式到其他平台
例如 eMule 用 wxWidgets 移植出 aMule, xMule, 还在开发中的 Filezilla 3...等
而他最主要的特色是,他是"跨平台"的 "Native" GUI toolkit,在各种平台上都可写出
使用该平台内建 Native 原生图形介面的程式。 在 Windows 上就长得跟其他 Windows
程式一样,在 Linux 下就使用 gtk+ 的图形介面,在 Mac OS X 下就可以使用华丽的
Aqua 外观风格,这点是非常强悍。 不像 gtk+ 到其他系统都还是只能用 gtk+ 自己的
缺点是,中文支援在有些地方会出问题,例如剪贴簿的操作。 得自己 patch
但仍然相当推荐,即使是个庞大的 library,效能依旧不会太差,尤其在 Windows 上
执行速度并不输 MFC,与其学 MFC,不如学 wxWidgets。

Qt 的功能,应该是这三者加上 MFC 之中最强大的,文件也很完整,又有 RAD 工具
可以辅助开发,并且有商业公司做强力后盾。不但有 Windows/X Window/Mac 版本,
甚至还有嵌入式系统可用的版本,稳定性还不错,物件封装也算良好,资源比 GTK+ 或
wxWidgets 多得非常多,而且发行公司提供了相当多范例,算是一家以开放原始码成功
营利的模范公司。 知名的 KDE 整个是用他开发,证明了他的稳定性和强大功能。
缺点是如果你用他开发非 GPL 开放程式码的软体,必须以极昂贵的金额,购买商业
版本。 而他的图形介面并不完全是 "Native GUI",只是透过 theme 去模拟系统上的
标准 GUI,所以看起来很像,却会有些地方可以明显看出破绽。 执行速度缓慢还有过於
庞大则是另一个问题。 虽然封装得很良好文件也齐全,并不代表他就很容易学
还有一个严重问题是,他写的不是标准 C++,他使用的 signal/slot 机制必须透过 Qt
提供的 preprocessor 处理过才可以转送给编译器,这部份可能被限定用 qmake,算是
一个可惜的地方,不过瑕不掩瑜,还是很推荐。忘了说,他内部也是 unicode,
多国语言没问题。

以上三套只是简单介绍,其中 Qt 的程式我没有实际完整开发过,但明显的三套都远远比
只能在 Windows 上用,功能少 Bug 多难学难用几乎无多国语言支援的 MFC 要强。
三套可跨平台的 library 大家可自行选择,只能用在 Windows 的 MFC 就不用考虑了

wxWidgets 内带 wxodbc,可惜 wxd 目前并没有包装它。

总结:wxWidgets性能及ui最好,Qt最大最全,GTK+架构及扩展性最好

来源:http://pantherlover.blog.163.com/blog/static/502287092009266911868/
分页: 185/339 第一页 上页 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 下页 最后页 [ 显示模式: 摘要 | 列表 ]