派生选择器

派生选择器 http://www.w3school.com.cn/css/css_syntax_descendant_selector.asp 通过依据元素在其位置的上下文关系来定义样式,你可以使标记更加简洁。 在 CSS1 中,通过这种方式来应用规则的选择器被称为上下文选择器 (contextual selectors),这是由于它们依赖于上下文关系来应用或者避免某项规则。在 CSS2 中,它们称为派生选择器,但是无论你如何称呼它们,它们的作用都是相同的。 派生选择器允许你根据文档的上下文关系来确定某个标签的样式。通过合理地使用派生选择器,我们可以使 HTML 代码变得更加整洁。 比方说,你希望列表中的 strong 元素变为斜体字,而不是通常的粗体字,可以这样定义一个派生选择器: li strong { font-style: italic; font-weight: normal; }

2013-01-24 · 1 min · 24 words · -

Ed25519

Ed25519 http://ed25519.cr.yp.to/Ed25519 它是一个数字签名算法,签名和验证的性能都极高, 一个4核2.4GHz 的 Westmere cpu,每秒可以验证 71000 个签名,安全性极高,等价于RSA约3000-bit。签名过程不依赖随机数生成器,不依赖hash函数的防碰撞性,没有时间通道攻击的问题,并且签名很小,只有64字节,公钥也很小,只有32字节。 部署情况http://ianix.com/pub/ed25519-deployment.html 最近看到恒星(Stellar)网络使用了Ed25519算法作为签名算法,有点兴趣,无奈资料太少,其算法网站也比较简陋,结合找到的资料和网站介绍,粗略看了看,25519这个算法很有特点,相比传统椭圆曲线算法有较大优势,今天简单介绍给大家 Curve25519/Ed25519/X25519 是著名密码学家 Daniel J. Bernstein 在 2006 年独立设计的椭圆曲线加密 /签名 /密钥交换算法,和现有的任何椭圆曲线算法都完全独立,其中Ed25519用于签名,可在区块链中进行签名,Stellar就是使用了Ed25519作为签名算法的 Daniel J. Bernstein 是世界著名的密码学家,他在大学曾经开设过一门 UNIX 系统安全的课程给学生,结果一学期下来,发现了 UNIX 程序中的 91 个安全漏洞; 他早年在美国依然禁止出口加密算法时,曾因为把自己设计的加密算法发布到网上遭到了美国政府的起诉,他本人抗争六年,最后美国政府撤销所有指控,目前另一个非常火的高性能安全流密码 ChaCha20 也是出自 Bernstein 之手 25519 系列曲线自 2006 年发表以来,除了学术界无人问津, 2013 年爱德华·斯诺登曝光棱镜计划后,该算法突然大火。大量软件,如 OpenSSH 都迅速增加了对 25519 系列的支持,如今 25519 已经是大势所趋,可疑的 NIST 曲线迟早要退出椭圆曲线的历史舞台,目前, RFC 增加了 SSL/TLS 对 X25519 密钥交换协议的支持,而新版 OpenSSL 1.1 也加入支持,是摆脱老大哥的第一步,下一步是将 Ed25519 做为可选的 TLS 证书签名算法,彻底摆脱 NIST 。 根据其网站介绍,Ed25519 算法具有以下优势: 完全开放设计,算法各参数的选择直截了当,非常明确,没有任何可疑之处,相比之下,目前广泛使用的椭圆曲线是 NIST 系列标准,方程的系数是使用来历不明的随机种子 c49d3608 86e70493 6a6678e1 139d26b7 819f7e90 生成的,至于这个种子的来历没有资料介绍; ...

2013-01-23 · 4 min · 836 words · -

history.back() webpage has expired. 网页已过期

