Google Play开发者账号被封的几种情况

Google Play 的政策很多,即使读几遍有的地方还是不好理解,容易违规,我总结了一些容易违规的情况,还不知道先看这篇:千万别违规,Google Play 开发者政策解读

平时工作中很多开发者向我咨询Google Play开发者账号被封的事情,我本人大概看过不少于100封的被封邮件,在此尝试将Google Play开发者账号被封的几种情况一一说明。

以下每种情况分成三部分:被封原因描述、邮件截图和开发者政策解析。
另根据经验如开发者账号旗下的某款产品初次违规后,Google Play一般的做法是将该产品下架,如违规三次,该产品所属的开发者账号将被封。
因此下文中的部分邮件中的产品尽管是下架,而非开发者账号被封,不过一定程度上我们可以把产品下架和开发者账号被封以同等情况视之。

*种:APP中的应用墙或应用推荐的下载跳转到除Google Play市场外的第三方市场下载。

第二种:APP的产品描述中关键字堆砌
关键字垃圾内容 :
https://support.google.com/googleplay/android-developer/answer/2985717?hl=zh-Hans

第三种:产品侵权(包含app名称、app图标和app截图等)

第四种:内购应用接入了除Google Wallet外的第三方支付

其他导致被封的情况,开发者可在本帖回复
我希望根据被封邮件,结合产品apk和开发者政策,总结出一份图文并茂、有具体案例的《Google Play开发者账号被封 案例总结》。

Google Play开发者账号注册 *新攻略

作为一名开发者是件很苦逼的事情,加班加点夜以继日;
      作为一名中国的开发者是件更苦逼的事情,国内用户喜欢免费,规模营收可能性微乎其微;
      作为一名中国的 Google Play 开发者是件尤其苦逼的事情,为了一个 Google  Play 开发者账号,求爷爷告奶奶,发动亲朋好友,恨不得把所有信用卡都尝试一遍。
      为了让各位开发者朋友在申请过程中少走一些弯路, 在此分享一下 Google Play 开发者账号注册的*新攻略。撰写本文的过程中,本人尽量遵循两个原则:
      一、逻辑清晰,有条理;
      二、图文结合。
      我把注册攻略分三部分:【工具篇】、【流程篇】、【注意事项篇】 。
     【工具篇】:
     1 、 Chrome 浏览器或火狐浏览器 ;以上 2 个浏览器会更好地兼容 Google 的各项服务,申请过程会更为顺畅;
     2 、*工具 1 个 ;以便申请 Gmail 、开通 Google Wallet 、注册 Goolgle Play 开发者账号等流程时可使用国外 IP ,以提高申请 Google Play 开发者账号的成功率;
          *工具推荐优先 顺序如下:国外付费 *> 国内 * 的收费通道 > 国内 * 的免费通道,之所以这样排序是从易连接程度、连接稳定性以及申请成功率综合考虑的。
      3 、带有 Visa 或 Master 等标志的信用卡 1 个 ,以便支付 Google Play 开发者 25 美元的注册费用,并记录如下信息:
信用卡卡号;
信用卡失效期;
信用卡CVV;
信用卡账单地址(含信用卡持有人姓名、地址、邮编及电话);

注意:
1、如信用卡为美国或香港地区银行发行,且账单地址位于美国或香港,建议信用卡账单地址信息按真实信息填写;
2、如信用卡为中国大陆地区银行发行,且账单地址位于中国大陆地区,建议信用卡账单地址信息可使用香港地址,如香港的大学、企业、银行等地址。
3、香港地址无需填写邮编;

4、 优先推荐开发者使用美国或香港地区发行的信用卡,实在找不到再使用中国大陆地区发行的信用卡(如招商银行信用卡),根据经验,美国或香港地区发行的信用卡注册Google Play开发者账号的成功率要高于中国大陆地区发行的信用卡的成功率。

4、带SIM卡的手机一部;申请Gmail时Google公司出于安全考虑有时会要求进行短信码验证,通过手机以便及时接收短信验证码。

【流程篇】:

      *步:创建Google账户(即通俗意义上的Gmai),Google账户链接地址:https://accounts.google.com/SignUp?service=mail&hl=zh-CN&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fpc%3Dtopnav-about-zh-CN

注意:
1、手机号码可使用中国地区手机号码,不过不属于必填选项,亦可不填。
2、此处位置一般根据IP地址所属区域进行判断,可不做任何处理。Google Play开发者账号所属区域与此处位置无关,Google Play开发者账号所属区域与该账号绑定的Google Wallet所属区域一致。

第二步:设置Google Wallet,链接地址: wallet.google.com/, 并点击“接受并创建”,

第三步:出现Google Wallet后台,点击付款方式,并点击“添加付款方法”下拉框,选择“添加信用卡或借记卡”。

按照要求填写信用卡信息:

注意:如信用卡绑定成功,Google可能会先从该信用卡扣除1美元进行授权。有关授权的具体说明参考下图:

第四步:打开Google Play开发者账号注册地址,链接地址:http://market.android.com/publish/signup,支付注册所需要的25美金

注意:一般支付25美金后,Google*多需要48个小时进行审核。

第五步:检查Google Wallet中该笔订单支付状态,如显示“已完成”说明Google Play开发者账号申请成功。

【注意事项篇】

很多开发者可能会申请失败,或出于降低由于开发者账号被封导致的各项风险,以下是申请多个账号的注意事项:
1、新的IP;清除浏览器的Cookies和缓存;
2、新的Gmail账户;以前从来没有使用过的手机号码;
3、禁止填入与被封开发者账号相关的信息,如被封开发者账号所使用的绑定邮箱、绑定电话、IP以及支付25美金所使用的信用卡。

      另外成功申请Ggoogle Play开发者后,很多开发者会经常查看开发者后台,以下是使用开发者账号的几点注意事项:
      1、安装一个浏览器专门用来操作账号(推荐火狐或Chrome);

2、一个ip一个号一定要注意,IP不能多号共用;

      3、每次操作账号的时候都要清除cookies和缓存;
      4、只要登录谷歌账号(包含GmaiL、Google Wallet和Google Play开发者后台 等)都要先清除cookies和缓存。

过采样建模中遇到的问题

过采样建模中遇到的问题

过采样建模中遇到的问题
一、问题概述:
由于过采样建模中使用了SMOTE算法,因此需要计算距离,如果说原始数据中存在空值时,此时计算距离将报错,所以需要将原始数据的空值进行处理,这样才能保证SMOTE算法运行成功。

二、问题解决:
使用sklearn中的

from sklearn.preprocessing import Imputer

模块儿,可以快速对空值数据进行处理,此模块儿使用方式如下:

class sklearn.preprocessing.Imputer(missing_values=’NaN’, strategy=’mean’, axis=0, verbose=0, copy=True)
各个参数含义:

1.missing_values: integer or “NaN”, optional (default=”NaN”)
2.strategy : string, optional (default=”mean”)
The imputation strategy.
If “mean”, then replace missing values using the mean along the axis. 使用平均值代替
If “median”, then replace missing values using the median along the axis.使用中值代替
If “most_frequent”, then replace missing using the most frequent value along the axis.使用众数代替,也就是出现次数*多的数
axis: 默认为 axis=0
axis = 0, 按列处理
aixs =1 , 按行处理

三、使用示例
#部分数据可能有空值,因此使用Imputer进行处理
from sklearn.preprocessing import Imputer

#必须初始化一个Imputer,参数可以修改
imp =Imputer(missing_values=”NaN”, strategy=”most_frequent”,axis=0 )
#将数据框df按照上述规则进行处理,处理后结果为df_train_tsf
df_train_tsf = imp.fit_transform(df)
注意点:Imputer只接受一个DF数据结构。

 

spark.createDataFrame()报错

spark.createDataFrame()报错

具体情况:将pandas中的DF转化为spark中的DF时报错,报错内容如下:

spark_df = spark.createDataFrame(target_users)

报错->>Can not merge type <class ‘pyspark.sql.types.DoubleType’> and <class ‘pyspark.sql.types.StringType’>
根本原因:并非数据类型不匹配,而是数据中存在空值,将空值进行填充后成功创建。

Anaconda报错:AttributeError: ‘NoneType‘ object has no attribute ‘execute‘

Anaconda报错:AttributeError: ‘NoneType‘ object has no attribute ‘execute‘

重装anaconda后打开spyder发现报错:

File “D:\Anaconda3\envs\tensorflow\lib\site-packages\spyder\plugins\ipythonconsole.py”, line 890, in run_script
self.execute_code(line, current_client, clear_variables)
File “D:\Anaconda3\envs\tensorflow\lib\site-packages\spyder\plugins\ipythonconsole.py”, line 936, in execute_code
sw.execute(to_text_string(to_text_string(lines)))
File “D:\Anaconda3\envs\tensorflow\lib\site-packages\qtconsole\history_console_widget.py”, line 47, in execute
source, hidden, interactive)
File “D:\Anaconda3\envs\tensorflow\lib\site-packages\qtconsole\console_widget.py”, line 632, in execute
self._execute(source, hidden)
File “D:\Anaconda3\envs\tensorflow\lib\site-packages\qtconsole\frontend_widget.py”, line 294, in _execute
msg_id = self.kernel_client.execute(source, hidden)
AttributeError: ‘NoneType’ object has no attribute ‘execute’

 

重装多次依旧无法解决。

猜测原因:应该是没有卸载完成导致。

*终解决方式:

卸载所有C盘下所有相关anaconda的文件重新安装后即可成功。

 

Scrapy框架——CrawlSpider介绍

Scrapy框架——CrawlSpider介绍

一、什么是CrawlSpider?

Scrapy框架中分两类爬虫:1.Spider类  2.CrawlSpider类

crawlspider是Spider的派生类(一个子类),CrawlSpider类定义了一些规则(rule)来提供跟进link(链接)的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合。

二、为什么使用CrawlSpider?

1.针对有跟进机制的网页爬取非常方便

2.编写容易,只需要定义爬取url规则

三、如何使用CrawlSpider?

1.创建爬虫项目

scrapy startproject pcxm
2.编写主程序的.py文件

scrapy genspider -t crawl pcxm 域名
四、关键方法

1.LinkExtractors链接提取器:
使用LinkExtractors可以不用程序员自己提取想要的url,然后发送请求。这些工作都可以交给LinkExtractors,他会在所有爬的页面中找到满足规则的url,实现自动的爬取。

class scrapy.linkextractors.LinkExtractor(
allow = (),
deny = (),
allow_domains = (),
deny_domains = (),
deny_extensions = None,
restrict_xpaths = (),
tags = (‘a’,’area’),
attrs = (‘href’),
canonicalize = True,
unique = True,
process_value = None
)
allow:允许的url。所有满足这个正则表达式的url都会被提取。【编写正则表达式】【重要】
deny:禁止的url。所有满足这个正则表达式的url都不会被提取。【编写正则表达式】
allow_domains:允许的域名。只有在这个里面指定的域名的url才会被提取。
deny_domains:禁止的域名。所有在这个里面指定的域名的url都不会被提取。
2.Rule规则类:
class scrapy.spiders.Rule(
link_extractor,
callback = None,
cb_kwargs = None,
follow = None,
process_links = None,
process_request = None
)
link_extractor:一个LinkExtractor对象,用于定义爬取规则。【重要】
callback:满足这个规则的url,应该要执行哪个回调函数。【重要】
follow:指定根据该规则从response中提取的链接是否需要跟进。【重要】
process_links:从link_extractor中获取到链接后会传递给这个函数,用来过滤不需要爬取的链接。
 

总结Python的几点语言特性

总结Python的几点语言特性

总结Python的几点语言特性
Python语言简洁,优雅,扩展性强…… 这些特点常被Python程序员挂在嘴边,确实也都是Python的特点。

要讨论语言的特点或特性,可以得到很多不同的结论,有针对语言整体而言的特性,也有针对某一个应用领域的特性。本文只从语言设计方面(其他的不讨论),总结Python的几点语言特性。

