南风


  • 首页

  • 分类

  • 归档

  • 标签

  • 搜索
close

Mac安装Scrapy(一)

发表于 2016-05-17   |   分类于 爬虫系列

Scrapy是一个非常好的抓取框架,它提供了一些开箱可用的基础组件,还能够根据需要进行自定义。

下面就Mac下安装Scrapy的步骤及遇到的错误进行总结:

安装Scrapy

打开终端执行命令:

sudo easy_install pip

pip 和 easy_install 都是 Python 的框架管理命令,pip 是对 easy_install的升级。

然后终端执行命令安装 Scrapy:

sudo pip install Scrapy

如果执行成功,那么 Scrapy 就安装成功了。

错误1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 Found existing installation: six 1.4.1
DEPRECATION: Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
Uninstalling six-1.4.1:
Exception:
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/basecommand.py", line 215, in main
status = self.run(options, args)
File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/commands/install.py", line 317, in run
prefix=options.prefix_path,
File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/req/req_set.py", line 736, in install
requirement.uninstall(auto_confirm=True)
File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/req/req_install.py", line 742, in uninstall
paths_to_remove.remove(auto_confirm)
File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/req/req_uninstall.py", line 115, in remove
renames(path, new_path)
File "/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg/pip/utils/__init__.py", line 267, in renames
shutil.move(old, new)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 302, in move
copy2(src, real_dst)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 131, in copy2
copystat(src, dst)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 103, in copystat
os.chflags(dst, st.st_flags)
OSError: [Errno 1] Operation not permitted: '/tmp/pip-ZqW0ai-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/six-1.4.1-py2.7.egg-info'

解决:

sudo pip install --ignore-installed six

错误2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
In file included from src/lxml/lxml.etree.c:320:
src/lxml/includes/etree_defs.h:14:10: fatal error: 'libxml/xmlversion.h' file not found
#include "libxml/xmlversion.h"
^
1 error generated.
Compile failed: command 'cc' failed with exit status 1
creating tmp
cc -I/usr/include/libxml2 -I/usr/include/libxml2 -c /tmp/xmlXPathInitmCebQ0.c -o tmp/xmlXPathInitmCebQ0.o
/tmp/xmlXPathInitmCebQ0.c:1:10: fatal error: 'libxml/xpath.h' file not found
#include "libxml/xpath.h"
^
1 error generated.
*********************************************************************************
Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?
Perhaps try: xcode-select --install
*********************************************************************************
error: command 'cc' failed with exit status 1

----------------------------------------
Command "/usr/bin/python -u -c "import setuptools, tokenize;__file__='/private/tmp/pip-build-yo_o0i/lxml/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-2FEcHQ-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /private/tmp/pip-build-yo_o0i/lxml/

解决:

xcode-select --install

三种类型的Block

发表于 2016-05-10   |   分类于 IT随笔

Block作为属性

把block作为对象的copy属性,定义:

1
2
3
4
5
6
7
8
9
10
11
@interface Animal : NSObject
@property (nonatomic,copy) void(^eat)(int);
@end


@implementation Person
- (void)hungry
{
_eat(3);
}
@end

调用:

1
2
3
4
5
Animal *a = [[Animal alloc] init];

[a setEat:^(int count) {
// TODO:
}];

Bloc作为函数参数

定义:

1
2
3
4

@interface Animal : NSObject
- (void)sleep:(void(^)())block;
@end

调用:

1
2
3
4
Animal *a = [[Animal alloc] init];
[a sleep:^{
// TODO:
}];

Block作为函数返回值

定义:

1
2
3
4
5
6
7
8
9
10
11
12
13

@interface Animal : NSObject
- (void (^)(int))run;
@end

@implementation Animal
- (void (^)(int))run
{
return ^(int b){
NSLog(@"run %d米",b);
};
}
@end

调用:

1
2
3
4
5
6
- (void)func
{
Animal *a = [[Animal alloc] init];

a.run(1000);
}

