分类目录归档:IT技术

一个 xl2tpd 无法连接的问题

1个月前手贱,将 xl2tpd 的配置文件 /etc/ppp/options.xl2tpd 里的 name 字段给改了,只因看原来设置的 l2tp不爽,改的时候以为这只是一个无关瘙痒的字段。但后来 vpn 就一直无法成功连接,直到今天对着网上的教程一字一字的查我的配置文件,才发现别人的 options.xl2tpd 内的 name 字段和 chan-secret 内的 server 字段是一样的,而我的设置不一样,遂想到这两个文件内的 name 和 server 是相关的,于是改为相同的值,重连 VPN …… 成功连接!

Mac OS X 调教手册

1. 终端美化
Mac OS X 终端默认的样子实在是太难看了,竟然一点色彩都没有……让我们给它增加点颜色吧,编辑 ~/.bash_profile,如果没有则创建,然后增加以下几行:

# 彩色显示命令行
export CLICOLOR=1
# 让 grep 用红色标出搜索的字符串
alias grep='grep --color'
# 增加 ll 命令
alias ll='ls -la'

2. Homebrew
Homebrew 是Mac OS X 下新的软件包管理工具,详细的介绍请参阅这篇文章。
安装文件从这里获取,然后在终端执行

ruby install_homebrew.rb

然后就可以使用 homebrew 来安装/移除软件包了。
3. 修改磁盘卷名

# 先 diskutil list 查看设备名,如"disk0s1"
diskutil rename /dev/devicename 'newname'

4. 命令行下 sudo 免输密码
在安装软件的时候经常需要使用sudo命令来获取管理员权限,而 Mac 在默认的情况下使用sudo命令是需要输密码的,而且密码不能为空,这样的设定在实际使用的时候总是感觉很不方便,我已经是管理员了,我在使用sudo的时候已经知道自己在做危险的事了,所以密码就不要让我再输了吧……以下是修改方法:
注意:修改sudoers的时候一定要使用visudo来改,这样如果文件有错误是无法保存的,否则一旦这个文件出错,你就哭去吧!

#在命令行执行
sudo sudovi
#找到
%admin ALL=(ALL) ALL
#改为
%admin ALL=(ALL) NOPASSWD: ALL

5. 将网页元素添加到 Dashboard
在 Safari 中右击网页,选择 在Dashboard中打开,然后选择合适的尺寸,点击添加就可以了。
如果是音乐播放器这种希望能在后台播放的元素,则还需要点击新添加的widget右下角的“i”,去掉“仅在Dashboard”中播放音频。
删除的方法:点击左下角的“+”,选择“管理widget”,然后在Dashboard上点击要删除的widget左上角的叉号。
6. 修改Hostname
在终端执行以下命令

sudo scutil -set HostName newname

当一个字符串和 false 比较的时候会发生什么?

今天在写程序的时候,遇到个问题,这个问题是这样的:

我有一个表:

