咖啡伴侣

呆在上海
posts - 163, comments - 156, trackbacks - 0, articles - 2

const Ln2= 0.693147180559945309417232121458\             176568075500134360255254120680009 const Log2E= 1/Ln2 // this is a precise reciprocal const Billion = 1e9 // float constant const hardEight = (1 << 100) >> 97 

根据上面的例子我们可以看到,反斜杠 \ 可以在常量表达式中作为多行的连接符使用。


格式化说明符

在格式化字符串里,%d 用于格式化整数(%x 和 %X 用于格式化 16 进制表示的数字),%g 用于格式化浮点型(%f 输出浮点数,%e 输出科学计数表示法),%0d 用于规定输出定长的整数,其中开头的数字 0 是必须的。

%n.mg 用于表示数字 n 并精确到小数点后 m 位,除了使用 g 之外,还可以使用 e 或者 f,例如:使用格式化字符串 %5.2e 来输出 3.4 的结果为3.40e+00

posted @ 2013-07-30 08:45 oathleo 阅读(175) | 评论 (0)编辑 收藏

包是结构化代码的一种方式:每个程序都由包(通常简称为 pkg)的概念组成,可以使用自身的包或者从其它包中导入内容。

如同其它一些编程语言中的类库或命名空间的概念,每个 Go 文件都属于且仅属于一个包。一个包可以由许多以 .go 为扩展名的源文件组成,因此文件名和包名一般来说都是不相同的。

你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package mainpackage main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。


如果需要多个包,它们可以被分别导入:

import "fmt" import "os" 

或:

import “fmt”; import “os” 

但是还有更短且更优雅的方法(被称为因式分解关键字,该方法同样适用于 const、var 和 type 的声明或定义):

import (     "fmt"     "os" )

可见性规则

当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 private )。


你可以通过使用包的别名来解决包名之间的名称冲突,或者说根据你的个人喜好对包名进行重新设置,如:import fm "fmt"。下面的代码展示了如何使用包的别名:

Example 4.2 alias.go

package main import fm "fmt" // alias3  func main() {     fm.Println("hello, world") }

函数里的代码(函数体)使用大括号 { } 括起来。

左大括号 { 必须与方法的声明放在同一行,这是编译器的强制规定,否则你在使用 gofmt 时就会出现build-error: syntax error: unexpected semicolon or newline before { 这样的错误提示。


一个函数可以拥有多返回值,返回类型之间需要使用逗号分割,并使用小括号 ( ) 将它们括起来,如:func FunctionName (a typea, b typeb) (t1 type1, t2 type2)

posted @ 2013-07-30 08:44 oathleo 阅读(198) | 评论 (0)编辑 收藏


  • Shorthand for writing Vector3(0, 0, 1)
    Vector3(0, 0, 1)的简码,也就是向z轴。
  • Shorthand for writing Vector3(0, 1, 0)
    Vector3(0, 1, 0)的简码,也就是向y轴。
  • Shorthand for writing Vector3(1, 0, 0)
    Vector3(1, 0, 0)的简码,也就是向x轴。 
transform.Rotate(Vector3.forward *Time.deltaTime * RotateSpeed);


Vector3.forward代表以Z轴为轴旋转

Z轴 forward 代表往前
X轴代表右 right
Y轴代表往上up



posted @ 2013-07-04 17:04 oathleo 阅读(286) | 评论 (0)编辑 收藏

Java路径中的空格问题
1、 URLTest.class.getResource("/").getPath();
    URLTest.class.getResource("/").getFile();
    URLTest.class.getClassLoader().getResource("").getPath();
    Thread.currentThread().getContextClassLoader().getResource("").getPath();等多种相似方式获得的路径,不能被FileReader()和FileWriter()直接应用,原因是URL对空格,特殊字符(%,#,[]等)和中文进行了编码处理。如果文件中URLTest.class.getResource("/").getPath();必须以"/"开头然后再加文件名,而URLTest.class.getClassLoader().getResource("").getPath();不用加"/"可以直接添加文件名。

路径中包含空格时,如果空格变为"%20"有如下处理方法:
1)使用repaceAll("%20",' ')替换,但只能解决空格问题,如果路径中包含其他特殊字符和中文就不能解决问题。
2)使用URLDecoder.decode(str,"UTF-8")解码,但是只能解决一部分,若路径中含有+,也是不能解决的,原因是URL并不是完全用URLEncoder.encode(str,"UTF-8")编码的,+号被解码后,则变成空格。
3)解决所有的问题,用URLTest.class.getClassLoader().getResource("").toURI().getPath();,但是需要处理URISyntaxException异常,比较麻烦一些。

