希格工作室

2023年11月21日 星期二

在Azure上快速建立VPN Server

 

  1. 登入Azure,選新增虛擬機器,區域選日本(Japan East),影像(Image)不用改直接是Ubuntu 20.04,大小(Size)的話單純逛網頁看幾隻YT應該預設的B1s應該還夠用,其他都不用改選省錢的方案,直接建立。
  2. 用mRemoteNG或其他SSH工具連線上虛擬機器
  3. 把這個網頁(https://slashview.com/archive2021/20210602.html)的步驟從頭跑到尾。
    1. sudo -i
    2. apt-get update
    3. wget https://git.io/vpnsetup -O vpn.sh
    4. nano vpn.sh
    5. 編輯之處為下列這三個變數,請自己輸入自己想要的參數並儲存。
      1. YOUR_IPSEC_PSK='請輸入20碼隨機英數符號混合字元'
      2.  YOUR_USERNAME='VPN帳號' 
      3. YOUR_PASSWORD='VPN密碼'
    6. Ctrl + S 存檔,Ctrl + X 離開 nano畫面
    7. sudo sh vpn.sh
    8. sudo ikev2.sh --auto
    9. 完成
  4. 在Azure 網路(VNet)上設定防火牆,開放UDP 500和4500;腳本無自動建立防火牆的情況下,直接在NSG開啟「輸出安全性規則」亦可。
  5. 設定本機Windows VPN連線
    • VPN類型:「L2TP/IPsec(使用預設共用金鑰)
    • 網路和共用中心>變更介面卡設定 > 安全性 > 允許這些通訊協定 > Challenge Handshake驗證通訊協定(CHAP)
    • 如果無法連線,增加Regedit設定後重新開機:

REG ADD HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent /v AssumeUDPEncapsulationContextOnSendRule /t REG_DWORD /d 0x2 /f

 

如果有任何錯誤無法排除參考:

https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/clients-zh.md#windows-%E9%94%99%E8%AF%AF-809

 

原始操作手冊:https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/README-zh.md

 

其他已知問題:不知道怎建立IPv6的連線XD,所以如果本機有允許IPv6時,最好去區網的介面卡停用IPv6,不然IPv6的部分還是會走到台灣IP



其他方式參考資料:

https://github.com/haoel/haoel.github.io

https://github.com/jim60105/docker-V2Ray

https://blog.ujoj.cc/post/cloudflare-tunnel/

2023年8月28日 星期一

UnitTest 比喻與簡易表達

有人問,剛好寫了一個自我感覺良好的回答,所以記錄起來 


如果你有個1+1=2的邏輯
你直接去找db
 
declare @a int = (select 1);
declare @b int = (select 1);
declare @c int= @a + @b ;
return @c



然後你包個method叫做「一加一」
雖然運作很順暢,但基本上就是無法對這個邏輯在程式端做單元測試
因為你依賴的一個不確定的外部因素「資料庫」和「網路」和「你養的貓踢到線」
等問題


所以這個邏輯寫法要改成

取得A(){
var a = db("select 1");
return a;
}
取得B(){
var b = db("select 1");
return b;
}
進行一加一的服務(){
var a = A();
var b = B();
var c = a + b;
return c;
}


這時候到單元測試的專案那邊時候
A和B就是你需要仿造的對象
所以在單元測試這邊改寫成

取得A(){
var a = 1;
return a;
}
取得B(){
var b = 1;
return b;
}



這樣你就可以單純測試「進行一加一的服務()」,而不用擔心因為「你養的貓踢到線」導致測試產生誤差

var c =進行一加一的服務();
test(c == 2);


2020年12月14日 星期一

.Net Core 各版本並存測試

 自問:



自答:









移除指令眉角:

--all後面還是要接要移除哪一種東西,Runtime就要打--runtime、 Hosting Bundle就要打上--hosting-bundle


顯示目前已安裝且可移除的版本

dotnet-core-uninstall list


移除所有runtime版本

dotnet-core-uninstall remove --all --runtime -y

移除除指定版本以外所有的runtime

dotnet-core-uninstall remove --all-but 3.1.10 --runtime -y


移除所有Hosting Bundle版本

dotnet-core-uninstall remove --all --hosting-bundle -y

移除除指定版本以外所有的Hosting Bundle

dotnet-core-uninstall remove --all-but 3.1.10 --hosting-bundle -y



總結:

.Net Core各版本理論上並存在服務器上沒什麼問題

只是如果要移除其他版本時就要注意

如果環境是IIS,且使用的是Hosting Bundle版本進行的安裝





移除時,不可以移除到Hosting Bundle

否則雖然--info還是看得到3.1存在,但是3.1也會不能運作

需要重新安裝Hosting Bundle進行修復才會恢復正常





.Net Core移除工具:https://docs.microsoft.com/zh-tw/dotnet/core/additional-tools/uninstall-tool?tabs=windows

2019年9月30日 星期一

.NET Core 2.1 DI AddDbContext BUG

.NET Core 2.1 bug

錯誤訊息:
No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions<TContext> object in its constructor and passes it to the base constructor for DbContext.

原因:
透過AddDbContext進來的EFCore會發生optionsBuilder.IsConfigured永遠為true,造成無法運作,直到更新至2.1.11才被修正

過程:
Code-first加入方式Scaffold-DbContext

Startup.cs
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

            services.AddDbContext<Models.Test.TContext>();
        }


ValuesController.cs
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private readonly Models.Test.TContext context;

        public ValuesController(Models.Test.TContext context)
        {
            this.context = context;
        }

        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            var tb = context.Table2.FirstOrDefault();
            return new string[] { "value1", "value2" };
        }
    }
}


Context.cs








修正方式:
三種修正方式(擇一即可)
1.更新至.Net Core 2.1.11up或.Net Core 2.2
2.如果將Context透過繼承也會避開
3.改使用AddTransient<T>註冊



2.將Context透過繼承也會避開















































3.改使用AddTransient<T>註冊












結語:
能更新上去就更新上去,但因為我平台在AWS上,而aws toolkit for visual studio的預設專案範本不支援.NET Core2.2up,若要使用過於複雜不適合目前環境,故只能持續使用2.1版,所以更新2.1.11版是最佳解,其次是透過繼承也能順便解決其它自定義的東西。





2019年9月23日 星期一

aws toolkit for visual studio & Lambda & serverless.template

記錄在VisualStudio上開發AWSLambda時,發行的重點

serverless.template

{
 "AWSTemplateFormatVersion" : "2010-09-09",
 "Transform" : "AWS::Serverless-2016-10-31",
 "Description" : "An AWS Serverless Application that uses the ASP.NET Core framework running in Amazon Lambda.",

 "Parameters" : {
  "ShouldCreateBucket" : {
   "Type" : "String",        
   "AllowedValues" : ["true", "false"],
   "Description" : "If true then the S3 bucket that will be proxied will be created with the CloudFormation stack."
  },  
  "BucketName" : {
   "Type" : "String",
   "Description" : "Name of S3 bucket that will be proxied. If left blank a name will be generated.",
   "MinLength" : "0"
  },  
  //此處可自訂發行欄位,例如資料庫的連線字串
  "connectionStrings" : {
   "Type" : "String",
   "Description" : "資料庫連線字串",
   "NoEcho":"false",
   "MinLength" : "0"
  }
 },

 "Conditions" : {
  "CreateS3Bucket" : {"Fn::Equals" : [{"Ref" : "ShouldCreateBucket"}, "true"]},
  "BucketNameGenerated" : {"Fn::Equals" : [{"Ref" : "BucketName"}, ""]}
 },

 "Resources" : {

   "AspNetCoreFunction" : {
    "Type" : "AWS::Serverless::Function",
    "Properties": {
    //此處的值是由程式自動生成,沒需要動
    "Handler": "Service_xxx::Service_xxx.LambdaEntryPoint::FunctionHandlerAsync",
    "Runtime": "dotnetcore2.1",
    "CodeUri": "",
    "MemorySize": 256,
    "Timeout": 30,
    //此處可以自定aws的規則,如果要加入VPC的話,可以選擇在後台上建立一個Role並加入AWSLambdaVPCAccessExecutionRole的權限後,填入此處即可
    "Role": null,
    //承上,亦可以在此處獨立增加AWSLambdaVPCAccessExecutionRole的權限,Role與Policies擇一即可
    "Policies": [ "AWSLambdaFullAccess" ],
    "Environment" : {
     "Variables" : {
      "AppS3Bucket" : { "Fn::If" : ["CreateS3Bucket", {"Ref":"Bucket"}, { "Ref" : "BucketName" } ] },
      //必須在此處對應實際的參數
      "ConnectionStrings" :  {"Ref":"connectionStrings"}
     }
    },
    "Events": {
     "ProxyResource": {
      "Type": "Api",
      "Properties": {
       "Path": "/{proxy+}",
       "Method": "ANY"
      }
     },
     "RootResource": {
      "Type": "Api",
      "Properties": {
       "Path": "/",
       "Method": "ANY"
      }
     }
    },
    //此處可自行加入VPC的sg及subnet,讓Lambda變成VPC內的應用程式,若不加入,則每次發行後都會被洗掉重來,另外VPCid請由後台加入
    "VpcConfig":{
     "SecurityGroupIds" : ["sg-1234567"],
     "SubnetIds" : ["subnet-1234567","subnet-4567890"]
    }
   }
  },

  "Bucket" : {
   "Type" : "AWS::S3::Bucket",
   "Condition" : "CreateS3Bucket",
   "Properties" : {
    "BucketName" : { "Fn::If" : ["BucketNameGenerated", {"Ref" : "AWS::NoValue" }, { "Ref" : "BucketName" } ] }
   }
  }
 },

 "Outputs" : {
  "ApiURL" : {
   "Description" : "API endpoint URL for Prod environment",
   "Value" : { "Fn::Sub" : "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/" }
  },
  "S3ProxyBucket" : {
   "Value" : { "Fn::If" : ["CreateS3Bucket", {"Ref":"Bucket"}, { "Ref" : "BucketName" } ] }
  }
 }
}

*.json內不允許註解,所以//必須刪除,僅供範例參考
*.VpcConfig之類的屬性名稱,很難從AWS說明文件中找到,但是可以直接去Lambda的設定檔中下載參考,所以有不知道的名稱自己先在後台設定好之後再下載SAM回來看也行。










*.如果曾替預設的Role加入AWSLambdaVPCAccessExecutionRole的權限的話,此時在serverless.template變更Role並且發行時,會引發系統想要清除預設的Role可是AWSLambdaVPCAccessExecutionRole無法刪除的錯誤,ˊ而且發行程式會卡住無法再重新發行,此時只能上後台手動將預設的Role刪除後,並且等待數分鐘後才會正常

2019年4月25日 星期四

.Net Core 部屬發佈自動取代應用程式變數 - IIS 與 AWS Lambda


.Net Core 部屬發佈自動取代應用程式變數

注意:這是以AWS Toolkit for Visual Studio的專案範本建立的專案為基礎去操作的


步驟
1.Visual Studio原生發行(限IIS)
2.Aws Visual Studio toolkit 發行至AWS Serverless or Lambda



Visual Studio原生發行 

1.建立想要的appsettings.{env.EnvironmentName}.json如appsettings.Test. json 

2.先建立發行檔(專案右鍵[發行)->依步驟到結束) 

3.打開發行檔(*.pubxml 在Properties\ PublishProfiles) 

4.增加<EnvironmentName>節點如Test 
  <PropertyGroup>
    <EnvironmentName>Test</EnvironmentName>
  </PropertyGroup>

5.直接發行後,查看程式是否有正確取得appsettings.Test. json內所設定的值 

6.自動的方式只限定IIS環境,在Linux環境上仍需要修改作業系統的環境變數。 




Aws Visual Studio toolkit 發行至AWS Serverless or Lambda
主要是透過修改serverless.template讓Parameters頁能夠增加自定義參數,以[Publish To AWS Lambda]為例。


1.打開專案內的serverless.template 

2.在Parameters的地方可以看到預設的ShouldCreateBucket與BucketName兩個設定

3.直接在此區域底下Append你要的,例如connectionStrings

4.此時回發行畫面會發現多了一個欄位,代表增加設定欄位成功


5.接著再回到serverless.template,修改Resources這個區塊

6.我們不用像上面原來一樣參考這麼多地方,只要直接修改Resources將參考對應到我們的appsettings.json的值即可

7.在發行畫面中輸入這個欄位值,測試看看是否成功。


2019年1月12日 星期六

VS2017 .Net Core 安裝 SignalR Core + 發佈到Linux上


建立專案
  1. 使用VS2017
  2. 新增專案選擇.Net Core => ASP.NET Core Web 應用程式
  3. 選擇API或Web應用程式都可
  4. 建立好之後,在專案按右鍵[加入] => [新增用戶端程式庫] => 下拉選單改成[unpkg] => 輸入 @aspnet/signalr@   接者打1或其他(目前只有1)
  5. 應該會跳出浮空的下拉選單,選最新的(但是不包含任何"預覽"的英文字樣),這樣才是正式運行版本
  6. 選取 [選擇特定檔案]、展開 [散發者/瀏覽器] 資料夾,然後選取 signalr.js 與 signalr.min.js。
  7. 將 [目標位置] 設定為 wwwroot/lib/signalr/,然後選取 [安裝]。
  8. 去寫前後端程式
  9. 前端引入<script src="~/lib/signalr/dist/browser/signalr.js"></script>

