人人app向人人相册添加图片失败,PHP -with-curlwrappers 导致的问题

这两天还在折腾renren的一个应用。其中有一个功能是上传一张图片到我们自己的服务器,然后再把这张图片上传到renren的相册。最初在本地测试的时候没有问题。可是访问生产机的时候总是在向renren传数据的时候报错。折腾了一天,终于找到原因了。

由于本地使用的XAMPP的环境,生产机使用的是LNMP的环境。LNMP使用的是lnmp .org的一键安装包。这个安装包在编译php的时候开启了-with-curlwrappers 选项,造成了php在使用stream_get_contents函数向renren传递图片时候的错误。

解决方法,重新编译、安装php,configure的时候去掉-with-curlwrappers 选项即可

参考文章:http://www.weizhifeng.net/php-with-curlwrappers-issue/

Posted in 工作笔记 | Tagged | Leave a comment

MySQL安全删除数据的做法

来源:http://www.vimer.cn/2012/01/%E6%9C%80%E8%BF%91%E7%9A%84%E4%B8%80%E4%BA%9B%E6%8A%80%E6%9C%AF%E6%95%B4%E7%90%8620120109.html

MySQL安全删除数据的做法

这个其实是来自公司DBA的建议啦,这里分享一下 关于delete,我这里建议你们做任何的delete操作之前先执行如下备份语句:

CREATE backup.tablename AS SELECT * FROM dbname.tablename WHERE id = 90000;

DELETE FROM dbname.tablename WHERE id = 90000;

恢复语句: insert into dbname.tablename select * from backup.tablename;

还有一个习惯, 如果确信自己删的数据只有一条 加个 limit 1

Posted in 学习笔记 | Tagged , | Leave a comment

《Vim 大冒险》玩游戏,学习 Vim

今天在微博上看见的,觉得挺有趣,记在这里,有空去玩 ^_^


http://vim-adventures.com/

Posted in 学习笔记 | Tagged | Leave a comment

Google测试新界面

大约是这周一或者周二的时候,我在用Google找东西的时候发现Google显示搜索结果的页面内容都居中了。应为之前使用浏览器调过自己写的CSS,所以还以为是自己哪里设置处问题了,也没太注意。之后页面刷新个两三次就又正常了。今天习惯性的看Google Reader中订阅的内容时,月光博客上说Google在测试新的界面(文章地址:http://www.williamlong.info/archives/3058.html),才知道我是赶上了。但是,那个界面实在是够别扭的,引用月光博客上的一幅图吧(我自己没有截图)。Google啊,能不能给那个拧巴的新界面添加个恢复按钮啊,我这个人接受新鲜事物能力有限 ^_^

Posted in 杂记 | Tagged | Leave a comment

使用ThinkPHP搭建人人网app初始化RenrenRestApiService错误的解决

昨天,有个朋友想在人人上做一个链接到他网站上的app。他的网站是使用ThinkPHP框架搭建的。在单独测试人人的app或者单独测试网站程序的时候都没有问题。可是当在他自己的网站中通过人人app访问数据是直接报错了。错误内容大约就是人人app的那个php对象初始化失败,无法加载相应的配置文件,请检查。

通过分析人人app提供的demo可以看出工作流程大体如下:

用户访问第三方app,第三方app从人人取得用户数据,如果没有授权,提示用户授权第三方app访问,之后第三方app就可以从人人获取用户相应的数据了。在第三方app获取人人网的数据时,需要初始化人人网提供的RenrenRestApiService类。通过查看这个类对应的代码可以看到这个类会加载另外两个文件,一个是 ‘HttpRequestService.class.php’,另一个是配置文件 ‘config.inc.php’。

require_once ‘HttpRequestService.class.php’;
require_once ‘config.inc.php’; #Include configure resources

由于报错是在初始化RenrenRestApiService时,所以看了一下RenrenRestApiService的构建函数(如下)

public function __construct(){
    global $config;
    parent::__construct();
    $this->_config = $config;
    if(empty($this->_config->APIURL) || empty($this->_config->APIKey) || empty($this->_config->SecretKey)){
        throw new exception('Invalid API URL or API key or Secret key, please check config.inc.php');
    }
}

在这里会使用到$config。而$config是在’config.inc.php’中定义的,这里使用global标记将其引入到类中。

可是将这个demo中的相关代码放置到ThinkPHP中时初始化RenrenRestApiService却出现了问题。使用var_dump在RenrenRestApiService的构造函数中查看$config变量,提示为空。首先怀疑是由于路径问题,config.inc.php 文件未加载。经过相应的修改后,确定这个文件已经被加载了,而构造函数中的$config还是没有数据。此时,注意到在$config 前有global标记,这个标记是说相关变量引用函数外的同名变量。怀疑应该是这个global 这里出的问题。找到了问题,解决就简单了。首先在在’config.inc.php’中使用$_GLOBALS 的方式定义全局变量$config,之后在RenrenRestApiService的构造函数中使用$_GLOBALS 的方式访问全局变量$config就可以了。

为什么在ThinkPHP中global这个标记不太好用了,暂时不清楚。google了一下,弄清了关于global和$_GLOBALS间的区别,记在这里备查。

以下内容来自 http://stackoverflow.com/questions/3573847/php-global-or-global

Well, you should only use globals in limited circumstances, but to answer your question:

  1. global is potentially marginally faster (it will rarely make a difference).
  2. $GLOBALS (not $GLOBAL) is more readable, because every time you see it, you know you are accessing/changing a global variable. This can crucial in avoiding nasty bugs.
  3. Inside a function, if you want to unset a global variable, you must use unset($GLOBALS['varname']), not global $varname; unset($varname);.

As to points 1 and 2, I’ll quote Sara Golemon here:

What does that mean for your use of the $GLOBALS array? That’s right, the global keyword is technically faster. Now, I want to be really clear about one thing here. The minor speed affordance given by using your globals as localized [compiled variables] needs to be seriously weighed against the maintainability of looking at your code in five years and knowing that $foo came from the global scope. something_using($GLOBALS['foo']); will ALWAYS be clearer to you down the line than global $foo; /* buncha code */ something_using($foo); Don’t be penny-wise and pound foolish..

以下内容来自 http://stackoverflow.com/questions/107693/global-variables-in-php-not-working-as-expected

Global DOES NOT make the variable global. I know it’s tricky :-)

