pip 安装MySQL-python:EnvironmentError: mysql_config not found

服务端atool 发表了文章 • 0 个评论 • 88 次浏览 • 2016-11-21 20:43 • 来自相关话题

网上很多做法是:
 首先 find / -name mysql_config 在/usr/bin/下发现了这个文件
然后修改MySQL-python-1.2.5目录下的site.cfg文件
去掉mysql_config=XXX这行的注释,并改成mysql_config=/usr/bin/mysql_config(以mysql_config文件所在机器上的目录为准)


然后 python setup.py install
 
但是这样安装会出现:ExtractionError: Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

[Errno 13] Permission denied: '/root/.cache'

The Python egg cache directory is currently set to:

/root/.cache/Python-Eggs

Perhaps your account does not have write access to this directory? You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.
最后解决办法:
 
首先:apt-get install libmysqlclient-dev
 
然后再 pip install MySQL-python,解决。 查看全部
网上很多做法是:
 
首先 find / -name mysql_config 在/usr/bin/下发现了这个文件
然后修改MySQL-python-1.2.5目录下的site.cfg文件
去掉mysql_config=XXX这行的注释,并改成mysql_config=/usr/bin/mysql_config(以mysql_config文件所在机器上的目录为准)


然后 python setup.py install
 
但是这样安装会出现:
ExtractionError: Can't extract file(s) to egg cache

The following error occurred while trying to extract file(s) to the Python egg
cache:

[Errno 13] Permission denied: '/root/.cache'

The Python egg cache directory is currently set to:

/root/.cache/Python-Eggs

Perhaps your account does not have write access to this directory? You can
change the cache directory by setting the PYTHON_EGG_CACHE environment
variable to point to an accessible directory.

最后解决办法:
 
首先:apt-get install libmysqlclient-dev
 
然后再 pip install MySQL-python,解决。

一个微型 Javascript 开源项目如何在 4 天到 1000 star ?

前端开发atool 发表了文章 • 0 个评论 • 348 次浏览 • 2016-09-13 11:25 • 来自相关话题

这里要提到的是我之前从项目抽离出来的微型 Javascript 项目 timeago.js,为什么是微型,因为他还不到 2kb,这个也是做这个项目的原因之一。
 
已有的类似项目不是一般都依赖 jQuery 和 moment.js,实际上仅仅用到其中的选择器、一个日期方法(fromNow),为了这么一点方法依赖,而引入则好么大的库,个人感觉不是很划算。
 
https://github.com/hustcc/timeago.js 项目大概开始于今年6月底左右,抽离出来,npm publish之后,在自己的多个项目中使用良好,就没有再多做更新了,后来因为另外一个项目中的 PR 引用到 timeago.js 项目,所以决定好好做一做,并推广一下,并陆续增加修改如下东西:
 
1. 增加实时更新方法 render,可以选择一些节点实时更新和计算;
2. 完善Testcase,使用travis CI;
3. 申请域名 timeago.org,后来因为这个域名和其他项目产生了一些不愉快,不过无所谓,我很大条;
4. 更新优化本地化文件的格式;
5. 新开一个 issue 专门记录 locale 的 pr;
 
然后将域名 timeago.org 发到 Hack New上,然后就是域名被老外转到reddit,并且关于创造更小的轮子,依赖jQuery这些问题引起了一些争论,再然后就过了一天,就上了 Github 的 Trending 总榜,目前已经在榜上 4 天了。就在这次天内,star 数量瞬间达到 1000 +,自己还是很激动的。
 
说说自己的感想吧?
 
1. 如果真的想好好做一个项目,还是申请一个合适的域名吧,这样可能会给人更加专业,更加重视的感觉;
2. 老外真的特别喜欢发 pr 和 issue,可能是国内程序员的时间被商人完全榨干了;
3. 保证项目有完善的测试,travis CI集成起来其实非常简单;
4. 项目特色,比如timeago.js特色就是tiny(1.75 kb完成其他项目依赖 jQ 的事情),并且在多个 issue 中要求 pr 一定要保证代码的简洁;
5. PR 规范,比如 timeago.js 中的主要 pr 来源于本地化语言的翻译,所以我会专门开一个issue来展现需要 pr 哪些语言,然后大家一目了然,可以增加大家 pr 的积极性;
 
做好这些之后,就可以到一些技术论坛发发文章,博客了,具体发哪些位置呢?
 
Hack New、开发者头条、V2ex、OSChina、segmentfault、极客头条等等。我对国外技术站点不是很了解,仅仅发了 Hack New。
  查看全部
这里要提到的是我之前从项目抽离出来的微型 Javascript 项目 timeago.js,为什么是微型,因为他还不到 2kb,这个也是做这个项目的原因之一。
 
已有的类似项目不是一般都依赖 jQuery 和 moment.js,实际上仅仅用到其中的选择器、一个日期方法(fromNow),为了这么一点方法依赖,而引入则好么大的库,个人感觉不是很划算。
 
https://github.com/hustcc/timeago.js 项目大概开始于今年6月底左右,抽离出来,npm publish之后,在自己的多个项目中使用良好,就没有再多做更新了,后来因为另外一个项目中的 PR 引用到 timeago.js 项目,所以决定好好做一做,并推广一下,并陆续增加修改如下东西:
 
1. 增加实时更新方法 render,可以选择一些节点实时更新和计算;
2. 完善Testcase,使用travis CI;
3. 申请域名 timeago.org,后来因为这个域名和其他项目产生了一些不愉快,不过无所谓,我很大条;
4. 更新优化本地化文件的格式;
5. 新开一个 issue 专门记录 locale 的 pr;
 
然后将域名 timeago.org 发到 Hack New上,然后就是域名被老外转到reddit,并且关于创造更小的轮子,依赖jQuery这些问题引起了一些争论,再然后就过了一天,就上了 Github 的 Trending 总榜,目前已经在榜上 4 天了。就在这次天内,star 数量瞬间达到 1000 +,自己还是很激动的。
 
说说自己的感想吧?
 
1. 如果真的想好好做一个项目,还是申请一个合适的域名吧,这样可能会给人更加专业,更加重视的感觉;
2. 老外真的特别喜欢发 pr 和 issue,可能是国内程序员的时间被商人完全榨干了;
3. 保证项目有完善的测试,travis CI集成起来其实非常简单;
4. 项目特色,比如timeago.js特色就是tiny(1.75 kb完成其他项目依赖 jQ 的事情),并且在多个 issue 中要求 pr 一定要保证代码的简洁;
5. PR 规范,比如 timeago.js 中的主要 pr 来源于本地化语言的翻译,所以我会专门开一个issue来展现需要 pr 哪些语言,然后大家一目了然,可以增加大家 pr 的积极性;
 
做好这些之后,就可以到一些技术论坛发发文章,博客了,具体发哪些位置呢?
 
Hack New、开发者头条、V2ex、OSChina、segmentfault、极客头条等等。我对国外技术站点不是很了解,仅仅发了 Hack New。
 

paramiko使用private key SSH登陆服务器

服务端atool 发表了文章 • 0 个评论 • 566 次浏览 • 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 个评论 • 578 次浏览 • 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 个评论 • 906 次浏览 • 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 个回复 • 2577 次浏览 • 2016-06-09 11:10 • 来自相关话题

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

其他类型atool 发表了文章 • 0 个评论 • 628 次浏览 • 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 个评论 • 753 次浏览 • 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 个评论 • 1126 次浏览 • 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 个评论 • 868 次浏览 • 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. 优化提示信息加载时间,无须等到网站加载完毕才提示;