今天手机被孩子拿着开 Garageband 打鼓,对着屏幕敲敲打打,忽然怎么也敲不响了,孩子觉得奇怪问为什么敲不响了。检查手机屏幕完好无损,只是失灵了,表现为屏幕触摸失灵。

屏幕失灵具体表现

  1. 无论怎么按 Home 键始终无反应,来电屏幕会亮,铃声振动也正常,能够触摸屏幕接通电话,仅仅是能接电话,其它操作统统失灵;
  2. 电源键有效,可以通过按电源键正常点亮或熄灭屏幕,但触摸屏幕仍处于失灵状态;
  3. 电源键+Home 并不能重启手机;
  4. 登录 iCloud 可以定位到手机,同时也可通过查找我的 iPhone 功能让手机响铃和振动,屏幕弹出的对话框时,能且只能点掉“好”这个按钮。

搜索 iPhone 7 Plus 屏幕失灵 这组关键字,发现有人遇到同样的情况,看来应该不是个例。

如何解决

解决办法其实很简单,以往 iPhone 是通过同时按住电源键+Home键强行重启的,只不过到了 iPhone 7/iPhone 7 Plus 这一代做了调整,不再支持电源键+Home键强行重启了,而是更换为音量-+电源键了,所以解决办法很简单,只需要同时按住音量-+电源键便会自动重启,即下图中的调低音量睡眠/唤醒按钮,重启后问题解决。

同时按住音量-+电源键重启,好熟悉的组合呀,这不是 Android 机的惯例么,不禁要让人多想了,怎么回事?细细一想也不能怪库克:作为首要技术更新,iPhone 7 和 iPhone 7 Plus 这一代的 Home 键不是实体键,是()不下去的(Taptic Engine 成功欺骗了每个人),想到一个成语:殊途同归!

上次介绍的方法可以有效阻止通过 wp-comment-post.php 提交的常规垃圾评论,却防不了通过 trackback 发送的垃圾评论。

WordPress 的评论类型comment_type共有三种:

  1. 表示是通过 wp-comment-post.php 提交的常规评论;
  2. trackback 通过 wp-trackback.php 提交,wp-trackback.php 只被 trackback 服务调用,查看 nginx 日志会发现 trackback 来的垃圾评论是直接在目标页面地址后面加上“/trackback” POST 过来的;
  3. pingback 通过 xmlrpc.php 提交,xmlrpc.php 除了被 pingback 调用之外,通过 WordPress APP 访问博客时也需要调用它。

普通方法

这样就好办了,暴力一点的做法可以通过 nginx 配置文件直接禁止对 wp-trackback.php 文件的访问,但 xmlrpc.php 不能随便禁止,因为有其它服务要用到它,下面有个更好的办法可以避免这个问题。

更好的办法

更好的做法是在评论被写入 comment 表前判断评论类型,放过常规评论(阻止常规垃圾评论请见本文开头处的链接,除非人工提交或专门针对规则开发针对性的程序,理论上不会有漏网之鱼),单独对 trackback 和 pingback 类型做处理,得到下面的代码,放入主题的 function.php 文件即可:

if ( ! is_user_logged_in()) {
function trackback_check($commentdata) {
extract($commentdata);
if ($comment_type == 'trackback') { //trackback only ( || $comment_type == 'pingback')
wp_die('Trackbacks are disabled!');
}
return $commentdata;
}
add_filter('preprocess_comment', 'trackback_check', 1);
}

上面代码只阻止未登陆用户的 trackback,pingback 以及博客内部的 trackback 则可正常工作,如要同时阻止 pingback,只需把|| $comment_type == 'pingback'加到$comment_type == 'trackback'后面,这样一来即不影响类似 WordPress APP 这种需要调用 xmlrpc.php 来正常工作的服务,又能屏蔽外部的 pingback 了。

改动一下上述代码可将 trackback 垃圾评论的详细内容推送到邮箱,基本上 trackback 来的全是垃圾评论,几乎不存在误杀。

trackback 垃圾评论详情

最近对博客评论功能做了一些调整,防垃圾评论便是其一。即便作为一个无名小站每天也会收到几条垃圾评论,这之前一直用 Akismet 插件来防垃圾评论,Akismet 好是好,只是太臃肿,另外,阻止下来的垃圾评论仍需要手动清理,久而久之快要被动地锻炼成定期查看垃圾评论的强迫症了,便想着如何换掉 Akismet。

搜集了一些关于 WordPress 垃圾邮件工作机制介绍的资料,一般认为垃圾评论是通过机器发送了,机器会向id="comment"name="comment"的文本框填充评论内容,再提交给 wp-comments-post.php 文件。

于是,想到可不可以做一个取巧的方法:

  1. 评论表单默认的comment文本框专门留给机器用,并通过display:none将之隐藏;
  2. 增加一个额外的文本框(如blog_audience)留给真正的访客;
  3. 评论提交的时候做判断:干掉comment不为空的,comment为空则把给真正访客准备的文本框取为comment_content并完成后续处理。

改造评论表单

这个主题评论框用的是<?php comment_form(); ?>(一般是在主题文件夹的 comments.php 文件里),加额外字段需要对comment_form()做处理。

添加额外文本框

总之,把要加的额外的文本框

<textarea id="blog_audience" name="blog_audience" class=" comment-textarea"></textarea>

加入之后得到如下代码:

