Kaito's Blog

致力成为一枚silver bullet.

0%

该来的总会来的,MacBook、iPad mini在手中已久,唯一差的就是iPhone了,最近被哥们刺激到后,一激动就入手了,这比预计来的要早一些。

Iphone 6s

iPhone6s上手已有小半个月,各项体验都还不错。由于从长久的安卓阵营转到iOS麾下,有些地方还有些不太适应,当然,大部分的体验还是很满意的,这篇文章就说一说其优点顺便吐槽下吧。

先交代下背景,之前用的是一台小米4,3G内存版,MIUI7开发版操作系统。

较常用的几点比较如下:

优点

流畅度

  • 6s不负众望,各应用间快速切换,应用内浏览极度流畅,不用强制关闭进程;
  • 米4稍逊,打开应用过多后,就需要打开任务管理器杀死后台进程,在一些视频App中会出现卡顿;

TouchID

  • 第一次使用指纹解锁功能,用户体验非常爽,而且比较了iPhone6,解锁速度上了新台阶,每次想看下时间却都不小心解锁了,想想这速度的提升;
  • 米4木有指纹解锁,所以导致我连数字、图案解锁都懒得设置,因为感觉使用手机的成本太高了;

快速返回

  • 6s在使用App时,需要返回上一级不必一定使用左上角的返回按键,手指在屏幕左侧向右滑动即可;
  • 米4因为有返回按键的存在,使用也还算可以,不过6s体验更佳;

3DTouch

  • 在电话、短信、浏览器、拍照等方法增加了快速使用的便利性,尤其是在浏览网页时,长按链接可不必打开就可预览网页内容;
  • 由于又多了一种维度的使用反馈,以后应该会在游戏App中产生更多的可能性;

LivePhoto

  • 6s在拍照时,自动拍摄前后各1.5秒的短视频,用来记录拍照时的情景,配合3DTouch使用真是富有情怀;
  • 拍摄LivePhoto照片还可以当做手机解锁壁纸,长按屏幕时可以出现动态壁纸的效果;
阅读全文 »

由于之前一直在做爬虫采集相关的开发,这个过程那肯定少不了跟「代理 IP」打交道,这篇文章就来记录一下,如何实现一个爬虫代理服务,本篇文章主要以讲解思路为主。

起因

做过爬虫的人应该都知道,抓的网站和数据多了,如果爬虫抓取速度过快,免不了触发网站的防爬机制。而这些网站应对爬虫的办法,几乎用的同一招就是封 IP 。

那么我们还想稳定、持续地抓取这些网站的数据,如何解决呢?一般解决方案有2个:

  • 使用同一个服务器 IP 抓取网站数据,但是放慢速度
  • 使用多个代理 IP 抓取数据

第一种方案牺牲的是时间和速度,但是一般情况下我们的时间是很宝贵的,理想情况下是,用最短的时间获取最多的数据。所以第二种方案是推荐的,那么从哪里可以找到这么多代理 IP 呢?

寻找代理

最直接地,使用搜索引擎去检索。

例如使用 Google、Bing、百度,输入关键字:免费代理 IP,前几页几乎都是提供代理 IP 的网站,逐个打开后观察可以发现,几乎都是一个列表页,这个列表页展示的代理 IP 少则几十个、多则几百个。

但是仔细观察你就会发现,每个网站提供的免费 IP 是有限的,而且拿来用之后你就会发现,有的也已经失效了。毕竟,人家更倾向于你购买他们的付费代理 IP。

身为狡猾的程序猿,当然不能因为这点困难就退缩了。仔细想一下,既然搜索引擎能搜到这么多提供代理的网站,每个网站提供几十或几百个代理 IP,假如有 10 家代理网站,那加在一起也有几百到几千个了。

那么很简单,你要做的事情就是,把这些提供代理 IP 的网站收集起来,写一个采集程序把这些免费代理 IP 抓过来就好了,想想是不是很简单?

测试代理

好了,通过刚才的思路,你可以编写一个采集代理 IP 的程序,然后就可以拿到成百上千的代理 IP 了。当然,收集的代理网站越多,采集到的代理 IP 也就越多,所以我们尽量多收集一些代理网站,越多越好。

等等,这么多代理 IP ,难道别人真的就免费送给你了吗?

当然不是,前面也提到过,这些代理中,有很大一部分已经是失效的了。那怎么办?如何知道哪些代理是有效,哪些是不可用的呢?

很简单,写一个 HTTP 程序,挂上这些代理,访问某一个稳定的网站,然后看是否能正常访问,如果可以正常访问,那么代理 IP 就是可用的,访问失败则说明代理 IP 已失效。

最简单地,我们可以使用 curl 命令就可以测试一个代理是否真的可用:

1
2
# 使用代理 48.139.133.93:3128 访问 网易首页
curl -x "48.139.133.93:3128" "http://www.163.com"

