Tomatokai

學習,是一趟自我愉悅的旅行


  • 主頁

  • 標籤

  • 分類

  • 歸檔

演算法學習筆記

Posted on 2019-08-30

由於缺乏對演算法和資料結構的知識,因此即便會用程序解決一些事情,但是對比專業的人員還是相差很大。如果可以了解演算法和熟悉運用資料結構,那麼對於後續的編寫程式會有很大的提升,因此即便是自學,也可以不落下這一塊的內容

演算法的簡單概念

輸入 + 演算法 = 輸出
設計演算法需要很嚴格的定義,但是對於演算法本身的定義卻是比較含糊的,對於入門的我來說,知道上面一個簡單的公式即可。

如何衡量演算法的好壞

  • 時間緯度(時間複雜度)
  • 記憶體緯度(空間/內存)
    由於現在cpu比記憶體珍貴很多,因此我們優先考慮時間緯度。

好的演算法 = 步驟少 + 空間佔用少

演算法的時間緯度符號很多,但目前用的多的是大O,所以入門暫時就把心思花在這裏吧。
另外執行的情況都是在最糟糕的情況下來算n。

常見的六種時間複雜度與演算法

  • O(1):陣列讀取(list讀取)
  • O(n):簡易搜索
  • O(log n ):二分搜索
  • O(nlogn):合併排序
  • O(n^2):選擇排序/插入排序
  • O(2^n):斐波那契數列

資料結構基礎知識

摘自《我的第一本算法書》,用於回憶學習用

鏈表

優點:增加和刪除快(只需時間O(1)),只需要改變指針即可
缺點:訪問慢(時間緯度O(n))
種類:單向鏈表,雙向鏈表,環形鏈表
特點:分散存儲於內存中,訪問則需要按照順序訪問。

數組

優點:訪問快(O(1)),直接通過下標訪問如:array[1]
缺點:創建和刪除慢(O(n))

棧

特點:後進先出(LIFO),只能操作一端的數據,如若需要訪問其他層,需要調換順序,在只需要訪問最新數據時,使用棧就比較方便了.
入棧(push),出棧(pop)
舉例:規定(AB(C(DE)F)(G((H)IJ)K))這一串字符中括號的處理方式如下:
首先從左邊開始讀取字符,讀到左括號就將其入棧,讀到右邊括號就將棧頂的左括號出棧。此時,出棧的左括號便於當前讀取的右括號相匹配。
通過這種方式,我們就能得知配對括號的具體位置。
ps:在深度優先搜索算法中,通常會選擇最新的數據作為候補頂點。在候補頂點的管理上就可以使用棧.

隊列

特點:先進先出(FIFO),添加和刪除操作可以在兩端,添加操作(入隊),刪除操作(出隊)
ps:廣度優先搜索法中,通常就會從搜索候補中選擇最早的數據作為下一個頂點。此時,在候補頂點的管理上就可以使用隊列了。

哈希表

特點:類似於python中的字典,採用key-value的方式;
大概計算原理:假如有5個存儲位置,我們需要存儲每個名字和名字對應的性別;則我們可以根據名字(joy)計算出哈希值(通過哈希函數計算),
得到哈希值後,繼續採用mod運算,得到餘數,把該joy的數據存到該餘數的位置。
若存儲過程中,有多個數據餘數一樣(即是發生衝突),則可以採用鏈表存儲(鏈地址法),也可採用開放地址法(計算出一個/n個候補位置)

堆

結構規則:

  • 子節點必定大於父節點(頂部的為父節點)
  • 最小值被存在頂點
  • 添加數據時,會把新數據放在最下面一行靠左的位置(然後於父節點對比,小於父節點則交換位置)
  • 取出最小值後,把最後一行,最右側的數據提升到最上方,同時與左右子節點對比(與較小的值換位置)
    時間複雜度:
  • 取最小值(O(1))
  • 數據重構時間(O(logn))
