C++ std::deque 用法與範例

本篇將介紹如何使用 C++ std deque 以及用法與範例,C++ std::deque 是一個雙向佇列(double-ended queue),在頭尾兩端插入及刪除十分快速,在中間插入刪除元素比較費時。

std::deque 是 double-ended queue 而不是 double linked list,底層實做是用間接索引的方式實現的,類似一個 map 索引到若干個固定大小的資料區塊(連續記憶體空間),利用兩次索引達成跟 vector 一樣的隨機訪問功能。

以下將依序介紹幾個 std::deque 容器常用的用法範例,分別為

  • deque 常用功能
  • 範例1. 基本的 push_back, pop_front, push_front, pop_back 的用法範例
  • 範例2. push_back 自定義類別
  • 範例3. 用 for 迴圈遍歷 deque 容器
  • 範例4. 用 while 迴圈在 deque 容器裡搜尋/尋找
  • deque 的優點與缺點

要使用 deque 容器的話,需要引入的標頭檔<deque>

deque 常用功能

以下為 std::deque 內常用的成員函式,
修改器
push_back:把一個元素添加到尾端
push_front:把一個元素插入到頭端
pop_back:移除最後一個元素(尾端)
pop_front:移除第一個元素(頭端)
insert:插入元素
erase:移除某個位置元素, 也可以移除某一段範圍的元素
clear:清空容器裡所有元素
容量
empty:回傳是否為空
size:回傳目前長度
元素存取
[i]:隨機存取索引值為i的元素
back:取得最後一個元素
front:取得第一個的元素
迭代器
begin:回傳指向第一個元素(頭端)的迭代器
cbegin:回傳指向第一個元素(頭端)的迭代器(const)
end:回傳指向最後一個元素(尾端)的迭代器
cend:回傳指向最後一個元素(尾端)的迭代器(const)
rbegin:回傳指向最後一個元素(尾端)的反向迭代器
crbegin:回傳指向最後一個元素(尾端)的反向迭代器(const)
rend:回傳指向第一個元素(頭端)的反向迭代器
crend:回傳指向第一個元素(頭端)的反向迭代器(const)

範例1. 基本的 push_back, pop_front, push_front, pop_back 的用法範例

以下範例為push_back(), pop_front(), push_front(), pop_back() 用法,
其中 push_back() 與 pop_front() 應該是最常用到的函式了。

另外使用 deque 相對於 queue 的好處是deque可以使用隨機訪問的功能 [i]

std-deque.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// g++ std-deque.cpp -o a.out -std=c++11
#include <iostream>
#include <deque>

using namespace std;

int main() {
deque<int> d = {1, 2, 3, 4}; // [1, 2, 3, 4]

d.push_back(5); // [1, 2, 3, 4, 5]
d.pop_front(); // [2, 3, 4, 5]
d.push_front(0); // [0, 2, 3, 4, 5]
d.pop_back(); // [0, 2, 3, 4]

// 印出 deque 內所有內容, c++11 才支援
for (int &i : d) {
cout << i << " ";
}
cout << "\n";

cout << d[0] << " " << d[1] << " " << d[2] << "\n";

return 0;
}

輸出內容如下:

1
2
0 2 3 4
0 2 3

範例2. push_back 自定義類別

以下範例為 std::deque 容器使用 push_back() 來推放 Student 自定義類別的範例,使用 push_back() 來放進 deque 的最尾端,這個範例限制 deque 最多塞3個,多的會用 pop_front() 給 pop 掉,最後再將 deque 容器的所有的元素印出來。

std-deque2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// g++ std-deque2.cpp -o a.out -std=c++11
#include <iostream>
#include <deque>

using namespace std;

class Student {
public:
Student(int id) { this->id = id; }

int id;
};

std::deque<Student> d;

void deque_push_back(Student a) {
d.push_back(a);
if (d.size() > 3) {
d.pop_front();
}
}

int main() {
Student a1(1), a2(2), a3(3), a4(4);
deque_push_back(a1);
deque_push_back(a2);
deque_push_back(a3);
deque_push_back(a4);

// 印出 deque 內所有內容, c++11 才支援
for (auto &i : d) {
cout << i.id << " ";
}
cout << "\n";

return 0;
}