history.back() webpage has expired. 网页已过期 http://blog.sina.com.cn/s/blog_4b3c4bfa0100vz7h.html 最近开发的时候,碰到了这个问题,就是在回到上一页的时候,IE出现了webpage has expired; Firefox会出现一个alert,是否重新提交表单. page A 提交表单给page B, 然后去到page C. 从page C回到page B的时候, 这个问题就出现了. 于是去查了一些资料,并好好检查了一下我的代码.发现了几个问题,得到一些启发,在这里总结一下. 1.http头中 cache-control的使用. 指示了浏览器的缓存的使用情况, 我是把缓存都关掉了, 导致从page C返回page B的时候,需要重新submit 表单,这是这个问题的起因之一. 介绍一篇博文: http://czy4411741.blog.163.com/blog/static/3420312720102931720414/ 对cache-control的介绍还挺好懂的. 改了cache-control以后可以达到后退的时候不重新submit表单,而是从缓存里拿,其他情况重新submit.具体的请看链接的博文,系统的学习一下. ‘Spring 的 SimpleFormController里面, 把cache-control设成了no-cache no-store.’ 2.Redirect After Post. 我的page A的表单提交方式是post.这本身没有问题,但是浏览器有一个机制防止重复提交表单(只针对post),于是在浏览器端会条出来什么网页过期啊,重复提交警告之类的.找了一下,有一个Post/Redirect/Get的设计模式. Page A 把表单Post给Page B, Page B拿到后Redirect用户去Pace C.在Page C显示结果. 从Page C返回的话,会回到Page A.(浏览器不记录Page B,因为对于浏览器来说,他只做了一个Redirect操作). 这样做的好处是不会再去到Page B, 就不会重复提交表单了. 对于严格禁止重复提交表单的操作, 使用这个设计模式是很好的选择. 解决方案 (任选其一): 1.修改cache-control设置, 并将Expires 设为-1. 看上面的总结一中的博文. jsp可以用response.setHeader(“cache-control”,“private”); 配合response.setHeader(“Expires”,"-1"); 其他语言类似. 2.将page A里表单提交方式改为get. 如果表单数据不敏感的话,可以使用. 谁叫浏览器只针对post. ...

2013-01-23 · 1 min · 78 words · -

spring mvc 标签

spring mvc 标签 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

2013-01-20 · 1 min · 7 words · -

git flow, Git 分支管理, github flow, gitlab flow

git flow, Git 分支管理, github flow, gitlab flow git flow main: 稳定的生产代码,只有发布版本才合并到这里, 长期分支,始终存在。 develop:日常开发的主分支,所有新功能和 bug 修复先合并到 develop, 长期分支,始终存在。用于整合开发中的代码 feature/xxx:新功能开发的临时分支,开发完成后合并到 develop, 合并之后删掉, 短期分支, 不是长期保持。开发新特性时创建,合并后删除 release/xxx:发布准备分支,从 develop 分出,准备发布, 短期分支, 不是长期保持。 hotfix/xxx:生产环境紧急修复,从 main 分出,修复后合并回 main 和 develop, 短期分支, 不是长期保持。 Git flow 是一个Git分支管理模型,由 Vincent Driessen 于2010年发布在其个人网站的一篇博文中《A successful Git branching model》,该模型适用于多版本管理的项目,能够有效的促进团队成员之间的协作,提升代码的清晰度。 https://nvie.com/posts/a-successful-git-branching-model/ https://www.cnblogs.com/youbins/p/17632165.html Git flow的优点是清晰可控,缺点是相对复杂,需要同时维护两个长期分支。大多数工具都将master当作默认分支,可是开发是在develop分支进行的,这导致经常要切换分支,非常烦人。 更大问题在于,这个模式是基于”版本发布”的,目标是一段时间以后产出一个新版本。但是,很多网站项目是”持续发布”,代码一有变动,就部署一次。这时,master分支和develop分支的差别不大,没必要维护两个长期分支。 github flow 只有主分支(通常是 main 或 master)和临时 feature 分支。 在 GitHub Flow 中并不推荐或保留 develop 分支。 feature/bugfix 分支:开发新功能或修复 bug 时,从 main 分出,开发完成后提 Pull Request(PR),通过代码审查后合并到 main。开发完成后通过 Pull Request 合并到 main,feature 分支随即删除。 GitHub Flow 本身不适合多版本并行维护 https://docs.github.com/en/get-started/using-github/github-flow ...