一、解释型语言

高级语言不能直接被计算机理解(计算机只能理解机器语言,二进制代码),要先将高级语言翻译成机器语言,计算机才能执行高级语言编写的代码。根据翻译工具(解释器或编译器)的不同,高级语言分为解释型语言和编译型语言。

解释型语言:在代码运行时,解释器将代码逐行翻译成机器语言,代码可以按行运行。

编译型语言:先使用编译器对代码编译,生成可执行文件(如.exe文件),然后运行可执行文件。

Python是解释型语言,所以Python代码不需要编译,编写完就可以直接运行。

解释型语言相当于实时翻译,省去了编译这个步骤。每运行一次代码,解释器都要重新翻译代码,而解释器把代码翻译成机器语言是要花时间的,所以,解释型语言的运行效率比编译型语言低很多,速度慢,性能上处于劣势。

编译型语言相当于提前翻译,运行时直接运行可执行文件。编译只需要一次,后面不管运行多少次,都可以直接运行可执行文件,所以,编译型语言的运行效率比解释型语言高很多,速度快,性能上有优势。

因为性能上的劣势,解释型语言不适合开发操作系统、大型应用程序、数据库系统等对性能要求高的程序,这些程序基本都是使用编译型语言。当然,解释型语言可以通过对解释器进行优化来提高运行效率,同时,随着计算机硬件的性能提升,也可以弥补解释型语言在性能上的不足,使性能差距对生产的影响降低,甚至消除。

另一方面,因为在运行时才解释代码,解释型语言的跨平台性更好,代码移植到不同的操作系统中后可以直接运行。而因为不同操作系统识别的机器语言有差异,编译型语言移植到不同的操作系统后,需要重新编译后才能运行,跨平台性不如解释型语言。

说回Python,Python程序运行后也可以将运行的机器语言保存到以.pyc为扩展名的文件中,下次运行时,如果代码没有变化,解释器可以直接运行.pyc文件。这算是Python对运行效率的一种​优化,所以,也有人说Python是一种解释型和编译型相结合的语言。

二、动态类型语言

在不同的高级语言中,都有很多数据类型,这些数据类型的定义大同小异。在代码中,数据一般保存在变量之中(被变量引用),通常会先定义变量,然后将数据赋值给变量。根据定义变量前是否需要提前声明变量的数据类型,高级语言分为动态类型语言和静态类型语言。

动态类型语言:定义变量前,不需要声明变量的数据类型,执行代码的时候由解释器动态确认变量的数据类型。

静态类型语言:定义变量前,必须先声明变量的数据类型,给变量赋值时数据类型必须匹配。

Python是动态类型语言,所以Python代码中不需要提前声明变量的数据类型,运行代码的时候再动态确认数据类型。

var = 100
print(var, type(var))
var = ‘!@#$%’
print(var, type(var))
100 <class ‘int’>
!@#$% <class ‘str’>
看上面的例子,定义变量var的时候赋值为100,运行时的数据类型为int(整数),再将它赋值为字符!@#$%,运行时的数据类型为str(字符串)。不仅变量的数据类型不需要提前声明,在运行过程中,数据类型还会根据不同的引用而改变。

动态类型语言不需要提前声明变量的数据类型,使代码更加简洁,可以少写很多代码,同时,也给了程序员很大的自由度,写代码时多了很多自由发挥的空间。但是,太自由了也可能会有弊端,如果一些变量定义得不规范(如多处出现同名变量名),会使代码的可读性降低,增加定位问题的难度,甚至带来一些不易察觉的BUG。

静态类型语言的每个变量都先声明了数据类型,每个变量都必须先声明才能使用,一旦声明后数据类型不能修改,这充分保证了同一个变量名在上下文中的一致性,即使代码量很大的情况下也不会出现混乱。只是,会使代码量变多,实现相同的功能,代码量会增加很多。

三、强类型语言

