Monday, May 30, 2016

Error:(3) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse'.

Error:(3) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Inverse'.


因为你的  build tool 的版本和 Compile 版本不匹配


错误的原因是因为   之前我把
compileSdkVersion 21

正确的配置方案:

compileSdkVersion 23

buildToolsVersion “23.0.2”

别人的选择我们无法左右,我们只是提供一次选择而已

这两天,一哥们想换工作。

然后,我挺上心的去给他做铺垫。昨天,跟他聊了一晚上,但是,似乎并没有得到什么承诺。似乎是挑担子一头热乎,然并卵呀。哈哈,很多的时候,我们能够提供的只有建议,我们给不了太多的东西。我把自己能做的都做了,至于其他的事情,我并不在乎。

他来与不来,跟我的关系并不大。来了之后也许会有各种事情。其实,在老总的心里面,还是喜欢加班的,就算老总岁上说不希望加班。但是,很多的时候为了工作的进度,我们还是加班了。这个东西,不是我们能够说了算的!

是的,很多的时候,事情的发展往往是向自己希望的反方向的发展的。因为,这是一个熵增的世界。当你的希望确定了,只有一个点,但是,事情的发展可能会有很多的方向!

好好的提高自己的实力和技巧吧,其他的事情,就不用这么的费劲了,感觉并没有什么卵用。

自己好才是真的好!

有些事情,尽力就好了,不用想太多了,根本没有卵用!

加油吧,这个世界,总是在不断的然自己变得更强!

Sunday, May 29, 2016

Gradle之多版本打包不同依赖配置

一、构建变体

1. BuildType

1.1默认buildType
buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
// release版本中设置了开启混淆,并且定义了混淆文件的位置
默认情况下还有一个debug版本,我们也可以添加对debug版本的一些设置
buildTypes {
    debug {
        minifyEnabled false
    }
}
// debug版本中关闭混淆
1.2自定义buildType
除了默认的构建版本,还可以创建自己的构建版本
buildTypes {
    custom.initWith(buildTypes.debug)
    custom {
        applicationIdSuffix  ".custom"
        versionNameSuffix  "-custom"    }}
// custom使用initWith方法复制debug版本并创建了一个新的构建版本,相当于继承了debug版本
// custom版本中添加applicationId后缀,添加versionName后缀
其他属性的设置可以查看buildType的文档。

2. ProductFlavor

productFlavor用来为app创建不同的版本,如:免费版和付费版、不同应用市场的渠道包等。
创建方式:
android {
    productFlavors {
        free { // 免费版
        }
        paid { // 付费版
        }
        wandoujia { // 豌豆荚应用市场渠道包
        }
        myapp { // 应用宝应用市场渠道包
        }
    }
}
每一个生产版本都可以设置applicationId、versionCode、versionName等许多属性,具体可以查看productFlavors的文档。

3. BuildVariant

buildType和productFlavor相结合,组成了构建变体。每创建一个buildType或productFlavor,都会同时创建相应的变体。例如:创建一个myapp的productFlavor时,将会创建出两个相应的变体:myappDebug和myappRelease。

二、依赖管理

依赖管理的具体细节这里不多说明,想要详细了解的可以查看依赖管理的文档。

1. 添加依赖

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.2.1'
}

2. 依赖配置

Gradle中的依赖会以配置(configurations)分组,一个配置就是一组依赖,称之为依赖配置
android插件定义了一些标准的配置,如:
  • compile:编译项目代码所需要的依赖。
  • debugCompile:debug版本编译项目代码所需要的依赖,对应buildTypes中的debug。默认情况下,包含了编译时产生的类文件,以及编译时期所需要的依赖。
  • releaseCompile:release版本编译项目代码所需要的依赖,对应buildType中的release。默认情况下,包含了编译时产生的类文件,以及编译时期所需要的依赖。
  • testCompile:编译测试代码时所需要的依赖。默认情况下,包含了编译时产生的类文件,以及编译时期所需要的依赖。
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.3.0'
    testCompile 'junit:junit:4.12'
}

三、多版本不同依赖配置

1. 需求

接入广告是目前许多APP的盈利方式,但是随着不同平台的的广告SDK越来越多,各大应用市场也开始加强这方面的监管了,有的应用市场禁止接入广告SDK,有的应用市场则要求只能接入特定的广告SDK,所以就需要针对不同市场生成含有不同广告SDK的应用版本。

2. 实现

2.1 原理
  • 每创建一个BuildType就会自动创建一个基于它名字的编译依赖配置<buildType>Compile
  • 每创建一个ProductFlavor就会自动创建一个基于它名字的编译依赖配置<productFlavor>Compile
  • 所以利用这个特点,可以为不同的版本设置不同的依赖配置。