範例3. 用 for 迴圈遍歷 deque 容器

以下範例是用 for 迴圈配合 deque 容器的迭代器,去遍歷 deque 並且把值印出來,前兩種是從頭印到尾,後兩種是從尾印到頭。從頭端印到最尾端就是使用 begin() 搭配 end() ,從最尾端印到頭端就是使用 rbegin() 搭配 rend() 。

這裡的 begin() / end() 與 cbegin() / cend() 有什麼不同呢?begin() / end() 是回傳 iterator,而 cbegin() / cend() 是回傳 const_iterator,iterator 可以修改元素值,const_iterator 則不可修改,簡單說就是回傳的東西能不能被修改的差異,要用哪種就自行判斷要用哪種了。

cbegin(), cend(), crbegin(), crend() 是 C++11 新增的,要使用時記得編譯器要加入-std=c++11選項。

第一個 for 迴圈裡面的迭代器使用懶人快速寫法auto it = d.begin();,其全名為std::deque<int>::iterator it = d.begin();,如果不想寫這麼長的話,就可以像我一樣用 auto 的懶人快速寫法。

std-deque3.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// g++ std-deque3.cpp -o a.out -std=c++11
#include <iostream>
#include <deque>

using namespace std;

int main() {
deque<int> d = {1, 2, 3, 4};

// 從頭到尾
//for (std::deque<int>::iterator it = d.begin(); it != d.end(); ++it) {
for (auto it = d.begin(); it != d.end(); ++it) {
cout << *it << " ";
}
cout << "\n";

// 從頭到尾
for (auto it = d.cbegin(); it != d.cend(); ++it) {
cout << *it << " ";
}
cout << "\n";

// 從尾到頭
for (auto it = d.rbegin(); it != d.rend(); ++it) {
cout << *it << " ";
}
cout << "\n";

// 從尾到頭
for (auto it = d.crbegin(); it != d.crend(); ++it) {
cout << *it << " ";
}
cout << "\n";

return 0;
}

輸出

1
2
3
4
1 2 3 4
1 2 3 4
4 3 2 1
4 3 2 1

範例4. 用 while 迴圈在 deque 容器裡搜尋/尋找

以下範例是用 while 迴圈在 deque 容器裡搜尋/尋找數字為3,這裡的 auto 懶人快速寫法如上範例解釋相同就不贅述了。

在 while 迴圈裡如果有找到就印個有找到的訊息,假如整個 while 迴圈都沒找到,最後可以判斷 it == d.end() 代表整個 deque 容器都遍歷過了也沒有找到,就印個沒找到的訊息。

std-deque4.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// g++ std-deque4.cpp -o a.out -std=c++11
#include <iostream>
#include <deque>

using namespace std;

int main() {
deque<int> d = {1, 2, 3, 4};

// 從頭到尾
int find_num = 3;
//std::deque<int>::iterator it = d.begin();
auto it = d.begin();
while (it != d.end()) {
if (*it == find_num) {
cout << "Found " << find_num << endl;
break;
}
it++;
}
if (it == d.end()) {
cout << "Not found " << find_num << endl;
}

return 0;
}

輸出

1
Found 3

如果將 find_num 變數改成 5 去搜尋/尋找的話則會找不到,輸出結果會變成

1
Not found 5

deque 的優點與缺點

deque 的優點

  • 可以再兩端進行 push 和 pop 操作
  • 支持隨機訪問[i]

deque 的缺點

  • 佔用記憶體較多

補充資料
[ptt] deque的實作內部結構示意圖
[ptt] 在特定條件下,deque與vector的效能比較
[csdn] STL中list,vector,deque,map,set區別、聯繫和使用場景原理

參考
std::deque - cppreference.com
https://en.cppreference.com/w/cpp/container/deque
deque - C++ Reference
http://www.cplusplus.com/reference/deque/deque/
Deque in C++ Standard Template Library (STL) - GeeksforGeeks
https://www.geeksforgeeks.org/deque-cpp-stl/

