牟骏荣博客


  • 首页

  • 安卓学习

  • Linux学习

  • 前端

  • 服务端

  • Python

Untitled

Posted on 2018-09-14

title: android-ImageView保存图片到手机并更新媒体库
tags:

  • android
    categories:
  • 安卓

android-ImageView保存图片到手机并更新媒体库

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
//调用执行
imageview.setDrawingCacheEnabled(true);
Bitmap imageBitmap = imageview.getDrawingCache();
if (imageBitmap != null) {
new SaveImageTask().execute(imageBitmap);
}




private class SaveImageTask extends AsyncTask<Bitmap, Void, String> {
@Override
protected String doInBackground(Bitmap... params) {
String result = getResources().getString(R.string.save_picture_failed);
try {
String sdcard = Environment.getExternalStorageDirectory().toString();
// String sdcard = Environment.getDataDirectory().toString();
// String sdcard = getBaseContext().getFilesDir().toString();;
File fileDir=new File(getApplication().getExternalCacheDir(),"images");
System.out.println(sdcard);

// File file = new File(sdcard + "/DCIM");
file = new File(sdcard+ "/Download");
if (!file.exists()) {
file.mkdirs();
}
fileName = "IMG_" + new Date().getTime() + ".jpg";
File imageFile = new File(file.getAbsolutePath(),fileName);
FileOutputStream outStream = null;
outStream = new FileOutputStream(imageFile);
Bitmap image = params[0];
image.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
outStream.flush();
outStream.close();
result = getResources().getString(R.string.save_picture_success, file.getAbsolutePath());
} catch (Exception e) {
e.printStackTrace();
}
return result;
}

@Override
protected void onPostExecute(String result) {
Toast.makeText(getApplicationContext(),result,Toast.LENGTH_SHORT).show();

share_code_img.setDrawingCacheEnabled(false);

//后面两句是重点不然不会再媒体库中显示(或者重启后显示)
try {
MediaStore.Images.Media.insertImage(getBaseContext().getContentResolver(),
file.getAbsolutePath(), fileName, null);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
getBaseContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file.getAbsolutePath()+fileName)));
}
}

WebView技巧

Posted on 2018-09-14 | In 安卓
  • WebView技巧

    WebView启用相关配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       wv = (WebView) findViewById(R.id.article_webwiew);
    wv.getSettings().setSupportMultipleWindows(true);
    wv.getSettings().setJavaScriptEnabled(true);
    wv.setWebViewClient(new WebViewClient());
    wv.setWebChromeClient(new WebChromeClient());
    wv.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);//关闭缓存
    wv.getSettings().setAllowFileAccess(true);//允许读取文件
    wv.getSettings().setAllowContentAccess(true);
    wv.getSettings().setSupportZoom(false);//禁止缩放
    wv.getSettings().setDomStorageEnabled(true);//开启本地数据库储存
    wv.getSettings().setDatabaseEnabled(true);

WebView 缩放

1
2
3
4
wv.getSettings().setSupportZoom(true);//禁止缩放
wv.getSettings().setBuiltInZoomControls(true);
wv.getSettings().setDisplayZoomControls(true);
wv.setInitialScale(100); //缩放比例

WebView JSON数据替换为String