2013-01-20 · 2 min · 291 words · -

shiro 标签

shiro 标签 http://kdboy.iteye.com/blog/1155450 授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限。 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限,以及是否拥有打印的权限等等。 一、授权的三要素 授权有着三个核心元素: 权限、角色和用户。 权限 权限是Apache Shiro安全机制最核心的元素。它在应用程序中明确声明了被允许的行为和表现。一个格式良好好的权限声明可以清晰表达出用户对该资源拥有的权限。 大多数的资源会支持典型的CRUD操作 (create,read,update,delete) ,但是任何操作建立在特定的资源上才是有意义的。因此,权限声明的根本思想就是建立在资源以及操作上。 而我们通过权限声明仅仅能了解这个权限可以在应用程序中做些什么,而不能确定谁拥有此权限。 于是,我们就需要在应用程序中对用户和权限建立关联。 通常的做法就是将权限分配给某个角色,然后将这个角色关联一个或多个用户。 权限声明及粒度 Shiro权限声明通常是使用以冒号分隔的表达式。就像前文所讲,一个权限表达式可以清晰的指定资源类型,允许的操作,可访问的数据。同时,Shiro权限表达式支持简单的通配符,可以更加灵活的进行权限设置。 下面以实例来说明权限表达式。 可查询用户数据 User:view 可查询或编辑用户数据 User:view,edit 可对用户数据进行所有操作 User:* 或 user 可编辑id为123的用户数据 User:edit:123 角色 Shiro支持两种角色模式: 传统角色: 一个角色代表着一系列的操作,当需要对某一操作进行授权验证时,只需判断是否是该角色即可。这种角色权限相对简单、模糊,不利于扩展。 权限角色: 一个角色拥有一个权限的集合。授权验证时,需要判断当前角色是否拥有该权限。这种角色权限可以对该角色进行详细的权限描述,适合更复杂的权限设计。 下面将详细描述对两种角色模式的授权实现。 二、授权实现 Shiro支持三种方式实现授权过程: 编码实现 注解实现 JSP Taglig实现 1、基于编码的授权实现 1.1基于传统角色授权实现 当需要验证用户是否拥有某个角色时,可以调用Subject 实例的hasRole*方法验证。 Java代码 <img alt="收藏代码" src="http://kdboy.iteye.com/images/icon_star.png" /> Subject currentUser = SecurityUtils.getSubject(); if (currentUser.hasRole("administrator")) { //show the admin button } else { //don't show the button? Grey it out? } 相关验证方法如下: ...

2013-01-20 · 3 min · 568 words · -

apache shiro 自定义过滤器

apache shiro 自定义过滤器 http://blog.csdn.net/michnus/article/details/7987367

2013-01-17 · 1 min · 4 words · -

将应用部署到Tomcat根目录的方法

