#125 看《过年好》的感受

2016-03-07

看了盗版电影,我有罪...

刚看了赵本山、闫妮的《过年好》,挺好的,本来赵本山那一伙人一出现就是烂片的印象被打破了。

一直忘不掉那个画面,妈妈(闫妮)和女儿吵架,姥爷(赵本山)在一旁默默的灌酒~

还有,那个好像有点傻的、一直在唱《一人我饮酒醉》的小天。

...

不过,为什么看海报上看起来好像是被当做是贺岁片在宣传呢?

和张国立、姚晨主演的《一切都好》类似的主题,本来都可以往文艺方向走的。

可能是文艺片在国内票房没市场吧,请来大腕拍电影,肯定是要算投资回报的。在年底的票房蛋糕中圈尽可能多的钱才是投资方的目标。明显,包装成贺岁片才能实现这个目标。

一人我饮酒醉
醉把那佳人成双对
两眼是独相随
我只求他日能双归

#124 Excel 技巧

2016-02-20

Excel 文件 > Sheet > 行和列

基础

  1. !Sheetname
  2. [filename]
  3. 引用
    1. =A1 相对引用
    2. =$A$1 绝对引用
    3. 混合地址引用
      1. =A$1 列相对引用+行绝对引用
      2. =$A1 行相对引用+列绝对引用
    4. 按 F4 依次切换引用方式
    5. =A1:F8
  4. +-\*/()
  5. 搜索
    1. ? 单个字符
    2. * 多个字符
  6. 字符串
    1. 第一个字符单引号表示数据为文本类型,表格左上角会有一个绿色三角标识
      1. 鼠标右键菜单中可以选:转换成数字
    2. =A1&B1 字符串连接

常用函数

  1. NOW
  2. SUM 求和
  3. SUMIF
  4. SUMIFS
  5. AVERAGE 平均值
  6. COUNT
  7. COUNTIF
  8. VLOOKUP
  9. SUMPRODUCT

小技巧

  1. 斜线表头
    单元格格式 > 边框 > 斜线
    表格内输入右上角内容,然后换行,再输入左下角内容,然后用空格来调整位置,对齐。
  2. 冻结窗格
  3. Alt + Enter 换行
  4. Ctrl + ; 输入日期
  5. Ctrl + Shift + ; 输入时间
  6. 填充柄
    1. 选中单元格,拖动填充柄:顺序填充
      1. 加 Ctrl:复制填充
    2. 双击填充柄:顺序填充到对齐旁边的列
      1. 加 Ctrl:复制填充到对齐旁边的列
  7. 选中行/列,按 Shift 拖动,可以更改位置

参考资料与拓展阅读

#123 中国省级行政区

2016-02-10

  • 华北地区
    • 北京市 ()
    • 天津市 ()
    • 河北省 ()
    • 山西省 ()
    • 内蒙古自治区 ()
  • 东北地区
    • 辽宁省 ()
    • 吉林省 ()
    • 黑龙江省 ()
  • 华东地区
    • 上海市 ()
    • 江苏省 ()
    • 浙江省 ()
    • 安徽省 ()
    • 福建省 ()
    • 江西省 ()
    • 山东省 ()
  • 华中地区
    • 河南省 ()
    • 湖北省 ()
    • 湖南省 ()
  • 华南地区
    • 广东省 ()
    • 广西自治区 ()
    • 海南省 ()
  • 西南地区
    • 重庆市 ()
    • 四川省 ()
    • 贵州省 ()
    • 云南省 ()
    • 西藏自治区 ()
  • 西北地区
    • 陕西省 ()
    • 甘肃省 ()
    • 青海省 ()
    • 宁夏自治区 ()
    • 新疆自治区 ()
  • 港澳台地区
    • 香港特别行政区 ()
    • 澳门特别行政区 ()
    • 台湾省 ()

一共 34 个省级行政区:

  • 23 个省
  • 5 个自治区:内蒙古,新疆,西藏,宁夏,广西
  • 4 个直辖市:北京,天津,上海,重庆
  • 2 个特别行政区:香港,澳门

河北 河南
湖北 湖南 江西
广东 广西 福建 海南
山东 山西
辽宁 吉林 黑龙江
新疆 西藏 内蒙古
陕西 甘肃 青海 宁夏
四川 重庆
贵州 云南
江苏 浙江 安徽
香港 澳门 台湾
北京 天津 上海

#122 MySQL 索引

2016-02-08
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
    [index_type]
    ON tbl_name (key_part,...)
    [index_option]
    [algorithm_option | lock_option] ...

key_part:
    col_name [(length)] [ASC | DESC]

index_option: {
    KEY_BLOCK_SIZE [=] value
  | index_type
  | WITH PARSER parser_name
  | COMMENT 'string'
}

index_type:
    USING {BTREE | HASH}

algorithm_option:
    ALGORITHM [=] {DEFAULT | INPLACE | COPY}

lock_option:
    LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}

功能类型

  • 主键索引(PrimaryKey)
  • 唯一索引(UNIQUE)
  • 普通索引(KEY)
  • 全文索引(FULLTEXT)
  • 空间索引(SPATIAL)

算法类型

  • B-Tree
  • Hash
  • R-TREE(空间索引使用)
  • 倒排索引(Inverted Index,全文索引使用)

聚簇索引 Clustered Index

聚簇索引(Clustered Index)是一种特殊的索引类型,它决定了表中数据的物理存储顺序。
在聚簇索引中,数据行按照索引键的顺序存储在磁盘上,因此具有相邻的物理位置,这样可以提高查询效率。
聚簇索引只能有一个,因为它决定了表中数据的物理存储顺序,如果有多个聚簇索引,就会导致数据在磁盘上存储的位置不确定,影响查询效率。

其他索引叫二级索引(Secondary Index),或者辅助索引。

对于 InnoDB,有限使用主键做聚簇索引,其次找一个不含 NULL 值的唯一索引,还没有,就自动生成一个隐式的自增型 ROW_ID 字段(BIGINT UNSIGNED)做聚簇索引 GEN_CLUST_INDEX。

注意:所有索引在提升查询效率的同时,都会影响插入和删除的性能。尤其是聚簇索引需要重新组织数据行的物理存储顺序

#121 Python tempfile

2016-02-03
import tempfile
import time

timestr = time.strftime("%Y%m%d%H%M%S")

临时文件

# tempfile.mktemp(suffix='', prefix='tmp', dir=None)
# tempfile.mkstemp(suffix=None, prefix=None, dir=None, text=False)

filepath_temp = tempfile.mktemp(suffix='.html', prefix='.cache_%s_' % timestr)
print(filepath_temp)
# /tmp/.cache_20210929205452_zlmi3pkf.html

filepath_temp = tempfile.mktemp(suffix='.html', prefix='.cache_%s_' % timestr,
                                dir='/opt/apps/markjour/tmp/')
print(filepath_temp)
# /opt/apps/markjour/tmp/.cache_20210929205452_mcr7nj3e.html

filepath_temp = tempfile.mkstemp(suffix='.html', prefix='.cache_%s_' % timestr, text=True)

mkstempmktemp 的区别:mkstemp 返回一个文件描述符,mktemp 返回一个文件路径。
mktemp 返回的路径理论上会被另一个进程使用,所以这是 UNSAFE 的,应该用 mkstemp 代替。
mktemp 从 Python 2.3 开始标记为 Deprecated,但是至今还是可以调用。

临时目录

# tempfile.mkdtemp(suffix=None, prefix=None, dir=None)
dirpath_temp = tempfile.mkdtemp()
print(dirpath_temp)
# /tmp/tmp1dj2cl0d

dirpath_temp = tempfile.mkdtemp(prefix='build_',
                                dir='/opt/apps/markjour/tmp/')
print(dirpath_temp)
# /opt/apps/markjour/tmp/build_9k5synh5

#120 Python zipfile

2016-02-02
import zipfile
import os

zip_path = "/path/to/zip/file.zip"
extract_path = "/path/to/extract/directory"

