2014年2月15日星期六

基于AJAX和jQuery上传文件

以前经常用form的方式上传文件,

 如 html:
<form action="your_url" method="post" enctype="multipart/form-data">
    <input name="file" type="file" />
    <button type="submit" value="Upload" />
</form>

或者,想不用点button直接上传的话可以 html:
<form action="url" method="post" enctype="multipart/form-data">
  <input name="file" type="file" />
</form>

加上jQuery:
$('input:file').change(function() {
  $('form').submit();
});

--------------------------分割线---------------------------

但是用Ajax上传文件实在比用form好太多:发送的数据可以很简洁很flexible,
可以在整个上传的过程返回状态,很多处理都放在client上进行,
也不用重新加载整个页面等等。虽然还有一些古董版的浏览器不支持,但现在应该能给绝大部分人用到了。

这里就给个简单的例子吧,先是html:
<form enctype="multipart/form-data">
    <input name="file" type="file" />
</form>

然后是jQuery:
$('input:file').change(function() {
    var formData = new FormData($('form')[0]);
    $.ajax({
        url: 'your_url',
        type: 'POST',
        data: formData,
    });
});

就OK了。

再来个进阶版的:
$('input:file').change(function() {
    var formData = new FormData($('form')[0]);
    $.ajax({
        url: 'your_url',
        type: 'POST',
        data: formData,
       beforeSend: function({
         alert('start');
       },
       success: function({
         alert('success');
       },
       error: function({
         alert('failed');
       },
        xhr: function() {  // Custom XMLHttpRequest
            var myXhr = $.ajaxSettings.xhr();
            if(myXhr.upload){  // For handling the progress of the upload
              myXhr.upload.addEventListener('progress',progressHandlingFunction, false);
            }
            return myXhr;
        },
        //Options to tell jQuery not to process data or worry about content-type.
        cache: false,
        contentType: false,
        processData: false
    });
});
function progressHandlingFunction(e){
    if(e.lengthComputable){
        $('progress').attr({value:e.loaded,max:e.total});
    }
}

最后,如果想功能更加丰富的话,推荐几个plugin:
1. FineUploader,已经更新到4.3了,慎用4.0以下的版本,有不少bugs;
2. jQuery File Upload, 适合批量上传。

2013年1月18日星期五

LaTex支持中文的问题小结

<一>
一般的模板如果不直接支持中文,可以通过下面两个简单的步骤搞定:

1. 添加\usepackage{CJK}.

2. 在\begin{document}下面添加\begin{CJK*}{UTF8}{bsmi},在\end{document}上面添加\end{CJK*}.

这样运行就OK了。

<二>
一些小tips:

—— \begin{CJK*}{}{}后两个选项可以替换,如Ubuntu下有:
\begin{CJK*}{UTF8}{gkai}         简体 楷体
\begin{CJK*}{UTF8}{gbsn}         简体 宋体
\begin{CJK*}{UTF8}{bkai}         繁体 楷体
\begin{CJK*}{UTF8}{bsmi}        繁体 宋体

而在Windows下有:

\begin{CJK*}{GBK}{kai}         简体 楷体
\begin{CJK*}{GBK}{song}        简体 宋体

等等;

—— 如果不想每次开个tex文件都手动加这几行,可以修改document class文件如下:

1. 在你所用的模板的.cls文件中(如article.cls)找到RequirePackage这一部分,加入\RequirePackage{CJK}.

2. 找到\AtBeginDocument{XXXX},加入一行使之变成\AtBeginDocument{XXXX begin{CJK*}{UTF8}{bsmi}}.

3. 同理,将\AtEndDocument{XXXX}变为\AtEndDocument{XXXX end{CJK*}},这样以后生成文件就自动加入中文了。

<三>
上述方法在某些模板下面还是会发生问题,例如用moderncv,直接运行会提示\section神马吧啦吧啦的错误。这个时候,你需要找到moderncv.cls文件,找到关于section的这一段,看它到底干了什么,具体问题具体分析。

可能的解决途径:

—— 有的时候document class本身是没有close section的,就需要手动在.tex文件的\end{CJK*}之前加入一行\closesection.

—— 对于moderncv.cls,可供参考的解决方法是注释掉\newcommand*{\section}[1]{}里面的两句话:
\phantomsection{}
\addcontentsline{toc}{part}{#1}

类似的问题都可以这样解决。



参考文章:http://blog.csdn.net/donglin425/article/details/7714295

2012年12月23日星期日

解决gvim错误:Gtk-WARNING **: Invalid input string

这个错误是由语言的设置不正确引起的,解决方法很简单:

1. 打开 cd /usr/share/vim/vim72/lang这个存放语言信息的目录。

2. 建立一个链接 sudo ln -s menu_zh_cn.utf-8.vim menu_zh_cn.utf8.vim,OK,问题解决。

解决启动rails server时的错误Could not find a JavaScript runtime.

在Ubuntu下装完rails后便要开始启动它的服务器了,这个时候在终端输入
rails s
会发现报错:
/usr/local/lib/ruby/gems/1.9.1/gems/execjs-1.4.0/lib/execjs/runtimes.rb:51:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)

这是因为Ubuntu下没有预设的JavaScript编译器来给Rails用的,需要安装一个套件,方法如下:

1. 打开Gemfile这个文件,加入一行gem 'therubyracer',保存。

2. 敲入命令bundle install来安装。装完之后,用命令bundle show therubyracer可以看到装好的therubyracer这个套件。

3. 重新rails s,可以看到问题解决了。

如果Rails版本比较老(3.1以下)的话,还需要在Gemfile里面加入一行gem 'execjs',同样方法安装才可以搞定。

如果通过sudo gem install therubyracer来安装的话,需要在装之前确认有没有安装libv8.如果没有,还需要sudo gem install libv8安装完之后才可以成功装上therubyracer.

另外,这个错误也可以通过安装Node.js来解决。

参考文章:http://ihower.tw/rails3/firststep.html

2012年12月4日星期二

解决安装Ubuntu Server后启动时黑屏的问题

我装的是Ubuntu 12.10, 显卡是Intel的。 这应该是电脑里显卡和系统不匹配导致的,花了点时间,终于找到一个成功的解决方案:

1.先从CD里启动,跳到安装界面的时候注意下面有提示F6: Other Options, 按F6,选择nomodeset.

2. 再从硬盘里启动,boot的时候在选中Ubuntu时(下面还有recovery mode之类的选项)手快按下e,这就是edit grub了。

3. 在grub中插入一行i915.modeset=1.

4. 按Ctrl+x重新boot.

5. 现在已经可以进入正常的界面登录和操作了,为了让这个设定一直生效呢,需要修改/etc/default/grub.

6. 敲入命令sudo vi /etc/default/grub, 用vi来修改。

7. 查看grub文件,发现有一行GRUB_CMDLINE_LINUX_DEFAULT='''', 插入一段变成GRUB_CMDLINE_LINUX_DEFAULT=''quiet splash i915.modeset=1'',保存退出。应该就可以了。

其他品牌显卡也可以参照此做法,具体可以参考文章:
http://ubuntu-tutorials.com/2010/05/06/ubuntu-10-04-lucid-blank-screen-at-startup-workaround/

2012年10月23日星期二

Android中正确使用自定义style及Theme

【零】
如果你仅仅是对默认的主题进行很少的修改,可以查看Android本身提供的一些主题模式,比如将背景变成透明,可以在AndroidManifest.xml中你想改的activity的tag中加入:
android:theme="@android:style/Theme.Translucent"
然后直接运行就可以了。可以参考官方说明

【一】
如果需要将一个Activity的主题改成自定义形式:

1.先在AndroidManifest.xml中你想改的activity的tag中加入:
android:theme="@style/MyTheme"
如果需要将该主题模式运用于所有Activity,可以在AndroidManifest.xml中写上这样一句:
<activity android:theme="@style/MyTheme">

2.然后在res/values文件夹下创建一个styles.xml的文件,在文件中写入:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyTheme" parent="android:Theme.Light" >
          <!--需要定义的内容-->
    </style>
</resources>

3.需要定义的内容一般以item形式定义,例如:
<item name="android:textColor">#00FF00</item>
这样可以应用自定义的主题模式了。

【二】
需要注意的还有Android版本问题,如果开发的应用面向Android3.0以下的用户,那么最好采取以下步骤:

1.在res文件夹下创建values-v11(面向Android 3.0+)和values-v14(面向Android 4.0+两个文件夹。

2.在这两个文件夹中分别写入
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyTheme" parent="android:Theme.Holo.Light" >
          <!--需要定义的内容-->
    </style>
</resources>

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyTheme" parent="android:Theme.DeviceDefault.Light" >
          <!--需要定义的内容-->
    </style>
</resources>
以上Holo是对于Android 3.0+的,DeviceDefault是对于Android 4.0+的。

或者其他你需要引用的parent,比如
    <style name="MyTheme" parent="android:Theme.Holo.Light.NoActionBar" >
          <!--需要定义的内容-->

【三】
最后一个问题是在自定义的主题中定义不同插件的模式,这里以Tab插件为例,我们可以用这样的形式
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyTheme" parent="android:Theme.Holo.Light.NoActionBar" >
          <item name="android:tabWidgetStyle">@style/LightTabWidget</item>
    </style>
    <style name="LightTabWidget" parent="@android:style/Widget.TabWidget">
       <!-- 需要定义的内容 -->
    </style>
</resources>
来单独定义插件的一些属性。

这里可以参考themes_device_defaults.xml的源码。

使用Android新版theme改变插件的主题

写好一个Project之后发现它的Spinner,TimePicker之类的Widgets不知何时都变成了旧版的主题。这个问题看似非常之弱却毫无解决的头绪。于是从头写过,一步一步Run,终于发现问题根源。

原因原来是在res/AndroidManifest.xml中误加入一条:
android:theme="@android:style/Theme.NoTitleBar" 

须知这是一条旧版Android的主题的命令,同一个Activity中的所有插件自然就统统变成了旧版的形式。

要用新版(API Level 13 up)的主题来起到上述命令去掉TitleBar的作用,可以使用如下语句:
android:theme="@android:style/Theme.Holo.Light.NoActionBar"
或者
android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen"
官方说明见此处

以后要注意碰到类似主题形式变化的问题,检查一下AndroidManifest.xml这个文件哦。

2012年10月19日星期五

在Java中给String Array正确地赋值

在写程序的时候遇到这个问题好几次了,因为不能明确报错,程序卡住了都不知道什么原因。结果是每次都抓耳挠腮很久,解决了之后又觉得是无关紧要的问题就没有记录,下次碰到又继续循环……由此可见,再minor的细节问题都是要有良好的记录的,不然就是自讨苦吃的浪费时间。

以下举几个给String Array例子:

String[] str;
str[] = a[];   \\a为已赋值的String Array
正确

String[] str;
for(i=0; i<10; i++) {
str[i] = a[i];  \\a为已赋值的String Array
}
出错

String[] str;
str = new String[10];
for(i=0; i<10; i++) {
str[i] = a[i];   \\a为已赋值的String Array
}
正确

String[][] strs;
strs = {str, a};   \\a, str为已赋值的String Array
出错

String[][] strs;
strs = new String[][] {str, a};  \\a, str为已赋值的String Array
正确

以上的
String[]/[][] str;
str = new String[]/[][];
均可以写成String[]/[][] str = new String[]/[][];

总结:给String Array赋值时,除了直接将另一个数组直接传递给该数组以外,都需要写成string = new String[]/[][];的形式。


2012年10月18日星期四

解决错误:/gen already exists but is not a source folder. Convert to a source folder or rename it.

这个错误一般是由对函数库的改动或是路径的重置引起的,显示为
/myProject/gen already exists but is not a source folder. Convert to a source folder or rename it.

解决这个错误的方法如下:

1.右键点击Package Exploreer下的myProject,选择Properties.

2.选择Java Build Path,再选择Source.

3.点击右边的Add Folder, 选中gen文件夹,点击OK,之后Yes.

4.在Properties的主面板中点击OK确定。

5.右键点击Package Exploreer下的myProject,选择Android Tools, 点击Fix Project Properties .

这样我们就把gen文件夹转变为一个source folder了。

现在我们再Project->Clean,就发现错误已经不再出现了。

值得注意的是,如果这个错误是由路径的重置引起的,那么一定要按照上述方法再将src文件夹转变为一个真正的source folder(出现一个方块形package标志)。

2012年10月15日星期一

发布Android应用时如何给apk自行签署金钥


发布Android应用时,它会提醒你提交自行签署金钥版的apk压缩包。因为之前一直Eclipse中调试模式下用的unbug版的签署,现在要换成自己签署了。在Linux下自行签署金钥步骤如下:

1.在装Java JDK时会同时装keytool,这个东东一般装在/usr/bin下。现在我们要调用它,先打开cd /usr/bin,同时为了让我们有调用权限,之后的步骤需要在root下操作su.

2.调用keytook来建立一个私人密钥,不同参数的含义请参见说明。这里要注意的是,因为上传到android市场时它会提示你有效密钥应超过50年,所以我用了20000天,不知道用少了是否有影响。建立密钥命令如下:
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 20000
这时候命令行中会出现如下问题,依次回答:
输入keystore密码:  
再次输入新密码: 
您的名字与姓氏是什么?
  [Unknown]:  XXXX
您的组织单位名称是什么?
  [Unknown]:  XX
您的组织名称是什么?
  [Unknown]:  XX
您所在的城市或区域名称是什么?
  [Unknown]:  HK
您所在的州或省份名称是什么?
  [Unknown]:  HK
该单位的两字母国家代码是什么
  [Unknown]:  HK
CN=XXXX, OU=XX, O=XX, L=HK, ST=HK, C=HK 正确吗?
  [否]:  y

正在为以下对象生成 2,048 位 RSA 密钥对和自签名证书 (SHA1withRSA)(有效期为 20,000 天):
CN=XXXX, OU=XX, O=XX, L=HK, ST=HK, C=HK
输入<alias_name>的主密码
(如果和 keystore 密码相同,按回车):  
再次输入新密码: 
[正在存储 my-release-key.keystore]
这样,就私人密钥就创建成功了。

3.在发布模式下编译应用。在Eclipse里Package Explorer下右键单击你所要加密的项目,选择Android Tool,再选择Export Unsigned Application Package,将这个apk在某一路径下保存,默认保存在Eclipse文件夹下。


4.其实放在那里没什么用,我们需要把这个apk转移到建立私人密钥的地方
mv /home/xxxx/eclipse/myActivity.apk /usr/bin
其中myActivity是你刚刚编译的应用的名字。


5.好了,现在可以用自己的私人密钥给自己开发的应用签署了,命令是
jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore myActivity.apk alias_name
相关参数可以参考说明
这时候命令行中会出现如下问题,依次回答:
输入密钥库的口令短语: 
输入 alias_name 的密钥口令:
答对之后出现:
   正在添加: META-INF/MANIFEST.MF
   正在添加: META-INF/ALIAS_NA.SF
   正在添加: META-INF/ALIAS_NA.RSA
  .
  .
  .
后面还有一大长串就不详细列出了

6.最后,我们要确定加密完成。
jarsigner -verify -verbose myActivity.apk 
会显示你加密的package的具体信息,最后面是说明:
 s = 已验证签名 
  m = 在清单中列出条目
  k = 在密钥库中至少找到了一个证书
  i = 在身份作用域内至少找到了一个证书

jar 已验证。

7.现在就可以在Android市场上发布你的应用了,要注意的是:
apk 套件名稱不能以下列值為開頭:[com.android, com.google, android, com.example]

8.为了优化你将要发布的应用,可以使用zipalign工具,这个工具在android-sdks->tools文件夹下,是一个.exe文件。用它来进行优化,需要使用命令

./zipalign -v 4 myActivity.apk zimyActivity.apk
其中myActivity.apk是zipalign之前的压缩档案,zimyActivity.apk是优化之后输出的压缩档案。如果希望直接覆盖原档案,则可以用
./zipalign -f -v 4 myActivity.apk
最后出现
Verification successful
就OK了。

2012年10月14日星期日

解决error: Found text " " where item tag is expected

这是一个Android开发中.xml文件里一个奇怪的编译错误,具体报错如下:
[2012-10-15 13:38:07 - com.example.xxx.MainActivity] /home/xxx/workspace/com.example.xxx.MainActivity/res/values-zh-rTW/strings.xml:12: error: Found text "
[2012-10-15 13:38:07 - com.example.xxx.MainActivity]     " where item tag is expected

其实这是空格的格式不正确造成的。如果是原始的手工编辑文档,是不会出现这个问题的。但是如果在不同的文档格式中复制粘帖,就会导致上述错误。

所以为了解决这个问题,建议:

1.检查是否存在不必要的空格,如有即删。如果不行,那么2;

2.重新进行复制粘帖,尽量不要使用不同的文档格式。如果不行,那么3;

3.Replace所有xml文档中whitespace with你手工敲出的space. 如果不行,那么4;

4.自己手工重新编辑一遍。

这类错误可以试试用MS word or excel调用一下文档,看是否空格格式错误。

补充说明一下:类似的错误(xml文档中空格格式错误)还会gen文件夹中R.java出现
Syntax error on tokens, delete these  tokens
的报错。同样通过以上的方法可以解决这个错误。

如何制作一张不规则图片

这里以GIMP Image Editor为例,将一张图片中的不规则形状截取出来,最后创建一张不规则的图片。Photoshop也可以按照类似的方法操作。

1.打开原图片,在View里Zoom放大,使你能看清所有细节。

2.用索套工具Free Select Tool将你所要截取的部分圈起来。如果图片的颜色比较单一,可以Select by Color.

3.菜单栏里或者右键选择编辑复制,Edit->Copy.

4.File->New来建立一个新的图像,在Advanced Options 里面有个Fill With, 选择Transparency, 点击OK.

5.在新建的空白背景(即灰黑相间的格子)中菜单栏里或者右键选择Edit->Paste.

6.选择已经粘帖上的图案,在菜单栏里或者右键选择Image->Fit Canvas to Selection,然后在同样的地方选择Crop to Selection.

7.File->Save保存图片,一定要保存成png格式,因为jpg不支持透明背景。然后按照默认选项Export然后Save.

一个不规则图片就做好了,因为这是个透明背景的图片,将其放入任何其他背景中都只会显示你所截取的图案部分。

Linux下复制命令的错误:cp: omitting directory ` '

想把一个文件夹复制到另一个路径下,敲入命令:
cp /var/www/xxx /home/username
却出现如下错误提示:
cp: omitting directory `xxx' 

这其实是一个很菜鸟的错误,因为我们在这里要操作的是文件夹,其中包含多个文件,所以需要的命令应该是:
cp -r /var/www/xxx /home/username
其中-r的意思recursively copy all the files
或者用另一命令:
cp -a /var/www/xxx /home/username
-a就是all啦

需要注意的是,以上两个命令有少少的区别:
cp -r可能会改变文件夹或文件的某些属性和权限;而用cp -a复制过去,原本和复制本是一模一样的。

2012年9月15日星期六

Linux下增加虚拟内存


虚拟内存其实是将硬盘规划出一个区间,使得内存的数据可以由硬盘来读取。当物理内存不够的时候,某些在内存当中所占的程序会暂时被移动到虚拟内存里去。所以,我们可以通过增加虚拟内存来缓解压力。

增加虚拟内存有两种方法:一是增加一个硬盘的分区;二是增加一个虚拟内存的档案。下面说说第二种办法:

1.在/tmp下增加一个 64MB 的档案
dd if=/dev/zero of=/tmp/swap bs=4k count=16382
其中dd是转移并复制档案,/zero是空档案,if是input file,of是output file,bs是一个扇区的容量,count是扇区的数目。在以上命令中,共增加16382*4k=64M的档案。

2.将 /tmp/swap 这个档案格式化为 swap 的档案格式
mkswap /tmp/swap

3.在启用这个swap的档案之前,我们先看一下当前机子的内存
free
我们可以看到swap这一条里有:
Swap:       261112          0     261112

4.使用root权限su来启用刚建立的swap档案
swapon /tmp/swap
再用free命令看一下现在的内存,会发现已经增加了64M:
Swap:       326632          0     326632

5.最后不用时,可以把刚增加的虚拟内存关掉
swapoff /tmp/swap

参考文章:《鸟哥的Linux私房菜》P.287-P.289

2012年9月6日星期四

解决安装phpMyAdmin时出现的错误404 phpmyadmin not found error

装完LAMP时再装phpMyAdmin来管理这套系统,过程如下:

1. 敲入sudo apt-get install phpmyadmin,开始安装。

2.出现选择服务器,选Apache2;又出现选择Yes或No,选Yes。

3.设置root密码。

很简单就装完了。装完之后本来应该可以用了,但是在浏览器中打开
http://localhost/phpmyadmin/
的时候,却显示了如下错误
404 phpmyadmin not found error

这个错误的原因是在路径/etc/apache2/conf.d中并没有指向phpmyadmin的路径,这个时候,我们需要手动建立一个连接
sudo ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf.d/phpmyadmin.conf
然后重新启动Apache
sudo /etc/init.d/apache2 restart
再重新在浏览器打开
http://localhost/phpmyadmin/
就出现了登录界面啦。


2012年9月5日星期三

在Ubuntu上安装Apache服务器加PHP和MySQL

方法一:
最最简单的办法是在终端里敲入:
sudo apt-get install lamp-server^
一步到位!

LAMP就是Linux+Apache+MySQL+PHP的缩写。换而言之,就是一个操作系统,HTTP协议的服务器,数据库软件和编程语言(早期的P指Perl呢)的集合体,它们在一起,就可以架构一个有广泛用途的服务器的架构。

另外,上述命令结尾处的^代表执行。安装这个包时,会让你设置MySQL的root密码。

装完之后,需要让三者统一运作:
sudo apt-get install libapache2-mod-auth-mysql
sudo apt-get install php5-mysql
然后重启Apache:
sudo /etc/init.d/apache2 restart
就OK了。


方法二:
虽然上述方法很简单,不过如果是新手的话,还是推荐一步一步来。这样做并不费事多少,也能对这几个东东有些许了解。分别安装的话,就有如下步骤:

1. 安装Apache2.0
sudo apt-get install apache2
装完之后在浏览器中打开
http://localhost/
或者先Ping一下得知本地的IP地址,在浏览器中打开
http://xxx.xx.xx.xxx(就是你的IP)
浏览器中会出现:It works!

2. 安装PHP
sudo apt-get install php5
然后配置好Apache和PHP
sudo apt-get install libapache2-mod-php5
再重启Apache
sudo /etc/init.d/apache2 restart
最后测试一下:
sudo gedit /var/www/testphp.php
可以在gedit(请自行置换为你常用的编辑器)里编辑
<?php
echo "Hello world!";
?>
保存。
然后在浏览器中打开
http://localhost/testphp.php
将会显示
Hello world!

3.安装MySQL
sudo apt-get install mysql-server
同样也要设置它的root密码。
装完之后,可以先小试一下,敲入命令
sudo start mysql
开启之后再进入它的monitor模式
mysql -u root -p
其中-u是user的意思,-p是password的意思,这时候就让你输入刚设置的root的密码,输完之后出现Welcome的信息,就进入了mysql>。现在我们可以试一些简单的SQL命令了,比如
show databases;
会出现现有的数据库信息,默认的有两个,information_schema和mysql。

4.最后一步跟方法一的最后一样:
sudo apt-get install libapache2-mod-auth-mysql
sudo apt-get install php5-mysql
然后重启Apache:
sudo /etc/init.d/apache2 restart
嘿嘿。

参考文章:
http://flzen.wordpress.com/2011/05/07/lamp-on-ubuntu/
http://www.linuxidc.com/linux/2010-07/27230.htm
http://myy.helia.fi/~karte/install_apache_on_ubuntu.html
http://wiki.ubuntu.org.cn/MySQL

2012年8月29日星期三

如何在Ubuntu上装Oracle Java(JRE)

之前一直用的是OpenJDK,这个在Ubuntu上用起来自然是方便得没话说。不过最近需要用到Oracle的Java,于是在它家官网下了一个Linux版的。下的是个tar包,解压后却发现已经有bin的文件夹,不用make install了,不过却装不到浏览器的Plugin上去(菜鸟汗一个。。。)官方的指南是让直接运行.bin,介个。。。

于是还得自己弄:

1.在刚才提到过的地址中下一个选择适合你的版本下一个tar包(RPM对Ubuntu不适合额),解压(tar命令)后放在你自己的文件夹下。

2.在终端中敲入sudo mkdir -p -v /opt/java/32,用来在opt中创建一个新的文件夹。

3.敲入 sudo mv -v /home/XXX/jre1.7.0_05  /opt/java/32
将你解压到自己的文件夹下的jre转移到刚创建的文件夹中。XXX就是你文件夹的路径。同时请自动转换为自己的版本号。 

4.敲入
 sudo update-alternatives --install "/usr/bin/java" "java" "/opt/java/32/jre1.7.0_05/bin/java" 1 这是告诉系统有新版本的java。

5..敲入 sudo update-alternatives --set java /opt/java/32/jre1.7.0_05/bin/java
告诉系统此版本为默认使用的。

6.好了,现在可以往浏览器中装Plugin了。以Firefox为例,只需要敲入
rm -v ~/.mozilla/plugins/libnpjp2.so
以及
ln -s /opt/java/32/jre1.7.0_05/lib/amd32/libnpjp2.so ~/.mozilla/plugins/
就可以了,第一条是移走原来的,第二条是插入新的。其实你也可以什么也不做,等到下次用到的时候会你的浏览器会自动询问你是否需要插入~

2012年7月25日星期三

LaTex中使用BibTex插入Reference

改论文时老板对文献格式大有意见,小菜鸟我只好折腾了一下,用比较正规的插入格式如下:

1.在文章末尾\end{document}之前加入以下三行:
\renewcommand\refname{Reference}
\bibliographystyle{plain}
\bibliography{Thesis}
其中第一行是参考文献的标题,标题是Reference;第二行是格式,还有其他格式见此处,这里用plain;第三行是一个bib格式文件的名字,最好和tex文件名称一致,编译起来方便一些。
(有一点小小要注意的地方:最常见的引用格式是plain,它是按作者字母排序的,如果要按引用顺序来排序,推荐用格式unsrt)

2.建立一个.bib文件,如Thesis.bib。如果只引用文章和书,可以用以下模板:
@book{Landau,
title = "Fluid Mechanics",
author = "L. D. Landau and E. M. Lifschitz",
publisher = "Pergamon Press, Oxford",
year = "1987"
}

@Article{Cattaneo,
author = {F. Cattaneo, T. Emonet, and N. Weiss},
journal = "Astrophys. J.",
year = {2003},
volume = {588},
pages = {1183},
}
还有其他各种格式模板见此处

3.在.tex文件中正文里引用某些文章或书的地方加入一句\cite{},例如上面的book已经被命名为Landau,于是在引Landau这本书时就插一句\cite{Landau}.

4.运行.tex文件,生成一个.pdf文件的同时会生成.aux文件,这个.aux文件就是引用文献的关键。运行.tex文件可以在Tex编译器中,也可以用命令行pdflatex Thesis

5.运行.bib文件,这里会用到步骤4中生成的.aux文件,所以一定要先4再5哦。运行.tex文件可以在Bib编译器中,也可以用命令行bibtex Thesis

6.再运行两遍.tex文件。运行两遍的原因是第一遍是插入,第二遍是排序。

2012年7月14日星期六

Draw 9-patch的用法——入门级教学

Draw 9-patch是一个在android开发中非常好用的图像处理工具,它的想法很简单,将一张图片用四条线分成九个格子,就可以简单地控制它的大小和覆盖内容的位置。

这里有个android官方版的教程,写得简单明了,不过有些细节不够清楚。所以这里我把我的使用方法记下来。

1.在文件夹中打开android-sdks -> tools,找到文件夹中的一个叫做draw9patch的shell脚本文件,点击运行它。

2.你会发现这个程序的界面实在太简单了,所有的菜单里面的选项只有:打开一个9patch类型的图像,保存一个9patch类型的图像,退出。那么,要创建新的图像,你只能把你待处理的图片拖曳到这个程序的窗口里去。

3.为了方便操作,把下面的三个选项里“是否显示xxx”都给勾上,调整zoom到一个合适的视角。结果如下:

4.下面开始画线。在你拖进去的图片的边缘处,你会发现一些灰白相间的小格子,这就是画线的地方,鼠标单击就可以画黑线了。注意,这时候最好放大很多倍,可以看得比较清楚,细节如下:

5.按照步骤4在四周分别画上四条黑线,这样就把图片分成九份了。就是下图这个样子:


6.点击File -> Save 9-patch,然后就可以把这个图像保存成名为aaa.9.png的格式了。

7.将这个图像放在你的App project的res -> drawable的文件夹里,注意,在xml的文件中引用这个图像时id应为drawable/aaa,而不是aaa.9,所以,drawable文件夹里也不可以同时放aaa.9.png 和 aaa.png!

8.完成上述步骤后,你就可以把这个图像设为某个模块的背景,这个模块的内容就会显示在九部份中正中的那一个部分中了(如上图灰色部分)~

有趣得很吧~

Hack test Level 4-6 傻瓜的继续

刚过了前三关,再写写接下来三关,依然是基本知识。

Level 4:
1.如果继续按之前的做法,查看源代码,会发现什么也找不到。。。
2.其实呢,直接在浏览器设置里禁掉javascript就行了,以我的chrome为例方法如下:
工具->设置->高级选项->隐私设置->内容设置->JavaScript->不允许任何网站运行JavaScript.
3.设置好了之后再点击这一关中的Click here,就到第五关了,记得到第五关之后再设置回允许javascript哦。

Level 5:
1.查看源代码,找到如下语句:

if (pass=="SAvE-as hELpS a lOt") {
window.location.href="save_as.htm";
i=4;
}else {alert("Try again");
window.location.href="abrae.htm";}
2.都过到这里了,密码是什么就不用我多说了吧。

Level 6:
1.查看源代码,会发现密码其实隐藏在另一个javascript文件里,线索在此:
<SCRIPT SRC="psswd.js" LANGUAGE="JavaScript" type="text/javascript">
2.打开这个js文件,你会发现:

<!--
var pass;
pass=prompt("Password:","");
if (pass=="streetzkornerz") {
window.location="included.htm";
}else 
alert("Try again...");
//-->

3.呵呵,这是躲猫猫呢~