[VS2013][CI] 關於command line tool MSBuild.exe的筆記..

 

這一些主要是為了想學習架設  Jenkins,不過還沒整理完~先把這部分的整理出來….

  • [問題] 利用command line 的 MSBuild.exe 會發生錯誤 “error MSB8020: The builds tools for v120 (Platform Toolset = ‘v120’) cannot be found.”

    • 我也發現~就算你裝了 VS2013只要你有裝 VS2012 tool set你有可能會按倒 VS2012 command line tool,這時候的版本會出現  

      • msbuild.exe /version

        • 4.0.30319…
    • 解法: 首先要確認你執行是VS2013 command line tool或是執行 msbuild.exe 在  c:Program Fies(X86)MSBuild12.0Bin

    • 參考: http://public.kitware.com/Bug/view.php?id=14369

  • [問題]MSBuild去開始跑 *.sln 會出現 error MSB3779: The processor architecture of project being build “Any CPU” is not supported by referenced SDK ….

[Android] 關於相機程式的學習整理(1)

這裡整理了一些關於在Android寫相機App會產生的一些疑問,並且把自己寫好的程式整理出來放在Github上面.
這裡產生的相機功能主要如下:

  • 利用 Camera class產生相機的控制部分

  • 預覽的視窗

  • 拍照後可以讓Android系統預設的相簿觀看 

讓相機產生preview

1.將需要授權的相關部分放在”AndroidManifest.xml”

<uses-permissionandroid:name=”android.permission.CAMERA”/>

<uses-featureandroid:name=”android.hardware.camera.autofocus”/>

<uses-featureandroid:name=”android.hardware.camera”android:required=”false”/>

<uses-permissionandroid:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>

  1. 把需要的元件畫出來,需要一個SurfaceView跟一個Button,修改reslayoutactivity_main.xml

    <SurfaceView

        android:id=”@+id/surfaceView1”

        android:layout_width=”fill_parent”

        android:layout_height=”fill_parent”

        android:layout_alignParentBottom=”true”

        android:layout_alignParentLeft=”true”

        android:layout_alignParentRight=”true”>

    </SurfaceView>

 

    <Button

        android:id=”@+id/btn_capture”

        android:layout_width=”wrap_content”

        android:layout_height=”wrap_content”

        android:layout_alignRight=”@+id/surfaceView1”

        android:layout_below=”@+id/textView1”

        android:layout_marginRight=”18dp”

        android:layout_marginTop=”144dp”

        android:text=”Capture”/>

  1. 讓preview可以動作,這裡的code比較多,儘量寫清楚點

3.1 建立 相關原件

//Camera object

Camera mCamera;

//Preview surface

SurfaceView surfaceView;

//Preview surface handle for callback

SurfaceHolder surfaceHolder;

//Camera button

Button btnCapture;

//Note if preview windows is on.

booleanpreviewing;

3.2 連接原件修改原來的 OnCreate

@Override

  protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.activity_main);

 

  btnCapture = (Button) findViewById(R.id.btn_capture);

 

  surfaceView = (SurfaceView) findViewById(R.id.surfaceView1);

  surfaceHolder = surfaceView.getHolder();

 

  surfaceHolder.addCallback(new SurfaceViewCallback());

  surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

}

3.3 增加surface callback class讓surface自己來處理相關預覽的部分

private final class SurfaceViewCallback implements android.view.SurfaceHolder.Callback {   

public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) 

{

  if (previewing) {

    mCamera.stopPreview();

    previewing = false;

  }

 

  try {

    mCamera.setPreviewDisplay(arg0);

    mCamera.startPreview();

    previewing = true;

   } catch (Exception e) {}

}

public void surfaceCreated(SurfaceHolder holder) {

   mCamera = Camera.open();

   // get Camera parameters

   Camera.Parameters params = mCamera.getParameters();

 

   List focusModes = params.getSupportedFocusModes();

   if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {

    // Autofocus mode is supported

  }

}

 

public void surfaceDestroyed(SurfaceHolder holder) {

  mCamera.stopPreview();

  mCamera.release();

  mCamera = null;

  previewing = false;

  }

}

 

  1. 這樣就可以看到完整的camera preview,接下來就要implement 拍照後的一些處理

4.1 實作出拍照的功能

  btnCapture.setOnClickListener(new Button.OnClickListener() {

     public void onClick(View arg0) {

     if (previewing)

         mCamera.takePicture(shutterCallback, rawPictureCallback,jpegPictureCallback);

   }

  });

4.2 實作camera.takePicutre 的callback function

 先接起來button click listener

btnCapture.setOnClickListener(new Button.OnClickListener() {

  public void onClick(View arg0) {

  if (previewing)

    mCamera.takePicture(shutterCallback, rawPictureCallback, jpegPictureCallback);

  }

});

要把相關的 shutterCallback, rawPictureCallback加進去,最後記得要把jpegPictureCallback 弄好

ShutterCallback shutterCallback = new ShutterCallback() {

     @Override

     public void onShutter() {

   }

};

 

PictureCallback rawPictureCallback = new PictureCallback() {

     @Override

     public void onPictureTaken(byte[] arg0, Camera arg1) {

     }

};

這裡要注意,在jpegPictureCallback 中有幾件重要的事情

  • 將抓下來的部分存成檔案

    • 檔案目錄與檔名的選取,記得使用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)

    • 在檔案的存取方面,使用的是BufferedOutputStream來寫檔案~這裡大部分網路例子會先轉成 Bitmap 然後再轉成JPG,這裡要改

  • 利用 MediaScannerConnection 去連接MediaStore 來把你拍下來的照片通知給系統,讓系統的相簿可以抓到你的相片

 這部分的code 如下

PictureCallback jpegPictureCallback = new PictureCallback() {

@Override

   public void onPictureTaken(byte[] arg0, Camera arg1) {

      String fileName = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString()

                        + File.separator

                        + “PicTest_” + System.currentTimeMillis() + “.jpg”;

      File file = new File(fileName);

      if (!file.getParentFile().exists()) {

          file.getParentFile().mkdir();

       }

 

      try {

             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));

             bos.write(arg0);

             bos.flush();

             bos.close();

             scanFileToPhotoAlbum(file.getAbsolutePath());

             Toast.makeText(MainActivity.this, “[Test] Photo take and store in” + file.toString(),Toast.LENGTH_LONG).show();

        } catch (Exception e) {

                Toast.makeText(MainActivity.this, “Picture Failed” + e.toString(),Toast.LENGTH_LONG).show();

        }

    };

};

 

