Jun 3

vscode 的 tab 不指定

felix021 @ 2019-6-3 11:38 [IT » 软件] 评论(3) , 引用(0) , 阅读(129) | Via 本站原创
1. vscode 有一个特性, workbench.editor.enablePreview

当一个文件被(单击)打开、且没有被修改的情况下, tab上的 filename 是斜体, 意味着这是一个临时tab, 会被下一个打开的文件覆盖.

在打开前双击文件, 或者打开后双击 tab 上的文件名, 可以把这个 tab 固定住.

另外就是修改 workbench.editor.enablePreview 这个属性, 关闭掉.

2. vscode 还有另一个特性, workbench.editor.showTabs

当这个选项为 false 的时候, 永远只有一个 tab

这个情况我遇到过两次, 上一次倒腾了半天, 直接reset vscode了

这次又遇到, 搜 "vscode only showing one tab" 找到这个 issue

https://github.com/Microsoft/vscode/issues/51649

这才知道了解决方案

但我不知道是怎么触发的, 我并没有刻意去设置, 初步怀疑是有一个很奇怪的快捷键, 不小心打开了吧

不能理解这个选项存在的意义, 会有人需要吗?
Apr 24
工作这几年,面试了很多人,也结合了自己工作的经验,有一些心得,但是没有深入地思考过。

正好看到两位大佬的总结,很有共鸣,做个梳理,作为一面镜子,照照自己。



~ 张一鸣:我面了两千个年轻人,发现混的好的都有这5种特质

  @ https://www.toutiao.com/i6681549238490366472

点击在新窗口中浏览此图片


~ 谢熊猫君:如何辨认身边的聪明人?

  @ https://mp.weixin.qq.com/s/jvqMxdHRRBhhWl29fj3RHg

点击在新窗口中浏览此图片
Apr 24
这是罗凯同学内部《Go 快速入门》课程第五讲的作业。

第一题:使用 channel 完成打印1000以内的素数

package main

import "fmt"

func prime(c chan<- int) {
    i := 2
    for {
        isPrime := true
        for j := 2; j < i; j += 1 {
            if i % j == 0 {
                isPrime = false
            }
        }
        if isPrime {
            c <- i
        }
        i += 1
    }
}

func main() {
    c := make(chan int)
    go prime(c)
    for {
        p := <-c
        if p >= 1000 {
            break
        }
        fmt.Println(p)
    }
}



第二题:等价二叉查找树,来自 Go tour:https://tour.go-zh.org/concurrency/7

原题使用 tree.New(1) 来生成一个包含10个元素的二叉查找树,简单的实现可以基于这一点,正好从channel里读出10个数字。

以下这个版本的实现更复杂一些,不假定二叉查找树的长度,所以加一个 wrapper,用来 close channel 。

package main

import (
    "fmt"
    "golang.org/x/tour/tree"
)

// Walk 步进 tree t 将所有的值从 tree 发送到 channel ch。
func Walk(t *tree.Tree, ch chan int) {
    if t == nil {
        return
    }
    Walk(t.Left, ch)
    ch <- t.Value
    Walk(t.Right, ch)
}

func WalkWrapper(t *tree.Tree, ch chan int) {
    Walk(t, ch)
    close(ch)
}

// Same 检测树 t1 和 t2 是否含有相同的值。
func Same(t1, t2 *tree.Tree) bool {
    c1 := make(chan int)
    c2 := make(chan int)
    go WalkWrapper(t1, c1)
    go WalkWrapper(t2, c2)
    for {
        v1, ok1 := <-c1
        v2, ok2 := <-c2

        if ok1 == false && ok2 == false {
            return true
        } else if ok1 == false || ok2 == false {
            return false
        } else {
            if v1 != v2 {
                return false
            }
        }
    }
}

func main() {
    t1 := &tree.Tree{&tree.Tree{nil, 1, nil}, 2, &tree.Tree{nil, 3, nil}}
    t2 := &tree.Tree{&tree.Tree{&tree.Tree{nil, 1, nil}, 2, nil}, 3, &tree.Tree{nil, 4, nil}}
    fmt.Println(t1)
    fmt.Println(t2)
    fmt.Println(Same(t1, t2))

    t3 := tree.New(1)
    t4 := tree.New(1)
    fmt.Println(t3)
    fmt.Println(t4)
    fmt.Println(Same(t3, t4))
}
Mar 31

LeetCode 69 - x 的平方根 不指定

felix021 @ 2019-3-31 15:34 [IT » 程序设计] 评论(1) , 引用(0) , 阅读(257) | Via 本站原创
这是罗凯同学布置的 Golang 学习作业。

这题之前用 Python 刷过,用的是二分法,在 [1, n / 2] 区间内,找到第一个 x,使得 x ^ 2 <= n < (x + 1) ^ 2 ,用的是 STL 中 lowerbound 的算法。

