2016年6月28日 星期二

JQuery的基礎應用

在這個號稱 web 2.0 的時代,寫網站,尤其是還用到了大量的 JavaScript,如果與使用者的互動還沒有用到 Ajax 技術的話,似乎是一件很神奇的事,至於 Ajax 是什麼東西?想瞭解的人可以到這裡去看維基百科上的解釋,這篇就專心寫一下 jQuery 中的 Ajax 部份。

程式範例:下載點

這個 PHP 程式很簡單, recive.php它只回應一個index.php傳入的字串,所以我們現在要做的事情便是:按下按鈕後,向 server 端的 index.php向recive.php 發出一個 request,然後把它回應的東西放alert出來。所以我們把 Submit 函式的部份寫成這樣:index.php

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
        <script type="text/javascript" src="jquery.js" ></script>
        <script>
         var Submit=function(){
            var URLs="recive.php";
$.ajax({
url: URLs,
data: $('#sentToBack').serialize(),
type:"POST",
dataType:'text',

success: function(msg){
                    alert(msg);
                },

error:function(xhr, ajaxOptions, thrownError){
                    alert(xhr.status);
                    alert(thrownError);
}
            });
        }
        </script>
    </head>
    <body>
        <form id="sentToBack">
            <input type="text" name="Text"/>
            <input type="button"  value="送出" onClick="Submit()"/>
        </form>
    </body>
</html>

ajax當中的參數:

url:指定要進行呼叫的位址。

data:傳送至Server的資料,會自動轉為query string的型式,如果是GET請求還會幫你附加到URL。可用processData選項禁止此自動轉換。物件型式則為一Key/Value pairs。這個範例程式,是使用serialize(),會把name為sentToBack的表單中的資料傳送出去,型態的部分要看type的設定,一般表單都是用POST或是GET。

type:請求方式,POST/GET。

dataType:預期Server傳回的資料類型,如果沒指定,jQuery會根據HTTP MIME Type自動選擇以responseXML或responseText傳入你的success callback。可選的資料類型有:
xml:傳回可用jQuery處理的XML
html:傳回HTML,包含jQuery會自動幫你處理的script tags。
script:傳回可執行的JavaScript。(script不會被自動cache,除非cache設為true)
json:傳回JSON
jsonp:在URL加上?callback=?參數,並在Server端配合送回此jsonp callback。
text:傳回純文字字串。

success:請求成功時執行函式。
function (data, textStatus) {
                       // data 可以是 xmlDoc, jsonObj, html, text, 但還是要參考datatype
                } 

error:請求失敗時執行函式。
           function (xhr, ajaxOptions, thrownError) {
                   //通常ajaxOptions或thrownError只有一個有值
           }
           這個很重要,因為有時候Sever寫好的程式不容易測試,可以透過這個函數把錯誤顯示出來。
其他可能比較會用的參數:

complete:請求完成時執行的函式(不論結果是success或error)。
                 function (XMLHttpRequest, textStatus) {
                   // the options for this ajax request
                 }

beforeSend:發送請求之前可在此修改XMLHttpRequest物件,如添加header等,你可以在此函式中return flase取消Ajax request。
                     function (XMLHttpRequest) {
                          // the options for this ajax request
                     }

其他更多相關的資訊:http://api.jquery.com/jQuery.ajax/

接下來編寫PHP:recive.php

echo $_POST["Text"];

ASP.NET 常規頁生命週期階段(General Page Life-Cycle Stages)

要精準的控制及撰寫程式,首先就是要了解內建程序的執行的順序

https://msdn.microsoft.com/en-us/library/ms178472.aspx

2016年6月18日 星期六

引用WEB USER CONTROL 使用者控制項

靜態引用
<%@ Register TagPrefix="fld" TagName="Field"  Src="~/common/Field.ascx" %>
<fld:Field ID="Field1" runat="server"  />

動態引用
<要注意該控制項的名稱(可能會跟檔名不一致)
例如下方為該控制項程式內容
<%@ Control Language="VB" AutoEventWireup="false" CodeFile="Field.ascx.vb" Inherits="common_Field" %>
這裏動態引用就要使用 common_Field 為控件名稱

<%@ Reference Control="~/common/Field.ascx"%>
Dim ct As common_Field = DirectCast(LoadControl("Field.ascx"), common_Field)

 

註解:

@Register是較常用的指令。當你想使用你的聲明或ASPX頁面ASCX用戶控件可以使用此。@Register關聯特定前綴的控件,然後你可以用它在你的標記。

@Reference只是告訴ASP.NET編譯其他的控制,當你的aspx或ascx的編譯頁面。這確保它可在運行時,可以編程方式添加到您的控制層次。這是不常見的,因為在運行時動態變化的用戶控件不COMON。

DirectCast Vs. CType 哪種好?

2016年6月7日 星期二

ASP.NET 使用者控制項

為了可以簡化程式,並且符合物件導向的程式設計方式,所以我們在ASP.NET中會使用ASCX(使用者控制項)

下面的例子為建立使用者控制項的範本:
image

在主頁中使用控制項方式如下:

<%@ Register TagPrefix="uc" TagName="ubtn_Group"  Src="~/admin/controls/btn_Group.ascx" %>

<asp:Panel ID="pnl_control" runat="server" CssClass="BTN_GROUP">
    <uc:ubtn_Group ID="uc1" runat="server" />
</asp:Panel>

呼叫控制項的event方式

Protected Sub lnk_find_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles uc1.bg_lnk_find_Click

End Sub

現在來看看如何撰寫 btn_Group.ascx

<%@ Control Language="VB" AutoEventWireup="false" CodeFile="btn_Group.ascx.vb" Inherits="admin_controls_btn_Group" %>
<asp:Panel ID="pnl_control" runat="server" CssClass="BTN_GROUP">
    <asp:LinkButton ID="lnk_find" runat="server">查詢</asp:LinkButton> |
    <asp:LinkButton ID="lnk_Result" runat="server">結果</asp:LinkButton> |
    <asp:LinkButton ID="lnk_DTL" runat="server">明細</asp:LinkButton>
</asp:Panel>

btn_Group.ascx.vb 內容


Partial Class admin_controls_btn_Group
    Inherits System.Web.UI.UserControl
    Public Event bg_lnk_find_Click As EventHandler
    Public Event bg_lnk_Result_Click As EventHandler
    Public Event bg_lnk_DTL_Click As EventHandler
    Private _set_btn As String = "lnk_find"

    Public Property set_btn() As String
        Get
            set_btn = _set_btn
        End Get
        Set(ByVal value As String)
            _set_btn = value
            '設定
            Set_Lnk_btn(value)
        End Set
    End Property


    Protected Sub lnk_find_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnk_find.Click
        Set_Lnk_btn("lnk_find")
        RaiseEvent bg_lnk_find_Click(New Object(), New EventArgs())
    End Sub

    Protected Sub lnk_Result_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnk_Result.Click
        Set_Lnk_btn("lnk_Result")
        RaiseEvent bg_lnk_Result_Click(New Object(), New EventArgs())
    End Sub

    Protected Sub lnk_DTL_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lnk_DTL.Click
        Set_Lnk_btn("lnk_DTL")
        RaiseEvent bg_lnk_DTL_Click(New Object(), New EventArgs())
    End Sub

    Private Sub Set_Lnk_btn(ByVal p_id As String)
        lnk_find.CssClass = ""
        lnk_Result.CssClass = ""
        lnk_DTL.CssClass = ""
        Select Case p_id
            Case "lnk_find"
                lnk_find.CssClass = "active"
            Case "lnk_Result"
                lnk_Result.CssClass = "active"
            Case "lnk_DTL"
                lnk_DTL.CssClass = "active"
        End Select
    End Sub
End Class

 

CSS:

.BTN_GROUP{
    background-color: #eafff7;
    padding-top: 6px;
    padding-left: 8px;
    padding-right: 8px;
    padding-bottom: 6px;
    display: block;
    border-radius: 10px;
}
.BTN_GROUP a{
    padding-top: 6px;
    padding-left: 8px;
    padding-right: 8px;
    padding-bottom: 6px;
    width:20px
   display: block;
   border-radius: 4px;
}

.BTN_GROUP a:hover{
    background-color: yellow;
}

.BTN_GROUP .active{
    background-color: #2e8b57;
    color: white;
}

2016年4月25日 星期一

防止我公司的 MAIL 不會被設定為 垃圾郵件(SPAM)

公司的業務和主管向你抱怨,
Mail 寄出給國外客戶和廠商都收不到(跑倒垃圾信件匣)
甚至被當成垃圾郵件退回來?!
這一篇是寫給公司 IT/MIS 人員參考

1. 維護好公司的 smtp relay 安全


