AD

2023-07-18

多個 github 帳號的 ssh key 設定

你有沒有遇過一種情況⋯⋯ 

你需要在自己的一台機器上,有用多個 github 帳號;比方一個是公司的,一個是自己的。

而且因為 github 每個帳號會要求不同 ssh key,所以不要想什麼一支 key 用所有帳號的事XD

那要怎麼設定不同帳號用不同的key呢?
開啟 ssh 的目錄下的 config 檔案(~/.ssh/config) 

config 可以這樣設定: 

Host github.com

    IdentityFile ~/.ssh/id_ed25519 #你的 ssh key 

    User your_user_name

Host github.com-work     #假設是工作的github帳號,加個-work好了

    Hostname github.com

    IdentityFile /.ssh/id_ed25519_2 #你工作帳號的 ssh key 

    User your_2nd_user_name

設定好之後,clone repo 就可以:

用自己的 ssh key
git clone git@github.com:repo_owner/repo_name.git
用你工作帳號的 ssh key
git clone git@github.com-work:repo_owner/repo_name.git

這樣就完成了~

2023-02-01

[Leetcode] 217. Contains Duplicate

紀錄一下自己一看到題目時的做法~


英文題目  https://leetcode.com/problems/contains-duplicate/

Given an integer array nums, return true if any value appears at least twice in the array, and return false if every element is distinct. 


Example 1:

Input: nums = [1,2,3,1]

Output: true


Example 2:

Input: nums = [1,2,3,4]

Output: false


Example 3:

Input: nums = [1,1,1,3,3,4,3,2,4,2]

Output: true


Constraints:

1 <= nums.length <= 105

-109 <= nums[i] <= 109


2023-01-06

[小記] 用 /etc/hosts 來測試網站被牆時可能的狀況

最近遇到一個 issue,某個客戶用我們的網站無法登出,但客戶公司的其他人和我們的 QA 都無法重現這個問題。

幾份工作下來,原本以為只有一位客戶遇到,QA 又無法重現的這種,開發大概是不會修了;沒想到目前工作新來的這位開發和前端團隊討論了一下,加上不斷重播客戶錄影,發現客戶console有個我們使用的第三方 tracking 服務的 js,在客戶那邊載入有問題,導致 ReferenceError 而無法登出。所以後來開發 handle 了錯誤,讓載入錯誤還是能登出。

一開始覺得有點難驗證,畢竟第三方網站掛掉可遇不可求,開發也修改成錯的路徑 demo 給我看原本不能登出,而修改後是能夠登出的。

---

對於無法重現我一直耿耿於懷,想說這個開發都這麼盡責的推測問題然後修正,我有沒有辦法真的重現問題呢?在我自己的電腦上牆掉那個第三方網站,不知道是不是要架一個 proxy 來擋網站還是什麼;後來和設定過一堆網站、網路環境的朋友聊天,他說改一下 /etc/hosts 就可以啦。

對啊!完全沒想到!/etc/hosts 真的是太好用了!!

於是我把第三方網站指到127.0.0.1,真的重現了客戶錄影中無法登出的狀況,而修正後可以正確登出。

以後要試試被牆的狀況就有最簡單的方法了~

真是太感謝開發和朋友了!


2022-12-08

[Python + Selenium] webdriver.get() 設置最長等待時間

webdriver.get(url) 到一個頁面後,會等到頁面載入完成(onload 事件觸發) ,然後再將控制權交回給測試 script。

在網路不穩定的情況下,或網站也些問題時,等到頁面 onload 可能非常久。
webdriver.get 預設的 timeout 在某些不同的 webdriver 中可能到5分鐘之久。

所以可以用 set_page_load_timeout() 設定一個最長的頁面等待時間:

from selenium import webdriver

driver = webdriver.Chrome()
driver.set_page_load_timeout(20) #傳入最長等待秒數

try:
    driver.get("http://www.example.com")
    
