创世神域

Nothing is impossible.

@Puteulanus4年前

02/1
23:15
学习心得

10.10解决WiFi不稳定问题

更新10.10之后,开始频繁出现盒盖休眠之后开盖搜不到WiFi、只搜到我的WiFi连上了却上不了网一类的情况,刚开始以为是个例没在意,后来才知道WiFi不稳定是很多人更新10.10之后都遇到了的。

再后来看到 这篇帖子 ,因为自己用不到AirDrop所以毫不犹豫的禁用了awdl0,然后就把这事忘了。

直到这两天又开始出现这问题,这才想起之前设置之后好像WiFi问题的确没出现过了。至于为啥现在又出现了,怎么想也只有一个可能——前几天更新10.10.2又给我打开了。。开terminal一看,果然awdl0又是active状态。

果断执行

sudo ifconfig awdl0 down

又给禁用回去了。

网上说10.10.2已经解决了WiFi的问题,我是完全没觉得,不知道是不是个例。如果和我症状一样的朋友可以试试这个方法。

要重新启用awdl0也很简单,执行

sudo ifconfig awdl0 up

就行了。

10.10解决WiFi不稳定问题

@Puteulanus4年前

11/28
19:46
学习心得

抓取多看每日免费书籍的相关信息

那天看到V2EX上推荐一本限免的Linux相关的书籍,跑去收了之后想到做这个。免费的书收太多会把好书淹没在里面,反而不会去看了,而且每天跑去收也麻烦。既然如此,那干脆做个程序每天抓取免费书籍的信息然后发自己邮件好了,喜欢的话就就去多看收,不喜欢的话就不管了。

<?php
// 载入PHPMailer类 
require_once('class.phpmailer.php'); 
require_once('class.smtp.php');
// 抓取多看免费图书信息
$content = file_get_contents('http://www.duokan.com/');
preg_match('/<a .*href\s*="(.+?)".+alt="限时免费".+<\/a>/',$content,$result);
$content = file_get_contents('http://www.duokan.com'.$result[1]);
preg_match('/<div class="desc">(([\s]|.)+?)<\/table>/',$content,$result);
preg_match('/<h3>(.+)<\/h3>/',$result[1],$name);
$name = $name[1];
preg_match_all('/<tr>(([\s]|.)+?)<\/tr>/',$result[1],$result);
foreach($result[1] as $key){
$info .= preg_replace('/(<.+?>)|\s/','',$key).'<br/>';
}
preg_match('/<article.+id="book-content"(([\s]|.)+?)<\/article>/',$content,$result);
$content = preg_replace('/(<.+?>)/','',$result[0]);

// 调用PHPMailer类发送邮件
$mail = new PHPMailer(); //实例化 
$mail->IsSMTP(); // 启用SMTP 
$mail->Host = "smtp.exmail.qq.com"; //SMTP服务器 
$mail->Port = 25;  //邮件发送端口 
$mail->SMTPAuth   = true;  //启用SMTP认证 
 
$mail->CharSet  = "UTF-8"; //字符集 
$mail->Encoding = "base64"; //编码方式 
 
$mail->Username = "ex@mple.com";  //你的邮箱 
$mail->Password = "passwprd";  //你的密码 
$mail->Subject = "多看免费书:{$name}"; //邮件标题 
 
$mail->From = "ex@mple.com";  //发件人地址(也就是你的邮箱) 
$mail->FromName = "送书女仆";  //发件人姓名 
 
$address = "my@email.com";//收件人email 
$mail->AddAddress($address, "主人");//添加收件人(地址,昵称) 

$mail->IsHTML(true); //支持html格式内容 
$mail->Body = "亲爱的主人,今天的免费图书是酱紫的哦~<br/><br/>{$name}<br/>{$info}<br/>{$content}"; //邮件主体内容 
//发送 
if(!$mail->Send()) { 
  echo "Mailer Error: " . $mail->ErrorInfo; 
} else { 
  echo "Message sent!"; 
} 

设定成每天一次Cron就行。

PHP发邮件部分的代码直接用了 这里的 。调用了PHPMailer的类来使用SMTP发送邮件,关于PHPMailer详见 其github页

抓取多看每日免费书籍的相关信息

@Puteulanus4年前

11/25
03:46
学习心得

WordPress使用Redis的全站刷新

最近发现采集站访问速度慢的坑爹,排查了一下排除了本地性能瓶颈,最后确定是跟数据库服务器之间的延迟太大了。。。

对付这问题没啥好办法,只能上缓存,缓存期间访问页面直接返回不经过数据库。参照 免费资源部落 的教程给俩采集站加上了Redis缓存,效果拔群。不过对于教程中缓存刷新的问题,总觉得有点问题。

教程中是使用 */10 * * * * curl http://www.freehao123.com/?r=y 来进行首页的缓存刷新,但是首页刷新了,第二页不是应该还缓存着的?这样一旦有了新日志,从首页被挤到了第二页,而第二页的缓存又不刷新,岂不是消失了?

