先來設定flask的開發環境

先來建立虛擬環境,來執行flask,先建立虛擬環境要用的資料夾,我是建立像是這樣’D:\Project\Python\study_flask\venv\flask00’建立這樣是因為會有可能多個測試環境,這樣各環境之間不會互相干擾

使用自帶的venv

經過實驗,目前無法在vscode裏來單步執行

安裝python的虛擬環境

  • 先切到此目錄下’D:\Project\Python\study_flask\venv’在下指令模式 python -m venv flask00 如下圖在flask00的資料下會產生相關的資料夾和程式庫

  • 起動虛擬環境,到flask00的路徑下的Scripts的目錄下執行activate.bat

    在起動時提示字元會換成資料夾名稱如下圖所示

  • 離開虛擬環境,到flask00的路徑下的Scripts的目錄下執行deactivate.bat

    提示字元會回到原來的提示字元

  • 安裝flask

    1
    pip install flask
  • 檢查flask版本

    1
    flask --version

第一個程式

在flask00的資料夾下建立helloflask.py內容

1
2
3
4
5
6
7
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, world'
if __name__ == '__main__':
app.run(debug=True)

在flask00的路徑執行python helloflask.py會出現如下的畫面

1
2
3
4
5
6
7
8
9
10
11
 * Serving Flask app "helloflask" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: on
* Restarting with stat
* Debugger is active!
* Debugger PIN: 313-752-154
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [12/Apr/2019 13:43:04] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [12/Apr/2019 13:43:04] "GET /favicon.ico HTTP/1.1" 404 -

打開瀏覽器,輸入http://127.0.0.1:5000

使用vscode來執行和偵錯(目前無法單步執行)

接上面的專案,先以命令列模式,先到flask00的目錄下執行“code .”來執行vscode,在vscode裏來編輯launch.json,來執行和debug此專案,launch.json的內容如下

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
{
"version": "0.2.0",
"configurations": [
{
"name": "Python Flask",
"type": "python",
"request": "launch",
"module": "flask",
"stopOnEntry": false,
// 將python指定為虛擬環境中的python
"pythonPath": "${workspaceRoot}/Scripts/python.exe",
"cwd": "${workspaceRoot}",
"env": {
// 指定這個項目的入口文件
"FLASK_APP": "helloflask.py",
"FLASK_ENV": "development",
"FLASK_DEBUG": "0"
},
"args": [
"run",
"--no-debugger",
"--no-reload"
],
// 虛擬環境的根目錄
"envFile": "${workspaceRoot}/.venv",
"jinja": true
}
]
}

**注意的是虛擬環境中的python的位置

**注意的是這個項目的入口文件

使用virtualenv的虛擬環境

使用第三方的虛擬環境

安裝virtualenv

會安裝在Lib\site-packages下

1
pip install virtualenv

卸載eirualenv

1
pip uninstall virtualenv

用virtualenv配置python虛擬環境

注意虛擬什麼版本python,一定是這個python提前已經裝好了

首先準備對哪個目錄進行虛擬,就到這個目錄下的上一層(D:\Project\Python\study_flask),然後運行命令:

1
2
virtualenv flaskenv
## 這是使用原來安裝的python版本

如果要安裝其他的版本,要指定安裝python的版本目錄

1
virtualenv -p c:\Python36\python.exe flaskenv

起動虛擬環境和退出虛擬環境

執行falskenv下的Scripts的activate.bat

1
flaskenv\Scripts\activate.bat

如下圖

退出虛擬環境

1
flaskenv\Scripts\deactivate.bat

使用vscode來執行和偵錯

在起動虛擬環境後,在建立一個flask00的資料夾, 之後在虛擬環境起動vscode

之後在vscode的工作區設定裏將虛擬環境的python執行路徑加入到python:Venv Path

1
D:\Project\Python\study_flask\flaskenv\Scripts

安裝flask

在虛擬的環境下來安裝

1
pip install flask

建立第一個flask程式

在study_flask下在建立一個hello_flask(記得要啟動虛擬環境)

1
mkdir hello_flask

在hello_flask下的目錄啟動vscode,在設定vscode的工作區設定裏將虛擬環境的python執行路徑加入到python:Venv Path

在app.py裏加入

1
2
3
4
5
6
7
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, world'
if __name__ == '__main__':
app.run(debug=False) # 設定False才可以在vscode裏單步偵錯

記得要vscode要重序起動

因為同事要使用3DPrint所以將放很久的設備拿出來整理一下

3D 印表機安裝記錄

  1. 首先安裝底座 先安裝長的兩個框框,鎖的時候要對準 接下將四根鋁擠裝上,就完成的底座,要確定有互相垂直
  2. 安裝Z軸
    距離是230mm,這裏要注意
  3. X軸的組裝
  1. Z軸和整體框架組裝
    Z軸組裝所需材料:列印件2,電機2,聯軸器2,m310螺絲8,m410螺絲4,m4T型螺母4
    <img src=Z軸組裝所需材料.png” style=”zoom:85%;” />

注意電機的接線的方向

