分享

分享一下最近在技术上的收获

 闲读古书 2020-06-27

文章同步发于微信公众号 somenzz,敬请关注。

凡人皆有一死,凡人皆需侍奉。

很喜欢这句高等瓦雷利亚语,简单却蕴含人生哲理。

程序员是个非常辛苦的职业,为了写出健壮的代码,可能要牺牲娱乐和休息的时间。但这是值得的,只要你的代码有价值,也就是能满足特定人群的需求,或节省他们的时间,或解决他们的问题,这些付出最终都能带来金钱上的回报。

那么先想好你的优势,你的擅长,最适合侍奉何种人群,你要帮谁解决,解决什么问题,哪些方面需要与人合作,哪些需要自己学习,这都是需要考虑的。

作为技术人员,你的侍奉的一定是非技术人员,因为技术人员的问题已经自己通过技术解决了。那么你写的程序就要易用,健壮。这两个要求已经够你折腾一阵子了。

最近我在业余时间做的两件事情:

1、完善云端学习助手,使之更加易用,实现一键双击就可以使用,无需要安装任何其他软件。星球介绍链接:https://t./i2jyZNj

2、与朋友一起开发了一个学习类网站,青蛙学堂,网站:https://www.

做这些事情一方面是出于兴趣,另一方面有人买单,做起来自然动力十足,虽然经常写代码到 12 点,也不觉得太累。以上都是使用 Python 开发。在开发的过程中有 4 点新的收获,分享在这里,希望对于从事技术的你也所帮助。

1、如何让 Python 程序在 Windows 平台通用?

Python 代码要想执行,机器上必须有一个 Python 解释器,也就是从官网下载的 Python 安装程序。但想运行你写的程序的人,自己电脑上不一定有 Python 解释器,可能也不会安装,不会设置环境变量,不会打开命令窗口。

最好的方法是像 C 或 C++ 那样,直接编译成 exe 文件,别人一运行这个 exe 文件就可以运行。Python 提供了类似的工具,pyinstaller 和 py2exe 都可以将 Python 源文件(.py)打包成 exe 文件。但这个 exe 文件并不是走真正编译生成的,是把 Python 解释器和 Python 源文件打包在一起,因此生成的 exe 文件都很大。

上述方法不能保证每台机器都能正常运行,因为它依赖很多 Windows dll 文件,而且在打包过程中很容易报错,也是缺少各种各样的头文件。

后来我发现 Python 官网中提供了这样的一种版本: Windows x86-64 embeddable zip file。看了官网的介绍,这是一个绿色名安装的 Python 解释器,可以嵌入其他程序中以便执行 Python 程序,最新的 Python3.7 版本解压后也就 25M,并不大,这正是我想要的。

写好 Python 代码后,将 python 源代码和 python-3.7.4-embed-amd64 放在一起,发送给别人,再提供一个 startup.bat 文件,写入以下内容:

python-3.7.4-embed-amd64\python.exe yourPythonScript.py
pause

这样,别人双击 startup.bat 即可运行你提供的 Python 程序。 如果代码中使用第三方的库。则需要修改 python-3.7.4-embed-amd64 目录下的 python37._pth 文件,把最后一行的注释去掉,文件内容应该是这样的:

python37.zip
.
# Uncomment to run site.main() automatically
import site

然后将同版本 Python pip 安装后的包从 site-packages 复制到 python-3.7.4-embed-amd64\Lib\site-packages 即可。

这样下来,你写的所有 Python 程序都可以放在这里,免去别人安装各种软件和依赖的麻烦,别人解压你的提供的压缩包,双击 startup.bat 即可运行,不需要任何额外的配置,简单易行,不懂技术的小白也可以使用。

2、如何保护 Python 源码,不被反编译破解。

Python 是一种解释型语言,解释型的语言特点就是常容易被反编译,如果代码中涉及加密环节,一但被破解就不好玩了。虽然 Python 也支持编译成 Python 字节码,如 pyc、pyo 文件,但可以轻松反编译,如 uncompyle6 就可以轻松反编译,代码规范的话,甚至连注释都给你还原出来。

