LittleQ

爱好:写代码

python常用结构

python常用结构有集合以及循环,另外集合包括列表和集合两大类。

集合类

  • 有序列表list
    1
    2
    3
    >>> listTest = ['ha','test','yes']
    >>> listTest
    ['ha', 'test', 'yes']

len()获取list元素个数。

1
2
>>> len(listTest)
3

可以用索引来访问每一个元素,0表示第一个,-1还可以表示最后一个,即倒数第一个,依此类推-2表示倒数第二个,超过了也会报越界错误。

1
2
3
4
5
6
7
8
9
10
11
12
>>> listTest[0]
'ha'
>>> listTest[1]
'test'
>>> listTest[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> listTest[-1]
'yes'
>>> listTest[-2]
'test'

也可以把元素插入到指定的位置,比如索引号为1的位置:

1
2
3
>>> listTest.insert(1,'jack')
>>> listTest
['ha', 'jack', 'test', 'yes']

删除末尾元素,用pop()方法,添加到末尾用append()

1
2
3
4
5
6
>>> list
['ha', 'jack', 'test', 'yes']
>>> listTest.pop()
'yes'
>>> listTest
['ha', 'jack', 'test']

删除指定位置的元素,用pop(i)方法,其中i是索引位置:

1
2
3
4
5
6
>>> listTest
['ha', 'jack', 'test']
>>> listTest.pop(1)
'jack'
>>> listTest
['ha', 'test']

把某个元素替换,直接赋值即可,并且类型也可以不同:

1
2
3
4
5
6
7
8
>>> listTest
['ha', 'test']
>>> listTest[1] = 'debug'
>>> listTest
['ha', 'debug']
>>> listTest[1] = 123
>>> listTest
['ha', 123]

list也可以嵌套:

1
2
3
4
5
6
7
8
9
>>> s = ['python', 'java', ['asp', 'php'], 'scheme']
>>> len(s)
4
>>> s[1]
'java'
>>> s[2]
['asp', 'php']
>>> s[2][1]
'php'

空的list:

1
2
3
>>> L = []
>>> len(L)
0
  • 不可变列表tuple
    另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改。
    1
    2
    3
    4
    5
    >>> classmates = ('Michael', 'Bob', 'Tracy')
    >>> classmates
    ('Michael', 'Bob', 'Tracy')
    >>> classmates[1]
    'Bob'
    注意:由于tuple不可变,所以代码更安全,如果可能,能用tuple代替list就尽量用tuple
    tuple的陷阱:当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来,比如:
    1
    2
    3
    >>> t = (1, 2)
    >>> t
    (1, 2)
    如果要定义一个空的tuple,可以写成():
    1
    2
    3
    >>> t = ()
    >>> t
    ()
    但是,要定义一个只有1个元素的tuple,如果你这么定义:
    1
    2
    3
    >>> t = (1)
    >>> t
    1
    定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1

所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义:

1
2
3
>>> t = (1,)
>>> t
(1,)

Python在显示只有1个元素的tuple时,也会加一个逗号,,以免你误解成数学计算意义上的括号。
最后来看一个可变的tuple:

1
2
3
4
5
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])

注意:tuple所谓的不变是说,tuple的每个元素,指向永远不变。

  • Map
    Python内置了字典:dict的支持,dict全称dictionary,在Java/C++中也称为Map,使用键-值(key-value)存储,具有极快的查找速度。
    1
    2
    3
    >>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
    >>> d['Michael']
    95

把数据放入dict的方法,除了初始化时指定外,还可以通过key放入:

1
2
3
>>> d['Adam'] = 67
>>> d['Adam']
67

注意:如果key不存在,dict就会报错:

1
2
3
4
>>> d['Thomas']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Thomas'

要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:

1
2
>>> 'Thomas' in d
False

或者通过dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value:

1
2
3
>>> d.get('Thomas')
>>> d.get('Thomas', -1)
-1

删除dict里的元素,用pop(key)方法,对应的value也会从dict中删除:

1
2
3
4
>>> d.pop('Bob')
75
>>> d
{'Michael': 95, 'Tracy': 85}