1
2
3
4
5
6
7
8
9
webView = (WebView) findViewById(R.id.bbs_webview);  
webView.getSettings().setJavaScriptEnabled(true);
special_content = special_content.replaceAll("&", "");
special_content = special_content.replaceAll(""", "\"");
special_content = special_content.replaceAll("<", "<");
special_content = special_content.replaceAll(">", ">");
special_content = special_content.replaceAll("\\n", "<br>");//换行
special_content = special_content.replaceAll("<img", "<img width=\"100%\"");//图片不超出屏幕
webView.loadDataWithBaseURL(null, special_content, "text/html", "utf-8", null); //加载html源码

RelativeLayout相对布局 安卓布局技巧

Posted on 2018-09-14 | In 安卓
  • RelativeLayout相对布局
  • 相对布局 RelativeLayout 允许子元素指定它们相对于其父元素或兄弟元素的位置,这是实际布局中最常用的布局方式之一。它灵活性大很多,当然属性也多,操作难度也大,属性之间产生冲突的的可能性也大,使用相对布局时要多做些测试。

    下面是常用的一些属性

    RelativeLayout用到的一些重要的属性:

    第一类:属性值为true或false

  • android:layout_centerHrizontal 水平居中
  • android:layout_centerVertical 垂直居中
  • android:layout_centerInparent 相对于父元素完全居中
  • android:layout_alignParentBottom 贴紧父元素的下边缘
  • android:layout_alignParentLeft 贴紧父元素的左边缘
  • android:layout_alignParentRight 贴紧父元素的右边缘
  • android:layout_alignParentTop 贴紧父元素的上边缘
  • android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物

第二类:属性值必须为id的引用名“@id/id-name”

  • android:layout_below 在某元素的下方
  • android:layout_above 在某元素的的上方
  • android:layout_toLeftOf 在某元素的左边
  • android:layout_toRightOf 在某元素的右边
  • android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐
  • android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐
  • android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐
  • android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐

    第三类:属性值为具体的像素值,如30dip,40px

  • android:layout_marginBottom 离某元素底边缘的距离
  • android:layout_marginLeft 离某元素左边缘的距离
  • android:layout_marginRight 离某元素右边缘的距离
  • android:layout_marginTop 离某元素上边缘的距离

EditText的android:hint

  • 设置EditText为空时输入框内的提示信息。
  • android:gravity 
  • android:gravity属性是对该view 内容的限定.比如一个button 上面的text. 你可以设置该text 在view的靠左,靠右等位置.以button为例,android:gravity=”right”则button上面的文字靠右
  • android:layout_gravity
  • android:layout_gravity是用来设置该view相对与起父view 的位置.比如一个button 在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为例,android:layout_gravity=”right”则button靠右
  • android:layout_alignParentRight
  • 使当前控件的右端和父控件的右端对齐。这里属性值只能为true或false,默认false。

android:scaleType:

  • android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType / android:scaleType值的意义区别:
  • CENTER /center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
  • CENTER_CROP / centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
  • CENTER_INSIDE / centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
  • FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示
  • FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
  • FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
  • FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示
  • MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。
  • ** 要注意一点,Drawable文件夹里面的图片命名是不能大写的。

MongoDB整库备份与还原以及单个collection备份、恢复方法

Posted on 2018-09-14 | In android-安卓
  • mongodb数据库维护离不开必要的备份、恢复操作,而且一般不会出错,所以我们在使用的时候大部分时候使用备份和恢复操作就可以了

mongodump.exe备份的原理是通过一次查询获取当前服务器快照,并将快照写入磁盘中,因此这种方式保存的也不是实时的,因为在获取快照后,服务器还会有数据写入,为了保证备份的安全,同样我们还是可以利用fsync锁使服务器数据暂时写入缓存中。

备份前的检查

1
2
3
4
5
6
7
8
9
10
11
12
> show dbs
MyDB 0.0625GB
admin (empty)
bruce 0.0625GB
local (empty)
test 0.0625GB
> use MyDB
switched to db MyDB
> db.users.find()
{ "_id" : ObjectId("4e290aa39a1945747b28f1ee"), "a" : 1, "b" : 1 }
{ "_id" : ObjectId("4e2cd2182a65c81f21566318"), "a" : 3, "b" : 5 }
>

整库备份

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
mongodump -h dbhost -d dbname -o dbdirectory
-h:MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d:需要备份的数据库实例,例如:test
-o:备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。

mongodump的官方说明(可通过mongodump --help查看):
options:
--help produce help message
-v [ --verbose ] be more verbose (include multiple times for more
verbosity e.g. -vvvvv)
--version print the program's version and exit
-h [ --host ] arg mongo host to connect to ( /s1,s2 for
sets)
--port arg server port. Can also use --host hostname:port
--ipv6 enable IPv6 support (disabled by default)
-u [ --username ] arg username
-p [ --password ] arg password
--dbpath arg directly access mongod database files in the given
path, instead of connecting to a mongod server -
needs to lock the data directory, so cannot be used
if a mongod is currently accessing the same path
--directoryperdb if dbpath specified, each db is in a separate
directory
--journal enable journaling
-d [ --db ] arg database to use
-c [ --collection ] arg collection to use (some commands)
-o [ --out ] arg (=dump) output directory or "-" for stdout
-q [ --query ] arg json query
--oplog Use oplog for point-in-time snapshotting
--repair try to recover a crashed database
--forceTableScan force a table scan (do not use $snapshot)

整库恢复:

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

mongorestore -h dbhost -d dbname –directoryperdb dbdirectory
-h:MongoDB所在服务器地址
-d:需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
–directoryperdb:备份数据所在位置,例如:c:\data\dump\test,这里为什么要多加一个test,而不是备份时候的dump,读者自己查看提示吧!
–drop:恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!

mongorestore的官方说明(可通过mongorestore --help查看):
options:
--help produce help message
-v [ --verbose ] be more verbose (include multiple times for more
verbosity e.g. -vvvvv)
--version print the program's version and exit
-h [ --host ] arg mongo host to connect to ( /s1,s2 for sets)
--port arg server port. Can also use --host hostname:port
--ipv6 enable IPv6 support (disabled by default)
-u [ --username ] arg username
-p [ --password ] arg password
--dbpath arg directly access mongod database files in the given
path, instead of connecting to a mongod server -
needs to lock the data directory, so cannot be used
if a mongod is currently accessing the same path
--directoryperdb if dbpath specified, each db is in a separate
directory
--journal enable journaling
-d [ --db ] arg database to use
-c [ --collection ] arg collection to use (some commands)
--objcheck validate object before inserting
--filter arg filter to apply before inserting
--drop drop each collection before import
--oplogReplay replay oplog for point-in-time restore
--oplogLimit arg exclude oplog entries newer than provided timestamp
(epoch[:ordinal])
--keepIndexVersion don't upgrade indexes to newest version
--noOptionsRestore don't restore collection options
--noIndexRestore don't restore indexes
--w arg (=1) minimum number of replicas per write

单个collection备份

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
mongoexport -h dbhost -d dbname -c collectionname -f collectionKey -o dbdirectory
-h: MongoDB所在服务器地址
-d: 需要恢复的数据库实例
-c: 需要恢复的集合
-f: 需要导出的字段(省略为所有字段)
-o: 表示导出的文件名

mongoexport -h 127.0.0.1:5506 -c tables -d dbname --out db.doc.json

mongoexport的官方说明(可通过mongoexport --help查看):
--help produce help message
-v [ --verbose ] be more verbose (include multiple times for more
verbosity e.g. -vvvvv)
--version print the program's version and exit
-h [ --host ] arg mongo host to connect to ( /s1,s2 for
sets)
--port arg server port. Can also use --host hostname:port
--ipv6 enable IPv6 support (disabled by default)
-u [ --username ] arg username
-p [ --password ] arg password
--dbpath arg directly access mongod database files in the given
path, instead of connecting to a mongod server -
needs to lock the data directory, so cannot be used
if a mongod is currently accessing the same path
--directoryperdb if dbpath specified, each db is in a separate
directory
--journal enable journaling
-d [ --db ] arg database to use
-c [ --collection ] arg collection to use (some commands)
-f [ --fields ] arg comma separated list of field names e.g. -f
name,age
--fieldFile arg file with fields names - 1 per line
-q [ --query ] arg query filter, as a JSON string
--csv export to csv instead of json
-o [ --out ] arg output file; if not specified, stdout is used
--jsonArray output to a json array rather than one object per
line
-k [ --slaveOk ] arg (=1) use secondaries for export if available, default
true
--forceTableScan force a table scan (do not use $snapshot)

单个collection恢复

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

mongoimport -d dbhost -c collectionname –type csv –headerline –file
-type: 指明要导入的文件格式
-headerline: 批明不导入第一行,因为第一行是列名
-file: 指明要导入的文件路径

mongoimport -h 127.0.0.1:5506 -c tablename -d dbname ./tool.documents.json

mongoimport的官方说明(可通过mongoimport --help查看):
--help produce help message
-v [ --verbose ] be more verbose (include multiple times for more
verbosity e.g. -vvvvv)
--version print the program's version and exit
-h [ --host ] arg mongo host to connect to ( /s1,s2 for sets)
--port arg server port. Can also use --host hostname:port
--ipv6 enable IPv6 support (disabled by default)
-u [ --username ] arg username
-p [ --password ] arg password
--dbpath arg directly access mongod database files in the given
path, instead of connecting to a mongod server -
needs to lock the data directory, so cannot be used
if a mongod is currently accessing the same path
--directoryperdb if dbpath specified, each db is in a separate
directory
--journal enable journaling
-d [ --db ] arg database to use
-c [ --collection ] arg collection to use (some commands)
-f [ --fields ] arg comma separated list of field names e.g. -f name,age
--fieldFile arg file with fields names - 1 per line
--ignoreBlanks if given, empty fields in csv and tsv will be ignored
--type arg type of file to import. default: json (json,csv,tsv)
--file arg file to import from; if not specified stdin is used
--drop drop collection first
--headerline CSV,TSV only - use first line as headers
--upsert insert or update objects that already exist
--upsertFields arg comma-separated fields for the query part of the
upsert. You should make sure this is indexed
--stopOnError stop importing at first error rather than continuing
--jsonArray load a json array, not one item per line. Currently
limited to 16MB.

其他导入与导出操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1. mongoimport -d my_mongodb -c user user.dat

参数说明:

-d 指明使用的库, 本例中为” my_mongodb”

-c 指明要导出的表, 本例中为”user”

可以看到导入数据的时候会隐式创建表结构

2. mongoexport -d my_mongodb -c user -o user.dat

参数说明:

-d 指明使用的库, 本例中为” my_mongodb”

-c 指明要导出的表, 本例中为”user”

-o 指明要导出的文件名, 本例中为”user.dat”

从上面可以看到导出的方式使用的是JSON 的样式.

Linux常用命令收藏

Posted on 2018-09-14 | In Linux
  • crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用crontab,那么任务就是常驻程序,这对你的程序要求比较高,一个要求你的程序是24X7小时不宕机,一个是要求你的调度程序比较可靠,实际工作中,90%的程序都没有必要花这么多时间和精力去解决上面的两个问题的,只需要写好自己的业务逻辑,通过crond这个工业级程序去调度就行了,crond的可靠性,健壮性,大家应该是毫无疑问的。

crontab显示定时任务列表

1
2
crontab -e
* * * * * /home/blue/do/rsyncfile.sh
  • 特殊关键词附图说明
    crontab
  • 在以上各个字段中,还可以使用以下特殊字符:
  • 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
  • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
  • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
  • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

    服务操作说明:

    1
    2
    3
    4
    5
    6
    /sbin/service crond start //启动服务
    /sbin/service crond stop //关闭服务
    /sbin/service crond restart //重启服务
    /sbin/service crond reload //重新载入配置
    /sbin/service crond status //启动服务
    /etc/init.d/cron restart //重启服务

Screen 常用命令

1
2
3
screen -R name ;//启动一个窗口命令
screen -S name -X quit ;//强行关闭窗口命令
screen -r name ; 启动一个存在的窗口

ubuntu开放指定端口

开放端口

  • 由于我的服务器使用的os是Ubuntu,所以这里就介绍一下Ubuntu下的方法,其他linux应该也是大同小异,需要自己去尝试

安装iptables

  • 一般情况下,ubuntu安装好的时候,iptables会被安装上,如果没有的话那就安装上吧
  • 在终端输入
1
sudo apt-get install iptables

添加规则

  • 在终端输入
1
$ iptables -I INPUT -p tcp --dport 80 -j ACCEPT
  • 中间的80为所需要开放的端口

保存规则

  • 在终端输入
1
iptables-save
  • 完成上述命令我们就完成了开放指定的端口,但是如果此时服务器重启,上述规则就没有了,所以我们需要对规则进行一下持续化操作

持续化规则

  • 这里我们需要在安装一下工具来帮我们实现,这里我们使用 iptables-persistent
1
2
3
4
5
sudo apt-get install iptables-persistent //安装iptables-persistent


$ sudo netfilter-persistent save //持久化规则
$ sudo netfilter-persistent reload
  • 完成上述操作就可以永久打开我们需要的端口了

Git常用命令

Posted on 2018-09-14 | In 前端

查看、添加、提交、删除、找回,重置修改文件

  • git help # 显示command的help
  • git show # 显示某次提交的内容 git show $id
  • git co – # 抛弃工作区修改
  • git co . # 抛弃工作区修改
  • git add # 将工作文件修改提交到本地暂存区
  • git add . # 将所有修改过的工作文件提交暂存区
  • git rm # 从版本库中删除文件
  • git rm –cached # 从版本库中删除文件,但不删除文件
  • git reset # 从暂存区恢复到工作文件
  • git reset – . # 从暂存区恢复到工作文件
  • git reset –hard # 恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改
  • git ci git ci . git ci -a # 将git add, git rm和git ci等操作都合并在一起做  git ci -am “some comments”
  • git ci –amend # 修改最后一次提交记录
  • git revert <$id> # 恢复某次提交的状态,恢复动作本身也创建次提交对象
  • git revert HEAD # 恢复最后一次提交的状态

查看文件diff

  • git diff # 比较当前文件和暂存区文件差异 git diff
  • git diff # 比较两次提交之间的差异
  • git diff .. # 在两个分支之间比较
  • git diff –staged # 比较暂存区和版本库差异
  • git diff –cached # 比较暂存区和版本库差异
  • git diff –stat # 仅仅比较统计信息

    查看提交记录

  • git log git log # 查看该文件每次提交记录
  • git log -p # 查看每次详细修改内容的diff
  • git log -p -2 # 查看最近两次详细修改内容的diff
  • git log –stat #查看提交统计信息

    tig

  • Mac上可以使用tig代替diff和log,brew install tig

    Git 本地分支管理

    查看、切换、创建和删除分支

  • git br -r # 查看远程分支
  • git br <new_branch> # 创建新的分支
  • git br -v # 查看各个分支最后提交信息
  • git br –merged # 查看已经被合并到当前分支的分支
  • git br –no-merged # 查看尚未被合并到当前分支的分支
  • git co # 切换到某个分支
  • git co -b <new_branch> # 创建新的分支,并且切换过去
  • git co -b <new_branch> # 基于branch创建新的new_branch
  • git co $id # 把某次历史提交记录checkout出来,但无分支信息,切换到其他分支会自动删除
  • git co $id -b <new_branch> # 把某次历史提交记录checkout出来,创建成一个分支
  • git br -d # 删除某个分支
  • git br -D # 强制删除某个分支 (未被合并的分支被删除的时候需要强制)

    分支合并和rebase

  • git merge # 将branch分支合并到当前分支
  • git merge origin/master –no-ff # 不要Fast-Foward合并,这样可以生成merge提交
  • git rebase master # 将master rebase到branch,相当于: git co && git rebase master && git co master && git merge

    Git补丁管理(方便在多台机器上开发同步时用)

  • git diff > ../sync.patch # 生成补丁
  • git apply ../sync.patch # 打补丁
  • git apply –check ../sync.patch #测试补丁能否成功

    Git暂存管理

  • git stash # 暂存
  • git stash list # 列所有stash
  • git stash apply # 恢复暂存的内容
  • git stash drop # 删除暂存区

    Git远程分支管理

  • git pull # 抓取远程仓库所有分支更新并合并到本地
  • git pull –no-ff # 抓取远程仓库所有分支更新并合并到本地,不要快进合并
  • git fetch origin # 抓取远程仓库更新
  • git merge origin/master # 将远程主分支合并到本地当前分支
  • git co –track origin/branch # 跟踪某个远程分支创建相应的本地分支
  • git co -b <local_branch> origin/<remote_branch> # 基于远程分支创建本地分支,功能同上
  • git push # push所有分支
  • git push origin master # 将本地主分支推到远程主分支
  • git push -u origin master # 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)
  • git push origin <local_branch> # 创建远程分支, origin是远程仓库名
  • git push origin <local_branch>:<remote_branch> # 创建远程分支
  • git push origin :<remote_branch> #先删除本地分支(git br -d ),然后再push删除远程分支

    Git远程仓库管理

  • git remote -v # 查看远程服务器地址和仓库名称
  • git remote show origin # 查看远程服务器仓库状态
  • git remote add origin git@ github:robbin/robbin_site.git # 添加远程仓库地址
  • git remote set-url origin git@ github.com:robbin/robbin_site.git # 设置远程仓库地址(用于修改远程仓库地址) git remote rm # 删除远程仓库

    创建远程仓库

  • git clone –bare robbin_site robbin_site.git # 用带版本的项目创建纯版本仓库
  • scp -r my_project.git git@ git.csdn.net:~ # 将纯仓库上传到服务器上
  • mkdir robbin_site.git && cd robbin_site.git && git –bare init # 在服务器创建纯仓库
  • git remote add origin git@ github.com:robbin/robbin_site.git # 设置远程仓库地址
  • git push -u origin master # 客户端首次提交
  • git push -u origin develop # 首次将本地develop分支提交到远程develop分支,并且track
  • git remote set-head origin master # 设置远程仓库的HEAD指向master分支

    git 添加第二个仓库

  • git remote add origin git@ github.com:robbin/robbin_site.git # 设置远程仓库地址
  • git pull origin master —-allow-unrelated-histories
    也可以命令设置跟踪远程库和本地库
  • git branch –set-upstream master origin/master
  • git branch –set-upstream develop origin/develop

Express使用html模板

Posted on 2018-09-14 | In 服务端


Express使用html模板

安装ejs

  • 在项目根目录安装ejs.
1
npm install ejs

引入ejs

1
var ejs = require('ejs');  //我是新引入的ejs插件

设置html引擎

1
app.engine('html', ejs.__express);
  • 设置视图引擎
1
app.set('view engine', 'html');
  • 保存后重启服务,即可访问html文件。
  • 注:在express搭建的服务器中,html引擎没有被配置,直接添加即可;视图引擎已配置,修改配置即可。
  • 修改的这些设置做了什么操作?

  • 为什么修改了视图引擎还要增加设置html引擎?

  • 我们先看一下.engine()这个方法。

1
app.engine(ext, callback);

Express默认使用jade模板。

  • 如果你尝试加载 “foo.jade” 文件,Express内部会调用如下操作。
1
app.engine('jade', require('jade').__express);

如果要使用其他模板引擎,如:将EJS模板映射至”.html”文件:

1
app.engine('html', require('ejs').__express);
  • 这行代码中,实际调用了EJS的.renderFile()方法,ejs.__express是该方法在EJS内部的另一个名字。

  • 因为加载的模板引擎后调用的是同一个方法.__express,所以如果使用的是ejs模板,不用配置该项。

总结:使用html模板,需增加 app.engine(‘html’, require(‘ejs’).__express);使用EJS模板,不用配置该项。
  • 此时如果在views文件夹里创建index.html文件或index.ejs文件,访问的仍然是默认的index.jade文件。这是为什么呢?这里要说的就是上面提到的第二项设置
1
2
app.set('view engine', 'html');
app.set(name, value);
  • 在.set()方法的参数中,有一项是’view engine’,表示没有指定文件模板格式时,默认使用的引擎插件。如果这里设置为html文件,设置路由指定文件时,只需写文件名,就会找对应的html文件。于此,脑洞大开,试了一下在views中创建3个文件test.jade、test.ejs、test.html。路由设置如下。访问正常!每个路由都指向对应的文件。当然这种写法是完全不被建议也不符合现实的。
1
2
3
4
5
6
7
8
9
10
router.get('/test/',function(req, res, next){
res.render('test', {title: 'HTML'});
});

router.get('/test1/',function(req, res, next){
res.render('test.ejs', {title: 'EJS'});
});

router.get('/test2/',function(req, res, next){
res.render('test.jade', {title: 'jade});});

Drawable类,在不同分辨率下的设置

Posted on 2018-09-14 | In 安卓

手工设置文本与图片相对位置时,常用到如下方法:
setCompoundDrawables(left, top, right, bottom);
setCompoundDrawablesWithIntrinsicBounds(left, top, right, bottom)

意思是设置Drawable显示在text的左、上、右、下位置。(Textview、Button都可以)

但是两者有些区别:
setCompoundDrawables 画的drawable的宽高是按drawable.setBound()设置的宽高,所以才有The Drawables must already have had setBounds(Rect) called.意思是说使用之前必须使用Drawable.setBounds设置Drawable的长宽。
而setCompoundDrawablesWithIntrinsicBounds是画的drawable的宽高是按drawable固定的宽高,所以才有The Drawables’ bounds will be set to their intrinsic bounds.这句话之说!

获取资源文件夹图片的Drawable对象

1
this.getResources().getDrawable(R.drawable.icon)

获取与设置Drawable的长和宽

1
2
3
4
RadioButton rr =(RadioButton)this.findViewById(R.id.radio_button0);
Drawable d1 = rr.getCompoundDrawables()[1]; //此处取的是android:drawableTop的图片
drawable.setBounds(0, 0, d1.getIntrinsicWidth(), d1.getIntrinsicHeight());
//getIntrinsicWidth()取得的是Drawable在手机上的宽度,所以不同分辨率下获取到的值是不同的,关键所在处

DOM鼠标按下Scroll左右拖动

Posted on 2018-09-14 | In 前端
  • DOM鼠标按下Scroll左右拖动

    DOM鼠标按下Scroll左右拖动

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    var box = document.getElementById("box");
    box.onmousedown = function (ev) {
    console.log("---");
    var scrollx = box.scrollLeft;
    var ev = ev || window.event;
    var topleft = ev.clientX - box.offsetLeft;
    console.log("topleft", topleft);
    document.onmousemove = function (ev) {
    var ev = ev || window.event;
    var nowx = ev.clientX - box.offsetLeft;
    console.log("move", topleft - nowx);
    box.scrollLeft = scrollx + (topleft - nowx);
    }
    document.onmouseup = function () {
    document.onmousemove = null;
    document.onmouseup = null;
    }
    }

DOM鼠标按下Scroll左右拖动

AngularJS H5 video src url

Posted on 2018-09-14 | In 前端
  • 首先说下背景 我这边开发web 使用后H5页面 用的是angularJs
  • 问题: 在开发的时候 把路径放在H5页面里面的video标签 路径是对的 视频也是可以播放的 但是就是播放不了令人费解

    如果我直接使用

    1
    2
    3
    4
    5
    <video src="{{item.url}}"  width="320" height="240" controls="controls"></video>  
    //这样会在前台报出angularJs错误
    Error: $interpolate:interr
    Interpolation Error
    说是插值误差
  • 然后我查到 在angularJs 中有一个 ng-src 我就把上列代码中的src 变成 ng-src
    但是还是不行 他还是会在前台爆出 插值错误
    最后我在网上找到了答案
    为什么我们直接给ng-src 或者 src 路径是时不行的呢?
    原来:

在angularJs中为了避免安全漏洞,一些ng-src或者ng-include都会进行安全校验,因此常常会遇到一个iframe中的ng-src无法使用。
  • 人话就是 我们用angular里面的 ng-src 时会进行安全检查 因为我们是访问资源服务器上面的视频 所以他不给你这个url通过 所以我们就不放不了视频

这里有人要说了 为什么我用 src=”“ 也不行 我想说的是 因为我们使用了 这个在页面加载的时候 angularjs 会把src变成ng-src 这样所以不能通过

那么我们怎么解决这个url问题

简单直接 我们直接告诉angularJs 这个url是安全的 你信任他

  • 方法是 $sce服务把一些地址变成安全的、授权的链接…简单地说,就像告诉门卫,这个陌生人其实是我的好朋友,很值得信赖,不必拦截它!

常用的方法有:

1
2
3
4
5
$sce.trustAs(type,name);
$sce.trustAsHtml(value);
$sce.trustAsUrl(value);
$sce.trustAsResourceUrl(value);
$sce.trustAsJs(value);

  • 下面我是我处理过的代码 已经可以执行了

    1
    2
    3
    4
    5
    <div class="col-sm-10">  
    <video ng-src="{{videoUrl(item.url)}}" width="320" height="240" controls="controls">

    </video>
    </div>
  • 下面是JS videoUrl方法

    1
    2
    3
    4
    下面是JS videoUrl方法
    $scope.videoUrl = function(url){
    return $sce .trustAsResourceUrl(url);
    }
1…456

牟骏荣

52 posts
11 categories
57 tags
loading css3 动态特效 android View angular drawable dom Scroll 鼠标拖动 express nodejs git 前端 ubuntu linux ionic relativelayout 相对布局 VSCode webview RecyclerView javascript nginx ueditor nodeJs shell chrome gitee VUE linearlayout 瀑布流 实例 php GPS 工具类 mongodb 百度地图 demo echart 图标 资源 Promise python 爬虫 webstorm js django sql 正则表达式 mongo intput 预览图片 验证码 close phone scroll
© 2019 牟骏荣