Docker - Volumes 介紹
Docker Mount
下圖清楚了說明Docker host的 Volume with bind mounts 以及tmpfs mount 機制
這裡針對 Volumes 部分進行介紹:
Continue ReadingMarketing, SEO, Web trends, Programming tutorial, Web design, and Life event...
下圖清楚了說明Docker host的 Volume with bind mounts 以及tmpfs mount 機制
這裡針對 Volumes 部分進行介紹:
Continue ReadingDocker - Storage drivers
為了能有效率的使用 storage drivers,一定要先了解 Docker builds 以及 stores images,container如何使用images。
Storage drivers可以允許你在容器可寫入層(container writable layer) 建立資料
但是,在 Storage driver 操作資料,有這些缺點:
通常會透過 volumes 來保存資料以及改善效能問題
一個 storage driver 負責處理各layer之間的互動
container 與 image 最大的差別就在於頂層可寫入層,在container新增或修改的資料都會存在可寫入層,當container刪除,這個可寫入層就會一併刪除,這底層的 image 則不會影響。
主要是因為每一個 container 都擁有自己的可寫入層,而多個 containers 可以共享同一個 image
例如: 這裡顯示多個 containers 共享同一個 Ubuntu 15.04 image
因此,Storage driver 用來管理 image layers 以及 可寫入層的內容,
雖然所有的 sotrage dirver 處理的方式各有差異,但所有的 driver 使用的都是同樣的 image 堆疊,以及寫入時複製策略(copy-on-write (CoW) strategy)。
可以透過下方指令檢查目前 可寫入層的使用量
docker ps -s
若某一個資料位於底層image,
Continue Reading在 Docker 管理資料
在 container 所建立的檔案,預設都會存放在可容器寫入層(writable container layer)
這表示:
當你建立一個新的 container,會同時在最上層建立一個新的可寫入層(writable layer),也稱為 container layer。
在 container內所有的改變都會在這裡面,例如: 建立新檔案,編輯檔案,刪除檔案,都會寫入這個容器可寫入層。
Continue Readingcomposer require --dev "xethron/migrations-generator"
php artisan --version
Continue Reading
Docker-Compose 是一個可以用來定義且執行多個 Container 應用程式的工具
可以很簡單的透過 Compose 的 yaml 來設定你的container應用程式
並且透過一個指令,就可以建立及啟動所有yaml設定的應用程式
Compose 可以在產品、階段產品、開發或測試項目使用
在使用上大致可以區分為三個過程:
Continue ReadingMySQL 是一個廣泛被使用,開源的關聯式資料庫管理系統( relational database management system, RDBMS)
目前的MySQL執行效能不斷提升,可靠且易於使用,
因此經常被作為網路應用程式開發資料庫的首選.
其中包括 Facebook, Twitter, YouTube, Yahoo 等公司都有使用。
詳細說明可參考官網: www.mysql.com.
這裡將說明如何在 Docker 安裝即執行 MySQL 環境
Continue Reading-d 表示在背景( Detached )執行,Docker 預設前景( foreground )執行
-p 表示將本機 8080 port 的來源轉發到 container 的 80 port
–name 表示為 container 的名稱
–rm 表示當 exit container 時,會移除 container( incompatible with -d )
docker run -d -p 80:80 --name mywebserver nginx
//if need custom port (ex 3000) can do like this
docker run -d -p 3000:80 --name mywebserver nginx
由於 local 還沒有 nginx 的 image,因此Docker 會先執行檢查及下載 nginx image
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
...下載安裝
Status: Downloaded newer image for nginx:latest
安裝完畢之後,就會直接對 nginx image 進行 instance 為 nginx container,並執行
Continue ReadingDocker 在 Mac 環境可以直接透過 Install Docker for Mac 來安裝
前往 Docker for Mac 下載 Docker.dmg 執行安裝
透過下列方式來檢查 docker 版本,確定安裝完畢
docker --version
docker-compose --version
docker-machine --version
Delete all docker containers
docker rm $(docker ps -a -q)
Delete one containers by name
docker rm mycontainername
Delete all docker images
docker rmi $(docker images -q)
Delete images by name
docker rmi images_name
Check Image and containers
//all container (include un-run container)
docker ps -a
//on running container
docker ps
//all images
docker images
Remove Laradock file
rm -rf laradock/
##【 Docker 】
docker-compose down
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
OPTION:
-d 表示在背景( Detached )執行,Docker 預設前景( foreground )執行
-p 表示將本機 8080 port 的來源轉發到 container 的 80 port
–name 表示為 container 的名稱
–rm 表示當 exit container 時,會移除 container( incompatible with -d )
Continue Reading查詢訂閱狀態與發佈系統的狀態
> PUBSUB xxxchanne
將訊息發送到指定的 channel
> PUBLISH xxxchanne "Message Say Hi"
Subscribe 允許 client 端訂閱一個或多個 channels
> SUBSCRIBE channel [channel ...]
當 client 端 subscribe 某個 channels 之後,
除了subscribe相關指令(subscribe, psubscribe, unsubscribe, punsubscribe ),
一律不允許使用其他 commands
> SUBSCRIBE xxxchannel
Reading messages...(press Ctrl-C to quit)
1) "subscribe"
2) "xxxchannel"
3) (integer) 1
1) "message"
2) "xxxchannel"
3) "a"
使用 PSUBSCRIBE 訂閱一個或多個頻道時,可以透過一些模式,來訂閱
? : 表示任一字元
例如: H?llo 會包含 Hello, Hallo, Hbllo, Hcllo, ……. H*llo 會包含 Heeeeello, Hllo, Hxllo…… H[ae]llo 會包含 Hello, Hallo (但不包括 Hllo)
Continue ReadingRedis client 每次發送一筆 command 都會經過 發送命令> 命令列隊(排隊)> 執行 > 返回結果 ,這期間所需要的時間,就稱為RTT(Round Trip Time, 往返時間)
Redis 通常可以執行在微秒等級,但是在不同網路環境,就會因網路本身的傳輸限制而有所差異,因此才有Redis 性能瓶頸就是網路 一說
pipeline 可以將多筆資料同時發送出去,
如果不使用 pipelining,每一個command 從訪問資料結構、取得回覆,看起來耗費的流量都非常小,
但對於 socket I/O 而言,每個訪問都執行一次comman,占用的效能成本就相當大
當使用 pipelining,可以將多個指令組成一次發送出去,讓系統只需讀取一次 read(),並且將多個回覆內容也組成一次輸出 write()
雖然 pipeline 可以減少 RTT,減少IO調用次數
但是直接發送 command 只需要 Redis server 端處理,
透過 pipeline 則需要 server 端-client端 共同實現
因此仍須注意 pipeline 大小,是否會超過 Client端的緩存限制,若超過則緩存刷新或直接發送,可能會發生無法預期的問題
通常對於過大的 pipeline ,可以透過拆分來完成減少單次大小
通常為了讓Redis可以有更好的負載能力,都會在 Redis 前面外加一個代理,例如: Codis Pipeline 緩存默認10K,3.1則是1024,Jedis 緩存默認為 8192
Continue Reading台灣證券交易所規範了FIX通訊協定作業平台,簡稱FIX
證交所TCP/IP資訊網路透過MPLS架構,讓證交所與每個券商主機之間都設定了點對點固定IP VC(Virtual Circuit)連線
通常發起端為證券商,建立連線之後傳送登入訊息讓證交所驗證,
FIX協定為非同步傳輸方式,可連續傳送委託單
基本介紹如下:
FIX tag 組成包括:
Header 固定開頭為:
8=FIX.4.4<SOH>
Body 是要傳送的內容,基本格式為:
Key=Value<SOH>....
Trailer 結束使用的格式為: 其中 nnn 是透過 CheckSum 計算出的數值
10=nnn<SOH>
FIX Session 主要用於登入、交換訊息、登出:
發起端無傳送登入訊息 當發起端原本應該傳送登入訊息給接收端,超過60秒未傳送登入訊息,連線就會主動中斷 這時發起端就要再重新連線
接收端驗證 接收端會驗證登入訊息,若驗證成功會立即回覆 Logon 登入訊息,若驗證失敗會回覆 Logout 登出信息
開始同步 發起端接收到 Logon 登入訊息後,就能開始傳送其他訊息
Continue Reading電腦世界處理的基礎是 0 跟 1,我們稱之為二進位(binary)
二進位可以在組成十進位 0~9
不同的系統或程式對於十六進位都有不同的描述方式,但是基本概念如下:
十六進位則是由 09 AF 組成
十六進位剛好是 4^2 ,轉二進位相當容易
例如: 二進位 01011110101101010010 可直接轉十六進位 5EB52
另外是 Byte 共 8 Bit
其中將 4 個 Bit 剛好可儲存一個16進位
各種場合帶入16進位方式
環境 | 格式 | 備註 |
---|---|---|
URL | %hex | |
XML,XHTML | &#xhex | |
HTML,CSS | #hex | 6位,用於表示顏色 |
Unicode | U+hex | 6位,表示字符編碼 |
MIME | =hex | |
Modula-2 | #hex | |
Smalltalk,ALGOL 68 | 16rhex | |
Common Lisp | #xhex或#16rhex | |
IPv6 | 8個hex用:分隔 |
ASCII(American Standard Code for Information Interchange,美國標準資訊交換碼)是由美國國家標準局(ANSI)訂定的字元標準
並且已經被國際標準組織(ISO)公認為國際標準,現今多數語系編碼都會都會參考 ASCII 的格式
接下來介紹如何從2進位轉10進位來取得參照值
1 Byte = 8 Bit
每一個 Bit 都可以存取一個二進位 (即 0, 1)
可以試想,1Byte提供了8個空間 [][][][][][][][]
,每一個空間都可以塞一個2進位值,例如: [0][0][0][0][0][0][0][0]
接下來,計算從2進位轉10進位方式:
例如 n 表示為 0或1
[2^7n]+[2^6n]+[2^5n]+[2^4n]+[2^3n]+[2^2n]+[2^1n]+[2^0n]
其 [0][0][0][0][0][0][0][1] 就可以計算程 [2^70]+[2^60]+[2^50]+[2^40]+[2^30]+[2^20]+[2^10]+[2^01] = 1 其 [0][0][0][0][0][0][1][0] 就可以計算程 [2^70]+[2^60]+[2^50]+[2^40]+[2^30]+[2^20]+[2^11]+[2^00] = 2 其 [0][0][0][0][0][0][1][1] 就可以計算程 [2^70]+[2^60]+[2^50]+[2^40]+[2^30]+[2^20]+[2^11]+[2^01] = 3
根據這些每一個10進位狀態,可以對應到一個字母
可直接參考下方 ASCII 編碼表
資料傳輸常見Json, XML 的方式傳送,但這裡我們要說明的是在細節一點的格式傳輸方式
一般各種格式的資料,傳輸前都必須轉為 byte 格式
例如,數字、字串… 轉為 byte ,再用 byte 格式傳送
證券即時行情、各類統計資訊傳輸,都相當要求速度及品質
因此國內證交所即採用 FIX(Financial Information eXchange) 傳輸協定搭配FAST資料流壓縮技術,來達到一定的效率
例如,證交所資料伺服器(MDS, Market Data Server) 主要負責Fix/Fast資料處理
處理後會透過內網分送到不同 VM DAP-RT (Data Access Point Real-Time)
每一個界接資訊的用戶,都可以連線到專屬的 DAP-RT
FIX 基本格式為 Tag=Value Tag=Value….
FIX 雖然可讀性高,但是純字串格式傳輸效能並不好
因此,會再將此字串透過 FAST 壓縮成二進位,提升資料傳輸速度
除此外,FAST 資料格式會在第一個 bit 作為判別是否還有其他資料(1:有, 0:結束)
前面提到的 byte 轉換方式,可以結合FIX 的格式來建立資料
將FIX字串轉換為 byte 格式,接著就可以透過 Socket…各種方式將資料傳送出去
//傳送byte資料
string transferData = "001=Adam 002=0999888777 003=Male 004=Tw";
byte[] buff = Encoding.Default.GetBytes(transferData);
接收方 byte 格式資料後,可將轉換為字串 在依照兩方溝通的FIX對照方式,參照資料意義
Continue Reading二進位 (binary, bin) 主要由 0, 1 構成
十進位 (Octal, oct) 即 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
十六進位 (Hexadecimal, hex) 即 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
其中 AF 即 1015
C# 二進位轉十進位
Console.WriteLine(Convert.ToInt32("1111", 2).ToString("D"));//Binary To Decimal
> Output: 15
C# 二進位轉十六進位
Console.WriteLine(Convert.ToInt32("1111", 2).ToString("X"));//Binary To Hexadecimal
> Output: F
C# 十進位轉二進位
Console.WriteLine(Convert.ToString(15, 2));//Decimal To Binary
C# 十進位轉十六進位
Continue ReadingC# 有兩個類別可以用來調控執行緒
AutoResetEvent.WaitOne 方法可以讓執行緒進入 Join (WaitSleepJoin) 暫停狀態
AutoResetEvent.Set 方法可以讓暫停狀態的執行緒恢復運作 ManualResetEvent 則需要呼叫 .Set 與 .Reset
這裡舉例,在 A B 兩個任務類別中
在 任務A 執行了 WaitOne() 先讓 任務A 進入 WaitSleepJoin Block 狀態
當 任務B 執行到偶數時,就執行 Set() 將 A任務 恢復運作
class Program
{
private Thread MissionA_Thread;
private Thread MissionB_Thread;
private static AutoResetEvent _AutoResetEvent = new AutoResetEvent(false);
static void Main(string[] args)
{
Program mProgram = new Program();
mProgram.ProvideMission();
Console.ReadKey();
}
private void ProvideMission()
{
//指定委派A物件
ThreadStart MissionA_Tg = new ThreadStart(MissionA);
//建立A任務執行緒
MissionA_Thread = new Thread(MissionA_Tg);
//指定委派B物件
ThreadStart MissionB_Tg = new ThreadStart(MissionB);
//建立B任務執行緒
MissionB_Thread = new Thread(MissionB_Tg);
//啟動執行緒
MissionA_Thread.Start();
MissionB_Thread.Start();
}
//任務A
private void MissionA()
{
for (int i = 0; i < 10; i++)
{
_AutoResetEvent.WaitOne();
Console.WriteLine("A" + i);
Thread.Sleep(1000);
}
}
//任務B
private void MissionB()
{
for (int i = 0; i < 10; i++)
{
if (i % 2 == 0)
{
_AutoResetEvent.Set();
}
Console.WriteLine("B" + i);
Thread.Sleep(2000);
}
}
}
若是 ManualResetEvent 則需要再多加一次 Reset()
Continue ReadingC# 可以實作 ping 網路連線檢查
實作方式如下:
class Program
{
static void Main(string[] args)
{
//INIT PING OBJECT
System.Net.NetworkInformation.Ping objPing = new System.Net.NetworkInformation.Ping();
//設定測試連線及逾時時間
System.Net.NetworkInformation.PingReply PingResult = objPing.Send("www.google.com.tw", 5000);
//取得結果
string pingMsg = (PingResult.Status == System.Net.NetworkInformation.IPStatus.Success) ? "連線成功" : "無法連線";
Console.WriteLine(pingMsg);
Console.ReadKey();
}
}