正确使用dict非常重要,需要牢记的第一条就是dictkey必须是不可变对象。

  • set集合
    setdict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key
    要创建一个set,需要提供一个list作为输入集合:
    1
    2
    3
    >>> s = set([1, 2, 3])
    >>> s
    set([1, 2, 3])
    set会自动过滤重复元素,add(key)添加元素,可以重复添加,但是没有效果。remove(key)删除元素。对于两个集合,还可以通过&取集合的交集,|取集合的并集。

循环控制

  • 条件判断
    之前学过Java/C++可能会不太习惯这种方式,先看看python的条件判断代码:

    1
    2
    3
    4
    age = 20
    if age >= 18:
    print 'your age is', age
    print 'adult'

    根据Python的缩进规则,缩进的代码块就相当于Java/C++里大括号的内容。即ifTrue,执行代码块内容,加elseelif同理,注意不要漏掉:

    1
    2
    3
    4
    5
    6
    7
    8
    if <条件判断1>:
    <执行1>
    elif <条件判断2>:
    <执行2>
    elif <条件判断3>:
    <执行3>
    else:
    <执行4>

    注意: if还可以简写,下面这个和Java/C++有很大的不同,python对类型的判断很宽松,只要x是非零数值、非空字符串、非空list等,就判断为True,否则为False

    1
    2
    if x:
    print 'True'
  • 循环控制
    循环和Java/C++就很像了,也是有两种:for循环和while循环。
    for x in ...循环就是把每个元素代入变量x,然后执行缩进代码块:

    1
    2
    3
    names = ['Michael', 'Bob', 'Tracy']
    for name in names:
    print name

while循环,只要条件满足,就不断循环

1
2
3
4
5
6
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print sum

开发环境

1
2
3
os: Ubuntu 14.04 (Linux 3.13.0-32-generic linux x64)
python: Python 2.7.6 (default, Mar 22 2014, 22:59:56)
IDE: pyCharm 4.5.4

准备工作

  • 安装python
    Windows用户需要手动安装python环境,Ubuntu自带python,所以这步跳过,不用安装,如果需要安装指定版本,则需要去官网下载手动安装,考虑到很多python的库都是基于python 2.7.x编写的,所以没啥大问题我就默认使用python 2.7.6了。

  • 安装IDE
    这个看个人喜好,我安装的是PyCharm 4.5.4,首先需要去官网下载,根据你的系统下载不同的包,下载页面是Download PyCharm。网速不是很好,我是开代理下载的,如果下载太慢,可以去我的百度网盘下载PyCharm 4.5.4 百度云

  • 解压到指定目录:

    1
    tar -xvf pycharm-professional-4.5.4.tar.gz -C /usr/devlop
  • 运行pycharm
    可以在/usr/devlop/pycharm-4.5.4/bin下找到一个脚本pycharm.sh。运行脚本即可,具体方法是:

    1
    2
    cd /usr/devlop/pycharm-4.5.4/bin
    ./pycharm.sh

python基本知识

  • 输出

    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> print 'hello, world'
    hello, world

    >>> print 'The quick brown fox', 'jumps over', 'the lazy dog'
    The quick brown fox jumps over the lazy dog

    >>> print '100 + 200 =', 100 + 200
    100 + 200 = 300

  • 输入

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> name = raw_input()
    Michael

    >>> name
    'Michael'

    >>> print name
    Michael

    >>> name = raw_input('please enter your name: ')
    please enter your name:

    注意: raw_input返回的永远是字符串,也就是说你输入一个int型,返回的是一个数字字符串,你需要进行转换:

    1
    2
    3
    4
    5
    6
    7
    8
    >>> number = raw_input("输入一个整数:")
    输入一个整数:123
    >>> number
    '123'
    >>> number = int(raw_input("输入一个整数:"))
    输入一个整数:123
    >>> number
    123
  • 字符串
    字符串用''或者""括起来,如果字符串内部有或者",需要使用\进行转义

    1
    2
    >>> print 'I\'m ok.'
    I'm ok.

    转义字符\可以转义很多字符,比如\n表示换行,\t表示制表符,字符\本身也要转义,所以\\表示的字符就是\。当然如果不需要转义,可以使用r''

    1
    2
    3
    4
    >>> print '\\\t\\'
    \ \
    >>> print r'\\\t\\'
    \\\t\\

    如果字符串内部有很多换行,用\n写在一行里不好阅读,为了简化,Python允许用’’’…’’’的格式表示多行内容:

    1
    2
    3
    4
    5
    6
    >>> print '''line1
    ... line2
    ... line3'''
    line1
    line2
    line3

    如果写成程序,就是:

    1
    2
    3
    print '''line1
    line2
    line3'''
  • 空值
    python里空值用None表示,相当于Java/C++里的null

  • 变量
    python是动态语言,里面的变量不像Java/C++里,脚本语言都比较宽松,所以代码在声明变量的时候都不需要显示的声明类型:

    1
    2
    3
    4
    a = 123 # a是整数
    print a
    a = 'ABC' # a变为字符串
    print a
  • 常量
    所谓常量就是不能变的变量,比如常用的数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量:

    1
    PI = 3.14159265359

    注意:python中即使这样定义了,也无法阻止你修改常量,可以随便改的,所以这只是个约定,但是最好不要改动。这里有个地方需要注意一下,PI是变量,但是其内容对象是不可变对象,看下面的例子:

    1
    2
    3
    4
    5
    6
    >>> a = 'abc'
    >>> b = a.replace('a', 'A')
    >>> b
    'Abc'
    >>> a
    'abc'
  • 注释

  • 单行注释
    # 后面的内容为注释内容

  • 特殊注释

    1
    #! /usr/bin/python

    告诉Linux/Unix去找到python的翻译器,这样有个好处,脚本可以直接运行,而不用python hello.py这样。

  • 编码注释

    1
    # coding=utf-8

    注意:这个只能放在第二行,多一个空格都不行。

  • doc String注释
    这个东西主要是用于模块、函数和类的描述,类似于下面:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/usr/bin/env python
    # coding=utf-8

    def testDocString():
    """
    测试文档注释
    :return:
    """
    pass

    print testDocString.__doc__

    # 然后在终端中运行一下脚本,看看最后输出内容
    ➜ python ./Comments.py
    测试文档注释
    :return:

可能出现的问题

  • 中文编码问题

# coding = utf-8

结果报错:

SyntaxError: Non-ASCII character ‘/xe6’

所以最后改成了

# coding=utf-8

  • Unicode编码问题
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ➜  ~  python
    Python 2.7.6 (default, Mar 22 2014, 22:59:56)
    [GCC 4.8.2] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> len('中文')
    6
    >>> len(u'中文')
    2
    >>>
    注意: 这个问题是由python编码导致的,详细的编码问题详见字符串和编码,但是在python 3.x中这个编码问题就不存在了:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ➜  ~  python3 
    Python 3.4.0 (default, Jun 19 2015, 14:20:21)
    [GCC 4.8.2] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> len('中文')
    2
    >>> len(u'中文')
    2
    >>>

最常见的还不是编码带来的长度问题不一致,编码主要会导致一些系统异常,常见的有两种:

  • encode(编码)异常

常见的就是UnicodeEncodeError: 'ascii' codec can't encode character u'xxxx' in position xx: ordinal not in range(128),
意思就是把一个字符串编码为str的时候,系统默认是编码成ascii编码格式,但是中文里面的编码超出了ascii编码的最大范围,直接
报错,常见的就是直接掉str()函数的时候没有指定编码。建议少用str()函数,采用xxx.encode('utf8')这种显示的声明

  • decode(解码)异常

道理是一样的,默认也是用ascii解码,如果是中文的话,需要手动指定uft-8解码方式.

初级命令

拉取项目

初次拉取项目也就是克隆项目