except TimeoutError:
    print("Timed out waiting for page to load.")

以上將頁面的最長等待時間設為20秒,等候頁面超過20秒會拋出 TimeoutError。

2022-07-01

[小記] Docker selenium/standalone-chrome 遇到 ConnectionResetError(104, 'Connection reset by peer')

這是一篇其實沒什麼真正問題的筆記,但花了幾個小時才解決,記錄一下。
 
我們的 Jenkins pipline 會起一個 selenium/standalone-chrome 的 docker,用類似這樣的方式起:
  docker run -d -p 4444:4444 selenium/standalone-chrome 

每次跑完都會 stop 這個 container。 

code 是類似這樣連 remote webdriver 的: webdriver.Remote("http://localhost:4444/wd/hub",options=options) 

其他專案的 docker compose 執行 selenium/standalone-chrome 後,用一樣的 code 都沒問題,但這次卻一直遇到以下的錯誤:
 Execute case encounter an error: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer')) 

還有一次是這樣的錯誤: Execute case encounter an error: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response')) 

後來才發現是因為 docker 還在啟動⋯⋯

2021-10-29

Ubuntu 刷新 GNOME 桌面環境

在桌面沒有停止回應,可能只是某個程式的選單不知道為什麼卡在畫面上的情況,
按 alt + F2 會跳出指令視窗,輸入 r 再 enter 即可刷新。

如果整個畫面是卡住的,但可以開起終端機,也可以輸入以下指令刷新:
gnome-shell --replace & disown

2021-10-26

Python 建立 2D list

Python 建立 2D 串列時可以用3種方法:
1.直接建立:
new_list = [[0, 0, 0], [0, 0, 0]]
2. 用列表建立:
new_list = [[0 for r in range(3)] for c in range(2)]
3. 用 numpy建立陣列:
import numpy as np
new_list = np.zeros((3, 2), dtype=np.int)


如果用*來建立會遇到一些問題:
new_list = [[0] * 3]*2
看起來沒問題:
>>> new_list
[[0, 0, 0], [0, 0, 0]]

但如果
>>> new_list[0][1] = 1
>>> new_list
[[0, 1, 0], [0, 1, 0]]

用*建立出來的 2D list 是指向 list[0] 的 index,所以 list[0] 的值改變時,其他 list 也會更著改變。

2021-05-25

解決 Ubuntu 18.04 Macbook SD卡無法讀取

重新安裝 udisks2 套件:
sudo apt install --reinstall udisks2
然後重新開機。

2021-05-21

一邊拯救人類一邊賺狗狗幣 - 用 Folding@home 計算蛋白質摺疊還可以拿到 Dogecoin

Folding@home 是什麼

Folding@home (簡稱 FAH)是一款研究蛋白質摺疊、誤折、聚合及由此引起的相關疾病的分散式計算工程。

這能讓科學家更了解許多疾病的起因和發展,像是阿茲海默症、亨廷頓舞蹈症、牛海綿狀腦病、癌症和囊胞性纖維症等。

很多研究蛋白質結構的論文,都有參照這個計劃的成果(wiki)。

分散式計算就是大家提供一些自己電腦的運算能力,來完成整個大專案的計算。

就很像是在「挖礦」,不過不是計算區塊鍊,而是計算蛋白質、疾病等發展!

算 Folding@home 還能得到 Dogecoin

我之前就一直在想,如果邊算 Folding@home 還能拿到虛擬貨幣,會不會增加大家算蛋白值的興趣呢(看看那缺貨的顯卡),沒想到真的有佛心的人兄建立一個叫做 Dogefolders 的 team (官網),只要你計算了夠多的蛋白質折疊,他就會提供你 Dogecoin!!

要怎麼一邊算 Folding@home 一邊得到 Dogecoin 呢?