所需材料:列印件2,330mm光軸2,300mm絲杆2,M410螺母4,M320螺絲2,M4T型螺母4,M3螺母*2

將框架,X軸以及以上配件裝配在一起如下圖

將框架,X軸以及以上配件裝配在一起如下圖

5 熱床組裝
熱床所需材料:熱床鋁板1,列印件4,m38螺絲6,m310螺絲2,m3平墊片8,m3螺母8

5-1 用m38的螺丝将y轴承座和m310的螺丝将y皮带座分别固定在铝板上,如下图

6 Y轴组装
所需材料:打印件6,电机1,345mm光轴2,直线轴承3,皮带轮1,695轴承1,m525螺丝1,m510螺丝2,
m58螺丝2,m410螺丝10,m310螺丝4,m5垫片4,m5 T型螺母4,m5螺母1

6-1 首先用m5
10螺丝和m525的螺丝将Y被动轮座安装如图所示,695轴承的两边分别垫2个m5的垫片
6-2 安裝y馬達座和皮帶輪。先用M5
8的螺絲和T型螺母固定在上面,在用M58的螺絲和T型螺母固定例一面。最後用4個M310的螺絲將馬達固定。
如下圖所示:在升級版安裝時,在內側的T型螺母要先將2020的鋁擠拆下來將此馬達座和螺絲先滑進去之後在來固定位置

7 电源安装
电源1,电源线1,红黑电源线1,打印件2,m410螺丝2,m38螺丝,m4T型螺母2,m3螺母*2

Prusa i3的注意事項

阻位開關,不是請參考下面的圖

申請免費的憑證的使用

記錄一下免費憑證的申請和放到IIS

  1. 開啟 SSL For Free 網站後,直接在上方填入你要申請 Let’s Encrypt 憑證的網域名稱,可以用空白來分隔不同的網址,
    例如「subdomain.domain.com domain.com other.com」,填入後點選右邊的「Create Free SSL Certificate」繼續。
  2. 為了確定這個網域名稱使你所有,會有兩種驗證方式,如果你的網站本身開啟 FTP 功能的話,可使用「Automatic FTP Verification」
    來輸入相關資訊完成驗證;因為要將驗證分段操作給讀者看,所以我選擇使用手動的驗證方式,必須自己下載檔案,依照說明上傳到主機。
    點選後,點選下方的「Manually Verify Domain」繼續。
  3. 點選網站上提供的檔案下載鏈結,依照說明順序建立兩層資料夾,將檔案放進去即可。記得要按下圖第 5 步驟的鏈結來看看能否正常讀取檔案,如果不行,代表你的路徑可能錯誤,總之呢要讓鏈結都能正常開啟,
    使SSL For Free能夠正常驗證你的站台。 先在網站建立一個資料夾叫 *.well-known/acme-challenge* 將第一次下載的檔上傳到 .well-known/acme-challenge 下 這裡我相信很多人都是在這邊失敗、失敗、再失敗!無論如何就是沒有辦法讓驗證鏈結正常開啟! 明明按照說明在站台建立好指定的路徑,也都正確放入驗證檔 在不斷的 google 找尋檔案後才發現原來因為他的鏈結路徑「.well-known\acme-challenge」*前面那個「.」關係*,站台認不出來! 就會一直無法正常顯示,在 IIS 平台上要記得先行設定 MIME類型,讓 IIS 認得「.well-known\acme-challenge」鏈結路徑 或者直接在 IIS 平台的站台上點選進入「MIME 類型」。 加入「副檔名: . MIME 類型:text/plain」即可。
  4. 確定驗證連結沒有問題後,再點選最下方的「Download SSL Certificate」,通過驗證後,SSL For Free 就會開始產生 SSL 憑證
  5. 當憑證產生後,你就能在最終的結果頁面看到這些資訊。不過在此之前,我會建議你先找到如下面擷圖標示出來的「Get Notified of Expiration」欄位,
    設定一組 Email 和密碼,即可在憑證過期前取得通知,以免錯過延長(renew)時間。
  6. 從網頁最下方點選「Download All SSL Certificate Files」就能打包這些檔案,
    解壓縮後可以取得一個私密金鑰(Privacy Key)、CA_bundle.crt 和 certificate.crt
    三個檔案,返回你的主機控制台,即可將憑證安裝進去囉!
  7. 產生的憑證是 .crt 非 .pfx,IIS 憑台只能使用 .pfx 憑證檔,所以這時候就需要透過工具做轉換,
    我們到 OpenSSL for Windows 去下載 OpenSSL 回來,並把他安裝完成
  8. 安裝完成後,開啟命令提示字元,透過下面的指令來執行格式轉換,
    過程中,OpenSSL 會要我們輸入一個保護 SSL 憑證的密碼(密碼在後面 IIS 匯入時會用到)
    注意:指令中 D:\Downloads\sslforfree\ 是電腦的路徑,請更改你放憑證檔的路徑。
    1
    D:\OpenSSL-Win64\bin\openssl pkcs12 -export -out D:\Downloads\sslforfree\certificate.pfx -inkey D:\Downloads\sslforfree\private.key -in D:\Downloads\sslforfree\certificate.crt -certfile D:\Downloads\sslforfree\ca_bundle.crt
  9. 執行完畢後,PKCS#12 憑證檔 certificate.pfx 就會產生在我們指定的目錄下面(檔案類型為個人資訊交換)。
  10. 我們只要把PKCS#12 憑證檔上傳到 IIS 的站台,請至 IIS 點選「伺服器憑證」 點選右邊動作「匯入 …」。 在匯入憑證視窗,點選「…」,選擇你產生出來的 certificate.pfx 憑證檔 並輸入之前使用 OpenSSL 轉檔時的密碼。 站台新增繫結,請先點選你的站台,在右邊動作點選「繫結」,於站台繫結點選「新增」。 類型選擇「https」,SSL 憑證就直接點選你剛剛放入的憑證。