其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ 新手入門教學懶人包
std::queue 用法與範例
std::stack 用法與範例
std::vector 用法與範例
std::set 用法與範例
std::map 用法與範例
std::unordered_map 用法與範例
std::find 用法與範例
std::thread 用法與範例
std::async 用法與範例
C++ 計算程式執行時間

Python 讀寫檔案

本篇 ShengYu 要介紹如何使用 python 來讀寫檔案,內容包含開檔、讀檔、寫檔與關檔,這些 python 常用的檔案操作,是 python 基本入門必學的技能,趕快來學習如何用python 讀寫文字檔吧!

本篇內容將分為以下幾部份:

  • 讀檔範例. 一次讀取全部的文字
  • 讀檔範例. 一次讀取一行
  • 寫檔範例. 覆寫模式
  • 寫檔範例. 添加模式

馬上開始吧!

讀檔範例. 一次讀取全部的文字

本範例示範用 python 從 input.txt 檔案讀取資料,input.txt 內容如下:

input.txt
1
2
3
111/1.txt
222/2.txt
333/3.txt

一開始要 open() 開檔,再來使用 read() 把所有文字讀進來,接著印出來。

readFile.py
1
2
3
4
5
6
7
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# 一次讀全部
f = open('input.txt')
print(f.read())
f.close

輸出:

1
2
3
111/1.txt
222/2.txt
333/3.txt

讀檔範例. 一次讀取一行

也是先 open() 開檔,再來每次迴圈使用 readlines() 來讀取一行文字,並且印出來,最後再關檔。

readFile2.py
1
2
3
4
5
6
7
8
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# 一次讀一行
f = open('input.txt')
for line in f.readlines():
print(line)
f.close

輸出:

1
2
3
4
5
111/1.txt

222/2.txt

333/3.txt

寫檔範例. 覆寫模式

本範例示範用 python 把文字寫到 output.txt 檔案裡。

一開始是 open() 開檔並且是寫入覆寫模式,之後用 write() 將文字寫入檔案,\n表示換行,最後再 close() 關檔。

writeFile.py
1
2
3
4
5
6
7
8
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

print('開檔,並覆寫')
f = open('output.txt', 'w')
f.write('123')
f.write('456\n')
f.close

輸出的 output.txt:

output.txt
1
123456

寫檔範例. 添加模式

一開始是 open() 開檔並且是寫入添加模式,寫入的文字會接在上次檔尾。之後用 write() 將文字寫入檔案,使用 seek()可以移動讀取指針,在呼叫read()可以讀出該位置的文字,最後再 close() 關檔。

writeFile2.py
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

f = open('output.txt', 'a+')
f.write('123')
f.write('456\n')

f.seek(5)
print(f.read(1))
f.close

輸出的 output.txt:

output.txt
1
2
123456
123456

console 輸出:

1
6

以上就是使用 python 來讀寫檔案的介紹。

其它相關文章推薦
Python 讀取 txt 文字檔
Python 寫檔,寫入 txt 文字檔
Python 讓程式 sleep 延遲暫停時間
Python 第一支 Python 程式

Git 顯示某個檔案的歷史修改記錄

有時候會需要查看某個檔案的 git 歷史修改記錄,誰修改了這個檔案以及檔案內容修改了什麼,在那一個 commit 裡其他檔案又修改了什麼,本篇介紹如何使用 git 來查看檔案歷史記錄,另外使用圖形化介面 gitk 也可以做到,而且效率更快。

顯示某個檔案的歷史修改記錄 (commit節點)

這個只會顯示該檔案被修改的 commit 節點,還不會顯示修改的內容。

1
git log <filename>

顯示某個檔案的歷史修改記錄 (列出修改內容)

跟上面指令一樣,只是文字輸出,
不要覺得這個沒用途唷!有時候想要在歷史修改搜尋某個字串,就會需要搭配這個指令。

1
git log -p <filename>

之後會列出綠色字為新增部份,紅色字為刪除部份,用/可以輸入關鍵字來搜尋

使用圖形化介面來顯示某個檔案的歷史修改記錄 (推薦使用!快又方便!)

gitk 這個工具查看某個檔案的修改歷史修改紀錄可以快速地點一個 commit 節點,同時也會顯示出這 commit 節點這個檔案的修改內容。