1. 先去 Folding@home 官網 https://foldingathome.org/start-folding/ 下載自己電腦可以用的安裝檔。
下載時會看到3種東西,分別是 fahclient、fahcontrol 和 fahviewer。
基本上下載前2個就行!
2. Fahclient 就是計算用的客戶端,裝好之後就可以到網頁的控制台 https://client.foldingathome.org/ 可以做一些設定!

3. 這個是網頁的控制台左上方,要設定能拿 Dogecoin 最重要的就是以下設定!
點擊「Change Identity」:


設定 Team Number 「226715」這是 Dogefolder team 的號碼:

在 PassKey下面有個「Get a Passkey」,點擊他就會到這個網頁:

Name 的地方貼上你的 Dogecoin 錢包地址(這個網路上有很多資料,這邊就略過),小心不要貼錯了!
Email 就用平常的 mail 就行。

接著按「Get Passkey」等待一會,就會收到一封有 passkey 的 email 囉!
可以回去到「Change Identity」貼上 PassKey 然後儲存了!

接著就讓他跑吧!

Fahcontrol

剛剛不是還有裝 fahcontrol 嗎?

如果你在網頁 control,上按了 Stop Folding,之後要再跑時怎麼辦呢?

我在網頁找了一下好像都沒有 Start 的選項,這時候打開 fahcontrol,就有「Fold」的按鈕,可以讓 Folding@home 開始計算囉:



Fahviewer

fahviewer 可裝可不裝,它是用3D的方式來呈現你目前算的蛋白質長什麼樣子:


登登!目前長這樣,還蠻有趣的啦。

最後

目前我才剛剛開始加到 Dogefolders 隊伍,由於 Dogefolders 的創立者希望一次就是發送出一整個狗狗幣,所以要算到「榜上有名」,才會獲得狗狗幣。

即使算不到狗狗幣也不要灰心,來看一下狗狗幣的故事,看看對加密貨幣有沒有什麼反思吧:https://www.blocktempo.com/story-about-dogecoin-why-their-fathers-abandon-it/


2021-04-08

[Windows] Python 2 和 3 的虛擬環境設定

為什麼要使用虛擬環境

在開發時可能會遇到「A 專案的 p 套件要用1.2版本」但「B 專案的 p 套件要用2.2版本」或是遇到「C 專案只需要 a, b, c 套件」而「D 專案只需要 b, d 套件」,這時若是使用虛擬環境開發就能讓開發環境維持乾淨的狀態。


虛擬環境的原理

python venv 會複製基本的 python 執行檔及套件等到虛擬環境的 Lib\site-packages 資料夾下,使用虛擬環境時就是使用資料夾中的那份 python。


建立虛擬環境

python3 內建就有 venv 這個參數能用來建立虛擬環境,執行:
python venv venvname
venvname 是虛擬環境的名稱。
 
Python2 要建立虛擬環境則需要用 pip 安裝 virtualenv 套件:
pip install virtualenv
安裝後執行:
python virtualenv venvname
venvname 一樣是虛擬環境的名稱。


同時有 python 2 和 python 3

如果 windows 上遇到錯誤 "Error: [WinError 2] 系統找不到指定的檔案",可能是因為同時有 python 2 和 python 3 導致。
先找出 python(2) 和 python3 的路徑:
where python
where python3
可以將 python 命名為 python2,python3 命名為 python(或其他自己可以區分2或3的命名)。
現在可以建立 python3 的虛擬環境:
python venv venvname
Python2 的安裝 virtualenv 套件:
python2 -m pip install virtualenv
-m 的參數代表使用這個 python 下的套件。當 py2 和 py3 同時存在相同名稱的套件時(比方pip),可以用 -m 來指定版本。
python2 virtualenv venvname


使用虛擬環境

執行:
venvname\Scripts\activate

當命令提示字元前面帶有虛擬環境的名稱時,就表示在虛擬環境中:
(venvname) C:\Users\uname>

離開虛擬環境: deactivate

2020-10-12

