come back

我想家了,从大学开始,我距离家跨好几个省,在外边过的还算适应,一切也还好。工作后每年回一次家,可是就回这一次家,火车票买不到,我不得不考虑下在家附近工作了…

Compare

最近陷入深深的矛盾中,平时休息离家太远压根不可能想回家,过年一般也就七八天假,难得有一次要回家,可恶的12306,我没用任何刷票软件,我只是没有用IE罢了。我做好了一切准备,或许只是因为我准备了,换来了12306的“非法提交”,然后没然后了,我只是有点儿再也不想抢长途火车票的想法了…

无可否认上海很不错,但我决定回家了,回家是不需要理由的,但:

  • 过年时节,再也不用受12306的气了
  • 到家那天,算好的是母亲生日
  • 让父母享受下现代科技,和远嫁连云港的姐姐视频聊天
  • 放假时节,想回家就到家了…

总结

短短一年时间,辞职两次,一次为了Linux,一次为了回家。裸辞两次,裸辞是一种态度——心无旁骛

learn linux

许多尝试过Linux过的,说起Linux总是一堆问题,外加一堆不习惯。我厌倦了Windows,尤其是中国特色下的 Windows,厌倦了杀毒软件,厌倦了盗版软件,所以决定换Linux。在换Linux的过程中,不能说没有问题,但基本是一帆风顺的,所以计划写本文。

How to learn Linux?

说实话,我学Linux(Ubuntu)并不久,不敢妄言怎么去学Linux,只是分享下我是怎么学Linux的。

No VMs

不要用虚拟机,也不建议刚装Linux,在Linux下装虚拟机装Windows。虚拟机的性能会大打折扣,虚拟机下优盘挂载、共享文件、屏幕大小等也不是一开始就合适的,所以不建议使用虚拟机。

Ubuntu支持wubi.exe,但我推荐最好是全新安装,安装一个系统最好,双系统也还好。

Habit

不要说什么不习惯,我想说和Windows不一样就对了,本身就不是Windows。声明下,不要提到Linux就是命令行,图形界面已经很成熟了。Linux下可以说没有不能改的,同时Linux发行版众多,和Windows习惯相同的也是有的。

Install

我推荐全新安装Linux,但是安装盘有时候并不是那么好制作,Windows下有名的工具UltraISO,并不能制作可用的Ubuntu启动U盘。不过制作好的Linux LiveCD功能可是相当强大的,Windows下工具也是有的:UNetbootin && Live USB Creator

看到这里,我建议有机会搞个LiveCD启动下玩玩。(注意备份资料,误操作全新安装会丢失硬盘数据),进入Linux后很多安装都是图形化的(如Ubuntu,SUSE,Debaian,Fedora,LinuxMint…),保留以前系统的,务必选择高级,自定义分区,不会破坏现有系统和引导的。

Guide

学习Linux,最好有本书作为指导,指导方向。版本选择可以选和书一致的,不过新几个版本也没有问题。建议:用长期支持的稳定版本!

SoftWare

软件安装尽量直接用软件中心的图形话界面,初学请避免编译安装。编译安装很好很强大,但是有不少人死在了无尽的编译中。

Linux下软件很丰富,可是你用的不一定有,有些游戏真的不能玩,但是Linux下有游戏,有不少游戏。举个例子,迅雷没有,可是同类的下载软件有一堆…

QQ

很多没有QQ就活不了的,我想说:你想用的QQ真不怎么有,虽说Linux下有解决方案,可是问题不是Linux,问题是永远不会是第一腾讯!!!

Linux下最直接的是WebQQ, 然后是Pidgin+lwqq插件,然后还有Wine和收费版的Wine:CrossOver

总结

想学Linux的就勇敢去学,失败的人总是在找借口,成功的人总是在找方法。

git_rename

Why

项目多了,难免会有重命名的时候,重命名本身没什么问题,可是加上gitignore中的*.pyc*~可能会出现些问题…

Q

重命名的时候一般不会有问题,可是在分支切换的同时,由于存在ignore的文件,分支的切换并不会那么正确。
往往会多出重命名前或重命名后的文件夹,多的原因就是文件夹下有被忽略的临时文件。

原因很简单,所以解决也不难,删除多余的文件夹,一切正常了。

总结

git在重命名文件夹后切换分支可能由于ignore临时文件的存在多出重命名前后的文件夹。

slice

“不会slice,绝不能说会python”,slice的重要性不言而喻。

Basis

  • index start with 0
  • support negtive index
  • [included:excluded:step] eg: [:], [::-1]
  • work with list, tuple and string

step

Ipython 中的示例
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
In [1]: e = range(6)

In [2]: e
Out[2]: [0, 1, 2, 3, 4, 5]

In [3]: e[:]
Out[3]: [0, 1, 2, 3, 4, 5]

In [4]: e[6]
IndexError

In [5]: e[5]
Out[5]: 5

In [6]: e[:5]
Out[6]: [0, 1, 2, 3, 4]