2、new URL();的参数可以为正确的URI,或者为URI格式的字符串;若字符串是非完整的URI格式,则创建失败。java.net.URI返回的路径中的空格以“空格”的形式出现方法为Thread.currentThread().getContextClassLoader().getResource("").toURI().getPath();但是Thread.currentThread().getContextClassLoader().getResource("").toURI().toString();则会以“%20”的形式出现。java.net.URL返回的一切路径中的空格都是以“%20”的形式出现。URL/URI返回的路径分隔符都是“/”(控制台输出"/")。


3、new File(String filePath);接受正确URI格式的参数和带“空格”(非%20)的正确相对/绝对字符串路径,否则即使给的路径是正确的也会出现找不到文件的异常。File返回的路径分隔符都为“\”(控制台输出"\"),对于存在的文件返回的路径字符串,空格都以"空格"出现,而不存在的路径new出的file,getPath()返回的路径中的空格,仍是new File(String filePath)的参数中原有的形式,即若filePath中是空格的getPath()返回的仍是空格,是“%20”的仍是“%20”。File.toURI() 会将file的路径名中的“空格”转化为“%20”,然后在路径前加protocol:"file:/",而File.toURL()只会在file路径 前简单的加上protocol:"file:/",而不会将“空格”转化为“%20”,原来的无论是“空格”还是“%20”都只会原样保留。


实际使用中遇到的问题总结如下:
1、相对路径(即相对于当前用户目录的相对路径)均可通过以下方式获得(不论是一般的java项目还是web项目) String relativelyPath=System.getProperty("user.dir"); 对于一般的java项目中的文件是相对于项目的根目录,而对于web项目中的文件路径,可能是服务器的某个路径,同时不同的web服务器也不同 (tomcat是相对于 tomcat安装目录\bin)。为此,个人认为,在web项目中,最好不要使用“相对于当前用户目录的相对路径”。然而默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。这就是说,在使用java.io包中的类时,最好不要使用相对路径。否则,虽然在SE程序中可能还算正常,但是到了EE程序中,可能会出现问题。

2、web项目根目录获取
1)建立一个servlet,在其init()方法中添加如下代码
ServletContext context = this.getServletContext(); 
String strs = context.getRealPath("/"); 
2)利用httpServletRequest,得到相应的项目路径
String pathUrl = request.getSession().getServletContext().getRealPath("/");

posted @ 2013-05-27 17:00 oathleo 阅读(301) | 评论 (0)编辑 收藏

iosched 里的DashboardLayout 在scroll里好像有点问题,一个类就事情,没时间调了,自己写了个