參考資料

記錄一下小小輸人法

【小小輸入法】(無蝦米)

真心覺得不錯用….
幫忙中文化的泰瑞先生建議是一律將程式目錄複製到「C:\Windows」底下

1.下載解壓縮後將Terry_Yon資料夾放到「C:\Windows」

  1. C:\Windows\Terry_Yong\tsf\install.bat 按右鍵以系統管理員權限執行

3.Windows 8/8.1/10 使用者安裝成功後,請到「控制台」→「語言」(或「新增語言」)項下,
點選「中文(台灣)」旁的「選項」,新增「泰瑞版小小輸入法」

在正常情況下,
泰瑞版小小輸入法應該會被安裝到「中文(繁體,台灣)」(或「中文(台灣)」)這個輸入語言之下,
如果被安裝到「中文(簡體,中國)」這個輸入語言之下,
請執行「uninstall.bat」後,再重新「install.bat」,就會成功了!

4.製作「yong.exe」的捷徑,並存放到 Windows 程式集的「啟動」裡。
Windows 8/8.1/10 預設的「啟動」資料夾路徑是:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\啟動
(C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp –>英文版的路徑)

  1. C:\Windows\Terry_Yong\yong.exe 按右鍵以系統管理員權限執行

6.在工作列右邊的小蝸牛圖示上按滑鼠右鍵,選「結束」,即可關閉程式。
7.開啟/關閉輸入法主視窗(畫面右下方的橫條):Ctrl + Space(內置版請改為 Ctrl + )。 8.中打/英打切換:左 Shift。 9.打繁出繁/打繁出简切換:Ctrl + Alt + S。 10.半型/全型切換:Shift + Space。 11.半型/全型標點符號切換:Ctrl + .(針對 Shift + ~Shift + = 的符號進行全半型切換)。
12.重複上一個字:Ctrl + Alt + G。

輸入法模式切換:

Ctrl + Shift + 5:無蝦米;
Ctrl + Shift + 7:注音(只適合用來反查注音,不適合用來打字);
Ctrl + Shift + 9:英文。

注意:
(1)必須先開啟輸入法主視窗才能進行切換。
(2)在 Word 中,Ctrl + 1、Ctrl + Alt + 1 已定義為其他作用,因此使用以上熱鍵組合已是最佳選擇。

開啟螢幕小鍵盤(軟鍵盤):
Ctrl + Alt + K
注意事項:
(1)開啟後必須以滑鼠點選符號,而且使用完畢後必須自行關閉視窗。
(2)在主視窗上的「鍵盤圖示」上按右鍵,可切換至不同類別之符號。

◎特殊功能:
一、萬用碼:(Tab 上方的按鍵),不確定正確拆碼時,可用來進行模糊拆碼(一個「」代表一個模糊碼)。
二、注音輸入:除注音模式外,在其他中文模式下,可用「’」當作前導字元,然後模擬注音輸入。
三、手動反查組字字根:
切換到想查的輸入法模式(倉頡、行列30、無蝦米、注音、拼音、大易皆可),
選取並複製想要查的字(必須是單一漢字,而且一定要先按 Ctrl + C 複製起來),
再直接按「Ctrl + /」,即可反查該字在對應模式下的所有拆碼;
接著,可用滑鼠、方向鍵(加空白鍵)或鍵盤右邊的數字鍵,將反查到的拆碼直接「上屏」。
注意:在注音模式以外的其他中文模式下,因為結合注音輸入的功能,
   所以反查到的注音拆碼 它們會以「@」開頭,方便我們來識別。

以上整理來自「泰瑞版的小小輸入法」
http://terryhung.pixnet.net/blog/post/26968247

泰瑞版小小輸入法─安裝設置篇
http://terryhung.pixnet.net/blog/post/27952497

泰瑞版小小輸入法─相關字詞篇
http://terryhung.pixnet.net/blog/post/27912895

泰瑞版小小輸入法 for Linux
http://terryhung.pixnet.net/blog/post/28864128

參考資料

vim和vi相關

有關vim和vi的相關資訊
https://vim.rtorr.com/
https://github.com/kaochenlong/cch/blob/master/README.md

