Code our life 日日行,不怕千万里;时时学,不怕千万卷

24七/100

android中添加menu

1.定义menu.xml资源文件

<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/settings"
android:title="@string/settings_label"
android:alphabeticShortcut="@string/settings_shortcut"></item>
</menu>

<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/settings" android:title="@string/settings_label" android:alphabeticShortcut="@string/settings_shortcut"></item></menu>
2.在activity的onCreateOptionsMenu中inflate menu

MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu)

3.在acitvity的onOptionsItemsSelected中添加事件

switch ( item.getItemId() ) {
    case //...
}<span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: small;"><span style="line-height: 19px; white-space: normal;">
</span></span>
22七/100

使用imageMagic实现PDF转图片

最近一个项目需要实现将PDF文件转成图片的功能,由于转换时间较长,所以选择在系统后台执行转换工作,使用的是一个叫imageMagic的程序(貌似很多图片处理软件用的就是这个库)。查看imageMagic的官方文档,参数实在太多,做了一番research之后,记录如下:

PDF转图片

convert -density 300 -quality 100 -resize 1024x768 -antialias test.pdf[0-50] test.jpg

使用convert命令进行转换:
density参数是设置图片DPI值
quality参数是设置图片质量(0-100,对png格式图片无效)
resize参数是对图片进行缩放(按比例)
antialias参数是设置开启文字抗锯齿效果
test.pdf是要转换的pdf文件(必要时需要指定绝对路径,不一定是pdf格式,图片格式即可,0-50是指要转换的页码,不指定就全部转换)
test.jpg是转成图片后的名字(如果pdf有多页,图片名称按照 test-0.jpg, test-1.jpg, test-2如此类推)

PHP中调用convert命令

PHP中有几个调用系统shell命令的函数,这次项目中我使用exec这个函数,使用方法如下:

    $cmd = "convert -density 300 -quality 100 -resize 1024x768 -antialias test.pdf[0-50] test.jpg";
    // $output变量记录命令执行时的所有输出,以数组格式返回
    // 执行后可以对$output变量进行检查,因为convert命令正常的话是没有输出的,如果有输出可能就是转换失败
    exec($cmd, $output);

解析PDF等图片的信息

可以使用identify命令对PDF进行解析,可以得到文件的分辨率等信息,简单命令如下(详细参数参考官方文档):
identify test.pdf

解决在IE下jpg图片无法显示的问题

因为imageMagic转换成jpg格式图片的时候,默认使用了CMYK格式,所以导致在IE下有时候会显示不了。
可以使用colorspace参数将图片使用RGB的格式进行转换。
命令如下:
convert -colorspace RGB test.pdf test.jpg

20七/100

【翻译】多文件上传

多文件上传

多文件上传

以往我打算是实现同时上传多个文件,会使用多个"file"表单元素,这是令人讨厌的,效率低下(译者注:用户需要一个文件一个文件地选择),但我无法想象我如果不使用它的话,我的用户会怎么样。很幸运,Safari, Chrome和firefox 现在已经实现了使用一个file表单元素就能完成完成多文件上传的方法。
查看DEMO

HTML


<form method="post" action="upload-page.php" enctype="multipart/form-data">
<!-- 译者注:注意這個multiple属性和name属性 -->
  <input name="filesToUpload[]" id="filesToUpload" type="file" multiple="" /> 
</form>
<br/>

简单的给file 表单元素添加一个muliple属性就允许多文件上传了。(译者注:multiple的值的作用不清楚,原文的意思大概是可以添加验证功能)

Listing Multiple Files with JavaScript

//get the input and UL list
var input = document.getElementById('filesToUpload');
var list = document.getElementById('fileList');
 
//清空列表
while (list.hasChildNodes()) {
	list.removeChild(ul.firstChild);
}
 
