星期一, 二月 25, 2013

delopy web app to Google appengine

download appengine jdk and run follow command:

D:\appengine-java-sdk-1.7.5\bin\appcfg.cmd update war -A szpureweb

星期日, 一月 27, 2013

如何在Eclipse 中实现Build number的功能

思路:利用Ant builder
如图
1.首先输入当前Project的ant build.xml文件,和一个保存编译计数器的properties文件。

加入新的target用name 来指定:
    
        
        
        
        


   




2.给项目加入Ant Builder ,项目属性里寻找Builder 然后加入Ant Builder,然后将其用
up按钮移动到最顶部,让其第一个被调用.


 3.要加入refresh的功能和默认的target,这个参考如上和如下两个图就知道了.







星期二, 一月 22, 2013

keytool 常见用法

查看一个已经生成的keystore 文件
keytool -list -v -keystore debug.keystore

需要密码

星期三, 一月 16, 2013

abap 执行本地SQL Native SQL

 exec sql.
 insert into test(code) valeus(
                      :pl_wa-Entity_Code,
                    );
      endexec.
      if sy-subrc ne 0.
        write:/,'fail!'.
      endif.
    commit work.

SAP ABAP如何直接运行一个本地SQL SELECT查看结果.

ECC 6.t-code db02即可做到这个。
DB02 -> Diagnosis -> SQL Command editor



星期一, 一月 14, 2013

Dynamic load properties file by Absolulated directory way.

这样可以在classpath里修改controlSetup.properties文件的值,而直接在程序里使用。
通过getResourceAsStream方式载入的文件被Cache.

public InputStream getpro()
 {
String propersetupfile="com/resources/controlSetup.properties";    
String dir=this.getServlet().getServletContext().getRealPath("/");
System.out.println("real directory:"+dir);
String pdir=dir+"WEB-INF/classes/"+propersetupfile;
System.out.println("properties file in:"+pdir);
InputStream fi=null;
try
{
fi=new FileInputStream(pdir);
}catch(Exception e)
{
e.printStackTrace();
       
     fi= this.getClass()
        .getClassLoader()
        .getResourceAsStream(propersetupfile);
}
return fi;
//     return this.getClass()
//        .getClassLoader()
//        .getResourceAsStream(propersetupfile);
 }  

Java读取某个目录下的制定properteis tips

 String fileName = "test.app"; // 注意格式 test 为包名,默认读取后缀为.properties的文件
ResourceBundle rb = ResourceBundle.getBundle(fileName, new java.util.Locale(""));

在test目录下有2个文件 app.properties和app_en.properties
如果想读取 app.properties 则只要给一个空的Locale("")即可。
同样,想读取app_en.properties需要用 Locale("en")

Java计算tips,如何从一个数字字符串中得到字符整数转换。

char character = string.charAt(index);
int x = (character – '0') * 20;

星期四, 一月 10, 2013

abap 如何获得Internal table的定义字段,用RTTS

*&---------------------------------------------------------------------*
*& Report  Z_GET_TABLE_COLUMNNAME
*& get component structure by RTTS.(Runtime Type Servcies)
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  Z_GET_TABLE_COLUMNNAME.

TYPES: BEGIN OF typ_itab,
         sex(20) TYPE c,
         tigh TYPE i,
         salary TYPE p LENGTH 12 DECIMALS 3,
         name type string,
          END OF typ_itab.
DATA: i_itab TYPE TABLE OF typ_itab , "if has with header line,exceptin happend
      l_tabledescr_ref TYPE REF TO cl_abap_tabledescr,
      l_descr_ref      TYPE REF TO cl_abap_structdescr,
      wa_table TYPE abap_compdescr.

l_tabledescr_ref ?= cl_abap_typedescr=>describe_by_data( i_itab ).
l_descr_ref ?= l_tabledescr_ref->get_table_line_type( ).

LOOP AT l_descr_ref->components INTO wa_table .
  WRITE: / wa_table-name,wa_table-type_kind,
         wa_table-length,wa_table-decimals.
ENDLOOP.

cl_salv_table 获得 所有internal table 定义field name