二叉查找樹

結構規則:

  • 左邊子節點均比父節點小,右邊子節點均比父節點大
  • 查找最小值(從頂端開始,往左下最底端查找)
  • 查找最大值(從頂端開始,往右下最底端查找)
  • 添加數據(不斷的與父節點對比,< 則往左,>則往右
  • 刪除數據(若在最底端,則直接刪除;若只有一個子節點,則刪除後子節點往上移;若存在兩個子節點,則把左樹中最大節點(或者右樹中最小節點)移動到被刪除的節點
    時間複雜度:
    節點若較為均衡,則為O(log(n)),最壞的情況為O(n),
    以二叉查找樹為基礎拓展的平衡二叉查找樹(B樹)則是為了提高查找效率而做的數據結構

先進們的貢獻

胡程維《談什麼是演算法和時間複雜度》

胡程維《從時間複雜度認識常見的演算法》

Git與Github的基本指令

Posted on 2019-07-30

之前學python的時候,了解到git是非常重要的基礎,學會git可以讓編程工作變得更加順暢和大大的提高了團隊協作。在此通過學習基本的指令後,再讀幾遍系統文檔,應該會對今後的工作大有幫助。

感謝先進們的奉獻,在此放上連結方便學習。
《Git 與 Github 版本控制基本指令》
《30天精通Git版本控管》
《Git官方網站》
《Git-it 台灣》手把手入門
《Git 中文手冊》
《Git 超親和力猴子教學》

基礎入門

安裝Git(此處略過,可查看文獻1)
設定帳戶名稱和郵箱

最好和github上的一致,方便管理

git config --global user.name "<your name>"
git config --global user.email "<your@mail.com>"
#查看帳戶名和郵箱
git config user.name
git config user.email
#更改帳戶名和郵箱
git config --global user.name "your name"
git config --global user.email "your email"
建立一個本地的repository

如果沒有權限,經常需要輸入sudo,可以在該文件夾輸入 sudo -s以授權
repository(檔案庫)可以簡單看成一個資料文件夾。

mkdir hello-git
cd hello-git
git init
ls -la
檢查狀態,新增或修改 commits

此處建立一個hello.py的文件

#在項目文件夾查看工作環境狀態
git status
#新增追蹤(這樣修改檔案後就會追蹤到)
git add hello.py
#檢查下狀態,比較下差異,若無問題則commit到respository上
git status
git diff
#提交並備註修改信息
git commit -m "寫上具體修改了什麼,方便協作"
#執行上一步後,就提交完成了,可以查看下狀態
git status

若反悔不想把檔案(文件)加到追蹤,則可以按照以下處理

#檔案尚未加入追蹤使用(未add)
git rm --cached hello.py

#檔案已經在repository內,則使用以下指令
git reset HARD
修改後非常重要的細節

當追蹤的文件修改後,例如修改了hello.py的內容,需要再次add 修改的文件(細節)
若是喲啊放棄修改,可以使用git checkout – 文件名稱.
確定修改後,可以執行以下指令:

git diff
git status
# -a 是add ,-m 是message的簡寫
git commit -a -m "修改了hello.py“

注册Github账号

註冊后就可以通过 git config –global user.username <github账户名> 绑定即可,
註冊步驟可以參考文獻1.

註冊完後可以創建一個線上的文件夾(檔案庫)repository! 通常github線上和本機的文件夾名稱保持一致會容易管理.

本機與Github遠程連結

在github新建一個repository後,會得到一個https的連結,複製此連結,然後執行指令:

#cd 到對應的檔案庫(文件夾)
git remote add origin <remote 網址>
#幫一個remote設定地址
git remote set-url <remote 網址>
#查看有哪些remote連結
git remote -V

#檢查後,把本地檔案push到遠程github
git status
git push -u origin master

參數 -u 等於 –set-upstream,設定upstream可以使分支開始追蹤遠程分支,只需要做一次該指令,並push成功後,今後就會自動追蹤,只需要透過git push即可

Fork 和 clone一個open source(開源)計畫

git clone 了文件後,進入建立一個屬於自己的分支(branch)

cd react
#切出自己的新分支
git checkout -b tomatokai@feature_branch
#修改下README.md,然後commit到自己fork的專案
git commit -a -m "更新了README"
git push origin origin tomatokai@feature_branch

建立一個feature branch

#建立一個名為dev的branch(需要cd到文件夾)
git checkout -b dev
#修改hello.py的內容後提交
git commit -a -m "Init dev branch"
git push origin dev

邀請別人合作

在github中——setting——collaborators中設置邀請

利用push和pull來和Github.com同步

#通過git pull保持本地和遠程代碼同步
git pull origin dev

merge(合併)和刪除branches

#移動到 master branch
git checout master
#合併dev到master
git merge dev
#刪除dev branch
git branch -d dev
#將合併後的master推送到遠端
git push origin master

Github修改密碼後重新更改hexo的ssh方法

Posted on 2019-07-24

重新設置github密碼後,原來可以通過hexo d上傳的ssh需要重新更改設置下,以此做備份方便下次再修改使用

重新生成keygen

ssh-keygen -t rsa -C "***@hotmail.com"

按兩次回車後,會覆蓋原來的文件,
mac文件在 /Users/<用戶名>/.ssh/id_rsa.pub

把裡面的內容複製起來,放到github的ssh key上。
登陸 github > setting > ssh > 添加複製即可,名字可以自定義,內容黏貼pub裡面的即可。

Docker 基本語法備忘

Posted on 2019-07-24

由於初學docker,個人學習習慣是在實踐中了解每個指令的作用,因此作此備忘錄,侷限學者方便複習。有需要學習的,完整教材可以查看以下兩個良心連結。

《Docker 从入门到实践》简体中文版

《Docker 從入門到實踐》正體中文版

《ocker Compose 命令說明》

启动

docker run -t -i -d
  • -t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,
  • -i 则让容器的标准输入保持打开。
  • -d 表示守護狀態打開

進入容器

  • docker attach 命令

    docker attach <containersID>
  • docker exec 命令 (配合 -dit使用)

  • 推荐大家使用 docker exec 命令,(attach从这个 stdin 中 exit,会导致容器的停止,exec不會,所以推薦用exec)

    docker run -dit ubuntu
    docker exec -i  <containersID> bash
  • 不清楚的時候,多使用docker exec –help查看

導出導入容器

暫時不明白這部分的主要作用是什麼

#導出
docker export <containersID> > ubuntu.tar

#導入
cat ubuntu.tar | docker import - test/ubuntu:v1.0

數據管理

数据卷(Volumes)

創建一個數據卷

docker volume create my_vol

查看指定的數據卷

docker volume inspect my_vol

查看容器的具體信息

docker inspect odoo

刪除某一個數據卷

docker volume rm my_vol

刪除無主的數據卷(好像停止的容器也屬於無主)

docker volume prune
挂载主机目录 (Bind mounts)

比較好用,數據庫更新的頻繁,掛載出來比較方便

使用mount掛在

docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp \
--mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp \
python app.py

上面的命令:
加载主机的 /src/webapp 目录到容器的 /opt/webapp目录。
本地目录的路径必须是绝对路径。
使用 -v 参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹,使用 –mount 参数时如果本地目录不存在,Docker 会报错。

掛載的命令默認是 讀寫,如需改為讀,增加readonly:

docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp:ro \
--mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
training/webapp \
python app.py

需要了解的額外知識點

什麼是Nexus

Centos7 安裝python3 及jupyter notebook

Posted on 2019-07-18

前提準備

安裝工具yum-utils

用於管理repository和擴展包

yum install yum-utils
為python3 構造環境
yum-builddep python
下載python3源代碼包
curl -O https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz
安装依賴包

有些系統沒有依賴包,導致安裝完成後沒有pip3

yum -y install bzip2-devel sqlite-devel openssl-devel readline-devel xz-devel xz-devel tk-devel gdbm-devel
安裝pyhon3

默認安裝目錄/usr/local

tar xf python-3.7.1.tgz
cd Python-3.7.1
./configure prefix=/usr/local/python3
make && make install

#设置路径
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip

檢查安裝是否成功

python3 -V

設置為默認版本

此處可以不設置,根據個人喜好

vi /etc/profile.d/python.sh

增加一行

alias python='/usr/local/bin/python3.7'

設置權限

chmod 755 /etc/profile.d/python.sh

重啓使配置生效

source /etc/profile.d/python.sh

安裝jupyter notebook

安裝pip(2.7)
yum -y isntall python-pip
pip install --upgrade pip
安裝pip34
yum install python3.4-pip
pip3.4 install --upgrade pip
安裝相關依賴
yum -y groupinstall "Development Tools"
yum -y install python-devel
配置虛擬環境
安裝 pipenv
pip3.4 install pipenv
創建虛擬環境
#创建虚拟环境
mkdir Jupyter    
#进入虚拟环境
cd Jupyter
#安裝環境
pipenv install
#安裝依賴包
pipenv install requests
pipenv install bottle
#查看安裝模塊依賴關係
pipenv graph
安裝jupyter
pip install jupyter

刪除python3

#強制刪除安裝程序及關聯
rpm -qa|grep python3|xargs rpm -ev --allmatches --nodeps

whereis python3 |xargs rm -frv

在Docker中運行centos7

Posted on 2019-07-05

centos7有一個大坑,直接執行不了systemctl命令,需要升級到7.2解決,或者通過以下命令進入

#啟動需要等待1分30秒
docker run --name centos_7 -it --privileged tomatokai/centos /usr/sbin/init
docker exec -it <containID> /bin/bash

搭建自己的centos

安裝centos

docker pull centos
docker run -it --privileged centos /usr/sbin/init

進入centos

docker exec -it <containID> /bin/bash
docker exec -it centos /usr/sbin/init

為了啟動docker,天坑開始

#安裝service
yum install initscripts
#依然啟動不了docker,檢查問題所在((code=exited, status=1/FAILURE))
systemctl status docker.service
#修改如下
vi /lib/systemd/system/docker.service
#然後將ExecStart這裏改為如下
ExecStart=/usr/bin/dockerd -H fd:// -s overlay2

安裝 oh my zsh

安裝 docker

生成專屬的centos鏡像

docker commit <containsID> tomatokai/centos
docker tag <imagesID> 127.0.0.1:5000/tomatokai/centos
docker push 127.0.0.1:5000/tomatokai/centos

Win10下完美運行docker

Posted on 2019-07-03

通过Docker搭建ngrok实现内网穿透

Posted on 2019-07-02

之前直接使用centos7搭建了ngrok,可以順利穿透內網,但是聽先進說這樣會佔用了端口,所以採用docker+ngrok的方式更加的優

可能會用到的centos輔助命令

端口命令連結

#查看80端口狀況
lsof -i tcp:80
#列出所有端口
netstat -ntlp

採用Docker + ngrok

前面的域名設置是一樣的,可以參考上一篇centos7 搭建自己的ngrok服務

由於之前的go版本問題,導致做出來的客戶端無法在linux運行(mac和windows都沒有問題),此時需要做如下修改後,再啟動容器

git clone https://github.com/hteen/docker-ngrok.git
cd docker-ngrok
sed -i '1cFROM golang:1.8.3' Dockerfile
sed -i '4cRUN apt-get install git make openssl'     Dockerfile
docker build -t hteen/ngrok .

創建docker ngrok容器

docker run -idt \
--restart always \
--name ngrok-server \
-p 8880:80 \
-p 8443:443 \
-p 4443:4443 \
-v /data/ngrok:/myfiles \
-e DOMAIN='nb.coodata.cn' \
hteen/ngrok /bin/sh /server.sh

備註:記得把nb.coodata.cn改為自己的域名

第一次創建的時候直接可以運行,第二次則出現問題(exit status 1)通過以下代碼解決

pkill docker                 #终止进程
iptables -t nat -F           #清空nat表的所有链
ifconfig docker0 down        #停止docker默认网桥  
systemctl restart docker     #重启docker

添加反向代理

主要是因為80,443端口通常佔用了

搭建nginx反向代理服务器
通过docker-compose搭建

vi proxy-nginx.yml

nginx:
image: nginx:latest
container_name: proxy-nginx
restart: always
ports: 
- 80:80
volumes:
    - ~/nginx/www:/usr/share/nginx/html
    - ~/nginx/conf.d:/etc/nginx/conf.d

docker-compose -f proxy-nginx.yml up -d

创建默认配置

vi ~/nginx/conf.d/default.conf

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
修改配置

vi ~/nginx/conf.d/ngrok-proxy.conf

server {
listen 80;
server_name nb.coodata.cn *.nb.coodata.cn;
location / {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://193.112.101.53:8880;      #代理的ip+端口
  }
}
server {
listen 443;
server_name nb.coodata.cn *.nb.coodata.cn;
location / {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://193.112.101.53:8443;      #代理的ip+端口
}
}

下載客戶端

和之前的方法一樣,mac的是用/data/ngrok/bin/darwin_amd64/ngrok這個

添加可執行權限,並創建cfg文件
chmod +x ngrok

文獻1:Docker+Ngrok+Nginx实现内网穿透
文獻2:Docker 部署Nginx反向代理服务器
文献3:查看nginx反向代理服务器如何搭建

centos7 搭建自己的ngrok服務

Posted on 2019-06-28

可以顺利链接上了,细节问题在于启动服务器的时候的链接点,正确的服务端命令为:

bin/ngrokd -domain="ngrok.coodata.cn" -httpAddr=":80" -httpsAddr=":8081" -tunnelAddr=":4443"
#-domain后面你上面写的域名  -httpAddr http端口  -httpsAddr https 端口 
#-tunnerlAddr 客户端端口,连接端口

客户端的接口要4443,之前就是弄错了接口,导致reconneting,另外也需要在安全组里面把对应的端口打开,还有在防火墙里开发对应的端口

1.前提準備

需要一台有域名解析的雲服務器,此處用的是centos7系統

2.安裝基礎環境

安裝git和gcc(用於下載ngrok源代碼)
yum install gcc -y
yum install git -y

3.安裝go語言環境

yum install -y mercurial git bzr subversion golang golang-pkg-windows-amd64 golang-pkg-windows-386

4.檢查環境是否安裝好

git --version
go version

5.在雲服務器搭建ngrok服務

下載ngork源代碼
git clone https://github.com/inconshreveable/ngrok.git
生成證書
cd ngrok
#把coodata.cn改為自己的域名
export NGROK_DOMAIN="ngrok.coodata.cn"
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=ngrok.coodata.cn" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=ngrok.coodata.cn" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
替換新生成的證書,執行下面命令後輸入’y’ 回車
cp rootCA.pem assets/client/tls/ngrokroot.crt

cp device.crt assets/server/tls/snakeoil.crt

cp device.key assets/server/tls/snakeoil.key

6.編譯生成ngrokd(服務端)

#輸入後需要等待一段時間
GOOS=linux GOARCH=amd64 make release-server
#生成在 ~/ngrok/bin/目錄中

7.編譯生成ngrok(客戶端)

windows客户端
#還是在ngrok這個目錄,輸入以下命令,然後等待完成
GOOS=windows GOARCH=amd64 make release-client
#生成的目錄在 ~/ngrok/bin/windows_amd64目錄中
mac客户端
GOOS=darwin GOARCH=amd64 make release-server release-client
linux客户端
GOOS=linux GOARCH=amd64 make release-server release-client
#如果无效,可能是环境配置问题,centos系统可以用一开始生成的ngrok做客户端

8.用SSH Secure Shell Client工具(或scp等)

windows下載

將~/ngrok/bin/windows_amd64/中的文件下載到本地windows下,如D:\ngrok

mac下載
#由於文件不大,用了scp,如果說找不到文件位置,把後面的~去掉即可
scp root@192.168.3.121:~/ngrok/bin/windwos_amd64/   ngrok.exe ~/User/用戶名/ngrok.exe

spc語法
也可以使用iTerm 配置更加方便下載

9.在D:/ngrok中新建文件,改名為ngrok.cfg

server_addr: "ngrok.coodata.cn:4443"
trust_host_root_certs: false
tunnels:
    http:
        subdomain: "www"
        proto:
            http: "80"

    https:
        subdomain: "www"
        proto:
            https: "443"

    ssh:
        remote_port: 2222
        proto:
            tcp: "22"

    mstsc:
            remote_port: 52222      
            proto:
            tcp: "192.168.0.107:3389"

10.開啟遠程服務

#如果開啟不了,很可能是和nginx衝突了,關閉掉即可
cd ngrok
sbin/ngrokd -domain="ngrok.coodata.cn" -httpAddr=":80" -httpsAddr=":8081" -tunnelAddr=":4443" &

11.開啟客戶機服務

windows 启动
#cd到目錄後,如果online,则成功,如果出现reconnecting的问题,多数是接口不对,或者安全组和防火墙
ngrok.exe -config ngrok.cfg -subdmain test 3000
mac启动
./ngrok -config=ngrok.cfg -subdomain=webname 3000

好的團隊協作,可以讓工作變成一種樂趣

Posted on 2019-06-26

在一次內部整頓倉庫的過程中,深深的感受到了團隊與團伙的區別,同時也感受到能互相扶持的同伴是如此的重要!在這裏只是做下個人的感慨,把團隊中好的一些品質紀錄起來。同時也希望無論到任何年紀,自己也能保持一份好學,協作的心

具備良好的自我驅動力

自我驅動力,是除了薪資外的動力,這部分人本身是好學以及有理想目標的。

為什麼說是良好的,而不是自我驅動力?
因為良好,是一種心裡狀態,我們在經營公司的過程中,遇到過很多自我驅動力很好,個人能力也很優秀的人。
但卻不一定合適在我們團隊協作,因為自我驅動力有時是一種對成果的極度可望導致的。
當成果沒有展現出來前,可能會因為急躁而破壞了團隊的協作,或者自行離開。

要保持一定的團隊協作能力,就可以嘗試把團隊的目標鎖定在我們現在做事情,把重心放在“做哪些事情可以把結果引導到更佳?”
然後就集中注意力和時間把這些事情做好。
那麼結果是自然會出現的。
當然,這些都是需要leader來去釀造一個環境,讓團隊人員可以把心態放平的環境。

把焦點放在“做哪些事情可以把結果引導到更佳”

我們在一次製作內容的工作中,因為都不是本職工作,同時也都不是擅長的技能,但是卻是一件非做不可的事情(因為對業務有利)
一開始我們想著把要求提高,想要把效果做到很好,結果卻會不滿意自己所製造的內容。
後來我們重新審視了下我們的最初需求,是提高業務,而非寫出一本曠世作品。
所以把結果反饋看淡了,我們就分工寫,持續了1週後,達到了我們的業務提升需求。同時也在實際的執行中,找到了更多的提升方法(目前在測試中)

12

tomatokai

15 posts
© 2019 tomatokai
Powered by Hexo
|
Theme — NexT.Pisces v5.1.4