在高级语言中,将不同类型的变量进行运算时,有些语言可以自动对数据类型进行转换,使不同数据类型的变量能兼容,能返回运算结果,程序不报错,另一些语言必须先将数据类型转换成一致,才能进行运算,否则程序会报错。所以高级语言可以分为强类型语言和弱类型语言。

强类型语言:不同类型的数据进行运算前,必须先将数据类型转换成一致。

弱类型语言:不同类型的数据进行运算,会自动进行数据类型转换。

Python是强类型语言,所以Python代码中不同类型的数据运算会报错。

强类型和弱类型是体现在数据运算时不同类型的数据能否兼容,而动态类型和静态类型是体现在定义变量时是否需要先声明数据类型,所以这是两个维度的概念,不能混淆了。

a = 100
print(a, type(a))
b = ‘100’
print(b, type(b))
print(a + b)
100 <class ‘int’>
100 <class ‘str’>
TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’
print(str(a) + b, type(str(a) + b))
print(a + int(b), type(a + int(b)))
100100 <class ‘str’>
200 <class ‘int’>
看上面的例子,变量a是int(整型),变量b是str(字符串),将两者相加时,会报错TypeError:不支持整型与字符串相加。当将a和b的数据类型转换成一致后,可以正常运算。

强类型语言不支持不同类型的数据直接进行运算,必须先对数据类型进行转换,这可以帮助程序员在变量运算前确认和厘清数据的类型,避免了不同数据类型进行运算的混乱。但是,不同类型的数据进行运算前,要先进行类型转化,多了一个步骤,也会降低运行效率。

弱类型语言支持不同类型的数据直接进行运算,在不同类型的数据进行运算时会自动进行转换,省了自动转换的步骤。但是,两个不同类型的数据直接运算,可能会使程序员错误判断结果的数据类型,甚至可能会带来BUG。

在动态类型和静态类型方面,Python给程序员留了足够的自由,但在强类型和弱类型方面,Python又对数据的运算进行了限制。可以猜想,Guido这么设计是经过深思熟虑的,在定义变量的时候给了足够自由,也提升了代码的简洁性,但在进行数据运算时进行了限制,加了一道保险,避免太过自由带来一些不必要的问题。

四、面向对象语言

在编程时,一个功能可以分成多个步骤来逐步实现,基本所有语言都支持按步骤实现功能和抽取可重用的函数,而面向对象语言还支持由数据和功能组合而成的对象来实现功能。所以,根据是否支持面向对象编程,高级语言可以分为面向对象语言和面向过程语言。

面向对象语言:以对象作为代码的基础结构,通过对象的属性和方法来实现业务功能。

面向过程语言:代码由过程代码和抽取的功能函数构成,函数可以重复使用。

Python是面向对象语言,Python中一切皆对象,可以将数据和功能封装到对象中,从对象的角度去处理问题和实现功能。当然,用Python也可以实现面向过程编程。

面向对象语言的设计聚焦于对象之上,将数据作为属性封装在对象内,将功能作为方法封装在对象内,不管是使用属性还是方法,都可以通过对象调用。面向对象语言具有封装、继承和多肽三大特性,可以使程序设计得更加清晰,由此也产生了很多设计模式。在复杂的业务中,不同的对象执行不同的功能,降低了代码的耦合度,有利于提高开发效率,降低重构代码的难度。

面向过程语言的代码按照业务逻辑自上而下,逐步实现功能,如果有可以重复使用的功能,可以抽取成函数。面向过程编程没有面向对象编程抽象,所以更容易理解,代码与业务逻辑环环相扣,一步一步地实现,这就使得代码的耦合度很高。即使将重复代码抽取成函数,还是很难避免代码的冗余,代码的设计模式也比较少,设计思路没有面向对象的清晰,重构代码也更难。

关于面向对象语言和面向过程语言的讨论内容很多,对于业务逻辑比较复杂的程序,比较统一的看法是面向对象优于面向过程,而对于业务逻辑简单的程序,面向对象和面向过程都可以。

上面总结了几点Python的语言特性,如果有一些编程经验,大家都会有自己的理解,每个人的理解可能会存在一些小差异,所以没必要在意是否权威,自己思考*重要。

 

