Pages

2017年4月14日 星期五

awk string parsing uses shell variables

I need to parse user input parameters in shell file, so I do some research for it..

1.shell parameter format:
VAR=$(expr.)


2. awk function to replace string:  gsub("target string","replace string")
   sed way:                                      sed 's/target string/replace string/g'

3. awk use shell parameters : -v
   str1="shell value"
   echo awk -v S_RN=${str1} '{ print S_RN}'

Through 1 to 3 steps, we can use parameters from user input in awk function. 
See below example:
command line:
./test.sh "-i $RN -c -a"

test.sh:
RN=$RANDOM

FLAG=$(echo $1| awk -v S_RN=${RN} '{gsub("\$RN",S_RN);print}')

2017年4月7日 星期五

Java UI 元件透明

因為要JtabbedPane 的每個tab panel空出一個區塊統一去顯示Log訊息,所以把JtabbedPane的背景設為透明,讓每個tab panel都空出一個預設區塊去顯示Log panel.



JPanel 透明語法:
JPanel  trPanel = new JPanel ();
trPanel.setBackground(null);
trPanel.setOpaque(false);

JTabbedPane 透明語法:
UIManager.put("TabbedPane.contentOpaque", false);
JTabbedPane trTabbePane = new JTabbedPane();

JFrame 設定背景顏色:
JFrame jf = JFrame();
jf.getContentPane().setBackground(Color.RED);

2016年9月6日 星期二

Oracle Linux 6.8 in USB loader

使用 unetbootin 或 Universal-USB-Installer 都可以把 Oracle Linux 6.8的iso檔案燒入到USB。但是在安裝過程時會出現

Missing ISO 9660 Image

The installer has tried to mount image #1, but cannot find it on the hard drive.
Please copy this image to the drive and click Retry.
Click Exit to abort the installation.


解決辦法:
在使用上述工具把檔案寫入到USB完成後,要再把.iso檔案放到USB的root folder(就是直接放到USB裡面不用放到任何資料夾中)。
如此重新安裝後就可以順利完成。

2015年9月23日 星期三

[android] record video

        在專案中要使用 android 的 camera 來實作錄影與拍照功能. 雖然網路上有許多範例但是還是會遇到一些問題.

以下是使用Camera 必備的 Activity 架構
public class MainActivity extends Activity implements SurfaceHolder.Callback{

    private SurfaceView surfaceview;
    private MediaRecorder mediarecorder;
    private SurfaceHolder surfaceHolder;
    private Button startButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ...
    }

    @Override
    protected void onResume(){
        camera = Camera.open();
        if (phoneConfigure.orientation == Configuration.ORIENTATION_PORTRAIT)
            camera.setDisplayOrientation(90);
        super.onResume();
    }
 
    @Override
    protected void onPause(){
        camera.stopPreview();
        camera.setPreviewCallback(null);
        camera.release();
        super.onPause();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // TODO Auto-generated method stub
       Camera.Parameters parameters = camera.getParameters();
       parameters.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); 
  
       camera.setParameters(parameters);
       camera.startPreview();
    }
 
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
 
      // TODO Auto-generated method stub
      try {
  
          camera.setPreviewDisplay(surfaceHolder);
   
      } catch (IOException e) {
          // TODO Auto-generated catch block
          camera.release();
          camera = null;
          e.printStackTrace();
      }
    }
 
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
         // TODO Auto-generated method stub 
 
    }  

  
}

下面是錄影的相關重要程式碼

 public void startRecord(int videoWidth,int videoHeight){
 
 mediarecorder = new MediaRecorder();
  
 camera.stopPreview();  
 camera.unlock();
 mediarecorder.setCamera(camera);
 mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
 mediarecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
 mediarecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));
 mediarecorder.setVideoSize(videoWidth,videoHeight);
 if (phoneConfigure.orientation == Configuration.ORIENTATION_PORTRAIT)
     mediarecorder.setOrientationHint(90);
 mediarecorder.setOutputFile(createVideoFilePath(fileExtention));
 mediarecorder.setPreviewDisplay(surfaceHolder.getSurface());
  
 try {
     mediarecorder.prepare();
     mediarecorder.start(); 
 }catch (Exception e) {
     mediarecorder.stop();
     mediarecorder.release();
     e.printStackTrace();
     toast(e.getCause().toString());
 }
 }

 public void stopRecord(){
     if (mediarecorder != null) {
         mediarecorder.stop();
         mediarecorder.release();
         mediarecorder = null;
     }
 }
完整相關程式碼: Github

2015年9月8日 星期二

[android] external sdcard path 取得

 20171215:更新多種其他android手機SD path路徑方式
在 android 4.4版本之後 無法任意存取sd card的位置, 只能寫入與存取自己app 下的資料夾
 /Android/Data/<app-packagename>/
  ex: (/Android/Data/com.example.myapp/)

