除了揭幕战,今天又真真的熬完了整整一场比赛的直播。开赛前就冥冥感觉,这场不一般,当然我不是马后炮的证明我猜到了大胜,赛前我的预想只是净胜2球,德意志已经超过我的想象。其实比,大胜更让我欣喜的是,米洛进球了。那一刻,真的想流泪,即使段暄还在感叹节奏的突变,与接二连三的进球,人们视乎忘了,这个德国人破纪录了。
没有欢呼,没有庆贺,没有空翻,一切平平淡淡。就像克洛泽一样,一个平凡的不能再平凡的球员,没错,在很多定义上他都算不上球星。他不张扬,个性内敛和谦逊,小时候优良的家境和艺术教育的烘托使得他跟一般的球员在性格上可以被归属为文艺派。
克洛泽从未在联赛中大杀四方,也没有在世界杯上君临天下,他总是在适当的时候,出现在适当的位置,做了适当的事情。这就是德国人的冷静、铁血、严谨,这是与生俱来的天性。他不是足球天才,23岁的时候甚至还是业余球球,这个岁数的梅西已经功成名就。
不是每个人都能成为字母罗、内马尔或者梅西,但每个人都可以成为克洛泽————或者说,成为这个时空中、这番命运下那个最好的自己。

02年世界杯的时候,那个时候我还懵懵懂懂,决赛日,我和老爸在电视前,我穿着我新买不久的巴西队服,看着除了巴西队不怎么熟悉的面孔,为罗纳尔多的进球欢呼雀跃,但是那场比赛,却让我喜欢上了,卡恩和金发碧眼的克洛泽,甚至我自己都不知道缘由。
06年,金色轰炸机克林斯曼职教德国,那届的德国打的真是漂亮,不知道那一届诞生了多少德国脑残粉。点球救主的莱曼,小猪施魏因斯泰格,已经屈居二线的卡恩,大着石膏扔界外球的拉姆,还有些青涩的波多尔斯基,还有巴拉克,还有克洛泽。那一届德国踢得那么好,那么漂亮,还是输给了亚平宁骑士,防守至上的意大利。至今,我还记恨那支冠军,马特拉齐的咒骂,齐祖的惨淡谢幕与大力神杯擦肩而过,更可恨的是他们淘汰了德国,那支最美的德国。
10年,德国新人辈出,诺伊尔、厄齐尔、巴阿滕、还有神奇小子穆勒。可惜巴拉克,赛前的伤退,让这个德国人永远的告别了世界杯。我这届德国一如既往的强,可惜既生瑜何生亮,如日中天的西班牙在那个时空,仿佛不可战胜。
02年,我们输给了天赋异禀的巴西,06年,我们输给了沉稳的意大利,10年,我们输给了不可战胜的西班牙。14年,我们离冠军只差一场胜利,加油,德意志。

1
2
3
4
5
6
7
8
9
node
var url = require('url')
var requestURL = 'http://example.com:1234/pathname?query=string# hash'
// 获取主机名
url.parse(requestURL).hostname
// 获取路径端口
url.parse(requestURL).port
// 获取路径名
url.parse(requestURL).pathname

权限

1
2
3
4
5
6
7
8
<!-- 发送消息 -->
<uses-permission android:name="android.permission.SEND_SMS" />
<!-- 阅读消息 -->
<uses-permission android:name="android.permission.READ_SMS" />
<!-- 写入消息 -->
<uses-permission android:name="android.permission.WRITE_SMS" />
<!-- 接收消息 -->
<uses-permission android:name="android.permission.RECEIVE_SMS" />

