gongmingqm10

Life is a journey, not a destination

如何上传 AAR 到 Jcenter

自我进入到代码这个行业开始,就有前辈早早告诉我要积极活跃在开源社区,于是认识了 github, 然后也见识到了开源社区的魅力之处。看到大神们都会积极贡献自己的开源仓库,自己也被这种开源精神感动到了。过程中我也尝试写过一些小框架,但是发布到 jcenter 上,所以知名度大大降低。

相比于几年前,现在直接拷贝源代码到自己工程中的做法越来越少了。得益于 Android 使用 Gradle 管理依赖,更多的人选择将开源仓库发布到 jcenter 中,然后被更多的人使用。今天我们将尝试从零开始,一步步上传自己的应用到 Jcenter,然后优雅的通过 gradle compile 'x.y.z:a:0.0.1' 引用。

Read on →

国内项目三月记

意外的加入了国内项目,一待就是三个多月。之前常驻国外项目,一下子跳转到国内项目,对比还是很明显的。由于工作环境的限制,我们只得常驻客户现场 (暂称为A厂)。工作内容是在一个遗留Android App上继续开发,时间紧任务重,整个团队一起努力,项目最后还是获得了不错的成绩。过程中对于当前的工作也有了一点点心得体会:

关于烂代码

现状

项目前后经手过两三个团队,经历过两三年。看到代码的一刻,整个人都惊呆了,深度超过10层的逻辑嵌套,超过 1500 行的 Activity 文件,重复代码片段可以重复到10多处,莫名其妙的非空判断,随处可见的私吞Exception,哭笑不得的代码注释,从来不敢删除的注释代码(约30%)……

Read on →

Know more about Android Inflater.inflate()

在 Android 开发中,有很多看起来 “约定俗成” 的代码,有时候不妨停下来想一想深层次的含义。最近我在给 Fragment 填充布局时,写到一句熟悉的代码:

1
2
3
4
5
6
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_main, container, false);
    return view;
}

我又一次陷入了思索,其中的第三个参数 false 到底是什么意思,此处能不能变为 true

Read on →

ButterKnife Principle

ButterKnife 原理

最近在研究 Java 中的 Annotation,初衷是先了解注解,然后再了解下 Android 开发中常用框架的原理。经历的 Android 项目中,使用注解比较多的是:ButterKnife, Roboguice, Dagger 。ButterKnife 主要是 View Binding, 而 Roboguice 和 Dagger 则主要是做 DI(Dependency Injection)。本文主要研究 ButterKnife 的原理。

开始之前,还是应该向 ButterKnife 的作者 Jake Wharton 大神以及开源社区致敬。

Read on →

张家界所见

张家界

计划了许久的旅行在四月份如期进行了,由于时间原因,这次的旅行并没有女生的参与。只是三个纯爷们的一次“放空”。上次的旅行还是14年大学毕业那会儿,掐指算来,两年一次的旅行似乎也并不过分。于是我们心安理得的去了。我们的主要游览地是张家界森林公园,返程特地路过湖南,体验下湖南的美食。

旅行社的利益链

我们每次都是想做计划的,但是对于张家界这种景点诸多的地方,我们刚开始的计划似乎不奏效了。所以三个人都是糊里糊涂的去了张家界。

对于旅行社,一开始我们甚至是拒绝的,所以我们一开始就没有在网站上提前报团,因为我们希望来一场轰轰烈烈的自由行。然而等我们到达张家界,走进汽车站的那一刻,我们注定要被旅行社牵着鼻子走。

Read on →

App 本地化解决方案

前言

“本地化” 这个词对大家而言并不陌生,文艺点的解释大概就是 “入乡随俗” 吧。当然我们这里的本地化主要指的软件产品的本地化。对于某个国外应用,如果需要投放到中国市场,需要注意哪些问题呢?本文主要从开发的视角来探讨应用本地化的问题。

Read on →

再见 2015, 你好 2016

前天刚完成公司的 Annual Review,通过 Annual Review 也回顾了自己 2015 年工作中的所有事情。我并不是个擅长书写的人,于是我也很担心写着写着就跑题了。但是还是想总结一些过去的一年,当作回忆吧。

工作

