首页
About
友情链接
Search
1
RustDesk远程桌面工具自建服务器教程
2,471 阅读
2
V2ray配置文件翻译
1,618 阅读
3
draw.io(diagrams.net) - 免费开源全平台绘图软件
1,266 阅读
4
Android 11 中的软件包可见性
1,151 阅读
5
Windows常用软件
985 阅读
Uncategorized
Software
Android
Linux
Communist Party of China
Docker
Windows
Tools
登录
Search
Leon
累计撰写
36
篇文章
累计收到
52
条评论
首页
栏目
Uncategorized
Software
Android
Linux
Communist Party of China
Docker
Windows
Tools
页面
About
友情链接
搜索到
36
篇与
Leon
的结果
2022-11-04
Kotlin协程
Kotlin协程就像 Java 中的 Executor 和 Android 中的 AsyncTask,Kotlin 中的协程也有对 Thread API 的封装,让我们可以在写代码时,不用关注多线程就能够很方便地写出并发操作。Kotlin协程是由官方提供的一套线程API,使用看起来同步方式写异步代码——非堵塞式挂起。消除回调launch({ val user = api.getUser() // 网络请求(IO 线程) nameTv.text = user.name // 更新 UI(主线程) }) api.getUser() .enqueue(object : Callback<User> { override fun onResponse(call : Call<User>, response:Response<User>){ runOnUiThread { nameTv.text = response.body()?.name } } })suspend 是 Kotlin 协程最核心的关键字,代码执行到 suspend 函数的时候会挂起,并且这个挂起是非阻塞式的,它不会阻塞你当前的线程。launch ,async 或者其他函数创建的协程,在执行到某一个 suspend 函数的时候,这个协程会被suspend,也就是被挂起。GlobalScope.launch(Dispatchers.Main) { val image = suspendingGetImage(imageId) // 获取图片 avatarIv.setImageBitmap(image) // 显示出来 } suspend fun suspendingGetImage(id: String) = withContext(Dispatchers.IO) { ... } suspend fun suspendUntilDone() { while (!done) { delay(5) } }但是suspend fun suspendingPrint() { println("Thread: ${Thread.currentThread().name}") }输出的结果还是在主线程。通过 withContext 源码可以知道,它本身就是一个挂起函数,它接收一个 Dispatcher 参数,依赖这个 Dispatcher 参数的指示,协程被挂起,然后切到别的线程。public suspend fun <T> withContext( context: CoroutineContext, block: suspend CoroutineScope.() -> T ): T { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return suspendCoroutineUninterceptedOrReturn sc@ { uCont -> // 计算新上下文 val oldContext = uCont.context val newContext = oldContext + context // 始终检查新上下文的取消 newContext.ensureActive() // FAST PATH #1 -- 新上下文与旧上下文相同 if (newContext === oldContext) { val coroutine = ScopeCoroutine(newContext, uCont) return@sc coroutine.startUndispatchedOrReturn(coroutine, block) } // FAST PATH #2 -- 新dispatcher与旧dispatcher相同(发生了变化) // `equals` 被设计使用 if (newContext[ContinuationInterceptor] == oldContext[ContinuationInterceptor]) { val coroutine = UndispatchedCoroutine(newContext, uCont) // There are changes in the context, so this thread needs to be updated withCoroutineContext(newContext, null) { return@sc coroutine.startUndispatchedOrReturn(coroutine, block) } } // SLOW PATH -- 使用新的dispatcher val coroutine = DispatchedCoroutine(newContext, uCont) block.startCoroutineCancellable(coroutine, coroutine) coroutine.getResult() } }所以这个 suspend,其实并不是起到把任何协程挂起,或者说切换线程的作用。真正挂起协程这件事,是 Kotlin 的协程框架帮我们做的。所以我们想要自己写一个挂起函数,仅仅只加上 suspend 关键字是不行的,还需要函数内部直接或间接地调用到 Kotlin 协程框架自带的 suspend 函数才行。在 Kotlin 里,协程就是基于线程来实现的一种更上层的工具 API,类似于 Java 自带的 Executor 系列 API 或者 Android 的 Handler 系列 API。协程它不仅提供了方便的 API,在设计思想上是一个基于线程的上层框架协程就是切线程。挂起就是可以自动切回来的切线程。挂起的非阻塞式指的是它能用看起来阻塞的代码写出非阻塞的操作。
2022年11月04日
27 阅读
0 评论
0 点赞
2022-11-03
RustDesk远程桌面工具自建服务器教程
RustDesk远程桌面工具自建服务器教程同心抗疫,共度时艰。简介RustDesk,工具如其名,基于高效的Rust语言构建的开源远程桌面工具。优势:(1)轻量:不论服务端还是客户端、不论哪个平台,软件小巧、功能完备。(2)全平台支持:支持Android、Linux、Windows任意双向控制,iOS单向控制。(3)安全可控:软件开源,服务端自建,通信加密。(4)带宽高效:仅需2-3M即可流畅1080P,支持TCP打洞端对端P2P连接。RustDesk官网:https://rustdesk.com/zh/GitHub:https://github.com/rustdesk/rustdesk运行原理RustDesk自建服务器运行原理自建服务器免费的公共服务器非常卡,在国内也许网速会很慢或者无法访问。RustDesk的优势在于可以使用自己的服务器,推荐使用国内主流云产品厂商,个人使用的腾讯云搭建服务器,价格不贵可以接受,相比于远程流畅度来说物超所值,且服务器唯自己所有,不用担心第三方远控软件造成的信息安全问题。这里总结了腾讯云的最新优惠产品(含有推广链接,可自行去推广):腾讯云云产品特惠专区如果有兴趣和能力也可以自己搭建物理服务器,或者使用内网穿透在自己电脑上搭建服务器,这里不再赘述。服务器要求硬件要求很低,最低配置的云服务器就可以了,CPU和内存要求都是最小的。关于网络大小,如果控制端和被控端位于同一网段下时,不需要通过 relay server 中转,直接建立内网链接。如果TCP打洞直连失败,就要耗费中继流量,一个中继连接的流量在30k-3M每秒之间(1920x1080屏幕),取决于清晰度设置和画面变化。如果只是办公需求,平均在100K/s。非直连情况下,播放全屏视频(1920x1080屏幕)实测近两分钟,带宽平均占用1.3Mbps左右。Docker部署在Docker部署和常规部署之间选择一个即可。Linux/amd64sudo docker image pull rustdesk/rustdesk-server sudo docker run --name hbbs -p 21115:21115 -p 21116:21116 -p 21116:21116/udp -p 21118:21118 -v `pwd`:/root -td --net=host rustdesk/rustdesk-server hbbs -r <relay-server-ip[:port]> sudo docker run --name hbbr -p 21117:21117 -p 21119:21119 -v `pwd`:/root -td --net=host rustdesk/rustdesk-server hbbrLinux/arm64v8sudo docker image pull rustdesk/rustdesk-server:latest-arm64v8 sudo docker run --name hbbs -p 21115:21115 -p 21116:21116 -p 21116:21116/udp -p 21118:21118 -v `pwd`:/root -td --net=host rustdesk/rustdesk-server:latest-arm64v8 hbbs -r <relay-server-ip[:port]> sudo docker run --name hbbr -p 21117:21117 -p 21119:21119 -v `pwd`:/root -td --net=host rustdesk/rustdesk-server:latest-arm64v8 hbbr据我所知,–net=host 仅适用于 Linux,它让 hbbs/hbbr 可以看到对方真实的ip, 而不是固定的容器ip (172.17.0.1)。 如果–net=host运行正常,-p选项就不起作用了, 可以去掉。请去掉 –net=host,如果您在非Linux系统上遇到无法连接的问题常规部署直接运行This content is only supported in a ThunderSoft Docs在服务器上运行 hbbs/hbbr (Centos 或 Ubuntu)。./hbbs -r <hbbr运行所在主机的地址[:port]> ./hbbr默认情况下,hbbs 监听21115(tcp), 21116(tcp/udp), 21118(tcp),hbbr 监听21117(tcp), 21119(tcp)。务必在防火墙开启这几个端口, 请注意21116同时要开启TCP和UDP。其中21115是hbbs用作NAT类型测试,21116/UDP是hbbs用作ID注册与心跳服务,21116/TCP是hbbs用作TCP打洞与连接服务,21117是hbbr用作中继服务, 21118和21119是为了支持网页客户端。如果您不需要网页客户端(21118,21119)支持,对应端口可以不开。TCP(21115, 21116, 21117, 21118, 21119)UDP(21116)端口号协议程序用途锚点21115tcpHBBSNAT类型测试 21116tcp/udpHBBSTCP 打洞与连接服务/UDP ID注册与心跳服务HBBS锚点21117tcpHBBR中继服务HBBR锚点21118tcpHBBSWebSocket服务 21119tcpHBBRWebSocket转发 如果你想选择自己的端口,使用 “-h” 选项查看帮助。守护进程至此我们的自建服务器已经运行起来了,至此服务器完全可以使用RustDesk,但你会发现当你退出了服务器远程连接,服务器就自动停掉了,所以我们还需要将自建服务器的进程守护起来。在pm2和systemd之间选择一个即可,建议使用systemd。使用 pm2pm2 start hbbs -- -r <relay-server-ip[:port]> pm2 start hbbr pm2 需要 nodejs v16+,如果你运行 pm2 失败(例如在 pm2 list 中看不到 hbbs/hbbr),请从 https://nodejs.org 下载并安装 LTS 版本的 nodejs。 如果你想让 hbbs/hbbr 在重启后自动运行,请查看 pm2 save 和 pm2 startup。 更多关于 pm2。另一个不错的日志工具是 pm2-logrotate。hhbs的-r参数不是必须的,他只是方便你不用在客户端指定中继服务器,如果是默认21117端口,可以不填port。客户端指定的中继服务器优先级高于这个。使用 systemd官方建议使用PM2守护进程,如果你的主机没有其它使用Node.js工具的需求,只需要使用systemd来管理服务即可!HBBS解压出来的hbbs文件先通过chmod +x hbbs赋予可执行权限,先运行一次./hbbs,生成用于客户端认证使用的公钥id_ed25519.pub,随后用cat id_ed25519.pub命令查看公钥并记下。然后通过喜欢的编辑器编辑/etc/systemd/system/hbbs.service,将用于参考的以下配置根据需要进行修改并保存,这时也要将强制校验密钥以-k _参数写入启动命令中。# systemd配置路径 # /etc/systemd/system/hbbs.service [Unit] Description=Rust Desk Service After=network.target [Service] Type=simple User=root Restart=on-failure RestartSec=5s #设置运行路径 WorkingDirectory=/*程序路径*/rustdesk #可修改锚点端口,当前为21116(锚点)和21115(锚点-1)和21118(锚点+2) #-r用于指定网卡IP(适用多网卡),-k参数用于强制校验客户端公钥,用于避免未授权的使用 ExecStart=/*程序路径*/rustdesk/hbbs -r 0.0.0.0 -p 21116 -k _ [Install] WantedBy=multi-user.targetHBBR解压出来的hbbr文件先通过chmod +x hbbr赋予可执行权限,然后通过喜欢的编辑器编辑/etc/systemd/system/hbbr.service,将用于参考的以下配置根据需要进行修改并保存,同样将密钥校验以-k _参数写入启动命令中。# systemd配置路径 # /etc/systemd/system/hbbr.service [Unit] Description=Rust Desk Service After=network.target [Service] Type=simple User=root Restart=on-failure RestartSec=5s #设置运行路径 WorkingDirectory=/*程序路径*/rustdesk #可修改锚点端口,当前为21117(锚点)和21119(锚点+2) #-k参数用于强制校验客户端公钥,用于避免未授权的使用 ExecStart=/*程序路径*/rustdesk/hbbr -p 21117 -k _ [Install] WantedBy=multi-user.targetservice设置好后,即可通过service hbbs start和service hbbr start来启动这两项服务,启动后可以通过service hbbs status和service hbbr status查看进程的运行状态,显示绿色的Active即无误。一切准备就绪后即可通过systemctl enable hbbs和systemctl enable hbbr允许它们开机自启。端口放行在腾讯云服务器上,进入服务器详情->防火墙->添加规则,然后编辑相应端口和规则即可,不必关心以下指令。如果恰好你有能力搭建了一台物理主机,则需要你手动设置防火墙规则,iptables、firewalld、ufw的命令分别如下,其中的端口请按照你的设置的进行放行(默认21115-21117),这里需要注意hbbs锚点端口必须同时放行tcp和udp。#CentOS firewalld firewall-cmd --zone=public --add-port=21115/tcp --permanent firewall-cmd --zone=public --add-port=21116/tcp --permanent firewall-cmd --zone=public --add-port=21116/udp --permanent firewall-cmd --zone=public --add-port=21117/tcp --permanent #Debian/Ubuntu ufw ufw allow 21115/tcp ufw allow 21116/tcp ufw allow 21116/udp ufw allow 21117/tcp #iptables iptables -I INPUT 1 -p tcp --dport 21115 -j ACCEPT iptables -I INPUT 1 -p tcp --dport 21116 -j ACCEPT iptables -I INPUT 1 -p udp --dport 21116 -j ACCEPT iptables -I INPUT 1 -p tcp --dport 21117 -j ACCEPT iptables-save //保存(解决重启失效)客户端连接ID服务器填写你的服务器IP地址:21116中继服务器填写你的服务器IP地址:21117随后你只需要使用ID和密码即可使用自建服务器的RustDesk。开机自启在我们远程控制主机时,可能不得不完成重启的操作,远控软件不自启可不行,那么接下来我们一起来配置一下自启。编辑文本文档 rustdesk.service[Unit] Description=RustDesk Requires=network.target After=systemd-user-sessions.service [Service] Type=simple ExecStart=/usr/bin/rustdesk --service PIDFile=/var/run/rustdesk.pid KillMode=mixed TimeoutStopSec=30 User=root LimitNOFILE=100000 [Install] WantedBy=multi-user.target移动到 /usr/lib/systemd/system 文件夹下,执行:sudo systemctl enable rustdesk使用systemctl status rustdesk查看服务运行状态:参考【RustDesk】自建远程桌面服务替代TeamViewer/Todesk – Luminous' Home: https://luotianyi.vc/6542.html安装 :: RustDesk文档: https://rustdesk.com/docs/zh-cn/self-host/install/Working principle · Issue #594 · rustdesk/rustdesk: https://github.com/rustdesk/rustdesk/issues/594#issuecomment-1138342668Systemd 入门教程:命令篇 - 阮一峰的网络日志: https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.htmlSystemd 入门教程:实战篇 - 阮一峰的网络日志: https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html
2022年11月03日
2,471 阅读
7 评论
0 点赞
2022-09-26
禁用Ubuntu鼠标中键复制功能
禁用Ubuntu鼠标中键复制xmodmap -e "pointer = 1 25 3 4 5 6 7 2"xmodmap命令是在修改按键映射,pointer指鼠标,1 2 3 指鼠标的 “左中右” 三个按键。恢复Ubuntu鼠标中键复制xmodmap -e "pointer = 1 2 3 4 5 6 7 8"原文地址:https://blog.csdn.net/weixin_46201756/article/details/106321704
2022年09月26日
277 阅读
0 评论
1 点赞
2022-07-14
Linux分区与Windows分区冲突时
inode bitmap中有标记为已使用的未用 inode。 文件:1311130sudo find / inum 1311130sudo rm
2022年07月14日
523 阅读
0 评论
0 点赞
2021-12-13
勿忘国耻,吾辈自强!
空一座城,等三十万亡魂。点一盏灯,祭八十三年乾坤。怀一颗心,求人世间安稳。哀一个国,念我千古华夏人。念一段史,难平十四亿悲愤。勿忘国耻,振兴中华!铭记历史,吾辈自强!
2021年12月13日
368 阅读
2 评论
0 点赞
1
2
3
4
...
8