paramiko使用private key SSH登陆服务器

服务端atool 发表了文章 • 0 个评论 • 126 次浏览 • 2016-08-01 15:24 • 来自相关话题

本文介绍的是使用 SSH方式通过密钥登录 服务器的方法。主要在windows上使用paramiko登陆linux服务器,分成为四步:
 
一、服务器生成rsa key
aaa@onlinegame-14-121:~/.ssh$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/aaa/.ssh/id_rsa): id_rsa_forpy
id_rsa_forpy already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa_forpy.
Your public key has been saved in id_rsa_forpy.pub.
The key fingerprint is:
27:04:9f:0b:21:73:a7:2a:cd:4e:9e:43:2a:45:c2:29 aaa@onlinegame-14-121
The key's randomart image is:
+--[ RSA 2048]----+
| o + . |
|. . + * . |
|Eo. o + |
|.o o . o . |
| o * S . |
| . B . o |
|. . |
| . . |
| |
+-----------------+其中passphrase我没有输入,这样用python登陆的时候,就可以无密码登陆了。
注意,是在你将要登陆的linux服务器上生成key。
 
二、公钥添加到authorized_keys中
[aaa@host ~]$ cd .ssh
[aaa@host .ssh]$ cat id_rsa_forpy.pub >> authorized_keys如此便完成了公钥的安装。有些时候,可能会有一些权限问题,可以执行如下:
[aaa@host .ssh]$ chmod 600 authorized_keys
[aaa@host .ssh]$ chmod 700 ~/.ssh

 三、服务器开启密钥登陆功能
 
一般情况下,服务器可能是开启,如果没有,可以做下面的操作。
编辑 /etc/ssh/sshd_config 文件,进行如下设置:
RSAAuthentication yes
PubkeyAuthentication yes修改配置文件之后,需要重启ssh
service sshd restart
四、使用paramiko登陆执行命令
 
将上述第一步生成的id_rsa_forpy(密钥)下载到windows机器上,然后用他进行代码登陆。
 
使用pip安装paramiko,然后执行代码即可。
pip install paramikoPython代码如下:
 
# -*- coding: utf-8 -*-

import paramiko
import StringIO

ip = 'xx.xx.xxx.xxx'
username = 'aaa'
port = 22

key_string = '''-----BEGIN RSA PRIVATE KEY-----
xxxxxxx
-----END RSA PRIVATE KEY-----
'''
not_really_a_file = StringIO.StringIO(key_string)
private_key = paramiko.RSAKey.from_private_key(not_really_a_file)

paramiko.util.log_to_file('ssh.log')

s = paramiko.SSHClient()

s.load_system_host_keys()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

print "Starting"
s.connect(ip, port, username, pkey=private_key)

stdin,stdout,stderr=s.exec_command('ls -lh')
print stdout.read()
s.close()

not_really_a_file.close()执行之后,就可以看到打印出aaa账户home目录的文件列表了。 查看全部
本文介绍的是使用 SSH方式通过密钥登录 服务器的方法。主要在windows上使用paramiko登陆linux服务器,分成为四步:
 
一、服务器生成rsa key
aaa@onlinegame-14-121:~/.ssh$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/aaa/.ssh/id_rsa): id_rsa_forpy
id_rsa_forpy already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa_forpy.
Your public key has been saved in id_rsa_forpy.pub.
The key fingerprint is:
27:04:9f:0b:21:73:a7:2a:cd:4e:9e:43:2a:45:c2:29 aaa@onlinegame-14-121
The key's randomart image is:
+--[ RSA 2048]----+
| o + . |
|. . + * . |
|Eo. o + |
|.o o . o . |
| o * S . |
| . B . o |
|. . |
| . . |
| |
+-----------------+
其中passphrase我没有输入,这样用python登陆的时候,就可以无密码登陆了。
注意,是在你将要登陆的linux服务器上生成key。
 
二、公钥添加到authorized_keys中
[aaa@host ~]$ cd .ssh
[aaa@host .ssh]$ cat id_rsa_forpy.pub >> authorized_keys
如此便完成了公钥的安装。有些时候,可能会有一些权限问题,可以执行如下:
[aaa@host .ssh]$ chmod 600 authorized_keys
[aaa@host .ssh]$ chmod 700 ~/.ssh

 三、服务器开启密钥登陆功能
 
一般情况下,服务器可能是开启,如果没有,可以做下面的操作。
编辑 /etc/ssh/sshd_config 文件,进行如下设置:
RSAAuthentication yes
PubkeyAuthentication yes
修改配置文件之后,需要重启ssh
service sshd restart

四、使用paramiko登陆执行命令
 
将上述第一步生成的id_rsa_forpy(密钥)下载到windows机器上,然后用他进行代码登陆。
 
使用pip安装paramiko,然后执行代码即可。
pip install paramiko
Python代码如下:
 
# -*- coding: utf-8 -*-

import paramiko
import StringIO

ip = 'xx.xx.xxx.xxx'
username = 'aaa'
port = 22

key_string = '''-----BEGIN RSA PRIVATE KEY-----
xxxxxxx
-----END RSA PRIVATE KEY-----
'''
not_really_a_file = StringIO.StringIO(key_string)
private_key = paramiko.RSAKey.from_private_key(not_really_a_file)