//遍历每一个选择上传的文件
for (var x = 0; x < input.files.length; x++) {
	//add to list
	var li = document.createElement('li');
	li.innerHTML = 'File ' + (x + 1) + ':  ' + input.files[x].name;
	list.append(li);
}

file表单元素的files属性是一个数组,所以可以通过length属性可以知道用户选择的文件。可以遍历得到每一个文件的路径(path)和名称(name)。

Receiving and Handling Files with PHP

使用PHP接收并处理文件

if(count($_FILES['uploads']['filesToUpload'])) {
	foreach ($_FILES['uploads']['filesToUpload'] as $file) {	    
                // 你可以在处理图片
		echo $file;		
	}
}

PHP根据表单的那么属性创建了一个文件数组。

当然,你也可以在IE和opera中通过flash实现多文件上传,可是想这样要另外的组件支持始终不是什么好主意。希望这些浏览器快点支持多文件上传吧!

by 译者

评论中以外发现一个flash上传的jquery插件http://www.uploadify.com/,这段时间在弄大文件上传的处理方式,是使用swfupload这个组件实现的。
记录一下这个uploadify, 以后也许用得着:)

19七/100

Android开发中的单元测试

java开发好像大多都是以xml作为配置文件(php大多使用ini格式的文件),一开始真是有点不习惯,而且很多配置项给人糊里糊涂的感觉,目前只是处于复制粘贴,不知其所以然的水平。以下是在android开发中使用单元测试的配置项要点:

1.在AndroidManifest.xml中的application节点下添加如下节点:

<uses-library android:name="android.test.runner" />
2.在AndroidManifest.xml中的根节点(mainfest)下添加如下节点:
<instrucmentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="cn.sharp.action"  //这个属性必须与单元测试用例class所在的package一致
android:label="Test for My App"/>

杂碎记录

1.限制输出格式为数字(整数或浮点数)的属性
android:numeric="integer|decimal"
2.字符串转浮点型
String s = "1.2";
float f = float.parseFloat(s);
3.java中浮点型转字符串
String str = ""+f;

结束语

终于开始认真学android开发了,入门还是不难的,加油!

19七/103

SQLite 的Script导出方法

如何导出sqlite的sql语句
作者:axgle

这是我实际经验的总结,是有效的。不知道有没有更简单的办法呢?
知道的朋友回复一下,谢谢.

1.选择源db_src
        sqlite3 src.db
2.选择输出模式
        .mode  insert
3.选择输出文件名
        .output sql.txt
4.开始dump
        .dump table1,table2

16七/100

java中的匿名类学习笔记

定义匿名类

在声明某个类的成员属性时,可以将匿名类的实例赋值给改成员变量,也可以在某个方法中,将匿名类实例作为方法返回值
case1: 赋值给类中成员变量

    class Outer {
        public B bb =  new B() { // B是匿名类的父类或者是一个接口
            private int a = 1;
            private int b = 2;
            public function func(){
                // do sth.
            }
        }; // 此处的分号一定要记得,因为这里是一条语句(表达式)
    }

case2:方法中返回匿名类的实例

    class Outer {
        public B getAnoy(){
            return new B() { // B是匿名类的父类或者是一个接口
                private int a = 1;
                private int b = 2;
                public function func(){
                    // do sth.
                }
            }; // 此处的分号一定要记得,因为这里是一条语句(表达式)
        }
    }

向匿名函数父类的构造函数传递参数

//很简单,只要在声明匿名函数的时候传递
new B(1){
    //声明匿名函数
}

方法中的匿名函数使用方法的参数

当方法的参数为final时,匿名函数才能使用该参数变量

    class Outer {
        public B getAnony(final String param) {
            return new B() {
                private String paramHolder = param; // param必须为final
            }
        }
    }

匿名函数的构造函数

因为是匿名函数,那么就不可能有命名的构造函数,但是可以通过Instance initialization(实例初始化)来实现类似构造函数的效果

    class Outer {
        public B getAnony() {
            return new B() {
                { System.out.println("初始化对象时调用") } //这样就可以实现构造函数的效果了
                private int a = 1;
            }
        }
    }