1 1 import android.content.Context;
 2 import android.view.View;
 3 import android.widget.LinearLayout;
 4 
 5 public class AutoTableLayout extends LinearLayout {
 6 
 7     private int mMaxChildWidth = 0;
 8     private int mMaxChildHeight = 0;
 9 
10     //列数
11     private int column = 0;
12     //是否自定义列数
13     private boolean isCustomColumn = false;
14     
15     public AutoTableLayout(Context context) {
16         super(context, null);
17     }
18 
19     public AutoTableLayout(Context context, int col) {
20         super(context, null);
21         column = col;
22         isCustomColumn = true;
23     }
24 
25     @Override
26     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
27         mMaxChildWidth = 0;
28         mMaxChildHeight = 0;
29 
30         final int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.AT_MOST);
31         final int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.AT_MOST);
32 
33         final int count = getChildCount();
34         for (int i = 0; i < count; i++) {
35             final View child = getChildAt(i);
36             if (child.getVisibility() == GONE) {
37                 continue;
38             }
39 
40             child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
41 
42             mMaxChildWidth = Math.max(mMaxChildWidth, child.getMeasuredWidth());
43             mMaxChildHeight = Math.max(mMaxChildHeight, child.getMeasuredHeight());
44         }
45 
46         int width = resolveSize(mMaxChildWidth, widthMeasureSpec);
47 
48         // 每行个数
49         if (!isCustomColumn) {
50             column = (int) Math.floor((double) width / mMaxChildWidth);
51         }
52          
53         int row = (int) Math.ceil((double) count / column);
54 
55         int height = mMaxChildHeight * row;
56         setMeasuredDimension(width, height);
57 
58     }
59 
60     @Override
61     protected void onLayout(boolean changed, int l, int t, int r, int b) {
62         int width = r - l;
63         int height = b - t;
64         
65         final int count = getChildCount();
66         
67         int left, top;
68         int col, row;
69         
70         int gap = (width - column * mMaxChildWidth) / (column + 1);
71         
72         for (int i = 0; i < count; i++) {
73             final View child = getChildAt(i);
74 
75             row = (int) Math.floor( (double)i / column);
76             col = i % column;
77 
78             left = l + (col + 1) * gap + col * mMaxChildWidth;
79             top = t + row * mMaxChildHeight;
80             
81             
82             child.layout(left, top, left + mMaxChildWidth, top + mMaxChildHeight);
83         }
84     }
85 
86 }

posted @ 2013-03-12 13:33 oathleo 阅读(1553) | 评论 (0)编辑 收藏

Objective-C 类声明,定义,实例,初始化

Objective-C中,调用方法被称为发送消息 ,通知对象执行某种操作。语法如下:[shape draw]

一、类声明(接口):

@interface TestCoop : NSObject {
    int iMonth;
    int iYear;
    int iDay;
}

- (void) setYear: (int) iYear;
- (void) primalSetData: (int)iYear :(int)iMonth :(int)iDay;
- (void) setData: (int)Year iMonth:(int)iMonth iDay:(int)iDay;
- (void) displayDateInfo;

@end

1、前面的短线/- 表示这是Objective-C方法的声明,用来区分函数原型(C语言中)与(Objective—C中)方法声明的方式。短线后面是方法的返回类型/比如( void) ,位于圆括号中。

1.1 注意,方法的声明在括号后面,@end之前 {}区域里只有变量的定义,这点和C++很不一样。

2、返回类型后面自然是函数名字,和C语言一样的,不同的是参数声明方法

2.1、无参数的函数后面不需要加括号和冒号,直接是函数名结束加分号,比如: - (void) displayDateInfo;

2.2、有参数的后面加冒号和参数类型名字,比如:

- (void) setDay: (int) iDay; //单个参数
- (void) primalSetData: (int)iYear :(int)iMonth :(int)iDay;//多个参数

objective还提供一种中缀符的语法,方法的名称和参数都是和在一起的:

参数前面多加一个标识符,通常和变量名一样,如下:

- (void) setData: (int)Year iMonth:(int)iMonth iDay:(int)iDay;//多个参数

苹果推荐使用第二种方法,虽然繁琐点。

二、类实现:

@implementation TestCoop
- (void) displayDateInfo{
    NSLog(@"Today is: %d.%d.%d\n", iYear, iMonth, iDay);
}

- (void) setYear: (int) year{
    iYear = year;
}

- (void) primalSetData: (int)year :(int)month :(int)day{
    iYear = year;
    iMonth = month;
    iDay = day;    
}

- (void) setData: (int)year iMonth:(int)month iDay:(int)day{
    iYear = year;
    iMonth = month;
    iDay = day;
}

1、注意:类的方法实现部分函数参数不能和声明部分一样,就是不能和类变量同名,否则会隐藏初始变量。

比如:- (void) setYear: (int) year{ //right
    iYear = year;
}

改成和声明时一样的话,如下:- (void) setYear: (int) iYear{ //error
    iYear = iYear;
}

明显出问题了,xcode编译会报warnging,就是初始变量被隐藏,其实本质就是变量作用域的问题,你局部变量和类变量名字一样,

当然访问不到了。

根由:声明的时候Objective-C喜欢用类变量的名字来代替函数参数名,不知道为啥,真是个纠结的问题。(要是从声明的时候就不用,就OK了,也不用到定义时再去改,不知道苹果那样做的理由)。