發行程式
  1. 對專案按右鍵[發行] => 部屬模式選擇[Framework依存性]或[獨立式]皆可 
  2. [Framework依存性]時[目標執行階段]保持在[可攜式];[獨立式]則指定平台(ex:Linux x64)
  3. 發行完成把資料夾壓成zip檔放著


安裝Linux
  1. 到CentOS官網下載最新版iso(https://www.centos.org/download/)
  2. 然後在虛擬機器上安裝它
  3. 從Console登入(廢話...)
  4. 設定網卡,找出剛才安裝時的網卡名稱 => cd /etc/sysconfig/network-scripts/
  5. 修改網卡, => vi {網卡名稱}
    BOOTPROTO=static
    IPADDR=192.168.xxx.xxx
    GATEWAY=192.168.xxx.1
    NETWORK=192.168.xxx.0
    NETMASK=255.255.255.0
    DNS1=8.8.8.8
  6. 輸入[ESC]結束修改模式,然後輸入;wq 存檔後離開 
  7. 停用網卡 => ifdown {網卡名稱}
  8. 啟用網卡 => ifup {網卡名稱}
  9. 測試遠端連線是否成功


下載mRemoteNG(https://mremoteng.org/download)
  1. 從遠端登入它(再度廢話...)
  2. 透過SSH工具上傳剛才的zip


在Linux上安裝.Net Core Runtime
  1. 取得package資訊 ,輸入
    sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
  2. 安裝指定版本(例如core 2.1)
    sudo yum install aspnetcore-runtime-2.1


執行.Net Core
  1. cd到放zip的那資料夾裡面
  2. 解開zip檔 => unzip {檔名}
  3. cd 到解壓的資料夾
  4. 執行dotnet指令
    sudo dotnet xxx.dll --server.urls http://192.168.xxx.xxx
    *. xxx.dll依照你專案的發行名稱輸入
    *. --server.urls可以指定運行時的ip跟port

從其他電腦測試站台失敗時
  1. 開啟防火牆
    firewall-cmd --zone=public --add-port=80/tcp --permanent
  2. 重載入防火牆
    firewall-cmd --reload

結語:對不熟linux的人而言,很麻煩。

參考網站






2016年9月21日 星期三

angular2 安裝 with Visual Studio 2015

https://angular.io/docs/ts/latest/cookbook/visual-studio-2015.html
https://angular.io/docs/ts/latest/quickstart.html

1.確認是否安裝最新版node.js和npm
2.在cmd輸入node -v及npm -v,如果出現不名的指令代表未曾安裝過
  2.1下載node.js -> https://nodejs.org/en/
  2.2安裝完node.js後更新npm->至cmd輸入 npm install npm -g
3.修改visual studio的外部工具路徑
  3.1工具->選項->專案和方案->外部Web工具->將$(PATH)移至第二順位(在.\node_modules\.bin下)->確定後重啟visual studio

4.VS安裝最新版TypeScript->工具->擴充功能和更新->線上->查"TypeScript"->找最新(最多人下載)的裝

5.下載QuickStart範例,建立WEB應用程式,將QuickStart COPY到專案根目錄然後加入專案

6.右鍵package.json->還原封裝->等3~10分鐘(注意輸出視窗說結束為止,都不要亂動VS)

7.不要理任何輸出視窗寫的錯誤訊息

8.到tsconfig.json加上"compileOnSave": true

9.F5編譯

10.app資料夾的ts檔會產生js檔,再把產生的js檔加入專案

Done.

--------------------------
關於index.html
    <!-- Polyfill(s) for older browsers -->
    <script src="node_modules/core-js/client/shim.min.js"></script>

    <script src="node_modules/zone.js/dist/zone.js"></script>
    <script src="node_modules/reflect-metadata/Reflect.js"></script>
    <script src="node_modules/systemjs/dist/system.src.js"></script>

    <script src="systemjs.config.js"></script>

shim.min.js 即使不載入 ng2也可以運作

zone.js Reflect.js Reflect.js這三者則有相依性 要按順續載入,systemjs.config.js才能運作

最後 System.import('app').catch(function(err){ console.error(err); });才能順利init


--------------------------
關於運行

在順利Init NG2後,app資料夾中的js關係為
從main.js為主入口,載入需要的模組塊(app.module),由各模組內設定需要的服務端口元件(app.component),最後才由元件設計/生成結果

main.js -> app.module -> app.component -> {htmlTemplate} -> Ng2 Objects -> Active UI -> release to User


--------------------------
發行

*.因node_modules會要求不要加入VS專案內,所以發行時不會連帶輸出,因此線上會缺少node_modules,故有兩種作法
  1.在主機上也安裝NPM然後自行下npm install (如果有問題 改下npm install --no-optional)
  2.土法練鋼的將自己專案的node_modules COPY上去(幾萬個檔案慢慢等吧)

2016年7月5日 星期二

2016年7月1日 星期五

[Nuget]從伺服器到發佈一次搞定 使用VisualStudio - Step2 建立你的Nuget分享套件

1.至Visual Studio的擴充功能下載 Nuget Packager







2.重啟Visual Studio後新增專案,會在專案範本看到Nuget選項,用它新增新專案





3.開啟專案後,到NuGet.Config去修改參數,把value改成你架設的Nuget私人網站




4.開啟命令字元,到剛才的專案目錄中,利用專案附載的Nuget.exe建立你的api key
nuget.exe setApiKey {password} -Source {httq://xxx.xxx/nuget}




5.最後到Package.nuspec設定你的套件相關內容資訊,即完成設置動作。






6.最後依你的套件性質,把對應的檔案放在預設的幾個資料夾內就可以了
content : 套件的檔案,依content 下的路徑產生
lib :使用到的DLL參考
src


7.發佈時只要使用建置就會自動發佈,Visual Studio的建置選項為Debug時只會編譯不會發佈,設定成Release才會發佈。






本文為記錄操作步驟 說明建議參考:
http://blog.darkthread.net/post-2016-04-28-nuget-packager.aspx
http://blog.sanc.idv.tw/search/label/NuGet
http://blog.darkthread.net/post-2011-03-29-create-nuget-package.aspx

[Nuget]從伺服器到發佈一次搞定 使用VisualStudio - Step1 架設自己的Nuget伺服器

1.在Visual Studio新建空的Web專案

2.上Nuget套件中找 Nuget.Server 並安裝




3.不過因為新版以不支援.Net 4.5 所以如果還在4.5的要自行下載舊版本
PM> Install-Package NuGet.Server -Version 2.11.1



4.在Web.Config輸入網站的Push API密碼



5.編譯成功後直接部到IIS上,結束

本文為記錄操作步驟 說明建議參考:
http://blog.darkthread.net/post-2011-05-27-nuget-server.aspx
http://blog.darkthread.net/post-2011-09-03-nuget-1-5-support-authentication.aspx

2014年6月12日 星期四

SignalR 強化您的網站應用(三) - HelloWorld2

    承接著SignalR 強化您的網站應用(二) - HelloWorld,在上一篇的範例中,提到的是如何將訊息傳送給自己(Caller),但我們要的並不會只是這樣,因為這樣沒有太大意義,因此本節要說的是另外兩個功能,All和Other。

    首先是Other,Other指的是除了自己以外,其它任何連線進來的Signalr使用者,都將會收到該訊息,也就是發送訊息給其他人。

    如同上一篇,在前端的部份不需要異動,因此附圖沒有貼上前端的部份,我只有附上後端的部份,在這階段,只要使用Others,其它在相同頁面下的使用者就會收到HelloWorld的訊息,如下圖:


    同Others,使用All的意思代表,除了其他人會收到HelloWorld以外,你自己也會收到。



你現在可以利用這三種功能,寫出不同應用的SignalR程式了。

重點整理
Clients.Caller : 回應給當前使用者
Clients.Others : 回應給其他使用者
Clients.All : 回應給所有使用者



與本文相關的附加資訊
展示網頁(1)
展示網頁(2)
附件下載

2014年4月9日 星期三

Image Sprites Cutting Editor

Desing by self,create SVG & js-events for use.

http://meyan.twbbs.org/Cloud/TL/en/CreateSVGPoint.htm

Drag the file(jpg,png,bmp...) from your folder/desktop to a area.

圖片分割定位工具

自寫的工具,用來產生切圖的功能,產生SVG及嵌入事件使用,純網頁。

http://meyan.twbbs.org/Cloud/TL/tw/CreateSVGPoint.htm

使用方法,從電腦隨便拉一張圖片上去即可

2014年3月16日 星期日

SignalR 強化您的網站應用(二) - HelloWorld

    在完成最基本的SignalR導入之後,我們可以開始屬於我們的SignalR程式,雖然SignalR主打的是訊息傳播,但一開始我們還是先來練習HelloWorld吧。

    首先要做的是,Show出一個HelloWorld的Alert訊息給我們自己的簡單SignalR程式,在這之前,我們先來瞭解一下SignalR撰寫上的基本架構






















    這是我為了方便區別前後端所建立的資料夾,SignalRHubs及View,SignalRHubs專門置放繼承Hub的SignalR程式,View則是我們接收或傳遞結果的網頁(aspx,html,cshtml....)。

    再來是建立Hub,Hub是伺服器端接收或分派訊息給您所希望的使用者所集中管理的程式碼區段,要建立Hub,只需要選擇一般的class.cs即可,接者引入Microsoft.AspNet.SignalR.Hubs及Microsoft.AspNet.SignalR兩份參考,再將該物件繼承Hub這個SignalR定義的個體就完成了。























    其中,HubName及HubMethodName這兩個標籤是可以不用設定的,如果不設定它,SignalR在預設情況下,會直接使用物件名稱作為前後端溝通的名稱,但字首第一個英文字母會是小寫,如class名稱叫做MyHub的話,在js引用時必須為myHub,以此類推。

    接下來先說明前端呼叫及接收的部份,之後在回到上圖,請參考:























    我設置了一個Button,目的是按下它之後Alert一個訊息給我自己,僅此而已。

    我們在使用SignalR的Hub模式時,我們必須先建立起一個連線,因此使用$.connection這個指令,再輸入剛才在後端定義的HubName去取得我們要使用的hub,接著使用$.connection.hub.start();將連線啟動。

    後面可以看到我針對Button指定了helloworld事件去引發message_get(),而在之前ready時,有定義一個message_set()去接收結果,並alert出來,因此再回到後端程式碼的地方,可以看到負責接收前端傳來的訊息的HubMethodName取為message_get,而在message_get裡寫上了Clients.Caller.message_set這段程式碼,其中Clients指的是所有的客戶端,而Caller所指的是當下發出呼叫的那個網頁(連線),因此我是針對我自己要去回應一件事,而那件事便是message_set。

    當你把滑鼠移至message_set上時,你會發現它叫做(動態運算式),其實它就是利用Dynamic去實作出來的,因此這邊可以隨便你愛叫什麼名稱都行,然後前端名稱跟著走就好,要注意的是,參數的數量必須一樣,否則將接收不到任何結果(HubMethod亦同)。

    然後啟動我們的網站,你應該可以看到以下結果:











    恭喜您,完成了第一隻SignalR程式。



與本文相關的附加資訊
展示網頁
附件下載


2014年3月13日 星期四

SignalR 強化您的網站應用(一) - 導入

    首先推薦請先閱讀這份Blog SignalR 來達成電腦網頁與手機網頁即時互動文章,裡頭除了介紹SignalR的功用外,還有相當完整的範例檔可供下載,建議第一次想嘗試SignalR的魔力的讀者,可以抓回家試試,這份Blog文章也是我對SignalR的啟蒙之師。

    在看完前段提供的連結內容,以及其範例後,是不是也想開始動手撰寫呢?如果是,有幾點事項可能要注意一下,該頁文章是2012年,當時SignalR的版本還在1.0.0,目前(2014初)已經是2.0以上版本,因此若您使用NuGet去取得SignalR套件的話,會取到2.0(以後)的版本,2.0和1.0的初始配置有些許不同 請參考 SignalR1.x To 2.0,若您的Visual Studio版本在2012(.NET4.5)以上,建議您直接使用2.0(含以後)版本,否則您就必須從NuGet上下載特定SignalR版本
例如:
Install-Package Microsoft.AspNet.SignalR -version 1.1.3
    如果不清楚NuGet下載功能,可造訪此NuGet系列-安裝特定版本Package

    安裝完成後,首先應該會跳出一份文件檔,請不要直接將它關閉,上面有指示各種不同環境下的導入方式,在這邊要注意的是,Javascript腳本在引用時的順序性,SignalR的腳本檔有兩個主要的部份,一個是腳本的本體,依照您的版本,可能是jquery.signalR-x.x.x.js,另一個則是hubs(~/signalr/hubs),hubs的腳本來自於您所在後端程式碼中所建立並繼承Hub的物件,這些Hub物件會使用者點開網頁時,將其集中的內容送至~/signalr/hubs這個相對目錄下,這個目錄是虛擬的,所以您不需要在本機專案或網站上建立signalr/hubs這個位址。

   在引用腳本時的順序:Jquery.js ->signalR.js->signalr/hubs
例如:


    在成功引用之後(包含說明檔的其它步驟),您可以打開您的測試網頁,建議先使用Chrome,並打開F12(設計模式),如果在Source底下有看到hubs的路徑代表您成功了。

















    您可以開始準備寫第一隻SignalR程式了。



與本文相關的附加資訊
展示網頁
附件下載


2012年12月26日 星期三

Func & Action


​這兩個用法我之前就很想搞懂,
但因為不知道怎麼去Google這關鍵字所以一直懸在心上
(<--實力差又沒在買書看的人)
剛好曹祖聖老師來公司上課時有舉到範例,解了我心懸一念
故在這邊簡略示意一般


一般我們可能會做個函式如:
​​​
01         public static string abc2(int a,int b)
02         {
03             return (a+b).ToString();
04         }


然後去針對abc2()去呼叫它(static別管它),一般的呼叫我們應該都知道了,只是我們也可以用Func的方式去呼叫它,如:
01 Func<int, int, string> dd = new Func<int, int, string>(abc2);


我們可以簡化它
01 Func<int, int, string> dd = abc2;


然後使用Invoke()或其它去執行它
01 dd.Invoke(1, 2)


但我們有時可能不希望函式寫一大堆,或是許多原因等,也可以用Func去改寫abc2:
01             Func<int, int, string> dd2 = new Func<int, int, string>(
02                 (a1,a2) =>
03                 {
04                     return (a1 + a2).ToString();
05                 }
06                 );


一樣用Invoke()或其它去執行它​
01 
02             Console.WriteLine(dd.Invoke(1, 2));
03             Console.WriteLine(dd.Invoke(1, 3));
04             Console.WriteLine(dd.Invoke(1, 4));
05             Console.WriteLine(dd.Invoke(1, 5));


有時依需求,因為這程式段落已經被拉到內層了使用了,所以甚至可以把a1 a2給省略或整合掉
01             int O1, O2;
02             O1 = 1; O2 = 2;
03             Func<string> dd2 = new Func<string>(
04                 () => {
05                     return (O1 + O2).ToString();
06                 }
07                 );
08             Console.WriteLine(dd2.Invoke());

​​​簡略來說就這樣囉,謝謝有來看的人觀賞~~~~
































嗯?怎麼沒講到Action?
其實Action一樣用法
只是Action對應的是void類型
而Func對應的是有return的類
看在你願意把畫面拉下來的份上,我還是貼個CODE好了
01             Action<int> fff = def;
02 
03             Action<int> dfqefqf = new Action<int>(
04                 delegate(int a1)
05                 {
06                 }
07                 );
08 
09 
10             Action<int> dfqefqf2 = new Action<int>(
11                 (no) =>
12                 {
13                     //code
14                 }
15                 );
以上~88

PS:有無發現,其實內圈的自定函式,是跑delegate的,只是剛才我都省略掉而已哦。

2012年11月20日 星期二

UserControl使用者控制項 CSS style


小筆記
使用UserControl(ascx)時,直接在.ascx裡寫css的style標籤
在IE(9)有可能不會動作?!
要把它拉出來變成css檔 放到主頁去載入才會動作...
不知為何,可能是我排版問題,暫記...

2012年10月19日 星期五

同步與非同步 - 口語化告訴你 Async

     今天是期中考,小明帶著滿心不悅的心情坐在坐位上等待著鐘響,當鐘響了,老師帶著考卷進來了,老師將考卷發給每一位學生,小明收到考卷後,開始了40分鐘的答案撰寫,而老師則在講臺旁坐著,等著同學答題,有的同學寫很快,20分鐘就交卷了,而小明卻寫了40分鐘才有辦法交卷,這段時間裡,由於老師必須要等同學都交卷了,才能收齊後回去教師室進行改考卷的動作,所以老師也只好等著小明一直到40分鐘後答完才能離開;考試結束了,小明很高興,招攬同學下課一起去網咖連線打電玩打了一整個下午,但是這段時間裡,老師並沒有閒著,因為老師正在教師室裡拼命的改同學的考卷,到了隔天上課,老師發回了考卷,但是此時小明卻高興不起來了。





    因為小明不及格,回家要被媽媽打~~~~~






    以上情境,如果我們把它翻譯成程式來撰寫,哪邊屬於同步?哪邊屬於非同步?
    

    之所以會想到這段故事,是因為和同事聊天時提到的,我們多多少少都寫過、看過相關程式或邏輯,但是如果你要解釋或說明時,要怎麼解釋給一個完全不懂的人聽呢?通常我們會貼了一大堆語法來說明,再不然就像網路上一堆說著專有名詞的文章,看完了其實只有"啊?"的感想,如果要你再說明給別人聽,同事說:仔細想想還真不知道怎麼講耶?


   好了,回到剛剛的問題,哪邊屬於同步與非同步呢?其實整串文仔細想想,很多地方都可以扯到,不過我只針對兩個大項來說:
  1. 小明寫了40分鐘考卷,而老師則坐在講臺旁等著。

  2. 小明和同學打網咖,而老師在改考卷。

這兩個情境中

(1)應該就屬於同步類的等待,因為對老師來講,我要進行下一步的資源,也就是改考卷所需要的考卷,還在小明那邊,我必需要等小明寫(處理)完,才有辦法進行。

(2)則應該屬於非同步的處理,因為對小明來講,小明想要知道的是我最後考完試之後的結果與分數,但是在等分數出來之前,小明不需要一直留在學校裡等老師改完,小明可以趁這段時間去做別的事(打網咖),等到明天,老師應該就改好考卷了,所以小明就花了一個下午去玩,之後就回家休息了,但是老師呢?可能得花一整個下午加上一整個晚上才能改完所有同學的考卷。

題外話,最後老師精神不濟,找了其他人幫他發考卷給同學,這個算...?


其它可參考的網站
What are actually synchronous/asynchronous operations

2012年9月21日 星期五

Tech Days 2012 手記(第三日)

DBI308 SQL Power Tools 擴充事件使用與效益提升實戰
DBI309 SQL Server 2012 on windows Core  新架構探討並與AlwaysOn完美整合
DBI311 Microsoft SQL Server2012稽核管理面面觀
DBI313 建置 升級與轉換您的資料庫-Data Tier Applications

  因為是一系列的,所以一起講
  重點在
1.透過擴充事件,可以針對單一事情進行監測,且可使用非同步方式回報,故理論上較不耗用SQL資源,而它有點類似物件的概念,故可進行組合、封裝等,未來Profiler trace...etc可能將被遺棄。(這裡有個疑問點是,如果未來Profiler真被遺棄,我沒有看到類似錄製並轉給Database Engine Tuning Advisor的demo,那 DETA要怎麼做? )
2.windows Core(Server Core)上裝SQL,但只支援2012版本
3.使用Server Core一場說可減少50%的SP,另一場說60%,誰對?
4.如果用GUI的Windows裝SQL,請把IE移掉,只裝SQL Engine,其它全部不裝,不關SQL的東西也都不要裝,當然最好呢,使用Server Core(意思是叫你換2012)
5.若是安裝必要條件需要FW3.5.1時,不要連WCF都選到,因為那等於裝了IIS
6.Audit log可設最大換用檔案與最大檔案數,避免過去一些問題。
7.Server Audit 全版本支援,Database則仍為Enterprise
8.請不要把SQL Server當PC使用,否則改用Server Core吧。

DEV308 精通JavaScript作Windows Store App 開發
  這堂課主要是在講MS可以讓你用JS寫WSApp,但是最好使用它所提供的腳本(WinJs MSApp.等),而由於它允許JS部份可進行較底層的操作,透過它提供的API,故有許多原生的指令在這還境下是不被允許使用,或是必須進行轉換才能使用的。
  如.open() .moveTo()...等 是被移除的
  close()變更行為
  .innerHTML禁止填入事件,非標準的標籤可能不被允許。
  這之中最令人意想不到的是...不能使用alert();,要改用Windows.UI.Popups.MessageDialog()
  禁止載入外部腳本,請先自行下載到專案內
  可Cross-Domain
  VS專案強制預設其為Strice Mode
  可使用iframe但其為web context 無法使用原App的功能,但其等級與Web相同,只是與App間的溝通將會有點困難,要用postMessage()
 以及眾多的地雷