阅读次数:101

花瓣网抓取图片脚本

最早关注的不是花瓣网,是topit.me,这个网站不错,格调很高雅。

后来听说了Pinterest,然后是国内的花瓣网。花瓣网上主题,分类比较明确,看了页面, 组织也整齐,于是写了个花瓣网的图片抓取脚本。

其中有一个小问题,就是抓取的专辑beauty页面中,由于它是下拉刷新加载页面的,使用 urlretrieve不能下载下来,只能借助外部的curl了。有高手能解决的,还请不吝赐教。

代码下载地址: https://gist.github.com/1956744

内容不多,直接贴下:

#!/usr/bin/env python
# -*- coding: utf8 -*-
# author: amoblin <amoblin@163.com>

import sys, re, urllib2, os, urllib

beauty_url = "http://huaban.com/favorite/beauty/"
pin_re = '<a href="/pins/(.+?)/"'

def get_img_url(pin):
pin_url = "http://huaban.com/pins/%s/" % pin
img_url_re = '<img alt="采集图片" src="(.+?)"'
pg = urllib2.urlopen(pin_url)
content = pg.read()
pg.close()
img_url = re.findall(img_url_re, content)[0]
return img_url

if __name__ == "__main__":
if len(sys.argv) < 2:
local_path = "./huaban"
else:
local_path = sys.argv[1]

if not os.path.exists(local_path):
try:
os.makedirs(local_path)
except e:
print e
sys.exit(1)

print "pin images will saved to: %s" % local_path

os.system("curl -s %s -o /tmp/huaban.html" % beauty_url)
content = open("/tmp/huaban.html").read()

pins = re.findall(pin_re, content)[1:]
for pin in pins:
img_url = get_img_url(pin)
print "saving pin: %s" % pin
urllib.urlretrieve(img_url, "%s/%s.jpeg" % (local_path, pin))
阅读次数:72

ios开发学习

界面文件 后缀为.nib或.xib,4.2以后改为storyboard。

真机开发

钥匙串访问(keychain)中创建证书,用于程序签名。

修改Xcode:

$ cd /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk
$ sudo vi SDKSettings.plist

将如下内容: .. code-block:: text

15 <key>CODE_SIGNING_REQUIRED</key> 16 <string>YES</string>

中YES改为NO。

$ cd /Developer/Platforms/iPhoneOS.platform/

将XCiPhoneOSCodeSignContext中的iPhoneOS删掉。

二进制补丁

XCode 4.2中路径变了:

$ cd /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/PrivatePlugIns/iPhoneOS Build System Support.xcplugin/Contents/MacOS
$ dd if=iPhoneOS\ Build\ System\ Support of=working bs=500 count=255
$ echo -n xc3x26x00x00 >> working
$ chmod 755 working
$ mv iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.orig
$ mv working iPhoneOS\ Build\ System\ Support

自定义生成后脚本

$ wget http://www.alexwhittemore.com/iphone/gen_entitlements.txt
$ mv gen_entitlements.txt gen_entitlements.py
$ chmod 755 gen_entitlements.py

修改工程设置

Add Build Phrase -> Add Run Script,输入以下内容:

export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ]; then
/Developer/iphoneentitlements401/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
codesign -f -s "iPhone Developer" --entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
fi

参考资料:

http://hi.baidu.com/jaywclove/blog/item/0782355562849cdab645ae14.html

iOS中Unix环境配置

软件源地址:/etc/apt/sources.list.d/

  1. 安装aptitude:
$ apt-get install aptitude
  1. 使用aptitude搜索软件包:
$ aptitude search vim

Linux/Unix用户必备工具:

$ sudo apt-get install less vim git python screen

通过命令行发短信:

$ sudo apt-get install sendsms

iOS中常用命令

  1. 重启SpringBoard
$ sudo sbreload
  1. 重启iphone
$ sudo reboot
阅读次数:73

bash + screen + vim 配置

screen默认主键是C-a,这个很不方便,C-a在emacs风格的bash下是到行首,而在vim中是增1。

最好改为其他键。由于screen的快捷键大多在键盘左半区域,所以最好也在左边。

C-q, C-s 终端占用,不能使用。

bash的emacs风格快捷键(部分)

C-w 清空输入 C-e 行尾 C-r 历史搜索 C-t 交换字母 C-a 行首 C-f 右移 C-z 暂停 C-c 结束

