發表文章

使用Netlify發佈Obsidian筆記

圖片
前言 寫好的Obsidian 筆記想要公開在網站分享給別人,目前我使用的有幾種方式: EverNote。 Notion。 Blogger。 以上三種在過程中,都需要一些小調整。若筆記有修改,除了Blogger會更新,通常也不會再去更新已分享出去的筆記。 若不想要那麼麻煩,Obsidian也有付費方式,可以發行。 參考此篇 10個如何將Obsidian公開在網路 ,選定了一個功能較完整的版本,例如支援: Graphic 、左方選單、筆記之間的連結等。 架構 使用Netlify靜態網站,免費、支援自訂網域。 個人使用起來比Github Page好用,易上手。 網站樣板 obsidian-zola ,透過javascript,將Obsidian筆記變成Html網頁顯示。 Github,你的Obsidian儲存庫。 你原本的Obsdian不用作修改,只需加一個netlify.toml即可。 使用方式 在Github建一個新的Repository,將你Obsidian要公開的筆記及.obsidian資料夾複製過來,並新增檔案 Home.md 及 netlify.toml ,如下圖所示 Home.md 不用修改,只是作為入口首頁。 neltify.toml 修改參數: REPO_URL : Github 位置 SITE_URL: netlify的URL [build] command = "rm -rf __obsidian __site && mkdir __obsidian && mv * __obsidian || true && git clone https://github.com/ppeetteerrs/obsidian-zola.git __site && __site/run.sh" publish = "public" [build.environment] LANDING_BUTTON = "進入我的大腦" LANDING_TITLE = "首頁標題" LANDING_DESCRIPTION = "首頁副標題" # 首面的筆記名稱 LANDING_PAGE = "home"

Obsidian DataviewJs的應用

