2020年9月6日 星期日

jQuery Datepicker 增加清除按鈕

原本 jQuery Datepicker 的操作按鈕面板(showButtonPanel: true),只有「Today」、「Done」,兩個按鈕。
沒有清空日期的按鈕,只能於input上,將選擇的日期手動清除。
$(".test").datepicker({
    dateFormat: "yy-mm-dd",
    showOn: "both",
    buttonImageOnly: true,
    showButtonPanel: true,
    buttonImage: "img/calendar.png"
});


此處增加「Clear」按鈕,用來清空選擇的日期。

方法一:
參考 https://stackoverflow.com/a/15799622
將「Done」按鈕,修改成為清空的效果。缺點是「Done」按鈕不見了。

$(".test").datepicker({
    dateFormat: "yy-mm-dd",
    showOn: "both",
    buttonImageOnly: true,
    showButtonPanel: true,
    closeText: 'Clear',
    onClose: function (dateText, inst) {
        if ($(window.event.srcElement).hasClass('ui-datepicker-close')) {
            document.getElementById(this.id).value = '';
        }
    },
    buttonImage: "img/calendar.png"
});


方法二:
參考 https://stackoverflow.com/a/6941440https://stackoverflow.com/a/28045758
另外新增一個「clear」按鈕。

//另外新增一個clear按鈕
function datepickerAddClearBtn() {
        var old_fn = $.datepicker._updateDatepicker;
        $.datepicker._updateDatepicker = function (inst) {
        old_fn.call(this, inst);
        var buttonPane = $(this).datepicker("widget").find(".ui-datepicker-buttonpane");

        $("<button type='button' class='ui-datepicker-clean ui-state-default ui-priority-primary ui-corner-all'>Clear</button>").appendTo(buttonPane).click(function (ev) {
            $.datepicker._clearDate(inst.input);//清除選擇的日期
            $.datepicker._hideDatepicker();//關閉Datepicker
        });
    };
}
datepickerAddClearBtn();

$(".test").datepicker({
    dateFormat: "yy-mm-dd",
    showOn: "both",
    buttonImageOnly: true,
    showButtonPanel: true,
    buttonImage: "img/calendar.png"
});




其他:
jQuery-Timepicker-Addon 附加套件上亦適用


2020年8月14日 星期五

PHP 找出字串中不可見的字元

匯入資料時,發現資料長度,跟肉眼看到的不一樣。
此時資料中可能有不可見的字符,要看到這些字元,有個簡便的方式,
先用 json_encode() 函式處理,便可看到原本看不到的字元。
多字節的 Unicode 字元,也會轉成 \u**** 的 Unicode Code Point 格式,可看到字元在 Unicode 字元集中的編號。

情況一:
字串"test",長度4,但匯入時,長度卻為7,比看到的多了 3(使用strlen計算字算長度)。
用 json_encode() 處理後,出現 "\ufefftest",前面多了「\ufeff」
「\ufeff」:是檔案的 BOM


情況二:
字串"1234",長度4,但匯入時,長度卻為10,比看到的多了 6(使用strlen計算字算長度)。
用 json_encode() 處理後,出現 "\u202d1234\u202c",前面多了「\u202d」,後面多了「\u202c」
網上查到以下兩種情況可能會發生
1.在 iphone 通訊錄,複製電話號碼(我沒iphone,就沒試了)
 參考:iOS通讯录复制的手机号码字符串多了奇怪的unicode码\\u0000202d-\\u0000202c_lnking1992的专栏-CSDN博客_通讯录号码复制有特殊字符
2.excel 中複製欄位資料(我測試沒試出來)
參考:记一次编码导致的问题:\\u202d和\\u202c_fan3394565的博客-CSDN博客_\\u202c

前後不可見的字元分別是,LRO、PDF
「\u202e」:RLO,Unicode控制字符,開始從右到左的文字
「\u202d」:LRO,Unicode控制字符,開始從左到右的文字
「\u202c」:PDF,Unicode控制字符,結束上一次定義


[將不可見的特殊字元去除]
因為都剛好在字串前後,我就直接只用 trim() 處理
trim($str, " \t\n\r\0\x0B\u{feff}\u{202d}\u{202c}");
//" \t\n\r\0\x0B"為 trim 預設就會去除的特殊字元

