闲情zhi

生活 创业 时评 杂文

如何科学上网?

之前写过一篇被知乎删了,其实最安全的还是自己的博客。

不瞎逼逼,不解释什么叫科学上网了,懂得同志、想懂的同志都懂。

下面介绍的是使用shadowsocks十分廉价的翻墙方案,根据使用经验来说,非常稳定,看youtube\xvieos全都不会卡

 

  1. 打开bandwagong,购买最便宜的1年套餐
  2. 进入bandwagon后台,一键安装shadowsocks、当然不要安装openvpn而且会用的话也可以用,不会用可以留言。
  3. 屏幕快照 2016-06-10 上午12.01.39 屏幕快照 2016-06-10 上午12.01.50 屏幕快照 2016-06-10 上午12.02.12
  4. 记住右边的ip 端口 密码
  5. 下载shadowsocks客户端(OSX、Windows)
  6. 下载switchproxy,并设置为系统代理(推荐chrome浏览器,设置完之后其他浏览器自动可以翻墙)屏幕快照 2016-06-10 上午12.11.43
  7. 然后就可以安心的看片了.

 

====================更新线(针对PC端/MacOS全应用的翻墙)================================

shadowsock一般情况下只有访问网页的时候才能进行翻墙行为,而比如你在使用某个应用的时候,比如ibook,使用的还是你本地的ip.

在使用过程中发现了一个很有用的软件proxifier(https://www.proxifier.com/download.htm),稍微设置一下就能通过ss+proxifier实现任意应用的翻墙,比如想玩魔兽世界的台服,只要有台湾地区的ss,加上proxifier就能轻松实现。proxifier的配置技巧引用此篇文章。http://awy.me/2014/06/yong-shadowsocks-he-proxifier-zi-you-fang-wen-hu-lian-wang/

Gitlab使用记录

之前使用bitbucket以及之后迁移到自己搭建的gitlab的时候,采用的多人协作模式都是如下图。

无标题

但今天在研究gitlab结合jenkins的文章中看到了另外一种更加简便的管理方式…也真是后知后觉啊..

无标题

不过bitbucket本身没有分支保护功能,而gitlab并非如此。所以第二种协作方式显得更加的必要。

但是相比之下第二种方式对于分支的命名和管理要求会更加高一点。

 

jenkins的CI部署还在研究中…等更新

Sublime Text3 工具 SFTP

SFTP是一个非常优秀的工具,维护线上的配置文件,查看日志文件非常的简易。

filehelper_1451356623015_29

 

 

包括Nginx配置文件的修改,再也不用怎么打开线上服务器了。

 

不过作为运维的工具,我还需要几个工具:

  1. 可以本地输入命令,线上可以直接执行
  2. 多台服务器之间文件同步的工具

sublime Text3 Config for myself

 

Package Control

import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read())

Docblockr   注释占位符
SublimeLinter   代码错误提示
Bracket Highlighter  括号匹配

SideBarEnhancements 侧栏增强工具

SFTP 本地直接管理FTP上的文件

Soda -Theme 主题

BetterCoffee Coffee高亮

SCSS scss文件高亮

 

 

 

 

gulp-changed gulp-sass only compile files that changed

these are some examples

uglifycss = require "gulp-uglifycss"
watch = require "gulp-watch"
changed = require "gulp-changed"

##编译scss文件
gulp.task 'sass', ->
  gulp.src "src/scss/**/*.scss"
  .pipe(changed("assets/css", {extension: ".min.css"}))   //this is right              {".css"} is wrong because i use rename ".min"
  .pipe(sass())
  .on "error", logError
  .pipe autoprefixer
  browsers: ['last 3 versions'],
     cascade: true, #是否美化属性值 默认:true 像这样:
     #-webkit-transform: rotate(45deg);
     # transform: rotate(45deg);
      remove:true #是否去掉不必要的前缀 默认:true
  .pipe uglifycss()
  .pipe rename suffix: '.min'
  .pipe gulp.dest 'assets/css'
  .pipe livereload()

#编译coffee文件
gulp.task "coffee", ->
  gulp.src "src/js/**/*.coffee", read:false
    .pipe(changed("assets/js", {extension: ".min.js"}))
    .pipe browserify
      debug: true
      transform: ['coffeeify']
      extensions: ['.coffee']
    .on "error", logError
    .pipe uglify()
    .pipe rename suffix: ".min"
    .pipe extReplace '.js'
    .pipe gulp.dest "assets/js"
    .pipe livereload()

