2011/11/30

android tablet是否支援openCL? 沒有啦...


官網 openCL 的支援產品表:
http://www.khronos.org/conformance/adopters/conformant-products/

android tablet是否支援openCL?
答案是否定的,

  • – 因為透過OpenCL整合CPU與GPU是尚未完全成熟的,
  • – 目前支援為X86系統而非嵌入式系統

來自癮科技:http://chinese.engadget.com/tag/OpenCL/

  • OpenCL是一項提供GPU與CPU協同運算的開放標準
  • 在AMD的規劃中,由於PC業界CPU與GPU整合已成趨勢,加上內建顯示效能逐步提昇,入門等級的GPU在進入HD 6000系列後,已經從獨立GPU的名單中,被下放到處理器整合的GPU內,例如目前市面上的C系列以及E系列APU,就分別使用HD 6200系列以及HD 6300系列的型號
  • A系列APU就是將AMD的主流CPU與主流GPU技術合而為一的產品

2011/11/24

linxux指令: 搜尋某檔名的檔案, 然後刪掉

假設要找的檔名關鍵字是”sensor”的話,
先透過find去找出這些檔案
再透過xargs承接這些檔案, 然後刪掉
find . -name "*sensor*" | xargs rm -rf

2011/11/23

Android APK反編譯 source code

最近解產品的issue時,
發現有時候手邊只有APK檔而無該APK的 source code …
其實在Android應用程式開發,
那個JAVA source是可以透過工具被反譯得到的
如果有興趣可以參考看看

有個網頁將步驟寫得很詳細: Android APK反编译详解(附图)
http://blog.csdn.net/sunboy_2050/article/details/6727581

編譯過程:
JAVA Source (*.java) -> JAVA BYTECODE (*.jar) -> DEX BYTECODE(*.dex)

反譯過程:
DEX BYTECODE(*.dex) ->JAVA BYTECODE (*.jar) -> JAVA Source (*.java)

2011/11/22

wordpress:文章排列依據的最後修改時間

wordpress預設的文章的顯示排列是按照發表的時間的

而有些時候,有些博主需要對以前的文章做一些修改,

這樣需要將修改的文章顯示到第一個位置,就需要按照修改的時間排序。

在index.php檔

方法簡單, 加入一行 query_posts(‘orderby=modified’); 在 if ( have_posts() )之前即可

< ?php query_posts('orderby=modified'); ? >< ?php if ( have_posts() ) : ?>		

2016/08/08更新:

這樣修改有個後遺症, 就是分頁文章會錯誤

不管 http://domain_name/page/2 或到 page/5

都只秀第一頁的資料…..

解決方法就是按照原本方式排序…

或可參考這篇文章解法

2011/11/16

線上追蹤查詢Linux原始碼: Linux Kernel Cross Reference

通常開發人員會透過自己下載的 source code 來追蹤(trace) 程式碼
但是如果身邊沒有source code要怎麼trace code呢

ANS: 只要上網就可以了
http://lxr.oss.org.cn/source/
Linux Kernel Cross Reference

2011/11/15

openCL 隨意看看

由於nvidia一直提到GPU的概念, 也積極推動GPU應該獨立於CPU之外的一個專門處理影像的單元! 現在也逐步看出效果, 而異質多核心概念也成為目前熱門話題

所謂異質多核心處理器就是, 不同架構的處理器要如何彼此合作分配工作達到更好的效率, openCL正式處理這樣異質多核心處理器的軟體架構框架


CPU+GPU Heterogeneous Computing (異質運算) :

使用者透過sw applicasation發出request
若是邏輯性強需要複雜運算的工作, 會交給CPU去處理
若是圖形相關需要大量密度高的單一性質工作, 則交由GPU處理


OpenCL提供了基於任務分割和資料分割的並列計算機制
因此這些多異質處理器之間該如何處理資料變成重要議題, 而openCL就是提供任務分割和資料分割的並列計算機制


越來越多application與處理器支援openCL
支援產品表查詢:
http://www.khronos.org/conformance/adopters/conformant-products/

AMD宣布業界在創新軟件應用上採用OpenCL標準的情況愈趨普遍。為止AMD與軟件公司緊密合作,協助他們優化通用平台上的應用程式,同時透過如AMD Fusion加速處理器(Accelerated Processing Unit,APU)等技術,為這些程式進一步加速。