1
2
3
4
5
6
7
8
➜  docments  git clone git@repository_url/project_name.git
Cloning into 'project_name'...
remote: Counting objects: 14930, done.
remote: Compressing objects: 100% (5769/5769), done.
remote: Total 14930 (delta 10903), reused 12396 (delta 9013)
Receiving objects: 100% (14930/14930), 127.75 MiB | 11.20 MiB/s, done.
Resolving deltas: 100% (10903/10903), done.
Checking connectivity... done.

注意: git@repository_url/project_name.git就是git服务器上项目的ssh地址
另外项目更新需要用到两个命令:

1
2
git fetch   # 拉取远端数据到本地,不和并
git pull # 相当于git fetch 和 git merge

分支相关

  • 新分支

把项目从服务器上拉取下来之后,一般都需要建立一个自己的分支方便开发,比如新建一个本地test分支

1
➜  data git:(master) git checkout test

注意: 如果你只是想看看项目里的分支代码,不想新建一个分支,有时候拉取的分支可能包括你想要看的分支,这个时候可以按照下面来做:

1
2
3
4
5
6
7
➜  data git:(master) git branch -r
origin/HEAD -> origin/master
origin/init
origin/master
➜ data git:(master) git checkout -b init origin/init
Branch init set up to track remote branch init from origin.
Switched to a new branch 'init'

后面的origin/init可以省略,默认创建本地的init分支上游分支为origin/init.
如果有时候建分支忘了指定本地分支和远端的哪个分支对应,需要设定分支的远端对应分支可以这样,假设我想让我的本地master分支追踪远端的master分支:

1
git branch --track master origin/master	

不过貌似这种方式不推荐了
例如远端有个Python分支,那么想让本地分支追踪远端的Python分支,可以:

1
2
# 将本地的Python和远端仓库origin的Python分支关联
git branch --set-upstream-to=origin/Python Python
  • 删除分支
1
2
git branch -d -r <branch_name>
git branch -D -r <branch_name> # 强制删除
  • 分支重命名
1
2
git branch -m <new_name>	# 重命名当前分支
git branch -m <old_branch> <new_branch> # 重命名指定分支
  • 删除缓存分支

有时候远端的分支已经删除了,使用git branch -a仍然可以看到那些被删除的分支,清除远端分支缓存

1
git fetch origin --prune

提交修改

添加一个新文件,git不会自动跟踪,需要手动

1
2
3
git add file1 file2 file3       # 把file1 file2 file3添加到git索引中
git add . # 把当前项目中的所有文件添加到git索引中,
git commit -am "add thefile" # 添加新文件到本地暂存区

提交代码

1
git push origin test

关于git push使用还有很高级的用法,具体参见git push 详解

忽略文件

编辑项目下的.gitignore文件,添加

1
2
*.txt   # 忽略所有的txt文本文件
dir/ # 忽略项目根目录下dir文件夹里所有的文件

查看变更内容

  • 查看某次提交的修改内容
1
git show commit_id
  • 查看提交历史
1
git log -p -2 # 查看最近两次提交的历史

配置git

1
2
3
4
5
6
7
8
9
10
# 全局配置
git config --global user.name yourname
git config --global user.email emailaddress

# 本地配置,进到具体的项目目录下
git config --local user.name yourname
git config --local user.email emailaddress

# 指定git编辑器
git config --global core.editor vim

Git错误信息汇总

  • git push 出错
1
fatal: The current branch master has multiple upstream branches, refusing to push.

解决办法:

1
➜  git config remote.origin.push HEAD

通过git远端仓库地址拉取项目,结果只有master分支,使用git fetch后没有用,还是没有拉取到其他的分支。

问题定位: 通过git clone获取的远端git库,只包含了远端git库的当前工作分支。如果还想获取其他的分支信息,可以按照以下步骤来。

  • 查看远端分支
1
2
3
4
➜  data git:(master) git branch -r
origin/HEAD -> origin/master
origin/init
origin/master
  • 拉取远端指定分支
1
git checkout -b <本地分支> <远程分支>

例如我想拉取远端的init分支:

1
2
3
➜  data git:(master) git checkout -b init origin/init 
Branch init set up to track remote branch init from origin.
Switched to a new branch 'init'
  • 查看是否成功
