清风博客 https://www.skyfinder.cc 关注IT世界,记录平凡生活 Mon, 05 Jul 2021 16:17:48 +0000 zh-CN hourly 1 https://wordpress.org/?v=5.7.2 单击游戏《抗日血战上海滩》在Windows 10系统打不开的解决办法 https://www.skyfinder.cc/2021/07/06/game-shanghai-windows-10/ https://www.skyfinder.cc/2021/07/06/game-shanghai-windows-10/#respond Mon, 05 Jul 2021 16:15:00 +0000 https://www.skyfinder.cc/?p=3572

背景

《抗日血战上海滩》是一款很早的单击游戏,很早以前在网吧看到好玩的单击游戏之一。个人笔记本也有这一款游戏,闲来无事的时候就玩一下。这款有游戏陪我经历过Windows XP、Windows VISTA 、Windows 7等版本系统,也算的上风雨同路啦!最近整理相关文件发现了《抗日血战上海滩》这款游戏,于是尝试解压出来娱乐一下。很遗憾!这款游戏打开后就无异常提示的情况下退出运行,通过设置各个兼容模式打开依然没有任何效果。通过查找部分资料,得到一些解决方案。

解决方案

  • 首先在桌面上创建此游戏的快捷方式,例如:shanghai.exe
  • 鼠标移动到刚才创建的快捷方式上,鼠标右键菜单弹出选择属性
  • 在“目标程序”加一个参数 -windows(前面有个空格)
  • 随后双击快捷方式以窗口模式进入游戏
  • 游戏设置中的将分辨率设置为1024x768
  • 随后再把电脑的显示分辨率设置为1024x768,点击“创建的快捷方式”运行即可

设置参数后,双击快捷方式以窗口的形式打开游戏,点击进入游戏设置

将分辨率由800×600设置为1024×768

打开Windows 10 显示设置,将显示分辨率设置为1024×768

设置完成后,重新打开《抗日血战上海滩》即可打开运行。

抗日血战上海滩中文版游戏背景

抗日血战上海滩游戏背景为1937年卢沟桥事变后,中日在上海进行的抗日历史上规模很大的会战——淞沪会战,是役两国投入总兵力超过200万人,战斗持续时间长达3个月。

而作为中国特种部队一员的你,就是要孤身一人去执行一系列不可能的任务,突破层层封锁杀入日军总部,最后亲手用小手枪(或刀杀)击毙敌酋——长谷川清大将。当然,为了见到这位最后的大BOSS,玩家必须要先跟大大小小的日军士兵、军曹、武士、忍者、自杀式炸弹人、生化兵、等等等等,作亲密的殊死搏斗。

总之,就是在你用手枪、冲锋枪、机枪、狙击枪、重机枪手榴弹、火箭筒干掉数万日军后,再踏着BOSS的尸体过关。为了达到好的战斗效果,游戏中所有BOT的动作全部用动作采集完成,预计仅此一项,就会创国产游戏的制作记录。

抗日血战上海滩中文版游戏秘籍

进入抗日血战上海滩游戏后按下键盘左上角的~键打开控制台,输入如下指令,回车即可。

god_on 开启无敌

god_off 关闭无敌

haveallweapon 拥有所有武器

addammo 给已有的武器加满弹药

ammonolimit 已有的武器子弹无限

      

      

      

      

转载请注明:清风博客 » 单击游戏《抗日血战上海滩》在Windows 10系统打不开的解决办法

]]>
https://www.skyfinder.cc/2021/07/06/game-shanghai-windows-10/feed/ 0
.Net访问Windows共享目录 https://www.skyfinder.cc/2021/06/29/net-access-shared-folder/ https://www.skyfinder.cc/2021/06/29/net-access-shared-folder/#respond Tue, 29 Jun 2021 01:00:00 +0000 https://www.skyfinder.cc/?p=3538 背景

无意见又翻到了曾经的一些项目,看到了关于.Net访问Windows共享目录的一些代码。曾经在内网通过共享目录作为服务器文件的存储方式,个人觉得部分的实现代码可以记录下来作为备份。所以,整理了以下代码。

代码实现

公用内容


    /// <summary>
    ///  IdentityScope 的摘要说明
    /// </summary>
    public class IdentityScope : IDisposable
    {
        // obtains user token
        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool LogonUser(string pszUsername, string pszDomain, string pszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

        // closes open handes returned by LogonUser

        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]

        extern static bool CloseHandle(IntPtr handle);


        [DllImport("Advapi32.DLL")]
        static extern bool ImpersonateLoggedOnUser(IntPtr hToken);

        [DllImport("Advapi32.DLL")]
        static extern bool RevertToSelf();

        // logon types
        const int LOGON32_LOGON_INTERACTIVE = 2;
        const int LOGON32_LOGON_NETWORK = 3;
        const int LOGON32_LOGON_NEW_CREDENTIALS = 9;
        // logon providers
        const int LOGON32_PROVIDER_DEFAULT = 0;
        const int LOGON32_PROVIDER_WINNT50 = 3;
        const int LOGON32_PROVIDER_WINNT40 = 2;
        const int LOGON32_PROVIDER_WINNT35 = 1;

        private bool disposed;

        /// <summary>
        /// 登录
        /// </summary>
        /// <param name="sUsername">用户名</param>
        /// <param name="sDomain">第二个参数是域名,有域名的话写域名,没有域名写目标机器的IP·</param>
        /// <param name="sPassword">密码</param>
        public IdentityScope(string sUsername, string sDomain, string sPassword)
        {

            // initialize tokens
            IntPtr pExistingTokenHandle = new IntPtr(0);
            IntPtr pDuplicateTokenHandle = new IntPtr(0);
            try
            {

                // get handle to token
                bool bImpersonated = LogonUser(sUsername, sDomain, sPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref pExistingTokenHandle);
                if (bImpersonated)
                {
                    if (!ImpersonateLoggedOnUser(pExistingTokenHandle))
                    {
                        int nErrorCode = Marshal.GetLastWin32Error();
                        // throw new Exception("ImpersonateLoggedOnUser error;Code=" + nErrorCode);
                        throw new Exception("文件服务器远程连接异常,请稍后再试!");
                    }

                }
                else
                {
                    int nErrorCode = Marshal.GetLastWin32Error();
                    //throw new Exception("LogonUser error;Code=" + nErrorCode);
                    throw new Exception("文件服务器远程连接异常,请稍后再试!");

                }

            }
            finally
            {
                // close handle(s)
                if (pExistingTokenHandle != IntPtr.Zero)
                {

                    CloseHandle(pExistingTokenHandle);
                }

                if (pDuplicateTokenHandle != IntPtr.Zero)
                {

                    CloseHandle(pDuplicateTokenHandle);
                }
            }

        }

        protected virtual void Dispose(bool disposing)
        {

            if (!disposed)
            {
                RevertToSelf();
                disposed = true;
            }

        }

        public void Dispose()
        {
            Dispose(true);
        }
    }

访问调用

      
using ShareAccess.Common;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ShareAccess
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
               
                using (IdentityScope c = new IdentityScope("Administrator","192.168.0.102","1234567"))
                {
                    FileInfo fileInfo = new FileInfo("C:\\Users\\finder\\Desktop\\taskapp2.zip");
                    fileInfo.CopyTo("\\\\192.168.0.102\\Share\\" + fileInfo.Name);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"{ex}");
            }
            Console.Read();
        }
    }
}

示例下载

.Net访问Windows共享目录示例

转载请注明:清风博客 » .Net访问Windows共享目录

]]>
https://www.skyfinder.cc/2021/06/29/net-access-shared-folder/feed/ 0
System.Data.OracleClient需要Oracle 客户端软件version 8.1.7或更高版本 https://www.skyfinder.cc/2021/06/23/system-data-oracle-client-error/ https://www.skyfinder.cc/2021/06/23/system-data-oracle-client-error/#respond Wed, 23 Jun 2021 10:45:48 +0000 https://www.skyfinder.cc/?p=3541 背景

因业务需求需要进行数据同步,客户又没有提供相关的接口。经过协商,客户提供相关视图直连他们数据库。

数据库:Oracle 11g

问题

使用.net访问Oracle数据出现以下错误:

System.Data.OracleClient 需要Oracle 客户端软件 version 8.1.7 或 更高版本

解决

  • 找到Oracle安装文件夹找到oci.dlloraociei11.dll两个dll文件
  • 将以上两个文件放到system32目录下或者程序的bin目录下

下载

Oracle_11g提取码:hrbc
以上下载地址中的文件就是本文中提到的两个DLL文件