匿名类与正常的类继承的不同

尽管匿名类可以实现某个接口,也可以扩展(extends)某个类,但是不能同时实现一个接口并扩展某个类。鱼与熊掌不能兼得。

Thinking In Java内部类中讲到匿名类时,通过匿名类巧妙地实现了工厂方法。

13七/100

HTML5中的classList

HTML5的API加入了一个很有用的功能,那就是classList。
classList对象被添加在所有的DOM元素中,提供了DOM元素的class相关操作,如添加、删除等。
classList对象结构如下:

node.classList = {
	length: {number}, /* # of class on this element */
	add: function() { [native code] },
	contains: function() { [native code] },
	item: function() { [native code] }, /* by index */
	remove: function() { [native code] },
	toggle: function() { [native code] }
}

正如你所看到的,classList对象内容不多,但都是一些很有用的属性和方法。

添加一个class

myDiv.classList.add('myCssClass');

删除一个class

myDiv.classList.remove('myCssClass');

切换class

myDiv.classList.toggle('myCssClass');

检测元素是否拥有某个class

myDiv.classList.contains('myCssClass');

现在只有firefox支持classList这个对象。相信其他浏览器也会陆续支持。

13七/100

PHP中设置文件上传大小限制

PHP中有三个配置项是控制上传相关的:
memory_limit
post_max_size
upload_max_filesize
其中只有memory_limit可以在脚本中动设置

ini_set(‘memory_limit’, ‘60M’);          // 可成功设置
ini_set(‘post_max_size’, ‘40M’);        // 失败
ini_set(‘upload_max_filesize’, ‘40M’); // 失败

还可以通过.htaccess文件设置:
php_value memory_limit 60M
php_value post_max_size 40M
php_value upload_max_filesize 40M

当然,还可以直接php.ini中配置

11七/100

mysql复制表和修改表名

mysql中复制表结构和数据的方法(只复制表结构,不复制约束):
假设要建一个表tableNew,数据结构与已存在的表tableOld一致
CREATE TABLE tableNew SELECT * FROM tableOld WHERE 1<>1
如果要全部复制(包括数据),可以这样写
CREATE TABLE tableNew SELECT * FROM tableOld
这两天给人写一个电话本,需要修改数据库中的一个表的名称,修改表名的语句如下:
ALTER TABLE mytable RENAME TO newTable

2七/100

试用期满感想

我在公司的所属部门是外包,我虽然也不喜欢做外包,但觉得在这方面目前还是有很多东西学习的。另外公司主要方向不是做外包,等公司主要产品上了轨道之后,就不需要做外包,到时就可以做真正自己的产品。所以自己其实是在以一种“等待和学习”的心态在工作。

前几天我试用期满了,Michael找我谈话,和我谈了公司的发展情况等等,并且分析了我的工作职责等问题,使我的心态有所改变。这是我才明白到,我们在做外包项目的同时(特别是对于我来说)不要仅限于为了提高编程水平。对于公司来说,公司是在积累案例,我们的客户是国外的,有很多服务在国内目前是没有的,在将来,我们可以把这些曾经做过的项目,移植到国内市场来。比如之前我们做过的一个“位置服务”,现在随随便便就可以改个包装就可以在国内翻一个版本。

不要仅仅限于解决技术上的问题,而是要理解需求,要理解客户为什么要求这样做,这样的好处是什么。要不然就算你做过很多项目,但都不知道这些项目为什么有这样那样的需求,不知道具体某个功能的好处在哪里,缺点在哪里的话。做过再多的项目,你也只不过是个coder。

思考技术以外的事情(在这里指理解产品,理解需求),并不会浪费太多时间,可以说这两件事是可以同时进行的,既然在技术能够提高的同时,能够让自己思考得更多,何乐而不为呢。

要变得更有智慧,而不只是更有知识。