1
gitk <filename>

其他參考
git log - View the change history of a file using Git versioning - Stack Overflow
https://stackoverflow.com/questions/278192/view-the-change-history-of-a-file-using-git-versioning
timeline - How to view file history in Git? - Stack Overflow
https://stackoverflow.com/questions/1786027/how-to-view-file-history-in-git/1786184

其它相關文章推薦
Github 如何更新已經 fork 的專案與原專案紀錄同步
Git 常用指令
Git 修改上次的 commit
Git commit 檔案的某幾個小部分修改

Mac OS 安裝 Hexo

本篇紀錄在 Mac OS 下安裝 Hexo 的過程與步驟,

安裝環境

以下為我的安裝環境:

  • Mac OS 10.13.4
  • node v10.10.0 (node -v 指令查看)
  • npm v6.4.1 (npm -v 指令查看)

安裝步驟

安裝步驟只需要兩步驟,

步驟1. 安裝nodejs

1
brew install node

步驟2. 安裝hexo

1
sudo npm install -g hexo

之後步驟參考 Hexo Ubuntu 安裝篇

相關文章
Hexo 使用 Google Analytics 進行網站流量分析
Hexo 本機測試時如何關閉 Google Analytics
Hexo codeblock 插入程式碼區塊與各種程式語言預覽
升級更新 Hexo upgrade
Hexo 熱門主題列表
Ubuntu 安裝 Hexo

macOS Screen Sharing 用指令開啟螢幕分享

本篇 ShengYu 介紹 macOS 如何用指令開啟螢幕分享 Screen Sharing,在圖形介面中要開啟螢幕分享功能的話是從 系統偏好設定 > 共享 > 螢幕共享 的選項去勾選開啟,但有時候從遠端 SSH 登入時突然想用遠端視窗登入,就無法用圖形介面去開啟螢幕分享功能,而此時螢幕分享如果是關閉的話,就會需要用到指令來開啟了。

macOS 螢幕分享的 port 為 5900,以下就來介紹怎麼開啟與關閉的指令吧!

開始螢幕分享 Start Screen Sharing

輸入以下指令開始螢幕分享,

1
2
sudo defaults write /var/db/launchd.db/com.apple.launchd/overrides.plist com.apple.screensharing -dict Disabled -bool false
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.screensharing.plist

停止螢幕分享 Stop Screen Sharing

輸入以下指令停止螢幕分享,

1
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.screensharing.plist

其它相關文章推薦
Ubuntu 安裝 VNC Server
macOS 查詢 Xcode 版本的 3 種方法
macOS 安裝 zsh-completions 自動完成指令
mac 雙螢幕延伸模式的 dock 切換方法
macOS 版本升級的方法

Ubuntu 安裝 x11vnc VNC Server

本篇 ShengYu 紀錄在 Ubuntu 16.04 / Ubuntu 18.04 下安裝 x11vnc VNC Server,x11vnc 是一個遠端桌面伺服器,它允許使用者通過 VNC 協議來遠端訪問和控制正在運行的 X Window System(通常稱為 X11)桌面環境,也就是 x11vnc 會傳輸整個 X Window 的畫面,跟其他 vnc server 不太一樣,所以在使用時建議要設定密碼已達到最低程度的保護,
以下為 Ubuntu 安裝 VNC server 的內容,大概分為這幾部份,

  • Ubuntu 安裝 x11vnc VNC Server
  • 設定 VNC 密碼
  • 手動啟動 x11vnc server
  • x11vnc 參數說明
  • 自動啟動 x11vnc server (開機自動啟動)
  • 確認 x11vnc server 狀態
  • Ubuntu VNC 客戶端程式
  • Windows VNC 客戶端程式
  • macOS VNC 客戶端程式
  • SSH 通訊埠轉發

Ubuntu 安裝 x11vnc VNC Server

使用 apt 指令來安裝 x11vnc server

1
sudo apt-get install x11vnc

設定 VNC 密碼

設定 x11vnc 的連線密碼,使用 x11vnc -storepasswd 指令來設定之後未來 vnc 的連線密碼,並指定要將密碼存放在 /etc/x11vnc.pass 路徑下,