objective-c中的缓存-NSCache

发表于 2016-05-09   |   分类于 IT随笔

NSCache是系统提供的一种类似于集合(NSMutableDictionary)的缓存,它与集合的不同如下:

  1. NSCache具有自动删除的功能,以减少系统占用的内存;

  2. NSCache是线程安全的,不需要加线程锁;

  3. 键对象不会像 NSMutableDictionary 中那样被复制。(NSCache的Key只是对对象的strong引用,对象不需要实现NSCopying协议,NSCache也不会像NSDictionary一样复制对象。

NSCache的属性以及方法介绍:

@property NSUInteger totalCostLimit;

设置缓存占用的内存大小,并不是一个严格的限制,当总数超过了totalCostLimit设定的值,系统会清除一部分缓存,直至总消耗低于totalCostLimit的值。

@property NSUInteger countLimit;

设置缓存对象的大小,这也不是一个严格的限制。

- (id)objectForKey:(id)key;

获取缓存对象,基于key-value对

- (void)setObject:(id)obj forKey:(id)key; // 0 cost

存储缓存对象,考虑缓存的限制属性;

- (void)setObject:(id)obj forKey:(id)key cost:(NSUInteger)g;

存储缓存对象,cost是提前知道该缓存对象占用的字节数,也会考虑缓存的限制属性,建议直接使用 - (void)setObject:(id)obj forKey:(id)key;cost值只在比较容易获取到的时候才指定,若要通过复杂的计算来获取cost值,那使用缓存的意义就不大了。

NSCacheDelegate代理

代理属性声明如下:

@property (assign) id<NSCacheDelegate>delegate;

实现了NSCacheDelegate代理的对象,在缓存对象即将被清理的时候,系统回调代理方法如下:

- (void)cache:(NSCache *)cache willEvictObject:(id)obj;

第一个参数是当前缓存(NSCache),不要修改该对象;

第二个参数是当前将要被清理的对象,如果需要存储该对象,可以在此操作(存入Sqlite or CoreData);

该代理方法的调用会在缓存对象即将被清理的时候调用,如下场景会调用:

  1. 手动删除对象 - (void)removeObjectForKey:(id)key;

  2. 缓存对象超过了NSCache的属性限制;(countLimit 和 totalCostLimit )

  3. App进入后台会调用;

  4. 系统发出内存警告;

NSDiscardableContent协议

NSDiscardableContent是一个协议,实现这个协议的目的是为了让我们的对象在不被使用时,可以将其丢弃,以让程序占用更少的内存。

一个NSDiscardableContent对象的生命周期依赖于一个“counter”变量。一个NSDiscardableContent对象实际是一个可清理内存块,这个内存记录了对象当前是否被其它对象使用。如果这块内存正在被读取,或者仍然被需要,则它的counter变量是大于或等于1的;当它不再被使用时,就可以丢弃,此时counter变量将等于0。当counter变量等于0时,如果当前时间点内存比较紧张的话,内存块就可能被丢弃。这点类似于MRC&ARC,对象内存回收机制。

- (void)discardContentIfPossible

当counter等于0的时候,为了丢弃这些对象,会调用这个方法。

默认情况下,NSDiscardableContent对象的counter变量初始值为1,以确保对象不会被内存管理系统立即释放。

- (BOOL)beginContentAccess    (counter++)

调用该方法,对象的counter会加1;

与beginContentAccess相对应的是endContentAccess。如果可丢弃内存不再被访问时调用。其声明如下:

- (void)endContentAccess  (counter--)

该方法会减少对象的counter变量,通常是让对象的counter值变回为0,这样在对象的内容不再被需要时,就要以将其丢弃。

NSCache类提供了一个属性,来标识缓存是否自动舍弃那些内存已经被丢弃的对象(默认该属性为YES),其声明如下:

@property BOOL evictsObjectsWithDiscardedContent

如果设置为YES,则在对象的内存被丢弃时舍弃对象。

示例

在AFNetworking的UIKit中,使用了NSCache来提供异步图片下载的缓存。UIImageView+AFNetworking.h文件中,声明了一个AFImageCache协议,提供读取和放入缓存的方法。UIImageView+AFNetworking.m文件中,声明了一个继承自NSCache的类AFImageCache,实现了AFImageCache协议,并且实现了协议中的两种文件操作方法,实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

@interface AFImageCache : NSCache <AFImageCache>

@end



static inline NSString * AFImageCacheKeyFromURLRequest(NSURLRequest *request) {
return [[request URL] absoluteString];
}

@implementation AFImageCache

- (UIImage *)cachedImageForRequest:(NSURLRequest *)request {
switch ([request cachePolicy]) {
case NSURLRequestReloadIgnoringCacheData:
case NSURLRequestReloadIgnoringLocalAndRemoteCacheData:
return nil;
default:
break;
}

return [self objectForKey:AFImageCacheKeyFromURLRequest(request)];
}

- (void)cacheImage:(UIImage *)image
forRequest:(NSURLRequest *)request
{
if (image && request) {
[self setObject:image forKey:AFImageCacheKeyFromURLRequest(request)];
}
}

@end

使用absolute URL作为key,将图片缓存起来。在UIImageView类中,通过单例方式,获取AFImageCache的实例。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
+ (id <AFImageCache>)sharedImageCache {
static AFImageCache *_af_defaultImageCache = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_af_defaultImageCache = [[AFImageCache alloc] init];

[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidReceiveMemoryWarningNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * __unused notification) {
[_af_defaultImageCache removeAllObjects];
}];
});

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgnu"
return objc_getAssociatedObject(self, @selector(sharedImageCache)) ?: _af_defaultImageCache;
#pragma clang diagnostic pop
}

