矛魚盾

初探Docker-Hello World

初探Docker-Hello World Docker近幾年一直很紅,但公司沒有導入使用,且看到滿滿的指令碼,就覺得很複雜,這幾天剛好有點時間,就來趟初心者之路。 本篇省略掉所有Docker知識,僅記錄自己可能會用到的情況,如何達到可以運作的步驟,相關知識可以參考Docker 从入门到实践 Hello World 安裝Docker https://www.docker.com/,安裝完後應該會出現Docker Desktop,或是顯示在右下角 創建一個index.js文件 1 console.log('Hello World'); 建立Dockerfile的文件 相同目錄底下創建一個名為Dockerfile的文件,注意並無副檔名,這是用於為Docker構建映像(image)的文件。映像只是用於創建Docker容器的模板。映像(Image)和容器(Container)的關係,就像是OO中的Class和Object一樣。 新增Dockerfile內容 1 2 3 FROM node:latest COPY index.js . CMD ["node","index.js"] FROM node:latest : 從Docker Hub尋找作為我們鏡像的基礎 COPY index.js : 將index.js文件從我們的機器複製到Docker容器的工作目錄中。 CMD ["node", "index.js"] : 使用index.js作為入口點運行Node 建立鏡像Image,在此目錄底下執行 1 docker build -t helloworld . -t helloworld : 將產生的 Image 取名為 helloworld . : 是指當下目錄 從Docker Desktop可以看到剛剛建立出來的image 或是執行 1 docker image ls 運行Container 1 docker run --rm helloworld --rm : 執行完畢後就刪除容器。

使用LINQKit 動態OR條件查詢

使用LinqKit 動態OR條件查詢 LinqKit 是一套使用Linq時強大的輔助擴充,特別是處理OR條件,因為最近常用到,順便把之前的筆記整理一下,LinqKit 其實網路上也不少人介紹過了,特別推薦的文章放在參考,這邊只記錄程式碼用法。 環境 LinqPad 6 LinqKit Note 求簡單,直接使用北風資料庫做示範 原始的Product列表 選擇CategoryID為2,4,6,8才顯示 一、使用LinqKit 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 void Main() { var selectedCategory = new List<int> { 2, 4, 6, 8 }; FilterProducts(selectedCategory).AsEnumerable().Dump(); } public IQueryable<Products> GetProducts() { return Products.AsNoTracking(); } public IEnumerable<Products> FilterProducts(List<int> selectedCategory) { var product = GetProducts(); var predicate = PredicateBuilder.

LINE Message API Webhooks Signature Validation

LINE Message API Webhooks Signature Validation 一開始需求源自於紀錄LINE bot訊息,因為只是記錄訊息而已,並沒有其餘應用,所以沒有採用社群維護的LINE SDK以求精簡,結果在簽名驗證的時候卡住了…最後還是參考了社群的Source Code才解決,所以這邊簡單紀錄一下過程。 驗證簽名最主要是為了確保紀錄的訊息,是透過LINE Platform發送的,LINE Platform在發送到Webhooks指定網址的時候,會在header中包含一組簽名X-Line-Signature,我們要將Channel Secret 和 Request Body用HMAC-SHA256 進行雜湊後,與X-Line-Signature比對是否相符,Channel Secret 在啟動Webhooks就可以看到。 環境 .NET Core 3.1 啟用LINE Message API服務 實作 啟動Webhooks功能 從 LINE Developers Console 或是 LINE Official Account Manager 都可以啟動 使用授權篩選條件,驗證X-Line-Signature是否為LINE Platform發送 1 2 3 4 5 6 7 public class LineVerifySignatureFilter : IAuthorizationFilter { public void OnAuthorization(AuthorizationFilterContext context) { throw new NotImplementedException(); } } 以下程式碼參考pierre3/LineMessagingApi WebhookRequestMessageHelper,要注意.NET Core 3.1 需使用EnableBuffering來多次讀取body 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 public class LineVerifySignatureFilter : IAuthorizationFilter { private readonly string _channelSecret; public LineVerifySignatureFilter(IConfiguration configuration) { _channelSecret = configuration["ChannelSecret"]; } public void OnAuthorization(AuthorizationFilterContext context) { var request = context.

使用PagedList與vue-infinite-loading,製作無限載入(滾動分頁)

使用PagedList與vue-infinite-loading,製作無限載入 (滾動分頁) PagedList是.NET開發環境中,老牌的分頁套件,早期.NET MVC 5官方教學在分頁的說明上也有使用這套件進行分頁,簡單易用且支援Bootstrap,隨便搜尋也可以找到不少的使用範例,這邊就不多介紹。.NET Core開始,PagedList就將在前端顯示的分頁套件切割出來,要使用傳統分頁樣式要多安裝X.PagedList.Web.Common,也因為是分割開來,就代表我們不一定要使用傳統的分頁樣式,特別是以手機為主的畫面,傳統的頁碼顯示相對不友善,且容易跑版。 以手機顯示為主的分頁,比較常見的幾種作法是,不使用頁碼,僅保留上一頁、下一頁,另一種就是無限載入的方式(滾動分頁)。滾動分頁這需求的套件倒也不少,自己評估幾套後,覺得vue-infinite-loading感覺最易用,這邊就記錄一下,盡量以簡單的方式達到滾動分頁。 特別說明一下,這篇並沒有使用vue-cli,一方面是剛接觸Vue不久,很多觀念還在建立中,另一個原因是新增出來的專案我覺得有點肥大,小型專案感覺不太適用。 環境 .NET Core 3.1 Nuget > X.PagedList vue-infinite-loading 實作 先安裝X.PagedList,.NET Core,直接安裝Core版本就好 從資料庫取得要分頁的資料 1 2 3 4 public IQueryable<School> GetStuffFromDatabase() { return _context.School.AsNoTracking(); } 依照PagedList範例設置分頁 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 protected IPagedList<School> GetPagedSchools(int? page) { if (page.HasValue && page < 1) return null; var listUnpaged = GetStuffFromDatabase().AsEnumerable(); // 設置每5筆分頁 const int pageSize = 5; var listPaged = listUnpaged.

JavaScript讀取Json檔案

JavaScript讀取Json檔案 HTML底下的Script區塊,使用Json檔,應該算是滿常見的需求,特別是如果某些表單選項,不打算從資料庫讀取,或是打算讀取一些靜態設定檔都滿好用的,但是JavaScript其實不能直接讀取Json檔,所以這邊紀錄一下自己常用的兩種寫法 一、使用getJSON、Fetch、Axios等 在目錄底下新增一份options.json檔,個人路徑是wwwroot/jsons,因使用ajax相關技術,須留意檔案位置是否為可讀取的靜態檔案路徑 1 2 3 4 5 6 7 { "機械與電腦輔助":["機械設計開發","機械性能測試","機械結構分析","機電整合設計","智慧製造導入","精密量測與檢測", "刀具設計","模具設計","機械材料表面處理"], "材料科學":["材料檢測與分析","儲能材料開發","材料表面處理與改質","發光材料開發與元件設計","半導體製程開發與元件設計", "奈米材料製備與批量化設計","薄膜製造技術開發","複合材料與材料接合技術","積層製造","非破壞檢測", "太陽能電池材料開發與元件設計","顯示器與固態照明材料開發與設計"] } 1 2 3 4 5 6 7 8 9 <script> fetch('wwwroot/jsons/options.json') .then(function (response) { return response.json(); }) .then(function (result) { console.log(result); }); </script> 結果 二、使用JavaScript import、export 將Json檔,改為Js檔,如:options.json.js 或 options.js 1 2 3 4 5 6 7 export const option = { "機械與電腦輔助":["機械設計開發","機械性能測試","機械結構分析","機電整合設計","智慧製造導入","精密量測與檢測", "刀具設計","模具設計","機械材料表面處理"], "材料科學":["材料檢測與分析","儲能材料開發","材料表面處理與改質","發光材料開發與元件設計","半導體製程開發與元件設計", "奈米材料製備與批量化設計","薄膜製造技術開發","複合材料與材料接合技術","積層製造","非破壞檢測", "太陽能電池材料開發與元件設計","顯示器與固態照明材料開發與設計"] }; 使用import 1 2 3 4 <script type="module"> import { option } from '/wwwroot/jsons/options.

ASP.NET 建立XML檔的方法

ASP.NET 建立XML檔的方法 產生XML檔,比較常見有兩種方法 使用XmlSerializer序列化物件 傳統的System.XML命名空間提供處理 XML 的標準架構支援目標,及XmlElement、XmlNode等 環境 XmlSerializer LinqPad 5 Note XmlSerializer 在LinqPad 6 .NET Core 3.1,可能會出現 NotSupportedException: A non-collectible assembly may not reference a collectible assembly. 錯誤,或許是下列問題 請參考 https://github.com/dotnet/runtime/issues/1388 XML常使用Stream作為輸出入格式,這邊為了方便,直接使用LinqPad中的Console.Out功能呈現結果 目標 官方XML範例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?xml version="1.0" encoding="utf-8"?> <PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.cpandl.com"> <ShipTo Name="Teresa Atkinson"> <Line1>1 Main St.</Line1> <City>AnyTown</City> <State>WA</State> <Zip>00000</Zip> </ShipTo> <OrderDate>Wednesday, June 27, 2001</OrderDate> <Items> <OrderedItem> <ItemName>Widget S</ItemName> <Description>Small widget</Description> <UnitPrice>5.