C (Create)

使用自带API:

1
2
3
4
5
6
7
8
db = dbHelper.getWritableDatabase();
ContentValue values = new ContentValue();
values.put("name", "第一行代码");
values.put("author", "郭霖");
values.put("price", "79.99");
values.put("pages", "552");
db.insert("Book", null, values);
values.clear();

使用数据库语句:

1
2
db = dbHelper.getWritableDatabase();
db.execSQL("insert into Book (name, author, pages, price) values (?, ?, ?, ?)", new String[]{ "第一行代码", "郭霖", "552", "79.00"});

R (Retrieve)

使用自带API:

1
Cursor cursor = db.query("Book", null, null, null, null, null, null);

使用数据库语句:

1
2
3
4
5
6
7
8
9
10
11
12
db = dbHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT id, name FROM people WHERE name = ? AND id = ?", new String[] {"David", "2"});
if(cursor.moveToFirst()){
do{
String name = cursor.getString(cursor.getColumnIndex("name"));
String id = cursor.getString(cursor.getColumnIndex("id"));

Log.e("TAG", "name = " + name);
Log.e("TAG", "id = " + id);
} while (cursor.moveToNext());
}
cursor.close();

U (Update)

使用自带API:

1
2
3
4
db = dbHelper.getWritableDatabase();
ContentValue values = new ContentValue();
values.put("price", 79.99);
db.update("Book", values, "name = ?", new String[]{ "第一行代码" });

使用数据库语句:

1
2
db = dbHelper.getWritableDatabase();
db.execSQL("update Book set price = ? where name = ?", new String[]{ "79.99", "第一行代码" })

D (Delete)

使用自带API:

1
2
db = dbHelper.getWritableDatabase();
db.delete("Book", "page > ?", new String[]{ "500" });

使用数据库语句:

1
2
db = dbHelper.getWritableDatabase();
db.execSQL("delete from Book where pages > ?", new String[]{ "500" })

使用事务(保证数据操作的原子性)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SQLiteDatabase db = mDbHelper.getWritableDatabase();
try {
db.beginTransaction();

String position = mode.getPosition().ordinal() + "";
String action = mode.getAction().ordinal() + "";

ContentValues values = new ContentValues();
values.put("color", mode.getColor());
values.put("used", mode.isUsed() ? 1 : 0);
values.put("level", mode.getLevel());
values.put("time", mode.getTime());

db.update(TABLE_NAME, values, " position=? and action = ? ", new String[]{position, action});
values.clear();

db.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
db.endTransaction();
db.close();
}

外部链接

摘要:

主要内容:
本文介绍了封装后的SQLite,以便快速开发;
只保留必要的定制,重复的代码封装到一个通用类中;

说明

  • LouSQLite.java文件为通用的代码,所有项目中不需要修改即可使用;
  • MyCallBack.java文件是自定义的文件,关于项目的数据库配置都在这里进行,例如:数据库名称、数据库版本号、table语句等;
  • LouSQLite.java支持常用的CRUD操作(支持事务);

代码

生成密钥

密钥是上传到远程库的凭证,是本地与远程库的桥梁;

1
$ ssh-keygen -t rsa -C "lyloou@qq.com"

添加密钥

复制~/.ssh/id_rsa.pub内容到https://github.com/settings/keysSSH and GPG keys

测试连通性

1
ssh -T git@github.com

big file

keyboard shortcuts

Keyboard shortcuts - GitHub Help

基本操作

C

  • 添加到版本控制: git add filename.md
  • 添加描述并提交: git commit -m "first init"

R

  • 查看图形 log:git log --graph
  • 查看单行 log:git log --pretty=oneline
  • 查看分支合并情况:git log --graph --pretty=oneline --abbrev-commit
  • 查看工作区和版本库最新版本的区别: git diff HEAD -- test.xml
  • 列出每个人的最近 commit 记录:git shortlog
  • 列出每个人的 commit 次数:git shortlog -sne

U

  • 修改提交信息:git commit --amend
  • 取消添加(git add .)的命令:git reset HEAD test.xml

D

  • 移除工作空间的文件: git rm test.xml
  • 丢弃工作区的修改: git checkout -- test.xml,其中--很重要,没有这个--,就变成了“切换到另一个分支”。

RESET

How can I undo those commits from the local repository?
https://stackoverflow.com/questions/927358/how-do-i-undo-the-most-recent-local-commits-in-git

1
git reset HEAD~

远程仓库

分支

创建空白分支

1
git checkout --orphan gh-pages

