Asutorufaのブログ

こんにちは

Asutorufaのブログ

深度学习

发布于 2019-11-09|更新于: 2019-11-14|分类 Machine Learning

如果以下的表格及图像出现格式问题,请将你的浏览器中文字体的等宽字体设置好

一.预处理

提取特征量

Human created algorithm: 人想到的算法         +-----------------------+-------> |Human created algorithm| --------> 答案         +-----------------------+ Human created Feature quantity: 人想到的特征量      +------------------------------------------+       +---------------------------+----> |Human created Feature quantity(SIF,HGD...)| ----> |Machine learning(svm,knn..)| ---> 答案      +------------------------------------------+       +---------------------------+ Feature quantity find by computer: 计算机自动寻找特征量         +-----------------------------------+         |        Neural Networks            |-------> |      (Machine learning)           | --------> 答案         | Feature quantity find by computer |         +-----------------------------------+

Hyper-Parameter

  1. 设定超参数的范围
  2. 从设定的超参数的范围中随机采样
  3. 使用步骤1中采样到的超参数的值进行学习,通过验证数据,评估识别精度(要将epoch设置得很小)
  4. 重复步骤1和步骤2,根据他们的识别精度的结果缩小超参数的范围

超参数优化参考:贝叶斯最优化

权重

权重的初始值:不应该设置为0/1(设置为0或1,可能造成梯度消失),应选择随机生成初始值

其他权重初始值: He初始值

输出层

输出层的神经数量需要根据待解决的问题来决定,如:对于分类问题,输出层的神经元数量一般设定为类别的数量.

汇编语言学习

发布于 2019-09-01|更新于: 2019-09-08|分类 Assembly

最近想了解一下c是如何编译为汇编语言的
首先写了一个相当简单的c

#include "stdio.h" int main(){    int a = 1;    int b = 2;    int c = a + b;    int d = 3 + 4;    printf("%d %d",c,d);    return 0;}

使用gcc -S编译为汇编语言:

 .file "hello.c" .text .section .rodata.LC0: .string "%d %d" .text .globl main .type main, @functionmain:.LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 subq $16, %rsp movl $1, -16(%rbp) movl $2, -12(%rbp) movl -16(%rbp), %edx movl -12(%rbp), %eax addl %edx, %eax movl %eax, -8(%rbp) movl $7, -4(%rbp) movl -4(%rbp), %edx movl -8(%rbp), %eax movl %eax, %esi leaq .LC0(%rip), %rdi movl $0, %eax call printf@PLT movl $0, %eax leave .cfi_def_cfa 7, 8 ret .cfi_endproc.LFE0: .size main, .-main .ident "GCC: (GNU) 9.1.0" .section .note.GNU-stack,"",@progbits

以”点”做为前缀的指令都是用来指导汇编器的命令。
精简一下差不多这样:

nodejs异步回调函数

发布于 2019-08-30|更新于: 2019-08-30|分类 Nodejs

研究了一下javascript的异步回调函数,本来想像golang那样使用chan可以返回原始值,不过貌似无法做到,最后止步async/await,差不多就是用Promise的resolve返回值然后用await调用,不过await必须使用在async的函数里,局限还是有的

archlinux安装记录

发布于 2019-08-03|更新于: 2022-10-25|分类 Linux

详细安装教程请参考arch wiki Installation guide (简体中文),此处只记录安装后遇到的问题.


暗影精灵2 PRO 静音LED不起作用和左边耳机会有噼里啪啦声:
具体解决方法我已经写到archwiki里了,请看: Laptop/HP#HP_Omen_15_ax210TX


grub更新菜单

grub-mkconfig -o /boot/grub/grub.cfg

安装os-prober让grub检测到其他系统并自动创建引导

pacman -S os-prober

使用system-boot(就是直接使用linux内核引导系统,不再需要grub,如果有多系统不推荐,会把efi分区搞得很乱):

pacman -S efibootmgr dosfstools# 此处注意:此处要把efi分区挂载为/boot,而非平常的/boot/efibootctl install --path=/boot

CIDR匹配 域名匹配

发布于 2019-08-02|更新于: 2020-06-23|分类 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的匹配

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

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

在对域名匹配时,如对 www.play.google.com 匹配:

  • 没有 www,跳过
  • 没有 play,跳过
  • google,继续
  • com 且域名已为最后一个节点,判断trie中是否为最后的一个子树;是则匹配成功

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

这里有个很简单的解决方法,就是把域名倒过来插入、倒过来匹配,就跟 JAVA 包名那样。

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

trie树类似上述结构

trie树节点可以这样表示:

golang实现子进程后台

发布于 2019-06-09|更新于: 2019-06-09|分类 Go

系统的进程机制

linux

linux下的进程机制,当父进程被杀死之后,子进程就被系统接管 +系统|-父进程 -> system管理|--子进程 -> 父进程管理 当父进程被杀死之后 +系统|-父进程 -> 被杀死|--子进程 -> system管理 如果子进程被杀死,而且父进程没有处理子进程的善后工作,那么子进程就会变成僵尸进程 +系统|-父进程 -> system管理|--子进程(被杀死) -> 僵尸进程

uefi and efi

发布于 2019-04-22|更新于: 2020-04-29|分类 Computer

创建efi分区:

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

使用parted

之后再格式化为fat32

更新bios中的启动项应该在将启动文件安装到efi分区时还要向bios中的nvram存储器上写入相应的路径,在linux中可以使用efibootmgr完成相应的操作,当然如果你是安装grub,安装grub时

深度学习之感知器的实现

发布于 2019-03-08|更新于: 2019-03-08|分类 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来实现与和或

golang socks5/http proxy

发布于 2019-03-06|更新于: 2020-05-30|分类 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服务端发送验证

验证字段:

VER NMETHODS METHODS
1字节 1字节 1-255字节
  • VER是SOCKS版本,这里应该是0x05;

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

发布于 2019-02-02|更新于: 2019-02-02|分类 Android

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

添加应用到白名单:

adb shell dumpsys deviceidle whitelist +<package>

如:

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

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

©2026Asutorufa