1.1 假設貴公司開放 SMTP ports 讓外部可以透過 smtp 發信
則要做好權限控管,沒有透過認證者 or IP 不再安全清單一律不許使用 SMTP 發信。
(也可考慮 VPN)
1.2 定期檢查使用者是否濫用 SMTP 寄送非公司相關信件
1.3 定期檢查使用者電腦是否中毒、中木馬成為發送廣告信的跳板
1.4 教育使用者足夠的資訊安全概念
1.5 請主要客戶、廠商幫忙,設定從公司來的郵件為「非垃圾郵件」
e.g.
Google Gmail 篩選器 (Filter) -> 不要將它傳送到垃圾郵件
http://mail.google.com/support/bin/answer.py?hl=b5&answer=6579
Yahoo奇摩 信箱的 「自動分類」
http://tw.promo.yahoo.com/tutorial/mail20/cg_filter1.html
Microsoft Outlook 的 「安全的收件者」
http://office.microsoft.com/zh-tw/outlook/HP052433571028.aspx
1.6 安裝相關的 Antivirus Mail Gateway or Mail-Server AntiVirus
1.7 定期檢查 Delivery Failures 的信件,
看看是否有定期寄給客戶、廠商的 mail address 已經失效,sent failed
請聯絡他們更換 address,減少 send/deliver failures。

2. 設定 DNS SPF TXT (Sender Policy Framework)記錄


詳細請看官網 http://www.openspf.org/
2.1 如何檢查 SPF TXT 記錄?
=> 使用 SPF 官網提供的 Tools
http://www.openspf.org/Why
http://www.kitterman.com/spf/validate.html
=> 或者用 dig 來查詢 Google & Hinet's public DNS
代碼:


dig @8.8.8.8 -t TXT your-company-org-school.com
dig @168.95.1.1 -t TXT your-company-org-school.com

2.2 或者寄送一封信到 spf-test@openspf.org
然後一分鐘內,你就會收到一個退信,
裡面有 Result="pass" 表示通過 SPF 測試驗證
如果是 Result="none" 那就表示 SPF 還沒有設定完成
2.3 如果你是使用 Google Apps 應用服務 (Google 代管郵件)
你的 SPF 應該長得是這樣子,都在同一行! 有 "double quote"
然後 all 前面是 ~ 波浪符號
代碼:


"v=spf1 include:aspmx.googlemail.com ~all"

2.4 另外記住 TXT 也是 DNS entries 的一部分,DNS 生效需要 24~48 小時。
2.5 舉例,成功的設定 SPF 會讓 Google Mail Gmail 更不會誤判垃圾信件
Example BEFORE-SET-SPF-TXT "NEUTRAL"
未設定之前,判定為「中立」
代碼:


Received-SPF: neutral (google.com: 74.125.82.52 is neither permitted nor denied by domain of XXXXXXXX) client-ip=74.125.82.52;
Authentication-Results: mx.google.com; spf=neutral (google.com: 74.125.82.52 is neither permitted nor denied by domain of XXXXXXXXX) smtp.mail=XXXXXXXXX

Example AFTER-SET-SPF-TXT "PASS"
設定之後,判定為「認證通過」
代碼:


Received-SPF: pass (google.com: domain of XXXXXXXXX designates 74.125.82.52 as permitted sender) client-ip=74.125.82.52;
Authentication-Results: mx.google.com; spf=pass (google.com: domain of XXXXXXXXX designates 74.125.82.52 as permitted sender) smtp.mail=XXXXXXXXXXX

3. 設定反查


相較於正查: Host Name / Domanin --> IP Address
所謂的反查就是 IP Address --> Host Name / Domain Name
有一些 Mail server 會透過檢查反查來判定 SPAM 的分數。
設定反查在某些狀況可以降低被誤判的機率。
如果公司自己有自己的 DNS server,就自己改
(記得 ns1, ns2, ns3 ... 所有 ns 都要改)
如果是請 IDC/ISP 代管,
大部分的 IDC/ISP (Hinet/Seednet) 都可以請工程師幫忙設定反查,應該也免費;
有 IDC/ISP 的和上述 TXT 一樣,提供 DNS manager 介面提供可設定。

4. 減少強制附加「智財權聲明」簽名檔


