Chrome商店打不开,怎么安装插件——莆田系医院网站提醒插件安装方法

其他类型atool 发表了文章 • 0 个评论 • 4660 次浏览 • 2016-05-07 17:16 • 来自相关话题

因为某些网络原因,导致Chrome的插件市场打不开,所以也没有办法安装插件,这种情况怎么办呢?下面就来介绍怎么在无法访问Chrome市场的情况下安装插件。
 
最近做了一个莆田系网站提醒插件,这里就以这个插件的安装为实例来说明:
 
一、找到需要安装的.CRX文件
 
可以通过百度、github、找插件作者等方式,找到插件对应的crx文件。比如莆田系网站提醒插件的地址在Github可以找到,地址为:https://github.com/hustcc/PTHospital.chrome/raw/master/PTHospital.chrome.crx,点击即可下载。如果这个地址打不开,可以在本文附件中下载。
 
二、打开Chrome浏览器,开启开发者模式
 
由于不是从Chrome市场中下载插件,所以需要使用开发者模式,具体操作见下面的截图。首先打开扩展程序界面:




然后勾选开发者模式,如果是勾选状态,可以不管。




 
三、安装下载的.CRX文件
 
安装更简单,直接将crx拖入到扩展程序的界面即可。如下图所示:




这三步之后就完成插件安装了。是不是很简单。
 
  查看全部
因为某些网络原因,导致Chrome的插件市场打不开,所以也没有办法安装插件,这种情况怎么办呢?下面就来介绍怎么在无法访问Chrome市场的情况下安装插件。
 
最近做了一个莆田系网站提醒插件,这里就以这个插件的安装为实例来说明:
 
一、找到需要安装的.CRX文件
 
可以通过百度、github、找插件作者等方式,找到插件对应的crx文件。比如莆田系网站提醒插件的地址在Github可以找到,地址为:https://github.com/hustcc/PTHospital.chrome/raw/master/PTHospital.chrome.crx,点击即可下载。如果这个地址打不开,可以在本文附件中下载。
 
二、打开Chrome浏览器,开启开发者模式
 
由于不是从Chrome市场中下载插件,所以需要使用开发者模式,具体操作见下面的截图。首先打开扩展程序界面:
未命名1.png

然后勾选开发者模式,如果是勾选状态,可以不管。
未命名2.png

 
三、安装下载的.CRX文件
 
安装更简单,直接将crx拖入到扩展程序的界面即可。如下图所示:
未命3名.png

这三步之后就完成插件安装了。是不是很简单。
 
 

VR和AR是什么关系,有什么区别?

其他类型atool 发表了文章 • 0 个评论 • 1254 次浏览 • 2016-05-03 18:53 • 来自相关话题

增强现实技术是由虚拟现实技术发展而来,最早应用于军事,今年开始,由于智能手机的普及、智能硬件的兴起以及Google Glass的出现,增强现实技术被大量关注,就目前来看,我比较看好增强现实技术。

一、现在的虚拟现实(Virtual Reality,简称VR)
虚拟现实技术利用计算机创造一个虚拟空间,利用虚拟现实眼镜能够使用户完全沉浸在一个虚拟的合成环境中,无法看到真实环境;利用双目视觉原理,虚拟世界在眼镜中是3D立体的。
1、VR头盔:目前比较有名的是被Facebook收购的Oculus公司,Oculus眼镜可以展示例如Unity这样的软件构建的虚拟场景,并且让用户沉浸在虚拟世界中过山车、玩游戏、看电影等等。
2、VR眼镜:目前解决方案是一种头戴式手机框,将智能手机放入并且分屏显示,就可以产生类似于VR头盔的效果,如三星Gear VR
在未来,虚拟现实不仅仅会涉及视觉、听觉,还会涉及嗅觉、触觉、味觉,构造一个与真实环境相似的世界。

二、现在的增强现实(Augmented Reality,简称AR)
增强现实技术能够把虚拟信息(物体、图片、视频、声音等等)融合在现实环境中,将现实世界丰富起来,构建一个更加全面、更加美好的世界。Google Glass开始,增强现实眼镜开始不断出现,但都还是初级产品,这些眼镜能够做到给用户呈现一些简单的辅助信息,但复杂信息就无能为力了。
1、单目眼镜:Google Glass,单眼呈现信息,导航、短信、电话、录像照相等功能,由于是单眼,无法呈现3D效果,且由于外观原因应用场景有限。
2、双目眼镜:Meta Glass, 双眼呈现影像时,利用双目视差可以产生开发者想要的3D效果。通过对现实场景的探测并补充信息,佩戴者会得到现实世界无法快速得到的信息;而且由于交互方式更加自然,这些虚拟物品也更加真实

三、未来的增强现实
在未来,我们佩戴的眼镜或隐形眼镜会再一次变革我们的通讯设备、办公设备、娱乐设备等等;在未来,我们不再需要电脑、手机等实体,只需在双眼中投射屏幕的影像,即可创造出悬空的屏幕以及3D立体的操作界面;在未来,人眼的边界将被再一次打开,双手的界限将被再一次突破,几千公里外的朋友可以立即出现在面前与你面对面对话,你也将会触摸到虚幻世界的任何物件;在未来,一挥手你就可以完全沉浸在另一个虚拟世界,一杯茶,一片海,甚至是另一个人生、现实世界无法到达的千千万万种可能的人生。

简单粗暴的说法是:你通过设备观察的场景里面有没有现实的画面,有就是增强现实,没有就是虚拟现实。
更简单粗暴的说法是:你看有没有开摄像头,开了就是增强现实,没开就是虚拟现实。
 
作者:闫展逸
链接:https://www.zhihu.com/question ... 26947
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 查看全部
增强现实技术是由虚拟现实技术发展而来,最早应用于军事,今年开始,由于智能手机的普及、智能硬件的兴起以及Google Glass的出现,增强现实技术被大量关注,就目前来看,我比较看好增强现实技术。

一、现在的虚拟现实(Virtual Reality,简称VR)
虚拟现实技术利用计算机创造一个虚拟空间,利用虚拟现实眼镜能够使用户完全沉浸在一个虚拟的合成环境中,无法看到真实环境;利用双目视觉原理,虚拟世界在眼镜中是3D立体的。
1、VR头盔:目前比较有名的是被Facebook收购的Oculus公司,Oculus眼镜可以展示例如Unity这样的软件构建的虚拟场景,并且让用户沉浸在虚拟世界中过山车、玩游戏、看电影等等。
2、VR眼镜:目前解决方案是一种头戴式手机框,将智能手机放入并且分屏显示,就可以产生类似于VR头盔的效果,如三星Gear VR
在未来,虚拟现实不仅仅会涉及视觉、听觉,还会涉及嗅觉、触觉、味觉,构造一个与真实环境相似的世界。

二、现在的增强现实(Augmented Reality,简称AR)
增强现实技术能够把虚拟信息(物体、图片、视频、声音等等)融合在现实环境中,将现实世界丰富起来,构建一个更加全面、更加美好的世界。Google Glass开始,增强现实眼镜开始不断出现,但都还是初级产品,这些眼镜能够做到给用户呈现一些简单的辅助信息,但复杂信息就无能为力了。
1、单目眼镜:Google Glass,单眼呈现信息,导航、短信、电话、录像照相等功能,由于是单眼,无法呈现3D效果,且由于外观原因应用场景有限。
2、双目眼镜:Meta Glass, 双眼呈现影像时,利用双目视差可以产生开发者想要的3D效果。通过对现实场景的探测并补充信息,佩戴者会得到现实世界无法快速得到的信息;而且由于交互方式更加自然,这些虚拟物品也更加真实

三、未来的增强现实
在未来,我们佩戴的眼镜或隐形眼镜会再一次变革我们的通讯设备、办公设备、娱乐设备等等;在未来,我们不再需要电脑、手机等实体,只需在双眼中投射屏幕的影像,即可创造出悬空的屏幕以及3D立体的操作界面;在未来,人眼的边界将被再一次打开,双手的界限将被再一次突破,几千公里外的朋友可以立即出现在面前与你面对面对话,你也将会触摸到虚幻世界的任何物件;在未来,一挥手你就可以完全沉浸在另一个虚拟世界,一杯茶,一片海,甚至是另一个人生、现实世界无法到达的千千万万种可能的人生。

简单粗暴的说法是:你通过设备观察的场景里面有没有现实的画面,有就是增强现实,没有就是虚拟现实。
更简单粗暴的说法是:你看有没有开摄像头,开了就是增强现实,没开就是虚拟现实。
 
作者:闫展逸
链接:https://www.zhihu.com/question ... 26947
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

【BUG】Flask werkzeug secure_filename中文问题

服务端atool 发表了文章 • 0 个评论 • 1278 次浏览 • 2016-04-27 16:51 • 来自相关话题

使用Flask做web开发的时候,经常用到上传文件,然后Flask官方推荐使用secure_filename方法对上传的文件名进行处理。
结果这个方法对于中文文件处理并不好,导致非常隐晦的BUG。
如下为测试代码:#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Created on 2016年3月31日

@author: hustcc
'''
from werkzeug.utils import secure_filename

print secure_filename("My cool movie.mov")
print secure_filename("../../../etc/passwd")
print secure_filename(u'i contain cool \xfcml\xe4uts.txt')

print secure_filename(u'中文文件名.txt')
print secure_filename(u'中文文件名+English13.txt')打印结果如下:




注意第4,5点输出结果。中文直接被删除,导致文件名直接变成后缀,连“.”都没有了。官方的Flask demo也是害人。
建议直接用md5代替这个方法来取得安全性。 查看全部
使用Flask做web开发的时候,经常用到上传文件,然后Flask官方推荐使用secure_filename方法对上传的文件名进行处理。
结果这个方法对于中文文件处理并不好,导致非常隐晦的BUG。
如下为测试代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Created on 2016年3月31日

@author: hustcc
'''
from werkzeug.utils import secure_filename

print secure_filename("My cool movie.mov")
print secure_filename("../../../etc/passwd")
print secure_filename(u'i contain cool \xfcml\xe4uts.txt')

print secure_filename(u'中文文件名.txt')
print secure_filename(u'中文文件名+English13.txt')
打印结果如下:
未命名.png

注意第4,5点输出结果。中文直接被删除,导致文件名直接变成后缀,连“.”都没有了。官方的Flask demo也是害人。
建议直接用md5代替这个方法来取得安全性。

Git常用命令

软件工程atool 发表了文章 • 0 个评论 • 603 次浏览 • 2016-04-25 14:17 • 来自相关话题

一、概述

先用一幅图,从总体上描述主要git命令的工作流程/uploads/article/20160425/346122bdbaad8e43ba8b7de9d52ab4a8.png
workspace: 本地的工作目录。(记作A)index:缓存区域,临时保存本地改动。(记作B)local repository: 本地仓库,只想最后一次提交HEAD。(记作C)remote repository:远程仓库。(记作D)
 二、命令笔记

以下所有的命令的功能说明,都采用上述的标记的A、B、C、D的方式来阐述。

初始化
git init //创建
git clone /path/to/repository //检出
git config --global user.email "you@example.com" //配置email
git config --global user.name "Name" //配置用户名操作
git add <file> // 文件添加,A → B
git add . // 所有文件添加,A → B

git commit -m "代码提交信息" //文件提交,B → C
git commit --amend //与上次commit合并, *B → C

git push origin master //推送至master分支, C → D
git pull //更新本地仓库至最新改动, D → A
git fetch //抓取远程仓库更新, D → C

git log //查看提交记录
git status //查看修改状态
git diff//查看详细修改内容
git show//显示某次提交的内容撤销操作
git reset <file>//某个文件索引会回滚到最后一次提交, C → B
git reset//索引会回滚到最后一次提交, C → B
git reset --hard // 索引会回滚到最后一次提交, C → B → A

