• Home

javascript快速入门

以下内容来自learnxinyminutes.com

Javascript于1995年由网景公司的Brendan Eich发明。 最初发明的目的是作为一个简单的网站脚本语言,来作为 复杂网站应用java的补充。但由于javascript和网站结合度很高 所以javascript逐渐变得比java在前端更为流行了。
JavaScript 不仅仅只可以用于浏览器, 也可用于 Node.js 等后台环境。


// 注释方式和C很像,这是单行注释
/* 这是多行
   注释 */

// 语句可以以分号结束
doStuff();

// ... 但是分号也可以省略,每当遇到一个新行时,分号会自动插入
doStuff()

// 我们在这里会去掉分号,但是否添加最后的分号取决于你个人的习惯
// 及你所在团队的编程风格

///////////////////////////////////
// 1. 数字、字符串与操作符

// Javascript 只有一种数字类型 (即 64位 IEEE 754 双精度浮点).
3 // = 3
1.5 // = 1.5

// 所有基本的算数运算
1 + 1 // = 2
8 - 1 // = 7
10 * 2 // = 20
35 / 5 // = 7

// 包括无法整除的除法
5 / 2 // = 2.5

// 位运算也和其他语言一样。当你对浮点数进行位运算时,
// 浮点数会转换为至多 32 位的无符号整数
1 << 2 // = 4

// 括号可以决定优先级
(1 + 3) * 2 // = 8

// 有三种非数字的数字类型
Infinity //  1/0 的结果
-Infinity // -1/0 的结果
NaN // 0/0 的结果

// 也有布尔值
true
false

// 可以通过单引号或双引号来构造字符串
'abc'
"Hello, world"

// 用!来取非
!true // = false
!false // = true

// 相等 ==
1 == 1 // = true
2 == 1 // = false

// 不等 !=
1 != 1 // = false
2 != 1 // = true

// 更多的比较操作符 
1 < 10 // = true
1 > 10 // = false
2 <= 2 // = true
2 >= 2 // = true

// 字符串用+连接
"Hello " + "world!" // = "Hello world!"

// 字符串也可以用 < 、> 来比较
"a" < "b" // = true

// 比较时会进行类型转换...
"5" == 5 // = true

// ...除非你是用 ===
"5" === 5 // = false

// 你可以用charAt来得到字符串中的字符
"This is a string".charAt(0)

// 还有两个特殊的值:null和undefined
null // 用来表示刻意设置成的空值
undefined // 用来表示还没有设置的值

// null, undefined, NaN, 0 和 "" 都是假的(false),其他的都视作逻辑真
// 注意 0 是逻辑假而  "0"是逻辑真, 尽管 0 == "0".

///////////////////////////////////
// 2. 变量、数组和对象

// 变量需要用 var 这个关键字声明. Javascript是动态类型语言
// 所以你在声明时无需指定类型。 赋值需要用 = 
var someVar = 5

// 如果你在声明时没有加var关键字,你也不会得到错误
someOtherVar = 10

// ...但是此时这个变量就会拥有全局的作用域,而非当前作用域

// 没有被赋值的变量都会返回undefined这个值
var someThirdVar // = undefined

// 对变量进行数学运算有一些简写法
someVar += 5 // 等价于 someVar = someVar + 5; someVar 现在是 10 
someVar *= 10 // 现在 someVar 是 100

// 自增和自减也有简写
someVar++ // someVar 是 101
someVar-- // 回到 100

// 数组是任意类型组成的有序列表
var myArray = ["Hello", 45, true]

// 数组的元素可以用方括号下标来访问
// 数组的索引从0开始
myArray[1] // = 45

// javascript中的对象相当于其他语言中的字典或映射:是键-值的集合
{key1: "Hello", key2: "World"}

// 键是字符串,但是引号也并非是必须的,如果键本身是合法的js标识符
// 而值则可以是任意类型的值
var myObj = {myKey: "myValue", "my other key": 4}

// 对象的访问可以通过下标
myObj["my other key"] // = 4

// ... 或者也可以用 . ,如果属性是合法的标识符
myObj.myKey // = "myValue"

// 对象是可变的,键和值也可以被更改或增加
myObj.myThirdKey = true

// 如果你想要访问一个还没有被定义的属性,那么会返回undefined
myObj.myFourthKey // = undefined

///////////////////////////////////
// 3. 逻辑与控制结构