paramiko.util.log_to_file('ssh.log')

s = paramiko.SSHClient()

s.load_system_host_keys()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

print "Starting"
s.connect(ip, port, username, pkey=private_key)

stdin,stdout,stderr=s.exec_command('ls -lh')
print stdout.read()
s.close()

not_really_a_file.close()
执行之后,就可以看到打印出aaa账户home目录的文件列表了。

React 如何跨组件进行通信?组件和组件之间如何通信?

前端开发atool 发表了文章 • 0 个评论 • 201 次浏览 • 2016-07-15 17:04 • 来自相关话题

react最近在项目中用的很爽,不用操作js dom会方便很多;另外组件的封装,state绑定界面,爽的不要不要的。
 
但是项目中经常会遇到跨组件的通信。这个可以分成两类:
一类是父组件和子组件之见的通信;
一类是完全两个不相干的组件之前的通信,通常这两个组件是由路由(router)分割开了。
 
分别介绍一下,对于第一类:父子组件的通信,其实很容易通过子组件传递一个function类型的属性来解决,示例如下:
const Parent = React.createClass({
test_func: function(data) {
},
render: function(){
<Child funcProp={this.test_func} />
}
});

const Child = React.createClass({
propTypes: {
funcProp: React.PropTypes.func
},
componentDidUpdate: function() {
this.props.funcProp('send data to parent');
},
render: function(){
<div>child component.</div>
}
});通过子组件的 funcProp 属性方法就可以进行消息发送和通信。这种方式对于两个组件直接父子关系还比较好用,但是对于跨级的父子组件(实际上已经可以叫做爷子组件),或者评级的兄弟组件,他们之间的通信就比较麻烦了,需要传递好几层的数据。
 
这种情况我们都可以和第二类算作一起,作为跨组件的通信。我在项目中同样也遇到了,所以封装了一个简单的实现,大小才0.7kb左右,非常精简。代码为:https://github.com/hustcc/onfire.js
 
安装 npm install onfire.js
使用实例:
import onfire from 'onfire.js';

// 绑定事件
var eventObj = onfire.on('test_event', function(data) {
console.log('this is a event 1');
});
var eventObj2 = onfire.on('test_event', function(data) {
console.log('this is a event 2');
});

// 触发事件
onfire.fire('test_event', 'test_data');

// 取消绑定
onfire.un(eventObj); // 取消绑定这个事件.
onfire.un('test_event'); // 取消绑定所有的 `test_event`.

// 长度
onfire.size();当然这个库也可以直接使用script标签引入使用。
 
  查看全部
react最近在项目中用的很爽,不用操作js dom会方便很多;另外组件的封装,state绑定界面,爽的不要不要的。
 
但是项目中经常会遇到跨组件的通信。这个可以分成两类:
一类是父组件和子组件之见的通信;
一类是完全两个不相干的组件之前的通信,通常这两个组件是由路由(router)分割开了。
 
分别介绍一下,对于第一类:父子组件的通信,其实很容易通过子组件传递一个function类型的属性来解决,示例如下:
const Parent = React.createClass({
test_func: function(data) {
},
render: function(){
<Child funcProp={this.test_func} />
}
});

const Child = React.createClass({
propTypes: {
funcProp: React.PropTypes.func
},
componentDidUpdate: function() {
this.props.funcProp('send data to parent');
},
render: function(){
<div>child component.</div>
}
});
通过子组件的 funcProp 属性方法就可以进行消息发送和通信。这种方式对于两个组件直接父子关系还比较好用,但是对于跨级的父子组件(实际上已经可以叫做爷子组件),或者评级的兄弟组件,他们之间的通信就比较麻烦了,需要传递好几层的数据。
 
这种情况我们都可以和第二类算作一起,作为跨组件的通信。我在项目中同样也遇到了,所以封装了一个简单的实现,大小才0.7kb左右,非常精简。代码为:https://github.com/hustcc/onfire.js
 
安装 npm install onfire.js
使用实例:
import onfire from 'onfire.js';

// 绑定事件
var eventObj = onfire.on('test_event', function(data) {
console.log('this is a event 1');
});
var eventObj2 = onfire.on('test_event', function(data) {
console.log('this is a event 2');
});

// 触发事件
onfire.fire('test_event', 'test_data');

// 取消绑定
onfire.un(eventObj); // 取消绑定这个事件.
onfire.un('test_event'); // 取消绑定所有的 `test_event`.

// 长度
onfire.size();
当然这个库也可以直接使用script标签引入使用。
 
 

百度Echart 3.0的react封装

前端开发atool 发表了文章 • 0 个评论 • 486 次浏览 • 2016-06-12 18:59 • 来自相关话题

github项目地址:https://github.com/hustcc/echarts-for-react
DEMO地址:http://git.hust.cc/echarts-for-react/#/?_k=l9a9ca
 
使用非常简单
一、安装npm install echarts-for-react
二、引入使用import React from 'react';
import ReactEcharts from 'echarts-for-react';

<ReactEcharts
option={this.getOtion()}
style={{height: '300px'}}
theme={"theme_name"}
onChartReady={this.onChartReadyCallback}
onEvents={EventsDict} />目前ReactEcharts有以下属性:
option、style、theme、className、onChartReady、showLoading、onEvents。大家可以去github上看readme文件。
 