class Solution(object):
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """
        if x < 0:
            raise Exception("invalid input")
        if x < 2:
            return x
       
        left = 1
        length = x / 2
        while length > 1:
            half = length / 2
            middle = left + half
            if middle * middle > x:
                length = half
            else:
                left = middle
                length = length - half
        return left


罗凯同学提到,应该使用牛顿迭代法来完成。这个方法是听说过的,但是早就忘了,于是到 wikipedia 去找了一下:

https://zh.wikipedia.org/wiki/%E7%89%9B%E9%A1%BF%E6%B3%95

求函数 f(x) 的零点,可以通过选取曲线上的任意一个点 x0 开始,然后计算 x1 = x0 - f(x1) / f'(x1) 的方式迭代,通常得到一个比 x0 更接近零点的 x1 。通过不断迭代,最终我们能找到一个零点 xn 。

对于求平方根,我们是要找到一个 x,使得 x ^2 - n = 0,也就是这里的 f(x) = x ^ 2 - n, f'(x) = 2 * x (勉强还记得这个求导公式……)

有了这个,答案就呼之欲出了:

import "math"

func mySqrt(x int) int {
    f := func (i float64) float64 {
        return i * i - float64(x)
    }
    g := func (i float64) float64 {
        return 2 * i
    }
    var i float64 = 1.0
    for math.Abs(f(i)) > 1e-6 {
        i = i - f(i) / g(i)
    }
    return int(math.Floor(i))
}


做完以后,我想起 Quake III 的作者 John Carmack 的 平方根倒数速算法,摘录一段内容:( src: https://blog.csdn.net/zyex1108/article/details/53540824 )

引用

Quake-III Arena (雷神之锤3)是90年代的经典游戏之一。该系列的游戏不但画面和内容不错,而且即使计算机配置低,也能极其流畅地运行。这要归功于它3D引擎的开发者约翰-卡马克(John Carmack)。事实上早在90年代初DOS时代,只要能在PC上搞个小动画都能让人惊叹一番的时候,John Carmack就推出了石破天惊的Castle Wolfstein, 然后再接再励,doom, doomII, Quake...每次都把3-D技术推到极致。他的3D引擎代码资极度高效,几乎是在压榨PC机的每条运算指令。


这个平方根倒数算法正是其中的一个例子。在3D游戏引擎中,求取照明和投影的波动角度与反射效果时,常需计算平方根倒数,而求平方根的常用算法效率较低。


Carmack 通过使用一个惊为天人的魔术常量 0x5f3759df,只需要做 1 次迭代(Quaker III源码中的为了提高精度的第二次迭代被注视掉了),就能得到一个足够精度的平方根,大幅提高了 3D 引擎的运行效率。

关于这个魔术常量,Carmack 表示并不是他自己发明的,至今为止仍未能确切知晓算法中所使用的特殊常数的起源。但 Carmack 凭一己之力,撑起了一个 3D 引擎的时代,以至于在1999年,登上了美国时代杂志评选出来的科技领域50大影响力人物榜单,并且名列第10位。

感兴趣的同学,可以在 Wikipedia 的 平方根倒数速算法 了解更多细节:

https://zh.wikipedia.org/wiki/%E5%B9%B3%E6%96%B9%E6%A0%B9%E5%80%92%E6%95%B0%E9%80%9F%E7%AE%97%E6%B3%95
Mar 20

GVim 在查看模式关闭输入法 不指定

felix021 @ 2019-3-20 16:49 [IT » 软件] 评论(0) , 引用(0) , 阅读(199) | Via 本站原创
困扰了很久的问题,搜了一下才发现解决起来很简单:

将 ESC 映射为 “ESC 并且设置关闭 IM ”

引用
inoremap <ESC> <ESC>:set iminsert=0<CR>


感谢:Tony's blog
Mar 12
这篇文章用于展示微软有多蠢。

除了环境光感应调整屏幕亮度之外,Surface Pro 还有一个傻逼特性,叫做 Adaptive Contrast(有些地方翻译为自适应亮度)。

这是 Intel 显卡驱动中实现的一个功能,在屏幕显示的内容亮度较低的时候(例如打开一个暗色调的图片),自动降低屏幕的亮度用于省电。

结果就是体验烂到爆炸。微软自作聪明起来,简直比苹果还蠢。

而且找不到关闭选项:Surface Pro 6 上的 Intel 驱动程序没有独立的控制面板,官网下载的驱动程序无法直接安装 —— 得先删除显卡,然而还是没有显卡控制面板。

微软技术支持服务上有人提出这个问题,官方人员的回答Windows自带的帮助功能一个尿性:都是套路,且毫无卵用。

网上可以搜到很多无效解决方案:

1. 设置 - 系统 - 显示 - “当光线变化时自动调节亮度”

误:不是这个功能。

2. 控制面板 - 系统和安全 - 电源选项 - 更改计划设置 - 更改高级电源设置 - 显示 - 启用自适应亮度 - 关闭

误:无效

3. 注册表编辑器 - 找到下述注册表键值 - 从 9240 修改为 9250

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0001] FeatureTestControl

误:早期版本的 Surface Pro 上有 0001 这个项,但 Surface Pro 6 没有(只有 0000 ,而且 value 是 8200 而不是 9240 )。新建一个 0001 ,设置 FeatureTestControl = 9250 无效。

最后终于找到这里:https://mikebattistablog.wordpress.com/2016/05/27/disable-intel-dpst-on-sp4/

应该修改 0000 项里的 FeatureTestControl  ,这是一个 bitfield,其中从低到高的第 5 个 bit 表示是否启用  Intel Display Power Saving Technology (DPST)。将这个 bit 修改为 1 ,就可以禁用 DPST。

最终,将 0000 下的 FeatureTestControl  从 8200 改为 8210 ,并重启以后解决问题。
Mar 6

TourDeBabel 不指定

felix021 @ 2019-3-6 11:54 [IT » 其他] 评论(0) , 引用(0) , 阅读(251) | Via 本站原创
转自:https://code.google.com/archive/p/windows-config/wikis/TourDeBabel.wiki
原文:https://sites.google.com/site/steveyegge2/tour-de-babel

(无意中翻出了很多年前看过的这篇文章,发现是在google code上的,那就转载作为存档吧)

通天塔导游

(译注:圣经记载:在远古的时候,人类都使用一种语言,全世界的人决定一起造一座通天的塔,就是巴别塔,后来被上帝知道了,上帝就让人们使用不同的语言,这个塔就没能造起来。 巴别塔不建自毁,与其说上帝的分化将人类的语言复杂化,不如说是人类自身心灵和谐不再的分崩离析。之所以后来有了翻译,不仅是为了加强人类之间的交流,更寄达了一种愿望,希望能以此消除人际的隔阂,获求来自心灵的和谐及慰藉。真正的译者,把握血脉,抚平创痕,通传天籁,开启心门。)

这是我写的旋风式的编程语言简介—我本来为亚马逊开发者杂志本月的期刊写的,但是发现我写的东西没法…见人。

首先,我偶尔一不小心口出脏话,或者对上帝不恭的话,所以对很官方很正式的亚马逊上发表是不合适的; 所以我就把它塞到我的博客里了,我的博客反正没人看的。除了你以外。是的,只有你会看,你好啊。

其次,这是一项进行中的工程,现在只是东打一耙西搞一下,还没有精加工过的。又一个把它写到博客里的很大的理由。不需要很好,或很完整。就是我今天想说的一些话。请随便!

我的旋风式简介会讲C,C++,Lisp,Java,Perl,(我们在亚马逊用到的所有语言),Ruby (我就是喜欢),和Python,把Python加进来是因为—好吧,你看了就知道了,现在我可不说。

C

你必须懂C。为哈? 因为出于所有现实的理由,这个世界上你过去,现在,将来会用到的每一台计算机都是一台冯·诺曼机器,而C是一种轻量级的,很有表达力的语法,能很好的展现冯·诺曼机器的能力。
Feb 25

使用DNSPOD的API实现动态域名 不指定

felix021 @ 2019-2-25 14:47 [IT » 网络] 评论(0) , 引用(0) , 阅读(356) | Via 本站原创
0. 你得有一个 dnspod 帐号,并且把你的域名(例如 test.com )解析迁移过去(略)

1. 添加一个子域名的 A 记录,例如 ddns.test.com 指向 127.0.0.1

  $ export domain=test.com
  $ export subdomain=ddns

2. 生成一个token:参考官方说明 https://support.dnspod.cn/Kb/showarticle/tsid/227/

【务必注意】需要用生成的 ID 和 Token 这两个字段来组合成一个完整的 Token,组合方式为:"ID,Token"(用英文半角逗号分割),比如官方示例中,完整的 Token 为:13490,6b5976c68aba5b14a0558b77c17c3932 。

  $ export token=13490,6b5976c68aba5b14a0558b77c17c3932

3. 获取必要信息: 域名和子域名的ID

  $ curl -X POST https://dnsapi.cn/Record.List -d "login_token=${token}&format=json&domain=${domain}&sub_domain=${subdomain}"

返回结果为:{"status":{...}, "domain":{"id":640001, "name":"test.com", ...}, "info":{...}, "records":[{"id":"355300007", "name":"ddns", ...}]}

记录下对应域名的id 和子域名的id

  $ export domain_id=640001
  $ export subdomain_id=355300007

4. 获取外网ip

  $ wanip=`nc ns1.dnspod.net 6666`

5. 更新记录

  $ curl https://dnsapi.cn/Record.Ddns -d "login_token=${token}&format=json&domain_id=$domain_id&record_id=$record_id&sub_domain=$sub_domain&record_line=默认&value=$wanip"

= 完 =

(其实没完)其中 1、2、3 做完以后

6. 把 4、5 可以写到一个脚本里

  $ vi dnspod.sh
#!/bin/bash

domain_id=640001
record_id=355300007
sub_domain=ddns

wanip=`nc ns1.dnspod.net 6666`
curl https://dnsapi.cn/Record.Ddns -d "login_token=${token}&format=json&domain_id=$domain_id&record_id=$record_id&sub_domain=$sub_domain&record_line=默认&value=$wanip"


7. 设置 crontab

  $ crontab -e

引用
*/15 * * * * sh /path/to/dnspod.sh


=完=
分页: 1/97 第一页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]