2012年9月25日星期二

如何用科学的方法在网页中显示科学公式(MathJax+LaTeX)

这个是实验室项目提出的要求,最早先师姐让我解决上下标的问题,我采用<sub>和<sup>这两种html标签解决的这个问题。之后发现同时有上下标的情况没法解决。以下是更为科学的解决方案,显示各种科学公式毫无压力适用于HTML以及相关的JSP啊FTL啊PHP啊神马的Web页面貌似都能用。

首先简单介绍一下LaTeX这个高科技。
 http://zh.wikipedia.org/zh/LaTeX 
国外高端科技论文一般是不用Word这种东西排版的,一来Word是商业软件,二来Word各版本还不兼容,又不容易保证格式规范。一般都用LaTeX排版,你从网上下到的PDF文件都是用那个做出来的。我也分不清各种LaTeX以及TEX之间错综复杂的关系,知道个大概就行,反正我也没打算真学那一堆命令去输入公式。

渲染为公式——MathJax
在网页里将LaTeX公式渲染成跟Word公式编辑器编辑出来的一样的效果,需要MathJax,详情:
http://www.mathjax.org/
其实是用JavaScript、CSS之类的技术实现的,你可以把这个20MB大的东西下到你服务器或者电脑里用,也可以直接调用它的CDN,亲测用CDN更快。标签尽量靠前的位置插入:
在<head>标签尽量靠前的位置插入:
<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"></script>

?config= 后边跟的是配置,以什么方式输入以及以什么方式输出都在这里设置,具体可参见:
http://www.mathjax.org/docs/2.0/configuration.html#configuring-mathjax
这时候你网页上的LaTeX公式就会被渲染成应有的样子。

轻松写公式
那么如何不掌握那复杂的LaTeX命令而写公式呢?可以采用在线LaTeX编辑器: http://www.codecogs.com/latex/eqneditor.php
或者干脆用MathType,

用MathType输入公式(这个就简单多了),在编辑好公式之后,选项-剪切和复制选项,如图设置:

既在转换为其他文字里选LaTex(里面好几种LaTeX我分不清……貌似都差不多),取消那两个包括的勾勾。
现在用鼠标像选择文字一样选中公式,Ctrl+C,然后粘贴到网页里。上边例子中得到:
\[\sqrt {{b^2} - 4ac} + \frac{{ - b \pm \sqrt {{b^2} - 4ac} }}{{2a}}\]
这时候就需要修改下。如果你想要公式大一点像课本上公式定理的那样单独占一行,把包围公式本体的\[和\]改为$$和$$:
 $$\sqrt {{b^2} - 4ac} + \frac{{ - b \pm \sqrt {{b^2} - 4ac} }}{{2a}}$$
如果你想要公式小一点,跟你的文字放在同一行,则把中括号改为小括号:
\(\sqrt {{b^2} - 4ac} + \frac{{ - b \pm \sqrt {{b^2} - 4ac} }}{{2a}}\)
你问我为什么它不认识中括号?我也不知道,反正就这样了,我就这么用的有效果,谁弄明白了告诉我啊。


我们页面的数据是从数据库读出来的,到时候要求输入数据的人统一用MathType把公式弄好粘进去改一下括号就好啦,这样也不用特意培训他们去学LaTeX,我们也只要每个页面head部分加上一行引入js的代码就好了。
此外啰嗦几句。我是属于习惯用比较规整的代码去控制显示结果的,比如做页面一直用Notepad++去编辑HTML和CSS、JS,然后在浏览器里看结果。当然采用Dreamweaver这种可视化的编辑器拖来拖去很简单方便直观,但是不如写代码更接近本质,更加纯粹。
至于LaTeX排版这种高科技,我觉得我早晚要学习一下的,而且在中国的大学里滥用盗版Word非常不科学无视版权还要忍受调格式这么恶心的事情,理工科的孩子们真应该有这么一门课学习免费而又开放的LaTeX跟国际接轨,可以跟科技论文写作课放一起,或者学校拨点款给我们每人买套正版Office?

2012年8月5日星期日

Bootstrap的input元素变得很窄、显示不正常等情况的解决

某天,我写了个带表单的ftl页面,用的twitter bootstrap,结果用户名和密码的输入框上下距离变得好窄,也可以说是好矮,高一点的字幕显示不全。
折腾半天还是从网上找到了结果。
参见:
https://github.com/twitter/bootstrap/issues/170
在页面最上方加上<!DOCTYPE html>
结构变成如下
<!DOCTYPE html>
<html>
...
</html>
之后input的高度就对了。
当时原理没弄明白。
关于<!DOCTYPE html>:
http://www.w3school.com.cn/tags/tag_doctype.asp