delete a git branch both locally and remotely.

1
2
3
$ git push --delete <remote_name> <branch_name>
$ git branch -d <branch_name>
# (https://stackoverflow.com/questions/2003505/how-do-i-delete-a-git-branch-both-locally-and-remotely)

本地分支

  • 删除本地分支:git branch -d {the_local_branch}

远程分支

合并 merge & rebase

1
2
3
4
5
6
7
8
9
10
11
12
13
# 我要新增一個功能,所以在master上開一個branch叫feature1。
# 我在新增功能時,加了3個commit在feature1中。
# 當功能開發完成時,checkout回master,要將 feature1合併回master,這時可以有兩個選擇:

# 选择1:master會將feature1上的3個commit全視為master的commit,並將HEAD移到跟feature1的HEAD相同的commit上。
git merge --ff feature1

# 选择2:master會新增一個commit,內容為feature1上的改變,並將HEAD移到新的commit上。
git merge --no-ff feature1

# 至於該使用哪種方式,就要看個人需求了,如果是新增功能的branch,個人認為使用non-fast-forward的方式比較好。
# 這樣可以很清楚的看出哪些是新增功能用的commit,哪些是原本master的commit。master才不會有太多不相干的commit交錯在一起。
# 而且master要移除功能時,也只要處理一個commit就可以了。

remove untracked files

1
2
$ git clean -d -f
$ git clean --help

branch - How to remove local (untracked) files from the current Git working tree? - Stack Overflow

git stash

  • Git 还提供了一个 stash 功能,可以把当前工作状态“储藏”起来,等以后恢复现场后继续工作。

  • 查看 stash 的列表:git stash list

  • 恢复:git stash pop 或者 git stash apply

    一是用 git stash apply 恢复,但是恢复后,stash 内容并不删除,你需要用 git stash drop 来删除;
    另一种方式是用 git stash pop,恢复的同时把 stash 内容也删了:

  • 参考资料:
    Bug 分支

添加注释的技巧

参考golang.org/x/net的提交日志:

1
2
3
4
5
6
7
8
9
10
* 92b859f - ipv6: update icmp parameters (4 days ago) <Mikio Hara>
* 344b2e3 - ipv4: update icmp parameters (4 days ago) <Mikio Hara>
* 08b7f81 - internal/iana: add address family number constants (4 days ago) <Mikio Hara>
* a4c73ec - icmp: use subtests (4 days ago) <Mikio Hara>
* 24dd378 - dns/dnsmessage: reject compressed SRV resource records (6 days ago) <Ian Gudger>
* e0c57d8 - CONTRIBUTING.md: remove note about not accepting Pull Requests (9 days ago) <Andrew Bonventre>
* 892bf7b - dns/dnsmessage: correctly handle multiple and >255 byte TXT records (10 days ago) <Ian Gudger>
* 803fdb9 - ipv4, ipv6, icmp, internal/socket: fix build on netbsd/arm (10 days ago) <Mikio Hara>
* ae89d30 - route: avoid unnecessary type conversions (12 days ago) <namusyaka>
* d0aafc7 - trace: fix races on concurrent Trace method calls (2 weeks ago) <David Howden>

名称最好简洁、准确,
可以总结:模块: 动词 + 名词;
动词:

1
2
3
4
5
6
7
8
9
- add
- update
- fix
- remove
- simply
- enable
- disable
- rename

delete all tags

To delete remote tags (before deleting local tags) simply do:

1
git tag -l | grep v2 -v | xargs -n 1 git push --delete origin

and then delete the local copies:

1
git tag -l | grep v2 -v | xargs git tag -d

How do you rename a Git tag?

1
2
3
4
5
6
git tag new old
git tag -d old
git push origin :refs/tags/old
git push --tags

git pull --prune --tags # Finally, make sure that the other users remove the deleted tag. Please tell them (co-workers) to run the following command

Remove a file from a Git repository without deleting it from the local filesystem

1
2
3
4
5
# For single file:
git rm --cached mylogfile.log

# For single directory:
git rm --cached -r mydirectory

git delete remotes: remote refs do not exist - Stack Overflow

1
2
3
4
# You may need to prune your local "cache" of remote branches first. Try running:
git fetch -p origin
# or
git fetch --prune origin

How to revert multiple git commits? - Stack Overflow

Expanding what I wrote in a comment

The general rule is that you should not rewrite (change) history that you have published, because somebody might have based their work on it. If you rewrite (change) history, you would make problems with merging their changes and with updating for them.

