progressive web application是谷歌推出的一种渐进式web应用,通过利用service-worker等来达到类似于原生应用,而且在chrome浏览器还可以添加到主页,完全就和一个app无异。老实说我觉得pwa是一个很好的发展方向,虽然小程序搞了一段时间不温不火,但是pwa的限制更少,再说还有谷歌支持,只不过现在部分浏览器可能支持的不是很好。 国内饿了么前段时间做了一个pwa,我觉得就挺好的 https://h5.ele.me/msite/ 。 我觉得和native app使用已经比较接近了,而且还无需安装。 扯得有点多,今天主要是讲下自己怎么做一个pwa。当然了,我也是新手,我的pwa也是基于谷歌的pwa的sample做了一些改进。谷歌现在很多开发者文档都做了翻译,sample主要是一个天气应用,里面具体的实现逻辑我就不讲了,我讲以下如何部署这个pwa。 在谷歌的sample里面是推荐使用firebase来部署你的pwa,但是由于国内的高墙,在firebase init的时候总是authentication error,stackoverflow上面说是代理的原因,但是不上代理又没办法使用firebase,所以这是一个死循环。但是!!我们有github page,github page是一个很好的展示静态页面的方面,以前只能支持渲染gh分支里面的内容,现在github对于github page功能做了完善,详细可以看下这篇文章http://blog.csdn.net/neal1991/article/details/53535914 。 下面跟我来: 1.进入https://github.com/neal1991/pwa 可以fork或者clone这个项目,我已经将里面的一些东西,改掉了,可以直接运行。 2.进入settings里面设置 现在你进入https://yourusername.github.io/your-reporistry-name/就可以发车了,是不是很快。 接着我还想讲一讲我这个项目做的一些改进的地方,因为这个weather pwa使用的是yahoo的一个api,通过利用woeid可以去查询各个城市的天气以及相关信息。但是网上却没有中国各个城市的数字代码,注意是WEPID代码,我后来发觉http://www.imeihua.net/tool/weathercode.aspx 这个网站是可以查询wepid的,本来想写一个爬虫爬取的,但是这个网站似乎做了什么限制,我使用curl模拟下请求,限制访问了,这个网站使用.NET实现的,.NET的web请求里面总是包含了一些奇怪的属性。后来我又发现一个国外的网站,很方便,直接get请求就能获取http://woeid.rosselliot.co.nz/lookup ,于是我就写了一个爬虫去爬取,源代码在https://github.com/neal1991/woeid-parser 核心代码
var request = require('superagent'); var fs = require('fs'); var cityConfig = ['wuhu', 'shanghai', 'beijing', 'hangzhou', 'nanjing', 'wuxi', 'xiamen', 'longyan']; var cheerio = require('cheerio'); var url = 'http://woeid.rosselliot.co.nz/lookup/'; var attrNames = ['city', 'province', 'country', 'woeid']; var result = []; cityConfig.forEach(function(city) { request.get(url + city) .
如今,chrome浏览器的使用如越来越流行,chrome extension往往能提供更多很丰富的功能。以前一直想了解这方面的东西,可是又担心很复杂。前段时间,在斗鱼看一个直播,想刷弹幕,但是每次自己输入有很麻烦,所以写个小脚本就可以了,后来想以下也可以使用chrome extension来实现。关于chrome extension,google就给出了相关的文档,另外国内360也翻译了这篇文档。当然我所做的东西还是很基础的,在此,也是就是说一下自己第一次尝试的经验。 其实,chrome extension似乎和现在很火的pwa有一点类似,对于chrome extension来说,有个文件是必不可少的,即manifest.json,这对于extension是非常重要的。这个文件主要是项目的某些描述,以及一些文件的引入。以我的文件为例:
{ "manifest_version": 2, "name": "弹幕增强", "description": "This extension provides you a good experience of sending danmu at douyu", "version": "1.0", "browser_action": { "default_icon": "icon.png", "default_popup": "popup.html" }, "content_scripts" : [{ "matches": [ "http://*/*", "https://*/*" ], "js" : ["app.js"], "run_at": "document_end" }] } manifes_version好像是必须定义为2,这个好像是强制要求。提及一点的就是你可以使用开发者模式从而调试你的extension。你可以在tab右键打开更多工具,然后找到拓展程序打开,然后你可以通过加载已解压的拓展程序,只要选择你extension的文件夹就可以了,并且在右上角勾选上开发者模式。 接着主要讲一下“brower_action"里面定义的是extension的相关内容,“default_icon"即是插件的图标,“default_popup"就是弹出的页面,chrome extension规定html文件和js文件必须是分开来的。extension和当前打开的页面之间的环境是相互隔离的,是不可以直接通信的。“content_script"是定义插入到当前打开页面的相关js文件,“matches”可以让脚本再匹配到规定的正则才会执行,“js"则是插入到页面的js文件,你还可以插入css文件。需要注意的是,“content_script"虽然能够操纵当前页面的dom,但是他和当前页面的js环境是相互隔离的,不能够互相交互,当然也有相应的其他方法。 我的extension只是用到了”content_script”:
var times = 1000; for (var i = 0; i < times; i ++) { (function(i) { setTimeout(function() { console.
Ext.js是一个用于建立企业级应用的纯JS框架。毫无疑问,它为我们提供了大量的组件,比如container,panel,field,grid,这些组件使用起来很方便,不需要去写js和html,但是ext.js的性能却存在很大的问题。比如,我在公司负责的页面,在本地的加载时间居然需要十几秒,当然这可能和后台服务有关,但是前台的渲染和执行也耗费了大量的时间。下面就我个人感受和网上的一些信息对Ext.js的性能优化做一些总结:
尽量不要使用Panel Panel是一个功能比较强大的组件,但是上面却附加了很多的功能和属性,所以也带来了更多的负担,因此在不必要的情况下,尽量不要使用panel,而去使用基类container。
事件监听 页面的render相关事件监听是比较花时间的,在不必要的情况下,尽量不要使用。还有在监听store的load时间的时候,应该监听一次:
listeners: { load: onFirstLoadData, single: true } 在页面渲染之后,尽量不要再去修改页面,从而避免页面reflow或者repaint。
避免组件封装 我们的项目代码往往总是container里面封装container,或者组件里面包裹了组件,其实有很多封装往往是不必要的。因此,减少不必要的组件封装,也可以简化页面DOM结构。
减少border布局 不需要一下再加载所有的元素
批量处理 如果需要处理大量数据,最好一次性修改,避免多次修改,从而提升性能。
在毕业论文的写作过程中,遇到了一个\large 作用域的问题。假设下面有三种写法:
I am cool \large{you are right}, yeah, yeah, yeah I am cool {\large you are right}, yeah, yeah, yeah I am cool \begin{large} you are right \end{large}, yeah, yeah, yeah 我们希望的结果是you are right,这三个单词可以放大,而其他的文字仍然是正常大小,那么以后三个哪些是正确的呢? 下面且看这三个命令的分别显示结果: 很明显可以看的出来,第二个和第三个是正确的,而第一个不是正确的。第一个后面的文字都受到了前面\large 的影响,也变成了放大的字体。这就是\large的作用域问题,第一条命令并没有限制好作用域。可以看的出来,应该要把命令放在花括号中。第三种写法也是可以工作的,像一般的环境都是有这种写法的,但是这种写法比较麻烦,不是特别推荐。
Latex 专业的参考 tex对于论文写作或者其他的一些需要排版的写作来说,还是非常有意义的。我在网上看到这个对于Latex的入门介绍还是比较全面的,Arbitrary reference .所以将会翻译出来,供初学者学习。
TeX语法 TeX语法,编辑 你可能已经注意到,(La)TeX文档是蠢笨的基本上不包含什么具有特殊意义的符号,经常是依赖环境的并且很容易就可以看得出来。下面有一段LaTeX的代码,你也不用担心你还读不懂它,因为它可能包含不少的特别的符号:
I am text. Yes. %comment: a semi-complex table with math in it: \begin{tabular}{|l|r|} \hline $a_1~~~b$ & $\sqrt[3]{a_1^2}$ \\ \end{tabular} 最终产生的表格的排版是这个样子的特殊符号的总结 **{和}**是作为一些命令参数来定义一些小块,比如临时的粗黑体在{\bf bold}
**$**是用来开始和结束数学模式的,比如一些公式啊,数字之类的。你可以在你文本的任何地方插入$a+b=c$,输入$$a+b=c$$,那么你的公式就会在段与段之间以块的形式展现。
**%**是用来注释的,这个是单行注释。如果你要注释大段的代码的时候,为了避免插入过多的百分号,你可以把这些字符放在\iffalse和\fi里面。
**_和^**分别作为下标和上标。你也可以同时使用上标和下标,比如: **~**是一个硬空格,它对于排版是有影响的,它是具有大小的,并且不可分连的空格,就像 一样的。它很有用比如:A.~Smith以及在引用的图表的时候Figure~\ref{dataflow},这确保了作者姓名或者图片和数字之间不会在行与行之间分隔。(也可以使用其他的办法来解决这个问题,比如mbox,不会强制使用特殊的空格大小)
实际上,\ 经常和~拿起来一起来使用。尽管这两者之间还是有区别的:\ 是字间的空格,经常用来告诉LaTeX这不是句子的末尾,一般用于缩写或者标题。(Dr.\ Jones)
**&**适用于在数组以及表格中定义列的。
****用于开始一个命令。有一些可能是比较特殊的(\\用于换行,\>用于tab缩进),一般化的话应该是这样的\commandname。当然这可能会有看起来不太相同的使用方法:
一次效果函数,比如使用\ss来获得一个德国字母。
状态改变,比如粗体,强调,比如text-{\em a-tron}会产生。(花括号是来限制作用的范围的)
使用命令取得相应的值,一般是使用{}或者[]。比如:
\textsc{SmallCaps}产生 \caption{Description用于标题说明,一般用于图表。 口音和发声符号,比如\'{e} \v{o}来产生 使用\begin和end是定义环境,从而和其他内容区分处理,比如:
今天,看到github推送了一个新的消息,Publishing with GitHub Pages, now as easy as 1, 2, 3。总结起来就是在github将你的文档或者发布网页将会变得十分简单。 三步:
创建仓库 提交markdown文件 激活Github pages 现在github对于markdown文件真的支持的特别好,比csdn的markdown好多了。老实说,如果不是github在国内的访问速度感人,我早就把我的博客迁移到github上面去了。csdn的博客简直丑到不能忍了。 反正github的这次更新主要是针对GitHub Pages,这样markodown可以方便快捷的渲染成页面,而且还不会影响你现有的项目或者网站。而且还会给你进行一些默认的配置,对于新手来说,的确是非常友好的。当然了,实在不想用的话,还可以在设置里面禁用掉。更多详细情况,可以去GitHub上面去了解,试试看啊!!!
Latex 专业的参考
tex对于论文写作或者其他的一些需要拍版的写作来说,还是非常有意义的。我在网上看到这个对于Latex的入门介绍还是比较全面的,Arbitrary reference .所以将会翻译出来,供初学者学习 基本的使用
基本的使用 TeX会产生什么 最基本的来说,你会生成一个.tex文件,即你的文档,即youfile.tex。
运行latex you file.tex可以让TeX工作并且生成your file.dvi,这是当下的输出。dvi是一个独立的排版语言。
因为dvi不能够存储图像, 所以它经常被用来作为媒介步骤来产生文档。
dvi也可以被转化成pdf文件,所以pdf文件经常是可以立即生成的,不要dvi文件作为媒介可以直接调用pdflatex yourfile.tex。
输出文件: LaTeX运行一次会产生很多文件,其中很多文件产生的原因是因为LaTeX是单流的;很多文件指示文档编译的信息文件,它们也能用于下次运行,当你编译文档的时候你还可以引用它们。比如,图的引用,章节的引用,以及其他文献的引用。鉴于此,它产生的数据是有特定用途的。(.aux文件是引用的,toc是给章头用的等等),这些数据下次运行还可以继续使用。
注意这可能是你经常需要运行LaTeX两次来确保引用正常工作从而来更新它们。在一些特别变态的情况下,你甚至要运行更多次。你可以忽略掉这些额外的文件,你可以在生成文档后删除这些文件。
如果你用的是unix的系统,我建议你可以看看rubber。它的目的是为了在必要的时候重新编译文档。它不是特别简单的,但是能给你带来很多便利。
一个.log文件也会产生,它是tex文件编译产生的一些相关信息。
注意一点,一旦这个文件生成了,你无需担心保存除了原始数据(.text, .bib)其它的任何数据。log,aux, toc文件可能在运行之后看起来比较混乱,你也可以删掉它们。
其他可能输出的格式 除了在unix系统用于xdvi以及打印,dvi格式并不是很有用。上文曾经提到过,通过dvips软件可以将dvi文件转化为PostScript。你甚至可以先转成PS,然后再转成pdf文件,或者直接转成pdf文件。但是这些间接的步骤可能只是引发新的问题,在pdf方面经常不会怎么使用。更重要的是,这还会存在一个字体渲染的问题。对于pdf,我建议你使用pdflatex或者类似的工具从而避免字体的一系列问题。你必须将所有的.ps/.eps文件转化为pdf,但这不是很困难的事。你可以在图片章节找到更多的细节。
Latex 专业的参考 tex对于论文写作或者其他的一些需要排版的写作来说,还是非常有意义的。我在网上看到这个对于Latex的入门介绍还是比较全面的,Arbitrary reference .所以将会翻译出来,供初学者学习。
TeX, LaTeX以及他们的用法 Tex:排版 Tex是Donald Knuth发明的一种排版语言。排版意味着从结构性的文本到审美的一个标准。在Tex里面,你可以控制文本的根本结构,而不是像word一样,是软件阴影的帮你管理文件的结构,而紧紧给你提供一个图形化的接口。在TeX/LaTeX里面,对于布局和样式都有着默认的合理的设置但是却是可以控制的。
Tex对于希望控制文本的人是非常友好的,一部分可能是因为它不会帮助你不能控制的东西。当然,简便也是一方面的-当TeX工作正常的时候,它运行的很好并且容易明白,但是当它有问题的时候,将会很麻烦,将会变得难以处理。(这点我深有体会)如果你稍微脱离了他的运作方式或者期望一个不太容易实现的功能,你可能需要头痛一下了。
还有其他的一些优点和缺点。TeX的公式拍版是它的强项之一。在以前它可能是唯一较为正式的选择,即使像现在可以使用MathML或者MathType的时候,TeX也被认为是使用起来还是比较便利的。假如你以前还没有接触过TeX,那么你可尝试穿件下面的公式:
在TeX仅仅使用t) = h(t) \otimes g(t) \equiv \int h(\nu) g(t-\nu) d\nu就可以搞定了。是不是看起来挺简单的。
它的缺点可能是将它用于不是它的目的功能的地方。比如,你希望得到一些奇特的表格,你可能会遇到问题并发现一些替代的解决方法,不过这意味着你需要用一些相应的包并且按照其相应的方式去实现了。
LATEX:文档编制 LaTeX是围绕TeX的一种文档编制的宏命令,它是一个比较高层次的能够利用它们产生一些比较常用的文档类型。它考虑到很多方面的内容,包括页眉和页尾,表格内容生成,自动两列的样式以及其他更多的细节。LaTeX现在被广泛得应用以及于它和TeX之间可以交换使用。TeX的实现方法大多数可以直接用在LaTeX的文档上面。当然你可以直接写TeX文件,但这不一定有什么用。如果希望看到更多的介绍,你可以参考这个。
书籍,报告以及PDF LaTeX对于写文章,报告以及书籍有些基本的设置。
它之所以受到喜爱的原因可能是对于大型的文档不容易搞混样式,于其它的一些工具截然不同,比如微软的word,随着文档长度的增长,它的处理复杂度也在逐渐增长,如果你曾经参与过大型的共同合作的文档项目,那么你将深有体会。
近些年以来,pafTeX编译器变得流行起来,因为它可以直接编译pdf文件(不需要dvi以及ps文件作为媒介),使用pdflatex 而不是latex,你可使用一些针对pdf的特点。
包 在TeX和LaTeX里面有各种各样的包,你可以用一些比较怪异的符号,制作一些表格包括输和公式,写活页曲谱,做CAD图,确保首字母大写以及单词拼写正确,或者仅仅只是用一些特别的地方。
版本变化以及实现 LaTeX最近通用经常写作是LaTeX2e。我认为你是在使用这个版本的。通常这也无关紧要,但是有一些老的命令我不会特别提及。
注意这个版本以及老版本的LaTeX209是最通用的语言以及实现规范,并不针对特别的包或者实现。
免费的TeX软件包括通常的’teTeX’也叫做’TeX Live’对于unix系列的系统,以及对于windows系统的’MikTex’。你也可以参考下面相关的软件。
你可以参考维基百科里面的TeX以及LaTeX。TUG是近些年的一些开发工作和相关文档。
the sum of two fixed value
description
Input an array and an integer, fina a pair of number in the array so that the sum is equals to the inputed integer. If there are several pairs, you can output any pair. For example, if the input array is [1,2,4,5,7,11,15] and an integer 15, because 4 + 11 = 15, hence output 4 and 11.
analysis and solution
We try to figure out this problem step by step.
原文链接 原文链接似乎翻墙才可以访问 译者:neal github: https://github.com/neal1991 你可能不知道谷歌浏览器开发工具的其他用处
Chrome内嵌开发者工具。它具有丰富的功能特色,比如元素,网络以及安全。今天,我们将完全关注javascript的console.
当我才开始编程的时候,我只是将console用作纪录服务器的响应。但是后来经过一些教学的帮助,我开始发现console可以做的更多。
在这我们讲一些你可以用console做更多有用的事情。如果你是用chrome浏览这篇文章,你可以马上就试试效果。
选择节点元素 如果你熟悉jquery的话,你应该知道$(’.class’)和$(’#id’)事多的么的重要。你可以根据id或者类名选择相应的元素。
同样你可以在console使用同样的方式来访问元素。$(’tagName’) $(’.class’) $(’#id’)和document.querySelector(’’)是等同的。这个将返回文档中第一个匹配这个选择器的元素。
你可以用$$(’tagName’)来访问,注意这边的两个美元符号可以访问所有符合这个选择器的元素。这些元素会组成一个数组
2.将你的浏览器转化成一个编辑器
你是否想过可以直接在浏览器中直接编辑?答案是肯定的,你可以将你的浏览器转化成一个文本编辑工具。你可以在dom元素中任意添加或者删除文本。
你不需要检测html中的元素。取而代之,你只要去console里面输入以下:
document.body.contentEditable = true
3.寻找dom中元素绑定的事件
当调试的时候你可能希望知道dom元素中绑定的事件。console工具能使你很轻松就找到这些事件。getEventListeners($(‘selector’))将会返回一个数组包含所有事件的对象。你可以展开这个对象看到所有的事件:
如果希望找到某个特定事件的监听,你可以这么做:
getEventListeners($(‘selector’)).eventName[0].listener
这将展示所有和这个事件相关的监听。比如:
getEventListeners($(’.firstName’)).click[0].listener
4.监听事件
如果你想监听特定元素绑定的事件的时候,你也可以在console里面这么做。你可以使用以下的这些命名:
monitorEvents($(‘selector’))将会监听符合这个选择器的元素的所有事件,并且将会显示这些事件当事件被触发的时候。 monitorEvents($(‘selector’),’eventName’)将会监听符合这个选择器的特定事件。你可以将事件的名称作为一个参数传入到这个函数中。 monitorEvents($(‘selector’),[’eventName1’,’eventName2’….])将会监听符合这个选择器的事件。 unmonitorEvents($(‘selector’))这个会停止监听并且在console里面显示出所有的事件。 5.找到语句块执行的时间
console里面有一个很重要的函数叫做console.time(’labelTime’)能够启动一个计时器。另外又一个函数叫做console.timeEnd(’labelName’)能够结束相应的计时器。
比如我们想看到一个循环的执行时间,我们可以做如下处理:
console.time('myTime'); //Starts the timer with label - myTime for(var i=0; i < 100000; i++){ 2+4+5; } console.timeEnd('mytime'); //Ends the timer with Label - myTime //Output - myTime:12345.