RHEL/CentOS和Fedora


delete old vim rpm pkg:
yum remove vim*  -y

异步任务

以前在 Vim 里面调用外部一个程序(比如编译,更新 tags,Grep ,检查错误,git/svn commit)等,只能傻等着外部程序结束才能返回 Vim ,这也是 Vim 最受 emacs 诟病的地方,限制了很多可能性,导致NeoVim当年发布时,最先引入的新功能就是异步机制。如今 8.0中,可以在后台启动各种长时间运行的任务,并把输出重定向到 VimScript 里面的某个 callback 函数,和 nodejs的子进程管理模块类似,使得你可以一边浏览/编辑文件,一遍运行各种长时间编译类任务可以同时运行,并且把输出同步到 Vim 里的某个窗口中。

时钟机制

可以在 VimScript 中创建时钟,比如每隔100ms调用一下某个 VimScript 里面的函数,这样方便你定时检查各种状态,比如某项工作是否做完,或者某个与服务器的通信如何了。有这个机制配合 Python 可以实现纯脚本的终端,或者实现网络交互,实时读取一些股票信息并且显示在右下角之类的,这给 Vim 插件开发带来了更多可能性。

网络机制

可以用纯 VimScript + socket + json 和外部支持json的服务器进行通信,比如通知远程服务器做一件什么事情,或者查询个什么东西,不过使用 Timer + python 也可以达到同样的效果。
背景:将T60P升级为Windows10系统后,最近 买卫个独立 ThinkPad 键盘,需要蓝牙连接,但发现蓝牙设备没了,连右键后硬件列表里也没有,这可怎么办?
最佳答案: Fn+F5就可以打开。
如何安装:用驱动精灵,它会自己检测并安装上的。
背景:第一次连接ansible的host里的一堆机器时,会出标题里面的错,解决办法如下:
vi /home/xiangdong/ansible/ansible.cfg
# uncomment this to disable SSH key host checking
host_key_checking = False
—————————————————————————————————————————
提示输入yes 进行确认为将key字符串加入到  ~/.ssh/known_hosts 文件中:
本篇就结合一个示例对其进行下了解。我在对之前未连接的主机进行连结时报错如下:

[root@361way.com ~]# ansible test -a 'uptime'
10.212.52.14 | FAILED => Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host.
10.212.52.16 | FAILED => Using a SSH password instead of a key is not possible because Host Key checking is enabled and sshpass does not support this.  Please add this host's fingerprint to your known_hosts file to manage this host.
从上面的输出提示上基本可以了解到由于在本机的~/.ssh/known_hosts文件中并有fingerprint key串,ssh第一次连接的时候一般会提示输入yes 进行确认为将key字符串加入到  ~/.ssh/known_hosts 文件中。

方法1:

了解到问题原因为,我们了解到进行ssh连接时,可以使用-o参数将StrictHostKeyChecking设置为no,使用ssh连接时避免首次连接时让输入yes/no部分的提示。通过查看ansible.cfg配置文件,发现如下行:

[ssh_connection]
# ssh arguments to use
# Leaving off ControlPersist will result in poor performance, so use
# paramiko on older platforms rather than removing it
#ssh_args = -o ControlMaster=auto -o ControlPersist=60s
所以这里我们可以启用ssh_args 部分,使用下面的配置,避免上面出现的错误:

ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no
方法2:

在ansible.cfg配置文件中,也会找到如下部分:

# uncomment this to disable SSH key host checking
host_key_checking = False  
默认host_key_checking部分是注释的,通过找开该行的注释,同样也可以实现跳过 ssh 首次连接提示验证部分。由于配置文件中直接有该选项,所以推荐用方法2 。


来自:http://www.361way.com/ansible-cfg/4401.html
我们再来讲讲DSO动态编译的方法:
首先编译安装apache
tar zvxf apache_1.3.27
cd apache_1.3.27
./configure --prefix=/usr/local/apache --enable-module=so \
--enable-module=rewrite --enable-shared=max &&
make &&
make install
so模块用来提供DSO支持的apachehe核心模块,rewrite是地址重写的模块,如果不需要可以不编译
enable-shared=max是指除了so以外的所有标准模块都编译成DSO模块。