In [7]: e[:6]
Out[7]: [0, 1, 2, 3, 4, 5]

In [8]: e[::-1]
Out[8]: [5, 4, 3, 2, 1, 0]

In [9]: e[6:0]
Out[9]: []

In [10]: e[6:0:-1]
Out[10]: [5, 4, 3, 2, 1]

In [11]: 0 in e[6:0:-1]
Out[11]: False

In [12]: e[5:0:-1]
Out[12]: [5, 4, 3, 2, 1]

In [13]: e[5:0:-1] == e[6:0:-1]
Out[13]: True

In [14]: e[-1:-7:-1]
Out[14]: [5, 4, 3, 2, 1, 0]

In [15]: e[-1:-7:-1] == e[::-1]
Out[15]: True

In [16]: e[-1:-9:-1]
Out[16]: [5, 4, 3, 2, 1, 0]

In [17]: e[::-2] == e[-1:-7:-2]
Out[17]: True

In [18]: e[::-2] == e[-1:-8:-2]
Out[18]: 'Just do IT'
  • e[::-1] == e[-1:-7:-1]
  • slice切片中索引可以超出实际范围
  • 带有步长的切片,索引顺序和步长方向一致
  • 切片总是新产生一个对象,而不是改变原有对象

总结

Just do IT

mailcap

Tencent === Trash,微云下载的文件总是用gedit打开,firefox如是说。有谁能想到,腾讯微云下载的文件有着一样错误的Content-Type: "application/octet-stream"

The Way to fix it

Ubuntu 下,命令行执行:

1
echo 'application/octet-stream; nautilus --no-default-window --no-desktop %s; test=test -n "$DISPLAY"' >> ~/.mailcap

其实就是向家目录下.mailcap文件追加上述命令单引号内中的内容。(文件不存在则新建)

reason

微云下载文件时,HTTP Response headers,中使用了不是Trash不可能使用的Content-Type: "application/octet-stream",这是什么鬼文件,系统说他不认识,你试试gedit吧。

上面的解决方法是,application/octet-stream类型的文件用nautilus打开(在文件夹中显示),之所以没有定义到确定的应用,因为我常用的有zip和pdf两种,只好折中使用nautilus了。

总结

firefox中下载的文件总是用gedit打开,我气愤不止一次了。我用Linux,为什么用QQ,因为有人用QQ,为什么是微云,因为有用QQ发的文件,我只好借用微云,然后浏览器下载下来。

感谢IRC: Cork

tuple change?

在python中元组tuple是不能改变的,列表和字典是可以改变的。

change

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
In [1]: l = [1, 2]

In [2]: d = {'a':'aaa', 'b':'bbb'}

In [4]: t = (l, d)

In [5]: t
Out[5]: ([1, 2], {'a': 'aaa', 'b': 'bbb'})

In [7]: l.pop()
Out[7]: 2

In [8]: t
Out[8]: ([1], {'a': 'aaa', 'b': 'bbb'})

In [9]: l.append(3)

In [10]: t
Out[10]: ([1, 3], {'a': 'aaa', 'b': 'bbb'})

总结

上述,元组的项目是列表,改变了列表。元组有没有改变,自己掂量吧…

4>3>2

在我看来,python不仅是程序,还是艺术。

4>3>2

1
2
In [1]: 4>3>2
Out[1]: True

懂程序的都知道,4>3 and 3>2不能写成4>3>2(4>3求值后是True,也就是1)。可是他们不懂python,4>3>2学过数学的都知道,对的就是对的啊。python推荐这么写,这么写效率更好。

push -f

不要用root用户,不要用force参数,这都是老生常谈的话题了。
权利越大,责任越大,可是总是有人使用…

git push -f

实话是说,使用force闯祸了…
git提交的多了,难免有些错误想要去掉,干净的提交履历确实好看,也更容易表明做了些什么。
一行代码,第一次改错了,push到master分支了,就一行。(就一行,唯一的一行,所以唯一的一次没有另开分支。)
所以我就回退了一个版本,重新修改force提交了,按说也没有多少问题,可是CI(持续集成),拉到了那个错误提交的版本,然后无法拉到其它更新的版本了…

FiX IT

首先我想的是,恢复出那个版本。习惯性的新开分支,锁定到第一次错误提交后的那个版本,然后修改,然后pull request。那个版本出现了,不是孤立的了,可是CI仍然不能拉到更新的版本。。。

reset

重新来,新开分支,reset一堆修改,然后pull request。“改或者不改,CI的版本就在那里,不增不减。”

最后,我大师出马了。。。危难时刻还是有大师好啊…

总结

自我总结,本次Fix失败,主要原因是一直新开分支,采用了错误的方法。丢失了原本该有的胆识,不过话说回来,master分支搞错是会死人的。(虽说git仓库还是容易恢复,不易于被恶意破坏)
解铃还须系铃人,force闯的祸,应该用force去修复,最后感谢大师。