Global says that a local variable will be used as if it was a variable with a higher scope.

E.G :

$var = "test"; // this is accessible in all the rest of the code, even an included one 

function foo2()
{
    global $var;
    echo $var; // this print "test"
    $var = 'test2';
} 

global $var; // this is totally useless, unless this file is included inside a class or function 

function foo()
{
    echo $var; // this print nothing, you are using a local var
    $var = 'test3';
} 

echo $var;  // this will print 'test2'

Note that global vars are rarely a good idea. You can code 99.99999% of the time without them and your code is much easier to maintain if you don’t have fuzzy scopes. Avoid global if you can.

global $foo doesn’t mean “make this variable global, so that everyone can use it”. global $foo means “within the scope of this function, use the  global variable $foo“.

还有一篇文章也不错,比较长,就不全文复制了
http://blog.csdn.net/jiangfeng08/article/details/5416148

Posted in 学习笔记 | Tagged | Leave a comment

Excel 2007 使用记录一则

这个是一位当教务的老师朋友让帮忙弄的,在excel里看看给定的学生必修课是否都修过了,做这样的一个统计,最终的结果以二维表的方式显示出来。本来觉得挺简单的,结果弄了半个上午。还是excel公式不熟练。呵呵。

实现这个功能主要使用了三个函数,vlookup实现查找;index,match针对每个人生成一个引用。

思路是,先对数据按人名排序,之后使用excel的高级筛选功能把每个人的姓名单独列出,去除重复值,作为结果表的行标题。将课程作为结果表的列标题(如果之前的数据是列方式,可以使用选择性粘贴里的转置)。之后就是查找了。对给定的类别,在每个人的数据中进行查找,找到了就返回对应结果就可以了。原始表和结果见下图。

E2单元格的函数:=VLOOKUP(E$1,(INDEX($A$2:$B$21,$K2,2):INDEX($A$2:$B$21,$L2,2)),1,FALSE)。其中的两个INDEX函数用来返回给定人的数据区域,区域的起始和结束位置由K2和L2单元格中的值确定

K2单元格的函数:=MATCH(D2,A$2:A$21,0)

L2单元格的函数:=MATCH(D2,A$2:A$21,1)

 

Posted in 工作笔记 | Tagged | Leave a comment

海掏第一单到手,记录一下