转载请注明:清风博客 » System.Data.OracleClient需要Oracle 客户端软件version 8.1.7或更高版本

]]>
https://www.skyfinder.cc/2021/06/23/system-data-oracle-client-error/feed/ 0
.NET读取Pem证书私钥解密 https://www.skyfinder.cc/2021/06/14/dot-net-rsa-pem/ https://www.skyfinder.cc/2021/06/14/dot-net-rsa-pem/#respond Mon, 14 Jun 2021 03:57:53 +0000 https://www.skyfinder.cc/?p=3532 背景

因业务需求的需要,要与第三方进行相关的数据对接,按照第三方规定需要对其数据通过私钥进行RSA解密。第三方提供了相关的Pem证书文件,但是这种格式的证书文件.NET并不能直接使用,需要进行相关的转换。

pem在转XML时需要依赖一个第三方库BouncyCastle

下载

BouncyCastle
如果通过官网下载比较慢,可以使用本博以上链接下载。

代码实现


using System;
using System.Text;
using System.Security.Cryptography;
using System.IO;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;

namespace CommonTool.Share.Util
{
    /// <summary>
    /// 非对称RSA解密
    /// </summary>
    public class PemRsaEncrypt
    {
       /// <summary>
       /// RSA解密
       /// </summary>
       /// <param name="filePath">pem私钥证书路径</param>
       /// <param name="content">加密的文本</param>
       /// <returns>解密后的明文</returns>
       public static string Decrypt(string filePath,string content)
       {
           using (var fileStream = File.OpenText(filePath))
           {
               string privateJavaKey = fileStream.ReadToEnd().Replace("-----BEGIN PRIVATE KEY-----", "").Replace("-----END PRIVATE KEY-----", "").Replace("\r", "").Replace("\n", "");
               RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateJavaKey));
               string xmlPrivateKey = string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
                            Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
                            Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
                            Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
                            Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
                            Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
                            Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
                            Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
                            Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));

               RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
               byte[] cipherbytes;
               rsa.FromXmlString(xmlPrivateKey);
               cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);
               return Encoding.UTF8.GetString(cipherbytes);
           }
       }
    }
}

转载请注明:清风博客 » .NET读取Pem证书私钥解密

]]>
https://www.skyfinder.cc/2021/06/14/dot-net-rsa-pem/feed/ 0
新冠疫苗接种 https://www.skyfinder.cc/2021/05/29/covid-19-vaccination/ https://www.skyfinder.cc/2021/05/29/covid-19-vaccination/#respond Sat, 29 May 2021 06:18:37 +0000 https://www.skyfinder.cc/?p=3509

新冠疫苗国家很早就开始打疫苗,根据情况划分了建议接种的年龄阶段,以及确定了不宜接种的各种情况。很早之前并没有参与任何接种,原因也很简单,身体不太舒服一直在吃要,所以就暂缓了。

第一剂新冠疫苗接种

前天(2021-05-27)决定去接种新冠疫苗,根据通知当天下午16:4020:00期间进行接种。下午请假2个小时去,我想这样已经够提前了吧。但是,这种想法还是过于草率了,赶到社康的时候已经有了好多人在排队,这样的队伍长到无法想象。维持秩序的警察以及义工都不建议后来者再进行排队等待,我看到这么多人也就放弃了当天接种想法。

突然,群里接到最新疫苗接种信息,可以领取小票凭据,到第二天在指定时间排队接种。于是,在昨天(2021-05-28)早上到社康排队接种,本以为自己去的已经很早了,万万没有想到队伍已经有50人左右。在等待1个小时左右终于完成了新冠疫苗(北京生物)的接种,留观37分钟并没有发现任何异常。临走的时候听到社康工作人员说的一句话:”你们出去以后,再出现任何问题都和我们没有关系啦!”。听到社康工作人员说这句话后,我的心突然颤抖一下。原以为半小时内没有不良反应,以后就不回有任何的副作用,我觉得自己可能又要想多了。

不良反应

事情的发展往往不会朝着自己意愿方向发展,接种新冠疫苗后的不良反应下午开始出现了。接种部位疼痛加重,头部头痛开始,头痛晚上达到高峰,发困、乏力。无奈晚上就提前躺下休息一下,就在这难受中就睡着了。今天(2021-05-29)早上醒来,头痛的症状消失。但接种部位周围起了红疹,不过这种症状并不是全身性的,先观察再说吧。

这个疫苗接种真的是有个体的差异,有些同事朋友接种没有任何症状反应。

疫苗接种部位周围红疹在7天内慢慢消退!

转载请注明:清风博客 » 新冠疫苗接种

]]>
https://www.skyfinder.cc/2021/05/29/covid-19-vaccination/feed/ 0
Microsoft SQL Server跨服务器查询 https://www.skyfinder.cc/2021/05/23/microsoft-sql-server-remote-query/ https://www.skyfinder.cc/2021/05/23/microsoft-sql-server-remote-query/#respond Sun, 23 May 2021 01:00:00 +0000 https://www.skyfinder.cc/?p=3501 创建链接服务器

sp_addlinkedserver

创建链接服务器。 链接服务器让用户可以对 OLE DB 数据源进行分布式异类查询。 使用 sp_addlinkedserver 创建链接服务器后,可对该服务器运行分布式查询。 如果链接服务器定义为 SQL Server实例,则可执行远程存储过程。

语法


sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]   
     [ , [ @provider= ] 'provider_name' ]  
     [ , [ @datasrc= ] 'data_source' ]   
     [ , [ @location= ] 'location' ]   
     [ , [ @provstr= ] 'provider_string' ]   
     [ , [ @catalog= ] 'catalog' ]

参数

[ @server =] ‘ 服务器 ‘
要创建的链接服务器的名称。 server 的数据类型为 sysname,无默认值。

[ @srvproduct =] ‘ product_name ‘
要添加为链接服务器的 OLE DB 数据源的产品名称。 product_name 为 nvarchar ( 128 ),默认值为 NULL。 如果不需要指定 SQL Server、 provider_name、 data_source、 位置、 provider_string 和 目录 。

[ @provider =] ‘ provider_name ‘
与此数据源对应的 OLE DB 访问接口的唯一编程标识符 (PROGID)。 对于当前计算机上安装的指定 OLE DB 提供程序, provider_name 必须是唯一的。 provider_name 为 nvarchar (128),默认值为 NULL;但是,如果省略 provider_name ,则使用 sqlncli.msi。

使用 SQLNCLI.MSI 将重定向 SQL Server 到 SQL Server Native Client OLE DB 提供程序的最新版本。 OLE DB 提供程序应以指定的 PROGID 在注册表中注册。

以前的 Microsoft OLE DB Provider for SQL Server (SQLOLEDB) 和 SQL Server Native Client OLEDB 提供程序 (SQLNCLI) 仍然不推荐使用,不建议在新的开发工作中使用它们。 相反,请使用新的 Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL),其将使用最新的服务器功能进行更新。

[ @datasrc =] ‘ data_source ‘
由 OLE DB 访问接口解释的数据源的名称。 data_source (4000 ) 为 nvarchar。 data_source 作为 DBPROP_INIT_DATASOURCE 属性传递以初始化 OLE DB 提供程序。

[ @location =] ‘ 位置 ‘
由 OLE DB 访问接口解释的数据库的位置。 location (4000 ) 为 NVARCHAR,默认值为 NULL。 location 作为 DBPROP_INIT_LOCATION 属性传递以初始化 OLE DB 提供程序。

[ @provstr =] ‘ provider_string ‘
OLE DB 访问接口特定的连接字符串,它可标识唯一的数据源。 provider_string 为 nvarchar ( 4000 ),默认值为 NULL。 provstr 传递给 IDataInitialize,或设置为 DBPROP_INIT_PROVIDERSTRING 属性以初始化 OLE DB 提供程序。

当针对 SQL Server Native Client OLE DB 提供程序创建链接服务器时,可以通过使用 server 关键字 as server =servername \ instancename 指定的特定实例来指定实例 SQL Server 。 servername 是运行的计算机的名称 SQL Server , instancename 是 SQL Server 用户将连接到的特定实例的名称。

若要访问镜像数据库,则连接字符串必须包含数据库名称。 该名称是数据访问接口启用故障转移尝试所必需的。 可以在 @ provstr 或 @ catalog 参数中指定数据库。 此外,连接字符串还可以提供故障转移伙伴名称。

返回代码值

0(成功)或 1(失败)

sp_addlinkedsrvlogin

创建或更新 SQL Server 本地实例上的登录名与远程服务器中安全帐户之间的映射。

语法


sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname'   
     [ , [ @useself = ] { 'TRUE' | 'FALSE' | NULL } ]   
     [ , [ @locallogin = ] 'locallogin' ]   
     [ , [ @rmtuser = ] 'rmtuser' ]   
     [ , [ @rmtpassword = ] 'rmtpassword' ]

参数

[ @rmtsrvname = ] 'rmtsrvname'
应用登录映射的链接服务器的名称。 rmtsrvname 的值为 sysname,无默认值。