快捷鍵

  • 拷貝當前行yy,貼上p, 5yy拷貝5行
  • 刪除當前行dd, 5dd刪除5行
  • 查找關鍵詞命令行下/關鍵詞 n是查找下一個位置
  • 設置文件的行號和取消文件的行號命令行下 :set nu set nonu
  • 編輯文件到達首行gg , 到達最未行G在正常模式
  • 輸入時撒消動作u,在正常模式
  • 將光標移到指定的行數 13G

(1) 花式插入模式
i -> 在光標前插入
I -> 在句子前插入
a -> 在光標後插入
A -> 在句子後插入
o -> 在當前行下插入一行
O -> 在當前行上插入一行
(2) 花式移動光標
0 -> 數字零,到行頭
$ -> 到本行行尾
(3) visual
ctrl+v d刪除 shift+i 加入 esc兩次
shift+v

一般vim設定檔

1
2
3
4
5
6
" sudo vim .vimrc

set cursorline
set tabstop=4
set shiftwidth=4

Vim的設定檔

命令

1
2
# 重新載入目前vim的設定檔
:source
1
2
3
4
5
6
7
8
9
10
"設定行號
set number
"設定剪貼版共用
set clipboard=unnamed
"設定讓搜尋結果更明顯
set hlsearch
"設定游標所在處有底線效果
set cursouline
"不要產生Swap檔
set noswapfile

tab還是space?

  • set softtabstop=2
    使用2個space取代tab
  • set shiftwidth=2
    在>的時候使用2個空格做為縮排
  • set expandtab
    使用space取代tab
    命令
    :retab 動新設定文件裡的tab

關於搜尋

  • set ignorecase
    設定搜尋時不分大小寫
  • set incsearch
    只要部份關鍵字就有搜尋效果

關於編輯器的樣子

  • set showtabline=2
    只要有任何分頁都錢秀出來
  • set splitbelow
    新增水平視窗的時候會出現在下方
  • set splitright
    新增垂直視窗的時候會出現在右方

工程師的編輯器

  • syntax on
    打開程式碼語法高亮(幫程式碼上色)
  • filetype on
    偵測檔案型態
  • filetype indent on
    根據程式種類進行縮排
  • filetype plugin on
    根㯫程式語言種類載入外掛

以下是參考的設定

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

"設定內容:

set number
set clipboard=unnamed
set cursorline
set noswapfile

" search
set hlsearch
set ignorecase
set incsearch

" tab and space
set softtabstop=2
set shiftwidth=2
set expandtab

" tab
set showtabline=2
set splitbelow
set splitright

" color
syntax on
colorscheme darkblue

" filetype
filetype on
filetype indent on
filetype plugin on

Vim的設定之KeyMapping_part1

命令 Normal Mode Visual Mode Insert mode
map V V
nmap V
vmap V
imap V

指令

1
2
3
4
5
6
" 查看特殊鍵
:help key-notation
" 取消Key Mapping unmpa/nunmap/vunmap/iunmap
:unmap
" 把全部的對映都清掉
:mabclear
  • 想把方向鍵的功態關掉,強迫自已使用HJKL來移動游標
    1
    2
    :h key-notation
    :map <Up> <Nop>

Vim的設定之KeyMapping_part2

  • map時無窮迴圈

    • noremap no recursice mapping
    • 什麼時候該用noremap?
  • 如果把原來的功能map用掉了怎麼辦

    • Leader 預設值是 \
    • 用Leader有什麼好處
      1
      2
      " 把Leader設定成逗號
      :let mapleader = ","

Vim的設定之KeyMapping_part3

  • 設定成舊的vi
    1
    set nocompatible
  • 可檢視目前非預設值的設定
    1
    :set 
  • 主題
    1
    2
    3
    4
    colorscheme 列表
    " colorscheme ctrl+d
    " 如果沒有這個主題
    try ... catch ...endtry
  • 顯示目前游標所在地的狀態
    1
    set ruler
  • 剩下3行就開始捲動
    1
    set scrolloff=3
  • 斷行
    1
    2
    3
    4
    5
    6
    " 設定如果文字太多的話自動折行
    set wrap
    set nowrap
    " 在比較適當的地方換行
    set linebreak

  • 設定在左下角顯示現在模式
    1
    set showmode
  • 設定顯示敲打了什麼指令
    1
    set showcmd
  • 比較聰渡的搜尋
    1
    set smarcase
  • 設定顯示看不到的東西
    1
    2
    set list
    set nolist

vim之自動命令

有三個範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
" 視窗切換時候顯示/隱藏游標底線
autocmd WinEnter * setlocal cursorline
autocmd WinLeave * setlocal nocursorline

" 存檔時自動把行末多餘的空白刪除
autocmd BufWritePre * :%s/\s\+$//e

" 按下 F5 執行程式
if executable("ruby")
autocmd BufRead,BufNewFile *.rb noremap <F5> :% w !ruby -w<Enter>
else
autocmd BufRead,BufNewFile *.rb noremap <F5> :echo "you need to install Ruby first!"
endif

if executable("node")
autocmd BufRead,BufNewFile *.js noremap <F5> :% w !node<Enter>
else
autocmd BufRead,BufNewFile *.rb noremap <F5> :echo "you need to install Node.js first!"
endif

