alwaystest

Results 88 issues of alwaystest

# Unity3D JsonUtility处理数组 标签(空格分隔): Unity3D --- Unity3D自从5.3.3开始提供了JsonUtility的API,用来做JSON相关的处理。 但是使用JsonUtility不能直接处理数组,比如: ``` public class player{ public string playerId; public string playerLoc; } player[] p = new player[5]; for (int i = 0; i...

# 使用Dagger2进行依赖注入 标签(空格分隔): Android 测试 Dagger2 --- # 废话· 前言 前段时间在尝试使用MVVM模式来编写程序,我负责写ViewModel部分,于是就想搞一搞Android的自动化测试,本来是想直接连带网络请求一并测掉,后来才发现一般测试只负责程序的逻辑,是脱离网络的。而且现在的代码使用的是Volley来处理网络请求的,因为异步所以不方便测网络请求部分。那就测测逻辑吧。 首先我必须承认Dagger2的学习是有一定难度的。首先把google出来的关于Dagger2的文章,连同Android单元测试的文章都看了一遍。然后才开始能一点一点使用起来,但还是处于模糊状态。这里默认读者已经可以**初步**使用起来Dagger2了(就是 可以使用`@Module`,`@Provides`,`@Component`,`@Inject`这么几个注解),就记录一下我的理解,有错误的地方还请大家指出。 ## 我看过的文章列表: 1. https://github.com/frogermcs/GithubClient frogermcs写的一系列文章,教怎么使用Dagger2 2. http://www.jianshu.com/p/65737ac39c44 牛晓伟写的一系列文章,帮助理解Dagger2是干嘛的,Dagger2的工作方式。 3. http://chriszou.com/ 小创写的一系列Android单元测试的文章,第六篇重点介绍Dagger2的用法。 # 正文 反正Dagger2就是一个高级一些的工厂模式,帮助程序员从繁琐的`new`方式新建对象中解脱出来,自动解决依赖关系,更改工厂的实例化方法就能全局生效,很方便。 由于Android单元测试的时候一般使用Mockito,需要把被调用的模块替换成Mock出来的对象,如果使用传统的方式在代码里面直接`new`是 不能测试的,这个时候一个简单的解决办法就把被调用的模块对象通过函数参数的方式传递到函数体内,这样在运行环境传入正常对象,在测试环境传入Mock出来的对象就可以达到方便测试的目的。这就用到了Dagger2的Constructor Injection。Field...

# 第一行代码 网络编程实践 浅见 标签(空格分隔): 未分类 --- 书上是这么写的: > 在sendHttpRequest()方法中开启了一个线程来发起HTTP请求,服务器响应的数据是无法进行返回的。……。sendHttpRequest()方法会在服务器还没来得及响应的时候就执行结束。……。解决方法只需要使用Java的回调机制就可以了。 这里就把我弄糊涂了,添加了一个回调的函数也不会引起哪里阻塞,怎么会这么说呢? 写代码验证。 ``` package com.software.eric.coolweather.util; import android.util.Log; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; /** * Created...

# Android Theme 及透明状态栏 杂记 标签(空格分隔): Android Theme --- ### Inheritance 继承 首先,Styles下面的主题继承有两种方式 1. 指定parent: `` 2. 使用`.`表示继承关系: `` 表示继承自AppTheme。 > 当使用parent指定父Style后,前缀方式则不在其作用,只是作为Style的名字。也就是说:Android的Style不支持多继承。[出处](http://blog.iderzheng.com/android-style-inheritance/) --- 兼容性处理 > 使用Theme.AppCompat开头的主题。 > Android5.0新增的属性在使用时将命名空间android去掉,这样就会使用AppCompat的自定义属性,交予AppCompat做兼容性处理。[出处](http://yueban.github.io/2015/03/19/Material%20Design%E5%AD%A6%E4%B9%A0%E2%80%94%E2%80%94style/) 注:此处找了半天 没有找到相关资料,TODO:XML的NameSpace原理。[相关](http://stackoverflow.com/questions/29337738/how-does-appcompat-library-styling-work)...

