Posts
Vagrant - Shell Provisioning
要讓 Vagrant 在第一次啟動時透過 Shell Script 去做些設定,我們可以透過 Vagrant 的 Shell Provisioning。
若想在 Vagrantfile 內直接設定,可以使用 Inline 的方式撰寫。像是下面這樣設定 config.vm.provision 為 shell,並在 inline 參數這邊直接將 Script 帶在後面。
Vagrant.configure("2") do |config| ... config.vm.provision "shell", inline: "echo Hello, World" ... end 也可以先抽成方法後指給 inline 參數。
$script = <<SCRIPT echo I am provisioning... date > /etc/vagrant_provisioned_at SCRIPT Vagrant.configure("2") do |config| ... config.vm.provision "shell", inline: $script ... end 若想將 Script 獨立於 Vagrantfile 外,這邊也可以透過 path 參數指定 Script 檔。
Vagrant.configure("2") do |config| .
read morePosts
Remove #region block with Regex
最近又回頭維護前人的程式,還是很多地方都看不習慣。像是 Region 的濫用讓程式維護起來就很痛苦,程式中很多方法內都存在許多的 Region 區塊,這些區塊都依個人主觀的功能下去劃分,問題發生時不是劃分的人其實很難精準的找到程式在哪個 Region 區塊。且如果方法中的功能真的可以內聚到 Region 區塊之中,那為何不拆解成方法或是負責對應職責的類別呢?
為了解決這個問題,我們可以用 Visual Studio 內建的取代功能,帶入正規表示式快速的將 Region 取代掉。
^[ ]*\#(region|endregion).* {% img /images/posts/RemovingRegionBlock/1.png %}
Link c# - removing #region - Stack Overflow
read morePosts
Vagrant - Vagrantfile inheritance
Vagrantfile 的設定跟很多軟體一樣是有繼承關係的。
{% img /images/posts/VagrantfileInheritance/1.png %}
首先他會去看 Vagrant Box 的 Vagrantfile。通常會是在 %HOMEPATH%\.vagrant.doxs 下,若有設定 VAGRANT_HOME 則是在 %VAGRANT_HOME%\.vagrant.doxs 下。
{% img /images/posts/VagrantfileInheritance/2.png %}
接著會看 %HOMEPATH%\.vagrant.d 或是 %VAGRANT_HOME%\.vagrant.d\ 下的 Vagrantfile。
{% img /images/posts/VagrantfileInheritance/3.png %}
最後才會看專案目錄下的 Vagrantfile。
通常我們跟著專案跑的設定會設在專案下的 Vagrantfile,若是一些通用的設定或是跟主機環境比較相關的設定,我們會在 .vagrant.d 下的 Vagrantfile 設定,像是 Proxy 的設定等。
Link Vagrantfile inheritance | Michael Maclean
read morePosts
Vagrant - Configures the virtual machine to use proxies
要讓 Vagrant 走 Proxy,我們可以借助 vagrant-proxyconf 套件。
用 vagrant plugin install 帶入套件名稱 vagrant-proxyconf 進行套件的安裝。
vagrant plugin install vagrant-proxyconf {% img /images/posts/ConfigVagrantProxy/1.png %}
套件安裝完畢後,我們可以修改 Vagrantfile 做 proxy 的設定。像是下面這樣:
... if Vagrant.has_plugin?("vagrant-proxyconf") config.proxy.http = "http://proxy.xuenn.com:3128/" config.proxy.https = "https://proxy.xuenn.com:3128/" config.proxy.no_proxy = "localhost,127.0.0.1" end ... if Vagrant.has_plugin?(“vagrant-proxyconf”) 用以判斷 vagrant-proxyconf 套件是否有安裝,config.proxy.http 用以設定 http 的 proxy,config.proxy.https 用以設定 https 的 proxy,config.proxy.no_proxy 用以設定不走 proxy 的 domain。
若是 Proxy 需經過認證,設定時要將帳密一併帶入:
... if Vagrant.has_plugin?("vagrant-proxyconf") deblock %} config.proxy.http = "http://username:password@proxy.xuenn.com:3128/" config.proxy.https = "https://username:password@proxy.
read morePosts
Vagrant - VBox Snapshot
要透過 Vagrant 去操作 Snapshot,我們可以借助 Vagrant 的 vagrant-vbox-snapshot 套件。
用 vagrant plugin install 帶入套件名稱 vagrant-vbox-snapshot 進行套件的安裝。
vagrant plugin install vagrant-vbox-snapshot 這邊若有需要可能會連帶要求安裝套件 vagrant-winnfsd。
vagrant plugin install vagrant-winnfsd {% img /images/posts/VagrantSnapshot/1.png %}
套件安裝完畢後,我們就可以視需要調用命令進行 Snapshot 的操作。
套件的使用方式如下:
Usage vagrant snapshot <command> [<args>] Sub Commands back vagrant snapshot back [vm-name] delete vagrant snapshot delete [vm-name] <SNAPSHOT_NAME> go vagrant snapshot go [vm-name] <SNAPSHOT_NAME> list vagrant snapshot list take vagrant snapshot take [vm-name] <SNAPSHOT_NAME> 使用上會像這樣:
Vagrant snapshot take “init” Vagrant snapshot list Vagrant snapshot go “init” Vagrant snapshot delete “init” 像是 vagrant snapshot take 後面接 Snapshot 的名稱下去調用即可進行 Snapshot 的建立。vagrant snapshot list 可查驗有哪些 Snapshot 可用。
read morePosts
Vagrant - Creating a new box from an existing VM
要將已經存在的 VM 匯出成 Vagrant Box,我們可以透過 Vagrant package 命令的 --base 參數。
參數使用方式官方的說明如下:
--base NAME - Instead of packaging a VirtualBox machine that Vagrant manages, this will package a VirtualBox machine that VirtualBox manages. NAME should be the name or UUID of the machine from the VirtualBox GUI. 簡單的說就是以直接在 --base 參數後帶入欲匯出的虛擬機的名稱即可。以匯出筆者電腦的 Win7 VM 為例,就是帶入 Win7,這邊另帶 --output 參數指定匯出後的 box 檔。
{% img /images/posts/CreateVagrantBoxFromExistingVM/1.png %}
輸入完我們就會看到指定的 box 產出。
我們可以將 box 加入。
{% img /images/posts/CreateVagrantBoxFromExistingVM/2.png %}
read morePosts
Debugging Http or Web Services Calls from ASP.NET with Fiddler
要用 Fiddler 去查看 ASP.NET Web Site ,我們可以透過設定 Web.Config 將 Web Site 的 Proxy 指向 http://127.0.0.1:8888:
... <system.net> <defaultProxy> <proxy proxyaddress="http://127.0.0.1:8888" /> </defaultProxy> </system.net> ... 這樣 Fiddler 就可以記錄到 Web Site 的網路使用情形:
{% img /images/posts/DebugWebSiteWithFiddler/1.png %}
Link Debugging Http or Web Services Calls from ASP.NET with Fiddler - Rick Strahl’s Web Log
read morePosts
Bmbsqd.JilMediaTypeFormatter - Json MediaTypeFormatter based on JIL
如果要將 Web API 的 JSON 處理改用 Jil 替換,我們可以使用 Bmbsqd.JilMediaTypeFormatter 這個 NuGet 套件。
{% img /images/posts/BmbsqdJilMediaTypeFormatter/1.png %}
{% img /images/posts/BmbsqdJilMediaTypeFormatter/2.png %}
套件安裝完後,開啟 WebApiConfig 將 JsonFormatter 換成 JilMediaTypeFormatter。
using Bmbsqd.JilMediaFormatter; ... config.Formatters.Remove(config.Formatters.JsonFormatter); config.Formatters.Add(new JilMediaTypeFormatter()); ... 像是下面這樣:
{% img /images/posts/BmbsqdJilMediaTypeFormatter/3.png %}
這樣 Web API 的 JSON 處理就會換成用 Jil 去做了。
Link NuGet Gallery | JIL MediaTypeFormatter 0.1.1
read morePosts
Jil - Ignore amp; Custom Element Name
使用 Jil 處理 JSON 時,如果要在序列化時忽略處理某特定屬性,可在其屬性加上 IgnoreDataMemberAttribute,像是下面這樣:
using System; using System. Runtime.Serialization ; using Jil; namespace ConsoleApplication10 { class Program { static void Main( string[] args ) { var larry = new Person { Name = "Larry Nung", NickName = "Larry" }; Console.WriteLine (JSON. Serialize(larry )); } public class Person { [ DataMember] public String Name { get; set ; } [ IgnoreDataMember] public String NickName { get; set ; } } } } 或是帶上 JilDirectiveAttribute,指定 Ignore:
read more