git checkout // 从index复制到workspace, B → A
git checkout -- files // 文件从index复制到workspace, B → A
git checkout HEAD -- files // 文件从local repository复制到workspace, C → A分支相关
git checkout -b branch_name //创建名叫“branch_name”的分支,并切换过去
git checkout master //切换回主分支
git branch -d branch_name // 删除名叫“branch_name”的分支
git push origin branch_name //推送分支到远端仓库
git merge branch_name // 合并分支branch_name到当前分支(如master)
git rebase //衍合,线性化的自动, D → A冲突处理
git diff //对比workspace与index
git diff HEAD //对于workspace与最后一次commit
git diff <source_branch> <target_branch> //对比差异
git add <filename> //修改完冲突,需要add以标记合并成功其他
gitk //开灯图形化git
git config color.ui true //彩色的 git 输出
git config format.pretty oneline //显示历史记录时,每个提交的信息只显示一行
git add -i //交互式添加文件到暂存区如果想更深入地了解git用法,可参考:
Git简明指南(中文版)
Git完整命令地址
  查看全部
一、概述

先用一幅图,从总体上描述主要git命令的工作流程/uploads/article/20160425/346122bdbaad8e43ba8b7de9d52ab4a8.png
  • workspace: 本地的工作目录。(记作A)
  • index:缓存区域,临时保存本地改动。(记作B)
  • local repository: 本地仓库,只想最后一次提交HEAD。(记作C)
  • remote repository:远程仓库。(记作D)

 二、命令笔记

以下所有的命令的功能说明,都采用上述的标记的A、B、C、D的方式来阐述。

初始化
git init //创建
git clone /path/to/repository //检出
git config --global user.email "you@example.com" //配置email
git config --global user.name "Name" //配置用户名
操作
git add <file> // 文件添加,A → B
git add . // 所有文件添加,A → B

git commit -m "代码提交信息" //文件提交,B → C
git commit --amend //与上次commit合并, *B → C

git push origin master //推送至master分支, C → D
git pull //更新本地仓库至最新改动, D → A
git fetch //抓取远程仓库更新, D → C

git log //查看提交记录
git status //查看修改状态
git diff//查看详细修改内容
git show//显示某次提交的内容
撤销操作
git reset <file>//某个文件索引会回滚到最后一次提交, C → B
git reset//索引会回滚到最后一次提交, C → B
git reset --hard // 索引会回滚到最后一次提交, C → B → A

git checkout // 从index复制到workspace, B → A
git checkout -- files // 文件从index复制到workspace, B → A
git checkout HEAD -- files // 文件从local repository复制到workspace, C → A
分支相关
git checkout -b branch_name //创建名叫“branch_name”的分支,并切换过去
git checkout master //切换回主分支
git branch -d branch_name // 删除名叫“branch_name”的分支
git push origin branch_name //推送分支到远端仓库
git merge branch_name // 合并分支branch_name到当前分支(如master)
git rebase //衍合,线性化的自动, D → A
冲突处理
git diff //对比workspace与index
git diff HEAD //对于workspace与最后一次commit
git diff <source_branch> <target_branch> //对比差异
git add <filename> //修改完冲突,需要add以标记合并成功
其他
gitk //开灯图形化git
git config color.ui true //彩色的 git 输出
git config format.pretty oneline //显示历史记录时,每个提交的信息只显示一行
git add -i //交互式添加文件到暂存区
如果想更深入地了解git用法,可参考:
Git简明指南(中文版)
Git完整命令地址
 

Git常用命令和Git团队使用规范指南

软件工程atool 发表了文章 • 0 个评论 • 618 次浏览 • 2016-04-25 14:12 • 来自相关话题

一、前言
在2005年的某一天,Linux之父Linus Torvalds 发布了他的又一个里程碑作品——Git。它的出现改变了软件开发流程,大大地提高了开发流畅度,直到现在仍十分流行,完全没有衰退的迹象。其实一般情况下,只需要掌握git的几个常用命令即可,但是在使用的过程中难免会遇到各种复杂的需求,这时候经常需要搜索,非常麻烦,故总结了一下自己平常会用到的git操作。本文根据团队实践记录Git入门指南和Git常用命令,文章中不仅记录了Git的搭建和使用教程,还参考了大量Git团队使用规范上的经验,希望大家可以结合自己团队的实际应用场景让Git协作优雅的落地。
 
Git是目前世界上最先进的分布式版本控制系统
 
二、SVN与Git的最主要的区别
 
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。

Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
 
三、Git搭建和使用
 
Git上手并不难,深入学习还是建议多实践,可以参考扩展阅读中廖雪峰的Git教程
 
3.1 Git服务端
 
服务端搭建Git很简单,有更多需求不妨试试Gogs和Gitlab。#安装git
sudo apt-get install git
yum install git

#创建一个git用户,用来运行git服务
sudo adduser git

#创建证书使用公钥免密码登录(可选)
ssh-keygen -t rsa
vi ~/.ssh/authorized_keys

#初始化Git仓库
sudo git init --bare sample.git
sudo chown -R git:git sample.git

#禁用shell登录
vi /etc/passwd
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

#在客户端上克隆远程仓库
git clone git@server:/srv/sample.git
3.2 Git客户端

Git客户端可以按个人习惯来选择,遵守团队协作中的Git规范标准才是更重要的。
Git - https://git-scm.com/  
TortoiseGit - https://tortoisegit.org/  
SourceTree - https://www.sourcetreeapp.com/#以最基本的Git命令行为例,先下载Git
https://git-scm.com/download/

#配置git提交用户名和邮箱,定义别名方便区分
git config --global user.name "你的姓名"
git config --global user.email "you@example.com"

#克隆仓库
git clone cap@172.28.70.243:/cap/cap.git

$ git clone cap@172.28.70.243:/cap/cap.git
Cloning into 'cap'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

#测试推送
touch README
git add README
git commit -m "add readme"
git push origin master

Counting objects: 3, done.
Writing objects: 100% (3/3), 199 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To cap@172.28.70.243:/cap/cap.git
* [new branch] master -> master
四、Git常用命令
 
符号约定
<xxx> 自定义内容
[xxx] 可选内容
[<xxx>]自定义可选内容#初始设置
git config --global user.name "<用户名>" #设置用户名
git config --global user.email "<电子邮件>" #设置电子邮件

#本地操作
git add [-i] #保存更新,-i为逐个确认。
git status #检查更新。
git commit [-a] -m "<更新说明>" #提交更新,-a为包含内容修改和增删,-m为说明信息,也可以使用 -am。