public void scanFileToPhotoAlbum(String path) {

 

        MediaScannerConnection.scanFile(MainActivity.this,

                new String[] { path }, null,

                new MediaScannerConnection.OnScanCompletedListener() {

 

                    public void onScanCompleted(String path, Uri uri) {

                        Log.i(“TAG”, “Finished scanning “ + path);

                    }

                });

這樣就完成了,完整的程式放在Github   

https://github.com/kkdai/Android_Camera_Sample

[MetroApp][C#] 利用程式來動態的修改圖片 (Change Metro/Store App image source via code)

其實應該是不難,只是一直很難找到正確的解答.可能是WPF,Windows Phone與Store App會有不同的結果,稍微記錄一下.

需求:
在Windows Store App中,有些圖片,希望可以用程式的方式來決定讀取的方式.

解法:

找了半天,不論是

<code style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;font-family:Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif;"><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pln">img1</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">.</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#2b91af;background-position:initial initial;background-repeat:initial initial;" class="typ">Source</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">=</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#00008b;background-position:initial initial;background-repeat:initial initial;" class="kwd">new</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#2b91af;background-position:initial initial;background-repeat:initial initial;" class="typ">BitmapImage</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">(</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#00008b;background-position:initial initial;background-repeat:initial initial;" class="kwd">new</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#2b91af;background-position:initial initial;background-repeat:initial initial;" class="typ">Uri</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">(</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#800000;background-position:initial initial;background-repeat:initial initial;" class="str">"ms-appx:///Assets/Common_Pic/image2.png"</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;" class="pun">,</span><span style="margin:0;padding:0;border:0;font-size:13.63636302948px;vertical-align:baseline;background-color:transparent;color:#2b91af;background-position:initial initial;background-repeat:initial initial;" class="typ">UriKi</span></code>

甚至也把URI 換成 System.Uri也是不行.

後來找到這篇文章才終於搞定Load Image Dynamically From Application Uri in Windows Store Apps

步驟寫一下:

  • 首先千萬記得把你要變動的圖片記得讀進project 中,內容可以設定為 content. 檔案方式可以用成copy if newer

  • 之前主要失敗的原因是,檔案在那個時候其實還沒有完全讀完畢,所以需要用 StorageFile 來讀取

  • 記得讀取檔案是 async 的動作,所以得用 await 強制它讀完繼續執行

  • 最後再把檔案用BitmpImage包起來並且傳給 image.Source

完整程式碼可參考底下~或是去看鏈結

 

參考:

[C++溫故知新]關於Macro, Inline 與 Define

繼續不斷地學習,不斷的回復自己的記憶

  • #define 在compiler階段就會展開,所以要確認清楚他的展開方式,比如

          #define M1(x)  X5+3
          M1(5)
5 ==>  55+35 =>   (55)+(35) = 40

  • 他可以不止一行~對於只有一行的if 判斷要小心  if(a)  staement Macro(b) ,  Macro(b) b++; b—; 在此~ b–將會跑不到. 怕失誤要加上 {} 或是改成 inline function

  • 參數有 # 會加上  escape character,也就是  “  —>  ”

  • #define值並不會有值~也就是  

       #define FOO1
       #ifdef FOO1
      .. statement1
      #endif
       跟  if (FOO1 == 0) 是不同 (其實這樣會compiler error)

  • 如果要#define 一個數字~要換成常數 (constant)     exam: #define FOO 5.3

    • 如果只有一個檔案要用,改成 static const  FOO = 5.3;

    • 多個檔案  extern const FOO= 5.3;

    • CPP裡面  const FOO=5.3;

  • 當專案大的時候,由於 .h 會被很多的檔案載入~所以define macro  不建議放在 .h 容易被其他人用到(或是override)

  • 建議寫在.c 或是 .cpp 並且在用完之後馬上  #undef 避免被蓋掉(override)

詳細code整理我放這裡: https://gist.github.com/kkdai/9014911

參考資料:

 

[Survey] 一些關於Docker.io的筆記

Docker Logo

主要注意到這個是因為meetup上面的活動
開始去查一下關於Docker的內容,但是由於它能做的事情太多了.我也只貼出一些我所了解的部分

  • Docker可以將PAAS裡面的OS或是App拆解成container並且快速讀取或是執行

    • 整個速度大概是一秒就載入完成
  • Docker 也可以run某一種單一app的結果~比如ping或是 bash

  • Docker的 image在寫回去前都會保持原樣~所以可以快速地使用並且安全得保存

    • 如同下面影片,你可以載入bash大膽的把 /etc /bin 都刪除~然後離開~馬上再載入..
  • 甚至可以把整個PAAS載入後加上你的修改來看結果.

這裡可以去官方網站玩demo

相關資料:

[Android]一些關於android apk部署小筆記

記錄一下,最近的一些小筆記

  • 關於Android App安裝到device上面:(在Win8上面)

    • 如果要註冊非官方授權的device(比如說大陸貼牌device)

    • 需要去[裝置管理員]把裝置例項路徑中把VID抄起來(ex:1D06)

    • 把資料抄到 ADT裡面的 SDKExtragoogleusb_driverandroid_winusb.inf

    • 滑鼠移到右下角,選擇[變更電腦設定]

    • [更新與復原]->[復原]->[進階啟動] 來重開機

    • 將裝置管理員裡面無法認識的裝置驅動程式選到 剛剛那個檔案android_winusb.inf

    • 如此一來可以把裝置識別出來為 [Android通用裝置]

    • 到 user_data/.android/adb_usb.ini

      • 注意:  如果因為android SDK 更新這個動作需要重新做一次
    • 把裝置新增上去起來 比如 0x1D06

    • 重啟Eclipse~就能正常讀取

  • 用Eclipse 把App裝到android裝置上面(手機/平板)

    • 使用Adb command line

      • [File]->[Export] 成 api

      • 這時候會設定你的私密金鑰

      • 輸出後使用 adb來安裝

      • adb install helloworld.apk

      • 可以先用 adb devices 確認裝置有讀取到

      • 或是使用 adb kill-server 來強迫重新讀取裝置

  • 開啟Android 專案出現 [invalid project description]

    • 這時候不能使用 Add Android using exist code

    • using  [import]->[general]->[Existing Project into workspace]來載入

  • 相關資料: