注册微信小程序账号,获取到 AppID,我们后面配置的时候会用到。在 HBuilderX 工具栏,点击发行,选择小程序-微信。输入小程序名称和 AppID,单击发行就可以了。这样我们就会获得一个微信小程序的打包文件,接下来我们来发布微信小程序项目,打开微信小程序开发者工具,导入刚刚生成的微信小程序项目的打包文件,在微信小程序开发者工具中先测试一下,项目运行是否正常,项目测试没有问题后,点击右上角>>按钮,上传代码就可以发布微信小程序了,最后等待微信团队审核通过,别人就可以在线上访问到你的项目了。
uni-app 的 API 与微信小程序 API 基本一致。掌握微信小程序 API 对后面的开发很有帮助。微信小程序 API 文档:https://developers.weixin.qq.com/miniprogram/dev/api/
1995 年 5 月 23 日,Sun Microsystems 公司宣布 Java 语言诞生, 当时使用 Java 的总人数还不到 30 人,可能包括 Java 语言之父詹姆斯·高斯林在内的大多数联合创始人都无法预想,Java 在未来的二十年间,居然会给互联网乃至我们的生活带来如此深远的影响。目前 Java 提供以下三个版本:Java Platform, Enterprise Edition(Java EE:Java 平台企业版);Java Platform, Standard Edition(Java SE:Java 平台标准版);Java Platform, Micro Edition(Java ME:Java 平台微型版)。2006 年,SUN 公司在 JavaOne 大会上,宣布在 GNU 通用公共协议(GPL)的构架下向开源世界贡献 Java 平台,这次开放的 Java 版本包括了其标准版(Standard)、微型版(Micro)以及企业版(Enterprise)。这是一个具有 “历史性意义” 的改变。
在之前的小节中,我们谈到网络的整个链路很长,每一个环节都有可能存在危险。这种威胁可能是物理硬件,操作系统,操作系统上面的软件漏洞,协议漏洞,甚至是人的某些行为导致,场景非常多而本节主要聚焦 Web 层面的安全问题。
接口有的是写给小组内部开发人员交流使用的,有的是对外开放给第三方调用的,接口文档是程序之间交互的桥梁。支付宝 / 微信 的接口是开发人员使用度比较广的第三方接口,我们经常会去调用他们的支付,小程序相关的接口,下面着重看看他们的错误码是如何定义的。
如下图所示,可以在 postman 请求上述定义好的接口,并且带上需要添加的参数字段,字段名需要和上面接收的一致:{ "name" : "爱因斯坦", "age" : 55, "id_number" : "42011720100512065X", "course_name" : "广义相对论"}请求如下图所示:教师表(teacher)信息如下:课程表(course)信息如下:
首先看看官方文档的部分解释:Base class for code that receives and handles broadcast intents sent by Context.sendBroadcast(Intent).You can either dynamically register an instance of this class with Context.registerReceiver() or statically declare an implementation with the tag in your AndroidManifest.xml.简单翻译如下:Broadcast Receiver 是一个基类,继承自它的类可以用来处理通过Context.sendBroadcast(Intent)发送过来的 intent 信息。与其他组件不同的是,Broadcast Receiver 支持动态注册,即你可以在代码里调用Context.registerReceiver()来注册广播接收器,也可以和 Activity、Service 一样使用静态注册的方式,即在 AndroidManifest.xml 文件中进行注册。这是从“Broadcast Receiver”文档里面截取的一部分,解释的不是很全面。简而言之就是 Android 系统为我们提供了各式各样系统广播,用来给所有 App 推送一些全局消息,如:网络切换、电量变化、耳机插拔、蓝牙断开等等。如果 App 希望获得这些事件,那么可以提前注册一个广播接收器,然后就能收到相应类型的广播了。同时我们还可以自定义一些类型,比如上一节中的音乐播放器,我们可以定义“切歌”为一个广播事件,然后可供其他 App,或者 App 内其他页面去接收。
信息的搜集往往不是单一的,是由类似上面列举的很多方式的组合。我们经常听到一个词 人肉搜索,大家都很惊讶网络神人技术太强,其实主要还是因为我们散布在网上的资料信息太多了。这些零碎的资料拼一拼还是能获得很全的信息的。搜索引擎随便输入你的名字,或者外加几个关键词可能查到你在哪所学校,参加了某某活动,获得了某某名次的奖励你在哪所公司,缴交的一些社保信息你在某个网站的评论根据你的昵称到 QQ 上面搜索,同一个昵称到处用概率还是很大的,如果有手机号那就更加准确了,紧接着可以根据你的 QQ 空间获取更多你私人的信息。(这以前是非常好查的,现在腾讯也一直在完善信息安全这块)也可能是到其他平台去搜索:微博,头条,人人网,58同城 等照片网上搜索相似百度搜索引擎就有根据图片搜索到功能到政府的一些网站,如 信用xx ,上面根据法人名字也能搜索不少有价值的东西。
每个客户端和服务端建立连接的时候,必须把个人用户信息上传到服务端,由服务端统一保存映射关系,如果某个客户端下线了,则服务端监听到连接断开,删除对应的映射关系。其次,发起群聊的时候,需要传递 touser 字段,服务端根据该字段在映射表里面查找到对应的连接通道并发起消息推送。
极坐标与直角坐标一样,都是为了实现用数学方式表达平面坐标位置,两者通常情况下可以互相转换,不过由于直角坐标系的表达方法更直观,更接近人类直觉,所以直角坐标系的使用会更广泛一些。
Flask 是一个 Python 实现的 Web 开发微框架,但是这个“微”并不代表着 Flask 功能比较简陋、有所欠缺。微框架中的 “微” 意味着:Flask 旨在保持核心简单而易于扩展;Flask 不会替用户做出太多决策,比如使用何种数据库;Flask 的选项(比如使用何种模板引擎) 通常有多个,用户很容易替换。默认情况下,Flask 不包含数据库抽象层、模板引擎、身份认证或其它任何已有多种库可以胜任的功能,如下图所示。然而,Flask 支持用扩展来给应用添加这些功能,应用程序可以很方便的集成这些扩展。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。
理解了有序广播之后,无序广播就很容易理解了。无需广播就是没有任何优先级之分,所有广播都是异步同时发送,此时 Receiver 的接收时序也是完全随机的。正因为异步且无需保证时序,所以无需广播更高效,但是不能在各个 Receiver 之间传递数据。
人工智能(Artificial Intelligence),英文缩写为 AI,它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能的研究目标是使计算机能够胜任一些通常需要人类智能才能完成的复杂工作,例如:无人驾驶,通过车载传感系统感知道路环境、自动规划行车路线并控制车辆到达预定目标。机器翻译,将一种自然语言(例如英文)转换为另一种自然语言(例如中文)。语音合成,将文字信息转变为可以听得懂的、流利的人造语音。Python 提供了相关的库用于快速开发人工智能的应用,用户使用 Python 的 AI 库时,不需要深入了人工智能算法的细节,极大的降低了人工智能开发的门槛。TensorFlow 是一个机器学习框架,其前身是谷歌的神经网络算法库,在计算机视觉、语音处理、推荐系统和自然语言处理等场景下有着丰富的应用,是目前最热门的机器学习框架。TensorFlow 提供了 Python、C/C++、Java 等多种编程语言的接口,但是基于 Python 编程接口的 TensorFlow 框架进行开发是最常见的选择。Python 语言的语法简洁、表达能力强,能简单快速聚焦问题本身而不是繁琐底层细节,成为了人工智能编程首选的编程语言。
微前端 尚处在发展时期,其核心概念和 微服务 相似。现阶段较为常用的微前端框架为 single-spa 和 qiankun,后者是基于前者实现的。该技术能做到 技术栈无关,即一个应用,能由多个不同技术的子应用构成,同时做到子应用的相互隔离,这里的隔离就可以选择采用 Web Components 实现。
HTML3.2 以前的标准是由 IETF 制定。IETF 互联网工程任务组(The Internet Engineering Task Force),成立于1985年底,是全球互联网最具权威的技术标准化组织,主要任务是负责互联网相关技术规范的研发和制定,当前绝大多数国际互联网技术标准出自IETF。 IETF 的工作成果主要以RFC文档的途径发布。HTML 3.2 开始,由 W3C 制定标准。W3C 万维网联盟( The World Wide Web Consortium )创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。到目前为止,W3C 已发布了200多项影响深远的Web技术标准及实施指南,如广为业界采用的超文本标记语言( HTML )、可扩展标记语言( XML )以及帮助残障人士有效获得Web内容的信息无障碍指南( WCAG )等,有效促进了Web技术的互相兼容,对互联网技术的发展和应用起到了基础性和根本性的支撑作用。
1. 独立的页面维护了全局 错误码错误码由5位整数构成2. 每个接口一个独立的 参数说明页面正常情况下出参只返回业务实体异常情况才有 errCode errMsg每个接口下也可能有自己的业务错误码
咱们打开新浪微博,然后随便找个带皇冠的,按下F12键(Mac用户按command+option+i)然后选中控制台的箭头,再点击皇冠:再点开这个图片可以发现:可以看到那些大 V 图标皇冠图标以及各种微博认证等图标,都是放在了一张雪碧图里(即使再牛的大 V,身份标志也是放在雪碧图中的)。
顾名思义,有序广播是按照一定的顺序同步进行发送的,也就是每一个 Broadcast Receiver 是按照顺序一个一个的收到消息。而这个顺序优先级依赖于android:priority属性,我们可以在 AndroidManifest.xml 中注册的时候配置优先级,当然优先级越高的 Receiver 会更早的接收到广播,同优先级的 Receiver 顺序随机。在这种情况下,一个广播在一个时间点只会被发送给一个 Receiver。当一个 Receiver 收到广播只会,它可以决定让这条广播继续向更低优先级的 Receiver 发送,或者可以拦截掉这条 Receiver,换言之,高优先级的 Receiver 可以决定低优先级的 Receiver 是否还能收到广播。
本小节实现列出所有联系人的功能,如下所示: def list_person(self): for person in self.persons: print('%s,%s,%s' % (person['name'], person['address'], person['phone']))在第 1 行,定义函数 list_person,实现列出所有联系人的功能在第 2 行,遍历列表 self.persons,循环变量 self.persons 是一个字典在第 3 行,打印变量 person 的内容对每个联系人打印输出一行,假设通讯录中已经存储了张三和李四两个联系人,输出如下:C:\> python addressBook.py1. create person2. list all persons3. query person4. delete person5. quitEnter a number(1-5): 2张三,南京,12306李四,北京,10086在第 7 行,用户选择执行功能 2在第 8 行,打印联系人张三的信息在第 9 行,打印联系人李四的信息
近年来,随着 HTML5 和 w3c 的推广开来,WebSocket 协议被提出,它实现了浏览器与服务器的实时通信,使服务端也能主动向客户端发送数据。在 WebSocket 协议提出之前,开发人员若要实现这些实时性较强的功能,经常会使用一种替代性的解决方案——轮询。轮询的原理是采用定时的方式不断的向服务端发送 HTTP 请求,频繁地请求数据。明显地,这种方法命中率较低,浪费服务器资源。伴随着 WebSocket 协议的推广,真正实现了 Web 的即时通信。WebSocket 的原理是通过 JavaScript 向服务端发出建立 WebSocket 连接的请求,在 WebSocket 连接建立成功后,客户端和服务端可以实现一个长连接的网络管道。因为 WebSocket 本质上是 TCP 连接,它是一个长连接,除非断开连接否则无需重新创建连接,所以其开销相对 HTTP 节省了很多。
今天带来 Android 第三大组件——Broadcast Receiver,可以用于和自己或者其他 App 发送消息,和 Service 一样,它也没有自己的 UI 界面。Broadcast Receiver 的设计模式非常类似发布/订阅模式,可用于做进程间通信(IPC)。通过本节的学习你可以详细的了解到 Android 中广播的作用和使用方法,并且能够将其灵活的运用到实际开发中。
网络爬虫,又称为网页蜘蛛,是一种按照一定的规则、自动地抓取万维网信息的程序。爬虫是一个自动下载网页的程序,它有选择的访问万维网上的网页与相关的链接,获取所需要的信息。爬虫有着广泛的应用:搜索引擎,谷歌百度等搜索引擎使用爬虫抓取网站的页面舆情分析与数据挖掘,通过抓取微博排行榜的文章,掌握舆情动向数据聚合,比如企查查,抓取企业官网的详细信息导购、价格比对,通过抓取购物网站的商品页面获取商品价格,为买家提供价格参考在面向计算机专业的人才招聘市场上,以爬虫为关键字搜索,可以获得大量的职位招聘:
MainActivity 主逻辑的任务就很明显了,接收用户的输入,塞入 intent 并通过 Broadcast 发送出去:package com.emercy.myapplication;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.EditText;import static com.emercy.myapplication.MyBroadcastReceiver.BROADCAST_INTENT;public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.send).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditText st = findViewById(R.id.textMsg); // 将EditText的内容塞到Intent里,通过广播发出去 Intent intent = new Intent(); intent.putExtra("msg", (CharSequence) st.getText().toString()); intent.setAction(BROADCAST_INTENT); sendBroadcast(intent); } }); }}编译运行,在 EditText 中输入任意字符,然后点击“发送广播”,此时 MyBroadcastReceiver 中的 onReceive()方法被触发,从而将我们输入的内容 Toast 出来,如图:
Zookeeper 为了保证 Zookeeper 集群的数据一致性,使用了 ZAB 协议,在正常工作模式下,ZAB 协议会使用消息广播模式来让 Leader 来对事务性消息进行广播,而且只能有一个 Leader 进行广播。接下来我们就来讲解这个消息广播模式是如何工作的。
注册之后我们就可以放心的编写我们的广播接收器了,方法很简单:首先创建一个类继承自BroadcastReceiver,然后覆写onReceive(Context context, Intent intent)方法,其中广播传递的参数就在 intent 当中,我们可以在 onReceive() 方法中取出,代码如下:package com.emercy.myapplication;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;public class MyBroadcastReceiver extends BroadcastReceiver { static final String BROADCAST_INTENT = "com.emercy.CUSTOM_RECEIVER"; @Override public void onReceive(Context context, Intent intent) { CharSequence data = intent.getCharSequenceExtra("msg"); Toast.makeText(context, "接收到的消息: " + data, Toast.LENGTH_LONG).show(); }}通过intent.getCharSequenceExtra()方法获取广播中的参数,然后通过 Toast 进行打印即可。
本小节实现列出所有联系人的功能,如下所示:elif choice == '2': for person in persons: print('%s,%s,%s' % (person['name'], person['address'], person['phone']))在第 1 行,如果 choice == ‘2’,则执行列出所有联系人的功能在第 2 行,遍历列表 persons,循环变量 person 是一个字典在第 3 行,打印变量 person 的内容对每个联系人打印输出一行,假设通讯录中已经存储了张三和李四两个联系人,输出如下:C:\> python addr-manage.py1. create person2. list all persons3. query person4. delete person5. quitEnter a number(1-5): 2张三,南京,12306李四,北京,10086在第 7 行,用户选择执行功能 2在第 8 行,打印联系人张三的信息在第 9 行,打印联系人李四的信息查询联系人本小节实现查询联系人的功能,如下所示:elif choice == '3': name = input('name: ') for person in persons: if person['name'] == name: print('%s,%s,%s' % (person['name'], person['address'], person['phone']))在第 1 行,如果 choice == ‘3’,则执行查询联系人的功能在第 2 行,获取用户输入的 name在第 3 行,遍历列表 persons,循环变量 person 是一个字典在第 4 行,如果用户输入的 name 和循环访问 person 的 name 相同,则表示找到指定的 person在第 5 行,打印变量 person 的内容
其他的代码和读取短信一样,修改的部分就是onClick()中的部分,主要是权限申请和数据读取,修改 onClick() 中的代码如下:if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { int hasReadSmsPermission = checkSelfPermission(Manifest.permission.READ_CONTACTS); if (hasReadSmsPermission != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 100); return; }}ContentResolver resolver = getContentResolver();Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;Cursor cursor = resolver.query(uri, null, null, null, null);while (cursor.moveToNext()) { String cName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String cNum = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); Log.d(TAG, "姓名:" + cName); Log.d(TAG, "号码:" + cNum); }cursor.close();然后在 AndroidManifest.xml 中加入读取联系人的权限:<uses-permission android:name="android.permission.READ_CONTACTS"/>第一次点击的时候同样会弹出以下权限申请弹出,授予之后即可拿到具体的联系人信息。掌握了这两种 Content Provider 的使用,其余的像新增联系人、查询具体联系人等等其实都是换汤不换药,核心思路就是两步:1、申请权限(Android 6.0 以上需要动态申请);2、通过 URI 读取数据。
1985 年,著名美国黑客理查德・斯托曼创立了 GNU 项目计划。 1985 年,同年查德・斯托曼创立了自由软件基金会(Free Software Foundation)来为 GNU 计划提供技术、法律以及资金支持。尽管 GNU 计划大部分时候是由大家自愿无偿贡献的,但 FSF 还是会聘请程序员帮助编写。当 GNU 计划开始逐渐获得成功时,一些商业公司开始介入开发和技术支持。当中最著名的就是之后被 Red Hat 红帽兼并的 Cygnus Solutions。1990 年,成熟的 GNU 计划已经开发出的软件包括了一个功能强大的文字编辑器 Emacs、C 语言编译器 GCC 以及大部分 UNIX 系统的程序库和工具。唯一依然没有完成的重要组件,就是操作系统的内核。1991 年,Linux 之父林纳斯・托瓦兹编写出了与 UNIX 兼容的 Linux 操作系统内核并在 GPL 条款下发布。Linux 之后在网上广泛流传,许多程序员参与了开发与修改。1992 年,林纳斯的 Linux 与其他 GNU 软件开始结合,完全自由的 Linux 操作系统正式诞生。该操作系统往往被称为 “GNU/Linux” 或简称 Linux。许多 UNIX 系统上也安装了 GNU 软件,因为 GNU 软件的质量比之前 UNIX 的软件还要好。GNU 工具还被广泛地移植到 Windows 和苹果 Mac OS 上。现在,GNU 项目计划十几年以来已经成为一个对软件开发主要的影响力量,创造了无数的重要的工具,例如:编译器,文本编辑器,甚至一个全功能的操作系统。这个工程是从 1984 年麻省理工学院的程序员理查德・斯托曼的想法得来的,他想要创建一个自由的和 UNIX 类似的操作环境。从那时开始,许多程序员聚集起来开始开发一个自由的、高质量、易理解的软件。
当我们共享项目时,必须将本地修改推送到远程。使用命令:git push ”。如果想将本地 master 分支推送到 origin 服务器那么可以运行下面的命令将已完成的所有提交推送回服务器(关于分支的概念后续会讲,此处先理解成本地库):$ git push origin master注意:(1)本地执行 “push” 推送之前,必须先使用 “git add” 和 “git commit” 命令提交。关于这两个命令,后续会系统讲解。(2)只有当从服务器克隆下来后并且此期间没有人推送时,推送命令才有效。如果同事也克隆了一份到他们本地,并且他们修改后又推送到服务器,那么你的推送将被拒绝。必须先使用 "git pull" 命令获取他们的修改,然后将其合并到你的工作仓库中,最后才能进行推送。关于这部分说明,同学们可能还会有些地方存在疑惑,很正常。因为我们有些细节还没讲到,后续慢慢就明白了。这部分操作视频如下:152
TXT 文件是一种文本文件,里面存储的数据格式每一行表示行数据,列数据则是通过某种分隔符对一行的数据进行拆分的,下面是一个 TXT 数据文件举例。书名,作者,出版日期,价格python从入门到实战,埃里克,2020,85python数据分析,丹尼尔,2020,80python爬虫技术,李宁,2020,79疯狂python讲义,李刚,2019,113大数据处理,石宣化,2018,43人工智能,史蒂芬,2018,97深度学习,伊恩,2017,152人工智能算法,杰弗瑞,2020,53人工智能简史,尼克,2017,24我们新建了一个记事本文件命名为: pandasDataDemo.txt ,里面添加了一些人工智能相关的书名、作者名、出版日期和书的价格,这里我们使用的是 “,” 分割符进行分割列数据的。