佳能G2810一体机P07手动清零

客户一台佳能G2810一体机无法打印,过去查看显示为P08错误,网上查资料说是需要清零,按照查到的方法操作后重新开机正常,但只要一打印或者是清洗喷头就会提示P08,电脑上显示为5200的错误。

后在网上仔细查阅资料得知,P08是因为墨盒中没有墨水,在打印操作时墨盒的温度过高导致。

再后来又出现了P07的错误,这个错误才是废墨计数器需要清零的,根据网上的资料清零成功,方法如下:

1.关机状态下。。放两张纸  ,先按住开机按钮 不放,   然后再按停止键5次,绿灯常亮进入维修模式,
2.再按5下停止/重置键,按1下电源键,然后等着就行,完毕后会打印出D=000.0,表示清零成功,你关闭打印机时还会运作,再开启就OK。

我在第2步等了很久也没有打印出东西来,就把打印机关机后再开机,然后P07错误不再出现。然后再清洗喷头还是出现P08错误,因为手头上没有注射器,没有办法添加墨水,突然想到打印机的工具里好像有个充墨的功能,使用该功能完美解决充墨问题,至此错误修复,特此记录。

【终极版】如何使用阿里云云解析API实现动态域名解析,搭建私有服务器【含可执行文件和源码】

前言:懒人可以直接往下看,有代码和全部资源可以下载。此文章是先前文章的定时版,主要是添加了定时执行的功能,并且将代码中的配置项放置到了app.config文件中,方便不懂开发的朋友修改使用。未经许可请勿转载,如有疑问,请联系作者:yxxrui@163.com

我遇到的问题:公司的网络没有固定的公网IP地址,但是需要能够保证的是,每次动态分配的IP地址均为独立的公网IP,只是每次分配后会在1-2天后更换,或者重启路由器后更换,为了能够把这个公网IP利用起来,大家常用的是使用花生壳之类的软件来操作,我使用过花生壳的多款产品,挺好的,就是有一下几个缺点:

1、需要使用花生壳上购买的域名才行,或者使用免费的壳域名,其丑无比

2、不稳定,也很慢

3、限制流量,超流量需要收费

4、限制端口,特定端口需要收费

5、需要在电脑上运行一个花生壳的软件

解决方案:但是为了解决问题,我开始摸索自己搞定它,公司域名从阿里云上购买,阿里云提供云解析技术免费版,提供通过api来管理域名的功能,当我看到该文档的时候直接就看到了希望,解决起来绝对没问题了。首先需要确认一下,有两种情况:

1、公司服务器直接接入网线,这个时候服务器的IP就是公网IP

2、公司服务器链接公司路由器,路由器链接网线,这个时候路由器上是公网IP,而服务器上是局域网IP

第一种情况最简单了,不需要设置什么了,第二种情况需要到路由器设置界面设置端口转发或者直接将全部端口映射到内网的服务器IP上,这样的话,访问公网IP的某个端口时相当于访问内网IP的映射端口,比如路由器IP为125.120.83.30,内网IP为192.168.168.168。可以将路由器中80端口映射到192.168.168.168的80端口上。

到阿里云控制台申请accessKeyIdaccessKeySecret,用来调用API的,为了简单起见,先给域名添加一条解析记录,这样就不需要在程序里判断该域名是否已创建,然后可以直接修改解析记录了。比如我的域名为yxxrui.cn,记录值为blog,也就是要把子域名blog.yxxrui.cn指向我自己电脑125.120.83.30上。

下边直接贴出代码:

创建window service用于定时执行解析任务,在Service的OnStart方法中添加:

MainProgram.MyTimerTask();
using System;
using System.Configuration;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using Aliyun.Acs.Alidns.Model.V20150109;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;

namespace AliyunDynamicDomain
{
    /// <summary>
    /// 修改时间:2018-11-18
    /// 为了方便,特意改写为window service,按时刷新任务
    /// 不再需要手动设置window自带的定时任务
    /// 作者:杨浩瑞  yxxrui@163.com
    /// </summary>
    class MainProgram
    {
        #region 获取基本参数和类属性
        private static readonly string RegionId = GetConfig("regionId");
        private static readonly string AccessKeyId = GetConfig("accessKeyId");
        private static readonly string AccessKeySecret = GetConfig("accessKeySecret");
        private static string _recordId = GetConfig("recordId");
        private static readonly string Domain = GetConfig("domain");
        private static readonly string Rr = GetConfig("rr");
        private static readonly string IpServer = GetConfig("IpServer");
        private static int _ttl = 600;
        private static int _waitTime = 60;
        private static readonly IClientProfile ClientProfile = DefaultProfile.GetProfile(RegionId, AccessKeyId,
            AccessKeySecret);
        private static readonly IAcsClient Client = new DefaultAcsClient(ClientProfile);