另外API方法,只有一个getEchartsInstance()方法获取echarts的实例对象,然后就可以调用echarts的所有API方法了。





  查看全部
github项目地址:https://github.com/hustcc/echarts-for-react
DEMO地址:http://git.hust.cc/echarts-for-react/#/?_k=l9a9ca
 
使用非常简单
一、安装
npm install echarts-for-react

二、引入使用
import React from 'react';
import ReactEcharts from 'echarts-for-react';

<ReactEcharts
option={this.getOtion()}
style={{height: '300px'}}
theme={"theme_name"}
onChartReady={this.onChartReadyCallback}
onEvents={EventsDict} />
目前ReactEcharts有以下属性:
option、style、theme、className、onChartReady、showLoading、onEvents。大家可以去github上看readme文件。
 
另外API方法,只有一个getEchartsInstance()方法获取echarts的实例对象,然后就可以调用echarts的所有API方法了。

下载_(1).png

 

用cocos2dx开发的游戏,玩一段时间就会手机发热,哪位大神知道怎么解决吗?

移动开发atool 回复了问题 • 2 人关注 • 1 个回复 • 390 次浏览 • 2016-06-09 11:10 • 来自相关话题

github自动同步master分支到gh-pages分支

其他类型atool 发表了文章 • 0 个评论 • 346 次浏览 • 2016-05-21 22:37 • 来自相关话题

用github的人都知道master分支仅是浏览代码,而无法将页面直接在网页打开,而gh-pages分支则是用于直接浏览源码页面的分支。

每次修改后提交master分支然后切换到gh-pages分支又重新提交一次,显然这个过程非常繁琐。

当然可以用git rebase 命令来简化操作。但是有个更好的办法可以自动同步分支。

打开github项目文件的根目录,找到.git 这个文件夹(文件夹默认是隐藏的,可以在控制面板-》文件夹里开启隐藏文件可见)

然后找到.git/config这个文件

在文件里加入以下两句代码即可:
push = +refs/heads/master:refs/heads/gh-pages
push = +refs/heads/master:refs/heads/master如下图所示:





 
然后git push origin master试试,是不是同步到gh-pages分支了。 查看全部
用github的人都知道master分支仅是浏览代码,而无法将页面直接在网页打开,而gh-pages分支则是用于直接浏览源码页面的分支。

每次修改后提交master分支然后切换到gh-pages分支又重新提交一次,显然这个过程非常繁琐。

当然可以用git rebase 命令来简化操作。但是有个更好的办法可以自动同步分支。

打开github项目文件的根目录,找到.git 这个文件夹(文件夹默认是隐藏的,可以在控制面板-》文件夹里开启隐藏文件可见)

然后找到.git/config这个文件

在文件里加入以下两句代码即可:
push = +refs/heads/master:refs/heads/gh-pages
push = +refs/heads/master:refs/heads/master
如下图所示:

下载.png

 
然后git push origin master试试,是不是同步到gh-pages分支了。

svn list 显示中文乱码问题的解决方法

前端开发atool 发表了文章 • 0 个评论 • 423 次浏览 • 2016-05-16 15:29 • 来自相关话题

一、背景

我们使用svn pre-commit hook做了一个svn锁定的功能,对于在上线前的svn提交进行控制,防止开发及策划胡乱提交,导致线上bug。这个平台有一个web界面功能,可以争对性给某些人开通一次提交权限,并记录他这一次的提交文件和log,乱码就出现了,web界面上显示的中文均乱码,包括log和提交文件名称

乱码的格式是:/design/X_?229?175?188?229?133?165?230?149?176?230?141?174/04_?233?129?147?229?133?183?230?149?176?230?141?174?232?161?168/?229?149?134?229?186?151?230?149?176?230?141?174?232?161?168.xls 这样的;

例如web上乱码为:






对应实际的中文汉字为:






二、原因

字符编码的问题,大家都知道,主要是ascii编码和unicode、utf-8之间的转换。关于字符编码,可以看阮一峰老师的文章,解析简单透彻:http://www.ruanyifeng.com/blog ... .html 

上述乱码基本是?229格式的,其中的?应该是svn自己加的分隔符,后面的三位数字为ascii编码,我们可以通过ascii转字符的函数将它转换成字符,将上述所有ascii字符拼接到一起即可形成unicode编码,然后再转utf-8,即可得到UrlEncode之后的中文汉字,然后再UrlDecode即可;

三、解决

知道上述原理之后,我采用js解决,这样不用修改后端代码,服务器也不用reload,调试也会方便一些;如果你才用其他语言,比如python、java、php等去解析乱码。可以找对应的函数替换即可。

3.1 urldecode和urlencode

比如:http://50vip.com/%E5%88%86%E5%B8%83%E5%BC%8F.html 这个链接里面的%E5%88%86%E5%B8%83%E5%BC%8F就是UrlEncode之后的中文,使用UrlDecode即可得到汉字“分布式”。关于这部分,网络博客很多,随便找;

