VirtualBox安裝Centos7-滑鼠問題

在我的NoteBook的VirtualBox安裝CentOS7時,遇到了滑鼠不能正常運作的問題,因此特別筆記一下處理方式:

step 1. 在VirtualBox開始安裝前,先確定在 設定/USB 內的 啟用USB控制器 是否在正確的選項,現在的電腦一般應該是要選擇USB2.0或是USB3.0,但我的選項一開始是設定在USB1.1(錯誤的選項),因此注定我的滑鼠不能正常啟動。如下圖:
setup1

想要改變設定至USB2.0或USB3.0之前,若VirtualBox沒有安裝ExtensionPack,則會在下方看到警告提示訊息,請我們先將ExtensionPack下載安裝完成,才能將設定改至USB2.0~3.0。

step 2. 下載、安裝Oracle_VM_VirtualBox_Extension_Pack,我安裝的版本是6.0.0,可自行選擇最新版本; 下載完成後,在VirtualBox的檔案/喜好設定/擴充功能選項內,指定下載下來的擴充檔案安裝即可,如下圖:
setup2

setp 3. 完成步驟2後,可以回過頭至step1將USB控制器切換至USB2.0或 USB3.0(看電腦支援的版本,現在一般應該都到3.0了),再選到我們的虛擬機器後,點選設定/系統/指標裝置滑鼠這個選項改為USB平板電腦,這邊說的滑鼠選項,看說明指的是針對PS/2的滑鼠,也因為筆電是沒有PS/2滑鼠,像我使用的就是筆電,若沒有將滑鼠這個選項改為USB平板電腦,我VM內的滑鼠是不能正常運作的,設定方式如下圖:
setup4

這篇並沒有記錄在VirtualBox安裝CentOS7以及網路設定,底下提供三篇參考網址:

  1. CentOS 7 最小安裝後在VirtualBox的網路設定筆記
  2. VirtualBox安裝Linux作業系統(CentOS)-完整安裝
  3. CentOS 6.3 最小安裝 (minimal) 初始化設定筆記-Will保哥

Docker簡介

什麼是Docker?

  1. 是一個輕量級的作業系統虛擬化解決方案
  2. Docker的基礎是基於Linux容器技術
  3. 有傳統VM的資源、配置獨立性,又具有更高的可攜性
  4. Docker Container彼此共享OS Kernel,但又可以透過Namespace、Cgroup等技術來達到環境、系統資源的隔離

Gradle學習筆記

Gradle是什麼?

Gradle類似於Ant,Maven,是一種建構工具,提供我們自動化編譯、打包、單元測試、集成測試、專案部署等功能; 有比Maven更高的靈活性(Maven本身要做到客製化的建構極不容易),也有比Ant更高度的標準化的建構方式(Ant的建構並沒有一個可參考的準則)

優點

  • 具有表達性、可維護性,基於Groovy的領域特定語言(DSL)
  • 標準化的專案布局和生命週期,又具有高度靈活性和對預設值的可配置姓
  • 支持建構由多個專案組成的專案結構
  • 支持依賴管理
  • 有高度相容性,能夠引入Ant的建構腳本或將Maven邏輯轉換成自身規則集的工具
  • 高度可擴展性及高效率的建構工具

建構的生命週期任務

如下圖,Gradle已經提供了默認的任務,以標準的目錄架構,知道執行任務時甚麼資源該去哪個目錄找尋,並且可以通過約定屬性來改變默認值; 如約定屬性 sourceSets,可以用來改變要執行compileJava任務時,要去哪裡取得Java原始碼。
gradleLiveCycle

Java並行設計筆記

java.util.concurrent.Future 介面

Future就是對於具體的Runnable或者Callable任務的執行結果進行取消、查詢是否完成、獲取結果。必要時可以通過get方法獲取執行結果,該方法會阻塞直到任務返回結果。

Future的五個方法:

  1. cancel(boolean mayInterruptIfRunning) : cancel方法是用來取消任務,若取消任務成功則返回true,若取消任務失敗則返回false。
    參數mayInterruptIfRunning表示是否允許取消正在執行卻沒有執行完畢的任務,若設置true,則表示可以取消正在執行過程中的任務。若任務已經完成,則無論mayInterruptIfRunning為true還是false,則一定返回false,;若任務正在執行,則返回值即為mayInterruptIfRunning的設置;若任務還沒有執行,則無論mayInterruptIfRunning為true還是false,一定返回true。
    在這個方法呼叫完成後,再去呼叫isDone(),isDone()將總是回傳true 。
    原文 :
    After this method returns, subsequent calls to isDone() will always return true.
    上面這句原文應該要排除一種情況:若任務還在執行中,呼叫cancel傳入參數mayInterruptIfRunning設置為false,則再去呼叫isDone(),理論上isDone不一定會回傳true。
  2. isCancel(): 若任務在正常完成前被取消則回傳true; 也就是有執行cancel()方法,且回傳true(表示任務被成功取消)。
  3. isDone(): 當任務完成時,回傳true; 這個完成可能是正常的執行結束,也可能是因為例外發生結束或是被強制取消任務執行的結束。

  4. get(): 這個方法會產生阻塞,一直等待,直到任務執行完畢返回結果

  5. get(long timeout,TimeUnit unit) : 此方法與get()差別在於等待指定的timeout時間後,還無法取得執行結果,則拋出TimeoutException。