1
2
3
➜  data git:(init) ls  
build.sh database pay_shell report UDF userprofile2
cron design README.md shell userprofile

NOTE: 如果本地分支已经存在,则不需要-b参数,远程分支名的名字就是你git branch -r所列出来的,诸如origin/分支名

查了一下资料主要有两种方法:

第一种:network manager设置

这种方法配置比较复杂.并且不能给Android手机和iPhone共享.果断放弃(其实我是尝试过的,真的没有用).

第二种:使用ap-hotspot,亲测可用

这种方法配置简单,用起来也方便。

第一步:安装ap-hotspot

1
2
3
4
$ sudo add-apt-repository ppa:nilarimogard/webupd8
$ sudo apt-get update
$ sudo apt-get install hostapd
$ sudo apt-get install ap-hotspot

第二步:配置ap-hotspot

1
2
3
4
5
6
7
8
9
10
$ sudo ap-hotspot configure
Detecting configuration...
Detected eth0 as the network interface connected to the Internet. Press ENTER if this is correct or enter the desired interface below (e.g.- eth0, ppp0 etc.):
# 确认eth0作为连接网络的网卡(有多个有线网卡可能不同,自己选择),一般就默认回车确认选择
Detected wlan0 as your WiFi interface. Press ENTER if this is correct or enter the desired interface (e.g.- wlan1):
# 确认wlan0作为发射wifi信号的网卡,一般就默认回车确认选择
Enter the desired Access Point name or press ENTER to use the default one (myhotspot):
# 输入你想建的wifi的名字
Enter the desired WPA Passphrase below or press ENTER to use the default one (qwerty0987):
#输入wifi的密码

第三步:启动wifi

1
2
3
$ sudo ap-hotspot start
Starting Wireless Hotspot...
Wireless Hotspot active

正常情况下,Ubuntu 14.04是会一直在Starting Wireless Hotspot...状态的,即新建wifi失败,失败解决方案有下面两种,第一个不行换第二个。

第一次配置无法启动解决方案

  • 无法出现Wireless Hotspot active,并一直保持Starting Wireless Hotspot...

hostapd默认版本有bug
解决方法:移除hostapd:

1
sudo apt-get remove hostapd

然后

  • 64 bit
1
2
3
cd /tmp wget http://archive.ubuntu.com/ubuntu/pool/universe/w/wpa/hostapd_2.1-0ubuntu1.3_amd64.deb
sudo dpkg -i hostapd*.deb
sudo apt-mark hold hostapd
  • 32bit:
1
2
3
cd /tmp wget http://archive.ubuntu.com/ubuntu/pool/universe/w/wpa/hostapd_2.1-0ubuntu1.3_i386.deb
sudo dpkg -i hostapd*.deb
sudo apt-mark hold hostapd

之后需要重新安装ap-hotspot.
如果下载包一直404 not found就去找这里找2.x的deb包下载地址

1
2
3
4
5
出现如下问题:
$ sudo ap-hotspot start
Another process is already running
$ sudo ap-hotspot stop
Wireless Hotspot is not active

解决办法:sudo rm /tmp/hotspot.pid

**NOTE:**另外附上几个常用的命令选项:

1
2
3
4
5
6
7
Usage:    ap-hotspot [argument]

start start wireless hotspot // 打开wifi
stop stop wireless hotspot // 停止wifi
restart restart wireless hotspot // 重启wifi
configure configure hotspot // 配置wifi
debug start with detailed messages // dubug模式打开wifi,会显示一些详细的信息

隐藏SSID

上面讲了这么多,比较复杂,而且这个建的热点还不能隐藏,下面介绍一个比较简单的另一个工具,create_ap项目的github地址:oblique/create_ap
比较强大,主要是看中了他无线可以隐藏的功能,因为公司不让私自建wifi.

安装create_ap

1
2
3
git clone https://github.com/oblique/create_ap
cd create_ap
make install

create_ap使用

  1. 无密码
    1
    create_ap wlan0 eth0 MyAccessPoint
  2. WPA + WPA2加密
    1
    create_ap wlan0 eth0 MyAccessPoint MyPassPhrase
  3. 创建隐藏wifi
    1
    create_ap --hidden wlan0 eth0 MyAccessPoint MyPassPhrase

shadowsocks是目前本人和小伙伴们使用最多的一种,主要是因为GoAgent作者被请去喝茶了。准备工作,需要有配置好的shadowsocks服务端,这个去搜吧,你如果连一个shadowsocks账号也没有,那也没用,现在假定你有个
shadowsocks的服务器账号可以用来作代理。
看官方提供的安装shadowsocks方法

pip install shadowsocks

安装之前可以看下是否有对应的包

1
pip search shadowsocks

如果有就装的了,没有的话只能去github上找源码装了。确实,由于shadowsocks传播的太广,作者也被请去喝茶了,所以github上的原项目也被删了,相关服务器也没了,要装shadowsocks只能像下面这样,首先,你要有项目的源码,地址我的github上备份了一份:shadowsocks github地址,貌似这个地址现在好像也访问不了了,直接去github上搜应该可以搜到。使用git clone下来即可,目前最新的就是2.6.1

接下来,你需要将项目的代码打包安装,命令如下:

sudo python setup.py install

shadowsocks 目录结构
然后编辑服务端配置文件server.json。没有则创建一个这个文件,下面这个是多端口多密码的配置,编辑内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
{
"server":"0.0.0.0",
"local_address":"127.0.0.1",
"local_port":1080,
"port_password":{
"1234":"the fuck password 1234",
"1235":"the fuck password 1235"
},
"timeout":300,
"method":"aes-256-cfb",
"fast_open": false
}

客户端也可以用命令行启动,client.json配置如下:

1
2
3
4
5
6
7
8
9
10
{
"server":"{your vps ip}",
"server_port": 1234,
"local_address":"127.0.0.1",
"local_port":1080,
"password":"the fuck password 1234",
"timeout":300,
"method":"aes-256-cfb",
"workers":1
}

配置照着改,把你的shadowsocks的账号的地址和端口要填对,加密方式看你的账号是啥方式。

服务端启动方式:

1
ssserver -c ./server.json

好了,安装成功并且编辑成功之后,你现在只需要启动终端中的服务进行端口监听就行(没有图形界面还省内存)。

1
sslocal -c ./client.json

成功启动的界面就是下面这样的:
启动代理服务

然后你需要在浏览器里设置代理,注意shadowsockssocks 5代理,所以和vpn还不太一样,默认不是全局代理的,也就是说你的应用
没有办法翻墙,但是浏览器可以。

3、设置浏览器代理,以Chrome为例,火狐也是一样。

由于Chrome的商店被墙了,上不了,你需要手动下载SwitchySharp百度盘地址
手动安装过程:在Chrome浏览器地址栏输入

chrome://extensions/

然后把插件拖到浏览器,安装即可。

安装好之后需要进行规则的设置,在工具栏点插件图标,选择options,如图Proxy Profiles
Proxy Profiles界面
注意SOCKS Host地址和端口设置分别为127.0.0.11080。特别注意要选SOCKS v5。不代理的地址可以加在下面No Proxy for里面。

还需要设置切换规则,也就是哪些特定的地址用代理,哪些不用,这样有个好处,比如你点开国内的不用代理的网站更快,而且有的号是需要流量的,这样还可以省流量,Switch Rules
Switch Rules界面
上面那些地址就是需要代理的,注意选你能用的代理,我这个插件由于开始使用了goagent,导入了goagent的配置文件,所以有三个代理。
但是正是goagentip都不好用,而且人多就卡,非常不稳定,我才决定折腾一下shadowsocks。代理规则可以自己填或者从配置文件导入.具体的配置文件百度盘连接
用法就是在插件的Import/Export选项里,Switch RulesExport Rules List即可。
导入代理规则
手机上的教程就不多讲了,只讲我的android手机配置吧。具体可以取网上搜,也是下一个手机的客户端,在配置文件里配置好你的
手机客户端,我在google play下载的,放心,绝对安全,百度盘地址
安装之后,点左上角,添加配置文件,配置文件界面如下:
安卓代理设置
把你的shadowsocks服务器地址,端口以及密码和加密算法填完就ok。然后点右上角就可以打开了。

