0%

HIWIFI的API

1.获取uuid

GET:http://www.4006024680.com/cgi-bin/turbo/proxy/router_info

json.data.uuid

2.获取local_token

GET: http://www.4006024680.com/local-ssh/api?method=get

json.data

3.打开SSH

GET: http://www.4006024680.com/local-ssh/api?method=valid&data=`[cloud_token]`

4.关闭SSH

GET: http://www.4006024680.com/local-ssh/api?method=stop

5.检查SSH

GET: http://www.4006024680.com/local-ssh/api?method=check_connected


cloud_token 的计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 'RDRFRTA3NjE3NTAwLHNzaCwxNTQwOTMxMzExOTk2LKrM8KmSbnrR8DzGobUdDx6097GH'
const local_token = '';
// 'af930766-ae38-528b-bcd2-d4ee07617500'
const uuid = '';

// 'D4EE07617500,ssh,1540931311996,ªÌð©\x92nzÑð<Æ¡µ\x1D\x0F\x1E´÷±\x87'
let local_token_msg = CryptoJS.enc.Base64.parse(local_token).toString(CryptoJS.enc.Latin1);

// ['D4EE07617500', 'ssh', '1540931311996']
let [mac_address, ssh, timestamp] = local_token_msg.split(',');

timestap = parseInt(timestamp)+1;

// 'D4EE07617500,ssh,1540931311997'
let cloud_token_msg = [mac_address, ssh, timestamp].join(',');

// 'tVyYDiwUvWZ4bIyFBh/EWEc3ndc='
let cloud_token = CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA1(cloud_token_msg,CryptoJS.SHA1(uuid)));

环境

Anaconda

Jupyter

优势在于可以即时运行,随时观察结果

1
2
import torch
import numpy as np

基础知识

1
2
3
# Vector
t1 = torch.tensor([1., 2, 3, 4])
t2 = torch.tensor([[11., 12], [21, 22], [31, 32]])

tensor([1., 2., 3., 4.])
tensor([[11., 12.],
[21., 22.],
[31., 32.]])

1
2
3
# Matrix
x = np.array([[1, 2], [3, 4]])
y = torch.from_numpy(x)

线性回归

先看案例中的线性回归

Region Temp.(F) Rainfall(mm) Humidity(%) Apples(ton) Oranges(ton)
Kanto 73 67 43 56 70
Johto 91 88 64 81 101
Hoenn 87 134 58 119 133
Sinnoh 102 43 37 22 37
Unova 69 96 70 103 119

各地区因环境因素差异而造成苹果和橙子的产量差异

于是有以下线性回归方程用以预测水果产量,相对于不同水果,温度、降水、湿度分别予以不同的权重,外加一个偏差

$$yieldApple = w11 * temp + w12 * rainfall + w13 * humidity + b1$$
$$yieldOrange = w21 * temp + w22 * rainfall + w23 * humidity + b2$$

此刻,我们得到了

  1. 长度为5,宽度为3的输入
  2. 长度为5,宽度为2的输出
  3. 长度为3,宽度为2的权重
  4. 宽度为2的偏差
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Input (temp, rainfall, humidity)
inputs = np.array([[73, 67, 43],
[91, 88, 64],
[87, 134, 58],
[102, 43, 37],
[69, 96, 70]], dtype='float32')

# Targets (apple, oranges)
inputs = np.array([[56, 70],
[81, 101],
[119, 133],
[22, 37],
[103, 119]], dtype='float32')

# Convert inputs and targets to tensors
inputs = torch.from_numpy(inputs)
targets = torch.from_numpy(targets)

# 权重和偏差从随机数开始
# Weights
w = torch.randn(2, 3, requires_grad=True)
# Biases
b = torch.randn(2, requires_grad=True)

\begin {pmatrix}
1 & a_1 & a_1^2 & \cdots & a_1^n \
1 & a_2 & a_2^2 & \cdots & a_2^n \
\vdots & \vdots& \vdots & \ddots & \vdots \
1 & a_m & a_m^2 & \cdots & a_m^n
\end {pmatrix}

所以我们定义模型

1
2
def model(input):
return input @ w.t() + b

预测即为

1
preds = model(inputs)

这里的权重和偏移是随机生成的,所以预测结果合不上很正常

损失函数

1.计算preds和targets之间的差异
2.平方差矩阵所有元素以消除负值
3.计算结果矩阵中元素的平均值
最终结果为均方误差MSE
1
2
3
4
5
6
7
# MSE loss
def mse(t1, t2):
diff = t1 - t2
return torch.sum(diff * diff) / diff.numel()

# Compute loss
loss = mse(preds, targets)

计算梯度

1
2
# Compute gradients
loss.backward()

计算权重梯度

1
2
# Gradients for weights
w.grad

重置梯度

1
2
3
# Reset the gradients
w.grad.zero_()
b.grad.zero_()
  1. 生成预测
  2. 计算损失
  3. 计算梯度w.r.t权重和偏差
  4. 通过减去与梯度成比例的小量来调整权重
  5. 将渐变重置为零
1
2
3
4
5
6
7
8
9
10
# Train for 100 epochs
for _ in range(100):
preds = model(inputs)
loss = mse(preds, targets)
loss.backward()
with torch.no_grad():
w -= w.grad * 1e-5
b -= b.grad * 1e-5
w.grad.zero_()
b.grad.zero_()

总结

创建TensorDataset和DataLoader

1
2
3
4
5
6
7
from torch.utils.data import TensorDataset
from torch.utils.data import DataLoader

batch_size = 5

train_ds = TensorDataset(inputs, targets)
train_dl = DataLoader(train_ds, batch_size, shuffle=True)
1
2
3
4
5
6
7
8
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.linear = nn.Linear(1,1)

def forward(self, x):
out = self.linear(x)
return out

1.找到当前运行APP的包名

1
$ adb shell dumpsys window | grep mCurrentFocus

2.找到应用备份包的位置

1
$ adb shell pm path [com.package.name]

3.提取安装包

1
$ adb pull [/data/app/…/…/base.apk] [localPath(提取到本地地址)]

4.查看将要启动app的包名

1
$ adb shell am monitor

5.查看所有启动的应用的包名

1
$ adb shell dumpsys activity activities | grep "Run"

6.查看启动的app的包名

1
$ adb shell dumpsys activity top | grep "ACTIVITY"

查看某个包的logcat

1
$ adb logcat | grep -F "`adb shell ps | grep  [com.package.name] | awk '{print $2}'`"

1.修复‘xxx.app已损坏无法打开,你应该将它移到废纸篓’

安全隐私任何来源
1
$ sudo spctl --master-disable
绕过公证
1
$ sudo xattr -rd com.apple.quarantine /Applications/xxx.app

2.修复10.15「意外退出」及「崩溃闪退」问题

安装Command Line Tools 工具
1
$ xcode-select --install
签名
1
$ sudo codesign --force --deep --sign - /Applications/xxx.app
若报错
1
$ xattr -cr /Applications/xxx.app

再签名

3.home-brew安装

1
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

4.调整Launchpad图标大小

1
2
3
$ defaults write com.apple.dock springboard-rows -int 6
$ defaults write com.apple.dock springboard-columns -int 8
$ killall Dock

恢复

1
2
3
$ defaults write com.apple.dock springboard-rows Default
$ defaults write com.apple.dock springboard-columns Default
$ killall Dock

5.隐藏桌面文件

1
$ defaults write com.apple.finder CreateDesktop -bool false;killall Finder

恢复显示

1
$ defaults write com.apple.finder CreateDesktop -bool true;killall Finder