if not os.path.exists(extract_path):
    os.makedirs(extract_path)

with zipfile.ZipFile(zip_path, 'r') as fp:
    # 直接解压
    zip_ref.extractall(target_dir)

    # 逐个解压
    for filename in fp.namelist():

        # 如果文件存在就先移除,避免 FileExistsError
        extract_file_path = os.path.join(extract_path, filename)
        if os.path.exists(extract_file_path):
            # print("跳过解压缩文件:", filename)
            # continue
            os.remove(extract_file_path)

        # 解压,会自动创建目录结构
        fp.extract(filename, extract_path)

#119 Linux 文件描述符

2016-02-01

文件描述符

File Descriptor

“一切皆文件” 设计思想来自早期 Unix,这是现在 Unix/Linux 界的一个非常重要的概念(根据 Plan9 操作系统的相关资料,这一条没有得到彻底的贯彻)。

允许打开的最大文件数

系统限制

cat /proc/sys/fs/file-nr
# 17781 0   9223372036854775807
# 已分配, 已使用, 最大值

cat /proc/sys/fs/file-max
# 9223372036854775807

sudo sysctl -a | grep file
# fs.file-max = 9223372036854775807
# fs.file-nr = 17813    0   9223372036854775807

修改:

echo 100000000 > /proc/sys/fs/file-max
sysctl fs.file-max 100000000

进程限制

# ulimit 是一个 Shell 内建命令
ulimit -a       # 输出所有的相关限制
ulimit -n       # 当前进程的最大打开文件数
ulimit -n 10240 # 修改当前进程的最大打开文件数

ps -ef | grep sshd | grep -Fv 'grep '
root        1080       1  0 10月16 ?      00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
sudo ls -l /proc/`pgrep sshd`/fd
总用量 0
lr-x------ 1 root root 64 10月 17 12:04 0 -> /dev/null
lrwx------ 1 root root 64 10月 17 12:04 1 -> 'socket:[25487]'
lrwx------ 1 root root 64 10月 17 12:04 2 -> 'socket:[25487]'
lrwx------ 1 root root 64 10月 17 12:04 3 -> 'socket:[28674]'
lrwx------ 1 root root 64 10月 17 12:04 4 -> 'socket:[28676]'

/etc/security/limits.conf

echo "* soft nofile 65535" | sudo tee -a /etc/security/limits.conf
echo "* hard nofile 65535" | sudo tee -a /etc/security/limits.conf

系统会根据 /etc/pam.d/login 中的 PAM 配置来为登录用户设置,
如果配置了 session required /lib/security/pam_limits.so, 就会加载 /etc/security/limits.conf 设置用户的各种限制值。

<domain>        <type>  <item>  <value>
  1. domain
  2. a user name
  3. a group name, with @group syntax
  4. the wildcard *, for default entry
  5. the wildcard %, can be also used with %group syntax, for maxlogin limit
  6. NOTE: group and wildcard limits are not applied to root.
    To apply a limit to the root user, must be the literal username root.
  7. type
  8. "soft" for enforcing the soft limits
  9. "hard" for enforcing hard limits
  10. item
  11. core - limits the core file size (KB)
  12. data - max data size (KB)
  13. fsize - maximum filesize (KB)
  14. memlock - max locked-in-memory address space (KB)
  15. nofile - max number of open file descriptors
  16. rss - max resident set size (KB)
  17. stack - max stack size (KB)
  18. cpu - max CPU time (MIN)
  19. nproc - max number of processes
  20. as - address space limit (KB)
  21. maxlogins - max number of logins for this user
  22. maxsyslogins - max number of logins on the system
  23. priority - the priority to run user process with
  24. locks - max number of file locks the user can hold
  25. sigpending - max number of pending signals
  26. msgqueue - max memory used by POSIX message queues (bytes)
  27. nice - max nice priority allowed to raise to values: [-20, 19]
  28. rtprio - max realtime priority
  29. chroot - change root to directory (Debian-specific)

#118 Git: 远程引用不存在

2016-01-31

