分类归档 技术杂谈

通过seo圣人

位运算与位移怎样理解?

在python中,位运算分为按位与运算(&)、按位或运算(|)、按位异或运算(^)、按位取反运算(~)、按位左移运算(<<)和按位右移运算(>>),当然了在别的编程语言里面也有涉及这个知识点,譬如C语言、PHP语言、JAVA语言等等,原理都是想通的,俗话说的好“温故而知新”,我在这里把这个知识点再强调一遍。

学过计算机的人对二进制并不陌生,这个位运算其实就是基于二进制的,那么我们在python代码中什么两个变量,方便我们通过实验来讲解位运算:
a = 623 #变量a的二进制为:0010 0110 1111
b = 139 #变量b的二进制为:0000 1000 1011

1、按位与运算(&)
我们先把a和b进行按位于运算,也就是
print a&b #打印的结果是11
为什么结果是11呢?其实在按位与运算中,参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0,那么a和b进行按位与运算之后的二进制就是“0000 0000 1011”,将这个二进制的数字转换成十进制结果就是11。请看下面的按位与运算图解:

2、按位或运算(|)
print a|b # 打印结果是751
在按位或运算中,只要对应的二个二进位有一个为1时,结果位就为1。那么a和b进行按位或运算的的二进制结果就为0010 1110 1111,转换为二进制的结果就是751。请看下面的按位或运算图解:

3、按位异或运算(^)
print a^b # 运算结果为740
在按位异或运算中,当两对应的二进位相异时,结果为1,相同则为0,那么a和b进行按位异或运算的二进制结果就为0010 1110 0100,转换为二进制的结果就为740。请看下面的按位异或运算图解:

4、按位取反运算(~)
print ~a # 运算结果为-624
print ~b # 运算结果为-140
在按位取反运算中,对数据的每个二进制位取反,即把1变为0,把0变为1 。~a的二进制按位取反运算后的二进制结果为1111 1101 1001 0000转换为10进制的结果是-624,~b的二进制按位取反运算后的二进制结果为1111 0111 0100,转换为十进制的结果为-140,这里涉及到反码、补码知识,忘记了的同学请自行恶补!请看下面的按位取反运算图解:

5、按位左移运算(<<)
print a<<b #运算结果为434167633083893069286773515120622788069556224
在左移动运算中,运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。因为数字太大了,我就懒得写了。

6、按位右移运算(>>)
print a>>b #运算结果为0
在右移动运算中,把”>>”左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数,这个数字推算起来也不得了,我也就不多写了,你知道是怎么回事就行了。

 a<<b其实就是把a转换成二进制,向左移动139位,然后在转换成十进制。
 a>>b其实就是把a转换成二进制,向右移动139位,然后在转换成十进制。

因为例子中的数字太大,我现在把数字变小一点,方便大家理解
a=11 #二进制为1011
b=3  #二进制为11
那么a<<b的运算结果如下:
0000 0000 1011
向左边移动3个位置,结果就为:
0000 0101 1000
转换成十进制就等于88

a>>b的运算结果如下:
那么a>>b的运算结果如下:
0000 0000 1011
向右边边移动3个位置,结果就为:
0000 0000 0001

转换成十进制就等于1

针对python的位运算今天就讲这么多,如果你还有不明白的,欢迎在下方留言,咱们一起学习,共同研究!

通过seo圣人

百度刷下拉词的作用是什么?

百度刷下拉词的作用是什么?

在我们使用百度日常搜索的过程中,你会发现输入若干字符的时候,搜索框会出现下拉词,比如:当你搜索”医院“,下拉词就会出现XX医院、XX医院哪家好等等,当然了,这里面有的下拉词是用户的搜索热度引起了百度搜索引擎的推荐,但是大部分其实是人为的,也就是传说中的“刷下拉词”,差不多就是作弊。

那么,刷百度下拉词的作用是什么呢?

1、降低成本
大家都知道,现在百度竞价的成本非常高,点击一次动辄就是几百上千元,能不能带来客户另说,这里面还掺杂了大量的恶意点击,这时候刷百度下拉词的作用就体现出来了。

比如,搜索“整形医院”,如果下拉词出现了你的品牌词“整形医院 XXX最好”,其中XXX就是你的品牌,这样的点击成本就大大的降低了,而且客户进入的页面也会相对精准很多。

又如,搜索“双眼皮”,如果下拉词出现了你的品牌词+医生“双眼皮 XX医院YY医生做的很棒”,无论是从点击成本,还是从用户体验都会提升了无数个档次。

2、品牌效应
搜索关键词,下拉框出现了你的品牌,说明搜索引擎在推荐你,从用户的角度来说,他会毫不犹豫的关注你,毕竟全国那么多同类企业,凭什么只推荐你?

搜索关键词,下拉框出现了你企业的某位人才或者其他与你企业相关的东西,这对你的企业来说都是好事。

下拉词通过从企业的曝光度、企业专业人员的曝光度,这无形之中就提升了你的品牌形象,和你的品牌度。

3、精准的流量
搜索某关键词,有的人是想了解产品的信息,有的是想了解产品的优势,更有的是想了解产品是否存在历史负面,当然还有些是想了解产品的某一项具体的体征,如果下拉词包含了这些,这无疑是减少了客户的时间成本,通过下拉词快速的找到了他想看的东西,也提升了用户的体验度,一举两得。

当然了,百度刷下拉词的作用远远不止上述的那么简单,从品牌的角度,从企业人才个人IP的角度,从企业产品的知名度,从广告的费用,都会为企业带来巨大的好处,最关键的是,对于广告投入大的企业来说,投入下拉词的成本是极低的,可谓二两力拨千斤就是这么个道理。

如果你想做百度下拉词可以联系我,如果你想做百度下拉词的代理你也可以联系我,咱们互利共赢!共创辉煌!

相关阅读:

百度下拉词是怎么做的?

通过seo圣人

sqlserver如何查看近期执行过的语句?

无论是手工执行数据库语句,还是客户端执行了数据库语句,这在sqlserver里面其实都是有记录的,我们可以查询最新的1000条sql语句,同时可以限制时间范围,sqlserver如何查看近期执行过的语句如下:

SELECT TOP 1000 
       ST.text AS '执行的SQL语句',
       QS.execution_count AS '执行次数',
       QS.total_elapsed_time AS '耗时',
       QS.total_logical_reads AS '逻辑读取次数',
       QS.total_logical_writes AS '逻辑写入次数',
       QS.total_physical_reads AS '物理读取次数',       
       QS.creation_time AS '执行时间' ,  
       QS.*
FROM   sys.dm_exec_query_stats QS
       CROSS APPLY 
sys.dm_exec_sql_text(QS.sql_handle) ST
WHERE  QS.creation_time BETWEEN '2019-10-25 16:57:00' AND '2019-10-25 16:58:00' 
ORDER BY
     QS.total_elapsed_time DESC 
     
     

注意,时间和条数请按照自己的需求去修改。

通过seo圣人

nginx伪静态规则将80端口不带www的域名全部跳转到带https的www域名

遇到一个很久都无法解决的问题,就是我的网站在开启证书后,想把80端口的域名、不带www的域名全部301跳转到带ssl证书的www域名,看我下面的例子:

http://dobunkan.com    301  到   https://www.dobunkan.com

http://www.dobunkan.com    301  到   https://www.dobunkan.com

https://dobunkan.com    301  到   https://www.dobunkan.com

看起来很简单的问题,但是解决起来非常麻烦,因为nginx重写规则不支持 if(条件1 || 条件2),今天想到了一个很笨的解决办法,思路是这样的,把80端口、443端口的顶级域名、443端口的长域名分开写,这样就达到目的了,请看我的例子:

server {
    listen 80;
    server_name www.dobunkan.com dobunkan.com;
    rewrite ^(.*)$ https://www.dobunkan.com$1 permanent;
}
server {
    listen 443 ssl;
    ssl_certificate    /www/host/domain/vhost/cert/domain.dobunkan.com/fullchain.pem;
    ssl_certificate_key    /www/host/domain/vhost/cert/domain.dobunkan.com/privkey.pem;
    server_name dobunkan.com;
    return 301 https://www.dobunkan.com$request_uri;
}
server {
    listen 443 ssl;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/domain.dobunkan.com/public_html;
    ssl_certificate    /www/host/domain/vhost/cert/domain.dobunkan.com/fullchain.pem;
    ssl_certificate_key    /www/host/domain/vhost/cert/domain.dobunkan.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    error_page 497  https://$host$request_uri;
    server_name  www.dobunkan.com;
	
	
    #SSL-END
    
    #ERROR-PAGE-START  错误页配置,可以注释、删除或修改
    #error_page 404 /404.html;
    #error_page 502 /502.html;
    #ERROR-PAGE-END
    
    #PHP-INFO-START  PHP引用配置,可以注释或修改
    include enable-php-73.conf;
    #PHP-INFO-END
    
    #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
    include /www/host/domain/vhost/rewrite/domain.dobunkan.com.conf;
    #REWRITE-END
    
    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }
    
    #一键申请SSL证书验证目录相关设置
    location ~ \.well-known{
        allow all;
    }
    
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        error_log off;
        access_log off;
    }
    
    location ~ .*\.(js|css)?$
    {
        expires      12h;
        error_log off;
        access_log off; 
    }
    access_log  /www/wwwlogs/domain.dobunkan.com.log;
    error_log  /www/wwwlogs/domain.dobunkan.com.error.log;

}

非常笨的方法顺利的解决了nginx301跳转的问题,如果你有更好的方法,请在下方留言!!!

通过seo圣人

wordpress博客启用SSL证书后标志带感叹号怎么办?

今天把网站域名申请了SSL证书,在后台也设置好了域名,结果发现网站全站的SSL证书标致都带感叹号,wordpress博客启用SSL证书后标志带感叹号怎么办?

出现这样的情况,一般是站内引用的资源依然使用的是HTTP协议,知道问题之后我们开始去排查,果然,在一个地方发现了问题,看下面的代码:

<link rel="shortcut icon" href="https://www.dobunkan.com/wp-content/uploads/2019/09/111111.png" /> 

看吧,问题就出在这里了,下面我们开始解决问题,通过对模板header.php的跟踪,发现这一段路径是以数组的形式存储在数据库里面:

数据表名为:wp_options

字段为:appointment_options

里面的内容是这样的:

s:61:"http://www.dobunkan.com/wp-content/uploads/2019/09/111111.png";}

好了,我们把里面的http替换为https就可以解决了:

s:61:"https://www.dobunkan.com/wp-content/uploads/2019/09/111111.png";}

保存数据库,然后清理缓存,在刷新,然后,网站正常了:

通过seo圣人

windows下搭建NTP时间服务器

最近因为监控服务器时间莫名其妙的回到了几个月前,几十台监控服务器如果挨个去接显示器设置时间,实在是太麻烦,经过一番胡乱的点击发现海康威视里面有一个NTP服务器设置。

到这里,思路来了,如果我们在内网搭建一个NTP时间服务器,问题是不是就解决了?说干就干,实践出真知嘛:

修改注册表项。在搜索框中打开注册表,使用命令: regedit,结果如下图所示:

进入注册表项HKEY_LOCAL_MACHINE—>SYSTEM—>CurrentControlSet—>Services—>W32Time—>TimeProviders—>NtpServer
Enabled 设置为 1打开NTP,(系统默认0) ,结果如下图所示:

进入注册表项HKEY_LOCAL_MACHINE—>SYSTEM—>CurrentControlSet—>Services—>W32Time—>Config
AnnounceFlags 设置为 5 (系统默认 10),结果如下图所示:

进入系统服务,找到Windows time服务,使用命令:services.msc,结果如下图所示:

将Windows time服务设置为自动启动,点击应用和确定,结果如下图所示:

鼠标右键重新启动windows time服务,结果如下图所示:

重新启动电脑或者主机,所有配置生效,NTP时钟搭建完毕,此时去海康威视的面板设置下时间服务器,重启海康威视,时间恢复正常:

通过seo圣人

华为路由屏蔽TeamViewer5938端口

大家都知道,最近Teamviewer出了非常严重的漏洞,这给TeamViewer用户造成了巨大的安全隐患,官方给出的解决方案是暂时封杀5938端口和禁止访问teamviewer.com这个域名。

很多用华为路由的用户就懵逼了,不知道在哪关闭5938端口,下面我来将下这个命令:

acl number 3003
 rule 0 deny tcp source-port eq 5938
 rule 1 deny udp source-port eq 5938

执行上述命令即可封杀5938端口。

通过seo圣人

C#去掉button按钮的边框线

在用C#编写的软件里面,按钮用的是背景图,有一个问题就是图片按钮带了C#的背景和边框,这样看起来感觉很不爽,那么,怎么去button自带的边框和背景色呢?

第一种方法:Winform的话,设置FlatStyle为Flat,并且设置FlatAppearance下的BorderSize为0.

第二种方法:系统自带的按钮无法去除边框。重写按钮的OnPaint事件

class newbtn : System.Windows.Forms.Button //继承之系统按钮控件


{
 

protected override void OnPaint(PaintEventArgs e)
{//重写



 

base.OnPaint(e);
System.Drawing.Pen pen = new Pen(this.BackColor, 3);
e.Graphics.DrawRectangle(pen, 0, 0, this.Width, this.Height);//填充


pen.Dispose();
 
}
}

然后将designer。cs文件中你要修改的按钮重新继承至newbtn就可。

去除按钮的背景色其实很简单,只需要按下图的设置即可,找到Flatstyle,把属性设置为flat即可,如下图所示:

下面是按上述设置之后的样子,边框和背景都没了,按钮使用的是透明色:

通过seo圣人

C#编写软件怎样删除dataGridView的第一列?

在用C#编写软件的过程中因为需要用到dataGridView这个控件,默认情况是这样显示的:

第一列等于是什么都没有,但是他默认就是存在,我们怎样才能删除或者隐藏dataGridView的第一列呢?查阅了下手册,发现解决方法还是挺简单的,我们只需要将RowHeadersVisible设置为false即可,代码如下:

dataGridView1.RowHeadersVisible = false;//隐藏第一列

还有一个问题,如果dataGridView控件直接显示从数据库的查询结果,里面有的字段数据比较长,有的比较短,我们怎样把表格的列宽设置成自适应列宽呢?请看下面的代码:

dataGridView1.AutoResizeColumns();//自适应列宽

从数据库读出来的数据,每个字段都是英文的,这也导致了dataGridView控件表格的表头也是英文,怎样把他改成显示中文的呢?代码如下:

            dataGridView1.Columns[0].HeaderCell.Value = "编号";
            dataGridView1.Columns[1].HeaderCell.Value = "姓名";
            dataGridView1.Columns[2].HeaderCell.Value = "部门";
            dataGridView1.Columns[3].HeaderCell.Value = "显示器";
            dataGridView1.Columns[4].HeaderCell.Value = "CPU";
            dataGridView1.Columns[5].HeaderCell.Value = "内存条";
            dataGridView1.Columns[6].HeaderCell.Value = "硬盘";
            dataGridView1.Columns[7].HeaderCell.Value = "IP";
            dataGridView1.Columns[8].HeaderCell.Value = "显卡";
            dataGridView1.Columns[9].HeaderCell.Value = "主板";

下面,来段完整的例子,从数据库读取数据,然后在dataGridView控件中显示出来,并自动列宽,删除第一列的空白,代码如下:

//连接并写入数据库
            String connsql = "server=127.0.0.1;database=computer;uid=sa;pwd=1234567890"; //数据库配置

            SqlConnection sqlCont = new SqlConnection(connsql); //创建数据库连接

            if (sqlCont.State == ConnectionState.Open)         //检查连接状态
            {

                sqlCont.Close();

            }

            sqlCont.Open();   //打开数据库连接
            string strselect = "select id,name,dept,showq,cpu,memory,disk3,ip,video,BoardInfo from peizhi";
            //返回查询结果

            DataSet ds = new DataSet();

            //SqlDataAdapter dataAdpt = new SqlDataAdapter(strselect, sqlCont);  //执行查询
            SqlCommand dataAdpt = new SqlCommand(strselect, sqlCont);
            SqlDataAdapter sda = new SqlDataAdapter(dataAdpt);
            DataSet dss = new DataSet();
            sda.Fill(dss, "peizhi");

            dataGridView1.DataSource = dss;
            dataGridView1.DataMember = "peizhi";
            dataGridView1.RowHeadersVisible = false;//隐藏第一列
            dataGridView1.Columns[0].HeaderCell.Value = "编号";
            dataGridView1.Columns[1].HeaderCell.Value = "姓名";
            dataGridView1.Columns[2].HeaderCell.Value = "部门";
            dataGridView1.Columns[3].HeaderCell.Value = "显示器";
            dataGridView1.Columns[4].HeaderCell.Value = "CPU";
            dataGridView1.Columns[5].HeaderCell.Value = "内存条";
            dataGridView1.Columns[6].HeaderCell.Value = "硬盘";
            dataGridView1.Columns[7].HeaderCell.Value = "IP";
            dataGridView1.Columns[8].HeaderCell.Value = "显卡";
            dataGridView1.Columns[9].HeaderCell.Value = "主板";
            dataGridView1.AutoResizeColumns();
            sqlCont.Close();

下面展示下成功的截图:

通过seo圣人

js中this的四种调用模式详解

js中this的四种调用模式主要分为方法调用模式、函数调用模式、构造器调用模式和(apply、call、bind)调用模式。

第一种:方法调用模式 (也就是用.调用的)this就是这个对象本身

当一个函数被保存为对象的一个属性时,我们称它为一个方法,当一个方法被调用时,this被绑定到该对象,如果一个调用表达式包含一个属性表达式(即一个.点表达式或者[subscript]下标表达式)那么它被当做一个方法调用。

    var myObject = {
        value:0;
        increment:function(inc){
            this.value + = typeof inc === 'number'?inc:1;
        }
    }
    myObject.increment();
    document.writeln(myObject.value);//1
    myObject.increment(2);
    document.writen(myObject.value;)

方法可以使用this去访问对象,所以它能从对象中取得或修改该对象,this到对象的绑定发生在调用它的时候,这个超级“迟绑定”(very later binding)使用函数可以对this高度复用,通过this可取得它们所属对象的上下文的方法称为公共方法。

第二种:函数调用模式


当函数并非一个对象的属性时,那么它被当做一个函数来调用:

var sum = add(3,4);

当函数以些模式调用时,this被绑定到全局对象,这是语言设计上的一个错误,如果语言设计正确,当内部函数被调用时,this应该仍然绑定到外部函数的this对象,这个错误设计的后果就是方法不能利用内部函数来帮助它工作,因为内部函数的this被绑定了错误的值,所以不能共享该方法对对象的访问权,有一个很容易的解决办法如果该方法定义一个变量并给它赋值为this,那么内部函数就可以通过这个变量来访问到this。

    //给myObject增加一个double方法
    myObject.double = function(){
        that = this; 
        var helper = function(){
            that.value = add(that.value,that.value);
        }
        helper();以函数的形式来调用helper
    }
    //以方法的形式来调用double
    myObject.double();
    document.wtiten(myObject.getValue());//6

第三种:构造函数调用模式

    var Class = function(){
        this.value = 100;
    }
    var class = new Class();
    console.log(class.value); //100

我们通过new关键字来调用构造函数,此时this会绑定在该新对象上(也就是这个实例对象上)

第四种:apply和call以及bind的调用模式:指定绑定对象

    var myObject = {value:100};
    var foo = function(){
        console.log(this);
    };
    foo(); //global
    foo.apply(myObject);//{value:100}
    foo.call(myObject);//{value:100}
    var newFoo = foo.bind(myObject);
    newFoo(); //{value:100}

apply()方法接受两个参数第一个是函数运行时的作用域,另一个是参数的数组(arguments)

call()方法第一个参数与apply是一样的,第二个参数需要一个个列举出来

call方法更接近我们平时调用函数,而apply需要我们传递 Array形式的数组做为参数,它们是可以相互转换的。