这在XHTML的要求里似乎是必须的,在w3school的网站有XHTML的教程。我从此吸取教训,以后写html文件时,尽量符合XHTML的严格要求,保证页面在各种浏览器下(当然,IE实在不对就算了)正确显示。

windows 7 安装完第一次重启从硬盘引导后在黑屏处光标闪啊闪进不了系统的解决方案

本文写于2012-07-10
我决定近期把一些我以前发在别处的我觉得有价值的文章转发到这里,以便遇到这些问题的人搜索到。
博主有回帖必沉、不为人所关注的特性,若能对偶然路过的读者有所帮助,我深感欣慰。



今天,给一台Thinkpad E10安装win7。原来装的是xp系统,各种没杀毒软件,而且由于国产软件弄的千疮百孔。
从U盘引导后正常安装,之后重启,开始硬盘引导进入下一阶段,于是遇到了黑屏,左上角光标闪啊闪就是进不了系统启动页面的情况。
这不由得使我想起了研究生面试时计算机专业的同学被问的问题,系统是怎么启动的?我没学过相关知识完全记不得。
后来从Google上搜了一下也没有详细解决办法。
再后来看到一篇关于E10安装xp时修改BIOS的硬盘模式的文字,于是我进入BIOS设置检查了相关设置,将硬盘模式从compatible(兼容的)改为AHIC。
保存后重启,正常启动了。
——————废话分割线——————————
关于AHIC参见百度百科http://baike.baidu.com/view/915161.htm

最后吐槽一下,诚然操作系统、软件、硬件刚出来的时候有的会有兼容性问题,但是整天抱着旧的不放也会出现兼容性问题(过时),而且旧的无法享受更新升级带来的好处,被厂商抛弃的产品漏洞也不会再被修补。
至今甚至还有不明真相群众质疑xp的兼容性……那去装Windows 95好了。
再说一点题外话,我十分不喜欢C和C++,就因为常用的开发工具VC6.0在Windows7下运行非常容易挂掉,兼容模式也不太好用,还得弄xp虚拟机,有关C类语言在Windows下的开发都用最新的VS系列,虽然有免费的Express免费版,但是远不如旗舰版强大,此外这东西占用很大的硬盘空间,明明装到D盘,C盘下却需要2G以上的空间,而且杂七杂八的组件很多,请神容易送神难,一旦安装了卸载起来很麻烦,安装是一块进来的卸载要一个一个弄,还容易失败,还不如重装整个系统。相比之下Java语言有很大的优势,但是部署开发环境也有点麻烦。
关于操作系统,Linux的桌面版虽然有了很大进步,但是还是有点太复杂了。如果想尝试Linux,在诸多发行版中我推荐Mint的LXDE版。
最后的最后,爱护自己的电脑,远离国产流氓软件。

用 kindlegen 将 html文件 转为mobi格式电子书的时候,在未换字体的kindle touch上打开发现字体不对的解决办法

昨天把刀剑神域新出的小说网络翻译版下了,然而txt的木有插图,于是自己写了个html,把插图丢进去,再用kindlegen转为mobi格式。

后来在我的kindle touch上打开发现字体问题很大,跟用内置浏览器打开中文网页似的,kindle touch阅读的时候正常的内置中文字体不是这样的,经过一番摸索我找到的解决办法。
以下内容涉及的web知识参考http://www.w3school.com.cn/
  1. 确保html存为utf-8(我用的notepad++,在格式里能设置查看方式,还能直接转换),很多时候用Eclipse等软件编辑含中文的jsp、xml、html文件汉字变乱码,就跟这个字符集神马的有关,我都统一存为utf-8。然后要强调一下,写html文件时,尽量符合XHTML的严格要求:http://www.w3school.com.cn/xhtml/index.asp
  2. 文件最前面要加上文档类型声明(之前我写网页用bootstrap出现了问题就是我没加这个):
    <!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. 在<head></head>标签中加入以下css代码控制字体:
    <style type="text/css">
    body{
    font-family: arial, sans-serif;
    }
    </style>
  4. 在<head></head>标签中加入类型声明:
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  5. 设置<html>标签的属性:
    <html  xmlns="http://www.w3.org/1999/xhtml" lang="zh" xml:lang="zh">
