项目最早使用的是 angularjs 1.3.x 版本,功能开发完成后,发现使用者中 IE8 用户占比为 ,而且因为项目特质,必须解决用户的 IE8 使用场景,于是乎,有了此文。
使用 angularjs 并兼容 IE8 (注:本文不考虑兼容低于 IE8 浏览器的情况)
docs.angularjs.org:Internet Explorer Compatibility:
Note: AngularJS 1.3 has dropped support for IE* Read more about it on our blog. AngularJS 1.2 will continue to support IE8, but the core team does not plan to spend time addressing issues specific to IE8 or earlier.
AngularJS 1.3抛弃了对 IE8 的支持,但 AngularJS 1.2 将继续支持 IE8,但核心团队已经不打算在解决 IE8 及之前版本的问题上花时间。本文档介绍了互联网浏览器(IE)在处理自定义 HTML 标签及属性时的特点。如果你正计划在 IE8 或更早的浏览器上部署 Angular 应用请阅读本文。
项目目前支持且将尝试修复 IE9 以上的 bug。持续集成服务器在 IE9,IE10 和 IE11 上运行所有的测试。详细内容参加 Travis CI 及 ci.angularjs.org。
我们不在 IE8 及之前的浏览器上运行测试。一些 AngularJS 的功能子集也许能够在在这些浏览器上工作,但这将由你来测试并决定它在你的特定应用上是否工作。
……
es5-shim可以让一些低级的浏览器支持最新的ecmascript5的一些特性。
$templateCache
);grunt-angular-templates
Speed up your AngularJS app by automatically minifying, combining, and automatically caching your HTML templates with$templateCache
.
id=”ng-app”
属性与 ng-app
属性结合起来。
<!doctype html>
<html xmlns:ng="http://angularjs.org" id="ng-app" ng-app="optionalModuleName">
...
</html>
ng-style
标签来取代 style=””
updateParams
方法,使用 $location.search
;(翻页组件)Javascript保留字列表:
break delete function return typeof case do if switch var catch else in this void continue false instanceof throw while debugger finally new true with default for null try Javascript未来保留字(Javascript Future Reserved Words)
Javascript还有一些未来保留字,这些字虽然现在没有用到Javascript语言中,但是将来有可能用到。
Javascript未来保留字列表:
abstract double goto native static boolean enum implements package super byte export import private synchronized char extends int protected throws class final interface public transient const float long short volatile
console.log
;placeholder
;,
;for..in
在 IE8 下会有问题, ie8-for-in-enumerator ;form
错写成 from
造成元素上的控制器无效;确认模式: git difftool -t vimdiff +对比两分支
静默模式: git difftool -t vimdiff -y +对比两分支
窗口焦点切换,即切换当前窗口
CTRL-w h 跳转到左边的窗口
CTRL-w j 跳转到下面的窗口
CTRL-w CTRL-w 跳转到另一个窗口,同CTRL-w w
:qa (当前文件审核通过,)同时退出两个 vi 窗口(,进入下一个文件审核)
jkhl 基本的上下左右
CTRL-U 向上滚动半屏
CTRL-D 向下移动半屏
CTRL-F 向下滚动一整屏(forward)
CTRL-B 向上滚动一整屏(backward)
32j 向下跳32行
CTRL-G 显示当前所在文件中的位置(例如:"usr_03.txt" line 233 of 650 --35%-- col 45-52)
:set number 显示行号
:set nonumber 不显示行号
gg 回到页首
]c 跳转到下一个差异点
[c 跳转到上一个差异点
zo 临时展开被折叠的相同的文本行
zc 重新折叠相同的文本行
u 撤销上一步的操作
Ctrl+r 恢复上一步被撤销的操作
:set noscrollbind 关闭两侧文件的对齐(滚动不同步)
可参考:【技巧:Vimdiff 使用】 https://www.ibm.com/developerworks/cn/linux/l-vimdiff/
使用 git 做 code review 比较给力的模式应该参看闲扯code review这篇博文,注意这目前只是模型;
]]>现有有两个可行的方案:1.使用 url参数 来记录之前的分页数;2.使用 HTML5 sessionStorage 记录之前的分页数;
方案1:特点是可以特定某些链接跳回列表页时回到之前所在分页;缺点是改动文件多,改动量大,容易出错;宝贝-标题优化已使用这种方式;
方案2:特点是对一个 session 进行分页数存储,无论哪个页面跳到列表页都可以回到之前所在分页;优点是只改 js;缺点是得针对 IE6、IE7 做兼容(已有方案可解决);【个人推荐】
进度(toushou-tbv3):
a.已完成:素材-投放管理;
b.前端完成:素材-海报(跳回链接需在 flash 中添加);
c.前端完成后发现无需(囧):素材关联列表(所有)-》制作完成后跳到“我的关联列表”
说明:改动了4个页面,分别对应1、2、3、4;第3步 a 的方法可能丢失分页参数(如果在操作页不是点击链接返回列表,而是用浏览器的返回按钮、或是 Mac 系统用双指回退),在之后异步 block 回传数据,用 js 渲染列表内容可避免这个问题;以下例子是 tbv3的素材-投放管理页的修改步骤;
<input type="hidden" id="J_PageId" value="getRequest()->getParam('page_id','1');?>" />
class= J_LiA
;如果此链接不是使用 href 跳转而是用 onclick 控制,则分解 onclick 事件:链接放到 data-url 属性中;在第3步 a 中处理onclick 事件;列表所在的 js 页面:
a. 对象中加入分页记录属性:
pageId : DOM.val(DOM.get("#J_PageId")),
b. 渲染异步列表后,用 js 给链接加分页参数,(例如在 renderItems() 方法中)
1.如果第2步使用 href 跳转:
var liA = DOM.query('#J_MaterialItems .J_LiA');
S.later(function(){
for(var i=0;i
如果第2步使用 onclick 跳转:
Event.on('.J_LiA','click',function(ev){
if(!showPermissions('editor_material','促销素材')){return ;}
var link = DOM.attr(ev.currentTarget,'data-url');
window.location.href=link+'&page_id='+templet.pageId;
//window.open(link+'&page_id='+templet.pageId);
})
加载列表的方法(例如:searchPutItems() ),第一行加入var pageId = listControl.pageId;
加载列表的方法,发送的请求中多加参数+"&page_id="+pageId
加载列表的方法,成功后的回调(例如:submitHandle() ),渲染完分页后,再指定分页跳转;例如:
if(pageId > 1){
listControl.paginator.setPage(pageId).setPageCount(pageCount).printHtml('#J_Paging',2);
}
分页操作的方法第一行加入:listControl.pageId = turnTo;
在列表页跳出的操作页面,给需要跳回上次所在分页的链接所在的 php echo 方法中加入,array('page_id'=>$this->getRequest()->getParam('page_id','1'))
例如:
<a href="getUrl('material/show/index',array('page_id'=>$this->getRequest()->getParam('page_id','1')))?>">
—————————————————————方案2分割线————————————————————————
说明:只改动列表页所在的 js;
步骤:
分页控制方法中,把分页存入 sessionStorage:
if(window.sessionStorage){
var ss = window.sessionStorage;
var last_pagination = {'udp_item_index' : turnTo};
ss.setItem("hlg_ss_tbv3",JSON.stringify(last_pagination));
}
加载列表的方法中,读取 sessionStorage,并指定分页数:
a.获取分页数:
var ss = window.sessionStorage;
var hlg_ss = JSON.parse(ss['hlg_ss_tbv3']);
if(ss && ss.getItem('hlg_ss_tbv3') && hlg_ss['udp_item_index']){
var pageId = parseInt(hlg_ss['udp_item_index']);
}else{
var pageId = 1;
}
b.传参:data += "&page_id="+pageId;
c.请求成功后跳转:
if(pageId > 1){
list.paginator.setPage(pageId).setPageCount(pageCount).printHtml('#J_Paging',2);
}
]]>hexo是由Node.js驱动的一款快速、简单且功能强大的博客框架。它和jekyll相比,更快,更轻量。之前在Github上托管的博客就是使用jekyll搭建的,官方的Github Pages同样推荐使用它。但是jekyll目前有不少缺点,包括生成速度尤其是文章多了以后的生成速度让人无法接受,默认引擎Redcarpet解析Markdown时对中文支持不好,而且在Windows上使用问题多多,之前被严重坑过,虽然有解决的办法但是实在是耗费精力。via alimon
$ hexo new [layout] <title>
Hexo has 3 default layouts: post, page and draft.
Layout | Destination |
---|
$ hexo new "New Post"
# => The file will be created at source/_posts/new-post.md
$ hexo new page "New Page"
# => The file will be created at source/new-page/index.html
$ hexo new draft "New Draft"
# => The file will be created at source/_drafts/new-draft.md
<pre><code>
code snippet
</code></pre>
Generate static files with Hexo is quite easy and fast.
$ hexo generate
Hexo can watch for file changes and regenerate files immediately.
$ hexo generate --watch
To deploy after generating, you can run one of the following commands. Both of them are equaled.
$ hexo generate --deploy
$ hexo deploy --generate
or
hexo clean
hexo generate
hexo deploy
To start server, run the following command:
$ hexo server
Your website will running at http://localhost:4000
安装 hexo-livereload 插件后,文件修改会自动刷新页面;
In static mode, only files in public folder will be served and file watching is disabled. You have to run hexo generate before starting the server. Usually used in production.
$ hexo server -s
In draft mode, drafts will be served as normal posts. You can preview your drafts on the server. All changes you made on drafts will be updated at once.
$ hexo server -d
To deploy your site with Hexo, you only need one command.
$ hexo deploy
hexo clean
,保证样式重新生成;[vim, git, vimdiff]
的方式;原文:Never Fear, Enyo is Here
作者:SHARON L COPELAND
译者:@sjs_stef
官方公告:Enyo Continues
过去36个小时里发生了如此多的变故足够让你我的脑袋炸开。悲摧是由HP宣布两年的时间内准备砍掉 27000 个职位开始,然后,Enyo 的核心团队正收拾包裹准备入住 Google。是的,我们由衷的祝福你们找到这个奇妙的工作;但我们也非常的希望你们能自觉排成一队,我会为你们每个人准备一个祝福——以一记响亮的耳光。你们可知昨晚(2012-5-24)的10:30我们起来登录 twitter 就为了确认这个沉沦的消息。还没恍过神来就再遭遇这个星期的第二个坏消息。每一个 webOS 的粉丝就像被送上专门为坏孩子准备的桌子,品尝着一小块没有奶油的蛋糕。想着这对于我们的 webOS 手机意味着什么? TouchPad 的遭遇又将如何? webOS 的路在何方?也许我们可以从 Enyo团队发布的这个声明中舒缓下心神:
Enyo 团队一直都是稳定而团结的。在听到我们的开发成员说道最近发布的版本中{译者注:enyo-1.0},性能已经大幅提高的好消息后,我们将以另一种方式发布新的版本{译者注:enyo}。之后,我们把重心放在扩大 Onyx 部件集上。大家应该知道我们团队已经邀请了合适的工程师,为团队的发展提供支持。
毫无疑问,我们正在不断成长。正如我们于本月早些时候表示的,我们正在招聘——不仅仅是为了取代那些离开的工程师,更是为了今后的发展而壮大我们的团队。如果你想为 Enyo的成功贡献你的力量(并且得到报酬),请让我们知道。当然,我们非常欢迎大家在 Github 上贡献代码。
我们的大门敞开者;如果您有任何问题,请在 Enyo 论坛畅所欲言。我们一直在倾听,并且尽力帮助您解决问题。我们也将在下周参加在旧金山举行的 O’Reilly Fluent Conference 会议,在之后的一周我们也会出席在拉斯维加斯举办的 HP Discover ——我们非常期待能在那儿看见你。
既然得到了官方的确认信息,那么,就放下你的不安,按照原定的计划继续前行。Enyo 还在继续征途。
P.S. 从前几年开始阅读 ReadWriteWeb 、TechCrunch、Engadget 时就想用翻译记录自己的阅读,却自找理由放弃。自从认真的开始接触开源的相关代码、项目后,由衷的喜欢这种态度。自勉。
]]>sudo apt-get install apache2
Install PHP5
Code:sudo apt-get install php5
Install Mysql Server
Code:sudo apt-get install mysql-server
Apart from default installation of LAMP we need to install php5-curl,from terminal issue the command
Code:sudo apt-get install php5-curl
After this you need to enable mod_rewrite by issuing this command in the terminal(This is for Clean SEO URLS,you can skip this if you do not want)
Code:sudo a2enmod rewrite
Install Phpmyadmin
code:sudo apt-get install libapache2-mod-auth-mysql php5-mysql phpmyadmin
Finally restart the apache
Code:/etc/init.d/apache2 restart
导入 magento-sample-data:
mysql -u root -p
mysql>create database magento;
mysql>use magento
mysql>source path/data_file.sql
解压 magento 到 /var/www/ 中,或用命令复制:
sudo cp -ri /downloads/magento /var/www/
启动 apache,打开浏览器访问 http://127.0.0.1/magento 进入安装界面,若不改动设置,直接下一步……
若遇到错误提示:
Path “/var/www/magento/app/etc” must be writable.
Path “/var/www/magento/var” must be writable.
Path “/var/www/magento/media” must be writable.
设置对应的文件权限:
sudo chmod -R a+w /var/www/magento/app/etc
sudo chmod -R a+w /var/www/magento/media
sudo chmod -R a+w /var/www/magento/var
linux 小常识 — 设置 Ubuntu Root 用户:
sudo passwd root
然后按回车 su rooot
或者 sudo -s -H
切换到root权限“喜欢阅读电子书的朋友,特别是拥有Kindle等电纸书的朋友谈到扫描PDF(Scanned PDF),大多是又爱又恨,”爱”在大量书籍、尤其是发行较早或外文原版的一些经典书籍,多由热心人士私下扫描成PDF发布在网络上,可以方便地下载到硬盘里(摆在那儿心里就踏实,看不看就另说了);”恨”在扫描PDF(Scanned PDF)”骨头”太硬,不能像原生PDF(Native PDF)那样转换成各种格式。小小6寸屏,甚至3、4寸屏,纵然有满腔阅读热情,眼睛挤着挤着就吃不消了。由Willus开发的免费PDF处理软件K2PDFopt很好地解决了这个问题,可以让大家硬盘里堆积如山的扫描PDF真正重见天日。”—用K2PDFopt重排版面,随手解救扫描PDF
在 ubuntu 安装也十分简单,主要是这几个步骤:
Ctrl + Alt + T 进入命令行,依次输入如下代码:
sudo mv k2pdfopt /usr/local/bin
(输入你的密码)
chmod a+x /usr/local/bin/k2pdfopt
mkdir .local/share/applications
cat > .local/share/applications/k2pdfopt.desktop
[Desktop Entry]
Name=k2pdfopt
Exec=/usr/local/bin/k2pdfopt %f
Terminal=true
Type=Application
Categories=Application
(按下组合键 <Ctrl-D>)
exit
完成前三步后,你就可以在任意 .pdf 文件右击,在 “更多应用程序” 中找到 k2pdfopt, 选择后你就可以看到 k2pdfopt 的功能界面了。
喜欢看图示的朋友可以看看 GETTING STARTED: UBUNTU DESKTOP 11.1
更多技巧,可以看看 K2pdfopt使用常见问题
5月20更新:发现 kill 相关进程后,切换回图形界面还是呈现卡死状态,又不想重启电脑,于是使用sudo skill -KILL -u 图形界面登录的用户名
去重启图形界面。
关于 Python web 框架,网络上流传比较广的版本是来自飞龙博客的浅谈Python web框架,其文主要介绍了 Django、Pylons、Tornado、Bottle、Quixote.点击这里-查看更多
在 Wikipedia 中的 Python解释器 分类中,主要列出三种:
CPython是用C语言实现的Python解释器,也是官方的并且是最广泛使用的Python解释器。除了CPython以外,还有用JAVA实现的Jython和用.NET实现的IronPython,使Python方便地和JAVA程序、.NET程序集成。
IronPython 是一种在 .NET 和 Mono 上实现的 Python 语言,由 Jim Hugunin(同时也是 Jython 创造者)所创造。在 2007 年,开发者决定改写构架,使用动态类型系统以让更多脚本语言能很容易地移植到.NET Framework上。
Jython,(原JPython),是一个用JAVA语言写的Python解释器。Jython程序可以和Java无缝集成。除了一些标准模块,Jython使用Java的模块。Jython几乎拥有标准的Python中不依赖于C语言的全部模块。
PyPy是用Python实现的Python解释器。PyPy比CPython是更加灵活,易于使用和试验,以制定具体的功能在不同情况的实现方法,可以很容易实施。
两者设计思想的不同:
Perl—“there is more than one way to do it”
Python—“there should be one—and preferably only one—obvious way to do it”
推荐阅读Perl 与 Python 之间的一些异同,文章从 1.起源与特点 2.基本数据类型 3.控制结构 4.函数 5.包与模块 6.面向对象 7.正则表达式 8.线程 方面进行了比较。
2012.5.17:比较常听到的编程的方法:
Procedural programming(程序编程,又称程序式编程、程序化编程、过程化编程,俗称面向过程),面向对象编程的思维就像日程安排或是作业流程图,主体流程是步进式的。
Object-oriented programming(面向对象程序设计);
面向对象程序设计:指一种程序设计范型,同时也是一种程序开发的方法。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
两者对比:
面向对象程序设计可以被视作一种在程序中包含各种独立而又互相调用的单位和对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,或者说是负有责任的角色。
Functional programming(函数式编程);
它将电脑运算视为数学上的函数计算,并且避免状态以及可变资料。函数编程语言最重要的基础是 λ 演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。
和指令式编程相比,函数式编程强调函数的计算比指令的执行重要。
和程序编程相比,函数式编程里,函数的计算可随时调用。
其他:去Programming paradigm(编程范型)查看更多。
Wikipedia:Algorithm、算法;
经典算法集合:
算法博客推荐:结构之法 算法之道
]]>'require': libffi.so.5: cannot open shared object file: No such file or directory
于是根据这个关键字在google中搜索,找到这篇网志,从而得知是因为找不到动态库文件,于是在终端中输入 locate libffi.so.6
定位到文件所在目录,再进入 libffi.so.6 所在目录, 用 sudo ln -s libffi.so.6 libffi.so.5
做个文件链接,于是第一个问题解决了。 rake generate
时,居然又出现 .rvm/gems/ruby-1.9.2-p290/gems/rubypython-0.5.1/lib/rubypython/rubypyproxy.rb:198:in `method_missing': ClassNotFound: no lexer for alias '$("div.box").on("click",' found (RubyPython::PythonError)
的错误(看着像Jquery的语法),于是继续 Google,做了一些无用的尝试后,看到 Octopress git 的官方 Issue页,看到这句friends, solved the problem. was that a post had the word out instead of ruby rails.Python and could not read it.
忽然想到或许是上一篇网志,出现语法错误,于是把那篇网志暂时移出 _post 目录后再发布,居然可以了……
另:
jQ $ $$ j
If you review the jQuery source (something you should always do), you will find that jQuery and $ can both be used interchangably. The former is most often used in situations when the $ can clash with existing code or libraries.
True False
Remember, you are not limited to mere CSS selectors; you can also pass DOM nodes, and even create elements. For instance, the following code will create a div and append it to the body: $(“
Hi there
“).appendTo(“body”);
var container = $("#container");
Storing the results of a particular query in a variable is often referred to as “caching.” This way, we keep from having to dive into the DOM pool over and over to retrieve the same set of elements.
$("ul").addClass("alternate");
Technically, this code will add a class of alternate to all unordered lists in the DOM. If you need to be more specific, you can use an id, or a method like eq() or first() to fine-tune the results.
addClass next prev grandparents
Don’t take the “parent-child” relationship idea too far. grandparents or grandchildren do not exist! Instead, you’d use parents(), closest(), and find().
True False
Alternatively, the same result can be achieved by passing an anonymous function to jQuery.
$("h1").text("Updated");
Should you need to insert actual HTML, you’d instead use the html method.
ancestors() closest() nearest() children()
closest will retrieve the first element that matches a provided selector. It begins at the current element, and works up through the DOM tree.
$("div.box").on("click", function() {
$(this).removeClass("box");
});
In addition to on(), jQuery also provides a handful of “shortcut” methods, such as click() and hover().
Additionally, a selector can be passed to the siblings method. This allows you to filter the matches.
$('li:nth-child(4)').css('background', 'gray');
There were lots of ways to handle this question. In addition to the provided solution, you could also use the eq()method: $(“li”).eq(3).css(“backgroundColor”, “gray”);. jQuery also allows you to use eq as a custom selectors: $(“li:eq(3)”);.
True False
Sometimes, it’s easy to think of JavaScript and jQuery as entirely separate languages, but they aren’t! At its core, jQuery is just JavaScript.
]]>最後,當然是我的開源項目啦,TaobaoPages。
一直覺得開源使互聯網世界更加美好。
关于《Rails Is Not For Beginners》,我有话要说
阅读此文前,请先阅读我之前写的《Rails Is Not For Beginners》,当然最好也把文章里的那些链接也点一遍,把评论啥的也看一遍。
我非常同意 DHH 的观点,learnability(易学性) 和 usability(可用性) 是个两难的问题,Rails 优先考虑 usability 是完全正确的,至于 learnability 我个人觉得 rails 已经做得很不错了。
拿 Sinatra 和 Rails 比其实是件蛮搞笑的事情,Sinatra 充其量就是一个高级一点的玩具,拿来写个 Demo 有时都可能不够用,稍微复杂一点,就办不到了,或需要付出相当的时间和精力去搞定。
针对国内环境,针对「Rails Is Not For Beginners」这个话题,我倒想展开来说几句。
首先,Rails 对于 Windows 的支持,可以说是比较差的,但因为国内相当部分人都是使用 Windows 操作系统,就这一点就足够说 Rails Is Not For Beginners。
当然了这几年,情况要好一些,有 RailsInstaller 等一些一键安装包,但是还是会碰到很多莫名其妙的问题,还有就是有很多 gem 是天然不支持 windows 的,不管你怎么折腾,你可能还是无法安装成功。
可以说,在国内,有很多对 rails 感兴趣的,就是死在搭建环境上。所以我建议要学 Rails 还是使用 Linux 或 Mac OSX 吧,会少很多很多麻烦,我是在 Mac 下开始折腾 Rails 的,我可以说什么乱七八糟的问题都没碰到,环境搭建就几条命令搞定,分分钟的事情。
补充说明为什么推荐 Mac:
1、Rails 的作者们都是使用的 Mac,所以 Rails 天然对 Mac 最友好,问题也最少,比如 Rails 的母公司 37signals 发布的名叫 pow 的 web 服务器就是 Mac Only 的。
2、Mac OSX 自带 ruby 环境,搭建 Rails 环境可能就一条命令 gem install rails 就搞定了,当然这是比较理想化了,因为为了管理更方便、使用更方便等,会安装更多的东西,比如 RVM。
3、Textmate,这是一个 Mac Only 的文本编辑器,曾经有人因为它而买 Mac,可见它的魅力了,要说明的是 Rails 的作者们一直在用它,简直可以说 rails 就是用它写出来的。而我个人的使用感受也是很好,用它来写 rails 真的很方便,根本不需要什么 IDE,另外其实有很多克隆 Textmate 的编辑器,其中完成度最好的是 Sublime text 2,我强烈推荐,因为它有 Windows 和 Linux 版,当然也有 Mac 版。
4、Mac 电脑及 Mac OSX 本身的优势,这个我就不多说了,网上到处都是相关文章,简单讲就是 Mac OSX 对程序员来说用户体验很友好,有终端(很重要),有各种各样又好看又好用的软件。
有人可能看到这会觉得像软文,在做广告,随便你怎么想吧,谁用谁知道,我接着说。
其次,因为墙的原因,导致很多人搭建环境失败,这个我在之前写的《如何从 0 开始学 ruby on rails (漫步版)》一文中有见,在最后一部分,不再赘述。
最后,也是我最想说的,是 rails 新手们的学习态度、方法和方式的问题(注:以下的内容可能过于主观和情绪化,请勿对号入座)。
我想很多人对 Rails 感兴趣都是因为官方那个 15 分钟写就一个博客程序的宣传广告吧,当然可能看的是中文版 :),这则宣传广告,只是说明了一点,Rails 的开发效率非常高。但在国人眼里,可能加入了「简单」这一层意思,但 Rails 真的没那么简单,想弄好它,要学的东西可多了。
国人是怎么学 Rails 的呢,可能是这样的。
国人看到篇介绍 Rails 的文章,觉得好炫啊,15 分钟呢,立马动手开始搭建环境,而且肯定是看的中文资料,而不是去官方网站。同时加入某个 QQ 群,因为用的是 Windows,同时也没去找相关文章看,就算找了也因为种种原因,搭建环境肯定失败了,然后在 QQ 群里面问,经过无数人的帮助,终于搞定了在 Windows 下搭建环境的问题。
好,环境搭建好了,开始问大家都用什么工具,用哪个 IDE 好,然后群里各抒己见,火爆非常。他们肯定会选 IDE,因为他们说习惯了,不过不幸的事情还是发生了,用 IDE 还是一路艰辛,各种问题,比如环境变量啊,各种报错啊,再次在 QQ 群里问,再次在大家的帮助下把问题解决了。
这下终于可以开始写了,然后照着一篇中文资料想把官方那个 15 分钟写就一个博客程序的例子写出来,再次出现一大堆问题,因为他看的资料过期了,现在已经是 Rails 3.1.3 了,他不小心安装的也是这个,但那中文资料还是 2.x 的甚至 1.x,各种不兼容,然后他还是跑到群里面问,然后还是在大家的帮助下。。。
跌跌撞撞,磕磕碰碰,他们从来不去看官方的资料,因为那是英文的,他们看不懂,他们说自己英语差。他们知道自己英语差,但他们从来不打算去把英语提高,他们中的相当部分人甚至觉得英语对于程序员来说不重要。
他们中相当部分人没有意识说去找本书好好看,侥幸有人告诉他 ruby 看哪本书,rails 看哪本书,他们的第一句话可能是哪有下载,你有吗?传给我。对,他们从来没有版权意识,不喜欢买书,因为贵。不幸的是,因为 rails 的不向下兼容及快速更新步伐,rails 的书永远跟不上,中文书更是落后 1 到 2 年,和他好不容易从网上下载下来效果可以闪瞎眼睛的中文书电子书比,最新的 rails 已经千差万别了,这下再度碰了一鼻子灰。
他们这些人基础很差,英语不行,软件工程、操作系统原理、编译原理、数据库原理、数据结构与算法,通通不懂,但他们还是选择了程序员这条路,一开始,这些你可以不懂,但慢慢的你一定要去补起来,不然这条路会走得很辛苦,但很多人没这个意识。但坦白讲,就这些通通不懂的人有不少在中国的大小公司里还混得不错,真是奇葩,这也算是中国特色了。
他们在网上看到有人说学 rails 不用先学 ruby,但他们不知道,这个话是“有人”对那些有真正的学习能力,有举一反三、融会贯通能力的人说的。他们并不具备这些能力,这下更是磕磕碰碰,跌跌撞撞了。
我不知道为什么,他们在学一个新东西的时候,首先找的不是它的官方网站?我不知道为什么,他们在学一个新东西的时候,不知道看什么书。我不知道为什么,他们为什么连 Google 都不会用。我也不知道为什么,他们遇到问题从来不自己先搜索,而是张口就问。
他们不知道未来在哪里,他们很迷茫,不知道路怎么走。他们不知道学什么,他们不知道怎么学。他们只会问 Java 和 C# 比起来哪个更有前途。
所以,关于「Rails Is Not For Beginners」这个结论,对很多中国人来说是完全正确的,因为他们就是 beginners,他们甚至连 beginners 都不是。他们有更重要的问题需要解决,绝对不是单纯某种语言怎么学,是否适合 beginners 的问题。
这是家庭教育的原因,还是学校教育的原因,或是他们自身的原因,我不知道,也许兼而有之吧。
就说这么多吧,再次声明这是一篇情绪化比较重的文章,请勿对号入座。但如果你对号入座了,因而感觉受到伤害到了,我表示很无奈。
]]><?xml version="1.0"?>
<?xml version="1.0"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
您的回答:是
7.这是一个“形式良好”的文档吗?
<?xml version="1.0"?>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
您的回答:否
8.哪条陈述是正确的?
您的回答:以上陈述都是正确的
正确答案:所有XML元素都必须正确地关闭
9.哪条陈述是正确的?
您的回答:以上陈述都是正确的
10.XML可保留空白字符
您的回答:正确
11.这是一个“形式良好”的文档吗?
<?xml version="1.0"?>
<note>
<to age="29">Tove</to>
<from>Jani</from>
</note>
您的回答:是
12.这是一个“形式良好”的文档吗?
<?xml version="1.0"?>
<note>
<to age=29>Tove</to>
<from>Jani</from>
</note>
您的回答:否
13.XML元素不能为空
您的回答:正确
正确答案:错误
14.对于一个XML文档,以下哪个名称是错误的?
您的回答:<1dollar>
15.对于一个XML文档,以下哪个名称是错误的?
您的回答:<first name>
16.对于一个XML文档,以下哪个名称是错误的?
您的回答:以上三个都不正确
17.必须使用引号包围XML的属性值
您的回答:正确
18.XSL指的是?
您的回答:eXtensible Stylesheet Language
19.以下哪种方法可正确地引用名为“mystyle.xsl”的样式表?
您的回答:<?xml-stylesheet type="text/xsl" href="mystyle.xsl" ?>
20.供XML解析器忽略XML文档的特定部分的正确语法是:
您的回答:<![CDATA[ Text to be ignored ]]>
<script>
document.write("Hello World")
<script src="xxx.js">
alert("Hello World")
function myFunction()
myFunction()
if (i==5)
if (i != 5)
for (i = 0; i <= 5; i++)
//This is a comment
/*This comment has more than one line*/
var txt = new Array("George","John","Thomas")
Math.round(7.25)
Math.max(2,4)
window.open("http://www.w3school.com.cn","window2")
window.status("put your message here")
window.status = "put your message here"
navigator.appName
]]><p></p>
<br />
width="80"
<p>A <b><i>short</i></b> paragraph</p>
<div lang="en" xml:lang="en">Hello World!</div>
您的回答:
1.HTML 指的是?
您的回答:超文本标记语言(Hyper Text Markup Language)
2.Web 标准的制定者是?
您的回答:万维网联盟(W3C)
3.在下列的 HTML 中,哪个是最大的标题?
您的回答:<h1>
4.在下列的 HTML 中,哪个可以插入折行?
您的回答:<br>
5.在下列的 HTML 中,哪个可以添加背景颜色?
您的回答:<body bgcolor="yellow">
6.请选择产生粗体字的 HTML 标签:
您的回答:<b>
7.请选择产生斜体字的 HTML 标签:
您的回答:<i>
8.在下列的 HTML 中,哪个可以产生超链接?
您的回答:<a href="http://www.w3school.com.cn">W3School</a>
9.如何制作电子邮件链接?
您的回答:<a href="mailto:xxx@yyy">
10.如何在新窗口打开链接?
您的回答:<a href="url" target="_blank">
11.以下选项中,哪个全部都是表格标签?
您的回答:<table><tr><td>
12.请选择可以使单元格中的内容进行左对齐的正确 HTML 标签:
您的回答:<td align="left">
13.如何产生带有数字列表符号的列表?
您的回答:<ol>
14.如何产生带有圆点列表符号的列表?
您的回答:<ul>
15.在下列的 HTML 中,哪个可以产生复选框?
您的回答:<input type="checkbox">
16.在下列的 HTML 中,哪个可以产生文本框?
您的回答:<textfield>
正确答案:<input type="text">
17.在下列的 HTML 中,哪个可以产生下拉列表?
您的回答:<select>
18.在下列的 HTML 中,哪个可以产生文本区(textarea)?
您的回答:<textarea>
19.在下列的 HTML 中,哪个可以插入图像?
您的回答:<img src="image.gif">
20.在下列的 HTML 中,哪个可以插入背景图像?
您的回答:<body background="background.gif">
如果您有兴趣参与测试,可以点这里
您的回答:
1.CSS 指的是?
您的回答:Cascading Style Sheets
2.在以下的 HTML 中,哪个是正确引用外部样式表的方法?
您的回答:<link rel="stylesheet" type="text/css" href="mystyle.css">
3.在 HTML 文档中,引用外部样式表的正确位置是?
您的回答:<head> 部分
4.哪个 HTML 标签用于定义内部样式表?
您的回答:<style>
5.哪个 HTML 属性可用来定义内联样式?
您的回答:style
6.下列哪个选项的 CSS 语法是正确的?
您的回答:body {color: black}
7.如何在 CSS 文件中插入注释?
您的回答:/* this is a comment */
8.哪个属性可用于改变背景颜色?
您的回答:background-color:
9.如何为所有的 <h1> 元素添加背景颜色?
您的回答:h1 {background-color:#FFFFFF}
10.如何改变某个元素的文本颜色?
您的回答:text-color:
正确答案:color:
11.哪个 CSS 属性可控制文本的尺寸?
您的回答:font-size
12.在以下的 CSS 中,可使所有 <p> 元素变为粗体的正确语法是?
您的回答:p {font-weight:bold}
13.如何显示没有下划线的超链接?
您的回答:a {text-decoration:none}
14.如何使文本以大写字母开头?
您的回答:text-transform:capitalize
15.如何改变元素的字体?
您的回答:font-family:
16.如何使文本变为粗体?
您的回答:font-weight:bold
17.如何显示这样一个边框:上边框 10 像素、下边框 5 像素、左边框 20 像素、右边框 1 像素?
您的回答:border-width:10px 5px 20px 1px
正确答案:border-width:10px 1px 5px 20px
18.如何改变元素的左边距?
您的回答:margin-left:
19.请判断以下说法是否正确:如需定义元素内容与边框间的空间,可使用 padding 属性,并可使用负值?
您的回答:正确
正确答案:错误
20.如何产生带有正方形项目的列表?
您的回答:list-type: square
正确答案:list-style-type: square
对自己的成绩不满意,关键是第17题——看着答案都不知所以(实际上还没用过CSS控制边框),于是google之,发现好些人都在这题错了,例如:这位、这位、还有这位.Bobo答对了,没在twitter活跃,也没讲解。还是复习去。
update:想起来了,边框的像素若是用border-width:10px 1px 5px 20px
,那是正确滴,顺时针……
date:2011-11-29 update
測試結果爲:
經驗:
2011年12月6日09时34分19秒update:
在看《progit》时,忽然想到,为什么在github.com的souce分支中看不到_post目录:原来在根据官网指导的那两次git push
后自己并没有再上传过;而Octopress的发布日志rake generate
,rake deploy
与git是相对独立的,rake generate
使用Jekyll生成静态网页,并把结果置于octopress/_delploy目录中,在使用rake deploy
后发布到github.com并同步到博客。