public synchronized void myMethod() {
//code
Class
}

Netty簡介

Netty是什麼?

Netty 是一款異步的事件驅動的網絡應用程序框架,可讓我們更
快速地開發可維護的、高性能的面向協議的服務器和客戶端。

阻塞式IO與非阻塞式IO

  • 阻塞I/O: 比較消耗資源,僅適合中小數量的concurrent數量,一個Socket連線I/O就需要一個thread負責處理。
  • 非阻塞式IO: java.nio.channels.Selector 是
    Java 的非阻塞I/O 實現的關鍵。它使用了事件通知API
    以確定在一組非阻塞套接字中有哪些已經就緒能夠進
    行I/O 相關的操作。因為可以在任何的時間檢查任意
    的讀操作或者寫操作的完成狀態,如下圖所示,
    單一的thread便可以處理多個並行的連接。
    NIO API Struc

    參考自:Netty實戰

重要概念

Netty的線程機制

底下透過展示一段程式碼後,在個別去對每個重要的部分做分述、解釋

=================主要的服務啟動器
ServerBootStrap serverBS = new ServerBootStrap();

=================設置線程池(EventLoopGroup)
//BOSS線程池
EventLoopGroup bossLoopGroup = new NioEventLoopGroup(1);

//WORK線程池:這樣的申明方式,主要是為了展示說明Netty的線程是怎樣工作的
ThreadFactory threadFactory = new DefaultThreadFactory("work thread pool");
//CPU個數
int processorsNumber = Runtime.getRuntime().availableProcessors();

EventLoopGroup workLoopGroup = new NioEventLoopGroup(processorsNumber * 2, threadFactory, 
SelectorProvider.provider());

//指定Netty的Boss線程和work線程
serverBS.group(bossLoopGroup , workLoogGroup);

//單存一點使用一個線程池來處理也可以
serverBS.group(workLoogGroup);

=================設置服務的通道類型
//只能是實現了ServerChannel接口的“服務器”通道類別
serverBS.channel(NioServerSocketChannel.class);


=================設置處理器(ChannelHandler)
//Netty的特色就在這一連串“通道水管”中的Handler
serverBS.childHandler(new ChannelInitializer<NioSocketChannel>() {
    @Override
    protected void initChannel(NioSocketChannel ch) throws Exception {
        ch.pipeline().addLast(new ByteArrayEncoder());
        ch.pipeline().addLast(new TCPServerHandler());
        ch.pipeline().addLast(new ByteArrayDecoder());
    }
});

=================設置netty服務器綁定的ip和端口
serverBS.option(ChannelOption.SO_BACKLOG, 128);
serverBS.childOption(ChannelOption.SO_KEEPALIVE, true);

serverBS.bind(new InetSocketAddress("0.0.0.0", 83));
//還可以監控多個端口
serverBS.bind(new InetSocketAddress("0.0.0.0", 84));

上面的Boss線程池,裡面只有一個線程(boss EventLoop),專門替ServerChannel工作,負責為傳入的連接創建一個Channel,同時為新Channel註冊所感興趣事件的處理器; work線程池會為這個新的Channel分配一個work線程(work EventLoop),其工作就是負責去監看OS是不是有他感興趣的IO事件發生(例如SocketChannel的READ事件),若有則調用相對應的ChannelHandler去處理。

當某個channel失效後(例如在ChannelHandler方法中調用channelHandlerContext.close())這個channel將從綁定的EventLoop中被剔除。

而這邊提到的EventLoop(NioEventLoop),其內部實際上就是封裝了前面所提到的Java NIO框架的Selector,其按照底層JAVA NIO的Selector的事件狀態,決定執行ChannelHandler中的哪一個事件方法(Netty中的事件,包括了channelRegistered、channelUnregistered、channelActive、channelInactive、channelRead等事件方法)。執行完成後,work線程將一直輪詢直到操作系統回覆下一個它所管理的channel發生了新的IO事件。
NIO eventLoopExplain
PS:這個圖可以說明具有兩個EventLoopGroup的運作架構,左邊的boss EventLoop 負責接收新連接,右邊work EventLoop綁定給新連接的Channel(參考自:Netty實戰)

ByteBuf

Channel

  • Netty中的Channel專門代表網絡通信,它是由客戶端地址 + 服務器地址 + 網絡操作狀態 構成的。
  • 在Netty中,不止封裝了JAVA NIO的IO模型,還封裝了JAVA BIO的阻塞同步IO通信模型(Socket Class)。將他們在表現上都抽象成Channel,大大降低直接操作Socket的複雜度。
  • 是一個更豐富、抽象的通道,如下圖:
    NIO Channel