命令

1
2
3
4
"有關autocmd的事件
:h autocmd-events
"更多關於autocmd請查閱
:h autocmd

整理你的 Vim 設定

把設定全部寫在.vimrc有問題嗎?
vim 有一套推薦的規劃

1
:h vimfiles

vim的外掛

  • 外掛管理工具
    1
    2
    3
    4
    - VimPlug https://github.com/junegunn/vim-plug
    - Pathogen https://github.com/tpope/vim-pathogen
    - Vundle https://github.com/VundleVim/Vundle.vim
    - CSS Color https://github.com/ap/vim-css-color
  • 外掛夠用就好,用不到的就不要裝
  • 建議用Git管理設定

Vim 外掛介紹 part 1

相關連結:

Vim 外掛介紹 part 2

安裝外掛:
- ctrlp https://github.com/ctrlpvim/ctrlp.vim
- emmethttps://github.com/mattn/emmet-vim
- surroundhttps://github.com/tpope/vim-surround
- vim-repeathttps://github.com/tpope/vim-repeat

額外設定:
ctrlp

1
2
3
4
5
6
7
8
9
10
11
let g:ctrlp_custom_ignore = {
\ 'dir': '\v[\/]\.(git|hg|svn)$',
\ 'file': '\v\.(exe|so|dll)$',
\ 'link': 'some_bad_symbolic_links',
\ }
```
emmet
``` vim=
let g:user_emmet_install_global = 0
autocmd FileType html,css,scss EmmetInstall
autocmd Filetype html,css,scss imap <silent> <expr> <tab> emmet#expandAbbrIntelligent("\<tab>")

Vim 外掛介紹 part 3

額外設定:

  • NERDTree 設定:

切換目錄時可以切換起始目錄(Root Directory)

1
let NERDTreeChDirMode = 2

ctrlp 設定:

  1. 排除不想搜尋的 tmp 目錄。
  2. 把內建的 grep 換成速度更快的 silver searcher
1
2
3
4
5
6
7
8
9
10
11
12
let g:ctrlp_by_filename = 1
let g:ctrlp_custom_ignore = {
\ 'dir': '\v[\/]\.(git|hg|svn)$|tmp$',
\ 'file': '\v\.(exe|so|dll)$',
\ 'link': 'some_bad_symbolic_links',
\ }

if executable('ag')
set grepprg=ag\ --nogroup\ --nocolor
let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""'
let g:ctrlp_use_caching = 0
endif

需另外安裝 Silver Searcher:
https://github.com/ggreer/the_silver_searcher

參考連結:

Vim 外掛介紹 part 4

額外設定:
https://gist.github.com/kaochenlong/a999aee921b477a79fbbb7d251ecff9d

配色

vim的其它

搜尋和取代

1
:%s/text/cch/g

vim高見龍參考

安裝現成設定檔

參考資料

http://wiki.csie.ncku.edu.tw/vim/vimrc?printable
https://stackoverflow.com/questions/58676693/prevent-vscode-from-unfolding-code-when-cursor-moves-past-folded-section

https://www.yuexun.me/blog/the-vim-guide-for-vs-code-users/
https://chengjingchao.com/2020/06/13/VS-Code-%E4%B8%8E-Vim/

將看到脫窗的註解文字 深藍色 改變顏色

1
2
3
4
shell# vim /home/eric/.vimrc

hi Comment ctermfg=cyan

這是記錄Vim的顏色的設定

原來的設定有在註解看不清楚,所以來設定一下

記錄一下C#的用法

C# 6 的三個新的表示式

介紹 C# 6 的三個新語法:nameof 表示式、字串插值、和 null 條件運算子。

  1. nameof 表示式
    C# 6 新增的 nameof 關鍵字可用來取得某變數的名稱。請看底下這個簡單範例,便能了解其作用:
1
2
string firstName = "Joey";
string varName = nameof(firstName); // 編譯結果:varName = "firstName"

比如說,為了防錯,我們經常在函式中預先檢查參數值是否合法,並將不合法的參數透過拋異常(exception)的方式通知呼叫端(或者寫入 log 檔案以供將來診斷問題)。像這樣:

1
2
3
4
5
6
7
void LoadProduct(string productId)
{
if (productId == null)
{
throw new ArgumentNullException(nameof(productId));
}
}
  1. 字串插值
    NET Framework 提供的字串格式化方法 String.Format(…) 是一種對號入座的寫法,相當好用。
    現在,C# 6 提供了另一種格式化字串的寫法,名曰「字串插值」(string interpolation)。
    $”{變數名稱:格式規範}”

    1
    2
    3
    4
    5
    6
    7
    8
    string firstName = "Michael";
    string lastName = "Tsai";
    int salary = 22000;

    string msg1 = String.Format("{0} {1} 的月薪是 {2:C0}", firstName, lastName, salary);
    string msg2 = $"{firstName} {lastName} 的月薪是 {salary :C0}";
    Console.WriteLine(msg1);
    Console.WriteLine(msg2);
  2. Null 條件運算子
    保險起見,在需要存取某物件的屬性之前,我們通常會先檢查該物件是否為 null

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    static void NullPropagationDemo(string s)
    {
    if (s?.Length == 4) // 只有當 s 不為空時才存取它的 Length 屬性。
    {
    // Do something.
    }
    }

    int? length = productList?.Length; // 若 productList 是 null,則 length 也是 null。
    Customer obj = productList?[0]; // 若 productList 是 null,則 obj 也是 null。
    int length = productList?.Length ?? 0; // 若 productList 是 null,則 length 是 0。
    string name = productList?[0].FullName; // 若 productList 是 null,則 name 是 null。