Javascript方法如下:function UrlDecode(zipStr){
var uzipStr="";
for(var i=0;i<zipStr.length;i++){
var chr = zipStr.charAt(i);
if(chr == "+"){
uzipStr+=" ";
}else if(chr=="%"){
var asc = zipStr.substring(i+1,i+3);
if(parseInt("0x"+asc)>0x7f){
uzipStr+=decodeURI("%"+asc.toString()+zipStr.substring(i+3,i+9).toString());
i+=8;
}else{
uzipStr+=AsciiToString(parseInt("0x"+asc));
i+=2;
}
}else{
uzipStr+= chr;
}
}
return uzipStr;
}3.2 unicode转utf-8:EncodeUtf8

这部分代码网上找的,可能有bug,我用上没有什么问题,其他语言应该有更简单的方法:
function EncodeUtf8(s1) {
var s = escape(s1);
var sa = s.split("%");
var retV = "";
if (sa[0] != "") {
retV = sa[0];
}
for (var i = 1; i < sa.length; i++) {
if (sa[i].substring(0, 1) == "u") {
retV += Hex2Utf8(Str2Hex(sa[i].substring(1, 5)));
} else retV += "%" + sa[i];
}
return retV;
}
function Str2Hex(s) {
var c = "";
var n;
var ss = "0123456789ABCDEF";
var digS = "";
for (var i = 0; i < s.length; i++) {
c = s.charAt(i);
n = ss.indexOf(c);
digS += Dec2Dig(eval(n));
}
//return value;
return digS;
}
function Dec2Dig(n1) {
var s = "";
var n2 = 0;
for (var i = 0; i < 4; i++) {
n2 = Math.pow(2, 3 - i);
if (n1 >= n2) {
s += '1';
n1 = n1 - n2;
} else
s += '0';
}
return s;
}
function Dig2Dec(s) {
var retV = 0;
if (s.length == 4) {
for (var i = 0; i < 4; i++) {
retV += eval(s.charAt(i)) * Math.pow(2, 3 - i);
}
return retV;
}
return -1;
}
function Hex2Utf8(s) {
var retS = "";
var tempS = "";
var ss = "";
if (s.length == 16) {
tempS = "1110" + s.substring(0, 4);
tempS += "10" + s.substring(4, 10);
tempS += "10" + s.substring(10, 16);
var sss = "0123456789ABCDEF";
for (var i = 0; i < 3; i++) {
retS += "%";
ss = tempS.substring(i * 8, (eval(i) + 1) * 8);
retS += sss.charAt(Dig2Dec(ss.substring(0, 4)));
retS += sss.charAt(Dig2Dec(ss.substring(4, 8)));
}
return retS;
}
return "";
}3.3 解析SVN乱码

解析SVN格式乱码,获得每个字符的ascii,然后拼接unicode,然后转utf8,然后再UrlDecode,成功解析出汉字;
function svn_ascii_to_utf8(ori) {
s = ori.split('?');
//三个才是一个汉字,至少要有一个汉字
if (s.length < 3) {
return ori;
}
var ascii = '';
for(i in s) {
x = s[i];
if (x.length == 3) {
ascii += String.fromCharCode(x);
//console.log(ascii);
}
else if (x.length > 3) {
ascii += String.fromCharCode(x.substr(0, 3));
ascii += x.substr(3);
}
else {
//do nothing
}
}
return UrlDecode(EncodeUtf8(ascii));
}然后再web页面显示的时候,将相应的乱码,调用s = svn_ascii_to_utf8(s)即可,有乱码转乱码,无乱码保持不变;

Enjoy~ 查看全部
一、背景

我们使用svn pre-commit hook做了一个svn锁定的功能,对于在上线前的svn提交进行控制,防止开发及策划胡乱提交,导致线上bug。这个平台有一个web界面功能,可以争对性给某些人开通一次提交权限,并记录他这一次的提交文件和log,乱码就出现了,web界面上显示的中文均乱码,包括log和提交文件名称

乱码的格式是:/design/X_?229?175?188?229?133?165?230?149?176?230?141?174/04_?233?129?147?229?133?183?230?149?176?230?141?174?232?161?168/?229?149?134?229?186?151?230?149?176?230?141?174?232?161?168.xls 这样的;

例如web上乱码为:

14370127901362.png


对应实际的中文汉字为:

14370128636098.png


二、原因

字符编码的问题,大家都知道,主要是ascii编码和unicode、utf-8之间的转换。关于字符编码,可以看阮一峰老师的文章,解析简单透彻:http://www.ruanyifeng.com/blog ... .html 

上述乱码基本是?229格式的,其中的?应该是svn自己加的分隔符,后面的三位数字为ascii编码,我们可以通过ascii转字符的函数将它转换成字符,将上述所有ascii字符拼接到一起即可形成unicode编码,然后再转utf-8,即可得到UrlEncode之后的中文汉字,然后再UrlDecode即可;

三、解决

知道上述原理之后,我采用js解决,这样不用修改后端代码,服务器也不用reload,调试也会方便一些;如果你才用其他语言,比如python、java、php等去解析乱码。可以找对应的函数替换即可。

3.1 urldecode和urlencode

比如:http://50vip.com/%E5%88%86%E5%B8%83%E5%BC%8F.html 这个链接里面的%E5%88%86%E5%B8%83%E5%BC%8F就是UrlEncode之后的中文,使用UrlDecode即可得到汉字“分布式”。关于这部分,网络博客很多,随便找;

