SWBlog
SWBlog copied to clipboard
machine learning practitioner, android and python
前不久Google IO 2017不仅将kotlin宣布为官方开发语言,还发布了谷歌官方 Android 应用架构库,这个新的架构库旨在帮助我们设计健壮、可测试的和可维护的应用程序。新项目也打算采用这套架构,下面一步步介绍怎么去配置和使用这套架构。(最简单介绍,详细内容看官方文档和其他参考资料) ### 总览  简单说来,该架构由数据驱动, 彻底将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...
## 自定义Collection的高阶函数 接上篇文章,其简单介绍了纯函数,高阶函数,写了几个简单将函数当做输入输出的例子。 现在来自定义我们的高阶函数。 首先来看最简单的forEach: ``` fun main(args: Array) { val list = arrayListOf(1, 4, 7) list.forEach { println(it) } // 1, 4, 7 } ``` 看一下源码 ``` public inline...
## 自定义 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...
# 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...
前面文章讲到怎么提取动态网页的全部内容。接下来返回文章一,怎么登录并且保存登录状态,以便带上cookies下次访问。 ## 步骤 1. 利用selenium登录知乎, 登录成功后保存cookies 到本地。 2. 请求之前读取cookies, 加载cookies访问,看是否成功登录。 ### 详细步骤: 1. 利用selenium登录知乎 回到文章一, 从[自从有了知乎,再也不用找福利了……](https://www.zhihu.com/collection/146079773)链接开始。 从提取标题开始:  ``` if __name__ == '__main__': url = 'https://www.zhihu.com/collection/146079773' res = requests.get(url, verify=False)...
上一篇文章实现的最简单的爬虫,抓取了某个链接下第一次加载的所有图片链接。因为存在下拉刷新, 因此怎么获得该页面的全部答案是这篇文章需要去处理的事情。 ## 方案: 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...
以前也有写过爬虫,抓过网易云歌单和豆瓣读书的数据,当时有两个问题解决的不够好, 自动化和登录。最近花时间用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':...
前面的文章介绍了怎么用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目录,即可看到的服务器上的目录挂载到了本地,可以本地编辑,保存。...
说明:本文章在上篇的基础上,代码在Android的环境中运行,当然可以单独写。 后面的文章就不跟Android代码联系,最后再回到Android, 写一个柯里化和函数式编程的例子。 ## 纯函数 上篇文章提到一下纯函数, 类似两个数的加法这样: ``` fun add1(a: Int, b: Int): Int { return a + b } ``` `纯函数可以理解为一种 相同的输入必定有相同的输出的函数,没有任何可以观察到副作用` 纯函数的输出只取决于输入,输入定责输出定。在笔者写Android的过程中,尽量使用纯函数,较少副作用。 关于上面的函数,可以写成如下的形式: `fun add2(a: Int, b: Int)...
#### 记录本身,即已是反抗 首先下载`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...