先利用 getExternalFilesDir(null);
可以自動在內部儲存空間和SD card創立 /Android/Data/<app-packagename>/ 資料夾

因為每個手機的sdcard 路徑都會不同
利用 System.getenv("SECONDARY_STORAGE"); 來取得sd card 的路徑 (ex, /storage/sdcard1/) 最後sdcard的路徑就可以寫成
getExternalFilesDir(null);
String path = System.getenv("SECONDARY_STORAGE") + "/Android/Data/com.example.myapp/";
android 6.0 SD card path
 private String androidMarshmallowSDcardPath() {
  String rootPath = null;
  File f = new File("/storage");
  if (f.isDirectory()) {
   String[] s = f.list();
   for (int i = 0; i < s.length; i++) {
    if(s[i].matches(".*-+.*")) {
     rootPath ="/storage/" + s[i];
     break;
    }else if(s[i].matches("exfat_uuid")) {// SONY Z3 SD card path name
     rootPath ="/storage/" + s[i];
     break;
    }
   }
  }
  return rootPath;
 }
如果把SD card 格式化成內部儲存空間,例如 HTC M8手機以上有支援此功能
SDcardPath = "/storage/emulated/0/Android/data/com.example.myapp/";
//SONY Xperia Miro
if(android.os.Build.MODEL.matches(".*ST23a+.*")) {
     SDcardPath = "/mnt/ext_card" +"/Android/data/com.phison.sdcardtest/";
}
相關permission
<uses-permission android:name="android.permissions.WRITE_EXTERNAL_STORAGE" />

2014年4月3日 星期四

ANDSF

ANDSF 全名為 Access Network Discovery and Selection Function,位於 EPC 系統中。可以幫UE 在 3GPP 與 non 3GPP(WiMax,Wi-Fi) 的網路 找出最好的連線品質,進行連線。也可以訂定不同的策略依照不同需求,進行offload動作。
這次要做的計畫內容,就是要針對UE做offload。
ANDSF主要架構如下:
  

  ANDSF 與 UE溝通的介面為S14 其大致的架構如下:

 

ISMP - 當UE在同一個時間只能連上一種網路(LAN or Cellular 網路)時,ANDSF會根據哪個網路負載量較少,而建議UE連上此網路
ISRP - 當UE在同一個時間可以連上多種網路(LAN or Cellular 網路)時,ANDSF 會根據不同應用程式的應用走不同路線
IARP - 可以根據所接受到的 IARP 路由策略以及 UE 的偏好設定來為某限定的IP flow選擇路由路徑, 該路由路徑必須是現有的active IP interface並且連結到一個指定的APN(3G和網際網路之間的gateway)
Discovery information - 找尋UE附近可以連上網路的訊息
Rule Selection Information - 當UE在做roaming 的時候和收到從HPLMN與VPLMN的ANDSF規則,如何選擇active 的 ISMP,ISRP,WLANSP
WLANSP - 要選擇哪個最適合UE的WLAN
Home Operator Preference information - 讓UE建立PDN的連線而不透過WLAN連上網路


IARP應該是計畫中比較要用到的元件。
在此詳細介紹一下IARP的細節元件:




在IARP中可以設定多個Rules,但一次只能用一個Rule,為'Active' IARP Rule。 此外當UE在Roaming時,ANDSF不會提供IARP給UE。
AddressType - IPv4 或 IPv6
StartSourceIP - IPflow 的 IP addresses 範圍第一個 IP address
EndSourceIP - IPflow 的 IP addresses 範圍最後一個 IP address
ProtocolType - IPv4 header 的 Protocol , IPv6 header 的 Next header
StartSourcePortNumber - IPflow 的 PortNumbers 範圍第一個 PortNumber
EndSourcePortNumber - IPflow 的 PortNumbers 範圍最後一個 PortNumber
Qos - 設定Qos 參數
DomainName - 目的地的網址
APN - APN的名稱 , 有<APN>的格式
Update Policy - UE 是否要更新IARP rule



ANDSF 與UE傳遞的格式為 XML ,所以現在要研究 Android 要如何 讀取 XML格式


參考自 3GPP TS24.312( R12), TS23.402( R12)

2013年12月2日 星期一

需要格式化磁碟機才能使用

最近外接硬碟莫名其妙在開啟時一直出現 「 需要格式化磁碟機才能使用 」 但是又不想真的格式化,不然裡面的檔案就找不回來了。
此時只好求助Google 幫忙了,底下就是解決方法:

 對命令提示字元按右鍵,選擇「以系統管理員身分執行」,之後輸入指令:
 chkdsk e: /f
 e 就是你的外接式硬碟的代號,你可以換成你自己的硬碟編號。
 
 
Blogger Templates