Javascript方法如下:
function UrlDecode(zipStr){  
var uzipStr="";
for(var i=0;i<zipStr.length;i++){
var chr = zipStr.charAt(i);
if(chr == "+"){
uzipStr+=" ";
}else if(chr=="%"){
var asc = zipStr.substring(i+1,i+3);
if(parseInt("0x"+asc)>0x7f){
uzipStr+=decodeURI("%"+asc.toString()+zipStr.substring(i+3,i+9).toString());
i+=8;
}else{
uzipStr+=AsciiToString(parseInt("0x"+asc));
i+=2;
}
}else{
uzipStr+= chr;
}
}
return uzipStr;
}
3.2 unicode转utf-8:EncodeUtf8

这部分代码网上找的,可能有bug,我用上没有什么问题,其他语言应该有更简单的方法:
function EncodeUtf8(s1) {
var s = escape(s1);
var sa = s.split("%");
var retV = "";
if (sa[0] != "") {
retV = sa[0];
}
for (var i = 1; i < sa.length; i++) {
if (sa[i].substring(0, 1) == "u") {
retV += Hex2Utf8(Str2Hex(sa[i].substring(1, 5)));
} else retV += "%" + sa[i];
}
return retV;
}
function Str2Hex(s) {
var c = "";
var n;
var ss = "0123456789ABCDEF";
var digS = "";
for (var i = 0; i < s.length; i++) {
c = s.charAt(i);
n = ss.indexOf(c);
digS += Dec2Dig(eval(n));
}
//return value;
return digS;
}
function Dec2Dig(n1) {
var s = "";
var n2 = 0;
for (var i = 0; i < 4; i++) {
n2 = Math.pow(2, 3 - i);
if (n1 >= n2) {
s += '1';
n1 = n1 - n2;
} else
s += '0';
}
return s;
}
function Dig2Dec(s) {
var retV = 0;
if (s.length == 4) {
for (var i = 0; i < 4; i++) {
retV += eval(s.charAt(i)) * Math.pow(2, 3 - i);
}
return retV;
}
return -1;
}
function Hex2Utf8(s) {
var retS = "";
var tempS = "";
var ss = "";
if (s.length == 16) {
tempS = "1110" + s.substring(0, 4);
tempS += "10" + s.substring(4, 10);
tempS += "10" + s.substring(10, 16);
var sss = "0123456789ABCDEF";
for (var i = 0; i < 3; i++) {
retS += "%";
ss = tempS.substring(i * 8, (eval(i) + 1) * 8);
retS += sss.charAt(Dig2Dec(ss.substring(0, 4)));
retS += sss.charAt(Dig2Dec(ss.substring(4, 8)));
}
return retS;
}
return "";
}
3.3 解析SVN乱码

解析SVN格式乱码,获得每个字符的ascii,然后拼接unicode,然后转utf8,然后再UrlDecode,成功解析出汉字;
function svn_ascii_to_utf8(ori) {
s = ori.split('?');
//三个才是一个汉字,至少要有一个汉字
if (s.length < 3) {
return ori;
}
var ascii = '';
for(i in s) {
x = s[i];
if (x.length == 3) {
ascii += String.fromCharCode(x);
//console.log(ascii);
}
else if (x.length > 3) {
ascii += String.fromCharCode(x.substr(0, 3));
ascii += x.substr(3);
}
else {
//do nothing
}
}
return UrlDecode(EncodeUtf8(ascii));
}
然后再web页面显示的时候,将相应的乱码,调用s = svn_ascii_to_utf8(s)即可,有乱码转乱码,无乱码保持不变;

Enjoy~

Appstore: Supporting IPv6-only Networks 提审必须支持IPv6,禁止IPv4的API

游戏开发atool 发表了文章 • 0 个评论 • 702 次浏览 • 2016-05-10 18:15 • 来自相关话题

2016年06月后,appstore要求上线的APP必须支持ipv6,具体:
 
1. If you’re writing a client-side app using high-level networking APIs such as NSURLSession and the CFNetwork frameworks and you connect by name, you should not need to change anything for your app to work with IPv6 addresses. If you aren’t connecting by name, you probably should be. See Avoid Resolving DNS Names Before Connecting to a Host to learn how. For information on CFNetwork, see CFNetwork Framework Reference. 
2. If you’re writing a server-side app or other low-level networking app, you need to make sure your socket code works correctly with both IPv4 and IPv6 addresses. Refer to RFC4038: Application Aspects of IPv6 Transition.

怎么检查自己的APP是否能过关?主要有以下几项:

一、代码中IP地址
只要存在IP格式的字符串(正则为:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})都尽量删除,不排除appstore就是通过正则来检查的。建议全部换成域名,然后通过域名解析。
 
二、API方法
一些只支持IPv4的方法不可在用。具体有以下:inet_addr()

inet_aton()

inet_lnaof()

inet_makeaddr()

inet_netof()

inet_network()

inet_ntoa()

inet_ntoa_r()

bindresvport()

getipv4sourcefilter()

setipv4sourcefilter()如果用到了下面左边的这些IPv4的类型(常量值),那么它们相应的IPv6类型也需要做处理:





关于苹果要求IPv6:https://developer.apple.com/news/?id=05042016a 查看全部
2016年06月后,appstore要求上线的APP必须支持ipv6,具体:
 
1. If you’re writing a client-side app using high-level networking APIs such as NSURLSession and the CFNetwork frameworks and you connect by name, you should not need to change anything for your app to work with IPv6 addresses. If you aren’t connecting by name, you probably should be. See Avoid Resolving DNS Names Before Connecting to a Host to learn how. For information on CFNetwork, see CFNetwork Framework Reference. 
2. If you’re writing a server-side app or other low-level networking app, you need to make sure your socket code works correctly with both IPv4 and IPv6 addresses. Refer to RFC4038: Application Aspects of IPv6 Transition.

怎么检查自己的APP是否能过关?主要有以下几项:

一、代码中IP地址
只要存在IP格式的字符串(正则为:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})都尽量删除,不排除appstore就是通过正则来检查的。建议全部换成域名,然后通过域名解析。
 
二、API方法
一些只支持IPv4的方法不可在用。具体有以下:
inet_addr()

inet_aton()

inet_lnaof()

inet_makeaddr()

inet_netof()

inet_network()

inet_ntoa()

inet_ntoa_r()

bindresvport()

getipv4sourcefilter()

setipv4sourcefilter()
如果用到了下面左边的这些IPv4的类型(常量值),那么它们相应的IPv6类型也需要做处理:
f2bcddfde26919a9c3832cdaf0bc56de.png


关于苹果要求IPv6:https://developer.apple.com/news/?id=05042016a

如何防止网站屏蔽插件?莆田系医院网站提醒Chrome插件 v1.1.1版本

其他类型atool 发表了文章 • 0 个评论 • 555 次浏览 • 2016-05-10 12:27 • 来自相关话题

一、医院屏蔽措施
本插件的使用用户量目前还比较多,代码开源,在github上过trendign首页,现在医院网站正对插件屏蔽方法有三种:
1.1 CSS display
之前的版本提示vid采用固定的id,固定显示的body结束标签上方。

1.2 Javascript DOM remove
 
由于采用固定的id和固定的位置,所以完全可以直接remove。

1.3 * {display:none!important}
 
索性整个网站不显示。
 
二、反屏蔽方法:

2.1 针对Css Display的方法
 
直接设置Css属性important即可,如下:var cssText = "display:block!important;" +
"background-color:red!important;" +
"width:" + window.screen.availWidth + "px!important;" +
"height:50px!important;" +
"font-family:'Source Sans Pro', 'Microsoft Yahei',sans-serif,Arial!important;" +
"font-size:30px!important;" +
"color:black!important;" +
"position:fixed!important;" +
"left:0!important;bottom:0!important;" +
"z-index:2147483647!important;" +
"text-align:center!important;" +
"line-height:50px!important;"另外,使用随机的id,随机的DOM位置来阻止Css样式屏蔽,具体可以看代码: https://github.com/hustcc/PTHospital.chrome/blob/master/res/content.js 

2.2 针对1.2中js删除的dom的办法
 
首先随机的id和随机的DOM位置可以有一些效果,但是他们完全可以采取div内容的匹配方式来删除,所以针对这种屏蔽措施,我加了定时器去扫描提示的div是否存在,如果不存在,再补一次。代码大概如下:// 循环检查防止屏蔽
setTimeout(function() {getMaskContainer(name, phone);}, 1000);2.3 针对1.3 直接全站不显示
 
其实我也没有什么办法,但是既然他全部网页都不显示了,那么也不会对用户造成损害了,所以也可以放他一马。如果你有好的办法,欢迎告诉我。

----
最新版主要优化了提示显示的时机,并且增加了医院的数据,另外,增加了医院网站反屏蔽的方法。
Github地址:https://github.com/hustcc/PTHospital.chrome  

更新日志如下:

v1.1.1 
1. 修复某些网站没有描述信息的bug; 
 
v1.1.0  
1. 增加使用网页名字和描述匹配,对于百度百科等介绍网站的页面也会进行提示; 
2. 增加一些防止医院屏蔽的措施; 
3. 增加莆田医院数据; 
 
v 1.0.8 
1. 针对一些医院的屏蔽措施,加入一些防止屏蔽的代码; 
2. 优化提示信息加载时间,无须等到网站加载完毕才提示;
  查看全部
一、医院屏蔽措施
本插件的使用用户量目前还比较多,代码开源,在github上过trendign首页,现在医院网站正对插件屏蔽方法有三种:
1.1 CSS display
之前的版本提示vid采用固定的id,固定显示的body结束标签上方。

1.2 Javascript DOM remove
 
由于采用固定的id和固定的位置,所以完全可以直接remove。

1.3 * {display:none!important}
 
索性整个网站不显示。
 
二、反屏蔽方法:

2.1 针对Css Display的方法
 