FORM alv_fieldcat_reset2
    USING alv_table   TYPE REF TO cl_salv_table.
  DATA: lo_columns TYPE REF TO cl_salv_columns.
  DATA: lo_column TYPE REF TO cl_salv_column.
  "add field authority check
  DATA: alv_fieldcat TYPE slis_fieldcat_alv.
  DATA: cx_exc_ref    TYPE REF TO cx_root.
  DATA error_text TYPE c.
  DATA:
    lta_column_ref TYPE salv_t_column_ref
  .
  FIELD-SYMBOLS:
    <lfs_column> LIKE LINE OF lta_column_ref
  lo_columns = alv_table->get_columns( ).
      lta_column_ref = lo_columns->get( ).
      LOOP AT lta_column_ref ASSIGNING <lfs_column> .
        lo_column = <lfs_column>-r_column.
 write <lfs_column>-columnname.

      ENDLOOP. 

星期三, 一月 02, 2013

Volatile: why prevent compiler reorder code

Prior to Java-5 ,编译器竟然会调整语句的顺序来优化!!!

解释链接:

http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile

星期三, 十一月 28, 2012

Android,不再为线程烦恼

不再为线程烦恼


当你第一次开始一个Android应用的时候,有一个名字为"main"的线程就自动被系统建立了.这个main线程也被叫做 UI 线程,也就是用户界面线程,UI线程是非常重要的,它负责将事件也包括绘制(Drawing)事件分派到恰当的widgets;它也是你和Android Widgets之间互动的线程.
例如,当你触摸屏幕上的按钮,UI线程就将触摸事件分派到该widget,然后该widget设置状态为按下状态并发送一个invalidate请求到事件队列内.
UI线程出队该请求并通知widget来重绘自己.

这种单一线程模式将造成可怜的性能问题,因此在Android应用中一般是不考虑的。当所有事情都在单一线程中发生的时候,将造成线程长时间操作,比如网络访问或数据库查询,会造成这个
线程阻塞所有的用户接口.当长时间操作进行时,没有事件可以被分派,包括绘制(Drawing)事件.
从用户的角度来看,应用明显挂住了.甚至更糟,如果UI被阻塞了超过数秒(大约5秒)用户将得到声名狼藉的 ANR-程序没有响应.application not responding" 对话框。

如果你想试试这看起来有多糟糕,你可以写一个简单的应用一个按钮的onClickListener方法调用Thread.sleep(2000).
这个按钮将保持按下的状态大约2秒钟然后才返回到正常状态。当按钮按下时,用户轻易发现应用很慢.

现在你知道在UI线程内应该避免冗长的操作了,必须正确的使用额外的线程(后台工人线程worker thread)来正确的执行这些操作.
还是用一个例子:点击然后从网络上下载一个图像并显示在ImageView里.

public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
Bitmap b = loadImageFromNetwork();
mImageView.setImageBitmap(b);
}
}).start();
}

初看起来,这段代码似乎给出了一个不阻塞UI线程的一个非常好的解决方法.但很不幸,它又违背了单一线程模式:
Android UI 工具集不是线程安全(thread-safe)的,必须一定要在UI线程里来操作.
这段代码内,ImageView被工人线程操作,这会造成一些奇怪的问题,并且让跟踪和修正错误变得困难和费时。

Android 提供了几种方法从其他线程里访问UI线程.罗列以下组件及方法:

这些方法或者类都能正确的使用我们先前的例子:

public void onClick(View v) {
  new Thread(new Runnable() {
public void run() {
final Bitmap b = loadImageFromNetwork();
mImageView
.post(new Runnable() {
public void run() {
mImageView
.setImageBitmap(b);
}
});
}
}).start();
}

不完美的是,这些类或方法让代码非常难以阅读.当你需要复杂频繁更新UI的时候,就更糟糕了.为了补救这个问题,Android 1.5 提供了新的功能
类:AsyncTask简化长时间操作的任务需要和UI 通讯的问题.
AsyncTask在Android 1.0和1.1也存在不过叫做UserTask,提供了一样的API你可以copy你的应用的源带码使用.

AsyncTask的目标是替你来管理thread.我们先前的例子可以很容易重写成AsyncTask的例子:

public void onClick(View v) {
  new DownloadImageTask().execute("http://example.com/image.png");
}

private class DownloadImageTask extends AsyncTask {
protected Bitmap doInBackground(String... urls) {
return loadImageFromNetwork(urls[0]);
}

protected void onPostExecute(Bitmap result) {
mImageView
.setImageBitmap(result);
}
}


如你所见,AsyncTask必须用做它的子类.最重要的是要记住AsyncTask实例必须在UI线程内建立并只能一次执行一次。
你可以浏览 AsyncTask documentation 来完全理解它是如何工作的,这里给出一个快速工作原理浏览:


除了官方文档,你也可以看到几个负载的例子的源代码比如(ShelvesActivity.java 和AddBookActivity.java) 和 Photostream (LoginActivity.java, PhotostreamActivity.java和 ViewPhotoActivity.java). 我高度推荐读读Shelves 源代码来看看如何永久化任务访问配置改变并如何在Activity被放弃的时候放弃属性.

无论是否你要使用AsyncTask,永远记住这种线程模型的2个规则:不要阻塞UI线程并且确定Android UI 工具箱只能在UI线程内访问。
AsyncTask 是这两个要求很容易实现。

如果你想学习更多很Cool的技术,来加入我们 Google I/O. Android 团队成员在这里会给你 series of in-depth technical sessions 并回答你的问题.

Fwd: 如何在Android 4 使用optins menu



Android 4后,Google
Google is happy to bid farewell to the Menu button, and they don’t even want you calling that funny little three-dot button the “menu.”
 Rather, Google wants us to think of the menu at an “action overflow.”
 When there isn’t enough space in the Action Bar for all the icons you might need in an app, the action overflow handles it.

编写兼容的程序从2.x-4.x ,在Eclipse ADT 里编译的时候就必须要选择高版本LEVEL API,
 但在发布的时候,AndroidManifest.xml,要删除掉         android:targetSdkVersion="16"  ,而只保留 android:minSdkVersion="10"
android 2.3.3 level api,则在Android 4.X 系统下,options menu出现在了系统导航条上的三点菜单里。
注意,options menu->action bar ->system navigation bar -> overflow menu 几个概念的演化。
如图



星期四, 十一月 22, 2012

Fwd: git Cannot pull into a repository with state: MERGING 解决

 首先使用 Merge Tool,选择编辑有冲突的文件比较。
 编辑后,使用add to index ,然后再commit,即可解决这个问题

Fwd: 改变adb shell ctrl+c终端程序,并直接退出adb shell的问题

su,root后,直接用stty intr ^X
然后用ctrl+x 回车结束程序运行比如ping之类

星期四, 十一月 15, 2012

Android 4.2 root 后adb shell ,su 发现read-only file system.如何解决

Android 4.2 ,root后通过adb shell进入发现read only file system 问题
mount 发现/system / 两个文件卷的路径,一般是第一列为物理路径,
 第二列为系统卷,重新remount为可读写,
1.mount -o remount,rw rootfs
2.mount -o remount,rw /dev/block/platform/omap/omap_hsmmc.0/by-name/system
3.现在可以复制东西到/etc/了
原因是Android要在/ 卷和/system卷之间做很多的配置文件同步的比如,/etc/hosts,就会在/system/etc 下同步的。

正则表达式,发现一行包含某个特定的字符串,但又不包含某个特定的字符串

'^(?=.*IncludeString)((?!ExcludeString).)*$'
(?= 肯定前瞻
(?! 否定后顾

正则表达式发现不包含某个特定字符串的表达

^((?!ExcludeString).)*$ 这个可以处理只包含ExcludeString的行
而以下pattern则无法处理包含ExcludeString的独立行
^(.(?!stringToExclude))*$

星期四, 十一月 08, 2012

正则表达式的例子

grep -P "\d{7}(\s+|:)(\d\d[\s+-]?){7}"  可以工作,但可以修改为

更加精简的pattern.

grep -P "\d{7}.(\d\d).{7}"


用来搜索同一个文本内的如下格式的数据:

2012083:04-09-14-15-26-33-04                               
2012084:02-10-20-26-28-29-14                               
2012103 11 14 32 33 02 09 04 14 11 33 32 364812438 452814888

Re: 正则表达一点例子.

grep -P "\d{7}(\s+|:)(\d\d[\s+-]?){7}"  可以工作,但可以修改为
更加精简的pattern.
grep -P "\d{7}.(\d\d).{7}"

用来搜索同一个文本内的如下格式的数据:

2012083:04-09-14-15-26-33-04                               
2012084:02-10-20-26-28-29-14                               
2012103 11 14 32 33 02 09 04 14 11 33 32 364812438 452814888



2012/11/8 凯幄解 <javacave@gmail.com>
grep -P "\d{7}(\s+|:)(\d\d[\s+-]?){7}"

用来搜索同一个文本内的如下格式的数据:

2012083:04-09-14-15-26-33-04                               
2012084:02-10-20-26-28-29-14                               
2012103 11 14 32 33 02 09 04 14 11 33 32 364812438 452814888