CREATE TABLE IF NOT EXISTS `session` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `token` varchar(32) NOT NULL,
  `profile` varchar(1000) NOT NULL,
  `created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=41 ;

和一些数据:

(38, '395d5feaf28df01aafe0781a7f34acbe', 'a:3:{s:2:"id";s:1:"2";s:8:"username";s:7:"wanmeng";s:12:"created_time";s:19:"2011-11-18 19:37:33";}', '2011-12-03 14:14:35'), 
(39, '0e0ca06ed9ad86937f190eb9544ac935', 'a:3:{s:2:"id";s:1:"1";s:8:"username";s:6:"delphi";s:12:"created_time";s:19:"2011-11-18 13:29:40";}', '2011-12-03 14:28:36'), 
(31, '3cba76b97cf123009632bdaa5a306385', 'a:3:{s:2:"id";s:1:"1";s:8:"username";s:6:"delphi";s:12:"created_time";s:19:"2011-11-18 13:29:40";}', '2011-12-02 15:50:21'), 
(30, 'fa356333dd3ee8f1b18b8bf0a827e34c', 'a:3:{s:2:"id";s:1:"1";s:8:"username";s:6:"delphi";s:12:"created_time";s:19:"2011-11-18 13:29:40";}', '2011-12-01 15:32:47')

在我执行  SELECT * FROM session WHERE token = false 的时候,我本以为没有记录会返回,但是mysql却给我返回了2条记录:

39  0e0ca06ed9ad86937f190eb9544ac935    a:3:{s:2:"id";s:1:"1";s:8:"username";s:6:"delphi";...   2011-12-03 22:28:36 
30  fa356333dd3ee8f1b18b8bf0a827e34c    a:3:{s:2:"id";s:1:"1";s:8:"username";s:6:"delphi";...   2011-12-01 23:32:47

我猜到了问题应该是出在数据类型转换上,于是我就修改了查询语句,让字符串和null值作比较而不是false,但为什么会这样却一时半会儿没想明白,于是就在stackoverflow上提了个问题 ,结果当然是被人家当小白教育了一翻……但原因我算是知道了。

在Mysql中是没有boolean这种数据类型的,boolean在Mysql中实际上是用Tinyint表示的,0代表false,1代表true。

所以上边那个查询实际上就是相当于

SELECT * FROM session WHERE token = 0

当一个字符串和Tinyinit作比较的时候,Mysql会先将字符串转换为数字类型,数字开头的字符串取前边的可以转换的数字字符转为数字,如果字符串是字母开头的,则直接转为数字0

于是那些以字母开头和数字0开头的记录便被取出来了。

Nginx配置相关的一些问题

1.  no input file specified

这个问题其实就是Nginx传给PHP-cgi的文件名,cgi找不到。这个问题一般是由以下原因导致的:

  1. 文件真的不存在……
  2. 文件和目录的权限问题,如果nginx和php-cgi运行的用户对要获取的文件没有读取权限,就会出这个错。
  3. php.ini中的cgi.fix_pathinfo选项,如果你是用SCRIPT_FILENAME获取php文件路径的话,请将此项设为1
  4. 如果在nginx中SCRIPT_FILENAME是用$document_root$fastcgi_script_name;这种方式定义的话,需要保证$document_root在此句之前已被定义。
  5. 还有一种情况比较特殊,就是有些nginx版本的配置文件,会在fastcgi_params文件中重复定义SCRIPT_FILENAME为其它的值,把fastcgi_params中的注释掉就好了。

2. 使用$request_filename判断文件是否存在的时候,$request_filename无法正确定位文件位置

这是因为$request_filename是与server的root有关的,所以需要在server段中定义root来指出此网站所在的物理路径。

为 PHP 安装 OAuth 扩展

最近在弄Evernote的API,想通过Evernote的API将JSON格式的Google Reader分享资料导入到Evernote中。注册了Evernote沙盒账号,下载了SDK,一运行示例代码,结果这玩意儿还需要安装OAuth扩展。

上网找了一下PHP的OAuth扩展的资料,总结分享如下:

OAuth是一个基于HTTP的用户验证协议,可以使应用在无需保存用户的账号密码的情况下为用户提供安全的数据访问。PHP的OAuth扩展为OAuth认证和绑定账号提供所需的支持。

如何安装

最简单的方法就是从PECL上下载了

首先安装pecl

sudo apt-get install php-pear php5-dev make

然后运行

sudo pecl install oauth

如果遇到了/usr/include/php5/ext/pcre/php_pcre.h:29: fatal error: p…的问题,则需要安装libpcre3-dev

sudo apt-get install libpcre3-dev

安装完成后,在 /etc/php5/cgi/php.ini 中添加一行

extension=oauth.ini

但是我用pecl没能安装成功,我是自己编译安装的

首先在PHP官网下载oauth的包

将包解压到随便哪个目录,在那个目录执行

phpize
./configure
make
sudo make install

然后同样是在 /etc/php5/cgi/php.ini中添加

extension=oauth.ini

之后重启phpcgi服务就可以了。

参考资料

http://www.php.net/manual/zh/oauth.setup.php
http://pecl.php.net/package/oauth
http://djpate.com/2010/10/07/how-to-install-oauth-support-for-php-on-ubuntu/

EC2 使用手记

注册EC2服务并创建一个自己的实例

备份Instance

迁移Bundle

使用Command Line

ec2的命令行管理指令需要使用Private key和X.509证书,如果你还没有这2个文件,则可以通过以下步骤获取:

  1. 进入到YOur Account,选择Security Credentials
  2. 找到Access Credentials,切换标签到X.509 Certificates
  3. 点击Create a New Certificate建立新的证书
  4. 下载刚刚生成的Private Key(pk-xxxxx.pem形式的文件)和X.509 Certificate(cert-xxxx.pem形式的文件)

然后将这2个文件上传到ec2服务器上,我是将这2个文件放在了home下的.ec2中。之后在使用ec2的管理命令的时候,就可以通过指定-K your_private_key.pem和-C your_x.509_cert.pem的方式来使用这2个文件了。
如果不想每次都输这两个参数的话,也可以通过以下的方法将这2个文件添加到环境变量中,这样ec2命令在执行的时候则会自行去使用这2个文件:

export EC2_PRIVATE_KEY=~/.ec2/your_private_key.pem
export EC2_CERT=~/.ec2/your_X.509_cert.pem

另外,很多命令在使用的时候都需要指定Region,而这个参数不是必须的,如果不指定这个参数的话,则默认是us-west-1,如果你不是这个Region,则需要通过–region参数来指定。
你可以使用此命令查看当前ec2所在区域:

查看各区域名称及URL命令:

ec2-describe-regions

一些概念

ec2-bundle-image和ec2-bundle-vol的区别:
ec2-bundle-image是从一个loopback file(回环文件?我的理解就是类似ISO的文件)创建AMI。
ec2-bundle-vol是本机(就是你的ec2)的根文件系统创建AMI。

Linux 点滴

1. Ubuntu 的最上方的面板如果被误删之后如何恢复呢?

不用抓狂,三句话解决问题。

gconftool --recursive-unset /apps/panel
rm -rf ~/.gconf/apps/panel
pkill gnome-panel

2. 批量修改文件或目录权限

find -type d -exec chmod 745 {} \;
find -type f -exec chmod 644 {} \;
# 或者
find -type d|xargs chmod 745
find -type f|xargs chmod 644

3. 修改服务器时区:

tzselect

如果要修改时区并且马上生效,可以更换/etc/localtime 文件来实现。比如修改时区为中国上海,那么就可以使用如下的命令来使得时区的更改生效。

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

4. Amazon Linux AMI切换到root的方法:

sudo chroot /

5. 如何在Red hat上安装iostat:
iostat是sysstat内的一个工具,使用下面这个命令安装sysstat

yum install sysstat

6. 使用iostat查看硬盘I/O情况

iostat -x

各字段解释:
rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s
wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s
r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s
w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s
rsec/s: 每秒读扇区数。即 delta(rsect)/s
wsec/s: 每秒写扇区数。即 delta(wsect)/s
rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
wkB/s: 每秒写K字节数。是 wsect/s 的一半。
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。即 delta(rsect+wsect)/delta(rio+wio)
avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。
await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘
可能存在瓶颈。

7. 一条指令结束同一程序的多个进程

sudo kill -9 `pidof name`

8. 查看某一进程都打开/占用了哪些文件

lsof -c name

or

lsof -p pid

8. 如何查看Mysql数据库文件存放位置
Mysql配置文件(一般的存放位置为 /etc/my.cnf)中的datadir即为数据文件存放位置

WordPress 在 Nginx 中的 Rewrite 规则

查看wordpress设置的时候看到wordpress支持/year/month/article_title这种形式的链接,早就厌烦了URL后带一堆&xxx=nnn的形式,于是决定改成这种“漂亮地址”。
当然,这种链接需要作URL重写,我的Web Server用的Nginx,于是打开Nginx的设置文件nginx.conf,找到此blog的location,加上了

if (-f $request_filename) {
    break;
}
rewrite ^(.*)$ /index.php?$1 last;

修改Wordpress为固定链接形式后重启Nginx,再打开Blog里的文章,变成“漂亮地址”了。
但是用了没多久,就发现了问题:我在登录后并没有转到wordpress的后台,而是提示说文章不存在。仔细一看URL地址,是/wp-admin/,这是wordpress的管理目录,省略了缺省的index.php,因为我用的”-f”(文件是否存在),于是if判断返回的是false,转到了下边的rewrite,把wp-admin当文章处理了。
于是再次修改Rewrite判断为”-e”(文件或目录是否存在)。

if (-e $request_filename) {
    break;
}
rewrite ^(.*)$ /index.php?$1 last;

重启Nginx,再登录后台就没问题了。

使用 nVidia 受限驱动后启动画面分辨率低的解决方法

本文非原创,内容修改自 http://linuxzh.blogbus.com/logs/63350102.html
Ubuntu 10.04, x64 系统。为了使用compiz桌面特效,安装了Nvidia的限制驱动,不过启动画面splash的分辨率由1440*900降低成640*480了。网上看了好多帖子,包括 jorux 的帖子 “解决升级显卡驱动后开机动画低分辨率问题”,一直没有解决问题。
今天终于在英文论坛上找到一个切实可行的办法,并经本人试验,在1440*900的分辨率下确实有效。特与大家分享:
原文地址:http://idyllictux.wordpress.com/2010/04/26/lucidubuntu-10-04-high-resolution-plymouth-virtual-terminal-for-atinvidia-cards-with-proprietaryrestricted-driver/
现简述解决过程:
1. 修改/etc/default/grub文件,使用uvesafb的framebuffer来启动

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
# GRUB_GFXMODE=640×480

修改为:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="nomodeset video=uvesafb:mode_option=1440x900-24,mtrr=3,scroll=ywrap"
GRUB_GFXMODE=1440x900

2. 修改/etc/initramfs-tools/modules文件
添加下面这行:

uvesafb mode_option=1440x900-24 mtrr=3 scroll=ywrap

3. 运行下面的命令,启用framebuffer:

echo FRAMEBUFFER=y | sudo tee /etc/initramfs-tools/conf.d/splash

4. 运行下面的命令,更新grub配置文件:

sudo update-grub2
sudo update-initramfs -u

更改 VirtualBox 自动挂载数据空间的位置

Virtualbox 从 4.0 开始支持自动挂载数据空间,在 Linux 为客户机的情况下,Linux 内默认的挂载位置为/media/sf_share (在 Solaris 为 /mnt/sf_share),其中 sf_ 为前缀,share 为共享空间的名称,如果想更改这个默认挂载的位置,可以通过对 /VirtualBox/GuestAdd/SharedFolders/MountPrefix 和 /VirtualBox/GuestAdd/SharedFolders/MountDir 赋予新的值来完成。
以下为更改方法
1. 更改 Virtualbox 自动挂载目录的前缀
sudo VBoxControl guestproperty set /VirtualBox/GuestAdd/SharedFolders/MountPrefix sf_
2. 更改 Virtualbox 的自动挂载位置到home
sudo VBoxControl guestproperty set /VirtualBox/GuestAdd/SharedFolders/MountDir $HOME