        private static readonly object TimerLocker = new object();
        private static Timer _myTimer;
        #endregion
        
        #region 定时任务
        public static void MyTimerTask()
        {
            if (!int.TryParse(GetConfig("TTL"), out _ttl))
            {
                _ttl = 600;
            }
            if (!int.TryParse(GetConfig("WaitTime"), out _waitTime))
            {
                _waitTime = 60;
            }
            if (_myTimer != null)
            {
                return;
            }
            lock (TimerLocker)
            {
                if (_myTimer == null)
                {
                    //第一次开始的时间,1秒后开始执行
                    var startTime = DateTime.Now.AddSeconds(1);
                    var delayTime = (startTime - DateTime.Now);
                    var intervalTime = new TimeSpan(0, 0, 0, _waitTime); //10秒执行一次
                    TimerCallback timerDelegate = DealFun;
                    _myTimer = new Timer(timerDelegate, null, delayTime, intervalTime);
                }
            }
        }
        #endregion

        #region 执行程序,解析域名

        public static void DealFun(object obj)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(_recordId))
                {
                    //如果没有获取过,那么获取一下,然后保存起来
                    _recordId = GetRecordId(Domain, Rr);
                    SaveConfig("recordId", _recordId);
                }
                if (string.IsNullOrWhiteSpace(_recordId))
                {
                    LogHelper.Error("recordId获取失败");
                    return;
                }
                //获取成功,并且有变化时
                string lastIp = GetConfig("lastIP");
                string curIp = GetIp();
                if (!curIp.Equals("") && !lastIp.Equals(curIp))
                {
                    var request = new UpdateDomainRecordRequest
                    {
                        RecordId = _recordId,
                        RR = Rr,
                        Type = "A",
                        Value = curIp,
                        TTL = _ttl,
                        Priority = 10
                    };
                    Client.DoAction(request);
                    SaveConfig("lastIP", curIp);
                    LogHelper.Info("刷新成功");
                    return;
                }
                LogHelper.Info("与上次IP一致,无需刷新:" + curIp);
            }
            catch (Exception e)
            {
                LogHelper.Error(e.ToString());
            }
        }

        #endregion

        #region 保存配置信息
        /// <summary>
        /// 保存配置信息
        /// </summary>
        /// <param name="name"></param>
        /// <param name="value"></param>
        private static void SaveConfig(string name,string value)
        {
            var cfa = ReadAppConfig();
            cfa.AppSettings.Settings[name].Value = value;
            cfa.Save();
        }
        #endregion

        #region 获取配置项
        /// <summary>
        /// 获取配置项
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        private static string GetConfig(string name)
        {
            try
            {
                var cfa = ReadAppConfig();
                return cfa.AppSettings.Settings[name].Value;
            }
            catch
            {
                return "";
            }
        }
        #endregion

        #region 调用阿里云接口获取域名的唯一记录ID
        /// <summary>
        /// 调用阿里云接口获取域名的唯一记录ID
        /// </summary>
        /// <param name="domain">域名</param>
        /// <param name="rr">子域名</param>
        /// <returns></returns>
        private static string GetRecordId(string domain,string rr)
        {
            DescribeDomainRecordsRequest reqq = new DescribeDomainRecordsRequest
            {
                DomainName = domain,
                RRKeyWord = rr
            };
            var rss = Client.GetAcsResponse(reqq);
            foreach (var record in rss.DomainRecords)
            {
                if (record.DomainName.Equals(domain) && record.RR.Equals(rr))
                {
                    return record.RecordId;
                }
            }
            return "";
        }
        #endregion
        
        #region 获取公网IP
        /// <summary>
        /// 获取当前电脑的真实外网IP地址,可以自行修改成稳定的
        /// </summary>
        /// <returns></returns>
        private static string GetIp()
        {
            var myWebClient = new WebClient { Credentials = CredentialCache.DefaultCredentials };
            //获取或设置用于向Internet资源的请求进行身份验证的网络凭据
            var pageData = myWebClient.DownloadData(IpServer);//从指定网站下载数据
            var all = Encoding.Default.GetString(pageData); //如果获取网站页面采用的是GB2312,则使用这句
            var regex = @"((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))";
            var m = Regex.Match(all, regex);
            if (m.Success)
            {
                return m.Value;
            }
            return "";
        }
        #endregion

        #region 获取配置文件
        private static Configuration _config;
        private static Configuration ReadAppConfig()
        {
            if (_config == null)
            {
                string configPath = AppDomain.CurrentDomain.BaseDirectory+@"/app.config";
                _config = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap()
                {
                    ExeConfigFilename = configPath
                }, ConfigurationUserLevel.None);
            }
            //MessageBox.Show(config.AppSettings.Settings["serverIp"].Value);
            return _config;
        }
        #endregion
    }
}
app.config文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
  </startup>
  <appSettings>
  <!--作者:杨浩瑞,yxxrui@163.com,博客:http://www.yxxrui.cn -->
    <!--  ##############################################  -->
    <!--regionId 区域-->
    <!--accessKeyId 阿里云accessKeyId-->
    <!--accessKeySecret 阿里云accessKeySecret-->
    <!--recordId 记录ID,需注意,如果您修改了其他配置,不确定recordId是什么,那么一定要置为空值,系统会自动获取的-->
    <!--domain 您的域名,比如:yxxrui.cn-->
    <!--rr 您的子域名,比如:blog-->
    <!--TTL 域名的TTL值(生存时间),默认600,请按照阿里云说明填写,若不懂,请不要修改-->
    <!--lastIP 您的服务器上次的IP地址,用来缓存,您无需修改-->
    <!--IpServer 获取IP的服务器地址,如果自己搭建了获取公网IP的服务器,可以换成自己的地址-->
    <!--WaitTime 重复执行解析域名的间隔时间,以秒为单位,默认60秒-->
    <add key="regionId" value="cn-hangzhou"/>
    <add key="accessKeyId" value="123456789"/>
    <add key="accessKeySecret" value="98765432123456789"/>
    <add key="recordId" value=""/>
    <add key="domain" value="yxxrui.cn"/>
    <add key="rr" value="in"/>
    <add key="TTL" value="600"/>
    <add key="lastIP" value=""/>
    <add key="IpServer" value="这个获取公网的地址失效了,请自己解决,只需要架设一个页面能获取客户端公网IP即可,页面编码要是GB2312"/>
    <add key="WaitTime" value="60"/>
  </appSettings>