2015年的工作上还是过得比较精彩的,至少比2014年精彩。2015年算做我在公司的第二个年头,但是在武汉这个年轻的集体里面,我们这一届俨然也成为了公司的“老人”。老人就应该有老人的作风,比如带新人,比如承担办公司的一些事情,比如逐渐在项目中承担重要角色,也比如深化自己的知识。

从工作上来看,今年前后经历了三四个项目,我在项目中的角色都是 Android 开发。难得我几年的 Android 开发经验终于还是没有荒废,似乎还真派上了点用场。不过真心的,和以前相比,虽然在 TW 并没有太多的 Mobile 项目机会,但是那些少量的机会如果抓住了,的确可以使人收获颇丰。以前比较偏使用,现在为了能够给别人讲清楚,只好去了解事情的本质。于是开始慢慢习惯通过源码、资料等接触事务的本质,并做相应的总结分享。

Read on →

Android 转屏那些事儿

在 Android 开发或面试过程中,屏幕旋转是一个容易让人忽视的知识点。在我之前经历的项目中,App 通常是为竖屏状态设置的,所以通常我们会对每个页面都设置竖屏方向,这时候我们不需要考虑旋转屏问题。但是最近项目中,我们的 App 是为平板设计的,而横竖屏旋转是属于客户的一个需求,当然平板上横竖屏的确比较常用。所以就借此机会研究了下 Android 横竖屏问题。

Android 横竖屏

Read on →

Android 新手成长计划

Android starter

最近在公司里开始遇到了新人培养的问题,新人被 assign 到 Android 项目上,为了让他能够很快有所产出,于是我们得思考怎么样快速锻炼一个新人并让他对 Android 开发产生兴趣并持续做下去呢?当然也会有一时兴起的同事会想着学习 Android,Android 入门门槛不高,但是要想真正的熟练驾驭,确实是一件道阻且长的事情,需要付出额外的努力。

Read on →

Android Adapter notifyDataSetChanged not working

刚开发 Android 开发时,总是遇到一个看似很简单的问题 “Android Adapter notifyDataSetChanegd 不生效”,而每次解决这个问题的方法总是简单粗暴,直接了当。大概是以前的时候做事以结果导向,所以对于这些奇怪的问题也总是没有深究。刚好最近在项目中再次遇到了这个问题,决心深究一下。

notifyDataSetChanged not working

Read on →

OWASP Top 10 Training

环境配置及安装

我们使用 DVWA 工程来学习 OWASP TOP10 安全问题。本节的目的是搭建好这一个易受攻击的 PHP/Mysql 应用,以实例的方式学习这十大安全问题。

启动 Vagrant 虚拟机

如果你决定直接在本地电脑上安装 XAMPP,请自动忽略此步。

为了营造一个安全纯净无干扰的环境,我们选择 Vagrant 启动虚拟机,在虚拟机中安装 XAMPP 环境, Vagrantfile 配置如下:

1
2
3
4
5
6
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.network :private_network, ip: "192.168.33.10"
end

从配置文件中,可以看出我们使用 ubunt 14.04 系统,并且给虚拟机设置了一个内网 IP, 意味着在主机中可以通过 IP 直接访问虚拟机中的网页。

Vagrant up 启动该虚拟机,并通过 Vagrant ssh 登录虚拟机。

安装 XAMPP

XAMPP(Apache + MariaDB + PHP + Perl),为了安装 DVWA Training 的实例,我们需要先安装相应的环境。

XAMPP 有针对 Linux/Windows/Mac的安装包,下载地址参考官方地址. 由于本次试验的在 ubuntu/trusty 虚拟机中,因此使用命令行安装,大致安装过程如下:

1
2
3
4
wget https://www.apachefriends.org/xampp-files/5.6.14/xampp-linux-x64-5.6.14-3-installer.run

sudo chmod +x xampp-linux-x64-5.6.14-3-installer.run
sudo ./xampp-linux-x64-5.6.14-3-installer.run

XAMPP 首页

安装完成后,使用 sudo /opt/lampp/lampp start 打开 lmapp 服务,这时候你应该能够访问 192.168.33.10/xampp详细请参考

安装 DVWA

如果你已经能够访问 xampp 默认的主页,那么你几乎快成功了。XAMPP 中提供了 Apache 服务器,那么我们只需要将 DVWA 的包放在相应的 Web 目录下面,DVWA 项目就能够运行了。

