2012年8月5日星期日

用 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命令也能执行,证明安装配置成功。