/opt/python3.7/bin/python3.7: No module named pip

GCP Cloud Functions使用python3.7部署時出現以下錯誤訊息


錯誤訊息:

部署失敗:

Build failed: `pip_install_from_wheels` had stderr output:

/opt/python3.7/bin/python3.7: No module named pip

error: `pip_install_from_wheels` returned code: 1; Error ID: ECB5F712


解決方式:
換成
python3.8

使用者未具備的 iam.serviceAccounts.actAs 權限,因此無法建立函式

使用GCP Cloud Functions部署時出現以下錯誤訊息

錯誤訊息:

使用者未具備「XXXYYY@appspot.gserviceaccount.com」的 iam.serviceAccounts.actAs 權限,因此無法建立函式。如要解決這個問題,請執行以下指令:gcloud iam service-accounts add-iam-policy-binding xxxyyy@appspot.gserviceaccount.com --member=user:<user-email> --role=roles/iam.serviceAccountUser

要求 ID:1128406824938847386


解決方式:
步驟一
在已安裝Google Cloud SDK的開發電腦執行以下指令
gcloud iam service-accounts add-iam-policy-binding 服務帳戶@appspot.gserviceaccount.com --member=user:登入GCP帳號@gmail.com --role=roles/iam.serviceAccountUser --project=您的projectid


步驟二
瀏覽器重新整理GCP console網頁(一定要重新整理頁面!)

步驟三
重新部署

2021年3月17日 星期三

SQL Server全文檢索,CONTAINS和FREETEXT的差異

https://docs.microsoft.com/zh-tw/sql/relational-databases/search/query-with-full-text-search?view=sql-server-ver15

  • 若要比對單字和片語,請使用 CONTAINS 和 CONTAINSTABLE
  • 若要比對意義,而不是確切的用字,請使用 FREETEXT 和 FREETEXTTABLE

搜尋一個單字的「接近」單字

「近接字詞」表示彼此相近的單字或片語。 您也可以指定分隔第一個和最後一個搜尋詞彙之非搜尋詞彙的數目上限。 此外,您可以依任何順序或是您所指定的順序來搜尋字詞或片語。

例如,您要尋找其中有 "ice" 單字接近 "hockey" 單字,或 "ice skating" 片語接近 "ice hockey" 片語的資料列。

CONTAINS 和 CONTAINSTABLE

如需鄰近搜尋的詳細資訊,請參閱使用 NEAR 搜尋靠近另一個單字的字詞

搜尋一個單字的「接近」單字

「近接字詞」表示彼此相近的單字或片語。 您也可以指定分隔第一個和最後一個搜尋詞彙之非搜尋詞彙的數目上限。 此外,您可以依任何順序或是您所指定的順序來搜尋字詞或片語。

例如,您要尋找其中有 "ice" 單字接近 "hockey" 單字,或 "ice skating" 片語接近 "ice hockey" 片語的資料列。

CONTAINS 和 CONTAINSTABLE

如需鄰近搜尋的詳細資訊,請參閱使用 NEAR 搜尋靠近另一個單字的字詞

加權字詞搜尋的詳細資訊

在加權字詞搜尋中,「加權值」是表示每個單字與片語在一組單字與片語中的重要程度。 最小的加權值是 0.0,最大則為 1.0。

例如,在搜尋多個詞彙的查詢中,您可以指派每個搜尋單字的加權值,以指出它與搜尋條件中之其他單字的相對重要性。 這類型之查詢的結果會根據您指派給搜尋單字的相對加權,先傳回最相關的資料列。 結果集包含具有任何指定之詞彙的文件或資料列 (或它們之間的內容)。不過,因為與不同搜尋詞彙相關聯的加權值具有變化,所以某些結果會被視為比其他結果更相關。

CONTAINSTABLE 支援加權字詞搜尋。

2021年3月14日 星期日

利用MySQL全文搜尋的BOOLEAN MODE排除某些字元

目的:
搜尋java字元時,須排除JavaScript和Javanese