我是2月8号在亚马逊下的单,购买的kindle touch 广告版和一双哥伦比亚的鞋。下单之后,在亚马逊发货前,基本上每天都去亚马逊的网上看货品状态。可能是因为发货的地点不同吧,我的鞋和kindle被分成了两个包裹,分别发往转运公司。而且,两个包裹的发货时间相间隔2天的时间。等包裹到转运公司后,就是天天都去转运公司的网上看状态了。在经历了三周半的时间后,终于到手了,感觉很兴奋啊。

上周六上午接到了EMS的电话,问什么时候可以送货,我说周一上班吧,今天不在办公室。今天上午到了办公室后,处理了一些琐碎的事务之后便开始“焦急”的等待,我的包裹怎么还没到呢?终于,在中午11点多,EMS到了。

签收之后,由于听说有的转运的包裹中会少东西,所以,让EMS稍等了一下,开箱看了看东西是否全。


开箱照,怎么只有鞋?呵呵,kindle在鞋盒里呢


全家福


kindle的包装盒


打开kindle包装


来张特写

Posted in 杂记 | Tagged | Leave a comment

使用IE9下载优酷视频

需求:IE9或者chrome等,总之,要有需要有开发者工具(需要里面的网络探嗅功能)

打开你要下载的视频的网页,比如优酷,按F12键呼出开发人员工具。

IE9 开发者工具

之后打开你需要下载的视频页面。点击开发者工具中的网络,然后按开始捕获按钮。此时会显示当前页面中都请求了那些内容。之后就是找一下那个是flv文件,然后下载就可以了,简单吧。

最后,如果你看的视频较长,网站一般会将这个视频分成若干文件,根据你下载下来的文件的时间,拖动一下进度条,让浏览器再去请求后面的文件,就可以得到具体的链接了。

Posted in 杂记 | Tagged , , | Leave a comment

[ZT]Ubuntu搭建Subversion服务器

原文地址:http://www.son1c.cn/show/920.html

记录一下Ubuntu下安装Subversio服务器: username为你的用户名
一,安装Subversion

  1. sudo apt-get install subversion

二,创建资源库

  1. cd /home/username
  2. svnadmin create repos
  3. svnserve -d -r /home/username

三,修改用户名和密码
1,修改/home/username/repos/conf/svnserve.conf,把下面三行的注释去掉

  1. anon-access = read
  2. auth-access = write
  3. password-db = passwd

2,修改/home/username/repos/conf/passwd,添加用户和密码

  1. hideto = hideto
  2. lucia = lucia

四,导入project

  1. svn import -m ”Import rails project hilog” /home/username/workspace/hilog svn://192.168.1.1/repos/username

五,导出project

  1. svn co svn://192.168.1.1/repos/hilog

ok,可以用了!checkout不需要认证,checkin需要。
这是使用Subversio自带的svn协议和svnserve工具简单的搭建svn私服,还可以结合Apache搭建http://和 https://协议的svn服务器及安装Trac

参考资料:
建立Subversion服务器

Posted in 学习笔记 | Tagged , , | Leave a comment

使用Ubuntu 10.04搭建Win7无盘服务器配置笔记

实验室的服务器已经使用近半年,除了几次意外的停电,目前还没有发生什么重大问题。趁着还有记忆,把相关的配置记录写在这里。

硬件:

Dell T410, 8G内存, SATA 1T×2 raid1, SAS 300G×2 raid1

需求:(■ 表示已经配置的;□表示未配置的)

远程管理(■ ssh)

桌面环境(□ gnome)

Win7 的无盘启动 (■DHCP + ■TFTP + ■PXE + ■iSCSI 均对内网)

文件共享(□Samba 对内网、■FTP 对内对外)

网关(■iptables 或者 □squid)

■无线上网(网桥)

■内网的多网卡绑定

========================================================================

0、目录规划(补充)

分区如下:

partition     Filesystem     Size     Mounted on
/dev/sda1     ext4          485M     /boot
/dev/sda2     ext4          838G     /home
/dev/sda3     ext4            50G     /
/dev/sda5     swap          10G
/dev/sda6     ext4            20G     /var
/dev/sdb1     ext4          275G     /var/iSCSI

计划:

使用/home/iSCSI 放置iSCSI磁盘镜像文件

在 /var 目录下 创建tftproot目录,放置PXE启动相关的文件

在 /home 目录下 创建shared目录,放置samba共享文件

在 /home 目录下 创建ftp目录,放置虚拟用户的文件

1、安装ssh

系统安装好后,自带ssh,简单配置一下即可使用

2、安装vsftpd与samba

apt-get install vsftpd

apt-get install samba

3、修改apt源

将源替换为教育网的源