将应用部署到Tomcat根目录的方法 http://rongjih.blog.163.com/blog/static/335744612011426103345778/ 将应用部署到Tomcat根目录的目的是可以通过"http://[ip]:[port]“直接访问应用,而不是使用”[http://ip]:[port]/[appName]“上下文路径进行访问。 方法一: (最简单直接的方法) 删除原 webapps/ROOT 目录下的所有文件,将应用下的所有文件和文件夹复制到ROOT文件夹下。 方法二: 删除原 webapps/ROOT 目录下的所有文件,修改文件"conf/server.xml",在Host节点下增加如下Context的内容配置: …… 注意: 1) path 的值设置为空; 2) 应用不要放到tomcat的webapps目录下(如上述配置是放到自定义的文件夹myapps内的),否则访问时路径很有问题; 3) docBase指定到绝对路径。 如此设置后重启tomcat,如果docBase指向的是war文件,会自动将war解压到 webapps/ROOT 目录;如果docBase指向的是应用已解压好的目录,如 docBase="C:/apache-tomcat-6.0.32/myapps/bc",tomcat不会生成webapps/ROOT目录 (这种情况下之前可以不用删除webapps/ROOT目录,但webapps/ROOT目录内的内容是无法访问的) ,访问时将直接使用docBase指定的目录。 方法三: 与方法二类似,但不是修改全局配置文件"conf/server.xml",而是在"conf/Catalina/localhost"目录下增加新的文件"ROOT.xml" (注意大小写哦) ,文件内容如下:

2013-01-16 · 1 min · 31 words · -

利用spring的jdbcTemplate处理blob、clob

利用spring的jdbcTemplate处理blob、clob spring定义了一个以统一的方式操作各种数据库的Lob类型数据的LobCreator(保存的时候用),同时提供了一个LobHandler为操作二进制字段和大文本字段提供统一接口访问。 举例,例子里面的t_post表中post_text字段是CLOB类型,而post_attach是BLOG类型: public class PostJdbcDao extends JdbcDaoSupport implements PostDao { private LobHandler lobHandler; private DataFieldMaxValueIncrementer incre; public LobHandler getLobHandler() { return lobHandler; } public void setLobHandler(LobHandler lobHandler) { this.lobHandler = lobHandler; } public void addPost(final Post post) { String sql = " INSERT INTO t_post(post_id,user_id,post_text,post_attach)" " VALUES(?,?,?,?)"; getJdbcTemplate().execute( sql, new AbstractLobCreatingPreparedStatementCallback( this.lobHandler) { protected void setValues(PreparedStatement ps, LobCreator lobCreator) throws SQLException { ps.setInt(1, incre.nextIntValue()); ps.setInt(2, post.getUserId()); lobCreator.setClobAsString(ps, 3, post.getPostText()); lobCreator.setBlobAsBytes(ps, 4, post.getPostAttach()); } }); } } 设置相对应的配置文件(Oracle 9i版本),Oracle的数据库最喜欢搞搞特别的东西啦: <bean id=“nativeJdbcExtractor” ...

2013-01-16 · 1 min · 157 words · -

Spring Annotation @Resource

Spring Annotation @Resource Spring 不但支持自己定义的 @Autowired 的注释,还支持几个由 JSR-250 规范定义的注释,它们分别是@Resource、@PostConstruct 以及 @PreDestroy。 @Resource @Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,面 @Resource 默认按 byName 自动注入罢了。@Resource 有两个属性是比较重要的,分别是 name 和 type,Spring 将 @Resource 注释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。 @Resource装配顺序 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常 如果指定了name,则从上下文中查找名称 (id) 匹配的bean进行装配,找不到则抛出异常 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配 (见2) ;如果没有匹配,则回退为一个原始类型 (UserDao) 进行匹配,如果匹配则自动装配; Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。 @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。 @Resource装配顺序 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常 如果指定了name,则从上下文中查找名称 (id) 匹配的bean进行装配,找不到则抛出异常 ...

2013-01-16 · 2 min · 340 words · -

java IO, InputStream, OutputStream