BOM「\ufeff用16進位表示為\xef\xbb\xbf
也可寫成
trim($str, " \t\n\r\0\x0B\xef\xbb\xbf\u{202d}\u{202c}");


其他:
\u{****}寫法,PHP7才支援,也可用 json_decode 將 Unicode Code Point  轉回。
var_dump(json_decode('"\u202d"'));
var_dump(json_decode('"\u9999"'));


參考:
关于Unicode控制字符RLO,LRO,PDF 的坑 - scgaopan的个人空间 - OSCHINA
Unicode codepoint 轉譯語法
碼位 - 維基百科,自由的百科全書
php - UTF-8 to Unicode Code Points - Stack Overflow
PHP - 使用PHP將Unicode字符轉換為“\ uxxxx”格式 | php Tutorial




2020年8月10日 星期一

windows 使用內建指令計算檔案雜湊值

網路上下載檔案時,有的會提供檔案校驗碼(checksum),
裡面可能有 MD5、SHA256、......,各種雜湊演算法,計算出來的檔案雜湊值(Hash Value)

windows 內建了 certutil 指令,可用計算檔案的各種雜湊值
例如:
計算 D:\test.iso 檔案的 SHA256 雜湊值
certUtil -hashfile D:\test.iso SHA256


參考:
certutil | Microsoft Docs
https://superuser.com/a/898377
有趣的命令行系列——才被黑客重視的命令certutil - 每日頭條


2020年8月9日 星期日

CentOS 7 安裝 GitLab

到官網 https://about.gitlab.com/install/
有相對應的作業系統安裝說明 https://about.gitlab.com/install/#centos-7
這邊安裝的版本是 gitlab-ce 13.2.2