Google Chrome console highlight XPath

在 Chrome console 中輸入$x("your_xpath")就能找到XPath對應的元素:


如果元素在 iframe 裡,要切換到 iframe 只要在下圖中粉紅色的地方選擇對應的 iframe 即可:

2020-08-20

Ubuntu 18.04 以上轉換 HIEC 圖片格式成 jpg 或 png

安裝套件:
sudo apt-get install libheif-examples

到圖片的資料夾用下面的指令轉換成 png:
for file in *.HEIC; do heif-convert $file ${file/%.HEIC/.png}; done
轉換成 jpg:
for file in *.HEIC; do heif-convert $file ${file/%.HEIC/.jpg}; done

Ubuntu 18.04 連接 iOS 相片資料夾

Ubuntu 18.04 預設有裝 libimobiledevice,所以支援連接 iOS,似乎是 GNOME 的問題。 

連接方法:
1. 在 Nautilus 檔案瀏覽器下打開iPhone裝置的資料夾
2. 按 ctrl + L 取得裝置位置:afc://deviceaddress:3/
3. 將後面的:3/去除,按下 Enter

這樣就能瀏覽iPhone上的各種資料夾了,相片在 DCIM 裡。

2020-08-19

libinput-gestures GUI 設定套件

續之前的筆記 Ubuntu 用 libinput-gestures 設定觸控手勢
最近重裝系統,設定 libinput-gestures 時發現有GUI的手勢設定套件「Gestures」。


安裝也很簡單:
git clone https://gitlab.com/cunidev/gestures
cd gestures
sudo python3 setup.py install

沒有py3、pip3、setuptools的要先裝一下。

設定界面長這樣:


一開始測試的時候可以把3指上滑的 notiy-send 打開,看看到底有沒生效, 一開始裝完 libinput-gestures restart 沒生效,重開機之後就有了。

2020-05-27

Python + Google sheet API 取得試算表資料

參考這個Google的文件:
https://developers.google.com/sheets/api/quickstart/python?hl=zh-cn

用你要使用的google帳戶登入後,點擊 Enable the Google Sheets API:
 這邊選Desktop app,:

之後會產生Client ID和Client Secret,按下DOWNLOAD CLIENT CONFIGURATION,會下載credentials.json:

把credentials.json和下面範例的程式碼放在一起,執行就可以:

SAMPLE_SPREADSHEET_ID 就是試算表的後面的ID:
SAMPLE_RANGE_NAME 的 Class Data 是表的名稱,!A2:E是範圍,只有表的名稱就能夠取得整張表。

之後第一次使用會開啟瀏覽器,登入一次後就能使用,需要登入才能檢視的試算表也可以,只要登入的帳號有查看的權限就行。

2020-02-15

Python + Flask 處理 Mattermost incoming/outgoing hook 和 slash command

Incoming Webhooks


在側邊欄找到 Integrations > Incoming Webhooks > Add Incoming Webhook,
填入 Title、Description 並選擇 Channel 後按 save,

就會獲得一串 URL 類似:https://mattermost.your.domain/hooks/xxxxtokenxxxx

最簡單的 Incoming Webhooks 範例:


data 要 json.dumps 沒注意會遇到像下面的錯誤:

{"id":"model.incoming_hook.parse_data.app_error","message":"Unable to parse incoming data","detailed_error":"","request_id":"xxxxxxxxx","status_code":400}

或是 import slackweb:


Outgoing Webhooks


在側邊欄找到 Integrations > Incoming Webhooks > Add Outgoing Webhook,
填入 Title、Description、選擇 Content Type(推薦選擇 application/json)、
Trigger Words(觸發的關鍵詞)、選擇 Trigger When(推薦 First word matches a trigger word exactly)、最後填入Callback URLs 後按 save。

簡單的 Outgoing Webhooks 範例:



執行上面的 code 之後,127.0.0.1:8888 就會出現 'Home Page' 了。
Outgoing Webhook 只要去 post 我們設定的 127.0.0.1:8888/mattermose 就行了。

但 Outgoing Webhooks 需要 public ip,這部分可以用看看 ngrok,裝了 ngrok 之後下command:
ngrok http 8888

就會有的 public URL,像這樣:
Forwarding http://xxxxxx.ngrok.io -> http://localhost:8888
Forwarding https://xxxxxx.ngrok.io -> http://localhost:8888


上面範例中的 Callback URL 填入 xxxxxx.ngrok.io/mattermost 就可以了。

Slash Command


在側邊欄找到 Integrations > Slash Commands > Add Slash Command,
填入 Title、Description、Command Trigger Word、Request URL、Request Method、Response Username、Response Icon(不填就是預設)、可以打勾 Autocomplete(能自動補完 command),最後按 save。

Slash command 有點類似 Outgoing Webhooks,Request URL 就是一樣去 post 我們設定的 127.0.0.1:8888/mattermose:
(下面的 code 同 Outgoing Webhooks)


使用 Slash Command 就是在 Trigger Word 前加 slash: '/yourtriggerword'

這時如果出現錯誤:
command with a trigger of ‘xxxx’ failed
可以試試允許使用 localhost:
側邊欄 > System Console > Developer 在 Allow untrusted internal connections to 中填入 localhost。

但我允許後還是不行,這時一樣可以用 ngrok。

2019-12-24

Appium xpath 顯示的小坑

用 Appium Desktop 抓 xpath 會遇到一些顯示上的小問題。

目前遇過幾種類型:
1.文字換行會被去掉
在 Appium 上顯示的 xpath:
//XCUIElementTypeOther[@name="20% off $4,100")]
卻怎麼樣都沒辦法抓到。
dump xml 才發現,原來文字間有換行:
//XCUIElementTypeOther[@name="20%
off $4,100")]


2.文字首尾空白會被去掉
在 Appium 上顯示成這樣的text:
$530,000
怎麼又沒辦法抓到?
dump xml 才發現,原來文字前端(尾端)有空白:
$530,000

3.不換行空白會顯示為空白
這邊太無奈就不放範例了,放一下不換行空白 wiki

Mac/Linux 查詢port被哪個程序占用

lsof查詢被占用的 Port (以 4736 為例):
sudo lsof -i:4736

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 22575 user 23u IPv4 0x6xxxxxxxac7 0t0 TCP *:udpplus (LISTEN)


要結束程序的話就kill PID:

kill 22575

2019-12-07

Ubuntu 開機時 device not accepting address -62

最近開機偶爾會等很久,切換到tty查看,發現是有錯誤:
device not accepting address -62
系統嘗試多次之後才會正常開機。
在終端機用grep '62' /usr/include/asm-generic/errno.h來尋找是什麼錯誤:
#define ETIME 62 /* Timer expired */
看起來就是啟動USB超時了。
後來試著在GRUB_CMDLINE_LINUX_DEFAULT中加上USB初始化。
開啟/etc/default/grub,找到
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
加上usbcore.old_scheme_first=1
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash usbcore.old_scheme_first=1"
再更新grud:
update-grub
應該就可以了。

2019-11-20

Mac 螢幕共享

在 系統偏好設定 > 共享:




再裝任何 VNC 軟體,確定其他台電腦和Mac在同個網段裡,輸入顯示的 ip (上面是10.44.147.60)就能連上。


不過 MacOS Mojave 的 VNC 有點問題:
在勾選「僅以下使用者」連線時,可能遇到卡在登入畫面,沒有密碼輸入框,並且一直顯示loading。

可以試著勾選「所有使用者」,然後點擊「電腦設定…」:



勾選「任何人可以要求擁有控制螢幕的權限」。

這樣就不會卡在 loading 了。




如果文章有幫助到你可以在 LikeCoin 上幫我拍手喔