有關json的用法

字串轉json物件,json物件轉字串

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public static void strJson()
{
string jsonText = "{\"shenzheng\":\"深圳\",\"beijing\":\"北京\",\"shanghai\":[{\"zj1\":\"zj11\",\"zj2\":\"zj22\"},\"zjs\"]}";
//转为json对象
JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText);
string zone = jo["shenzheng"].ToString();//输出 深圳
string zone_en = jo["shanghai"].ToString();//"[\r\n {\r\n \"zj1\": \"zj11\",\r\n \"zj2\": \"zj22\"\r\n },\r\n \"zjs\"\r\n]"
string zj1 = jo["shanghai"][1].ToString();//"zjs"
Console.WriteLine(jo);
}
//对象与数组转JSON
public static void GetJsonString()
{
//初始化对象
Obj product = new Obj() { Name = "苹果", Price = 5.5 };
//序列化
string o = new JavaScriptSerializer().Serialize(product);//值:"{\"Name\":\"苹果\",\"Price\":5.5}"



//数组转json
List<Obj> products = new List<Obj>(){
new Obj(){Name="苹果",Price=5.5},
new Obj(){Name="橘子",Price=2.5},
new Obj(){Name="干柿子",Price=16.00}
};

ProductList productlist = new ProductList();
productlist.GetProducts = products;
//序列化
string os = new JavaScriptSerializer().Serialize(productlist);
//输出 "{\"GetProducts\":[{\"Name\":\"苹果\",\"Price\":5.5},{\"Name\":\"橘子\",\"Price\":2.5},{\"Name\":\"干柿子\",\"Price\":16}]}"
}

//json转对象、数组, 反序列化
public static void JSONStringToList()
{

//json格式字符串
string JsonStr = "{Name:'苹果',Price:5.5}";
JavaScriptSerializer Serializer = new JavaScriptSerializer();

//json字符串转为对象, 反序列化
Obj obj = Serializer.Deserialize<Obj>(JsonStr);
Console.Write(obj.Name + ":" + obj.Price + "\r\n");



//json格式字符串
string JsonStrs = "[{Name:'苹果',Price:5.5},{Name:'橘子',Price:2.5},{Name:'柿子',Price:16}]";

JavaScriptSerializer Serializers = new JavaScriptSerializer();

//json字符串转为数组对象, 反序列化
List<Obj> objs = Serializers.Deserialize<List<Obj>>(JsonStrs);

foreach (var item in objs)
{
Console.Write(item.Name + ":" + item.Price + "\r\n");
}
}

分組的用法

過去面對這種問題,我慣用的做法先定義一個Dictionary<string, List>,使用 foreach 逐筆抓取來源資料
foreach + Dictionary寫法用了好幾年,前幾天才忽然想到,這不就是SQL語法中的GROUP BY嗎?加上LINQ有ToDictionary, GroupBy(o => o.客戶編號).ToDictionary(o => o.Key, o => o.ToList()) 一行就搞定了呀!阿呆。

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace LinqTip
{
class Program
{
public enum Teams
{
Valor, Mystic, Instinct, Dark
}
 
public class Trainer
{
public Teams Team;
public string Name;
public Trainer(Teams team, string name)
{
Team = team; Name = name;
}
}
 
static void Main(string[] args)
{
//來源資料如下
List<Trainer> trainers = new List<Trainer>()
{
new Trainer(Teams.Valor, "Candela"),
new Trainer(Teams.Valor, "Bob"),
new Trainer(Teams.Mystic, "Blanche"),
new Trainer(Teams.Valor, "Alice"),
new Trainer(Teams.Instinct, "Spark"),
new Trainer(Teams.Mystic, "Tom"),
new Trainer(Teams.Dark, "Jeffrey")
};
//目標:以Team分類,將同隊的訓練師集合成List<Trainer>,
//最終產出Dictionary<Teams, List<Trainer>>
 
//以前的寫法,跑迴圈加邏輯比對
var res1 = new Dictionary<Teams, List<Trainer>>();
foreach (var t in trainers)
{
if (!res1.ContainsKey(t.Team))
res1.Add(t.Team, new List<Trainer>());
res1[t.Team].Add(t);
}
 
//新寫法,使用LINQ GroupBy
var res2 =
trainers.GroupBy(o => o.Team)
.ToDictionary(o => o.Key, o => o.ToList());
}
}
}
參考

