golang 标准库间倚重的可视化展示葡京网上娱乐场

简介

葡京网上娱乐场 1

国庆看完 << Go 语言圣经
>>,总想做点什么,来深化下映像.以可视化的办法显示 golang
标准库之间的借助,可能是一个相比较好的切入点.做事先,简单搜了下有关的始末,网上也要商讨,不过尚未发现直接能拿过来用的.标准库之间,是一定存在依靠关系的,不同库被依赖的档次必然是不雷同的.但究竟有多大距离吗?

以下内容,数据源自真实环境的 golang 1.9
版本的正经库.所以,本文不仅是一篇可视化相关的议论小说,更是提供了一个可以直接追究
golang 标准库间倚重关系的飞跃梳理工具.

前言

看了天涯论坛上的一个「树莓派」是什么样以及老百姓怎么玩?
的高票回答,双十一时间,果断买了一个灌木丛派 3.
周一(11.13) 到的货.我眼前只想实现一个简单的成效 —
想从随机地点访问我的灌木派. 就像一个潘Dora魔盒,第一步肯定是拿到钥匙!

多少准备

标准库各样包里面的互相关系,可以直接通过命令获取,然后简短转换为一个标准的
JSON 对象:

go list -json  std

演示输出:

{
    "Dir": "/usr/local/go/src/archive/tar",
    "ImportPath": "archive/tar",
    "Name": "tar",
    "Doc": "Package tar implements access to tar archives.",
    "Target": "/usr/local/go/pkg/darwin_amd64/archive/tar.a",
    "Goroot": true,
    "Standard": true,
    "StaleReason": "standard package in Go release distribution",
    "Root": "/usr/local/go",
    "GoFiles": [
        "common.go",
        "format.go",
        "reader.go",
        "stat_atimespec.go",
        "stat_unix.go",
        "strconv.go",
        "writer.go"
    ],
    "IgnoredGoFiles": [
        "stat_atim.go"
    ],
    "Imports": [
        "bytes",
        "errors",
        "fmt",
        "io",
        "io/ioutil",
        "math",
        "os",
        "path",
        "sort",
        "strconv",
        "strings",
        "syscall",
        "time"
    ],
    "Deps": [
        "bytes",
        "errors",
        "fmt",
        "internal/cpu",
        "internal/poll",
        "internal/race",
        "io",
        "io/ioutil",
        "math",
        "os",
        "path",
        "path/filepath",
        "reflect",
        "runtime",
        "runtime/internal/atomic",
        "runtime/internal/sys",
        "sort",
        "strconv",
        "strings",
        "sync",
        "sync/atomic",
        "syscall",
        "time",
        "unicode",
        "unicode/utf8",
        "unsafe"
    ],
    "TestGoFiles": [
        "reader_test.go",
        "strconv_test.go",
        "tar_test.go",
        "writer_test.go"
    ],
    "TestImports": [
        "bytes",
        "crypto/md5",
        "fmt",
        "internal/testenv",
        "io",
        "io/ioutil",
        "math",
        "os",
        "path",
        "path/filepath",
        "reflect",
        "sort",
        "strings",
        "testing",
        "testing/iotest",
        "time"
    ],
    "XTestGoFiles": [
        "example_test.go"
    ],
    "XTestImports": [
        "archive/tar",
        "bytes",
        "fmt",
        "io",
        "log",
        "os"
    ]
}

梳理过的数据源,参见:
https://raw.githubusercontent.com/ios122/graph-go/master/data.js

组装

组建,其实指的是把树莓派放进红白外壳里.基本思路就是,去卖家店铺里看组装表明.其中,小电扇的安装有点异样,需要接4/6脚.就是最外层的右起第2和第3个.接不对,小电扇,就不会转.我专门截了个图,以备忘:

葡京网上娱乐场 2

可视化原理