2.2 依赖配置语法说明
  • 依赖jar文件
dependencies{
    // 依赖某个jar文件
    complie files('libs/xxx.jar') 
    // 依赖libs目录下所有以.jar结尾的文件
    complie fileTree(dir: 'libs', include: ['*.jar']) 
    // 依赖libs目录下除了xxx.jar以外的所有以.jar结尾的文件
    complie fileTree(dir: 'libs', exclude: ['xxx.jar'], include: ['*.jar']) 
}
  • 依赖module
dependencies{
    // 依赖本地项目工程下的某个module
    complie project(:'moduleName')
}
  • 依赖aar文件
android {
    repositories {
        flatDir {
            dirs 'libs'
        }
    }
}
dependencies{
    // 依赖名字为xxx后缀为aar的文件
    compile (name: 'xxx', ext: 'aar')
}
  • 依赖远程库
dependencies{
    // 格式为:group:name:version
    compile 'com.android.support:appcompat-v7:23.3.0'
    // 排除某个传递依赖
    compile 'com.android.support:appcompat-v7:23.3.0'{
        exclude group: 'xxx', module: 'xxx'
}
2.3 依赖jar包实现不同依赖
默认不依赖任何广告sdk
在build.gradle中添加ProductFlavor,如下:
android {
    productFlavors {
        baidu { // 百度应用市场
        }
        lenovo { // 联想应用市场
        }
        common { // 其他不监管广告市场
        }
    }
}
将所有广告sdk的jar包统一添加前缀"ad_",在build.gradle中的dependencies下添加
dependencies{
    // 默认不添加广告sdk
    compile fileTree(dir: 'libs', excludes: ['ad_*.jar'], include: ['*.jar'])
    // 百度市场添加百度广告sdk
    baiduCompile files(libs/ad_baidu_sdk.jar)
    // 联想应用市场的包添加联想广告sdk
    lenovoCompile files(libs/ad_lenovo_sdk.jar)
    // 其他不监管广告应用市场添加通用的广告sdk
    commonCompile files(libs/ad_common_sdk.jar)
}
配置完成后运行gradle assembleRelease命令,就会生成各个市场的渠道包,并且含有不用的广告sdk。
2.4 依赖远程库实现不同依赖
  • 方法一:默认不依赖任何广告sdk
    在build.gradle中添加ProductFlavor,如下:
android {
    productFlavors {
        baidu { // 百度应用市场
        }
        lenovo { // 联想应用市场
        }
        common { // 其他不监管广告市场
        }
    }
}
在build.gradle中的dependencies下添加
dependencies{
    // 百度市场添加百度广告sdk
    baiduCompile "com.baidu:ad:1.0.0"
    // 联想应用市场的包添加联想广告sdk
    lenovoCompile "com.lenovo:ad:1.0.0"
    // 其他不监管广告应用市场添加通用的广告sdk
    commonCompile "com.common:ad:1.0.0"
}
  • 方法二:默认依赖通用广告sdk
    在build.gradle中添加ProductFlavor,如下:
android {
    productFlavors {
        baidu { // 百度应用市场
        }
        lenovo { // 联想应用市场
        }
        huawei { // 华为应用市场
        }
    }
}
在build.gradle中的dependencies下添加
dependencies{
    // 默认添加通用广告sdk
    compile "com.common:ad:1.0.0"
    // 百度市场在默认的compile中去掉通用广告sdk
    baiduCompile configurations.compile {
        exclude(group: "com.common:ad:1.0.0", module: "ad")
    }
    // 百度市场添加百度广告sdk
    baiduCompile "com.baidu:ad:1.0.0"
    // 联想市场在默认的compile中去掉通用广告sdk
    baiduCompile configurations.compile {
        exclude(group: "com.common:ad:1.0.0", module: "ad")
    }
    // 联想应用市场的包添加联想广告sdk
    lenovoCompile "com.lenovo:ad:1.0.0"
    // 华为市场在默认的compile中去掉通用广告sdk
    baiduCompile configurations.compile {
        exclude(group: "com.common:ad:1.0.0", module: "ad")
    }
}



Error: More than one library with package name ""

问题描述:
我不喜欢用 Actionbar 所以自定义一个ChowTitleBar, 本来放在项目中没有任何的问题,但是现在公司要求,要做好几个项目(定制软件,也叫外包)所以,我就将ChowTitleBar 提取出来作为一个第三方的库,但是,不同的项目中的色值是不同的,我就用 Gradle 的productFaver 解决色值的问题。针对不同的项目创建不同的ChowTitleBar, 然后在项目中引用。





error:
code:
compile 'com.chow.ui:mlw:1.1.2-release'compile 'com.chow.ui:gjb:1.1.2-release'compile 'com.chow.ui:xjlh:1.1.2-release'

出现错误的原因,是因为每一个远程的依赖仓库里面,都有一个 com.chow.ui.chowtitlebar 导致了gradle 编译代码的时候的二义性。 编辑器根本不知道你要用哪个?

我想了一些实现的方法,根本没什么卵用:
1  我想讲 com.chow.ui.chowtitlebar 抽取核心出来,然后创建多个  子项目 去继承com.chow.ui.chowtitlebar, 然后 compile 子项目,但是 也会出现这种问题。

2  然后,我想在 公司项目里面去做 com.chow.ui.chowtitlebar 的继承,在不同的productFaver 中实现不同的子类,但是有一个问题,就是色值的问题,我无法改变 lib 库中的色值!

以上的方案都不行:

然后,我想能不能再 build.gradle 里面去 有选择的依赖库的信息呢?我只想依赖一部分的 代码,而不是全部,搜了一下资料。貌似不行!  但是可以排除一些代码,我忘记了,你可以搜一下:

解决方案:
mlwCompile 'com.chow.ui:mlw:1.1.2-release'xjlhCompile 'com.chow.ui:gjb:1.1.2-release'gjbCompile 'com.chow.ui:xjlh:1.1.2-release'


原理:
每创建一个ProductFlavor就会自动创建一个基于它名字的编译依赖配置<productFlavor>Compile








屌屌的,再次感谢作者:  zly394
http://www.jianshu.com/users/56b93d979576/latest_articles







感谢:

Gradle之多版本打包不同依赖配置

http://www.jianshu.com/p/9b50c4059d61






为什么五年的工作经验的程序员不如两年的薪水高呢?

人的成功,关乎很多的方面。

选择,机遇,个人的勤奋,大的社会背景环境等等

但是,为什么一个五年的经验的PHP 还不如一个两年PHP 经验的孩子呢?

闻道有先后,术业有专攻。

是的,技术的高低跟年龄似乎没有什么必然的联系。因为,取决的因素有很多的,自己的智商的水品,自己的逆商,自己的对于技术的追求的程度。是的,得过且过,很多的时候,我呢的项目只要是能跑就可以了,因为老板根本看不出来你的优化程度的。你的代码在老板的心里面永远是非常的整洁的,可重用的,可扩展的,可维护的,灵活的,其实只有作为程序员的我,才知道里面的坑到底有多少。很多的地方都是为了赶进度,马马虎虎的完成了。就是这样子的。很多的时候,我们的都是为了完成工作。工作毕竟只是为了赚钱,其他的事情,我们并没有更多的追求,这也许就是,开始的工资都差不多,但是,等了3到5年之后,我们的工资的差距就拉开了!

当你写完代码之后,有没有更深的学习? 有没有问一下自己这一块,自己学到了什么? 因为自己的知识面的局限性,有没有更好的实现方式呢? 怎么样可以效率的更高的实现呢?

很多的问题,在我们面前,但是,我们根本没有时间来处理这些问题!我们,有时间的时候可能回去学点自己的想学的技术,但是对于公司的代码,我们没有一点兴趣的,我们所需要做的就是让自己的生活更好的。自己的代码,跟多人是根本没有追求的,根本没有往哪方面想过的。

时间久了,差距自然就出来了!

闻道有先后 术业有专攻


Thursday, May 26, 2016

感觉自己成长了

真的感觉自己成长了,现在自己思考的时间多了。瞎鸡巴写的时间少了。
当遇到问题的时候,不要老是推脱,而是想怎么实现他们。就是这样子的,在之前思考总比越到问题在去做处理的,花费的代价要小的多呀,不是吗?
我喜欢,自己很多的事情,在自己的把控之内的样子。其他的都还好了。生活很多的时候,并不是自己想的样子。

很早之前,拿到需求之后的第一直觉就是: 赶紧的完成,然后看着需求,然后瞎鸡巴写。写了之后,各种问题出现了,各种问题,花费了好多的时间!

三思而行

Wednesday, May 25, 2016

Git 使用的小技巧


官方教程:


git 小技巧

分支合并

快速合并
git merge branchName

创建新的节分 合并

git merge --no-ff dev -m "@Hades merge dev"

git merge --no-ff dev -m "@Hades merge devHades"



刷新分支信息:
git fetch -p origin
git push [远程名] :[分支名]
$ git push origin :serverfix

git push [远程名] [本地分支]:[远程分支]


删除远程分支和tag

在Git v1.7.0 之后,可以使用这种语法删除远程分支:
git push origin --delete <branchName>





git push origin --delete release error: unable to delete 'release': remote ref does not exist


You just input in the command:


git fetch -p origin





Thanks to:

http://stackoverflow.com/questions/10292480/when-deleting-remote-git-branch-error-unable-to-push-to-unqualified-destinatio

Git查看、删除、重命名远程分支和tag

这篇文章记录我在使用git的过程中碰到远程分支和tag的相关内容,提纲:
  1. 查看远程分支
  2. 删除远程分支和tag
  3. 删除不存在对应远程分支的本地分支
  4. 重命名远程分支
  5. 把本地tag推送到远程
  6. 获取远程tag

查看远程分支

加上-a参数可以查看远程分支,远程分支会用红色表示出来(如果你开了颜色支持的话):
$ git branch -a
  master
  remote
  tungway
  v1.52
* zrong
  remotes/origin/master
  remotes/origin/tungway
  remotes/origin/v1.52
  remotes/origin/zrong

删除远程分支和tag

在Git v1.7.0 之后,可以使用这种语法删除远程分支:
$ git push origin --delete <branchName>
删除tag这么用:
git push origin --delete tag <tagname>
否则,可以使用这种语法,推送一个空分支到远程分支,其实就相当于删除远程分支:
git push origin :<branchName>
这是删除tag的方法,推送一个空tag到远程tag:
git tag -d <tagname>
git push origin :refs/tags/<tagname>
两种语法作用完全相同。

删除不存在对应远程分支的本地分支

假设这样一种情况:
  1. 我创建了本地分支b1并pull到远程分支 origin/b1
  2. 其他人在本地使用fetch或pull创建了本地的b1分支;
  3. 我删除了 origin/b1 远程分支;
  4. 其他人再次执行fetch或者pull并不会删除这个他们本地的 b1 分支,运行 git branch -a 也不能看出这个branch被删除了,如何处理?
使用下面的代码查看b1的状态:
$ git remote show origin
* remote origin
  Fetch URL: git@github.com:xxx/xxx.git
  Push  URL: git@github.com:xxx/xxx.git
  HEAD branch: master
  Remote branches:
    master                 tracked
    refs/remotes/origin/b1 stale (use 'git remote prune' to remove)
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)
这时候能够看到b1是stale的,使用 git remote prune origin 可以将其从本地版本库中去除。
更简单的方法是使用这个命令,它在fetch之后删除掉没有与远程分支对应的本地分支:
git fetch -p

重命名远程分支

在git中重命名远程分支,其实就是先删除远程分支,然后重命名本地分支,再重新提交一个远程分支。
例如下面的例子中,我需要把 devel 分支重命名为 develop 分支:
$ git branch -av
* devel                             752bb84 Merge pull request #158 from Gwill/devel
  master                            53b27b8 Merge pull request #138 from tdlrobin/master
  zrong                             2ae98d8 modify CCFileUtils, export getFileData
  remotes/origin/HEAD               -> origin/master
  remotes/origin/add_build_script   d4a8c4f Merge branch 'master' into add_build_script
  remotes/origin/devel              752bb84 Merge pull request #158 from Gwill/devel
  remotes/origin/devel_qt51         62208f1 update .gitignore
  remotes/origin/master             53b27b8 Merge pull request #138 from tdlrobin/master
  remotes/origin/zrong              2ae98d8 modify CCFileUtils, export getFileData
删除远程分支:
$ git push --delete origin devel
To git@github.com:zrong/quick-cocos2d-x.git
 - [deleted]         devel
重命名本地分支: 
git branch -m devel develop
推送本地分支:
$ git push origin develop
Counting objects: 92, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (48/48), done.
Writing objects: 100% (58/58), 1.38 MiB, done.
Total 58 (delta 34), reused 12 (delta 5)
To git@github.com:zrong/quick-cocos2d-x.git
 * [new branch]      develop -> develop
然而,在 github 上操作的时候,我在删除远程分支时碰到这个错误:
$ git push --delete origin devel
remote: error: refusing to delete the current branch: refs/heads/devel
To git@github.com:zrong/quick-cocos2d-x.git
 ! [remote rejected] devel (deletion of the current branch prohibited)
error: failed to push some refs to 'git@github.com:zrong/quick-cocos2d-x.git'
这是由于在 github 中,devel 是项目的默认分支。要解决此问题,这样操作:
  1. 进入 github 中该项目的 Settings 页面;
  2. 设置 Default Branch 为其他的分支(例如 master);
  3. 重新执行删除远程分支命令。

把本地tag推送到远程

git push --tags

获取远程tag

git fetch origin tag <tagname>

参考文章


Thanks  To:

http://zengrong.net/post/1746.htm\

如何实现SVN 自动更新?


SVN




Thanks To:

http://my.oschina.net/HeAlvin/blog/644179

为什么当了十年的程序员还只是初级程序员?

昨天看到一篇文章,说一个干了十年的程序员还不如两年经验的程序员?

这是为什么呢?

一篇文章说到: 高级程序员 不是说看基本编程的书籍和写几万行代码就可以做到的!

高级程序员,不仅仅是靠天赋的,更重要的是后天的努力,没有人是天生就是天才的,那种人非常至少。大多数还都是普通人!


