一个逗号引发的惨案

根据判断条件组装建表的sql语句,有一处写成了全角的逗号,从而导致满足条件的字段后面都跟的全角逗号,sqlite认为直到遇到下一个半角逗号之前,都是上一个字段的类型声明,从而丢失了多个字段。 例如下面这样: create table card (userLevel TEXT,barCode TEXT,barCodeUrl TEXT,ucno TEXT,bigLogo TEXT,timeLineLink TEXT,blogLink TEXT) barCode 和 ucno类型后面是全角逗号,导致sqlite认为TEXT,barCodeUrl TEXT和TEXT,bigLogo TEXT是类型生命,丢失了这2个字段,但是建表成功,不会报任何错误,等到执行插入操作时才会提示没有该字段。 而由于插入操作只会针对遇到的第一个没有的字段进行提示,更进一步隐藏了问题的本质(建表字段较多,没有一一核对。。)。开始以为是sqlite的关键字,后来转念一想,关键字的话建表时就会报错了,而不是不报错直接建表成功。在多个sqlite工具下建表,结果是一样的。 最后在同事帮助下才通过删除几个字段的方式,最后细看组装出来的sql语句,终于发现是有多个全角逗号导致的。。 折腾了2个多小时,究其原因还是,浮躁,粗心。最开始引发的原因可能是写注释和代码时,中英文来回切换导致的。可见,写英语注释的重要性。。 当然,sqlite强大容错性也促成了这个bug。在此记录下,以警示自己!


境由心生

有一些经历,最开始以为只有自己经历过或者只有少数人经历过,找不到一个合适的描述或者表达方式,比如之前提到的:那一刻似曾相识?,也就是“即视现象”。 到后来你找到了“科学”的解释与依据之后,很容易承认这是普遍现象。 境由心生 当境由心生这个词出现在脑海中,知道又一次找到一种精准表达。因为一直知道这个意思,想不到恰当的表述。以前的表述是:福难双至,祸不单行。而通常所说的眼不见为净大概是另一种表述。 环境随着心境而改变,心境也会被环境所改变。其实,心境完全由你自己来决定,没必要搞的自己那么费劲。 更新:无意识认知 我们的大脑是个奇异的东西,当我们没有思考某个问题,甚至是在睡觉时,我们的大脑仍然在替我们研究这些问题,人们把这种现象叫做无意识认知。 当你死盯着一个问题而没有思路时,不如停下来走开转转,这招百试不爽。不是说着玩的,这也是个普遍现象,源自我们神奇的大脑~~ 不要把自己逼入死角,转个身也许一切都解决了!


Kindle for Android如何导入本地文件

1.官方方法 官方方法是最基本的方法,不仅仅针对Android设备,是任意Kindle设备通用的方法。 登录亚马逊官网,进入“我的帐号”-“管理我的Kindle”,找到你的kindle邮箱,就是那个@kindle.cn,用你亚马逊的帐号邮箱给kindle邮箱发送自己想看的本地文件。kindle邮箱存储空间默认是5G,用于发送的邮箱可以自行添加,最多20个。发送的文件可以是Kindle支持的任意格式,甚至你可以发送多个文件打包成的zip文件。详情请到“管理我的Kindle”或者以下帮助地址查看:http://t.cn/zYn8g7U 2.直接文件操作 这个方法有点Geek,最主要是方便快捷!官方方法还是比较麻烦的,当然可能是出于多设备同步的考虑。 Kindle for Android应用在SD卡上会生成一个文件夹kindle,只要把Kindle支持的文件直接放到这个文件夹下即可。下次打开Kindle时,就可以看到这些文件了。 来自豆瓣网友的日记:http://www.douban.com/note/245773867/ 3.应用内直接导入 从功能上来说,应用本身就应该有个导入本地文件的功能!不知道以后会不会添加此功能。是不是也要做一个控制是否多设备同步的功能?


Android Shell命令dumpsys