清除所有缓存的功能只在登陆后的后台可用,无法做到自动全部清理,这点对采集站来说无疑是不方便的。我读了下 优化版本的前端PHP脚本 的代码,把清理全部缓存的功能剥离了出来,单独做了个文件放在Wordpress根目录下。【不得不说作者注释详细得相当良心】

<?php
// init predis
include("predis.php");
$redis = new Predis\Client('');

$domain = $_SERVER['HTTP_HOST'];
$dkey = md5($domain);

if ($redis->exists($dkey)) {
$redis->del($dkey);
echo 'domain cache flushed';
} else {
echo 'no cache to flush';
}

?>

只要在crontab里设定定时用curl访问这个页面,就能做到定时清理整站缓存了。

WordPress使用Redis的全站刷新

@Puteulanus4年前

11/12
13:53
学习心得

TPRSS——看图没有国界

TPRSS,即Twitter Picture RSS,是一个能将指定用户的推文转化为RSS,并反代其中的图片的网站。

项目起源于一次聊天,我给群里的朋友发了一些Tumblr的RSS地址,顺便推荐了几个推特的发图机器人。和Tumblr可以直接用RSS阅读器看图相比,Twitter的就略不方便了。上网搜了一下,找到了twitrss.me,可以简单的把推文转化为RSS,使用Perl写成并开源。twitrss.me的一个问题是它不会输出图片,订阅之后也得点链接才能看到图,因为对Perl完全不熟,于是用PHP写了一个介于twitrss.me和用户之间的“中间层”,负责从twitrss.me获取信息,并将所有链接转化为真实图片地址,加上标签直接输出。这是TPRSS的雏形。

最先遇到的问题是有时订阅会失败,排查后发现原因是RSS阅读器的获取是有时间限制的。按最初的设计,阅读器在访问一个全图订阅时会依次抓取每条推文中网址的页面,然后通过正则表达式匹配得到真实图片的地址。也就是说,阅读器每次刷新,需要等待服务器依次下载10个网页并对其内容进行匹配。这样做非常耗时,导致阅读器在获取订阅内容时超时。为了解决这个问题,我增加了数据库部分,在受到访问时,会把用户推文中的地址与真实图片地址存入数据库中,再次访问时从数据库中调取记录,存在记录的直接读取,不存在的记录才会抓取网页获取。比起最初的设计,这样大幅度降低了重复访问时的响应时间。只有在新订阅用户或长时间没有对某用户的数据库进行更新时,才会出现耗时过长的问题。

然后遇到的是很无奈的问题——即使把推文中图片的真实地址加标签输出了,还是有看不到图的情况,因为推特全站连带图片资源站都是在墙外的。对于这个问题,最初直接给生成订阅的页面加了功能,将真实图片地址作为参数进行访问时,会从推特下载图片并返回给用户。这样,由绑定域名后的Openshift空间作为一层代理,输出RSS时输出带有真实图片地址参数的Openshift空间地址,大部分使用的人都能看到图片了。但实际上,Openshift在国内的访问效果并不理想,即使绑定域名之后,也会有访问速度慢或者无法访问的地方。为了进一步增强服务的稳定性,写了一个单独的图片反代作为TPRSS的子项目。反代托管在Coding上,使用演示页的方式部署。因为选用的是Coding的北京服务器,国内访问基本不会有问题。但因为Coding本身也是墙内服务器,和用户一样无法直接获取到推特的图片资源,所以在设计上使用了Openshift的空间作为跳转,即用户在访问一张图片时,先请求Coding上的图片反代,反代将参数传递给Openshift上的本体,由本体从推特获取图片资源后,传递给Coding的反代,再由反代返回给用户。这样的两层结构保证了用户看图的稳定性。同时,主站上的程序在输出RSS之前会检查反代的可用性,如果不可用即全部转为输出Openshift空间地址,这样即使在反代鼓掌时,用户的订阅也不会受到影响。不过双层结构也存在坏处,逐层请求带来的是巨大的延迟,即使在网络畅通的情况下,用户访问一张图片也需要等待1到2秒才能看见图片。对此的解决办法是,在Coding上利用演示页自带的1G存储空间建立了图片缓存。用户第一次访问的图片在从本体传回Coding时会被储存在本地,当再次有访问时,反代会从本地直接获取图片返回,实测中几乎没有延时。因为PHP貌似不好对文件夹大小进行统计,而演示空间存在每次部署文件重置的特性,在设计中放弃了使用数据库索引,转而使用文件名来标明大小。储存到本地的缓存图片会在文件末尾加上文件大小,在统计大小时,直接遍历目录用正则获取所有文件尾部的数字加在一起即为文件夹大小。缓存机制使用两个文件夹储存图片,在检测到pic-1超过250M时,会删除pic-2、将pic-1重命名为pic-2并新建空的pic-1,在读取缓存时,先尝试获取pic-1中的图片,如果失败再尝试获取pic-2中的图片,如果还是失败,则会经由Openshift从推特获取图片,缓存并返回。这样保证了不会因为清空缓存而造成大面积啊卡顿,所有缓存图片都有一定的生存周期。