</configuration>

之前的版本中,没有做定时任务,只做了以下的工作,但是近期发现使用者还是蛮多的,所以本次终极版专门做了定时任务功能。

1、安装window service,然后会自定启动定时任务

2、获取当前电脑真实公网IP

3、查看当前IP是否有变化

4、若无变化直接退出,若有变化则修改域名解析设置

5、等待WaitTime秒后,跳回步骤 2 继续执行。

之前的版本中,没有做定时任务,只做了以下的工作,但是近期发现使用者还是蛮多的,所以本次终极版专门做了定时任务功能。

1、安装window service,然后会自定启动定时任务

2、获取当前电脑真实公网IP

3、查看当前IP是否有变化

4、若无变化直接退出,若有变化则修改域名解析设置

5、等待WaitTime秒后,跳回步骤 2 继续执行。

此处讲一下如何安装window service,我在安装包装放了一个install.bat,尽量右键  以管理员身份运行,同时主要别被安全软件拦截了。

附件下载

本文转自: http://www.yxxrui.cn/article/232.shtml

ADO中使用事务处理功能

定义和用法

这三个方法与 Connection 对象使用,来保存或取消对数据源所做的更改。

注释:并非所有提供者都支持事务。

注释:BeginTrans、CommitTrans 和 RollbackTrans 方法在客户端 Connection 对象上无效。

BeginTrans

BeginTrans 方法可开始一个新事务。

CommitTrans

CommitTrans 方法可保存自最后一个 BeginTrans 方法调用以来的所有更改,并结束当前事务。它也可能启动新事务。

RollbackTrans

RollbackTrans 方法可取消自最后一次 BeginTrans 方法调用以来的所有更改,并结束该事务。它也可能启动新事务。

说明

对于支持嵌套事务的提供者,在打开的事务中调用 BeginTrans 方法将启动新的嵌套事务。返回值将指示嵌套层次:返回值为“1”指示打开了顶层事务(即此事务未嵌套在其他事务中),返回值为“2”指示打开了第二层事务(嵌套在顶层事务中的事务),依此类推。调用 CommitTrans 或 RollbackTrans 只影响最新打开的事务;在处理任何更高层事务之前必须关闭或回卷当前事务。

语法
level=objconn.BeginTrans()

objconn.BeginTrans

objconn.CommitTrans

objconn.RollbackTrans

微软2019年1月2日Excel2010更新补丁(4461627)导致Excel打开失败

前天接到客户电话,说是Excel文件无法打开,后来经过仔细检查发现其他Office组件都可以正常打开,唯独Excel无法打开,双击文件打开后就提示文件需要修复,然后无法修复并自动关闭,Office版本为2010专业版。当时因时间急,没有其他办法,所以只能卸载后安装WPS2019来使用,当时以为只是个案,但昨天又接到另一个客户电话,说的同样的问题,去检查后又是同样的结果,但已经意识到可能是其他问题导致的,但当时也没有时间来检查。今天又接到客户电话说了同样的问题,觉得可能是Excel的更新导致的,仔细检查了系统更新补丁,针对Excel2010 的补丁在2019年1月2日只有一个,补丁编号:4461627,卸载后Excel可以正常打开,以此记录,送给需要的朋友。