2016/08/25

SQL 判斷使用者IP 是否符合網段要求

單純使用 SQL 語法來檢查使用者 IP 在是在合格的網段中間,查無資料表示不在合格的清單內。本語法只適合檢查 IP v4以"."分隔的IP。
declare @IPUser as varchar(20)
set @IPUser = '202.39.128.0'

SELECT *
FROM (
 SELECT 
  CAST(SUBSTRING(IPStart, 0, S1) as bigint) * 1000000000
  +CAST(SUBSTRING(IPStart, S1+1, S2-S1-1) as bigint) * 1000000
  +CAST(SUBSTRING(IPStart, S2+1, S3-S2-1) as bigint) * 1000
  +CAST(SUBSTRING(IPStart, S3+1, LEN(IPStart)-S3) as bigint) as IPStart
  ,CAST(SUBSTRING(IPEnd, 0, E1) as bigint) * 1000000000
  +CAST(SUBSTRING(IPEnd, E1+1, E2-E1-1) as bigint) * 1000000
  +CAST(SUBSTRING(IPEnd, E2+1, E3-E2-1) as bigint) * 1000
  +CAST(SUBSTRING(IPEnd, E3+1, LEN(IPEnd)-E3) as bigint) as IPEnd
  ,CAST(SUBSTRING(IPUser, 0, C1) as bigint) * 1000000000
  +CAST(SUBSTRING(IPUser, C1+1, C2-C1-1) as bigint) * 1000000
  +CAST(SUBSTRING(IPUser, C2+1, C3-C2-1) as bigint) * 1000
  +CAST(SUBSTRING(IPUser, C3+1, LEN(IPUser)-C3) as bigint) as IPUser
 FROM ( 
 SELECT
    IPUser
    ,CHARINDEX('.',IPUser, 0) as C1
    ,CHARINDEX('.',IPUser, CHARINDEX('.',IPUser, 0) + 1) as C2
    ,CHARINDEX('.',IPUser, CHARINDEX('.',IPUser, CHARINDEX('.',IPUser, 0) + 1) + 1) as C3
    ,Unit
    ,[ID]
    ,[IssueDate]
    ,[IPStart]
    ,[IPEnd]
    ,CHARINDEX('.',IPStart, 0) as S1
    ,CHARINDEX('.',IPStart, CHARINDEX('.',IPStart, 0) + 1) as S2
    ,CHARINDEX('.',IPStart, CHARINDEX('.',IPStart, CHARINDEX('.',IPStart, 0) + 1) + 1) as S3
    ,CHARINDEX('.',IPEnd, 0) as E1
    ,CHARINDEX('.',IPEnd, CHARINDEX('.',IPEnd, 0) + 1) as E2
    ,CHARINDEX('.',IPEnd, CHARINDEX('.',IPEnd, CHARINDEX('.',IPEnd, 0) + 1) + 1) as E3
   FROM .[dbo].[IP_Scope]
   LEFT JOIN 
  (SELECT @IPUser as IPUser ) U 
  ON 1=1 
 ) A
) B
Where IPUser between IPStart and IPEnd 

2011/03/18

Word字數統計

為了專案需要,經過努力的googling後,找到如何利用 Office.Interop.Word去讀取字數統計的資料,程式碼如下:

string sFillPath = "D:\\temp\\test.doc";
object Unknown = Type.Missing;

//引用Office.Interop.Word
Microsoft.Office.Interop.Word.ApplicationClass MSWord = new Microsoft.Office.Interop.Word.ApplicationClass();
Microsoft.Office.Interop.Word._Document oDoc = null;

//以word開啟doc檔
object Source = sFillPath;
oDoc = MSWord.Documents.Open(ref Source, ref Unknown,
ref Unknown, ref Unknown, ref Unknown,
ref Unknown, ref Unknown, ref Unknown,
ref Unknown, ref Unknown, ref Unknown,
ref Unknown, ref Unknown, ref Unknown, ref Unknown);

//讀取相關字數資料
TextBox1.Text += "字數: " + oDoc.ComputeStatistics(Microsoft.Office.Interop.Word.WdStatistic.wdStatisticWords, ref Unknown).ToString();
TextBox1.Text += "\n 頁數: " + oDoc.ComputeStatistics(Microsoft.Office.Interop.Word.WdStatistic.wdStatisticPages, ref Unknown).ToString();
TextBox1.Text += "\n 字元(不含空白): " + oDoc.ComputeStatistics(Microsoft.Office.Interop.Word.WdStatistic.wdStatisticCharacters, ref Unknown).ToString();
TextBox1.Text += "\n 全型字數: " + oDoc.ComputeStatistics(Microsoft.Office.Interop.Word.WdStatistic.wdStatisticFarEastCharacters, ref Unknown).ToString();