java IO, InputStream, OutputStream InputStream和OutStream是java.io包中面向字节操作的两个顶层抽象类,所有关于java同步IO字节流的操作都是基于这两个的。 什么是流? 《O’Reilly-Java Io》中是这么解释的: A stream is an ordered sequence of bytes of undetermined length. Input streams move bytes of data into a Java program from some generally external source. Output streams move bytes of data from Java to some generally external target. (In special cases streams can also move bytes from one part of a Java program to another.) 流是一个不确定长度的有序字节序列。输入流从外部资源将数据字节移动到Java程序中。输出流从Java程序中将数据字节移动到外部目标。 (特殊的情况也可以将字节从java程序中一部分移动到另一部分) 流从哪里来? 通常流来自于: 网络 文件 java内部程序 InputStream (输入流) : InputStream作为java中用于读取流中字节的顶层抽象类,定义了一些方法: public abstract int read() throws IOException public int read(byte b[], int off, int len) throws IOException public int read(byte b[]) throws IOException { return read(b, 0, b.length); } 有三个read方法用来读取字节: ...

2013-01-16 · 2 min · 315 words · -

PreparedStatement

PreparedStatement jdbc(java database connectivity,java数据库连接)的api中的主要的四个类之一的java.sql.statement要求开发者付出大量的时间和精力。在使用statement获取jdbc访问时所具有的一个共通的问题是输入适当格式的日期和时间戳: 2002-02-05 20:56 或者 02/05/02 8:56 pm。 通过使用java.sql.preparedstatement,这个问题可以自动解决。一个preparedstatement是从java.sql.connection对象和所提供的sql字符串得到的,sql字符串中包含问号 (?) ,这些问号标明变量的位置,然后提供变量的值,最后执行语句,例如: stringsql = “select * from people p where p.id = ? and p.name = ?”; preparedstatement ps = connection.preparestatement(sql); ps.setint(1,id); ps.setstring(2,name); resultset rs = ps.executequery(); 使用preparedstatement的另一个优点是字符串不是动态创建的。下面是一个动态创建字符串的例子: stringsql = “select * from people p where p.i = “+id; 这允许jvm (javavirtual machine,java虚拟机) 和驱动/数据库缓存语句和字符串并提高性能。 preparedstatement也提供数据库无关性。当显示声明的sql越少,那么潜在的sql语句的数据库依赖性就越小。 由于preparedstatement具备很多优点,开发者可能通常都使用它,只有在完全是因为性能原因或者是在一行sql语句中没有变量的时候才使用通常的statement。

2013-01-16 · 1 min · 56 words · -

BLOB