#编译coffee文件
gulp.task "coffee", ->
  gulp.src "src/js/**/*.coffee", read:false
    .pipe(changed("assets/js", {extension: ".js"}))
    .pipe browserify
      debug: true
      transform: ['coffeeify']
      extensions: ['.coffee']
    .on "error", logError
    .pipe uglify()
    .pipe extReplace '.js'
    .pipe gulp.dest "assets/js"
    .pipe livereload()

If you have problem, leave your message

gulp-changed

高德地图使用小记

因为租哪儿之后会做海外的业务,所以很快地图要从高德地图迁移到google Map。不过使用高德地图过程中的一些经验值得留下来,以后可以作为参考(当然不会说API,只是写一点方向性的解决方案)。

1. Marker、Polyline等覆盖物

租哪儿地图找房必然会用到一些标记,如房源信息,地铁线路、以及区域。

这些覆盖物需要注意的几个点是:
1. 他们可以绑定事件,如marker.on(“click”, function(){})
2. marker等是有内置函数可以获取此html,以及自定义marker的样式的。
3. marker等是可以自定义参数的extData,这边遇到过坑。
4. 覆盖物图层是可以分层的,之前很傻逼,用map.clearMap清除,然后marker.setMap(map)这样来添加,导致清除图层的时候不能选择性的不分清除。然而这边更优化的方案则是 map.add map.remove来进行覆盖物的添加。对了,map.add 是可以添加单个、也可以添加一个marker组成的数组的。

2. 地图事件

租哪儿的地图是可以拖动的,拖动的时候会触发事件以从服务器端获取房屋数据。但拖动触发事件有很多。我们团队之前有人开发的时候用touchstart、dragstart触发,经常会出问题,后来我选用movestart来触发,则很精准。所以这种东西的选择很关键,需要留意。

如何判断JS中两个数组相同

今天做的一个需求需要比较两个数组是否相同,网上查了几个方法。有个方式特别让我印象深刻,也就对于JS特性比较熟悉的牛儿们比较玩得转了,学习记录下来。

假设
a = [1,2,3]
b = [1,2,3]

JS中的 == 和 === 是无法直接进行比较的。

但是 >= > 这些符号,会把数组直接变成字符串进行比较。

所以利用这个特性存在表达式
a > b || a < b 如果ab相同,那么两个都是false,即 false||false 则返回false,取反则产生true 如果ab不同,那么其中一个必定是真,即false||true,则返回true,取反则产生false 是不是超级牛!作为一个有灵性的代码手!必须下跪求饶!

HTTPS网站如何使用百度分享

前阵子因为电信广告劫持,一怒之下给租哪儿上了https,广告倒是没有了,百度分享却不支持https。

作为一个有灵性的,很有灵性的码帅哥,怎么可以容许浏览器左上角没有绿色的锁图标呢,处女座不能忍。

微信截图_20151118131309

微信截图_20151118130120

然后百度分享确实这个阶段不支持https。可以看到百度分享的域名都是 http://bdimg.share.baidu.com/

所以很无奈,灵性的我直接物理下载了百度分享的组件代码和文件,直接放在网站目录(=。=当然你可以放CDN,通过HTTPS访问啊)

微信截图_20151118131507

直接上线,DONE!excited!

微信截图_20151118131614

微信截图_20151118130732

 

不过这种做法有种问题,是我把百度logger.js里面的统计代码删掉了,这个logger的坐拥就是用来记录数据的,里面nclick的图片文件,没错,这个是http,所以可以考虑删掉logger的内容,但是后果就是没有百度分享的统计数据了。本叼也表示很无奈啊。

 

以下附件是百度分享离线压缩包 ,使用也很简单,改一下路径全搞定。

 

window._bd_share_config={

		"common":{
			"bdSnsKey":{
				"tsina": "3185645315",
				"douban": "0741f32a7258ef8715c5d97f570ace95"
			},
			"bdText":"",
			"bdMini":"2",
			"bdMiniList":false,
			"bdPic":"{:C('RESOURCE_DOMAIN')}{$img.url}!medium",
			"bdStyle":"1",
			"bdUrl" : "", 
			"bdSize":"32"
		},

		"share":{},
	};

	with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='/assets/lib/bdshare.min.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];

wordpress代码高亮插件 – WordPress笔记

在使用wordpress的过程中,不免会插入自己的分享的代码,但是原生的wordpress对于代码高亮的支持并不好。

这边分享一款wordpress高亮插件,也是我这个博客现阶段使用的插件WP-Syntax

1. 安装WP-Syntax

进入wp后台使用插件安装
微信截图_20151022093742

 

2. 使用WP-Syntax

这个插件的使用很简单

 

<pre lang="html" line="1" escaped="true" >
//这里添加代码……
</pre>