#远端操作
git clone <git地址> #克隆到本地。
git fetch #远端抓取。
git merge #与本地当前分支合并。
git pull [<远端别名>] [<远端branch>] #抓取并合并,相当于第2、3步
git push [-f] [<远端别名>] [<远端branch>] #推送到远端,-f为强制覆盖
git remote add <别名> <git地址> #设置远端别名
git remote [-v] #列出远端,-v为详细信息
git remote show <远端别名> #查看远端信息
git remote rename <远端别名> <新远端别名> #重命名远端
git remote rm <远端别名> #删除远端
git remote update [<远端别名>] #更新分支列表

#分支相关
git branch [-r] [-a] #列出分支,-r远端 ,-a全部
git branch <分支名> #新建分支
git branch -b <分支名> #新建并切换分支
git branch -d <分支名> #删除分支
git checkout <分支名> #切换到分支
git checkout -b <本地branch> [-t <远端别名>/<远端分支>] #-b新建本地分支并切换到分支, -t绑定远端分支
git merge <分支名> #合并某分支到当前分支





workspace: 本地的工作目录。(记作A)
index:缓存区域,临时保存本地改动。(记作B)
local repository: 本地仓库,只想最后一次提交HEAD。(记作C)
remote repository:远程仓库。(记作D)
 
以下所有的命令的功能说明,都采用上述的标记的A、B、C、D的方式来阐述。#初始化
git init //创建
git clone /path/to/repository //检出
git config --global user.email "you@example.com" //配置email
git config --global user.name "Name" //配置用户名

#操作
git add <file> // 文件添加,A → B
git add . // 所有文件添加,A → B

git commit -m "代码提交信息" //文件提交,B → C
git commit --amend //与上次commit合并, *B → C

git push origin master //推送至master分支, C → D
git pull //更新本地仓库至最新改动, D → A
git fetch //抓取远程仓库更新, D → C

git log //查看提交记录
git status //查看修改状态
git diff//查看详细修改内容
git show//显示某次提交的内容

#撤销操作
git reset <file>//某个文件索引会回滚到最后一次提交, C → B
git reset//索引会回滚到最后一次提交, C → B
git reset --hard // 索引会回滚到最后一次提交, C → B → A

git checkout // 从index复制到workspace, B → A
git checkout -- files // 文件从index复制到workspace, B → A
git checkout HEAD -- files // 文件从local repository复制到workspace, C → A

#分支相关
git checkout -b branch_name //创建名叫“branch_name”的分支,并切换过去
git checkout master //切换回主分支
git branch -d branch_name // 删除名叫“branch_name”的分支
git push origin branch_name //推送分支到远端仓库
git merge branch_name // 合并分支branch_name到当前分支(如master)
git rebase //衍合,线性化的自动, D → A

#冲突处理
git diff //对比workspace与index
git diff HEAD //对于workspace与最后一次commit
git diff <source_branch> <target_branch> //对比差异
git add <filename> //修改完冲突,需要add以标记合并成功

#其他
gitk //开灯图形化git
git config color.ui true //彩色的 git 输出
git config format.pretty oneline //显示历史记录时,每个提交的信息只显示一行
git add -i //交互式添加文件到暂存区
五、Git使用规范
 
5.1 使用Git过程中,必须通过创建分支进行开发,坚决禁止在主干分支上直接开发。review的同事有责任检查其他同事是否遵循分支规范。
5.2 在Git中,默认是不会提交空目录的,如果想提交某个空目录到版本库中,需要在该目录下新建一个 .gitignore 的空白文件,就可以提交了
5.3 把外部文件纳入到自己的 Git 分支来的时候一定要记得是先比对,确认所有修改都是自己修改的,然后再纳入。不然,容易出现代码回溯
5.4 多人协作时,不要各自在自己的 Git 分支开发,然后发文件合并。正确的方法应该是开一个远程分支,然后一起在远程分支里协作。不然,容易出现代码回溯(即别人的代码被覆盖的情况)
5.5 每个人提交代码是一定要 git diff 看提交的东西是不是都是自己修改的。如果有不是自己修改的内容,很可能就是代码回溯
5.6 review 代码的时候如果看到有被删除掉的代码,一定要确实是否是写代码的同事自己删除的。如果不是,很可能就是代码回溯
 
  查看全部
fAhm82RJ.png

一、前言
在2005年的某一天,Linux之父Linus Torvalds 发布了他的又一个里程碑作品——Git。它的出现改变了软件开发流程,大大地提高了开发流畅度,直到现在仍十分流行,完全没有衰退的迹象。其实一般情况下,只需要掌握git的几个常用命令即可,但是在使用的过程中难免会遇到各种复杂的需求,这时候经常需要搜索,非常麻烦,故总结了一下自己平常会用到的git操作。本文根据团队实践记录Git入门指南和Git常用命令,文章中不仅记录了Git的搭建和使用教程,还参考了大量Git团队使用规范上的经验,希望大家可以结合自己团队的实际应用场景让Git协作优雅的落地。
 
Git是目前世界上最先进的分布式版本控制系统
 
二、SVN与Git的最主要的区别
 
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。

Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
 
三、Git搭建和使用
 
Git上手并不难,深入学习还是建议多实践,可以参考扩展阅读中廖雪峰的Git教程
 
3.1 Git服务端
 
服务端搭建Git很简单,有更多需求不妨试试Gogs和Gitlab。
#安装git
sudo apt-get install git
yum install git

#创建一个git用户,用来运行git服务
sudo adduser git

#创建证书使用公钥免密码登录(可选)
ssh-keygen -t rsa
vi ~/.ssh/authorized_keys

#初始化Git仓库
sudo git init --bare sample.git
sudo chown -R git:git sample.git

#禁用shell登录
vi /etc/passwd
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

#在客户端上克隆远程仓库
git clone git@server:/srv/sample.git

3.2 Git客户端

Git客户端可以按个人习惯来选择,遵守团队协作中的Git规范标准才是更重要的。
Git - https://git-scm.com/  
TortoiseGit - https://tortoisegit.org/  
SourceTree - https://www.sourcetreeapp.com/
#以最基本的Git命令行为例,先下载Git
https://git-scm.com/download/

#配置git提交用户名和邮箱,定义别名方便区分
git config --global user.name "你的姓名"
git config --global user.email "you@example.com"