BLOB BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。 在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。 BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理 (例如: 上传、下载或者存放到一个数据库) 。 根据Eric Raymond的说法,处理BLOB的主要思想就是让文件处理器 (如数据库管理器) 不去理会文件是什么,而是关心如何去处理它。 但也有专家强调,这种处理大数据对象的方法是把双刃剑,它有可能引发一些问题,如存储的二进制文件过大,会使数据库的性能下降。在数据库中存放体积较大的多媒体对象就是应用程序处理BLOB的典型例子。 大型对象 BLOB就是使用二进制保存数据。 如: 保存位图。 CLOB使用CHAR来保存数据。 如: 保存XML文档。 Oracle中的BLOB和CLOB LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多一个LONG列 LONG RAW: 可变长二进制数据,最长2G CLOB: 字符大对象Clob 用来存储单字节的字符数据 NCLOB: 用来存储多字节的字符数据 BLOB: 用于存储二进制数据 BFILE: 存储在文件中的二进制数据,这个文件中的数据只能被只读访。但该文件不包含在数据库内。 bfile字段实际的文件存储在文件系统中,字段中存储的是文件定位指针.bfile对oracle来说是只读的,也不参与事务性控制和数据恢复. CLOB,NCLOB,BLOB都是内部的LOB(Large Object)类型,最长4G,没有LONG只能有一列的限制 要保存图片、文本文件、Word文件各自最好用哪种数据类型? -BLOB最好,LONGRAW也不错,但Long是oracle将要废弃的类型,因此建议用BLOB。 Blob是指二进制大对象也就是英文Binary Large Object的所写,而Clob是指大字符对象也就是英文Character Large Object的所写。由此可见这辆个类型都是用来存储大量数据而设计的,其中BLOB是用来存储大量二进制数据的;CLOB用来存储大量文本数据。 那么有人肯定要问既然已经有VARCHAR和VARBINARY两中类型,为什么还要再使用另外的两种类型呢?其实问题很简单,VARCHAR和VARBINARY两种类型是有自己的局限性的。首先说这两种类型的长度还是有限的不可以超过一定的限额,以VARCHAR再ORA中为例长度不可以超过4000;那么有人又要问了,LONGVARCHAR类型作为数据库中的一种存储字符的类型可以满足要求,存储很长的字符,那为什么非要出现CLOB类型呢?其实如果你用过LONGVARCHAR类型就不难发现,该类型的一个重要缺陷就是不可以使用LIKE这样的条件检索。 (稍候将介绍在CLOB中如何实现类似LIKE的模糊查找) 另外除了上述的问题外,还又一个问题,就是在数据库中VARCHAR和VARBINARY的存取是将全部内容从全部读取或写入,对于100K或者说更大数据来说这样的读写方式,远不如用流进行读写来得更现实一些。 在JDBC中有两个接口对应数据库中的BLOB和CLOB类型,java.sql.Blob和java.sql.Clob。和你平常使用数据库一样你可以直接通过ResultSet.getBlob()方法来获取该接口的对象。与平时的查找唯一不同的是得到Blob或Clob的对象后,我们并没有得到任何数据,但是我们可以这两个接口中的方法得到数据 例如: Blob b=resultSet.getBlob(1); InputStream bin=b.getBinaryStryeam(); Clob c=resultSet.getClob(2); Reader cReader=c.getCharacterStream(): 关于Clob类型的读取可以使用更直接的方法,就是直接通过ResultSet.getCharacterStream();方法获得字符流,但该方法并不安全,所以建议还是使用上面例子的方法获取Reader。 另外还有一种获取方法,不使用数据流,而是使用数据块。 例如 Blob b=resultSet.getBlob(1); byte data=b.getByte(0,b.length()); Clob c=resultSet.getClob(2); String str=c.getSubString(0,c.length()): 在这里我要说明一下,这个方法其实并不安全,如果你很细心的话,那很容易就能发现getByte()和getSubString()两个方法中的第二个参数都是int类型的,而BLOB和CLOB是用来存储大量数据的。而且Bolb.length()和Clob.length()的返回值都是long类型的,所以很不安全。这里不建议使用。但为什么要在这里提到这个方法呢?稍候告诉你答案,这里你需要记住使用数据块是一种方法。 ...

2013-01-15 · 1 min · 202 words · -

input file 文件上传控件隐藏后用button触发 click事件

input file 文件上传控件隐藏后用button触发 click事件 http://bbs.csdn.net/topics/320156312 <HTML> <BODY> <input type="button" value="添加附件" onmouseover="floatFile()"> <input type="button" onclick="alert($('tt').innerHTML)" value="showHTML"> </BODY> </HTML> <SCRIPT LANGUAGE="JavaScript"> function $(id) { return document.getElementById(id); } //全局变量,记录文件数; var fileNum=1; //mouseover时,把input file移到按扭上,保证点击的是file, function floatFile() { $("file"+fileNum).style.posTop=event.srcElement.offsetTop; $("file"+fileNum).style.posLeft=event.x-$("file"+fileNum).offsetWidth/2; } //选择完一个文件之后,自动创建一个新的div 和 file表单,用于下回使用,hidden刚用过的file function showText(obj) { $(obj.id+"text").innerHTML=obj.value+" 删除"; $("file"+fileNum).style.display='none'; fileNum=fileNum+1; //直接追加innerHTML(innerHTML+=)会清空原来file中的内容 $("div"+(fileNum-1)).insertAdjacentHTML('AfterEnd',''); } function del(id) { $("div"+id).innerHTML=""; $("div"+id).style.display="none"; } </SCRIPT> IE 使用 ‘filter:alpha(opacity=50);’ 通过 Filter 的 alpha 通道滤镜使元素半透明,但元素必须触发 hasLayout 特性。 ...

