Pensieve: 1849

2018-12-09 16:41

所观所读

默克家庭诊疗手册进度5%.

看完了豪斯医生第一季, 基本几点印象:

  1. 病史很重要
  2. 隐瞒病史是作死
  3. 中医是作死
  4. 生活在一个干净的环境里很重要

顺便, 前几天在查一首歌时看到有影评说失恋三十三天的原著和电影版有一定差距, 于是找了读了读, 除了结局外, 没发现有大的区别. 考虑到原著的包袱会略多一点儿, 读原著似乎更划算.

另外看完了一个讲荒野之息制作的纪录片, 没特别的, 强调对细节的注重而已. 在历史上各个年代, 不注重细节是不会成功的.

所玩

PL过了950, 也终于刷到了一个有全抗的远古套装裤子, 而且还带拾取范围和攻击效果. 天地良心, 那条裤子我重铸了不下20次, 血岩花了得有一两万, 最后是速刷大秘境时掉的. 喜出望外的是, 在刷到裤子的同一天, 我还用血岩碎片赌到了第一个能用的太古装备. 虽然一个手套上除了爆率外还应该有爆伤, 范围伤或攻速. 但是我随到了体能, 爆率和击回. 于是把击回洗成了爆伤, 先用着了.

bash

最近两天在想挖一个新坑, 一个支持模糊识别和匹配当前目录的bash历史命令提示. 基本思路算是成型了: bashrc里面在PROMPT_COMMAND里面加上一个命令, 每次执行完命令后把刚刚执行完的命令, 当前目录以及命令的退出状态发到一个后端的服务, 后端的服务记录下来. 另外给Ctrl-R绑定一个命令, 这个命令会把当前目录作为参数发送给后端, 后端做查询后返回结果, 优先最近在当前目录下执行过的命令. 我仍在纠结是用go实现还是用python实现, 前者可以当做学习过程, 后者熟练, 可以快速出成果, 不过弊端是python的启动会慢一圈.

最近也看了不少能提示bash幸福感的开源项目, 没有特别让我感到眼睛一亮的. 当然bash的这些小trick大都是和个人习惯直接相关的, 汝之佳肴彼之毒药. 下面介绍我最近酿制/改进的两瓶毒药, 供参考:

首先是我之前就有的一个pwgen脚本, 用途是生成密码. 最近修改了一下这个脚本, 添加了一个特性, 即在保证要出现各种字符类的前提下, 将大小写要求相同的字符归到一起, 方便键盘上键入. 比如, 对于aBcDeF这个密码, 你在手机上键入的时候会被打断三次, 因为你得按Shift三次, 如果你将密码改为aBDFce, 其信息熵会有少量降低, 即密码变得不那么安全了, 但输入时的幸福感却显著提高了. 这个相关改动在这个commit里

第二个是我写的一个bash函数, 目标是实现一个轻量级的alias. 很多时候, 我们需要在一个bash session里重复执行某个命令. 这个命令很多时候只是一次性的, 写进alias文件有点太重, 直接命令行下写alias abc='blahblah'又有点太繁碎, 我们这种时候希望的只是标记一个命令, 并执行这个标记的命令. 这个命令不需要被推广到各个bash session里面去. 想通这些需求, 实现起来就很容易了: 写一个bash函数, 如果这个函数被调用时有参数, 则将参数记录到一个环境变量. 如果调用时没有参数, 则读这个环境变量并执行. 具体代码实现在这里.

格点连线得到60度角

之前读过的这篇文章是如何用笔算得到在网格上通过格点连线而得到一个60度角的. 于是, 自然的, 我就想怎么样能够用计算机算出结果来. 一些简单的思考, 我希望解决这样一个问题:

对于给定的100*100网格, 在上面任取两点, 使其到左下角原点的夹角尽量接近60度.

今天下午写了段代码, 做了下研究:


#!/usr/bin/env python
import math

MAX = 10
ANGLE = math.pi/3


tan_cache = {}
for i in range(1, MAX + 1):
    for j in range(int(i * math.tan(ANGLE)), MAX + 1):
        if math.gcd(i, j) != 1:
            continue
        tan_cache[float(j/i)] = (i, j)

def diff(x1, y1, x2, y2):
    return abs(math.atan(y2/x2) - math.atan(y1/x1) - ANGLE)

results = {}
for i in range(1, MAX + 1):
    for j in range(int(i / math.tan(ANGLE)) + 1):
        if math.gcd(i, j) != 1:
            continue
        tg = math.tan(ANGLE + math.atan(j/i))
        # find the neighbours of this tg value.
        index = -1
        for value in sorted(tan_cache):
            index += 1
            if value > tg:
                break
        i2, j2 = tan_cache[sorted(tan_cache)[index]]
        result = diff(i, j, i2, j2)
        results[result] = (i, j, i2, j2)
        if index == len(tan_cache) - 1:
            continue
        i2, j2 = tan_cache[sorted(tan_cache)[index + 1]]
        results[diff(i, j, i2, j2)] = (i, j, i2, j2)

for v in sorted(results)[:10]:
    print(v, results[v])

x1, y1, x2, y2 = results[sorted(results)[0]]
print(abs((math.atan(y1/x1) - math.atan(y2/x2)) * 180 / math.pi))

下面是一些结果:

网格大小 点1 点2 夹角

100 56, 15 26, 97

网格大小 点1 点2 夹角
100 56,15 26,97 60.0000005
40 15,4 7,26 60.00009
20 19,5 3,11 60.001
10 4,1 2,7 60.02

没什么好玩的地方, 网格越大精度越高, 就这样吧.

链接