安裝(設定nginx SSL憑證,使用 HTTPS 連線)
  1. 安裝依賴的的套件
    $ yum install -y curl policycoreutils-python openssh-server
    
    
  2. 啟動 SSH 服務
    $ systemctl enable sshd
    $ systemctl start sshd
    
  3. 防火牆開啟網頁要用的PORT網頁
    這邊開 9000 PORT,預計當 HTTPS PORT
    //firewall-cmd --permanent --add-service=http
    //firewall-cmd --permanent --add-service=https
    $ firewall-cmd --permanent --zone=public --add-port=9000/tcp
    $ systemctl reload firewalld
    $ firewall-cmd --list-all --zone=public
  4. 安裝 SMTP Server (Postfix)
    使用者註冊、初次修改密碼、忘記密碼使用
    $ yum install postfix
    $ systemctl enable postfix
    $ systemctl start postfix
  5. 安裝 GitLab 套件的yum儲存庫(repo)
    有兩個版本,CE社群版(Community Edition),EE企業版(Enterprise Edition)
    Community Edition or Enterprise Edition | GitLab
    這邊安裝 CE 版,若要安裝 EE 版,將指令中的「ce」改成「ee」即可
    $ curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
  6. 使用 yum 指令安裝 GitLab 套件,GitLab 自帶很多會用到的其他套件(nginx、puma、...)
    我在2G RAM虛擬機器上須安裝時,跑很久都沒跑完,記憶體被吃光。
    後來看到官網建議要4G RAM,改成4G RAM才在可忍受的時間安裝完畢。
    $ yum install -y gitlab-ce
  7. 預計使用 HTTPS 加密連線,先產生 nginx 使用的 SSL 憑證
    (這邊選擇用自己發的憑證,若有合法網域,可略過此步驟,GitLab 會自動申請Let's Encrypt的憑證)
    $ mkdir /etc/gitlab/ssl
    $ chmod 755 /etc/gitlab/ssl
    $ openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/gitlab/ssl/nginx.key -out /etc/gitlab/ssl/nginx.crt
  8. 修改 GitLab 設定檔 gitlab.rb,設定網頁訪問用的外部網址,與設定 nginx 使用的SSL憑證
    $ vi /etc/gitlab/gitlab.rb
    external_url 改為要瀏覽的網址
    external_url 'https://192.168.0.100:9999'

    修改 GetLab 自帶 Nginx 的 ssl_certificate、ssl_certificate_key 設定
    預設為
    # nginx['ssl_certificate'] = "/etc/gitlab/ssl/#{node['fqdn']}.crt"
    # nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/#{node['fqdn']}.key"
    改為
    nginx['ssl_certificate'] = "/etc/gitlab/ssl/nginx.crt"
    nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/nginx.key"
    若沒改,預設會取得 external_url 設定中的網域,自動向 Let's Encrypt 申請憑證
    但如果設定的網域是自訂的,或設定的是IP,無法申請 Let's Encrypt 認證的憑證
    所以這邊選擇設定自發憑證的位置

    更新GitLab服務設定
    $ gitlab-ctl reconfigure
    執行 gitlab-ctl reconfigure  後,即可使用 external_url 設定的網址訪問
    (若出現 502 錯誤,可稍等一下,我測試 gitlab-ctl reconfigure 一跑玩,馬上試,出現502,似乎相關服務還沒重新跑)

    若依然出現502錯誤
    502-Whoops, GitLab is taking too much time to respond
    檢查 GetLab 自帶且目前啟動的服務中(gitlab-ctl status),有哪些可能是 PORT 跟系統原本的服務相衝突了
    可在 /etc/gitlab/gitlab.rb 中修改各服務使用的 PORT
    (自帶的 Nginx 使用的PORT,依 external_url 設定的網址而定)
  9. 安裝成功,系統預設有一個 root 帳號,瀏覽 external_url 設定的網址
    會出現設定root密碼的畫面,設定後,即可用 root 登入
  10. 若為自發的HTTPS憑證,則專案的git config須設定 http.sslVerify false才能存取
    $ git config [--global] http.sslVerify false


其他:
  1. GitLab專案儲存庫(repositories),存放位置修改
    例如,改到 /home/git-data
    $ mkdir /home/git-data
    #參考原本repositories資料夾位置 /var/opt/gitlab/git-data 權限,做了一樣的修改(雖然官網說明沒寫)
    $ chown git.root /home/git-data
    $ chmod 700 /home/git-data
    修改 gitlab.rb 設定檔中的 git_data_dirs 設定,改為新的資料夾位置路徑
    $ vi /etc/gitlab/gitlab.rb
    git_data_dirs({
      "default" => {"path" => "/home/git-data"}
    })
    讓設定生效
    $ gitlab-ctl reconfigure
    若原本repositories 已有資料,可用以下操作移到新位置
    $ gitlab-ctl stop
    # Note there is _no_ slash behind 'repositories', but there _is_ a
    # slash behind 'git-data'
    $ rsync -av /var/opt/gitlab/git-data/repositories /home/git-data/
    $ gitlab-ctl upgrade
    $ gitlab-ctl start
  2. GitLab 關閉開放自行註冊帳號
    管理者登入後 > Admin Area > General > Sign-up restrictions >Sign-up enabled
  3. GitLab 關閉SSH,只通過https存取
    管理者登入後 > Admin Area > General > Visibility and access controls > Enabled Git access protocols
  4. 相關指令
    gitlab-ctl reconfigure   # 更新GitLab服務設定
    gitlab-ctl restart       # 重新啟動GitLab
    gitlab-ctl status        # 檢視GitLab服務狀態
    gitlab-ctl tail          # 查看GitLab服務執行期間的log
    gitlab-ctl stop nginx    # 停止GitLab自帶的nginx
    gitlab-ctl start nginx   # 啟動GitLab自帶的nginx

參考:
https://docs.gitlab.com/omnibus/settings/nginx.html#manually-configuring-https
https://docs.gitlab.com/omnibus/settings/configuration.html#storing-git-data-in-an-alternative-directory
https://docs.gitlab.com/omnibus/package-information/defaults.html



2020年7月31日 星期五

win10 音量圖示打不開

win10 系統更新重開機後,點擊右下角音量喇叭圖示,卻打不開音量控制介面,
只能到系統音訊設定中調整音量。

以前遇到這情況,都是重開機解決。
若不想重開機,可打開「工作管理員」->「處理程序」->在「Windows 檔案總管」上按右鍵,出現選單->「重新啟動」。


如此,工作列重新啟動,音量圖示重新載入後,也許就能恢復正常。