[Flutter]Image图片缓存

源码分析

Read more   12/18/2019 09:12 上午 posted in  Flutter

"Authenticating with the iTunes store” 或 “正在通过 iTunes Store进行鉴定”的完美解决办法

用 Xcode 提交 app 到 iTunes store 时总是卡死在 “Authenticating with the iTunes store”。改DNS、用VPN都不行,全局、自动代理模式全都试过了。
网上找解决办法,有很多人推荐使用“Application Loader”上传:
但是使用 Application Loader 提交时又卡死在 “正在通过 iTunes Store进行鉴定” 。

Read more   06/20/2019 23:08 下午 posted in  Xcode

马蜂窝 iOS App 启动治理:回归用户体验

From:https://mp.weixin.qq.com/s?__biz=Mzg5MTA4Mzg5NA==&mid=2247483816&idx=1&sn=588981334dd8c797ce2e4395db6ca68d&utm_source=tuicool&utm_medium=referral

增长、活跃、留存是移动 App 的常见核心指标,直接反映一款 App 甚至一个互联网公司运行的健康程度和发展动能。启动流程的体验决定了用户的第一印象,在一定程度上影响了用户活跃度和留存率。因此,确保启动流程的良好体验至关重要。

Read more   05/16/2019 10:04 上午 posted in  apple

Python并发工具

转载于:http://mingxinglai.com/cn/2016/09/python-concurrent/

相信每一个接触Python并发的同学,刚开始都会有一段困惑时间:Python的并发看起来杂乱无章. 大家使用最多的是threading,但是,Python中由于GIL的存在,又没有实现真正的并发.因此, 在寻求其他并发工具的时候,Python往往由于资料太多,而大家又没有系统性的学习并发,导致 丈二的和尚摸不着头脑.

Read more   12/05/2018 15:27 下午 posted in  Python

API Star:一个 Python 3 的 API 框架

为了在 Python 中快速构建 API,我主要依赖于 Flask。最近我遇到了一个名为 “API Star” 的基于 Python 3 的新 API 框架。由于几个原因,我对它很感兴趣。首先,该框架包含 Python 新特点,如类型提示和 asyncio。而且它再进一步为开发人员提供了很棒的开发体验。我们很快就会讲到这些功能,但在我们开始之前,我首先要感谢 Tom Christie,感谢他为 Django REST Framework 和 API Star 所做的所有工作。

现在说回 API Star —— 我感觉这个框架很有成效。我可以选择基于 asyncio 编写异步代码,或者可以选择传统后端方式就像 WSGI 那样。它配备了一个命令行工具 —— apistar 来帮助我们更快地完成工作。它支持 Django ORM 和 SQLAlchemy,这是可选的。它有一个出色的类型系统,使我们能够定义输入和输出的约束,API Star 可以自动生成 API 的模式(包括文档),提供验证和序列化功能等等。虽然 API Star 专注于构建 API,但你也可以非常轻松地在其上构建 Web 应用程序。在我们自己构建一些东西之前,所有这些可能都没有意义的。

##开始
我们将从安装 API Star 开始。为此实验创建一个虚拟环境是一个好主意。如果你不知道如何创建一个虚拟环境,不要担心,继续往下看。

pip install apistar

(译注:上面的命令是在 Python 3 虚拟环境下使用的)

如果你没有使用虚拟环境或者你的 Python 3 的 pip 名为 pip3,那么使用 pip3 install apistar 代替。

一旦我们安装了这个包,我们就应该可以使用 apistar 命令行工具了。我们可以用它创建一个新项目,让我们在当前目录中创建一个新项目。

apistar new .

现在我们应该创建两个文件:app.py,它包含主应用程序,然后是 test.py,它用于测试。让我们来看看 app.py 文件:

from apistar import Include, Route
from apistar.frameworks.wsgi import WSGIApp as App
from apistar.handlers import docs_urls, static_urls
def welcome(name=None):
    if name is None:
        return {'message': 'Welcome to API Star!'}
    return {'message': 'Welcome to API Star, %s!' % name}
