百度网盘上有很多资料,可以使用下面的网址提供的服务,只搜索百度网盘中的资料,非常方便:
允许外网访问XAMPP页面
安装完XAMPP之后,默认只能从本地,即localhost,访问XAMPP页面。如果从外网访问的话,则会出现提示:
Access to the requested directory is only available from the local network.
This setting can be configured in the file “httpd-xampp.conf”.
可以通过修改配置文件,来解决这个问题。
安装XAMPP时出现 unable to realloc 83886080 bytes
最近新搭建了服务器,在安装XAMPP时,出现错误:
################unable to realloc 83886080 bytes
多方查找下,才知道原来是服务器端没有swap分区,而内存本身比较小(我的是512M内存),因此内存不足,无法为程序分配更多的内存,导致安装失败。
既然在分区的时候没有swap分区,那现在可以创建一个。现在创建分区是使用大文件来创建的。比如先创建一个2G大小的文件,然后将此文件作为swap分区就可以了。
1.创建2G大小的文件,这个大小任意,但最好是内存的2倍大小。
sudo dd if=/dev/zero of=swapfile bs=1024 count=2000000
2.把创建的文件转换为swap分区能用的文件类型。
sudo mkswap -f swapfile
3.激活该文件。
sudo swapon swapfile
4.查看分区挂载情况。
free -m
就会出现swap分区。
现在就可以重新安装XAMPP了。
参考文献
1.安装XAMPP
Mac系统终端 -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory Fix
在OS X Bash终端使用SSH登录服务器的时候,有错误出现:
ssh user@server
Last login: Wed Mar 26 08:45:36 2014 from 1.2.3.4
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
这个警告或者错误的出现,是因为OpenSSH的客户端试图将本地的”LC_*”环境变量上传到服务器,并在服务器端设置这些变量。
有以下三种方法修复这个问题,任选其中一种。
一、使用OS X的Terminal.app
如果你使用的是OS X上得Terminal.app的话,那么:
1.打开Terminal.app。
2.将鼠标移动到屏幕左上角,苹果Logo旁边,依次点击
Terminal > Preferences
在”General”选项卡下,找到第一项:”On startup, open:”,从下拉框中选择一个样式,假如选定的是Basic。
3.切换到”Profiles”选项卡,从左侧列表中选择刚刚选中的样式,在右侧选择”Advanced”标签,取消倒数第二栏的”set locale environment variables on startup”勾选状态(即不勾选这个选项)。然后退出,关闭并退出Terminal.app,重新打开Terminal.app就可以了。
二、修改客户端的SSH配置文件
1.打开客户端SSH配置文件:
(Linux系统) sudo vi /etc/ssh/ssh_config
或(OS X) sudo vi /etc/ssh_config
2.找到这一行,并在这一行前用”#”号注释它。
#SendEnv LANG LC_*
3.保存并退出编辑器。再次用SSH连接服务器的时候就不会出现问题了。
三、在服务器端安装需要的locale文件
除了上述两种方法外,还可以在服务器上安装缺少的locale文件。使用命令:
sudo localedef -i en_US -f UTF-8 en_US.UTF-8
即可。
三种方式任选其一。
参考文献
1.解决LC_*问题
制作SSH Key 密钥公钥远程登录服务器
使用SSH登录远程服务器的时候,只是用密码会比较危险,因为密码可能遭到暴力破解。而采用SSH 密钥公钥登录的话,则保证了安全性。密钥放在客户端,公钥放在服务器端,在用SSH登录服务器的时候,会对比密钥与公钥,如果匹配才允许登录(无密码登录),否则会拒绝。只要保证密钥不泄露,那么其他人就无法登录你的服务器了。同时,你也可以为密钥增加密码进一步提高密钥的安全性。
下面讲解具体步骤。
一、创建RSA密钥公钥
创建密钥公钥可以在客户端进行,也可以在服务端进行。在客户端创建的好处是及其本身是自己的,可以随时使用,而服务器则需要登录权限。使用下面的命令创建钥匙对:
ssh-keygen -t rsa
二、设置密钥公钥
输入了上面的命令之后,就会进入创建钥匙的流程,会有几个问题,依次为:
Enter file in which to save the key (/home/demo/.ssh/id_rsa):这是询问保存密钥的文件,保持默认,点击回车键确认。
Enter passphrase (empty for no passphrase):这是要求输入保护密钥的密码。你可以在后面输入密码按回车键,也可以不输入按回车键。 之所以说密钥公钥对能够提高登录服务器的安全性,是因为客户端在登录服务器时,客户端的密钥与服务器的公钥必须匹配才可以。如果客户端的密钥被其他人得到了,那么其他人也可以通过这个密钥与服务器的公钥匹配,进而有权限登录服务器。如果密钥有保护密码的话,那么每次登录时必须输入密钥的保护密码才可以进行密钥公钥的匹配操作。即使他人得到了密钥,也必须要破解密钥的保护密码才行。
保持SSH连接不自动断开
使用SSH登录服务器之后,如果长时间没有操作,或屏幕没有输出,SSH就会自动断开连接。有两种方式可以防止自动断开连接:
一、修改客户端SSH配置文件:
1.打开客户端SSH配置文件:
(Linux系统) sudo vi /etc/ssh/ssh_config
(Mac系统) sudo vi /etc/ssh_config
注意:打开的是ssh_config文件,而不是sshd_config文件。
2.查找”ServerAliveCountMax“字符串,如果该字符串前面有”#”号,则删掉”#”号,将其后的数字改为1。
3.查找”ServerAliveInterval“字符串,如果该字符串前面有”#”号,则删掉”#”号,将其后的数字改为60。
这样,SSH客户端会每隔60秒向SSH服务器发送信号,并等待SSH服务器的回应。这样就可以保证每分钟SSH客户端与SSH服务器会通信一次,连接就不会自动断开。
二、修改服务器端的SSH服务配置文件
除了修改客户端的配置文件,也可以修改服务器端的配置文件。
首先登录服务器。
1.打开SSH服务的配置文件
sudo vi /etc/ssh/sshd_config
注意:这里打开的是sshd_config
2.查找”ClientAliveCountMax“字符串,如果该字符串前面有”#”号,则删掉”#”号,将其后的数字改为1。
3.查找”ClientAliveInterval“字符串,如果该字符串前面有”#”号,则删掉”#”号,将其后的数字改为60。
这样,SSH服务器会每隔60秒向SSH客户端发送信号,并等待SSH客户端的回应。这样就可以保证每分钟SSH客户端与SSH服务器会通信一次,连接就不会自动断开。
参考文献
JNI技术解析第11章 JNI设计概览
本章涉及一些JNI设计的细节问题,对JNI的设计进行概述。在必要的时候,还会提供JNI设计的技术细节。设计概览主要介绍JNI的关键概念,包括JNIEnv指针、局部引用和全局引用,成员变量和成员方法ID等。介绍技术实现细节是让读者明白JNI在设计的时候如何权衡不同因素。在某些情况下,会讨论如何实现一个具体的特点。这些讨论的目的并不是为了呈现实际的实现策略,而是为了澄清一些微妙的语义误解。
用于连接不同语言的程序编程接口并不是新概念,比如C语言就可以调用FORTRAN语言和汇编语言。JNI也是一种编程接口,用于连接Java语言和其他的原生语言。但JNI与其他的接口有一个非常重要的区别:JNI并不是为了特定的Java虚拟机设计的。所有的Java虚拟机都支持JNI。
11.1 设计目标
JNI设计的一个非常重要的目标是在一个给定的宿主系统上的不同的虚拟机能够实现二进制兼容,这也就是说,在同一个宿主系统上得不同的虚拟机能够运行同一个原生代码库,而不需要重新编译这个库的源文件。
为了达到这个目标,JNI在设计的时候不能对Java虚拟机的内部实现细节有任何的假定和依赖。因为Java虚拟机实现技术发展非常迅速,因此我们不会讨论任何可能涉及到未来的实现技术的内容。
JNI技术解析第10章 JNI中陷阱和常犯的错误
为了强调前几章介绍到的技术,本章重点讨论JNI程序员经常会犯的一些错误。这里提出的每一个错误在真正的项目中都出现过。
10.1 错误检查
最常犯的错误就是在编写原生代码的时候忘记了检查JNI函数是否发生错误/异常。不像Java编程语言那样有垃圾回收机制自动回收不再使用的对象,原生语言不提供这种机制。JNI也不依赖任何的原生异常机制(比如C++异常处理)。因此,程序员每一次调用可能产生异常的JNI函数之后,都要显式的做一次错误检查或异常检查,虽然并不是所有的JNI函数都会抛出异常,但是大部分都会。异常检查虽然很琐碎,但是是鲁棒健壮的程序必不可少的部分。
10.2 给JNI函数传递无效参数
JNI函数不会尝试检测无效参数并从这个错误中恢复。比如,对一个需要非NULL引用作为参数的JNI函数,如果你传递了NULL或(jobject)0xFFFFFFFF,那么这个行为的结果是未知的,在实际情况中,要么造成无效的输出,要么导致虚拟机崩溃。Java 2 SDK 1.2提供了命令行参数-Xcheck:jni,这个参数会让虚拟机检测并报告很多(虽然不是全部)的JNI函数中的无效参数。检测参数的有效性会导致非常明显的系统过载,因此默认会禁止使用。
在C于C++标准库中,函数不检查其参数的有效性也是通常的做法,调用这些库函数的代码负责保证调用时参数有效。因此,使用JNI的时候,务必保证参数有效。
10.3 混淆了jclass与jobject
第一次使用JNI的时候,容易把对象引用(jobject类型的值)与类引用(jclass类型的值)混为一谈。
JNI技术解析第九章 使用存在的原生库
JNI的其中一种应用就是使用已经存在的原生库编写适合项目的原生函数。现代的操作系统都自带了很多的原生库,比如标准C库、POSIX库等,在编写项目的时候,有一部分的原生代码需要使用某些功能,而这些功能已经在系统的原生库中存在,那我们就可以直接使用这些已经存在的库中的功能了,比如项目的原生代码需要在终端输出信息(需要使用标准C库的printf系列函数)。
本章中将介绍一种典型的方法:创建一个类,在类中封装一系列的已经存在的原生库中的函数。比如,我们创建类C,在C中定义一个函数void f()映射到printf()函数,f()函数的功能就是把从Java传来的参数转换为printf()能够接受的参数。
本章首先讨论了编写封装类最直接的方式:一对一映射。然后再讨论共享桩,简化编写封装类的过程。在本章的最后会讨论如何使用peer classes封装已经存在的原生函数。