当然,这种方式只是为了演示方便,实际最好的方式是:编写一个多线程的代理测试程序,然后分别使用这些代理去访问某个网站,根据访问的结果,最终就可以输出一批可用的代理 IP。

阅读全文 »

可能是上天对我的眷顾吧,在一个偶然的机会有幸得到一台Mac,从此Mac探索之路一发不可收拾。

记得刚刚使用Mac时,完全小白一枚,但作为程序员应该发挥本职业必备的职业技能,从学习OSX系统、操作技巧到使用各种效率工具,这每一步都源于Blog、知乎、Google的学习。

一个偶然的机会,在学习Mac技巧时,看到一篇Blog,再然后关注了作者的微信公众号,然后到每天关注其推送的内容,然后就在今天,入手了作者的一本书——《MacTalk人生元编程》,在这里也向大家推荐一下。

MacTalk人生元编程

这本书汇集了:Mac技巧、编程、科技人文、人物、工具、职场等内容,不管你是正在使用的Mac用户,或是正在coding之路的程序猿君,都可读来看看。个人由于更加喜欢科技与人文一词,便以此为题名。

此刻我已成为Mac大军中的一员,Promini都已具备,唯一差的武器就是爱疯,预计今年会入手一台,便也无憾了。

尤为喜欢书序中的那句话:

泰山崩于前,我依然沐浴更衣焚香沏茶,诚心正意,手起键落:Hello World!

最近使用python的ORM框架peewee开发项目,遇到一个问题就是:在插入数据后,获取不到数据库生成的自增主键值,然后分析源码后得到解决方案,以此记录。

首先,定义model

class User(Model):

    id = IntegerField(primary_key=True)    
    username = CharField()

    class Meta:
        database = db
        db_table = "user"

其中主键id是整型自增类型。

根据peewee官方文档介绍,插入数据时使用如下:

user = User(username='admin')
user.save()

或

user = User.create(username='admin')

或