上述的 py2exe,pyinstaller 虽然也起一定的保护作用,但其本质是打包,不是编译,因此也可以破解,感兴趣的可以去网上搜索下。

最彻底的方式是使用编译型的语言来写代码,像 C、C++ 那样,编译后直接生成机器代码,全是二进制的 0 或 1,无论如何也是没有办法反编译出来的。

借助这个思路就有两种方案:

1、并不是所有的代码都需要保密:需要保密的那部分代码可以使用 C 来写,然后生成使用 gcc 等编译器生成 Windows 的动态链接库文件 dll 文件,然后使用 Python 来引入 dll 文件。

import ctypes
dll = ctypes.windll.LoadLibrary( 'test.dll' )

这样,我们就可以使用 dll.function() 来调用 dll 文件中的函数了。

2、生成 pyd 文件,pyd 文件本质是 dll 文件,是适用于 Python 的 dll 文件,因此叫 pyd,可以可直接被 python 通过 import 导入。以下代码可以将 python 源代码直接编译成 pyd 文件。

注意先安装 Cython

pip install Cython

setup.py 文件内容,可根据需要进行修改。

from distutils.core import setup
from Cython.Build import cythonize

build_dir = 'build'
build_tmp_dir = 'build/temp'

setup(
    name = 'myapp',
    ext_modules=cythonize(['aaa.py','bbb.py','ccc.py']),
    #script_args=["build_ext", "-b", build_dir, "-t", build_tmp_dir],
    script_args=["install",]
)

在目录内执行 python setup.py 即可将 aaa.py,bbb.py,ccc.py 编译成对应的 pyd 并安装在 Python 的库目录 site-packages 中。

在写代码时可以直接以 import aaa,bbb,ccc 这样的方式来使用,就像引用其他Python文件一样,但是你无法查看 aaa,bbb,ccc 内的源代码,也几乎不可能被反编译,也就不可能被破解了。

大部分情况下,你在编译成 pyd 时都会报错,提示缺少 vcvarsall.bat。

解决方法:https://devblogs.microsoft.com/python/unable-to-find-vcvarsall-bat/#comments
对于 Python3 来说,安装下 vs2019 就可以了,选择 C/C++ 组件,及 Windows 10 sdk。约占用 4G 左右空间。

在 Linux 系统下,对应的是 so 文件,道理是相通的,掌握一个系统,很容易搞定其他系统。

3、使用 Django-rest-framework 开发后端接口,使用 JWT 认证。

什么是 JWT,如何使用,有一篇博文写的非常好,我就不再重复写了,有用到的点击下面的链接看下:
https://blog.csdn.net/weixin_42578481/article/details/86599681

4、使用 Nginx 配置 https 服务器,并自动更新证书。

同样有一篇非常好的博文,我当时就是参考这个配置成功的,放在此处,需要的可以自行访问。
HTTPS 简介及使用官方工具 Certbot 配置 Let’s Encrypt SSL 安全证书详细教程:
https://10./deploy-lets-encrypt-ssl-certificate-with-certbot/

先配置好 http 服务器,cerbot-auto 会自动为你配置 https 的配置,这里贴下我自己 nginx 的配置,供参考:

server {
    server_name www.your_name.com; # managed by Certbot
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            include  uwsgi_params;
            uwsgi_pass  127.0.0.1:8080;              
            uwsgi_param UWSGI_SCRIPT you_dir.wsgi; 
            uwsgi_param UWSGI_CHDIR /home/xxxx/xxxx/you_dir; 
            index  index.html index.htm;
            client_max_body_size 35m;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/www.your_name.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/www.your_name.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    if ($host = www.your_name.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


        listen       80 ;
        listen       [::]:80 ;
    server_name www.your_name.com;
    return 404; # managed by Certbot
}

(完)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多