[ @useself = ] { 'TRUE' | 'FALSE' | NULL }'
确定是通过模拟本地登录名连接到 rmtsrvname ,还是显式提交登录名和密码。 数据类型为 varchar ( 8 ),默认值为 TRUE。

如果值为 TRUE,则指定登录名使用其自己的凭据连接到 rmtsrvname,并忽略 rmtuser 和 rmtpassword 参数。 FALSE 指定 rmtuser 和 rmtpassword 参数用于连接到指定 locallogin 的 rmtsrvname 。 如果将 rmtuser 和 RMTPASSWORD 设置为 NULL,则不会使用登录名或密码连接到链接服务器。

[ @locallogin = ] 'locallogin'
本地服务器上的登录。 locallogin 的值为 sysname,默认值为 NULL。 NULL 指定此条目适用于连接到 rmtsrvname 的所有本地登录名。 如果不为 NULL,则 locallogin 可以为 SQL Server 登录名或 Windows 登录名。 对于 Windows 登录来说,必须以直接的方式或通过已被授权访问的 Windows 组成员身份授予其访问 SQL Server 的权限。

[ @rmtuser = ] 'rmtuser'
当为 FALSE 时,用于连接到 rmtsrvname 的远程登录名 @useself 。 当远程服务器是 SQL Server 不使用 Windows 身份验证的实例时, rmtuser 是一个 SQL Server 登录名。 rmtuser 的值为 sysname,默认值为 NULL。

[ @rmtpassword = ] 'rmtpassword'
与 rmtuser 关联的密码。 rmtpassword 的值为 sysname,默认值为 NULL。

返回代码值

0(成功)或 1(失败)

sp_droplinkedsrvlogin 

删除运行 SQL Server 的本地服务器上的登录与链接服务器上的登录之间的现有映射。

语法


sp_droplinkedsrvlogin [ @rmtsrvname= ] 'rmtsrvname' ,   
   [ @locallogin= ] 'locallogin'

参数

[ @rmtsrvname = ] 'rmtsrvname' 应用登录映射的链接服务器的名称 SQL Server 。 rmtsrvname 的值为 sysname,无默认值。 rmtsrvname 必须已存在。

[ @locallogin = ] 'locallogin'SQL Server本地服务器上的登录名,它具有到链接服务器的映射 rmtsrvname。 locallogin 的值为 sysname,无默认值。 必须已经存在 locallogin 到 rmtsrvname 的映射。 如果为 NULL,则会删除 sp_addlinkedserver 创建的默认映射,该映射将本地服务器上的所有登录名映射到链接服务器上的登录名。

返回代码值

0(成功)或 1(失败)

sp_dropserver 

从本地 SQL Server 实例中的已知远程服务器和链接服务器的列表中删除服务器。

语法


sp_dropserver [ @server = ] 'server'   
     [ , [ @droplogins = ] { 'droplogins' | NULL} ]

参数

服务器
要删除的服务器。 server 的数据类型为 sysname,无默认值。 服务器 必须存在。

droplogins
指示如果指定了 droplogins ,则还必须删除 服务器 的相关远程服务器和链接服务器登录名。 @droplogins 为 char (10),默认值为 NULL。

返回代码值

0(成功)或 1(失败)

示例

异地服务器, 数据库之间的查询

创建链接服务器


EXEC sp_addlinkedserver
@server = 'SourceHost', -- 目标服务器别名
@srvproduct = 'MSSQL',  -- 产品名称
@datasrc = '192.168.0.132\MSSQLSERVER2012' , -- 目标服务器名称
@provider = 'SQLOLEDB'

登录链接服务器


EXEC sp_addlinkedsrvlogin
@rmtsrvname = 'SourceHost' , -- 与以上 @server 同名
@useself = 'false' ,
@locallogin = NULL ,
@rmtuser = 'sa' ,
@rmtpassword = '123'

删除登录与链接服务器的映射


--删除登录与链接服务器的映射
exec sp_droplinkedsrvlogin  @rmtsrvname= 'SourceHost' ,   
    @locallogin= 'locallogin'  

删除链接服务器


--删除链接服务器 
exec sp_dropserver 'SourceHost', 'droplogins'

查询异地服务器的目标数据库


select * from SourceHost.目标数据库名称.dbo.表名

转载请注明:清风博客 » Microsoft SQL Server跨服务器查询

]]>
https://www.skyfinder.cc/2021/05/23/microsoft-sql-server-remote-query/feed/ 0
杂交水稻之父袁隆平逝世 https://www.skyfinder.cc/2021/05/22/fatherofhybridrice/ https://www.skyfinder.cc/2021/05/22/fatherofhybridrice/#respond Sat, 22 May 2021 06:21:43 +0000 https://www.skyfinder.cc/?p=3490

”杂交水稻之父“、中国工程院院士、“共和国勋章”获得者袁隆平,2021年5月22日13点07分在湖南长沙逝世,享年91岁。袁隆平是我国研究与发展杂交水稻的开创者,也是世界上第一个成功利用水稻杂种优势的科学家,被誉为“杂交水稻之父”。直到今年年初,他还坚持在海南三亚南繁基地开展科研工作。

看到关于袁隆平逝世的新闻,我的第一反应是难以置信,是不是有人在造谣。真的让人难以置信,最后确认还是真的。最初知道袁隆平这个名字,是在书本上,知道他的杂交水稻,知道他是杂交水稻之父,知道他是一个位伟大的科学家,很早我们对他的认知也仅仅如此而已。有没有后来者我不知道,我在想他的成就绝对是前无古人。想说些什么,但又不知道说些什么。唯有致敬!唯有缅怀!

袁隆平,男,1930年9月出生于北京,1953年毕业于西南农学院农学系。毕业后,一直从事农业教育及杂交水稻研究。1980-1981年赴美任国际水稻研究所技术指导。1982年任全国杂交水稻专家顾问组副组长。1991年受聘联合国粮农组织国际首席顾问。1995年被选为中国工程院院士。1971年至今任湖南农业科学院研究员,并任湖南省政协副主席、全国政协常委、国家杂交水稻工程技术研究中心主任。
  袁隆平院士是世界著名的杂交水稻专家,是我国杂交水稻研究领域的开创者和带头人,为我国粮食生产和农业科学的发展做出了杰出贡献。他的主要成就表现在杂交水稻的研究、应用与推广方面。
  七十年代初,袁隆平利用助手发现的天然雄性不育的“野败”作为杂交水稻的不育材料并发表了水稻杂种优势利用的观点,打破了世界性的自花授粉作物育种的禁区。七十年代中期,以他为首的科技攻关组完成了三系配套并培育成功杂交水稻,实现了杂交水稻的历史性突破。现我国杂交水稻的各个优良品种已占全国水稻种植面积的50%,平均增产20%。此后,他又提出“两系法亚种间杂种优势利用”的发展概念,国家“863”计划据此将两系法列为重要项目,经项目组科技人员6年的刻苦研究,已掌握两系法技术,并推广种植,现占水稻面积的10%,效果良好。
  1997年,他在国际“超级稻”的概念基础上,提出了“杂交水稻超高产育种”的技术路线,在实验田取得良好效果,亩产近800公斤,且米质类粳稻,引起国际上的高度重视。为进一步解决大面积、大幅度提高水稻产量难题奠定了基础。
  在全国农业科技工作者的共同努力下,1976年至1999年累计推广种植杂交水稻35亿多亩,增产稻谷3500亿公斤。近年来,全国杂交水稻年种植面积2.3亿亩左右,约占水稻总面积的50%,产量占稻谷总产的近60%,年增稻谷可养活6000万人口,社会和经济效益十分显著。
  袁隆平院士热爱祖国、品德高尚,他的成就和贡献,在国内外产生了强烈反响。杂交水稻的研究成果获得我国迄今为止唯一的发明特等奖。并先后荣获联合国教科文组织、粮农组织等多项国际奖励。袁隆平虽已年届70岁,仍然一如既往地活跃在科研与生产实践的第一线,从不间断地进行着研究、实验与应用。

转载请注明:清风博客 » 杂交水稻之父袁隆平逝世

]]>
https://www.skyfinder.cc/2021/05/22/fatherofhybridrice/feed/ 0
docker查看日志 https://www.skyfinder.cc/2021/05/19/docker-log-view/ https://www.skyfinder.cc/2021/05/19/docker-log-view/#respond Wed, 19 May 2021 04:56:39 +0000 https://www.skyfinder.cc/?p=3480 在工作当中有时候需要查看指定容器的日志记录,当日志比较多的时可以通过参数来进一步筛选。

命令格式


Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Options:
      --details           显示更多的信息
  -f, --follow           跟踪实时日志
      --since string   显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
      --tail string      从日志末尾显示多少行日志, 默认是all
  -t, --timestamps  显示时间戳
      --until string    显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

使用示例

查看指定容器全部日志


