Python 大法好, AnyDesk 强制国内节点加速脚本
``` python
# anydesk cn relay scan https://github.com/bestK/anydesk-cn-relay-scan
from bs4 import BeautifulSoup
import httpx
url = 'https://domain.glass/net.anydesk.com.cn'
# anydesk 配置文件路径
anydesk_conf = 'C:\\Users\\WIN10\\AppData\\Roaming\\AnyDesk\\system.conf'
client = httpx.Client( http2=True, verify=False)
headers = {
'authority': 'domain.glass',
'method': 'GET',
'path': '/net.anydesk.com.cn',
'scheme': 'https',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'sec-fetch-site': 'none',
'sec-fetch-mode': 'navigate',
'sec-fetch-dest': 'document',
'accept-language': 'zh-CN,zh;q=0.9'
}
resp = client.get(url, headers=headers)
soup = BeautifulSoup(resp,"html.parser")
with open(anydesk_conf, mode='a') as conf:
for a in soup.find_all('a'):
if a.string != None and a.string.startswith('relay'):
print(a.string)
conf.write('\n')
conf.write("ad.anynet.last_relay={}:80:443:6568".format(a.string))
conf.close()
```
灵感来源 https://www.v2ex.com/t/869623#reply5 @basncy
#anydesk #conf #cn #relay #https #com #string #headers #application #0.9
``` python
# anydesk cn relay scan https://github.com/bestK/anydesk-cn-relay-scan
from bs4 import BeautifulSoup
import httpx
url = 'https://domain.glass/net.anydesk.com.cn'
# anydesk 配置文件路径
anydesk_conf = 'C:\\Users\\WIN10\\AppData\\Roaming\\AnyDesk\\system.conf'
client = httpx.Client( http2=True, verify=False)
headers = {
'authority': 'domain.glass',
'method': 'GET',
'path': '/net.anydesk.com.cn',
'scheme': 'https',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'sec-fetch-site': 'none',
'sec-fetch-mode': 'navigate',
'sec-fetch-dest': 'document',
'accept-language': 'zh-CN,zh;q=0.9'
}
resp = client.get(url, headers=headers)
soup = BeautifulSoup(resp,"html.parser")
with open(anydesk_conf, mode='a') as conf:
for a in soup.find_all('a'):
if a.string != None and a.string.startswith('relay'):
print(a.string)
conf.write('\n')
conf.write("ad.anynet.last_relay={}:80:443:6568".format(a.string))
conf.close()
```
灵感来源 https://www.v2ex.com/t/869623#reply5 @basncy
#anydesk #conf #cn #relay #https #com #string #headers #application #0.9
请大佬指教 Swift codable 的问题
我刚用 swift
用到 codable 时,有两个疑问
1.后端返回的数据我只用到一部分,我的做法是先转成 json ,然后取出我用到的字段的值,再转成 Data ,最后用 codable 转成我自己的 struct ,这就损失了效率,有好的解决办法嘛?
2.我和其他端( web ,andriod ,后端)共同读写一份 json 文件,有共用的字段,也有各端单独用到的字段,不能在读写过程中弄丢了。我在用 codable 时,碰到其他端的字段,是[String : Any]或者[[String : Any]]类型的, 没法 Codable 了,这个怎么搞?
#codable #转成 #用到 #json #String #Any #读写 #各端 #刚用 #swift
我刚用 swift
用到 codable 时,有两个疑问
1.后端返回的数据我只用到一部分,我的做法是先转成 json ,然后取出我用到的字段的值,再转成 Data ,最后用 codable 转成我自己的 struct ,这就损失了效率,有好的解决办法嘛?
2.我和其他端( web ,andriod ,后端)共同读写一份 json 文件,有共用的字段,也有各端单独用到的字段,不能在读写过程中弄丢了。我在用 codable 时,碰到其他端的字段,是[String : Any]或者[[String : Any]]类型的, 没法 Codable 了,这个怎么搞?
#codable #转成 #用到 #json #String #Any #读写 #各端 #刚用 #swift
Goravel 让微服务间通讯如此简单,省出来的时间想干点啥干点啥吧
[Goravel]( https://github.com/goravel/goravel "Goravel") 升级 v1.4 ,使微服务间请求更加简单一体化。No bb, show the code.
> Goravel 是一个功能完备、具有良好扩展能力的 Golang Web 应用程序框架。风格与 Laravel 保持一致,让 PHPer 不用学习新的框架,也可以愉快的玩转 Golang !
## 服务端
1. 定义接口
```
func (r *UserController) GetUser(ctx context.Context, req *grpcuser.UserRequest) (*grpcuser.UserResponse, error) {
return &grpcuser.UserResponse{Name: "Goravel"}, nil
}
```
2. 运行服务
```
facades.Grpc.Run(facades.Config.GetString("grpc.host"))
```
## 客户端
1. 配置服务
```
facades.Config.Add("grpc", map[string]interface{}{
"clients": map[string]any{
"user": map[string]any{
"host": config.Env("GRPC_USER_HOST", ""),
"interceptors": []string{"trace"},
},
},
})
```
2. 发起请求
```
func (r *ServiceImpl) GetUser(ctx context.Context, userID uint64) (*grpcuser.User, error) {
// 创建客户端实例
client, _ := facades.Grpc.Client(ctx, "user")
// 注册服务
userServiceClient := grpcuser.NewUserServiceClient(client)
// 调用接口
resp, _ := userServiceClient.GetUser(ctx, &grpcuser.UserRequest{
UserID: userID,
})
return resp.Data, nil
}
```
Over, 欢迎 Star 、PR 、Issues!
#grpcuser #Goravel #ctx #facades #string #GetUser #map #goravel #Golang ###
[Goravel]( https://github.com/goravel/goravel "Goravel") 升级 v1.4 ,使微服务间请求更加简单一体化。No bb, show the code.
> Goravel 是一个功能完备、具有良好扩展能力的 Golang Web 应用程序框架。风格与 Laravel 保持一致,让 PHPer 不用学习新的框架,也可以愉快的玩转 Golang !
## 服务端
1. 定义接口
```
func (r *UserController) GetUser(ctx context.Context, req *grpcuser.UserRequest) (*grpcuser.UserResponse, error) {
return &grpcuser.UserResponse{Name: "Goravel"}, nil
}
```
2. 运行服务
```
facades.Grpc.Run(facades.Config.GetString("grpc.host"))
```
## 客户端
1. 配置服务
```
facades.Config.Add("grpc", map[string]interface{}{
"clients": map[string]any{
"user": map[string]any{
"host": config.Env("GRPC_USER_HOST", ""),
"interceptors": []string{"trace"},
},
},
})
```
2. 发起请求
```
func (r *ServiceImpl) GetUser(ctx context.Context, userID uint64) (*grpcuser.User, error) {
// 创建客户端实例
client, _ := facades.Grpc.Client(ctx, "user")
// 注册服务
userServiceClient := grpcuser.NewUserServiceClient(client)
// 调用接口
resp, _ := userServiceClient.GetUser(ctx, &grpcuser.UserRequest{
UserID: userID,
})
return resp.Data, nil
}
```
Over, 欢迎 Star 、PR 、Issues!
#grpcuser #Goravel #ctx #facades #string #GetUser #map #goravel #Golang ###
正则表达式匹配问题求教
能否使用一条正则表达式匹配并过滤如以下文本:
```text
import 'dart:convert';
import 'dart:io';
import 'dart:math';
class Api {
static String getData = '/api/User/getMe';
}
static String name = "TbrAPiCache";
```
使用正则匹配到单引或者双引的内容的同时,过滤包含 import 的行,匹配到的内容如下:
```text
'/api/User/getMe'
"TbrAPiCache"
```
#import #dart #text #static #String #api #User #getMe #TbrAPiCache #匹配
能否使用一条正则表达式匹配并过滤如以下文本:
```text
import 'dart:convert';
import 'dart:io';
import 'dart:math';
class Api {
static String getData = '/api/User/getMe';
}
static String name = "TbrAPiCache";
```
使用正则匹配到单引或者双引的内容的同时,过滤包含 import 的行,匹配到的内容如下:
```text
'/api/User/getMe'
"TbrAPiCache"
```
#import #dart #text #static #String #api #User #getMe #TbrAPiCache #匹配
遇到诡异的问题:字符串"突变"
代码如下:
```
for k, value := range MetaMap {
k = "Meta-" + k
header.Set(k, value)
}
```
其中 header ==> http.Header{}, MetaMap ==> map[string]string 且只有一个键值对: Password: admin123 ,但是 Debug 发现 header 中却是 Meta_password ,而不是 Meta-Password 。有人遇到过这种问题吗
Debug 是在远程主机上运行的,本地和远端代码一模一样,本地通过 git push 到 GitHub ,远端直接 git pull ,且两端的编译命令相同,go 版本相同。本地却没有这样的问题。
#Meta #header #value #MetaMap #string #Password #Debug #git #本地 #远端
代码如下:
```
for k, value := range MetaMap {
k = "Meta-" + k
header.Set(k, value)
}
```
其中 header ==> http.Header{}, MetaMap ==> map[string]string 且只有一个键值对: Password: admin123 ,但是 Debug 发现 header 中却是 Meta_password ,而不是 Meta-Password 。有人遇到过这种问题吗
Debug 是在远程主机上运行的,本地和远端代码一模一样,本地通过 git push 到 GitHub ,远端直接 git pull ,且两端的编译命令相同,go 版本相同。本地却没有这样的问题。
#Meta #header #value #MetaMap #string #Password #Debug #git #本地 #远端
请问下字符串是怎么转正则的
因为完全搞不懂正则该怎么写
所以去这里找的 https://any86.github.io/any-rule/
使用字面量是没有问题的,但是使用字符串构建正则对象就有问题了
`
/^(?:(?:\+|00)86)?1[3-9]\d{9}$/
//这是一条校验手机号的正则
const reg = new RegExp('/^(?:(?:\+|00)86)?1[3-9]\d{9}$/')
//这样会报错:Invalid regular expression
escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
}
new RegExp(escapeRegExp('/^(?:(?:\+|00)86)?1[3-9]\d{9}$/'))
//这样可以生成正则,但是无法校验成功
`
#正则 #00 #86 #new #RegExp #escapeRegExp #string #校验 #报错 #https
因为完全搞不懂正则该怎么写
所以去这里找的 https://any86.github.io/any-rule/
使用字面量是没有问题的,但是使用字符串构建正则对象就有问题了
`
/^(?:(?:\+|00)86)?1[3-9]\d{9}$/
//这是一条校验手机号的正则
const reg = new RegExp('/^(?:(?:\+|00)86)?1[3-9]\d{9}$/')
//这样会报错:Invalid regular expression
escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
}
new RegExp(escapeRegExp('/^(?:(?:\+|00)86)?1[3-9]\d{9}$/'))
//这样可以生成正则,但是无法校验成功
`
#正则 #00 #86 #new #RegExp #escapeRegExp #string #校验 #报错 #https
求教 os.readfile 内存溢出的问题
求教一个内存溢出的问题
pprof 显示在 os.readfile 上有大量内存占用无法释放
请问我下面的写法具体哪里有问题
已经尝试很多办法,都没效果
恳请赐教
```go
var GMap=map[string]string
func DomainMapLoadFromFile() {
GMap=make(map[string]string,10)
//尝试解决内存溢出
fileStr := ReadAll("DataMap", "CacheMap")
contentStrArr := strings.Split(*fileStr, "\n")
contentLen := len(contentStrArr)
contentArr := make([]string, contentLen)
copy(contentArr, contentStrArr)
var wg sync.WaitGroup
wg.Add(contentLen)
for i := range contentArr {
go func(content string) {
infoArr := strings.Split(content, "|")
var deviceId int64
l := len(infoArr)
if l == 2 {
data1 = infoArr[0]
data2 = infoArr[1]
} else {
fmt.Println("不符合长度 5-6 的数据,content:" + content)
wg.Done()
return
}
GMap[data1]=data2
wg.Done()
}(contentArr[i])
}
wg.Wait()
}
func ReadAll(fileName, dirName string) *string {
content, _ := os.ReadFile(GetFilePathPWD(fileName, dirName))
contentStr := string(content)
return &contentStr
}
```
#string #content #wg #contentArr #infoArr #var #GMap #func #contentStrArr #contentLen
求教一个内存溢出的问题
pprof 显示在 os.readfile 上有大量内存占用无法释放
请问我下面的写法具体哪里有问题
已经尝试很多办法,都没效果
恳请赐教
```go
var GMap=map[string]string
func DomainMapLoadFromFile() {
GMap=make(map[string]string,10)
//尝试解决内存溢出
fileStr := ReadAll("DataMap", "CacheMap")
contentStrArr := strings.Split(*fileStr, "\n")
contentLen := len(contentStrArr)
contentArr := make([]string, contentLen)
copy(contentArr, contentStrArr)
var wg sync.WaitGroup
wg.Add(contentLen)
for i := range contentArr {
go func(content string) {
infoArr := strings.Split(content, "|")
var deviceId int64
l := len(infoArr)
if l == 2 {
data1 = infoArr[0]
data2 = infoArr[1]
} else {
fmt.Println("不符合长度 5-6 的数据,content:" + content)
wg.Done()
return
}
GMap[data1]=data2
wg.Done()
}(contentArr[i])
}
wg.Wait()
}
func ReadAll(fileName, dirName string) *string {
content, _ := os.ReadFile(GetFilePathPWD(fileName, dirName))
contentStr := string(content)
return &contentStr
}
```
#string #content #wg #contentArr #infoArr #var #GMap #func #contentStrArr #contentLen
「Goravel 上新」用户授权模块,让你简单的对非法用户 Say No!
首先,让我们定义一个规则:用户只能访问自己创建的文章。
```go
facades.Gate.Define("update-post", func(ctx context.Context, arguments map[string]any) *access.Response {
user := ctx.Value("user").(models.User)
post := arguments["post"].(models.Post)
if user.ID == post.UserID {
return access.NewAllowResponse()
} else {
return access.NewDenyResponse("error")
}
})
```
然后判断单个权限:
```go
if facades.Gate.Allows("update-post", map[string]any{
"post": post,
}) {
// todo
}
```
你也可以同时判断多个权限:
```go
if facades.Gate.Any([]string{"update-post", "delete-post"}, map[string]any{
"post": post,
}) {
// 用户可以提交 update 或 delete...
}
if facades.Gate.None([]string{"update-post", "delete-post"}, map[string]any{
"post": post,
}) {
// 用户不可以提交 update 和 delete...
}
```
你甚至可以定义 `Before` 与 `After` 进行授权前后的拦截,详见文档。
Over, 就是如此简单!
## 关于 Goravel
[Goravel]( https://github.com/goravel/goravel) 是一个功能完备、具有良好扩展能力的 Web 应用程序框架。作为一个起始脚手架帮助 Golang 开发者快速构建自己的应用。
框架风格与 Laravel 保持一致,让 PHPer 不用学习新的框架,也可以愉快的玩转 Golang !致敬 Laravel !
Welcome star, PR and issues !
#post #update #string #facades #Gate #map #any #delete #go #access
首先,让我们定义一个规则:用户只能访问自己创建的文章。
```go
facades.Gate.Define("update-post", func(ctx context.Context, arguments map[string]any) *access.Response {
user := ctx.Value("user").(models.User)
post := arguments["post"].(models.Post)
if user.ID == post.UserID {
return access.NewAllowResponse()
} else {
return access.NewDenyResponse("error")
}
})
```
然后判断单个权限:
```go
if facades.Gate.Allows("update-post", map[string]any{
"post": post,
}) {
// todo
}
```
你也可以同时判断多个权限:
```go
if facades.Gate.Any([]string{"update-post", "delete-post"}, map[string]any{
"post": post,
}) {
// 用户可以提交 update 或 delete...
}
if facades.Gate.None([]string{"update-post", "delete-post"}, map[string]any{
"post": post,
}) {
// 用户不可以提交 update 和 delete...
}
```
你甚至可以定义 `Before` 与 `After` 进行授权前后的拦截,详见文档。
Over, 就是如此简单!
## 关于 Goravel
[Goravel]( https://github.com/goravel/goravel) 是一个功能完备、具有良好扩展能力的 Web 应用程序框架。作为一个起始脚手架帮助 Golang 开发者快速构建自己的应用。
框架风格与 Laravel 保持一致,让 PHPer 不用学习新的框架,也可以愉快的玩转 Golang !致敬 Laravel !
Welcome star, PR and issues !
#post #update #string #facades #Gate #map #any #delete #go #access
企业微信机器人推送消息开发流程
首先是你需要申请一个企业微信,如果没有营业执照也可以申请成功,只是有些功能会被限制,就填写一些信息就可以了。
然后去官网看参考文档说明,实际创建一个企业微信机器人你会发现它其实就是一个接口,会有个 webhook 的 url 地址,可以发文本格式或者 Markdown 格式,发送指令就是 json 格式的:
部分 java 代码:
public void sendjsonpost(String temp){
try {
httpClient = new DefaultHttpClient();
httpPost = new HttpPost(WX_TOKEN);
httpPost.addHeader("Content-Type", "application/json; charset=utf-8");
param = new HashMap();
Map map = new HashMap();
map.put("content","你好:"+temp);
map.put("mentioned_list","@all");
param.put("msgtype","text");
param.put("text",map);
String p = map2json(param);
StringEntity entity = new StringEntity(p,"utf-8");
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute( httpPost);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
String result = EntityUtils.toString(response.getEntity(), "UTF-8");
System.out.println(result);
}
} catch (IOException e) {
e.printStackTrace();
}
}
String temp = "";
JSONObject jt = JSONObject.parseObject(holiday);
String name = jt.getString("name");
String h_date = jt.getString("date");
temp = "现在是:" + h_date + "("+ week +"),为" + name + ",限行不能开车!"+"\n" + WX_WORK;
//欢迎技术交流
String Qq[]=“2645542961”;
char testbuff[0x1024];
组装 json 数据,然后调用方法 workReport ,把 temp 参数传进去就可以了。然后在挂个定时,这样就不会被忘记限行开车了。
但是想做更完善的功能,官方没有这些接口,比如 外部群消息,回调消息,好友管理等。
这些需要 PC 版企微模拟,现在已经实现了这些功能,还可以通过其他开发语言调用二次开发,可以开发出很多灵活实用的功能。
#String #temp #new #httpPost #param #map #put #json #response #jt
首先是你需要申请一个企业微信,如果没有营业执照也可以申请成功,只是有些功能会被限制,就填写一些信息就可以了。
然后去官网看参考文档说明,实际创建一个企业微信机器人你会发现它其实就是一个接口,会有个 webhook 的 url 地址,可以发文本格式或者 Markdown 格式,发送指令就是 json 格式的:
部分 java 代码:
public void sendjsonpost(String temp){
try {
httpClient = new DefaultHttpClient();
httpPost = new HttpPost(WX_TOKEN);
httpPost.addHeader("Content-Type", "application/json; charset=utf-8");
param = new HashMap();
Map map = new HashMap();
map.put("content","你好:"+temp);
map.put("mentioned_list","@all");
param.put("msgtype","text");
param.put("text",map);
String p = map2json(param);
StringEntity entity = new StringEntity(p,"utf-8");
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute( httpPost);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
String result = EntityUtils.toString(response.getEntity(), "UTF-8");
System.out.println(result);
}
} catch (IOException e) {
e.printStackTrace();
}
}
String temp = "";
JSONObject jt = JSONObject.parseObject(holiday);
String name = jt.getString("name");
String h_date = jt.getString("date");
temp = "现在是:" + h_date + "("+ week +"),为" + name + ",限行不能开车!"+"\n" + WX_WORK;
//欢迎技术交流
String Qq[]=“2645542961”;
char testbuff[0x1024];
组装 json 数据,然后调用方法 workReport ,把 temp 参数传进去就可以了。然后在挂个定时,这样就不会被忘记限行开车了。
但是想做更完善的功能,官方没有这些接口,比如 外部群消息,回调消息,好友管理等。
这些需要 PC 版企微模拟,现在已经实现了这些功能,还可以通过其他开发语言调用二次开发,可以开发出很多灵活实用的功能。
#String #temp #new #httpPost #param #map #put #json #response #jt
这段数据是用什么字符集编码的? 在 Swift 中用 base64 解码怎么解都是 nil
数据中包含隐私信息, 所以先放个截图.

在 https://www.base64decode.org/ 中将数据放进去, 选择 AUTO-DETECT 是可以正确解码, 除此之外所有的选项都试过, 都不能正确解码, 有些中文会乱码, 有些则直接将中文变为空.

将正确解码后的数据再使用 CP936 字符集编码, 最接近原来的数据, 但还不完全一样.
使用 js 等工具可以正常解码, atob -> escape -> encodeURIComponent.
但在 Swift 中尝试了好多方法都不能正常解码, 全部都是 nil:
```
extension String {
func base64DecodedUsingSJIS() -> String? {
if let data = Data(base64Encoded: self) {
let decodedString = String(data: data, encoding: .init(rawValue: CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.shiftJIS.rawValue))))
return decodedString
}
return nil
}
func base64Decoded() -> String? {
guard let data = Data(base64Encoded: self) else { return nil }
return String(data: data, encoding: .utf8)
}
func base64DecodedASCII() -> String? {
guard let data = Data(base64Encoded: self) else { return nil }
return String(data: data, encoding: .ascii)
}
}
```
#data #String #return #解码 #nil #let #https #func #Data #base64Encoded
数据中包含隐私信息, 所以先放个截图.

在 https://www.base64decode.org/ 中将数据放进去, 选择 AUTO-DETECT 是可以正确解码, 除此之外所有的选项都试过, 都不能正确解码, 有些中文会乱码, 有些则直接将中文变为空.

将正确解码后的数据再使用 CP936 字符集编码, 最接近原来的数据, 但还不完全一样.
使用 js 等工具可以正常解码, atob -> escape -> encodeURIComponent.
但在 Swift 中尝试了好多方法都不能正常解码, 全部都是 nil:
```
extension String {
func base64DecodedUsingSJIS() -> String? {
if let data = Data(base64Encoded: self) {
let decodedString = String(data: data, encoding: .init(rawValue: CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.shiftJIS.rawValue))))
return decodedString
}
return nil
}
func base64Decoded() -> String? {
guard let data = Data(base64Encoded: self) else { return nil }
return String(data: data, encoding: .utf8)
}
func base64DecodedASCII() -> String? {
guard let data = Data(base64Encoded: self) else { return nil }
return String(data: data, encoding: .ascii)
}
}
```
#data #String #return #解码 #nil #let #https #func #Data #base64Encoded
Java process 的一些疑问
```
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException, InterruptedException {
String command1 = "java -version";
String command2="/Users/user1/develop/ffmpeg/ffmpeg -i /Users/user1/develop/ffmpeg/input.avi -vflpossa fps=1/5 /Users/user1/develop/ffmpeg/input.avi.%d.jpg";
Process p=Runtime.getRuntime().exec(command1);
ProcessHandler.dealStream(p);
p.waitFor();
System.out.println("结束了");
}
}
```
```
import lombok.extern.slf4j.Slf4j;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* ref: https://blog.csdn.net/weixin_33690367/article/details/86134029
*/
@Slf4j
public class ProcessHandler {
public static String dealStream(Process process) {
StringBuilder builder = new StringBuilder();
if (process == null) {
return null;
}
// 处理 InputStream 的线程
new Thread(() -> {
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
try {
while ((line = in.readLine()) != null) {
builder.append(line);
log.info("input===: " + line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
// TODO 处理出错
e.printStackTrace();
}
}
}).start();
// 处理 ErrorStream 的线程
new Thread(() -> {
BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line;
try {
while ((line = err.readLine()) != null) {
builder.append(line);
log.info("错误---: " + line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
err.close();
} catch (IOException e) {
// TODO 处理出错
e.printStackTrace();
}
}
}).start();
return builder.toString();
}
}
```
1.为啥 process 一些正常的输出都在 errorStream 里?现在有一个需求想用 ffmpeg 执行转码,如果转码出错了,是不是应该读取 标出错误输出流里 errorStream 里的内容,如果 errorStream 里有内容(或者有 error 字符串,可以认为是转码失败了?但现在输出测试下来怎么都在 inputstream 里。。
```
结束了
14:04:19.433 [Thread-1] INFO com.utils.ProcessHandler - 错误---: java version "1.8.0_291"
14:04:19.436 [Thread-1] INFO com.utils.ProcessHandler - 错误---: Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
14:04:19.436 [Thread-1] INFO com.utils.ProcessHandler - 错误---: Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
```
2.process 机制原因会导致死锁,所以需要在 waitfor 方法之前,创建线程用于处理 inputstream 中缓冲区的数据。
不用其他线程清空 process 的缓冲区可以吗。在 process 开始后,单靠主线程读取缓冲的内容,读完了主线程再 waitfor 不可以吗。
#process #line #IOException #new #java #String #import #ffmpeg #ProcessHandler #BufferedReader
```
import java.io.IOException;
public class Test {
public static void main(String[] args) throws IOException, InterruptedException {
String command1 = "java -version";
String command2="/Users/user1/develop/ffmpeg/ffmpeg -i /Users/user1/develop/ffmpeg/input.avi -vflpossa fps=1/5 /Users/user1/develop/ffmpeg/input.avi.%d.jpg";
Process p=Runtime.getRuntime().exec(command1);
ProcessHandler.dealStream(p);
p.waitFor();
System.out.println("结束了");
}
}
```
```
import lombok.extern.slf4j.Slf4j;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* ref: https://blog.csdn.net/weixin_33690367/article/details/86134029
*/
@Slf4j
public class ProcessHandler {
public static String dealStream(Process process) {
StringBuilder builder = new StringBuilder();
if (process == null) {
return null;
}
// 处理 InputStream 的线程
new Thread(() -> {
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
try {
while ((line = in.readLine()) != null) {
builder.append(line);
log.info("input===: " + line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
// TODO 处理出错
e.printStackTrace();
}
}
}).start();
// 处理 ErrorStream 的线程
new Thread(() -> {
BufferedReader err = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String line;
try {
while ((line = err.readLine()) != null) {
builder.append(line);
log.info("错误---: " + line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
err.close();
} catch (IOException e) {
// TODO 处理出错
e.printStackTrace();
}
}
}).start();
return builder.toString();
}
}
```
1.为啥 process 一些正常的输出都在 errorStream 里?现在有一个需求想用 ffmpeg 执行转码,如果转码出错了,是不是应该读取 标出错误输出流里 errorStream 里的内容,如果 errorStream 里有内容(或者有 error 字符串,可以认为是转码失败了?但现在输出测试下来怎么都在 inputstream 里。。
```
结束了
14:04:19.433 [Thread-1] INFO com.utils.ProcessHandler - 错误---: java version "1.8.0_291"
14:04:19.436 [Thread-1] INFO com.utils.ProcessHandler - 错误---: Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
14:04:19.436 [Thread-1] INFO com.utils.ProcessHandler - 错误---: Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
```
2.process 机制原因会导致死锁,所以需要在 waitfor 方法之前,创建线程用于处理 inputstream 中缓冲区的数据。
不用其他线程清空 process 的缓冲区可以吗。在 process 开始后,单靠主线程读取缓冲的内容,读完了主线程再 waitfor 不可以吗。
#process #line #IOException #new #java #String #import #ffmpeg #ProcessHandler #BufferedReader
请教个 golang 自定义 interface 作 函数形参 的问题
代码如下
```
package main
type ObjForGroupBy interface {
GetValueForGroupBy() string
}
func GroupBy(data []ObjForGroupBy) map[string][]ObjForGroupBy {
var result = make(map[string][]ObjForGroupBy)
for _, obj := range data {
strV := obj.GetValueForGroupBy()
result[strV] = append(result[strV], obj)
}
return result
}
type Course struct {
Day string
}
func (c Course) GetValueForGroupBy() string {
return c.Day
}
func main() {
var courses []Course
courses = append(courses, Course{Day: "Monday"})
GroupBy(courses)
}
```
报错为
```
cannot use courses (variable of type []Course) as type []ObjForGroupBy in argument to GroupBy
```
搞的我有点懵,是我理解错了 interface 吗?传单数 ObjForGroupBy 的函数,可以正常用,传 slice 就不行。来个朋友指点一下
#ObjForGroupBy #string #Course #courses #type #result #GetValueForGroupBy #func #GroupBy #obj
代码如下
```
package main
type ObjForGroupBy interface {
GetValueForGroupBy() string
}
func GroupBy(data []ObjForGroupBy) map[string][]ObjForGroupBy {
var result = make(map[string][]ObjForGroupBy)
for _, obj := range data {
strV := obj.GetValueForGroupBy()
result[strV] = append(result[strV], obj)
}
return result
}
type Course struct {
Day string
}
func (c Course) GetValueForGroupBy() string {
return c.Day
}
func main() {
var courses []Course
courses = append(courses, Course{Day: "Monday"})
GroupBy(courses)
}
```
报错为
```
cannot use courses (variable of type []Course) as type []ObjForGroupBy in argument to GroupBy
```
搞的我有点懵,是我理解错了 interface 吗?传单数 ObjForGroupBy 的函数,可以正常用,传 slice 就不行。来个朋友指点一下
#ObjForGroupBy #string #Course #courses #type #result #GetValueForGroupBy #func #GroupBy #obj
「Goravel 上新」验证表单的三种新姿势,估计你只用过一种
验证用户输入的数据是我们开发中最常见的需求,Goravel 提供三种验证姿势,个个简单好用!
## 第一种:简单直接式
根据表单内容直接校验:
```
func (r *PostController) Store(ctx http.Context) {
validator, err := ctx.Request().Validate(map[string]string{
"title": "required|max_len:255",
"body": "required",
})
}
```
## 第二种:自由定义式
自定义验证数据:
```
validator, err := facades.Validation.Make(map[string]any{
"name": "Goravel",
}, map[string]string{
"title": "required|max_len:255",
"body": "required",
})
```
## 第三种:优雅文艺式
使用命令 `go run . artisan make:request StorePostRequest ` 创建一个「表单请求类」,并定义规则:
```
package requests
import (
"github.com/goravel/framework/contracts/http"
"github.com/goravel/framework/contracts/validation"
)
type StorePostRequest struct {
Name string `form:"name" json:"name"`
}
// 验证授权
func (r *StorePostRequest) Authorize(ctx http.Context) error {
return nil
}
// 定义规则
func (r *StorePostRequest) Rules() map[string]string {
return map[string]string{
"title": "required|max_len:255",
"body": "required",
}
}
// 自定义错误信息
func (r *StorePostRequest) Messages() map[string]string {
return map[string]string{}
}
// 自定义字段名
func (r *StorePostRequest) Attributes() map[string]string {
return map[string]string{}
}
// 数据预处理
func (r *StorePostRequest) PrepareForValidation(data validation.Data) {
}
```
然后校验:
```
func (r *PostController) Store(ctx http.Context) {
var storePost requests.StorePostRequest
errors, err := ctx.Request().ValidateRequest(&storePost)
}
```
## 关于 Goravel
[Goravel]( https://github.com/goravel/goravel) 是一个功能完备、具有良好扩展能力的 Web 应用程序框架。作为一个起始脚手架帮助 Golang 开发者快速构建自己的应用。
框架风格与 Laravel 保持一致,让 PHPer 不用学习新的框架,也可以愉快的玩转 Golang !致敬 Laravel !
Welcome star, PR and issues !
#string #map #StorePostRequest #func #required #ctx #Goravel ### #http #goravel
验证用户输入的数据是我们开发中最常见的需求,Goravel 提供三种验证姿势,个个简单好用!
## 第一种:简单直接式
根据表单内容直接校验:
```
func (r *PostController) Store(ctx http.Context) {
validator, err := ctx.Request().Validate(map[string]string{
"title": "required|max_len:255",
"body": "required",
})
}
```
## 第二种:自由定义式
自定义验证数据:
```
validator, err := facades.Validation.Make(map[string]any{
"name": "Goravel",
}, map[string]string{
"title": "required|max_len:255",
"body": "required",
})
```
## 第三种:优雅文艺式
使用命令 `go run . artisan make:request StorePostRequest ` 创建一个「表单请求类」,并定义规则:
```
package requests
import (
"github.com/goravel/framework/contracts/http"
"github.com/goravel/framework/contracts/validation"
)
type StorePostRequest struct {
Name string `form:"name" json:"name"`
}
// 验证授权
func (r *StorePostRequest) Authorize(ctx http.Context) error {
return nil
}
// 定义规则
func (r *StorePostRequest) Rules() map[string]string {
return map[string]string{
"title": "required|max_len:255",
"body": "required",
}
}
// 自定义错误信息
func (r *StorePostRequest) Messages() map[string]string {
return map[string]string{}
}
// 自定义字段名
func (r *StorePostRequest) Attributes() map[string]string {
return map[string]string{}
}
// 数据预处理
func (r *StorePostRequest) PrepareForValidation(data validation.Data) {
}
```
然后校验:
```
func (r *PostController) Store(ctx http.Context) {
var storePost requests.StorePostRequest
errors, err := ctx.Request().ValidateRequest(&storePost)
}
```
## 关于 Goravel
[Goravel]( https://github.com/goravel/goravel) 是一个功能完备、具有良好扩展能力的 Web 应用程序框架。作为一个起始脚手架帮助 Golang 开发者快速构建自己的应用。
框架风格与 Laravel 保持一致,让 PHPer 不用学习新的框架,也可以愉快的玩转 Golang !致敬 Laravel !
Welcome star, PR and issues !
#string #map #StorePostRequest #func #required #ctx #Goravel ### #http #goravel
在字符串性能上,传统 C++库被游戏业打的鼻青脸肿。
今年 2022 C++开发者大会上,有一个写游戏的作者,写了个基于 SIMD 优化的字符串,然后对比了传统 std::string 性能,几乎是秒杀了。
要知道 std::string 也进化了那么多年,时至今日,还是被游戏业打的找不到北,只能说游戏业对于性能的无止尽追求的欲望,实在太强了。
作者也开源了( www.youtube.co.jp/watch?v=fglXeSWGVDc ),并附上了性能对比截图:
https://i.imgur.com/qevrlYr.jpg
#std #string #游戏 #性能 #对比 #无止尽 #2022 #C++ #SIMD #业打
今年 2022 C++开发者大会上,有一个写游戏的作者,写了个基于 SIMD 优化的字符串,然后对比了传统 std::string 性能,几乎是秒杀了。
要知道 std::string 也进化了那么多年,时至今日,还是被游戏业打的找不到北,只能说游戏业对于性能的无止尽追求的欲望,实在太强了。
作者也开源了( www.youtube.co.jp/watch?v=fglXeSWGVDc ),并附上了性能对比截图:
https://i.imgur.com/qevrlYr.jpg
#std #string #游戏 #性能 #对比 #无止尽 #2022 #C++ #SIMD #业打
不用第三方 auth 库纯手写的情况下,怎么处理例如 passwd 或 token 之类的敏感信息?
因为有需要通过 keycloak 进行授权的需求,一开始是想找看有没有官方提供的 lib ,结果发现因为各种原因(比如说框架太新、依赖没更上等)并没有能用的,强行找一个的结果就是出现各种诡异的错误(比如说 userid 始终为 null )。
然后考虑能不能直接调用 http 请求,自行拼接 header 和 body……postman 测试完全可以,只要自己记得保存 access_token 和 refresh_token 就行了。但是问题来了……
把登入时需要的信息保存下来,也就是大概会创建一个长这样的 store:
```
{
client_id: string, client_secret: string, ...
}
```
而且在调用 http request 的时候,也会把用户名和密码直接传过去。如果在浏览器里面打断点的话,可以直接取得当前的用户名和密码。就算是 app client ,也是可以通过 hack 进内存的方式获得这些敏感信息的吧。
如果把这些 passwd 和 token 在 store 里面 encrypt 的话,问题在于和 keycloak 通信的时候需要传输这个 token 本身,也就是说 encrypt 的内容必须能够被解密,在已知源代码或源代码产生物的时候,这样就意味着白加密了。
那么一般对待这些敏感信息的话,该用什么方式来处理以防止信息泄漏呢?
话说过来也看了一下现在在用的客户端开发的框架里面的非官方 keycloak 封装库……感觉就是直接在 http api 上封装了一层,压根没有讨论到加密的内容……所以大概也是不符合要求的了。
#token #keycloak #http #client #源代码 #store #string #encrypt #用户名 #信息
因为有需要通过 keycloak 进行授权的需求,一开始是想找看有没有官方提供的 lib ,结果发现因为各种原因(比如说框架太新、依赖没更上等)并没有能用的,强行找一个的结果就是出现各种诡异的错误(比如说 userid 始终为 null )。
然后考虑能不能直接调用 http 请求,自行拼接 header 和 body……postman 测试完全可以,只要自己记得保存 access_token 和 refresh_token 就行了。但是问题来了……
把登入时需要的信息保存下来,也就是大概会创建一个长这样的 store:
```
{
client_id: string, client_secret: string, ...
}
```
而且在调用 http request 的时候,也会把用户名和密码直接传过去。如果在浏览器里面打断点的话,可以直接取得当前的用户名和密码。就算是 app client ,也是可以通过 hack 进内存的方式获得这些敏感信息的吧。
如果把这些 passwd 和 token 在 store 里面 encrypt 的话,问题在于和 keycloak 通信的时候需要传输这个 token 本身,也就是说 encrypt 的内容必须能够被解密,在已知源代码或源代码产生物的时候,这样就意味着白加密了。
那么一般对待这些敏感信息的话,该用什么方式来处理以防止信息泄漏呢?
话说过来也看了一下现在在用的客户端开发的框架里面的非官方 keycloak 封装库……感觉就是直接在 http api 上封装了一层,压根没有讨论到加密的内容……所以大概也是不符合要求的了。
#token #keycloak #http #client #源代码 #store #string #encrypt #用户名 #信息