SWBlog icon indicating copy to clipboard operation
SWBlog copied to clipboard

machine learning practitioner, android and python

Results 20 SWBlog issues
Sort by recently updated
recently updated
newest added

前不久Google IO 2017不仅将kotlin宣布为官方开发语言,还发布了谷歌官方 Android 应用架构库,这个新的架构库旨在帮助我们设计健壮、可测试的和可维护的应用程序。新项目也打算采用这套架构,下面一步步介绍怎么去配置和使用这套架构。(最简单介绍,详细内容看官方文档和其他参考资料) ### 总览 ![项目架构](https://user-images.githubusercontent.com/10796970/56851557-076fbf00-6943-11e9-843b-a87378efa16e.png) 简单说来,该架构由数据驱动, 彻底将UI和data分离,UI层很轻,不涉及任何数据的操作的内容。ViewModel将数据的变化的反映在UI上,本身也不持有数据。官方推荐所有数据持久化。viewmodel通过Repository来管理数据,保存到数据库或者从网络获取。 ### kotlin的配置 本次打算使用kotlin来进行开发 新建一个项目,完成后在project/build.gradle添加以下内容 ``` //对照添加 buildscript { ext.kotlin_version = '1.1.2-5' repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.1' classpath...

Android

## 自定义Collection的高阶函数 接上篇文章,其简单介绍了纯函数,高阶函数,写了几个简单将函数当做输入输出的例子。 现在来自定义我们的高阶函数。 首先来看最简单的forEach: ``` fun main(args: Array) { val list = arrayListOf(1, 4, 7) list.forEach { println(it) } // 1, 4, 7 } ``` 看一下源码 ``` public inline...

Android

## 自定义 AlertDialog 对话框 目前AlertDialog已经足够全面,包括简单,列表,多选列表对话框,可以满足大部分日常开发。 这里自定义一个对话框, 了解一下material design关于对话框的相关标准。 首先定义一个`TextView`的扩展方法(非常建议, 可以获取context), 如下: ``` fun TextView.countDown() { val frameLayout = FrameLayout(context) val rootView = LayoutInflater.from(context).inflate(R.layout.view_count_down, null) val mobileView = rootView.find(R.id.vcd_et_mobile) val codeView...

Android

# Rxjava2的listener和响应式解惑 标签(空格分隔): 知乎 --- 最近两天一直在被 Rxjava2 的一些用法困扰,比如怎么去写一个 observable 的 listener, 怎么去体现响应式(观察者模式)。网上找了大部分资料,都只涉及怎么简单用订阅,链式发送字符串。 最终在 **stackoverflow** 找到了灵感,特此记录: -------- ## 实现一个Obervable的listener [灵感来源:http://stackoverflow.com/questions/25457737/how-to-create-an-observable-from-onclick-event-android](http://stackoverflow.com/questions/25457737/how-to-create-an-observable-from-onclick-event-android) 这是一个例子,对大部分监听都适用。使用场景如下: 比如想在 button 点击后异步去获得数据,成功后再主线程更新 UI。实现如下: ``` //注意listener的实现 Observable.create(new ObservableOnSubscribe() { @Override...

Android

前面文章讲到怎么提取动态网页的全部内容。接下来返回文章一,怎么登录并且保存登录状态,以便带上cookies下次访问。 ## 步骤 1. 利用selenium登录知乎, 登录成功后保存cookies 到本地。 2. 请求之前读取cookies, 加载cookies访问,看是否成功登录。 ### 详细步骤: 1. 利用selenium登录知乎 回到文章一, 从[自从有了知乎,再也不用找福利了……](https://www.zhihu.com/collection/146079773)链接开始。 从提取标题开始: ![image.png](http://upload-images.jianshu.io/upload_images/1794675-4ea604036fa81b0f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ``` if __name__ == '__main__': url = 'https://www.zhihu.com/collection/146079773' res = requests.get(url, verify=False)...

Python

上一篇文章实现的最简单的爬虫,抓取了某个链接下第一次加载的所有图片链接。因为存在下拉刷新, 因此怎么获得该页面的全部答案是这篇文章需要去处理的事情。 ## 方案: 1. 抓包,看下拉刷新向服务器发送什么请求,模拟去发送请求(结构化数据适用) 2. selenium执行js的滑动到底部,判断是否滑动到底部,以此循环。 ## 具体实施; 这里选择使用方案2,方案1后面遇到再讨论。 一:selenium的简单使用。 这里涉及selenium的安装,[Selenium with Python](http://selenium-python.readthedocs.io/)官方文档讲解的特别简单。我使用的的chrome(可以配置无头属性)。 **注意**:需要将下载的driver配置环境变量,以便可以访问。 ``` if __name__ == '__main__': options = webdriver.ChromeOptions() options.add_argument('headless') # driver = webdriver.Chrome(options=options) driver...

Python

以前也有写过爬虫,抓过网易云歌单和豆瓣读书的数据,当时有两个问题解决的不够好, 自动化和登录。最近花时间用scrapy去写,自认为更好的解决了上述问题。这篇文章当作一个记录,也可当作学习教程(需要BeautifulSoup, selenium基本知识)。 ## 目标 用scrapy去抓取[自从有了知乎,再也不用找福利了……](https://www.zhihu.com/collection/146079773)收藏夹下每一个答案下的全部图片。 ### 简易步骤 1. 账号登录知乎,抓取全部答案的链接(去除重复文章,大概39个答案)。 ``` {'url': '/question/36007260', 'title': '女生坚持健身是种什么样的体验?', 'dec': ['健身']} {'url': '/question/22132862', 'title': '女生如何选购适合自己的泳装?', 'dec': ['泳装']} {'url': '/question/22918070', 'title': '女生如何健身锻造好身材?', 'dec': ['健身']} {'url':...

Python

前面的文章介绍了怎么用scrapy去完成一个爬虫,涉及动态抓取和登录等操作。这篇文章简单介绍怎么让爬虫运行在服务器的docker里。 ## 步骤 1. 利用sshfs将服务器磁盘挂载到本地,实现本地开发,省去同步代码等步骤。 2. docker通过pull或者Dockerfile拉取镜像。 3. 通过docker-compose配置镜像,在启动的镜像里启动爬虫。 ### 详细步骤: 首先安装sshfs工具,可以参考网上教程。 接着切换到个人目录,新建 `aliyun`文件夹。 ``` localhost:~ swensun$ cd ~ localhost:~ swensun$ mkdir aliyun localhost:~ swensun$ sshfs 120.78.202.210:/ aliyun/ ``` 之后输入密码,打开aliyun目录,即可看到的服务器上的目录挂载到了本地,可以本地编辑,保存。...

Python

说明:本文章在上篇的基础上,代码在Android的环境中运行,当然可以单独写。 后面的文章就不跟Android代码联系,最后再回到Android, 写一个柯里化和函数式编程的例子。 ## 纯函数 上篇文章提到一下纯函数, 类似两个数的加法这样: ``` fun add1(a: Int, b: Int): Int { return a + b } ``` `纯函数可以理解为一种 相同的输入必定有相同的输出的函数,没有任何可以观察到副作用` 纯函数的输出只取决于输入,输入定责输出定。在笔者写Android的过程中,尽量使用纯函数,较少副作用。 关于上面的函数,可以写成如下的形式: `fun add2(a: Int, b: Int)...

Android

#### 记录本身,即已是反抗 首先下载`mongo`镜像,简单命令不做过多叙述,前面文章有介绍怎么基本使用docker。 之后编写`docker-compose.yml`文件,运行 `docker-compose up -d`生成容器并后台启动。 ## root创建 ``` // docker-compose.yml // command:启动是的命令行参数,添加认证auth version: '2' services: mongodb: image: mongo ports: - 27017:27017 volumes: - "./data/configdb:/data/configdb" - "./data/db:/data/db" command: mongod...

Docker