1
2
3
4
5
$ sudo x11vnc -storepasswd /etc/x11vnc.pass
Enter VNC password:
Verify password:
Write password to /etc/x11vnc.pass? [y]/n y
Password written to: /etc/x11vnc.pass

手動啟動 x11vnc server

手動啟動 x11vnc server,Ubuntu 16.04 可以使用下列指令,

1
2
3
4
5
6
7
8
sudo x11vnc \
-display :0 \
-auth /var/run/lightdm/root/:0 \
-forever -bg \
-noxdamage -noxrecord -noxfixes \
-rfbauth /etc/x11vnc.pass \
-rfbport 5900 \
-o /var/log/x11vnc.log

Ubuntu 18.04 可以使用下列指令,跟上面 Ubuntu 16.04 的差別在 -auth 參數,

1
2
3
4
5
6
7
8
sudo x11vnc \
-display :0 \
-auth /run/user/1000/gdm/Xauthority \
-forever -bg \
-noxdamage -noxrecord -noxfixes \
-rfbauth /etc/x11vnc.pass \
-rfbport 5900 \
-o /var/log/x11vnc.log

因為使用 -bg 參數會放到背景執行,所以要關閉 x11vnc server 可以使用 kill / killall 指令,

1
sudo killall x11vnc

或者 x11vnc 來關閉 x11vnc server

1
x11vnc -R stop

x11vnc 參數說明

以下為常用的一些 x11vnc 參數與說明,
-display :0:顯示和本地端的 DISPLAY :0, 即客戶端看到的畫面和本地端看的畫面一樣
-usepw:使用密碼
-nopw:不使用密碼
-rfbauth:指定之前設定好的 vnc 連線密碼檔
-bg:背景執行
-forever:繼續監聽更多 vnc 連線,沒有這個參數的話會在第一個客戶端離線後,就退出程式
-rfbport:指定 vnc 的連接埠
-o:輸出日誌
-auth guess 讓 vnc 自行猜測進行連線
-auth /var/lib/gdm/:0.Xauth 使用 GDM 的 X-Session 進行連線
-auth /var/run/lightdm/root/:0 使用 lightdm 的 X-Session 進行連線
-viewonly:所有客戶端只能看,沒有控制權,即不能控制滑鼠與鍵盤(預設關閉)
-shared:VNC display is shared, i.e. more than one viewer can
connect at the same time (default off).
-geometry WxH:顯示的大小,例如:-geometry 1024x768

自動啟動 x11vnc server (開機自動啟動)

Ubuntu 要開機自動啟動 x11vnc server 的話,就要寫一個 service 的設定檔,方法如下,
編輯 x11vnc.service,內容如下,這份設定適用於 Ubuntu 16.04,
Ubuntu 18.04 就把 -auth 改成 /run/user/1000/gdm/Xauthority 即可,
ExecStop 這行可有可無,

x11vnc.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
Description=x11vnc
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc \
-display :0 \
-auth /var/run/lightdm/root/:0 \
-forever -loop -noxdamage -repeat \
-rfbauth /etc/x11vnc.pass \
-rfbport 5900 \
-o /var/log/x11vnc.log \
-shared
ExecStop=/usr/bin/x11vnc -R stop

[Install]
WantedBy=multi-user.target

移動 x11vnc.service 到 /etc/systemd/system/ 路徑下,並修改存取權限

1
2
3
sudo mv ~/x11vnc.service /etc/systemd/system/
sudo chmod 644 /etc/systemd/system/x11vnc.service
sudo chown root:root /etc/systemd/system/x11vnc.service

重新載入設定值與啟動 x11vnc server 服務

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable x11vnc.service # 啟用 x11vnc 服務
sudo systemctl start x11vnc.service # 啟動 x11vnc 服務

確認 x11vnc server 狀態

確認 x11vnc server 有在執行

1
$ systemctl status x11vnc

或者用 ps 指令確認 x11vnc server 有在執行

1
$ ps aux | grep x11vnc

用 netstat 指令確認 x11vnc server 的監聽埠 5900