我并不清楚具体哪部解决了我遇到的这个问题,但是写代码永远是越规范越好,否则容易出奇怪的问题,并不是糊弄过去就可以的。
可在线验证html文件:http://validator.w3.org/ 
不规范的地方、未闭合的标签啥的都能检查出来。
再附上一些自制电子书的教程,看txt时没插图没目录还是挺郁闷的。我还设想用这个将漫画生成mobi格式,自从升级后原生支持横屏了,可解决KT看漫画的难题:
Amazon Kindlegen 使用指南:http://bbs.duokan.com/forum/thread-19999-1-1.html
以及一些参考资料:http://blog.sina.com.cn/s/blog_5c0175790100bdg5.html
官方参考资料请Google一下Kindle Publishing Guideline

今天还试了一下从opf生成带封面和目录并且能跳转的mobi格式电子书,效果很不错,但是写xml和html太累了。
本文写于2012-07-31。

2012年5月5日星期六

Hadoop&Struts2 开发所需lib参考,解决了某些错误。关键字:Java,Tomcat,Struts2,Linux,Eclipse,Hadoop,Jar包,API

  • 之前那个Windows下无法用Eclipse运行Hadoop例子程序WordCount的问题并没找到解决方法,于是我把开发环境搭建到Linux Mint下了。
  • 目的是利用Struts2框架开发一个基于Hadoop之HDFS的网络硬盘Web应用。作为开始,我编写了一个index.jsp,利用Ajax发送请求到后台,执行一个动作读取出HDFS文件系统某目录下的文件名。折腾了好几天今天终于能正确运行了。很关键的一个问题就是正确地设置Eclipse中的库。
  • 最终我将所有需要用到的jar包都放入了WebContent\WEB-INF\lib里,并在Eclipse里刷新项目,Clean All后重新编译并运行。将里面的文件列于此处,愿日后有人遇到此类问题作为参考。
  •  WebContent\WEB-INF\lib
    asm-3.3.jar
    asm-commons-3.3.jar
    asm-tree-3.3.jar
    aspectjrt-1.6.5.jar
    aspectjtools-1.6.5.jar
    commons-beanutils-core-1.8.0.jar
    commons-chain-1.2.jar
    commons-cli-1.2.jar
    commons-codec-1.4.jar
    commons-collections-3.2.1.jar
    commons-configuration-1.6.jar
    commons-daemon-1.0.1.jar
    commons-digester-2.0.jar
    commons-el-1.0.jar
    commons-fileupload-1.2.2.jar
    commons-httpclient-3.0.1.jar
    commons-io-2.0.1.jar
    commons-lang-2.5.jar
    commons-logging-1.1.1.jar
    commons-math-2.1.jar
    commons-net-1.4.1.jar
    commons-validator-1.3.1.jar
    freemarker-2.3.18.jar
    hadoop-capacity-scheduler-1.0.1.jar
    hadoop-core-1.0.1.jar
    hadoop-fairscheduler-1.0.1.jar
    hadoop-thriftfs-1.0.1.jar
    hsqldb-1.8.0.10.jar
    hsqldb-1.8.0.10.LICENSE.txt
    jackson-core-asl-1.8.8.jar
    jackson-mapper-asl-1.8.8.jar
    javassist-3.11.0.GA.jar
    jdeb-0.8.jar
    jersey-core-1.8.jar
    jersey-json-1.8.jar
    jersey-server-1.8.jar
    jets3t-0.6.1.jar
    jetty-6.1.26.jar
    jetty-util-6.1.26.jar
    jsch-0.1.42.jar
    junit-4.5.jar
    kfs-0.2.2.jar
    kfs-0.2.LICENSE.txt
    libfilelist.txt
    log4j-1.2.15.jar
    mockito-all-1.8.5.jar
    ognl-3.0.4.jar
    oro-2.0.8.jar
    slf4j-api-1.4.3.jar
    slf4j-log4j12-1.4.3.jar
    struts2-core-2.3.1.2.jar
    xmlenc-0.52.jar
    xwork-core-2.3.1.2.jar
    

2012年4月21日星期六

Hadoop报错,Failed to set permissions of path...staging to 0700

首先我已搭建了一个Hadoop开发环境,伪分布式,然后在Windows下用Eclipse连接进行开发。
Hadoop版本:1.0.1
 本机操作系统:Windows 7,虚拟机操作系统:Linux Mint