DVWA 官网:http://www.dvwa.co.uk/.

DVWA Github 地址:https://github.com/RandomStorm/DVWA.

开始从命令行安装:

1
2
3
wget https://github.com/RandomStorm/DVWA/archive/v1.9.tar.gz
tar -xzvf v1.9.tar.gz
mv DVWA-1.9 /opt/lampp/htdocs/DVWA

访问 192.168.33.10/DVWA,自动跳转到 setup 界面,这时我们只需要按照提示就可以完成对应的初始化操作。如果你没有预先设置数据库用户名和密码,那么你会看到不能连接到 Mysql 数据库,根据提示重新设置数据库用户名和密码以继续操作。

DVWA Setup

按照 DVWA README 中进行更改,试验过程中如果发现 allow_url_include 始终 Disable, 无法修改成功。请尝试在 /opt/lampp/etc/php.ini 中将原来的 allow_url_include = Off 修改为 allow_url_include = on

将 PHP 相关的配置修改完成后,注意需要将 XMAPP 中 mysql root 用户默认的密码更改为p@ssw0rd,这个密码在 /opt/lampp/htdocs/DVWA/config/config.inc.php 中可以找到。当然也可以将此配置中的数据库密码更改为默认的空。

更改完成后,点击 Create / Reset Database 能够创建初始数据,随后访问 192.168.33.10/DVWA 即可跳转至登录界面。使用默认的 admin/password 可以登录此系统。登录成功之后,意味着我们可以通过实例学习 OWASP TOP10 的安全问题啦。

DVWA index

DVWA Practice

DVWA 安装成功之后,我们开始学习相关的安全问题。DVWA 所培训的例子和 OWASP Top 10 安全问题并不完全一致,但是我们可以先学习 DVWA 上列举的安全问题,然后再逐步学习 Top 10 安全问题。

Brute Force

密码暴力破解,根据理解就是根据一个用户名密码字典进行试错。

通过以下链接找到适合你的 Brute Force 的工具:http://resources.infosecinstitute.com/10-popular-password-cracking-tools/?dl=true

在 Mac 下面我使用 ZAP 进行暴力破解。ZAP 有适用于 Mac 版本的安装包。

几种不同的授权方式:

  • 基础验证: Basic Access Authentication;
  • 摘要验证: Digest Access Authentication;
  • Https验证: HTTPS Client Authentication;
  • 表单验证: Form Based Authentication;

http://java.boot.by/wcd-guide/ch05s03.html

https://www.owasp.org/index.php/Testing_for_Brute_Force_(OWASP-AT-004)


DevOps Session 2

本次课主要学习用户权限概念,为了保证系统的安全性,把所有用户赋予最高权限是极不安全的做法。特别是安装 Tomcat 和 Jenkins 时,使用 sudo 用户来安装很容易被黑客攻击。

课前准备

课前准备阶段,我们需要完成简单的作业:

  1. 使用 tomcat 用户安装 tomcat7 服务器;
  2. 使用 jenkins 用户安装 jenkins,jenkins 可以放在tomcat7中运行;
  3. 从本机浏览器中访问 jenkins 主页;
Read on →

DevOps Session 1

最近公司在组织DevOps培训,于是就有个这个系列的文章,作为培训笔记,作为以后参考。如果你还不知道DevOps概念,请参考Wikipedia

DevOps(英文Development和Operations的组合)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

课前准备

因为需要使用一台Linux机器来作为测试主机,我们使用VirtualBox安装Ubuntu Server。安装完成之后,我们能够登录这台“服务器”。

Read on →

Android 应用的持续交付

当我们谈软件质量时,我们一般会谈到测试。测试作为保障软件质量的重要手段正在被开发者逐渐认知。谈到测试时,大部分人都知道Web测试,对于前端JS或者后台,大部分“靠谱”的创业公司也都会用测试来保证软件质量。可是对于起步相对较晚的移动端测试,用的人并不多。

在测试方面,Android早期即存在UIAtomator和Monkey之类的测试,但是用起来实在不方便。2013年,Google开源了针对An ndroid平台的移动测试框架 – Espresso。Espresso可以针对每个页面(Activity)进行测试。开发者可以根据ID获取到页面元素,然后进行点击、长按等操作。结合Junit和Mock等工具,使得移动端测试成为可能。移动端拥有了测试框架的辅助,借助CI平台,持续交付也成为可能。

