nginx 配置

1.

location /static {
root /srv/www/example.com/public_html/static/;
index index.html index.htm;

}

浏览器: http://localhost 这个找不到东西
http://localhost/static 要这个url

2. uwsgi 配置
参考: https://www.youtube.com/watch?v=dXDyHgWHtkI 【视频教程】
参考:http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html
http://uwsgi-docs.readthedocs.org/en/latest/tutorials/Django_and_nginx.html
http://www.jianshu.com/p/e6ff4a28ab5a

参考:
https://www.linode.com/docs/websites/nginx/wsgi-using-uwsgi-and-nginx-on-ubuntu-12-04-precise-pangolin

鼠标双击 run shell script

1.go to Nautilus > File menu > Preferences > Behavior, and change the preferences there: set “Executable Text Files” either to “Run executable…” or to “Ask each time”

 

参考:http://askubuntu.com/questions/285558/not-executing-programs-sh-with-double-click-in-13-04

apache2 python cgi 配置

一:Server version: Apache/2.2.22 (Ubuntu)

1. $ sudo vim /etc/apache2/sites-available/default
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews ExecCGI
AllowOverride None
Order allow,deny
allow from all

</Directory>

2. 在httpd.conf 中增加下面一段
$ sudo vim /etc/apache2/httpd.conf
DirectoryIndex index.html index.html.var index.htm
AddType text/html .htm .html .py
AddHandler cgi-script .cgi .py

3. 测试 test.py

bb

4. 浏览器显示结果

 

 

cc

 

 

二 . Server version: Apache/2.4.7 (Ubuntu)

1. 查看apache 版本号

$ apache2ctl -v

2.

If you wish designate a cgi-bin subdirectory of a user’s directory where everything will be treated as a CGI program, you can use the following.