其中,lang=”html”表示代码语言为html,请根据自己需要修改; line=”1″ 表示显示行号,如果不需要,去掉即可;escaped=”true” 是为了防止代码转义,如果不需要,去掉即可。

PHP与Python结巴分词(jieba)结合使用的案例

结巴分词是一个很优秀的分词插件。之前写那个python爬虫网站(点击链接查看源码)的时候就用过这个分词。

在这个http://www.zunar.com.cn 的开发过程中,第一版的搜索使用php的pscws4做的,但是这个分词插件的缺陷很明显,分词不够精确。

所以自然而然的就想把结巴分词也用到网站中。所以就涉及到了PHP跟python script的结合问题。

结合很简单。写一个python的分词脚本(引入了jieba),然后使用php的exec来进行调用。

需要注意的有这么几个点:

  1. php.ini中disable_functions 中需要允许exec(或jieba者其他)函数的调用
  2. linux环境中,python脚本需要添加可执行权限 chmod +x jieba.py
  3. 在编写过程中碰到的一个很大的问题就是中文参数乱码的问题,我所有的文件字符编码都是utf8,但使用php调用的时候会发生非常神奇的bug,详情参看我在stackoverflow上面的提问 ,解决方案我也在回答中说明了,至今不明白为什么三个中文字符就会出现乱码。有兴趣的可以来调试一下。

 

jieba.py代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
#coding:utf-8
import jieba
import sys
from urllib import unquote
 
keywords = " ".join(sys.argv[1:])
seg_list = jieba.cut(unquote(keywords), cut_all=True)
 
#fp = open("./test.txt",'a') 
new_str = ""
for t in seg_list:
	str1 = t
	if isinstance(t, unicode):
		str1 = t.encode("utf-8")
 
	new_str = new_str + str1 + " "
	#fp.write(str1) 
#fp.close()
print new_str

调试代码.zip

plupload文件上传插件点击上传按钮无响应的解决方案

之前开发用了swfupload,不过用了plupload之后,感觉后者的兼容性更加的好。不过在开发过程中遇到了一个如题的一个问题。点击上传按钮无法响应。

微信截图_20151016175533

 

在开发的时候chrome,以及本地的ie8+浏览器都验证通过。但一直有房东不定期的吐槽,点击添加图片没有反应,通常都是遨游浏览器。

下载遨游(切换成各种ie内核都不行)一调试,我操!真的是无法上传。

 

然而下载官方的demo,使用遨游浏览器却可以。

 

webwxgetmsgimg

 

一定是哪里撸伤了!

 

后来在无意中的调试发现了一个规律。

因为我这个上传的父div默认是display none,用户切换到图片上传菜单的时候 才会变成block,但plupload是在页面加载的时候就初始化的。如果刚开始图片上传的div是block的话,就能够正常的响应。

这一定是一个bug!

解决方案很简单,当图片上传div变成block的时候,执行一下  uploader.refresh()  就可以修复这个bug了!

 

侯赛来!

微博粉丝服务平台PHP-SDK

因为公司产品有需要,所有把官方的粉丝平台API做了一个简单封装。当然还没有完全,只是封装了我需要用到的一些功能。地址:微博粉丝平台PHP-SDK 持续更新中…

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
<?php /**
* 微博粉丝服务平台PHP-SDK,官方API
*
* @author lizhug * @link(github, http://github.com/lizhug/weibo-php-sdk)
* @version 1.0 []
* @example [URI] []
* $this->valid();
* $weObj = new Weibo($this->WE_OPTIONS);
* $type = $weObj->getRev()->getRevType();
*
* switch ($type) {
* case \Org\Weibo::MSGTYPE_TEXT:
* $weObj->text($weObj->getRevContent())->reply();
* break;
* case \Org\Weibo::MSGTYPE_EVENT:
* $eventData = $weObj->getRevData();
* if ($eventData['subtype'] == \Org\Weibo::EVENT_FOLLOW) {
* $weObj->text("#欢迎关注租哪儿 最专业的互联网租房平台#【房东直租,0中介费】【聚焦年轻人,更多优质房源】--点击「我要找房」即可搜索心仪房源。--点击「发布房源」即可免费发布房源。网站链接:http://www.zunar.com.cn")->reply();
* } else if ($eventData['subtype'] == \Org\Weibo::EVENT_UNFOLLOW){
* $weObj->text("感谢您使用租哪儿,最专业的互联网租房平台,期待您的再次使用。网站链接:http://www.zunar.com.cn")->reply();
* }
* break;
* case \Org\Weibo::MSGTYPE_MENTION:
* $weObj->text("您的微博租哪儿已经帮您记录,我们会及时处理,帮您转发推广。感谢您使用租哪儿 最专业的互联网租房平台。网站链接:http://www.zunar.com.cn")->reply();
* break;
* }
*/</code>
 