#克隆仓库
git clone cap@172.28.70.243:/cap/cap.git

$ git clone cap@172.28.70.243:/cap/cap.git
Cloning into 'cap'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

#测试推送
touch README
git add README
git commit -m "add readme"
git push origin master

Counting objects: 3, done.
Writing objects: 100% (3/3), 199 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To cap@172.28.70.243:/cap/cap.git
* [new branch] master -> master

四、Git常用命令
 
符号约定
<xxx> 自定义内容
[xxx] 可选内容
[<xxx>]自定义可选内容
#初始设置
git config --global user.name "<用户名>" #设置用户名
git config --global user.email "<电子邮件>" #设置电子邮件

#本地操作
git add [-i] #保存更新,-i为逐个确认。
git status #检查更新。
git commit [-a] -m "<更新说明>" #提交更新,-a为包含内容修改和增删,-m为说明信息,也可以使用 -am。

#远端操作
git clone <git地址> #克隆到本地。
git fetch #远端抓取。
git merge #与本地当前分支合并。
git pull [<远端别名>] [<远端branch>] #抓取并合并,相当于第2、3步
git push [-f] [<远端别名>] [<远端branch>] #推送到远端,-f为强制覆盖
git remote add <别名> <git地址> #设置远端别名
git remote [-v] #列出远端,-v为详细信息
git remote show <远端别名> #查看远端信息
git remote rename <远端别名> <新远端别名> #重命名远端
git remote rm <远端别名> #删除远端
git remote update [<远端别名>] #更新分支列表

#分支相关
git branch [-r] [-a] #列出分支,-r远端 ,-a全部
git branch <分支名> #新建分支
git branch -b <分支名> #新建并切换分支
git branch -d <分支名> #删除分支
git checkout <分支名> #切换到分支
git checkout -b <本地branch> [-t <远端别名>/<远端分支>] #-b新建本地分支并切换到分支, -t绑定远端分支
git merge <分支名> #合并某分支到当前分支

1_(1).png

workspace: 本地的工作目录。(记作A)
index:缓存区域,临时保存本地改动。(记作B)
local repository: 本地仓库,只想最后一次提交HEAD。(记作C)
remote repository:远程仓库。(记作D)
 
以下所有的命令的功能说明,都采用上述的标记的A、B、C、D的方式来阐述。
#初始化
git init //创建
git clone /path/to/repository //检出
git config --global user.email "you@example.com" //配置email
git config --global user.name "Name" //配置用户名

#操作
git add <file> // 文件添加,A → B
git add . // 所有文件添加,A → B

git commit -m "代码提交信息" //文件提交,B → C
git commit --amend //与上次commit合并, *B → C

git push origin master //推送至master分支, C → D
git pull //更新本地仓库至最新改动, D → A
git fetch //抓取远程仓库更新, D → C

git log //查看提交记录
git status //查看修改状态
git diff//查看详细修改内容
git show//显示某次提交的内容

#撤销操作
git reset <file>//某个文件索引会回滚到最后一次提交, C → B
git reset//索引会回滚到最后一次提交, C → B
git reset --hard // 索引会回滚到最后一次提交, C → B → A

git checkout // 从index复制到workspace, B → A
git checkout -- files // 文件从index复制到workspace, B → A
git checkout HEAD -- files // 文件从local repository复制到workspace, C → A

#分支相关
git checkout -b branch_name //创建名叫“branch_name”的分支,并切换过去
git checkout master //切换回主分支
git branch -d branch_name // 删除名叫“branch_name”的分支
git push origin branch_name //推送分支到远端仓库
git merge branch_name // 合并分支branch_name到当前分支(如master)
git rebase //衍合,线性化的自动, D → A

#冲突处理
git diff //对比workspace与index
git diff HEAD //对于workspace与最后一次commit
git diff <source_branch> <target_branch> //对比差异
git add <filename> //修改完冲突,需要add以标记合并成功

#其他
gitk //开灯图形化git
git config color.ui true //彩色的 git 输出
git config format.pretty oneline //显示历史记录时,每个提交的信息只显示一行
git add -i //交互式添加文件到暂存区

五、Git使用规范
 
5.1 使用Git过程中,必须通过创建分支进行开发,坚决禁止在主干分支上直接开发。review的同事有责任检查其他同事是否遵循分支规范。
5.2 在Git中,默认是不会提交空目录的,如果想提交某个空目录到版本库中,需要在该目录下新建一个 .gitignore 的空白文件,就可以提交了
5.3 把外部文件纳入到自己的 Git 分支来的时候一定要记得是先比对,确认所有修改都是自己修改的,然后再纳入。不然,容易出现代码回溯
5.4 多人协作时,不要各自在自己的 Git 分支开发,然后发文件合并。正确的方法应该是开一个远程分支,然后一起在远程分支里协作。不然,容易出现代码回溯(即别人的代码被覆盖的情况)
5.5 每个人提交代码是一定要 git diff 看提交的东西是不是都是自己修改的。如果有不是自己修改的内容,很可能就是代码回溯
5.6 review 代码的时候如果看到有被删除掉的代码,一定要确实是否是写代码的同事自己删除的。如果不是,很可能就是代码回溯
 
 

几种经典的滤波算法 - 可用于防抖,过滤,去噪等

其他类型atool 发表了文章 • 0 个评论 • 1065 次浏览 • 2016-04-25 14:03 • 来自相关话题

1、限幅滤波法(又称程序判断滤波法)
    A、方法:
        根据经验判断,确定两次采样允许的最大偏差值(设为A)
        每次检测到新值时判断:
        如果本次值与上次值之差<=A,则本次值有效
        如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值
    B、优点:
        能有效克服因偶然因素引起的脉冲干扰
    C、缺点
        无法抑制那种周期性的干扰
        平滑度差
    
2、中位值滤波法
    A、方法:
        连续采样N次(N取奇数)
        把N次采样值按大小排列
        取中间值为本次有效值
    B、优点:
        能有效克服因偶然因素引起的波动干扰
        对温度、液位的变化缓慢的被测参数有良好的滤波效果
    C、缺点:
        对流量、速度等快速变化的参数不宜

