ssh的使用
主要记录一下地址缩写和保持长连接,具体的使用和配置参数可以"man ssh"、"man ssh_config"了解得到。
服务器地址缩写
要登陆一台地址为endlesscode.com,用户名为stephenchan,连接的端口为9527的服务器,需运行以下命令:
ssh stephenchan@endlesscode.com -p 9527
每次都要打这么长的一句命令是件麻烦的事,不过ssh提供地址缩写的功能,可以直接"ssh myserver"就可以了,只要在ssh的配置文件(~/.ssh/config)中,添加以下内容:
Host myserver #缩写的地址,在命令行中使用ssh myserver登陆 HostName 192.168.23.202 #服务器的地址 Port 32200 #ssh的端口 User stephenchan #use name Protocol 2 #协议版本,可选 ForwardAgent yes #自动调用登陆管理器,可选 Compression yes #压缩传输,可选
以上的配置是针对一个服务器登陆的配置,也可以在配置文件中以同样的形式配置多台服务器,彼此间不冲突。
select、poll和epoll
对select、poll、epoll了解得不多,下面是从《构建高性能Web站点》摘录下来的介绍,等以后真正接触到select、poll和epoll方面的开发再详细写一下使用上的区别。
select
select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作。
select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一。
select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,不过可以通过修改宏定义甚至重新编译内核的方式提升这一限制。
另外,select()所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增长。同时,由于网络响应时间的延迟使得大量TCP连接处于非活跃状态,但调用select()会对所有socket进行一次线性扫描,所以这也浪费了一定的开销。
转义和编码
一、HTML转义
转义字符串(Escape Sequence)也称字符实体(Character Entity)。在HTML中,定义转义字符串的原因有两个:第一个原因是像“<”和“>”这类符号已经用来表示HTML标签,因此就不能直接当作文本中的符号来使用。为了在HTML文档中使用这些符号,就需要定义它的转义字符串。当解释程序遇到这类字符串时就把它解释为真实的字符。在输入转 义字符串时,要严格遵守字母大小写的规则。第二个原因是,有些字符在ASCII字符集中没有定义,因此需要使用转义字符串来表示。
转义字符串(Escape Sequence),即字符实体(Character Entity)分成三部分:第一部分是一个&符号,英文叫ampersand;第二部分是实体(Entity)名字或者是#加上实体(Entity)编号;第三部分是一个分号。
比如,要显示小于号(<),就可以写 < 或者 < 。
用实体(Entity)名字的好处是比较好理解,一看lt,大概就猜出是less than的意思,但是其劣势在于并不是所有的浏览器都支持最新的Entity名字。而实体(Entity)编号,各种浏览器都能处理。
提示:实体名称(Entity)是区分大小写的。
备注:同一个符号,可以用“实体名称”和“实体编号”两种方式引用,“实体名称”的优势在于便于记忆,但不能保证所有的浏览器都能顺利识别它,而“实体编号”则没有这种担忧,但它实在不方便记忆。
SWFUpload浅析
一、简介和示例
SWFUpload is a small JavaScript/Flash library to get the best of both worlds. It features the great upload capabilities of Flash and the accessibility and ease of HTML/CSS。
官方站点:http://www.swfupload.org/
简单来说,swfupload这个上传库是可以显示上传进度以及上传速度等上传信息。一般实现这种上传体验有2种方式,一种是异步上传,在服务器端边接收数据边往session写入接收的字节数和进度数据,然后客户端轮询这个记录在session的进度数据并回显到页面。第二种方式就是采用flash来上传,也就是swfupload所采用的方式,在发送过程中将发送的相关状态数据回传到js的函数中处理。
下面是一个单个文件上传的使用示例,简单的创建一个SWFUpload对象,并传入相关的事件处理和参数就可以了:
var swfu;
window.onload = function () {
swfu = new SWFUpload({
// Backend settings
upload_url: "/upload",
file_post_name: "image",
// Flash file settings
file_size_limit : "10 MB",
file_types : "*.*", // or you could use something like: "*.doc;*.wpd;*.pdf",
file_types_description : "All Files",
file_upload_limit : "0",
file_queue_limit : "5",
// Event handler settings
swfupload_loaded_handler : swfUploadLoaded,
file_dialog_start_handler: fileDialogStart,
file_queued_handler : fileQueued,
file_queue_error_handler : fileQueueError,
file_dialog_complete_handler : fileDialogComplete,
//upload_start_handler : uploadStart, // I could do some client/JavaScript validation here, but I don't need to.
upload_progress_handler : uploadProgress,
upload_error_handler : uploadError,
upload_success_handler : uploadSuccess,
upload_complete_handler : uploadComplete,
// Button Settings
button_image_url : "/static/images/XPButtonUploadText_61x22.png",
button_placeholder_id : "spanButtonPlaceholder", //flash元素要替代的html元素
button_width: 61,
button_height: 22,
// Flash Settings
flash_url : "/static/swf/swfupload.swf",
custom_settings : {
progress_target : "fsUploadProgress",
upload_successful : false
},
}