id = User.insert(username='admin).execute()

但是获取user.idid结果却为None

于是乎开始看peewee的源码,看到底发生了什么?

首先看Moelcreate方法:

@classmethod
def create(cls, **query):
    inst = cls(**query)
    inst.save(force_insert=True)    # 还是调用本类的save方法
    inst._prepare_instance()
    return inst

发现create方法还是调用本类中得save方法,那么好办了,来看save方法做了些什么?

阅读全文 »

每个开发人员必备的技能,就是如何使用搜索引擎来获取自己最需要的知识,这篇文章介绍使用搜索引擎的一些技巧,注:主要针对Google搜索,其他搜索引擎暂未尝试,部分可用,个人认为百度是用来卖萌的。

精准搜索

最简单地搜索,即输入搜索词,确认,等待返回结果,例如输入“北京什么地方好玩”,结果如下:
常规搜索

但是这个结果是搜索引擎智能帮你分词后的结果,其中一些是你认为不想看到的,那么精准搜索就派上用场了,很简单,在搜索词两边加上英文格式双引号即可,再看结果,是不是明朗很多:
精准搜索

排除搜索

好了,学习了刚才的技巧之后,突然觉得有些范围的内容完全不是自己想要的,例如不想看到关于与百度相关的内容,那么就可以这样用:关键词 -排除关键字,注意,横杠+排除关键字前必须有空格,否则无效。
排除搜索

阅读全文 »

解析页面肯定是写爬虫遇到的最常见的工作,但不要小看这个这个过程,有时它也会令你抓狂。这次写一下关于curl工具的使用,主要介绍一下平时很常用的几项。

curl是利用URL语法在命令行方式下工作的开源文件传输工具,使用这个工具,就能在命令行发起请求,获得响应,而且其命令简单且强大,非常适合用作写爬虫时,解析页面前的模拟工作。

基础

# 发起HTTP请求,并把返回的网页内容显示在屏幕
curl "http://www.example.com"

# 发起HTTP请求,并把返回的网页内容输出到文件
curl "http://www.example.com" > test.html

# 或者用命令-o参数也可达到同样的效果
curl -o test.html "http://www.example.com"

注意:URL地址带上双引号是比较好的习惯,防止URL中带有特殊符号,导致不能解析报错情况。

伪装头信息

有时curl直接访问页面,会得到与浏览器打开不同的结果,所以此时就要伪装头信息,来模拟浏览器的行为,这样返回的数据就跟浏览器看到的一样了。

# 使用-A参数定义User-Agent,模拟浏览器行为
curl -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36" "http://www.example.com"

# 使用-e参数定义Referer,表示从哪个页面跳过来的,解决防盗链问题
curl -e "http://www.example.com" "http://detail.example.com"

# 或者使用-H参数自定义头信息,也可定义User-Agent、Referer、Content-Type等信息
curl -H "my-header:xxxxx" "http://www.example.com"

代理访问

或者你用程序频繁访问某个网站,结果人家把你IP封禁了,这时就可以用代理来进行访问。

# 使用-x参数使用代理访问
curl -x "123.45.67.89:8102" "http://www.example.com"
阅读全文 »

作为屌丝IT程序员,日常生活中看文档是必须的,自然看英文文档也是肯定的。但遇到不认识的单词是灰常头疼的。基于此原因,所以有了这个基于命令行快速翻译的工具。

在遇到上面说的这种情况时,解决方案:

  • 下载某软件客户端,开启划词释义功能,鼠标放倒单词上,显示词义;
  • 使用在线翻译软件,复制,粘贴,OK,明了。

我是偏向第二种方式的,因为在大多数有程序洁癖的码农来讲,装一款软件而且只用到其5%的功能不到,自己总会觉得很亏心,我也是如此,所以在线翻译便成了我的最佳选择,简单,快速,即开即用。

程序员都是喜新厌旧的,什么东西用久了,都会觉得腻,甚至会感觉效率越来越低下。在线翻译用的久了,慢慢也感觉有一些问题出现,例如:首先打开某在线翻译网站,当然,你可以保存书签,但开发过程中,浏览器开N多个标签调试是常有的事情,一不留神就会把这个翻译标签页关掉,或者说开的太多了,机器变得越来越卡,cmd + w,连续按下数十次,整个世界都清静了。

综合上述原因,所以开发了一个基于命令行的快速翻译工具,主要优点如下:

  • 平时开发都是在linux上使用vim,而且linux终端的标签开N多个也很容易切换,不会卡顿;
  • 省去了浏览器界面渲染,减少内存占用,也平复了上面所述太多网页标签抓狂的心情;
  • 键盘党都大爱终端,这样来用,可能会显的逼格很高;
阅读全文 »

最近公司办公室兴起了“键盘风”,同事一个接一个买了机械键盘,不过听着噼里啪啦的键盘声,也与程序员这个职业相符吧。这次写一下作为屌丝程序员,拥有的那些装备。

电脑

你还在用蜗牛电脑开发么?内存8G是最低配,上不封顶。有能力必须上SSD,电脑秒开或者扣盖子就走,一个月不关机无压力。当然最好还是配台Mac,不是air,是pro,自从用上Mac的触摸板,鼠标基本可以抛弃了。开发爽到爆。做开发的越早买Mac越好。如果买不起,win本的话我推荐:Thinkpad T系列,自从用了键盘中间的小红点,其他牌子的笔记本基本就不考虑了。我自己有一台Macbook Pro 13,公司配的是Thinkpad T440P

Macbook pro

阅读全文 »

起因

最近一直没有更新博客了,主要忙什么?一言难尽,相信北漂的IT屌丝们,都会遇到这个问题,那就是找房子!
房子到期,加上种种原因,决定撤离待了一年之久的小窝,不过也没什么特别值得留恋的,北漂就这样,工作、找房子、租房子。。
找了半个多月的房子,房源信息包括豆瓣、58、搜房网等,看了不下十几家房子,感想只有一个字:找合适的真特么难!不过就在昨天,终于将这件头疼的事情尘埃落定!
对于IT屌丝,当然是充分利用网络资源,但是网上例如58,赶集充斥了太多的中介信息,恶心的要命。最后在锁定在豆瓣租房小组中寻找。
但豆瓣最坑爹的是竟然没有搜索相关功能,别人发帖后,你只能用肉眼一个个寻找自己所需的信息,不能忍了。
最后决定自己写一个爬虫工具,时时监控豆瓣租房小组,抓下所有的信息,然后自己搞个页面,搜索、排序,OK,够用了!

项目

用了3个晚上的时间,写出了这个爬虫,也比较简单,主要就是配置需要抓取的页面,分析所需信息,入库等等。

然后做个前台页面,加上搜索排序等功能,齐活!

效果如下:

爬虫前台页面效果图

阅读全文 »

最近做的东西比较纯粹、直接,比如写爬虫抓数据,写程序脚本等等。但是突然接需求和与需求人沟通的时候,发现存在各种问题,导致需求延期、沟通扯皮等等问题。其中也有自身原因,也有需求人的不足。现在分析下情况,记下来,且当教训来鞭策自己吧。

需求设计缺陷

从需求人手中拿到原型,接下来肯定是技术与需求人过一下,如果有问题,尽早提出并解决。当时犯的毛病就是,没有仔细分析原型,认为到了开发时遇到问题,再沟通解决也不晚,其实不然,秉着问题越早提出越好的原则,认真分析原型,发现问题,反馈需求人是很有必要的。否则到开发时,后果小则加功能项目延期,大则项目夭折都是非常痛苦的。分析如下:

1、原型代表着需求人直接想要得到的东西;
2、原型直接关系到技术实现方面可能会遇到的问题;
3、在前两者来看,一方面是需求,一方面是实现,如果沟通不好,很容易扯皮;
4、技术角度来看,可能开发人员更熟悉其细节,要权衡利弊,提前说明可能会遇到的问题;
阅读全文 »