# 深夜Debug发现的一个坑 标签(空格分隔): 前端 浏览器 爬虫 NodeJS --- 使用NodeJS写爬虫来获取一些信息,解析`table`的时候居然出错了。在选择器中使用`tbody`来去除`thead`中的数据,但是选择器中一旦出现`tbody`,就什么都选不出来了。 明明是使用浏览器的开发者模式找出来的选择器,怎么会出问题呢,而且选择器选择`thead`的时候还好好的。 最后灵机一动,直接查看网页源码,根本就没有`tbody`这个东西嘛。 搜索资料发现: > 一个表格应该有表头,若直接写tr>td这样的结构,浏览器会自动创建一个tbody包裹 看来浏览器也不是百分之百可以相信的呀。 [参考](http://guowenfh.github.io/2016/01/18/Bootstrap-01-typesetting/?utm_source=tuicool&utm_medium=referral)

# NodeJS 标签(空格分隔): NodeJS --- [NodeJS入门参考](https://github.com/alsotang/node-lessons) 使用NodeJS写爬虫,为了解决登录问题,费了一些时间。 首先使用浏览器监听登录的网络请求,查看POST发送的数据。现在好多网站在登录之前都喜欢用JS先处理一下数据,比如添加一些隐藏字段,MD5加密等等,可以在浏览器的控制台直接键入点击事件调用的方法的名字,会返回方法所在的文件及行数,可以快速找到方法所在的位置,目前还没有仔细钻研JS函数的作用域问题。 这么一来发送的数据和接口就一目了然了。接下来就是比较麻烦的地方了,网站存储用户session数据基本都是使用cookie的,要想实现登录之后继续干点别的坏事,就必须把cookie存储下来,下次请求的时候发送出去。 我使用的是一个叫Superagent的model来做网络请求的,因为之前抄的别人的代码做爬虫就是用的Superagent,设置请求头,post和get数据方法直接看源码介绍。对cookie的处理,我找到这么一个说法[StackOverflow](http://stackoverflow.com/a/12735003)。答案里面的Readme链接已经失效,目前最新的Readme文档里面没有这条说明,但是在SuperAgent的`agency.js`测试里面却有这么一个用法,使用superagent.agent()对象先去访问一次setcookie的链接,然后在使用同一个对象去访问getcookie的链接,很明显cookie是被保留的,这里就解决了cookie的办法,**但是看评论里面这么处理cookie好像是有问题的,但是目前我还没有遇到,那么就先这么用吧。** 根据[这里](http://stackoverflow.com/questions/9536516/get-a-cookie-with-nodejs),request模块有内建的cookie处理,所以下一步可能使用request来做爬虫。目前还没有实践。 --- 使用BlueBird来处理JS的回调问题。使用BlueBird的promisify方法是需要被promisify的方法有一个cb函数来做参数的,cb函数调用的地方,就是then里面定义的函数执行的地方。 #### 指定函数执行顺序 参考:http://www.html5rocks.com/zh/tutorials/es6/promises/ > 当你从“then”的回调函数返回的时候,这里有点小魔法。如果你返回一个值,它就会被传给下一个“then”的回调;而如果你返回一个“类 Promise”的对象,则下一个“then”就会等待这个 Promise 明确结束(成功/失败)才会执行。 有一个需求,要求先使用帐号登录,带着cookie做一系列操作,然后注销。这里需要按照顺序执行。之前使用Promise,then方法里面返回的是数据,导致**注销和一系列操作同时执行**了,即使方法是 ``` login() .then(doSth) .then(logOut) ``` 这里需要doSth方法返回一个**类Promise对象**,才能保证louOut是在执行完一系列操作之后才执行的。 --- 使用livepool全局代理来监听...

# IOS实现GitLab-CI 标签(空格分隔): GitLab-CI --- `xcodebuild build -workspace xxx.xcworkspace -scheme xxx -destination 'platform=IOS Simulator,name=Iphone 6s,OS=9.2'` 使用指定workspace的方式编译的时候需要该workspace下有对应的scheme,表现为在项目目录下执行`xcodebuild -workspace xxx.xcworkspace -list`,会显示出对应的workspace下的scheme。 **如果没有scheme文件的话,编译会不动。** OS X 下有一个小坑,编译IOS代码的时候,突然提示一个依赖项目里面的头文件不存在,而IOS项目组的小伙伴们就没有这个问题,想起来项目代码pull的地址是放在一个新格式化的磁盘中的,这个磁盘的格式是**OSX扩展区分大小写**的,估计写这个依赖项目的人的配置也是不区分大小写的,换个pull的位置就好了。 使用`gitlab-ci-multi-runner install`安装服务的时候,指定`-d`选项指定项目代码默认下载的地址。