dumpsys命令可以显示手机中所有应用程序的信息,并且也会给出现在手机的状态。 直接执行adb shell dumpsys会显示以下所有信息。 SurfaceFlinger, accessibility, account, activity, alarm, appwidget, audio, backup, battery, batteryinfo, bluetooth, bluetooth_a2dp, clipboard, connectivity, content, cpuinfo, device_policy, devicestoragemonitor, diskstats, dropbox, entropy, hardware, hdmi, input_method, iphonesubinfo, isms, location, media.audio_flinger, media.audio_policy, media.camera, media.player, meminfo, mount, netstat, network_management, notification, package, permission, phone, power, search, sensor, simphonebook, statusbar, telephony.registry, throttle, uimode, usagestats, vibrator, wallpaper, wifi, window dumpsys的参数可以跟以上信息的名字。例如: adb shell dumpsys activity 显示activity相关的信息 adb shell dumpsys statusbar 显示状态栏相关的信息 adb shell dumpsys meminfo $package_name or $pid 使用程序的包名或者进程id显示内存信息

Continue reading ↦

Android定时任务相关

Android上定时运行任务常用的方法有2种,一种方法用Timer+TimerTask,另一种是AlarmManager。

Timer

Android 的 Timer 类可以用来计划需要循环执行的任务,Timer 的问题是它需要用 WakeLock 让 CPU 保持唤醒状态,这样会大量消耗手机电量,大大减短手机待机时间。而一旦待机,任务可能就不会执行了。

Timer实现不是很准确,时间上是有误差的。

AlarmManager

AlarmManager 是 Android 系统封装的用于管理 RTC 的模块,RTC (Real Time Clock) 是一个独立的硬件时钟,可以在 CPU 休眠时正常运行,在预设的时间到达时,通过中断唤醒 CPU。

这意味着,如果我们用 AlarmManager 来定时执行任务,CPU 可以正常的休眠,只有在需要运行任务时醒来一段很短的时间。

这种实现通常要选择RTC_WAKEUP才能达到这样的效果,这是需要注意的!

Continue reading ↦

Javascript零食

1.Js跨域实现必须要服务端支持才可以 Js跨域通常是通过动态创建script实现的。 2.Js压缩和反压缩(混淆和反混淆) 通常所说的压缩和混淆指的是一样的。现在很多都采用出现较早的Dean Edwards’ Javascript Packer的压缩方式,即eval方法的方式,所以反压缩也比较容易,使用下列语句即可。 eval("var data=String" + encode.slice(4)); 此时data的值就是解压还原出的原始代码。 很多解压缩工具解压缩都是这么做的。 3.Js进制转换 10进制parseInt(str) 10进制转16进制int.toString(16) 16进制转10进制parseInt(c,16)


TextView自动跑马灯