我尝试在fedora core 3中安装apache 2. 当我解压了apache 2.0.54后使用configure工具并且加入了 --enable-so 或者 --enable-modules=so (两个我都试过了)
去make并且make install了。我希望在/apache2/modules/目录里有各种模块,但是这个文件最后只包含了一个httpd.exp文件。 为什么?哪里出错了?
谢谢


Because you're just telling apache to enable the use of shared modules. You also need to tell it to MAKE the shared modules.

You can use these compile flags:
--enable-mods-shared='headers rewrite dav' (where you list the mods. you want)
--enable-mods-shared=most ( compiles "most" modules )
--enable-mods-shared=all ( compiles all modules )

因为你只告诉了apache可以使用共享模块。你还需要告诉它要MAKE共享模块

你可以使用如下的这些编译标志
--enable-mods-shared='headers rewrite dav' (凡是你想编译的模块都可以写到后边的引号里面,以空格分隔)
--enable-mods-shared=most (编译最多的模块)
--enable-mods-shared=all (编译所有模块)
动态编译还是静态编译的效率问题:http://jackxiang.com/post/4029/
来自:http://m.blog.csdn.net/article/details?id=6977466
我们再来讲讲DSO动态编译的方法:
首先编译安装apache
tar zvxf apache_1.3.27
cd apache_1.3.27
./configure --prefix=/usr/local/apache --enable-module=so \
--enable-module=rewrite --enable-shared=max &&
make &&
make install
so模块用来提供DSO支持的apachehe核心模块,rewrite是地址重写的模块,如果不需要可以不编译
enable-shared=max是指除了so以外的所有标准模块都编译成DSO模块。
在某个论坛里找到了解决方法。
package-cleanup --cleandupes
1
然后再
yum install openssh
1
就可以了
地址:
http://bbs.chinaunix.net/thread-4173797-1-1.html

更多:http://www.path8.net/tn/archives/5974
背景:这块儿说是加速,还真是不明白,先扔这儿。
使用redis加速ansible

我们知道,每次使用ansible时候都要收集系统信息,那一步占用挺多时间的,我们可以用redis把GATHERING的时间给省下来。

1. ansible.cfg

[defaults]
gathering = smart
fact_caching = redis
fact_caching_timeout = 86400

2. install redis
mac下面

brew install redis

vim /usr/local/etc/redis.conf
···
daemonize yes
···
/usr/local/bin/redis-server /usr/local/etc/redis.conf

3. install python driver

sudo  easy_install pip
sudo pip install redis

如果redis端口不是6379,可以用fact_caching_connection限定:

fact_caching_connection = 127.0.0.1:6378

来自:http://blog.csdn.net/aca_jingru/article/details/46532063
背景:阿里搞的lvs,在七层交换时出现获取不到正确的remote_addr的情况,昨天那个取不到remote_ip的把lvs修改成4层交换就O了,可以通过$ip=$_SERVER["REMOTE_ADDR"]; 获取到用户端的出口IP的。


(1).REMOTE_ADDR:浏览当前页面的用户计算机的ip地址

(2).HTTP_X_FORWARDED_FOR: 浏览当前页面的用户计算机的网关

(3).HTTP_CLIENT_IP:客户端的ip

在PHP 中使用 $_SERVER["REMOTE_ADDR"] 来取得客户端的 IP 地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取。

不过要注意的事,并不是每个代理服务器都能用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取客户端的真实 IP,有些用此方法读取到的仍然是代理服务器的 IP。

还有一点需要注意的是:如果客户端没有通过代理服务器来访问,那么用$_SERVER["HTTP_X_FORWARDED_FOR"] 取到的值将是空的。
来自:http://www.jb51.net/article/27880.htm
更详细的解释如下:


REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP。
HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是“超级匿名代理”,则返回none值。同样,REMOTE_ADDR也会被替换为这个代理服务器的IP。
$_SERVER['REMOTE_ADDR']; //访问端(有可能是用户,有可能是代理的)IP
$_SERVER['HTTP_CLIENT_IP']; //代理端的(有可能存在,可伪造)
$_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪个IP使用的代理(有可能存在,也可以伪造)

三个值区别如下:

一、没有使用代理服务器的情况:

REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器的情况:Transparent Proxies

REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。

三、使用普通匿名代理服务器的情况:Anonymous Proxies

REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。

四、使用欺骗性代理服务器的情况:Distorting Proxies

REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 随机的 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。

五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)

REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。

//获取用户IP
$ip = '';
foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_FROM', 'REMOTE_ADDR') as $v) {
   if (isset($_SERVER[$v])) {
       if (! preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/', $_SERVER[$v])) {
                continue;
   }
          $ip = $_SERVER[$v];
   }
}

uset($ip,$v);

来自:http://www.cnblogs.com/jackluo/archive/2013/03/03/2941411.html
安装一下iotop程序。
可以通过yum install iotop  安装:


通过rpm -qa |grep iotop 确认是否已经安装好, 直接通过io  tab补全查看有这个命令

使用iotop命令: iotop  -o 直接查看输出比较高的磁盘读写程序。
使用该命令有个条件,Linux内核要高于2.6.20的版本,版本过低则没有此命令:yum install iotop 安装,后:
TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                                        
14453 be/4 mysql       3.87 K/s  603.68 K/s  0.00 % 10.13 % mysqld --basedir=/usr/local/mysql --data~.pid --socket=/tmp/mysql.sock --port=3306
    1 be/4 root     1691.07 K/s    0.00 B/s 31.45 %  9.55 % systemd --switched-root --system --deserialize 21
14449 be/4 mysql      11.61 K/s  247.66 K/s  0.00 %  9.53 % mysqld --basedir=/usr/local/mysql --data~.pid --socket=/tmp/mysql.sock --port=3306


LINUX下找出哪个进程造成的IO等待很高的方法 :
在本机测试通过^^
抓哪个进程干坏事前要先停掉syslog
/etc/init.d/syslog stop
echo 1 > /proc/sys/vm/block_dump
dmesg | egrep "READ|WRITE|dirtied" | egrep -o '([a-zA-Z]*)' | sort | uniq -c | sort -rn | head
1423 kjournald
1075 pdflush
209 indexer
3 cronolog
1 rnald
1 mysqld
不要忘记在抓完之后关掉block_dump和启动syslog
echo 0 > /proc/sys/vm/block_dump
/etc/init.d/syslog start

来自:http://blog.itpub.net/16978544/viewspace-696756/



实践用最新的:
wget http://archive.apache.org/dist/apr/apr-util-1.5.4.tar.gz
wget http://archive.apache.org/dist/apr/apr-1.5.2.tar.gz
wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.39/pcre-8.39.tar.gz

根据下面这个链接,编译好相关apache需要的包后,

#apachectl –l

看到的prefork.c,说明使用的prefork工作模式。

可以在编译的时候使用#--with-mpm=prefork对应的工作模式名称来修改工作模式:
./configure --help|grep with-mpm
  --with-mpm=MPM          Choose the process model for Apache to use by

加上就好了:
[root@iZ25dcp92ckZ bin]# ./apachectl -l
Compiled in modules:
  core.c
  mod_so.c
  http_core.c
  event.c
[root@iZ25dcp92ckZ bin]# ./apachectl -l
Compiled in modules:
  core.c
  mod_so.c
  http_core.c
  prefork.c



1root两www进程,搞定:
/usr/local/apache2/bin/httpd -k restart
/usr/local/apache2/bin/httpd -k restart
/usr/local/apache2/bin/httpd -k restart
静态:
在使用./configure 编译的时候,如果不指定某个模块为动态,即没有使用:enable-mods-shared=module或者enable-module=shared 这个2个中的一个,那么所有的默认模块为静态。 那么何谓静态?  其实就是编译的时候所有的模块自己编译进 httpd 这个文件中(我们启动可以使用这个执行文件,如: ./httpd & ) ,启动的时候这些模块就已经加载进来了,也就是可以使用了, 通常为:<ifmodule> </ifmodule> 来配置。所以大家看到的配置都是 <ifmodule  module.c>  ,很显然,module.c这个东西已经存在 httpd这个文件中了。

动态:
就是编译的时候,使用enable-module=shared 或者enable-modules-shared=module 来动态编译。  那么什么是动态?  静态是直接编译进httpd中, 那么动态显然就不编译进去了,也就是你启动的时候根本不会加载这个模块, 而是给你一个module.so 文件,你一定要使用 loadmodule 这个语法来加载,这个模块才有效。
From:http://xtony.blog.51cto.com/3964396/836508/