着重涉嫌一下情节:

  • 可视化呈现,使用的是 echarts

  • 利用原来数据的 ImportPath 而不是
    Name,来作为每个数据节点的唯一id.这样是因为 golang
    本身的包命名规范控制的.

  • 采纳原有数据的 Imports
    字段,来规定专业库包与包里面的互相依赖关系.golang是不允许循环依赖的,所以部分循环往复看重相关的题目,不需要考虑.

  • 节点的大小,和包被此外包引入的次数成正相关.这样做,被依赖越多的包,图上最后彰显时,就会越大.常用包和不常用包,一目明白.

调试

本身眼前说过了,我买的是套装,自带一个小展现器的这种.重假若内网ip经常变,我不是很容易确定树莓派的ip.还有就是率先次启动时,我索要手动输入下密码.

虽说听了很多,不过真的看到这么些小盒子,加上那么便宜的彰显器,竟然当真一起合作,把系统桌面给显示出来了,仍旧有一点点震撼的.
NB 啊~

葡京网上娱乐场 3

PS: 这么些小显示器,也足以当做 mac 的外接呈现器.第一行使 mac
突显器,记住操作技能是:
全力以赴的把鼠标移到屏幕外,然后光标就会活动出现在另一块屏幕上.

数据整理

固然把原来数据,处理成 echarts 需要的多少,那里大概说下最主题的思路:

  • echarts 突显相关的代码,很大程度上参照了
    graph-npm

  • 节点坐标和颜色,选取擅自坐标和颜料,以去除节点和包里面的联系.我以为这么处理,能更纯粹地察看标准库包与包里面的联系.

  • 内需一个 edges 来记录包与包里面的依靠关系.在历次遍历 Imports
    时,动态写入.

  • 亟待一个 nodes 来记录包自身的有些音信,然而其 size
    参数,需要总括过所有依赖关系后再填入.

  • 运用 nodedSize
    来记录每个包被倚重的次数,为了进步效用,它是一个字典Map.

    /* 将本来数据,转换为图标友好的数据.

    ImportPath 作为唯一 id 和 标签;
    Imports 用于计算依赖关系;
    节点的大小,取决于被依赖的次数;
    */
    

    function transData(datas){

    /* 存储依赖路径信息. */
    let edges = []
    
    /* 存储基础节点信息. */
    let nodes = []
    
    /* 节点尺寸.初始是1, 每被引入一次再加1. */
    let nodedSize = {}
    
    /* 尺寸单位1. */
    let unitSize = 1.5
    
    datas.map((data)=>{
        let itemId = data.ImportPath
    
        nodes.push({
            "label": itemId,
            "attributes": {},
            "id": itemId,
            "size": 1
        })
    
        if(data.Imports){
            data.Imports.map((importItem)=>{
                edges.push({
                    "sourceID": importItem,
                    "attributes": {},
                    "targetID": itemId,
                    "size": unitSize
                })
    
                if(nodedSize[importItem]){
                    nodedSize[importItem] = nodedSize[importItem] + unitSize
                }else{
                    nodedSize[importItem] = unitSize
                }
            })
        }
    })
    
    /* 尺寸数据合并到节点上. */
    nodes.map((item)=>{
        let itemId = item.id
        if(nodedSize[itemId]){
            item.size = nodedSize[itemId]
        }
    })
    
    return {
        nodes,edges
    }
    

    }

修改默认 ssh 密码

树莓派的 ssh 登录密码, 默认用户名是: pi , 默认密码是: **
raspberry** 要第一时间修改下.

passwd

功效与源码

安装 ssh 自动登录

树莓派默认没有目录 .ssh
,需要先创建下.需要ssh登录到树莓派之后,在派中施行:

mkdir ~/.ssh/

在任意一台想要访问树莓派的电脑中,直接实施(而不是登录到树莓派后实施):

# 设置自动登录.
cat ~/.ssh/id_rsa.pub | ssh pi@树莓派内网ip  "cat >>  ~/.ssh/authorized_keys"

树莓派内网ip
要换为树莓派的内网ip.当然,也急需您用来拜访树莓派的电脑和树莓派处于同一局域网.

连带链接

修改 root 密码

树莓派默认没有 root 密码,直接设置即可.

# 设置 root 密码
sudo passwd root