// if语句和其他语言中一样
var count = 1
if (count == 3){
    // count 是 3 时执行
} else if (count == 4) {
    // count 是 4 时执行
} else {
    // 其他情况下执行 
}

// while循环
while (true) {
    // 无限循环
}

// Do-while 和 While 循环很像 ,但前者会至少执行一次
var input
do {
    input = getInput()
} while (!isValid(input))

// for循环和C、Java中的一样
// 初始化; 继续执行的条件; 遍历后执行.
for (var i = 0; i < 5; i++){
    // 遍历5次
}

// && 是逻辑与, || 是逻辑或
if (house.size == "big" && house.colour == "blue"){
    house.contains = "bear"
}
if (colour == "red" || colour == "blue"){
    // colour是red或者blue时执行
}

// && 和 || 是“短路”语句,在初始化值时会变得有用 
var name = otherName || "default"

///////////////////////////////////
// 4. 函数、作用域、闭包

// JavaScript 函数由function关键字定义
function myFunction(thing){
    return thing.toUpperCase()
}
myFunction("foo") // = "FOO"

// 函数也可以是匿名的:
function(thing){
    return thing.toLowerCase()
}
// (我们无法调用此函数,因为我们不知道这个函数的名字)

// javascript中的函数也是对象,所以函数也能够赋给一个变量,并且被传递
// 比如一个事件处理函数:
function myFunction(){
    // this code will be called in 5 seconds' time
}
setTimeout(myFunction, 5000)

// 你甚至可以直接把一个函数写到另一个函数的参数中

setTimeout(function myFunction(){
    // 5秒之后会执行这里的代码
}, 5000)

// JavaScript 仅有函数作用于,而其他的语句则没有作用域
if (true){
    var i = 5
}
i // = 5 - 并非我们在其他语言中所得到的undefined

// 这就导致了人们经常用一种叫做“即使执行匿名函数”的模式
// 这样可以避免一些临时变量扩散到外边去
function(){
    var temporary = 5
    // 我们可以访问一个全局对象来访问全局作用域
    // 在浏览器中是 'window' 这个对象。 
    // 在Node.js中这个对象的名字可能会不同。
    window.permanent = 10
    // 或者,我们也可以把var去掉就行了
    permanent2 = 15
}()
temporary // 抛出引用异常
permanent // = 10
permanent2 // = 15

// javascript最强大的功能之一就是闭包
// 如果一个函数在另一个函数中定义,那么这个函数就拥有外部函数的所有访问权
function sayHelloInFiveSeconds(name){
    var prompt = "Hello, " + name + "!"
    function inner(){
        alert(prompt)
    }
    setTimeout(inner, 5000)
    // setTimeout 是异步的,所以这个函数会马上终止不会等待。
    // 然而,在5秒结束后,inner函数仍然会弹出prompt信息。
}
sayHelloInFiveSeconds("Adam") // 会在5秒后弹出 "Hello, Adam!" 

///////////////////////////////////
// 5. 对象、构造函数与原型

//  对象包含方法
var myObj = {
    myFunc: function(){
        return "Hello world!"
    }
}
myObj.myFunc() // = "Hello world!"

// 当对象中的函数被调用时,这个函数就可以通过this关键字访问这个对象
myObj = {
    myString: "Hello world!",
    myFunc: function(){
        return this.myString
    }
}
myObj.myFunc() // = "Hello world!"

// 但这个函数访问的其实是其运行时环境,而非定义时环境
// 所以如果函数所在的环境不在当前对象的环境中运行时,就运行不成功了
var myFunc = myObj.myFunc
myFunc() // = undefined

// 相应的,一个函数也可以被指定为一个对象的方法,并且用过this可以访问
// 这个对象的成员,即使在定义时并没有绑定任何值
var myOtherFunc = function(){
    return this.myString.toUpperCase()
}
myObj.myOtherFunc = myOtherFunc
myObj.myOtherFunc() // = "HELLO WORLD!"

// 当你通过new关键字调用一个函数时,就会生成一个对象
// 而对象的成员需要通过this来定义。
// 这样的函数就叫做构造函数

var MyConstructor = function(){
    this.myNumber = 5
}
myNewObj = new MyConstructor() // = {myNumber: 5}
myNewObj.myNumber // = 5

// 每一个js对象都有一个原型,当你要访问一个没有定义过的成员时,
// 解释器就回去找这个对象的原型

// 有一些JS实现会让你通过一个对象的__proto__方法访问这个原型。
// 这虽然对理解这个对象很有用,但是这并不是标准的一部分
// 我们之后会通过标准方式来访问原型。
var myObj = {
    myString: "Hello world!",
}
var myPrototype = {
    meaningOfLife: 42,
    myFunc: function(){
        return this.myString.toLowerCase()
    }
}
myObj.__proto__ = myPrototype
myObj.meaningOfLife // = 42

// This works for functions, too.
myObj.myFunc() // = "hello world!"

// 当然,如果你要访问的成员在原型当中也没有定义的话,解释器就会去找原型的原型。
myPrototype.__proto__ = {
    myBoolean: true
}
myObj.myBoolean // = true

// 这其中并没有对象的拷贝。每个对象的原型实际上是持有原型对象的引用
// 这说明当我们改变对象的原型时,会影响到其他以这个原型为原型的对象
myPrototype.meaningOfLife = 43
myObj.meaningOfLife // = 43

// 我们知道 __proto__ 并非标准规定,实际上也没有办法更改已经指定好的原型。
// 但是,我们有两种方式可以为新的对象指定原型。

// 第一种方式是 Object.create,这个方法是在最近才被添加到Js中的
// 也因此并不是所有的JS实现都有这个放啊
var myObj = Object.create(myPrototype)
myObj.meaningOfLife // = 43

// 第二种方式可以在任意版本中使用,不过需要通过构造函数。
// 构造函数有一个属性prototype。但是这 *不是* 构造函数本身的函数
// 而是通过构造函数和new关键字生成新对象时自动生成的。
myConstructor.prototype = {
    getMyNumber: function(){
        return this.myNumber
    }
}
var myNewObj2 = new myConstructor()
myNewObj2.getMyNumber() // = 5

// 字符串和数字等内置类型也有通过构造函数来创建的包装类型
var myNumber = 12
var myNumberObj = new Number(12)
myNumber == myNumberObj // = true

// 但是它们并非严格等价
typeof myNumber // = 'number'
typeof myNumberObj // = 'object'
myNumber === myNumberObj // = false
if (0){
    // 这段代码不会执行,因为0代表假
}
if (Number(0)){
    // 这段代码会执行,因为Number(0)代表真
}

// 但是,包装类型和内置类型共享一个原型
// 这样你就可以给内置类型也增加一些功能
String.prototype.firstCharacter = function(){
    return this.charAt(0)
}
"abc".firstCharacter() // = "a"

// 这个技巧可以用来用老版本的javascript子集来是实现新版本js的功能
// 这样就可以在老的浏览器中使用新功能了。

// 比如,我们知道Object.create并没有在所有的版本中都实现
// 但是我们仍然可以通过这个技巧来使用
if (Object.create === undefined){ // 如果存在则不覆盖
    Object.create = function(proto){
        // 用正确的原型来创建一个临时构造函数
        var Constructor = function(){}
        Constructor.prototype = proto
        // 之后用它来创建一个新的对象
        return new Constructor()
    }
}

malloc和free区别

1.malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
2.对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
3.因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
4.C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
5.new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。

android apk破解

1 破解目的

android破解应用可以分为两类,一类纯粹的破解,获取有价值信息:如获取该资源素材、获取该应用webservice接口、代码实现、使用的开源组件等;第二类破解后修改:如本地化(汉化)、去广告、添加广告、替换资源素材等。

2 破解对象

先来看看破解对象,即后缀为apk的安装包apk,这是一个压缩包,可以直接修改后缀为zip,然后用解压工具查看。演示应用压缩包内容结构如下图。

 

apk_stru

每个应用都会包括的而且也是最重要的文件是AndroidManifest.xml 、res、assets、META-INF、classes.dex。AndroidManifest.xml是整个的配置文件,里面会包括使用到的权限、activity、service的声明等,加密;res存放定义drawable、string、layout、color的xml,通常加密;assets存放静态的资源文件,如图片、音频、视频、数据文件等,通常不加密;classes.dex是dex是Android系统中可以在Dalvik虚拟机上直接运行的文件格式,java源代码经过ADT的复杂编译后转换成Dex文件,Dalvik是Google公司自己设计用于Android平台的Java虚拟机;META-INF的文件夹,这个里边存储的是关于签名的一些信息。例如汉化通常要修改res文件夹下的字符串xml,去广告通常要修改res下布局xml,获知实现的Java代码通常通过反编译classes.dex。为了获取你想要的东西,每个可疑文件都不能放过。

 