So the solution is to create a new commit which reverts changes that you want to get rid of. You can do this using git revert command.

You have the following situation:

1
A <-- B  <-- C <-- D                                  <-- master <-- HEAD

(arrows here refers to the direction of the pointer: the “parent” reference in the case of commits, the top commit in the case of branch head (branch ref), and the name of branch in the case of HEAD reference).

What you need to create is the following:

1
A <-- B  <-- C <-- D <-- [(BCD)-1]                   <-- master <-- HEAD

where [(BCD)^-1] means the commit that reverts changes in commits B, C, D. Mathematics tells us that (BCD)-1 = D-1 C-1 B-1, so you can get the required situation using the following commands:

1
2
3
4
$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message for all of them"

Works for everything except merge commits.


Alternate solution would be to checkout contents of commit A, and commit this state. Also works with merge commits. Added files will not be deleted, however. If you have any local changes git stash them first:

1
2
$ git checkout -f A -- . # checkout that revision over the top of local files
$ git commit -a

Then you would have the following situation:

1
A <-- B  <-- C <-- D <-- A'                       <-- master <-- HEAD

The commit A’ has the same contents as commit A, but is a different commit (commit message, parents, commit date).


Alternate solution by Jeff Ferland, modified by Charles Bailey builds upon the same idea, but uses git reset. Here it is slightly modified, this way WORKS FOR EVERYTHING:

1
2
3
$ git reset --hard A
$ git reset --soft D # (or ORIG_HEAD or @{1} [previous location of HEAD]), all of which are D
$ git commit

统计

统计 tag1 和 tag2 之间的行数

1
2
3
4
git log tag1..tag2 --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 + $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }'

# 或者
git log tag1..tag2 --pretty=tformat: --numstat | awk '{ add += $1 ; subs += $2 ; loc += $1 + $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }'

统计某个人修改的代码行数

1
2
3
4
5
# 当前作者
git log --author="$(git config --get user.name)" --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 + $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }'

# 或者修改 username 为此人名字
git log --author="username" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -

按个人分别统计

1
git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done

统计总行数

1
git log  --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -

按时间范围统计个人行数

1
2
git log --since="2020-01-08" --before="2021-11-14" --author="lilou" \
--pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "新增行数: %s, 移除行数: %s, 总行数: %s\n", add, subs, loc }'

仓库提交排名

1
git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5

贡献者统计

1
git log --pretty='%aN' | sort -u | wc -l

提交数统计

1
git log --oneline | wc -l

参考链接

设置用户名和邮箱

1
2
3
4
5
6
$ git config --global user.name "Lou"
$ git config --global user.email "lyloou6@gmail.com"

// 查看用户的配置信息
$ git config user.name
$ git config user.email

保存 push 时的用户名和密码

针对 http 协议的也可以不用总是输入用户名密码那么麻烦,如:https://github.com/lyloou/hexo.git
可以通过设置credential.help来保存。

1
git config --global credential.helper store

同时同步多个远程分支

1
2
3
4
5
git config -–add remote.all.url  http://domain1.com/repo.git
git config -–add remote.all.url http://domain2.com/repo.git

git push all master
git push all develop

网络配置:

1
2
git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'

或:

1
2
git config --global http.proxy http://127.0.0.1:8118
git config --global https.proxy https://127.0.0.1:8118

Windows 下使用 Privoxy 转换 socks5 代理为 Http 代理 | 小田的 blog

配置别名

1
2
// 显示漂亮的分支日志:git lg
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

解除上传文件大小限制

1
git config http.postBuffer 524288000

https://blog.csdn.net/zhiyuan_x/article/details/72954729

行尾结束符自动转换问题

warning: LF will be replaced by CRLF in xx.txt
如果项目的文件是依照文件的 md5 来作为标识,那么提交代码到远程仓库,文件的行尾结束符会自动发生改变,那么之前的 md5 标识就发挥不到作用
(这样的 bug 很难找),这时候就需要取消 git 的行尾结束符自动转换功能;

1
$ git config --global core.autocrlf false

.gitignore 文件

package.json/package.json两种表示方式的区别

  • 前者是所有目录中的 package.json文件都被忽略;
  • 后者是只有当前目录的 package.json文件被忽略;

Prevent commits in master or develop branch

  1. Go to your repository.
  2. Create file .git/hooks/pre-commit with following content:
1
2
3
4
5
6
7
#!/bin/sh
branch="$(git rev-parse --abbrev-ref HEAD)"