Which fm

身为程序猿,带耳机早已成为习惯,什么歌曲真心无所谓,只是带耳机的同时,和外界相对隔离起来。

Radio/fm

Linux 下有款软件:Guayadeque,自带好多电台,我的是1.2W+,如果不够我再提供个网址shoutcast,如此多的电台,不怕没有我爱听的。

jing.fm

jing 据说是一款小众的电台,据说刚要发展就被抄袭的电台。所以我还是觉得支持下小众。
jing 传说的强项之一就是,自然 话语言搜索,我尝试了下工作编程之类的没有结果,然后试了下codingdebug这两个奇葩分别对应一两首奇葩歌曲,这是耍我么???
jing有个很严重的毛病,至少我是这么认为,经常性自己暂停!

kugou.com

  • kugou.fm 打开内容是奇葩的 douban.fm (此处指 kugou.com –> 电台)
    电台就那么99个,同样的电台同样是重复,只有99个电台,总是重复。
    你重复,我只好换了。

douban.fm

经常莫名的插播广告,声音广告那种。点击不再播放,会误杀一首歌曲。
我评价:垃圾货一个!整个douban都是。

fm.baidu.com

我是骨粉,从来没觉得百度好过。百度的电台实在不咋地,给你看一个品质设置,故意给你看个低品质。
一副自以为很牛的样子,牛到谷歌搜的都是百度搜索的自页面,牛到打开页面都是百度转码的符合手机的版本。
俺浏览器支持手机,也是俺的错么。百度统计,会在左上角爆出百度的ico。

借用我家大师的话:百度===垃圾中的战斗机
@2014-11-03,用百度音乐盒听几首新歌,然后弹窗了个百度音乐人广告,点击空白不消失,点击ESC也不行,丫的想去地狱么?你当我不会关闭标签页么!
@2014-11-03,MD fm也来广告了,能嵌入弹窗推广,你丫还有什么不能,终生不用!!!

另,百度的一键存到百度云没有了,默认都在云音乐,so批量下载没有了,不是会员别想来。。。

总结

戴上耳机,听着Radio,Coding…

bash

my bash

声明

本文不是介绍bash的,当然也不含有bash历史,本文写的很随意,如果你不喜欢这些,请移步。
有高见,欢迎来IRC: /join #zh-cn

PS1

整一个个性的提示符PS1,我的提示符:
^_^:~$

export PS1=”[\e[00;37m]\n[\e[0m][\e[00;34m]^_^[\e[0m][\e[01;31m]:[\e[0m][\e[00;36m]\w[\e[0m][\e[01;33m]\$[\e[0m][\e[00;37m] [\e[0m]“

点击上面的提示符 or bashrcgenerator,定制一个属于自己的提示符吧。
使用该提示符,将生成的代码复制粘贴到~/.bashrc文件即可。(其实是export一个常量PS1,所以有必要放在PS1赋值的后边,以便生效。)

唤醒历史命令补全

将下述代码复制粘贴到~/.bashrc文件,然后输入部分命令再使用上下键试试。

bind ‘“\e[A”: history-search-backward’

bind ‘“\e[B”: history-search-forward’

控制命令$?

  • ;: 组合多个命令,按循序执行。
  • &: 使命令开启一个子Shelll并在后台执行。
  • &&: 前面命令成功后,执行后边命令。
  • ||: 前面命令执行失败后,执行后边的命令。

重定向

  • >: 重定向输出。(新建,会覆盖)
  • >>: 重定向追加输出。(追加,会新建)
  • <: 重定向输入,一般从文件读入等。
  • <<: << "str",重定向输入,遇到str自动结束。
  • |: 管道,不解释了。*****五星级。

  • 标准输入(stdin):代码为0,0< or 0<<
  • 标准输出(stdout):代码为1,1> or 1>>
  • 错误输出(stderr):代码为2,2> or 2>>
  • eg: COMMAND &>/dev/null & or COMMAND 1>/dev/null 2>&1 & # 重定向输入,并后台运行。

.bashrc at Ubuntu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
alias ga='git add'
alias gb='git branch'
alias gc='git commit'
alias gd='git diff'
alias gf='git fetch'
alias gl='git log'
alias gs='git status'
alias go='git checkout'

export PS1="\[\e[00;37m\]\n\[\e[0m\]\[\e[00;34m\]^_^\[\e[0m\]\[\e[01;31m\]:\[\e[0m\]\[\e[00;36m\]\w\[\e[0m\]\[\e[01;33m\]\\$\[\e[0m\]\[\e[00;37m\] \[\e[0m\]"

. /usr/share/bash-completion/completions/git # about my git completions
__git_complete ga _git_add
__git_complete gb _git_branch
__git_complete gc _git_commit
__git_complete gd _git_diff
__git_complete gf _git_fetch
__git_complete gl _git_log
__git_complete go _git_checkout

经过一番折腾,激活了git的自动完成,有自动完成的别名才有意义。