發表文章

Mac 上右鍵以 Sublime、Visual Studio Code 開啟

圖片
在 Ubuntu、Windows 上安裝一些編輯器時,總會問你要不要新增到右鍵選單(Context Menu),在 Mac 中似乎就少有這樣的提示,這對於程式設計師可以說非常好用,在這邊教大家如何新增自己喜歡的編輯器到右鍵選單。 新增 Automator 服務 開啟 Automator 後新增一個服務(Service) 依照圖片順序設定好,這張圖片是 Visual Studio Code 的設定,第 7 點部分下面可以讓大家複製貼上 用 Visual Studio Code 開啟 "/Applications/Visual Studio Code.app/Contents/MacOS/Electron" $@ 用 Sublime 開啟 "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" $@ 最後儲存該服務(Service)即可 在 Finder 中右鍵開啟 對資料夾按下右鍵 > 服務(Service)即可找到剛才新增的服務 最後,這些腳本會存在 ~/Library/Services 底下,如果有需要可以去那邊開啟編輯

Win10 底下使用 Linux Terminal + zsh,VS code 也能吃

圖片
上上篇文章中提到我從 Ubuntu 跳到 Win10 最不習慣的就是終端機不好用且沒有我熟悉的指令。這幾天終於放暑假了發現到有幾個超好用的工具讓我對於 Win10 比較釋懷了。 cmder 這是一款 Windows 底下的 console 模擬器整合版,實際上是透過 ConEmu 這個模擬器來將 UNIX 指令轉換成 Windows 指令。還有使用 Clink 將一些 GNU 函式庫整進來等等。詳細介紹網路上很多我就不一一贅述。 配色方面我是採用 xterm,而該畫面中 tmux配置參考這邊 Windows Subsystem for Linux (WSL) 雖說 cmder 整合了不少東西,但還是有許多命令、工具是它沒有的,當然也可以透過安裝 cygwin 來實現,不過這也都只有非常基本的工具而已,幸好 Windows 出了 WSL,將 Linux 環境整合到 Windows 當中。 開啟方式網路上也很多,但我 相當推薦這篇 ,裏頭順便講了如何在 VS code 裡面啟用 ZSH,對於測試程式是個相當實用的功能。也因為在 WSL 預設的終端機下會有中文亂碼問題,要解決也是可以,將預設 UTF-8 編碼改掉即可,不過直接使用 cmder 會更加方便。 openssh-server 出錯 當一切就緒後 port 也開了,會發現無法從另一台電腦連過來,使用 ssh -vvv 查看發現其實有連上,可是交換一些資訊後就突然被中斷連線, 這篇文章 有提到因為 WSL 預裝的 openssh-server 並不完整,因此建議刪除重裝。 cmder 設定 zsh 上面的連結設定頁面似乎跟現在的不太一樣,可以按照 這篇 去做設定,裡面也有安裝教學,可以交互參考。 VS Code 設定 zsh 按住 Ctrl + Shift + P 輸入 Select Default Shell 即可找到 WSL Bash 這邊我是使用 Steeef 主題,在 ~/.zshrc` 裡面設定 `ZSH_THEME="steeef" 即可 home 目錄設定 WSL 的 home 目錄就是它自己的 home 目錄,Windows 的 C 槽是掛載在 /mnt/c/ 中,而我有弄個 symlink 指到自己的 Windows 的使用者目錄方便我存取。 $ link -s /mn...

Arduino 自走車 & 機械手臂