Apache安装apr和apr-util作用:
安装Apache的时候,为什么要安装apr和apr-util呢
要测APR给tomcat带来的好处最好的方法是在慢速网络上(模
拟Internet),将Tomcat线程数开到300以上的水平,然后模
拟一大堆并发请求。如果不配APR,基本上300个线程狠快就会
用满,以后的请求就只好等待。但是配上APR之后,并发的线
程数量明显下降,从原来的300可能会马上下降到只有几十,
新的请求会毫无阻塞的进来。
APR对于Tomcat最大的作用就是socket调度。
你在局域网环境测,就算是400个并发,也是一瞬间就处理/传

输完毕,但是在真实的Internet环境下,页面处理时间只占
0.1%都不到,绝大部分时间都用来页面传输。如果不用APR,
一个线程同一时间只能处理一个用户,势必会造成阻塞。所以
生产环境下用apr是非常必要的。

  注:APR(Apache portable Run-time libraries,Apache可移植运行库)的目的如其名称一样,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。
    在早期的Apache版本中,应用程序本身必须能够处理各种具体操作系统平台的细节,并针对不同的平台调用不同的处理函数。随着Apache的进一步开发,Apache组织决定将这些通用的函数独立出来并发展成为一个新的项目。这样,APR的开发就从Apache中独立出来,Apache仅仅是使用APR而已。

    一般情况下,APR开发包很容易理解为仅仅是一个开发包,不过事实上并不是。目前,完整的APR实际上包含了三个开发包:apr、apr-util以及apr-iconv,每一个开发包分别独立开发,并拥有自己的版本。

adapt from:http://wgkgood.blog.51cto.com/1192594/432272
在phpMyAdmin中提示“Configuration of pmadb… not OK”,如下图所示:
“Configuration of pmadb… not OK”解决办法,这个问题不大,不影响使用,仅仅是一个警告。如果不想总是看见这个警告,可以用如下办法来解决。

(1)初始化phpmyadmin数据库
cd /Library/WebServer/Documents/phpmyadmin/sql
mysql -u root -p < create_tables.sql
Enter password:

mysql> CREATE DATABASE phpmyadmin;
Query OK, 1 row affected (0.02 sec)

mysql> use phpmyadmin
Database changed
mysql> source /data/htdocs/dev.XXX.com/phpmyadmin/sql/create_tables.sql


(2)创建数据库用户
CREATE USER 'pma'@'localhost' IDENTIFIED BY 'pmapass';
GRANT ALL PRIVILEGES ON `phpmyadmin`.* TO 'pma'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;


(3)配置config.ini.php文件
vim config.inc.php
/**
* phpMyAdmin configuration storage settings.
*/

/* User used to manipulate with storage */
// $cfg['Servers'][$i]['controlhost'] = '';
// $cfg['Servers'][$i]['controlport'] = '';
// $cfg['Servers'][$i]['controluser'] = 'pma';    
// $cfg['Servers'][$i]['controlpass'] = 'pmapass';

参考:
http://wlb.wlb.blog.163.com/blog/static/46741320158199711556/
http://bbs.vpser.net/thread-13962-1-1.html
1、打开【开始菜单】进入设置后,进入2的系统(显示、通知、应用、电源)。
2、进入【系统设置】
3、点击”系统选项“
4、选择【通知和操作】
5、选择在任务栏上显示哪些图标
6、控制显示的应用图标【开关】
7、设置成功,任务栏显示应用图标。

摘自 :http://zhidao.baidu.com/link?url=sm3gwUbd7RkQUlspvGUNpzipEaR7fTxXmcw_D0UqAEHT0pb_ThhEkJhdTfJ8OpdMWUj48gb8PR7jQ6d-NsFqyX_NRY2GDD97CBgrkkSujn7
背景:发现gitlab经nginx代理后,有一天访问突然发现出现409错误,[15/Sep/2016:12:40:13 +0800] "GET /dashboard/projects HTTP/1.1" 499 0 "-" "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",502 Whoops, GitLab is taking too much time to respond. Try refreshing the page, or going back and attempting the action again.Please contact your GitLab administrator if this problem persists。