<Directory /home/*/public_html/cgi-bin>
    Options ExecCGI
    SetHandler cgi-script
</Directory>

参考: http://httpd.apache.org/docs/current/howto/cgi.html

-bash: ./test.py: /usr/bin/python/r/n^M: bad interpreter: Not a directory

1. 在linux上 vim tt.py 写了个hello程序,运行正常

#!/usr/bin/python
print “hello world”

$ ./tt.py
hello world!!!

2. 在win7 写个 tt2.py , 一模一样的内容,都是hello world 程序,
然后传到linux上,然后运行,提示错误
-bash: ./test.py: /usr/bin/python/r/n^M: bad interpreter: Not a directory

3. 用beyond compare 比较
aa

看出文件格式不同, 一个是ansi unix , 一个是ansi pc

4. 在linux 上用vim查具体的文件格式
:se fileformat
一个显示 fileformat=unix
一个显示 fileformat=dos

5.使用命令查看两个文件的具体差异

fileformat=unix    tt.py

$ head tt.py | od -bc
0000000 043 041 057 165 163 162 057 142 151 156 057 160 171 164 150 157
# ! / u s r / b i n / p y t h o
0000020 156 012 160 162 151 156 164 040 042 150 145 154 154 157 040 167
n \n p r i n t ” h e l l o w
0000040 157 162 154 144 041 041 041 042 012 012
o r l d ! ! ! ” \n \n
0000052

fileformat=dos    tt2.py

$ head tt2.py | od -bc
0000000 043 041 057 165 163 162 057 142 151 156 057 160 171 164 150 157
# ! / u s r / b i n / p y t h o
0000020 156 015 012 015 012 160 162 151 156 164 040 047 150 145 154 154
n \r \n \r \n p r i n t ‘ h e l l
0000040 157 040 167 157 162 154 144 047 015 012
o w o r l d ‘ \r \n

比较发现 dos格式的文件多了 \r

6. 解决方法:
方法一:vim -b File_name worked! It shows the ^M’s at the end of each line. delete ‘^M’
方法二:You can probably make your editor save “UNIX line endings” or similar.
方法三: You can run dos2unix or similar on the file after saving it
这个很方便,直接使用命令
$dos2unix tt2.py
方法四: You can use sed: sed -e ‘s/\r//g’ or similar.

参考:http://www.gossamer-threads.com/lists/python/dev/395450
http://stackoverflow.com/questions/11850192/why-does-my-perl-cgi-program-return-a-server-error
http://codingstandards.iteye.com/blog/810900 [dos2unix 资料]

[转]Apache与Nginx网络模型

Nginx的高并发得益于其采用了epoll模型,与传统的服务器程序架构不同,epoll是linux内核2.6以后才出现的。下面通过比较Apache和Nginx工作原理来比较。

 

传统Apache都是多进程或者多线程来工作,假设是多进程工作(prefork),apache会先生成几个进程,类似进程池的工作原理,只不过这里的进程池会随着请求数目的增加而增加。对于每一个连接,apache都是在一个进程内处理完毕。具体是 recv(),以及根据 URI 去进行磁盘I/O来寻找文件,还有 send()都是阻塞的。其实说白了都是 apche 对于套接字的I/O,读或者写,但是读或者写都是阻塞的,阻塞意味着进程就得挂起进入sleep状态,那么一旦连接数很多,Apache必然要生成更多的进程来响应请求,一旦进程多了,CPU对于进程的切换就频繁了,很耗资源和时间,所以就导致apache性能下降了,说白了就是处理不过来这么多进程了。其实仔细想想,如果对于进程每个请求都没有阻塞,那么效率肯定会提高很多。

 

Nginx采用epoll模型,异步非阻塞。对于Nginx来说,把一个完整的连接请求处理都划分成了事件,一个一个的事件。比如accept(), recv(),磁盘I/O,send()等,每部分都有相应的模块去处理,一个完整的请求可能是由几百个模块去处理。真正核心的就是事件收集和分发模块,这就是管理所有模块的核心。只有核心模块的调度才能让对应的模块占用CPU资源,从而处理请求拿一个HTTP请求来说,首先在事件收集分发模块注册感兴趣的监听事件,注册好之后不阻塞直接返回,接下来就不需要再管了,等待有连接来了内核会通知你(epoll的轮询会告诉进程),cpu就可以处理其他事情去了。一旦有请求来,那么对整个请求分配相应的上下文(其实已经预先分配好),这时候再注册新的感兴趣的事件(read函数),同样客户端数据来了内核会自动通知进程可以去读数据了,读了数据之后就是解析,解析完后去磁盘找资源(I/O),一旦I/O完成会通知进程,进程开始给客户端发回数据send(),这时候也不是阻塞的,调用后就等内核发回通知发送的结果就行。整个下来把一个请求分成了很多个阶段,每个阶段都到很多模块去注册,然后处理,都是异步非阻塞。异步这里指的就是做一个事情,不需要等返回结果,做好了会自动通知你。

select/epoll的特点

select的特点:select 选择句柄的时候,是遍历所有句柄,也就是说句柄有事件响应时,select需要遍历所有句柄才能获取到哪些句柄有事件通知,因此效率是非常低。但是如果连接很少的情况下, select和epoll的LT触发模式相比, 性能上差别不大。
这里要多说一句,select支持的句柄数是有限制的, 同时只支持1024个,这个是句柄集合限制的,如果超过这个限制,很可能导致溢出,而且非常不容易发现问题, 当然可以通过修改linux的socket内核调整这个参数。
epoll的特点:epoll对于句柄事件的选择不是遍历的,是事件响应的,就是句柄上事件来就马上选择出来,不需要遍历整个句柄链表,因此效率非常高,内核将句柄用红黑树保存的。
对于epoll而言还有ET和LT的区别,LT表示水平触发,ET表示边缘触发,两者在性能以及代码实现上差别也是非常大的。

 

可以举一个简单的例子来说明Apache的工作流程,我们平时去餐厅吃饭。餐厅的工作模式是一个服务员全程服务客户,流程是这样,服务员在门口等候客人(listen),客人到了就接待安排的餐桌上(accept),等着客户点菜(request uri),去厨房叫师傅下单做菜(磁盘I/O),等待厨房做好(read),然后给客人上菜(send),整个下来服务员(进程)很多地方是阻塞的。这样客人一多(HTTP请求一多),餐厅只能通过叫更多的服务员来服务(fork进程),但是由于餐厅资源是有限的(CPU),一旦服务员太多管理成本很高(CPU上下文切换),这样就进入一个瓶颈。
再来看看Nginx得怎么处理?餐厅门口挂个门铃(注册epoll模型的listen),一旦有客人(HTTP请求)到达,派一个服务员去接待(accept),之后服务员就去忙其他事情了(比如再去接待客人),等这位客人点好餐就叫服务员(数据到了read()),服务员过来拿走菜单到厨房(磁盘I/O),服务员又做其他事情去了,等厨房做好了菜也喊服务员(磁盘I/O结束),服务员再给客人上菜(send()),厨房做好一个菜就给客人上一个,中间服务员可以去干其他事情。整个过程被切分成很多个阶段,每个阶段都有相应的服务模块。我们想想,这样一旦客人多了,餐厅也能招待更多的人。

不管是Nginx还是Squid这种反向代理,其网络模式都是事件驱动。事件驱动其实是很老的技术,早期的select、poll都是如此。后来基于内核通知的更高级事件机制出现,如libevent里的epoll,使事件驱动性能得以提高。事件驱动的本质还是IO事件,应用程序在多个IO句柄间快速切换,实现所谓的异步IO。事件驱动服务器,最适合做的就是这种IO密集型工作,如反向代理,它在客户端与WEB服务器之间起一个数据中转作用,纯粹是IO操作,自身并不涉及到复杂计算反向代理用事件驱动来做,显然更好,一个工作进程就可以run了,没有进程、线程管理的开销,CPU、内存消耗都小。

所以Nginx、Squid都是这样做的。当然,Nginx也可以是多进程 + 事件驱动的模式,几个进程跑libevent,不需要Apache那样动辄数百的进程数。Nginx处理静态文件效果也很好,那是因为静态文件本身也是磁盘IO操作,处理过程一样。至于说多少万的并发连接,这个毫无意义。随手写个网络程序都能处理几万的并发,但如果大部分客户端阻塞在那里,就没什么价值。

再看看Apache或者Resin这类应用服务器,之所以称他们为应用服务器,是因为他们真的要跑具体的业务应用,如科学计算、图形图像、数据库读写等。它们很可能是CPU密集型的服务,事件驱动并不合适。例如一个计算耗时2秒,那么这2秒就是完全阻塞的,什么event都没用。想想MySQL如果改成事件驱动会怎么样,一个大型的join或sort就会阻塞住所有客户端。这个时候多进程或线程就体现出优势,每个进程各干各的事,互不阻塞和干扰。当然,现代CPU越来越快,单个计算阻塞的时间可能很小,但只要有阻塞,事件编程就毫无优势。所以进程、线程这类技术,并不会消失,而是与事件机制相辅相成,长期存在。

  总言之,事件驱动适合于IO密集型服务,多进程或线程适合于CPU密集型服务,它们各有各的优势,并不存在谁取代谁的倾向。

 

参考: http://blog.csdn.net/xifeijian/article/details/17385831

eclipse do not start . hang

Eclipse – How to resolve “Initializing Java Tooling”
Eclipse is one of my favorite IDE’s. In fact, it is more popular than any IDE out there. But working with Eclipse hasn’t been always smooth, there is no end to problems you face if you are too innovative to use it.

Recently i noticed when eclipse starts, in progress console, it will always show “Initializing Java Tooling” stuck at 1%. If you do any further action command, it will lie in waiting queue. Even if you close eclipse, it will keep on waiting for “Initializing Java Tooling”. Definitely something wrong have caused it.

To solve this issue, you can do following-
delete the following directory and it’s sub-directories- $WORKSPACE/.metadata/.plugins/org.eclipse.core.resources/.project
Restart Eclipse, the problem should go away.

1. http://rkydesigns.blogspot.jp/2013/01/eclipse-how-to-resolve-initializing.html

c string append

例子1:

char * new_str ;
if((new_str = malloc(strlen(str1)+strlen(str2)+1)) != NULL){
    new_str[0] = '\0';   // ensures the memory is an empty string
    strcat(new_str,str1);
    strcat(new_str,str2);
} else {
    fprintf(STDERR,"malloc failed!\n");
    // exit?
}

例子2:


/* strcat example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[80];
  strcpy (str,"these ");
  strcat (str,"strings ");
  strcat (str,"are ");
  strcat (str,"concatenated.");
  puts (str);
  return 0;
}

参考: http://stackoverflow.com/questions/5901181/c-string-append

http://www.cplusplus.com/reference/cstring/strcat/

netbeans attach debugger fail : Operation not permitted

1.  netbeans attach debugger 提示错误

Error: Operation not permitted

2. 解决方法:

You can temporarily disable this restriction (and revert to the old behaviour allowing your user to ptrace (gdb) any of their other processes) by doing:

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

To permanently allow it edit /etc/sysctl.d/10-ptrace.conf and change the line:

kernel.yama.ptrace_scope = 1

To read

kernel.yama.ptrace_scope = 0

 

参考: http://askubuntu.com/questions/41629/after-upgrade-gdb-wont-attach-to-process

http://www.cesareriva.com/gdb-attach-fails-with-ptrace-operation-not-permitted/