記錄CentOS的安裝,主機板有使用UEFI和沒有使用UEFI

有使用UEFI

在設置biso的UEFI的設罝,將QuickBoot/FastBoot和Secure Boot已被禁用

在使用ISO燒錄的注意事項

目前使用Rufus,選擇GPT

加入強制使用 GPT 分割表的安裝參數

使用方向鍵,將游標移動到『 Install CentOS 7 』的項目中
按下鍵盤的 [Tab] 按鈕,讓游標跑到畫面最下方等待輸入額外的核心參數
在出現的畫面中,輸入如下畫面的資料 (注意,各個項目要有空格,最後一個是游標本身而非底線)
其實重點就是輸入『 inst.gpt 』這個關鍵字

### 文字模式安裝 inst.text
1
2
vmlinuz initrd=initrd.img linux dd quiet
vmlinuz initrd=initrd.img inst.stage2=hd:/dev/sdc4 quiet

防火牆設定

顯示目前的設定

1
 firewall-cmd --list-all

需要打開的防火牆

1
2
3
4
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --permanent --zone=public --add-port=22/tcp
firewall-cmd --reload

關閉 SELinux

開啟檔案 /etc/selinux/config:
vi /etc/selinux/config
找到以下一行:
SELINUX=enforce
改成:
SELINUX=disabled

安裝MariaDB 10.2 的版本

透過 MariaDB 官方提供的 Repositories快速的在 Linux 上佈署 MariaDB 是蠻簡單的事情
像是 Ubuntn 或 Debian 也都只需要跟著步驟操作即可首先連結到 Setting up MariaDB Repositories 頁面
選擇 系統、版本 和 MariaDB 版本,稍等一下就會顯示安裝步驟
以 CentOS 7 為例
先在 /etc/yum.repos.d/MariaDB.repo 檔案,內容如下

1
2
3
4
5
6
7
# MariaDB 10.2 CentOS repository list - created 2017-11-28 09:28 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

安裝MariaDB 10.3 的版本

透過 MariaDB 官方提供的 Repositories快速的在 Linux 上佈署 MariaDB 是蠻簡單的事情
像是 Ubuntn 或 Debian 也都只需要跟著步驟操作即可首先連結到 Setting up MariaDB Repositories 頁面
選擇 系統、版本 和 MariaDB 版本,稍等一下就會顯示安裝步驟
以 CentOS 7 為例
先在 /etc/yum.repos.d/MariaDB.repo 檔案,內容如下

1
2
3
4
5
6
7
8
# MariaDB 10.3 CentOS repository list - created 2018-06-11 06:16 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.3/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

接著時間下 yum 指令來進行安裝

1
2
3
yum install MariaDB-server MariaDB-client

sudo MariaDB-server MariaDB-client

若詢問是否 Importing GPG key 就同意吧,等跑完就安裝起好了
啟動 並設定開啟 自動啟動

1
2
3
4
# 馬上啟動 MariaDB
systemctl start mariadb
# 設定開機自動啟動
systemctl enable mariadb

若是全新安裝,就是跟著做安全性的初始化

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
# 設定 root 的密碼
# 將 new-password 取代成要使用的新密碼
[root@git ~]# /usr/bin/mysqladmin -u root password 'new-password'
 
[root@git ~]# /usr/bin/mysql_secure_installation
 
# 輸入目前的 root 密碼,直接輸入剛剛設定的密碼
Enter current password for root (enter for none):
 
# 是否變更 root 密碼,因為是剛設定 應該不用變更了
Change the root password? [Y/n]
 
# 是否移除匿名帳號,按下 y 選擇移除
Remove anonymous users? [Y/n]
 
# 是否拒絕遠端使用 root 權限登入
# 依照個別需求,沒特別需要遠端管理就按 y 吧
Disallow root login remotely? [Y/n]
 
# 是否移除 test 這個測試資料庫,和相關權限
# 沒有需求就移除吧
Remove test database and access to it? [Y/n]
 
# 是否重新載入權限資料表,按 y
Reload privilege tables now? [Y/n]

如果是ubuntu mariadb 安裝

注意設定檔
Ubuntu 開啟 MySQL 遠端連線的設定方法
設定 MySql的bind-address:

1
2
3
4
將bind-address取消
[mysqld]
……
#bind-address = 127.0.0.1 (在前面加#註解掉此行)

要將創建功能打開 參考

1
2
mysql> show variables like '%func%'; 
mysql> set global log_bin_trust_function_creators=1;

在移動資料庫時,如果有升級時要升級的指令

1
mysql_upgrade -u root -p

MariaDB設定utf8

在 /etc/my.cnf.d/server.cnf

1
2
3
4
[mysqld]
init-connect='SET NAMES utf8mb4'
collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4

在 /etc/my.cnf.d/mysql-clients.cnf

1
2
3
[mysql]
default-character-set=utf8mb4

mysql命令

1
2
sudo systemctl restart mariadb
sudo systemctl status mariadb

若啟動失敗,可至 /var/log/mariadb/error.log 查看錯誤記錄

新增使用者帳號