docker logs  容器ID或者容器名称

实时查看容器前100条日志


docker logs -f -t --tail 100 容器ID或者容器名称

查看某时间段日志


ocker logs -t --since="2021-05-18T13:23:37" --until "2021-05-19T12:23:37" 容器ID或者容器名称

查看最近10分钟的日志


docker logs --since 10m 容器ID或者容器名称

查看某时间之后的日志


docker logs -t --since="2021-05-18T13:23:37" 容器ID或者容器名称

转载请注明:清风博客 » docker查看日志

]]>
https://www.skyfinder.cc/2021/05/19/docker-log-view/feed/ 0
网站被恶意镜像的简单快速处理方法 https://www.skyfinder.cc/2021/05/02/mirror-site/ https://www.skyfinder.cc/2021/05/02/mirror-site/#respond Sun, 02 May 2021 15:08:28 +0000 https://www.skyfinder.cc/?p=3457 背景

站点网上飘,哪有不挨刀。总是遇到千奇百怪的问题,让人猝不及防。在51日的前一天,发现博客被人镜像了,这是一个非常糟心的问题,我非常肯定的是这次的镜像不怀好意。为什么我会这么说呢?因为镜像站点域名太不像话了,太长了,有没有特殊的含义,所以我认为这种镜像网站是非常有恶意的。如下图:

镜像站点域名

JavaScript简单紧急处理

这种恶意的镜像站点无法绝对的杜绝,只能尽可能的减小影响。此次处理非常简单,直接使用Javascript对当前域名进行判断,与指定域名不符就跳转回指定的域名。

版本一


var local=window.location.host;
if(local.indexOf("skyfinder.cc")==-1){
   location.href = location.href.replace(local,"skyfinder.cc");
}

版本二

为了更好的预防其简单替换域名,将我们对比的域名的各个字符ASCII码保存起来,通过转换重新组合为域名后再与当前host进行对比,不同则需要跳转原站点,反之则不需要任何的操作。


var local=window.location.host;
var myHost=[115,107,121,102,105,110,100,101,114,46,99,99];
var myurl=[];
for(var item in myHost){
   myurl.push(String.fromCharCode(myHost[item]));
}
if(local.indexOf(myurl.join(""))==-1){
   location.href = location.href.replace(local,myurl.join(""));
}

版本三

这个版本是使用以上其他版本对Javascript代码进行混淆的,希望这种方式使他们的操作增加更多的工作量。



var I1=window['\x6c\x6f\x63\x61\x74\x69\x6f\x6e']['\x68\x6f\x73\x74'];var sRPPOUO2=[115,107,121,102,105,110,100,101,114,46,99,99];var dzhW$3=[];for(var tMYXRE4 in sRPPOUO2){dzhW$3['\x70\x75\x73\x68'](window["\x53\x74\x72\x69\x6e\x67"]['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](sRPPOUO2[tMYXRE4]))}if(I1['\x69\x6e\x64\x65\x78\x4f\x66'](dzhW$3['\x6a\x6f\x69\x6e'](""))==-1){window['\x6c\x6f\x63\x61\x74\x69\x6f\x6e']['\x68\x72\x65\x66']['\x72\x65\x70\x6c\x61\x63\x65']();location['\x68\x72\x65\x66']=location['\x68\x72\x65\x66']['\x72\x65\x70\x6c\x61\x63\x65'](I1,dzhW$3['\x6a\x6f\x69\x6e'](""))}

效果展示

封禁IP

第一步 获取镜像站点的IP

新建一个php文件,将以下代码复制到文件中并命名为“ip.php”上传到网站根目录。


<?php
$file = "ip.txt";//保存的文件名
$ip = $_SERVER['REMOTE_ADDR'];
$handle =fopen($file,'a');
fwrite($handle,"IP Address:");
fwrite($handle,"$ip");
fwrite($handle,"\n");
fclose($handele);
?>

第二步 访问获取镜像站点地址

访问镜像站点,在镜像域名地址后面加ip.php,然后就会在自己网站根目录找到ip.txt文件了,打开复制里面的ip地址。

添加恶意镜像站点IP.htaccess

使用Deny from来将指定的IP加入黑名单,如下所示


#AIOWPS_IP_BLACKLIST_START
<IfModule !mod_authz_core.c>
Order allow,deny
Allow from all
Deny from 112.213.97.64
Deny from 37.187.78.50
Deny from 47.90.76.5
Deny from 5.188.0.0/16
Deny from 61.160.232.95
Deny from 61.160.232.94
Deny from 125.77.16.108
</IfModule>
<IfModule mod_authz_core.c>
<RequireAll>
Require all granted
Require not ip 112.213.97.64
Require not ip 37.187.78.50
Require not ip 47.90.76.5
Require not ip 5.188.0.0/16
Require not 61.160.232.95
Require not 61.160.232.94
Require not ip 125.77.16.108
</RequireAll>
</IfModule>
#AIOWPS_IP_BLACKLIST_END

将指定IP加入黑名单后,刷新镜像站点后显示403被禁止访问。使用这种方式需要维护黑名单列表,如果有新的镜像站点就继续要添加记录。

结语

我个人十分难以理解这种行为,个人博客而已,只是记录点生活的一些琐事、工作中的一些问题处理以及学习中的一些疑问。镜像一个没有商业价值的个人博客,真的值得吗?

关于其他解决恶意镜像站点的方法,以后在寻找。目前仅使用Javascript来做最简单快速的方法。

转载请注明:清风博客 » 网站被恶意镜像的简单快速处理方法

]]>
https://www.skyfinder.cc/2021/05/02/mirror-site/feed/ 0
Linux快速回收连接TIME-WAIT的连接 https://www.skyfinder.cc/2021/04/21/linuxtime-wait-recovery/ https://www.skyfinder.cc/2021/04/21/linuxtime-wait-recovery/#respond Wed, 21 Apr 2021 03:49:28 +0000 https://www.skyfinder.cc/?p=3448 发现Centos系统中出现了很多 TIME-WAIT的空闲连接,连接资源感觉即将耗尽,并且这些TIME-WAIT释放缓慢。

配置修改


vi /etc/sysctl.conf

编辑文件,加入以下内容:


# 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
net.ipv4.tcp_syncookies = 1

# 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_reuse = 1

# 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_tw_recycle = 1

# 修改系統默认的TIMEOUT时间
net.ipv4.tcp_fin_timeout = 30 

执行以下指令,让新增的配置生效.


/sbin/sysctl -p

完成修改之后,使用以下命令查看TIME_WAIT连接数


netstat -ant |grep “TIME_WAIT” |wc -l

转载请注明:清风博客 » Linux快速回收连接TIME-WAIT的连接

]]>
https://www.skyfinder.cc/2021/04/21/linuxtime-wait-recovery/feed/ 0
Docker容器在Centos使用脚本查看日志与清理 https://www.skyfinder.cc/2021/04/10/dockercentoslogclear/ https://www.skyfinder.cc/2021/04/10/dockercentoslogclear/#respond Sat, 10 Apr 2021 05:04:36 +0000 https://www.skyfinder.cc/?p=3425 背景

jenkins突然无法自动构建镜像,经过确认并非是无法构建,而是磁盘空间满了。 关于手动清理Docker日志的方法,自己曾经也处理过,但是容器多起来就相当麻烦。

linux上,容器日志一般存放在/var/lib/docker/containers/container_id/下面, 以json.log结尾的文件.

查看


#!/bin/sh
echo "======== docker containers logs file size ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
ls -lh $log
done

清理


#!/bin/sh
echo "======== start clean docker containers logs ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
echo "clean logs : $log"
cat /dev/null > $log
done
echo "======== end clean docker containers logs ========"

限制Docker容器日志大小

全局设置

新建/etc/docker/daemon.json,若是存在编辑即可。添加log-dirverlog-opts参数,示例如下:


# vim /etc/docker/daemon.json
{
  "log-driver":"json-file",
  "log-opts": {"max-size":"500m", "max-file":"3"}
}

max-size设置日志文件的大小的上线,max-file一个容器有多少个日志。

设置的日志大小,只对新建的容器有效.

// 重启docker守护进程
systemctl daemon-reload
systemctl restart docker

单个容器设置

通过配置容器docker-composemax-size选项来实现。


  consul-server-bootstrap:
    container_name: consul-server-bootstrap
    image: consul:latest
    logging: 
      driver: “json-file” 
      options: 
        max-size: “5g”

重新使用docker-compose运行即可完成最后设置。

转载请注明:清风博客 » Docker容器在Centos使用脚本查看日志与清理

]]>
https://www.skyfinder.cc/2021/04/10/dockercentoslogclear/feed/ 0
删除Docker中为none的Image/镜像 https://www.skyfinder.cc/2021/04/08/dockernoneimagermove/ https://www.skyfinder.cc/2021/04/08/dockernoneimagermove/#respond Thu, 08 Apr 2021 15:26:45 +0000 https://www.skyfinder.cc/?p=3422 docker build 或是 pull 命令就会产生临时镜像。


