2020年12月28日 星期一

Redis Windows 版

Redis 官網,只提供 Linux 的版本。
但 Microsoft Open Tech 有提供 windows 版本
https://github.com/microsoftarchive/redis/releases
有.msi的安裝檔和免安裝的縮壓檔。

如果用安裝檔,安裝後,會將 Redis 設定成系統服務開機自動啟動,
安裝過程也可選擇是否加入系統 PATH 環境變數、記憶體限制、是否開放防火牆...

如果使用免安裝的縮壓檔,之後想設定成系統服務。
可參考資料夾下的說明文件範例:
安裝成系統服務
redis-server --service-install redis.windows-service.conf --loglevel verbose

移除安裝的系統服務
redis-server --service-uninstall

啟動
redis-server --service-start

停止
redis-server --service-stop

安裝並啟動三個獨立的Redis服務範例:
redis-server --service-install --service-name redisService1 --port 10001
redis-server --service-start --service-name redisService1
redis-server --service-install --service-name redisService2 --port 10002
redis-server --service-start --service-name redisService2
redis-server --service-install --service-name redisService3 --port 10003
redis-server --service-start --service-name redisService3



其他:
https://opensource.microsoft.com
https://github.com/microsoftarchive

2020年12月24日 星期四

Linux 網卡新增多個IP

CentOS,在一張名稱為 enp0s8 的網路卡,設定多個IP



方法一:
使用 ifconfig 指令動態新增IP(網卡重啟後失效)

#新增一個別名 enp0s8:xyz (較常見使用 enp0s8:0、enp0s8:1、...),用來設定新增的IP
$ ifconfig enp0s8:xyz 192.168.56.111/24 up
#關閉別名為 enp0s8:xyz 的設定
$ ifconfig enp0s8:xyz down



方法二:
使用 ip 指令動態新增(網卡重啟後失效)

#不設定別名,直接新增IP
$ ip addr add 192.168.56.111/24 dev enp0s8
#新增一個別名 enp0s8:xyz (較常見使用 enp0s8:0、enp0s8:1、...),用來設定新增的IP
$ ip addr add 192.168.56.111/24 dev enp0s8 label enp0s8:xyz
#刪除指定的IP設定
$ ip addr del 192.168.56.111/24 dev enp0s8 label enp0s8:xyz




方法三:
於原網路卡設定檔,參數加後綴,設定新增的IP

$ vi /etc/sysconfig/network-scripts/ifcfg-enp0s8
.......
###第1個新增的IP
IPADDR1=192.168.56.111
PREFIX1=24
###第2個新增的IP
IPADDR2=192.168.56.112
PREFIX2=24
重啟網路
$ systemctl restart network
或
$ ifdown enp0s8 ; ifup enp0s8;



方法四:
新增網路卡別名設定檔,設定新增的IP

$ vi /etc/sysconfig/network-scripts/ifcfg-enp0s8:xyz1
DEVICE="enp0s8:xyz1"
#/usr/share/doc/initscripts-9.49.53/sysconfig.txt
#ONBOOT="yes" #(not valid for alias devices; use ONPARENT)
ONPARENT="yes"
IPADDR="192.168.56.111"
PREFIX="24" #NETMASK=255.255.255.0
$ vi /etc/sysconfig/network-scripts/ifcfg-enp0s8:xyz2
DEVICE="enp0s8:xyz2"
#ONBOOT="yes" #(not valid for alias devices; use ONPARENT)
ONPARENT="yes"
IPADDR="192.168.56.112"
PREFIX="24" #NETMASK=255.255.255.0
啟用新增的網卡別名設定
$ ifup enp0s8:xyz1
$ ifup enp0s8:xyz2



參考:

AVD Manager 啟動Android模擬器出現 HAXM is not installed on this machine

問題: 
啟動 Android 模擬器,出現錯誤
「emulator: ERROR: x86_64 emulation currently requires hardware acceleration!
Please ensure Intel HAXM is properly installed and usable.
CPU acceleration status: HAXM is not installed on this machine」


解決:

  1. 確定 BIOS 中的「Intel Virtualization Technology」已開啟
  2. 確定 SDK Manager 中已安裝「 Exreas > intel x86 Emulator Accelerator(HAXM installer)」
  3. 到 「android-sdk\extras\intel\Hardware_Accelerated_Execution_Manager」資料夾下,
    執行
    silent_install.bat
    安裝 HAXM

    反安裝 HAXM
    silent_install.bat -u

    檢查是否已安裝 HAXM
    silent_install.bat -v

    檢查 VT/NX 支援
    silent_install.bat -c



參考:
https://www.itread01.com/p/2322.html
Android stdio 解決HAXM安裝不上問題



2020年12月9日 星期三

Node.js npm 安裝套件發生錯誤(operation not supported on socket, symlink)

環境:
將 windows 資料夾共用給 linux 虛擬機,
然後在 linux 上,於 windows 的共用資料夾下安裝 express

$ npm install express --save
npm WARN rollback Rolling back send@0.16.2 failed (this is probably harmless): ENOTEMPTY: directory not empty, rmdir '/home/web/win/aa/nodejs/node_modules/send'
npm WARN rollback Rolling back mime@1.4.1 failed (this is probably harmless): ENOTEMPTY: directory not empty, rmdir '/home/web/win/aa/nodejs/node_modules/mime'
npm WARN rollback Rolling back serve-static@1.13.2 failed (this is probably harmless): ENOTEMPTY: directory not empty, rmdir '/home/web/win/aa/nodejs/node_modules/serve-static'
npm WARN rollback Rolling back express@4.16.3 failed (this is probably harmless): ENOTEMPTY: directory not empty, rmdir '/home/web/win/aa/nodejs/node_modules/express'
npm WARN chat@0.0.1 No repository field.

npm ERR! path ../mime/cli.js
npm ERR! code ENOTSUP
npm ERR! errno -95
npm ERR! syscall symlink
npm ERR! nospc ENOTSUP: operation not supported on socket, symlink '../mime/cli.js' -> '/home/win/nodejs/node_modules/.bin/mime'
npm ERR! nospc There appears to be insufficient space on your system to finish.
npm ERR! nospc Clear up some disk space and try again.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2018-03-26T09_28_59_107Z-debug.log


解決:
因 windows 共享的資料夾不能建立符號連結(symlinks),所以須加上 --no-bin-links 參數
$ npm install express --no-bin-links --save


參考:




[使用 --no-bin-links  衍生的問題]
如果 在 linux 上掛載 windows 上的專案資料夾,在 linux 安裝時,不得已使用 --no-bin-links,雖可以順利安裝。但因為在 linux 上,node_modules/.bin 資料夾底下是檔案連結,連結到對應的實際套件底下,而掛載的 windows 無法建議檔案連結,所以 node_modules/.bin 底下會沒東西,若專案需要用到 node_modules/.bin 底下的檔案來執行,會無法運作。


參考:





2020年11月16日 星期一

HTML 上傳按鈕美化

方法:
  1. 隱藏原本的上傳按鈕,另外做一個按鈕。
  2. 點擊另外做的按鈕時,觸發原本上傳按鈕的點擊事件。
  3. 選擇完上傳檔案後,另外顯示選擇檔案的檔名。


[做法1]

用<label></label>標籤,讓另外做的按鈕能觸發原本上傳按鈕的動作。
<input id="xyzFileUp" class="xyzFileUp" type="file" name="ff" style="display:none">
<label for="xyzFileUp" class="xyzFileUpSel">選擇檔案(另外做的按鈕)</label>
<div class="xyzFileUpFileName">
未選擇檔案
</div>

<script>
//顯示選擇的上傳檔案檔名
$(".xyzFileUp").on("change", function () {
    var filePath = $(this).val();
    var arr = filePath.split('\\');
    var fileName = arr[arr.length - 1];
    $(".xyzFileUpFileName").html(fileName);
});
</script>


[做法2]
用JS,讓另外做的按鈕能觸發原本上傳按鈕的動作。
<input id="xyzFileUp" class="xyzFileUp" type="file" name="ff" style="display:none">
<div class="xyzFileUpSel">選擇檔案(另外做的按鈕)</div>
<div class="xyzFileUpFileName">
未選擇檔案
</div>

<script>
//觸發原本上傳按鈕
$('.xyzFileUpSel').click(function () {
    document.getElementById("xyzFileUp").click();
    //$("#xyzFileUp").click();
});
//顯示選擇的上傳檔案檔名
$(".xyzFileUp").on("change", function () {
    var filePath = $(this).val();
    var arr = filePath.split('\\');
    var fileName = arr[arr.length - 1];
    $(".xyzFileUpFileName").html(fileName);
});
</script>



參考:
css input[type=file] 样式美化,input上传按钮美化
自訂 Input File 檔案上傳按鈕 CSS 最佳解法﹍實作範例@WFU BLOG
html - Styling an input type="file" button - Stack Overflow
在網頁應用程式中使用本地檔案 - Web APIs | MDN::使用click() 方法隱藏檔案輸入元素
HTMLElement.click() - Web APIs | MDN