工具类

  • Column
    用于管理字段

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    public class Column {
    // 约束
    public static enum Constraint {
    UNIQUE("UNIQUE"), NOT("NOT"), NULL("NULL"), CHECK("CHECK"), FOREIGN_KEY(
    "FOREIGN KEY"), PRIMARY_KYE("PRIMARY KEY");
    private String value;

    private Constraint(String value) {
    this.value = value;
    }

    @Override
    public String toString() {
    return value;
    }
    }

    // 数据类型
    public static enum DataType {
    NULL, INTEGER, REAL, TEXT, BLOB
    }

    private String mColumnName;
    private Constraint mConstraint;
    private DataType mDataType;

    public Column(String columnName, Constraint constraint, DataType dataType) {
    mColumnName = columnName;
    mConstraint = constraint;
    mDataType = dataType;
    }

    public String getColumnName() {
    return mColumnName;
    }

    public Constraint getConstraint() {
    return mConstraint;
    }

    public DataType getDataType() {
    return mDataType;
    }
    }
  • SQLiteTable
    用于表管理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    public class SQLiteTable {
    String mTableName;
    ArrayList<Column> mColumnsDefinitions = new ArrayList<Column>();

    public String getTableName() {
    return mTableName;
    }

    // 自动添加主键_ID
    public SQLiteTable(String tableName) {
    mTableName = tableName;
    mColumnsDefinitions.add(new Column(BaseColumns._ID,
    Column.Constraint.PRIMARY_KYE, Column.DataType.INTEGER));
    }

    public SQLiteTable addColumn(Column columnsDefinition) {
    mColumnsDefinitions.add(columnsDefinition);
    return this;
    }

    public SQLiteTable addColumn(String columnName, Column.DataType dataType) {
    mColumnsDefinitions.add(new Column(columnName, null, dataType));
    return this;
    }

    public SQLiteTable addColumn(String columnName,
    Column.Constraint constraint, Column.DataType dataType) {
    mColumnsDefinitions.add(new Column(columnName, constraint, dataType));
    return this;
    }

    // 在SQLite中创建本表
    public void create(SQLiteDatabase db) {
    String formatter = " %s";
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append("CREATE TABLE IF NOT EXISTS ");
    stringBuilder.append(mTableName);
    stringBuilder.append("(");
    int columnCount = mColumnsDefinitions.size();
    int index = 0;
    for (Column columnsDefinition : mColumnsDefinitions) {
    stringBuilder.append(columnsDefinition.getColumnName()).append(
    String.format(formatter, columnsDefinition.getDataType()
    .name()));
    Column.Constraint constraint = columnsDefinition.getConstraint();

    if (constraint != null) {
    stringBuilder.append(String.format(formatter,
    constraint.toString()));
    }
    if (index < columnCount - 1) {
    stringBuilder.append(",");
    }
    index++;
    }
    stringBuilder.append(");");
    db.execSQL(stringBuilder.toString());
    }

    // 在SQLite中删除本表
    public void delete(final SQLiteDatabase db) {
    db.execSQL("DROP TABLE IF EXISTS " + mTableName);
    }
    }

数据库操作类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public abstract class BaseDataHelper {
private Context mContext;

public BaseDataHelper(Context context) {
mContext = context;
}

public Context getContext() {
return mContext;
}

protected abstract Uri getContentUri();

public void notifyChange() {
mContext.getContentResolver().notifyChange(getContentUri(), null);
}

protected final Cursor query(Uri uri, String[] projection,
String selection, String[] selectionArgs, String sortOrder) {
return mContext.getContentResolver().query(uri, projection, selection,
selectionArgs, sortOrder);
}

protected final Cursor query(String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
return mContext.getContentResolver().query(getContentUri(), projection,
selection, selectionArgs, sortOrder);
}

protected final Uri insert(ContentValues values) {
return mContext.getContentResolver().insert(getContentUri(), values);
}

protected final int bulkInsert(ContentValues[] values) {
return mContext.getContentResolver()
.bulkInsert(getContentUri(), values);
}

protected final int update(ContentValues values, String where,
String[] whereArgs) {
return mContext.getContentResolver().update(getContentUri(), values,
where, whereArgs);
}

protected final int delete(Uri uri, String selection, String[] selectionArgs) {
return mContext.getContentResolver().delete(getContentUri(), selection,
selectionArgs);
}

protected final Cursor getList(String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
return mContext.getContentResolver().query(getContentUri(), projection,
selection, selectionArgs, sortOrder);
}

public CursorLoader getCursorLoader(Context context) {
return getCursorLoader(context, null, null, null, null);
}

protected final CursorLoader getCursorLoader(Context context,
String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
return new CursorLoader(context, getContentUri(), projection,
selection, selectionArgs, sortOrder);
}
}

  1. Add column
    1
    ALTER TABLE {tableName} ADD COLUMN COLNew {type};

2.Delete column,Rename column
sqlite3不允许指直接delete,rename只能进行以下操作

1
2
create table temp(id integer PRIMARY KEY,code varchar(255));
insert into temp(id,code) select id ,code from t;

3.Rename table

1
alter table foo rename to bar

4.Copy data from one sqlite file to another

1
2
attach 'database2file' as db2;
insert into TANLENAME select * from db2.TANLENAME;

5.导出sql

1
2
3
sqlite3. data.db
>.output dd.sql
>.dump

6.导入

1
2
sqlite3 mydb.db
>.read dd.sql

7.释放空间

1
vacuum

一些SQLite命令

  • database 列出数据库文件名
  • tables ?PATTERN? 列出?PATTERN?匹配的表名
  • import FILE TABLE 将文件中的数据导入表中
  • dump ?TABLE? 生成形成数据表的SQL脚本
  • output FILENAME 将输出导入到指定的文件中
  • output stdout 将输出打印到屏幕
  • mode MODE ?TABLE? 设置数据输出模式(csv,html,tcl…)
  • nullvalue STRING 用指定的串代替输出的NULL串
  • read FILENAME 指定指定文件中的SQL语句
  • schema ?STRING? 打印创建数据库表的SQL语句
  • separator STRING 用指定的字符串代替字段分隔符
  • show 打印所有SQLite环境变量的设置
  • quite 推出命令行接口

使用

DrawerLayout类在Support Library里,有android-support-v4.jar这个包即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />


<ListView
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="left"
android:background="# 111"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp" />
</android.support.v4.widget.DrawerLayout>

</RelativeLayout>

  1. Uri
    通用资源标志符(Universal Resource Ident,简称”URI”)
    Uri代表要操作的数据,Android上可用的每种资源——图片、视频等资源都可以用Uri表示
    URI一般分为三个部分组成:访问资源的命名机制存放资源的主机名,资源自身的名字,由路径表示

Android的Uri由以下三部分组成:”content://“、数据的路径、标示ID(可选)
如:

  • 所有联系人的Uri:content://contacts/people
  • 某个联系人的Uri:content://contacts/people/5
  • 所有图片Uri:content://media/external
  • 某个图片的Uri:content://media/external/images/media/4
  1. UriMatcher
    UriMatcher类主要用于匹配Uri
    使用方法如下,初始化:
    1
    UriMathcer matcher = new UriMatcher(UriMatcher.NO_MATCH);

第二步注册需要的Ur:

1
2
matcher.addURI("com.zoe.blog","people",PEOPLE);
matcher.addURI("com.zoe.blog", "person/# ", PEOPLE_ID);

第三部,与已经注册的Uri进行匹配:

1
2
3
4
5
6
7
8
9
10
11
Uri uri = Uri.parse("content://" + "com.zoe.blog" + "/people");
int match = matcher.match(uri);
switch(match)
{
case PEOPLE:
return "vnd.android.cursor.dir/people";
case PEOPLE_ID:
return "vnd.android.cursor.item/people";
default:
return null;
}

match方法匹配后会返回一个匹配码Code,即在使用注册方法addURI时传入的第三个参数。

  • 常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
  • # 号为通配符
  • *号为任意字符
  1. CententUris
    ContentUris类用于获取Uri路径后面的ID部分
    1
    2
    3
    4
    5
    Uri uri = Uri.parse("content://com.zoe.demo/people");
    Uri resultUri = ContentUris.withAppendedId(uri,10);
    //resultUri为:content://com.zoe.demo/people/10
    ling id = ContentUris.parseId(uri);
    //id = 10

AndroidStudio是Google I/O 2013大会上推出的Android开发环境,基于IntelliJ IDEA,和EclipseADT类似。AudioStudio使用Gradle来构建项目。Gradle是一款自动化编译部署测试工具。

本文主要介绍如果将EclipseADT的项目迁移到AndroidStudio。
1.为项目生成Gradle所需的文件

  • 项目节本结构

  • ADT版本在22以上,在项目上右击->Export,然后选择Generate Gradle build files。

  • 一路next,直到finish。搞定,这时候已经生成Gradle的相关文件,此时的结构

2.在AndroidStudio中导入项目

  • 打开AudioStudio,选择Import Project,选择项目的目录。OK即可导入。

  • 主要就是build.gradle文件。

扩展阅读

Express

Express是Node.js的一个Web框架,Web应用程序有公用的模式,所以使用框架来构建经常事半功倍。其他一些成熟的框架,比如:

  • Ruby on Rails(Ruby)
  • Sinatra(Ruby)
  • Django(Python)
  • Zend(PHP)
  • CodeIgniter(PHP)

一些使用Express能做的事情有:

  • 基于JSON的API
  • 单页面Web应用程序
  • 事实Web应用程序

安装Express:npm install -g express
使用-g标记表示Express将是全局安装。

Express项目文件结构如下:

  • app.js
    app.js是用来启动应用程序的应用程序文件夹,它包含应用程序的配置信息。
  • node_modules
    用来保存在pack.json中定义并且已经安装的Node模块
  • package.json
    提供应用程序的信息,包括运行应用程序所需安装的依赖模块
  • public
    Web进行服务的公共文件夹,在这个文件夹中可以看到样式单、javascript和图片
  • routes
    路由,定义了应用程序应该响应的页面
  • views
    视图文件夹定义应用程序的布局
    在views文件夹有很多以.jade为扩展名的文件,Express利用模板引擎将视图编译成HTML,默认情况,Express使用Jade作为模板引擎。

    Jade

    Jade通过缩进定义页面结构,如果一行在上一行下面缩进,就认为它是上一行的子行。
  • html 编译后是:
    这里可以使用任何HTML标记(body、section、p等等)
  • 要给标记使用id,可加上一个#号后跟id名称,注意不允许有空格
    section# wrapper 编译后:
  • 可以添加一个类,方法是加上一个小数点后跟类的名称。
    p.highlight 编译后:

  • 急需要类也需要id
    section# wrapper.class-name 编译后:
  • Jade也支持在一个标记上有多个类
    p.first.second.third.fourth 编译后:

  • 为了创建HTML结构,要使用缩进
    1
    2
    p
    span

编译后:

1
<p><span></span></p>

要标记中加入文本,只需在标记定义后加入即可
h1 Very important heading 编译后:

Very important heading

  • Jade支持管道描述符(|)组织大文本
    1
    2
    3
    4
    p
    | Text can be over
    | many lines
    | after a pipe symbol

编译后:

1
<p>Text can be over many lines after a pipe symbol</p>

Jade输出数据

Jade使用两个特殊符号来决定应该如何翻译代码,当一个字符是减号(-),用于告诉随后的代码应当被执行。第二个字符是字符(=)告诉解释器要对对代码进行演算、转义,然后输出。

变量

  • -var foo = bar
    变量设置之后可以再以后使用:
    p I want to learn to use variables.Foo is # {foo}!
    ”# {变量}“这个特殊语法将用变量来代替:

    I want to learn to use variables.Foo is bar!

    循环

    循环用来迭代数组和对象。
1
2
3
- users = ['Sally','Joseph','Michael','Sanjay']
- each user in users
p= user

编译后:

1
2
3
4
<p>Sally</p>
<p>Joseph</p>
<p>Michael</p>
<p>Sanjay</p>

也可以使用for关键字

1
2
- for user in users
p= user

对象进行迭代:

1
2
3
4
5
- obj = {first_name:'George',surname:'Ornbo'}
- each val,key in obj
li # {key}:# {val}
```
编译后:

  • first_name:George
  • surname:Ornbo

  • 1
    #### 条件

    • awake = false
    • if (awake)
      p You are awake! Make coffee!
    • else
      p You are sleeping
      1
      2
      `if`和`else`关键字之前的减号(-)是可选的
      #### 内联(inline)JavaScript

    script
    alert(‘You can execute inline JavaScript through Jade’)

    1
    2
    ##### 包含(include)
    Jade通过include关键字后跟想要包含的模板来支持包含功能

    html
    body
    include includes/header
    `