Windows下使用Eclipse 3.7,安装了Hadoop Map/Reduce 1.0.1插件,配置好后在Linux里运行一个Example,能正常运行,并且在Windows下Eclipse 里能看到DFS Locations 连接里的文件变化,结果成功输出到output,说明插件连接正常。

于是我直接在Eclipse里新建了Map/ReduceProject,将src\examples\org\apache\hadoop\examples\WordCount.java 复制过来,新建了名为org.apache.hadoop.examples的包(与源代码中相符),按照官网上的英文指南设置好Run configurations...运行,控制台错误信息如下:

12/04/21 19:41:30 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
12/04/21 19:41:30 ERROR security.UserGroupInformation: PriviledgedActionException as:F cause:java.io.IOException: Failed to set permissions of path: \home\fang\hadoop\data\mapred\staging\F1815921702\.staging to 0700
Exception in thread "main" java.io.IOException: Failed to set permissions of path: \home\fang\hadoop\data\mapred\staging\F1815921702\.staging to 0700
    at org.apache.hadoop.fs.FileUtil.checkReturnValue(FileUtil.java:682)
    at org.apache.hadoop.fs.FileUtil.setPermission(FileUtil.java:655)
    at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:509)
    at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:344)
    at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:189)
    at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:116)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:856)
    at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:850)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1093)
    at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:850)
    at org.apache.hadoop.mapreduce.Job.submit(Job.java:500)
    at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:530)
    at org.apache.hadoop.examples.WordCount.main(WordCount.java:67)

尝试 hadoop fs -chmod 777修改hdfs里目录权限未能解决。
尝试 chmod 777修改虚拟机里作为hadoop.tmp.dir目录权限也未能解决。
后来同时修改Eclipse那个连接里和虚拟机/hadoop/conf/core-site.xml  的hadoop.tmp.dir一项,改为/home/fang/tempdata
stop-all.sh后重新format,然后重新start-all.sh,问题仍未解决。同时,错误信息的\home\fang\hadoop\data\mapred\staging\ 部分没有改变。
这个问题实在难以解决。网上有人说自己编译Hadoop或许能解决这个问题。
————————————————————————————————
最后我是在Linux里装了Eclipse,在Linux下开发来回避这个问题的。

2012年3月20日星期二

Linux Mint下安装配置JDK

Linux Mint下安装配置JDK

我的Mint装于虚拟机里,版本linuxmint-12-lxde-cd-32bit,处于虚拟机里要尽量节省资源考虑选择的LXDE版本。以下是我安装配置JDK的过程。

1.安装

首先下载jdk-6u31-linux-i586.bin,我是从Windows下下载的,由于已经在虚拟机里安装VMware Tools 所以很方便地复制到了/home/fang/文档 目录里。
打开终端,运行如下命令

fang@fang-virtual-machine ~ $ cd /usr
切换到/usr目录下
fang@fang-virtual-machine /usr $ sudo mkdir java
/usr 目录下新建java目录。前面的sudo代表用超级用户权限执行,mkdir则是新建目录的命令。此时可能需要输入密码,密码不回显,直接输入后回车。
fang@fang-virtual-machine /usr $ cd /java
切换到/java目录下
fang@fang-virtual-machine /usr/java $ sudo cp /home/fang/文档/jdk-6u31-linux-i586.bin /usr/java
复制jdk-6u31-linux-i586.binjava目录下注意空格的位置,这是一行命令中间不要回车。
fang@fang-virtual-machine /usr/java $ sudo chmod +x jdk-6u31-linux-i586.bin 
赋予其可执行权限
fang@fang-virtual-machine /usr/java $ sudo ./jdk-6u31-linux-i586.bin
执行jdk-6u31-linux-i586.bin,由于是当前目录所以前面有“./”这点跟Windows下直接运行当前目录文件不一样。

之后一路回车安装就好了。

2.配置

Windows里要设置环境变量,Linux也如此。
fang@fang-virtual-machine /usr/java $ sudo leafpad /etc/profile
这命令打开一个叫Leafpad文本编辑器,是Mint里自带的,有点像Windows里的记事本
在最下方增加
export JAVA_HOME=/usr/java/jdk1.6.0_31
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
保存后退出。
测试是否成功,注销系统,重新登录后再打开终端,
fang@fang-virtual-machine ~ $ echo $JAVA_HOME
结果为:/usr/java/jdk1.6.0_31
Javac命令也能执行,证明安装配置成功。