三、实例化对象

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here...
    //NSLog(@"%d-,%s %@\n", 12, "hel123lo", @"123");
    
    TestCoop *ptest = [TestCoop new]; 
    [ptest primalSetData :2009 :03 :05];
    [ptest displayDateInfo];
    [ptest setData:2010 iMonth:06 iDay:06];
    [ptest displayDateInfo];
    [ptest setYear:1987];
    [ptest displayDateInfo];
    [pool drain];
    return 0;
}

运行后会输出如下信息:

Today is: 2009.3.5

Today is: 2010.6.6

Today is: 1987.6.6

通过向需要创建对象的类发送new消息,可以创建各个对象。

然后向对象发送各种消息来操作对象。

//类的初始化

不过,cocoa习惯使用alloc和init来创建对象,而不是new

使用alloc来分配内存,并使用init来初始化,会将这块内存全部清0,bool型为NO,int型为0,指针为nil

上面的创建对象代码改成如下:

TestCoop *ptest = [[TestCoop alloc] init];

 

posted @ 2013-02-26 10:30 oathleo 阅读(619) | 评论 (0)编辑 收藏

解决刷新rom后log功能默认屏蔽问题:
Logger
C:\Users\Leo>adb shell
shell@android:/ $ su
su
 
1|shell@android:/ # mount -o remount, rw /system
mount -o remount, rw /system
shell@android:/ # echo ANDROIDLOGGER >> /system/etc/tweaks.conf
echo ANDROIDLOGGER >> /system/etc/tweaks.conf
shell@android:/ # mount -o remount, ro /system
mount -o remount, ro /system
shell@android:/ #

posted @ 2013-02-21 13:47 oathleo 阅读(283) | 评论 (0)编辑 收藏

一.Java源码在用Ant脚本打成jar之后,再被调用时,Eclipse代码提示中方法的参数名称是无意义的(arg0、arg1)

解决办法:使用ibm/eclipse的编译器

二.使用ibm/eclipse的编译器也会有一些方法 参数语法提示名称是无意义
估计可能是ibm的java编译器的bug, 
只要方法中含有synchronized 代码块
就会导致这种情况
有兴趣的同学可以研究下

解决办法:把相应代码块提取到方法,让方法synchronized



posted @ 2013-01-17 09:39 oathleo 阅读(2088) | 评论 (1)编辑 收藏

MappedByteBuffer是java nio引入的文件内存映射方案,读写性能极高。NIO最主要的就是实现了对异步操作的支持。其中一种通过把一个套接字通道(SocketChannel)注册到一个选择器(Selector)中,不时调用后者的选择(select)方法就能返回满足的选择键(SelectionKey),键中包含了SOCKET事件信息。这就是select模型。
    SocketChannel的读写是通过一个类叫ByteBuffer(java.nio.ByteBuffer)来操作的.这个类本身的设计是不错的,比直接操作byte[]方便多了. ByteBuffer有两种模式:直接/间接.间接模式最典型(也只有这么一种)的就是HeapByteBuffer,即操作堆内存 (byte[]).但是内存毕竟有限,如果我要发送一个1G的文件怎么办?不可能真的去分配1G的内存.这时就必须使用"直接"模式,即 MappedByteBuffer,文件映射.
     先中断一下,谈谈操作系统的内存管理.一般操作系统的内存分两部分:物理内存;虚拟内存.虚拟内存一般使用的是页面映像文件,即硬盘中的某个(某些)特殊的文件.操作系统负责页面文件内容的读写,这个过程叫"页面中断/切换". MappedByteBuffer也是类似的,你可以把整个文件(不管文件有多大)看成是一个ByteBuffer.MappedByteBuffer 只是一种特殊的 ByteBuffer ,即是ByteBuffer的子类。 MappedByteBuffer 将文件直接映射到内存(这里的内存指的是虚拟内存,并不是物理内存)。通常,可以映射整个文件,如果文件比较大的话可以分段进行映射,只要指定文件的那个部分就可以。