1
2
3
$ netstat -l | grep 5900
tcp 0 0 *:5900 *:* LISTEN
tcp6 0 0 [::]:5900 [::]:* LISTEN

Ubuntu VNC 客戶端程式

Ubuntu 可以使用內建的 Remmina Remote Desktop Client 來進行 VNC 連線,一些必要的設定與選項如下,

1
2
3
4
5
6
7
Name: xxx
Protocol: VNC-Virtual Network Computing
Server: ip:
User name:
Password: your password
Color depth: High color(16bit)
Quality: Good

若是區域網路內的連線,Color depth 可以選到最高 True color(24bit)

Windows VNC 客戶端程式

在 Windows 可以選用 REAL VNC 這款免費的 VNC Viewer,

macOS VNC 客戶端程式

macOS 內建有 VNC 客戶端程式,要使用 macOS 內建的 VNC 客戶端程式的方式法是 Finder > 前往 > 連接伺服器,之後輸入 vnc://<ip>,例如 vnc://192.168.1.5 再按連線即可。

SSH 通訊埠轉發

要安全地使用 x11vnc 的話,可以搭配 ssh 來達成安全性,
概念是將 x11vnc 改成綁定本機端 loopback 網路介面,這樣外部的連線就無法連上,

x11vnc 要綁定本機端 loopback 網路介面的方法是加上 -localhost 的參數,

1
x11vnc -localhost ... -rfbport 5900 ...

客戶端要使用 VNC 前,先用 ssh 通訊埠轉發,同時要確定客戶端沒有 5900 的服務正在開啟中,例如客戶端也有一個 VNC Server 的服務剛好也是使用 5900 的話就需要先關閉或改用其他 port,以下 ssh 指令使用後會登入遠端電腦並轉發這些通訊埠,一旦 ssh 連線終止轉發通訊埠也會終止,所以 ssh 登入後就保持連線直到使用完畢再終止連線即可,

1
ssh <x11vnc-server-host> -L 5900:localhsot:5900

然後客戶端再用 VNC 連接自己本機端的 port 5900 vnc://localhost:5900 即可。
如果 VNC 嘗試連線失敗時 ssh terminal 出現 channel 3: open failed: administratively prohibited: open failed 的錯誤訊息的話,可將 localhsot 改用 127.0.0.1 試試。

1
ssh <x11vnc-server-host> -L 5900:127.0.0.1:5900

其它參考
x11vnc(1) - Linux man page
https://linux.die.net/man/1/x11vnc
Bahut: VNC server for Cinnamon with systemd
http://bahut.alma.ch/2018/10/vnc-server-for-cinnamon-with-systemd.html

其它相關文章推薦
macOS Screen Sharing 用指令開啟螢幕分享

在 Ubuntu 下安裝 Anaconda

以下介紹如何使用 Ubuntu 16.04 安裝 Anaconda 環境

下載與安裝 Anaconda

歷史安裝包可以到 Anaconda installer archive下載,
目前最新版是︰
Anaconda2-2019.03-Linux-x86_64.sh
Anaconda3-2019.03-Linux-x86_64.sh

  • python2 請下載 anaconda2, python3 請下載 anaconda3
  • python2/anaconda2 才能跑 pyqt4, python3/anaconda3 才能跑 pyqt5
  • pyqt4 需下載2016年7月或更早的版本
1
bash Anaconda-latest-Linux-x86_64.sh

加入 PATH 設定

假設你把 anaconda 裝在 /opt/anaconda3 下,
可以使用下列指令設定 PATH 系統環境變數,
或者在 .bashrc 加入,每次使用 bash 便會自動設定,
第一次加入 .bashrc 完需 source ~/.bashrc 即可立即生效。

1
export PATH="/opt/anaconda3/bin:$PATH"

確認 Anaconda 安裝完成

可以使用 python --version 來確認 python 版本

參考
https://blog.csdn.net/huangjuegeek/article/details/73556763

相關主題
Python 第一支 Python 程式

Python 在 Ubuntu 下使用 Pycharm IDE 教學

本篇教學介紹如何在 Ubuntu 下安裝使用 pycharm,本篇 pycharm 教學會逐步從 apt 下載安裝開始到安裝完畢,最後是設定 anaconda 的 interpreter。

