简世博客

一个简单的世界——博客空间,写了一些Android相关的技术文章,和一些点滴的想法

0%

coursera machine-learning-ex4 课程作业记录

最近在学习 coursera 上 吴恩达 的机器学习课程,记录一下作业答案。
这一周的题目难度明显加大了,花了比之前多得多的时间才完成

Neural Network Learning



阅读全文 »

coursera machine-learning-ex3 课程作业记录

最近在学习 coursera 上 吴恩达 的机器学习课程,记录一下作业答案。

Multi-class Classification and Neural Networks


阅读全文 »

coursera machine-learning-ex1 课程作业记录

最近在学习 coursera 上 吴恩达 的机器学习课程,记录一下作业答案。

Linear Regression

第一次编程作业,非常简单,按照教程一步步来就行了,下面是答案

阅读全文 »

最近在研究机器学习,身为一个重度游戏爱好者,看到各种ai打游戏的算法都是基于gym这种封装好的游戏api来实现的,便有了通过录屏来封装一个ai训练环境的的想法,花了一个星期的晚上来尝试,还是没有做出实际有用的东西,就在此时。CSDN的微信公众号给我推送了一篇2017年python开源项目top30,扫了一下,竟然发现了SerpentAI这么好的东西,把我的想法完全实现了。

在此简单记录一下,之后有时间要找几个简单的游戏试一下这个框架。

github : https://github.com/SerpentAI/SerpentAI

SerpentAI:基于 Python 的教 AI 打游戏的学习框架

SerpentAI 旨在为机器学习和 AI 研究提供一个有价值的工具。但同时,对于爱好者来说,它也是非常有趣的。

Serpent.AI 中包含大量支持模块,在以游戏为开发环境时经常遇到的场景提供解决方案,同时也提供加速开发的 CLI 工具。支持 Linux、Windows 和 MacOS 。

SerpentAI 是一个 Game Agent 框架(ps:在人机对战中,为了区分玩家,通常称机器玩家为 agent ),简单而又强大。它能把任何一个游戏变成用 Python 编写的沙盒环境,供开发者在其中创造游戏 Game Agent 做实验,使用的都是开发者非常熟悉的 Python 代码。

AddTryCatch插件的作用——编译期加tryCatch,支持向第三方库中加tryCatch

在平时开发过程中,无可避免的会遇到crash,如果是自己写的代码里抛出异常还好,把相关代码逻辑改好即可。但是遇到集成到项目中的第三方库抛出异常,又无法通过自己可修改的代码部分规避问题,就只能依赖第三方库开发者修复问题,再发布新版本了。
而现实中遇到的第三方库,能在提issue后快速修复问题并发布新版本的实在是少之又少。这种情况下,我们就十分被动了。

每当这时候,我就在想:如果能修改第三方库中的代码就好了! 不求能精准修改逻辑,仅仅是能加上try catch就不错了,如果能在catch后捕获到异常,能再调用自定义的代码处理该异常,就更好了!

而这个AddTryCatch,就是为此而生的。

这个插件,可以通过简单的配置,做到在编译期修改字节码的效果。
因为是在编译期在字节码的层面上修改,所以不管是自己写的代码,还是引用的第三方库中的代码,都可以修改

阅读全文 »

在上一篇AddTryCatch gradle plugin 编译期给代码加try catch的插件中介绍了AddTryCatch插件的使用方法,这次我们来一步步实现一下AddTryCatch插件。

参考这篇文章,可以快速开发一个gradle插件,记录了我很多的探索和踩坑,看完这篇文章直接就可以上手开发插件了,绝对比网上其他绝大多数教程介绍的步骤要简单的多。

本文中
1. 使用了java开发,而不是网上清一色的groovy,没有语言学习门槛;
2. 使用buildSrc目录开发,不需要创建单独的plugin module,也省去了测试的时候要先发布的麻烦;
3. 使用java-gradle-plugin插件,所有配置都写在gradle文件里,不需要单独创建resources/META-INF/gradle-plugins/pluginName.properties配置文件
吐槽一句:真是天下文章一大抄,网上的gradle插件开发文章,全是几年前的旧开发模式,互相抄来抄去,学不到新东西。一开始我还以为gradle插件开发真的很难,后来仔细看了gradle的官网文档,才发现,现在开发gradle插件已经非常容易了。

先附上源码地址:https://github.com/xingchenxuanfeng/AddTryCatchPlugin

阅读全文 »

 最近被问到android Input系统事件分发流程,虽然有看过相关源码,但是只是匆匆一瞥,没什么印象,解释了半天自己都晕了,甚是尴尬。特地重新看了一遍,整理在博客上,加深一下印象。

 网上对android的事件分发流程的讲解很多,我就不具体铺代码了,找了几张程序流程图,帮助理解。


估计大家没耐心看这么多流程图,把总结放在前面:

1 Kenel收到InputEvent放到EventHub里

2 InputReader从EventHub读InputEvent并且传给InputDispatcher来分发

3 WindowManagerService在app端setView的时候就创建了一对Socket连接,InputDispatcher利用这个Socket连接和app端通信。这里实在是有些奇怪,在android系统里,几乎所有的跨进程通信都是binder,唯独这里用了Socket,不能理解。

4 app端的ViewRootImpl里面的InputEventReceiver会接到从Socket得到的InputEvent。

5 然后给第一个InputStage处理这个InputEvent,如果第一个InputStage不消费该InputEvent,就给第二个InputStage,还不消费就给第三个,直到给了ViewPostImeInputStage后,如果它可以消费的话,执行它的onProcess方法,该方法里面再经过几次调用就到了大家熟悉的dispatchTouchEvent方法。至此,app就可以处理input事件了。


阅读全文 »