跳到主要內容

發表文章

What is phpize

What is phpize According to the PHP official document : The phpize command is used to prepare the build environment for a PHP extension. If you need to build such an extension that from github or another code repositories, you can use  build tools to perform the build manually. 
最近的文章

Ubuntu上的MySQL出現Can't create/write to file

最近遇到一個問題如下: /usr/sbin/mysqld: Can't create/write to file '/mysqltmp/ibXc3yTC' (Errcode: 13) 170619 3:32:30 InnoDB: Error: unable to create temporary file; errno: 13 170619 3:32:30 [ERROR] Plugin 'InnoDB' init function returned error. 170619 3:32:30 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed. 170619 3:32:30 [ERROR] Unknown/unsupported storage engine: InnoDB 170619 3:32:30 [ERROR] Aborting 追蹤流程: 先查 MySQL ErrorCode:13 發現是權限被拒,因此就是資料夾權限問題 這時查看一下權限 drwxrwxrwx 2 root root 4096 Jun 19 03 :33 mysqltmp 發現已經是 777 如果不是,就執行以下動作,mysqltmp是資料夾名哦 chown roor.roor mysqltmp chmod 777 mysqltmp  再執行一次,仍然不行,因此繼續找其他權限控制的軟體。 發現在 /etc/apparmor.d/usr.sbin.mysqld 有權限限制的設定 因此就在此檔案裡加上 /mysqltmp r, /mysqltmp/** rw, 接著重新載入設定檔 sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld 這時再啟動MySQL應該就會成功了 :D 參考資料: AppArmor

AndroidManifest的小技巧

當在設定推播時,在  AndroidManifest.xml  上需要指定不同application id時該怎麼辦呢?(可能會有xxx.yyy.com.debug與xxx.yyy.com兩個版本) 有個簡單的小技巧可以實現這件事情。 <permission android:name= "${applicationId}.permission.C2D_MESSAGE" android:protectionLevel= "signature" /> <uses-permission android:name= "${applicationId}.permission.C2D_MESSAGE" /> 參考資料: Using build types in Gradle to run same app that uses ContentProvider on one device

Android 6.0 權限問題

因為總總原因,直到現在才重視這個問題 首先根據 官方文件所述 : 在Android 6.0 (API level 23) 之後分成兩種權限 一般權限(Normal permissions) 危險權限(Dangerous permissions) 列出危險權限的列表 Permission Group Permissions CALENDAR READ_CALENDAR WRITE_CALENDAR CAMERA CAMERA CONTACTS READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS LOCATION ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION MICROPHONE RECORD_AUDIO PHONE READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS SENSORS BODY_SENSORS SMS SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS STORAGE READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE 不論一般權限與危險權限,都一樣必須在 AndroidManifest.xml 中使用 <uses-permission> 宣告 而最大的差異在於 危險權限必須另外執行請求權限的訊息框 。 附上在 Activity 實做的儲存權限範例: ... public final static int PERMISSION_CODE = 1 ; protected boolean isStoragePermissionGranted () { if (Build. VERSION . SDK_INT >= 23 ) { String permission = android. Man

Android 檢查GPS

首先要記得有取得GPS的權限 <uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION" /> 才能檢查GPS有無開啟的狀態 public boolean isGPSEnables () { LocationManager locationManager = (LocationManager) getSystemService(Context. LOCATION_SERVICE ); return locationManager. isProviderEnabled (LocationManager. GPS_PROVIDER ); } 純粹紀錄一下檢查GPS有無開啟的程式碼~

Java Semaphore 用途

老實說,這是第一次接觸到 Semaphore 之前也從來沒使用過,但當使用到他的時候才發現 在多執行緒時的控制,如果想要在某個情況下一次只執行一個執行緒(其實就是想做Lock動作) Semaphore 可以省下許多事情啊!以下列出簡單的範例code protected Semaphore isLock = new Semaphore( 1 ); // 限制同時只有1個在執行 ... new Thread ( new Runnable() { @Override public void run () { try { for ( int i = 0 ; i < 5 ; i++) { isLock. acquire (); // 會先印出open run1接著要等isLock.release(),才會再繼續印出 open run2 Log. e ( "Test" , "open run" + i); } } catch (Exception ex) { isLock. release (); } } }). start (); ... Button release = (Button)findViewById(R. id . release ); release. setOnClickListener ( new View. OnClickListener () { @Override public void onClick (View v) { isLock. release (); // 按下按鈕後才會繼續執行 } }); 參考資料: Semaphore

Android 呼叫 zxing QR code scanner

今天弄個簡單的範例是關於執行QR code掃描的部分 這個方法是直接呼叫 Barcode scanner 的方法 首先在 build.gradle 的 dependencies 加上 compile 'com.google.zxing:android-integration:3.2.1' dependencies { ... compile 'com.google.zxing:android-integration:3.2.1' } 呼叫的方式則是在 Activity or Fragment 中加入執行的程式 IntentIntegrator scanner = new IntentIntegrator(mActivity); scanner. initiateScan (); 要如何得到掃描的值呢?只要 override onActivityResult 就可以囉! @Override protected void onActivityResult ( int requestCode, int resultCode, Intent data) { super . onActivityResult (requestCode, resultCode, data); IntentResult scanner = IntentIntegrator. parseActivityResult (requestCode, resultCode, data); if (scanner != null ) { String code = scanner. getContents (); // 掃描得到的字串 String format = scanner. getFormatName (); // 掃描的格式, 如 QR_CODE } } 附上參考的 java doc Class IntentIntegrator Class IntentResult