们将在这个小小的城镇中相互扶持,共同生活下去
今宵之月,绝不西沉。只此美梦,不再苏醒。从今往后,生生世世,长相厮守,为你立誓。
我们不能让这次冒险之旅没有意义没有收获
我们的本质就是血,一层层地重复,然后世代脉脉相传的血才是黑血的真实
当你知道自己被爱著的时候就不会自卑了asd
不要哭,我还没有努力到要哭的程度,不甘心就可以了das
既不回头,何必不忘;既然无缘,何必誓言;今日种种,似水无痕
空谈之类,是谈不久,也谈不出什么来的,它终必被事实的镜子照出原形,拖出尾巴而去
只愿涤荡四方,护得一世之隅。
你看你浪费了多少流星,哈哈……不牵个手也很浪费这样的夜晚呢
有形的东西迟早会凋零,但只有回忆是永远不会凋零的
已经无法回来的东西,得到和舍弃都很痛苦
Pain past is pleasure.11222
我因为后来离开村子,在远处看见这一村庄人的火焰。看见他们比熄灭还要寂静的那一场燃烧。我像一根逃出火堆的干柴,幸运而孤独地站在远处。
河川,激流逆流顺流回流,犹如人生前后进退往复不息
首页
统计
免费Chat GPT
关于
更多
友链
每日新闻
视频
高清壁纸
Search
1
2023彩虹易支付最新原版开源网站源码,完整的易支付源码,无后门
465 阅读
2
ThinkPHP6的常见问题解答
387 阅读
3
Spring Boot之七牛云分片上传
239 阅读
4
小狐狸ChatGPT付费创作系统V2.4.9独立版 +WEB端+ H5端 + 小程序端(支持分享朋友圈、破解弹窗)
230 阅读
5
国内最好用的六款虚拟机软件
211 阅读
技术分享
源码分享
课程分享
号卡套餐
移动专区
电信专区
联通专区
广电专区
软件仓库
电脑软件
安卓软件
活动线报
值得一看
Search
标签搜索
技术分享
源码
源码分享
css
安卓软件
活动线报
软件
课程分享
号卡
电脑软件
PHP
值得一看
HTML
js
教程
chatgpt
AI
小程序
ThinkPHP
联通
老K博客
累计撰写
420
篇文章
累计收到
338
条评论
今日撰写
0
篇文章
首页
栏目
技术分享
源码分享
课程分享
号卡套餐
移动专区
电信专区
联通专区
广电专区
软件仓库
电脑软件
安卓软件
活动线报
值得一看
页面
统计
免费Chat GPT
关于
友链
每日新闻
视频
高清壁纸
用户登录
登录
搜索到
117
篇与
的结果
2024-11-06
python批量图片转webp格式
主要流程就是将非webp的图片转换后丢到指定目录,已经是webp的就直接丢过去。有三个参数, input_folder , output_folder , qualityinput_folder你要转换的图片文件夹output_folder转换后输出的路径quality图片压缩质量,默认80,一般也不用改。要注意的是,权限要给够,不然可能复制失败。下面是代码import os from PIL import Image def convert_images_to_webp(input_folder, output_folder, quality=80): """ Convert all non-WebP images in the input_folder to WebP format and save them to output_folder. Existing WebP images are skipped. Args: - input_folder (str): The folder containing images to convert. - output_folder (str): The folder where converted WebP images will be saved. - quality (int): The quality of the converted WebP images, default is 80. """ # Check if output folder exists, if not, create it if not os.path.exists(output_folder): os.makedirs(output_folder) # Iterate over all files in the input folder for filename in os.listdir(input_folder): if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif')): # Construct the full file path file_path = os.path.join(input_folder, filename) # Open the image image = Image.open(file_path) # Convert and save the image in WebP format webp_filename = os.path.splitext(filename)[0] + '.webp' webp_path = os.path.join(output_folder, webp_filename) image.save(webp_path, 'webp', quality=quality) print(f"Saved {filename}") elif filename.lower().endswith('.webp'): webp_path = os.path.join(output_folder, filename) with open(file_path, 'rb') as file: with open(webp_path, 'wb') as output_file: output_file.write(file.read()) print(f"Skipping existing WebP file: {filename}") print(f"All non-WebP images from {input_folder} have been converted and saved to {output_folder}") if __name__ == '__main__': convert_images_to_webp('photos', 'photos/webp2') 效果
2024年11月06日
13 阅读
0 评论
0 点赞
2024-11-04
使用 C# 和 SQL Server 实现数据库的实时数据同步
在现代应用程序中,及时更新不同数据库之间的数据至关重要。本文将介绍如何在 SQL Server 中使用 C# 实现数据的实时同步。我们将使用 SQLDependency 类来监听数据库表的变化,并将这些变化实时地同步到另一张表中。前提条件在开始之前,请确保已经设置好两个 SQL Server 数据库:SourceDB: 包含你需要监听的表。TargetDB: 目标数据库,用于同步数据。配置 SQL Server首先,需要启用 SQL Server 的查询通知服务,以便支持 SQLDependency。请使用以下命令启用数据库服务代理:查看SELECT name, is_broker_enabled FROM sys.databases; ALTER DATABASE SourceDB SET ENABLE_BROKER;编写 C# 程序下面的 C# 程序将使用 SQLDependency 来监听 SourceDB 中的 SourceTable 表的变化。我们将在数据插入时同步到 TargetDB 中的 TargetTable。程序代码using System;using System.Data;using System.Data.SqlClient;using System.Configuration; class Program{ private static bool _continueRunning = true; static void Main() { Console.WriteLine("数据同步程序已启动。按 'Q' 键退出。"); // 设置连接字符串 string sourceConnectionString = ConfigurationManager.ConnectionStrings["SourceDB"].ConnectionString; string targetConnectionString = ConfigurationManager.ConnectionStrings["TargetDB"].ConnectionString; // 启用 SQLDependency SqlDependency.Start(sourceConnectionString); try { while (_continueRunning) { try { using (SqlConnection sourceConnection = new SqlConnection(sourceConnectionString)) { sourceConnection.Open(); StartListening(sourceConnection); // 保持连接打开状态 while (_continueRunning) { if (Console.KeyAvailable) { var key = Console.ReadKey(true).Key; if (key == ConsoleKey.Q) { _continueRunning = false; break; } } Thread.Sleep(100); } } } catch (Exception ex) { Console.WriteLine($"发生错误: {ex.Message}"); Console.WriteLine("5秒后重试..."); Thread.Sleep(5000); } } } finally { SqlDependency.Stop(sourceConnectionString); Console.WriteLine("数据同步程序已停止。"); } } private static void StartListening(SqlConnection connection) { using (SqlCommand command = new SqlCommand("SELECT ID, Name, Value, Created_Time FROM dbo.t1", connection)) { SqlDependency dependency = new SqlDependency(command); dependency.OnChange += new OnChangeEventHandler(OnDataChange); using (SqlDataReader reader = command.ExecuteReader()) { // 初次加载数据处理 } } } private static void OnDataChange(object sender, SqlNotificationEventArgs e) { if (e.Info == SqlNotificationInfo.Insert) { Console.WriteLine("数据已插入。事件类型: " + e.Info.ToString()); SyncData(); } // 重新启用监听 string sourceConnectionString = ConfigurationManager.ConnectionStrings["SourceDB"].ConnectionString; using (SqlConnection sourceConnection = new SqlConnection(sourceConnectionString)) { sourceConnection.Open(); StartListening(sourceConnection); } } private static void SyncData() { string sourceConnectionString = ConfigurationManager.ConnectionStrings["SourceDB"].ConnectionString; string targetConnectionString = ConfigurationManager.ConnectionStrings["TargetDB"].ConnectionString; using (SqlConnection sourceConnection = new SqlConnection(sourceConnectionString)) using (SqlConnection targetConnection = new SqlConnection(targetConnectionString)) { sourceConnection.Open(); targetConnection.Open(); // 获取最新插入的数据 SqlCommand fetchDataCommand = new SqlCommand("SELECT TOP 1 * FROM t1 ORDER BY Created_Time DESC", sourceConnection); using (SqlDataReader dataReader = fetchDataCommand.ExecuteReader()) { if (dataReader.Read()) { Guid id = (Guid)dataReader["ID"]; string name = (string)dataReader["Name"]; decimal value = (decimal)dataReader["Value"]; DateTime created_time = (DateTime)dataReader["created_time"]; // 将数据插入到 TargetTable SqlCommand insertCommand = new SqlCommand("INSERT INTO t1 (ID, Name, Value,Created_Time) VALUES (@ID, @Name, @Value,@Created_Time)", targetConnection); insertCommand.Parameters.AddWithValue("@ID", id); insertCommand.Parameters.AddWithValue("@Name", name); insertCommand.Parameters.AddWithValue("@Value", value); insertCommand.Parameters.AddWithValue("@Created_Time", created_time); insertCommand.ExecuteNonQuery(); } } } }}增加更新后同步private static void SyncUpdatedData(){ string sourceConnectionString = ConfigurationManager.ConnectionStrings["SourceDB"].ConnectionString; string targetConnectionString = ConfigurationManager.ConnectionStrings["TargetDB"].ConnectionString; using (SqlConnection sourceConnection = new SqlConnection(sourceConnectionString)) using (SqlConnection targetConnection = new SqlConnection(targetConnectionString)) { sourceConnection.Open(); targetConnection.Open(); // 获取最近更新的数据 // 注意:这里假设你有一个 Last_Updated_Time 字段来跟踪更新时间 SqlCommand fetchDataCommand = new SqlCommand("SELECT TOP 1 * FROM t1 ORDER BY Last_Updated_Time DESC", sourceConnection); using (SqlDataReader dataReader = fetchDataCommand.ExecuteReader()) { if (dataReader.Read()) { Guid id = (Guid)dataReader["ID"]; string name = (string)dataReader["Name"]; decimal value = (decimal)dataReader["Value"]; DateTime last_updated_time = (DateTime)dataReader["Last_Updated_Time"]; // 更新目标表中的数据 SqlCommand updateCommand = new SqlCommand( "UPDATE t1 SET Name = @Name, Value = @Value, Last_Updated_Time = @Last_Updated_Time WHERE ID = @ID", targetConnection); updateCommand.Parameters.AddWithValue("@ID", id); updateCommand.Parameters.AddWithValue("@Name", name); updateCommand.Parameters.AddWithValue("@Value", value); updateCommand.Parameters.AddWithValue("@Last_Updated_Time", last_updated_time); int rowsAffected = updateCommand.ExecuteNonQuery(); if (rowsAffected > 0) { Console.WriteLine($"已同步更新的数据: ID={id}, Name={name}, Value={value}, Created_Time={last_updated_time}"); } else { Console.WriteLine($"未找到要更新的记录: ID={id}"); } } } }}配置文件 (App.config)确保在你的项目中包含一个配置文件来管理数据库连接字符串。<?xml version="1.0" encoding="utf-8" ?><configuration> <connectionStrings> <add name="SourceDB" connectionString="Data Source=your_source_server;Initial Catalog=SourceDB;Integrated Security=True" /> <add name="TargetDB" connectionString="Data Source=your_target_server;Initial Catalog=TargetDB;Integrated Security=True" /> </connectionStrings> </configuration>关键点说明SQLDependency: 通过 SQLDependency 监听数据表变化,允许我们对 SourceTable 进行实时监听。当数据更改时自动触发 OnChange 事件。重新开启监听: 数据变化后,必须重新启动监听,以确保程序在后续的变化中继续有效。注意事项确保在 SQL Server 上启用查询通知和服务代理。SQLDependency 适用于简单查询,不能包括复杂查询、联接或聚合。如果项目对性能和实时性要求较高,建议结合其他工具或技术方案,如 Change Tracking 或 Change Data Capture 等。通过以上步骤,你可以实现对 SQL 数据库变化的实时监听和数据同步,从而保持数据库之间的数据一致性和实时性。
2024年11月04日
11 阅读
0 评论
0 点赞
2024-11-03
CentOS7下的YUM源服务器最全搭建步骤,希望看了有所收获
环境要求'环境准备,修改hostname,关闭防火墙,disabled selinux' [root@edenluo ~]# hostnamectl set-hostname --static yum-server [root@edenluo ~]# systemctl disable firewalld --now [root@edenluo ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux二、配置服务器端yum1、安装yum源工具[root@edenluo ~]# yum -y install epel-release.noarch # nginx需要epel源 [root@edenluo ~]# yum -y install nginx # 安装nginx [root@edenluo ~]# yum -y yum-utils # 安装repository管理工具2、配置nginx[root@edenluo nginx]# cd /etc/nginx/ [root@edenluo nginx]# cp nginx.conf{,.bak} # 备份!备份!备份! [root@edenluo nginx]# vim nginx.conf server { listen 80; server_name localhost; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } # 在server段加入以下三段内容 autoindex on; # 表示:自动在index.html的索引打开 autoindex_exact_size on; # 表示:如果有文件,则显示文件的大小 autoindex_localtime on; # 表示:显示更改时间,以当前系统的时间为准 error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } [root@edenluo nginx]# nginx -t # 检测一下nginx语法是否有错 nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@edenluo nginx]# systemctl enable nginx.service --now Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service. [root@edenluo nginx]# systemctl enable nginx.service --now # 启动nginx,设为开机自启 [root@edenluo nginx]# curl -I http://localhost # 访问本地,状态码返回200,服务正常 HTTP/1.1 200 OK Server: nginx/1.16.1 Date: Sun, 05 Jul 2020 09:48:05 GMT Content-Type: text/html Content-Length: 4833 Last-Modified: Fri, 16 May 2014 15:12:48 GMT Connection: keep-alive ETag: "53762af0-12e1" Accept-Ranges: bytes3、配置nginx页面目录[root@edenluo nginx]# cd /usr/share/nginx/html/ [root@edenluo html]# mkdir -p CentOS-YUM/Aliyun/{version_8,version_7}/64bit [root@edenluo html]# tree /usr/share/nginx/html/CentOS-YUM/ /usr/share/nginx/html/CentOS-YUM/ └── Aliyun ├── version_8 │ └── 64bit └── version_7 └── 64bit 5 directories, 0 files[root@edenluo html]# cd CentOS-YUM/ [root@edenluo CentOS-YUM]# vim index.html <p style="font-weight:bolder;color:green;font-size:30px;">ALL of the packages in the below:</p> <br/> <a href="http://192.168.57.133/CentOS-YUM/Aliyun">version_8</a><br/> These packagers using for Centos 8<br/> <a href="http://192.168.57.133/CentOS-YUM/Aliyun">version_7</a><br/> These packagers using for Centos 7<br/> <p style="font-weight:bolder;color:red;font-size:18px;">Please replace the file and fill in the f ollowing content:</p> <p style="font-weight:bolder;color:blue;font-size:15px;">Way: /etc/yum.repos.d/CentOS-Base.repo</ p><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <html> <head> <title>Web Server</title> <style rel="stylesheet" type="text/css"> html { background-image:url(img/html-background.png); background-color: white; font-family: "DejaVu Sans", "Liberation Sans", sans-serif; font-size: 0.85em; line-height: 1.25em; margin: 0 4% 0 4%; } body { border: 10px solid #fff; margin:0; padding:0; background: #fff; } /* Links */ a:link { border-bottom: 1px dotted #ccc; text-decoration: none; color: #204d92; } a:hover { border-bottom:1px dotted #ccc; text-decoration: underline; color: green; } a:active { border-bottom:1px dotted #ccc; text-decoration: underline; color: #204d92; } a:visited { border-bottom:1px dotted #ccc; text-decoration: none; color: #204d92; } a:visited:hover { border-bottom:1px dotted #ccc; text-decoration: underline; color: green; } .logo a:link, .logo a:hover, .logo a:visited { border-bottom: none; } .mainlinks a:link { border-bottom: 1px dotted #ddd; text-decoration: none; color: #eee; } .mainlinks a:hover { border-bottom:1px dotted #ddd; text-decoration: underline; color: white; } .mainlinks a:active { border-bottom:1px dotted #ddd; text-decoration: underline; color: white; } .mainlinks a:visited { border-bottom:1px dotted #ddd; text-decoration: none; color: white; } .mainlinks a:visited:hover { border-bottom:1px dotted #ddd; text-decoration: underline; color: white; } /* User interface styles */ #header { margin:0; padding: 0.5em; background: #204D8C url(img/header-background.png); text-align: left; } .logo { padding: 0; /* For text only logo */ font-size: 1.4em; line-height: 1em; font-weight: bold; } .logo img { vertical-align: middle; padding-right: 1em; } .logo a { color: #fff; text-decoration: none; } p { line-height:1.5em; } h1 { margin-bottom: 0; line-height: 1.9em; } h2 { margin-top: 0; line-height: 1.7em; } #content { clear:both; padding-left: 30px; padding-right: 30px; padding-bottom: 30px; border-bottom: 5px solid #eee; } .mainlinks { float: right; margin-top: 0.5em; text-align: right; } ul.mainlinks > li { border-right: 1px dotted #ddd; padding-right: 10px; padding-left: 10px; display: inline; list-style: none; } ul.mainlinks > li.last, ul.mainlinks > li.first { border-right: none; } </style> </head> <body> <div id="header"> <ul class="mainlinks"> <li> <a href="http://www.centos.org/">Home</a> </li> <li> <a href="http://wiki.centos.org/">Wiki</a> </li> <li> <a href="http://wiki.centos.org/GettingHelp/ListInfo">Mailing Lists</a></li> <li> <a href="http://www.centos.org/download/mirrors/">Mirror List</a></li> <li> <a href="http://wiki.centos.org/irc">IRC</a></li> <li> <a href="https://www.centos.org/forums/">Forums</a></li> <li> <a href="http://bugs.centos.org/">Bugs</a> </li> <li class="last"> <a href="http://wiki.centos.org/Donate">Donate</a></li> </ul> <div class="logo"> <a href="http://www.centos.org/"><img src="img/centos-logo.png" border="0"></a> </div> </div> <div id="content"> <h1>CentOS-YUM 所有的包</h1> <h2>按照系统版本选择版本下载</h2> <a href="http://192.168.96.250/share">CentOS8 版本</a><br/> 以上包适用于 Centos 8<br/> <a href="http://192.168.96.250/share">CentOS7 版本</a><br/> 以上包适用于 Centos 7<br/> <p style="font-weight:bolder;color:red;font-size:18px;">请替换该文件并填写以下内容:</p> <p style="font-weight:bolder;color:blue;font-size:15px;">替换文件: /etc/yum.repos.d/CentOS-Base.repo</p> <p><a href="http://www.centos.org/">CentOS 官网</a> </p> <p>,</p> <p> <a href="http://www.centos.org/download/mirrors/">mirror network</a>,<a href="http://wiki.centos.org/SpecialInterestGroup/">SIGs</a>,<a href="http://wiki.centos.org/">wiki</a>, <a href="http://wiki.centos.org/irc">IRC Chat</a>, <a href="http://wiki.centos.org/GettingHelp/ListInfo">Email Lists</a>, <a href="https://www.centos.org/forums/">Forums</a>, <a href="http://bugs.centos.org/">Bugs Database</a> , <a href="http://wiki.centos.org/FAQ/">FAQ</a>.</p> </div> </div> </body> </html1>4、替换yum源文件# 备份原来的官方yum源[root@edenluo CentOS-YUM]# cd /etc/yum.repos.d/ [root@edenluo yum.repos.d]# mv ./* /tmp/[root@edenluo yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 下载aliyun的centos7的yum源 [root@edenluo yum.repos.d]# vim yum.reposync.sh # 同步脚本 #!/usr/bin/bash reposync -p /usr/share/nginx/html/CentOS-YUM/Aliyun/version_7/64bit/ /usr/bin/sed -i "s/7/8/g" `grep 7 -rl /etc/yum.repos.d/CentOS-Base.repo` reposync -p /usr/share/nginx/html/CentOS-YUM/Aliyun/version_8/64bit/ /usr/bin/sed -i "s/8/7/g" `grep 6 -rl /etc/yum.repos.d/CentOS-Base.repo` #还原 [root@edenluo yum.repos.d]# chmod +x yum.reposync.sh # 要给执行权限 [root@edenluo yum.repos.d]# ll total 8 -rw-r--r-- 1 root root 2523 Jun 16 2018 CentOS-Base.repo -rwxr-xr-x 1 root root 303 Jul 5 19:02 yum.reposync.sh [root@edenluo yum.repos.d]# sh yum.reposync.sh # 等待同步完成 # 同步完成,查看文件大小,合计27G [root@edenluo CentOS-YUM]# du -ch Aliyun/ 9.0G Aliyun/version_7/64bit/base/Packages 9.0G Aliyun/version_7/64bit/base 616M Aliyun/version_7/64bit/extras/Packages 616M Aliyun/version_7/64bit/extras 3.6G Aliyun/version_7/64bit/updates/Packages 3.6G Aliyun/version_7/64bit/updates 14G Aliyun/version_7/64bit 14G Aliyun/version_7 9.0G Aliyun/version_8/64bit/base/Packages 9.0G Aliyun/version_8/64bit/base 616M Aliyun/version_8/64bit/extras/Packages 616M Aliyun/version_8/64bit/extras 3.6G Aliyun/version_8/64bit/updates/Packages 3.6G Aliyun/version_8/64bit/updates 14G Aliyun/version_8/64bit 14G Aliyun/version_8 27G Aliyun/ 27G total5、建立yum源仓库'因为建仓最终的目的也是可供client来进行检索的,所以得每个Packages目录都要建成仓库,所以建仓的时候,目录指到最底层的Packages,而-np更新的时候只用指定到64bit的目录就可以了,否则会重复建立base、extras、updates三个目录进行下载 [root@edenluo ~]# createrepo -p /usr/share/nginx/html/CentOS-YUM/Aliyun/version_7/64bit/base/Packages/ Spawning worker 0 with 10070 pkgs Workers Finished Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete [root@edenluo ~]# createrepo -p /usr/share/nginx/html/CentOS-YUM/Aliyun/version_7/64bit/extras/Packages/ Spawning worker 0 with 397 pkgs Workers Finished Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete [root@edenluo ~]# createrepo -p /usr/share/nginx/html/CentOS-YUM/Aliyun/version_7/64bit/updates/Packages/ Spawning worker 0 with 884 pkgs Workers Finished Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete [root@edenluo ~]# createrepo -p /usr/share/nginx/html/CentOS-YUM/Aliyun/version_8/64bit/base/Packages/ Spawning worker 0 with 10070 pkgs Workers Finished Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete [root@edenluo ~]# createrepo -p /usr/share/nginx/html/CentOS-YUM/Aliyun/version_8/64bit/updates/Packages/ Spawning worker 0 with 884 pkgs Workers Finished Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete [root@edenluo ~]# createrepo -p /usr/share/nginx/html/CentOS-YUM/Aliyun/version_8/64bit/extras/Packages/ Spawning worker 0 with 397 pkgs Workers Finished Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete [root@edenluo ~]# tree -d /usr/share/nginx/html/CentOS-YUM/Aliyun/ # 建仓完成后,会自动生成一个repodata目录 /usr/share/nginx/html/CentOS-YUM/Aliyun/ ├── version_8 │ └── 64bit │ ├── base │ │ └── Packages │ │ └── repodata │ ├── extras │ │ └── Packages │ │ └── repodata │ └── updates │ └── Packages │ └── repodata └── version_7 └── 64bit ├── base │ └── Packages │ └── repodata ├── extras │ └── Packages │ └── repodata └── updates └── Packages └── repodata 22 directories'可以写一个更新yum源的脚本,然后写一个计划任务,定期更新yum源(reposync -np 就是更新新的rpm包) #!/usr/bin/bash reposync -np /usr/share/nginx/html/CentOS-YUM/Aliyun/version_7/64bit/ echo "centos7 is sync complate" /usr/bin/sed -i "s/7/8/g" `grep 7 -rl /etc/yum.repos.d/CentOS-Base.repo` reposync -np /usr/share/nginx/html/CentOS-YUM/Aliyun/version_8/64bit/ echo "centos6 is sync complate" /usr/bin/sed -i "s/8/7/g" `grep 6 -rl /etc/yum.repos.d/CentOS-Base.repo`三、配置客户端yum# 备份原来的yum源 [root@edenluo ~]# cd /etc/yum.repos.d/ [root@edenluo yum.repos.d]# ls CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo epel-testing.repo CentOS-CR.repo CentOS-fasttrack.repo CentOS-Sources.repo epel.repo [root@edenluo yum.repos.d]# mkdir back [root@edenluo yum.repos.d]# mv CentOS-* back/ [root@edenluo yum.repos.d]# mv epel* back/ [root@edenluo yum.repos.d]# ls back[root@edenluo yum.repos.d]# vim CentOS-Base.repo # 需要8,就使用8,需要7,就使用7,也可以使用yum-plugin-priorities工具来控制优先级,加上priority=1(2|3|4都可以)来控制优先级 [Aliyun_7_base] name=source_from_localserver baseurl=http://192.168.57.133/CentOS-YUM/Aliyun/version_7/64bit/base/Packages gpgcheck=0 enable=1 [Aliyun_7_extras] name=source_from_localserver baseurl=http://192.168.57.133/CentOS-YUM/Aliyun/version_7/64bit/extras/Packages gpgcheck=0 enable=1 [Aliyun_7_updates] name=source_from_localserver baseurl=http://192.168.57.133/CentOS-YUM/Aliyun/version_7/64bit/updates/Packages gpgcheck=0 enable=1 # [Aliyun_8_base] # name=source_from_localserver # baseurl=http://192.168.57.133/CentOS-YUM/Aliyun/version_8/4bit/base/Packages # gpgcheck=0 # enable=1 # # [Aliyun_8_extras] # name=source_from_localserver # baseurl=http://192.168.57.133/CentOS-YUM/Aliyun/version_8/74bit/extras/Packages # gpgcheck=0 # enable=1 # # [Aliyun_8_updates] # name=source_from_localserver # baseurl=http://192.168.57.133/CentOS-YUM/Aliyun/version_8/74bit/updates/Packages # gpgcheck=0 # enable=1 [root@edenluo yum.repos.d]# yum clean all [root@edenluo yum.repos.d]# yum makecache# 安装软件来测试一下 [root@edenluo yum.repos.d]# yum -y install net-tools Loaded plugins: fastestmirror, priorities Loading mirror speeds from cached hostfile Resolving Dependencies --> Running transaction check ---> Package net-tools.x86_64 0:2.0-0.25.20131004git.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ===================================================================================================== Package Arch Version Repository Size ===================================================================================================== Installing: net-tools x86_64 2.0-0.25.20131004git.el7 Aliyun_7_base 306 k Transaction Summary ===================================================================================================== Install 1 Package Total download size: 306 k Installed size: 917 k Downloading packages: net-tools-2.0-0.25.20131004git.el7.x86_64.rpm | 306 kB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : net-tools-2.0-0.25.20131004git.el7.x86_64 1/1 Verifying : net-tools-2.0-0.25.20131004git.el7.x86_64 1/1 Installed: net-tools.x86_64 0:2.0-0.25.20131004git.el7 Complete!
2024年11月03日
7 阅读
0 评论
0 点赞
2024-10-19
基于国外服务器搭建自己的VPN详细教程
本教程仅供学习研究,搭建成功后请立即删除,禁止使用。否则一切后果由使用者本人承担。我们在工作和生活中都需要用到翻墙,但由于种种原因,现在第三方已经不那么容易使用了。下面小编与大家分享如何利用国外服务器构建我们自己的私人VPN。首先这个方法不是免费的第一步:你需要有一台国外的服务器,或者香港服务器也可以,云服务平台有很多,如果只是单纯的搭建VPN,可以买便宜的服务器。目前国内禁止访问海外网站及违法网站,搭建成功后请立即删除,搭建后不立即删除会导致服务器IP被屏蔽,服务器IP被屏蔽后本站拒不更换,搭建则默认知晓并同意,否则一切后果由本人承担。第二步:服务器配置,安装Shadowsocks Server1、执行如下命令wget --no-check-certificate -O shadowsocks-all.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.sh2、上面的命令执行结束后,执行下面的命令chmod +x shadowsocks-all.sh3、上面的命令执行结束后,执行下面的命令./shadowsocks-all.sh 2>&1| tee shadowsocks-all.log4、执行上述命令会有相关输入提示操作;根据需要选择。不明白的话就直接选1或者直接默认回车;之后会提示你输入密码和端口,对应设置即可,或者直接使用默认的;由于 iPhone端的wingy目前只支持到cfb,所以加密方式选择aes-256-cfb也就是选择7;全部执行完成之后就会出现如下信息:StartingShadowsocks success Congratulations, Shadowsocks-Python server install completed! YourServer IP : 你的IP YourServerPort: 在第四步提示设置的端口号 YourPassword: 在第四步提示设置的密码 YourEncryptionMethod: aes-256-cfb Your QR Code: (ForShadowsocksWindows, OSX, Androidand iOS clients) ss://YWVzLTI1Ni1jZmI6emh1aTA4MTA0MTJaaaccuMjmmLjU1LjE5MTo4tdVg4 Your QR Code has been saved as a PNG file path: /root/shadowsocks_python_qr.png Welcome to visit: https://teddysun.com/486.html Enjoy it!5、看到以上信息就说明安装完成了,然后根据不同的终端设备进行设置就可以第三步:使用Shadowsocks终端体验VPN1、下载对应客户端Windows:https://pan.hk.cn/#s/9KmGgiWgMac:https://github.com/yangfeicheung/Shadowsocks-X/releasesAndroid:https://pan.hk.cn/#s/9KmGPmAwiPhone:App Store上下载ShadowLink,这个要用国外appid才可以下载哦。国内的搜不到的,因为shadowrocket收费的2、配置Shadowsockswindows下载之后运行就会看到右下角有小飞机,然后右键编辑服务器;对应的服务器地址、端口、密码、加密方式就是第二步中4步骤中看到的信息,对应填写确定即可;见证奇迹的时刻到了浏览器打开https://www.google.com/android手机安装好上面对应的客户端如下图左边的填写对应的服务ip、端口、密码、加密方式然后保存;然后点击中间图下面的小飞机,看到手机上面有个钥匙的就是成功了,然后你就可以用浏览器访问Google嘞iPhone手机安装好上面对应的客户端如左边图点击添加线路,然后是中间图填写对应的服务ip、端口、密码、加密方式然后保存,之后点击左图的开关按钮;看到手机上出现vpn的图标就成功了,可以随心所欲看视频了。以上就是搭建vpn的全部步骤了,赶快去制作属于你自己的vpn吧!声明一下:教程仅供参考,请勿用于任何违法行为,学习研究后请在10分钟内删除,禁止使用。
2024年10月19日
12 阅读
1 评论
0 点赞
2024-10-13
6个打开链接地址的方式
今天分享 6 个链接地址打开的方式,比较基础的内容,但是可以拓展一下 js 的知识面。1、window.location.href这应该是最常用的方式了,可以将当前页面跳转到指定的链接,适合普通的页面跳转。window.location.href = 'https://laokbk.cn/';2、window.open()这个方法可以在新窗口或新标签页中打开一个链接。window.open('https://laokbk.cn/category/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/', '_blank'); // 在新标签页中打开3、document.location.assign()与 window.location.href 类似,它会将当前页面替换为新的页面。document.location.assign('https://laokbk.cn/category/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/')4、document.location.replace()与 window.location.href 类似,但 replace() 不会保留浏览器历史记录,因此无法返回到前一个页面。document.location.replace('https://laokbk.cn/category/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/')5、通过 标签的 click 事件通过 JavaScript 模拟点击 标签,从而实现跳转,非常灵活的一种方式。const link = document.createElement('a'); link.href = 'https://laokbk.cn/category/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/'; link.target = '_blank'; // 在新标签页中打开 link.click(); // 触发点击事件6、window.history.pushState()用于修改浏览器历史记录,不会实际进行页面跳转,但可以改变地址栏 URL。适用于单页应用程序 (SPA),这也是像 vue-router 这样的路由库的底层跳转原理。window.history.pushState({}, '', '/new-url')
2024年10月13日
9 阅读
0 评论
0 点赞
1
2
...
24
CC BY-NC-ND