if [ "$branch" = "develop" -o "$branch" = "master" ]; then
echo "You can't commit directly to master or develop branch"
exit 1
fi
  1. Make it executable (not required on Windows):
1
$ chmod +x .git/hooks/pre-commit

To disable fast-forwad merges you must also add following option to your .git/config file:

1
2
[branch "master"]
mergeoptions = --no-ff

If you want also protect master branch on your remote, check this answer: How to restrict access to master branch on git

NOTE

  • 配置 Git 的时候,加上–global 是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
  • 可以通过配置~/.gitconfig文件来删除和修改配置

参考链接

前导

安装 git: d:/c/git
安装 cmder: d:/p/cmder

user_aliases

1
2
3
4
5
6
7
8
9
10
11
12
13
e.=explorer .
;gl=git log --color --oneline --all --graph --decorate $*
gl=git lg
ls=ls --show-control-chars -F --color=auto $*
ll=ls -l
pwd=cd
clear=cls
history=cat "%CMDER_ROOT%\config\.history"
unalias=alias /d $1
vi=vim $*
cmderr=cd /d "%CMDER_ROOT%"
cdt=cd /d d:/t
cdw=cd /d d:/w

Settings -> Startup/Environment

1
2
3
4
5
set PATH=%ConEmuBaseDir%\Scripts;%PATH%
set LANG=zh_CN.UTF8
set HOME=D:\w\cmder
set http_proxy=http://127.0.0.1:1080
set https_proxy=http://127.0.0.1:1080

快捷键

模仿 terminal 终端的快捷键,
+^O: 水平分割
+^E: 垂直分割
+^P: 上一个终端
+^N: 下一个终端

主题

solarized

设置别名

cmder 别名设置和自定义 cmder 启动界面 - SegmentFault 思否

在 gitbash安装目录下的 etc/bash.bashrc中加入 alias 配置

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


alias e.="explorer ."
alias gl="git log --color --oneline --all --graph --decorate $*"
alias glh="git lg | head"
alias gh="git lg | head"
alias ls="ls --show-control-chars -F --color=auto $*"
alias ll="ls -l"
alias pwd="cd"
alias clear="cls"
alias unalias="alias /d $1"
alias vi="vim $*"
alias cdt="cd d:/t"
alias cdw="cd d:/w"
alias cdc="cd d:/c"
alias cdd="cd C:/Users/lilou/Desktop"
alias cdwr="cd d:/w/weex/mobile"
alias cdp="cd d:/w/go/src/github.com/lyloou/pugo"
alias cdgo="cd d:/w/go/src/"
alias vv="d:/c/Vim/vim81/gvim.exe -p --remote-tab-silent $*"
alias mvnc="mvn clean -Dmaven.test.skip"
alias mvncc="mvn clean compile -Dmaven.test.skip"
alias mvncd="mvn clean deploy -Dmaven.test.skip"
alias mvnci="mvn clean install -Dmaven.test.skip"

alias ..="cd .."
alias ...="cd .. && cd .."
alias www="python -m SimpleHTTPServer 8000"

摘要:

本文介绍了将自己的库发布到jcenter相关的一些总结。

之所以有这篇文章,起源于这样一种原因:

在AS中使用开源库很简单,只需要在build.gradle文件中添加一句命令即可。
如果我想要把自己积累的常用代码库也通过这种方式,那么我就可以在多个项目中使用,也可以开源给其他程序员使用。

初次配置(具体参考外部链接)

  • 配置project的build.gradle文件;
  • 配置lib的build.gradle文件;
  • 在终端执行gradlew相关命令上传到jcenter;

更新版本库

  • 修改版本号;
  • 完成清单tool/Checklist.md
  • 在命令行窗口执行下面命令(当发生错误时,参照错误提示进行修改)
    1
    2
    3
    4
    gradlew clean build bintrayUpload
    -PbintrayUser=「Your Name」
    -PbintrayKey=「API KEY」
    -PdryRun=false

外部链接

摘要:

主要内容:
本文介绍了如何判断一个对象是否是一个类的实例。

instanceof运算符 只被用于对象引用变量,检查左边的被测试对象 是不是 右边类或接口的 实例化。如果被测对象是null值,则测试结果总是false。
形象地:自身实例或子类实例 instanceof 自身类 返回true
例: String s=new String(“javaisland”);
System.out.println(s instanceof String); //true

Class类的isInstance(Object obj)方法,obj是被测试的对象,如果obj是调用这个方法的class或接口 的实例,则返回true。这个方法是instanceof运算符的动态等价。
形象地:自身类.class.isInstance(自身实例或子类实例) 返回true
例:String s=new String(“javaisland”);
System.out.println(String.class.isInstance(s)); //true