Read on →

Material Design Your Android App

14年6月26日的Google I/O大会上,Google推出了一门全新的设计语言Material Design。Material Design在随后的一年里被逐渐应用到Android, Web等平台中。Material Design的推出意味着Google对移动端和网页端设计的整合。固然没有引起轩然大波,但是Material Design却让Android开发者看到了一点福音。

虽然Android系统广受诟病,越来越多的用户投奔苹果的iOS系统。然而这阻挡不了Android的不断改进。14年Google I/O, Google推出了Android的5.0版本,代号Lollipop。5.0版本在设计上采用全新的Material Design,虽然这次升级对ROM生产商来说是道“过不去的坎儿”,但是对开发者群体而言却是一次很不错的升级。因为开发者可以凭借有些的设计资源打造出更好看的App。

Read on →

Android Design - Difference between px sp and dp

Android自兴起以来,开发者不断增加,与此同时市场上参差不齐的设备也不断增加,随之而来的则是开发者需要适配众多机型而带来的困扰与抱怨。并且随着不同厂家定制化不同的ROM,Android设备的碎片化现象日益严重。这篇文章主要讲述如何设计中严格遵从设计图标准的Android页面。

1. px, dp, sp区别

什么是px

px就是我们通常所说的像素的单位,在css里面,我们用px比较多。px主要指用户在屏幕上看到的事物的实际大小单位。

什么是dp

在看手机或者电脑参数时,我们经常说到一个关键词,屏幕分辨率(resolution),分辨率被表示成每一个方向上的像素数量,比如800x480分辨率

Read on →

Setup Jenkins for Android Integration using Docker

About Docker

什么Docker,为什么我们要折腾Docker,而不是直接在服务器上安装运行appilication所需的各种环境呢?

这个问题的产生和为什么需要虚拟机的理由差不多,我需要让我的代码运行在一个干净的无干扰的机器上,这样能够保证代码测试运行环境的一致性,降低其他不可知因素对代码的影响。而Docker和VM虚拟机相比又有其特点,比如启动速度快,可以单独将Docker保存为镜像,上传后能够让别人使用。甚至可以直接将自己的code放在Docker中,直接将环境和代码一起交付给客户。客户只需要安装这个Docker,运行后就可以直接使用这个application了。

Develop, Ship and Run Any Application, Anywhere

Read on →

Android Continuous Integration

随着Android平台的逐渐成熟,伴随着一系列针对Android测试框架的推出,开发人员终于可以如愿以偿的在移动端的开发上进行单元测试,集成测试以及功能测试。在敏捷流程中从开发,到测试,到验收最终成为面向用户的Release版本,经历的是Story一个完整的生命周期。CI(Continuous Integration, 持续交付)在敏捷实践中也因此扮演了非常重要的角色。

如果说Web的持续集成,以及各类测试框架有一定的历史积淀了。那么Android的持续集成可以说是新鲜事物,大部分IT公司知道如何对服务器端或者Web端进行一系列自动化测试,保证其功能的正确性。而对于移动端的产品比较多的则是由测试人员组成的人肉测试。移动端的这种人工测试,无论是对测试人员,还是要经常打包并且来修复各种Bug的开发人员来说,其代价是巨大的。

Read on →

Work in Dallas

时光匆匆,算上实习期来ThoughtWorks工作已近一年。如果技术方面来看,我提升的主要是广度。但是从敏捷实践角度来看,我正在也将继续朝深度上提升。

敏捷这个词,大学期间或多或少听过,大体的印象是软件工程学的一些术语,之后在项目中才开始慢慢实践。我前后经历过三四个项目,虽然每个项目待的时间不长,但是却又想能够和不同的团队,面对不同的客户,也有幸能够在不同的国家体会不同文化下的敏捷实践的标准。

Read on →

Travel to Dallas - Life

来达拉斯已过半月,从去年的十二月份开始规划,到二月中旬过来,再到过完这边最难熬的两个星期。生活工作渐入正轨,是时候来总结下这个特别的二月。

出差

Read on →

常用的Linux Cmd