routes = [
    Route('/', 'GET', welcome),
    Include('/docs', docs_urls),
    Include('/static', static_urls)
]
app = App(routes=routes)
if __name__ == '__main__':
    app.main()

在我们深入研究代码之前,让我们运行应用程序并查看它是否正常工作。我们在浏览器中输入 http://127.0.0.1:8080/,我们将得到以下响应:

{"message": "Welcome to API Star!"}

如果我们输入:http://127.0.0.1:8080/?name=masnun

{"message": "Welcome to API Star, masnun!"}

同样的,输入 http://127.0.0.1:8080/docs/,我们将看到自动生成的 API 文档。

现在让我们来看看代码。我们有一个 welcome 函数,它接收一个名为 name 的参数,其默认值为 None。API Star 是一个智能的 API 框架。它将尝试在 url 路径或者查询字符串中找到 name 键并将其传递给我们的函数,它还基于其生成 API 文档。这真是太好了,不是吗?

然后,我们创建一个 Route 和 Include 实例的列表,并将列表传递给 App 实例。Route 对象用于定义用户自定义路由。顾名思义,Include 包含了在给定的路径下的其它 url 路径。

##路由
路由很简单。当构造 App 实例时,我们需要传递一个列表作为 routes 参数,这个列表应该有我们刚才看到的 Route 或 Include 对象组成。对于 Route,我们传递一个 url 路径,http 方法和可调用的请求处理程序(函数或者其他)。对于 Include 实例,我们传递一个 url 路径和一个 Routes 实例列表。

##路径参数
我们可以在花括号内添加一个名称来声明 url 路径参数。例如 /user/{user_id} 定义了一个 url,其中 user_id 是路径参数,或者说是一个将被注入到处理函数(实际上是可调用的)中的变量。这有一个简单的例子:

from apistar import Route
from apistar.frameworks.wsgi import WSGIApp as App
def user_profile(user_id: int):
    return {'message': 'Your profile id is: {}'.format(user_id)}
routes = [
    Route('/user/{user_id}', 'GET', user_profile),
]
app = App(routes=routes)
if __name__ == '__main__':
    app.main()

如果我们访问 http://127.0.0.1:8080/user/23,我们将得到以下响应:

{"message": "Your profile id is: 23"}

但如果我们尝试访问 http://127.0.0.1:8080/user/some_string,它将无法匹配。因为我们定义了 user_profile 函数,且为 user_id 参数添加了一个类型提示。如果它不是整数,则路径不匹配。但是如果我们继续删除类型提示,只使用 user_profile(user_id),它将匹配此 url。这也展示了 API Star 的智能之处和利用类型和好处。

##包含/分组路由
有时候将某些 url 组合在一起是有意义的。假设我们有一个处理用户相关功能的 user 模块,将所有与用户相关的 url 分组在 /user 路径下可能会更好。例如 /user/new、/user/1、/user/1/update 等等。我们可以轻松地在单独的模块或包中创建我们的处理程序和路由,然后将它们包含在我们自己的路由中。

让我们创建一个名为 user 的新模块,文件名为 user.py。我们将以下代码放入这个文件:

from apistar import Route
def user_new():
    return {"message": "Create a new user"}
def user_update(user_id: int):
    return {"message": "Update user #{}".format(user_id)}
def user_profile(user_id: int):
    return {"message": "User Profile for: {}".format(user_id)}
user_routes = [
    Route("/new", "GET", user_new),
    Route("/{user_id}/update", "GET", user_update),
    Route("/{user_id}/profile", "GET", user_profile),
]

现在我们可以从 app 主文件中导入 user_routes,并像这样使用它:

from apistar import Include
from apistar.frameworks.wsgi import WSGIApp as App
from user import user_routes
routes = [
    Include("/user", user_routes)
]
app = App(routes=routes)
if __name__ == '__main__':
    app.main()

现在 /user/new 将委托给 user_new 函数。

访问查询字符串/查询参数
查询参数中传递的任何参数都可以直接注入到处理函数中。比如 url /call?phone=1234,处理函数可以定义一个 phone 参数,它将从查询字符串/查询参数中接收值。如果 url 查询字符串不包含 phone 的值,那么它将得到 None。我们还可以为参数设置一个默认值,如下所示:

def welcome(name=None):
    if name is None:
        return {'message': 'Welcome to API Star!'}
    return {'message': 'Welcome to API Star, %s!' % name}

在上面的例子中,我们为 name 设置了一个默认值 None。

注入对象
通过给一个请求程序添加类型提示,我们可以将不同的对象注入到视图中。注入请求相关的对象有助于处理程序直接从内部访问它们。API Star 内置的 http 包中有几个内置对象。我们也可以使用它的类型系统来创建我们自己的自定义对象并将它们注入到我们的函数中。API Star 还根据指定的约束进行数据验证。

让我们定义自己的 User 类型,并将其注入到我们的请求处理程序中:

from apistar import Include, Route
from apistar.frameworks.wsgi import WSGIApp as App
from apistar import typesystem
class User(typesystem.Object):
    properties = {
    'name': typesystem.string(max_length=100),
    'email': typesystem.string(max_length=100),
    'age': typesystem.integer(maximum=100, minimum=18)
    }
    required = ["name", "age", "email"]
def new_user(user: User):
    return user
routes = [
    Route('/', 'POST', new_user),
]
app = App(routes=routes)
if __name__ == '__main__':
    app.main()

现在如果我们发送这样的请求:

curl -X POST \
  http://127.0.0.1:8080/ \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/json' \
  -d '{"name": "masnun", "email": "masnun@gmail.com", "age": 12}'

猜猜发生了什么?我们得到一个错误,说年龄必须等于或大于 18。类型系允许我们进行智能数据验证。如果我们启用了 docs url,我们还将自动记录这些参数。

##发送响应
如果你已经注意到,到目前为止,我们只可以传递一个字典,它将被转换为 JSON 并作为默认返回。但是,我们可以使用 apistar 中的 Response 类来设置状态码和其它任意响应头。这有一个简单的例子:

from apistar import Route, Response
from apistar.frameworks.wsgi import WSGIApp as App
def hello():
    return Response(
    content="Hello".encode("utf-8"),
    status=200,
    headers={"X-API-Framework": "API Star"},
    content_type="text/plain"
    )
routes = [
    Route('/', 'GET', hello),
]
app = App(routes=routes)
if __name__ == '__main__':
    app.main()

它应该返回纯文本响应和一个自定义标响应头。请注意,content 应该是字节,而不是字符串。这就是我编码它的原因。

##继续
我刚刚介绍了 API Star 的一些特性,API Star 中还有许多非常酷的东西,我建议通过 Github Readme 文件来了解这个优秀框架所提供的不同功能的更多信息。我还将尝试在未来几天内介绍关于 API Star 的更多简短的,集中的教程。

via: http://polyglot.ninja/api-star-python-3-api-framework/

作者:MASNUN 译者:MjSeven 校对:wxy

12/03/2018 19:51 下午 posted in  Python

树莓派定时任务

https://www.kawabangga.com/posts/1398