# 解锁 root 账户
sudo passwd --unlock root

# 切换到 root 账户
su root

釜底抽薪树莓派容量使用不完全问题

本人是 64G 的内存卡,但是看容器总共只有7.2G.第一反应是遭逢了黑心集团,可是网上搜了下,简单设置重启即可.详见:
http://cedar-renjun.github.io/2015/10/11/resize-raspberry-sd-volume/

此间引用记录下关键步骤,以供查阅:

操作步骤
1.再度树莓派,进入命令行页面
2.登陆树莓派,用户名 pi,密码 raspberry

  1. sudo su
    切换至特级用户
  2. df -h
    显示出近日分区的意况和使用率
  3. 输入 fdisk /dev/mmcblk0 加载SD卡
  4. p 打印当前分区
    你应当会看出多少个分区(mmcblk0, mmcblk0p1,
    mmcblk0p2),现在把分区2的信息写下去(/dev/mmcblk0p2)
    本身重点记录了先导扇区(122880)和竣工扇区(8447999)的数值
    7.按 d 开首删除分区
  5. 系统指示输入删除分区号,输入 2
  6. n 新建分区,然后挨家挨户输入 p, 2
  7. 接下去输入原来记录的2扇区开首号(122880),记得替换成你自己的数字
  8. w 保持配置
  9. 输入 reboot 重启树莓派
  10. 输入 sudo resize2fs /dev/mmcblk0p2 更新系统
  11. 输入 df -h 看看,是不是早就完全使用了剩下空间

瞩目:在第 10 步之后,系统指示让输入完毕扇区时,直接保持默认回车即可.

配置 frp

未雨绸缪公网 ip 和公网服务器

公网ip和公网服务器,类似于一个桥梁.我们通过它将可以访问大家放置在内网的灌木丛派.服务器,我是买的最低配置的云服务器.当然,用自己已部分ip和服务器也可以.

可选: 准备一个域名

一品域名或二级域名,只要能做 ip 类型的 DNS
解析都可以.这一步,就是简单的把域名解析到前一步的公网 ip
上.这样未来访问会省事些,不用记ip了. 当然,直接用 ip 访问也是可以的.

配制 frp 服务器端 — frps

frp 的服务器端,一般名字是 frps,配置文件是 frps.ini.
这五个公文要放到你的公网服务器上.一般,你都应去发布页,去摸索
frp 的照应的操作系统的时尚下载版本.此处以
frp_0.13.0_linux_amd64.tar.gz 为例.

# 下载.下载地址可以在github发布页右键点击某个下载项 --> 复制链接地址.
wget https://github.com/fatedier/frp/releases/download/v0.13.0/frp_0.13.0_linux_amd64.tar.gz

# 解压.
tar -zxvf frp_0.13.0_linux_amd64.tar.gz

# cd 到 frp 目录.
cd frp_0.13.0_linux_amd64

# 编辑.debian上,打开vim的命令是 vi,不是 vim.
vi frps.ini

在 frps.ini 中输入:

[common]
bind_port = 7000
vhost_http_port =80
dashboard_port = dashboard_port_number
dashboard_user = dashboard_user_name
dashboard_pwd = dashboard_pwd_value
privilege_token = privilege_token_value

然后,开启 frps 即可:

./frps -c ./frps.ini

配备好服务器端后,你应有就足以在浏览中打开 frp 的控制台页面了:

葡京网上娱乐场 4

注意:

  • dashboard_port_number 改为一个特定的端口号,如8000,如此便足以透过
    http://yourip:8000 来访问 frps
    的网页控制台页面.
  • dashboard_user_name 和
    dashboard_pwd_value,要改为一个自定义的用户名和密码,用于在访问 frps
    控制台页面时输入.
  • privilege_token_value 改为一个自定义的值.只要客户端与劳动端
    privilege_token 匹配时,客户端才能接二连三到 frp 服务端.

配制 frp 客户端 — 树莓派