ChannelPipeline、ChannelHandler

  • Netty中的每一個Channel,都有一個獨立的ChannelPipeline,中文稱為“通道水管”。只不過這個水管是雙向的裏面流淌著數據,數據可以通過這個“水管”流入到服務器,也可以通過這個“水管”從服務器流出。

  • 在ChannelPipeline中,會有一組處理器。我們稱之為“ChannelHandler”(處理器或者過濾器)。同“流入”和“流出”的概念相對應:用於處理/過濾 流入數據的ChannelHandler,稱之為“ChannelInboundHandler”;用於處理/過濾 流出數據的ChannelHandler,稱之為“ChannelOutboundHandler”

  • 數據在ChannelPipeline中有一個一個的Handler進行處理,並形成一個新的數據狀態。這是典型的“責任鏈”模式。

  • ChannelInboundHandler:擴展此接口要實作11個方法,因此一般都擴展ChannelInboundHandlerAdapter,一般情況下只需覆寫自己關心的事件,不須要所有方法都實現。

  • ChannelOutboundHnadler:同樣可以擴展ChannelOutboundHandlerAdapter。

  • Channel的生命周期
    NIO ChannelEventCycle
    這個生命周期的事件方法調用順序只是針對Netty封裝使用JAVA NIO框架時,並且在進行TCP/IP協議監聽時的事件方法調用順序。

#
初次接觸Netty,這篇是將參考的電子書與覺得解釋的不錯的網路文章做了一些整理,算是讓看倌有個初略的概念,若有興趣深入,建議可以看看 Netty實戰這本書。

參考文章&圖片&文獻

在linux上安裝Docker

安裝參考Docker

INSTALL DOCKER CE
Update the apt package index.

$ sudo apt-get update
Install the latest version of Docker CE, or go to the next step to install a specific version:

$ sudo apt-get install docker-ce
Got multiple Docker repositories?

If you have multiple Docker repositories enabled, installing or updating without specifying a version in the apt-get install or apt-get update command always installs the highest possible version, which may not be appropriate for your stability needs.

To install a specific version of Docker CE, list the available versions in the repo, then select and install:

a. List the versions available in your repo:

$ apt-cache madison docker-ce

docker-ce | 18.09.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
b. Install a specific version by its fully qualified package name, which is package name (docker-ce) “=” version string (2nd column), for example, docker-ce=18.03.0~ce-0~ubuntu.

$ sudo apt-get install docker-ce=
The Docker daemon starts automatically.

Verify that Docker CE is installed correctly by running the hello-world image.

$ sudo docker run hello-world
This command downloads a test image and runs it in a container. When the container runs, it prints an informational message and exits.

若不是使用root帳號,則要執行docker指令前,需要先將”自己的帳號”加入docker群組,其中usermod(user modify),-G:修改附加群組

sudo usermod -aG docker your-user

加入後,先重新登入帳號,群組修改才能生效,確認加入群組是否成功,可輸入 groups
listUserGroup

切換到root帳號

sudo su -

用Hexo建立Blog

Hexo是什麼?

Hexo是一套可以讓我們快速建立起客製化網誌的一套框架,並使用Markdown文件
建立網誌內容,編輯Markdown文件可以使用
Visual Studio Code這套微軟的IDE,一邊編輯一邊預覽,非常的方便。

安裝Hexo前的準備

先確定已經安裝好下列軟體:

  • Git
  • Node.js

安裝Hexo

輸入指令: $ npm install -g hexo-cli
install Hexo

建立Github的repository

createReposi

建立Hexo網誌所需的目錄、檔案,安裝node modules到plugins,並安裝git相依檔案

$ hexo init {目錄名稱}
$ cd {目錄名稱}
$ npm install
$ git init

執行完會在指定目錄下產生下列的目錄檔案
blogDirectory

啟動Server

執行下面指令,若能看到網誌頁面表示所需項目已經正確安裝

$hexo server

blogDirectory

Deploy準備

修改主要設定檔

configFile

網站主題相關設定

configFile

Git發佈設定

gitDeployConfig
repo: Repository URL

name: 此name與登入Git的name無關

設定完成後先安裝 Git deployer plugin for Hexo

安裝 Git deployer plugin for Hexo

$ npm install hexo-deployer-git --save

部署文件

Git deployer plugin - 內有_config.yml與Git deploy屬性設定相關的說明

產生靜態檔案並自動開始部屬

$ hexo generate -d

deploy1
deploy2

插入圖片

安裝可上傳圖片的插件

npm install hexo-asset-image --save

修改_config.yml的設定

post_asset_folder: true

產生新文章檔案以及與文章同名的目錄

$hexo new newPostName
cd D:/blog/justinyang1221

使用指令插入圖片

![圖片說明](newPostName/圖片名稱.jpg)