Linux下有一个定时运行的程序命令叫“crontab”,是任务调度的crond常驻命令,是Linux系统下的定时任务触发器 。
限制用户使用crontab的文件有:/etc/cron.allow /etc/cron.deny 。
当使用crontab建立工作排程后,将被记录到/var/spool/cron里。
cron执行的每一项工作都被记录到/varlog/cron里去。
crontab参数:
-u:只有root才可能,帮其他用户建立或移除工作排程。
-l:查阅crontab的工作内容
-r:移除所有的crontab的工作内容,移除一项,用-e编辑。
每项工作有六个字段分别是:
分钟 小时 日期 月份 周 指令
0-59 0-23 1-31 1-12 0-7 指令 #0和7都代表星期天
辅助特殊字符:

  • (星号)代表任何时刻
    ,(逗号)代表分隔时候。如3点与6点 就是3,6
    -(减号)代表一段时间范围内。如:3点到6点 就是3-6
    /n(斜线)n代表数字,即每隔n单位。如每隔五分钟,/5
    以下我们举个例子,比如每晚定时23:50分需要关机
    1.编辑crontab 任务:
    $crontab -e
    2.再文件的最后一行添加以下这行内容:
    50 23 * * * /sbin/shutdown -h now

注:50 23 代表 每天的23:50,执行的命令就是“shutdown -h now”

crontab命令
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρνο),原意是时间。常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。

使用说明
只有root用户和crontab文件的所有者才能编辑定时任务,因此如果以pi用户登录,不要忘记加上sudo。-e参数表示编辑(edit)。
sudo crontab -e
进入编辑以后需要按照一定的格式写入所需执行的命令和重复的时间。格式如下:
m h dom mon dow command
依次是分钟(minute)、小时(hour)、几号(day of month)、月份(month)、星期几(day of week)、命令。
时间可以是一个数字,表示在这个时刻执行,也可以是星号(*),表示不做限制、在任意时刻都执行。
查看所有的定时任务可以使用-l参数,表示列出(list)的含义
crontab -l

用法举例
每天0点1分执行贴吧签到脚本
1 0 * * * python qiandao.py
在每周日的7点更新系统
0 7 * * 1 apt-get update && sudo apt-get upgrade -y

11/28/2018 22:41 下午 posted in  Raspbian

Mac OSX下给树莓派安装Raspbian系统

11/26/2018 12:58 下午 posted in  Raspbian

iOS获取App ipa包以及资源文件

LINK:https://www.jianshu.com/p/fdb50d303ad6

要获得线上APP的ipa文件,现在有以下几种方案
1.通过PP助手下载安装到手机的应用
2.通过iTools助手下载安装到手机的应用
3.通过Apple Configurator 2(Mac商店)获取
前两种方案网上的教程很多,这里只介绍第三种方案

首先 去Mac上的App Store下载Apple Configurator 2。
然后把iphone连接上Mac,点击Apple Configurator 2 菜单中->账户->登陆(用连接设备的Apple ID)

打开登录.png

备份iPhone的内容(避免数据丢失,非必选)

所有设备->选中当前iPhone->添加->应用,找到您想要ipa的那个应用->添加

添加应用.png

添加.png

下载ipa包中.png
因为你手机中已经存在了当前应用,所以会提示,该应用已经存在, 是否需要替换?
此时,不要点任何按钮!不要点任何按钮!不要点任何按钮!

不要点击任何按钮.png
不要操作Apple Configurator 2,让它保持上图的状态,然后打开Finder前往文件夹,或者直接快捷键command+shift+G
并输入下面路径
~/Library/Group Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps/

前往文件夹.png

前往文件夹2.png
点击前往,打开ipa包所在文件。将ipa文件copy出来。

获取ipa包所在文件夹.png
这时候别忘了点击Apple Configurator 2窗口中的停止,你会发现刚才目录下的文件也消失了

拿到ipa文件后,你可以将后缀.ipa改为.zip,然后解压


修改文件类型.png

就可以看到Payload下的包,显示包内容可以看到部分APP的资源以及Assets.car。

解压.png
如果你要解压Assets.car, 可以使用github上的工具https://github.com/pcjbird/AssetsExtractor

最后,提取出来的资源文件,大家要注意版权,仅供参考,不要直接拿来商业使用。

11/13/2018 12:58 下午 posted in  杂七杂八

iOS RSA加密 以及生成公钥 秘钥 pem文件

