bingoohuang / blog

write blogs with issues
MIT License
176 stars 23 forks source link

面向谷歌编程 #85

Open bingoohuang opened 5 years ago

bingoohuang commented 5 years ago

面向谷歌编程

网络时代的拿来主义 ,避免重复造轮子

我想在监控系统rig中自动识别一个字符串,是hostname还是IP地址,由于rig是go语言来实现的,我就简单地在谷歌中,输入一下关键字”golang string is ip v4“, 获得如下[搜索结果:

image

我简单瞄了一眼,点开了第二条结果,然后展示了以下的gist代码:

package main

import (
    "fmt"
    "strconv"
)
import "strings"

func is_ipv4(host string) bool {
    parts := strings.Split(host, ".")

    if len(parts) < 4 {
        return false
    }

    for _,x := range parts {
        if i, err := strconv.Atoi(x); err == nil {
            if i < 0 || i > 255 {
            return false
        }
        } else {
            return false
        }

    }
    return true
}

func main() {
    addresses := []string{"192.168.1.1", "10.addr.3.4"}

    for _, address := range addresses {

        if is_ipv4(address) {
            fmt.Println("This is a valid IPv4 address")
            continue
        }
        fmt.Println("This is NOT a valid IPv4 address")
    }
}

简单一看,可以用,于是拷贝过来,应该没啥问题,还做了一下简单重构,我自己还补充了一下测试用例,OK,正常工作:

// IsIPv4 判断 host 字符串表达式是不是IPv4的格式
func IsIPv4(host string) bool {
    parts := strings.Split(host, ".")
    if len(parts) < 4 {
        return false
    }

    for _, x := range parts {
        i, err := strconv.Atoi(x)
        if err != nil || i < 0 || i > 255 {
            return false
        }
    }
    return true
}

func TestIsIPv4(t *testing.T) {
    a := assert.New(t)
    a.True(IsIPv4("192.168.0.1"), "192.168.0.1是IPv4地址")
    a.False(IsIPv4("app01"), "app01不是IPv4地址")
    a.False(IsIPv4("app.01"), "app.01不是IPv4地址")
}

然后,回过头来,准备关闭谷歌搜索页面的时候,我不小心瞄到了第4条结果:

Problem : You have IP address in string type and you want to convert(cast) the string into type IP address. Solution : Use the net.ParseIP()

进一步看一下,然后标准库里有这个玩意,直接用,多好,于是将刚才的实现 ,马上 重构了一下,删除了好多代码,这个方法不只是能判断IPv4,IPv6的格式也能判断,能力更强了,顺便重命名了一下,添加了点测试用例 ,就简简单单的搞定了 :

// IsIP 判断 host 字符串表达式是不是IP(v4/v6)的格式
func IsIP(host string) bool {
    ip := net.ParseIP(host)
    return ip != nil
}

func TestIsIP(t *testing.T) {
    a := assert.New(t)
    a.True(IsIP("192.168.0.1"), "192.168.0.1是IPv4地址")
    a.True(IsIP("FE80::0202:B3FF:FE1E:8329"), "FE80::0202:B3FF:FE1E:8329是IPv6地址")
    a.True(IsIP("2001:db8::68"), "2001:db8::68是IPv6地址")
    a.False(IsIP("http://[2001:db8:0:1]:80"), "http://[2001:db8:0:1]:80不是IP地址")
    a.False(IsIP("app01"), "app01不是IP地址")
    a.False(IsIP("app.01"), "app.01不是IP地址")
}

谷歌被墙了,怎么办?

很多人,包括我自己早年的时候,都喜欢整那些免费的代理软件,然后去使用谷歌。但是,免费的东西,总是不稳定,很浪费时间,后来我就喜欢掏钱买了。比如我现在用的西游,和几个同事一起买,一年也就100块,外面少和朋友搓1/5顿饭的饭钱,就搞定了。

image

image

关键字怎么处理

比如你要搜索go test ./...中的...是啥意思,不能直接去搜索,而是转换一下,比如golang test three dots,二者的结果是不太一样的:

image

image

总结几点:

  1. 使用英文关键字。
  2. 转换难以出结果的关键字。比如go转换成golang,c转换成clang,...转换成three dots。
  3. 剔除与问题无关的内容,比如错误信息中的业务信息,只保留技术性的出错信息。
  4. 如果有些词组,是专业术语,可以使用双引号包含起来 ,增强搜索。
bingoohuang commented 5 years ago

英文早已经还给老师的,可以尝试搜索golang 三个点,也能找到一些答案:

image

sanbeichahegongheguo commented 5 years ago

和几个同事一起买,一年也就100块,外面少和朋友搓1/5顿饭的饭钱,就搞定了。

事实上,不会少和朋友出去搓。。。

Bpazy commented 5 years ago

哈哈最近也遇到了判断hostname还是Ipv4 or v6的问题,自己洋洋洒洒写了一大堆代码。后来无意发现了net.IP的定义type IP []byte ,和我自定义判断的底层数据结构一致,果断换成了ip.Parse。

还是我对基础库不了解啊哈哈。

bingoohuang commented 4 years ago

Three Ethical and Human Friendly Search Engines

Want more options for good Google alternatives? These are three that I like:

  1. StartPage.com - Gives you exact same search results as Google but without all that tracking and profiling.
  2. Qwant.com - A private search engine with similar philosophy to DuckDuckGo but based in France, Europe.
  3. Ecosia.org - They pant trees for each search that you make.

摘自群《t9t.io community 2》

bingoohuang commented 4 years ago

谷歌搜索的一个技巧

如果你想快速了解一个新事物是什么,一个简单的方法就是在这个词的后面加上“vs”,谷歌会自动提示跟它最接近的事物。

image

这个技巧对百度也有效。

image

利用这个 API,可以画出事物之间的关系图。

image

bingoohuang commented 4 years ago

本想给bssh扩展一下,把-H参数提升为公共参数,奈何一看,命令行用的是urfave/cli库,瞄了一下manual,没有瞄到。【2020-08-05 19:14:52 更新 不死心,又看了一下,找到了,叫GLOBAL OPTIONS, c.GlobalString】然后看了一下spf13/corba,在Readme中就有了。

image

图来自medium go-thoughts-about-cobra

然后顺便搜索了一下replace urfave cli with cobra

image

再反向搜索一下replace cobra with urfave cli

image

其中只有一条,说要从cli转成corba,点开一看,然来是一哥们提的PR,还没被认同,就被自己关闭了。

image

这一下子,就相当于Corba是当之无愧在命令行处理的王者了。