function b64toBlob(b64Data, contentType = "", sliceSize = 512) {
const byteCharacters = atob(b64Data);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
const blob = new Blob(byteArrays, { type: contentType });
return blob;
}
function downloadFromBase64() {
let b64Data = ""; // xlsx 文件的 base64 編碼
let contentType = "application/octet-stream";
const blob = b64toBlob(b64Data, contentType);
const url = URL.createObjectURL(blob);
const link = document.createElement("a");
link.style.display = "none";
link.href = url;
link.setAttribute("download", "excel.xlsx");
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
Learning World
2022年10月6日 星期四
[Javascript] 將base64轉成Xlsx檔案
Ref: https://juejin.cn/post/7044439580434497549
2022年3月27日 星期日
2021年8月19日 星期四
職場小技巧
最近公司邀請鼎堅航太的創辦人分享
有幾個點覺得很不錯,紀錄一下
1.發生問題前提示 VS. 發生問題後找原因
2.系統不一定要最好,但比舊有的模式好,比現有流程好
3.不同付錢的人,對於功能需求不同
(管理方希望監控全盤數據,營造方想躲避違規數據)
有幾個點覺得很不錯,紀錄一下
1.發生問題前提示 VS. 發生問題後找原因
2.系統不一定要最好,但比舊有的模式好,比現有流程好
3.不同付錢的人,對於功能需求不同
(管理方希望監控全盤數據,營造方想躲避違規數據)
切換檔案擁有者
在試驗存取遠端資料夾的時候
更改了資料夾的權限,但子資料夾的權限又不同步
試到後來導致連administrator都沒有權限存取
後來找到這個方法可以修改資料夾的權限
更改了資料夾的權限,但子資料夾的權限又不同步
試到後來導致連administrator都沒有權限存取
後來找到這個方法可以修改資料夾的權限
takeown /a /r /d Y /f C:\{foldername}
參考:
https://www.petenetlive.com/KB/Article/0001200
https://ithelp.ithome.com.tw/articles/10238630
ASP.NET切換登入帳號存取資料夾
試了很久,連接網路上芳鄰的資料夾
後來找到這篇,可以成功存取檔案
後來找到這篇,可以成功存取檔案
// 參考: https://docs.microsoft.com/zh-TW/troubleshoot/aspnet/implement-impersonation
public class ImpersonateHelper {
public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;
WindowsImpersonationContext impersonationContext;
[DllImport("advapi32.dll")]
public static extern int LogonUserA(String lpszUserName,
String lpszDomain,
String lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int DuplicateToken(IntPtr hToken,
int impersonationLevel,
ref IntPtr hNewToken);
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern bool RevertToSelf();
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool CloseHandle(IntPtr handle);
public bool impersonateValidUser(string userName, string password, string domain) {
WindowsIdentity tempWindowsIdentity;
IntPtr token = IntPtr.Zero;
IntPtr tokenDuplicate = IntPtr.Zero;
if (RevertToSelf()) {
if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0) {
if (DuplicateToken(token, 2, ref tokenDuplicate) != 0) {
tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
impersonationContext = tempWindowsIdentity.Impersonate();
if (impersonationContext != null) {
CloseHandle(token);
CloseHandle(tokenDuplicate);
return true;
}
}
}
}
if (token != IntPtr.Zero)
CloseHandle(token);
if (tokenDuplicate != IntPtr.Zero)
CloseHandle(tokenDuplicate);
return false;
}
public void undoImpersonation() {
impersonationContext.Undo();
}
}
2020年4月9日 星期四
[C#]XML 相關操作
最近因為開發某個功能需要跟別的系統介接
如果想把XML直接轉成class
Visual Studio有支援可以把XML或JSON轉成 class
路徑: Edit -> Paste Special -> Paste XML As Classes
轉完之後,再查看一下欄位的格式是否是想要的
有了class可以少去一個欄位一個欄位對應轉換成XML
產生的XML string驗證是否正確
可以透過以下兩個網頁來檢驗
1. https://www.freeformatter.com/xml-formatter.html#ad-output
2. https://codebeautify.org/xmlvalidator
發現對方的存取都是透過XML string
最方便的方法就是透過string直接做處理
但是一下轉string,一下轉XMLElement
如果資料的數量多,難免會影響效能
後來想了,如果一開始就透過XDocument做處理
是不是可以省去轉string或XML Element的步驟
找了網路上的方法,整理會用到的功能
有新增欄位、刪除欄位、變更tag名稱
static void Main(string[] args) {
XElement bookElement = new XElement("book");
XDocument doc = new XDocument(bookElement);
AddElement(ref doc, "author", "Gambardella, Matthew");
AddElement(ref doc, "title", "XML Developer's Guide");
AddElement(ref doc, "genre", "Computer");
AddElement(ref doc, "price", 44.95);
AddElement(ref doc, "publish_date", new DateTime(2000, 1, 1));
AddElement(ref doc, "description", "An in-depth look at creating applications with XML.");
Console.WriteLine(doc.ToString());
ReplaceTagName(ref doc, "description", "memo");
Console.WriteLine(doc.ToString());
RemoveElement(ref doc, "genre");
Console.WriteLine(doc.ToString());
}
// 更換xml的tag name
public static void ReplaceTagName(ref XDocument doc, string origTagName, string newTagName) {
foreach (var element in doc.Descendants()) {
if (element.Name.LocalName.Equals(origTagName)) {
element.Name = newTagName;
}
}
}
// 新增欄位
public static void AddElement(ref XDocument doc, string elementName, object elementValue) {
try {
doc.Root.Add(new XElement(elementName, elementValue));
} catch (Exception e) {
Console.WriteLine("AddElement error:" + doc.ToString() + Environment.NewLine + e.StackTrace);
}
}
// 移除欄位
public static void RemoveElement(ref XDocument doc, string elementName) {
try {
doc.Descendants().SingleOrDefault(p => p.Name == elementName).Remove();
} catch (Exception e) {
Console.WriteLine("RemoveElement error:" + doc.ToString() + Environment.NewLine + e.StackTrace);
}
}
如果想把XML直接轉成class
Visual Studio有支援可以把XML或JSON轉成 class
路徑: Edit -> Paste Special -> Paste XML As Classes
轉完之後,再查看一下欄位的格式是否是想要的
有了class可以少去一個欄位一個欄位對應轉換成XML
產生的XML string驗證是否正確
可以透過以下兩個網頁來檢驗
1. https://www.freeformatter.com/xml-formatter.html#ad-output
2. https://codebeautify.org/xmlvalidator
2019年10月17日 星期四
團隊開發模式導入
今天有同事要離職了,離開前做了一份心得+交接報告
裡面有提了一個大點,是目前團隊急需要改進的
在未來的開發模式中,我是希望漸漸導入這些工具或概念
時代在走,雖然跟不上潮流,但這些工具都是經過驗證的
對於系統的開發、維護上,一定會有實質上的幫助
版本控制使用版本控至的優點,可以在部屬新版本的程式時
若發生錯誤,可以馬上回復上一個版本
另外也可以避免多個人同時改到同一支程式
可以做Conflict的Merge處理
版本控制目前常用的有git和svn
git是分散式,每個本機都會建置Repository
沒有網路還是可以commit,查看歷史紀錄
svn是集中式的,全部都必須倚賴server
如果server壞掉,就不能在commit程式
不過svn的權限控制比較完整
目前企業界比較多人使用
svn server建置參考
RESTful API
開發時使用RESTful的寫法,有助於維護
透過看HTTP Method大概可以知道用途
(GET、POST、PUT、PATCH、DELETE)
另外寫 API 方便,寫測試方便,產生文件方便
Code Review
優點是可以分散維護風險,讓其他人能接手
另外透過Code Review的方式,也能讓團隊討論制定標準
一起互相檢視彼此的程式碼,給出最低 Code Review 通過標準
自動化測試
當新版本程式上版時,若有自動化測試
可以免除改A壞B的問題,可以做基本過濾
撰寫自動化測試需要額外的時間(可能跟開發相當)
但自動化可以重複利用,可以減少重複測試時間
技術文件
有技術文件的優點可以讓未涉足該領域的開發人員
透過技術文件的範例解說,能快速上手
也能熟悉專案使用技術,資訊技術透明化
而不是自己花時間摸索嘗試錯誤中走出路來
裡面有提了一個大點,是目前團隊急需要改進的
在未來的開發模式中,我是希望漸漸導入這些工具或概念
時代在走,雖然跟不上潮流,但這些工具都是經過驗證的
對於系統的開發、維護上,一定會有實質上的幫助
版本控制使用版本控至的優點,可以在部屬新版本的程式時
若發生錯誤,可以馬上回復上一個版本
另外也可以避免多個人同時改到同一支程式
可以做Conflict的Merge處理
版本控制目前常用的有git和svn
git是分散式,每個本機都會建置Repository
沒有網路還是可以commit,查看歷史紀錄
svn是集中式的,全部都必須倚賴server
如果server壞掉,就不能在commit程式
不過svn的權限控制比較完整
目前企業界比較多人使用
svn server建置參考
RESTful API
開發時使用RESTful的寫法,有助於維護
透過看HTTP Method大概可以知道用途
(GET、POST、PUT、PATCH、DELETE)
另外寫 API 方便,寫測試方便,產生文件方便
Code Review
優點是可以分散維護風險,讓其他人能接手
另外透過Code Review的方式,也能讓團隊討論制定標準
一起互相檢視彼此的程式碼,給出最低 Code Review 通過標準
自動化測試
當新版本程式上版時,若有自動化測試
可以免除改A壞B的問題,可以做基本過濾
撰寫自動化測試需要額外的時間(可能跟開發相當)
但自動化可以重複利用,可以減少重複測試時間
技術文件
有技術文件的優點可以讓未涉足該領域的開發人員
透過技術文件的範例解說,能快速上手
也能熟悉專案使用技術,資訊技術透明化
而不是自己花時間摸索嘗試錯誤中走出路來
訂閱:
文章 (Atom)