删除远程分支时报错:

git push --delete origin new
error: 无法删除 'new':远程引用不存在
error: 无法推送一些引用到 'gitee.com:markjour/django-admin'

如果是英文环境就是报:

git push --delete origin new
error: unable to delete 'new': remote ref does not exist
error: failed to push some refs to 'gitee.com:markjour/django-admin'

一般是这个分支已经被别人删除了。

Solution

git branch -d -r origin/new

#117 转载:SSL, SSH, OpenSSH, OpenSSL 有什么区别

2016-01-30

我仔细阅读原文,然后按照理解对原文做了重新整理。

  1. SSL 是通讯链路的附加层。可以包含很多协议。HTTPS, FTPS, .....

SSL 是一种国际标准的加密及身份认证通信协议,您用的浏览器就支持此协议。
SSL(Secure Sockets Layer)最初是由美国 Netscape 公司研究出来的,后来成为了 Internet 网上安全通讯与交易的标准。
SSL 协议使用通讯双方的客户证书以及 CA 根证书,允许客户/服务器应用以一种不能被偷听的方式通讯,在通讯双方间建立起了一条安全的、可信任的通讯通道。
它具备以下基本特征:信息保密性、信息完整性、相互鉴定。 主要用于提高应用程序之间数据的安全系数。
SSL 协议的整个概念可以被总结为:一个保证任何安装了安全套接字的客户和服务器间事务安全的协议,它涉及所有TC/IP应用程序。

  1. SSH 只是加密的 Shell,最初是用来替代 telnet 的。通过 port forward,也可以让其他协议通过 SSH 的隧道而起到加密的效果。

SSH 的英文全称是 Secure SHell。通过使用SSH,你可以把所有传输的数据进行加密,这样“中间人”这种攻击方式就不可能实现了,而且也能够防止 DNS 和 IP 欺骗。
还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。
SSH 有很多功能,它既可以代替 telnet,又可以为 ftp、pop、甚至 ppp 提供一个安全的“通道”。
SSH 是由客户端和服务端的软件组成的,有两个不兼容的版本分别是:1.x 和 2.x。用 SSH 2.x 的客户程序是不能连接到 SSH 1.x 的服务程序上去的。OpenSSH 2.x 同时支持 SSH 1.x 和 2.x。

SSH 的安全验证是如何工作的从客户端来看,SSH 提供两种级别的安全验证。

  1. 第一种级别(基于口令的安全验证)只要你知道自己帐号和口令,就可以登录到远程主机。
    所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。
  2. 第二种级别(基于密匙的安全验证)需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。
    如果你要连接到 SSH 服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。
    服务器收到请求之后,先在你在该服务器的家目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。
    如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。
    客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。
    用这种方式,你必须知道自己密匙的口令。

与第一种级别相比,第二种级别不需要在网络上传送口令。
第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。
但是整个登录的过程可能需要10秒。

  1. OpenSSL 一个 C 语言函数库,是对 SSL 协议的实现。
    OpenSSL 很优秀,所以很多涉及到数据加密、传输加密的地方都会使用 OpenSSL 的库来做。

  2. OpenSSH 是对 SSH 协议的实现。

OpenSSH 利用 OpenSSL 提供的库。OpenSSL 中也有个叫做 openssl 的工具,是 OpenSSL 中的库的命令行接口。
从编译依赖上看,OpenSSH 依赖于 OpenSSL,没有 OpenSSL 的话 OpenSSH 就编译不过去,也运行不了。

  1. HTTPS 可以使用 TLS 或者 SSL 协议,而 OpenSSL 是 TLS、SSL 协议的开源实现,提供开发库和命令行程序。

可以理解成所有的 HTTPS 都使用了 OpenSSL。

脚本

# 查看使用了 libssl 库的程序
sudo grep -l "libssl" /proc/*/maps | tr -cd 0-9\\n | xargs -r ps u

References

  • http://en.wikipedia.org/wiki/Secure_Shell
  • http://baike.baidu.com/view/16147.htm
  • http://www.zhihu.com/question/23341334