<?php comment_form( array(
'fields' => array(
'author' => '<p class="commentform"><input type="text" name="author" id="author" class="input" placeholder="Name" size="30" value="' . esc_attr( $commenter['comment_author'] ) . '"/></p>',
'email' => '<p class="commentform"><input type="text" name="email" id="email" class="input" placeholder="E-mail" size="30" value="' . esc_attr( $commenter['comment_author_email'] ) . '"/></p>',
'url' => '<p class="commentform"><input type="text" name="url" id="url" class="input" placeholder="url" size="30" value="'.$comment_author_url.'"/></p>'
),
'comment_field' => '<p><textarea id="comment" name="comment" style=”display:none”></textarea></p>
<p><textarea id="blog_audience" name="blog_audience" class="comment-textarea" cols="45" rows="8"></textarea></p>',
'comment_notes_before' => '',
'comment_notes_after' => '',
'class_submit' => 'submit'
));
?>

替换表单 action

下一步需要对 wp-comments-post.php 做修改,考虑到 WordPress 版本更新覆盖旧文件问题,最好不要直接改动 wp-comments-post.php 文件,建议在博客根目录(wp-comments-post.php 所在的文件夹)新建一个单独的文件做跳板,如:stop-spam.php,comment_form()默认的action是 wp-comments-post.php,现在要把action改为 stop-spam.php,只需将'action' => '/stop-spam.php',放到上面代码'class_submit' => 'submit'的前一行即可。

跳板文件

接下来打开 stop-spam.php,把下面代码放入并保存:

<?php
$comment = trim($_POST['comment']);
// Proceed with regular comments.
if ( empty( $comment ) ) {
$_POST['comment'] = trim($_POST['blog_audience']);
require( dirname(__FILE__) . '/wp-comments-post.php' );
}
if ( ! empty( $comment ) ) {
require( dirname(__FILE__) . '/wp-load.php' );
nocache_headers();
wp_die('You are not a human!');
}

大功告成,一旦 stop-spam.php 收到提交上来的表单,即会检查comment文本框是否为空,有内容即认为是机器填写的(comment文本框做了隐藏后正常人是看不到的),直接终止并给一个错误提示。

如果为空,则认为是正常访客提交的(正常访客只会在他们看到的blog_audience文本框内填写评论内容,而机器只会找comment),进而将blog_audience文本框中的内容取作评论内容,接下来再将数据传递给 wp-comments-post.php 进行后续处理,换句话说就是中间做一次劫持替换。

禁止直接访问 wp-comments-post.php

如果还是不放心,那就直接禁掉 wp-comments-post.php 文件的正常访问,这个博客搭建在 nginx 上,把下面这段代码加入到 nginx 的主机配置文件重启 nginx 即可实现禁止直接访问 wp-comments-post.php 文件(不影响 stop-spam.php 文件 require 它)。

location ~ /(\.wp-comments-post\.php) {
return 404;
}

用了两周效果很不错,没有一条垃圾评论!

以上方法只对通过 wp-comment-post.php 提交的常规垃圾评论有效,但往往很多垃圾评论是通过 trackback 形式发生的,如有需要请参照如何屏蔽 trackback/pingback 垃圾评论

上个月的这个时候在郑州经历的一场雪

雪下的很大,一大早街道上满是积雪

雪下了一整天:

积雪的梧桐树:

公交车开的非常非常慢

下了雪,落了叶,这辆车真幸福:
积雪落叶

雪给人们带来了惊喜

积雪的法国梧桐

两三个月前开始手机时常无缘无故自动关机,不管剩余多少电量一旦自动关机必须充电才能开机,低于 50% 电量随时可能关机。最严重的一次发生在青岛,晚间应约到饭店吃饭,当晚最低气温1度,走在大街上 70% 的剩余电量时活生生被关机…后来苹果公司公布手机自动关机原因、解决方案以及受影响的产品批次,很不幸而又很幸运的是两部手机均赫然在列。

既然符合免费更换政策那就准备换吧,致电 Apple 客服咨询,得知符合免费更换电池政策可前往 Apple 授权服务提供商或 Apple store 免费更换,但运营商定制机只能走授权维修渠道到 Apple 授权服务提供商处更换电池。
很不幸本人手机正是电信合约机,京东自营渠道所购,按政策规定只能走授权维修渠道,于是打通就近的一家授权维修商,答复是若符合政策可免费更换,但有条件限制,被明确告知必须提供购机发票和购机合约合同,否则拒绝服务。

四美俱,二难并,都这么长时间了,发票和合同哪里凑得齐,看来授权维修商这条路走不通了。网上看了一些维修经历,有人的合约机在 Apple store 成功免费更换电池。觉得有必要试一试 Apple store,Apple store 需要预约天才吧,可能换电池的人实在太多连续两周没能约到天才吧,一直到本周二终于预约到七宝万科城 Apple store 的天才吧,时间是周三晚间。

上班地点离这个店最近,周二下班后带上身份证提前到店,对接到服务人员,只验了身份证确认预约信息,之后做了设备检测和问询,告知可以免费更换,但现在更换电池手机需要留店24小时,也就是要第二天晚才能前来取手机,不得不说换电池的人实在太多,等待区坐着的人几乎全是前来更换电池的,确认可以等待24小时,来之前手机已做备份,当面抹掉数据,在工作授权函上签了字,工作人员收走手机,维修暂时告一段落。

周三晚间按约定时间段到店顺利取到手机,换上新电池,手机电力明显强了很多。Apple store 售后服务还是非常好的,没有废话,只是天才吧太难预约,Apple 工作人员告知下午两点左右比较容易约到好,好像那个时段会放号。