acaj2018
acaj2018
資訊小幫手
271 posts
Don't wanna be here? Send us removal request.
acaj2018 · 11 days ago
Text
C# 映射(Reflection)
Tumblr media
在開發程式的過程中,常常會想要更加靈活的寫法,而這時映射(Reflection)可以大力的幫助到你, Reflection 允許我們的程式在執行時再去檢查和操作型別資訊,這對於如果你想要建立動態、可擴展的程式來說非常方便。接下來,我將介紹一些Reflection的基本用法並包含程式碼Code,以便幫助你更好的掌握這項技術。
第一步,我們需要引入Reflection所需的命名空間:
using System;
using System.Reflection;
接下來,建立一個MyClass
class MyClass {   public int MyProperty { get; set; }   public void MyMethod()   {     // 輸出一段簡單的文字    Console.WriteLine("Hello, World!");   } }
internal class Program {   static void Main(string[] args)   {    // 獲取類別型別資訊    Type type = typeof(MyClass);    Console.WriteLine("Class Name: " + type.Name);    // 列出所有屬性    foreach (var property in type.GetProperties())    {     Console.WriteLine("Property: " + property.Name);    }    // 列出所有方法    foreach (var method in type.GetMethods())    {     Console.WriteLine("Method: " + method.Name);    }    // 暫停    Console.ReadLine();   } }
執行結果如下:
Tumblr media
動態建立類型並叫用其方法
假設我們想要創建一個 MyClass 的實體,但不直接使用 new 關鍵字。可以使用 Activator.CreateInstance 方法:
Type type = typeof(MyClass);
// 動態建立 MyClass 的實體
object instance = Activator.CreateInstance(type);
// 使用 GetMethod 獲取名為 MyMethod 的方法
MethodInfo methodInfo = type.GetMethod("MyMethod");
// 使用 Invoke 方法來呼叫 MyMethod
methodInfo.Invoke(instance, null);
執行結果如下:
Tumblr media
在這段程式碼中,我們動態建立了 MyClass 的一個實體,並使用Reflection 呼叫了 MyMethod 方法。值得注意的是,如果MyClass擁有建構式,在Activator.CreateInstance時會一併呼叫其建構式。
修改屬性
Reflection也可以用來修改物件的屬性:
PropertyInfo propertyInfo = type.GetProperty("MyProperty");
propertyInfo.SetValue(instance, 42);
int propertyValue = (int)propertyInfo.GetValue(instance);
Console.WriteLine("Property Value: " + propertyValue);
執行結果如下:
Tumblr media
透過這種方式,我們可以在不直接引用類別的情況下操作其屬性,這在動態程式設計時常常使用到。
呼叫私有成員
有些情況下,我們可能會需要呼叫私有類別的成員。雖然並不常這樣使用但 Reflection其實能做到這一點:
class MyClass {   //私有方法   private void PrivateMethod()   {    Console.WriteLine("我是一個私有的方法。");   } }
// BindingFlags.NonPublic 表示搜尋私有(private)的成員
// BindingFlags.Instance 表示搜尋實例成員(非靜態成員)
MethodInfo privateMethod = type.GetMethod("PrivateMethod", BindingFlags.NonPublic | BindingFlags.Instance);
privateMethod.Invoke(instance, null);
執行結果如下:
Tumblr media
通過 BindingFlags,我們可以去指定私有方法。但必須特別注意,請減少使用這種做法,因為這麼做可能違反了物件導向程式設計的封裝原則,且也可能違背了當初程式開發人員所設計的邏輯。
使用時的注意事項
雖然Reflection很方便,但在使用時也要注意以下幾點:
性能:Reflection可能會比直接呼叫來的慢,在一些需要頻繁使用的情境下,還是要考慮Reflection的必要性。
安全性:通過Reflection訪問私有的屬性、方法可能會導致問題。
可維護性:當過度使用Reflection時,有可能導致程式變得難以理解和維護。
躲避編譯器檢查:在平時直接呼叫方法如果有錯,在編譯時就可以發現錯誤,但使用Reflection時,往往需要你在執行當下才可以發現錯誤。
結論
Reflection是 C# 提供的非常有用的工具,能夠使我們靈活的去撰寫程式碼,Reflection的各種動態地呼叫方法、建立物件等操作讓初次接觸的我完全沉迷於其中,但在使用時真的不得不謹慎,由於繞過了編譯時的型別檢查和安全檢查,除了確保程式的效能和安全性,還得考慮程式的可讀性與可維護性。希望這篇文章有幫助到你,謝謝
參考資料: https://learn.microsoft.com/zh-tw/dotnet/csharp/advanced-topics/reflection-and-attributes/
0 notes
acaj2018 · 1 month ago
Text
PHP 如何使用Google API相關功能
Tumblr media
有別於其他的API,使用google的API時,需要使用Google Client Library,除了使用composer載入以外,也可以透過此連結直接下載,要記得選擇與��前 PHP 框架對應的檔案才能正常使用,本篇文章會說明如何使用Google Client Library,包含前置設定,引用功能到實際使用google drive的API上傳檔案。
前置作業
1.首先到google專案頁面建立一個專案,建立完成後點選左側的API和服務
Tumblr media
2.左側跳轉到憑證頁面,建立OAuth用戶端ID
Tumblr media
3.應用程式類型選取網頁應用程式,授權的JavaScript 來源以及授權的重新導向 URI,分別對應送出OAuth以及接受OAuth結果的網址,這個網址是可以使用localhost的
Tumblr media
4.點選左側選單程式庫,並搜尋要啟用的API點選啟用
Tumblr media Tumblr media
5.點選剛剛申請好的OAuth 用戶端ID,點選用戶端密鑰旁的下載,會得到一個json檔
Tumblr media
6.至此設定就完成了,接下來是程式面的開發,我們需要建立一個送出請求的 php 頁面
建立一個google client物件 →$client = new Google\Client();
將上一步的json檔案載入 →$client ->setAuthConfig(“json檔的相對或絕對路徑”);
加入這次要使用的API範圍,這個步驟要跟上面的第4步開啟API相呼應,只設定這邊還是會無法使用該API →$client ->addScope(Google_Service_Drive::DRIVE_FILE);
加入這兩個設定,讓之後其可以自動刷新憑證,不加的話每隔一段時間就得重複開啟OAuth頁面做授權 →$client->setAccessType('offline'); →$client->setApprovalPrompt('force');
設定用戶給予權限後要重導向回我們系統的處理頁面 →$redirect_uri ="處理頁面url"; →$client ->setRedirectUri($redirect_uri);
取得要給客戶同意授權的頁面url,並用js或其他方式將用戶導向到這個頁面 →$auth_url = $client ->createAuthUrl(); →echo("location.href = '".$auth_url."'");
7.接下來要建立授權接收端的頁面
經過實測後證實用同一個$client物件做授權行不通,所以得另外宣告一次 →$client = new Google\Client();
加上client端的設定 →$client ->setAuthConfig(“json檔的相對或絕對路徑”);
範圍跟重導向的設定也要加上
用得到的code獲得token,並設定給client物件,這個token最好另外存放,資料庫或實體檔案皆可,用來權限過期刷新 →$token = $client -> fetchAccessTokenWithAuthCode($_GET['code']); →$client -> setAccessToken($token);
使用前確保物件沒過期 →if(!$client->isAccessTokenExpired()) 
如果過期的刷新方式 →$client = new Google\Client(); →$client ->setAuthConfig("json檔的相對或絕對路徑"); →$client->setAccessToken("前一次認證儲存的token"); →$refresh_token = $client->getRefreshToken(); →$token = $client->fetchAccessTokenWithRefreshToken($refresh_token);
若確認沒過期即可使用我們授權範圍的API物件 →$service = new Google_Service_Drive($client);
上傳檔案到指定的資料夾範例 →$file = new Google_Service_Drive_DriveFile(); →$file->setName('test.jpg'); // 這裡你可以設定你想要的文件名稱 →$file->setParents(array('google資料夾的ID')); →資料夾的ID=點進資料夾的網址,最後面的那串18~tP
Tumblr media
→$result = $service->files->create($file, array(   'data' => file_get_contents("要上傳的檔案路徑"),   'mimeType' => mime_content_type("要上傳的檔案路徑"),   'uploadType' => 'multipart'  )); → $file_id = $result->id;   $permission = new Google_Service_Drive_Permission(array(    'type' => 'anyone',    'role' => 'reader',   ));   $service->permissions->create($file_id, $permission);
結論
在現代的網頁開發中,Google提供的API無疑是不可或缺的工具。雖然Google將API相關的套件模組化,極大地簡化了實際使用時所需的開發時間,但這也使得開發前的準備和設定變得更加複雜。Google的OAuth認證作為使用所有API模組的前置作業,稍有不慎的設定錯誤就可能導致認證失效,進而中斷自動化程式的運行。為了幫助開發者更好地應對這些挑戰,撰寫此篇文章記錄了使用 PHP 與Google Client Library的步驟。本文將詳細介紹從開發環境的設置、Google API的啟用、OAuth 2.0認證的配置到實際範例程式碼的編寫,讓讀者能夠全方位掌握整個流程。這篇文章的目的不僅僅是提供一個指南,更是為了建立一個開發過程中的參考,讓未來在使用Google API進行開發時,能夠更加順利和高��。希望此文能為大家帶來幫助,讓相關開發工作變得更順利。
0 notes
acaj2018 · 2 months ago
Text
銀髮經濟新趨勢:簡訊如何提升老年人生活品質
銀髮經濟 是針對老年人口的特殊需求所開發的一系列經濟活動,主要集中在「健康照顧、休閒、文化與家居」…等項目。隨著全球人口老年化趨勢的加劇,銀髮經濟的重要性日益凸顯。根據國情統計通報,台灣自2018年3月起,65歲以上的老年人口已達343萬人,超過總人口的14%,正式邁入高齡社會。推估在2026年,超過65歲的人口將占總人口數的20%以上,到時台灣將邁入超高齡社會。
Tumblr media
這意味著,針對老年人口的服務需求將迅速增長,企業和政府需要積極探索新的方式來提升服務品質和效率。在這樣的背景下,簡訊作為一種便捷、高效的溝通工具,可以在銀髮經濟中發揮重要作用。
簡訊在健康照顧中的應用
健康照顧是銀髮經濟中最重要的一環。老年人對於健康管理的需求高,特別是慢性病管理、醫療提醒和健康諮詢…等方面。簡訊可以在這些領域發揮重要作用:
醫療提醒
老年人經常需要進行定期體檢和回診。醫療機構可以藉由簡訊服務,定期向老年患者發送體檢通知和回診安排,協助他們記住重要的健康管理事項。這不僅可以提升醫療服務的品質,還能減少因為忘記檢查或回診所帶來的健康風險。
健康資訊
簡訊可以用來提供便捷的健康資訊服務。醫療機構可以透過簡訊平台,向老年患者提供健康資訊和建議,例如:飲食控制、運動建議和疾病預防…等相關訊息。特別是在流感大爆發的特殊情況下,醫療機構可以發送簡訊提醒老年患者如何預防疾病並保重身體。
簡訊在休閒與文化活動中的應用
老年人不僅需要健康照顧,還需要豐富的休閒與文化生活。簡訊可以幫助組織和推廣各種適合老年人的活動,提升他們的生活質量。
活動通知
社區中心、老年活動中心和文化機構可以利用簡訊系統,向老年人發送各類活動通知,包括:講座、舞蹈班、手工藝課程和旅行團…等。由於大多數老年人可能比較少上網,因此獲得活動資訊的速度較慢,但是現在很多老年人其實還是會使用手機,所以使用手機簡訊來接收資訊對他們來說比較方便又及時。這樣的方式不僅可以確保他們能夠及時獲取相關資訊,還能幫助他們積極參與各類社交和文化活動,豐富他們的生活。
簡訊的優勢
簡訊服務在銀髮經濟中的應用具有多方面的優勢:
接收操作簡單
接收手機簡訊的操作簡單,老年人只需掌握基本的手機使用技能即可接收簡訊,這對於不熟悉智能手機和應用程式的老年人來說非常友好。
不易受網路訊號影響
簡訊可以在短時間內將訊息傳遞給目標對象,且不易受到網絡訊號影響。這意味著,即使在網絡訊號不佳的偏鄉地區,簡訊也能正常發送和接收。
總結來說,簡訊服務在銀髮經濟中的應用不僅能夠提升服務品質,還能增強老年人的生活便利性和安全性。在高齡社會的背景下,簡訊將成為提升銀髮族服務品質的重要工具。
發簡訊就找《詮力科技》
我們是與多家知名企業、銀行合作的簡訊發送商。為顧客提供多元且專業的簡訊服務,包括:SMS簡訊、MMS簡訊、客製化簡訊及大量簡訊…等,發送管道穩定又安全,並於2024年3月獲得ISO27001:2022國際資安認證。
發送給既有名單,歡迎加入簡訊廣播站,完成註冊即送50點!
其他簡訊服務,請與客服聯繫,我們會盡快協助您。
0 notes
acaj2018 · 2 months ago
Text
偵錯階段使用Https
Tumblr media
這是在某一天開發網站的社群帳號登入功能時發生的事情,因為碰到要介接的Http服務要求redirect回網站時須採用 Https ,因此在開發階段需啟用SSL,即Visual Studio須在debug階段就啟用SSL。
往常開發網站或API時,只需要考慮Http即可,因為Https通常是直接設定在IIS上即可,故開發過程中通常是可以忽略的,相對較少的情境才會需要在debug開發時就需要Https;要使用Https也不難,就是要知道設定在哪就好。
因為當時電腦環境更換使用新的windows 11、是以才剛重灌過,除此之外,Visual Studio也取代過去的2019、而改使用新版的Visual Studio 2022(版本:17.5.4),開發專案也使用.net 6、而非習慣的.net Framework 4.5~4.7等。
是以剛開始打開專案屬性時,由於介面更換花了不少時間尋找設定所在位置,在此給大家一個建議:直接搜尋關鍵字「debug」或「url」(搜尋關鍵字Https或SSL是找不到的),而後即可在「偵錯」的區塊中找到設定「開啟 debug 啟動設定檔UI」。
Tumblr media
Visual Studio會跳出設定視窗,可在IIS Express的設定檔中找到「使用SSL」設定,將其勾選後,「應用程式SSL URL」就會出現對應的Https網址,且該網址無法修改。
Tumblr media
另外設定下方的「啟用匿名驗證」與「啟用Windows驗證」兩者,需勾選其中之一,若兩者皆不勾選,在啟動IIS Express進行偵錯時、Visual Studio將會跳出錯誤警告視窗。
Tumblr media
設定完後,別忘了在啟動偵錯時選擇使用「IIS Express」,畢竟剛剛調整設定的是IIS Express的啟動設定檔。
Tumblr media
於是我設定完成後就可以順利使用Https了嗎?錯!
也不知道是否是因為電腦才剛重灌、導致過去開發時新增的localhost憑證都不在了,所以啟用SSL後碰到的就是Https不安全的瀏覽器畫面。
Tumblr media
舊版的Visual Studio若要啟用SSL、使用Https進行偵錯,會跳出視窗詢問是否自動新增憑證,然而不知道是否是因為我專案是Http、開發到中途才啟用SSL的原因,一開始沒有主動跳出該視窗;不過也沒關係,錯誤畫面很明顯是憑證問題,然後重新創建localhost憑證即可。
由於後續打算透過指令直接重建localhost憑證,是以重新創建憑證前,可以考慮先把舊有的憑證先行清除,包含使用者憑證:個人\憑證、受信任的根憑證授權單位\憑證,以及本機電腦憑證:個人\憑證、受信任的根憑證授權單位\憑證,若有看到localhost的憑證皆可先刪除。
※ 當然未必每個地方都有憑證,以我的當時經歷來說,就只有一個目前使用者\個人\憑證存在localhost憑證。
Tumblr media Tumblr media
下方提供指令進行創建localhost憑證(須使用系統管理員的權限執行):
切換目錄至 IIS Express 安裝文件夾 cd "C:\Program Files (x86)\IIS Express"
創建憑證,記得先將指令中的url改為專案應用程式SSL URL ./IisExpressAdminCmd.exe setupsslUrl -url:https://localhost:44300/ -UseSelfSigned
Tumblr media
追加補充:網路上也存在另一份指令,是針對IIS Express的port 44300至44399 範圍,進行重置憑證,如下:
$cert = New-SelfSignedCertificate -DnsName "localhost", "localhost" -CertStoreLocation "cert:\LocalMachine\My" -NotAfter (Get-Date).AddYears(5) $thumb = $cert.GetCertHashString()
For ($i=44300; $i -le 44399; $i++) {  netsh http delete sslcert ipport=0.0.0.0:$i }
For ($i=44300; $i -le 44399; $i++) {  netsh http add sslcert ipport=0.0.0.0:$i certhash=$thumb appid=`{214124cd-d05b-4309-9af9-9caa44b2b74a`} }
$StoreScope = 'LocalMachine' $StoreName = 'root'
$Store = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Store -ArgumentList $StoreName, $StoreScope $Store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite) $Store.Add($cert)
$Store.Close()
Reference:
IIS Express 10 localhost SSL certificate reset
Recreate the Self-Signed HTTPS Certificate for Localhost in IIS Express
【ASP.NET Web API 2】開發環境使用 SSL
0 notes
acaj2018 · 3 months ago
Text
精選旅遊行銷4大絕招
Tumblr media
過了端午後天氣將漸漸平穩,是最適合出門踏青出遊的時候,雖然說今年剩下的連假不多,但接下來不但會碰上學生們長達2個月的暑期時間,還有許多值得一起出遊歡慶的節日,不管你是賣套裝旅遊行程、飯店住宿還是包車服務,你都要先提前布局接下來的旅遊市場,才能趁機搶下旅遊市場的大餅。
但為什麼別人的商品那麼熱銷,自家的商品卻是乏人問津呢?在這種情況往往是你的行銷方式出一些問題,別太擔心接下來我們將分享幾個旅遊業行銷心法,幫助你輕鬆的將商品銷售出去,讓你的業績蹭蹭的往上飛。
[找到客群偏好和需求]
你必須了解目標客群的需求和偏好,你可以透過市場調查和過往客戶消費紀錄進行分析,這樣就可以精確掌握客戶的旅行習慣和消費能力,進而設計出完美符合他們期望的旅遊商品,還能挖掘潛在的客戶群,比如旅行社在規劃銀髮族客群的行程上就不能太緊湊,要給予足夠的休息時間和自由活動時間,景點和景點之間的距離最好也不要太遠,交通選擇上也比較喜歡寬敞舒適且便捷的交通方式。
簡訊範例
【詮力旅遊社-長青樂活遊】詮力特別為你規劃了系列樂齡旅遊,讓你再創人生下半場的精彩篇章,全程旅遊秘書將隨團為各位服務,不管國內國外各式行程任君挑選,歡迎搜尋「詮力旅行社」查看行程!
[全方位行銷,抓住客戶目光]
現在客戶能獲取資訊的管道非常多元化,如果你僅依賴單一渠道進行推廣,這樣銷售成績很難達到你預設的目標,你應該使用不同的渠道進行行銷,這樣才能提升曝光率,讓客戶能夠看到你,你可以結合社交媒體、簡訊廣告、部落格心得分享等多種方式來全方位推廣你自己!
其中簡訊廣告是最直接且高效的推廣方式,由於簡訊具有高開啟率和即時性,你可以針對特定客戶群發送優惠訊息或是旅遊規劃建議,迅速吸引客戶的注意力並引導消費行為,而且簡訊行銷特別適合於提醒客戶即將到來的活動或是限時優惠,增加客戶的緊迫感和購買動機。
簡訊範例
【詮力旅遊社-會員日限定】2024夏季嘉年華,入住五星度假飯店,品味當地時令饗宴,深度走訪大街小巷,形成超低價$10,900起,快邀請親朋好友一起出遊,詳細旅遊行程請搜尋「詮力旅遊嘉年華」,結帳輸入「2024ITE2VIP」在折500元哦!
[展現你的獨特性]
旅遊商品競爭非常激烈,你要如何在眾多選項中脫穎而出,取決於商品的獨特性和吸引力,你應該多展現旅遊行程中的特色活動、優質服務或是獨家景點秘境,讓客戶感受到物超所值。
創造自己的獨特方式有幾種方向,比如你可以先觀察對手的操作方式做逆向操作,或是關注近期熱門的議題,可藉由結合熱門議題的方式帶動你的商品銷量,比如先前大家都在瘋狂搶票的《從拉斐爾到梵谷:英國國家藝廊珍藏展》,你可以將住宿加上去奇美博物館的來回交通,或是與餐廳合作研發與展品相關的餐點,也可以規劃一日或半日行程中間穿插奇美博物館,協助客戶可以很順暢的看畫又能遊玩台南。
[使用優惠折扣誘發消費]
適時的提供一些優惠折扣或是主題促銷活動也是提升銷售的方法之一,最常見就是限時折扣、早鳥優惠、或是團購活動,這些都能激發客戶的購買欲望,促使他們儘快下單購買。
透過以上行銷心法分享,能夠幫助旅遊相關產業能夠有效提升商品的市場競爭力,吸引更多客戶,絕對是必學的行銷密技喔!
0 notes
acaj2018 · 5 months ago
Text
如何用 MMS 發送活動通知來打響行銷戰
Tumblr media
在這個數位時代,簡訊行銷不再只是使用傳統的文字訊息,透過 MMS (多媒體簡訊服務,也稱作圖文簡訊),企業可以把圖片、影片、音樂等多媒體內容直接發送到客戶的手機上,增加品牌印象。我們將提供品牌企業了解如何利用MMS來發送活動通知,並提供許多實用的行銷範例讓您輕鬆發出行銷簡訊。
簡訊行銷現在已經從簡單的文字訊息,進化到可以包含豐富多媒體內容的MMS。企業可以利用這些進階功能,讓行銷訊息更具吸引力和互動性。過去可能只是文字告知優惠,現在可以搭配圖片或影片,讓顧客更直觀地了解優惠內容。而MMS比起傳統的SMS,有以下幾個優點:
文字不受限制:不用再擔心文字字數,想寫多少都可以。
多媒體支援:可以加上圖片、影片、音樂等,讓訊息更生動。
高點閱率:經過客戶反饋,相較於文字簡訊,多媒體簡訊的點閱率遠高於SMS,更容易吸引顧客看到您要傳遞的資訊。
我們先介紹幾個常用的MMS行銷範例,可幫助品牌商家更理解如何運用圖文簡訊,您可能常看到這樣的訊息:
Tumblr media
以上這二則簡訊,相較之下哪一個比較吸引您的目光呢?
純文字簡訊受限於字數限制只能言簡意賅,但是多媒體簡訊可以提供圖片及增加更多吸引人的敘述,讓客戶可以多了解產品資訊。
那麼,多媒體簡訊要如何發送呢?其實非常簡單。
首先,您需要先準備文案和多媒體檔案。
品牌商家需要進行文案準備,內文要有活動主題(15字內)、優惠方案、品牌名稱、聯繫方式及網址等。當然還有最重要的多媒體檔案,請設計吸引人的圖片或影音,圖文合計請控制在300KB內。然後步驟二,使用MMS發送平台發簡訊。準備好前面的資料後,請登入MMS平台,輸入客戶名單號碼和簡訊文案,上傳製作好的多媒體檔案,然後設定預計發送的時間。就完成新增多媒體簡訊了,簡單又快速!
除了前面提出的範例,MMS在不同行業也有各式各樣的應用!
【餐飲】
Tumblr media
【服飾】
Tumblr media
【保養品】
Tumblr media
多媒體簡訊(MMS)已成為現代行銷的重要手段。企業應善用MMS的多樣化功能,創造吸引人的行銷內容,精準觸達目標客戶群體。無論是新品上市、周年慶活動,還是日常促銷,都可以通過MMS有效傳達,從而提升品牌影響力和客戶忠誠度。希望透過這篇文章,幫助品牌商家們更好地利用多媒體簡訊進行行銷活動,達到理想的行銷推廣效果。
如果您對多媒體簡訊服務有興趣,歡迎品牌企業及公司行號與我們聯繫!
詮力科技官網:https://www.ite2.com
詮力MMS介紹:https://blog.ite2.com/mms/
0 notes
acaj2018 · 5 months ago
Text
Windows 10安裝 Ubuntu 子系統
Tumblr media
Windows 10安裝 Ubuntu子系統
以往,如果想在一台Windows 系統中,再執行另一個作業系統,例如 Ubuntu linux。往往都會使用內建的Hyper-V虛擬化,來建立虛擬的 Ubuntu作業系統。
Tumblr media
現在,Windows 10的作業系統中,已經有內建的Linux子系統,就讓我們來試玩看看。
首先開啟控制台,找到程式和功能,點選開啟Windows功能,找到Windows 子系統Linux版,並且勾選。
Tumblr media
勾選Windows 子系統Linux版,並且按下確定後,系統會開始進行安裝。
Tumblr media
安裝完成後,重新開機。
Tumblr media
接下來,開啟Windows 內建的 Microsoft Store。
Tumblr media
在Store中,搜尋Ubuntu,找到最新版本的Ubuntu APP版本。
Tumblr media
以最新版本的 Ubuntu 22.04.3 LTS為例,下載安裝。
Tumblr media
下載完成後,就可以開啟使用。
Tumblr media
開啟後,第一次使用,需要建立使用者帳號。
Tumblr media
使用者帳號、密碼建立完成後,就可以進入到 Ubuntu 的指令。
Tumblr media
接下來,我們回到Windows 桌面,開啟檔案總管。
Tumblr media
可以看到左邊的裝置會顯示出一個Linux資料夾,點選資料夾進去後,就可以用Windows 檔案總管,瀏覽 Ubuntu 的檔案結構了。
Tumblr media
除了檔案總管會出現Linux資料夾外。
Windows 開始程式集中,也會出現 Ubuntu 22.04.3 LTS的程式。
Tumblr media
接下來我們試試看幾個常用的Ubuntu指令。
Sudo top 檢視系統資源狀態。
Tumblr media Tumblr media
以上,就已經完成Windows 10直接安裝Ubuntu套件,可以不需要使用虛擬化。同時也可以很直覺的利用Windows檔案總管,瀏覽Ubunut檔案結構,減少雙系統切換操作的工作時間。
接下來,我們繼續測試幾個常用的Linux指令,例如檢視網路設定的ifconfig,但是發現無法執行。這是Ubuntu APP尚未安裝網路套件,接下來我們再繼續安裝網路套件。
Tumblr media
輸入指令:sudo apt install net-tools,開始進行安裝。
Tumblr media
安裝完成後,再輸入ifconfig,就可以檢視網路功能了。
Tumblr media
接著我們再利用Windows的命令提示字元,輸入ipconfig。
Tumblr media
可以看到Windows 以及內建的Ubuntu都是相同的IP。
對於喜歡玩Windows、 Ubuntu雙系統的玩家,想要同時使用 Windows 和 Linux 的開發人員提供順暢且具生產力的體驗。
詮力科技的NE-201除了是一台Windows平台的NAS儲存系統。透過以上介紹。介紹給對於喜歡玩Windows、 Ubuntu雙系統的玩家,想要同時使用 Windows 和 Linux 的開發人員提供順暢且具生產力的體驗。
0 notes
acaj2018 · 6 months ago
Text
IIS環境安裝WordPress教學
Tumblr media
WordPress 做為常用的部落格或企業形象官網框架,很多主機商都對其有蠻高的支援度,但是若想要安全性完全由自己控管,就得自行將環境架設起來。雖然要求的環境只有三要素,WordPress安裝包本體、可執行php的環境(如apache、nginx)、以及Mysql,如果使用整合套件會方便許多,如常見的xampp,但會受限於整合套件本身的支援度以及套件本身已知的弱點,反而容易被攻擊,本篇文章將介紹如何從零開始使用Windows的IIS環境架設WordPress網站。
前置作業
1.安裝PHP
安裝PHP
解壓縮放到D:/下(純範例,放在其他路徑也可,但後續設定要做相應調整)
設定php.ini檔
Tumblr media
2.安裝Windows Server 安裝 MySQL Community 免費社群版
安裝完成後建立新的一組User
Tumblr media
登出後使用該User登入
點選Schema切換頁籤
Tumblr media
空白處按右鍵>建立新資料庫
Tumblr media
輸入資料庫名稱
Tumblr media
這邊建議使用 utf8mb4 這個字元集,主要的差異是 utf8mb4 最多使用4位元編碼一個字,而 utf8 最多只有3位元編碼一個字
如果要跟國際接軌,使用4位元才可以儲存更多國家的文字,包含中文的罕見字
在 Charset 選擇「utf8mb4」,在Collation 就選擇「utf8mb4_unicode_ci」
3.下載WordPress
安裝完後解壓縮,先記住這個解壓縮完的路徑
Tumblr media
在IIS安裝 WordPress 網站
1.開啟控制台>最右排程式和功能
Tumblr media
2.左側開啟或關閉windows功能
3.找到Internet Information Services > World Wide Web服務>應用程式開發功能>選擇ASP.NET 4.8、NET擴充性4.8選項
Tumblr media
4.Internet Information Services > World Wide Web服務>一般HTTP功能選擇預設文件、靜態內容選項(才連的到本地js css)
Tumblr media
5.打開IIS管理員
6.IIS > 左側選單應用程式集區>右鍵新增應用程式集區
7.名稱:PHP (可自行取名)、 .NET CLR 版本:沒有受控碼、受控管線模式:整合式
Tumblr media
8.對「站台」按右鍵,選「新增網站」
9.輸入站台名稱,我這邊用 "wordpress"做為示範名稱
10.在「應用程式集區」選擇 "PHP"
11.實體路徑就選擇剛剛 WordPress 下載後解壓縮的位置
12.在下方的主機名稱,如果有設定 DNS 轉址到此電腦 IP,就可設定網域名稱,連接埠我用 8080 port 做示範
13.設定完成後點選右側的瀏覽:*8080,按照WordPress的安裝教學完成安裝
Tumblr media
14.安裝完成後前往http://localhost:8080/wp-admin/
15.登入後確定外掛安裝/啟用、外觀安裝/啟用、圖片上傳以及文章編輯/發布等等功能是否正常,若正常則完成安裝流程
結論
在過去,大部分的PHP框架都是架設在Linux環境上。這主要是因為Linux提供了一個強大且靈活的開發環境,讓開發者可以輕鬆地安裝和管理各種開發工具和套件。然而,這也帶來了一些挑戰。由於缺乏明確的套件和版本維護準則和流程,開發者常常會遇到操作錯誤,導致網站無法正常運作或出現各種問題。
相比之下,Windows系統的操作簡單直觀,大家的掌握度普遍較高,不需要下指令就能完成許多操作。因此,我們撰寫了這份教學,提供一個在Windows系統��安裝WordPress的標準流程,讓更多的開發者能夠輕鬆地在Windows環境下建立和管理他們的網站。
然而,我們在測試過程中發現,偶爾開啟頁面時會跑出 WordPress 自動檢查更新的錯誤。雖然這個錯誤並不影響網站的正常使用,但我們仍然需要進一步觀察,以確定是否存在相容性問題。此外,隨著網站功能的增加和變複雜,可能還會出現其他的問題和隱憂。
因此在使用這個流程時,應該定期備份網站數據,並且密切關注 WordPress 和其他相關套件的更新,以確保網站能夠穩定運行。
0 notes
acaj2018 · 7 months ago
Text
Echart 的基本介紹
Tumblr media
Echart 是一個基於javascript的開源資訊圖表函示庫,主要是提供資料可視化的功能,什麼是資料可視化呢?資料視覺化的意思是將需要用到的資料以圖表的方式去呈現,例如我們日常生活中常會用到的長條圖、折線圖、圓餅圖等,都是一種資料可視化的方式。
//在HTML頁面中創建要放入圖表的容器
<div style=”width: 500px;height:400px><div>
創建Echart實體
var chart = echart.init(
document.getElementByd(‘main’));
//設定圖表選項和資料
var option = {
title: {
  text=’折線圖’
},
tooltip:{},
xAxis:{
   data:{‘周一’,’周二’, ’周三’ ,’周四’, ’周五
’, ’周六’,’週日’},
xAxis:{},
series : [{
  name : ‘數量’,
  type : ’line’
  data :  [8,42,65,84,156,56,45]
}]
};
//將變數option設定的圖表選項帶入echart實現圖表
Chart.setOption(option);
接下來將要介紹ECharts裡面常會用到的物件方法��屬性。
1.echart.init(document.getElementByd(‘main’));
這方法能夠初始化Echarts,以HTML中的DOM節點為參數,進行如器的初始化,讓Echart能夠產生圖表。
2.option{…}
決定圖表如何生成的物件,可以用來設定圖表的標題、x軸、y軸、圖表中的資料等,是echart當中必要實作的物件。
3.Option.title
是一個負責設定圖表標題的物件,裡面會包含許多的屬性其中常見的有:
text:圖表標題中的文字。
textStyle:這也是一個物件,負責標題文字的渲染,其中的屬性通常都是用來設定顏色、大小、字型等。
show:用來決定是否要顯示標題。
link:標題的連結。
target:決定點擊標題連結後開啟視窗的方式。
‘self’是在當前視窗打開
‘blank’是在新的視窗中打開
4.yAxis
是用來設定圖表的y軸:
4.1 type:坐標軸類型,裡面有四種屬性可以坐使用。
value:數值軸,這是最常使用到的屬性,較適合用在需要顯示連續數值的地方。
categeory:類別軸,較適合使用在需要以類別來分類的情況中。
time:時間軸。
log:對數軸,比較少被使用到。
4.2 name:軸的名稱,用來解釋軸代表的意思。
4.3 nameLocation:軸名位置的擺放,提供start,middle,center,end來將軸名分別放在上面、中間、下面。
4.4data:定義Y軸資料表。
5.legend
圖表標籤相關設定,包括顏色、名稱、顯示、方式、顯示位置等。
orient:圖表標籤的擺放方式,提供水平跟垂直兩種顯示方式。
formatter:自訂標籤顯示模板。
6.seris
為物件的陣列,用來設定圖表資料。
type:決定使用何種圖表類型,例如用line能設定折線圖,用bar可以設定柱狀圖等。
name:軸的名稱。
data:定義資料。
7.tooltip:用來設定圖表提示框,決定提示框以何種方式呈現,並設定觸發提示框顯示的方式:
show:布林值,是否顯示提示框,預設為true。
trigger:三種選項:
item:通常用於資料類圖形顯示,如圓餅圖、散點圖。
axis:通常用於座標類圖形顯示,如柱狀圖、折線圖。
none:不觸發。
triggerOn:觸發提示框顯示的方法,目前支援mousemove和click兩種方式。
formatter:自訂提示框顯示模板
8.toolbox :圖表工具箱,具備圖表區域放大、下載圖表、切換圖表顯示方式等功能。
orient:工具箱的擺放方式,提供水平跟垂直兩種顯示方式。 預設為水平。
feature:物件,為工具箱核心功能設定,提供多種功能使圖表更靈活:
saveAslmage:將圖表儲存為圖片,另還可對此進行設定,例如圖片下載的副檔名、名稱等。
dataView:展現目前所使用的資料,可對其進行編輯,並使圖表動態更新。
dataZoom:圖表資料的縮放功能,目前只支援直角坐標系列的圖表使用。
magicType:物件,可使用該物件下的type屬性進行動態圖表 顯示的定義,例如從折線圖轉成柱狀圖。
restore:重置已被調整過的圖表。
9.setOption:初始化Echarts後,定義圖表如何顯示的物件方法。 需傳入實作後的option物件進行圖表實現。
0 notes
acaj2018 · 7 months ago
Text
C# Chatgpt 功能串接教學
Tumblr media
隨著ChatGPT技術的日益成熟,其在各行各業的應用範圍也不斷擴大,成為了當今科技趨勢的重要一環。將AI輔助功能整合到應用程式或網站中,不僅可以優化用戶體驗,還能提高工作效率,降低運營成本。本文將重點介紹如何將ChatGPT技術與現有服務相結合,從而在不同方面發揮其潛力。
首先,自動生成內容是ChatGPT的基礎應用之一,這可以幫助內容創作者或企業快速填充網站、社交媒體或廣告平台的內容,節省大量時間和精力。此外,ChatGPT也能夠分析客戶問題,透過理解和處理自然語言,提供更準確、個性化的客戶服務。
進階應用方面, ChatGPT 能夠自動產出各類文件,包括報告、電子郵件和合同等,從而提高工作效率。音頻應用也日益受到重視,例如將文字轉換成語音,為視障人士提供閱讀服務,或為多語言用戶提供即時翻譯。
在企業層面,利用 ChatGPT 優化流程不僅能提升生產力,還能吸引客戶,減少運營成本。例如,通過自動化處理常見的客戶諮詢,企業可以將人力資源集中在更需要專業知識的領域。
為了實現這些應用,本文將詳細介紹如何申請和開通OpenAI的API服務,以及如何在C#專案中整合ChatGPT,從而使開發者能夠輕鬆地將這項強大的技術應用到自己的產品和服務中。無論您是創業者、開發者或是對AI技術感興趣的專業人士,本文都將為您提供實用的指南,助您探索ChatGPT帶來的無限可能。
前置作業
1.前往https://openai.com/註冊帳號並登入
2.點選API
Tumblr media
3.左側選單選取Settings->Billing
Tumblr media
4.預先設定付款資訊(未設定串接後會無法使用)
5.左側選單選取API keys
Tumblr media
6.點選Create new secret key
Tumblr media
7.將api key記錄下來保存好
8.在vs開起專案->右鍵->管理Nuget套件
9.瀏覽處搜尋OpenAI->安裝
Tumblr media
10.在使用的專案引入  • using OpenAI_API;  •  using OpenAI_API.Chat;
11.使用apiKey建立OpenAIAPI物件  •  var apiKey = "上方記錄的apikey";  •  var openAiClient = new OpenAIAPI(apiKey);
12.建立對chatgpt的請求  •   ChatMessage completion = new ChatMessage();   →建立一個ChatMessage物件  •  completion.TextContent = "要詢問chatgpt的話";  •  var result = await openAiClient.Chat.CreateChatCompletionAsync(completion);   → 送出請求  •  string answer = result.ToString().Trim();   → 取得chatgpt的回答
實際應用
假設一個應用是當客戶輸入其販售的產品資訊、目標客戶、期望的語氣、產品特點,就可以自動產出一篇宣傳文章。
string productName = "台股 0094 ETF";
string targetAudience = "想獲得高利息的投資者、在猶豫是否把錢投入股市的人";
string copyStyle = "興奮";
string additionalInfo = "抗通膨、低管理費、每月高息";
我們可以將這些資訊插入到詢問chatgpt的模板內,例如
string prompt = $"生成一條針對{targetAudience}的廣告社群行銷文案,文案中不要有任何的hashtag,文案內要包含產品名稱" +
                            $"宣傳產品'{productName}'," +
                            $"文案風格為{copyStyle}," +
                            $"產品特點:{additionalInfo}"+
                            $"字數限制:不超過200個字,但要大於100字";
然後將此字串作為請求送出,得到的結果示例如下:
想要讓你的錢賺更多嗎?現在就投資'台股 0094 ETF'吧!抗通膨,低管理費,每月高息!不再猶豫,快來加入我們,享受高利潤帶來的 興奮!讓你的錢為你工作,輕鬆賺取
結論
在本篇教學中,我們簡介了如何在C#環境中串接OpenAI API的完整流程。從設定API密鑰到建立連接,再到實際應用中的使用,我們提供了清晰的步驟和範例代碼,以幫助開發者快速上手。透過這次的學習,我們了解到利用OpenAI API,可以大幅擴展C#應用程式的功能,使其能夠執行自然語言處理、機器學習等複雜任務。這不僅提升了開發效率,也為未來的應用開發打開了新的可能性。總而言之,透過本文的流程,開發者應該能夠順利地將OpenAI API整合到自己的C#項目中,為應用程式帶來更多創新和智能的特性。
0 notes
acaj2018 · 8 months ago
Text
SSD 優秀讀寫效能的背後:若長時間未通電可能導致內部資料遺失
Tumblr media
要選擇使用哪種硬體來備份自己珍貴的檔案,一直是每一位檔案管理者的所苦惱的問題,隨著科技推陳出新,固態硬碟(SSD)的每TB單價也逐漸降低,且由於檔案存放在NAND快閃記憶體內,不需像傳統機械硬碟(HDD)需等待馬達旋轉與磁頭動作,因此擁有遠高於機械硬碟的讀寫速度與更低的功耗,而在使用NAS組建磁碟陣列(RAID)且預算充足時,使用SSD搭建磁碟陣列並且享受快速的檔案存取速度,已成為多數人的選擇。但也由於NAND顆粒的先天架構,相對於傳統機械硬碟,如果使用SSD進行檔案冷備份時, SSD在長時間未通電的情況下卻可能造成潛在的檔案遺失風險。以下將介紹SSD的儲存原理,並列出此狀況的成因與相應的策略,讓您貴重的檔案保存起來更加安全。
SSD的儲存原理與可能造成檔案遺失的情況
NAND快閃記憶體透過在半導體元件中儲存電荷來記錄數據。由改變電位的高低,即改變數據位元的0和1狀態從而寫入或抹除數據。但內部的電荷可能會隨著以下數種狀況慢慢流失或造成電位高低改變而喪失數據:
物理老化:
隨著使用時間的增加,NAND快閃記憶體單元的物理結構可能會逐漸退化,導致它們保持電荷的能力下降。
漏電:
在非使用狀態下,儲存電荷的元件可能由於半導體材料的小瑕疵(如極其微小裂縫或缺陷)而緩慢地流失電荷。
讀寫磨損(Read-Write Wear):
隨著讀寫次數(P/E cycle) 的增加與快閃記憶體的大量讀寫操作,會加速快閃記憶體單元的老化。
儲存溫度過高:
在高溫存放SSD可能會加速硬體老化,造成其內部電荷的流失。
影響SSD數據保持能力的因素
快閃記憶體類型:
SLC快閃記憶體由於每個單元只儲存一個位元,因此其穩定性最高,數據保持時間也最長。相比之下,MLC和TLC因為每個單元存放更多位元,故更易受到電荷流失的影響,若預算充足可考慮選擇高規格的SSD,惟實際可儲存的時間隨著各家廠商使用的主控晶片與顆粒品質不同而有所不同。
使用與存放條件:
儲存環境的溫度也會影響SSD中數據的穩定性。理想的儲存環境應保持在生產商推薦的溫度範圍內。過高或過低的溫度都可能加速導致數據遺失。
如何降低SSD長期未通電而衍生檔案遺失的風險
要降低SSD長期未通電而衍生檔案遺失的風險,最直接了當的方式就是定期將SSD接上電腦、NAS、或您的資通設備開機通電,對於長時間未連接電源的SSD,定期通電可以讓主控晶片重新整理(Refresh)內部已儲存的數據,也可以讓NAND快閃記憶體內部恢復電荷並確保數據的完整性。對於長久未使用或處於冷備份狀態的SSD,保守的建議是每6個月*1通電一次。
結論
雖然SSD擁有很優秀的讀寫效能,但其在長期未通電的情況下可能面臨數據遺失的風險。對於長期未使用的SSD,定期通電是一種簡單而有效的維護其健康狀態的方式。同時應配合適當的儲存條件和定期數據備份策略,以確保數據的長期安全。而若有長期冷備份的需求,仍建議使用HDD來存放您寶貴的資料。而無論使用任何類型的儲存設備,或是組建任何類型的磁碟陣列,定期備份檔案始終是防止檔案遺失的最佳策略。平時應確保所有重要檔案都有至少有額外的另外一份,並備份保存在其他媒體上。
*1:關於每6個月對SSD通電以維持數據穩定性的建議,並無固定標準,坊間也有至少每年通電一次的建議,但畢竟未通電的時間越久,資料遺失的風險越大,基於保守的立場,若情況允許可以縮短通電時間的間隔,以防資料在長時間未通電的情況下而遺失。使用者可評估自身狀況,調整通電的時間間隔。
如果想更了解您的SSD,可參考SSD製造商提供的關於資料留存率 (Data Retention)的指南;以及JEDEC(全球半導體標準開發機構)發布關於SSD儲存的標準,其中包括資料保持性的定義和測試方法。
0 notes
acaj2018 · 8 months ago
Text
電腦變慢了,是否該升級了?
Tumblr media
最近時常有朋友或是同事來詢問為什麼"電腦變慢"、變卡了? 是不是中毒了?還是該升級電腦了?
以下提供幾個方法來判斷你的電腦出了什麼事。
當你覺得電腦變慢時,你可以打開工作管理員來檢視一下電腦各個硬體的使用狀態,例如CPU、記憶體、硬碟、網路是否已經吃滿使用率或是頻寬,最簡單的判斷就是看是否為100%,若是資源已經吃到90~100%,這除了是中毒或硬體故障外,還有最大可能就是你的電腦設備已經不夠你使用了!
Tumblr media
這邊簡單的講幾個容易判斷的狀況:
狀況1:CPU
若發現有不明程式讓CPU使用率飆高就得需要特別注意是不是中毒或是中了挖礦程式,或是只開幾個程式就快吃滿的話這就可能就是代表你的CPU已經不符合你的使用狀況,依現在文書機的需求,以intel為例大部分core-i3系列就可以達成需求,但若是你有影音、轉檔、遊戲等等的需求,那可能就需要挑到i5、i7等系列的處理器才夠使用。
狀況2:記憶體
在記憶體的部分則是看是不是真的開了太多的程式,現在的瀏覽器及應用程式都會吃不少的記憶體,通常標準配備都要16G以上的記憶體才比較符合現在使用人的習慣,你可以在瀏覽器內按下SHIFT+ESC開啟瀏覽器自身的資源檢視器,裡面會顯示出哪一個分頁、或者是擴充元件在吃資源。
Tumblr media
狀況3:磁碟
在硬碟的部分更不用說現在大部分都選擇使用固態硬碟SSD,不管是大檔小檔的讀取、寫入速度都是大贏現在的傳統硬碟HDD,在以前不選擇SSD的原因不外乎是費用太貴,但在近幾年因技術逐漸成熟及市場的需求,價格都大幅降低很多,因此越來越多人使用SSD來替代傳統硬碟,光是開機速度從30秒、1分鐘縮短到10秒就可以知道非常有感。
而通常是有程式在讀寫時才會造成硬碟使用率飆高,但若是檢視器沒顯示是什麼應用程式在使用硬碟,也有可能是硬碟已經快壞掉了,當硬碟即將故障、或是已經故障時也會導致Windows一直去讀取進而影響到你的系統、操作。
狀況4:網路
而開網頁時緩慢、圖片讀取不出來或是下載速度慢的話,那你可以檢查一下工作管理員的網路頁籤是否有應用程式在背景使用網路才將頻寬給吃滿,那若是發現網路不夠用,可以先確認一下之前與網路服務業者申請的速度為多少或是直接提升速度,若是時常觀看線上影音,家中也有多人使用都建議直接辦到100M以上。
光看Netflix的4K影片官方就建議至少15M、而Youtube官方給予的建議為20M。
Tumblr media Tumblr media
以上簡單給予幾個簡單的方法讓你判斷電腦是否已經不敷使用或是有其他狀況!
0 notes
acaj2018 · 9 months ago
Text
塑造您的簡訊情境
Tumblr media
你的簡訊有發到客戶心裡嗎?看到別的店家發完簡訊後生意嚇嚇叫,但您發完後生意成長卻只增加一點點,問題在哪呢?
「簡訊是好的釣竿,但也要搭配好的釣手和魚餌,大魚才會上鉤哦!」
那麼接下來就跟著這個主題來開始學習設計簡訊吧!
短簡訊範例
首先,就讓我們先看一則簡訊的內容。
Tumblr media
A、B兩則簡訊的差異就是【熟客感】,B簡訊帶入【人名】和【生日】等個人資訊,讓客戶有多一份驚喜外,還可以讓客戶知道是熟識的店家發送,而不是濫發的簡訊或是仿冒,多一層信任,更多促進消費及到店。
長簡訊範例
雖然現今提供了長簡訊的服務,讓您可以盡情介紹您的產品、服務或是優惠,但簡訊畢竟是透過手機閱讀,太長的內容會造成客戶在手機上閱讀困難。因此,使用簡短的文字提出重點,可以幫助客戶快速瞭解您想說的資訊。
以下的簡訊內容,哪一個好閱讀呢?
Tumblr media
比較完A、B 兩則簡訊後,您或許會發現「其實兩則都沒有那麼好閱讀」,這是因為我們還需要適當的斷行並用特殊符號做為輔助才可以讓內容更容易閱讀,讓客戶輕鬆找到重點。
將B簡訊修正後,是不是更好閱讀了呢?
Tumblr media
總結在本篇中我們學到了二個要點:
簡短文字摘要,幫助快速理解重點。
善用斷行、特殊符號幫助閱讀。
簡訊作為一種直接、即時、便捷的溝通工具,透過簡訊,可以更好地與客戶溝通,提升客戶體驗。此外,也建議除了使用簡訊作為工具外,搭配其他行銷工具,也能發揮出1+1>2的效果哦!
如有簡訊相關需求,歡迎聯繫《詮力科技》。我們是多家企業及銀行的簡訊服務合作廠商,提供多樣化的簡訊服務,包括OTP驗證簡訊、API簡訊、MMS簡訊等,滿足您的各種發送需求。
自有名單大量客製化發送請至 簡訊廣播站
發送帶有圖片的簡訊請至 MMS簡訊平台
簡訊其他服務詢問請填寫 客服表單
0 notes
acaj2018 · 10 months ago
Text
C# .net framework 如何自訂錯誤頁面
Tumblr media
在使用C#建立.NET Framework網站專案時,預設的錯誤頁面會顯示編譯器提供的錯誤訊息,使開發者能夠輕鬆地查詢問題並讓客戶方便回報問題給開發者進行修正。儘管這樣的設計初衷是良好的,但考慮到近年來網路攻擊日益頻繁,弱點掃描將顯示預設錯誤頁面列為高風險事項。這是因為預設錯誤頁面可能會將敏感的錯誤訊息暴露給用戶,進而讓攻擊者發現網站的弱點並進一步進行攻擊。因此,我們需要使用自訂的錯誤頁面,以隱藏實際的錯誤訊息,並提供更安全的使用體驗。
實作
在Web .config內的內新增一行 這個部分如果原本有的話應該是mode="Off",把其改成"On"就好,這個部分要注意的是On跟Off除了第一個字母大寫,其他都必須小寫才能正常運作,另外除了這兩個選項之外還有一個RemoteOnly,是讓本地運行時還是可以看到錯誤訊息,但我自己開發上的習慣還是建議改成"On",要查錯誤還是要靠寫程式養成好習慣多寫log來排查問題。
defaultRedirect代表要導向到的頁面,以.NET Framework專案來說的話是放在view/Home資料夾下的Error.cshtml檔
Error.cshtml可以寫一些常見的內容,例如直接顯示http狀態碼(404,500)或是直接提示發生意料之外的錯誤等等的方式都可以
Global.asax內新增
Tumblr media
如果原本就存在 Application_Start 只要把內容添加進去即可,代表處理錯誤時我們要把介面導向到Error.cshtml這個View。
補充
自訂頁面在使用vs使用debug模式運行時是不會顯示出自訂錯誤頁面的,一定要部屬到IIS上才能看到自訂錯誤頁面,同時也要注意IIS的設定內有沒有預設導向的錯誤頁面,如果有的話一定要記得移除,不然會以IIS內設定的錯誤導向頁面為優先。
結論
本文深入探討了在使用C#建立.NET Framework網站專案時的錯誤處理機制,特別聚焦於如何自訂錯誤頁面以提高安全性和使用者體驗。雖然Microsoft的官方文件提供了相關設定的基本指導,但往往並不足以滿足開發者的具體需求,而不同的框架設定方式也存在差異,這正是本文撰寫的動機所在。
通過對Web.config和Global.asax檔案的設定,我們可以有效地將預設錯誤頁面轉換為自訂錯誤頁面,從而隱藏敏感訊息並提供更安全的使用體驗。作者在實作部分提供了詳細的程式碼示例和注意事項,例如Web.config中的<customErrors>節點設定和Global.asax中的全域錯誤處理機制設定,以及對IIS部署時的相關注意事項。
儘管Microsoft的官方文件提供了一般性的指導,但本文從開發者的角度出發,更加詳細地解釋了實際的設定步驟和注意事項,以幫助開發者更好地理解和應用錯誤處理機制。
在不斷演進的網路環境中,網站安全性是一個持續關注的議題。通過學習和應用本文提供的技術,開發者能夠建立更加安全可靠的.NET Framework網站,為用戶提供穩定、安全的網路體驗,同時提高系統的可靠性和防禦能力。
因此,本文的目的在於填補Microsoft官方文件的不足,並從開發者的角度提供實用的技術指導,以應對不斷變化的網路攻擊和安全挑戰。
0 notes
acaj2018 · 10 months ago
Text
jQuery 快速處理多欄位表單(進階處理)
Tumblr media
在表單開發的過程中,我們經常面臨著處理各種複雜輸入元素的挑戰。在先前的文章中,我們已經���紹了如何迅速處理簡單的表單元素,包括select、text、textarea、number等。然而,當遇到像是radio button、checkbox或者更複雜的multicheckbox時,我們原本的處理方式就不再適用,容易導致資料庫存儲的資訊錯誤。因此,這篇文章旨在紀錄如何在現有的架構上進行調整,以快速獲取這些特殊輸入元素的值。
JS端送資料處理
我們假設套用bs的html架構如下:
<div class="form-group">   <label for="select-custom-type">您喜歡的類別是?</label>   <br>   <div class="form-check form-check-inline">   <input class="form-check-input" type="checkbox" name="select-custom-type"id="type-a" value="type-a">   <label class="form-check-label" for="type-a">類型a</label>    </div>   <br>   <div class="form-check form-check-inline">   <input class="form-check-input" type="checkbox" name="select-custom-type" id="type-b" value="type-b">   <label class="form-check-label" for="type-b">類型b</label>   </div>   <br>   <div class="form-check form-check-inline">   <input class="form-check-input" type="checkbox" name="select-custom-type" id="type-c" value="type-c">   <label class="form-check-label" for="type-c">類型c</label>   </div> </div>
記得同一題複選的name必須要相同,取值時才會記錄正確哦,
通常這類型的input不多,所以我們手動先建好用來放複數使用者選擇值的陣列
var selecCustomType= []:
然後在沒有這種複數選項時我們的js是這樣的
$.each(formArray, function(i, field) {  formData[field.name] = field.value; }); 我們在裡面增加一個switch case來判斷是否是多選,然後將值塞進我們預先準備好的陣列。 $.each(formArray, function(i, field) {  switch (field.name) {   case 'select-custom-type':   selecCustomType.push(field.value);   break;  default:   formData[field.name] = field.value;   break;  } });
在each處理完之後,在把陣列放回formdata
formData["select-custom-type"] = selecCustomType;
接下來就跟之前一樣了把準備好的formData使用ajax丟到後端,
丟到後端以後,其餘流程不變,但在插入欄位前我們先把array改成使用逗點結合的字串,以php為例。
foreach ($data as $datakey => $value) {  if(is_array($value)){   $data[$datakey] = implode(",",$value);  } }
假設我們前端勾選了type-a及type-c,
我們存到後端資料庫的型態就會是字串”type-a,type-c"。
JS端接收資料處理
至於將資料撈取回填表單也是相對單純,只需將撈完的物件以Array的型態直接丟回前端,使用類似以下方式
$.each(data, function(key, value) {  var inputElement = $('[name="' + key + '"]');  if (inputElement.length > 0) {   if (inputElement.is(':checkbox')|| inputElement.is(':radio')) {    if(values!=""){     var values = value.split(',');     inputElement.each(function() {      this.checked = values.includes($(this).val());     });    }   } else {    inputElement.val(value);   }  } });
即可將對應的資料回填到頁面上,這段程式碼是一個用於將後端資料回填至前端表格的 jQuery 腳本。它使用了 $.each 函數來迭代後端傳回的資料物件 data 中的每一對鍵值。對於每一組鍵值,它會檢查在前端是否存在具有相同名稱的輸入元素。
如果存在對應的輸入元素,程式碼會進一步檢查該元素是否為勾選框(checkbox)或單選按鈕(radio button)。若是,則它會將後端傳回的值以逗號分隔,並將這些值設定為輸入元素的選取狀態,使得多個選項可以被預先選取。特別需要注意的點是,程式碼在執行這個動作之前需要確認 values 變數是否為空。
如果輸入元素不是勾選框或單選按鈕,則程式碼會將後端傳回的值直接設定為該輸入元素的值。以這樣的方式實現了將後端資料有效地回填至前端表格,確保使用者在瀏覽頁面時可以看到先前提交的資料。
結論
表單的開發已經不算是有技術含量的工作,即使如此若不使用特別的方式優化其開發,實務上會變得費時費力,而且使變更及開發成本提高,即使市面上已經有很多現成的表單工具提供api串接,也提供許多優秀的統計圖表供分析,在開發安全性較高或含有商業機密的客製化表單時,依舊得自己從頭開發,找到一個快速構建基礎讓工程師專注在開發技術層面高的商業邏輯及安全性相關的處理才是符合經濟效益的選擇。
0 notes
acaj2018 · 10 months ago
Text
C# 實作Javascript map函數
Tumblr media
說明:這次主要內容為實作上次所介紹的Javascript的"map函數"功能,我以C#的List陣列擴充了一個Map方法,並使用了多載的方式使參數能像Javascript的map功能任意選填。
實作擴充List陣列程式碼如下:
public static List<T> Map<T>(this List<T> e, Func<T, T> f) {  List<T> tmp = new List<T>();  foreach (var i in e)   tmp.Add(f(i));  return tmp; }
以上程式為單一引數且引數中的函數的引數也是單一的Map多載實作。和Javascript的map功能幾乎一模一樣。
public static List<T> Map<T, U>(this List<T> e, Func<T, U, T> f, U e2) {  List<T> tmp = new List<T>();  foreach (var i in e)   tmp.Add(f(i,e2));  return tmp; }
以上程式為兩個引數且函數的引數也是兩個的Map多載實作,另外因為c#似乎無法像Javascript的apply()函數或是call()函數,可以直接將函數的this指定為該引數的物件,所以我這邊改了一下輸入函數的引數,將輸入函數的引數增加一個在最後面為Map函數的第二個引數的物件。
public static List<T> Map<T>(this List<T> e, Func<T, int, T> f) {  List<T> tmp = new List<T>();  int n = 0;  foreach (var i in e)   tmp.Add(f(i, n++));  return tmp; }
以上程式為單一引數且引數中的函數的引數是兩個的Map多載實作。輸入的函數的第二個引數和Javascript的map一樣,都是執行的迴圈中當下的索引值,索引值從0開始每圈遞增1。
public static List<T> Map<T, U>(this List<T> e, Func<T, int, U, T> f, U e2) {  List<T> tmp = new List<T>();  int n = 0;  foreach (var i in e)   tmp.Add(f(i, n++,e2));  return tmp; }
以上程式為兩個引數且引數中的函數的引數是三個的Map多載實作。輸入函數中的第三個引數和上面的程式一樣是Map函數的第二個引數所輸入的參數值。
public static List<T> Map<T>(this List<T> e, Func<T, int, List<T>, T> f) {  List<T> tmp = new List<T>();  int n = 0;  foreach (var i in e)   tmp.Add(f(i, n++, e));  return tmp; }
以上程式為單一引數且引數中的函數的引數是三個的Map多載實作。輸入的函數的第二個引數同上面輸入的函數是雙引數的狀況,第三個引數和Javascript的map一樣是Map所執行的那個list陣列,也就是this List<T> e的那個e參數。
public static List<T> Map<T, U>(this List<T> e, Func<T, int, List<T>,U, T> f, U e2) {  List<T> tmp = new List<T>();  int n = 0;   foreach (var i in e)    tmp.Add(f(i, n++, e,e2));  return tmp; }
以上程式為兩個引數且引數中的函數的引數是四個的Map多載實作。輸入的函數的前三個引數和輸入函數為三個引數的前一個多載一樣,最後一個引數和其他Map函數輸入雙引數的狀況一樣。
實際使用範例程式碼:
List<int> data1 = new List<int>() { 1, 2, 3, 4 }; List<int> output = data1.Map(x => x + 1); Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(output)); List<string> data2 = new List<string>() { "Windows 10", "ITE2", "Power", "About" }; List<string> data3 = new List<string>() { "NAS", "Center", "Cloud", "ITE2" }; List<string> output2 = data2.Map(stringadd, data3); Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(output2)); static string stringadd(string a, int b, List<string> c, List<string> d) {  return c[b] + " " + d[b]; }
說明:第一行程式宣告了data1變數為int型態的list陣列,並且陣列內容有四筆資料分別為1、2、3、4的數字,第二行程式宣告了output變數為int型態的list陣列並且讓它等於剛才第一行所宣告的data1變數Map(x=>x+1)的結果,x=>x+1相當於f(x) = x+1的函數,所以已Map函數的運作規則data1陣列的第一個陣列變數1輸入f(1) = 1+1會變成2,data1陣列的第二個變數會變成f(2)也就是3,data1陣列的第三個變數會變成f(3)也就是4,data1陣列的第四個變數會變成f(4)也就是5,所以輸出的陣列為[2,3,4,5],output =[2,3,4,5],第三行Newtonsoft.Json.JsonConvert.SerializeObject為Newtonsoft的NuGet套件,可以使用加入NuGet套件來處理JSON相關的資料,Newtonsoft.Json.JsonConvert.SerializeObject主要功能是將物件轉換成JSON的字串,Console.WriteLine主要功能是將引數的內容呈現在console的視窗上,所以console視窗上會顯示[2,3,4,5]的字串,順帶一提因為使用的是WriteLine所以顯示的字串後面會加上換行符號,也就是下一個顯示在console視窗上的資料會在此字串的下一行,第四行程式宣告了data2變數為string型態的list陣列,並且陣列內容有四筆資料分別為"Windows 10"、"ITE2"、"Power"、"About"的字串,第五行程式宣告了data3變數為string型態的list陣列,並且陣列內容有四筆資料分別為"NAS"、"Center"、"Cloud"、"ITE2"的字串,
第六行對data2執行Map函數,引數分別為stringadd這個函數以及data3這個字串陣列,這裡先介紹stringadd這個函數,如第十行所示stringadd函數主要是回傳引數三陣列的第引數二個位置的字串值和空白字符與引數三陣列的第引數二個位置的字串值串接產生的新字串,所以data2.Map(stringadd, data3);會變成data2的第一個陣列值內容"Windows 10"加上空白字元再加上data3的第一個陣列值內容"NAS"也就是"Windows 10 NAS"字串,新產生陣列的第一個陣列值內容,data2的第二個陣列值內容"ITE2"加上空白字元再加上data3的第二個陣列值內容"Center"也就是"ITE2 Center"字串,新產生陣列的第二個陣列值內容,data2的第三個陣列值內容"Power"加上空白字元再加上data3的第三個陣列值內容"Cloud"也就是"Power Cloud"字串,新產生陣列的第三個陣列值內容,data2的第四個陣列值內容"About"加上空白字元再加上data3的第四個陣列值內容"ITE2"也就是"About ITE2"字串,新產生陣列的第四個陣列值內容,第七行將第六行新產生的陣列以JSON字串格式輸出至console視窗顯示,結果為["Windows 10 NAS","ITE2 Center","Power Cloud","About ITE2"]
0 notes
acaj2018 · 1 year ago
Text
寵物經濟崛起,簡訊一招抓住寵物商機!
Tumblr media
近年來,養寵物已然由一個趨勢演變成社會的一股熱潮。不僅有越來越多的人選擇養寵物,同時伴隨著生活水平的提高、價值觀念的改變,以及種種環境因素的影響,寵物在人們心中的地位逐漸攀升,被視為家庭的一員。這種轉變帶來了巨大的變革,人們願意在寵物的飲食、健康照顧和生活環境等方面投入大量金錢和心力,進而開創了”寵物經濟”的新藍海。
根據內政部與農委會資料,2022年截至9月,國內貓狗飼養登記數量(約18萬)已經遠超過新生兒人口(約10萬)。這樣的數據清晰地呈現了寵物經濟崛起的趨勢,寵物已經成為人們生活中不可或缺的一部分。這也帶動了寵物相關產業的蓬勃發展。其中,寵物醫療成為一塊潛力龐大的市場,不僅反映了人們對寵物生命品質的重視,也為商家提供了豐富的商機。
寵物醫療商機
在寵物經濟的大環境下,寵物醫療成為了一個受到關注的焦點。人們不再只滿足於寵物的基本養護,更願意投入大量的金錢和心力為寵物提供高水平的醫療服務。這一需求的增加,為寵物醫療產業帶來可觀的市場。
寵物醫療服務的擴展:隨著飼主對寵物健康的關心加深,寵物醫療不再僅僅停留在基本的疫苗接種和常規檢查上,許多高端的寵物醫療服務應運而生,包括寵物牙科、寵物中醫治療等。這些服務不僅提升了寵物的生活品質,也為寵物醫療市場帶來新的商機。
寵物保險的興起:寵物保險作為一種新興的金融保障工具,為飼主提供了在寵物生病或受傷時的經濟支持。這不僅解決了飼主在寵物醫療費用上的擔憂,同時也刺激了寵物市場的發展,使得更多人願意尋求高品質的醫療服務。
寵物醫療與簡訊的結合
隨著科技不斷的進步,簡訊成為了一種便捷、即時的溝通方式。在寵物醫療領域,簡訊的應用為商家和飼主之間的互動提供了新的可能。
預約提醒服務:寵物醫院可以透過簡訊提醒飼主寵物的預約時間,減少因疏忽而造成的時間浪費。這不僅提高了預約效率,也為飼主提供了更好的用戶體驗。
醫療資訊推送:商家可以透過簡訊向飼主推送寵物醫療相關資訊,包括健保知識、疫苗提醒等。這不僅有助於飼主更好的了解寵物的健康需求,同時也建立了飼主和商家之間的信任關係。
寵物商機無限可能
寵物醫療作為寵物經濟的一個重要組成部分,擁有廣闊的市場前景。隨著科技的發展,簡訊等相關通訊工具的應用將進一步拓寬寵物醫療產業的發展空間。商家可以透過不斷的創新和提升服務水平,更好的滿足飼主的需求,同時透過科技手段提高經營效益,實現寵物商機的最大化。
專業的簡訊發送平台
詮力科技的簡訊發送服務是商家與消費者之間的溝通橋樑。透過簡訊可以幫助您即時通知大小事,讓重要資訊不漏接!我們提供多元的簡訊服務,讓您在平台就可以通通完成操作,包括純文字簡訊(SMS)、圖文簡訊(MMS)、客製化簡訊、大量簡訊等。現在加入簡訊廣播站,完成註冊先送50點讓您免費體驗!價格合理,發送成功才計費,趕快與我們聯絡吧!
0 notes