我的Web服务器在用的Linx + Mysql + PHP +nginx,今天被DDOS攻击了,观察日志中发现大量的499 Status Code这个错误。GOOGLE了一把才明白这个499的意思:
日志如下:

222.189.237.18 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.012 ut="-" cs=-
222.189.237.18 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.015 ut="-" cs=-
222.215.105.135 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.015 ut="-" cs=-
222.189.237.18 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.002 ut="-" cs=-
119.147.86.178 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-
222.189.237.18 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-
61.219.178.101 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.002 ut="-" cs=-
58.49.59.142 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-
202.201.252.2 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-
202.201.252.2 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-
119.147.86.178 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-
58.221.37.82 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.039 ut="-" cs=-
222.189.237.18 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.001 ut="-" cs=-
58.49.59.142 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-
58.49.59.142 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.045 ut="-" cs=-
119.147.86.178 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.036 ut="-" cs=-
222.189.237.18 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-
222.189.237.18 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.037 ut="-" cs=-
222.215.105.135 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-

222.189.237.18 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.012 ut="-" cs=-
222.189.237.18 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.015 ut="-" cs=-
222.215.105.135 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.015 ut="-" cs=-
222.189.237.18 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.002 ut="-" cs=-
119.147.86.178 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-
222.189.237.18 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-
61.219.178.101 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.002 ut="-" cs=-
58.49.59.142 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-
202.201.252.2 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-
202.201.252.2 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-
119.147.86.178 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-
58.221.37.82 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.039 ut="-" cs=-
222.189.237.18 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.001 ut="-" cs=-
58.49.59.142 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-
58.49.59.142 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.045 ut="-" cs=-
119.147.86.178 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.036 ut="-" cs=-
222.189.237.18 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-
222.189.237.18 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.037 ut="-" cs=-
222.215.105.135 - - [06/Nov/2011:12:23:27 +0800] "GET / HTTP/1.1" 499 0 "-" "-" "-" rt=0.000 ut="-" cs=-

400~500间的错误码仅定义到了417,所以499应该是nginx自己定义的。

读读nginx代码,看一下注释,找到src/http/ngx_http_special_response.c 这个文件328行,里面定义了不少http错误码以及相应的返回。注意到有下面这样的注释:


    ngx_string(ngx_http_error_494_page), /* 494, request header too large */
    ngx_string(ngx_http_error_495_page), /* 495, https certificate error */
    ngx_string(ngx_http_error_496_page), /* 496, https no certificate */
    ngx_string(ngx_http_error_497_page), /* 497, http to https */
    ngx_string(ngx_http_error_404_page), /* 498, canceled */
    ngx_null_string,                     /* 499, client has closed connection */

    ngx_string(ngx_http_error_494_page), /* 494, request header too large */
    ngx_string(ngx_http_error_495_page), /* 495, https certificate error */
    ngx_string(ngx_http_error_496_page), /* 496, https no certificate */
    ngx_string(ngx_http_error_497_page), /* 497, http to https */
    ngx_string(ngx_http_error_404_page), /* 498, canceled */
    ngx_null_string,                     /* 499, client has closed connection */
可以看到,499对应的是 “client has closed connection”。这很有可能是因为服务器端处理的时间过长,客户端“不耐烦”了。要解决此问题,就需要在程序上面做些优化了。

除了499,nginx还定义了495/496/497/498 这几个Status Codes,相应的意义也在上面的注释中可以看到。开源的东西,可以随时翻看源码,这一点很棒。


来自:http://blog.hexu.org/archives/1085.shtml
背景:一直想为sublime找一个好点的主题,一个是背景字体好看、二是简单、三是上面tab在哪儿要明显,这三个点在下面这个兄弟的博客里得到了体现,不错。
问题?sublime text3主题安装及下载使用方法

安装方法:首先下载https://github.com/kenwheeler/brogrammer-theme/archive/master.zip。解压后将文件夹改名成Theme - Brogrammer。然后打开sublime text3,找到里面的首选项->浏览程序包(Preferences -> Browse Packages),将改名后的文件夹copy到弹出的文件夹中,然后首选项->设置用户(Preferences -> setting uer),将下列代码拷进去:

{
  "theme": "Brogrammer.sublime-theme",
  "color_scheme": "Packages/Theme - Brogrammer/brogrammer.tmTheme"
}
如果不成功,则改成:
{
  "color_scheme": "Packages/User/SublimeLinter/brogrammer (SL).tmTheme",
  "font_size": 14,
  "ignored_packages":
  [
    "Vintage"
  ],
  "show_encoding": true,
  "theme": "Brogrammer.sublime-theme"
}

文档下载:点击打开链接
来自:http://blog.csdn.net/mr_li13/article/details/50821812

推荐一个sublime text3 的主题 material-theme,超级漂亮:
https://tennc.github.io/2016/03/26/%E8%B6%85%E7%BA%A7%E6%BC%82%E4%BA%AE%E7%9A%84%E4%B8%BB%E9%A2%98/
废话不多说,安装方式:
ctrl+shift+p 搜索 material theme 进行安装


github下载主题后,复制到 Packages\User\ 目录下
之后就是启用那个主题,重新启动sublime text就好了~~
不知道谁还用sublime text3,在win10 64bit 情况下~ sublime text3 输入中文,不能跟随,谁晓得如何处理??
CentOS Linux自建yum源,在后面贴上文字:
来自:http://www.live-in.org/archives/1410.html

rpm -qa gpg-pubkey*
rpm包来源合法性及完整性检验:
  前提:在当前系统上导入包的制作者的公钥
   导入:
    rpm --import /path/to/key_file
    # rpm -qa gpg-pubkey*
    显示所有已经导入的gpg格式的公钥
    # rpm -qi gpg-pubkey-NAME
    显示密钥的详细信息
   检查包:安装过程中会自动执行
   手动检查:
    rpm -K /path/to/package_file
    rpm --checksig /path/to/package_file
     不检查包完整性:
      rpm -K --nodigest
     不检查来源合法性:
      rpm -K --nosignature

来自:http://1983939925.blog.51cto.com/8400375/1529663

======================================
平时使用yum方式安装更新软件,可以自建一个yum源,同步官方更新源,这样如果本地有机器要升级的话就可以直接使用本地的更新源了。这里系统为CentOS 6.2。

一、服务端
1、安装需要的环境
自建yum本地更新源可以使用http服务或ftp服务,由于ftp服务器要考虑防火墙配置,主动、被动连接模式,这里使用http服务。

安装apache:

yum install httpd

配置apache过程略过。

2、安装createrepo软件包

yum install createrepo

3、建立存放软件包目录

mkdir -p /home/yum/centos/6/
chown -R apache:apache /home/yum/

4、apache创建虚拟目录

vim /etc/httpd/conf/httpd.conf

在最后加入:

NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /home/yum
ServerName XXX.XXX.XXX #填写绑定的域名
<Directory "/home/yum">
Options Indexes FollowSymlinks
</Directory>
</VirtualHost>

5、将rpm软件包放入/home/yum/centos/6/目录

6、执行createrepo

createrepo /home/yum/centos/6

在/home/yum/centos/6目录下会自动生成repodata目录,repodata目录里是一个数据库,其中的文件主要是XML格式,描述了一个rpm包的详细信息,如依赖关系,包含文件,校验码信息。

二、客户端
1、创建yum客户端repo文件

vim /etc/yum.repos.d/test.repo

以.repo为后缀,这里名字为test。

添加:

[test]
name=yum test
baseurl=http://XXX.XXX.XXX/centos/6
enabled=1
gpgcheck=1
gpgkey=http://XXX.XXX.XXX/centos/RPM-GPG-KEY-TESTREPO

说明:
[test]:是repo id。
name:仓库的描述。
baseurl:仓库的位置。
enabled:是否启用这个仓库,1为起用,0为禁用。
gpgcheck:是否检查gpg签名,1为检查,0为不检查。
(XXX.XXX.XXX是绑定的域名)

PS:如果是内部使用,gpgcheck可以设置为0(同时gpgkey也不用设置),如果更新源放在公网上的话还是需要检查gpg签名,保证客户端得到来源的可靠性。

2、查看yum更新源列表

yum repolist

是否有名为yum test的源出现。

三、(可选)服务端使用gpg key对rpm软件包进行签名
1、创建gpg key
gpg key也是基于非对称加密算法,产生公钥和私钥。