//删除无效的临时镜像
docker rmi $(docker images -f "dangling=true" -q)

其他方法

停止容器


docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }')

删除容器


docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')

删除镜像


docker rmi $(docker images | grep "none" | awk '{print $3}')

转载请注明:清风博客 » 删除Docker中为none的Image/镜像

]]>
https://www.skyfinder.cc/2021/04/08/dockernoneimagermove/feed/ 0
WordPress博客Gravatar头像无法显示问题 https://www.skyfinder.cc/2021/04/04/wordpress-gravatar/ https://www.skyfinder.cc/2021/04/04/wordpress-gravatar/#respond Sat, 03 Apr 2021 18:10:34 +0000 https://www.skyfinder.cc/?p=3412

Gravatar

Gravatar,全称Globally Recognized Avatar。翻译成中文为全球通用头像

Gravatar的概念首先是在国外的独立WordPress博客中兴起的,当你到任何一个支持Gravatar的网站留言时,这个网站都会根据你所提供的Email地址为你显示出匹配的头像。当然,这个头像,是需要你事先到Gravatar的网站注册并上传的,否则,在这个网站上,就只会显示成一个默认的头像。

注册使用

使用该服务时需要去官网中注册一个账号,并上传头像。

注意头像上传后会审核,然后管理员会按图片包含的内容划分一个等级(G 普通级、PG 辅导级、R 和 X 为限制级)。通过之后这个头像就可以使用了。在任何支持Gravatar的地方,在评论填写email地址时,请填写你申请注册头像用的这个email地址。你的头像就会出现在留言中。

网站调用

本博客使用的是WordPress,突然发现Gravatar头像已经无法显示了,成了裂图。经过证实链接被阻断了,所以无法显示。打开当前主题中functions.php文件进行编辑,新增以下代码并保存更新。


//v2ex国内gravatar头像缓存
function get_ssl_avatar($avatar){ 
	$avatar = preg_replace('/.*\/avatar\/(.*)\?s=([\d]+)&.*/','<img src="https://cdn.v2ex.com/gravatar/$1?s=$2" class="avatar avatar-$2" height="50px" width="50px">',$avatar);
	return $avatar; 
} 
add_filter('get_avatar', 'get_ssl_avatar');

如果您的WordPress网站中没用使用Gravatar头像功能,则没用任何影响.

Gravatar镜像源

本来博客中gravatar不可以使用,改为v2ex镜像一段时间后又重新不可以使用,只能继续找其他镜像来替代,以下是通过互联网收集一些支持gravatar的一些镜像.

官方的www  https://www.gravatar.com/avatar/

官方的en  https://en.gravatar.com/avatar/

官方的cn  https://cn.gravatar.com/avatar/

官方的secure  https://secure.gravatar.com/avatar/

V2EX  https://cdn.v2ex.com/gravatar/

Loli  https://gravatar.loli.net/avatar/

极客族  https://sdn.geekzu.org/avatar/

zeruns’s Blog https://gravatar.zeruns.tech/avatar/

转载请注明:清风博客 » WordPress博客Gravatar头像无法显示问题

]]>
https://www.skyfinder.cc/2021/04/04/wordpress-gravatar/feed/ 0
移除.net解决方案中TFS的绑定控制 https://www.skyfinder.cc/2021/03/26/removenetcodetfs/ https://www.skyfinder.cc/2021/03/26/removenetcodetfs/#respond Fri, 26 Mar 2021 11:23:56 +0000 https://www.skyfinder.cc/?p=3396 TFS与解决方案绑定信息清理

tfs与解决方案之间有相关信息需要清理,以下是相关的清理步骤。

删除关联文件以及文件夹

删除项目目录下所有的*.vssscc*.vspscc为后缀的文件,删除隐藏文件夹$tf

修改项目的解决方案文件

在目录中找到以*.sln为后缀名的解决方案文件,打开文件进行编辑。删除TeamFoundationVersionControl所在的整块内容并保存。

GlobalSection(TeamFoundationVersionControl) = preSolution
SccNumberOfProjects = 2
SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}
SccTeamFoundationServer = http:///tfs/defaultcollection
SccLocalPath0 = .
SccProjectUniqueName1 = .csproj
//Scc……
EndGlobalSection

修改项目文件

在项目目录中,找到以*.csproj为后缀的项目文件,打开进行编辑。

删除<SccProjectName><SccLocalPath><SccAuxPath><SccProvider>这四个节点。

代码实现

为了方便以后使用,所以这里使用.net 5 写一个小工具来清理这些TFS绑定信息。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DisassociateSourceCodeManagementTFS
{
    public partial class DisassociateTFS : Form
    {
        
        public DisassociateTFS()
        {
            InitializeComponent();
        }
        private void btnDisassociateTFS_Click(object sender, EventArgs e)
        {
            string path = txtSourceFolder.Text;
            if (string.IsNullOrWhiteSpace(path))
            {
                MessageBox.Show("请选择需要解除TFS绑定的源码目录","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
                return;
            }
            if (!Directory.Exists(path))
            {
                return;
            }
            btnDisassociateTFS.Enabled = false;
            var vssscc = Directory.EnumerateFiles(path, "*.vssscc", SearchOption.AllDirectories);
            var vspscc = Directory.EnumerateFiles(path, "*.vspscc", SearchOption.AllDirectories);
            DeleteFolderOrFiles(vssscc);
            DeleteFolderOrFiles(vspscc);
            var sln = Directory.EnumerateFiles(path, "*.sln", SearchOption.AllDirectories);
            RewriteFileContent(sln,(item)=> { 
               return Regex.Replace(item, @"GlobalSection\(TeamFoundationVersionControl\)[\s\S]+?EndGlobalSection", "");
            });
            var csproj = Directory.EnumerateFiles(path, "*.csproj", SearchOption.AllDirectories);
            RewriteFileContent(csproj, (item) => {
                item = Regex.Replace(item, @"<SccProjectName>.+?</SccProjectName>", "");
                item = Regex.Replace(item, @"<SccLocalPath>.+?</SccLocalPath>", "");
                item = Regex.Replace(item, @"<SccAuxPath>.+?</SccAuxPath>", "");
                item = Regex.Replace(item, @"<SccProvider>.+?</SccProvider>", "");
                return item;
            });
            var tf = Directory.EnumerateDirectories(path, "$tf", SearchOption.AllDirectories);
            DeleteFolderOrFiles(tf);
            btnDisassociateTFS.Enabled = true;
            MessageBox.Show("解除TFS绑定的源码目录成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void DeleteFolderOrFiles(IEnumerable<string> files)
        {
            if (files == null)
            {
                return;
            }
            foreach (var item in files)
            {
                if (File.Exists(item))
                {
                    File.Delete(item);
                    continue;
                }
                if (Directory.Exists(item))
                {
                    Directory.Delete(item, true);
                }
            }
        }
        private void RewriteFileContent(IEnumerable<string> files,Func<string,string> contentOperation)
        {
            foreach (var item in files)
            {
                if (!File.Exists(item))
                {
                    continue;
                }
                Encoding textEncoding = GetFileEncodeType(item);
                StreamReader reader = new StreamReader(item, textEncoding);
                string fileContent = reader.ReadToEnd();
                reader?.Close();
                reader?.Dispose();
                if (contentOperation != null)
                {
                    fileContent = contentOperation(fileContent);
                }
                StreamWriter writer = new StreamWriter(item, false, textEncoding);
                writer.Write(fileContent);
                writer.Flush();
                writer?.Close();
                writer?.Dispose();
            }
        }
        /// <summary>
        /// 获取指定文件的编码
        /// 以防止在不知道文件编码格式的情况下处理文件而造成的乱码问题
        /// </summary>
        /// <param name="filename">文件路径</param>
        /// <returns></returns>
        private System.Text.Encoding GetFileEncodeType(string filename)
        {
            if (!File.Exists(filename))
            {
                return System.Text.Encoding.Default;
            }
            System.Text.Encoding ReturnReturn = null;
            System.IO.FileStream fs = null;
            System.IO.BinaryReader br = null;
            try
            {
                fs = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read);
                br = new System.IO.BinaryReader(fs);
                byte[] buffer = br.ReadBytes(2);
                if (buffer.Length > 0 && buffer[0] >= 0xEF)
                {
                    if (buffer[0] == 0xEF && buffer[1] == 0xBB)
                    {
                        ReturnReturn = System.Text.Encoding.UTF8;
                    }
                    else if (buffer[0] == 0xFE && buffer[1] == 0xFF)
                    {
                        ReturnReturn = System.Text.Encoding.BigEndianUnicode;
                    }
                    else if (buffer[0] == 0xFF && buffer[1] == 0xFE)
                    {
                        ReturnReturn = System.Text.Encoding.Unicode;
                    }
                    else
                    {
                        ReturnReturn = System.Text.Encoding.Default;
                    }
                }
                else if (buffer.Length > 0 && buffer[0] == 0xe4 && buffer[1] == 0xbd) //无BOM的UTF-8 
                {
                    ReturnReturn = System.Text.Encoding.UTF8;
                }
                else
                {
                    ReturnReturn = System.Text.Encoding.Default;
                }
            }
            catch
            {
                ReturnReturn = System.Text.Encoding.Default;
            }
            finally
            {
                br?.Close();
                fs?.Close();
                fs?.Dispose();
            }
            return ReturnReturn;
        }
        private void btnOpenFloder_Click(object sender, EventArgs e)
        {
            if (fbdFolderSelect.ShowDialog() == DialogResult.OK)
            {
                txtSourceFolder.Text = fbdFolderSelect.SelectedPath;
            }
        }
        private void txtSourceFolder_DragDrop(object sender, DragEventArgs e)
        {
            string path = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();
            if (File.Exists(path))
            {
                FileInfo fileInfo = new FileInfo(path);
                path=fileInfo.DirectoryName;
            }
            txtSourceFolder.Text = path;
        }
        private void txtSourceFolder_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                e.Effect = DragDropEffects.All;//重要代码:表明是所有类型的数据,比如文件路径
            }
            else
            {
                e.Effect = DragDropEffects.None;
            }

        }
    }
}

示例下载

解除解决方案与TFS绑定
以上示例请使用Microsoft Visual Studio 2019 打开

转载请注明:清风博客 » 移除.net解决方案中TFS的绑定控制

]]>
https://www.skyfinder.cc/2021/03/26/removenetcodetfs/feed/ 0
博客园整改 https://www.skyfinder.cc/2021/03/21/cnblogs-rectify/ https://www.skyfinder.cc/2021/03/21/cnblogs-rectify/#respond Sun, 21 Mar 2021 04:46:26 +0000 https://www.skyfinder.cc/?p=3391 博客园是国内最出名的IT从业者的技术交流社区。

博客园是一个面向开发者的知识分享社区。自创建以来,博客园一直致力并专注于为开发者打造一个纯净的技术交流社区,推动并帮助开发者通过互联网分享知识,从而让更多开发者从中受益。博客园的使命是帮助开发者用代码改变世界。

不知为何,浏览博客园任何帖子都会跳转到整改公告,具体整改原因不详!也不晓得哪里违规了!不管怎么样,希望尽快完成整改,合规合法运营!

为了遵守相关法律法规,合法合规运营,网站进行全面整改,整改工作于2021年3月18日12:00开始,预计于3月25日11:59结束,整改期间全站无法发布任何内容,之前发布的内容重新审核后才能访问,由此给您带来很大的麻烦,请您谅解。

转载请注明:清风博客 » 博客园整改

]]>
https://www.skyfinder.cc/2021/03/21/cnblogs-rectify/feed/ 0
关于HOST文件中出现不明网址记录 https://www.skyfinder.cc/2021/03/15/microdone-cn/ https://www.skyfinder.cc/2021/03/15/microdone-cn/#respond Mon, 15 Mar 2021 04:33:11 +0000 https://www.skyfinder.cc/?p=3376 因局域网源代码管理服务器地址做了变更,所以就重新更改下HOST文件中的IP地址。意外发现HOST文件中多了一条记录,而我对这条记录竟然没有一点印象。好奇怪!!!!哪来的呢?172.17.187.161 windows10.microdone.cn,其中IP172.17.187.161又是本地局域网。然后就通过浏览器尝试访问域名windows10.microdone.cn,结果根本无法连接,最后尝试了顶级域microdone.cn,这下就出现了内容。如下图所示:

我仔细回忆一下,自己最近几天究竟做了什么,好像也没有做什么呀!于是,我就在控制面板中打开程序和功能查看一下。最近几个月的程序安装记录,由安装时间来看,也没有太多内容。如下图所示:

我结合之前打开域名microdone.cn来看,这条HOST记录必然和中国邮政储蓄银行网上银行安全控件有关。看到了此记录,也逐渐想起自己的确安装过这个控件。既然现在用不到这个网上银行,就索性把它给卸载吧。最后,把HOST文件的那条记录也删除。我很疑惑为什么会有这种行为,一些开发人员总是搞些千奇百怪的事情,也不晓得意图是什么。

转载请注明:清风博客 » 关于HOST文件中出现不明网址记录

]]>
https://www.skyfinder.cc/2021/03/15/microdone-cn/feed/ 0
深圳龙华清湖春季车展 https://www.skyfinder.cc/2021/03/13/shenzhenlonghuaicocarshow/ https://www.skyfinder.cc/2021/03/13/shenzhenlonghuaicocarshow/#respond Sat, 13 Mar 2021 15:37:58 +0000 https://www.skyfinder.cc/?p=3366 突然,有一种念想,想买一辆代步车。所以,关注了一些车展的相关消息。春季车展还是不少的,其3月4日至7日宝安体育馆,13日至14日深圳市龙华星河iCO广场都有相关车展的活动。这前后两次的车展活动规模都相对较小,品牌以及车型都不是很多。今天让人意想不到的的是,这小小的车展活动竟然会请车模。没有错,有车模,不过仅仅只有两个车模。车展活动的车我都已经看一遍了,各个品牌车的价格都不算贵,但是我还是没有订购。我觉得还是要多了解下,要不然总感觉太草率了!车没拍,车模拍了几张。

转载请注明:清风博客 » 深圳龙华清湖春季车展

]]>
https://www.skyfinder.cc/2021/03/13/shenzhenlonghuaicocarshow/feed/ 0
可以在线浏览PDF的一个WEB标准插件PDF.js https://www.skyfinder.cc/2021/03/01/pdfwebpdf-js/ https://www.skyfinder.cc/2021/03/01/pdfwebpdf-js/#respond Mon, 01 Mar 2021 07:08:00 +0000 https://www.skyfinder.cc/?p=3359 背景

因有一个需求,需要在线浏览PDF文件。所以,需要找一个满足需求的解决方案。经过一些列资料搜寻,最终确定使用PDF.js插件。目前来说此插件完美满足需求。

PDF.js

一个通用的、基于web标准的、用于解析和呈现pdf的平台。

PDF.js项目在线预览效果

转载请注明:清风博客 » 可以在线浏览PDF的一个WEB标准插件PDF.js

]]>
https://www.skyfinder.cc/2021/03/01/pdfwebpdf-js/feed/ 0
急性上呼吸道感染 https://www.skyfinder.cc/2021/01/14/influenza/ https://www.skyfinder.cc/2021/01/14/influenza/#respond Thu, 14 Jan 2021 04:42:51 +0000 https://www.skyfinder.cc/?p=3341

最近天气突然骤降,一不小心就生病了,鼻塞、流鼻涕实在难受,随即而来的就是鼻炎复发以及中耳炎。每一次都是这个流程,每一次感冒没有千把块就摆不平,总有一天死在这个上面,也说不准。哎!

急性上呼吸道感染

急性上呼吸道感染,俗称“感冒”主要是指鼻咽和咽部的急性感染。本病是常见的疾病,常诊断为“急性鼻咽炎”、“急性咽炎”、“急性扁桃体炎”等。该病一年四季均可发生,以冬、春季节及气候骤变时多见。

  • 患病期间好好休息、充足睡眠、忌劳累、忌锻炼身体,以保持体力,有利于康复。
  • 多喝水,吃清淡、富含维生素、易消化的食物,如:米汤,豆浆、粥、面条、鸡蛋羹等半流质食物及新鲜蔬菜、水果,忌食油腻、煎炸的食物。
  • 房间经常通风换气,保持适宜的温度,在家里尽量做到床边隔离,避免再传染给他人。
  • 预防胜于治疗:避免受凉、淋雨、过度疲劳;避免与感冒患者接触,避免脏手接触口、眼、鼻。年老体弱易感者更应注意防护,上呼吸道感染流行时应戴口罩,避免在人多的公共场合出入。平时加强体质锻炼、增强抗病能力。必要时注射疫苗。

在医生的指导下用药,切记乱用药,由于上呼吸道感染大多数由病毒引起,一般不必应用抗生素,更不必输液。

转载请注明:清风博客 » 急性上呼吸道感染

]]>
https://www.skyfinder.cc/2021/01/14/influenza/feed/ 0
Visual Studio(VS) Code提示php.executablePath配置问题 https://www.skyfinder.cc/2021/01/07/vs-code-php-executablepath-setting/ https://www.skyfinder.cc/2021/01/07/vs-code-php-executablepath-setting/#respond Thu, 07 Jan 2021 03:22:29 +0000 https://www.skyfinder.cc/?p=3334 Visual Studio Code 安装php插件后提示:

PHP executable not found. Install PHP 7 and add it to your PATH or set the php.executablePath setting

打开VS Code设置查找到php.validate.executablePath进行修改,其值是php安装目录。


{
    "editor.suggestSelection": "first",
    "vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
    "java.semanticHighlighting.enabled": true,
    "php.validate.executablePath": "F:\\phpstudy_pro\\Extensions\\php\\php7.3.4nts"
}

转载请注明:清风博客 » Visual Studio(VS) Code提示php.executablePath配置问题

]]>
https://www.skyfinder.cc/2021/01/07/vs-code-php-executablepath-setting/feed/ 0
ASP.NET Core Web Api实现大文件切/分片上传 https://www.skyfinder.cc/2020/12/31/asp-net-core-big-file-uploader/ https://www.skyfinder.cc/2020/12/31/asp-net-core-big-file-uploader/#respond Thu, 31 Dec 2020 08:15:58 +0000 https://www.skyfinder.cc/?p=3313 一年前的一个项目,有人反馈上传超时,超时原因是文件大小超出限制。由于原来维护项目的人员离开,现在上传超时的问题就有我来处理。解决方案也比较简单,就是切片上传。前端不想自己写了,就利用了上传组件,这个上传组件是百度WebUploaderWebUploader这个组件被使用的也比较广泛,为了省事就用它啦!

上传中

合并后

代码实现

前端代码

前端上传以及分片使用的百度上传组件WebUploader


<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Home Page - WebUpload</title>

    
        <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.css" />
    
    
    <link rel="stylesheet" href="/css/site.css" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" href="/">WebUpload</a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" href="/">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" href="/Home/Privacy">Privacy</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        


        <main role="main" class="pb-3">
            <link rel="stylesheet" type="text/css" href="/webuploader/webuploader.css">
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
    <script src="/webuploader/webuploader.js"></script>
    <div class="text-center">
        <h1 class="display-4">Welcome</h1>
        <div id="uploader" class="wu-example">
            <div class="container-fluid">
                <div class="col-md-10">
                    <div class="row">文件上传示例:</div>
                    <div class="row">
                        <div id="uploader" class="wu-example">
                            <!--用来存放文件信息-->
                            <div id="fileList" class="uploader-list"></div>
                            <div class="btns">
                                <div id="picker" class="btn btn-primary">选择文件</div>

                            </div>

                        </div>
                    </div>

                    <div class="row">

                    </div>
                    <div class="row">  <button id="ctlBtn" class="btn btn-default">开始上传</button></div>
                </div>
                <div>
                </div>
            </div>
        </div>
        <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
    </div>
<script>
    jQuery(function () {
        var $ = jQuery,
            $list = $('#fileList'),
            $btn = $('#ctlBtn'),
            state = 'pending',
            uploader, guid = {};
        uploader = WebUploader.create({
            // 不压缩image
            resize: false,

            // swf文件路径
            swf: "~/webuploader/Uploader.swf",

            server: 'http://localhost:8011/api/File/UplaodFile?isConvert=true',

            // 选择文件的按钮。可选。
            // 内部根据当前运行是创建,可能是input元素,也可能是flash.
            pick: '#picker',
            chunked: true

        });
        
        // 当有文件添加进来的时候
        uploader.on('fileQueued', function (file) {
            guid[file.id] = +(new Date());
            $list.append('<div id="' + file.id + '" class="item">' +
                '<h4 class="info">' + file.name + '</h4>' +
                '<p class="state">等待上传...</p>' +
                '</div>');
            uploader
                .md5File(file)
                .progress(function (percentage) {
                    // console.log("Percentage:", percentage);
                    $("#ctlBtn").hide();
                })
                // MD5计算完毕,可以点击上传了
                .then(function (fileMd5) {
                    file.fileMd5 = fileMd5;
                    $("#ctlBtn").show()
                    console.log(fileMd5);
                });

        });
        uploader.on('uploadBeforeSend', function (file, data, headers) {
            $.extend(data, { "fileId": guid[data.id], "fileMd5": file.file.fileMd5 });
            $.extend(headers, {
                "Authorization":"Bearer "
            });
            if (data.chunks) {
                data["chunkStart"] = file.start;
                data["chunkEnd"] = file.end;
            }
        });
        // 文件上传过程中创建进度条实时显示。
        uploader.on('uploadProgress', function (file, percentage) {

            var $li = $('#' + file.id),
                $percent = $li.find('.progress .progress-bar');
            // 避免重复创建
            if (!$percent.length) {
                $percent = $('<div class="progress progress-striped active">' +
                    '<div class="progress-bar" role="progressbar" style="width: 0%">' +
                    '</div>' +
                    '</div>').appendTo($li).find('.progress-bar');
            }
            $li.find('p.state').text('上传中');
            $percent.css('width', percentage * 100 + '%');

        });

        uploader.on('uploadSuccess', function (file) {
            $('#' + file.id).find('p.state').text('已上传');
        });

        uploader.on('uploadError', function (file) {
            $('#' + file.id).find('p.state').text('上传出错');
        });

        uploader.on('uploadComplete', function (file) {
            $('#' + file.id).find('.progress').fadeOut();
        });
        uploader.on('all', function (type) {
            if (type === 'startUpload') {
                state = 'uploading';
            } else if (type === 'stopUpload') {
                state = 'paused';
            } else if (type === 'uploadFinished') {
                state = 'done';
            }
            if (state === 'uploading') {
                $btn.text('暂停上传');
            } else {
                $btn.text('开始上传');
            }

        });

        $btn.on('click', function () {
            if (state === 'uploading') {
                uploader.stop();
            } else {
                uploader.upload();
            }
        });
    });
</script>

        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2020 - WebUpload - <a href="/Home/Privacy">Privacy</a>
        </div>
    </footer>

    
        <script src="/lib/jquery/dist/jquery.js"></script>
        <script src="/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    
    
    <script src="/js/site.js?v=4q1jwFhaPaZgr8WAUSrux6hAuh0XDg9kPS3xIVq36I0"></script>

    
</body>
</html>

后台实现

后台使用的是ASP .NET Core Web API,实现方式也很简单。文件的校验,分块的校验等这里就省略了。
    
    [Route("api/[controller]")]
    public class FileController : Controller
    {
        public static readonly object locker = new object();
        [HttpPost]
        [Route("UplaodFile")]
        public IActionResult UplaodFile([FromForm] IFormCollection form)
        {
            try
            {
                string fileId = form["fileId"];
                if (string.IsNullOrWhiteSpace(fileId)||form.Files==null||form.Files.Count==0)
                {
                    return BadRequest();
                }
                string tempFileFolder = Path.Combine(AppContext.BaseDirectory, $"FileUploader/{fileId}");
                CreateFolder(tempFileFolder);
                if (form.ContainsKey("chunks"))
                {
                    string chunksString = form["chunks"];
                    int chunks = int.Parse(chunksString);
                    string chunkString = form["chunk"];
                    int chunk = int.Parse(chunkString);
                    string sizeString = form["size"];
                    long size = long.Parse(sizeString);
                    string chunkStartString = form["chunkStart"];
                    string chunkEndString = form["chunkEnd"];
                    string chunkMd5 = form["chunkMd5"];
                    string fileMd5 = form["fileMd5"];
                    string lastModifiedDate = form["lastModifiedDate"];
                    var file = form.Files.FirstOrDefault();
                    string name = file.FileName;
                    string ext = Path.GetExtension(name);
                    Stream stream = file.OpenReadStream();
                    byte[] bytes = new byte[stream.Length];
                    stream.Read(bytes, 0, bytes.Length);
                    string factFilePath = Path.Combine(tempFileFolder, $"{name}");
                    string chunkFilePath = $"{factFilePath}.chunk{chunk}";
                    string chunkFileTempPath = $"{chunkFilePath}.temp";
                    System.IO.File.Delete(chunkFileTempPath);
                    FileStream fs = new FileStream(chunkFileTempPath, FileMode.Create);
                    BinaryWriter bw = new BinaryWriter(fs);
                    bw.Write(bytes);
                    bw.Flush();
                    bw.Close();
                    bw.Dispose();
                    fs.Close();
                    fs.Dispose();
                    stream.Close();
                    stream.Dispose();
                    System.IO.File.Move(chunkFileTempPath, chunkFilePath);
                    bool isMerge = true;
                    for (int i = 0; i < chunks; i++)
                    {
                        if (!System.IO.File.Exists($"{factFilePath}.chunk{i}"))
                        {
                            isMerge = false;
                            break;
                        }
                    }

                    if (isMerge)
                    {
                        lock (locker)
                        {
                            if (isMerge)
                            {
                                if (System.IO.File.Exists(factFilePath))
                                {
                                    return Ok();
                                }
                                var fileStream = new FileStream(factFilePath, FileMode.Create);
                                for (int i = 0; i < chunks; i++)
                                {
                                    string chunkFile = $"{factFilePath}.chunk{i}";
                                    var chunkBytes = System.IO.File.ReadAllBytes(chunkFile);
                                    fileStream.Write(chunkBytes, 0, chunkBytes.Length);
                                    fileStream.Flush();
                                    System.IO.File.Delete(chunkFile);//删除分块
                                }
                                fileStream.Close();
                                fileStream.Dispose();
                            }
                        }

                    }
                }
                else
                {
                    var file = form.Files.FirstOrDefault();
                    Stream stream = file.OpenReadStream();
                    byte[] bytes = new byte[stream.Length];
                    stream.Read(bytes, 0, bytes.Length);
                    FileStream fileStream = new FileStream(Path.Combine(tempFileFolder, $"{file.FileName}"), FileMode.Create);
                    BinaryWriter bw = new BinaryWriter(fileStream);
                    bw.Write(bytes);
                    bw.Flush();
                    bw.Close();
                    bw.Dispose();
                    fileStream.Close();
                    fileStream.Dispose();
                    stream.Close();
                    stream.Dispose();
                }
            }
            catch (Exception ex)
            {
                Console.Write(ex);
            }

            return Ok();
        }
        private void CreateFolder(string folderPath)
        {
            if (!Directory.Exists(folderPath))
            {
                Directory.CreateDirectory(folderPath);
            }
        }
        [HttpGet]
        [Route("Index")]
        public IActionResult Index()
        {
            return Ok();
        }
    }

示例下载

.NET CORE大文件分/切片上传示例

转载请注明:清风博客 » ASP.NET Core Web Api实现大文件切/分片上传

]]>
https://www.skyfinder.cc/2020/12/31/asp-net-core-big-file-uploader/feed/ 0
.NET操作达梦数据库编译错误处理 https://www.skyfinder.cc/2020/12/07/dmprovidererrorprocess/ https://www.skyfinder.cc/2020/12/07/dmprovidererrorprocess/#respond Mon, 07 Dec 2020 02:03:58 +0000 https://www.skyfinder.cc/?p=3279 由于客户突然要进行国产化的一个要求,数据库使用更换了国产达梦数据库,将数据由Oracle数据库迁移到达梦数据库。所以,之前基于Oracle处理的一些功能就需要进行一些调整。

使用NuGet 引入达梦数据提供器DmProvider 

引用相关的组件后,就按照套路对已经存在的方法进行相关调整,结果出现了一些编译出错且无论如何调整都无法消除。如下:

错误 CS1705 标识为“Dm, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”的程序集“Dm”所使用的“System.Runtime, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”版本高于所引用的标识为“System.Runtime, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”的程序集“System.Runtime”

通过各种搜索引擎查找一通,最后也没有见到任何处理问题的方法。总觉得国产的某些东西,距大面积商用还有很远的距离。实在没有办法了,就到达梦官方把达梦数据库Windows开发版本下载下来,并加入达梦数据库官方QQ支持群,咨询关于.net framework 4.0的数据库驱动哪里有提供。

根据QQ群的信息回复,在安装目录找到了相关的组件并引用进行尝试,最终错误消失。

至于为什么Nuget上的会出现异常,也没有深入研究。感觉这没有意义!!

转载请注明:清风博客 » .NET操作达梦数据库编译错误处理

]]>
https://www.skyfinder.cc/2020/12/07/dmprovidererrorprocess/feed/ 0
Linux无法访问外网问题 https://www.skyfinder.cc/2020/11/16/linux-net-work/ https://www.skyfinder.cc/2020/11/16/linux-net-work/#respond Mon, 16 Nov 2020 13:30:23 +0000 https://www.skyfinder.cc/?p=3239 一台Linux局域网服务器,突然发现不能访问外网,也许本来就不行,因为没有用到外网,所以只是没有注意到吧!经过测试外网无法访问,内网畅行无阻。如下:

[root@offline-200 services]# wget baidu.com
–2020-11-03 17:56:58– http://baidu.com/
正在解析主机 baidu.com (baidu.com)… 失败:未知的名称或服务。
wget: 无法解析主机地址 “baidu.com”

[root@offline-200 services]# ping 192.168.2.3
PING 192.168.2.3 (192.168.2.3) 56(84) bytes of data.
64 bytes from 192.168.2.3: icmp_seq=1 ttl=128 time=0.305 ms
64 bytes from 192.168.2.3: icmp_seq=2 ttl=128 time=0.245 ms
64 bytes from 192.168.2.3: icmp_seq=3 ttl=128 time=0.211 ms
64 bytes from 192.168.2.3: icmp_seq=4 ttl=128 time=0.255 ms
64 bytes from 192.168.2.3: icmp_seq=5 ttl=128 time=0.353 ms
— 192.168.2.3 ping statistics —
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.211/0.273/0.353/0.053 ms
[root@offline-200 services]# ping 192.168.2.1
PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.
64 bytes from 192.168.2.1: icmp_seq=1 ttl=255 time=1.39 ms
64 bytes from 192.168.2.1: icmp_seq=2 ttl=255 time=1.47 ms
64 bytes from 192.168.2.1: icmp_seq=3 ttl=255 time=1.43 ms
— 192.168.2.1 ping statistics —
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 1.393/1.433/1.470/0.031 ms

首先,检查DNS服务器是否设置且是否设置正确。


cat  resolv.conf

如下所示,DNS只是一个局域网的服务器。具体之前为什么这么设置,现在也搞不清楚。

[root@offline-200 services]# cat /etc/resolv.conf
Generated by NetworkManager
search host.com
nameserver 192.168.2.200

不管之前是什么原因,现在使用vi进行编辑新加两个DNS服务器。

cat /etc/resolv.conf

#阿里DNS服务器

nameserver 223.5.5.5

nameserver 223.6.6.6

[root@offline-200 services]# vi /etc/resolv.conf
[root@offline-200 services]# cat /etc/resolv.conf
Generated by NetworkManager
search host.com
nameserver 192.168.2.200
nameserver 223.5.5.5
nameserver 223.6.6.6

新加DNS服务器之后保存,测试访问外网通过。

curl  www.baidu.com

转载请注明:清风博客 » Linux无法访问外网问题

]]>
https://www.skyfinder.cc/2020/11/16/linux-net-work/feed/ 0
.NET混淆加壳代码保护工具.NET Reactor最新版 https://www.skyfinder.cc/2020/11/10/netreactor/ https://www.skyfinder.cc/2020/11/10/netreactor/#respond Tue, 10 Nov 2020 14:52:29 +0000 https://www.skyfinder.cc/?p=3255

.NET Reactor是一款功能强大的代码保护以及许可授权管理系统软件,主要用于开发人员保护其.NET软件程序,.NET Reactor支持所有支持.NET编译的程序开发语言。.

.net Reactor功能介绍

.net Reactor设置说明

下载

.NET.Reactor 6.3 提取码:k5wr
压缩文件设置了解压密码:www.skyfinder.cc

转载请注明:清风博客 » .NET混淆加壳代码保护工具.NET Reactor最新版

]]>
https://www.skyfinder.cc/2020/11/10/netreactor/feed/ 0
.NET 使用MySql 8.0报caching_sha2_password错误的问题处理 https://www.skyfinder.cc/2020/10/05/net-mysql-caching_sha2_password-error/ https://www.skyfinder.cc/2020/10/05/net-mysql-caching_sha2_password-error/#respond Mon, 05 Oct 2020 13:41:04 +0000 https://www.skyfinder.cc/?p=3224 背景

接手别人项目进行维护,使用Mysql 8.0 数据库正确还原,但是项目却无法启动,经过调试发现以下问题。

MySqlException Authentication method ‘caching_sha2_password’ not supported by any of the available plugins。

通常的报这个错误是因为它的身份验证方式是 mysql_native_password ,不是caching_sha2_password导致。

Mysql 官方相关资料:https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html

解决方法

首先找到MySql 8.0 的安装目录,看一下是否存在my.ini配置文件,默认安装路径如下:

C:\Program Files\MySQL\MySQL Server 8.0

现在并没有发现my.ini配置文件,经过了解Mysql 8.0 安装后会将配置相关内容保存在以下目录中:

C:\ProgramData\MySQL\MySQL Server 8.0

打开my.ini配置文件并找到caching_sha2_password所在的行。

default_authentication_plugin=caching_sha2_password替换为default_authentication_plugin=mysql_native_password

操作完成后保存,然后重启mysql 8.0服务即可。

转载请注明:清风博客 » .NET 使用MySql 8.0报caching_sha2_password错误的问题处理

]]>
https://www.skyfinder.cc/2020/10/05/net-mysql-caching_sha2_password-error/feed/ 0