WordPress 自动转义 画蛇添足

0

WordPress 在显示文章时,会把英文半角的双引号、双减号自动转换成全角的双引号和单个破折号。

这个功能真是画蛇添足。

找到了这段逻辑,在下面这个文件中。

wp-includes/formatting.php

涉及到的变量有 $static_characters、$static_replacements、$dynamic_characters 还有 $dynamic_replacements。

把这些替换成空数组应该就能解决问题,等有空多测试下再搞吧。

Mark 一下。

使用 rsync 备份多台服务器

0

今天对服务器备份的脚本进行了重构,把配置参数独立成文件,使用 PHP 代替不熟悉的 shell,理顺了思路,分享一下。

【环境】

一共3台服务器,server-1 和 server-2 是线上生产环境,backup-server 是专门用于备份的服务器。

【目的】

定期把 server-1 和 server-2 的 user 目录下的所有文件同步到 backup-server 的指定目录下。

【前提】

backup-server 上有一个用户 backup,他用 ssh-keygen 生成公钥,传到 server-1 和 server-2,这样 backup 用户登录这 2 台线上服务器时不再需要密码。

[backup@backup-server rsync]$ ssh-keygen -t rsa -b 1024

在 ~/.ssh/ 下生成 id_rsa 和 id_rsa.pub,分别是私钥和公钥。

把 id_rsa 重命名成 identity,chmod 600。

把 id_rsa.pub 复制到 server-1 的 /home/user/.ssh/ 目录下,把内容追加到 authorized_keys 文件中,注意此文件也要 chmod 600。

server-2 也如此操作。

之后,backup 用户可以随意 ssh user@server-1 和 ssh user@server-2,不会再问密码。

【功能列表】
* 根据配置文件的 serverName,生成 shell 命令
* 判断是否为唯一 rsync 进程,如果有正在执行的进程,则不执行任何操作
* 确认没有重复进程之后,执行 rsync 命令同步文件,并输出进度信息到 logs 目录
* php 的程序只输出 shell 命令,确认无误后用管道输出给 bash 来运行

【使用方法】
[backup@backup-server rsync]$ /usr/bin/php /home/backup/script/rsync/rsync_web.php server-1 | sh

【详情】

根据 server-1 这个关键字,找到对应的配置信息。

根据一些列规则,生成一串管道命令,输出如下所示:

rsync_process_num=$(ps ax | grep ‘rsync’ | grep -v ‘grep’ | grep ‘server-1′ | grep ‘bwlimit’ | wc -l) && test $rsync_process_num -lt 1 && /usr/bin/nohup /usr/bin/rsync –links –delete –recursive –itemize-changes –progress –exclude-from=/home/backup/script/rsync/conf/exclude.server-1.conf –bwlimit=110 user@server-1:/home/user/* /home/backup/server-1/home/user/ >> /home/backup/script/rsync/logs/rsync_web.server-1.log 2>&1 &

对比“功能列表”,可以看明白这一串命令都在干嘛。

【SVN】

具体的代码,我提交到了 googlecode,欢迎指正:http://leakon.googlecode.com/svn/trunk/server/script/rsync/

 

换个模板 重新开张

0

农历新年马上就要过完了,在这放假的几天里,为将来的一年做了各种计划。

计划太多,时间太少。

搞的我无从下手,不知道从哪一步开始。走哪条路,都发现这条路好远好远,似乎永远也走不到终点。

以前的几年也是这样浑浑噩噩虚度过来,其实,只要每天坚持走,用不了多久,回头看看,就会发现原来已经走了很远。

说到时间太少这个问题,我觉得不如说是给自己找借口。

不能回家看爸妈,不能陪爸妈说话,不能给爸妈做饭,不能带爸妈出去逛街。

所有一切的接口都是忙,没时间。

其实,只要你想去做,就一定有时间。

就好像,混的很落魄的小学同学约你吃饭,你会以工作忙要加班为接口推掉。

要是你的 Boss 或有个 VC 约你吃饭,你可能会为此放弃春节回家的机会。

另一方面,之所以忙,是因为你不会管理时间,不会高效办事。

反正吧,在我看来,时间是自己管理的,你想做什么,就一定有时间。

计划已经列好,该做什么,想做什么,都很清楚。

接下来这一年,管理好自己的时间,不要管终点有多远,利用好每一秒,一步一步往前走。

今天,把博客又恢复了出来,我不想给博客备案了,实在搞不定。

重新开张!

坏脾气的小肥

0

有段时间我很迷FourSquare,它被墙之后,渐渐又冷了。再后来玩开开,因为陪我一起玩的人不多,渐渐又冷了。最近两年有几位业内人士(包括我眼中的业界精英)不解问我:签到有个屁的意思啊?解释许久,他们仍难以索解。从数据上来看,纯粹的签到在国内确实是个窄众应用,但并不影响它在业内的名声。

几个月前,一件小事令我印象深刻。有位同行来咨询我,问我对一款主打“图文并茂”的美食分享产品的看法。我看了看说,用户拍摄相片质量这么差,一看就没胃口吖,此产品前景堪忧。这位同行立刻反驳说,不对,我这个吃货一看图片就食指大动,反而是大众点评那种纯文本的用户评价索然无味。

由于他是以用户身份,而非业内人士的身份提出意见,我当时就羞愧了。老纸又主观了。同样一张美食相片,我看了大倒胃口,他看了口水横流,个体差异极其鲜明。既然鸡同鸭讲,我又有什么资格张口即喷呢?

另一个小小例子关于“讲笑话”这款应用,主打“语音笑话UGC”。我一开始极不看好,觉得需求弱,产品个性也不够强,尤其无法直观地辨识内容质量,大大降低了信息甄别获取的效率,恐不长久。结果又过了两三个月一看,嘿,它不仅活着,还涌现出来一大批讲笑话专业户,平均每人讲十几条笑话,质量也不低。虽然远远谈不上大红大紫,至少人家顽强地生长着,有了一定数量的优质内容沉淀。

这时我再去试图分析它的用户心态,很多人并没有原创笑话的本事,但配音效果佳,绘声绘色地讲出来,相当于二次创作,颇有成就感。这批在我预料之外的骨干用户,支撑起了“讲笑话”的血脉。

类似的情景还有很多很多。以前我经常说,老纸看好的项目未必成功,不看好的则一定失败。现在已经不敢再开这种黄腔。只能说,我不看好的项目很难成长为日访问百万级的大产品,不过能捕捉到目标受众的话,生存发展可能也不是问题。所以别人来咨询新产品,我会指出一些显而易见的硬伤,但不再轻言成败,因为他面向的用户群,很可能是我完全陌生,毫无了解的。

互联网的市场很大很大,已有十几亿的人口,其中显而易见的,共性强烈的的用户需求基本已被填满。这时再去追求百万访问级的大产品,难,真难,劝君莫作痴汉。还有什么共性强烈的需求是你能看见,别人看不见,你能满足,别人搞不定的呢?

在互联网蓬勃发展了15年之后,新产品主打的必然是个性,包括产品的个性,需求的个性,用户群的个性。在不断细分的领域内找到并谄媚你的用户。而四亿人口的国内市场,能容纳千百种奇奇怪怪的个性,异想天开的心态,将人类的多样性发挥得淋漓尽致。没有一个human敢说,自己一下子就能看懂市场上1/10的用户需求,恰恰是这参差多态,给予了新产品生存发展的机会。

近来,我越来越认同欧美投资领域流行的一个观点,那些老奸巨猾的投资商跟创业者说:“想清楚了就去做,别问东问西。”试想,当年克罗利如果“虚心听取意见”来判断是否创立FourSquare,哪里还有如今的签到市场。即便在签到发展近3年之后,用户群也不足大盘的10%,这意味着你现在去跟10个人谈地理位置签到,9个人会无情地笑话你,奚落你,打击你。然而FourSquare注册用户今年6月业已突破了1000万大关。

这个案例,也就是“少问,多做”这句创业箴言的本意。在数亿用户的大市场里面,即便是非常窄的应用也有百万级的用户基础。创业者作前期调研的时候,除非确保访谈的一定是目标用户,否则你鸡同鸭讲,所得到的回答便全是误导。即便访谈目标用户吧,如果没有真实的应用情景来启发,全凭脑补,他的回答也很难靠谱。不如快速拿出原型推向市场,让数据告诉你答案。

因此,主观与敏捷已经成为了当下新产品发布的不二法门。不过这条金科玉律完全不适合大中型公司,很容易被滥用,上一大堆烂到无法言说的臭作——反正他照领工资。只有自负其责,个人荣辱完全与项目绑定的创业小队,才有资格讲“主观”,讲“敏捷”。

至于一开始从窄众做起的个性化应用,是否有机会慢慢生长成大树,这很难讲。我们不能将“做大”作为赤裸裸的产品追求——就像同样是个性化应用起家,既有Twitter参天大树,也有消沉的Delicious昔日明星。未必两家产品创始人谁比谁更牛逼,只是Twitter恰恰具备了更强的感染力和流行性罢了。但创始人如果不能追随自己的产品灵感,非要计较天花板的高低,很可能一事无成,蹉跎终老。

说白了,这就是命。你的生活方式与知识结构决定你的灵感,灵感衍生出来的主题与个性又决定了产品的市场前景。创业最顺的路径不是嗅探市场流行风向,而是听从自己的心。当成百上千个项目组都具备强悍的研发能力,足以左右成败的,既不是你的点子多,技术强,资源丰厚;也不是你跑得快,肯加班,笨鸟先飞;比别人更了解某一个“窄众市场需求”(大路货也轮不到你来发现),这才是最关键的竞争因素。

“对窄需求的把握,产品灵感,研发能力”,三者所产生的化学反应决定了新产品的走势。行业里很多人只重视后两条,但我觉得,第一条才是新产品新项目的基石。这更多取决于“你是个什么样的人”——唯有从你的兴趣爱好、人生经历、生活习惯中,才能真正把握好需求。所谓仁者见仁,智者见智,淫者见淫。

叹口气,这就是命。

来源:http://firecacada.blog.163.com/blog/static/7074376201192492255308/

Tunnelier Client connection closed before completion of protocol

0

I eventually received confirmation from the SSH server owner that indeed port forwarding was disabled in their sshd_config file (AllowTcpForwarding: “no”).
At my request, they reset AllowTcpForwarding to “yes”. That solved the connectivity problem. Now I can connect Firefox to Internet using Tunnelier’s SOCKS proxy and my host’s SSH server. This means secure and anonymous browsing.

还有一种说法,是大网关的临时性 block 指令强行切断了连接,过一会儿就恢复。

PHP Multipart form data input

0

PHP 不能得到 multipart/form-data 类型的 body 原始数据!!!

用 file_get_contents(‘php://input’); 只能得到 Content-Type 不为 multipart/form-data 类型的。

标记一下~

POST method uploads errors

0

$_FILES["file"]["error"]是错误代码,0表示没有错误,下面几种对应不同的错误
1 : 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值.
2 : 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
3 : 文件只有部分被上传
4 : 没有文件被上传

Error Messages Explained

UPLOAD_ERR_OK
Value: 0; There is no error, the file uploaded with success.

UPLOAD_ERR_INI_SIZE
Value: 1; The uploaded file exceeds the upload_max_filesize directive in php.ini.

UPLOAD_ERR_FORM_SIZE
Value: 2; The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.

UPLOAD_ERR_PARTIAL
Value: 3; The uploaded file was only partially uploaded.

UPLOAD_ERR_NO_FILE
Value: 4; No file was uploaded.

UPLOAD_ERR_NO_TMP_DIR
Value: 6; Missing a temporary folder. Introduced in PHP 4.3.10 and PHP 5.0.3.

UPLOAD_ERR_CANT_WRITE
Value: 7; Failed to write file to disk. Introduced in PHP 5.1.0.

UPLOAD_ERR_EXTENSION
Value: 8; A PHP extension stopped the file upload. PHP does not provide a way to ascertain which extension caused the file upload to stop; examining the list of loaded extensions with phpinfo() may help. Introduced in PHP 5.2.0.

Use Wireshark to capture loopback traffic without a loopback adapter

0

If you’ve ever used Wireshark for debugging applications you may have noticed that it only seems to pick up traffic that is actually transmitted over the wire and ignores all traffic sent to your local ip address or localhost. If you want to watch this traffic without having to install a special loopback adapter you can use the following trick.

How to force local traffic to your default gateway
1) Open a command prompt (Run as Administrator for Vista/7)
2) Type ipconfig/all (note your local ip address(es) and default gateway)
3) Type “route add <your ip address> mask 255.255.255.255 <default gateway IP address> metric 1″

This instructs windows to send any requests for your local ip address to your default gateway, which will in turn forward the request back to your machine. Be aware that this route will disappear once you restart your machine unless you include the -p switch after the route command. You may also notice an echo effect if you’re using Wireshark because you see each request and response twice. You can remove this problem by applying the following filter at the top.

ip.src==<default gateway> or ip.dst==<default gateway>

Consider the default gateway as a client trying to reach your machine and all traffic sent to the default gateway as your machine’s response.

To remove the route, type “route delete <the ip address you entered>”.

If you have an application running locally that uses localhost, you can map localhost to the IP address you added a route for. Just don’t forget you mapped localhost to a different IP than 127.0.0.1!

How to map localhost
1) Open notepad (Run as Administrator in Vista/7)
2) Navigate to C:\Windows\System32\drivers\etc\ and open the hosts file (there’s no extension).
3) Add this entry “<the IP address you added a route for> localhost”. Note that the space between the ip address and localhost is a tab.

Now, when your machine tries to send something to localhost, it will resolve to the IP address you added a route for and send its traffic to your default gateway.

(Important!) Remember to unblock the port used for incoming traffic on your machine. Also, if you find that an application you’re using doesn’t seem to send out traffic the way you expect, try flushing the dns cache with ipconfig/flushdns.

CentOS Samba

0

# service smb start

# setenforce 0

PHP 未知类型变量 empty isset 陷阱

3

用 empty 检查位置类型的变量时,容易掉进难以察觉的陷阱,请看下面简单的代码,预测一下 3 个 var_dump 的输出:

$mixed_1    = array();
$mixed_2    = 'Nihao';

$bool_1        = empty($mixed_1['1_type']);
$bool_2        = empty($mixed_2['2_type']);

var_dump($bool_1);
var_dump($bool_2);

var_dump($mixed_2['2_type']);

为了不影响你的判断,我多空几行,然后对比结果,是否跟你判断的一致。

公布结果:

bool(true)
bool(false)
string(1) "h"

后面 2 个结果,是不是有点意外?

导致问题的原因,就是 PHP 会自动把字符串按照数组来处理,并且,当 $mixed 不是严格意义的数组时,对元素的引用 key 会把 key 转换为数字,2_type 转换为数字之后,就是数字 “2″,对应的元素值就是 “h”。

对应的,isset 也会认为 $mixed_2['2_type'] 是存在的。

结论:

在对未知类型的变量做 isset 或 empty 查询时,应同时附加 is_array 等类型检查,才会更安全。

Go to Top