frp 的客户端,一般名字是 frpc,配置文件是 frpc.ini.
这六个文件要放权你的内网服务器–树莓派上.一般,你都应去发布页,去搜寻
frp 的呼应的操作系统的风行下载版本.此处以
frp_0.13.0_linux_arm.tar.gz 为例.

# 下载.下载地址可以在github发布页右键点击某个下载项 --> 复制链接地址.
wget https://github.com/fatedier/frp/releases/download/v0.13.0/frp_0.13.0_linux_arm.tar.gz

# 解压.
tar -zxvf frp_0.13.0_linux_arm.tar.gz

# cd 到 frp 目录.
cd frp_0.13.0_linux_arm.tar.gz

# 编辑. debian上,打开vim的命令是 vi,不是 vim.
vi frpc.ini

在 frpc.ini 中输入:

[common]
server_addr = your_server_ip
server_port = 7000
privilege_token = privilege_token_value
login_fail_exit = false

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22

remote_port = remote_port_number

然后,开启 frpc 即可:

./frpc -c ./frpc.ini

布置好服务器端后,你应该在自由可以连接到互联网的总计机上,使用 ssh
访问自己的灌木丛派了:

# 端口和ip要记得替换为自己的.
ssh -oPort=remote_port_number pi@your_server_ip

注意:

  • your_server_ip 要替换为公网服务器上绑定的公网 ip.
  • frps 服务器端与客户端不必是一样操作系统, 但frp 版本最好相应
  • 树莓派3 debian 系统,需要的是 arm 版本的程序安装包.
  • privilege_token 要和服务器端的 frps.ini 中对应
  • login_fail_exit 很要紧,否则后边不可以实现系统重启时自动启动 frpc
    功用.
  • remote_port_number,用来指定通过远程服务器的哪个端口来 ssh
    访问树莓派.

利用 Systemd 实现活动启动 frp

Systemd,可以确保在树莓派意外重启时,能半自动启动 frp
相关服务.那样,咱们就不用整天提心吊胆,担心各个出人意料了.

安装 Systemd

大多数 Linux 系统中,都停放了 Systemd.即使没有,能够手动安装.

安装systemd请运行:

apt-get update
apt-get install systemd
apt-get install systemd-sysv

在安装完 systemd 之后,为了使系统以 systemd 的模式利用,最好在 grub
配置文件中的 kernel 命令行指定下面的参数:

vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash init=/lib/systemd/systemd"

为了利用新安装的systemd来指引类别,请重新启航系统:

# reboot

在劳动器端使用 Systemd 管理 frps

# 需要先 cd 到 frp 解压目录.

# 复制文件
cp frps /usr/local/bin/frps
mkdir /etc/frp
cp frps.ini /etc/frp/frps.ini

# 编写 frp service 文件,以 centos7 为例,适用于 debian
vim /usr/lib/systemd/system/frps.service
# 内容如下
[Unit]
Description=frps
After=network.target

[Service]
TimeoutStartSec=30
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.ini
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target

# 启动 frp 并设置开机启动
systemctl enable frps
systemctl start frps
systemctl status frps

# 部分服务器上,可能需要加 .service 后缀来操作,即:
systemctl enable frps.service
systemctl start frps.service
systemctl status frps.service

在灌木丛派客户端使用 Systemd 管理 frpc

# 需要先 cd frp 解压目录.

# 复制文件
cp frpc /usr/local/bin/frpc
mkdir /etc/frp
cp frpc.ini /etc/frp/frpc.ini

# 编写 frp service 文件,以 centos7 为例,适用于 debian
vim /usr/lib/systemd/system/frpc.service
# 内容如下
[Unit]
Description=frpc
After=network.target

[Service]
TimeoutStartSec=30
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.ini
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target

# 启动 frp 并设置开机启动
systemctl enable frpc
systemctl start frpc
systemctl status frpc

# 部分服务器上,可以需要加 .service 后缀来操作,即:
systemctl enable frpc.service
systemctl start frpc.service
systemctl status frpc.service

注意:

  • frps 或 frpc 启动无效时,可以尝试先截止服务,如:

systemctl stop frpc

参考