Class类的isAssignableFrom(Class cls)方法,如果调用这个方法的class或接口 与 参数cls表示的类或接口相同,或者是参数cls表示的类或接口的父类,则返回true。
形象地:自身类.class.isAssignableFrom(自身类或子类.class) 返回true
例:System.out.println(ArrayList.class.isAssignableFrom(Object.class)); //false
System.out.println(Object.class.isAssignableFrom(ArrayList.class)); //true

外部链接

《Android群英传》 笔记

| apk 安装路径: –p220(q1)

  • /system/app : 系统及别的 apk;
  • /data/app : 用户安装的 apk;

| android 管理器
pm(package manager): 主宰着应用的包管理;
am(activity manager): 主宰着应用的活动管理; –p210(q1)

| 如果说系统信息好比是国家的 GDP, 那么 Apk 应用信息则像是对个人的经济普查。 –p210(q1)

| 一个 Task 中的 Activity 可以来自不同的 APP,
同一个 App 的 Activity 也可能不再一个 Task 中。 –p200(q1)

| 一个合理的任务调度栈不仅是性能的保证,更是提供性能的基础。 –p200(q1)

| 如果你得自定义 View 需要频繁刷新,或者刷新时数据处理量比较大,
那么就可以考虑使用 SurfaceView 来取代 View 了。 –p155(q1)

| canvas 的方法: –p118(q1)

  • save(): 保存画布;作用是将之前的所有已绘制图像保存起来,让后续的操作就好像在新图层上操作一样;
  • restore(): 合并图层;作用是将 save 之后的和 save 之前的图像进行合并;
  • translate(): 坐标系的平移;
  • rotate(): 坐标系的翻转;

| scrollTo、scrollBy 方法移动的是 View 的 content, 即让 View 的内容移动( content ),
如果在 ViewGroup 中使用 scrollTo、 scrollBy 方法,那么移动的将是所有子 View;
例如: TextView, content 就是它的文本; ImageView, content 就是它的 drawable. –p95(q1)

| 形象的事件处理机制: –p62(q1)

  • 事件的传递顺序:
    总经理(MyViewGroupA) –> 部长(MyViewGroupB) –> 你(View)。
    事件传递的时候,先执行 dispatchTouchEvent() 方法,再执行 onInterceptTouchEvent()
    方法(注意:View 没有 onInterceptTouchEvent方法,只有 ViewGroup 有这个方法)。
  • 事件的处理顺序:
    你(View) –> 部长(MyViewGroupB) –> 总经理(MyViewGroupB)。
    事件处理都是执行 onTouchEvent() 方法。
  • 事件传递的返回值: true, 拦截;false, 不拦截, 继续流程;
  • 事件处理的返回值: true, 处理了,不用审核; false, 给上级处理。
  • 初始情况下,返回值都是 false。

| 动态控制UI模板的方法:接口回调、提供 public 方法。 –p48(q1)

  • 接口回调
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    interface Ilistener {
    void click(View v);
    }

    private void innerMethod(View v) {
    mIlistener.click(v);
    }

    // 声明和初始化
    Ilistener mIlistener;
    public void register(Ilistener listener){
    mIlistener = listener;
    }
  • 提供 public 方法
    1
    2
    3
    4
    private String mStr;
    public void publicMethod(String str) {
    mStr = str;
    }

| 解释 bitmap 和 Canvas –p38(q1)

1
2
3
// 装载画布:将 bitmap 装载到画布 canvas 上,
// 这个 bitmap 存储了所有绘制在 Canvas.drawXXX 方法的像素信息
Canvas canvas = new Canvas(bitmap);

代码解释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Canvas canvas;
Bitmap bitmap1, bitmap2;
private void initBitmap() {
bitmap1 = new Bitmap(...);
bitmap2 = new Bitmap(...);
}

private void initCanvas() {
this.canvas = new Canvas(bitmap2);
}

@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(bitmap1, 0, 0, null);
canvas.drawBitmap(bitmap2, 0, 0, null);
}

private void changeBitmap2(){

}

| Canvas 就像一个画板,使用 Paint 就可以在上面作画了。 –p37(q1)

| 其实,Android 就好像那个蒙着眼睛画画的人,你必须精确地告诉它如何去画,
它才能绘出你想要的图形;–p34(q1)|

| Intent - Android上的信使,信息传递的载体;
–p5(q1)

0%