微算機實驗課程期末專題有些人接線做 8051 喇叭,但因為器材不太夠,就有幾個人可以玩 Arduino 自走車,剛好 MOLi 實驗室有舉辦 機械手臂相關活動 也是使用 Arduino 去弄,就順便將這兩樣東西兜起來當作期末報告。 使用器材 Arduino UNO Arduino Sensor Shield V5.0 感測器擴展板 自走車相關零組件 PS2 副廠搖桿 組裝教學 自走車 基本上可以參考 這篇 ,其中我拿到的零件比較不同的是馬達驅動模組,但一樣接上 IN1~IN4 當作訊號即可,因為另一邊有通電了。聽同學說有個跳線的地方,蓋子拔掉就不會通電了,這樣就得自己接電接地。對於擴充版不熟悉的話可以參考 這篇 。 搖桿 網路上很多接線圖,大部分都一樣, 這邊 就貼個我看的順眼的。 遇到的坑 馬達 一開始測試馬達,code 寫進去要他怎麼轉就怎麼轉,可是之後重接重寫就發現不會動了。先檢查程式,發現是忘了在最前面寫上 pinMode 指定 OUTPUT。後來還是不會動,從馬達開始接電測試,不管正轉逆轉都沒問題,再來是馬達驅動模組,螺絲重新鎖、接電測試也都沒問題,那該不會是我的腦袋有問題吧!?最後終於發現是杜邦線太鬆、或是模組的針腳太細,總之就是接觸不良,因為這批線是當天助教拿新的給我,沒想到就有這個問題。後來詢問老師,說可能是針腳太短,且杜邦線價格差異很大,品質可能也有差。 PS2 搖桿 沒想到這搖桿也能拿來接 Arduino,上網找來找去好像就 PS2X 這個 Library 最好用,基本上就是範例 code 貼上去就要會動,可是我怎麼測試就是不會動,弄了約 3.4 小時聽到同學早就成功了,跟他借線測試後才知道可能有些訊號線斷掉了,之前還有請老師幫忙找問題,可惜沒找到,老師表示原來杜邦線品質這麼差。之後弄弄手臂再回來弄搖桿發現又不會動了。。。換線過後又正常,Arduino 這東西怎麼那麼難搞阿,光是接線測試就花了 8 小時,雖然很倒楣線材總是出包,但也只能怪自己沒玩過多少硬體,對於 debug 不熟悉。 IDE 問題 在 Mac 上如果輸入法是在內建的注音模式,複製貼上或是快捷鍵註解等操錯可能會有問題,建議切換到英文模式操作。 如果 Arduino 同時接電又接 USB,傳輸時可能會出...

半年後從 Ubuntu 再轉回 Windows

去年 12 月因為一場講座,講師 Tim Hsu 說想要學好 Linux 就轉到 Linux 系統去每天使用,剛好我也想再次試看看 Ubuntu,距離上次以 Ubuntu 當作主系統大概是兩三年前了吧,因為買了 Macbook air 之後就越來越習慣 Unix-like 環境。持續約半年,我又跳回到 Windows 了,這是為甚麼呢? Ubuntu 優點 Linux 環境對於開發者友善 (指令、套件) 不太會中毒 (測試軟體或是網站時不太需要擔心) Docker 原生支援 很多工具都很強大,介面當然另當別論 缺點 輸入法 (嘗試過新酷音、Rime,選字都沒有到很滿意) 文書處理軟體都會跑版 (就算是開源文件在 LibreOffice 顯示有時也會有問題) 支援遊戲少 支援軟體少 (Line,Jandi) 套件有時衝突 轉捩點 其實上述缺點都還好,習慣就好,最主要的轉捩點應該就是手癢搶在第一波 Bionic 釋出後馬上升級,Ubuntu 一直以來對於跨版本升級都很容易出問題。升級後首先當然是開不了機,修了幾小時後發現是顯卡問題,將套件衝突處理完後重裝驅動即可正常開機。 16.04 升級到 18.04 後是一連串的問題,程式執行到一半容易異常終止,圖形化介面經常無回應後自動重啟,開機常常要開好幾分鐘,音訊時常有雜音或是沒聲音,得重啟系統,重啟 ALSA 沒用。。。基於這些原因就又跳回 Windows 了,黑蘋果畢竟驅動與升級問題也不少也就不考慮。 Windows 當初 2015 年首天升級 Win10 時我就更新了,還記得那天是 7/29,升級完一切順利安好,就這樣過去了一年多,有時桌面會死當,也遇過幾次內建的解壓縮程式解壓不完全,後來下載 7zip 解決,Defender 好像也有點問題,記不太得了,總之後來又灌回 win7,相信大家應該都明白 win10 剛出來沒有到太穩定,強制更新更是很惱人。在我使用 Ubuntu 這段時間偶爾也會開 Win7 打打遊戲,不曉得為甚麼 Ubuntu 顯卡驅動就是沒有黑蘋果的 WebDrive 驅動好,打 CSGO 黑蘋果底下比 Ubuntu 順暢呢! 優點 軟體支援多安裝方便 有世界最強 IDE 打遊戲方便 缺點 沒有 Unix Command 沒有 Unix Command 沒有 Unix Command 字體預設新細明體 B...

SQL COUNT 裡面加入 WHERE 過濾