直接设置Css属性important即可,如下:
var cssText = "display:block!important;" +
"background-color:red!important;" +
"width:" + window.screen.availWidth + "px!important;" +
"height:50px!important;" +
"font-family:'Source Sans Pro', 'Microsoft Yahei',sans-serif,Arial!important;" +
"font-size:30px!important;" +
"color:black!important;" +
"position:fixed!important;" +
"left:0!important;bottom:0!important;" +
"z-index:2147483647!important;" +
"text-align:center!important;" +
"line-height:50px!important;"
另外,使用随机的id,随机的DOM位置来阻止Css样式屏蔽,具体可以看代码: https://github.com/hustcc/PTHospital.chrome/blob/master/res/content.js 

2.2 针对1.2中js删除的dom的办法
 
首先随机的id和随机的DOM位置可以有一些效果,但是他们完全可以采取div内容的匹配方式来删除,所以针对这种屏蔽措施,我加了定时器去扫描提示的div是否存在,如果不存在,再补一次。代码大概如下:
// 循环检查防止屏蔽
setTimeout(function() {getMaskContainer(name, phone);}, 1000);
2.3 针对1.3 直接全站不显示
 
其实我也没有什么办法,但是既然他全部网页都不显示了,那么也不会对用户造成损害了,所以也可以放他一马。如果你有好的办法,欢迎告诉我。

----
最新版主要优化了提示显示的时机,并且增加了医院的数据,另外,增加了医院网站反屏蔽的方法。
Github地址:https://github.com/hustcc/PTHospital.chrome  

更新日志如下:

v1.1.1 
1. 修复某些网站没有描述信息的bug; 
 
v1.1.0  
1. 增加使用网页名字和描述匹配,对于百度百科等介绍网站的页面也会进行提示; 
2. 增加一些防止医院屏蔽的措施; 
3. 增加莆田医院数据; 
 
v 1.0.8 
1. 针对一些医院的屏蔽措施,加入一些防止屏蔽的代码; 
2. 优化提示信息加载时间,无须等到网站加载完毕才提示;
 

Chrome商店打不开,怎么安装插件——莆田系医院网站提醒插件安装方法

其他类型atool 发表了文章 • 0 个评论 • 3845 次浏览 • 2016-05-07 17:16 • 来自相关话题

因为某些网络原因,导致Chrome的插件市场打不开,所以也没有办法安装插件,这种情况怎么办呢?下面就来介绍怎么在无法访问Chrome市场的情况下安装插件。
 
最近做了一个莆田系网站提醒插件,这里就以这个插件的安装为实例来说明:
 
一、找到需要安装的.CRX文件
 
可以通过百度、github、找插件作者等方式,找到插件对应的crx文件。比如莆田系网站提醒插件的地址在Github可以找到,地址为:https://github.com/hustcc/PTHospital.chrome/raw/master/PTHospital.chrome.crx,点击即可下载。如果这个地址打不开,可以在本文附件中下载。
 
二、打开Chrome浏览器,开启开发者模式
 
由于不是从Chrome市场中下载插件,所以需要使用开发者模式,具体操作见下面的截图。首先打开扩展程序界面:




然后勾选开发者模式,如果是勾选状态,可以不管。




 
三、安装下载的.CRX文件
 
安装更简单,直接将crx拖入到扩展程序的界面即可。如下图所示:




这三步之后就完成插件安装了。是不是很简单。
 
  查看全部
因为某些网络原因,导致Chrome的插件市场打不开,所以也没有办法安装插件,这种情况怎么办呢?下面就来介绍怎么在无法访问Chrome市场的情况下安装插件。
 
最近做了一个莆田系网站提醒插件,这里就以这个插件的安装为实例来说明:
 
一、找到需要安装的.CRX文件
 
可以通过百度、github、找插件作者等方式,找到插件对应的crx文件。比如莆田系网站提醒插件的地址在Github可以找到,地址为:https://github.com/hustcc/PTHospital.chrome/raw/master/PTHospital.chrome.crx,点击即可下载。如果这个地址打不开,可以在本文附件中下载。
 
二、打开Chrome浏览器,开启开发者模式
 
由于不是从Chrome市场中下载插件,所以需要使用开发者模式,具体操作见下面的截图。首先打开扩展程序界面:
未命名1.png

然后勾选开发者模式,如果是勾选状态,可以不管。
未命名2.png

 
三、安装下载的.CRX文件
 
安装更简单,直接将crx拖入到扩展程序的界面即可。如下图所示:
未命3名.png

这三步之后就完成插件安装了。是不是很简单。
 
 

VR和AR是什么关系,有什么区别?

其他类型atool 发表了文章 • 0 个评论 • 747 次浏览 • 2016-05-03 18:53 • 来自相关话题

增强现实技术是由虚拟现实技术发展而来,最早应用于军事,今年开始,由于智能手机的普及、智能硬件的兴起以及Google Glass的出现,增强现实技术被大量关注,就目前来看,我比较看好增强现实技术。

一、现在的虚拟现实(Virtual Reality,简称VR)
虚拟现实技术利用计算机创造一个虚拟空间,利用虚拟现实眼镜能够使用户完全沉浸在一个虚拟的合成环境中,无法看到真实环境;利用双目视觉原理,虚拟世界在眼镜中是3D立体的。
1、VR头盔:目前比较有名的是被Facebook收购的Oculus公司,Oculus眼镜可以展示例如Unity这样的软件构建的虚拟场景,并且让用户沉浸在虚拟世界中过山车、玩游戏、看电影等等。
2、VR眼镜:目前解决方案是一种头戴式手机框,将智能手机放入并且分屏显示,就可以产生类似于VR头盔的效果,如三星Gear VR
在未来,虚拟现实不仅仅会涉及视觉、听觉,还会涉及嗅觉、触觉、味觉,构造一个与真实环境相似的世界。