三种方式:
              FileChannel提供了map方法来把文件影射为内存映像文件: MappedByteBuffer map(int mode,long position,long size); 可以把文件的从position开始的size大小的区域映射为内存映像文件,mode指出了 可访问该内存映像文件的方式:READ_ONLY,READ_WRITE,PRIVATE.                     
a. READ_ONLY,(只读): 试图修改得到的缓冲区将导致抛出 ReadOnlyBufferException.(MapMode.READ_ONLY)
 b. READ_WRITE(读/写): 对得到的缓冲区的更改最终将传播到文件;该更改对映射到同一文件的其他程序不一定是可见的。 (MapMode.READ_WRITE)
c. PRIVATE(专用): 对得到的缓冲区的更改不会传播到文件,并且该更改对映射到同一文件的其他程序也不是可见的;相反,会创建缓冲区已修改部分的专用副本。 (MapMode.PRIVATE)

三个方法:

a. fore();缓冲区是READ_WRITE模式下,此方法对缓冲区内容的修改强行写入文件
b. load()将缓冲区的内容载入内存,并返回该缓冲区的引用
c. isLoaded()如果缓冲区的内容在物理内存中,则返回真,否则返回假

三个特性:

    调用信道的map()方法后,即可将文件的某一部分或全部映射到内存中,映射内存缓冲区是个直接缓冲区,继承自ByteBuffer,但相对于ByteBuffer,它有更多的优点:

a. 读取快
b. 写入快
c. 随时随地写入

下面来看代码:

package study;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

public class MapMemeryBuffer {

    public static void main(String[] args) throws Exception {
        ByteBuffer byteBuf = ByteBuffer.allocate(1024 * 14 * 1024);
        byte[] bbb = new byte[14 * 1024 * 1024];
        FileInputStream fis = new FileInputStream("e://data/other/UltraEdit_17.00.0.1035_SC.exe");
        FileOutputStream fos = new FileOutputStream("e://data/other/outFile.txt");
        FileChannel fc = fis.getChannel();
        long timeStar = System.currentTimeMillis();// 得到当前的时间
        fc.read(byteBuf);// 1 读取
        //MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
        System.out.println(fc.size()/1024);
        long timeEnd = System.currentTimeMillis();// 得到当前的时间
        System.out.println("Read time :" + (timeEnd - timeStar) + "ms");
        timeStar = System.currentTimeMillis();
        fos.write(bbb);//2.写入
        //mbb.flip();
        timeEnd = System.currentTimeMillis();
        System.out.println("Write time :" + (timeEnd - timeStar) + "ms");
        fos.flush();
        fc.close();
        fis.close();
    }

}

运行结果:
14235
Read time :24ms
Write time :21ms
我们把标注1和2语句注释掉,换成它们下面的被注释的那条语句,再来看运行效果。
14235
Read time :2ms
Write time :0ms
可以看出速度有了很大的提升。MappedByteBuffer的确快,但也存在一些问题,主要就是内存占用和文件关闭等不确定问题。被MappedByteBuffer打开的文件只有在垃圾收集时才会被关闭,而这个点是不确定的。在javadoc里是这么说的:
A mapped byte buffer and the file mapping that it represents remain valid until the buffer itself 
is garbage-collected.

这里提供一种解决方案:
AccessController.doPrivileged(new PrivilegedAction() {
  public Object run() {
    try {
      Method getCleanerMethod = buffer.getClass().getMethod("cleaner", new Class[0]);
      getCleanerMethod.setAccessible(true);
      sun.misc.Cleaner cleaner = (sun.misc.Cleaner)
      getCleanerMethod.invoke(byteBuffer, new Object[0]);
      cleaner.clean();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }
});

posted @ 2013-01-05 10:49 oathleo 阅读(1117) | 评论 (0)编辑 收藏

NIO

     摘要: java.nio.ByteBuffer-------------------------------Capacity 缓冲区最大容量Limit 当前最大使用量,或者说是有效数据的EOF位置。Position 指向当前位置的指针-----------------------------------假设一个缓冲区容量是10,开始指针指向0,即position=0。然后写入...  阅读全文

posted @ 2013-01-04 11:18 oathleo 阅读(268) | 评论 (0)编辑 收藏

仅列出标题
共17页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last