//關閉word實例
oDoc.Close(ref Unknown, ref Unknown, ref Unknown);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oDoc);
oDoc = null;
MSWord.Quit(ref Unknown, ref Unknown, ref Unknown);
System.Runtime.InteropServices.Marshal.ReleaseComObject(MSWord);
MSWord = null;
System.GC.Collect();

不過,因為是用Office.Interop.Word的元件,所以本機及未來的AP主機必須安裝對應的word版本,並將Office.Interop加入專案的參考。
其他字數資料所用的參數,請參見MSDN的說明。

2010/07/05

在Windows7中管理Hyper-V

我很少轉文,但這篇文章實在很好用,記錄下來以備不時之需。

在Windows7中管理Hyper-V

2010/06/01

在RowCommand事件中取得選取的row

這個問題困擾了很久,尤其是GridView設定分頁後,以GridViewRow gvr = GridView1.Rows[Convert.ToInt32(e.CommandArgument)];的方式取row換頁後就會出現索引的問題。之前都是以網路扒文找到的撇步解決,現在終於找到正解了。感謝小紀的天空提供的這篇文章。這裡提供範例給大家參考:

範例中在每個row裡都有一個LinkButton,去觸發RowCommand事件。
<asp:linkbutton id="lbtnPath" text="下載" CommandName="DownLoad"  runat="server" ></asp:LinkButton>

然後就在RowCommand寫入下面的code:
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName.IndexOf("DownLoad")>=0)
{
//取得發生RowCommand事件的row
LinkButton tmLB = (LinkButton)e.CommandSource;
GridViewRow gvr = (GridViewRow)tmLB.NamingContainer;
...
}
}

2010/04/07

2009/10/27

Eclipse安裝

為了玩Google App Engine,才開始從新學習Java程式的開發,距前次寫Java程式已經有十多年了,那時是只有Applet可以在Browser上跑的年代。依據App engine入門指南的說明,下載了Java、Eclipse及相關套件,卻沒有想像中的順利,在摸索多次以後,把這個經驗寫下來,提供從頭開始玩App engine的人參考。

第一步:安裝 JAVA SDK
新像MS .net frameworks一樣,第一步當然就是把Java執行平台新建立起來,App engine支援 Java 5及Java 6,建議直接安裝 Java SE Development Kit JDK 6 Update XX 版本。

第二步:安裝 Eclipse
雖然中文版說明可安裝 Eclipse 3.3 (Europa) 與 3.4 (Ganymede) ,但英文還增加了 3.5 (Galileo),因為我先安裝 3.4 後,一直無法安裝 Web Tools Platform 套件,就改裝 3.5 版。Eclipse 是免安裝軟體,解壓縮後就可以執行了。

第三步:安裝 Web Tools Platform
開啟 Eclipse 後,從工具列>Help>Install New Software,新增一個下載點http://download.eclipse.org/webtools/updates/,勾選 Web Tools Platform (WTP) 3.1.1 後安裝。

第四步:安裝 Google Plugin for Eclipse
安裝程序同上一步驟,新增一個下載點 http://dl.google.com/eclipse/plugin/3.5 ,勾選 Plug-in 及 SDKs 後安裝。


一切就緒就可以開始照入門指南的步驟來開發程式囉~

2009/10/21

App engine上傳 error

從今年五月份開始玩Google App engine也有一段時間了,由於之前只開放Python語法,進入門檻使我怯步許久。八月份突然發現可以用Java語法開發,便讓我雀躍不已,雖然我對Java語法不熟,但至少碩士論文是用Java完成的,而且近兩年所學的C#語法根本就是Java的翻版,學習成本大幅降低。
尤其是使用eclipse這個IDE來輔助開發,還有Google App Engine專用的library,可以很smooth的開發專案。持續玩了一個多月,逐漸摸索出一些小小的心得,以後將陸續將學習的困境發表出來,提供其他新手參考。今天先將剛剛遇到的狀況提供出來:
我先前已建置了一個Java專案,寫了一些的Jsp檔、Servlet、以及JDO DataStore,也Deploy到App Engine主機過好幾次,因為App Engine專用的library及功能,只要按一個按鈕就完成deploy了,使我以為deploy---很簡單,沒想到今天就遇上了困難。在上傳檔案的時候,發生了下面的錯誤訊息:
Unable to upload:
com.google.appengine.tools.admin.JspCompilationException: Failed to compile the generated JSP java files.
at com.google.appengine.tools.admin.Application.compileJavaFiles(Application.java:416)
at com.google.appengine.tools.admin.Application.compileJsps(Application.java:376)
at com.google.appengine.tools.admin.Application.createStagingDirectory(Application.java:252)
...

後來才發現原來是因為我把一個DataStore物件的屬性值由public改成private,而恰巧這個屬性是一個Sub-Object,我猜是主機上舊的物件已經有資料在了,因為屬性有衝突,所以不讓我上傳。經改回成public後,就順利上傳了。