圖片
Foreword DataviewJs為Dataview的更進一步應用,使用javascript撰寫。 筆記示範,如何使用DataviewJs並結合CustomJs讓取得Tasks的方式可以在多個筆記引用。 Content 安裝PlugIn CustomJs 指定js的資料夾 撰寫 MyTask.js 取得所有 未完成的工作 ,並濾掉不需要的 資料夾 及 header class MyTask { getTasks(dv) { let tasks = dv.pages().where((f) => f.file.path.indexOf("60.Extra") == -1).file.tasks; tasks = tasks.where( (t) => !t.completed && t.section.subpath.indexOf("Routine") == -1 ); tasks.sort((t) => t.due); return tasks; } } 完成後放到資料夾 60.Extra/67.Assets/js DataviewJs顯示Tasks 透過customJs 使用MyTask,並呼叫getTasks取得待處理工作。 針對 各狀態 過濾,顯示 標題及Tasks 。 若要顯示結果,將dataviewjs- marked ,的 -marked 移除。 const isDue =(t)=>{ var result= moment(new Date(t.due)).isBefore(moment(),"day"); return result; } const isToday =(t)=>{ var result= moment(new Date(t.due)).isSame(moment(),"day"); return result; } const isUpcoming =(t)=>{ var result= moment(new Date(t.due)).isAfter(moment(),"day&q

git 修改最後一次的commit

圖片
  前言 你是否會常commit了變更後,發現少寫了什麼或某段程式寫錯了,然後就會修改後,再commit一次,假設你又跟我一樣常犯傻,剛的情況又來一次的話, history就會長得如下3個commit,多了v2,v3 。 解決方法 針對commit了,又後悔想修改的話,針對幾個情境的解決方式。 1. 修改/新增併入最近的commit 如前言所述,最近的commit為“訂單新增API v3”,如圖,我想再將修改內容,併入v3的commit。 使用方式 將修改的先加入暫存區 (同Visual Studio 加入到stage) git add --all 簽入加上參數 –amend –no-edit git commit --amend --no-edit -–amend: 將暫存區的加入最近一次的commit -–no-eidt: 不需要commit message commit沒有增加,但內容已由v3變成 v3-1 2.修改最近commit的訊息 有時簽入時,才發現訊息寫錯了,想修改該如何做? 本例示範將“訂單新增API v3” 改成“訂單新增API v3 OK ” 使用方式 簽入加上參數 --amend -m 參數 git commit --amend -m “訂單新增API v3 OK” 一樣是3個commit,但最後一個訊息已加上“OK” 注意事項 上述的兩種方式,其實都是撒掉前一次的commit,再換一個新的commit,仔細看的話,ID是不一樣的。在本地的commit可以任意使用,但針對 已push出去的commit ,儘量 不要這樣用 ,以免造成別人在處理衝突的困擾。 總結 以上兩個指令,可以大量減少一些不必要的commit,讓整個歷史記錄更清楚明瞭。 白話文:可以簽了又簽、簽了又簽,還是一個commit。 相關參考 git 修改歷史訊息

Obsidian 上傳圖片到Github

圖片
前言 在Obsidian將複製的圖片貼到筆記裡時,照預設的方式,會放到相對應或你指定的本機目錄內。目前有些筆記需要分享出去或公開的Blog,在轉出去的過程,針對那些在本機的圖片,需要再處理一次,轉成網路的位置,處理一次就令我頭痛了。所以之後的筆記只要是插入圖片,都是來自網路資源。 插入來自網路圖片,代表著勢必要先上傳到網路某個空間,且支援公開的靜態資源,然後取得URL,再放到筆記內…..這個作法,太土炮,作個幾次,就想翻筆電了XD。 本文會介紹如何在寫筆記的過程,將複製的圖片貼到筆記時,先上傳圖片到Github上,並取得圖片在Github上公開的URL,貼到筆記內。 如何使用 前置設定 先到Gitthub建立一個respository,本文: ObsidianAssets。 到 Github個人設定 ,建立Token ,只會顯示1次,要保存好。 下載Upgit ,upgit_win_amd64.exe(windows),放到你指定的位置,例如:D:.exe 在剛的位置,新增新增config.toml,並將github的資訊填入 # 預設上傳者 default_uploader = "github" # 圖片位置設定 rename = "{year}/{month}/upgit_{year}{month}{day}_{unix_ts}{ext}" [output_formats] "bbcode" = "[img]{url}[/img]" "html" = '<img src="{url}" />' "markdown-simple" = "![]({url})" # Github 上傳者 [uploaders.github] # 保存文件的分支,例如 master 或 main branch = "master" pat = "你的Token" # 您的respository repo = "ObsidianAssets" # 您的 Gtihub 用户名 username = "kimx" 設定好後

.Net Core 使用反向代理-YARP

圖片
前言 在參考Clearn Architecture時,看到的一個有趣的東東 YARP 反向代理套件,用來實作Api Gateway架構(如下圖),將多個微服務集合起來,對外統一端點、負載平載、壓縮、緩存等。 圖片來源:微軟電子書 什麼是YARP   微軟開源的專案,運用 .NET (.NET Core) 建置高效能反向代理,Y特點是容易自訂,用戶可以根據需求,自訂並且調整成來滿足特殊場景的需求。 提供了兩個主要使用和自訂的方向,第一個是作為一個全功能代理;另一種使用方式,則是將 YARP 用於高度自定義的環境,用戶可以直接呼叫 YARP 請求轉送程式,繞過路由和負載平衡等模組。開發者甚至可以在同一個程序中混合兩種方式,根據路由切換。( 參考來源twMVC ) POC實作 本文將新增一個ApiGatewary專案及2個WebAPI專案,由ApiGatewary統一對外存取WebAPI。 1.新增ApiGatewary 專案 加入套件 Install-Package Yarp.ReverseProxy -Version 1.1.1 Program.cs  啟用YARP builder.Services.AddReverseProxy()     .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy")); .. app.MapReverseProxy(); 2.新增 WebAPI專案-Product 回傳產品資訊 https://localhost:7298/api/products/Product     [Route("api/products/[controller]")]     public class ProductController : ControllerBase     {         [HttpGet]         public IEnumerable<Product> Get()         {             List<Product> products = GeTestData();             return products;         } .. ...略 3.

Application Insights 整合NLog

圖片
前言    這兩天將寫好的LineBot程式部署到Azure上測試,過程中發生錯誤及功能無法成功執行時候,要檢查是什麼原因? 頓覺寸步難行,沒有記錄可以查詢......也不知該如何查XD。花了些功夫,將這塊補上。 Application Insight - 啟用 App Service --> Application Insights 啟用。 啟用後,此時程式不用任何修改,只要有Request就可以在Azure上的Application Insights Transaction search查詢基本的資訊。 Application Insight - 程式修改 nuget參考  : Microsoft.ApplicationInsights.AspNetCore Program.cs  builder.Services.AddApplicationInsightsTelemetry(); appsettings.json 加入連線字串 (在Applicaiton Insights 頁面取得)     "ApplicationInsights": {         "ConnectionString": "Your Connection String"     } 此時你在本機測試(任何Request),可以在Azure上的Application Insights Transaction search查詢 或在Visual Studio查詢 Application Insight-搭配NLog 加入nuget參考 NLog.Web.AspNetCore Microsoft.ApplicationInsights.NLogTarget 新增NLog.config 設定如下, <instrumentationKey> 須換成你的 ,instrumentationKey在跟你取得ConnectionStrings同一位置。 設定內容:寫入檔案及Application Insights,並忽略開發時期的一堆底層資訊。 <?xml version="1.0" encoding="utf-8"?> <nlog xmlns="ht

.Net Core 使用NLog

圖片
  之前.Net Framework時使用的NLog,到了.Net Core後,使用方式有點不同,整理如下。 加入套件 NLog NLog.Web.AspNetCore 新增NLog.config檔案 設定檔已針對Microsoft及Hosting等略過及Conosle處理 <?xml version="1.0" encoding="utf-8"?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" throwExceptions="false"       xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">   <extensions>     <add assembly="Microsoft.ApplicationInsights.NLogTarget" />     <add assembly="NLog.Web.AspNetCore"/>   </extensions>   <variable name="layoutDefine"       value="${longdate} [${event-properties:item=EventId_Id:whenEmpty=0}][${level:padding=-5}] ${message} ${exception:format=tostring} (${callsite:includeNamespace=false:fileName=true:includeSourcePath=false})" />   <targets>     <!---預設所有資訊先寫到Trace-->     <target xsi:type="Tra