# GitLab持续集成 标签(空格分隔): GitLab-CI GitLab-CE Docker --- GitLab 使用Runner来跟CE通讯,通过调用API的方法跟CE交互。获取项目的最新更新,运行`.gitlab-ci.yml`里面的命令,来达到编译,单元测试,自动部署等目的,并将结果返回给GitLab-CE。 这里使用Docker来创建Runner的容器。 使用Docker创建Runner的容器 参考:[官方文档](https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/install/docker.md) #### 注意: 1. 官方文档里面启动容器的命令不能照抄,首先得知道 `docker run -v` 里面 `-v`的功能。是把Host的目录映射到容器里面去。而对于OS X,Host指的是Virtual Box 创建的VM。而每次重新启动VM的时候,保存在里面的数据会丢掉(我自己做实验确认过的)。如果原封不动的按照官网操作,Runner注册时生成的数据不会保存,重启机器以后注册过的Runner直接就失联了。 - 解决办法: OS X 下启动VM的时候默认会把用户的`/Users`目录共享到VM里面,在创建容器 的时候直接把`-v`后面的目录写到`/Users/xxx/gitlab`就好了。(可能需要先手动建立目录)。...

# 使用Docker创建虚拟机 标签(空格分隔): Docker --- ### 2016-03-30 Update : 果然学一个新的软件的时候,首先应当好好的阅读官方文档,**即使是英文**。 在Docker的官方文档里面说的很清楚,在OS X的系统上面,Docker的容器运行在一个Linux的VM中,而这个VM是VirtualBox创建的。所以之前即使指定了host模式来运行容器,外部也没有办法访问到容器里面的服务,除非外网能直接连接到VM的IP。原来的操作不管是使用`-P`还是`-p 80:8080`,都是把VM的端口转发到容器当中,对宿主机器当然没有影响了。所以访问`localhost:8080`是找不到页面的。 而在Linux的系统上面,去掉了中间层的VM,所以我在VPS上面搭建的服务是直接可以用的。 PS:由于网络方面接触的少,不会通过各种工具验证容器的服务是否已经对外开放,选了个笨办法,建立一个nginx的容器,尝试从外部访问nginx的index,如果能访问到,就说明这么做建立的容器是可以在外网访问到的。 ### 最终: 截至目前,Docker-machine 并没有提供官方的桥接方式的VM创建方法,手动修改VM的网络模式会影响docker-machine工作,[参考](https://github.com/docker/machine/issues/1491)。所以VM默认的网卡全部不能修改,**顶多手动添加第三个网卡工作在桥接模式**,但是这样又会出新的错误,但是起码还可以通过某些方式让docker正常工作,详见**上面参考**。 现在知道服务器为什么总是用Linux系列的系统了。 ### 2016-04-15 终于发现可以利用Virtual Box的端口映射功能,把Host的端口映射给VM,从而实现暴露容器端口的功能。需要通过配合`-p`使用。 --- ### [Docker入门--极客学院](http://wiki.jikexueyuan.com/project/docker-technology-and-combat) ### [Chinese_Docker](https://github.com/widuu/chinese_docker/blob/master/SUMMARY.md) 基本的命令上面基本已经说的很清楚了。...

# 后端开发记录 16.03.23 标签(空格分隔): PHP Codeigniter VIM --- - 在操作数据库的时候,有这么一个需求,获取当前表中某一列的最大数据并返回,如果表中没有数据,返回1。 ``` select_max('xxx','max'); //获取到某一列的最大值. $query = get('table'); if($query->num_rows()>0){//always true, even table is empty. do sth... } ``` `select max()` 函数返回值总有一行,即使是NULL。所以num_rows()计算到的行数总是大于0. 返回值是一个set。...