Cooper's Blog

西湖的水,哥的泪

如何防止客户端被破解

很多应用都需要用户登录或者签名认证,这可能需要在客户端保存登录信息、签名密钥、加密算法等。如何保证这些重要信息不被窃取,算法不被破解,这些成为应用开发中很重要的内容,同样也是最容易忽视的地方。一个小小的细节可能就成为整个系统的突破口,这里从实际工程角度总结了一些容易忽视的细节和常用的方法。

一步一步实现Android打飞机(二)

Android打飞机源码

六、角色和状态接口设计

角色基本属性有最大生命值、当前生命值、速度、攻击力、角色位置、角色状态等。角色行为有移动、显示、检测是否与别的角色碰撞、被攻击等。状态属于角色内部属性,可将状态设计成内部类的形式,在特定状态下,角色有特定的行为。例如,正常状态下敌机匀速向屏幕底部移动,受伤后敌机会加速移动,爆炸时敌机原地爆炸、不能移动。

注意:我这里说的接口并不是java语言的接口,为了方便实现,使用了普通java类。另外属性权限访问也没有严格限制,还需要改进。

一步一步实现Android打飞机(一)

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. :1,10s/from/to/ 表示在第1到第10行(包含第1,第10行)之间搜索替换;
    2. :10s/from/to/ 表示只在第10行搜索替换;
    3. :%s/from/to/ 表示在所有行中搜索替换;
    4. 1,$s/from/to/ 同上。
  • flags 有如下四个选项:

    1. c confirm,每次替换前询问;
    2. e error, 不显示错误;
    3. g globle,不询问,整行替换。如果不加g选项,则只替换每行的第一个匹配到的字符串;
    4. i ignore,忽略大小写。

    这些选项可以合并使用,如cgi表示不区分大小写,整行替换,替换前询问。

正则表达式

  1. 元字符

    • 元字符

      元字符 说明
      . 匹配任意字符
      [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个


    • 表示位置的元字符

      元字符 说明
      $ 匹配行尾
      ^ 匹配行首
      \< 匹配单词词首
      \> 匹配单词词尾


  2. 替换变量

    在正则式中以\(\)括起来的正则表达式,在后面使用的时候可以用\1\2等变量来访问\(\)中的内容。

例子

  1. 删除行尾空格::%s/\s+$//g
  2. 删除行首多余空格:%s/^\s*// 或者 %s/^ *//
  3. 删除沒有內容的空行:%s/^$// 或者 g/^$/d
  4. 删除包含有空格组成的空行:%s/^\s*$// 或者 g/^\s*$/d
  5. 删除以空格或TAB开头到结尾的空行:%s/^[ |\t]*$// 或者 g/^[ |\t]*$/d
  6. 把文中的所有字符串“abc……xyz”替换为“xyz……abc”可以有下列写法

    :%s/abc\(.*\)xyz/xyz\1abc/g
    :%s/\(abc\)\(.*\)\(xyz\)/\3\2\1/g
    

GitHub+Octopress搭建免费blog

生成github公钥

  1. 检查ssh公钥设置:

    如果id_rsa*文件不存在,跳到第三步;

    $ cd .ssh
    $ ls
    
  2. 备份原来的ssh key:

    备份旧数据,备份后删除旧数据;

    $ mkdir key_backup
    $ cp id_rsa* key_backup
    $ rm id_rsa*
    
  3. 生成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|
    +-----------------+ 
    
  4. 添加ssh key到github:

    复制id_rsa.pub的内容到github Account Settings -> SSH Keys -> add SSH Key -> Key

在github上使用octopress

  1. 在你本地安装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
    
  2. 配置你本地的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

  3. 初始化github

    $ rake generate
    $ rake deploy
    

    等待几分钟后,github上会收到一封信:“[yourname.github.com] Page build successful”,第一次发布后等比较久,之后每次都会直接更新

  4. 将 source 也加入 git

    $ cd octopress
    $ git add .
    $ git commit -m 'your message'
    $ git push origin source
    
  5. 更新 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
    
  6. 编写并发布文章

    • 发表新文章:

      $ 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
      

切换电脑怎么办

  1. 本地内容都提交到github source分支

  2. 切换到新电脑上

    $ 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 ..
    
  3. 切换到先前电脑时

    $ git pull origin source
    $ cd _deploy
    $ git pull origin master
    $ cd ..