若在其他地方下载了图片,只需调用sharedImageCache方法,获取到一个NSCache实例,将图片放入缓存,URL作为key,那么再调用UIImageView时,指定URL,就可以直接从缓存中获取图片。

参考NSCache。

hexo常用命令

发表于 2016-04-10   |   分类于 IT随笔

简写

hexo n == hexo new

hexo p == hexo publish

hexo g == hexo generate

hexo s == hexo server

hexo d == hexo deploy

服务器

hexo server #Hexo 会监视文件变动并自动更新,您无须重启服务器。

hexo server -s #静态模式

hexo server -p 5000 #更改端口

hexo server -i 192.168.1.1 #自定义 IP

hexo clean #清除缓存 网页正常情况下可以忽略此条命令

hexo g #生成静态网页

hexo d #开始部署

监视文件变动

hexo generate #使用 Hexo 生成静态文件快速而且简单

hexo generate –watch #监视文件变动

完成后部署

两个命令的作用是相同的

hexo generate –deploy hexo deploy –generate
hexo deploy -g hexo server -g

原文hexo常用命令笔记。

自我管理的破窗效应

发表于 2016-04-10   |   分类于 IT随笔
在《程序员修炼之道——从小工到专家》这本书里,有这么一段描述:

在市区,有些建筑漂亮而整洁,而另一些却是破败不堪的“废弃船只”。为什么?犯罪和城市衰退领域的研究者发现了一种迷人的触发机制,
一种能够很快将整洁、完整和有人居住的建筑变为破败的废弃物的机制[WK82]。

破窗户。

一扇破窗户,只要有那么一段时间不修理,就会渐渐给建筑的居民带来一种废弃感——一种职权部门不关心这座建筑的感觉。
于是又一扇窗户破了。人们开始乱扔垃圾。出现了乱涂乱画。严重的结构损坏开始了。在相对较短的一段时间里,
建筑就被损毁得超出了业主愿意修理的程度,而废弃感变成了现实。