Python清华源或豆瓣源安装包

Python清华源或豆瓣源安装包

Python清华源或豆瓣源安装包
一、清华源

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple celery
把包换成自己当前需要安装的包即可,-i 指定镜像源,可以放在包的前面或后面,位置不限。

注意:simple不能少,是https而不是http。

官方使用帮助:https://mirrors.tuna.tsinghua.edu.cn/help/pypi/

二、豆瓣源

pip install requests -i https://pypi.douban.com/simple/
注意:simple不能少,是https而不是http。

三、设置成默认配置

升级pip。

pip install pip -U
设置默认。

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

.NET(用户自定义控件实现权限控制)

.NET(用户自定义控件实现权限控制)

编写程序的时候,经常需要用的项目根目录。总结如下
取得控制台应用程序的根目录方法
方法1、Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径
方法2、AppDomain.CurrentDomain.BaseDirectory 获取基目录,它由程序集冲突解决程序用来探测程序集
取得Web应用程序的根目录方法
方法1、HttpRuntime.AppDomainAppPath.ToString();//获取承载在当前应用程序域中的应用程序的应用程序目录的物理驱动器路径。用于App_Data中获取
方法2、Server.MapPath(“”) 或者 Server.MapPath(“~/”);//返回与Web服务器上的指定的虚拟路径相对的物理文件路径
方法3、Request.ApplicationPath;//获取服务器上ASP.NET应用程序的虚拟应用程序根目录
取得WinForm应用程序的根目录方法
1、Environment.CurrentDirectory.ToString();//获取或设置当前工作目录的完全限定路径
2、Application.StartupPath.ToString();//获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称
3、Directory.GetCurrentDirectory();//获取应用程序的当前工作目录
4、AppDomain.CurrentDomain.BaseDirectory;//获取基目录,它由程序集冲突解决程序用来探测程序集
5、AppDomain.CurrentDomain.SetupInformation.ApplicationBase;//获取或设置包含该应用程序的目录的名称
其中:以下两个方法可以获取执行文件名称
1、Process.GetCurrentProcess().MainModule.FileName;//可获得当前执行的exe的文件名。
2、Application.ExecutablePath;//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称

转自http://www.cnblogs.com/cpcpc/archive/2011/06/30/2123000.html

举一个简单的例子,在.NET的WEB应用中,有时候会涉及到用户权限的判断,如果没有权限,则进入不了该页面,当页面很多时,每次在页面中判断总觉得有些繁琐,这个时候,理所当然的想到了“用户自定义控件”。讲这个之前必须了解一下页面加载的顺序。

1.Master page中的用户控件的 page_init
2.页面中的用户控件的 page_init
3.page的page_init
4.Aspx的 page_init
5.Aspx的page_load
6.Master page的page_load
7.Master page中的用户控件的 page_load
8.Aspx页面中的用户控件的 page_load
.aspx、.master、ascx这三个页面中Page_Load的执行顺序是:.aspx中的pg–>.master中的pg–>ascx中的pg( pg–>page_load)

那我们发现,加载顺序都是page_init 然后才是page_load,所以在写“用户自定义控件”的时候,需要覆盖OnInit方法,具体代码如下。

override protected void OnInit(EventArgs e)
{
CheckUserRights();
base.OnInit(e);
}
private void CheckUserRights()
{
if (!Page.IsPostBack)
{
//string mapPath = Server.MapPath(“~/”);
string mapPath = Request.ApplicationPath;
string redirectPath = mapPath + “Default.aspx”;
if (Session[“CurrentUsre”] == null)
{
Session.Clear();
Session.Abandon();
Response.Clear();
Response.Write(“<script defer>window.alert(‘您没有权限进入本页或当前登录用户已过期!\\n请重新登录或与管理员联系!’);parent.location='” + redirectPath + “‘;</script>”);
Response.End();
}
}
}

因为在不同的页面,在parent.location的时候,不能使用相对路径,所以这个时候,可以使用服务器根目录的路径,注意是在WebApp里面的根目录。(Default.aspx是默认页面)