在iOS中使用RSA加密解密,需要用到.der和.p12后缀格式的文件,其中.der格式的文件存放的是公钥(Public key)用于加密,.p12格式的文件存放的是私钥(Private key)用于解密. 首先需要先生成这些文件,然后再将文件导入工程使用,不多说,开始做!
一、使用openssl生成所需秘钥文件
  生成环境是在mac系统下,使用openssl进行生成,首先打开终端,按下面这些步骤依次来做:

  1. 生成模长为1024bit的私钥文件private_key.pem

openssl genrsa -out private_key.pem 1024
2. 生成证书请求文件rsaCertReq.csr
openssl req -new -key private_key.pem -out rsaCerReq.csr
注意:这一步会提示输入国家、省份、mail等信息,可以根据实际情况填写,或者全部不用填写,直接全部敲回车.
3. 生成证书rsaCert.crt,并设置有效时间为10年
openssl x509 -req -days 3650 -in rsaCerReq.csr -signkey private_key.pem -out rsaCert.crt
4. 生成供iOS使用的公钥文件public_key.der
openssl x509 -outform der -in rsaCert.crt -out public_key.der
5. 生成供iOS使用的私钥文件private_key.p12
openssl pkcs12 -export -out private_key.p12 -inkey private_key.pem -in rsaCert.crt
注意:这一步会提示给私钥文件设置密码,直接输入想要设置密码即可,然后敲回车,然后再验证刚才设置的密码,再次输入密码,然后敲回车,完毕!
在解密时,private_key.p12文件需要和这里设置的密码配合使用,因此需要牢记此密码.
6. 生成供Java使用的公钥rsa_public_key.pem
openssl rsa -in private_key.pem -out rsa_public_key.pem -pubout
7. 生成供Java使用的私钥pkcs8_private_key.pem
openssl pkcs8 -topk8 -in private_key.pem -out pkcs8_private_key.pem -nocrypt
全部执行成功后,会生成如下文件,其中public_key.der和private_key.p12就是iOS需要用到的文件

10/10/2018 15:11 下午 posted in  Crypto

使用openssl命令制作ecc证书

# openssl ecparam -out EccCA.key -name prime256v1 -genkey
# openssl req -config openssl.cnf -key EccCA.key -new -out EccCA.req
# openssl x509 -req -in EccCA.req -signkey EccCA.key -out EccCA.pem
# openssl ecparam -out EccSite.key -name prime256v1 -genkey
# openssl req -config openssl.cnf -key EccSite.key -new -out EccSite.req
# openssl x509 -req -in EccSite.req -CA EccCA.pem -CAkey EccCA.key -out EccSite.pem -CAcreateserial

生成几张用户证书,然后用openssl pkcs12命令生成p12格式证书文件,然后导入到firefox中。
生成证书时,ECC曲线选择的是prime256v1。之前有选过prime192v1,好像firefox不认,改了种曲线就好了。
生成站点证书或用户证书时,也可以用ECC根证书颁发RSA证书,测试一样能通过。

将私钥秘cer证书合并成p12格式

1)生成pkcs12文件,但不包含CA证书:

openssl pkcs12 -export -inkey ocspserverkey.pem -in ocspservercert.pem -out ocspserverpkcs12.pfx

2) 生成pcs12文件,包含CA证书:

openssl pkcs12 -export -inkey server.key -in server.crt -CAfile ca.crt -chain -out server.pfx

3) 将pcks12中的信息分离出来,写入文件:

openssl pkcs12 –in ocsp1.pfx -out certandkey.pem

4) 显示pkcs12信息:

openssl pkcs12 –in ocsp1.pfx -info


附: 1、把cert1.pem转换成.p12格式

openssl pkcs12 -export -in cert1.pem -inkey cert1.key -certfile ca.pem -out cert1.p12

2、把cert1.pem转换成.cer格式:只需把扩展名改为.cer即可.

10/10/2018 15:08 下午 posted in  Crypto