由於軟件開發人員採納通用的應用程式編寫界面(APIs),讓軟件業界憑藉OpenCL標準固有的跨平台、跨作業系統和跨硬件供應商靈活的特點,令採用OpenCL標準的消費性和商業應用程式迅速發展。

下面是現時支援OpenCL,或在不久的將來加入支援OpenCL的領先應用程式實例:

DVD/媒體播放器

– ArcSoft :TotalMedia Theatre — 一體化影片播放軟件
– Corel :WinDVD — Blu-ray 和 DVD 播放軟件

網真及網絡視像鏡頭應用

– ArcSoft:Webcam Companion —網絡視像鏡頭高清及3D綜合應用
– ViVu:VuRoom — 多方桌面視像會議軟件
– ViVu :VuCast — 大規模視像網絡廣播軟件

影片製作/編輯軟件

– ArcSoft:ShowBiz — 影片編輯軟件
– Corel:Digital Studio — 整合多媒體軟件組合
– Corel:VideoStudio Pro — 高清影片編輯軟件
– Cyberlink:PowerDirector — 影片編輯軟件
– Sony:Vegas Movie Studio HD — 家庭影院高清影片編輯解決方案
– Sony:Vegas Pro — 專業的高清影片、音效及Blu – ray光碟製作解決方案

影片、照片特效、影像及效能

– ArcSoft:Panorama Maker Pro —相片及影片合併與媒體管理器
– eyeon:Fusion — 視覺特效與合成工具
– HP Labs:「每頁都與眾不同(Every Page Is Different)」的光柵圖像處理和千兆圖元實時影像應用,針對HP大尺寸、商業和工業打印解決方案
– Viewdle:Uploader — 照片面部識別軟件
– Viewdle:Video SDK — 影片開發面部識別軟件工具組合

影片轉換軟件

– ArcSoft:MediaConverter — 多媒體檔案轉換器
– Rovi:MainConcept Transcoding Platform — 專業轉碼應用程式
– Rovi:MainConcept H.264/AVC OpenCL — 編碼軟件開發工具組合

工程模擬軟件

– Altair Engineering:HyperWorks RADIOSS — 進行線性和非線性模擬有限元素分析(Finite Element Analysis,FEA)
– Dassault Systemes:產品生命週期管理(PLM)— 模擬及 CAD 軟件
– DEM Solutions:EDEM —分散式單元模型軟件解決方案,用於微粒流動模擬(Particle Flow Simulation)上
– ESI Group:PAM-CRASH 和 PAM-STAMP 2G 解決器 — 標準和生產流程數碼模擬軟件
– MSC Software:MSC Nastran — 通用有限元素(Finite Element)分析解決方案
– OPTIS:RTLab 和 VRLab — 實時光線追蹤軟件解決方案

在Linux中執行.sh時 異常/bin/sh^M: bad interpreter: No such file or directory

在Linux中執行.sh腳本
異常/bin/sh^M: bad interpreter: No such file or directory

分析:
這是不同系統編碼格式引起的:在windows系統中編輯的.sh文件可能有不可見字符,所以在Linux系統下執行會報以上異常信息。

解決:

1)在windows下轉換:
利用一些編輯器如UltraEdit或EditPlus等工具先將腳本編碼轉換,再放到Linux中執行。
轉換方式如下(UltraEdit):File-->Conversions-->DOS->UNIX即可

2)也可在Linux中轉換:
首先要確保文件有可執行權限
chmod a+x filename

然後修改文件格式
vi filename

利用如下命令查看文件格式
:set ff 或 :set fileformat

可以看到如下信息
fileformat=dos 或 fileformat=unix

利用如下命令修改文件格式
:set ff=unix 或 :set fileformat=unix

:wq (存檔退出)

最後再執行文件
./filename

2011/11/14

Git Server 簡易架設 - 使用SSH

http://shadowofisaac.blogspot.com/2011/05/git-server-ssh.html
這邊記錄了Git Server 利用SSH協定以及權限的架設流程
此方法較為快速,如果原本的Server上SSH是可以溝通的,那不到20分鐘就可以完成架設過程
但是缺點也是相對的明顯,因為利用了SSH權限,所以在專案的權限管理會有些麻煩,必須使用到Linux user的權限的權限管理。