參考以下這邊文章
https://medium.com/@changhengliou/%E7%94%A8mysql-fulltext-search%E5%BB%BA%E7%AB%8B%E7%B0%A1%E6%98%93%E6%90%9C%E5%B0%8B%E5%BC%95%E6%93%8E-80659c28ec19
先到https://dumps.wikimedia.org/enwiki/latest/下載enwiki-latest-pages-articles.xml.bz2
(繁中 https://dumps.wikimedia.org/zhwiki/latest/ )
使用bzip2 -d enwiki-latest-pages-articles.xml.bz2指令解壓縮後
再用wikiextractor匯出成json格式(需要執行很久)
指令wikiextractor --json /wikidump/rawdata/enwiki-latest-pages-articles.xml
再用原作者的工具sqlgen匯入MySQL資料庫(需要執行很久)








SELECT `url` ,`title` , `text`
FROM `PagesArticles20210302`
WHERE MATCH(`title`, `text`) AGAINST ('Java' IN NATURAL LANGUAGE MODE)
AND
MATCH(`title`, `text`) AGAINST ('>eclipse >netbean -javaese -javanese -JavaScript'  IN BOOLEAN MODE);
-- 說明: -javanese:表示排除這個字元;>eclipse表示增加這個字元權重;< xxyy表示減少這個字元權重

ref:
https://dev.mysql.com/doc/refman/8.0/en/fulltext-boolean.html

2021年3月4日 星期四

MySQL 8.0預設密碼加密方式由原本mysql_native_password 改成 caching_sha2_password

# MySQL 8.0預設密碼加密方式由原本mysql_native_password 改成 caching_sha2_password
# 怕Client端連線有問題,先設定為IDENTIFIED WITH mysql_native_password

ALTER USER 'mysqluser1'@'%' IDENTIFIED WITH mysql_native_password BY '自訂密碼';
GRANT ALL ON *.* TO 'mysqluser1'@'%';

CREATE USER 'mysqluser2'@'%' IDENTIFIED WITH mysql_native_password BY '自訂密碼';
GRANT ALL ON *.* TO 'mysqluser2'@'%';

FLUSH PRIVILEGES;


調整前Client端連線的錯誤訊息:
Retrieval of the RSA public key is not enabled for insecure connections.

使用podman指令建立Persistent Storage的MySQL容器資料庫,並藉由systemctl設為Host重開機自動啟動

環境:RHEL 8.3
目的:透過podman建立一個Persistent Storage的MySQL 8.0資料庫,並藉由systemctl設為Host重開機自動啟動
備註1:podman run指令不支援--restart=always(因為podman有別於Docker架構,不使用Daemon機制(daemonless Container),無法透過Daemon機制去自動重啟)
參考資料 https://igene.tw/podman-intro
備註2:如果rm刪除容器重新建立,需要重新產生 podman generate systemd --name mysql-80-persist > mysql80-container.service
#環境:RHEL 8.3
#目的:透過podman建立一個Persistent Storage的MySQL 8.0資料庫,並藉由systemctl設為Host重開機自動啟動
#備註1:podman run指令不支援--restart=always(因為podman有別於Docker架構,不使用Daemon機制(daemonless Container),無法透過Daemon機制去自動重啟)
#參考資料 https://igene.tw/podman-intro
#備註2:如果rm刪除容器重新建立,需要重新產生 podman generate systemd --name mysql-80-persist > mysql80-container.service
#建立Permanent Storage Location
sudo mkdir -p /var/podmandata/db/mysql80
#加入合適的SELinux context
sudo semanage fcontext -a -t container_file_t '/var/podmandata/db/mysql80(/.*)?'
#生效SELinux container policy
sudo restorecon -Rv /var/podmandata/db/mysql80
#確認SELinux context type是container_file_t
ls -ldZ /var/podmandata/db/mysql80
sudo chown -Rv 27:27 /var/podmandata/db/mysql80
#備註:可以建立容器後,進入容器用cat /etc/password確認uid
#登入
sudo podman login registry.redhat.io
sudo podman pull registry.redhat.io/rhel8/mysql-80
#確認images已經下載到本地端
sudo podman images
#建立容器
#podman run指令不支援--restart=always(因為podman有別於Docker架構,不使用Daemon機制(daemonless Container),無法透過Daemon機制去自動重啟)
# https://igene.tw/podman-intro
sudo podman run --name mysql-80-persist \
-d \
-t \
-p 3306:3306 \
-v /var/podmandata/db/mysql80:/var/lib/mysql \
-e MYSQL_USER=mysqluser1 -e MYSQL_PASSWORD=自訂密碼 \
-e MYSQL_DATABASE=testdb -e MYSQL_ROOT_PASSWORD=自訂密碼 \
registry.redhat.io/rhel8/mysql-80
#確認有看到剛剛起的容器
sudo podman ps --format="{{.ID}} {{.Names}} {{.Status}}"
#如果啟動失敗查看log
#sudo podman logs -f mysql-80-persist
#開通host主機防火牆讓外界連線
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
sudo firewall-cmd --reload
#進入容器內
sudo podman exec -it mysql-80-persist /bin/bash
# 開放非本機連線
vi /etc/my.cnf
vi後,檔案最後請加入以下內容
bind-address = 0.0.0.0
#!wq存檔
mysql -uroot
#備註:容器內執行指令
### 以下是進入容器MySQL內,執行MySQL指令 ###
# MySQL 8.0預設密碼加密方式由原本mysql_native_password 改成 caching_sha2_password
# 怕Client端連線有問題,先設定為IDENTIFIED WITH mysql_native_password
ALTER USER 'mysqluser1'@'%' IDENTIFIED WITH mysql_native_password BY '自訂密碼';
GRANT ALL ON *.* TO 'mysqluser1'@'%';
CREATE USER 'mysqluser2'@'%' IDENTIFIED WITH mysql_native_password BY '自訂密碼';
GRANT ALL ON *.* TO 'mysqluser2'@'%';
FLUSH PRIVILEGES;
# 確認有剛剛建立的testdb資料庫
show databases;
use testdb;
CREATE TABLE Testtable (id int(3) NOT NULL,
name varchar(50) DEFAULT NULL,
address varchar(255) DEFAULT NULL,
PRIMARY KEY (id));
確認有剛剛建立的Testtable資料表
show tables;
insert into Testtable (id, name, address) values (1,'Rex','country road');
select * from Testtable;
離開MySQL介面
exit
### 以上是MySQL指令 ###
離開容器,回到host主機
exit
#備註:容器內執行指令
確認testdb的資料是存在host主機,表示Persistent Storage有設定成功
sudo ls -ld /var/podmandata/db/mysql80/data/testdb
### 設定開機啟動容器
cd /etc/systemd/system/
#使用最高權限
su
# 如果rm刪除容器重新建立,需要重新產生
podman generate systemd --name mysql-80-persist > mysql80-container.service
systemctl daemon-reload
# 透過disable移除舊的設定
systemctl disable mysql80-container.service
systemctl enable mysql80-container.service
systemctl start mysql80-container.service
#查看service的狀態,確認狀態是Active: active (running)
systemctl status mysql80-container.service
#離開最高權限身分
exit
# 檢查服務是否有設定開機自動啟動
systemctl is-enabled mysql80-container.service
#不需要執行
#sudo chmod 755 /etc/systemd/system/mysql80-container.service
#不需要執行
#sudo setsebool -P container_manage_cgroup on
#確認設定是on
#sestatus -b | grep container_manage_cgroup
# Client端連線字串還需要加入SslMode=none
# 否則會有錯誤:SSL Authentication Error - A call to SSPI failed, see inner exception.(呼叫 SSPI 失敗,請查看內部例外狀況)
# https://github.com/mysql-net/MySqlConnector/issues/428

2021年3月3日 星期三

Hello podman

大部分指令和docker一樣
但是podman run指令不支援--restart=always(因為podman有別於Docker架構,不使用Daemon機制(daemonless Container),無法透過Daemon機制去自動重啟)
只能藉由systemctl設為Host重開機自動啟動
參考資料 https://igene.tw/podman-intro

sudo podman run ubi7/ubi:7.7 echo 'Hello!'

在容器內執行指令
sudo podman run -it ubi7/ubi:7.7 /bin/bash 
退出
exit

列出所有執行中的容器
sudo podman ps 

列出所有的容器(包含非執行中)
sudo podman ps -a

刪除容器
sudo podman rm

刪除容器Base Image
sudo podman rmi