搭建博客

本来图片放在本地的文件夹里也可以,但是github还是有存储空间限制的,而且这样也慢,所以用云存储商的云服务来作图床还可以加速,图片也不会丢。
假设你已经搭建好了博客了,如果没有,参照之前的文章来看。

使用七牛运存储

没有账号可以去注册,实名认证之后就可以使用云存储服务了。

  • 新建空间
    新建一个存储空间
    注意: 一定要选公开空间,不然别人访问不到,开始一直没找到外链的链接在哪里,最后发现是自己开始把空间设置成私有空间了。

  • 引用图片
    把图片链接地址放到你想加载图片的地方,图片的地址是:
    图片外链地址

图片显示

虽然这样可以显示了,但是在我的博客里显示的时候,图片特别小,有点儿看不清,后来才发现是七牛的默认设置图片显示尺寸太小,去七牛的控制台里设置自己的样式。
数据处理->图片处理里,点新建图片样式,我把图片的宽度设的很大,这样就基本可以保持很清晰的图片样式了。
新建图片样式

Ubuntu 14.04 安装jdk

根据自己的系统下载对应的压缩包,我的是Ubuntu 14.04,需要下载的是jdk-7u40-linux-x64.tar.gz。具体地址去oracle官网。

  • 解压压缩包:

tar -xvf jdk-7u40-linux-x64.tar.gz

新建一个目录,将解压的文件移动到该目录中

mkdir /usr/java
sudo cp -a jdk1.7.0_40/ /usr/java/

进入vi编辑器,编辑环境变量

vi ~/.bashrc

**NOTE:**如果你还装了其他的shell,比如我装的是oh-my-zsh,那么需要修改对应的文件而不再是.bashrc,而是.zshrc

在最后加入以下内容

export JAVA_HOME=/usr/java/jdk1.7.0_40
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

注意: 等号之间不要有空格,否则会出错
最后还需要更新一下

source ~/.bashrc

好了,在终端中可以测试一下jdk是否安装成功了

java -version

输出结果为

java version “1.7.0_40”
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)

至此,jdk就安装好了。

安装Git

首先测试一下电脑安装git没有

1
git --version

没有安装则按照以下步骤来

1
sudo apt-get install git-core git-gui git-doc gitk

安装完毕看看是否安装成功,如果安装成功的版本低于1.9.5则说明Ubuntu版本太低,进行如下操作

1
2
3
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git

安装成功之后再次测试,版本就应该是比较高了。

以上安装的是git,但是没有图形化界面,如果需要图形化界面,需要安装工具KDiff3

1
sudo apt-get install kdiff3

安装好以上几个基本的组件之后,还需要做一些简单的配置

1
2
3
4
5
6
7
8
git config --global user.name "san.zhang"            # 请换成你自己的名字,除非你凑巧也叫san.zhang
git config --global user.email "san.zhang@qq.com" # 同上
git config --global merge.tool "kdiff3" # 要是没装KDiff3就不用设这一行
git config --global push.default simple # 要是你非要用低版本的`Git`(比如1.7.x),好吧,那就不设`simple`设`current`,否则你的`Git`不支持
git config --global core.autocrlf false # 让Git不要管Windows/Unix换行符转换的事
git config --global gui.encoding utf-8 # 避免git gui中的中文乱码
git config --global core.quotepath off # 避免git status显示的中文文件名乱码
git config --global core.editor nano # 辑器,默认是vim,但是可以自己配置成其他的,可以使用nano

设置SSH

如果要跟Git服务器打交道,还要设ssh。注意,不要在跳板机等Ops/IT已经为你设了ssh key pair的地方做下面的操作。
注意,少数童鞋如果以前为连接GitHub/oschina等已经生成过ssh key pair,这里不必再次生成,复用即可。
Linux的命令行下,或WindosGit Bash命令行窗口中(总之不要用iOS),键入:

1
ssh-keygen -t rsa -C "san.zhang@qq.com"

然后一路回车,不要输入任何密码之类,生成ssh key pair。如果在Linux上,需要把其中的私钥告诉本地系统:

1
ssh-add ~/.ssh/id_rsa

再把其中公钥的内容复制到Git服务器上。具体方法是:
显示ssh公钥的内容

1
cat ~/.ssh/id_rsa.pub

密钥内容如下:

1
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCE6avWtobESaS6nngDJnLFPPHZ+enhp+twpRw/t+9uaM/IFRhgP8YO09jG4Vdq8h5tzUe+ijM4b/rtVNAROCngkegrefopMwcqVNxQiFP/9Dl67/qOxorcYWhizQLjIzAdQxMGoNTebozjbLElWLO1pramWaK+nqO1PQL13olUinZa1Hxhv3XTCpODoPdz1woyVfYaPu4knjODQp2E3aawtmeZ5A7EJP7696XWi1tjK44iMWwZMWTOYbSGTyXq62xT5YfVmQFwxhG5tJYD6h27R65b0/WKOM7Y8cwVmo9RqpgFRJ5EPd42Fr6pjyBkPOGpVQkUn+V/GVpKrC+LWIJ san.zhang@qq.com

打开Github网页,具体位置自行百度。点击Add SSH Key,然后把刚才ssh公钥id_rsa.pubwindows下的用户目录找到.ssh文件夹进去就可以看到)的内容paste进去。不需要填titletitle会自动生成。
要是Git服务器报“不是有效的key”之类的错误,可能是你没去除注意去除多余的回车符,也可能是paste之前copy的时候,没copy最开头的ssh-rsa这几个字。

首先下载maven

tar -xvzf apache-maven-3.0.5-bin.tar.gz

把压缩包就放在当前解压目录,或者放到制定目录

cp -r apache-maven-3.0.5 /usr/xxx/

现在已经创建好了一个Maven安装目录apache-maven-3.0.5,虽然直接使用该目录配置环境变量之后就能使用Maven了,但推荐做法是,在安装目录旁平行地创建一个符号链接,以方便日后的升级:

sudo ln -s apache-maven-3.0.5 apache-maven

查看一下是否成功
查看链接是否创建

  • 编辑环境变量

vi ~/.bashrc

在文件末尾加入以下内容

1
2
export M2_HOME=/usr/xxx/apache-maven
export PATH=$PATH:${M2_HOME}/bin

更新一下文件,然后再测试是否成功

1
2
3
4
5
6
7
8
​➜  xxx source ~/.bashrc
➜ xxx mvn -v
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 21:51:28+0800)
Maven home: /usr/xxx/apache-maven
Java version: 1.7.0_40, vendor: Oracle Corporation
Java home: /usr/xxx/jdk1.7.0_40/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.13.0-32-generic", arch: "amd64", family: "unix"

在用户目录~/.m2目录下,添加settings.xml,内容如下:
其中最关键的看第29行和第44行,定义了两个仓库,分别是jar包仓库和插件仓库,这样在公司内网下载jar包就非常快

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
<?xml version="1.0"?>
<settings xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>snapshots</id>
<username>snapshots</username>
<password>g2Dki6XCfhi48Bnj</password>
<filePermissions>664</filePermissions>
<directoryPermissions>775</directoryPermissions>
</server>
<server>
<id>releases</id>
<username>{username}</username>
<password>{yourpwd}</password>
<filePermissions>664</filePermissions>
<directoryPermissions>775</directoryPermissions>
</server>
</servers>
<profiles>
<profile>
<id>local</id>
<repositories>
<repository>
<id>xxxNexus</id>
<url>http://svn.xxx.xxx.com:8081/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
<!-- always , daily (default), interval:X (where X is
an integer in minutes) or never.-->
<updatePolicy>daily</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>xxxNexus</id>
<url>http://svn.xxx.xxx.com:8081/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
<checksumPolicy>warn</checksumPolicy>
</releases>
<snapshots>
<updatePolicy>always</updatePolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>local</activeProfile>
</activeProfiles>
</settings>
0%