P.S此篇目前只有可以run的流程而已,以後會新增更多有關git的文章

Server O.S: Ubuntu Server 10.04
Client O.S: Ubuntu Deaktop 10.04

所需條件:
1.當然最少區域網路要通(廢話 XD)
2.Terminal可以以SSH協定溝通


以下為Server端

第一步:
#apt-get install git-core
此為安裝git package,在Ubuntu系統需在最前方加上sudo指令,以super user權限執行

第二步:
#adduser git
新增git user

第三步:
#mkdir /home/git/test.git
在git家目錄下,新增專案資料夾,在此為test.git

第四步:
在test.git底下執行
#git –bare init

init為新增一個程式庫 或是 重新初始一個已經存在的程式庫
bare為指定現在工作的程式庫。


以下為client:

首先為push檔案的流程

第一步:
在要存放project的資料夾下,執行
#git init
新增.git資料夾
client 端所有git相關資料皆會在.git資料夾內,此資料夾為隱藏檔,須以ls -al指令才可看到

第二步:
#git add filename
新增要管理的檔案名稱

第三步:
#git commit -m ‘註解’
增加此專案之註解,註解須在’ ‘內

第四步:
#git remote add origin ssh://git@Server IP Address/home/git/test.git
設定上傳server IP、使用者名稱 以及資料夾位置
在此使用者名稱為git 資料夾位置為 /home/address/git/test.git
Server IP Address則須看自己Server IP
如果輸入錯誤,可以至/home/git/test.git/.git/config做修改

第五步
#git push origin master
將設定管理的檔案上傳,在此會要求輸入密碼,密碼即為當初新增使用者git的密碼

最後使用
#git clone ssh://git@Server IP Address/home/git/test.git
來將上傳完成的檔案下載,已驗證是否成功

P.S client端步驟為第一次新增管理專案才需執行 之後僅需使用git push、git commit、git pull、git add等指令即可操作

2011/11/10

android 燒image: usb read error (71): Protocol error

bootloader.bin sent successfully
waiting for bootloader to initialize
bootloader downloaded successfully
setting device: 2 3
creating partition: BCT
creating partition: PT
creating partition: EBT
creating partition: GP1
creating partition: SOS
creating partition: LNX
creating partition: APP
creating partition: CAC
creating partition: MSC
creating partition: USP

creating partition: UDA
creating partition: GPT
usb read error (71): Protocol error
Formatting partition 2 BCT please wait.. FAILED!
command failure: create failed

處理方法:
因為我是用usb供電
所以可能導致供電不穩定
現在裝上電池就解決了

2011/11/08

因為kernel.org被駭客 的repo fail

如果你也發生類似的問題
我想有可能是因為我想有可能是因為kernel.org被駭客了

android.git.kernel.org[0: 149.20.4.77]: errno=Connection refused
android.git.kernel.org[0: 2001:4f8:1:10:1972:112:1:0]: errno=Network is unreachable
fatal: unable to connect a socket (Network is unreachable)
error: Cannot fetch repo

處理方式:
編輯/home/[user]/bin/repo 檔Repo url:
#REPO_URL=’git://android.git.kernel.org/tools/repo.git’
REPO_URL=’https://github.com/android/tools_repo.git’

2011/11/01

Designing for Performance 筆記

 

 


Avoid Creating Unnecessary Objects

在 Dev Guide 裡還有另外一個重要的觀念:避免產生不必要的物件。這個觀念真的很重要,如果要讓程式的效能更好,不斷在 Main Thread 裡產生物件是 bad idea。原因是 Garbage Collection。

Android 的 Dalvik 虛擬機在初始化時,會建立 Main Thread。Main Thread 負責眾多任務,其中之一是 Garbage Collection,也就是負責做資源回收,把用不到的物件回收再利用。如果我們不斷在 Main Thread 裡產生物件,Main Thread 很可能忙著幫我們收拾垃圾,當 Main Thread 花費太多心思幫我們撿垃圾,處理其它工作的效率就會變差,例如:UI 事件處理。

所以,這告訴我們一個重要的觀念:「不要產生不必要的物件」,難怪 Dev Guide 在講「Designing for Performance」時,把這個觀念放在首位。有些 Class 在設計時,提供了多種 instantiate(實例化)方法,以 android.os.Message 為例,我們可以這樣做:

Message msg = new Message();

也可以這樣做:

Message msg = Message.obtain();

(From Jollen blog): http://www.jollen.org/blog/2011/05/android-leak-3-dont-create-unnecessary-object-in-main-thread.html

 

Prefer Static Over Virtual

If you don’t need to access an object’s fields, make your method static. Invocations will be about 15%-20% faster.

 

 

Avoid Internal Getters/Setters

for (int i = 0; i < this.getCount(); i++)

dumpItems(this.getItem(i))

在for迴圈作this.getCount()這種操作!很浪費!請先宣告個變數,再放到for迴圈裡面

Use Static Final For Constants

the constants go into static field initializers in the dex file it’s good practice to declare constants static final whenever possible.

Use Enhanced For Loop Syntax

static class Foo {
int mSplat;
}
Foo[] mArray = ...

public void zero() {
int sum = 0;
for (int i = 0; i < mArray.length; ++i) {
sum += mArray[i].mSplat;
}
}

public void one() {
int sum = 0;
Foo[] localArray = mArray;
int len​​ = localArray.length;

for (int i = 0; i < len; ++i) {
sum += localArray[i].mSplat;
}
}

public void two() {
int sum = 0;
for (Foo a : mArray) {
sum += a.mSplat;
}
}

zero()最慢,因為JIT並不能優化循環中每次迭代獲取數組長度的消耗。
one()快一點,因為一切都放入局部變量,避免了字段查找。只有在數組長度上提供了性能上的優勢。
two()在設備沒有JIT的時候最快,在有JIT的時候和one()大相徑庭。其使用了Java 1.5 介紹的增強型for循環語法。

總結:默認使用增強性for循環,但是考慮在關鍵性能地方使用傳統for循環來迭代ArrayList。

 

Consider Package Instead of Private Access with Private Inner Classes

考慮下面的類定義:

public class Foo {
private int mValue;

public void run() {
Inner in = new Inner();
mValue = 27;
in.stuff();
}

private void doStuff(int value) {
System.out.println("Value is " + value);
}

private class Inner {
void stuff() {
Foo.this.doStuff(Foo.this.mValue);
}
}
}

這裡需要指出的關鍵是我們定義的內部類可以直接訪問外部類的私有方法和私有實例字段,這是合法的,並且代碼將輸出期盼的值“Value is 27”。

但問題是,即使Java 語言允許內部類可以直接訪問外部類的私有成員,VM(虛擬機)認為從Foo$Inner類直接訪問Foo的私有成員是非法的,因為Foo和Foo$Inner是不同的類。為了彌補這樣的差距,編譯器生成了一對綜合的方法:
/*package*/ static int Foo.access$100(Foo foo) {
return foo.mValue;
}
/*package*/ static void Foo.access$200(Foo foo, int value) {
foo.doStuff(value);
}

當內部類需要訪問外部類的“mValue”或者“doStuff”方法時將調用這些靜態方法。上面的代碼就意味著使用了訪問方法替代了你直接訪問成員字段。之前我們提到了訪問器是如何的比直接訪問慢,所以這完全是一個因為語言習慣(idiom)導致的“不可見”性能損失。
我們可以通過為內部類訪問的字段或者方法定義為包可見而不是私有的。這樣將運行的更快並且會不再生成上面的代碼。 (遺憾的是,這也意味隻字段可以被同一個包中的其他類直接訪問,這樣與將所有字段聲明為private的做法背道而馳,再次提醒,如果你在設計定義公共的API,你應​​該小心考慮使用這種優化)。

Use Floating-Point Judiciously

As a rule of thumb, floating-point is about 2x slower than integer on Android devices.

Know And Use The Libraries

In addition to all the usual reasons to prefer library code over rolling your own

Use Native Methods Judiciously

Native code isn’t necessarily more efficient than Java.

 

#即時編譯(Just-in-time compilation,又稱為動態翻譯,是一種提高程序運行效率的方法。通常,程序有兩種運行方式:靜態編譯與動態直譯。 靜態編譯的程序在執行前全部被翻譯為機器碼,而直譯執行的則是一句一句邊運行邊翻譯。Just-in-time compilatio則混合了這二者,一句一句編譯原始碼,但是會將翻譯過的代碼緩存起來以降低性能損耗。相對於靜態編譯代碼,即時編譯的代碼可以處理延遲綁定並增強安全性。