“破窗户理论”启发了纽约和其他大城市的警察部门,他们对一些轻微的案件严加处理,以防止大案的发生。
这起了作用:管束破窗户、乱涂乱画和其他轻微违法事件减少了严重罪案的发生。

不知道你有没有过类似这样的经验:

比如你坚持每天都跑步,风雨不断。一旦养成习惯,做这件事情感觉就是理所当然的。然后某天你病了,休息了一个星期,然后你会发现,原来不跑步也是可以的,还节省时间,不累。于是你慢慢就开始不跑了,于是跑步锻炼这个好习惯就被你丢了。后果呢?可能身材开始慢慢肥胖变形了,身体也不那么强健了,开始犯一些小毛病了。学习效率也开始下降了,要知道,运动能够提高大脑的活性,学习效率也会得到提高的。所以简单的一个破窗没有及时堵住,最后能导致一连串不良效果的出现。

又比如你坚持每天都写博客,记录代码片段,或者写点什么东西。一开始也是努力严格要求自己,必须每天都要写。然而总会有些原因让你无法写,比如出差、加班、旅游等等。发现博客断更了几天,于是就开始断更了得更厉害了,变成几周更新一次,几个月更新一次,慢慢博客就荒废了。博客是整理思维,总结所学的一个非常好的习惯。有坚持写博客习惯的人,往往思路清晰,逻辑有条理,长期以往,思维会变得活跃并深邃。所以这个习惯的丢弃,是非常可惜的,个人的成长失去一个有效的总结提升机制。长期的习惯可能都遭不住破窗的侵袭,更何况是三分钟热度的东西。

又比如你的工作台一开始是很整洁的,因此你心情不错,办事效率也很高(PS:国外一个研究理论,整洁的工作台能够提高你的工作效率)。但是某个时候你放了个杯子,摆了个电话,堆了些文件……慢慢桌面上的东西越来越多,也开始慢慢变乱,你没注意收拾好,于是越来越乱。最后乱得影响你工作的心情,然后办事效率低,工作表现开始变差,然后出现一连串恶性循环,比如因为表现不好得不到领导的赏识了,升迁受阻,个人精神开始颓滞等。仅仅因为一个工作台的破窗,就可能影响到一个人的职业发展。可能有点夸张,但工作优秀的人,桌面基本都是一直保持得很整洁的。

再举一个最简单的例子。你打算每个月存5000元,一开始也确实将5000元存进银行或者各种地方了。然后你看到某个东西你很喜欢,也不贵,就剁手买买买了。当5000元变成4xxx时,破窗就开始出现了,你会继续被各种消费欲望驱使,最后全花光了。而如果一开始你忍住不剁手的话,也许5000元也许就可以全存下了。一百元不找散的话,是不是可以在钱包里呆得比较久呢?又或者那一百元是崭新的新版土豪金,又是不是会呆得更久呢?破窗这个东西很神奇。

优秀往往来源于好习惯,而习惯优秀则能走向卓越。偶尔看到一些对学神的采访,问为什么学习能这么厉害。学神无非就说,坚持早读啊,坚持晚上学习到多晚等等。看似简单,但是要你每天都做那可就不简单了。学渣坚持早读晚修,努力学习,也许一年就可以变学民了。再坚持个三年,也许就可以变学霸了。而一直坚持下去,始终不落下这个习惯,也许就能成为学神了。学神诚不欺余也。

所以好习惯的重要性不言而喻。好习惯是靠坚持养出来的,而注意防范自我管理中的破窗,非常重要。一个小小的懈怠,也许就能毁掉你十年的习惯。严格要求自己,不要让懒惰滋生破窗。

本文转自自我管理中的破窗效应。

1234
翻盖的乌龟

翻盖的乌龟

沙滩一躺三年半,大浪来时我翻身。

19 日志
3 分类
© 2019 翻盖的乌龟
由 Hexo 强力驱动
主题 - NexT.Mist