Asutorufaのブログ

こんにちは


  • Home

  • Tags

  • Categories

  • Archives

  • About

  • Friends

  • Search

CIDR匹配 域名匹配

Posted on 2019-08-02 | Post modified: 2020-06-23 | In Network

所有完整实现代码:match

CIDR

我们知道cidr对ip匹配时,只要cidr的mask长度的前几位与要匹配的ip相同,则可以说匹配成功.

假设有一个cidr为128.0.0.1/24
转换为二进制 1000 0000.0000 0000.0000 0000.0000 0001/24
可以知道要匹配ip的前24为与cidr的前24(1000 0000.0000 0000.0000 0000)位相同则匹配成功
假设有一个ip 128.0.0.128 二进制为 1000 0000.0000 0000.0000 0000.1000 0000
可以看到前24位与cidr相同 则匹配成功

域名

域名就比较简单了,直接按点分割就行了

前缀树

通过上述规则 我们可以使用前缀树实现CIDR对ip的匹配

        root
       /    \
      0      1
     / \    / \
    0   1  0   1
   /
当ip匹配到此处,此处已无任何子树,且是某一cidr的末尾时则匹配成功
若此处节点为null(golang为nil)且不是某一cidr的末尾时则匹配失败

域名的前缀树相同,只不过域名不再是只有0和1,而且在匹配的时候还需要跳过前面的那些前缀.

        +---------+
        |  root   |
        +---------+
       /     /      \
facebook   google   twitter  ...
  /        /   \       \
com      com   mail    com   ...
                \
               com

在对域名匹配时
如对 www.play.google.com匹配:
    没有www  跳过
    没有play 跳过
    有google 继续
    有com 且 域名已为最后一个节点 -> 判断trie中是否为最后的一个子树 -> 是 -> 匹配成功

这里有一个明显的问题
  比如我们同时插入了music.126.com和163.com
  然后我们需要查询music.163.com是否被匹配
  是不是发现了问题,无法被匹配,因为包含music,我们会匹配到music.126.com这条线,而不是163.com

这里有个很简单的解决方法,就是把域名倒过来插入,倒过来匹配,就跟JAVA包名那样
        +---------+
        |  root   |
        +---------+
             /
            com        ...
           /   \
         163   126     ...
                 \
                music

这样就能被正确匹配了,而且会缩短时间,不会去完整匹配整个域名,只匹配后面有的就行了

trie树类似上述结构

trie树节点 我们可以这样写

Read more »

golang实现子进程后台

Posted on 2019-06-09 | Post modified: 2019-06-09 | In golang

系统的进程机制

linux

linux下的进程机制,当父进程被杀死之后,子进程就被系统接管

+系统
|-父进程 -> system管理
|--子进程 -> 父进程管理

当父进程被杀死之后

+系统
|-父进程 -> 被杀死
|--子进程 -> system管理

如果子进程被杀死,而且父进程没有处理子进程的善后工作,那么子进程就会变成僵尸进程

+系统
|-父进程 -> system管理
|--子进程(被杀死) -> 僵尸进程  
Read more »

uefi and efi

Posted on 2019-04-22 | Post modified: 2020-04-29 | In Computer

创建efi分区:

创建efi分区要设置boot flag,而不是纯FAT32文件系统
使用gdisk

gdisk /dev/sd**
#这里要注意后面输入分区系统编号 要选择EFI分区,目前efi分区编号是 ef00

使用parted

parted /dev/sd**
(parted) set 1 boot on

之后再格式化为fat32

mkfs.vfat -F 32 /dev/sd**

更新bios中的启动项应该在将启动文件安装到efi分区时还要向bios中的nvram存储器上写入相应的路径,在linux中可以使用efibootmgr完成相应的操作,当然如果你是安装grub,安装grub时会自动向nvram中写入内容,比如在bios更新后,会清除nvram中的内容,所有还要重新安装grub,或是使用efibootmgr写入引导文件路径.可参考Unified_Extensible_Firmware_Interface#efibootmgr,windows中也有相应的工具,具体操作方式可在网路上搜索.
如果是u盘的话,uefi 会查看所有 fat 分区,看看里面有没有 EFI/boot/bootx64.efi(目前还没有找到相应的文档表示是这个,这只是我个人的猜想,因为在我试过的无论是windows还是linux的iso镜像的efi文件都是这个地方) 引导文件,然后只要是 FAT32 文件系统就行,所以可以把 windows 或 ubuntu 的 iso 直接解压到一个 fat 分区(比如 fat 的 u 盘或移动硬盘)然后引导
有些UEFI系统只会识别 efi分区下的EFI/boot文件夹内的efi文件,有的甚至只会识别EFI/boot/bootx64.efi

深度学习之感知器的实现

Posted on 2019-03-08 | Post modified: 2019-03-08 | In Machine Learning

感知器的一个公式:
当 wx+b>0 , f(x)=1,否则f(x)=0

  • x输入的向量
  • w:是权重
  • w*x是点积
  • b是偏置(与权重类似,偏置可以认为是激励函数的偏移量,或者给神经元一个基础活跃等级。)

对权重的调整公式,此处使用了梯度下降的方法: w=w+i*(t-count)*x

  • i是一个常数,i越小感知器学习越精确,当然耗费时间也最长
  • t:本应该得到的值
  • count:实际计算得到的值
  • x:同上

对偏置调整的公式: b=b+i(t-count)*

这次我们使用python来实现与和或

Read more »

golang socks5/http proxy

Posted on 2019-03-06 | Post modified: 2020-05-30 | In Network