但是,什么人才能成为大神呢?

有钻研的精神的人?凡是都要问个为什么的人? 对什么事情都感到好奇的人。最重要的是有毅力的人。

为什么做了10年,还不如两年的呢?

因为十年的时间完全浪费了。时间的时间里面,他没有研究过真正底层的代码。很多东西: git  svn Mysql 仅仅是为了应付工作的需要,并不愿意花时间来研究,古人云只是虚长几岁而已, 闻道有先后,术业有专攻。 我是喜欢自己的钻研的人。很多的时候,我并不是很喜欢问别人,当然 浏览器除外。我是 非常喜欢使谷哥的孩子。 浏览器是一项伟大的发明。不亚于四大发明。

我用Git快半年的了,昨天,我才突然的顿悟。原来,我也仅仅只是会用而已。根本从来没有考虑过,他是怎么实现的,怎么进行数据存储和维护的,很多事情,我根本就没有深入的思考过的!

其实很多的时候,我们缺少的是耐心。我们更多的时间是本 Bug 和需求占用了,真的用来钻研技术的时间,我觉的是10经验的孩子,未必有那个2年经验的人花的时间多!

就是这样。


Stay  Foolish, Stay hungry!

Android 手机截屏的快捷键

Android 截屏快捷键


you have jvm property https.proxyhost set to "127.0.0.1"




我也不清为什么会出现这种问题?


我的将解决方案:

重启你的电脑  Ok

Error:Unrecognized SSL message, plaintext connection?





Caused by: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:394)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:353)
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:134)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:388)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.gradle.internal.resource.transport.http.HttpClientHelper.performHttpRequest(HttpClientHelper.java:102)
at org.gradle.internal.resource.transport.http.HttpClientHelper.executeGetOrHead(HttpClientHelper.java:79)
at org.gradle.internal.resource.transport.http.HttpClientHelper.performRequest(HttpClientHelper.java:70)
... 136 more



2016-05-25 17:11:17,633 [2153106]   WARN - radle.project.ProjectSetUpTask -
2016-05-25 17:11:17,633 [2153106]   INFO - radle.project.ProjectSetUpTask - Unrecognized SSL message, plaintext connection?

Consult IDE log for more details (Help | Show Log)
2016-05-25 17:11:17,633 [2153106]   INFO - ls.idea.gradle.GradleSyncState - Sync with Gradle for project 'AvengerAgent' failed: Unrecognized SSL message, plaintext connection?



解决方案:


Maybe the  gradle version  has somequesiton:

I use  gradle-2.11-all.zip  have this question

So I use this:



distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-rc-1-all.zip


OK















Who are you?

No one know you!

我只欣赏 别我牛逼的孩子。我要尽力的去超越这些孩子们,是的! 你他妈的有什么牛逼的,不就一个写逻辑的吗?有什么了不起的? 话说回来,话说我呢?我有什么牛逼的?不就是一个显示数据的,有什么牛逼的。的确是,我感觉不到牛逼的地方。是的,我追求的是技术的提高,而不是  只是表面的现象!


追求自己的内心的成功,其他的都只不过是过眼云烟!

丝毫感觉不到,任何的牛逼之处的时候,尽量的沉下来。让自己沉下来。思考自己真的需要是什么?技术的追求,技术的更新是很快的。我是IT 的弄潮儿。其他的我并不在乎,我不是什么大神。但是,成为大神是我一直以来的梦想!

Tuesday, May 24, 2016

GFW 防火墙的原理

Great Firewall的技术原理


防火长城,也称中国防火墙或中国国家防火墙,指中华人民共和国政府在其管辖互联网内部建立的多套网络审查系统的总称,包括相关行政审查系统。其英文名称为Great Firewall of China(与长城 Great Wall 相谐的效果),简写为Great Firewall,缩写GFW。