执行:

cd ~
gpg --gen-key

创建过程:

选择加密算法、加密强度、是否设置有效期

设置名称和邮箱


输入保护密码


在/root/.gnupg目录下生成公钥和私钥文件。据观察pubring.gpg是公钥,secring.gpg是私钥。

2、查看公钥

gpg --list-key

显示如下:

/root/.gnupg/pubring.gpg
------------------------
pub   2048R/EF9632F2 2012-07-21
uid                  test repo <testrepo@example.com>
sub   2048R/C17A35BC 2012-07-21

3、在家目录建立.rpmmacros文件

cd ~
vim .rpmmacros

添加:

%_signature gpg
%_gpg_name test repo <testrepo@example.com>

%_gpg_name后面要填写gpg --list-key命令显示的uid,指定这一组key进行签名。

4、对rpm软件包签名
以mtree-2.7-1.el6.rf.i686.rpm软件包为例。

cd /home/yum/centos/6
rpm --resign mtree-2.7-1.el6.rf.i686.rpm

随后需要输入保护密码。

5、导出公钥到文本文件

cd ~
gpg --export -a "test repo <testrepo@example.com>" >RPM-GPG-KEY-TESTREPO

6、验证是否签名成功
查看rpm数据库中的公钥:

rpm -q gpg-pubkey

gpg-pubkey-c105b9de-4e0fd3a3

导入公钥:

rpm --import RPM-GPG-KEY-TESTREPO


rpm -q gpg-pubkey

gpg-pubkey-c105b9de-4e0fd3a3
gpg-pubkey-ef9632f2-500a6e55

已经添加了一组公钥。

检验rpm软件包:

cd /home/yum/centos/6
rpm -K mtree-2.7-1.el6.rf.i686.rpm

mtree-2.7-1.el6.rf.i686.rpm: rsa sha1 (md5) pgp md5 OK

7、将公钥放到web服务器上

cp ~/RPM-GPG-KEY-TESTREPO /home/yum/centos/

8、服务端更新仓库信息

createrepo --update /home/yum/centos/6

主要是更新repodata目录中的数据。

四、(可选)客户端导入公钥

rpm --import http://XXX.XXX.XXX/centos/RPM-GPG-KEY-TESTREPO

(XXX.XXX.XXX是绑定的域名)

测试安装:

yum install mtree

参考资料:
http://jianlee.ylinux.org/Computer/Linux发行版开发/createrepo.html
http://zhumeng8337797.blog.163.com/blog/static/100768914201231852812921/
http://ramblings.narrabilis.com/creating-a-yum-repository-repo-and-creating-a-yum-group-to-install-kickstart
背景:在vim中看比如最近流行的SSDB,听说想替代redis,里面有一个配置文件叫:/usr/local/ssdb/ssdb.conf ,写道:# MUST indent by TAB!
在vim里看不到tab,或你已经修改一个tab不是它默认的tab了(一个tab修改为4个空格),如何看tab成问题,有时你还想分是不是tab还是空格?
在VI中,也有类似功能,可以查看TAB及行尾空格。
如下设置,第一行运行时看起来比较不顺眼(^I填充TAB),再运行第二行(TAB会被显示成 ">---" ("-" 的个数不定) 而行尾多余的空白字符显示成 "-"。
看起来好多了):


set list是设置显示TAB,默认是用^I填充TAB。
listchars选项用来设置TAB和行尾空格的显示。
详见vi帮助:VIEWING TABS




参考:http://www.361way.com/vi-char/362.html
参考:http://blog.csdn.net/jq0123/article/details/5600426
背景:在Linux下的c也好windows下的c也好,这两者不太好理解,再研究一下,指针数组就是像数组下标一样获取一个数组里面的值,不过前面有括号(*b)[N],N {1,N}。

1、指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针;数组指针:a pointer to an array,即指向数组的指针。
int* a[4]     指针数组    
                  表示:数组a中的元素都为int型指针    
                  元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*
int (*a)[4]  数组指针    
                  表示:指向数组a的指针
                  元素表示:(*a)[i]  

2、下面通过实例来说明数组指针与指针数组的区别:  


分页: 34/272 第一页 上页 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 下页 最后页 [ 显示模式: 摘要 | 列表 ]