在 host_db 主機登入資料庫

1
$ mysql -u root -p

新增一個可從 % 主機登入的使用者 username ,密碼為 password

1
CREATE USER 'username'@'%' IDENTIFIED BY 'password';

加上所有權限

1
2
grant all privileges on *.* to root@'%' identified by '12345678' with grant option;
FLUSH PRIVILEGES;

Core安裝2.1

安裝完後,它的路徑有改,放在/usr/share/dotnet
Find the package installed

1
yum list installed | grep "aspnet"

Remove the package

1
yum remove aspnetcore-store-2.0.0.x86_64

安裝sdk2.1

1
2
3
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
sudo yum update
sudo yum install dotnet-sdk-2.1

加入symbolic link

1
sudo ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet

Core安裝2.0

Add the dotnet product feed

1
2
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[packages-microsoft-com-prod]\nname=packages-microsoft-com-prod \nbaseurl= https://packages.microsoft.com/yumrepos/microsoft-rhel7.3-prod\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/dotnetdev.repo'
  1. Install the .NET SDK
    1
    2
    3
    sudo yum update
    sudo yum install libunwind libicu
    sudo yum install dotnet-sdk-2.1.4
  2. 驗證.NET Core安裝
    來到這裡你已經成功安裝.NET Core,建立一個專案測試一下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #建立Console專案
    [root@localhost ~]# dotnet new console -o hwapp
    #移至目錄
    [root@localhost ~]# cd hwapp
    #restore dependencies,例如JSON.NET,EntityFramework,Bootstrap等Library
    [root@localhost ~]# dotnet restore
    #執行
    [root@localhost ~]# dotnet run
    #***Output***: #> Hello World! 

安裝Nginx

在 RHEL, CentOS 或 Fedora 安裝 Nginx, 最簡單的方法是先加入 Nginx 的 CentOS 7 yum repository, 然後用 Yum 安裝

  • 編寫最新的 Nginx 套件位置
    1
    2
    3
    4
    5
    6
    #vim /etc/yum.repos.d/nginx.repo
    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=0
    enabled=1
  • 更新一下所有套件庫的快取資料。
    1
    yum -y update
  • 利用 yum 安裝
    1
    yum install nginx
  • 啟動防火牆
    1
    2
    3
    firewall-cmd --permanent --zone=public --add-service=http
    firewall-cmd --permanent --zone=public --add-service=https
    firewall-cmd --reload
  • 設定ngix
    安裝好 Nginx 網頁伺服器後, 便可以用 systemctl 啟動/停止/重新啟動 Nginx, 現在啟動 Nginx 及設定開機自動啟動:
    1
    2
    systemctl start nginx.service
    systemctl enable nginx.service

設定nginx

以下是default的設定範例 /etc/nginx/conf.d/default.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 80;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
}
}

建立好設定檔後透過以下命令重新啟動 nginx

1
2
3
4
systemctl restart nginx.service
sudo service nginx restart
sudo nginx -t 以驗證組態檔的語法

建立服務檔

指令如下

1
vim /etc/systemd/system/gomoshop.service

內容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=GomoShop running on Centos7

[Service]
WorkingDirectory=/home/wwwdata/wwwshop
ExecStart=/usr/bin/dotnet /home/wwwdata/wwwshop/Gomo.CC.UI.Portal.dll
Restart=always
RestartSec=10 # Restart service after 10 seconds if dotnet service crashes
SyslogIdentifier=dotnet-gomoshop
User=root
Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]
WantedBy=multi-user.target

指令參考

1
2
3
4
5
systemctl enable gomoshop.service
systemctl status gomoshop.service
systemctl restart gomoshop.service
journalctl -fu gomoshop.service

參考
  1. Rufus的官方網站
  2. Rufus製作Ubuntu 16.04 USB安裝隨身碟
  3. Core安裝
  4. 鳥哥

安裝vsftp

我們從 CentOS 官方套件庫直接安裝就可以了。

1
sudo yum -y install vsftpd

啟動服務
不必修改任何設定值,就可以正常的啟動 vsFTPd 服務

1
sudo systemctl restart vsftpd

預設的 FTP 根目錄在 /var/ftp。
我們可以視需求,決定是否讓服務在開機時就自動啟動。

1
sudo systemctl enable vsftpd

主設定檔及相關設定檔的預設儲存目錄在 /etc/vsftpd。

1
sudo vi /etc/vsftpd/vsftpd.conf

其他相關設定
防火牆

1
2
sudo firewall-cmd --permanent --zone=public --add-service=ftp
sudo firewall-cmd --reload

如果有啟用被動模式的話,再加上指派給它的通訊埠範圍。

1
2
sudo firewall-cmd --zone=public --add-port=60101-61200/tcp
sudo firewall-cmd --reload

相關設定檔
/etc/vsftpd/ftpusers
這個檔案用來列出絕對禁止登入 FTP Server 的本機使用者,預設的名單有 root 跟一些常見的本機服務帳號,像是 mail、sync、shutdown … 之類的。

安裝ftpclient

下達下面的指令

1
yum install –y ftp
參考
0%