ls:查看目录下所有可见文件
ls -a : 查看目录下所有文件,包括隐藏文件
ls -l : 查看目录下可见文件的详细信息
ls -al 查看目录下所有文件的详细信息

Read on →

Android电话监听

看题名,本篇博文似乎是关于怎么监听别人的电话。其实不然,这里我主要做的是监听自己的电话。监听自己电话的场景来源如下:
我最近在换手机,当然也在换号。于是面对两个号码两部手机,特别是一些捆绑了银行卡活着以前的快递等情况下,我必须得带两部手机出门,防止旧手机上重要的电话漏接。最开始是想直接进行通过转接,但是面对电信和移动间的通话转移,我放弃了这个想法。于是开始想着用软件提醒。
在老手机上安装APP,这个APP的作用是监听来电,来电挂断之后会自动给你设定的新手机上发送短信,告诉你谁给你打来了一个未接电话,这样你在新手机上看到短信来电提醒,于是可以直接在新手机上进行回复了。虽然不能直接解决通话的问题,但是确解决了我的问题。考虑到老手机上每个月的短信套餐,发现其实成本也几乎为零。

Read on →

Android Data Cache

Android APP开发过程中,我们通常会加入缓存模块。缓存即在本地保存APP的一些数据,大部分是将网络请求的数据进行本地保存,这样在缓存数据有效期内就可以直接使用缓存数据,降低了APP和服务器的压力,也极大提升了用户体验。Android数据缓存既可以以数据表的形式进行保存,也可以以文件的形式进行缓存。这里我主要通过缓存文件存储数据,并在APP下一次启动时读取。

Read on →

Hack 京东 Lebook

adb devices : 列出所有的设备

adb -s XXXX shell: 进入指定的shell

adb shell: 进入唯一的shell

在terminal中直接: adb pull /data/data/com.jingdong.app.reader/files/epub/3690098/534543.jeb
~/Desktop/test.epub。可以直接拿到epub文件


Vagrant 搭建本地虚拟机

多数情况下,为了模拟服务器环境,我们经常使用虚拟机,通过虚拟机,我们可以轻松模拟出真实的服务器环境,从而对我们代码的部署等进行模拟,当然也可以当作自己练手的好工具。把Linux虚拟机当作是真实的服务器,然后通过内网访问虚拟机上的服务器资源。
虚拟机除了大家熟知的界面化的VirtualBox外,其实还有一个神器叫做Vagrant,Vagrant是依赖于VirtualBox的,但是其好处是提供命令行式的操作,我们直接通过命令行控制虚拟机的运行状态,并可以通过ssh命令直接连接到虚拟机中,命令行操作一切,还是相当方面的。

Read on →

Openfire - Android IM 框架使用

IM(Instant Messaging)在Android中可谓运用广泛。QQ,Wechat,陌陌等应用都可以看作IM实时通讯APP,实时通讯在社交类APP中运用范围较广,其功能看起来也是比较cool的。今天我们将研究一下android IM软件是如何实现的。像IM这种实施通讯软件,除非公司有比较大的实力和精力,才会自己去整这么一套框架。对于广大中小软件开发者来说,想到比较多的就是开源框架。Opensource对于开发者来说简直就是福音,对于整个软件行业也起到了不小的推动性的作用。
Openfire在这种环境下应运而生,而且作为实时通讯类开源框架迅速走红,下面我们就一起来学习这样一款拯救宇宙的开源框架,文章的最后会运用Openfire做出一个可以实时通讯的AndroidAPP,如果结合上地理位置再多点UI和交互上的设计提升,这不就是陌陌吗?YY了一会,觉得挺有趣,那么 Just do it

Read on →

Android deploy your app

发布Android APP说通俗点就是“打包”,大部分情况下我们可以直接通过IDE进行签名打包,打包好的apk文件就可以上传到各大应用市场啦。今天项目开发过程中突然遇到需要更换debug.keystore的问题了,于是突然想好好研究一下Android打包的全过程,以及各个文件的作用。说做就做,how to publish your app?

Read on →

Android SIP 网络通话

突发奇想,想研究一下Android的网络通话怎么实现,于是从Google搜到了相关的资料。原来Android下集成了SIP(Session Initiation Protocol)。SIP的账号可以通过SIP提供商免费申请,申请后即可以通过用户名实现网络通话。于是也找了网上的一些资料,写了个AndroidSIP的小demo,demo实现后大家可以实现互拨,目前界面很简单,但是通话的功能应该是可以实现的。请各位看官试用之。
整体效果看起来还是蛮酷的,这里我们申请了两个免费的账号,在设备上安装之后就可以进行Network Call了。

免费SIP账号申请:http://www.linphone.org/free-sip-service.html

官方参考文档:http://developer.android.com/guide/topics/connectivity/sip.html

项目代码下载:https://github.com/gongmingqm10/AndroidSIP

任何问题,欢迎大家fork,发pull/request。


Git daemon 建立本地Git服务器

平时项目中我们常遇到这样的需求,需要在自己电脑上clone台式机上的git代码,从而省略了向Github远程服务器上传代码的过程。免除了一些授权Access问题。幸好有Git Daemon神器:

前提

代码是通过Git托管的,如果使用SVN的话,多增加一个Git repo也是可以的。

Step by Step

  1. 进入到自己工程所在的目录下,以Users/mingong/project/Sheldon为例:cd project/Sheldon

  2. 在Git项目根目录下开启Daemon服务器 git daemon --base-path=. --export-all --reuseaddr --informative-errors —verbose

  3. 使用ifconfig查看本机电脑内网IP地址:ifconfig,以我的电脑为例,查看到的IP地址为 10.113.241.150

Read on →

Android quiz questions

关于Android的几个常见的问题,记录如下,小问题看到本质也可以了解很多原理性的东西。


Q: Android中Activity的生命周期?

A: onCreate() –> onStart() –> onResume() –> onPause() –> onStop() –>onDestroy().

Read on →

部署 Spring Web 至服务器

网站开发完毕之后,下一步的任务就是部署了。我们从最简单的入手,如何将本地开发的webapp部署到远程服务器上(这里我们用的是阿里的ECS)。部署是一件很有意思的事情,因为我们可以让本地开发的网站被外界所访问,所以还是很多成就感的。这里的工程采用的是Spring MVC 框架。

1. Requirement

  • 一个能够在本地运行的Web程序
  • 一个远程服务器主机
  • Mac或者Linux系统的机器
Read on →

Android onTouch() 初探

Android的touch对于我来说是个既熟悉又陌生的话题,熟悉之处在于onTouch太常用了,从系统的自定义的ListView的滑动到我们自定义的可以滑动的View,onTouch直接与用户进行相关的Interation,所以onTouch无处不再。想像下如果Android某一天不能相应我们的touch事件,那我们现在的触屏手机基本废了,那我们的手机还得还原到以前的字母键手机的状态。学习总是得自己逼迫自己,没有博客的驱动我是怎样也不会来从头开始研究onTouch的作用机制的,博客当作一个自我学习的过程,坚持再坚持。

Read on →

云服务器使用记录

我的第一个云服务器ECS

云服务器简单来说就是一台远程主机,在MAC上可轻松登录进去进行,然后在命令行中可以轻松部署你的网站,应用等等。于是花了100大洋租了几个月的阿里云Aliyun Linux 5.7 主机,出于学习的目的,所有的配置都采用最低配,日后有需要再进行升级吧。
使用teminal,用SSH登录进去

Read on →

Android自定义View

Android开发中经常用到各种各样的View,有时需要自定义View来满足当前的需求。这些自定义View主要是复写View绘制时的一些方法,从而产生新的View供项目中使用。

View的绘制流程

自定义控件从最基础的View开始,View有几个重要的函数:onMeasure(), onLayout(), onDraw(),与触摸动作相关的还有onTouchEvent(),View也和Activity一样具有一定的生命周期,从View被创建开始到创建完成,主要经历了 onMeasure onLayout onDraw() 等过程,这些过程都是一步步完成的。也代表着View从声明到被用户看到的具体步骤。通过对这些中间步骤的了解与Override,我们可以创造出一些特殊的View。

Read on →

Travel to ThoughtWorks

Life is a journey, not a destination.

人生就是在时光的隧道中不同的奔跑,在不同的环境中遇到不同的人,然后开始相同的挣扎,最后不断优秀的过程。加入ThoughtWorks一月有余,期间经历了一些事情,趁着On beach的时光对其进行一些沉淀,若干年后作为记忆的时光进行回忆品味。

面试

转眼已是金秋时节,又是一年校招季。距离上次面试也已经快一年的距离了,时间总是走得如此之快。想起去年奔走在各个公司的面试宣讲会上。然后在人山人海中投着一遍遍的简历,然后在有幸的面试中都会被无情的刷掉。这种落差也许只有自己知道,这种期望与失望的矛盾混杂在现实的残酷与理想的丰满中。最后却冷不丁的进了ThoughtWorks的终面,经历了Quiz Test, Code Homework,Tech Interview, HR Interview,最后进到了Group Discussion。于是我用着不太顺畅的普通话讲述着 “Why ThoughtWorks should Hire Me”,我不太会演讲,这种public speech对于我来说更是显得有点困难,但是坚持就意味着胜利。然后意外的进入了ThoughtWorks Graduate的阵营。毕业生都是将要离开学校,而第一份工作也总会决定他们一生的状态。于是凭借着自己的感觉放弃了上海那个温暖的团队,决定在这个Geek闻名的公司里面开启新的学习生涯。毕业季的日子终究是平淡的,于是也就选择了来实习。

Read on →

Android best practice

从事android开发两年有余,但是自己的代码自己却不太敢恭维。于是我不得不来改善我的Android程序,为了使它变得更加的稳固,更加的专业。本文旁征博引,多处观点都是Google之,结合自己的经验总结了Android开发中的一些最佳实践,厚积方能博发,多积累多学习才能多进步。

Android Activity 的生命周期

生命周期(Lifecycle)描述的是Android一个页面从开始创建到消亡的整个过程。伴随着一系列对象的创建及消失,涵盖着整个页面所包含的业务逻辑。以及与用户之间的交互,接受用户的输入并返回输出信息给用户。

Android Lifecycle

从其生命流程图中,我们可以看到Android单个Activity的生命周期主要为 onCreate –> onStart –> onResume –> Activity Running –> onPause –> onStop –> onDestroy. 通常单个App是由诸多的Activity组成的,一般情况我们肉眼所见的一个页面就是一个Activity,我们也经常再APP中点击Button或者Back,于是我们实现了Activity之间的切换。

Read on →

mybait migration session

Mybatis Migration 初探

持续交付项目中,项目会不断的迭代上线,这是会出现数据库的改动问题。在一个还未上线的项目中,我更改数据库可以使用简单的直接对sql进行更改,但是面对一个已投入使用的系统而言,每次部署都对数据库进行init显得有点不太可能。于是便有了数据库Migration的诞生。

我所在的项目是SpringMVC配合Mybatis的开发框架。作为一个数据库集成框架,Mybatis在使用上还是比较方便的。言归正传,为了项目需要,于是便开始了Mybatis Migration的初探,文章中出现的不妥之处还请大家不吝赐教。

Read on →

Fontello 使用心得

Overview

Fontello icon generator http://fontello.com/,fontello上可以选择各种各样的常见的icon,所有的icon都是字体格式,所以对于icon的大小和颜色你都可以像使用字体一样方便的使用他们。


最近尝试在构建一个rails应用,于是自然而然就想到用之前项目中的fontello图标,对于Developer来说,有了fontello和rails我开始不需要担心街面上图标或者按钮的样式问题了。

Read on →

订餐网之死

起源

订餐网真名不详,只是为了表意故意称之为订餐网。都说文以表意,于是订餐网的本身就是为了订餐外卖做准备,这还是我刚在TW实习为了学习组内的技术栈也为了实现一点小想法进行的一次尝试。尝试的初衷很简单,为了学习。动力很简单,学好一门技术,做个web站点出来。而终点就是能够使之成为我的毕设,也作为自己对创业的一点尝试。在buddy的鼓励下,我真的开始在做的…也真的想把这个产品做好了。

Read on →

在rails集成mongodb开发应用

最近尝试用rails集成mongodb开发我的第一个rails应用,用IDE直接创建project之后,发现工程默认会采用sqlite数据库。于是需要自己手工进行一些数据库配置: 如果你的app已经使用IDE建立好了,需要修改的文件有 config/application.rb 和 config/environments/development.rb

Read on →