可以选择的:C-t, C-x, C-v

vim普通模式键盘绑定

C-w 切换窗口 C-e 上升1行 C-r redo C-t pop标签栈 C-a 增1 C-d 下半页 C-f 下一页 C-x 减1 C-v 块操作

可以选择的:C-s, C-x, C-c

结论

取交集得: C-x

阅读次数:48

vim技巧

  1. 查看光标处系统函数man手册:
shift + k
  1. c代码折叠

对于如下风格的c代码:

void test() {

if(1) {
printf("hello\n");
} else {
printf("you should never see this.\n");
}

switch(ch) {
case 'a':
printf("hello\n");
break;
default:
printf("hello\n");
break;
}

while(1) {
if(1) {
break;
}
printf("you should never see this.\n");
}
}

折叠结果如下:

 1 void test() {
2
3 +--- 2 : if(1) {---------------------------------------------------
5 +--- 3 : } else {--------------------------------------------------
8
9 +--- 8 : switch(ch) {----------------------------------------------
17
18 +--- 6 : while(1) {------------------------------------------------
24 }

实现上述折叠的vim配置为:

function MyFoldfun(lineNum)
if getline(a:lineNum+1)=~'^{'
return 'a1'
elseif getline(a:lineNum)=~'^}'
return 's1'
elseif getline(a:lineNum+1)=~'.\+}.\+{'
return 's1'
elseif getline(a:lineNum)=~'.\+}.\+{'
return 'a1'
elseif getline(a:lineNum)=~'.\+}'
return 's1'
elseif getline(a:lineNum)=~'.\+{'
return 'a1'
elseif getline(a:lineNum)=~' \+case '
return 'a1'
elseif getline(a:lineNum+1)=~' \+case '
return 's1'
elseif getline(a:lineNum+1)=~' \+default:'
return 's1'
else
return '='
endif
endfunction

set foldexpr=MyFoldfun(v:lnum)

其中函数为设置缩进,最后一行设置折叠表达式为上述函数。

阅读次数:70

Linux C多线程学习

linux c多线程库函数的头文件为pthread.h,链接库参数为-lpthread。

线程创建函数:pthread_create,通过这个函数调用其他函数作为一个线程,被调函数的参数也在pthread_create中给出。注意这里只能有一个参数。如果被调函数多参的话,需要使用其他方法实现,比如封装成一个结构体参数,或者将参数设置为全局变量。

线程互斥(mutex)

互斥量(MUTual Exclusion)是线程同步的一种方法。一般用法如下:

首先定义互斥信号量,并初始化:

pthread_mutex_t count_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_init(&count_mutex, NULL);

在线程函数中加锁和解锁:

pthread_mutex_lock(&count_mutex);

... some process.

pthread_mutex_unlock(&count_mutex);

这样中间的处理就是原子的。

阅读次数:90

CSF学习笔记

继续阅读

阅读次数:162

Google Code Git不能clone的解决

最近Google Code开始支持Git了,赞一个!

但使用git clone项目时却出现了下面的错误:

$ git clone https://code.google.com/p/leveldb/
Cloning into leveldb...
error: SSL: certificate subject name (climb) does not match target host name 'code.google.com' while accessing https://code.google.com/p/leveldb/info/refs

fatal: HTTP request failed

尝试添加网站证书到/etc/ssl/certs/ca-certificates.crt还是不行。

后来终于发现解决办法:禁用Git的SSL验证。

$ export GIT_SSL_NO_VERIFY=1

解决!

阅读次数:47

memcached学习笔记

ubuntu下安装:

$ sudo apt-get install memcached

启动:

$ memcached -d

默认端口号为11211,可以通过ps查看:

$ ps -ef|grep memcached

使用Telnet测试:

查看状态:

$ telnet localhost 11211
Trying ::1...
Connected to shiroh-laptop.
Escape character is '^]'.
stats
STAT pid 2768
STAT uptime 4614
STAT time 1323677670
STAT version 1.4.7
STAT libevent 2.0.12-stable
...
STAT total_items 9
STAT evictions 0
STAT reclaimed 0
END

set操作(继续上面的telnet操作):

set name 0 0 7
amoblin
STORED
set gender 0 0 1
1
STORED

get操作:

get name
VALUE name 0 7
amoblin
END
get gender
VALUE gender 0 1
1
END
阅读次数:89 阅读次数:83