#vi /etc/apt/sources.list

:%s/cn.archive.ubuntu.com/debian.ustc.edu.cn

#apt-get update

#apt-get upgrade

4、网卡设置

4.1 网卡绑定

安装 ifenslave

#apt-get install ifenslave

#vi /etc/network/interfaces

auto bond0
iface bond0 inet static
address 192.168.0.254
gateway 192.168.0.254
netmask 255.255.255.0
slaves eth2 eth3 eth4 eth5
bond-mode 6

bond mode 4

#在使用mode 6 的时候,tftp与iscsitarget总是工作不正常。

#看了一下手册,交换机支持802.3ad(mode 4),于是就这么设置了

bond-miimon 100

在 /etc/modprobe.d/bonding.conf 里面加上(这一步好像可以不用)

alias bond0 bonding

options bonding mode=6 miimon=100 

options bonding mode=4 miimon=100    #理由同上

在 /etc/modules中添加

bonding

4.2 无线网卡设置

安装hostapd

#apt-get install hostapd

编辑/etc/default/hostapd

去掉其中 RUN_DAENON=”yse”  DAEMON_CONF=”/etc/hostapd.conf”  和 DAEMON_OPTS=”-dd” 的注释

编辑/etc/hostapd.conf 删除其中的所有内容,添加如下内容

interface=wlan0

bridge=br0

driver=nl80211

ssid=ZXL122

hw_mode=g

channel=11

wme_enabled=1

ieee80211n=1

4.3 网桥设置

安装桥工具bridge-utils

#apt-get install bridge-utils

echo “1″ > /proc/sys/net/ipv4/ip_forward #打开IP转发,这是共享上网的必要条件

貌似使用透明网桥模式连接eth1和wlan0的时候可以不开这个,无线网络也可以正常使用

配置interfaces文件,添加

iface br0 inet manual

bridge-ifaces eth1 wlan0

up ifconfig $IFACE up

最终的/etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp

#fenghao add this to set bonding
auto bond0
iface bond0 inet static
address 192.168.0.254
netmask 255.255.255.0
#gateway 192.168.0.254
slaves eth2 eth3 eth4 eth5
bond-mode 4
bond-miimon 100

#set net-bridge
auto br0
iface br0 inet manual
bridge-ifaces eth1 wlan0
up ifconfig $IFACE up
bridge_ports wlan0 eth1

5、安装tftpd

#apt-get install tftpd-hpa tftp-hpa

编辑配置文件 /etc/default/tftpd-hpa

修改为以下内容

TFTP_USERNAME=”tftp”

TFTP_DIRECTORY=”/var/lib/tftpboot” //这里是你的tftpd-hpa的服务目录

TFTP_ADDRESS=”0.0.0.0:69″

TFTP_OPTIONS=”-l -c -s”        //这里是选项

6、安装iscsi-target

由于源里的iscsi-target是1.4.19的,在使用的时候总是出一些莫名的错误,于是,从网上下载了最新版本的1.4.20.2

解压,make,make install

配置文件如下:

/etc/iet/ietd.conf

Target iqn.2011-10.netroomser:hp3080
Lun 0 Path=/var/iscsi/win7_32.img,Type=fileio,IOMode=roTarget iqn.2011-10.netroomser:sharedtools
Lun 0 Path=/var/iscsi/SharedTools.img,Type=fileio

添加initiator的访问权限

/etc/iet/initiators.allow

ALL 192.168.0.0/24    #只允许192.168.0.x网段访问

重启系统。(这个一定要重启,否则iscsitarget不正常工作)

注:

a、在将IOMode设置为ro(只读)的时候,其他主机在访问iscsitarget的时候,系统会报错(CentOS 6.0 直接就重启了,这个是我这次安装ubuntu的主要原因)

在网上查了一下,官网上的maillist也有人遇到了这个问题。作者给予的回复,更新一个新的文件,重新编译。之后故障解决。

我是10月26日上午安装的,这个bug是10月26日晚上报告的,作者第一时间做了更新。我是27日一早遇到的这个问题,正好就找到并解决了。感谢作者!!感谢Google大神!!!

b、启动iscsi-target服务后,在系统的log里查看到iscsi-target: unable connect (connect refused)2! (大约是这样)

把/etc/iet/ietd.conf 中的isnsserver 那行注释掉就可以了。

其它说明:

1)添加服务到开机自动运行,使用 update-rc.d 命令

Posted in 工作笔记 | Tagged , , , , , | Leave a comment