首页
归档
关于
友情链接
Search
1
clash for windows允许局域网连接,TAP和TUN模式
99,281 阅读
2
使用emby打造个人影视媒体库
21,766 阅读
3
解决kodi的emby插件无法找到文件...相对路径、绝对路径问题
10,464 阅读
4
Ubuntu to go/Linux to go/将linux系统安装到u盘或移动硬盘
8,161 阅读
5
魔改版rclone挂载世纪互联onedrive
4,991 阅读
技术
软件
文章
其他
登录
Search
标签搜索
sql
代理
sqlserver
vps
onedrive
软件
Oracle
magisk
onelist
世纪互联rclone
世界x流大学.com
transmission
Transmission Remote GUI
pt
ftp
emby插件
emby for kodi插件
qBittorrent
emby
nfo
旁逸斜出
累计撰写
35
篇文章
累计收到
155
条评论
首页
栏目
技术
软件
文章
其他
页面
归档
关于
友情链接
搜索到
17
篇与
技术
的结果
2024-06-16
在docker中安装frp
frp是一个好用的内网穿透项目:https://github.com/fatedier/frp如果不使用docker安装frp,可以参考官方教程:https://gofrp.org/zh-cn/docs/setup/如果用docker安装,可以方便管理,不用使用那些自启动脚本之类的使用这个docker镜像来安装:https://hub.docker.com/r/snowdreamtech/frps下面均采用linux和可以访问https://hub.docker.com/的服务器来安装安装dockerwget -qO- get.docker.com | bash docker -v #查看docker版本 systemctl enable docker # 设置开机自动启动修改Docker配置(可选)以下配置会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,以及限制日志文件大小,防止 Docker 日志塞满硬盘:cat > /etc/docker/daemon.json <<EOF { "log-driver": "json-file", "log-opts": { "max-size": "20m", "max-file": "3" }, "ipv6": true, "fixed-cidr-v6": "fd00:dead:beef:c0::/80", "experimental":true, "ip6tables":true } EOF然后重启 Docker 服务:systemctl restart docker安装Docker-compose(可选)Compose 是用于定义和运行多容器 Docker 应用程序的工具sudo curl -L "https://github.com/docker/compose/releases/download/2.27.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose docker-compose --version #查看docker-compose版本{collapse}{/collapse-item}{collapse-item label="docker-compose更新"}cd /root/data/docker_data/frps docker-compose down cp -r /root/data/docker_data/fprs /root/data/docker_data/frps.archive # 其实就是备份一下frps.ini这个文件 docker-compose pull docker-compose up -d docker image prune # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像{/collapse-item}{/collapse}安装frps{collapse}{/collapse-item}{collapse-item label="不使用docker-compose"}sudo -i mkdir -p /root/data/docker_data/frps cd /root/data/docker_data/frps touch frps.toml vim frps.toml #输入下面的配置,仅参考 bindPort = 1443 #服务端监听端口 auth.method = "token" #服务端连接身份认证,默认token auth.token = "dsafja3fvz25ernca" #服务端token密码 transport.tls.force = false #是否只接受启用了TLS的客户端连接 #frp服务仪表板配置 #dashboard端口,启动成功后可通过浏览器访问如http://ip:9007 webServer.port = 9007 webServer.addr = "0.0.0.0" webServer.user = "admin1" webServer.password = "youareadmin1"#拉取frps镜像 docker pull snowdreamtech/frps 启动frps docker run --restart=always --network host -d -v ./frps.toml:/etc/frp/frps.toml --name frps snowdreamtech/frps{/collapse-item}{/collapse}sudo -i mkdir -p /root/data/docker_data/frpscd /root/data/docker_data/frps vim docker-compose.yml #输入下面的命令 version: '3.8' #此数字需要根据安装的docker-compose版本而定 services: frps: restart: always network_mode: host volumes: - './frps.toml:/etc/frp/frps.toml' container_name: frps image: snowdreamtech/frpstouch frps.toml vim frps.toml #输入下面的配置,仅参考 bindPort = 1443 #服务端监听端口 auth.method = "token" #服务端连接身份认证,默认token auth.token = "dsavmlr949rnca" #服务端token密码 transport.tls.force = false #是否只接受启用了TLS的客户端连接 #frp服务仪表板配置 #dashboard端口,启动成功后可通过浏览器访问如http://ip:9007 webServer.port = 9007 webServer.addr = "0.0.0.0" webServer.user = "admin1" webServer.password = "youareadmin1" #启动frps docker-compose up -d #docker ps 会显示正在运行的docker容器,frps会显示下面类似的 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a9a1aa562935 snowdreamtech/frps "/usr/bin/frps -c /e…" 2 hours ago Up 2 hours frps 需要根据自己的服务器放行相应的端口#以ufw为例 sudo ufw allow 9007/tcp sudo ufw allow 1443/tcp sudo ufw reload安装frpcfrpc根据情况在nas或其他设备上安装(依然选择snowdreamtech/frpc),下面是一份客户端配置参考,文件名frpc.toml# frpc.toml transport.tls.enable = true # 从 v0.50.0版本开始,transport.tls.enable的默认值为 true serverAddr = "xxx.xxx.xxx.xxx" #frps所在的设备IP serverPort = 1443 # 公网服务端通信端口 auth.token = "dsavmlr949rnca" # 令牌,与公网服务端保持一致 [[proxies]] name = "web" type = "tcp" localIP = "127.0.0.1" # 需要暴露的服务的IP localPort = 8989 # 将本地9000端口的服务暴露在公网的6060端口 remotePort = 8989 # 暴露服务的公网入口,依然需要在服务端放行这个端口参考:1.https://blog.laoda.de/archives/frp-with-nginx-proxy-manager?cid=4423#73-%E5%AE%89%E8%A3%85nginxproxymanager2.https://gofrp.org/zh-cn/docs/setup3.https://hub.docker.com/r/snowdreamtech/frps
2024年06月16日
223 阅读
2 评论
0 点赞
2022-11-28
C#AutoResetEvent和ManualResetEvent介绍
AutoResetEvent和ManualResetEvent是c#用来线程同步的。AutoResetEvent参考:https://learn.microsoft.com/zh-cn/dotnet/api/system.threading.autoresetevent?view=net-7.0Set():将事件设置为已发送信号状态,对于AutoResetEvent来说允许一个正在等待的线程继续执行。如果没有线程在等待,将保持无限期有信号状态。WaitOne():处于无信号状态时,阻塞当前线程直到接收到了信号量如果线程在处于信号状态时AutoResetEvent调用WaitOne,则线程不会阻塞。AutoResetEvent立即释放线程并返回到无信号状态。也就是说如果没有线程在WaitOne,先执行了Set,会导致后调用的第一次WaitOne失效不阻塞,第二次调用WaitOne阻塞会生效using System; using System.Threading; namespace AutoResetEvent_Examples { class MyMainClass { const int numIterations = 100; static AutoResetEvent myResetEvent = new AutoResetEvent(false); static int number; static void Main() { //定义线程并启动,MyReadThreadProc方法接收到信号量后读取当前线程的名字和number并打印 Thread myReaderThread = new Thread(new ThreadStart(MyReadThreadProc)); myReaderThread.Name = "ReaderThread"; myReaderThread.Start(); for(int i = 1; i <= numIterations; i++) { Console.WriteLine("Writer thread writing value: {0}", i); number = i; //Signal that a value has been written. //调用Set()后MyReadThreadProc()从WaitOne()继续执行 myResetEvent.Set(); //Give the Reader thread an opportunity to act. Thread.Sleep(1); } //Terminate the reader thread. myReaderThread.Abort(); } static void MyReadThreadProc() { while(true) { //The value will not be read until the writer has written // at least once since the last read. myResetEvent.WaitOne(); Console.WriteLine("{0} reading value: {1}", Thread.CurrentThread.Name, number); } } } }官网拷贝的代码,只有当Main()中的for循环调用myResetEvent.Set(),MyReadThreadProc()才会收到信号来读取当前线程的名字,否则就会一直停在myResetEvent.WaitOne()而不会继续向后执行。ManualResetEvent参考:https://learn.microsoft.com/zh-cn/dotnet/api/system.threading.manualresetevent?view=net-7.0Set():将事件设置为已发送信号状态,对于ManualResetEvent来说允许所有正在等待的线程继续执行Reset():设置事件无信号,使能够继续阻塞线程using System; using System.Threading; public class Example { // mre is used to block and release threads manually. It is // created in the unsignaled state. private static ManualResetEvent mre = new ManualResetEvent(false); static void Main() { Console.WriteLine("\nStart 3 named threads that block on a ManualResetEvent:\n"); //定义三个线程 for(int i = 0; i <= 2; i++) { Thread t = new Thread(ThreadProc); t.Name = "Thread_" + i; t.Start(); } Thread.Sleep(500); Console.WriteLine("\nWhen all three threads have started, press Enter to call Set()" + "\nto release all the threads.\n"); Console.ReadLine(); //给信号使ThreadProc()中的WaitOne()之后的代码执行 mre.Set(); Thread.Sleep(500); Console.WriteLine("\nWhen a ManualResetEvent is signaled, threads that call WaitOne()" + "\ndo not block. Press Enter to show this.\n"); Console.ReadLine(); for(int i = 3; i <= 4; i++) { Thread t = new Thread(ThreadProc); t.Name = "Thread_" + i; t.Start(); } //ManualResetEvent在调用Set()之后,WaitOne()并不会阻塞线程,要想阻塞线程,需要调用Reset()使没有信号,才能够继续阻塞线程 Thread.Sleep(500); Console.WriteLine("\nPress Enter to call Reset(), so that threads once again block" + "\nwhen they call WaitOne().\n"); Console.ReadLine(); //调用Reset()后继续阻塞线程 mre.Reset(); // Start a thread that waits on the ManualResetEvent. Thread t5 = new Thread(ThreadProc); t5.Name = "Thread_5"; t5.Start(); Thread.Sleep(500); Console.WriteLine("\nPress Enter to call Set() and conclude the demo."); Console.ReadLine(); mre.Set(); // If you run this example in Visual Studio, uncomment the following line: Console.ReadLine(); } private static void ThreadProc() { string name = Thread.CurrentThread.Name; Console.WriteLine(name + " starts and calls mre.WaitOne()"); mre.WaitOne(); Console.WriteLine(name + " ends."); } } /* Start 3 named threads that block on a ManualResetEvent: Thread_0 starts and calls mre.WaitOne() Thread_1 starts and calls mre.WaitOne() Thread_2 starts and calls mre.WaitOne() When all three threads have started, press Enter to call Set() to release all the threads. Thread_1 ends. Thread_0 ends. Thread_2 ends. When a ManualResetEvent is signaled, threads that call WaitOne() do not block. Press Enter to show this. Thread_3 starts and calls mre.WaitOne() Thread_3 ends. Thread_4 starts and calls mre.WaitOne() Thread_4 ends. Press Enter to call Reset(), so that threads once again block when they call WaitOne(). Thread_5 starts and calls mre.WaitOne() Press Enter to call Set() and conclude the demo. Thread_5 ends. */ 简单总结一下二者区别:1.AutoResetEvent调用Set只给一个正在WaitOne的线程信号使之继续执行,ManualResetEvent调用Set会给所有正在WaitOne的线程信号使之继续执行2.在调用Set后ManualResetEvent将保持有信号状态,WaitOne将失效,不再进行线程阻塞,需要重新阻塞的话要调用Reset,但AutoResetEvent(在已经有线程WaitOne的情况下)会自动返回到无信号状态。
2022年11月28日
161 阅读
0 评论
0 点赞
2021-12-26
Mssql数据库日期格式处理
基本格式系统时间 select GETDATE(); 格式转换字符串转日期select convert(datetime,'2021-02-27 15:52:15') --2021-02-27 15:52:15.000 select convert(datetime,'2021-02-27 15:52:15',20) --2021-02-27 15:52:15.000 select convert(datetime,'2021/02/27 15:52:15',111) --2021-02-27 15:52:15.000 select convert(datetime,'2020',20) --2020-01-01 00:00:00.000日期转字符串select CONVERT(VARCHAR(20),GETDATE(),120) --12 26 2021 6:47PM select CONVERT(VARCHAR(20),GETDATE()) --2021-12-26 18:47:46 select CONVERT(VARCHAR(32),GETDATE(),111) --2021/12/26CONVERT(data_type(length),data_to_be_converted,style)data_type(length) 规定目标数据类型(带有可选的长度)。data_to_be_converted 含有需要转换的值。style 规定日期/时间的输出格式。{collapse}{collapse-item label="style值对应的格式" open}参考:https://www.w3school.com.cn/sql/func_convert.asp Style ID Style 格式100 或者 0 mon dd yyyy hh:miAM (或者 PM)101 mm/dd/yy102 yy.mm.dd103 dd/mm/yy104 dd.mm.yy105 dd-mm-yy106 dd mon yy107 Mon dd, yy108 hh:mm:ss109 或者 9 mon dd yyyy hh:mi:ss:mmmAM(或者 PM)110 mm-dd-yy111 yy/mm/dd112 yymmdd113 或者 13 dd mon yyyy hh:mm:ss:mmm(24h)114 hh:mi:ss:mmm(24h)120 或者 20 yyyy-mm-dd hh:mi:ss(24h)121 或者 21 yyyy-mm-dd hh:mi:ss.mmm(24h)126 yyyy-mm-ddThh:mm:ss.mmm(没有空格)130 dd mon yyyy hh:mi:ss:mmmAM131 dd/mm/yy hh:mi:ss:mmmAM{/collapse-item}{/collapse}其他计算命令计算本年天数 select datediff(d,t.curr_year,dateadd(yy,1,t.curr_year)) from (select dateadd(d,-datepart(dy,getdate())+1,getdate()) curr_year) t select datediff(d,t.curr_year,dateadd(yy,1,t.curr_year)) from (select dateadd(d,-datepart(dy,convert(datetime,'2020',20))+1,convert(datetime,'2020',20)) curr_year) t 也可以用下面判断闰年的方法返回天数 DATEDIFF() 函数返回两个日期之间的时间 DATEADD() 函数在日期中添加或减去指定的时间间隔 DATEPART() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等判断闰年 select case when(YEAR(GETDATE())%4=0 and YEAR(GETDATE())%100<>0 or YEAR(GETDATE())%400=0) then '闰年' else '平年' end某月的第一天,最后一天 select dateadd(m, datediff(m,0,getdate()),0) select dateadd(day ,-1, dateadd(m, datediff(m,0,getdate())+1,0)) 附: Oracle日期转换
2021年12月26日
197 阅读
1 评论
0 点赞
2021-10-04
sqlsever代理启动失败
sqlserver代理启动失败日志提示:2021-08-31 16:23:22 - ? [100] Microsoft SQLServerAgent 版本 11.0.3000.0 (内部版本号 X64 unicode 零售): 进程 ID 3244 2021-08-31 16:23:22 - ? [495] SQL Server 代理启动服务帐户是 NT SERVICE\SQLSERVERAGENT。 2021-08-31 16:23:22 - ! [150] SQL Server 不接受连接(错误: 0)。请等待 SQL Server 允许连接。尝试的操作为: 启动时验证连接。 2021-08-31 16:23:22 - ! [000] 无法连接到服务器“(local)”;SQLServerAgent 无法启动 2021-08-31 16:23:22 - ! [298] SQLServer 错误: 27,注册表信息已损坏或丢失。请确保已正确安装和注册提供程序。 [SQLSTATE 08001] 2021-08-31 16:23:22 - ! [298] SQLServer 错误: 27,客户端无法建立连接 [SQLSTATE 08001] 2021-08-31 16:23:22 - ! [165] ODBC 错误: 0,与 SQL Server 建立连接时发生了与网络相关的或特定于实例的错误。找不到或无法访问服务器。请检查实例名称是否正确以及 SQL Server 是否配置为允许远程连接。有关详细信息,请参阅 SQL Server 联机丛书。 [SQLSTATE 08001] 2021-08-31 16:23:22 - ! [382] 无法登录到服务器“(local)”(DisableAgentXPs) 2021-08-31 16:23:22 - ? [098] SQLServerAgent 已终止(一般)解决方案:打开控制面板:找到2012 Native Client修复即可注:Express Edition是不支持sqlserver代理功能的(select @@VERSION可以查看版本)
2021年10月04日
227 阅读
0 评论
0 点赞
2021-08-17
Sqlserver中0和空字符串相等的问题
今天在SQL server中写存储过程时遇到一种0和空字符串相等的问题。场景:表A有value1(varchar)和value2(int)两个字段,现在插入一条新的数据(v1,v2),如果v1已存在,则给value2加上v2,若v1不存在则插入新的(v1,v2)(这个逻辑用merge into会更好些)开始我是这么写的declare @flag=int select @flag=value2 from A where A.value1=v1 if(@flag='') insert into ... else update A...但是这样是有问题的,当查询不到这条数据时,确实会插入,但是当value2=0的时候,这么写它依然会执行insert,也就是0='',可以通过下面的存储过程验证一下:CREATE PROCEDURE TEST AS BEGIN declare @a int declare @b varchar set @a=0 set @b=0 if(@a='') print('int a') if(@b='') print('varchar b') END GO然后执行会发现输出为 int a ,原因在于varchar和int是存在隐式转换的,导致转换之后0和空字符串变成了相等的。参考:https://www.cnblogs.com/liubaolongcool/archive/2011/08/24/2152552.html
2021年08月17日
182 阅读
0 评论
0 点赞
1
2
...
4