3、算术平均滤波法
    A、方法:
        连续取N个采样值进行算术平均运算
        N值较大时:信号平滑度较高,但灵敏度较低
        N值较小时:信号平滑度较低,但灵敏度较高
        N值的选取:一般流量,N=12;压力:N=4
    B、优点:
        适用于对一般具有随机干扰的信号进行滤波
        这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动
    C、缺点:
        对于测量速度较慢或要求数据计算速度较快的实时控制不适用
        比较浪费RAM
        
4、递推平均滤波法(又称滑动平均滤波法)
    A、方法:
        把连续取N个采样值看成一个队列
        队列的长度固定为N
        每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)
        把队列中的N个数据进行算术平均运算,就可获得新的滤波结果
        N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4
    B、优点:
        对周期性干扰有良好的抑制作用,平滑度高
        适用于高频振荡的系统    
    C、缺点:
        灵敏度低
        对偶然出现的脉冲性干扰的抑制作用较差
        不易消除由于脉冲干扰所引起的采样值偏差
        不适用于脉冲干扰比较严重的场合
        比较浪费RAM
        
5、中位值平均滤波法(又称防脉冲干扰平均滤波法)
    A、方法:
        相当于“中位值滤波法”+“算术平均滤波法”
        连续采样N个数据,去掉一个最大值和一个最小值
        然后计算N-2个数据的算术平均值
        N值的选取:3~14
    B、优点:
        融合了两种滤波法的优点
        对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
    C、缺点:
        测量速度较慢,和算术平均滤波法一样
        比较浪费RAM


6、限幅平均滤波法
    A、方法:
        相当于“限幅滤波法”+“递推平均滤波法”
        每次采样到的新数据先进行限幅处理,
        再送入队列进行递推平均滤波处理
    B、优点:
        融合了两种滤波法的优点
        对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
    C、缺点:
        比较浪费RAM

7、一阶滞后滤波法
    A、方法:
        取a=0~1
        本次滤波结果=(1-a)*本次采样值+a*上次滤波结果
    B、优点:
        对周期性干扰具有良好的抑制作用
        适用于波动频率较高的场合
    C、缺点:
        相位滞后,灵敏度低
        滞后程度取决于a值大小
        不能消除滤波频率高于采样频率的1/2的干扰信号
        
8、加权递推平均滤波法
    A、方法:
        是对递推平均滤波法的改进,即不同时刻的数据加以不同的权
        通常是,越接近现时刻的数据,权取得越大。
        给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低
    B、优点:
        适用于有较大纯滞后时间常数的对象
        和采样周期较短的系统
    C、缺点:
        对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号
        不能迅速反应系统当前所受干扰的严重程度,滤波效果差

9、消抖滤波法
    A、方法:
        设置一个滤波计数器
        将每次采样值与当前有效值比较:
        如果采样值=当前有效值,则计数器清零
        如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出)
            如果计数器溢出,则将本次值替换当前有效值,并清计数器
    B、优点:
        对于变化缓慢的被测参数有较好的滤波效果,
        可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动
    C、缺点:
        对于快速变化的参数不宜
        如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统

10、限幅消抖滤波法
    A、方法:
        相当于“限幅滤波法”+“消抖滤波法”
        先限幅,后消抖
    B、优点:
        继承了“限幅”和“消抖”的优点
        改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统
    C、缺点:
        对于快速变化的参数不宜


11、IIR 数字滤波器 
    A. 方法:
       确定信号带宽, 滤之。
       Y(n) = a1*Y(n-1) + a2*Y(n-2) + ... + ak*Y(n-k) + b0*X(n) + b1*X(n-1) + b2*X(n-2) + ... + bk*X(n-k)

    B. 优点:高通,低通,带通,带阻任意。设计简单(用matlab)
    C. 缺点:运算量大。

文章系转载多篇文章综合,舍弃其他文章中的一些简单的代码实现,仅仅保留滤波方法的概念! 查看全部
3b292df5e0fe9925e46f1cec35a85edf8db1712e.jpg
1、限幅滤波法(又称程序判断滤波法)
    A、方法:
        根据经验判断,确定两次采样允许的最大偏差值(设为A)
        每次检测到新值时判断:
        如果本次值与上次值之差<=A,则本次值有效
        如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值
    B、优点:
        能有效克服因偶然因素引起的脉冲干扰
    C、缺点
        无法抑制那种周期性的干扰
        平滑度差
    
2、中位值滤波法
    A、方法:
        连续采样N次(N取奇数)
        把N次采样值按大小排列
        取中间值为本次有效值
    B、优点:
        能有效克服因偶然因素引起的波动干扰
        对温度、液位的变化缓慢的被测参数有良好的滤波效果
    C、缺点:
        对流量、速度等快速变化的参数不宜

3、算术平均滤波法
    A、方法:
        连续取N个采样值进行算术平均运算
        N值较大时:信号平滑度较高,但灵敏度较低
        N值较小时:信号平滑度较低,但灵敏度较高
        N值的选取:一般流量,N=12;压力:N=4
    B、优点:
        适用于对一般具有随机干扰的信号进行滤波
        这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动
    C、缺点:
        对于测量速度较慢或要求数据计算速度较快的实时控制不适用
        比较浪费RAM
        
4、递推平均滤波法(又称滑动平均滤波法)
    A、方法:
        把连续取N个采样值看成一个队列
        队列的长度固定为N
        每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)
        把队列中的N个数据进行算术平均运算,就可获得新的滤波结果
        N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4
    B、优点:
        对周期性干扰有良好的抑制作用,平滑度高
        适用于高频振荡的系统    
    C、缺点:
        灵敏度低
        对偶然出现的脉冲性干扰的抑制作用较差
        不易消除由于脉冲干扰所引起的采样值偏差
        不适用于脉冲干扰比较严重的场合
        比较浪费RAM
        
5、中位值平均滤波法(又称防脉冲干扰平均滤波法)
    A、方法:
        相当于“中位值滤波法”+“算术平均滤波法”
        连续采样N个数据,去掉一个最大值和一个最小值
        然后计算N-2个数据的算术平均值
        N值的选取:3~14
    B、优点:
        融合了两种滤波法的优点
        对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
    C、缺点:
        测量速度较慢,和算术平均滤波法一样
        比较浪费RAM