完整实现代码:
socks5 client
socks5 server
http server

此处已socks5client为例,大致流程都相同,只是协议不同:

socks5运行流程如下:

tcp:
- 本机和代理服务端协商和建立连接;
- 本机告诉代理服务端目标服务的地址;
- 代理服务端去连接目标服务,成功后告诉本机;
- 本机开始发送原本应发送到目标服务的数据给代理服务端,由代理服务端完成数据转发。
udp:
- udp因为是无连接的,所以所以数据一次只用一个udp包
- socks5是通过tcp先确认socks5 server支持udp,然后再通过udp发送请求

先进行TCP连接

golang实现(这里的地址我是本地socks5服务端)

conn,err := net.Dial("tcp","127.0.0.1:1080")
if err != nil{
    fmt.Println(err)
    return
}

向socks5服务端发送验证

验证字段:

VERNMETHODSMETHODS
1字节1字节1-255字节
  • VER是SOCKS版本,这里应该是0x05;
    Read more »

安卓通过adb添加电池用户白名单

Posted on 2019-02-02 | Post modified: 2019-02-02 | In android

安卓6.0引入了doze来节省电量,但某些国产ui(如锤子)阉割了这个菜单,可通过adb添加

添加应用到白名单:

adb shell dumpsys deviceidle whitelist +<package>

如:

adb shell dumpsys deviceidle whitelist +com.google.android.gms

删除白名单(把加号改成减号):

Read more »

安卓使用dalvikvm运行java(termux运行java)

Posted on 2019-02-02 | Post modified: 2019-02-02 | In android

一直想要使用termux来在安卓上写java,但termux上只有ecj可以使java编译为目标文件class,却不能使其编译为可执行文件
发现通过安卓自带的dalvikvm可以运行,只是步骤繁琐一些

安装所需工具

termux上安装 ecj 和 dx就可以了

apt install ecj dx

编译为class文件

ecj XXX.java
Read more »

用CIDR表示网段

Posted on 2019-02-02 | Post modified: 2019-02-02 | In Network

我们知道一般CIDR(无类别域间路由)网段的表示为:192.168.0.0/24这种形式

IP地址

首先我们得知道ip地址是如何来的
ipv4的地址是用32位二进制数表示的
如: 255.255.255.0 -> 11111111.11111111.11111111.00000000

网络前缀

192.168.0.0/24中的24就是网络前缀,网络前缀可转化为网络掩码,24表示网络掩码的前24位为1

网络掩码

「网络掩码」又叫「子网掩码」、「地址掩码」、「子網路遮罩」(subnet mask),它是一种用来指明一个IP地址的哪些位标识的是主机所在的网络地址以及哪些位标识的是主机地址的位掩码。 --维基百科

Read more »

android dumpsys tool

Posted on 2019-02-01 | Post modified: 2019-02-01 | In android

查看dumpsys所有的子命令:

dumpsys | grep "DUMP OF SERVICE"

output:

DUMP OF SERVICE SurfaceFlinger:
DUMP OF SERVICE accessibility:
DUMP OF SERVICE account:
DUMP OF SERVICE activity:
DUMP OF SERVICE alarm:
DUMP OF SERVICE appwidget:
DUMP OF SERVICE audio:
DUMP OF SERVICE backup:
DUMP OF SERVICE battery:
DUMP OF SERVICE batteryinfo:
DUMP OF SERVICE clipboard:
DUMP OF SERVICE connectivity:
DUMP OF SERVICE content:
DUMP OF SERVICE cpuinfo:
DUMP OF SERVICE device_policy:
DUMP OF SERVICE devicestoragemonitor:
DUMP OF SERVICE diskstats:
DUMP OF SERVICE dropbox:
DUMP OF SERVICE entropy:
DUMP OF SERVICE hardware:
DUMP OF SERVICE input_method:
DUMP OF SERVICE iphonesubinfo:
DUMP OF SERVICE isms:
DUMP OF SERVICE location:
DUMP OF SERVICE media.audio_flinger:
DUMP OF SERVICE media.audio_policy:
DUMP OF SERVICE media.player:
DUMP OF SERVICE meminfo:
DUMP OF SERVICE mount:
DUMP OF SERVICE netstat:
DUMP OF SERVICE network_management:
DUMP OF SERVICE notification:
DUMP OF SERVICE package:
DUMP OF SERVICE permission:
DUMP OF SERVICE phone:
DUMP OF SERVICE power:
DUMP OF SERVICE reboot:
DUMP OF SERVICE screenshot:
DUMP OF SERVICE search:
DUMP OF SERVICE sensor:
DUMP OF SERVICE simphonebook:
DUMP OF SERVICE statusbar:
DUMP OF SERVICE telephony.registry:
DUMP OF SERVICE throttle:
DUMP OF SERVICE usagestats:
DUMP OF SERVICE vibrator:
DUMP OF SERVICE wallpaper:
DUMP OF SERVICE wifi:
DUMP OF SERVICE window:
Read more »

安卓通过shell更改语言

Posted on 2019-01-23 | Post modified: 2019-01-23 | In android

对于Android M或更高版本,使用:

setprop ro.product.locale xx-XX
setprop persist.sys.locale xx-XX

xx是语言
XX是国家
改为日语为:xx=ja XX=JP

其他安卓版本:

setprop persist.sys.language xx
setprop persist.sys.country XX
setprop ctl.restart zygote

xx是语言
XX是国家

Read more »
1…4567

68 posts
23 categories
84 tags
RSS
GitHub E-Mail
0%
© 2025 Asutorufa