關於網路那些事...

Marketing, SEO, Web trends, Programming tutorial, Web design, and Life event...

Docker - Volumes 介紹

Docker Mount

下圖清楚了說明Docker host的 Volume with bind mounts 以及tmpfs mount 機制

這裡針對 Volumes 部分進行介紹:

Continue Reading

Docker - Storage drivers

Docker - Storage drivers

為了能有效率的使用 storage drivers,一定要先了解 Docker builds 以及 stores images,container如何使用images。

Storage drivers可以允許你在容器可寫入層(container writable layer) 建立資料

但是,在 Storage driver 操作資料,有這些缺點:

  • 讀寫效率很差
  • 停止運行container之後,這些資料並不會保存

通常會透過 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

寫入時複製策略 copy-on-write (CoW) strategy

若某一個資料位於底層image,

Continue Reading

Docker - 資料管理簡介

在 Docker 管理資料

在 container 所建立的檔案,預設都會存放在可容器寫入層(writable container layer)

這表示:

  • 當container不沒有運行時,資料就會跟著消失
  • container中的數據很難從外部取得
  • 可寫入容器層的資料,與container高度耦合,很難將資料搬移到其他地方
  • 需要透過 storage driver 來管理filesystem

當你建立一個新的 container,會同時在最上層建立一個新的可寫入層(writable layer),也稱為 container layer。

在 container內所有的改變都會在這裡面,例如: 建立新檔案,編輯檔案,刪除檔案,都會寫入這個容器可寫入層。

Continue Reading

Laravel Migrate-Generate

安裝擴充

composer require --dev "xethron/migrations-generator"

檢查laravel 版本

php artisan --version

Continue Reading

Docker - Compose 介紹 (上)

Docker-Compose 是一個可以用來定義且執行多個 Container 應用程式的工具

可以很簡單的透過 Compose 的 yaml 來設定你的container應用程式

並且透過一個指令,就可以建立及啟動所有yaml設定的應用程式

Compose 可以在產品、階段產品、開發或測試項目使用

在使用上大致可以區分為三個過程:

Continue Reading

Docker - 安裝 MySQL

MySQL 是一個廣泛被使用,開源的關聯式資料庫管理系統( relational database management system, RDBMS)

目前的MySQL執行效能不斷提升,可靠且易於使用,

因此經常被作為網路應用程式開發資料庫的首選.

其中包括 Facebook, Twitter, YouTube, Yahoo 等公司都有使用。

詳細說明可參考官網: www.mysql.com.

這裡將說明如何在 Docker 安裝即執行 MySQL 環境

Continue Reading

Docker - 執行 Nginx Webserver

執行 Nginx Container

-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 Reading

Docker - MAC安裝與執行 Hello World

Docker 在 Mac 環境可以直接透過 Install Docker for Mac 來安裝

前往 Docker for Mac 下載 Docker.dmg 執行安裝

檢查版本

透過下列方式來檢查 docker 版本,確定安裝完畢

docker --version

docker-compose --version

docker-machine --version

Continue Reading

Docker - Remove all images and container

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/

Continue Reading

Docker - 常用指令介紹

##【 Docker 】

關閉 Docker

docker-compose down

【 Container 】

建立container

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

Redis - PUBSUB、PUBLISH 介紹

Redis - PUBSUB、PUBLISH 介紹

PUBSUB

查詢訂閱狀態與發佈系統的狀態

> PUBSUB xxxchanne

PUBLISH

將訊息發送到指定的 channel

> PUBLISH xxxchanne "Message Say Hi"

Continue Reading

Redis - SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE 訂閱功能介紹

Redis - SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE 訂閱功能介紹

SUBSCRIBE 訂閱

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

使用 PSUBSCRIBE 訂閱一個或多個頻道時,可以透過一些模式,來訂閱

? : 表示任一字元

  • : 表示多個任意字元 [nnnn] : 表示在這其中任一字元

例如: H?llo 會包含 Hello, Hallo, Hbllo, Hcllo, ……. H*llo 會包含 Heeeeello, Hllo, Hxllo…… H[ae]llo 會包含 Hello, Hallo (但不包括 Hllo)

Continue Reading

Redis - pipeline 簡介

Redis - pipeline 簡介

Redis 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 ,可以透過拆分來完成減少單次大小

Pipeline 代理

通常為了讓Redis可以有更好的負載能力,都會在 Redis 前面外加一個代理,例如: Codis Pipeline 緩存默認10K,3.1則是1024,Jedis 緩存默認為 8192

Continue Reading

NEW FIX 4.4 電文說明

NEW FIX 4.4 電文說明

台灣證券交易所規範了FIX通訊協定作業平台,簡稱FIX

證交所TCP/IP資訊網路透過MPLS架構,讓證交所與每個券商主機之間都設定了點對點固定IP VC(Virtual Circuit)連線

通常發起端為證券商,建立連線之後傳送登入訊息讓證交所驗證,

FIX協定為非同步傳輸方式,可連續傳送委託單

基本介紹如下:

FIX 組成

FIX tag 組成包括:

  • Header 表頭
  • Body 訊息內容
  • Trailer 表尾

Header 固定開頭為:

8=FIX.4.4<SOH>

Body 是要傳送的內容,基本格式為:

Key=Value<SOH>....

Trailer 結束使用的格式為: 其中 nnn 是透過 CheckSum 計算出的數值

10=nnn<SOH>

建立FIX連線

  • 建立連線
  • 驗證連線
  • 發起端傳送登入訊息(Logon)

FIX Session 流程

FIX Session 主要用於登入、交換訊息、登出:

  • Logon : 登入
  • Message exchange : 訊息交換
  • Logout : 登出

連線驗證

  1. 發起端無傳送登入訊息 當發起端原本應該傳送登入訊息給接收端,超過60秒未傳送登入訊息,連線就會主動中斷 這時發起端就要再重新連線

  2. 接收端驗證 接收端會驗證登入訊息,若驗證成功會立即回覆 Logon 登入訊息,若驗證失敗會回覆 Logout 登出信息

  3. 開始同步 發起端接收到 Logon 登入訊息後,就能開始傳送其他訊息

    Continue Reading

16 進位簡介

16 進位簡介

電腦世界處理的基礎是 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用:分隔

Continue Reading

ASCII 編碼說明

ASCII 編碼說明

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 編碼表

Continue Reading

資料傳輸方式

資料傳輸方式紀錄

資料傳輸常見Json, XML 的方式傳送,但這裡我們要說明的是在細節一點的格式傳輸方式

Byte 格式傳輸

一般各種格式的資料,傳輸前都必須轉為 byte 格式

例如,數字、字串… 轉為 byte ,再用 byte 格式傳送

FIX/Fast 資料格式傳輸

證券即時行情、各類統計資訊傳輸,都相當要求速度及品質

因此國內證交所即採用 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

前面提到的 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

C# 進位制及轉換說明

C# 進位制及轉換說明

二進位

二進位 (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 Reading

C# - AutoResetEvent 與 ManualResetEvent 控制執行緒暫停及恢復運作

C# - AutoResetEvent 與 ManualResetEvent 控制執行緒暫停及恢復運作

C# 有兩個類別可以用來調控執行緒

  • AutoResetEvent
  • ManualResetEvent

WaitOne 暫停執行緒

AutoResetEvent.WaitOne 方法可以讓執行緒進入 Join (WaitSleepJoin) 暫停狀態

Set 繼續執行緒動作

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 Reading

C# 網路連線檢查

C# 網路連線檢查

C# 可以實作 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();
    }
}

Continue Reading