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 通訊錄,複製電話號碼
 參考: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「\u{feff}用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 檔案總管」上按右鍵,出現選單->「重新啟動」。


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




2019年11月23日 星期六

Linux sudo 設定檔 sudoers 寫法

通常要增加 sudo 使用者,可寫在 /etc/sudoers 設定檔中,
看 CentOS 7 的 /etc/sudoers 設定檔,最後會去讀取 /etc/sudoers.d/ 資料夾底下所有檔案
所以也可在 /etc/sudoers.d/ 另外新增檔案管理。

編輯設定檔,建議使用 visudo 指令,使用 visudo 指令,儲存時,會對語法格式做檢查。

直接編輯 /etc/sudoers 檔案,可不用指定檔案
$ visudo

編輯指定檔案,例如 /etc/sudoers.d/xyz
$ visudo -f /etc/sudoers.d/xyz

系統說明文件
$ man sudoers

sudo 使用者設定寫法
使用者帳號 登入者來源主機=(切換到哪個身分執行指令) 可執行的指令

範例1:
設定使用者 xyz,可用root身分執行所有指令操作
xyz ALL=(ALL) ALL

範例2:
使用 Cmnd_Alias 別名,將指令分類整理
Cmnd_Alias CMD_COMM = /bin/cd, /bin/ls, /bin/cat, /bin/less, /bin/tail, /bin/head, /bin/last, /bin/lastb
Cmnd_Alias CMD_SERVICE = /bin/systemctl
Cmnd_Alias CMD_NGINX = /bin/vi /etc/nginx/*, /bin/cp -i /etc/nginx/*, /bin/rm -i /etc/nginx/*, /bin/mv -i /etc/nginx/*, /bin/scp /etc/nginx/*
Cmnd_Alias CMD_PHP = /bin/vi /etc/php*, /bin/cp -i /etc/php*, /bin/rm -i /etc/php*, /bin/mv -i /etc/php*, /bin/scp /etc/php*
Cmnd_Alias CMD_HOME = /bin/vi /home/*, /bin/cp -i /home/*, /bin/rm -i /home/*, /bin/mv -i /home/*, /bin/scp /home/*, /bin/chown nginx\:nginx -R /home/*, /bin/chmod [0-9][0-9][0-9] /home/*

xyz ALL=(root) CMD_COMM, CMD_SERVICE, CMD_NGINX, CMD_PHP, CMD_HOME
如果指令包含「,」、「:」、「=」、「\」,這些特殊字元,須用「\」脫逸。
例如「/bin/chown nginx\:nginx -R /home/*」
除了Cmnd_Alias,其他可用的別名還有User_Alias、Runas_Alias、Host_Alias


參考:
非常Linux——sudoers文件的写法 - 让梦想从这里起飞…… - CSDN博客
sudo - Chown in sudoers file : Safe or not? - Server Fault
Sudoers Manual
如何让用户在Linux上使用sudoedit安全地编辑文件
Linux普通使用者無法使用sudo處理及sudoers設定 - IT閱讀