一般情况下防火长城主要指中国对互联网内容进行自动审查和过滤监控、由计算机路由器等网络设备所构成的软硬件系统。由于中国网络审查较为完备,中国国内的不合适网站会直接行政干预和关闭,故防火长城主要作用在于对中国境内外的网络资讯互相访问进行分析、过滤、阻断。


域名劫持
域名解析(DNS)的基本原理是把网络地址(域名,以一个字符串的形式,比如 http://www.google.com)对应到真实的计算机能够识别的网络地址(IP地址,比如216.239.53.99 这样的形式),以便计算机能够进一步通信,传递网址和内容等。

由于域名劫持往往只能在特定的被劫持的网络范围内进行,所以在此范围外的域名服务器(DNS)能够返回正常的IP地址,高级用户可以在网络设置把DNS指向这些正常的域名服务器以实现对网址的正常访问。所以域名劫持通常相伴的措施——封锁正常DNS的IP。

如果知道该域名的真实IP地址,则可以直接用此IP代替域名后进行访问。比如访问http://163.com/ ,可以把访问改为http://220.181.29.154/ ,从而绕开域名劫持(虚拟主机不能简单如此配置)。

2002年左右,中国大陆开始采用域名劫持手段,他们用路由器提供的IDS监测系统来进行域名劫持,防止了人们访问被过滤的网站。同时,为了防止高级用户自己直接使用有正常功能的境外的域名服务器,中国大陆也开始不断地封锁海外的DNS服务器,已经封锁了几百个北美的DNS服务器。



国家入口网关的IP封锁
从90年代初期,中国大陆只有教育网、高能所和公用数据网3个国家级网关出口,中国政府对认为具有颠覆性质的站点进行IP封锁,这是有效的封锁手段。对于IP封锁,用普通Proxy技术就可以绕过。只要找到一个普通的海外
Proxy,然后通过Proxy就可以浏览自己平时看不到的资讯了。所以,网络封锁部门现在通常会将中国政府认为特别敏感的网站的网址加入关键字过滤系统,以防止民众透过普通海外http代理服务器突破。

一般情况下,GFW对于海外“非法”网站会采取独立IP封锁技术。然而,部分“非法”网站使用的是由虚拟主机服务提供商提供的多域名、单(同)IP 的主机托管服务,这就会造成了封禁某个IP,就会造成所有使用该服务提供商服务的其他使用相同IP的网站用户一同遭殃,就算是内容健康、正当的网站,也不能幸免。由于许多大陆地区的网站主机服务器地址位于海外,GFW同样对大部分海外服务商的IP进行封锁。


主干路由器关键字过滤阻断

2002年,中国大陆研发了一套系统,并规定各个因特网服务提供商必须使用。思科等公司的高级路由设备帮助中国大陆实现了关键字过滤,最主要的就是IDS(Intrusion Detection System)— 入侵检测系统[3]。它能够从计算机网络系统中的关键点(如国家级网关)收集分析信息,过滤、嗅探指定的关键字,并进行智能识别,检查网络中是否有违反安全策略的行为。利用这些设备主要进行IP数据包内容的过滤,如果符合既定的规则,则向该连接两端的计算机发送IP欺骗性质(从前后IP报头TTL值相差较大可知)的RST复位包,干扰两者间正常的TCP连接,使数据流中断,而在终端主机上会显示连接失败。从目前已知的情况看,这种关键字过滤技术只对TCP连接(且只针对HTTP报头)有效,对UDP及其他第四层协议无效,对明文数据有效,对加密数据无效。不同的IDS甚至有可能在一段预定或随机的时间内试图阻止从用户主机发出的所有通信。

所以在访问境外网站时,如果数据流里敏感字符时,即会立即被提示“该页无法显示”或网页开启一些后突然停止,随后在1-3分钟的时间内无法用同一 IP浏览此域名或IP地址上的内容,屏蔽时间据猜测和敏感词等级以及所属网站有关。此种过滤是双向的,也就是说,国内含有关键词的网站在国外不可访问(如在百度搜索一塌糊涂BBS),国外含有关键词的网站在国内不可访问。(Google.cn除外,原因是国外DNS服务器会将此域名同样指向美国的Google服务器)。

被屏蔽过滤的关键词主要是法轮功、民运、人权、钓鱼岛、七一游行、天安门事件、六四事件、赵紫阳、屠杀、无界浏览、游行示威、边疆独立、部分国家领导人姓名、境外媒体、色情、破网软件等字眼上,最近更将”zh.wikipedia.org”维基百科中文网的网址也列入了屏蔽关键词中,故导致无论使用什么类型或网址的代理服务器都不能正常登入维基中文版。
不过,GFW对于网页中含有的关键字字符并不是100%可以过滤成功,即使某些网页被成功拦截并导致“该页无法显示”,此时只要在浏览器进行多番刷新就有机会显示出来。而且,GFW还会偶尔出现故障而导致关键字过滤系统失效,此时部分只被网址关键字过滤的网站就能正常使用(如 my.opera.com)。
对于google.com的查询返回结果有报道称是专门过滤的,即GFW针对google.com返回结果中的网页地址进行过滤,对关键字的过滤并不严格。而google.cn对返回结果的过滤仅只是对网页网址的,这就说明对于google.com返回的大量网页,中国网络审查更经济而有效的方法便是像前面所说的一样,而且事实上对于google.com的审查也正是如此。
从GFW的分布来看,审查过滤系统主要位于国际出口处,但最近通过对审查过滤系统返回的RST复位包IP头进行(TTL值)分析,发现存在两个欺骗源,其一位于国际出口处,另一个位于骨干网省级接入处。因此推测GFW对于境内的非法内容也具有一定审查能力。值得提到的是,对于境内网络内容的审查主要是通过ICP备案来实现的。

从2007年2 月前后,GFW开始对境外及境内的Wap网站含有的敏感字符进行过滤,原本在移动版Google可以打开的维基百科中文版现已不能通过Google网页转换功能进行访问,连带的就是在访问含有“zh.wikipedia.org”的Google链接后,5分钟内再次访问Google被阻断。2007年2月8日后,原本可以通过Google.cn移动版访问维基百科的方法也证实失败。估计原因是中国移动在GPRS网关处也安装了一台GFW设备。

越来越慢的网速





The Internet  is slow more!  I don't know why? just someone say: I will change the internet to be better! So many man start to build a great fire wall to block human to freedom. I don't understand why?If they have time, You can make the internet to more fast. Do you know the internet how so slow, Just like the snails moving in the land! I hate this. 

The internet speed is more slow than before! I don't know  how they do ?  I think Good job for you. but for many people I think it is not good!

How could to be better?
How to be faster?
How to be Freedom?



ssh: connect to host IP port 22: Connection refused

一般我们自己买的VPS, 会把端口22 给禁掉,因为他特别容易受到攻击!

但是,我们在用git clone 代码的时候,会出现这种问题

╰─$ git clone hades@IP:/home/hades/kernelCode.git        128 ↵
Cloning into 'kernelCode'...
ssh: connect to host IP port 22: Connection refused
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.


ssh  默认访问 22 端口

所以我们git  clone  set port 

you can do it like this:

git clone ssh://git@IP:port/home/hades/kernelCode.git


Thanks To:







Thursday, May 19, 2016

My travel to yantai

I miss you very much! I think I like this world so much. Today, It seem like that everything to look very well!I love it very much, Just do it!

when you are young. You must do it. Or  When you are old. you have no time to do it! Do you know, Don't when you old man, You are alone stay home to crying for that: when you are young, you can not go there , where you want to go!

What do you want to get? Just that you want to get, That is all. what do you live for what?  house   car  money  women or child?  That is not you. Who are you, What do you want to get?

Everyone love this world. But I live it more. I love the beautiful things, Anytings about it!

Don't thinking it will going good. Don't tking so. Just enjoy yourself! Just so so!  I love this world and beautiful things!

CentOS How to open the port in the Server!

  How open a new Port on the VPS!



you can use:

sudo iptables -I INPUT -p tcp -m tcp --dport 38088 -j ACCEPT

but you must know:




所以开放的配置放到红圈里2个规则上面

那2个规则会把上面没匹配的连接全拒绝掉

Error:Unrecognized SSL message, plaintext connection??



Thanks TO:http://stackoverflow.com/questions/6532273/unrecognized-ssl-message-plaintext-connection-exception



How to look cents iptables?

查看可以访问的接口

https://www.digitalocean.com/community/tutorials/how-to-list-and-delete-iptables-firewall-rules

how to config  firewall iptanels:
http://ask.xmodulo.com/open-port-firewall-centos-rhel.html

Wednesday, May 18, 2016

Centos how to config JAVA_HOME

This tutorial describes how to install and configure latest Oracle Java JDK on CentOS 7, 6.5, and 6.4 servers. Although, the steps should work on other RPM based distributions such as RHEL 7, 6.x, Scientific Linux 6.x, and Fedora too.
First of all, update your server.
yum update
Then, search for if any older JDK versions are installed in your system.
rpm -qa | grep -E '^open[jre|jdk]|j[re|dk]'
Sample output:
gobject-introspection-1.36.0-4.el7.x86_64
pygobject3-base-3.8.2-4.el7.x86_64
To check the already installed Java version, enter the following command:
java -version
If Java 1.6 or 1.7 have been installed already, you can uninstall them using the following commands.
yum remove java-1.6.0-openjdk
yum remove java-1.7.0-openjdk

Download And Install Oracle Java JDK

At the time of writing this tutorial, the latest Java JDK version was JDK 8u25. First, let us download the latest Java version.
Go to the Oracle Java download page and download the required version depending upon your distribution architecture.
As I use 64bit CentOS 7 server, I have downloaded the 64bit rpm package.
Then, go to the directory where you’ve downloaded the jdk package, and run the following command to install it.
rpm -ivh jdk-8u25-linux-x64.rpm
Sample output:
Preparing...                          ################################# [100%]
Updating / installing...
   1:jdk1.8.0_25-2000:1.8.0_25-fcs    ################################# [100%]
Unpacking JAR files...
    rt.jar...
    jsse.jar...
    charsets.jar...
    tools.jar...
    localedata.jar...
    jfxrt.jar...

Check Java version

Now, check for the installed JDK version in your system using command:
java -version
Sample output:
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)
As you see above, latest java 1.8 has been installed.