下載安裝 pycharm

1
2
$ sudo add-apt-repository ppa:mystic-mirage/pycharm
$ sudo apt update

安裝社群版 Install the community version

1
$ sudo apt install pycharm-community

安裝專業版 Install the Professional version

1
$ sudo apt install pycharm

在 pycharm 中設定 anaconda 的 interpreter

選擇 File->Default settings->Default project->project interpreter

點擊 project interpreter 的右邊的小齒輪,選擇 add local ,選擇anaconda文件路徑下的python.exe。接著pycharm會更新解釋器,導入模塊等,要稍等一點時間。

到目前為止,anaconda在pycharm中的配置就基本完成了。

如果要在已產生的專案切換 interpreter 的話則是
選擇 File->Settings->Project->Project Interpreter 進行切換

參考 Refernece
http://ubuntuhandbook.org/index.php/2016/07/latest-pycharm-ubuntu-16-04-ppa/

相關主題
Python 第一支 Python 程式

安裝 Qt 在 Windows 7 (使用MSVC)

本篇將會介紹一下如何在 Windows 下安裝 Qt 開發環境。

系統環境

以下為我的系統環境:

  • Windows 7
  • Qt5.10.0 (qt-opensource-windows-x86-5.10.0.exe)

安裝 Qt

先從官網下載 Qt, 目前最新為5.10,
可以依照你要開發的程式選擇對應的預編譯的函式庫

安裝好之後,

假如要寫32-bit的程式, 安裝時選擇 MSVC 2015 32-bit 預先編譯的QT函式庫,
把 Qt 32-bit DLL 路徑加進系統環境變數裡

1
C:\Qt\Qt5.10.0\5.10.0\msvc2015\bin

假如要寫64-bit的程式, 安裝時選擇 MSVC 2015 64-bit 預先編譯的QT函式庫,
把 Qt 64-bit DLL 路徑加進系統環境變數裡

1
C:\Qt\Qt5.10.0\5.10.0\msvc2015_64\bin

其它相關文章推薦
[Qt] 讀檔,讀取 txt 文字檔
[Qt] 寫檔,寫入 txt 文字檔
Qt產生的exe發布方式
Qt 新增多國語言.ts翻譯檔案
Qt5的中文亂碼問題如何解決

Ubuntu 安裝 WinUSB(WoeUSB)

Winusb(WoeUSB) 是一個在 Ubuntu 下把 Windows ISO/DVD 製作成 USB 安裝碟的工具,本篇要介紹如何在 Ubuntu 下編譯安裝 Winusb。

本篇使用 Ubuntu 16.04 安裝 Winusb

以下方法都要裝這個相依套件

1
sudo apt-get install libwxgtk3.0-dev

方法一,編譯安裝 slacka 的 WoeUSB

github: slacka/WoeUSB
編譯

1
2
3
4
5
6
git clone https://github.com/slacka/WoeUSB
cd WoeUSB
autoreconf --force --install # Most non-Debian derived distros will need this
./configure
make
sudo make install

啟動

1
sudo woeusbgui

方法二,編譯安裝 aaptel 的 WoeUSB

github: aaptel/WinUSB
版本1.0.11, 比方法三1.0.11版 多了一些修正

編譯

1
2
3
4
git clone https://github.com/aaptel/WinUSB
./configure
make
sudo make install

啟動

1
sudo woeusbgui

方法三,編譯安裝 debian 管理包的 WoeUSB

參考這篇 How to Install Winusb on Ubuntu 16.04

1
2
3
4
5
6
7
8
9
wget ftp://ftp.ru.debian.org/gentoo-distfiles/distfiles/winusb-1.0.11.tar.gz
tar xvf winusb-1.0.11.tar.gz
cd winusb-1.0.11/src
sed -i -- 's#wxStandardPaths().GetInstallPrefix()#wxStandardPaths::Get().GetInstallPrefix()#g' findFile.cpp
sed -i -- 's#wxStandardPaths().GetDataDir()#wxStandardPaths::Get().GetDataDir()#g' findFile.cpp
cd ..
./configure
make
sudo make install

啟動 同方法二