咖啡伴侶

          呆在上海
          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 

          根據(jù)上面的例子我們可以看到,反斜杠 \ 可以在常量表達式中作為多行的連接符使用。


          格式化說明符

          在格式化字符串里,%d 用于格式化整數(shù)(%x 和 %X 用于格式化 16 進制表示的數(shù)字),%g 用于格式化浮點型(%f 輸出浮點數(shù),%e 輸出科學計數(shù)表示法),%0d 用于規(guī)定輸出定長的整數(shù),其中開頭的數(shù)字 0 是必須的。

          %n.mg 用于表示數(shù)字 n 并精確到小數(shù)點后 m 位,除了使用 g 之外,還可以使用 e 或者 f,例如:使用格式化字符串 %5.2e 來輸出 3.4 的結果為3.40e+00

          posted @ 2013-07-30 08:45 oathleo 閱讀(182) | 評論 (0)編輯 收藏

          包是結構化代碼的一種方式:每個程序都由包(通常簡稱為 pkg)的概念組成,可以使用自身的包或者從其它包中導入內容。

          如同其它一些編程語言中的類庫或命名空間的概念,每個 Go 文件都屬于且僅屬于一個包。一個包可以由許多以 .go 為擴展名的源文件組成,因此文件名和包名一般來說都是不相同的。

          你必須在源文件中非注釋的第一行指明這個文件屬于哪個包,如:package main。package main表示一個可獨立執(zhí)行的程序,每個 Go 應用程序都包含一個名為 main 的包。


          如果需要多個包,它們可以被分別導入:

          import "fmt" import "os" 

          或:

          import “fmt”; import “os” 

          但是還有更短且更優(yōu)雅的方法(被稱為因式分解關鍵字,該方法同樣適用于 const、var 和 type 的聲明或定義):

          import (     "fmt"     "os" )

          可見性規(guī)則

          當標識符(包括常量、變量、類型、函數(shù)名、結構字段等等)以一個大寫字母開頭,如:Group1,那么使用這種形式的標識符的對象就可以被外部包的代碼所使用(客戶端程序需要先導入這個包),這被稱為導出(像面向對象語言中的 public);標識符如果以小寫字母開頭,則對包外是不可見的,但是他們在整個包的內部是可見并且可用的(像面向對象語言中的 private )。


          你可以通過使用包的別名來解決包名之間的名稱沖突,或者說根據(jù)你的個人喜好對包名進行重新設置,如:import fm "fmt"。下面的代碼展示了如何使用包的別名:

          Example 4.2 alias.go

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

          函數(shù)里的代碼(函數(shù)體)使用大括號 { } 括起來。

          左大括號 { 必須與方法的聲明放在同一行,這是編譯器的強制規(guī)定,否則你在使用 gofmt 時就會出現(xiàn)build-error: syntax error: unexpected semicolon or newline before { 這樣的錯誤提示。


          一個函數(shù)可以擁有多返回值,返回類型之間需要使用逗號分割,并使用小括號 ( ) 將它們括起來,如:func FunctionName (a typea, b typeb) (t1 type1, t2 type2)

          posted @ 2013-07-30 08:44 oathleo 閱讀(203) | 評論 (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 閱讀(292) | 評論 (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();不用加"/"可以直接添加文件名。

          路徑中包含空格時,如果空格變?yōu)?%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();的參數(shù)可以為正確的URI,或者為URI格式的字符串;若字符串是非完整的URI格式,則創(chuàng)建失敗。java.net.URI返回的路徑中的空格以“空格”的形式出現(xiàn)方法為Thread.currentThread().getContextClassLoader().getResource("").toURI().getPath();但是Thread.currentThread().getContextClassLoader().getResource("").toURI().toString();則會以“%20”的形式出現(xiàn)。java.net.URL返回的一切路徑中的空格都是以“%20”的形式出現(xiàn)。URL/URI返回的路徑分隔符都是“/”(控制臺輸出"/")。


          3、new File(String filePath);接受正確URI格式的參數(shù)和帶“空格”(非%20)的正確相對/絕對字符串路徑,否則即使給的路徑是正確的也會出現(xiàn)找不到文件的異常。File返回的路徑分隔符都為“\”(控制臺輸出"\"),對于存在的文件返回的路徑字符串,空格都以"空格"出現(xiàn),而不存在的路徑new出的file,getPath()返回的路徑中的空格,仍是new File(String filePath)的參數(shù)中原有的形式,即若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 包中的類總是根據(jù)當前用戶目錄來分析相對路徑名。此目錄由系統(tǒng)屬性 user.dir 指定,通常是 Java 虛擬機的調用目錄。這就是說,在使用java.io包中的類時,最好不要使用相對路徑。否則,雖然在SE程序中可能還算正常,但是到了EE程序中,可能會出現(xiàn)問題。

          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 閱讀(309) | 評論 (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     //列數(shù)
          11     private int column = 0;
          12     //是否自定義列數(shù)
          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         // 每行個數(shù)
          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 閱讀(1566) | 評論 (0)編輯 收藏

          Objective-C 類聲明,定義,實例,初始化

          Objective-C中,調用方法被稱為發(fā)送消息 ,通知對象執(zhí)行某種操作。語法如下:[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方法的聲明,用來區(qū)分函數(shù)原型(C語言中)與(Objective—C中)方法聲明的方式。短線后面是方法的返回類型/比如( void) ,位于圓括號中。

          1.1 注意,方法的聲明在括號后面,@end之前 {}區(qū)域里只有變量的定義,這點和C++很不一樣。

          2、返回類型后面自然是函數(shù)名字,和C語言一樣的,不同的是參數(shù)聲明方法

          2.1、無參數(shù)的函數(shù)后面不需要加括號和冒號,直接是函數(shù)名結束加分號,比如: - (void) displayDateInfo;

          2.2、有參數(shù)的后面加冒號和參數(shù)類型名字,比如:

          - (void) setDay: (int) iDay; //單個參數(shù)
          - (void) primalSetData: (int)iYear :(int)iMonth :(int)iDay;//多個參數(shù)

          objective還提供一種中綴符的語法,方法的名稱和參數(shù)都是和在一起的:

          參數(shù)前面多加一個標識符,通常和變量名一樣,如下:

          - (void) setData: (int)Year iMonth:(int)iMonth iDay:(int)iDay;//多個參數(shù)

          蘋果推薦使用第二種方法,雖然繁瑣點。

          二、類實現(xiàn):

          @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、注意:類的方法實現(xiàn)部分函數(shù)參數(shù)不能和聲明部分一樣,就是不能和類變量同名,否則會隱藏初始變量。

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

          改成和聲明時一樣的話,如下:- (void) setYear: (int) iYear{ //error
              iYear = iYear;
          }

          明顯出問題了,xcode編譯會報warnging,就是初始變量被隱藏,其實本質就是變量作用域的問題,你局部變量和類變量名字一樣,

          當然訪問不到了。

          根由:聲明的時候Objective-C喜歡用類變量的名字來代替函數(shù)參數(shù)名,不知道為啥,真是個糾結的問題。(要是從聲明的時候就不用,就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

          通過向需要創(chuàng)建對象的類發(fā)送new消息,可以創(chuàng)建各個對象。

          然后向對象發(fā)送各種消息來操作對象。

          //類的初始化

          不過,cocoa習慣使用alloc和init來創(chuàng)建對象,而不是new

          使用alloc來分配內存,并使用init來初始化,會將這塊內存全部清0,bool型為NO,int型為0,指針為nil

          上面的創(chuàng)建對象代碼改成如下:

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

           

          posted @ 2013-02-26 10:30 oathleo 閱讀(628) | 評論 (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 閱讀(292) | 評論 (0)編輯 收藏

          一.Java源碼在用Ant腳本打成jar之后,再被調用時,Eclipse代碼提示中方法的參數(shù)名稱是無意義的(arg0、arg1)

          解決辦法:使用ibm/eclipse的編譯器

          二.使用ibm/eclipse的編譯器也會有一些方法 參數(shù)語法提示名稱是無意義
          估計可能是ibm的java編譯器的bug, 
          只要方法中含有synchronized 代碼塊
          就會導致這種情況
          有興趣的同學可以研究下

          解決辦法:把相應代碼塊提取到方法,讓方法synchronized



          posted @ 2013-01-17 09:39 oathleo 閱讀(2093) | 評論 (1)編輯 收藏

          MappedByteBuffer是java nio引入的文件內存映射方案,讀寫性能極高。NIO最主要的就是實現(xiàn)了對異步操作的支持。其中一種通過把一個套接字通道(SocketChannel)注冊到一個選擇器(Selector)中,不時調用后者的選擇(select)方法就能返回滿足的選擇鍵(SelectionKey),鍵中包含了SOCKET事件信息。這就是select模型。
              SocketChannel的讀寫是通過一個類叫ByteBuffer(java.nio.ByteBuffer)來操作的.這個類本身的設計是不錯的,比直接操作byte[]方便多了. ByteBuffer有兩種模式:直接/間接.間接模式最典型(也只有這么一種)的就是HeapByteBuffer,即操作堆內存 (byte[]).但是內存畢竟有限,如果我要發(fā)送一個1G的文件怎么辦?不可能真的去分配1G的內存.這時就必須使用"直接"模式,即 MappedByteBuffer,文件映射.
               先中斷一下,談談操作系統(tǒng)的內存管理.一般操作系統(tǒng)的內存分兩部分:物理內存;虛擬內存.虛擬內存一般使用的是頁面映像文件,即硬盤中的某個(某些)特殊的文件.操作系統(tǒng)負責頁面文件內容的讀寫,這個過程叫"頁面中斷/切換". MappedByteBuffer也是類似的,你可以把整個文件(不管文件有多大)看成是一個ByteBuffer.MappedByteBuffer 只是一種特殊的 ByteBuffer ,即是ByteBuffer的子類。 MappedByteBuffer 將文件直接映射到內存(這里的內存指的是虛擬內存,并不是物理內存)。通常,可以映射整個文件,如果文件比較大的話可以分段進行映射,只要指定文件的那個部分就可以。

          三種方式:
                        FileChannel提供了map方法來把文件影射為內存映像文件: MappedByteBuffer map(int mode,long position,long size); 可以把文件的從position開始的size大小的區(qū)域映射為內存映像文件,mode指出了 可訪問該內存映像文件的方式:READ_ONLY,READ_WRITE,PRIVATE.                     
          a. READ_ONLY,(只讀): 試圖修改得到的緩沖區(qū)將導致拋出 ReadOnlyBufferException.(MapMode.READ_ONLY)
           b. READ_WRITE(讀/寫): 對得到的緩沖區(qū)的更改最終將傳播到文件;該更改對映射到同一文件的其他程序不一定是可見的。 (MapMode.READ_WRITE)
          c. PRIVATE(專用): 對得到的緩沖區(qū)的更改不會傳播到文件,并且該更改對映射到同一文件的其他程序也不是可見的;相反,會創(chuàng)建緩沖區(qū)已修改部分的專用副本。 (MapMode.PRIVATE)

          三個方法:

          a. fore();緩沖區(qū)是READ_WRITE模式下,此方法對緩沖區(qū)內容的修改強行寫入文件
          b. load()將緩沖區(qū)的內容載入內存,并返回該緩沖區(qū)的引用
          c. isLoaded()如果緩沖區(qū)的內容在物理內存中,則返回真,否則返回假

          三個特性:

              調用信道的map()方法后,即可將文件的某一部分或全部映射到內存中,映射內存緩沖區(qū)是個直接緩沖區(qū),繼承自ByteBuffer,但相對于ByteBuffer,它有更多的優(yōu)點:

          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 閱讀(1134) | 評論 (0)編輯 收藏

          NIO

               摘要: java.nio.ByteBuffer-------------------------------Capacity 緩沖區(qū)最大容量Limit 當前最大使用量,或者說是有效數(shù)據(jù)的EOF位置。Position 指向當前位置的指針-----------------------------------假設一個緩沖區(qū)容量是10,開始指針指向0,即position=0。然后寫入...  閱讀全文

          posted @ 2013-01-04 11:18 oathleo 閱讀(279) | 評論 (0)編輯 收藏

          僅列出標題
          共17頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 浙江省| 攀枝花市| 昌吉市| 科技| 樟树市| 衡东县| 辰溪县| 沙坪坝区| 山东| 皋兰县| 聂拉木县| 安陆市| 朝阳县| 仁布县| 湘乡市| 收藏| 庆阳市| 安远县| 深水埗区| 崇阳县| 海林市| 大姚县| 乌拉特后旗| 灵丘县| 尉氏县| 宣化县| 高邮市| 章丘市| 保山市| 教育| 库车县| 达日县| 青冈县| 巴林右旗| 即墨市| 容城县| 青海省| 增城市| 集安市| 泸西县| 鞍山市|