之后计划尝试的优化方向是,利用ppython将抓取页面匹配图片真实地址的工作交给Python多线程完成,使即使在第一次访问时也能尽量减少延迟时间。

可惜,这时候出现了变故。由于twitrss.me使用了缓存,从那里获取到的信息不具有及时性,而在Openshift上新建Perl应用部署他的源代码又受阻,我只好寻找新的RSS生成程序作为它的替代品。在这个过程中,我找到了功能和TPRSS部分重合的Twitter to RSS proxy。

在阅读了他的代码并查阅资料之后,我发现原来使用OAuth协议可以直接从推特获取某人的时间线,而且官方API传回的信息中竟然是包括了图片真实地址的。这意味着之前设计的数据库功能完全丧失,因为无论从哪方面来讲,使用官方API获取信息都具有绝对的优势。于是我新建了TPRSS2项目,借鉴之前自己写的代码和Twitter to RSS proxy中使用的thmOAuth,从头开始写。现在TPRSS网站使用的即依靠OAuth协议获取时间线的TPRSS2。吸取上个版本的经验,TPRSS2在编写过程中更多的考虑了变量命名、代码可读性等问题,在细节方面尽量做到人性化,比如使用字符串截取函数保证了在遇到较长的中英混合退推文时RSS标题的易读性、清除了图片推末尾的本页链接等。

现在和TPRSS经过重新编写,用户体验高于上个版本。不仅适合使用RSS阅读器看图,也适合不方便挂代理、希望持续关注某人推特的情况。

项目一路走来,我也学到了很多。感谢对项目提建议的朋友,你们对我的帮助是巨大的。

最后用百度的招聘信息结尾吧。

一张网页,要经历怎样的过程,才能抵达用户面前?一位新人,要经历怎样的成长,才能站在技术之巅?

求学不易,且行且珍惜。

TPRSS——看图没有国界

@Puteulanus4年前

11/11
14:16
学习心得

在Openshift上使用ppython

最近在尝试提高TPRSS的性能,想试试用Python代替PHP来获取图片地址。搜索相关资料的时候找到了ppython这个项目,看着还不错。

我是用的是从 这里 下载的修改版,因为原始项目貌似需要Python3,而Openshift的Python版本是2.6.6。

在Openshift上尝试使用的时候,无法运行Python的服务端,提示我权限不足。

查了相关资料,原来Openshift限制了可以绑定的IP和端口,对源文件略作修改就可以使用了。
Read More →

在Openshift上使用ppython

@Puteulanus4年前

10/14
12:32
学习心得

Bluemix搭代理教程

Bluemix和Heroku一样,在应用重启后【Heroku是应用睡眠唤醒后】会回到上传代码之后的初始状态,不太适合用来建站。

签到助手可以按照SAE的处理办法,先上传源码,安装时获得配置文件内容,与install.lock放入各自相应的目录,然后再次上传。
Read More →

Bluemix搭代理教程

@Puteulanus4年前

09/26
14:59
学习心得

ACFun_sign红帽安装源

ACFun_sign是PHP吧的吧主——泷涯的多人ACFun签到程序,戳这里近距离感受大神。

这个安装源会自动拉取ACFun_sign的项目源码,在Openshift空间内完成初始化安装。

安装源:https://github.com/puteulanus/ac-sign-install

顺便写了个简易的管理地址,应该比phpMyAdmin管理用户简单一点。。

安装教程参见 《Openshift自动安装签到助手【已失效】》 ,简单说就是选择创建Cacti应用、更改安装源地址、完成创建。

创建完成之后访问 https://应用地址 会看到欢迎页面,请务必牢记页面上的管理地址,它不会再次出现。

Openshift在各地情况不同,https依然无法访问的请自备梯子。

安装源自带Cron设定,会在每天5点到6点间执行一次【参照泷涯的config.yaml设置】,请将外部Cron【或者云监控】设置到 应用地址/index.php ,以避免应用因为太久没有外部访问而停止运行。

首页的一句话来自 一言

管理地址使用方法:

参数type指定操作类型,可以是add【增加用户】或者del【删除用户】
type为add时可以用参数username和password指定用户名密码,程序会自动获取cookie加入用户列表,也可以用参数auth和sha1指定cookie的两个关键片段,直接加入用户。
参数type为del时需要带有参数id来指明需要删除的用户的id。
不加参数访问为查看用户列表,删除用户需要的用户id可以在这里获得。

一些例子:

增加一个用户名为admin,密码为default的用户:
https://管理地址?type=add&username=admin&password=default

增加一个Auth为1234,Sha1为123456的用户【Auth与Sha1对应cookie中的auth_key和auth_key_ac_sha1】:
https://管理地址?type=add&auth=1234&sha1=123456

删除ID为3的用户:
https://管理地址?type=del&id=3

 

刚添加完的用户“上次签到”日期是2014-08-28,这不是bug,照着泷涯的说明填的。。

管理地址可以修改数据库,请不要将你的管理地址随意告诉他人。

需要对数据库进行更高级操作的可以给应用添加phpMyAdmin,然后登陆进行管理。

ACFun_sign红帽安装源