3 如何破解

下面将从两种目的的破解介绍如何破解。

3.1查看型

查看型破解要求尽可能还原出可读信息,可读性最好的当然是源码,如Java源码,xml源码;次之为中间代码,如smali字节码;最后二进制代码,如so文件。

3.1.1 xml文件的反编译

1.使用AXMLPrinter2.jar单独反编译一个

wingyiu@mbp101:~$java -jar AXMLPrinter2.jar /User/user/V1.5.8_V4.0_demaiwebsite/AndroidManifest.xml > /User/user/demai/AndroidManifest.xml

2.使用apktool反编译全部

 wingyiu@mbp101:~/Android/apktool-install-macosx-r05-ibot$./apktool d ../V1.5.8_V4.0_demaiwebsite.apk ../demai
 I: Baksmaling...
 I: Loading resource table...
 W: Skipping "android" package group
 I: Loaded.
 I: Decoding AndroidManifest.xml with resources...
 I: Loading resource table from file: /Users/user/Library/apktool/framework/1.apk
 I: Loaded.
 I: Regular manifest package...
 I: Decoding file-resources...
 W: Cant find 9patch chunk in file: "drawable-hdpi/contact_detail_item_deep.9.png". Renaming it to *.png.
 W: Cant find 9patch chunk in file: "drawable-hdpi/message_chat_edit_normal.9.png". Renaming it to *.png.
 I: Decoding values */* XMLs...
 I: Done.
 I: Copying assets and libs...

1DFA5429-3973-484E-94A4-B2F9E67E9C37
此时res/下的xml和AndroidManifest.xml都已反编译好。smali/文件夹,里面存放着所有反编译出的smali字节码文件,按包目录结构存放。

3.1.2 classes.dex反编译

1.使用dex2jar把classes.dex转换为jar文件,可以类比为把smali转换为class

wingyiu@mbp101:~$cd Android/V1.5.8_V4.0_demaiwebsite
wingyiu@mbp101:~/Android/V1.5.8_V4.0_demaiwebsite$../dex2jar-0.0.9.15/d2j-dex2jar.sh classes.dex 
dex2jar classes.dex -> classes-dex2jar.jar

jar文件class文件的压缩包,即使直接解压无法直接阅读,此时可以使用jd-gui、jode、jad(或者他们的eclipse插件jodeclipse、jadclipse)。
2.使用jd-gui打开classes-dex2jar.jar

B5BDDAD3-72AE-4BAA-AF69-11F4833E0FCF可以看出这个应用除了第三方库做了代码混淆,其自身的代码是没有做混淆的。从报名可以大概看出该应用使用了高德地图、Google Gson等第三方库,如果不知道报名对应的库,只要把包名搜一下就知道了。虽然没混淆,但也不是所有代码都可以顺利查看的,比如下面的常量类。
32AB125A-634D-4606-8D4F-B40A3EFA0E56

 

混淆过得代码包名、类名、变量名、参数名会被无意义的a、b、aa之类代替,无法轻易理解,在一定程度上起到防反编译的效果,但效果不大。

F1865A1F-F9FC-4180-A043-2760F8E0F626

 

如果混淆过,只能通过反编译得到smali字节码文件,然后尝试从字节码文件获取信息了。

3.使用apktool反编译smali
此处不再复述,参考上面

3.1.3 so文件

未完待续

3.2 修改型

流程:通过apktool反编译整个apk,然后修改xml和smali文件或者so文件,重新打包,然后重新签名。

3.2.1 反编译,还是使用apktool

3.2.2 修改

3.2.2.1 修改静态资源

例如汉化时遇到文字是图片形式的,则可以用ps修改然后替换图片文件即可

3.2.2.2 修改xml

可以修改string、color数值,layout不可随意修改,此时可以通过修改属性值。例如把广告空间改为隐藏,或者宽高为0

3.2.2.3 修改smali

smali字节码资料参考这里。只需修改需要的地方,所以首先是定位到关键点,然后修改之。找到关键点办法:
1.资源id(通过布局xml和R类);
2.字符串(中文在smali文件里以utf8裸编码格式存储,如“\u91d1\u5e01\u4e0d\u8db3,\u65e0\u6cd5\u8d2d\u4e70”,可以通过字符转码工具来把中文转为utf8然后搜索smali文件);
3.动态调试smali(参考这里,工具如AndBug

3.2.2.4 修改so

 3.2.3 重新打包

wingyiu@mbp101:~/Android/apktool-install-macosx-r05-ibot$./apktool b ../duoxin
I: Checking whether sources has changed...
I: Smaling...
I: Checking whether resources has changed...
I: Building resources...
I: Copying libs...
I: Building apk file...

在原目录duoxin/dist就可以见到新的apk了

3.2.4 重新签名

apk还没有签名是无法安装的,开发时调试用的是debug签名。签名需要keystore文件,请参阅这里进行生成。

执行以下命令为重新编译的demai.apk签名:

$jarsigner -verbose -keystore wingyiu.keystore demai.apk Alias_name
Enter Passphrase for keystore: 
 adding: META-INF/MANIFEST.MF
 adding: META-INF/WINGYIU.SF
 adding: META-INF/WINGYIU.RSA
 signing: assets/frontia_plugin/plugin-deploy.jar
 ...
jar signed.

Warning: 
No -tsa or -tsacert is provided and this jar is not timestamped. Without a timestamp, users may not be able to validate this jar after the signer certificate's expiration date (2042-03-28) or after any future revocation date.

$zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk

最后,在安装到手机前,需要把手机中的已有版本先卸载,因为如果签名不同,是不能覆盖安装的,会提示“应用程序未安装”错误。

C++11之左值、右值、左值引用、右值引用

The traditional C++ reference, now called an lvalue reference, binds an identifier to an lvalue.An lvalue is an expression, such as a variable name or a dereferenced pointer, that represents data for which the program can obtain an address. Originally, an lvalue was one that could appear on the left side of an assignment statement, but the advent of the const modifier allowed for constructs that cannot be assigned to but which are still addressable:

int n;
int * pt = new int; 
const int b = 101; // can't assign to b, but &b is valid
int & rn = n;      // n identifies datum at address &n
int & rt = *pt;    // *pt identifies datum at address pt
const int & rb = b; // b identifies const datum at address &b

C++11 adds the rvalue reference , indicated by using &&, that can bind to rvalues—that is, values that can appear on the right-hand side of an assignment expression but for which one cannot apply the address operator. Examples include literal constants (aside from C-style strings, which evaluate as addresses), expressions such as x+y, and function return values, providing the function does not return a reference:

int x = 10;
int y = 23;
int && r1 = 13;
int && r2 = x + y;
double && r3 = std::sqrt(2.0);

Note that what r2 really binds to is the value to which x + y evaluates at that time. That is, r2 binds to the value 23, and r2 is unaffected by subsequent changes to x or y.

Interestingly, binding an rvalue to an rvalue reference results in the value being stored in a location whose address can be taken.That is, although you can’t apply the & operator to 13, you can apply it to r1.This binding of the data to particular addresses is what makes it possible to access the data through the rvalue references.

One of the main reasons for introducing the rvalue reference is to implement move semantics, the next topic in this chapter.

To open “Eclipse.app”, you need a Java SE 6 runtime.Would you like to install one now

Mac更新10.10后,原来安装的java6没了,索性下了个java8,结果打开eclipse提示
To open “Eclipse.app”, you need a Java SE 6 runtime.Would you like to install one now

解决方法之一:安装apple提供的java6:
下载地址:http://support.apple.com/kb/DL1572
安装后java6和之前安装的java8可以共存

$java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

[转]linux netstat详解

1.功能与说明

netstat 用于显示linux中各种网络相关信息。如网络链接 路由表  接口状态链接 多播成员等等。

2.参数含义介绍

-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态

-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。

提示:LISTEN和LISTENING的状态只有用-a或者-l才能看到

3.常用实例

3.1  列出所有端口

 netstat -a
[root@zhz jiehun]# netstat -a|more 
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 *:sunrpc                    *:*                         LISTEN      
tcp        0      0 *:webcache                  *:*                         LISTEN      
tcp        0      0 *:http                      *:*                         LISTEN      
tcp        0      0 192.168.122.1:domain        *:*                         LISTEN      
tcp        0      0 localhost.localdomain:d-s-n *:*                         LISTEN      
tcp        0      0 *:ssh                       *:*                         LISTEN      
tcp        0      0 localhost.loc:simplifymedia *:*                         LISTEN

3.2  列出所有tcp端口

[root@zhz jiehun]# netstat -at|more 
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 *:sunrpc                    *:*                         LISTEN      
tcp        0      0 *:webcache                  *:*                         LISTEN      
tcp        0      0 *:http                      *:*                         LISTEN      
tcp        0      0 192.168.122.1:domain        *:*                         LISTEN      
tcp        0      0 localhost.localdomain:d-s-n *:*                         LISTEN      
tcp        0      0 *:ssh                       *:*                         LISTEN      
tcp        0      0 localhost.loc:simplifymedia *:*                         LISTEN

3.3 列出所有udp端口

 netstat -au
[root@zhz jiehun]# netstat -au|more 
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
udp        0      0 *:ideafarm-panic            *:*                                     
udp        0      0 *:47005                     *:*                                     
udp        0      0 localhost.loca:memcache     *:*                                     
udp        0      0 *:55276                     *:*                                     
udp        0      0 192.168.122.1:domain        *:*                                     
udp        0      0 *:bootps                    *:*                                     
udp        0      0 *:bootpc                    *:*                                     
udp        0      0 *:sunrpc                    *:*                                     
udp        0      0 *:ipp                       *:*                                     
udp        0      0 *:44236                     *:*                                     
udp        0      0 *:722                       *:*

3.4 只显示监听端口 netstat -l

[root@zhz jiehun]# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 *:sunrpc                    *:*                         LISTEN      
tcp        0      0 *:webcache                  *:*                         LISTEN      
tcp        0      0 *:http                      *:*                         LISTEN      
tcp        0      0 192.168.122.1:domain        *:*                         LISTEN      
tcp        0      0 localhost.localdomain:d-s-n *:*                         LISTEN      
tcp        0      0 *:ssh                       *:*                         LISTEN      
tcp        0      0 localhost.loc:simplifymedia *:*                         LISTEN      
tcp        0      0 localhost.localdomain:ipp   *:*                         LISTEN      
tcp        0      0 *:44343                     *:*                         LISTEN      
tcp        0      0 localhost.localdomain:smtp  *:*                         LISTEN

3.5 只显示监听的tcp端口 netstat -lt

[root@zhz jiehun]# netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 *:sunrpc                    *:*                         LISTEN      
tcp        0      0 *:webcache                  *:*                         LISTEN      
tcp        0      0 *:http                      *:*                         LISTEN      
tcp        0      0 192.168.122.1:domain        *:*                         LISTEN      
tcp        0      0 localhost.localdomain:d-s-n *:*                         LISTEN      
tcp        0      0 *:ssh                       *:*                         LISTEN      
tcp        0      0 localhost.loc:simplifymedia *:*                         LISTEN      
tcp        0      0 localhost.localdomain:ipp   *:*                         LISTEN      
tcp        0      0 *:44343                     *:*                         LISTEN      
tcp        0      0 localhost.localdomain:smtp  *:*                         LISTEN

3.6 只显示所有监听udp端口 netstat -lu

[root@zhz jiehun]# netstat -lu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
udp        0      0 *:ideafarm-panic            *:*                                     
udp        0      0 *:47005                     *:*                                     
udp        0      0 *:47551                     *:*                                     
udp        0      0 localhost.loca:memcache     *:*                                     
udp        0      0 *:55276                     *:*                                     
udp        0      0 192.168.122.1:domain        *:*                                     
udp        0      0 *:bootps                    *:*                                     
udp        0      0 *:bootpc                    *:*                                     
udp        0      0 *:sunrpc                    *:*

3.7  只列出所有监听unix端口 netstat -lx

[root@zhz jiehun]# netstat -lx
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     21941  /tmp/.X11-unix/X0
unix  2      [ ACC ]     STREAM     LISTENING     34096  /tmp/orbit-haozheng/linc-cd2-0-5b33fa1ecf0c9
unix  2      [ ACC ]     STREAM     LISTENING     22263  @/tmp/gdm-greeter-cBlQsyRF
unix  2      [ ACC ]     STREAM     LISTENING     32728  /tmp/.ICE-unix/3103
unix  2      [ ACC ]     STREAM     LISTENING     36866  @/tmp/dbus-AcJrBlWF
unix  2      [ ACC ]     STREAM     LISTENING     20454  /tmp/mysql.sock

3.8  显示所有端口的统计信息 netstat -s

[root@zhz jiehun]# netstat -s
Ip:
    1943780 total packets received
    2 forwarded
    0 incoming packets discarded
    1769532 incoming packets delivered
    1121573 requests sent out
    132 outgoing packets dropped
    45867 dropped because of missing route
Tcp:
    64002 active connections openings
    7632 passive connection openings
    2309 failed connection attempts
    498 connection resets received
    8 connections established
    1018564 segments received
    1022700 segments send out
    16835 segments retransmited
    2 bad segments received.
    552 resets sent
Udp:
    133420 packets received
    7845 packets to unknown port received.
    0 packet receive errors
    74841 packets sent
    0 receive buffer errors
    0 send buffer errors

3.9 显示所有tcp(netstat -st)或udp(netstat -su)的统计信息

[root@zhz jiehun]# netstat -su
IcmpMsg:
    InType0: 11
    InType3: 13506
    OutType3: 13679
    OutType8: 11
Udp:
    133462 packets received
    7869 packets to unknown port received.
    0 packet receive errors
    74888 packets sent
    0 receive buffer errors
    0 send buffer errors
UdpLite:
IpExt:
    InNoRoutes: 991
    InMcastPkts: 24308
    OutMcastPkts: 2353
    InBcastPkts: 630615
    OutBcastPkts: 1546
    InOctets: 755319900
    OutOctets: 296705252
    InMcastOctets: 2908748
    OutMcastOctets: 93173
    InBcastOctets: 99500419
    OutBcastOctets: 299980

3.10 显示pid/进程名称 netstat -p   -p可以与其他参数一起使用 比如 显示tcp的进程id信息

[root@zhz jiehun]# netstat -pt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 192.168.0.52:44784          123.150.49.20:http          FIN_WAIT2   4207/VirtualBox     
tcp        0      0 192.168.0.52:46715          ie-in-f125.1e100.net:https  ESTABLISHED 4207/VirtualBox     
tcp        0      0 192.168.0.52:43415          geotrust-ocsp-mtv.veri:http FIN_WAIT2   4207/VirtualBox

3.11  在 netstat 输出中不显示主机,端口和用户名 (host, port or user)当你不想让主机,端口和用户名显示,使用 netstat -n。将会使用数字代替那些名称。同样可以加速输出,因为不用进行比对查询。netstat -nltp  显示tcp的监听端口 不显示主机端口用户名 用数字代替

[root@zhz jiehun]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      971/rpcbind         
tcp        0      0 0.0.0.0:8080                0.0.0.0:*                   LISTEN      1526/nginx: master  
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      1526/nginx: master  
tcp        0      0 192.168.122.1:53            0.0.0.0:*                   LISTEN      1248/dnsmasq        
tcp        0      0 127.0.0.1:8086              0.0.0.0:*                   LISTEN      1553/python         
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1163/sshd           
tcp        0      0 127.0.0.1:8087              0.0.0.0:*                   LISTEN      1553/python         
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1140/cupsd          
tcp        0      0 0.0.0.0:44343               0.0.0.0:*                   LISTEN      1151/rpc.statd      
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      18573/sendmail: acc 
tcp        0      0 127.0.0.1:3002              0.0.0.0:*                   LISTEN      1004/ruby           
tcp        0      0 0.0.0.0:8000                0.0.0.0:*                   LISTEN      1526/nginx: master

个人最常用就是这个

3.12  一秒钟输出一次tcp监听端口信息 netstat -ntplc

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      971/rpcbind         
tcp        0      0 0.0.0.0:8080                0.0.0.0:*                   LISTEN      1526/nginx: master  
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      1526/nginx: master  
tcp        0      0 192.168.122.1:53            0.0.0.0:*                   LISTEN      1248/dnsmasq        
tcp        0      0 127.0.0.1:8086              0.0.0.0:*                   LISTEN      1553/python         
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1163/sshd

3.13  显示路由信息 netstat -r

[root@zhz jiehun]# netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         vrouter         0.0.0.0         UG        0 0          0 eth0
192.168.0.0     *               255.255.255.0   U         0 0          0 eth0
192.168.122.0   *               255.255.255.0   U         0 0          0 virb

3.14 显示网络接口列表 netstat -i

[root@zhz jiehun]# netstat -i
Kernel Interface table
Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500   0  4943885      0      0      0   901773      0      0      0 BMRU
lo        16436   0   236931      0      0      0   236931      0      0      0 LRU
virbr0     1500   0        0      0      0      0        0      0      0      0 BMU

 

 

Centos7 gnome3

Desktop-Install-to-Hard-Drive
CentOS 7的gnome桌面版现在使用的是Gnome 3,支持触屏。
gnome-3-Desktop
也可调成像经典Gnome 2样式。
gnome-classic
感觉比Ubuntu Unity要帅吖。

mac os x10.9.2安装pycurl

vi ~/.bash_profile
export PYCURL_CURL_CONFIG=/usr/bin/curl-config
export PYCURL_SSL_LIBRARY=openssl

$pip install pycurl

出现warning:

src/pycurl.h:152:5: warning: "libcurl was compiled with SSL support, but configure could not determine which "      "library was used; thus no SSL crypto locking callbacks will be set, which may "      "cause random crashes on SSL requests" [-W#warnings]
    #   warning \
        ^
    1 warning generated.

运行后出现

pycurl: libcurl link-time ssl backend (none/other) is different from compile-time ssl backend (openssl)

貌似和apple把curl库的openssl替换为SecureTransport有关,资料

$curl --version
$curl 7.30.0 (x86_64-apple-darwin13.0) libcurl/7.30.0 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp 
Features: AsynchDNS GSS-Negotiate IPv6 Largefile NTLM NTLM_WB SSL libz

还没找到解决方法啊,头疼

如果安装后出现

Fatal Python error: pycurl: libcurl link-time version is older than compile-time version

之类错误的话,应该就是你自己装了curl和mac自带的curl冲突了,导致编译和运行时加载的类库不一致,我自己安装的curl-7.33.0在/usr/local/bin下,而系统自带的7.30。0在/usr/bin

linode vps之centos 6.5配置pptp

之前参考Linode官方文档配置OpenVPN了,但是在Mac上老是连不上,决定改用PPTP试下。

PPTP依赖iptables、ppp、pptpd

1.安装iptables,如果已装跳过

yum install -y iptables

2.安装ppp

yum install -y ppp

3.安装pptpd
先安装epel源,如果已装跳过

rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

然后

yum install -y pptpd

4.编辑/etc/pptpd.conf

#localip 192.168.0.1
#remoteip 192.168.0.234-238,192.168.0.245

修改成

localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245

5.编辑/etc/ppp/options.pptpd

#ms-dns 10.0.0.1
#ms-dns 10.0.0.2

改成

ms-dns 8.8.8.8
ms-dns 8.8.4.4

这里使用的是Google发布的Public DNS,您也可以修改为OpenDNS的IP,即

ms-dns 208.67.222.222
ms-dns 208.67.220.220

6.编辑/etc/ppp/chap-secrets添加pptp的用户名和密码

打开后只有两行,而且一个账号都没有

# Secrets for authentication using CHAP
# client server secret IP addresses

根据您的需要添加账号,每行一个,另一行添加
按照:“用户名 pptpd 密码 ip地址”的格式输入,每一项之间用空格分开,例如:

yongyao1 pptpd 1234 *
yongyao2 pptpd 1234 *

7.修改内核设置,使其支持转发

编辑/etc/sysctl.conf

net.ipv4.ip_forward=0

改为

net.ipv4.ip_forward=1

执行以下命令使修改后的内核生效

sysctl –p

8.添加iptables转发规则

(1)适合于OpenVZ架构的VPS,12.34.56.78为您VPS的公网IP地址

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT –to-source 12.34.56.78

(2)适合于XEN架构的VPS

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

以上两条命令分别对应OpenVZ架构和XEN架构的VPS,您的VPS是什么架构需要询问供应商。Linode采用的是XEN架构,所以输入

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

保存,并重启iptables

service iptables save
service iptables restart

回报一下错

Setting chains to policy ACCEPT: security raw nat [FAILED] filter

这个出错信息可以忽略,想消除可以自行搜索解决。

9.启动pptp服务

service pptpd start

WordPress修改Google Fonts引用

装个插件Useso take over Google就好了,不用那么粗暴去改wordpress核心代码。
useso已经停止运营,这个插件也响应的更新了。
真好,墙裂推荐。