2019-07-20

如果透過 windows batch command 來新增環境變數

我會有這個需求,主要是因為工作的地方有 AD 權限的管制,只要執行需要提升權限的程式時都需要請資訊部門的人來 key 管理帳密,但理論上 user 應該是對自己的東西有權限的,只是 windows 在叫出環境變數的地方是有小盾牌要提權的…所以我才想到使用 batch command 的方式。

batch command 的方式有分一般跟進階兩種
以下都以設定 JAVA_HOME 為例

一般:
set JAVA_HOME="xxxxxx\jdk-xxxx"
set PATH=%PATH%;%JAVA_HOME%\bin

進階:
setx JAVA_HOME "xxxxx\jdk-xxxx"
setx PATH "%PATH%;%JAVA_HOME%\bin"

一般之所以一般,是因為這個方式的有效時間只在那個作用視窗中,也就是你打開 cmd 後,下了那兩行指令,然後把 cmd 視窗關掉,這時就失效了,因為該方式並沒有寫到真正的環境變數裡面。

進階的方式就有了,視窗關掉後依然有效,甚至重開機都是有效的…
那要怎麼刪除?
這就比較麻煩了,如果只是要讓路徑失效,可以使用
setx JAVA_HOME ""
的方式…但 %JAVA_HOME% 這個變數還是存在,只是是空的,如果要刪除這個變數或請管理員來開環境變數的gui畫面來刪除,或者是用 reg delete 的方式,但這應該也要權限

如何在 Windows 讓 Apache 在一個 host 中,指定某個資料夾下的 php 是跑不同的版本

標題下的好像很怪…簡略說明一下

其實就是 Windows 下 Apache 跑 php-fpm (Fastcgi) - 使用 VirtualHost 這篇的另一個形式…我的目的還是要在一個 apache service 中跑不同版本的 php ;只是之前是使用 VirtualHost 來操作,但我現在是希望在一個 host …或者也可以理解為一個 VirualHost 下,不同的 Directory 可以跑不同的 php 版本,這樣我就不用換 VirualHost 的 domain:port ,只要切換 localhost/______/ 就好了。

前置作業說明:

  1. 跟之前一樣使用 xampp ,apache 2.4.39 x64 + php 7.3.7 x64,這是主要的,然後指定一個 localhost/php52 這個位置可以跑 php 5.2.17 x86
  2. 作不作 vhost 都無所謂,因為這一篇要的就是一個 host 就做到可以跑不同的 php 版本
  3. 如前一篇說的,因為此種方式已經算改了 xampp 的部份算大改了,所以會建議就不要讓 apache load httpd-xampp.conf 了,或者將 httpd-xampp.conf 中的每一行都用 # 註解起來

2019-07-18

Windows 下 Apache 跑 php-fpm (Fastcgi) - 使用 VirtualHost

因為工作需求…有些案子會需要用頗舊的 php 版本來跑,但我又不想在系統資源有限的測試機 (本機 windows 10 電腦,還不是server) 安裝一堆配合 php 的 apache 版本,然後又在那邊糾結 x86/x64 的,所以想到在 linux 上在用 nginx 時好像都是用 php-fpm 在跑 php ,而不是跟 apache 那樣在 loadmodule (難怪 nginx 比較輕量級),而且 loadmodule 會使用固定的 module name ,像 php7 是 php7_module, php5 是 php5_module …不同版本之間是還行,但同一個大版本之後想分載各個小版本會因為都是用同一個 module name 的關係會有衝突而載入失敗,所以最後在想比較簡單的方式…那就是讓 apache 也走類似 php-fpm 的 fastcgi 方式。
(為什麼說類似,因為好像 php-fpm 沒有 windows 版,而且好像 windows 的 php 中的 php-cgi.exe 就是為了讓 windows 有 php-fpm 而用的)

所以接下來有幾個重點,主要是要讓 apache 2.4.39 x64 在使用 VirtualHost 的情況下,讓走 80 port 跑 php 7.3.7 x64 ,而 8080 port 跑 php 5.2.17 x86

前置作業說明:

  1. apache 2.4.39 x64 + php 7.3.7 x64 我是用 xampp ,然後再去 php 網站找到 5.2.17 x86 回來放進 xampp 資料夾中
  2. 我不特別講 apache vhost 的設定,反正這個 google 一下資料就很多,所以下面的「操作」我是以 vhost 已經分別可以讓 80, 8080 的網頁服務執行成功的情況下來講的
  3. 因為我是分 80, 8080 來跑 vhost ,所以記得 httpd.conf 的 listen 要加 80, 8080

2019-07-15

使用 cordova-plugin-camera 後,在調用相機時會詢問相機權限


<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
放進 project-root/plugin/cordova-plugin-camera/plugin.xml 的「<user-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE />」之後

像這樣
        <config-file target="AndroidManifest.xml" parent="/*">
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
            <uses-permission android:name="android.permission.CAMERA" />
            <uses-feature android:name="android.hardware.camera" />
            <uses-feature android:name="android.hardware.camera.autofocus" />
        </config-file>

不過其實不特別加,我在測試時相機是可以正常開啟然後拍照的…我不確實是不是 cordova-plugin-camera 某個版本之後已經可以省略掉詢問相機權限的動作,但照上面的加確實在啟動相機前是會詢問權限的。

不過,其實我覺得應該是做在安裝 app 時會先告知本程式會使用哪一些權限,但我找不到應該怎麼寫是能在安裝 app 前就告知權限的方式,我是覺得應該是放在 project-root/config.xml 中,但…把上面的那個方式放進 config.xml 中在 build 時會 failed…

所以
todo:1 - 應該要找到是可以在安裝前就宣告權限的方法
todo:2 - 上面的方式不適用 PhoneGapBuild ,但相機仍可使用,但只會出現詢問儲存媒體的權限而已,所以可能也要想想 PhoneGapBuild 會詢問相機權限的方法

2019-07-14

如何要求 PhoneGap Build 在建置(build)專案時要求使用新一點的 android sdk 來建置

標題不太確定這樣用會不會怪,先主要說明一下狀況…

同事那有個案子的需求是要 app 在今年八月前更新內核 api 上 android 8(api 26) 和 ios 13(?…這我不確定,反正是要新一點的)。

但公司給的開發機,一支小米 4i 在不去刷 thirdparty rom 的情況下只能官方更新到 android 5 ,而一支 iphone 5 還 6 只能到 ios 10 ,所以我同事除了只能先發佈上架後請有支援比較新的系統的其他同事手機去試之外,他就想要在 mac mini 上來當作以後建置的環境。

mac mini 的操作和環境建置的問題先不論,主要是這個案子的 app 在之前的人在寫時是使用 phonegap 來開發,然後用 Adobe PhoneGap Build(以下簡稱 PGB) 來做線上建置(build)的。

但同事說他原本在 local 使用 cordova build android 的過程並沒有 fail ,然後將專案 zip 後上傳至 PBO 建置後的 app 在上架 google play 後,有測試的同事反應其中某個功能的相機是沒有反應的,同事讓我協助測試一下。

2019-07-04

有關 php 中 array_search() 會跳過陣列第一個元素 array[0] 的狀況

先說…這不是一個「問題 problem」,也不是一個「蟲 bug」,只是一個狀況。

再說…工作至今 (7/3) 滿一個月了…

ok

先舉個例子:

$a = array("a", "b", "c");
if(array_search("a", $a)) echo 'a 有存在 $a 中';
if(array_search("d", $a)) echo 'd 有存在 $a 中';
if(array_search("c", $a)) echo 'c 有存在 $a 中';

以印象,應該會在結果顯示「a 有存在 $a 中」跟「c 有存在 $c 中」才對吧?