很多应用都需要用户登录或者签名认证,这可能需要在客户端保存登录信息、签名密钥、加密算法等。如何保证这些重要信息不被窃取,算法不被破解,这些成为应用开发中很重要的内容,同样也是最容易忽视的地方。一个小小的细节可能就成为整个系统的突破口,这里从实际工程角度总结了一些容易忽视的细节和常用的方法。
一步一步实现Android打飞机(二)
六、角色和状态接口设计
角色基本属性有最大生命值、当前生命值、速度、攻击力、角色位置、角色状态等。角色行为有移动、显示、检测是否与别的角色碰撞、被攻击等。状态属于角色内部属性,可将状态设计成内部类的形式,在特定状态下,角色有特定的行为。例如,正常状态下敌机匀速向屏幕底部移动,受伤后敌机会加速移动,爆炸时敌机原地爆炸、不能移动。
注意:我这里说的接口并不是java语言的接口,为了方便实现,使用了普通java类。另外属性权限访问也没有严格限制,还需要改进。
一步一步实现Android打飞机(一)
一、概述
对没有Android开发经验,或对JAVA语言不是太熟悉的同学,希望尝试Android开发应该如何进入呢?为了避免枯燥地看教程、阅读官方sample,学习一大堆不知道什么时候会用上的API,我选择打飞机这个游戏作为切入点。一是因为开发简单游戏并不会涉及过多的平台API以及平台特性,只需要知道基本的贴图、多线程、用户交互等接口就足够了;二是可以把更多的精力放到熟悉语言、培养语感,当然还有游戏本身的逻辑,以及程序设计的通用模式;三是自己动手开发更有趣味性,所以开发中并没有使用游戏框架如cocos2d-x等,仅仅使用了一些Android原始API,毕竟只是为了学习。
二、游戏框架
这是一个典型的贴图游戏,没有复杂的图形变换、动画效果等,你看到的所有效果都是不断移动、替换图片实现的,比如飞机的爆炸效果,就是连续显示几张不同的图片实现的。为了不影响用户交互,比如控制飞机移动,贴图和逻辑控制的工作应该放到一个新的线程中。Android提供了SurfaceView
类来处理贴图的问题,让SurfaceView
实现Runnable
接口并配合Thread
可以解决在子线程中贴图以及逻辑控制的问题。
正确使用Block避免Cycle Retain和Crash
本文只介绍了MRC时的情况,有些细节不适用于ARC。比如MRC下__block不会增加引用计数,但ARC会,ARC下必须用__weak指明不增加引用计数;ARC下block内存分配机制也与MRC不一样,所以文中的一些例子在ARC下测试结果可能与文中描述的不一样
Block简介
Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是一回事。需要注意的是由于Objective-C在iOS中不支持GC机制,使用Block必须自己管理内存,而内存管理正是使用Block坑最多的地方,错误的内存管理 要么导致return cycle内存泄漏要么内存被提前释放导致crash。 Block的使用很像函数指针,不过与函数最大的不同是:Block可以访问函数以外、词法作用域以内的外部变量的值。换句话说,Block不仅 实现函数的功能,还能携带函数的执行环境。
一步一步实现iOS应用PUSH功能
1. push原理
iOS push 工作机制可以用下图简要概括
Provider
:应用自己的服务器;APNS
:Apple Push Notification Service的简称,苹果的PUSH服务器;
push的主要工作流程是:
- iOS设备连接网络后,会自动与APNS保持类似TCP的长链接,等待APNS推送消息的到来;
- 应用启动时注册消息推送,并获取设备的在APNS中注册的唯一设备标示deviceToken上传给应用服务器(即Provider);
- 在需要给应用推送消息时,Provider把push内容、接收push消息的deviceToken按APNS指定的格式打包好,发送给APNS;
- APNS收到Provider发送的消息后,查找deviceToken指定的设备,如果该设备已经和APNS建立了连接,则立即将消息推送给该设备,如果设备不在线,则在该设备下次连接到APNS后将消息推送到设备。请注意苹果并不保证推送一定成功;
- 设备收到push消息后,iOS系统会根据SSL证书判断这个push消息是发给那个应用的,进而启动相应客户端。
Vim查找替换及正则表达式的使用
简单替换表达式
:[range]s/from/to/[flags]
range
:搜索范围,如果没有指定范围,则作用于但前行。:1,10s/from/to/
表示在第1到第10行(包含第1,第10行)之间搜索替换;:10s/from/to/
表示只在第10行搜索替换;:%s/from/to/
表示在所有行中搜索替换;1,$s/from/to/
同上。
flags
有如下四个选项:c
confirm,每次替换前询问;e
error, 不显示错误;g
globle,不询问,整行替换。如果不加g
选项,则只替换每行的第一个匹配到的字符串;i
ignore,忽略大小写。
这些选项可以合并使用,如
cgi
表示不区分大小写,整行替换,替换前询问。
正则表达式
元字符
元字符
元字符 说明 . 匹配任意字符 [abc] 匹配方括号中的任意一个字符,可用 -
表示字符范围。如[a-z0-9]匹配小写字母和数字[^abc] 匹配除方括号中字符之外的任意字符 \d 匹配阿拉伯数字,等同于[0-9] \D 匹配阿拉伯数字之外的任意字符,等同于[^0-9] \x 匹配十六进制数字,等同于[0-9A-Fa-f] \X 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f] \l 匹配[a-z] \L 匹配[^a-z] \u 匹配[A-Z] \U 匹配[^A-Z] \w 匹配单词字母,等同于[0-9A-Za-z_] \W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_] \t 匹配 <TAB>
字符\s 匹配空白字符,等同于[\t] \S 匹配非空白字符,等同于[^\t] 一些普通字符需转意
元字符 说明 \* 匹配 *
字符. 匹配 .
字符\/ 匹配 /
字符\ 匹配 \
字符\[ 匹配 [
字符\] 匹配 ]
字符表示数量的元字符
元字符 说明 * 匹配0-任意个 \+ 匹配1-任意个 \? 匹配0-1个 \{n,m} 匹配n-m个 \{n} 匹配n个 \{n,} 匹配n-任意个 \{,m} 匹配0-m个 表示位置的元字符
元字符 说明 $ 匹配行尾 ^ 匹配行首 \< 匹配单词词首 \> 匹配单词词尾
替换变量
在正则式中以
\(
和\)
括起来的正则表达式,在后面使用的时候可以用\1
、\2
等变量来访问\(
和\)
中的内容。
例子
- 删除行尾空格:
:%s/\s+$//g
- 删除行首多余空格:
%s/^\s*//
或者%s/^ *//
- 删除沒有內容的空行:
%s/^$//
或者g/^$/d
- 删除包含有空格组成的空行:
%s/^\s*$//
或者g/^\s*$/d
- 删除以空格或TAB开头到结尾的空行:
%s/^[ |\t]*$//
或者g/^[ |\t]*$/d
把文中的所有字符串“abc……xyz”替换为“xyz……abc”可以有下列写法
:%s/abc\(.*\)xyz/xyz\1abc/g :%s/\(abc\)\(.*\)\(xyz\)/\3\2\1/g
GitHub+Octopress搭建免费blog
生成github公钥
检查ssh公钥设置:
如果id_rsa*文件不存在,跳到第三步;
$ cd .ssh $ ls
备份原来的ssh key:
备份旧数据,备份后删除旧数据;
$ mkdir key_backup $ cp id_rsa* key_backup $ rm id_rsa*
生成github ssh key:
$ ssh-keygen -t rsa -C "id@youremail.com" <github 帐号> Generating public/private rsa key pair. Enter file in which to save the key (/Users/your_user_directory/.ssh/id_rsa):<回车就好>
然后系统会要你输入加密串
Enter passphrase (empty for no passphrase):<github密码> Enter same passphrase again:<再次输入密码>
最后看到下面信息就成功了
Your identification has been saved in /Users/xxx/.ssh/id_rsa. Your public key has been saved in /Users/xxx/.ssh/id_rsa.pub. The key fingerprint is: ac:63:ff:c9:67:8f:c7:b7:26:43:77:83:bd:ef:11:be username@gmail.com The key's randomart image is: +--[ RSA 2048]----+ | | | | | | | . | | S .| | . ..| | + .o..| | . o . .o*o==| | ..+ooo*EO| +-----------------+
添加ssh key到github:
复制id_rsa.pub的内容到github
Account Settings
->SSH Keys
->add SSH Key
->Key
在github上使用octopress
在你本地安装octopress
$ git clone git://github.com/imathis/octopress.git octopress $ cd octopress # If you use RVM, You'll be asked if you trust the .rvmrc file (say yes). $ ruby --version # Should report Ruby 1.9.2 $ gem install bundler # Install dependencies $ bundle install $ rake install # Install the default Octopress theme
配置你本地的octopress
创建github repo,名称
username.github.com
配置octopress使之与
username.github.com
关联$ cd octopress $ rake setup_github_pages Enter the read/write url for your repository (For example, 'git@github.com:your_username/your_username.github.com') Repository url: <git@github.com:yourname/yourname.github.com>
以上执行后会要求 read/write url for repository : git@github.com:yourname/yourname.github.com.git
初始化github
$ rake generate $ rake deploy
等待几分钟后,github上会收到一封信:“[yourname.github.com] Page build successful”,第一次发布后等比较久,之后每次都会直接更新
将 source 也加入 git
$ cd octopress $ git add . $ git commit -m 'your message' $ git push origin source
更新 Octopress
日后有 Octopress 新版本发布,使用以下指令升级。
$ git pull octopress master # Get the latest Octopress $ bundle install # Keep gems updated $ rake update_source # update the template's source $ rake update_style # update the template's style
编写并发布文章
发表新文章:
$ rake new_post["文章名称"]
该命令会在你的”octopress/source/_posts”目录下生成对应的”.markdown”文件,用任意文本编辑器编辑,使用markdown语法编写你的文章。
生成:
$ rake generate # generate your blog static pages content according to your input.
预览:
$ rake preview # start a web server on "http://localhost:4000", you can preview your blog content.
发布:
$ rake deploy # push your static pages content to your github pages repo ("master" branch)
生成并发布:
$ rake gen_deploy
切换电脑怎么办
本地内容都提交到github source分支
切换到新电脑上
$ git clone git@github.com:yourname/yourname.github.com.git $ cd yourname.github.com $ git checkout source $ mkdir _deploy $ cd _deploy $ git init $ git remote add git@github.com:yourname/yourname.github.com.git $ git pull origin master $ cd ..
切换到先前电脑时
$ git pull origin source $ cd _deploy $ git pull origin master $ cd ..