有一些公司,在 outbound 的 mail 會強制附上
類似下面這種「智財、版權」聲明稿。
英文叫做
legal statement signature
legal declaration signature
copyright statement signature ...
而這個動作,
導致「郵件本文」有時候比「聲明簽名檔」還要小...
如果某一些舊機器判定的公式有這一條,
可能會增加被誤判的機率。
建議:
換成適當大小的圖片、減少字數、或者選擇適當的顏色、適當的字體(例如避免,白底白字)。

引言回覆:

本郵件之資訊可能含有受機密或特殊管制之資訊,僅供指定之收件人使用。若您並非指定之收件人,切勿轉寄、散佈、複製或公開本通訊內容之任何部份,並請即通知寄件人並完全刪除本郵件。
The information transmitted is intended only for the person or entity to which it is addressed and may contain confidential and/or privileged material. If you are not the intended recipient, please contact the sender immediately and destroy the material in its entirety, whether electronic or hard copy. You are notified that any review, retransmission, dissemination or other use of, or taking of any action in reliance upon, this information by persons or entities other than the intended recipient is prohibited. Please consider the environment before printing this email.

5. 時常查詢是否貴公司已經在黑名單


SPAM Black List or Block List Query
http://www.spamhaus.org/
http://www.spamhaus.org/lookup.lasso (SBL, XBL PBL)
http://www.dnsstuff.com/tools
http://www.openrbl.org/
時常檢查,或者寫一個簡單的 script 照三餐檢查。

6. 避免公布貴公司的 Mail,防止 SPOOF


避免 SPAM/Spoof Address Spider
6.1 有 Contact 需求請盡量用 Contact Web-Form or Skype or 電話號碼
6.2 如果真要公布請用 E-Mail 圖片 (e-mail address 用圖片展示)
6.3 盡量減少公布可以 group mail 的 address

7. 考慮使用 DKIM or Domainkey 金鑰簽署郵件


e.g.
使用 Google Apps 提供的 DKIM 功能,
一樣是 DNS TXT FIELD
代碼:


google._domainkey    v=DKIM1; k=rsa; p=ABCDEFG.....

DKIM/DomainKeys 參考網址
http://www.dkim.org/
http://support.google.com/a/bin/answer.py?hl=zh-Hant&answer=174124
http://support.google.com/a/bin/answer.py?hl=zh-Hant&answer=180504&topic=2752442&ctx=topic
實作如下圖,多了一個「金鑰簽署者欄位」


DKIM-Signature.jpg
DKIM-Signature.jpg

使用 MX Super Tools 檢查 Mail Server 是否被列入黑名單


http://mxtoolbox.com/SuperTool.aspx?action=blacklist:example.com&run=toolpage
把上面的 example.com 字串,
換成你公司的 Mail Server hostname or IP address

在 Windows Server 2003 DNS 設定 SPF 記錄

SPF紀錄格式, 可能要參照網路資料
===============================
1. 到win2003 server的DNS
2. 展開正向對應區域
3. 到要新增的 SPF 記錄的 網域
4. 按右鍵 ->新增其他記錄
5. 選文字 (TXT),然後建立記錄
6. 記錄名稱 方塊保留空白
7. 在 文字 方塊中,輸入v=spf1 a mx ptr ~all

OR
v=spf1 a mx ip4:your 外部 IP ~all

=============================================

參考網址:
設定SPF: http://www.kitterman.com/spf/validate.html
SPF測試: http://www.appmaildev.com/hk/spf/ image
image

Q &A

http://forums.devshed.com/mail-server-help-111/gmail-blocks-messages-825511.html

2016年4月7日 星期四

如何在EXCEL中貼上資料可以符合期望的格式

有時我們會從網頁或其它媒體拷貝資料到我們的EXCEL工作表,但若直接貼上的話,常會發現某些資料的格式跑掉了,如下圖:
前圖為網頁原始資料,右圖為貼上EXCEL後的樣子
imageimage

各位可以發現第二欄的資料亂掉了,原因為~EXCEL判斷貼上的資料某些為數字資料,所以自動將它轉成數字格式了,但其實我要的第二欄應該全部都是文字格式,要滿足這個需求的做法很簡單,如下步驟:

1.先判斷來源的資料欄數以及你要貼在EXCEL裏對應的格式
如我第二欄想貼上的是文字格式,所以我先把該欄的儲存格格式轉換為"文字"

image

2.複製來源資料(快速鍵CTRL+C)
image

3.貼上時要選擇"符合目的格式設定"

image

這樣就可以得到符合我們需求的資料囉