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的自动完成,有自动完成的别名才有意义。

MySQL notes

MySQL 备忘,已经用到的一些命令,方式信马游缰。一句话总结:那些我用到的MySQL语句。

MySQL

shell登录,‘-u’用户‘root’;‘-p’需要密码。
1
$ mysql -u root -p

New db

  • Create database

    1
    create database db_name;
  • Add user

    1
    2
    insert into mysql.user(Host,User,Password) \
    values("localhost","user_name",password("user_password"));
  • Show user

    1
    select user,host,password from mysql.user; 
  • Add permission

    1
    2
    3
    grant all privileges on db_name.* to \
    user_name@localhost identified by 'user_password';
    flush privileges;
  • Show permission

    1
    show grants for user_name@'localhost';
  • Alter character (utf-8)

    1
    alter database db_name default character set = utf8;
  • Recommend create

    1
    CREATE database db_name DEFAULT CHARACTER SET utf8;

Other

  • foreign_key_checks

    一对好基友
    1
    2
    3
    set foreign_key_checks = 0;
    $_do_some_command;
    set foreign_key_checks = 1;
  • show databases

    1
    show databases;
  • use databases

    1
    use db_name;
  • truncate table

    清空表中所有内容,结构不变化:
    1
    truncate table table_name;
  • drop table

    销毁表,结构不复存在:
    1
    drop table table_name;
  • update

    1
    update db_name.table_name set column_name = new_value where id>0 and your_where

    id>0 我是被那个safe update逼的。

End: 本文仅总结了我用到的一些语句。

注:代码命令中含有_的,很多时候是需要你修改的。但也有不是的,如set xx_xx = 0,你需要修改0 or 1

and & or

Python 的bool运算 and & or,但运算结果不是单纯的False或者True,无疑结果是对的。一句话总结:用最少的运算,保留更多的信息,保证正确的结果。

Documentation

Operation Result Notes
x or y if x is false, then y, else x 运算是短路的
x and y if x is false, then x, else y 运算是短路的

关于短路

print None and None[0]没有报错,正常打印出None。(None[0]会报TypeError错)

bool ? x : y运算

由于python的bool运算保留了更多信息,所以可以实现上述三目运算。

三目运算

三目运算是这样的,可是存在一个误区!
bool and x or y

误区,当x为假时,永远返回y。

修正上述误区:((test and [x]) or [y])[0]采用了x为假时,[x]为真(避免上述误区),然后[0]索引求值。

还有种简洁的写法:(y, x)[bool] 其中x,y是反的,用bool索引求值。

上面涉及了两个值,网上还有三个或更多值的,我就不多少了,也不建议去搜。ugly

技巧VS陷阱

我认为,这个既算不上技巧,也不能称为陷阱。

python实现三目运算还是用x if bool else y,从看着到结果都比较顺眼。当然适当的使用and & or保留值的特性也是可以的,主要是你要明白你写的是什么。

写代码,自己要明白,还要让看的人明白。

(看的人也要知道自己看的是python)