6、限幅平均滤波法
    A、方法:
        相当于“限幅滤波法”+“递推平均滤波法”
        每次采样到的新数据先进行限幅处理,
        再送入队列进行递推平均滤波处理
    B、优点:
        融合了两种滤波法的优点
        对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
    C、缺点:
        比较浪费RAM

7、一阶滞后滤波法
    A、方法:
        取a=0~1
        本次滤波结果=(1-a)*本次采样值+a*上次滤波结果
    B、优点:
        对周期性干扰具有良好的抑制作用
        适用于波动频率较高的场合
    C、缺点:
        相位滞后,灵敏度低
        滞后程度取决于a值大小
        不能消除滤波频率高于采样频率的1/2的干扰信号
        
8、加权递推平均滤波法
    A、方法:
        是对递推平均滤波法的改进,即不同时刻的数据加以不同的权
        通常是,越接近现时刻的数据,权取得越大。
        给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低
    B、优点:
        适用于有较大纯滞后时间常数的对象
        和采样周期较短的系统
    C、缺点:
        对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号
        不能迅速反应系统当前所受干扰的严重程度,滤波效果差

9、消抖滤波法
    A、方法:
        设置一个滤波计数器
        将每次采样值与当前有效值比较:
        如果采样值=当前有效值,则计数器清零
        如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出)
            如果计数器溢出,则将本次值替换当前有效值,并清计数器
    B、优点:
        对于变化缓慢的被测参数有较好的滤波效果,
        可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动
    C、缺点:
        对于快速变化的参数不宜
        如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统

10、限幅消抖滤波法
    A、方法:
        相当于“限幅滤波法”+“消抖滤波法”
        先限幅,后消抖
    B、优点:
        继承了“限幅”和“消抖”的优点
        改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统
    C、缺点:
        对于快速变化的参数不宜


11、IIR 数字滤波器 
    A. 方法:
       确定信号带宽, 滤之。
       Y(n) = a1*Y(n-1) + a2*Y(n-2) + ... + ak*Y(n-k) + b0*X(n) + b1*X(n-1) + b2*X(n-2) + ... + bk*X(n-k)

    B. 优点:高通,低通,带通,带阻任意。设计简单(用matlab)
    C. 缺点:运算量大。

文章系转载多篇文章综合,舍弃其他文章中的一些简单的代码实现,仅仅保留滤波方法的概念!

.htaccess 配置 Gzip 压缩

服务端atool 发表了文章 • 0 个评论 • 556 次浏览 • 2016-04-25 09:47 • 来自相关话题

Gzip有利于减少服务器流量压力,压缩比可以达到70%。



# BEGIN GZIP
<ifmodule mod_deflate.c>
AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript
</ifmodule>
# END GZIP<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE "application/atom+xml" \
"application/javascript" \
"application/json" \
"application/ld+json" \
"application/manifest+json" \
"application/rdf+xml" \
"application/rss+xml" \
"application/schema+json" \
"application/vnd.geo+json" \
"application/vnd.ms-fontobject" \
"application/x-font-ttf" \
"application/x-javascript" \
"application/x-web-app-manifest+json" \
"application/xhtml+xml" \
"application/xml" \
"font/eot" \
"font/opentype" \
"image/bmp" \
"image/svg+xml" \
"image/vnd.microsoft.icon" \
"image/x-icon" \
"text/cache-manifest" \
"text/css" \
"text/html" \
"text/javascript" \
"text/plain" \
"text/vcard" \
"text/vnd.rim.location.xloc" \
"text/vtt" \
"text/x-component" \
"text/x-cross-domain-policy" \
"text/xml"

</IfModule> 查看全部
Gzip有利于减少服务器流量压力,压缩比可以达到70%。
未命名.png
# BEGIN GZIP
<ifmodule mod_deflate.c>
AddOutputFilterByType DEFLATE text/text text/html text/plain text/xml text/css application/x-javascript application/javascript
</ifmodule>
# END GZIP
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE "application/atom+xml" \
"application/javascript" \
"application/json" \
"application/ld+json" \
"application/manifest+json" \
"application/rdf+xml" \
"application/rss+xml" \
"application/schema+json" \
"application/vnd.geo+json" \
"application/vnd.ms-fontobject" \
"application/x-font-ttf" \
"application/x-javascript" \
"application/x-web-app-manifest+json" \
"application/xhtml+xml" \
"application/xml" \
"font/eot" \
"font/opentype" \
"image/bmp" \
"image/svg+xml" \
"image/vnd.microsoft.icon" \
"image/x-icon" \
"text/cache-manifest" \
"text/css" \
"text/html" \
"text/javascript" \
"text/plain" \
"text/vcard" \
"text/vnd.rim.location.xloc" \
"text/vtt" \
"text/x-component" \
"text/x-cross-domain-policy" \
"text/xml"

</IfModule>

重写 file 控件样式

前端开发atool 发表了文章 • 0 个评论 • 468 次浏览 • 2016-04-25 09:32 • 来自相关话题