namespace Org;
 
class Weibo {
 
const MENU_CREATE_URL = "https://m.api.weibo.com/2/messages/menu/create.json";
 
//自定义回复相关地址
const RECEIVE_MSG_URL = "https://m.api.weibo.com/2/messages/receive.json"; //需要长连接,详见文档:http://open.weibo.com/wiki/2/messages/receive
const REPLY_MSG_URL = "https://m.api.weibo.com/2/messages/reply.json"; //消息回复接口,详见文档:http://open.weibo.com/wiki/2/messages/reply
const MSGTYPE_TEXT = "text";
const MSGTYPE_POSITION = "position";
const MSGTYPE_IMAGE = "image";
const MSGTYPE_VOICE = "voice";
const MSGTYPE_EVENT = "event";
const MSGTYPE_MENTION = "mention";
const EVENT_SUBSCRIBE = "subscribe";
const EVENT_UNSUBSCRIBE = "unsubscribe";
const EVENT_FOLLOW = "follow";
const EVENT_UNFOLLOW = "unfollow";
 
//订阅发送相关地址
 
//私信提醒相关地址
 
//好友邀请相关地址
 
//获取用户信息
const USER_INFO_URL = "https://api.weibo.com/2/eps/user/info.json";
 
//私有变量
private $appkey; //指定用于开发模式的应用appkey,详见:http://t.cn/zRp0sr6
private $appsecret;
private $token;
private $message; //要回复的消息内容
private $messageType; //要回复的消息类型
private $_receive;
 
public function __construct($options) {
$this->appkey = isset($options['appkey'])?$options['appkey']:'';
$this->appsecret = isset($options['appsecret'])?$options['appsecret']:'';
$this->token = isset($options['token'])?$options['token']:'';
}
/**
* 微博粉丝服务平台验证
*/
private function checkSignature() {
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
 
$appsecret = $this->appsecret; //开发者的appsecret
$tmpArr = array($appsecret, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
 
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
 
/**
* 回复文字消息
*/
public function text($text = "") {
$this->message = array("text" => urlencode($text));
$this->messageType = "text";
return $this;
}
 
/**
* 回复图文消息
* @param $article 图文消息内容
* array(
* array(
* "title" => "消息的标题",
* "content" => "消息的内容",
* "image" => "消息的图片",
* "url" => "消息链接"
* )
* )
*
*
* //多图文方式回复,多个图文时在“articles”中添加多个数组既可,最多支持8个
* $type = "articles";
* $replayText = json_encode(
*
* array (
* 'display_name'=>'图文标题1',
* 'summary'=>'图文摘要​1',
* 'image'=>'http://storage.mcp.weibo.cn/0JlIv.jpg',
* 'url'=>'http://open.weibo.com/wiki/Messages'
* ),
* array (
* 'display_name'=>'图文标题2',
* 'summary'=>'图文摘要​2',
* 'image'=>'http://ww2.sinaimg.cn/small/71666d49tw1dxms4qp4q0j.jpg',
* 'url'=>'http://open.weibo.com/wiki/Messages'
* ),
* array (
* 'display_name'=>'图文标题3',
* 'summary'=>'图文摘要​3',
* 'image'=>'http://http://ww2.sinaimg.cn/small/71666d49tw1dxms5mm654j.jpg',
* 'url'=>'http://open.weibo.com/wiki/Messages'
* )
* );
*/
public function article($article = "") {
$this->message = array("articles" => $articles);
 
$this->messageType = "articles";
return $this;
}
 
public function reply() {
$msg = array(
"result" => true,
"sender_id" => $this->_receive['receiver_id'],
"receiver_id" => $this->_receive['sender_id'],
"type" => $this->messageType,
//data字段需要进行urlencode编码
"data" => json_encode($this->message)
);
 
echo json_encode($msg);
}
 
/**
* 验证服务器端
*/
public function valid() {
if (isset($_GET["echostr"])) {
die($_GET["echostr"]);
}
return true;
}
 
/**
* 获取用户发送的信息
*/
public function getRev() {
if ($this->_receive) return $this;
$this->_receive = json_decode($GLOBALS['HTTP_RAW_POST_DATA'], true);
return $this;
}
 
/**
* 获取消息发送者的ID,即蓝v粉丝
*/
public function getRevFrom() {
return $this->_receive['receiver_id'];
}
 
/**
* 获取消息接受者的ID,即蓝v自己
*/
public function getRevTo() {
return $this->_receive['sender_id'];
}
 
/**
* 获取消息类型
*/
public function getRevType() {
return $this->_receive['type'];
}
 
/**
* 获取消息内容
*/
public function getRevContent() {
return $this->_receive['text'];
}
 
/**
* 获取消息data
*/
public function getRevData() {
return $this->_receive['data'];
}
 
/**
* 获取产生事件的用户信息
*
* @param [type] $uid [description]
* @return [type] [description]
*/
public function getUserInfo($uid = "2541756412") {
$result = $this->httpGet(self::USER_INFO_URL . "?access_token=" . $this->token . "&uid=" . $uid);
return json_decode($result, true);
}
 
/**
* 获取用户uid
*/
public function getUserUid() {
 
}
 
/**
* 创建自定义菜单
*
* {
*"button": [
* {
* "type": "click",
* "name": "获取优惠券",
* "key": "get_groupon"
* },
* {
* "type": "click",
* "name": "查询客服电话",
* "key": "the_big_brother_need_your_phone"
* },
* {
* "name": "菜单",
* "sub_button": [
* {
* "type": "view",
* "name": "网上4S店",
* "url": "http://apps.weibo.com/1838358847/8rYu1uHD"
* },
* {
* "type": "view",
* "name": "砍价团",
* "url": "http://apps.weibo.com/1838358847/8s1i6v74"
* },
* {
* "type": "click",
* "name": "么么哒",
* "key": "memeda"
* }
* ]
* }
*]
*}
*/
public function createMenu($data) {
$result = $this->httpPost(array(
"access_token" => $this->token,
"menus" => json_encode($data)
), self::MENU_CREATE_URL);
 
$parse = json_decode($result, true);
if ($parse['result']) {
return array(
"code" => 200,
"message" => "菜单创建成功"
);
} else {
return array(
"code" => 400,
"message" => $parse
);
}
}
 
/**
* POST请求
*/
public function httpPost($param, $url, $timeout = 30) {
 
$ch = curl_init();
 
if(stripos($url,"https://")!==FALSE){
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
}
 
if (is_string($param)) {
$strPOST = $param;
} else {
$aPOST = array();
foreach($param as $key=>$val){
$aPOST[] = $key."=".urlencode($val);
}
$strPOST = join("&", $aPOST);
}
 
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
#curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
#curl_setopt($ch, CURLOPT_USERPWD, $user . ':' . $passwd);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $strPOST);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
 
/**
* get请求
*/
private function httpGet($url) {
$oCurl = curl_init();
if(stripos($url,"https://")!==FALSE){
curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
}
curl_setopt($oCurl, CURLOPT_URL, $url);
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
$sContent = curl_exec($oCurl);
curl_close($oCurl);
 
return $sContent;
}
}

 

 

Sublime Text添加包管理——Sublime Text使用笔记(二)

Sublime Text本身最强大的就是他的各种第三方的插件,第三方插件的管理就应运而生。

 

1. 安装Package Control

通过快捷键Ctrl + ` (小数字1左边那个),在出现的输入栏中粘贴对应的代码

Sublime Text3:

import  urllib.request,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();urllib.request.install_opener(urllib.request.build_opener(urllib.request.ProxyHandler()));open(os.path.join(ipp,pf),'wb').write(urllib.request.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read())

Sublime Text2:

import  urllib2,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();os.makedirs(ipp)ifnotos.path.exists(ipp)elseNone;urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler()));open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read());print('Please restart Sublime Text to finish installation')

BaiduShurufa_2015-9-4_10-31-41

2. 使用Package Control管理插件

按Ctrl + Shift + P即可使用Package Control的相关功能(增加、删除)

BaiduShurufa_2015-9-4_10-34-42

Centos6.4添加Adobe Flash支持——打造强大的linux环境(二)

刚用centos的用户经常会碰到一个问题,就是Firefox(火狐浏览器)不支持Adobe Flash,需要自行安装Flash插件

1. 添加Adboe Flash软件源

Centos 64位用户

rpm -ivh http://linuxdownload.adobe.com/adobe-release/adobe-release-x86_64-1.0-1.noarch.rpm
rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-adobe-linux

Centos 32位用户

rpm -ivh http://linuxdownload.adobe.com/adobe-release/adobe-release-i386-1.0-1.noarch.rpm
rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-adobe-linux

 

2. 更新软件源

yum check-update

3. 安装Adobe Flash

yum install flash-plugin nspluginwrapper alsa-plugins-pulseaudio libcurl

4. 重启Firefox