二、现在的增强现实(Augmented Reality,简称AR)
增强现实技术能够把虚拟信息(物体、图片、视频、声音等等)融合在现实环境中,将现实世界丰富起来,构建一个更加全面、更加美好的世界。Google Glass开始,增强现实眼镜开始不断出现,但都还是初级产品,这些眼镜能够做到给用户呈现一些简单的辅助信息,但复杂信息就无能为力了。
1、单目眼镜:Google Glass,单眼呈现信息,导航、短信、电话、录像照相等功能,由于是单眼,无法呈现3D效果,且由于外观原因应用场景有限。
2、双目眼镜:Meta Glass, 双眼呈现影像时,利用双目视差可以产生开发者想要的3D效果。通过对现实场景的探测并补充信息,佩戴者会得到现实世界无法快速得到的信息;而且由于交互方式更加自然,这些虚拟物品也更加真实

三、未来的增强现实
在未来,我们佩戴的眼镜或隐形眼镜会再一次变革我们的通讯设备、办公设备、娱乐设备等等;在未来,我们不再需要电脑、手机等实体,只需在双眼中投射屏幕的影像,即可创造出悬空的屏幕以及3D立体的操作界面;在未来,人眼的边界将被再一次打开,双手的界限将被再一次突破,几千公里外的朋友可以立即出现在面前与你面对面对话,你也将会触摸到虚幻世界的任何物件;在未来,一挥手你就可以完全沉浸在另一个虚拟世界,一杯茶,一片海,甚至是另一个人生、现实世界无法到达的千千万万种可能的人生。

简单粗暴的说法是:你通过设备观察的场景里面有没有现实的画面,有就是增强现实,没有就是虚拟现实。
更简单粗暴的说法是:你看有没有开摄像头,开了就是增强现实,没开就是虚拟现实。
 
作者:闫展逸
链接:https://www.zhihu.com/question ... 26947
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 查看全部
增强现实技术是由虚拟现实技术发展而来,最早应用于军事,今年开始,由于智能手机的普及、智能硬件的兴起以及Google Glass的出现,增强现实技术被大量关注,就目前来看,我比较看好增强现实技术。

一、现在的虚拟现实(Virtual Reality,简称VR)
虚拟现实技术利用计算机创造一个虚拟空间,利用虚拟现实眼镜能够使用户完全沉浸在一个虚拟的合成环境中,无法看到真实环境;利用双目视觉原理,虚拟世界在眼镜中是3D立体的。
1、VR头盔:目前比较有名的是被Facebook收购的Oculus公司,Oculus眼镜可以展示例如Unity这样的软件构建的虚拟场景,并且让用户沉浸在虚拟世界中过山车、玩游戏、看电影等等。
2、VR眼镜:目前解决方案是一种头戴式手机框,将智能手机放入并且分屏显示,就可以产生类似于VR头盔的效果,如三星Gear VR
在未来,虚拟现实不仅仅会涉及视觉、听觉,还会涉及嗅觉、触觉、味觉,构造一个与真实环境相似的世界。

二、现在的增强现实(Augmented Reality,简称AR)
增强现实技术能够把虚拟信息(物体、图片、视频、声音等等)融合在现实环境中,将现实世界丰富起来,构建一个更加全面、更加美好的世界。Google Glass开始,增强现实眼镜开始不断出现,但都还是初级产品,这些眼镜能够做到给用户呈现一些简单的辅助信息,但复杂信息就无能为力了。
1、单目眼镜:Google Glass,单眼呈现信息,导航、短信、电话、录像照相等功能,由于是单眼,无法呈现3D效果,且由于外观原因应用场景有限。
2、双目眼镜:Meta Glass, 双眼呈现影像时,利用双目视差可以产生开发者想要的3D效果。通过对现实场景的探测并补充信息,佩戴者会得到现实世界无法快速得到的信息;而且由于交互方式更加自然,这些虚拟物品也更加真实

三、未来的增强现实
在未来,我们佩戴的眼镜或隐形眼镜会再一次变革我们的通讯设备、办公设备、娱乐设备等等;在未来,我们不再需要电脑、手机等实体,只需在双眼中投射屏幕的影像,即可创造出悬空的屏幕以及3D立体的操作界面;在未来,人眼的边界将被再一次打开,双手的界限将被再一次突破,几千公里外的朋友可以立即出现在面前与你面对面对话,你也将会触摸到虚幻世界的任何物件;在未来,一挥手你就可以完全沉浸在另一个虚拟世界,一杯茶,一片海,甚至是另一个人生、现实世界无法到达的千千万万种可能的人生。

简单粗暴的说法是:你通过设备观察的场景里面有没有现实的画面,有就是增强现实,没有就是虚拟现实。
更简单粗暴的说法是:你看有没有开摄像头,开了就是增强现实,没开就是虚拟现实。
 
作者:闫展逸
链接:https://www.zhihu.com/question ... 26947
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。