最近在開發 Laravel 專案需要做些統計,eloquent 不太熟悉且效率很差,因此講求效率的查詢仍使用 Raw SQL 前情提要 需要過濾出所有使用者的答對數量、答題總數 期待輸出: UserID CORRECT TOTAL 1 27 45 2 18 61 嘗試過的方式 (SELECT BH.UserID as UID, COUNT(AH.choice = Q.ans) AS correct FROM ans_histories AH, battle_histories BH, questions Q WHERE BH.BHID = AH.battleID AND AH.questionID = Q.QID AND AH.choice = Q.ans GROUP BY BH.UserID) UNION (SELECT BH.UserID, COUNT(*) FROM ans_histories AH, battle_histories BH, questions Q WHERE BH.BHID = AH.battleID AND AH.questionID = Q.QID AND AH.choice IS NOT NULL GROUP BY BH.UserID) 行不通原因:下面那個會被當作獨立的,不會以相同 UserID 跟上面的敘述結合 UserID CORRECT 1 27 2 18 1 45 2 61 解法 SELECT UserID, COUNT(CASE AH.choice WHEN Q.ans THEN 1 ELSE NULL END) AS correct, COUNT(*) FROM ans_histories AH, battle_histories BH, questions Q WHERE BH.BHID = AH.battleID AND AH.questionID = Q.QID AND AH.choice IS NOT NULL GROUP BY BH.UserID; 其中 COUNT(CASE AH.choice WHEN Q.ans THEN 1 ELSE NULL END) 可以替換成 SUM(CASE AH.choice WHEN Q....

[Weekly Report] 2018.04.05 - 04.18

[Weekly Report] 2018.04.05 - 04.18 My dormitory doesn't have static public IP address so I tend to use Dynamic DNS (DDNS) method. Even though my D-Link Access Point (AP) provides free DDNS service, but I want to use my own domain name. First I change my domain name server from freenom to Cloudflare , then install ddclient for automatically update my IP address to Cloudflare. But no matter how I changed the arguments of the configuration file for hours, it still didn't work. Then I tended to use Cloudflare API and read the official document, it succeeded in ten minutes. Here is my sample DNS-update code, you can also use requests library instead of curl : '''This program will get record from Cloudflare and compare my current IP address''' import json from os import popen, system getCMD = 'curl -X GET "https://api.cloudflare.com/client/v4/zones/{ZONE-ID}/dns_records?type=A&name={YOUR-FULL-DOMAIN-NAME}" \ -H "X-Auth-Email: {YOUR-...

PyDrive備份教學

最近買了台Raspberry Pi,因為讀寫都是在SD卡上面,所以很怕哪天SD卡突然掛了,裡面的資料就都沒了,上網找了這個方法,但用的人似乎很少 ,就來寫我人生中的第一篇電腦教學文!! 開始 此方法是使用Google釋出的API 所以要先去 APIs console 建立專案 如果是第一次使用 會先跳出使用介紹 這個別理他 ((好啦 大家都知道 先點選右上角的 "選取專案" -> "建立專案" 建立後 應該會直接跳轉到資料庫的畫面 此時透過搜尋列搜尋 "Drive API" 接著啟用它 點選 左側 "憑證" 後 選取"OAuth同意畫面" 只需在 " 向使用者顯示的產品名稱 " 輸入即可儲存 接著建立憑證 選取 "OAuth 用戶端ID" 類型務必選擇 "其他" 這樣可以用的範圍比較廣 接著右邊有個下載符號 下載完放到要執行的資料夾內 並重新命名為 client_secrets.json 安裝pyDrive 可以透過指令 $ pip install pydrive 會安裝到最新版本 但是遇到大檔上傳時會有內存溢出問題 因此建議可以安裝舊版 $ pip install -e git+https://github.com/googledrive/PyDrive.git#egg=PyDrive 裝完後 沒問題就可以開始寫程式了 先建立一個"quickstart.py" 的檔案 (檔名可以隨便取) 並貼上下面指令: (詳細請參考: http://pythonhosted.org/PyDrive/quickstart.html) from pydrive.auth import GoogleAuth from pydrive.drive import GoogleDrive gauth = GoogleAuth() gauth.CommandLineAuth() #透過授權碼認證 drive = GoogleDrive(gauth) file1 = drive.CreateFile({'title': 'Hello.txt'}) # 建立檔案 file1.Se...