Setup Global Environment Variables

We can easily set the environment variables using the export command as shown below.
export JAVA_HOME=/usr/java/jdk1.8.0_25/
export PATH=$PATH:$JAVA_HOME
Now, let us check for the environment variables using commands:
echo $JAVA_HOME
Sample output:
/usr/java/jdk1.8.0_25/
Or
echo $PATH
Sample output:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/java/jdk1.8.0_25/
However, the above method is not recommended. Because, the path will be disappeared when the system reboots. To make it permanent, you have to add the paths in the system wide profile.
To do that, create a file called java.sh under /etc/profile.d/ directory.
vi /etc/profile.d/java.sh
Add the following lines:
#!/bin/bash
JAVA_HOME=/usr/java/jdk1.8.0_25/
PATH=$JAVA_HOME/bin:$PATH
export PATH JAVA_HOME
export CLASSPATH=.
Save and close the file. Make it executable using command:
chmod +x /etc/profile.d/java.sh
Then, set the environment variables permanently by running the following command:
source /etc/profile.d/java.sh
That’s it.

What if I didn’t remove the old JDK versions from my system?

As I mentioned before, make sure you have removed all old JDK versions from your system. If you didn’t remove the older versions from your server before installing latest JDK version, you should tell your system from where java should be executed.
By default, the JDK 1.8.x will be installed in /usr/java/jdk1.8.0_25/ location. In order to tell our system, from where java should be executed, we need to run the following commands one by one.
alternatives --install /usr/bin/java java /usr/java/jdk1.8.0_25/jre/bin/java 20000
alternatives --install /usr/bin/jar jar /usr/java/jdk1.8.0_25/bin/jar 20000
alternatives --install /usr/bin/javac javac /usr/java/jdk1.8.0_25/bin/javac 20000
alternatives --install /usr/bin/javaws javaws /usr/java/jdk1.8.0_25/jre/bin/javaws 20000
alternatives --set java /usr/java/jdk1.8.0_25/jre/bin/java
alternatives --set jar /usr/java/jdk1.8.0_25/bin/jar
alternatives --set javac /usr/java/jdk1.8.0_25/bin/javac 
alternatives --set javaws /usr/java/jdk1.8.0_25/jre/bin/javaws
All done. Let us check the alternatives.
ls -lA /etc/alternatives/
Sample output:
lrwxrwxrwx. 1 root root 29 Dec  2 16:24 jar -> /usr/java/jdk1.8.0_25/bin/jar
lrwxrwxrwx. 1 root root 34 Dec  2 16:24 java -> /usr/java/jdk1.8.0_25/jre/bin/java
lrwxrwxrwx. 1 root root 31 Dec  2 16:24 javac -> /usr/java/jdk1.8.0_25/bin/javac
lrwxrwxrwx. 1 root root 36 Dec  2 16:24 javaws -> /usr/java/jdk1.8.0_25/jre/bin/javaws
[...]
That’s it. Now check for the java version using command:
java -version
Sample output:
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)





Thanks To:
http://www.unixmen.com/install-oracle-java-jdk-8-centos-76-56-4/