input[type="file"]{
-webkit-appearance: none;
text-align: left;
-webkit-rtl-ordering: left;
}
input[type="file"]::-webkit-file-upload-button{
-webkit-appearance: none;
float: right;
margin: 0 0 0 10px;
border: 1px solid #aaaaaa;
border-radius: 4px;
background-image: -webkit-gradient(linear, left bottom, left top, from(#d2d0d0), to(#f0f0f0));
background-image: -moz-linear-gradient(90deg, #d2d0d0 0%, #f0f0f0 100%);
} 查看全部
input[type="file"]{
-webkit-appearance: none;
text-align: left;
-webkit-rtl-ordering: left;
}
input[type="file"]::-webkit-file-upload-button{
-webkit-appearance: none;
float: right;
margin: 0 0 0 10px;
border: 1px solid #aaaaaa;
border-radius: 4px;
background-image: -webkit-gradient(linear, left bottom, left top, from(#d2d0d0), to(#f0f0f0));
background-image: -moz-linear-gradient(90deg, #d2d0d0 0%, #f0f0f0 100%);
}
1.png

css颤动效果

前端开发atool 发表了文章 • 0 个评论 • 430 次浏览 • 2016-04-25 09:30 • 来自相关话题

 .face:hover {
animation: shake 0.82s cubic-bezier(.36,.07,.19,.97) both;
transform: translate3d(0, 0, 0);
backface-visibility: hidden;
perspective: 1000px;
}

@keyframes shake {
10%, 90% {
transform: translate3d(-1px, 0, 0);
}

20%, 80% {
transform: translate3d(2px, 0, 0);
}

30%, 50%, 70% {
transform: translate3d(-4px, 0, 0);
}

40%, 60% {
transform: translate3d(4px, 0, 0);
}
} 查看全部
 
.face:hover {
animation: shake 0.82s cubic-bezier(.36,.07,.19,.97) both;
transform: translate3d(0, 0, 0);
backface-visibility: hidden;
perspective: 1000px;
}

@keyframes shake {
10%, 90% {
transform: translate3d(-1px, 0, 0);
}

20%, 80% {
transform: translate3d(2px, 0, 0);
}

30%, 50%, 70% {
transform: translate3d(-4px, 0, 0);
}

40%, 60% {
transform: translate3d(4px, 0, 0);
}
}

一个image placeholder客户端Javascript生成库

前端开发atool 发表了文章 • 0 个评论 • 638 次浏览 • 2016-04-22 16:48 • 来自相关话题

一、概述

placeholder,做过html都会知道,在input里面有一个属性是placeholder,这个属性是用到在input为空的时候,显示一个提示图片。
本项目地址为:https://github.com/hustcc/placeholder.js  




二、起因

个人在开发过程中,需要处理很多的APP logo,这些logo是从ipa和apk中dump出来的,有些可能加密无法完全解密。所以在logo打不开的时候,需要显示一个替代信息,方法有二:

1. 使用img的alt属性,当图片打不开的时候,显示alt文字;
2. 加载失败使用一个empty图片代替;

都有确定,方法1可能造成页面样式变化,因为img和text还是有差距的;方法2也有问题,所有失败的图片均使用相同的图片替代,辨识度低。

三、已有方案

这里就需要使用image的placeholder,最简答的方式,这种其实大家经常看到,比如网站的广告位预留,占位图片等等。但是要做到动态的图片,这就需要其他的一些手段了,方法有二:
1. 通过搭建一个web server,专门生成图片,然后通过传入一些参数来动态生成图片
这个比较多,也比较主流吧,例如:temp.im,placeholder.it等都是通过服务端生成,至于怎么生成,php使用gd,py使用pil等;
2. 通过浏览器客户端生成,github上有一个项目:https://github.com/imsky/holder 使用客户端生成,具体可以去github上参考。

四、本方案

本项目地址为:https://github.com/hustcc/placeholder.js   
演示网站:http://github.atool.org/placeholder.js.html   (代码使用上述imsky/holder的主页代码,修改placeholder生成方式)

为什么已经有holde项目,还要做一个placeholder.js的项目?二者做的都是客户端生成placeholder
1. holder的使用方式是参考server端生成placeholder的使用方式——使用url传递参数的方式,这种方式在浏览器端使用js并不是非常方便;
2. holder的Javascript库太大,压缩之后30kb,对于仅仅只是生成一个placeholder图片,而耗费30kb,并不划算;
3. server端生成图片比较耗费服务器资源,特别是一个页面生成图片比较多的时候,容易造成大量并发,而如果对图片来进行缓存,又会导致各种碎片文件。

本项目的特点:
1. 非常小:1kb都不到,后续更新尽量维持在1kb之类,也要有一个噱头;
2. 使用非常简单,几个简单易懂的配置项,两个api方法(一个获取base64,一个获取canvas);
3. 动态字体大小,在字体未设置的情况下,自动调整字体大小,方式文字overflow;
欢迎issue和PR。 查看全部
一、概述

placeholder,做过html都会知道,在input里面有一个属性是placeholder,这个属性是用到在input为空的时候,显示一个提示图片。
本项目地址为:https://github.com/hustcc/placeholder.js  
website.png

二、起因

个人在开发过程中,需要处理很多的APP logo,这些logo是从ipa和apk中dump出来的,有些可能加密无法完全解密。所以在logo打不开的时候,需要显示一个替代信息,方法有二:

1. 使用img的alt属性,当图片打不开的时候,显示alt文字;
2. 加载失败使用一个empty图片代替;

都有确定,方法1可能造成页面样式变化,因为img和text还是有差距的;方法2也有问题,所有失败的图片均使用相同的图片替代,辨识度低。

三、已有方案

这里就需要使用image的placeholder,最简答的方式,这种其实大家经常看到,比如网站的广告位预留,占位图片等等。但是要做到动态的图片,这就需要其他的一些手段了,方法有二:
1. 通过搭建一个web server,专门生成图片,然后通过传入一些参数来动态生成图片
这个比较多,也比较主流吧,例如:temp.im,placeholder.it等都是通过服务端生成,至于怎么生成,php使用gd,py使用pil等;
2. 通过浏览器客户端生成,github上有一个项目:https://github.com/imsky/holder 使用客户端生成,具体可以去github上参考。

四、本方案

本项目地址为:https://github.com/hustcc/placeholder.js   
演示网站:http://github.atool.org/placeholder.js.html   (代码使用上述imsky/holder的主页代码,修改placeholder生成方式)

为什么已经有holde项目,还要做一个placeholder.js的项目?二者做的都是客户端生成placeholder
1. holder的使用方式是参考server端生成placeholder的使用方式——使用url传递参数的方式,这种方式在浏览器端使用js并不是非常方便;
2. holder的Javascript库太大,压缩之后30kb,对于仅仅只是生成一个placeholder图片,而耗费30kb,并不划算;
3. server端生成图片比较耗费服务器资源,特别是一个页面生成图片比较多的时候,容易造成大量并发,而如果对图片来进行缓存,又会导致各种碎片文件。

本项目的特点:
1. 非常小:1kb都不到,后续更新尽量维持在1kb之类,也要有一个噱头;
2. 使用非常简单,几个简单易懂的配置项,两个api方法(一个获取base64,一个获取canvas);
3. 动态字体大小,在字体未设置的情况下,自动调整字体大小,方式文字overflow;
欢迎issue和PR。