2013-01-14 · 1 min · 80 words · -

javascript 判断浏览器类型

javascript 判断浏览器类型 var Sys = {}; var ua = navigator.userAgent.toLowerCase(); if (window.ActiveXObject) Sys.ie = ua.match(/msie ([d.]+)/)[1] else if (document.getBoxObjectFor) Sys.firefox = ua.match(/firefox/([d.]+)/)[1] else if (window.MessageEvent && !document.getBoxObjectFor) Sys.chrome = ua.match(/chrome/([d.]+)/)[1] else if (window.opera) Sys.opera = ua.match(/opera.([d.]+)/)[1] else if (window.openDatabase) Sys.safari = ua.match(/version/([d.]+)/)[1]; //以下进行测试 if (Sys.ie) document.write('IE: ' + Sys.ie); if (Sys.firefox) document.write('Firefox: ' + Sys.firefox); if (Sys.chrome) document.write('Chrome: ' + Sys.chrome); if (Sys.opera) document.write('Opera: ' + Sys.opera); if (Sys.safari) document.write('Safari: ' + Sys.safari);

2013-01-14 · 1 min · 73 words · -

obsidian

obsidian # archlinux pacman -S obsidian https://forum-zh.obsidian.md/ flatpak install flathub md.obsidian.Obsidian flatpak run md.obsidian.Obsidian https://decoge.medium.com/how-to-install-obsidian-on-a-chromebook-53e379217adf install plugin: remotely save Obsidian> settings> community plugins> turn on community plugins> browse search remotely save and install and enable config s3 storage: setting> community plugins> remotely save Choose A Remote Service: S3 or compatible endpoint: s3.ap-southeast-1.amazonaws.com region: ap-southeast-1 ak: sk: bucket name: obsidian-w10n 调整页边距 解决编辑区域过窄的问题 ...

2013-01-12 · 1 min · 68 words · -

linux 摄像头

linux 摄像头 http://www.linuxeden.com/html/news/20101108/105418.html Webcam是一种视频捕捉设备,能通过USB端口直接连接计算机或计算机网络。新的上网本和笔记本多有内置的网络摄像头。Webcam可用于实时视频聊天和网络广播,丰富在线交流。这个小小的摄像机让用户能与朋友和家人实时聊天,发送视频电子邮件,与同事和客户举行视频会议,甚至是在互联网上建立一个类似电视的广播频道。还有人会把网络摄像头作为安全系统的一部分,安装在住宅或建筑物内,使用运动检测接收图像和发送视频入侵警报。Linuxlinks的这篇文章编辑了五款优秀的Linux摄像头工具的清单,既能让摄像头捕捉图像和视频,也能把它变成视频监控设备。这些工具包括: GNOME桌面摄像头工具Cheese,一体化安全监控解决方案ZoneMinder,支持动作检测的视频捕捉工具Motion,GNOME桌面下的开源VoIP和视频会议应用程序Ekiga等。 Webcam Tools Cheese Take pictures and videos from your webcam ZoneMinder All-in-one security camera solution Motion V4L capture program supporting motion detection Ekiga VoIP and video conferencing application HasciiCam ASCII cam streaming

2013-01-12 · 1 min · 37 words · -

debian 安装svn客户端

debian 安装svn客户端 apt-get install subversion cd /usr/local/src/ svn checkout http://droidwall.googlecode.com/svn/trunk/ droidwall-read-only

2013-01-08 · 1 min · 11 words · -

git svn

git svn install ubuntu sudo apt-get install -y git-svn # init mkdir -p /path/to/project-foo/ git svn init https://url.to.svn.repo git svn fetch -r 1342:HEAD 从中心服务器的 svn repository 获取最新更新 这个操作可以通过"git-svn rebase"完成。注意这里用的是rebase,而不是update。update命令对于通过git-svn检出的svn repostory的git版本库是不可用的。 git svn rebase git commit -a -m "" git svn dcommit Password for ‘user0’: Can’t locate Term/ReadKey.pm git requires perl-term-readkey when it asks for user input Found when trying to enter a password for a git svn dcommit Password for ‘user0’: Can’t locate Term/ReadKey.pm in @INC (you may need to install the Term::ReadKey module) (@INC contains: /usr/share/perl5/site_perl /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5/core_perl /usr/share/perl5/core_perl .) at /usr/share/perl5/vendor_perl/Git.pm line 565. ...

2013-01-07 · 3 min · 488 words · -

top command

top command top 命令是常用的性能监控工具之一,用于监控系统整体性能和进程信息. top 界面分为两个部份,上面部份显示关于系统整体性能,下面部份显示各进程信息。 第一行显示的内容和 uptime 命令一样, 可以显示和折叠 cpu 使用信息. top: 这个没有什么意思,只是个名称而已 01:47:56 : 系统当前时间 up 1:26 : 系统开机到现在经过了多少时间 2 users: 当前两个用户在线 load average: 0.00,0.00,0.00: 系统 1 分钟, 5 分钟, 15 分钟的 CPU 负载信息 Tasks: 38 total: 当前有38个任务/进程 1 running: 1个进程正在运行 37 sleeping: 37个进程睡眠 0 stopped: 停止的进程数 0 zombie: 僵死的进程数 0 zombie: 僵死的进程数 zombie 进程 : 不是异常情况。 一个进程从创建到结束在最后那一段时间遍是僵尸。留在内存中等待父进程取的东西便是僵尸。任何程序都有僵尸状态,它占用一点内存资源,仅仅是表象而已不必害怕。如果程序有问题有机会遇见,解决大批量僵尸简单有效的办法是重起。kill是无任何效果的stop模式: 与sleep进程应区别,sleep会主动放弃cpu,而stop是被动放弃cpu ,例单步跟踪,stop(暂停)的进程是无法自己回到运行状态的。 Cpu(s): 表示这一行显示 CPU 总体信息 us: 用户态进程占用 CPU 时间百分比,不包含 renice 值为负的任务占用的CPU的时间。 CPU 消耗在 User space 的时间百分比 sy: 内核线程占用 CPU 时间百分比, 消耗在 Kernel space 的时间百分比。 ni: renice 值为负的任务的用户态进程的CPU时间百分比。nice 是优先级的意思, 表示被 nice 命令改变优先级的任务所占的百分比 id: 空闲CPU时间百分比 wa: IO wait 的缩写, io wait 所占的百分比, CPU 等待外部 I/O 的时间百分比,这段时间 CPU 不能干其他事,但是也没有执行运算,这个值太高就说明外部设备有问题 hi: CPU硬中断时间百分比, hardware interrupt 的缩写,CPU 响应硬件中断请求的时间百分比 si: CPU软中断时间百分比, software interrupt 的缩写,CPU 响应软件中断请求的时间百分比 st: 虚拟cpu等待实际cpu的时间的百分比, stole time 的缩写,该项指标只对虚拟机有效,表示分配给当前虚拟机的 CPU 时间之中,被同一台物理机上的其他虚拟机偷走的时间百分比 # 查看某一个用户 的进程, 查看 user0 用户进程 top -u user0 #显示线程 top -H -p PID printf "%x\n" tid 交互命令 P: 按 CPU 使用率排序 T: 按 MITE+ 排序 M: 按 %MEM 排序 f: 编辑基本视图中的显示字段 Space: 立即刷新显示 h: 显示帮助 k: 杀死某进程。你会被提示输入进程 ID 以及要发送给它的信号。 一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。 [n] 改变显示的进程数量。你会被提示输入数量。 ...

2013-01-06 · 2 min · 337 words · -