- 參考資料
[STAThread]
static void Main()
{
var wi = WindowsIdentity.GetCurrent();
var wp = new WindowsPrincipal(wi);
if (!wp.IsInRole(WindowsBuiltInRole.Administrator))
{
var processInfo = new ProcessStartInfo();
// The following properties run the new process as administrator
processInfo.UseShellExecute = true;
processInfo.FileName = Application.ExecutablePath;
processInfo.Verb = "runas";
// Start the new process
try
{
Process.Start(processInfo);
}
catch (Exception ex)
{
// The user did not allow the application to run as administrator
MessageBox.Show("Sorry, this application must be run as Administrator.\n" + ex.Message);
}
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form2());
}
}
C# 6.0 dictionary 初始化的新寫法
var dict = new Dictionary<string, int>
{
["one"] = 1,
["two"] = 2,
["three"] = 3
};
需求: URL 輸入 http://xxxx/yyy 轉成 http://xxxx/yyy.html
最近趕流行,用 vue 寫了一個 SAP(Single application page),html網頁在 MVC 的架構下可成功執行,但我就是想讓使用者操作上更方便,只要輸入網址 route 就直接跳轉到此 html 頁面。如果照原本 MapHttpRoute的方式會造成 .NET 出現找不到 Controller 的問題。最後發現不用 MapHttpRoute 去解此問題,使用MapPageRoute才是正解。
// Web API routes
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
以下增加於 Global.asax.cs
public class Global : HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
GlobalConfiguration.Configure(WebApiConfig.Register);
// 新增加以下 route
RegisterRoutes(RouteTable.Routes);
}
void RegisterRoutes(RouteCollection routes)
{
routes.MapPageRoute("",
"yyy", "~/yyy.html");
}
}
<compilation debug="true" targetFramework="4.5.2">
<buildProviders >
<add extension=".html" type="System.Web.Compilation.PageBuildProvider"/>
<add extension=".htm" type="System.Web.Compilation.PageBuildProvider" />
</buildProviders >
</compilation>
手上有個泰國的生產系統小案子,
雖說是個小案子但也算是跨國專案,
我遇到除了語言不同之外的電腦系統文化差異,
平常我們使用電腦的日期格式一般主要為2018/5/10,
美國系統的國家則是 5/10/2018,也就是 MM/dd/yyyy。
但泰國的使用曆別是一個本人未曾耳聞的佛曆,
就是釋迦牟尼佛滅度(涅槃)當年度為計算基準,
西元2018年就是泰曆/佛曆2561年,年度不同就算了還有四年一次閏年。
真要弄起來那就頭疼了。
不過在網路上找到一個小解法,
執行的程式強制指定CultureInfo,
為了這個設定我可是弄到凌晨三時多,真是工程師的悲哀。
以下為其語法,分享給作泰國專案的網友們。
string theCultureString = “zh-TW”; // 台灣南波萬
System.Globalization.CultureInfo ci = new CultureInfo(theCultureString);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
加碼再作個記錄,此專案使用到一個強大元件:GrapeCity Spread。
雖然事前設定CurrentThread的CultureInfo,
但日期資料在輸入時仍有被我佛慈悲的佛曆帶著走,
還是得強迫在 cell 設定CultureInfo處理日期。
// 強制使用台灣 Culture, 避免泰國佛曆造成衝突
string theCultureString = "zh-TW"
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo(theCultureString); datecell.SetCurrentCulture(ci);
開發系統時,使用者常常會問可以知道資料是被那個員工更新的,更新什麼內容嗎?通常我都會回答系統會記錄Log時間,資料異動者都查詢的到,但是異動那一個欄位就沒辦法了,實在也不想為這個很少使用的功能再大費周張去寫程式作欄位比較再存到log去。
今天碰巧查個MSSQL的資料,才發現MSSQL 2008 就有類似的功能了,還不用寫程式作些設定就可以達到這個功能,以下就是這個CDC (Change Data Capture) 的簡單實測記錄。
-- CDC = Change Data Capture
-- 執行 CDC, sp_cdc_enable_table 為 enable, sp_cdc_disable_table 為 disable
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'items',
@role_name = NULL
GO
-- 觀察修改前、後差異
select * from cdc.dbo_items_CT
-- 目前 DB 中有那些 table 被 tracking
SELECT [name], is_tracked_by_cdc FROM sys.tablesGO
-- CCD 設定多久會清除, 預設為 4320 分鐘或 3 天, 最大值為 52494800 (100 年)
select retention, threshold
from msdb.dbo.cdc_jobs
where database_id = db_id()
and job_type = N'cleanup'
我手上有一個對外的網站是從幾年前就租用的美國Godaddy - Windows Hosting,當初租用Godaddy的原因及特點是無流量限制,檔案空間不限速度也還可以,但對我來說有個最致命的一點就是MySQL的DB容量限制,1GB。這個1GB搞的我很麻煩,系統資料庫每週都會更新資料,就會越長越大,但舊資料也不能刪除,所以一超過這個限制就提心吊膽會被Godaddy無情的封鎖。對,我曾經被封鎖過,還必須郵件往返才解決問題。
話說今年(2018)三月剛好租用的Godaddy Hostoing又要到期,心一橫來搬家。但Linux Hosting好找、Windows Hosting難尋,找了貴到離譜的台灣Hosting,系統爛還有流量限制,也試用價格不便宜的GCP,但C/P值都不理想。最後在某網站看到推薦SmartASP.Net,MySQL的限制是10GB,足足比Godaddy的1GB大了10倍,流量也不限制就連價格也差不多,所以我直接買了一般共用空間的最高等級Premium Plan,價格是漂亮的$7.95/月。
不過最重要的搬家花了不少時間處理MySQL技術問題,以下稍微作點記錄。
MySQL Connection限制
錯誤訊息:User 'a34322_n1' has exceeded the 'max_user_connections' resource (current value: 10)
原來SmartASP.Net的MySQL有Connection限制,但他們也太小看我的網站了,輕輕鬆鬆就突破這個限制,爆了。所以本來買的是.NET Advance plan就改昇級到Premium plan,價差不大可以接受。但請注意昇級後,要去按網站上的一個按鈕:[Upgrade to 20] <— 但…我的網頁上就沒這個按鈕,只能開Ticket請客服幫忙手動增加。以下是四個plan的connection限制,在Knowledge base才有得查。
另外'max_user_connections' 也延伸出另一個問題,就是網站平時20個connection都是滿的,那平常要怎麼維護或是自動更新資料呢?因為大部份時間都被user佔滿了。原本以為又沒解了,但想了一夜後發現原來.NET Premium plan有開放一個功能”Extra DB Users”,有了這個金牌功能就可以另外再加DB user,而'max_user_connections'是跟著DB user走,所以開新DB User就有獨立的 connection 數可以用,就將系統用的DB user和維護的DB user分作不同帳號解決。
客戶使用 TSC 條碼機列印標籤,正常列印QR Code時如果內容有中文時,刷條碼會出現亂碼無法閱讀。我查詢QR Code 的規格是允許中文字元,但如果依照原廠文件使用以下方法列印則不可行,印出來還是亂碼。其中第二種方式的 B0006 為 Binary + 4碼字元長度,目前只能使用第三種方式,但中文需先轉為 4字元的 Unicode。
更新: 最後問題點竟是 SCLIB_DLL 的版本問題造成中文亂碼。
Unicode 編碼字元查詢:http://jicheng.tw/hanzi/unicode.html?s=7000&e=7FFF
方式一(亂碼):
LIB_DLL.sendcommand("QRCODE " + QRCodeX + ", " + QRCodeY + ",H,2,A,0,M2,S7,"中文");
方式二(亂碼):
SCLIB_DLL.sendcommand("QRCODE " + QRCodeX + ", " + QRCodeY + ",H,2,A,0,M2,S7," B0006+中文 Unicode 內碼");
方式三(正常中文):
var cmd = 'QRCODE 60,30,H,7,A,0,M2,S1,\"\u7f16\u7801\"';
資料來源: http://blog.csdn.net/u010121228/article/details/72866417
安裝環境為 Oracle VM VirtualBox
=============================================
設定開機啟動網卡
=============================================
/etc/sysconfig/network-scripts
vi ifcfg-enp0s3
# edit ONBOOT=yes <-- 改為 yes
=============================================
更新系統及常用套件
=============================================
更新系統:yum -y update
常用套件:yum install vim wget net-tools epel-release
=============================================
時區設定
=============================================
# Timezone
查看所有時區:
# timedatectl list-timezones
設定時區區域:
# timedatectl set-timezone Asia/Taipei
與NTP server同步:
# timedatectl set-ntp yes
=============================================
安裝 telnet
=============================================
yum install telnet-server.x86_64
yum install telnet.x86_64
yum install xinetd.x86_64
yum install xinetd
安裝完成後,將xinetd服務加入開機自啟動:
# systemctl enable xinetd.service
將telnet服務加入開機自啟動:
# systemctl enable telnet.socket
最後,啟動以上兩個服務即可:
# systemctl start telnet.socket
# systemctl start xinetd(或service xinetd start)
如果還不能Telnet關閉防火墻
systemctl start firewalld.service #啟動firewall
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啟動
* 注意: 使用 PuTTY SSH 連線 telnet
====================================
增加使用者
====================================
adduser e1
passwd e1
=============================================
安裝網路設定命令工具(非必要)
=============================================
#系統設定套件 - setup 工具包
yum -y install setuptool
#系統設定套件 - 服務套件
yum -y install ntsysv
#系統設定套件 - 網路管理
yum -y install system-config-network-tui
#系統設定套件 - 防火牆設定
yum -y install system-config-firewall-tui
#系統設定套件 - 安全性設定
yum -y install system-config-securitylevel-tui
=============================================
立即手動更新所有預先安裝的軟件
yum -y update
自動執行指令
yum -y install cronie
yum -y install yum-cron
systemctl start crond
systemctl start yum-cron
==============================================
手上某專案使用了GrapeCity的Spread for WinForm,使用Dapper查詢資料,得到結果後使用 foreach 方式一筆一筆填入。資料不大的話就相安無事,執行速度也可以接受。但是,就是有支關鍵的WinFom為了快速顯示,使用了DataAdapter轉DataTable,只好 Google Dapper 和 DataTable 的資料,並沒有查到可以直接轉出到DataTable,在下運氣好,在日本的某個論壇有個專家解了,方式如下,請放煙火後享用。
dt = new DataTable();
dt.Load(db.ExecuteReader(sql, new { }));
VisualBox 是 Oracle 佛心來給眾生免費使用的虛擬主機程式,就像是 MS 的 Hyper-V 功能一樣。一直使用這個軟體二、三年了,作測試或是作開發環境都很正常,但 VisualBox 無法共用剪貼簿的問題困擾我好久,算是這個問題不大,心裡就是湊合著用就用,等到每次要用到剪下、貼上時嘴巴就哼個二聲,說這個軟體真爛。
而昨天我就真的認真了,直接上 Stack overflow 找答案,原來只要安裝 Guest Additions CD 就可以啟用「共用剪貼簿」了,Guest Additions CD 的映像檔就在以下的第二張圖哦,請安心服用。
實際運作擷圖
第一次在部落格中記錄 VBA 程式,因為最近有個需求,來源是客戶每週有個重要任務:整理公司的生產統計資料並產生多種不同圖表於 Weekly review會議中報告,而這些圖表包含有 Pie、Line圖等。
客戶久而久之發現整理這些資料很花時間,重覆性很高,聽別人說有 Excel VBA ,可以將原本手動的工作改為程式處理,以後只要執行程式就可以自動產生出圖表。沒錯,這個客戶的觀念非常正確,Excel VBA 就是這樣好用,如果你是Excel的重度使用者,常常有一些計算或是統計的任務或許可以考慮將這些工作交由程式處理,以自動化的方式處理。那你省下來的時間呢?當然是去作更重要的事情啦!
以下是這次 VBA 的部份程式,我擷取部份精華下來作為記錄也分享給大家。
第1部份:原始資料(Raw data) 產生樞紐分析表
'=====================================================
'2.Create Pivot table
'=====================================================
'Where do you want Pivot Table to start?
StartPvt = shtName & "!" & Range("A2").Address(ReferenceStyle:=xlR1C1)
'Create Pivot Cache from Source Data
Set pvtCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=SrcData)
'Create Pivot table from Pivot Cache
Set PT = pvtCache.CreatePivotTable(TableDestination:=StartPvt, TableName:="PivotTable" & shtName)
'在新的PivotTable上設置欄位
With PT
'欄
.PivotFields("Region").Orientation = xlRowField
'資料
.PivotFields("NO").Orientation = xlDataField
'可以設定各欄位的顯示與否
With .PivotFields("Page Two.RMA Region")
.PivotItems("(blank)").Visible = False
End With
End With
'建立樞紐分析表會顯示出其命令列, 關掉它
Application.CommandBars("PivotTable").Visible = False
第2部份:樞紐分析表轉為 Pie 圖表
'=====================================================
'3.Create Chart
'=====================================================
Set objChart = Charts.Add
With objChart
.ChartType = xlPie
.SetSourceData Source:=Sheets(shtName).Range, PlotBy:=xlColumns
.Location Where:=xlLocationAsObject, Name:=shtName
End With
'Chart 定位, 大小
With ActiveChart.Parent
.Left = 200
.Top = 50
.Width = 450
.Height = 350
End With
'DataLabel 及 Title
With ActiveChart
.HasTitle = True
.ChartTitle.Text = "By Region"
.ApplyDataLabels xlDataLabelsShowPercent
.SeriesCollection(1).DataLabels.NumberFormat = "##0.00%"
End With
第3部份:Pie 圖表匯出到 PowerPoint,以下這段程式碼是由 G 大神來的
Sub ChartsToPresentation()
' Set a VBE reference to Microsoft PowerPoint Object Library
Dim PPT As PowerPoint.Application
Dim PPPres As PowerPoint.Presentation
Dim PPSlide As PowerPoint.Slide
Dim PresentationFileName As Variant
Dim SlideCount As Long
Dim iCht As Integer
' Reference existing instance of PowerPoint
Set PPApp = GetObject(, "Powerpoint.Application")
' Reference active presentation
Set PPPres = PPApp.ActivePresentation
PPApp.ActiveWindow.ViewType = ppViewSlide
For iCht = 1 To ActiveSheet.ChartObjects.Count
' copy chart as a picture
ActiveSheet.ChartObjects(iCht).Chart.CopyPicture _
Appearance:=xlScreen, Size:=xlScreen, Format:=xlPicture
' Add a new slide and paste in the chart
SlideCount = PPPres.Slides.Count
Set PPSlide = PPPres.Slides.Add(SlideCount + 1, ppLayoutBlank)
PPApp.ActiveWindow.View.GotoSlide PPSlide.SlideIndex
With PPSlide
' paste and select the chart picture
.Shapes.Paste.Select
' align the chart
PPApp.ActiveWindow.Selection.ShapeRange.Align msoAlignCenters, True
PPApp.ActiveWindow.Selection.ShapeRange.Align msoAlignMiddles, True
End With
Next
' Clean up
Set PPSlide = Nothing
Set PPPres = Nothing
Set PPApp = Nothing
End Sub
完整程式及測試檔案
https://drive.google.com/open?id=0B0pY4dpq6q9WZVZtZ21fbWNfMEU
https://marketplace.visualstudio.com/items?itemName=SimonHughes.EntityFrameworkReversePOCOGenerator
客戶需求:
一般使用者進入 Access 2007 只顯示表單(Form),將資料表隱藏起來,並且無法直接存取資料表(Table)。避免一般使用者直接更改資料表內容。
經過 Google 查詢國內外的資料,確認只要加上以下的 code 於VBA程式碼,再重新啟動就看不到表單之外的資料。那開發人員或是管理者呢?處理方式為開啟Access檔案時,按下 Shift 鍵就會跳過以下程序。
Sub SetStartupProperties()
Const DB_Text As Long = 10
Const DB_Boolean As Long = 1
ChangeProperty "StartupForm", DB_Text, "首頁" ‘修改為啟動表單頁
ChangeProperty "StartupShowDBWindow", DB_Boolean, False
ChangeProperty "StartupShowStatusBar", DB_Boolean, False
ChangeProperty "StartupMenuBar", DB_Boolean, False
ChangeProperty "AllowShortcutMenus", DB_Boolean, False
ChangeProperty "AllowBuiltInToolbars", DB_Boolean, False
ChangeProperty "AllowFullMenus", DB_Boolean, False
ChangeProperty "AllowBreakIntoCode", DB_Boolean, False
ChangeProperty "AllowSpecialKeys", DB_Boolean, True
ChangeProperty "AllowBypassKey", DB_Boolean, True
DoCmd.ShowToolbar "Ribbon", acToolbarNo
DoCmd.ShowToolbar "Status Bar", acToolbarNo
DoCmd.NavigateTo "acNavigationCategoryObjectType"
DoCmd.RunCommand acCmdWindowHide
End Sub
Function ChangeProperty(strPropName As String, varPropType As Variant, varPropValue As Variant) As Integer
Dim dbs As Object, prp As Variant
Const conPropNotFoundError = 3270
Set dbs = CurrentDb
On Error GoTo Change_Err
dbs.Properties(strPropName) = varPropValue
ChangeProperty = True
Change_Bye:
Exit Function
Change_Err:
If Err = conPropNotFoundError Then ' 找不到屬性。
Set prp = dbs.CreateProperty(strPropName, _
varPropType, varPropValue)
dbs.Properties.Append prp
Resume Next
Else
' 未知的錯誤。
ChangeProperty = False
Resume Change_Bye
End If
End Function
今天開啟一個久違的專案,無奈VS2013出現一個錯誤訊息:
vs2013 failed to register URL 0x80070020。
疑…上個月開專案不是好好的嗎?我的乖乖呢?網路上查了一些解決方式,研判是port被佔住造成無法執行VS2013內建的 IIS Express。但 VS2013的web port可不是說改就改的哦,修改方式我也幫你準備好了,請看以下步驟二。
步驟一、找出是否真的有程式佔用了port,123456是port編號。
netstat -a -n -o | find "123456"
步驟二、修改以下二個檔案內有關 port 的連結,換另一個port
取出字串中的第一數字比較容易,那字串有好多組數字,想要取回字串的最後一組字串怎麼處理呢?
請出Google大神,竟然沒有什麼參考資料,只好自己來。
以下為範例,重點在那個 REVERSE 函數哦!
DECLARE @productname varchar(100);
set @productname = 'T20-5-2.12'
select
@productname,
cast(
reverse(
case PATINDEX('%[-,a-z,A-Z,~,@,#,$,%,&,*,(,),<,>]%',STUFF(REVERSE(@productname), 1,PATINDEX('%[0-9]%', REVERSE(@productname))-1,''))
when 0 then STUFF(REVERSE(@productname), 1,PATINDEX('%[0-9]%', REVERSE(@productname))-1,'')
else SUBSTRING(STUFF(REVERSE(@productname), 1,PATINDEX('%[0-9]%', REVERSE(@productname))-1,''),1,
PATINDEX('%[-,a-z,A-Z,~,@,#,$,%,&,*,(,),<,>]%',STUFF(REVERSE(@productname), 1,PATINDEX('%[0-9]%', REVERSE(@productname))-1,''))-1)
end) as decimal(18,2))
起因:
這二天打算練習 MVC.NET 與 JQuery Datatables 整合,好不容易克服 JSON 的資料傳遞問題,結果又遇到 Datatables 無法排序,分頁也不正常。依照經驗,先查看看網頁引用的 JQuery 的版本是否與 Datatables 不相容,修改後仍然無解,看來設定也都沒有問題,在網頁估狗也看不到什麼有用的解法。突然見到 Java Script 中的參數名稱 serverSide 和有些網友寫的不太一樣,有些網友是加上 b 這個前置字元,代表 binary。那就試試看,沒想到這就是問題點,改完後就運作正常了。
Status: Case closed.
昨日在進行新系統上線測試,而這個測試是個報表相關程式。在一般的查詢條件之下,系統都可以正確無誤統計出資料,但是速度不快。但是下到某一個特定的字串查詢,怪事就發生了,系統出現附圖中的錯誤訊息:
Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.
天呀,這是什麼鬼東東,照例往估狗大神請教去,世界各地專家大都建議查查 SQL connection 連結字串,或查詢時欄位設定的問題,也有可能是 MDAC driver 的問題,我就照著那些建議試著去調校但仍不得其解,只好悶著頭自己測試,突然發現有一段的 SQL 查詢速度慢的不正常,像是 index 未使用到,心想試試也無妨就多加一個 index 作測試。Bingo,SQL 的執行速度立馬恢復正常,錯誤訊息也不見了。沒想到此錯誤訊息找一下午,只要加上 index 就可以打包收工。只能說上天保佑程式人。
Status: Case closed.