TextView中的文本太多时,我们希望文本以跑马灯的形式展现。xml文件中对TextView做以下属性配置即可实现: ``` xml xml跑马灯配置 每次用跑马灯都要写这些属性配置,太麻烦了点。简单方法? TextView的跑马灯效果只有在获得焦点的时候才开始滚动,以上这些属性就是配置marquee效果,并且自动获得焦点。那简单的方法就是:自定义View继承TextView,然后覆盖TextView的一些方法,使其自动完成跑马灯效果,而不是通过配置属性来完成。代码如下: ``` java ScrollingTextView.java package com.androidbears.components; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.widget.TextView; public class ScrollingTextView extends TextView { public ScrollingTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public ScrollingTextView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ScrollingTextView(Context context) { super(context); init(); } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if(focused) super.onFocusChanged(focused, direction, previouslyFocusedRect); } @Override public void onWindowFocusChanged(boolean focused) { if(focused) super.

Continue reading ↦

Android应用没有Activity是否可以接受广播?

一个应用没有activity,在API<3.1的版本是可以的接受广播,3.1以后就不可以了。 从3.1开始出于安全的考虑,一个应用必须至少运行一次才能接受广播,意思是说用户知道这个应用运行过,它才可以接受广播。如果非要试试没有activity的话,可以第一次安装有activity,然后,删除activity和xml对应的配置信息再次安装。不过这样实际意义不大。 普通的App如果没有启动默认都是停止状态的,停止状态的App默认是接受不到任何广播的。不过发送广播时如果添加指定标记,也可以使停止状态的应用接受这个的广播。 /** * If set, this intent will not match any components in packages that * are currently stopped. If this is not set, then the default behavior * is to include such applications in the result. */ public static final int FLAG_EXCLUDE_STOPPED_PACKAGES = 0x00000010; /** * If set, this intent will always match any components in packages that * are currently stopped. This is the default behavior when * {@link# FLAG_EXCLUDE_STOPPED_PACKAGES} is not set.

Continue reading ↦

Android自定义相机功能模块

一个Android自定义相机功能模块,调用简单。提供拍照预览功能,支持从图库选择图片,仅支持竖屏拍照和预览。 项目地址:https://github.com/laomo/TakePhoto 调用方式: ```java 自定义相机调用方法 https://github.com/laomo/TakePhoto/blob/master/src/com/laomo/takephoto/MainActivity.java package com.laomo.takephoto; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.widget.ImageView; public class MainActivity extends Activity { private static final int CODE_TAKE_PHOTO = 1; private ImageView mImageView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(this,TakePhotoActivity.class); startActivityForResult(intent, CODE_TAKE_PHOTO); mImageView = (ImageView) findViewById(R.id.imageview); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //取得拍照所得图片的byte数组 if(resultCode == RESULT_OK&&requestCode == CODE_TAKE_PHOTO){ byte[] _data = data.

Continue reading ↦

wordpress支持markdown

markdown是一个很轻量级的文本标记语言,其语法可直接翻译成HTML,便于编写和阅读。 比较有名的对Markdown的应用是github和stackoverflow,我是通过github知道的。有种相见恨晚的感觉,只怪自己孤陋寡闻啊!!决定以后就用它来写东西。一直想在Wordpress上能用Mardown就好了。可惜Wordpress没有对Markdown做支持,好在可以安装各种插件,扩展性就是好啊。 其实主要问题是用Markdown来写wordpress blog,但是希望之前的文章不受影响,排版格式和代码高亮等等。如果单纯的用Markdown写全新的wordpress blog,很好办,好多插件都可以,一下提到的都可以。 目标:老文章编辑显示方式不变,依旧用原来的,用markdown写的文章,编辑显示基于markdown。 到目前为之,尝试了挺多插件,最后的效果还算不错,就是代码高亮不太完美,有待优化。一下列出尝试列表和最终选择解决方案。 尝试一:Markdown for WordPress and bbPress插件。 核心是markdown.php文件。由于以上提到的老文章兼容问题(安装测试时是排版问题),未能采用。 尝试二:修改WordPress插件让Markdown与HTML格式并存 这篇blog博主貌似是台湾同胞,blog是繁体的,人很热心。修改的就是Markdown for WordPress and bbPress插件,主要是通过在页面内加标记,解析的时候通过判断页面有这个标记,就解析为Markdown,然后转成Html,没有就不做处理。测试了也是老文章排版问题。理论说这么做是应该可以了。但是具体原因未能查清,可能和wordpress版本有关系吧。 尝试三:Markdown on Save+WP MarkItUp! 依然是那位热心的台湾同胞。通过2个插件完美的解决了他的blog中Markdown与HTML格式并存。但是到我这还是有小问题。WP MarkItUp!是对编辑的时候做所视即所得支持的。但是我安装后设置页面一直提示无权打开。Markdown on Save通过在表中添加一个字段的处理方式来完成Markdown与HTML的兼容。由于WP MarkItUp!设置问题和要对表做修改,并未单独测试Markdown on Save。 尝试四:WP-Markdown 编辑完成保存时把markdown保存为html,编辑原有blog把html转成markdown。但是测试插件安装以前写得blog发现还是有问题,并为把html转成markdown。可能也修改数据库了,还是blog加入转换标记了。目前用的就是这个插件。代码高亮有点问题,使用wp-highlight.js这个插件支持代码高亮,但是不太好。 这里面有个小插曲: 写java的代码,代码中有类似这种List<ResolveInfo>的,会在代码中自动补全 List</ResolveInfo>。 开始以为是插件问题,关闭插件发现还是有这个问题。捣鼓半天,最后才想到是不是wordpress太“智能”了,WP-Markdown把markdown保存为html,wordpress自动补全html标记?最后在设置-撰写里找到了,果然wordpress太“智能”。有个选项“让 WordPress 自动校正嵌套错误的 XHTML 代码 ”。好吧,把选项关掉。该早点想到的。只是以前都是可视化写blog,类似这种,wordpress已经转换好了,不会在html源码中直接出现类似List<ResolveInfo>这种代码。 本文地址:http://lmbj.net/blog/wordpress-support-markdown