2012年9月19日 星期三

Android 開發筆記 - 取得 Mac Address 和 IP Address

網路服務常需要拿 IP 或 MAC Address 來做存取管控。筆記一下。


權限:


<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>


程式碼:


public static String getMacAddress(Context context) {
       WifiManager wifiMan = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
       WifiInfo wifiInf = wifiMan.getConnectionInfo();
       return wifiInf.getMacAddress();
}


public static String getIPAddress(Context context) {
       WifiManager wifiMan = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
       WifiInfo wifiInf = wifiMan.getConnectionInfo();
       long ip = wifiInf.getIpAddress();
       if( ip != 0 )
              return String.format( "%d.%d.%d.%d",
                     (ip & 0xff),
                     (ip >> 8 & 0xff),
                     (ip >> 16 & 0xff),
                     (ip >> 24 & 0xff));
       try {
              for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
                     NetworkInterface intf = en.nextElement();
                     for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                            InetAddress inetAddress = enumIpAddr.nextElement();
                            if (!inetAddress.isLoopbackAddress()) {
                                   return inetAddress.getHostAddress().toString();
                            }
                     }
              }
       } catch (Exception e) {
        }
       return "0.0.0.0";
}


2012年9月18日 星期二

[Linux] 讓 GitWeb 的 Owner 顯示支援 Gitolite 的 Creator @ Ubuntu 12.04

最近裝了 3 次 Git + Gitweb + Gitolite ,最後就順手稍微修改 Gitweb 。由於 Gitolite 可以 remote create repos ,因此想要讓 Gitweb 顯示誰建立了 repo 。而 Gitolite 會在 repo 中建立一個 gl-creator 檔案記錄誰建立的,所以只需修改 Gitweb 顯示 owner 的片段程式即可。


目前用的 gitweb 版本:


$ sudo dpkg -l | grep gitweb
ii gitweb 1:1.7.9.5-1 fast, scalable, distributed revision control system (web interface)


修改片段:


$ sudo vim /usr/share/gitweb/index.cgi
sub git_get_project_owner {
       my $project = shift;
       my $owner;


       return undef unless $project;
       $git_dir = "$projectroot/$project";


       if (!defined $gitweb_project_owner) {
              git_get_project_list_from_file();
       }


       if (exists $gitweb_project_owner->{$project}) {
              $owner = $gitweb_project_owner->{$project};
       }
       if (!defined $owner){
              $owner = git_get_project_config('owner');
       }
       if (!defined $owner) {
              if( open(GLCreator, "$git_dir/gl-creator" ) ) {
                     $owner = '';
                     while(<GLCreator>) {
                            $owner .= $_;
                     }
                     close(GLCreator);
              }
       }
       if (!defined $owner) {
              $owner = get_file_owner("$git_dir");
       }


       return $owner;
}


2012年9月17日 星期一

Android 開發筆記 - 匯入圖片至模擬器中

gallery_apps


雖然 Android 開發是用實機才是王道,但有時就是想偷懶看模擬器跑的如何,這時就仍需要模擬器的環境。如果要處理照片、影片的應用時,就需要匯入一些圖片影片來測試。一開始若直接用 adb shell 或 DDMS push 資料至模擬器時,會顯示 failed to copy: Read-only file system:


$ adb push test.png /sdcard/
failed to copy 'test.png' to '/sdcard//test.png': Read-only file system


這時因為 / 目錄為 Read-Only file system,需要稍微處理一下:


$ adb shell mount -o remount rw /sdcard


接著就可以 DDMS 或 adb shell 匯入資料:


$ adb push images/ /sdcard/
push: images/1.png -> /mnt/sdcard/1.png
push: images/2.png -> /mnt/sdcard/2.png
push: images/3.png -> /mnt/sdcard/3.png
push: images/4.png -> /mnt/sdcard/4.png
push: images/5.png -> /mnt/sdcard/5.png


然而,匯入後仍無法被系統偵測,無論是寫程式還是開 Gallery app 也都一樣,但只需跑一下模擬器內建軟體 Dev Tools > Media Scanner 後,即可解決。


簡易的取出系統內所有 image 方式:


Cursor imgcursor = managedQuery(
       MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
       { MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID }, // columns
       null,
       null,
       MediaStore.Images.Media._ID // order by
);
if( imgcursor != null ) {
       int count = imgcursor.getCount();
       int media_data_index = imgcursor.getColumnIndex(MediaStore.Images.Media.DATA);
       int media_id_index = imgcursor.getColumnIndex(MediaStore.Images.Media._ID);
       for( int i=0 ; i<count ; ++i ) {
              imgcursor.moveToPosition(i);
              String path = imgcursor.getString(media_data_index);
              Bitmap thumbnail = MediaStore.Images.Thumbnails.getThumbnail( getApplicationContext().getContentResolver(), media_id_index, MediaStore.Images.Thumbnails.MICRO_KIND, null);
              System.out.println("path :"+path);
       }
}


用 Intent  開啟單張圖片:


Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"Pictures"), 1);


依檔案型態開啟對應程式:


Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://" + path), "image/*");
startActivity(intent);


[Linux] 編譯 WebKitGtk+ @ Ubuntu 12.04

WebKitGtk+


順手記一下要裝的東西:


$ sudo apt-get install bison g++ flex gperf libjpeg-dev libpng-dev libglib2.0-dev libicu-dev libxml2-dev libpango1.0-dev libgail-3-dev libxt-dev libgl1-mesa-dev libsoup2.4-dev libsqlite3-dev libxslt-dev libgeoclue-dev libgstreamer-plugins-base0.10-dev


$ wget http://webkitgtk.org/releases/webkit-1.8.3.tar.xz
$ tar -xvf webkit-1.8.3.tar.gz
$ cd webkit-1.8.3
$ ./configure
$ make 


2012年9月15日 星期六

iOS 開發筆記 - 使用 Category 擴充 functions 與 variables

Category 對 Objective C 是一個很彈性的架構,它可以在不破壞 framework 架構下,彈性地新增一些好玩的 functions 和 variables。


以 UIImage 這個 class 來講,提供 getResizeImage 的函數:


@interface UIImage (MyLib)


- (UIImage *)getResizeImage:(CGSize)size;


@end


@implementation UIImage (MyLib)

- (UIImage *)getResizeImage:(CGSize)size {
        return nil;
}

@end


如此一來,所有的 UIImage 物件都可以使用 [obj getResizeImage:CGSizeMake(width, height)]; 來產生新的縮圖。


然而,有時候則需要搭配一些 variables 來記錄一些狀態,這時就會想到 @property 和 @synthesize 的搭配,可惜的在 Category 狀態下無法使用 @synthesize 來實作,取而代之的是 @dynamic 並且自行實作 setter/getter 函數,如:


UIImage+MyLib.h:


#import <objc/runtime.h>
#import <Foundation/Foundation.h>

@interface UIImage (MyLib)


@property (nonatomic, retain) NSMutableDictionary *otherInfo;


- (UIImage *)getResizeImage:(CGSize)size;


@end


UIImage+MyLib.m:


#import "UIImage+MyLib.h"


@implementation UIImage (MyLib)


@dynamic otherInfo;


NSString * const kOtherInfo = @"kOtherInfo";


- (void)setOtherInfo:(NSMutableDictionary *)obj {
        objc_setAssociatedObject( self, kOtherInfo, obj, OBJC_ASSOCIATION_RETAIN);
}


- (NSMutableDictionary *)otherInfo {
        return objc_getAssociatedObject(self, kOtherInfo);
}


- (UIImage *)getResizeImage:(CGSize)size {
        if( self.otherInfo )  {
        }
        return nil;
}
@end


如此一來,就能好好使用自定的函數跟變數囉。


其他參考資料: