Linux C 中bind函数用法详细介绍及注意事项:
对于 C/S 通信模型中 client 端使用的函数顺序通常是 : socket -> connect -> send/recv server 端使用的函数顺序通常是 : socket -> bind -> listen -> send/recv
#include <sys/types.h> #include <sys/socket.h> int bind(int sockfd, const struct sockaddr * addr, socklen_t addrlen); bind()函数用于服务器端,服务器的网络地址和端口号通常固定不变,客户端得知服务器的地址和端口号以后,可以主动向服务器请求连接。因此服务器需要调用bind()绑定地址。 sockfd表示socket文件的文件描述符,一般为socket函数的返回值; addr表示服务器的通信地址,本质为struct sockaddr 结构体类型指针,struct sockaddr结构体定义如下
struct sockaddr{ sa_family_t sa_family; char sa_data[14]; };
结构体中的成员,sa_data[]表示进程IP地址;
bind函数中的第三个参数addrlen表示参数addr的长度;addr参数可以接受多种类型的结构体,而这些结构体的长度各不相同,因此需要使用addrlen参数额外指定结构体长度; 可以使用下列语句,定义一个struct sockaddr_in类型的结构体
struct sockaddr_in servaddr;//结构体定义 bzero(&servaddr,sizeof(servaddr));//结构体清零 servaddr.sin_family=AF_INET;//设置地址类型为AF_INET servaddr.sin_addr.s_addr=htonl(INADDR_ANY);//设置网络地址为INADDR_ANY servaddr.sin_port=htons(80);//设置端口为80 bind(fd, (sockaddr *)(&servaddr), sizeof(servaddr));
如果一个应用并不关心分配给它的地址,则可将Internet地址设置为INADDR_ANY,或将端口号置为0。如果Internet地址段为INADDR_ANY,则可使用任意网络接口。
bind函数调用成功返回0,否则返回-1,并设置errno; EACCES:地址受到保护,用户非超级用户。 EADDRINUSE:指定的地址已经在使用。 EBADF:sockfd参数为非法的文件描述符。
线性回归 首先对于若干数据点,每一个数据点\(\bm{x}\in\mathbb{R}^N\),我们用超平面\(b+\sum_{n=1}^Nx_n\theta_n\bm{i}_n=0\)对其进行划分。这时需要向量\(\bm\theta\in\mathbb{R}^N\),我们让截距\(b\)也成为一个参数,让下标\(n\)从0计,这样上式可以写成\(\bm\theta^\textsf{T}\bm{x}=0\)其中\(x_0=1\)。
我们有线性回归一般公式:\(\displaystyle f_{\bm\theta}(\bm{x})=\sum_{n=0}^Nx_n\theta_n\);我们令\(\hat{y}=f_{\bm\theta}(\bm{x})\)。
损失函数 现在已经对\(I\)个数据点求解了线性回归,然后求出损失:
L1损失:\(\displaystyle J=\frac{1}{I}\sum_{i=1}^I\big\lvert {\hat{y}^i-y^i}\big\rvert\); L2损失:\(\displaystyle J=\frac{1}{I}\sum_{i=1}^{I}{\big({\hat{y}^i-y^i}\big)}^2\),L2损失看上去就是求出来实际值\(y\)与预测值\(\hat{y}\)之间距离平方之和; 交叉熵:\(\displaystyle J=-\frac{1}{I} \sum_{i=1}^I \big(y^i \ln{ \hat{y}^i+ (1-y^i) } \ln{ (1- \hat{y}^i )} \big)\)。 梯度下降 我们知道,梯度表示某一函数在一点处的方向导数,\(\nabla_\bm\theta\),沿着其方向取得级大值,那么梯度下降就可以获得我们想要的极小值。但是梯度下降不能一次性到达极小值,而是需要每轮迭代步进到极小值,而步进总有个步长,这个步长可以用学习率\(Lr\)和上面求出来的损失\(J\)表示。超平面的参数\(\bm\theta\)本身也是\(N\)维空间中一点,每次将它的坐标加上\(Lr\nabla_\bm\theta J\),当\(\bm\theta\)坐标不再移动时,点\(\bm\theta\)基本上就是极小值点。
现在看看采用不同损失函数时梯度下降如何更新将参数\(\bm\theta\):
L1损失:\(\begin{aligned}\bm\theta^\prime &= \bm\theta-Lr\nabla_\bm\theta J\\&= \bm\theta-Lr\frac{\partial J}{\partial\bm\theta}\\&= \bm\theta-Lr\sum_{n=0}^N\bigg(\frac{\partial\big(\frac{1}{I}\sum_{i=1}^I\lvert\theta_nx_n^i-y^i\lvert\big)}{\partial\theta_n}\bigg)\\&= \bm\theta-Lr\frac{1}{I}\sum_{n=0}^N\sum_{i=1}^I{\left\{\begin{aligned}\theta_nx_n^i-y^i,\quad& \theta_nx_n^i-y^i\geq 0 \\y^i-\theta_nx_n^i,\quad& \theta_nx_n^i-y^i< 0\end{aligned}\right.}\\&= \bm\theta-Lr\sum_{i=1}^I\lvert\hat{y}^i-y^i\rvert\end{aligned}\) L2损失:\(\begin{aligned}\bm\theta^\prime &= \bm\theta-Lr\nabla_\bm\theta J\\&= \bm\theta-Lr\frac{\partial J}{\partial\bm\theta}\\&= \bm\theta-Lr\sum_{n=0}^N\bigg(\frac{\partial\big(\frac{1}{I}\sum_{i=1}^I(\theta_nx_n^i-y^i)^2\big)}{\partial\theta_n}\bigg)\\&= \bm\theta-Lr\sum_{n=0}^N\bigg(\frac{1}{2I}\sum_{i=1}^I\Big(\theta_nx_n^i-y^i\Big)x_n^i\bigg)\\&= \bm\theta-Lr\sum_{i=1}^I\Big((\hat{y}^i-y^i)\bm{x}^i\Big)\end{aligned}\) 交叉熵:import sympy x, y, t = sympy.symbols('x y t') print(sympy.diff(y*sympy.log(x*t)+(1-y)*sympy.log((1-(x*t))), t)) # 对交叉熵关于参数t(即θ)求导 输出:-x*(1 - y)/(-t*x + 1) + y/t 所以:\(\displaystyle\bm\theta^\prime= \bm\theta-Lr\sum_{i=1}^I\Big(\big(\frac{y^i}{\hat{y}^i}+\frac{1-y^i}{1-\hat{y}^i}\big)\bm{x}^i\Big)\)
前言 简单介绍一下nginx的静态服务。
正文 一般静态服务一般是alias 和 root。
就是上面这个哈。
那么root和alias 的区别是啥呢?
比如root:
然后修改一下就是:
如果这样配那么就会404了。
我们的意思是/static 然后映射到这个目录下,这样是不行的。它的意思是去/home/html/static上找。
他就必须得和我们的目录对应上。
所以一般用都用alias,因为更加灵活。
一般情况下我们会进行压缩。
gzip on; gzip_min_length 1; gzip_comp_level 2; gzip_types text/plain test/css; gzip 就是打开压缩。
gzip_min_length 表示压缩的源必须大于1个字节。 gzip_comp_level 压缩等级 gzip_types 那些类型被压缩。
这个7就是压缩后的大小。291就是解压后的大小。
另外一个比较常用的就是autoindex。
这个就是列出我们的文件系统。
然后还有一个非常重要的功能,那么就是限速。
set $limit_rate 1k;
具体可参考。
https://nginx.org/en/docs/http/ngx_http_core_module.html#variables
限速指令的生效范围是根据每个连接确定的,例如上面限定每个连接的速率为1k,也就是当客户端发起两个连接的时候,速率就可以变为2k
下面是一个非常重要的,如何处理日志格式。
log_format main '$remote_addr - $remote_user [$time_local] $request ' '$status $body_bytes_sent $http_referer ' '$http_user_agent $http_x_forwarded_for'; 然后进行定义:
查看一下日志: 结 下一节介绍反向代理。
Java方法 什么是方法 Java方法是语句的集合,它们在一起执行一个功能。
方法是解决一类问题的步骤的有序组合
方法包含类或对象中
方法在程序中被创建,在其他地方被引用
设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。设计方法的时候,最好保持方法的原子性。就是一个方法只完成一个功能,这样利于后期的扩展
方法的定义 Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段,一般情况下,定义一个方法包含一下语法:
方法包含一个方法头和一个方法体。其所有部分:
修饰符:修饰符是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
返回值类型:方法可能回返回值
方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值称为实参或者变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
形参:在方法被调用时用于接收外界输入的数据
实参: 调用方法时实际传给方法的数据
方法体:方法体包含具体的语句,定义该方法的功能
修饰符 返回类型 方法名(参数列表){ 方法体 return 返回值; } 方法调用 调用方法:对象名.方法名(实参列表)
java支持两种调用方法的方式,根据方是否返回值来选择。
当方法返回一个值的时候,方法调用通常被当作一个值。例如:
int larger = max(30,40); 如果方法返回值是void,方法调用一定是一条语句。
System.out.print(kllll); 方法的重载 重载就是在一个类中,有相同的函数名称,但是形参不同的函数。
方法的重载的规则:
方法名称必须相同。
参数列表必须不相同(个数、类型、排序不同等)。
方法的返回类型可以相同也可不同。
仅仅返回类型的不同不足以成为方法的重载。
实现理论:
方法名称相同时,编译器会根据调用方法的个数、参数类型去逐个匹配,已选择对应的方法,如果匹配失败,则编译器报错。
可变参数 jdk1.5开始,Java支持传递同类型的可变参数给一个方法。
在方法声明中,在指定参数类型后加一个省略号(...)
一个方法中只能指定一个可变参数,它必须时方法的最后一个参数,任何普通的参数必须在它之前声明。
1、源(软件网址)
/etc/apt/sources.list ## 指定了软件下载的地址 2、更新本地软件包管理器软件列表(可以在包管理器中查看)
sudo apt-get update 3、安装本地软件包管理器软件列表中的软件(将软件列表中的软件和已安装的软件对比,需要更新则安装更新)
sudo apt-get upgrade 一般在指定 sudo apt-get upgrade 之前需要执行 sudo apt-get update,用于更新升级软件。
4、指定安装特定软件
sudo apt-get install xxx_software
emm...很 想法: 枚举类实现季节信息打印 一个简单的交互 一个很艹的剧情 上代码 enum Season package com.wenjun.www; public enum Season { SPRING(温暖,三月),SUMMER(炎热,六月),AUTUMN(凉爽,八月),WINTER(寒冷,十二月); @SuppressWarnings(all) private String intro = ; @SuppressWarnings(all) private String month = ; Test(String intro, String mouth) { this.intro = intro; this.mouth = month; } @Override public String toString() { return this.name().toLowerCase()+ 在+month+最+intro; } } 对吧,直接重写toString()打印完事。不要在意@SuppressWarnings(all)[滑稽]
class mainMenu package com.wenjun.www; import com.wenjun.www.Season; import java.util.Scanner; public class mainMenu { private boolean appear = true; private Scanner choice = new Scanner(System.
1、
001、apt-get是老版的命令,apt是新版的命令。
002、apt包含了apt-get、apt-cache等等,用起来更方便。
003、apt刚刚出来,所以允许有apt-get和apt共存,向后兼容,以后apt-get就要淘汰了。
来源:https://zhidao.baidu.com/question/2057535156362191507.html?qbl=relate_question_0&word=apt-get%BA%CDapt%B5%C4%C7%F8%B1%F0&dyTabStr=MCw0LDYsMSw1LDMsOCw3LDIsOQ%3D%3D
1、检查是否安装crontab
apt-get install cron
说明以及安装过了
一般cron检索的crontab文件。这个文件在默认情况下:/etc/crontab
执行文件在 /etc/init,d/cron
重启: /etc/init.d/cron restart
2、检查安装python
apt-get instll python
获取ip以及发送邮箱的功能
#!/bin/bashimport os# smtplib 用于邮件的发信动作import smtplib# email 用于构建邮件内容from email.mime.text import MIMEText#获取ipv6地址ip6s = [ip.split('/')[0] for ip in os.popen(ip addr | grep 'inet6 '|awk '{print $2}').readlines()]#获取ipv4地址ip4s = [ip.split('/')[0] for ip in os.popen(ip addr | grep 'inet '|awk '{print $2}').readlines()]# 发信方的信息:发信邮箱,QQ 邮箱授权码from_addr = '发信方的信息'password = 'QQ 邮箱授权码'# 收信方邮箱to_addr = '收信方邮箱'# 发信服务器smtp_server = 'smtp.
一、 前言 (1)部分学习总结: (2)题量与难度: 周数
题量
难度
第六周
5
···
第七周
3
······
二、设计与分析 PTA: 第六周: 第七周: 实验: 农夫过河:
授权(GRANT) 语句格式: GRANT 权限 ON TABLE/DATABASE 表名/数据库名 TO 用户1,用户2… /PUBLIC [WITH GRANT OPTION]; PUBLIC:表示将权限授予所有人 WITH GRANT OPTION:表示获得了这个权限的用户还可以将权限赋给其他用户。 对象
对象类型
操作权限
属性
TABLE
SELECT,INSERT,UPDATE,DELETE, ALL PRIVILEGES(4种权限的总和)
视图
TABLE
SELECT,INSERT,UPDATE,DELETE, ALL PRIVILEGES(4种权限的总和
基本表
TABLE
SELECT,INSERT,UPDATE,DELETE,ALTER,INDEX, ALL PRIVILEGES(6种权限的总
数据库
DATABASE
CREATETAB建立表的权限,可由DBA授予普通用户
收回权限(REVOKE) 语句格式: REVOKE 权限 ON TABLE/DATABASE 表名/数据库名 FROM 用户1,用户2… /PUBLIC [RESTRICT | CASCADE]; RESTRICT:表示只收回语句中指定的用户的权限 CASCADE:表示除了收回指定用户的权限外,还收回该用户赋予的其他用户的权限。 例:将用户User1及User2对供应商S、零件P、项目J的所有操作权限收回: